On Wed, Feb 1, 2012 at 10:45 AM, Hannes Magnusson
<hannes.magnus...@gmail.com> wrote:
> On Wed, Feb 1, 2012 at 11:26, jpauli <jpa...@php.net> wrote:
>> On Wed, Feb 1, 2012 at 11:14 AM, Ulf Wendel <ulf.wen...@phpdoc.de> wrote:
>>>
>>>
>>> Am 01.02.2012 10:36, schrieb jpauli:
>>>>
>>>> Well, we already have some changelog inside an extension documentation,
>>>> think like php.net/manual/en/curl.constants.php
>>>> <http://php.net/manual/en/curl.constants.php> for example.
>>>>
>>>> I admit its not centralized.
>>>> Do you mean we shall add a special central changelog section summing up
>>>> the changes for every extension ?
>>>
>>>
>>> Good morning Julien!
>>>
>>> Hannes has cited a commit of mine in which I update a "Change History"
>>> such as:
>>>
>>>  http://de.php.net/manual/en/mysqlnd-ms.changes.php
>>>  http://de.php.net/manual/en/mysqlnd-qc.changes.php
>>>
>>> These two "Change Histories"...
>>>
>>>  ... are for a two PECL extensions
>>>  ... try to be comprehensive summaries of changes
>>>  ... link to the main sections for details
>>>  ... accomplished by CHANGES files in the source tree
>>>  ... increase visibility and awareness
>>>  ... may not list all minor CHANGES file entries
>>>
>>> You are asking about, for example,
>>> http://php.net/manual/en/curl.constants.php . This also exists in the above
>>> named PECL extensions documentation for constants, configuration directives,
>>> functions and so forth. This is what I refer to as "... link to main
>>> sections for details" above. Naming changes in such constants, ... lists is
>>> good, is proven, is useful... - please let's continue with it.
>>>
>>> However, I felt that there was room for something in-between change
>>> details scattered in the main sections, a not so much visible
>>> CHANGES/NEWS/... file in the source tree and upgrade guidelines. I called
>>> this something "Change History" (I'm open to rename it).
>>>
>>> As I understand it, Hannes suggests to have a "Change History" or "Change
>>> Log" for every extension as the necessary change summary information is
>>> already in the central NEWS file. Similar to my PECL extension case.
>>>
>>> I do like that proposal. Though, one should be aware of the additional
>>> work. I would have had appreciated to find a template in the manual that I
>>> could have copied for my PECL extension case.
>>>
>>> Ulf
>>
>>
>> That makes things clearer to me :)
>>
>> So, yes Hannes, I do like the idea :) but like Ulf said, we should compute
>> the additional work needed to get those new chapters inside each supported
>> extension. We support *lots* of PECL extensions inside the main php-doc tree
>> (http://www.php.net/manual/en/extensions.alphabetical.php) , so that would
>> represent a lot of work.
>
>
> We already do some parts of the work in the form of changelogs on each
> function page, introducing this new page could aggregate that and
> provide more comprehensive information in the form of examples and
> longer human readable text.
> If we could do this for built-in exts first, and if it works out
> expand it to the rest of the pecl extensions.
>
> I think this will solve the docrot of the migration guides, as they
> almost never get updated with new info after the .0 releases, which
> gives the users the wrong impression of changes.
> And needing to navigate through every single damn function in the
> manual to see what has changed is very very annoying.



Soo... to start the process I patched PhD to aggregate all the exiting
changelog entries and spit them out in a new document.

It should be fairly easy to actually even spit out a complete
changelog page for every version of PHP automatically on
php.net/manual/changelog.php for example.

Attached is the PhD patch and trivial phpdoc patch.


Screenshots:
- http://prntscr.com/a5yml ("ext/strings")
- http://prntscr.com/a5yq2 (ext/mysql)
- http://prntscr.com/a5yrv ("ext/misc")

-Hannes
diff --git a/phpdotnet/phd/Format.php b/phpdotnet/phd/Format.php
index 301a2ab..9fcaeb7 100644
--- a/phpdotnet/phd/Format.php
+++ b/phpdotnet/phd/Format.php
@@ -285,6 +285,19 @@ abstract class Format extends ObjectStorage
     public function addVarname($id, $var) {
         $this->vars[$var] = $id;
     }
+    public function getChangelogsForChildrenOf($bookid) {
+        $id = $this->sqlite->escapeString($bookid);
+        $results = $this->sqlite->query("SELECT * FROM changelogs WHERE 
parent_id='$id' ORDER BY version DESC");
+        if (!$results) {
+            return array();
+        }
+
+        $changelogs = array();
+        while ($row = $results->fetchArray()) {
+            $changelogs[] = $row;
+        }
+        return $changelogs;
+    }
     public function getRefs() {
         return $this->refs;
     }
diff --git a/phpdotnet/phd/Index.php b/phpdotnet/phd/Index.php
index 0a0f0d1..cf22ba8 100644
--- a/phpdotnet/phd/Index.php
+++ b/phpdotnet/phd/Index.php
@@ -63,6 +63,18 @@ class Index extends Format
     'refname'               => 'format_sdesc',
     'titleabbrev'           => 'format_sdesc',
     'example'               => 'format_example',
+    'refsect1'              => 'format_refsect1',
+    "row"                   => array(
+        /* DEFAULT */          null,
+        "tbody"             => 'format_row',
+    ),
+    'entry'                 => array(
+        /* DEFAULT */          null,
+        "row"               => array(
+            /* DEFAULT */      null,
+            "tbody"         => 'format_entry',
+        ),
+    ),
     );
 
     private $mytextmap = array(
@@ -74,6 +86,9 @@ class Index extends Format
     private $chunks    = array();
     private $isChunk   = array();
     private $previousId = "";
+    private $inChangelog = false;
+    private $currentChangelog = array();
+    private $changelog        = array();
     private $commit     = array();
     private $POST_REPLACEMENT_INDEXES = array();
     private $POST_REPLACEMENT_VALUES  = array();
@@ -155,6 +170,7 @@ class Index extends Format
                         $db = new \SQLite3(Config::output_dir() . 
'index.sqlite');
                         $db->exec('DROP TABLE IF EXISTS ids');
                         $db->exec('DROP TABLE IF EXISTS indexing');
+                        $db->exec('DROP TABLE IF EXISTS changelogs');
                     }
 
                     $create = <<<SQL
@@ -169,6 +185,12 @@ CREATE TABLE ids (
     next TEXT,
     chunk INTEGER
 );
+CREATE TABLE changelogs (
+    docbook_id TEXT,
+    parent_id TEXT,
+    version TEXT,
+    description TEXT
+);
 CREATE TABLE indexing (
     time INTEGER PRIMARY KEY
 );
@@ -385,6 +407,41 @@ SQL;
         $this->appendID();
         return false;
     }
+    public function format_refsect1($open, $name, $attrs, $props) {
+        if ($open) {
+            if (isset($attrs[Reader::XMLNS_DOCBOOK]['role'])) {
+                if ($attrs[Reader::XMLNS_DOCBOOK]['role'] == "changelog") {
+                    $this->inChangelog = true;
+                }
+            }
+            return;
+        }
+        $this->inChangelog = false;
+    }
+
+    public function format_entry($open, $name, $attrs, $props) {
+        if ($open) {
+            if ($this->inChangelog) {
+                /* FIXME: How can I mark that node with "reparse" flag? */
+                $this->currentChangelog[] = 
htmlentities(trim(ReaderKeeper::getReader()->readContent()), ENT_COMPAT, 
"UTF-8");
+            }
+        }
+    }
+    public function format_row($open, $name, $attrs, $props) {
+        if ($open) {
+            if ($this->inChangelog) {
+                end($this->ids); prev($this->ids);
+                $this->currentChangelog = array(current($this->ids));
+            }
+            return;
+        }
+        if ($this->inChangelog) {
+            $this->changelog[$this->currentid][] = $this->currentChangelog;
+        }
+    }
+
+
+
     public function commit() {
         if (isset($this->commit) && $this->commit) {
             $search = $this->db->escapeString("POST-REPLACEMENT");
@@ -402,6 +459,20 @@ SQL;
             }
 
             $this->db->exec('BEGIN TRANSACTION; '.join("", $this->commit).' 
COMMIT');
+            $log = "";
+            foreach($this->changelog as $id => $arr) {
+                foreach($arr as $entry) {
+                    $log .= sprintf(
+                        "INSERT INTO changelogs (docbook_id, parent_id, 
version, description) VALUES('%s', '%s', '%s', '%s');\n",
+                        $this->db->escapeString($id),
+                        $this->db->escapeString($entry[0]),
+                        $this->db->escapeString($entry[1]),
+                        $this->db->escapeString($entry[2])
+                    );
+                }
+            }
+            $this->db->exec('BEGIN TRANSACTION; ' . $log. ' COMMIT');
+            $this->log = "";
             $this->commit = array();
         }
     }
diff --git a/phpdotnet/phd/PI/PHPDOCHandler.php 
b/phpdotnet/phd/PI/PHPDOCHandler.php
index 0f4842f..9a89adb 100644
--- a/phpdotnet/phd/PI/PHPDOCHandler.php
+++ b/phpdotnet/phd/PI/PHPDOCHandler.php
@@ -74,6 +74,17 @@ class PI_PHPDOCHandler extends PIHandler {
                 }
                 break;
 
+            case "generate-changelog-for":
+                $changelogs = 
$this->format->getChangelogsForChildrenOf($matches["value"]);
+                $ret = "<table class='doctable table'>";
+                foreach($changelogs as $entry) {
+                    $link = $this->format->createLink($entry["docbook_id"], 
$desc);
+                    $ret .= sprintf("<tr><td>%s</td><td><a 
href='%s'>%s</a></td><td>%s</td></tr>", $entry["version"], $link, $desc, 
$entry["description"]);
+                }
+                return $ret . "</table>";
+
+                break;
+
             default:
                 trigger_error("Don't know how to handle {$matches["attr"]}", 
E_USER_WARNING);
                 break;
Index: en/reference/mysql/functions/mysql-fetch-row.xml
===================================================================
--- en/reference/mysql/functions/mysql-fetch-row.xml    (revision 325983)
+++ en/reference/mysql/functions/mysql-fetch-row.xml    (working copy)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<refentry xml:id="function.mysql-fetch-row" 
xmlns="http://docbook.org/ns/docbook";>
+<refentry xml:id="function.mysql-fetch-row" 
xmlns="http://docbook.org/ns/docbook"; xmlns:phd="http://www.php.net/ns/phd";>
  <refnamediv>
   <refname>mysql_fetch_row</refname>
   <refpurpose>Get a result row as an enumerated array</refpurpose>
@@ -11,7 +11,7 @@
    &mysql.alternative.note;
    <simplelist role="alternatives">
     <member><function>mysqli_fetch_row</function></member>
-    <member><methodname>PDOStatement::fetch</methodname> 
(<constant>PDO::FETCH_NUM</constant>)</member>
+    <member><methodname phd:arg1="PDO::FETCH_NUM" phd:arg3="$stuff" 
phd:arg2="$foobar">PDOStatement::fetch</methodname></member>
    </simplelist>
   </sidebar>
  </refsynopsisdiv>
@@ -40,7 +40,7 @@
  <refsect1 role="returnvalues">
   &reftitle.returnvalues;
   <para>
-   Returns an numerical array of strings that corresponds to the fetched row, 
or 
+   Returns an numerical array of strings that corresponds to the fetched row, 
or
    &false; if there are no more rows.
   </para>
   <para>
Index: doc-base/docbook/docbook-xml/docbook.dtd
===================================================================
--- doc-base/docbook/docbook-xml/docbook.dtd    (revision 325983)
+++ doc-base/docbook/docbook-xml/docbook.dtd    (working copy)
@@ -1052,6 +1052,11 @@
 <!ATTLIST methodname
        xmlns   CDATA   #FIXED  "http://docbook.org/ns/docbook";
        role    CDATA   #IMPLIED
+       phd:arg1        CDATA   #IMPLIED
+       phd:arg2        CDATA   #IMPLIED
+       phd:arg3        CDATA   #IMPLIED
+       phd:arg4        CDATA   #IMPLIED
+       phd:arg4        CDATA   #IMPLIED
        %db.common.attributes;
        %db.common.linking.attributes;
 
@@ -1902,6 +1907,11 @@
 <!ATTLIST function
        xmlns   CDATA   #FIXED  "http://docbook.org/ns/docbook";
        role    CDATA   #IMPLIED
+       phd:arg1        CDATA   #IMPLIED
+       phd:arg2        CDATA   #IMPLIED
+       phd:arg3        CDATA   #IMPLIED
+       phd:arg4        CDATA   #IMPLIED
+       phd:arg4        CDATA   #IMPLIED
        %db.common.attributes;
        %db.common.linking.attributes;
 

Reply via email to