[DOC-CVS] [phd] master: Fix <function> with <replaceable> not rendering correctly (#235)

[email protected] (Louis-Arnaud via GitHub)
Newsgroups php.doc.cvs
Message-ID <[email protected]>
Author: Louis-Arnaud (lacatoire)
Committer: GitHub (web-flow)
Pusher: Girgias
Date: 2026-02-05T17:08:04Z

Commit: https://github.com/php/phd/commit/5f10df173f923d261fa0ae3aa3b2f5778b327e73
Raw diff: https://github.com/php/phd/commit/5f10df173f923d261fa0ae3aa3b2f5778b327e73.diff

Fix <function> with <replaceable> not rendering correctly (#235)

When <function> contains <replaceable>, skip link/parentheses
processing in format_function_text() and output plain text instead.
Uses the role stack pattern already established by format_constant().

Fixes php/phd#171

Changed paths:
  A  tests/package/php/data/function_replaceable_rendering.xml
  A  tests/package/php/function_replaceable_rendering.phpt
  M  phpdotnet/phd/Package/PHP/XHTML.php
  M  phpdotnet/phd/Render.php


Diff:

diff --git a/phpdotnet/phd/Package/PHP/XHTML.php b/phpdotnet/phd/Package/PHP/XHTML.php
index 6d8a4bec..878afb83 100644
--- a/phpdotnet/phd/Package/PHP/XHTML.php
+++ b/phpdotnet/phd/Package/PHP/XHTML.php
@@ -827,12 +827,24 @@ public function format_classsynopsis_methodsynopsis_methodname_text($value, $tag
 
     public function format_function($open, $tag, $attrs, $props) {
         if ($open) {
+            if (str_contains($props["innerXml"], '<replaceable')) {
+                $this->pushRole("function_replaceable");
+            }
             return '<span class="' . $tag . '">';
         }
+
+        if ($this->getRole() === "function_replaceable") {
+            $this->popRole();
+        }
+
         return "</span>";
     }
 
     public function format_function_text($value, $tag, $display_value = null) {
+        if ($this->getRole() === "function_replaceable") {
+            return $this->TEXT($value);
+        }
+
         static $non_functions = array(
             "echo" => true, "print" => true,
             "include" => true, "include_once" => true,
diff --git a/phpdotnet/phd/Render.php b/phpdotnet/phd/Render.php
index 5e4201cd..eeacc68e 100644
--- a/phpdotnet/phd/Render.php
+++ b/phpdotnet/phd/Render.php
@@ -77,7 +77,7 @@ public function execute(Reader $r) { /* {{{ */
                         $r->name === "type" ||
                         $r->name === "classsynopsis" ||
                         $r->name === "qandaset" ||
-                        in_array($r->name, ["methodsynopsis", "constructorsynopsis", "destructorsynopsis", "constant"], true)
+                        in_array($r->name, ["methodsynopsis", "constructorsynopsis", "destructorsynopsis", "constant", "function"], true)
                     )
                 ) {
                     $innerXml = $r->readInnerXml();
diff --git a/tests/package/php/data/function_replaceable_rendering.xml b/tests/package/php/data/function_replaceable_rendering.xml
new file mode 100644
index 00000000..75168e33
--- /dev/null
+++ b/tests/package/php/data/function_replaceable_rendering.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<chapter xml:id="function_replaceable_rendering" xmlns="http://docbook.org/ns/docbook">
+
+ <section>
+  <para>1. Function with replaceable</para>
+  <para>
+   <function>xml_set_<replaceable>*</replaceable></function>
+  </para>
+ </section>
+
+ <section>
+  <para>2. Normal function (no replaceable)</para>
+  <para>
+   <function>strlen</function>
+  </para>
+ </section>
+
+</chapter>
diff --git a/tests/package/php/function_replaceable_rendering.phpt b/tests/package/php/function_replaceable_rendering.phpt
new file mode 100644
index 00000000..bd2ae496
--- /dev/null
+++ b/tests/package/php/function_replaceable_rendering.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Function with replaceable rendering
+--FILE--
+<?php
+namespace phpdotnet\phd;
+
+require_once __DIR__ . "/../../setup.php";
+
+$xmlFile = __DIR__ . "/data/function_replaceable_rendering.xml";
+
+$config->xmlFile = $xmlFile;
+
+$format = new TestPHPChunkedXHTML($config, $outputHandler);
+
+$render = new TestRender(new Reader($outputHandler), $config, $format);
+
+$render->run();
+?>
+--EXPECTF--
+Filename: function_replaceable_rendering.html
+Content:
+<div id="function_replaceable_rendering" class="chapter">
+
+ <div class="section">
+  <p class="para">1. Function with replaceable</p>
+  <p class="para">
+   <span class="function">xml_set_<span class="replaceable">*</span></span>
+  </p>
+ </div>
+
+ <div class="section">
+  <p class="para">2. Normal function (no replaceable)</p>
+  <p class="para">
+   <span class="function"><strong>strlen()</strong></span>
+  </p>
+ </div>
+
+</div>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.