diff --git a/assets/stylesheets/pages/_php.scss b/assets/stylesheets/pages/_php.scss
index 33175aba..6bab3839 100644
--- a/assets/stylesheets/pages/_php.scss
+++ b/assets/stylesheets/pages/_php.scss
@@ -7,6 +7,10 @@
h2 { @extend %block-heading; }
h3.title { @extend %block-heading; }
+ .manualnavbar {
+ margin-top: 1rem;
+ }
+
.verinfo {
float: right;
font-weight: bold;
@@ -28,6 +32,7 @@
blockquote.note > p { margin-bottom: 0; }
div.warning { @extend %note, %note-red; }
+ div.caution { @extend %note, %note-orange; }
div.tip { @extend %note, %note-green; }
strong > code, dt > code { @extend %label; }
diff --git a/lib/docs/filters/php/clean_html.rb b/lib/docs/filters/php/clean_html.rb
index 86c8af3d..538c8001 100644
--- a/lib/docs/filters/php/clean_html.rb
+++ b/lib/docs/filters/php/clean_html.rb
@@ -11,16 +11,28 @@ module Docs
end
def other
- css('.manualnavbar', 'hr').remove
+ css('.manualnavbar:first-child', '.manualnavbar .up', '.manualnavbar .home', 'hr').remove
+
+ nav = at_css('.manualnavbar').remove
+
+ if prev_link = nav.at_css('.prev a')
+ prev_link.content = "← #{prev_link.content}"
+ end
+
+ if next_link = nav.at_css('.next a')
+ next_link.content = "#{next_link.content} →"
+ end
# Remove top-level
if doc.elements.length == 1
@doc = doc.first_element_child
end
+ doc << nav
+
# Remove code highlighting
br = /
/i
- css('.phpcode').each do |node|
+ css('.phpcode', 'div.methodsynopsis').each do |node|
node.name = 'pre'
node.inner_html = node.inner_html.gsub(br, "\n")
node.content = node.content.strip
diff --git a/lib/docs/filters/php/entries.rb b/lib/docs/filters/php/entries.rb
index 8d5acfc6..3c962a83 100644
--- a/lib/docs/filters/php/entries.rb
+++ b/lib/docs/filters/php/entries.rb
@@ -7,6 +7,7 @@ module Docs
'Cond' => 'pthreads',
'CURL' => 'cURL',
'Date' => 'Date/Time',
+ 'Ds' => 'Data Structures',
'ErrorException' => 'Predefined Exceptions',
'Exception' => 'Predefined Exceptions',
'Json' => 'JSON',
@@ -14,6 +15,7 @@ module Docs
'Mutex' => 'pthreads',
'php_user_filter' => 'Stream',
'Pool' => 'pthreads',
+ 'QuickHash' => 'Quickhash',
'Reflector' => 'Reflection',
'Soap' => 'SOAP',
'SplFile' => 'SPL/File',
@@ -24,6 +26,7 @@ module Docs
'streamWrapper' => 'Stream',
'Thread' => 'pthreads',
'tidy' => 'Tidy',
+ 'Weak' => 'Weakref',
'Worker' => 'pthreads',
'XsltProcessor' => 'XSLT',
'Yar' => 'Yar',
@@ -48,8 +51,10 @@ module Docs
end
REPLACE_TYPES = {
+ 'APCu' => 'APC',
'Error' => 'Errors',
'Exceptions' => 'SPL/Exceptions',
+ 'Exif' => 'Image/Exif',
'finfo' => 'File System',
'GD and Image' => 'Image',
'Gmagick' => 'Image/GraphicsMagick',
@@ -74,7 +79,7 @@ module Docs
'Database' => ['DBA', 'ODBC', 'PDO'],
'Date and Time' => ['Calendar', 'Date/Time'],
'Errors' => ['Error Handling', 'Predefined Exceptions'],
- 'File System' => ['Directory', 'Fileinfo', 'Filesystem', 'Inotify'],
+ 'File System' => ['Directory', 'Fileinfo', 'Filesystem', 'Inotify', 'Proctitle'],
'HTML' => ['DOM', 'Tidy'],
'Language' => ['Control Structures', 'Misc.', 'PHP Options/Info', 'Predefined Variables'],
'Mail' => ['Mail', 'Mailparse'],
@@ -116,6 +121,47 @@ module Docs
REPLACE_TYPES[type] || type
end
+ ALIASES = {
+ 'language.oop5.traits' => ['trait'],
+ 'language.operators.type' => ['instanceof'],
+ 'functions.user-defined' => ['function'],
+ 'language.oop5.visibility' => ['public', 'private', 'protected'],
+ 'language.references.whatdo' => ['=&'],
+ 'language.oop5.static' => ['static'],
+ 'language.oop5.interfaces' => ['interface', 'implements'],
+ 'language.oop5.inheritance' => ['extends'],
+ 'language.oop5.cloning' => ['clone', '__clone()'],
+ 'language.operators.logical' => ['and', 'or', 'xor'],
+ 'language.operators.increment' => ['++', '--'],
+ 'language.generators.syntax' => ['yield'],
+ 'language.oop5.final' => ['final'],
+ 'language.exceptions' => ['try', 'catch', 'finally'],
+ 'language.oop5.decon' => ['__construct()', '__destruct()'],
+ 'language.operators.comparison' => ['==', '===', '!=', '<>', '!==', '<=>'],
+ 'language.oop5.abstract' => ['abstract'],
+ 'language.operators.bitwise' => ['&', '|', '^', '~', '<<', '>>']
+ }
+
+ def additional_entries
+ if aliases = ALIASES[slug]
+ aliases.map { |a| [a] }
+ elsif slug == 'language.constants.predefined'
+ css('table tr[id]').map do |node|
+ [node.at_css('code').content, node['id']]
+ end
+ elsif slug == 'language.oop5.magic'
+ css('h3 a').map do |node|
+ [node.content, node['href'][/#(.+)/, 1]]
+ end
+ elsif slug == 'language.oop5.overloading'
+ css('.methodsynopsis[id]').map do |node|
+ [node.at_css('.methodname').content + '()', node['id']]
+ end
+ else
+ []
+ end
+ end
+
def include_default_entry?
!initial_page? && doc.at_css('.reference', '.refentry', '.sect1', '.simpara', '.para')
end
diff --git a/lib/docs/scrapers/php.rb b/lib/docs/scrapers/php.rb
index 468cb0d6..98073c8d 100644
--- a/lib/docs/scrapers/php.rb
+++ b/lib/docs/scrapers/php.rb
@@ -4,7 +4,7 @@ module Docs
self.name = 'PHP'
self.type = 'php'
- self.release = 'up to 7.0.11'
+ self.release = 'up to 7.1.0'
self.base_url = 'https://secure.php.net/manual/en/'
self.root_path = 'index.html'
self.initial_paths = %w(
@@ -43,15 +43,15 @@ module Docs
/\Areserved\.interfaces/,
/\Areserved\.variables/]
- BOOKS = %w(apache apc array bc bzip2 calendar csprng classobj ctype curl
- datetime dba dir dom eio errorfunc ev event exec fileinfo filesystem filter
+ BOOKS = %w(apache apc apcu array bc bzip2 calendar csprng classobj ctype curl
+ datetime dba dir dom ds eio errorfunc ev event exec exif fileinfo filesystem filter
ftp funchand gearman geoip gettext gmagick gmp hash iconv iisfunc image
imagick imap info inotify intl json ldap libevent libxml mail mailparse
math mbstring mcrypt memcached misc mysqli network oauth openssl
- outcontrol password pcntl pcre pdo pgsql phar posix pthreads regex runkit reflection
- sca session sem session-pgsql shmop simplexml soap sockets solr sphinx spl
+ outcontrol password pcntl pcre pdo pgsql phar posix proctitle pthreads quickhash regex runkit
+ reflection sca session sem session-pgsql shmop simplexml soap sockets solr sphinx spl
spl-types sqlite3 sqlsrv ssh2 stats stream strings sync taint tidy uodbc url
- var varnish xml xmlreader xmlrpc xmlwriter xsl yaf yar yaml zip zlib)
+ var varnish weakref xml xmlreader xmlrpc xmlwriter xsl yaf yar yaml zip zlib)
options[:only] = BOOKS.map { |s| "book.#{s}.html" }