gbranden pushed a commit to branch master
in repository groff.

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

    [troff]: Implement recursive node dumping (9/9).
    
    Implement dumping of device extension node contents.
    
    * src/roff/troff/request.h (class macro): Declare `json_dump()` member
      function.
    
    * src/roff/troff/node.cpp (device_extension_node::dump_properties): Call
      member variable `mac`'s `json_dump()` member function.
    
    * src/roff/troff/input.cpp (class macro_header): Declare `json_dump()`
      member function.
    
      (macro::json_dump): New member function calls `macro_header` `p`
      member variable's `json_dump()` member function.
    
      (macro_header::json_dump): New member function iterates though
      `char_list` `cl` member variable's elements, calling
      `json_encode_char()` on each one.
    
    Changes `pline` request output as follows.
    
    -{"type": "device_extension_node", "diversion level": 0, "is_special_node": 
true, "tfont": "TR", "stroke_color": "default", "fill_color": "default"},
    +{"type": "device_extension_node", "diversion level": 0, "is_special_node": 
true, "macro": "custom-command", "tfont": "TR", "stroke_color": "default", 
"fill_color": "default"},
---
 ChangeLog                | 17 +++++++++++++++++
 src/roff/troff/input.cpp | 23 +++++++++++++++++++++++
 src/roff/troff/node.cpp  |  3 ++-
 src/roff/troff/request.h |  3 ++-
 4 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 76ff7a700..89a975aae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2025-03-15  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+       [troff]: Implement dumping of device extension node contents.
+
+       * src/roff/troff/request.h (class macro): Declare `json_dump()`
+       member function.
+       * src/roff/troff/node.cpp
+       (device_extension_node::dump_properties): Call member variable
+       `mac`'s `json_dump()` member function.
+       * src/roff/troff/input.cpp (class macro_header): Declare
+       `json_dump()` member function.
+       (macro::json_dump): New member function calls `macro_header` `p`
+       member variable's `json_dump()` member function.
+       (macro_header::json_dump): New member function iterates though
+       `char_list` `cl` member variable's elements, calling
+       `json_encode_char()` on each one.
+
 2025-03-15  G. Branden Robinson <g.branden.robin...@gmail.com>
 
        [troff]: Trivially refactor.
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index 4faf6f287..9c4427f3f 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -36,6 +36,8 @@ along with this program.  If not, see 
<http://www.gnu.org/licenses/>. */
 
 #include <stack>
 
+#include "json-encode.h" // json_encode_char()
+
 #include "troff.h"
 #include "dictionary.h"
 #include "hvunits.h"
@@ -3548,6 +3550,7 @@ public:
   node_list nl;
   macro_header() { count = 1; }
   macro_header *copy(int);
+  void json_dump();
 };
 
 macro::~macro()
@@ -3711,6 +3714,11 @@ void macro::print_size()
   errprint("%1", len);
 }
 
+void macro::json_dump()
+{
+  p->json_dump();
+}
+
 // make a copy of the first n bytes
 
 macro_header *macro_header::copy(int n)
@@ -3734,6 +3742,21 @@ macro_header *macro_header::copy(int n)
   return p;
 }
 
+void macro_header::json_dump()
+{
+  fputc('\"', stderr);
+  int macro_len = cl.length();
+  for (int i = 0; i < macro_len; i++) {
+    json_char jc = json_encode_char(cl.get(i));
+    // Write out its JSON representation by character by character to
+    // keep libc string functions from interpreting C escape sequences.
+    for (size_t j = 0; j < jc.len; j++)
+      fputc(jc.buf[j], stderr);
+  }
+  fputc('\"', stderr);
+  fflush(stderr);
+}
+
 void print_macros()
 {
   object_dictionary_iterator iter(request_dictionary);
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index b4ff2dc31..b02ce00b9 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -4148,7 +4148,8 @@ device_extension_node::device_extension_node(const macro 
&m, tfont *t,
 void device_extension_node::dump_properties()
 {
   node::dump_properties();
-  // TODO: Implement `macro::dump()` and call it on `mac` from here.
+  fputs(", \"macro\": ", stderr);
+  mac.json_dump();
   fputs(", \"tfont\": ", stderr);
   tf->get_name().json_dump();
   fputs(", \"stroke_color\": ", stderr);
diff --git a/src/roff/troff/request.h b/src/roff/troff/request.h
index 74e9e1ad4..335adb8fe 100644
--- a/src/roff/troff/request.h
+++ b/src/roff/troff/request.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1989-2024 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2025 Free Software Foundation, Inc.
      Written by James Clark (j...@jclark.com)
 
 This file is part of groff.
@@ -70,6 +70,7 @@ public:
   bool is_diversion();
   bool is_string();
   void clear_string_flag();
+  void json_dump();
   friend class string_iterator;
   friend void chop_macro();
   friend void substring_request();

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

Reply via email to