Skip to content

Commit d7f7004

Browse files
authored
Support <packagesynopsis> and <package> rendering for namespaced classes/enums (GH-194) (#241)
Add rendering support for DocBook's <packagesynopsis> and <package> elements so that namespaced PHP classes and enums can display a proper `namespace X;` declaration above the class/enum synopsis.
1 parent 4eb564e commit d7f7004

File tree

3 files changed

+145
-1
lines changed

3 files changed

+145
-1
lines changed

phpdotnet/phd/Package/Generic/XHTML.php

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ abstract class Package_Generic_XHTML extends Format_Abstract_XHTML {
150150
'note' => 'format_note',
151151
'orgname' => 'span',
152152
'othercredit' => 'format_div',
153+
/** Package/Namespace synopsis related tags */
154+
'packagesynopsis' => 'format_packagesynopsis',
155+
'package' => [
156+
/* DEFAULT */ 'span',
157+
'packagesynopsis' => 'format_packagesynopsis_package',
158+
],
153159
/** Class Synopsis related tags */
154160
'classsynopsis' => 'format_classsynopsis',
155161
'classsynopsisinfo' => 'format_classsynopsisinfo',
@@ -532,6 +538,7 @@ abstract class Package_Generic_XHTML extends Format_Abstract_XHTML {
532538
protected $cchunk = array();
533539
/* Default Chunk variables */
534540
private $dchunk = array(
541+
"packagesynopsis" => false,
535542
"classsynopsis" => [
536543
"close" => false,
537544
"classname" => false,
@@ -1250,6 +1257,8 @@ public function format_classsynopsis($open, $name, $attrs, $props) {
12501257
/** Legacy presentation does not use the class attribute */
12511258
$this->cchunk["classsynopsis"]['legacy'] = !isset($attrs[Reader::XMLNS_DOCBOOK]["class"]);
12521259

1260+
$inPackageSynopsis = $this->cchunk["packagesynopsis"] ?? false;
1261+
12531262
if ($this->cchunk["classsynopsis"]['legacy']) {
12541263
if ($open) {
12551264
// Think this just needs to be set on open and it will persist
@@ -1261,6 +1270,9 @@ public function format_classsynopsis($open, $name, $attrs, $props) {
12611270
$this->cchunk["classsynopsis"]["interface"] = true;
12621271
}
12631272

1273+
if ($inPackageSynopsis) {
1274+
return '';
1275+
}
12641276
return '<div class="'.$name.'">';
12651277
}
12661278

@@ -1271,6 +1283,9 @@ public function format_classsynopsis($open, $name, $attrs, $props) {
12711283
}
12721284
return "</div>";
12731285
*/
1286+
if ($inPackageSynopsis) {
1287+
return '}';
1288+
}
12741289
return "}</div>";
12751290
}
12761291

@@ -1281,8 +1296,14 @@ public function format_classsynopsis($open, $name, $attrs, $props) {
12811296
+ substr_count($props['innerXml'], '</oointerface>')
12821297
+ substr_count($props['innerXml'], '</ooexception>');
12831298
$this->cchunk["classsynopsis"]['nb_list'] = $occurrences;
1299+
if ($inPackageSynopsis) {
1300+
return '<div class="classsynopsisinfo">';
1301+
}
12841302
return '<div class="classsynopsis"><div class="classsynopsisinfo">';
12851303
} else {
1304+
if ($inPackageSynopsis) {
1305+
return '}';
1306+
}
12861307
return '}</div>';
12871308
}
12881309
}
@@ -1309,11 +1330,33 @@ public function format_classsynopsis_methodsynopsis_methodname_text($value, $tag
13091330
return $method;
13101331
}
13111332

1333+
public function format_packagesynopsis($open, $name, $attrs, $props) {
1334+
if ($open) {
1335+
$this->cchunk["packagesynopsis"] = true;
1336+
return '<div class="classsynopsis"><div class="classsynopsisinfo">';
1337+
}
1338+
$this->cchunk["packagesynopsis"] = false;
1339+
return '</div>';
1340+
}
1341+
1342+
public function format_packagesynopsis_package($open, $name, $attrs, $props) {
1343+
if ($open) {
1344+
return '<span class="modifier">namespace</span> <strong class="package">';
1345+
}
1346+
return '</strong>;</div>';
1347+
}
1348+
13121349
public function format_enumsynopsis($open, $name, $attrs, $props) {
1350+
$inPackageSynopsis = $this->cchunk["packagesynopsis"] ?? false;
13131351
if ($open) {
1314-
//return '<div class="enumsynopsis">';
1352+
if ($inPackageSynopsis) {
1353+
return '<div class="classsynopsisinfo">';
1354+
}
13151355
return '<div class="classsynopsis"><div class="classsynopsisinfo">';
13161356
} else {
1357+
if ($inPackageSynopsis) {
1358+
return '}';
1359+
}
13171360
return '}</div>';
13181361
}
13191362
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<chapter xml:id="packagesynopsis_rendering" xmlns="http://docbook.org/ns/docbook">
3+
4+
<section>
5+
<para>1. Namespaced class with packagesynopsis</para>
6+
<packagesynopsis>
7+
<package>BcMath</package>
8+
<classsynopsis class="class">
9+
<ooclass>
10+
<modifier>final</modifier>
11+
<modifier>readonly</modifier>
12+
<classname>Number</classname>
13+
</ooclass>
14+
<oointerface>
15+
<modifier>implements</modifier>
16+
<interfacename>Stringable</interfacename>
17+
</oointerface>
18+
</classsynopsis>
19+
</packagesynopsis>
20+
</section>
21+
22+
<section>
23+
<para>2. Namespaced enum with packagesynopsis</para>
24+
<packagesynopsis>
25+
<package>Pcntl</package>
26+
<enumsynopsis>
27+
<enumname>QosClass</enumname>
28+
<enumitem>
29+
<enumidentifier>Background</enumidentifier>
30+
<enumitemdescription>Background QoS</enumitemdescription>
31+
</enumitem>
32+
</enumsynopsis>
33+
</packagesynopsis>
34+
</section>
35+
36+
<section>
37+
<para>3. Standalone package element</para>
38+
<para>The <package>Dom</package> namespace.</para>
39+
</section>
40+
41+
</chapter>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
--TEST--
2+
Package synopsis rendering (GH-194 packagesynopsis and package elements)
3+
--FILE--
4+
<?php
5+
namespace phpdotnet\phd;
6+
7+
require_once __DIR__ . "/../../setup.php";
8+
9+
$xmlFile = __DIR__ . "/data/packagesynopsis_rendering.xml";
10+
11+
$config->xmlFile = $xmlFile;
12+
13+
$format = new TestPHPChunkedXHTML($config, $outputHandler);
14+
15+
$render = new TestRender(new Reader($outputHandler), $config, $format);
16+
17+
$render->run();
18+
?>
19+
--EXPECT--
20+
Filename: packagesynopsis_rendering.html
21+
Content:
22+
<div id="packagesynopsis_rendering" class="chapter">
23+
24+
<div class="section">
25+
<p class="para">1. Namespaced class with packagesynopsis</p>
26+
<div class="classsynopsis"><div class="classsynopsisinfo">
27+
<span class="modifier">namespace</span> <strong class="package">BcMath</strong>;</div>
28+
<div class="classsynopsisinfo">
29+
30+
<span class="modifier">final</span>
31+
<span class="modifier">readonly</span>
32+
<span class="modifier">class</span> <strong class="classname"><strong class="classname">Number</strong></strong>
33+
34+
35+
<span class="modifier">implements</span>
36+
<strong class="interfacename">Stringable</strong> {</div>
37+
}
38+
</div>
39+
</div>
40+
41+
<div class="section">
42+
<p class="para">2. Namespaced enum with packagesynopsis</p>
43+
<div class="classsynopsis"><div class="classsynopsisinfo">
44+
<span class="modifier">namespace</span> <strong class="package">Pcntl</strong>;</div>
45+
<div class="classsynopsisinfo">
46+
<span class="modifier">enum</span> <strong class="classname"><strong class="enumname">QosClass</strong></strong><br/>{</div>
47+
<div class="fieldsynopsis">
48+
<span class="modifier">case</span> <span class="classname">Background</span>
49+
; //Background QoS<br><br>
50+
</div>
51+
}
52+
</div>
53+
</div>
54+
55+
<div class="section">
56+
<p class="para">3. Standalone package element</p>
57+
<p class="para">The <span class="package">Dom</span> namespace.</p>
58+
</div>
59+
60+
</div>

0 commit comments

Comments
 (0)