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