gbranden pushed a commit to branch master
in repository groff.

commit ece4499a2aee21f0f01be8bfed2b2f50460330b4
Author: G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Sat Mar 15 15:43:34 2025 -0500

    [troff]: Implement recursive node dumping (8k/9).
    
    * src/roff/troff/node.cpp (class kern_pair_node): Add `dump_node` member
      function, overriding virtual function in `node` base class.
    
      (kern_pair_node::dump_node): Disclose more information, namely the
      contents of any defined nodes within.
    
    Changes `pline` request output as follows.
    
    -{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -100},
    +{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -100, "n1": {"type": "glyph_node", "diversion level": 0, 
"is_special_node": false, "character": "k"}, "n2": {"type": "glyph_node", 
"diversion level": 0, "is_special_node": false, "character": "e"}},
    
    -{"type": "dbreak_node", "diversion level": 0, "is_special_node": false, 
"none": {"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"}, "pre": {"type": "kern_pair_node", "diversion level": 0, 
"is_special_node": false, "amount": -200}},
    +{"type": "dbreak_node", "diversion level": 0, "is_special_node": false, 
"none": {"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"}, "pre": {"type": "kern_pair_node", "diversion level": 0, 
"is_special_node": false, "amount": -200, "n1": {"type": "glyph_node", 
"diversion level": 0, "is_special_node": false, "character": "r"}, "n2": 
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, "special 
character": "hy"}}},
---
 ChangeLog               |  8 ++++++++
 src/roff/troff/node.cpp | 24 ++++++++++++++++++++++--
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c18ed59fe..9be5d62e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2025-03-15  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+       * src/roff/troff/node.cpp (class kern_pair_node): Add
+       `dump_node` member function, overriding virtual function in
+       `node` base class.
+       (kern_pair_node::dump_node): Disclose more information, namely
+       the contents of any contained nodes.
+
 2025-03-15  G. Branden Robinson <g.branden.robin...@gmail.com>
 
        * src/roff/troff/node.cpp (dbreak_node::dump_node): Refactor to
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index d0448d671..f43dddb8d 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -1990,8 +1990,8 @@ public:
   void dump_node();
 };
 
-// TODO: Do not derive from `container_node`; implement custom double
-// container dumper in dump_node().
+// Not derived from `container_node`; implements custom double container
+// dumper in dump_node().
 class kern_pair_node : public node {
   hunits amount;
   node *n1;
@@ -2020,6 +2020,7 @@ public:
   bool is_tag();
   void vertical_extent(vunits *, vunits *);
   void dump_properties();
+  void dump_node();
 };
 
 // Not derived from `container_node`; implements custom triple container
@@ -2332,6 +2333,25 @@ void kern_pair_node::dump_properties()
   fflush(stderr);
 }
 
+void kern_pair_node::dump_node()
+{
+  fputc('{', stderr);
+  // Flush so that in case something goes wrong with property dumping,
+  // we know that we traversed to a new node.
+  fflush(stderr);
+  dump_properties();
+  if (n1 != 0 /* nullptr */) {
+    fputs(", \"n1\": ", stderr);
+    n1->dump_node();
+  }
+  if (n2 != 0 /* nullptr */) {
+    fputs(", \"n2\": ", stderr);
+    n2->dump_node();
+  }
+  fputc('}', stderr);
+  fflush(stderr);
+}
+
 dbreak_node::dbreak_node(node *n, node *p, statem *s, int divlevel,
                         node *x)
 : node(x, s, divlevel), none(n), pre(p), post(0 /* nullptr */)

_______________________________________________
groff-commit mailing list
groff-commit@gnu.org
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to