gbranden pushed a commit to branch master in repository groff. commit 2a182b27792cbda74235fe10fe792464f0cfeef8 Author: G. Branden Robinson <g.branden.robin...@gmail.com> AuthorDate: Mon Feb 24 18:50:04 2025 -0600
[troff]: Fix Savannah #66815. Implement approximate (`troff -a`) output of zero-width nodes (these are constructed from `\Z` escape sequences, and might be better termed "drawing position resetting nodes"). * src/roff/troff/node.h (class zero_width_node): Declare `ascii_print` member function. * src/roff/troff/node.cpp (ascii_print_node_list): New static helper function iterates a node list, calling each of its elements' `ascii_print()` member functions. (zero_width_node::ascii_print): New member function calls the foregoing. Fixes <https://savannah.gnu.org/bugs/?66815>. Thanks to Dave Kemper for the report. Problem appears to date back to groff's birth. Before: $ printf '\\Z@abc\\h#6n#@def\n' | ~/groff-1.23.0/bin/groff -a <beginning of page> def Now: $ printf '\\Z@abc\\h#6n#@def\n' | ./build/test-groff -a <beginning of page> abc def The new behavior aligns better with that of Heirloom Doctools troff. --- ChangeLog | 19 +++++++++++++++++++ src/roff/troff/node.cpp | 14 ++++++++++++++ src/roff/troff/node.h | 3 ++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e7665e7bf..05d4eaeae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2025-02-24 G. Branden Robinson <g.branden.robin...@gmail.com> + + Implement approximate (`troff -a`) output of zero-width nodes + {these are constructed from `\Z` escape sequences, and might be + better termed "drawing position resetting nodes"}. + + * src/roff/troff/node.h (class zero_width_node): Declare + `ascii_print` member function. + + * src/roff/troff/node.cpp (ascii_print_node_list): New static + helper function iterates a node list, calling each of its + elements' `ascii_print()` member functions. + (zero_width_node::ascii_print): New member function calls the + foregoing. + + Fixes <https://savannah.gnu.org/bugs/?66815>. Thanks to Dave + Kemper for the report. Problem appears to date back to groff's + birth. + 2025-02-24 G. Branden Robinson <g.branden.robin...@gmail.com> * src/roff/troff/node.cpp: Fix code style nits. diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp index 4e8d69cdf..0edd47644 100644 --- a/src/roff/troff/node.cpp +++ b/src/roff/troff/node.cpp @@ -3531,6 +3531,15 @@ void vline_node::vertical_extent(vunits *min, vunits *max) /* ascii_print methods */ +static void ascii_print_node_list(ascii_output_file *ascii, node *n) +{ + node *nn = n; + while(nn != 0 /* nullptr */) { + nn->ascii_print(ascii); + nn = nn->next; + } +} + static void ascii_print_reverse_node_list(ascii_output_file *ascii, node *n) { if (0 /* nullptr */ == n) @@ -3572,6 +3581,11 @@ void space_char_hmotion_node::ascii_print(ascii_output_file *ascii) ascii->outc(' '); } +void zero_width_node::ascii_print(ascii_output_file *out) +{ + ascii_print_node_list(out, n); +} + /* asciify methods */ void node::asciify(macro *m) diff --git a/src/roff/troff/node.h b/src/roff/troff/node.h index 4e1b15ce2..fe96fa1c6 100644 --- a/src/roff/troff/node.h +++ b/src/roff/troff/node.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. @@ -461,6 +461,7 @@ public: ~zero_width_node(); node *copy(); void tprint(troff_output_file *); + void ascii_print(ascii_output_file *); bool is_same_as(node *); const char *type(); bool causes_tprint(); _______________________________________________ groff-commit mailing list groff-commit@gnu.org https://lists.gnu.org/mailman/listinfo/groff-commit