gbranden pushed a commit to branch master
in repository groff.

commit 4103c1e309296fe0347a05b28b4f3476c2cc7472
Author: G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Mon Mar 3 08:33:43 2025 -0600

    [troff]: Implement recursive node dumping (5q/9).
    
    * src/roff/troff/node.h (class tag_node): Specialize (override)
      `dump_properties()` for this class.
    
    * src/roff/troff/node.cpp (tag_node::dump_properties): New member
      function reports values of `string` and `delayed` properties.
    
    "Tag nodes", like "suppress nodes", are some of groff's blacker magic,
    and are entangled with grohtml.  Given the following simple input
    document:
    
    .NH 1
    Introduction
    .pline
    .LP
    Hello tag node world.
    
    ...processed with `groff -z -ms -Thtml`, this commit changes `pline`
    request output as follows.
    
    -{"type": "tag_node", "diversion level": 0, "is_special_node": true, 
"state": "<state [br] [sp 1]>"},
    +{"type": "tag_node", "diversion level": 0, "is_special_node": true, 
"state": "<state [br] [sp 1]>", "string": "x X devtag:.NH 1\n", "delayed": 
false},
    
    It's worth noting that the "string" gets populated with a trailing
    newline (this is impossible for *roff strings, but this `string` type
    is implemented as a C++ class).  This may or may not be a bug, depending
    on how tag appending works.  If it's not a bug, we may want to rename
    this property to something other than "string" to reduce potential user
    confusion.
---
 ChangeLog               | 8 ++++++++
 src/roff/troff/node.cpp | 9 +++++++++
 src/roff/troff/node.h   | 1 +
 3 files changed, 18 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 5b78df7d1..fd9398e2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2025-03-03  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+       * src/roff/troff/node.h (class tag_node): Specialize (override)
+       `dump_properties()` for this class.
+       * src/roff/troff/node.cpp (tag_node::dump_properties): New
+       member function reports values of `string` and `delayed`
+       properties.
+
 2025-03-03  G. Branden Robinson <g.branden.robin...@gmail.com>
 
        * src/roff/troff/node.h (struct width_list): Declare `dump()`
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index c9595a8a5..423fb69e0 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -4220,6 +4220,15 @@ tag_node::tag_node(string s, statem *st, int divlevel, 
int delay)
   is_special = !delay;
 }
 
+void tag_node::dump_properties()
+{
+  node::dump_properties();
+  fputs(", \"string\": ", stderr);
+  tag_string.json_dump();
+  fprintf(stderr, ", \"delayed\": %s", delayed ? "true" : "false");
+  fflush(stderr);
+}
+
 node *tag_node::copy()
 {
   return new tag_node(tag_string, state, div_nest_level, delayed);
diff --git a/src/roff/troff/node.h b/src/roff/troff/node.h
index 1d522bb41..e16869917 100644
--- a/src/roff/troff/node.h
+++ b/src/roff/troff/node.h
@@ -636,6 +636,7 @@ public:
   bool causes_tprint();
   bool is_tag();
   int ends_sentence(); // three-valued Boolean :-|
+  void dump_properties();
 };
 
 struct hvpair {

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

Reply via email to