Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package lowdown for openSUSE:Factory checked in at 2026-03-26 21:12:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lowdown (Old) and /work/SRC/openSUSE:Factory/.lowdown.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lowdown" Thu Mar 26 21:12:16 2026 rev:10 rq:1343019 version:3.0.1 Changes: -------- --- /work/SRC/openSUSE:Factory/lowdown/lowdown.changes 2026-03-16 14:19:54.651715911 +0100 +++ /work/SRC/openSUSE:Factory/.lowdown.new.8177/lowdown.changes 2026-03-27 06:44:07.548651191 +0100 @@ -1,0 +2,13 @@ +Thu Mar 19 16:15:47 UTC 2026 - Scott Bradnick <[email protected]> + +- Update to version 3.0.1: + * Version notes + * Handle prefix case for mdoc macros + * Don't leak memory + * Add mdoc(7) to regression tests + * Properly handle compact mdoc and man lists + * Show -ttree block status for lists + * Handle multiple trailing mdoc(7) delimiters + * Add example of option with two-paragraph description + +------------------------------------------------------------------- Old: ---- lowdown-3.0.0.tar.gz New: ---- lowdown-3.0.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lowdown.spec ++++++ --- /var/tmp/diff_new_pack.3uFa5d/_old 2026-03-27 06:44:08.124674968 +0100 +++ /var/tmp/diff_new_pack.3uFa5d/_new 2026-03-27 06:44:08.128675133 +0100 @@ -20,7 +20,7 @@ #%%global version_string VERSION_1_1_0 Name: lowdown -Version: 3.0.0 +Version: 3.0.1 Release: 0 Summary: Simple markdown translator License: ISC ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.3uFa5d/_old 2026-03-27 06:44:08.168676785 +0100 +++ /var/tmp/diff_new_pack.3uFa5d/_new 2026-03-27 06:44:08.168676785 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/kristapsdz/lowdown</param> - <param name="changesrevision">882815adcbf0892bb854c3d6bc451fa9a0fa68fd</param></service></servicedata> + <param name="changesrevision">f4249d46942ac6c52a8abc3e31ea990cad5b6a22</param></service></servicedata> (No newline at EOF) ++++++ lowdown-3.0.0.tar.gz -> lowdown-3.0.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/Makefile new/lowdown-3.0.1/Makefile --- old/lowdown-3.0.0/Makefile 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/Makefile 2026-03-18 21:41:56.000000000 +0100 @@ -10,7 +10,7 @@ # while libraries have well-defined semantics of semver change, programs # do not. Let the library guide our versioning until a better way is # thought out. -VERSION = 3.0.0 +VERSION = 3.0.1 # This is the major number of VERSION. It might later become # MAJOR.MINOR, if the library moves a lot. @@ -479,6 +479,22 @@ fi ; \ done ; \ done ; \ + for f in regress/manpages/*.md ; do \ + ff=regress/manpages/`basename $$f .md` ; \ + echo "$$f" ; \ + for type in man mdoc ; do \ + if [ -f $$ff.$$type ]; then \ + ./lowdown --roff-manpage -t$$type $$f >$$tmp1 2>&1 ; \ + diff -u $$ff.$$type $$tmp1 ; \ + [ $$? -eq 0 ] || { \ + echo "$$f" ; \ + echo -n "Replace? " ; \ + read ; \ + mv $$tmp1 $$ff.$$type ; \ + } ; \ + fi ; \ + done ; \ + done ; \ for f in regress/standalone/*.md ; do \ ff=regress/standalone/`basename $$f .md` ; \ for type in html fodt latex ms man gemini term ; do \ @@ -532,14 +548,14 @@ $(REGRESS_ENV) $(VALGRIND) ./lowdown $(REGRESS_ARGS) "$$f" | \ sed -e 's! ! !g' | sed -e '/^[ ]*$$/d' > $$tmp2 ; \ diff -uw $$tmp1 $$tmp2 || rc=$$((rc + 1)) ; \ - for type in html fodt latex ms man gemini term tree ; do \ + for type in html fodt latex ms man mdoc gemini term tree ; do \ $(REGRESS_ENV) $(VALGRIND) ./lowdown -s -t$$type "$$f" >/dev/null 2>&1 ; \ done ; \ done ; \ for f in regress/*.md ; do \ ff=regress/`basename $$f .md` ; \ echo "$$f" ; \ - for type in html fodt latex ms man gemini term ; do \ + for type in html fodt latex ms man mdoc gemini term ; do \ if [ -f $$ff.$$type ]; then \ $(REGRESS_ENV) $(VALGRIND) ./lowdown -t$$type $$f >$$tmp1 2>&1 ; \ diff -uw $$ff.$$type $$tmp1 || rc=$$((rc + 1)) ; \ @@ -552,14 +568,14 @@ for type in man mdoc ; do \ if [ -f $$ff.$$type ]; then \ $(REGRESS_ENV) $(VALGRIND) ./lowdown --roff-manpage -t$$type $$f >$$tmp1 2>&1 ; \ - diff -uw $$ff.$$type $$tmp1 || rc=$$((rc + 1)) ; \ + diff -u $$ff.$$type $$tmp1 || rc=$$((rc + 1)) ; \ fi ; \ done ; \ done ; \ for f in regress/standalone/*.md ; do \ ff=regress/standalone/`basename $$f .md` ; \ echo "$$f" ; \ - for type in html fodt latex ms man gemini term ; do \ + for type in html fodt latex ms man mdoc gemini term ; do \ if [ -f $$ff.$$type ]; then \ $(REGRESS_ENV) $(VALGRIND) ./lowdown -s -t$$type $$f >$$tmp1 2>&1 ; \ diff -uw $$ff.$$type $$tmp1 || rc=$$((rc + 1)) ; \ @@ -591,7 +607,7 @@ for f in regress/diff/*.old.md ; do \ bf=`dirname $$f`/`basename $$f .old.md` ; \ echo "$$f -> $$bf.new.md" ; \ - for type in html fodt latex ms man gemini term ; do \ + for type in html fodt latex ms man mdoc gemini term ; do \ if [ -f $$bf.$$type ]; then \ $(REGRESS_ENV) $(VALGRIND) ./lowdown-diff -s -t$$type $$f $$bf.new.md >$$tmp1 2>&1 ; \ diff -uw $$bf.$$type $$tmp1 || rc=$$((rc + 1)) ; \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/mdoc.md new/lowdown-3.0.1/mdoc.md --- old/lowdown-3.0.0/mdoc.md 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/mdoc.md 2026-03-18 21:41:56.000000000 +0100 @@ -153,6 +153,8 @@ *FILE* : The optional file. + This option's description has two paragraphs. + # CONTEXT For section 9 functions only. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested-block.man new/lowdown-3.0.1/regress/list-compact-nested-block.man --- old/lowdown-3.0.0/regress/list-compact-nested-block.man 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested-block.man 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,24 @@ +.PP +a +.IP "\(bu" 3 +a +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +b +.RS +.IP "\(bu" 3 +d +.IP "\(bu" 3 +e +.RE +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +c +.LP +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested-block.md new/lowdown-3.0.1/regress/list-compact-nested-block.md --- old/lowdown-3.0.0/regress/list-compact-nested-block.md 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested-block.md 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,10 @@ +a + +* a +* b + * d + + * e +* c + +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested-block.mdoc new/lowdown-3.0.1/regress/list-compact-nested-block.mdoc --- old/lowdown-3.0.0/regress/list-compact-nested-block.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested-block.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,19 @@ +.Pp +a +.Pp +.Bl -bullet -compact +.It +a +.It +b +.Bl -bullet +.It +d +.It +e +.El +.It +c +.El +.Pp +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested-block.term new/lowdown-3.0.1/regress/list-compact-nested-block.term --- old/lowdown-3.0.0/regress/list-compact-nested-block.term 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested-block.term 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,11 @@ + a + + [93m ยท [0ma + [93m ยท [0mb + + [93m ยท [0md + + [93m ยท [0me + [93m ยท [0mc + + d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested.man new/lowdown-3.0.1/regress/list-compact-nested.man --- old/lowdown-3.0.0/regress/list-compact-nested.man 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested.man 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,44 @@ +.PP +a +.IP "\(bu" 3 +a +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +b +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.RS +.IP "\(bu" 3 +d +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +e +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +d +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +e +.RE +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +c +.LP +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested.md new/lowdown-3.0.1/regress/list-compact-nested.md --- old/lowdown-3.0.0/regress/list-compact-nested.md 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested.md 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,11 @@ +a + +* a +* b + * d + * e + * d + * e +* c + +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested.mdoc new/lowdown-3.0.1/regress/list-compact-nested.mdoc --- old/lowdown-3.0.0/regress/list-compact-nested.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,23 @@ +.Pp +a +.Pp +.Bl -bullet -compact +.It +a +.It +b +.Bl -bullet -compact +.It +d +.It +e +.It +d +.It +e +.El +.It +c +.El +.Pp +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact-nested.term new/lowdown-3.0.1/regress/list-compact-nested.term --- old/lowdown-3.0.0/regress/list-compact-nested.term 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact-nested.term 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,11 @@ + a + + [93m ยท [0ma + [93m ยท [0mb + [93m ยท [0md + [93m ยท [0me + [93m ยท [0md + [93m ยท [0me + [93m ยท [0mc + + d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact.html new/lowdown-3.0.1/regress/list-compact.html --- old/lowdown-3.0.0/regress/list-compact.html 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact.html 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,7 @@ +<p>a</p> +<ul> +<li>a</li> +<li>b</li> +<li>c</li> +</ul> +<p>d</p> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact.man new/lowdown-3.0.1/regress/list-compact.man --- old/lowdown-3.0.0/regress/list-compact.man 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact.man 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,18 @@ +.PP +a +.IP "\(bu" 3 +a +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +b +.if n \ +.sp -1 +.if t \ +.sp -0.25v +.IP "\(bu" 3 +c +.LP +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact.md new/lowdown-3.0.1/regress/list-compact.md --- old/lowdown-3.0.0/regress/list-compact.md 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact.md 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,7 @@ +a + +* a +* b +* c + +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-compact.mdoc new/lowdown-3.0.1/regress/list-compact.mdoc --- old/lowdown-3.0.0/regress/list-compact.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-compact.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,13 @@ +.Pp +a +.Pp +.Bl -bullet -compact +.It +a +.It +b +.It +c +.El +.Pp +d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-complex.mdoc new/lowdown-3.0.1/regress/list-complex.mdoc --- old/lowdown-3.0.0/regress/list-complex.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-complex.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,27 @@ +.Pp +An initial paragraph. +.Bl -bullet +.It +An outer list. +.Pp +With a paragraph. +.Pp +.Bl -enum -compact +.It +An inner ordered list. +.It +That\(cqs inline. +.It +Followed by\[u2026] +.El +.Bl -bullet +.It +An inner regular lits. +.Pp +With inner paragraph. +.El +.Pp +Another paragraph. +.El +.Pp +A last outer paragraph. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-defn-complex.mdoc new/lowdown-3.0.1/regress/list-defn-complex.mdoc --- old/lowdown-3.0.0/regress/list-defn-complex.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-defn-complex.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,6 @@ +.Bl -tag -width Ds +.It a \fIhow are you\fR \fBblah blah\fR Lk https://foo.com a link +b +.It sadas asd fasd as dfasd fasd as fa ads fsafdsa asd fsadf sad sadf sad sad fsadf asdf asd fsad fds f +d +.El diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/list-defn-simple.mdoc new/lowdown-3.0.1/regress/list-defn-simple.mdoc --- old/lowdown-3.0.0/regress/list-defn-simple.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/list-defn-simple.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,6 @@ +.Bl -tag -width Ds +.It a +b +.It c +d +.El diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/master.man new/lowdown-3.0.1/regress/manpages/master.man --- old/lowdown-3.0.0/regress/manpages/master.man 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/master.man 2026-03-18 21:41:56.000000000 +0100 @@ -352,18 +352,18 @@ .YS .SY rpcgen \fB\-c\fR -|\fB\-h\fR -|\fB\-l\fR -|\fB\-m\fR -|\fB\-t\fR -|\fB\-Sc\fR -|\fB\-Ss\fR -|[\fB\-o \fIoutfile\fR\fR] +| \fB\-h\fR +| \fB\-l\fR +| \fB\-m\fR +| \fB\-t\fR +| \fB\-Sc\fR +| \fB\-Ss\fR +| [\fB\-o \fIoutfile\fR\fR] [\fIinfile\fR] .YS .SY rpcgen \fB\-c\fR -|\fInettype\fR +| \fInettype\fR [\fB\-o \fIoutfile\fR\fR] [\fIinfile\fR] .YS @@ -434,11 +434,11 @@ [\fB\-q \fIqueue\fR\fR] \fB\-t\fR \fItime_arg\fR -|\fItimespec\fR +| \fItimespec\fR .YS .SY at \fB\-c\fR -|\fB\-r\fR +| \fB\-r\fR \fIjob\fR \fI...\fR .YS @@ -1087,7 +1087,7 @@ \fB\-f\fR \fIpath\fR \fB\-a\fR -|\fIrecord\fR +| \fIrecord\fR \fI...\fR .YS .SY getconf @@ -1159,8 +1159,8 @@ .YS .SY h2xs \fB\-h\fR -|\fB\-?\fR -|\fB\-\-help\fR +| \fB\-?\fR +| \fB\-\-help\fR .YS .SY head [\fB\-count\fR | \fB\-n \fIcount\fR\fR] @@ -1491,7 +1491,7 @@ .YS .SY lesskey \fB\-V\fR -|\fB\-\-version\fR +| \fB\-\-version\fR .YS .SY ln [\fB\-fhLnPs\fR] @@ -1813,7 +1813,7 @@ .SY netstat \fB\-I\fR \fIinterface\fR -|\fB\-i\fR +| \fB\-i\fR [\fB\-bdehnq\fR] .YS .SY netstat @@ -1998,11 +1998,11 @@ .YS .SY openssl \fIlist-standard-commands\fR -|\fIlist-message-digest-commands\fR -|\fIlist-cipher-commands\fR -|\fIlist-cipher-algorithms\fR -|\fIlist-message-digest-algorithms\fR -|\fIlist-public-key-algorithms\fR +| \fIlist-message-digest-commands\fR +| \fIlist-cipher-commands\fR +| \fIlist-cipher-algorithms\fR +| \fIlist-message-digest-algorithms\fR +| \fIlist-public-key-algorithms\fR .YS .SY openssl \fIno-command\fR @@ -2772,8 +2772,8 @@ .YS .SY snmp \fIget\fR -|\fIgetnext\fR -|\fIbulkget\fR +| \fIgetnext\fR +| \fIbulkget\fR [\fIoptions\fR] \fIagent\fR \fIoid\fR @@ -2781,7 +2781,7 @@ .YS .SY snmp \fIwalk\fR -|\fIbulkwalk\fR +| \fIbulkwalk\fR [\fIoptions\fR] \fIagent\fR [\fIoid\fR] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/master.mdoc new/lowdown-3.0.1/regress/manpages/master.mdoc --- old/lowdown-3.0.0/regress/manpages/master.mdoc 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/master.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -316,24 +316,24 @@ .Ar infile .Nm rpcgen .Fl c -| +.No | .Fl h -| +.No | .Fl l -| +.No | .Fl m -| +.No | .Fl t -| +.No | .Fl Sc -| +.No | .Fl Ss -| +.No | .Op Fl o Ar outfile .Op Ar infile .Nm rpcgen .Fl c -| +.No | .Ar nettype .Op Fl o Ar outfile .Op Ar infile @@ -395,11 +395,11 @@ .Op Fl q Ar queue .Fl t .Ar time_arg -| +.No | .Ar timespec .Nm at .Fl c -| +.No | .Fl r .Ar job .Ar ... @@ -954,7 +954,7 @@ .Fl f .Ar path .Fl a -| +.No | .Ar record .Ar ... .Nm getconf @@ -1015,9 +1015,9 @@ .Op Ar headerfile Ar ... Oo Ar extra_libraries Oc .Nm h2xs .Fl h -| +.No | .Fl ? -| +.No | .Fl \-help .Nm head .Op Fl count | Fl n Ar count @@ -1303,7 +1303,7 @@ .Op Ar input .Nm lesskey .Fl V -| +.No | .Fl \-version .Nm ln .Op Fl fhLnPs @@ -1576,7 +1576,7 @@ .Nm netstat .Fl I .Ar interface -| +.No | .Fl i .Op Fl bdehnq .Nm netstat @@ -1745,15 +1745,15 @@ .Op Ar command_arg Ar ... .Nm openssl .Ar list-standard-commands -| +.No | .Ar list-message-digest-commands -| +.No | .Ar list-cipher-commands -| +.No | .Ar list-cipher-algorithms -| +.No | .Ar list-message-digest-algorithms -| +.No | .Ar list-public-key-algorithms .Nm openssl .Ar no-command @@ -2420,9 +2420,9 @@ .Op Ar command Ar ... .Nm snmp .Ar get -| +.No | .Ar getnext -| +.No | .Ar bulkget .Op Ar options .Ar agent @@ -2430,7 +2430,7 @@ .Ar ... .Nm snmp .Ar walk -| +.No | .Ar bulkwalk .Op Ar options .Ar agent diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-close-delim-ns.man new/lowdown-3.0.1/regress/manpages/mdoc-close-delim-ns.man --- old/lowdown-3.0.0/regress/manpages/mdoc-close-delim-ns.man 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-close-delim-ns.man 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,7 @@ +.SH NAME +\fBfoo\fR \(en bar +.SH DESCRIPTION +.LP +this \fIb\fR:a b +.PP +that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-close-delim-ns.md new/lowdown-3.0.1/regress/manpages/mdoc-close-delim-ns.md --- old/lowdown-3.0.0/regress/manpages/mdoc-close-delim-ns.md 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-close-delim-ns.md 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,12 @@ +section: 1 +title: foo + +# NAME + +foo -- bar + +# DESCRIPTION + +this *b*:a b + +that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-close-delim-ns.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-close-delim-ns.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-close-delim-ns.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-close-delim-ns.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,9 @@ +.Sh NAME +.Nm foo +.Nd bar +.Sh DESCRIPTION +this +.Ar b Ns +:a b +.Pp +that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-close-delim.man new/lowdown-3.0.1/regress/manpages/mdoc-close-delim.man --- old/lowdown-3.0.0/regress/manpages/mdoc-close-delim.man 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-close-delim.man 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,7 @@ +.SH NAME +\fBfoo\fR \(en bar +.SH DESCRIPTION +.LP +this \fIb\fR: a +.PP +that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-close-delim.md new/lowdown-3.0.1/regress/manpages/mdoc-close-delim.md --- old/lowdown-3.0.0/regress/manpages/mdoc-close-delim.md 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-close-delim.md 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,12 @@ +section: 1 +title: foo + +# NAME + +foo -- bar + +# DESCRIPTION + +this *b*: a + +that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-close-delim.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-close-delim.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-close-delim.mdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-close-delim.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -0,0 +1,9 @@ +.Sh NAME +.Nm foo +.Nd bar +.Sh DESCRIPTION +this +.Ar b : +a +.Pp +that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-nd-empty.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-nd-empty.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-nd-empty.mdoc 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-nd-empty.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -1,4 +1,4 @@ .Sh NAME -.Nm foo +.Nm foo .Sh DESCRIPTION Hi there. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-nm-full.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-nm-full.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-nm-full.mdoc 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-nm-full.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -1,5 +1,5 @@ .Sh NAME -.Nm foo +.Nm foo .Nd bar .Sh DESCRIPTION Hi there. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-see-also.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-see-also.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-see-also.mdoc 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-see-also.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -1,5 +1,5 @@ .Sh NAME -.Nm foo +.Nm foo .Nd xyzzy .Sh DESCRIPTION Hi there. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-simple-prog.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-simple-prog.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-simple-prog.mdoc 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-simple-prog.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -1,5 +1,5 @@ .Sh NAME -.Nm foo +.Nm foo .Nd xyzzy .Sh DESCRIPTION Hi there. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/regress/manpages/mdoc-synopsis-func.mdoc new/lowdown-3.0.1/regress/manpages/mdoc-synopsis-func.mdoc --- old/lowdown-3.0.0/regress/manpages/mdoc-synopsis-func.mdoc 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/regress/manpages/mdoc-synopsis-func.mdoc 2026-03-18 21:41:56.000000000 +0100 @@ -1,5 +1,5 @@ .Sh NAME -.Nm foo +.Nm foo .Nd xyzzy .Sh SYNOPSIS .In stdio.h diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/roff.c new/lowdown-3.0.1/roff.c --- old/lowdown-3.0.0/roff.c 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/roff.c 2026-03-18 21:41:56.000000000 +0100 @@ -314,6 +314,30 @@ } /* + * Like bqueue_sblock(), but accepting variable arguments for the "nargs" + * option. + */ +static struct bnode * +bqueue_sblocknv(struct bnodeq *bq, const char *text, const char *fmt, ...) +{ + struct bnode *bn; + va_list ap; + int rc; + + if ((bn = bqueue_sblock(bq, text)) == NULL) + return NULL; + + va_start(ap, fmt); + rc = vasprintf(&bn->nargs, fmt, ap); + va_end(ap); + if (rc == -1) { + bn->nargs = NULL; + return NULL; + } + return bn; +} + +/* * Like bqueue_block(), but accepting the "nargs" option. If failure * occurs, the "nargs" is freed. If "nargs" is NULL, returns failure. */ @@ -422,7 +446,7 @@ eomacro; /* end of macro=1, 2=nosp */ char eolnchar; /* char at eoln */ size_t offset = 0; /* offset in "buf" */ - size_t sz; /* temporary size */ + size_t i, sz; /* temporary */ TAILQ_FOREACH(bn, bq, entries) { if (linestrip > 1 && @@ -559,35 +583,64 @@ /* Unsafe data must be escaped. */ if (bn->scope == BSCOPE_LITERAL) { - assert(bn->buf != NULL); - if (!lowdown_roff_esc(ob, bn->buf, - strlen(bn->buf), 0, 1)) + cp = bn->buf; + assert(cp != NULL); + sz = strlen(cp); + if (!lowdown_roff_esc(ob, cp, sz, 0, 1)) return 0; } else if (bn->buf != NULL) { + cp = bn->buf; + sz = strlen(cp); + /* - * For safe data in mdoc(7), see if the last - * character is opening punctuation. Use - * mdoc(7)'s "Delimiters" as a guide. - * XXX: multiple delimiters...? + * For mdoc(7), prepare for flushing a span + * against the coming semiblock macro. Unlike + * below where mdoc(7) delimiters need to be + * accounted for, here just see if the last + * character is non-space and use the correct + * `Ns` output. */ - sz = strlen(bn->buf); - if (sz - 1 > offset && - st->type == LOWDOWN_MDOC && + + if (st->type == LOWDOWN_MDOC && + sz > offset && + !isspace((unsigned char)cp[sz - 1]) && (tmpbn = TAILQ_NEXT(bn, entries)) != NULL && - tmpbn->scope == BSCOPE_SEMI && - (bn->buf[sz - 1] == '(' || - bn->buf[sz - 1] == '[')) { - if (!lowdown_roff_esc(ob, - &bn->buf[offset], sz - offset - 1, - 0, 0)) - return 0; - if (!hbuf_printf(ob, "\n.No %c Ns", - bn->buf[sz - 1])) + tmpbn->scope == BSCOPE_SEMI) { + for (i = sz - 1; i > offset; i--) + if (isspace((unsigned char)cp[i])) + break; + /* + * If there's no space, just print the + * string as-is within an `No`. + * Otherwise, chop the string up into + * before the space and after. + */ + if (i == offset) { + if (!hbuf_printf(ob, ".No ") || + !lowdown_roff_esc(ob, + &cp[offset], + sz - offset, 0, 0)) + return 0; + } else { + if (!lowdown_roff_esc(ob, + &cp[offset], + i - offset, 0, 0)) + return 0; + if (ob->size > 0 && + ob->data[ob->size - 1] != '\n' && + !HBUF_PUTSL(ob, "\n")) + return 0; + if (!hbuf_printf(ob, ".No ") || + !lowdown_roff_esc(ob, + &cp[i + 1], + sz - i - 1, 0, 0)) + return 0; + } + if (!hbuf_printf(ob, " Ns")) return 0; } else { - if (!lowdown_roff_esc(ob, - &bn->buf[offset], sz - offset, - 0, 0)) + if (!lowdown_roff_esc(ob, &cp[offset], + sz - offset, 0, 0)) return 0; } } @@ -673,34 +726,69 @@ /* * Semiblocks for mdoc(7) are within context, so examine - * if the next node is a span with closing puncatuation. - * Use mdoc(7)'s "Delimiters" section for which to use. - * XXX: multiple delimiters...? + * if the next node is a span with closing puncatuation + * or flush against the semiblock. If so, append it to + * the current macro with spaces between the delimiters + * or use `Ns`, respectively. For the former, draw from + * mdoc(7)'s "Delimiters" section for delimiters. + * TODO: consecutive semiblocks. */ offset = 0; - if (linestrip == 0 && st->type == LOWDOWN_MDOC && bn->scope == BSCOPE_SEMI && (tmpbn = TAILQ_NEXT(bn, entries)) != NULL && tmpbn->scope == BSCOPE_SPAN && - tmpbn->buf != NULL && - (tmpbn->buf[0] == '.' || - tmpbn->buf[0] == ',' || - tmpbn->buf[0] == ';' || - tmpbn->buf[0] == ')' || - tmpbn->buf[0] == ']' || - tmpbn->buf[0] == '?' || - tmpbn->buf[0] == '!') && - (tmpbn->buf[1] == '\0' || - isspace((unsigned char)tmpbn->buf[1]))) { - offset = 1; - HBUF_PUTSL(ob, " "); - hbuf_putc(ob, tmpbn->buf[0]); - while (tmpbn->buf[offset] != '\0' && - isspace((unsigned char)tmpbn->buf[offset])) - offset++; + (tmpbn->buf != NULL || tmpbn->nbuf != NULL)) { + /* Use safe or unsafe: doesn't matter. */ + cp = tmpbn->buf != NULL ? + tmpbn->buf : tmpbn->nbuf; + /* Read after consecutive delimiters. */ + for (offset = 0; ; offset++) { + if (cp[offset] != '.' && + cp[offset] != ',' && + cp[offset] != ':' && + cp[offset] != ';' && + cp[offset] != ')' && + cp[offset] != ']' && + cp[offset] != '?' && + cp[offset] != '!') { + offset = 0; + break; + } + /* + * Only applicable at end of token or + * with following whitespace. + */ + if (cp[offset + 1] == '\0' || + isspace((unsigned char)cp[offset + 1])) { + offset++; + break; + } + } + /* Output the delimiters, space-separated. */ + for (i = 0; i < offset; i++) + if (!HBUF_PUTSL(ob, " ") || + !hbuf_putc(ob, cp[i])) + return 0; + + /* + * Regardless of whether offset, examine the + * next character to see if it should be flush + * against the semiblock. + */ + + if (cp[offset] != '\0' && + !isspace((unsigned char)cp[offset]) && + !HBUF_PUTSL(ob, " Ns")) + return 0; + + /* If offset, read after remaining spaces. */ + if (offset > 0) + while (cp[offset] != '\0' && + isspace((unsigned char)cp[offset])) + offset++; } /* @@ -826,7 +914,6 @@ struct lowdown_buf *ob = NULL; struct bnode *bn; int rc = 0, classic = 0, inhibit = 0; - char *cp1, *cp2; /* Override type as e-mail if the link so resolves. */ @@ -834,29 +921,15 @@ type = HALINK_EMAIL; if (st->type == LOWDOWN_MDOC) { - if ((bn = bqueue_block(obq, - type == HALINK_EMAIL ? ".Mt" : ".Lk")) == NULL) - return 0; - if ((ob = hbuf_new(32)) == NULL || (bq != NULL && !bqueue_flush(st, ob, bq, 1))) goto out; - - cp1 = strndup(ob->data, ob->size); - cp2 = strndup(link->data, link->size); - - if (cp1 == NULL || cp2 == NULL) { - free(cp1); - free(cp2); - goto out; - } - if (asprintf(&bn->nargs, "%s %s", cp2, cp1) == -1) { - free(cp1); - free(cp2); - bn->args = NULL; - goto out; - } - + if (bqueue_blocknv(obq, + type == HALINK_EMAIL ? ".Mt" : ".Lk", + "%.*s %.*s", + (int)link->size, link->data, + (int)ob->size, ob->data) == NULL) + return 0; rc = 1; goto out; } @@ -977,11 +1050,9 @@ /* Either MT or UR depending on if a URL. */ - bn = bqueue_node(obq, BSCOPE_SEMI, type == HALINK_EMAIL ? - ".MT" : ".UR"); - if (bn == NULL) - goto out; - if ((bn->nargs = strndup(ob->data, ob->size)) == NULL) + if (bqueue_sblocknv(obq, + type == HALINK_EMAIL ? ".MT" : ".UR", + "%.*s", (int)ob->size, ob->data) == NULL) goto out; /* @@ -994,9 +1065,8 @@ /* Close out the link content. */ - bn = bqueue_node(obq, BSCOPE_SEMI_CLOSE, - type == HALINK_EMAIL ? ".ME" : ".UE"); - if (bn == NULL) + if (bqueue_node(obq, BSCOPE_SEMI_CLOSE, + type == HALINK_EMAIL ? ".ME" : ".UE") == NULL) goto out; rc = 1; @@ -1055,13 +1125,11 @@ /* Finally, emit the external or in-page link contents. */ - bn = bqueue_node(obq, BSCOPE_SEMI, - (type != HALINK_EMAIL && link->size > 0 && - link->data[0] == '#') ? - ".pdfhref L" : ".pdfhref W"); - if (bn == NULL) - goto out; - if ((bn->nargs = strndup(ob->data, ob->size)) == NULL) + if (bqueue_sblocknv(obq, + (type != HALINK_EMAIL && + link->size > 0 && link->data[0] == '#') ? + ".pdfhref L" : ".pdfhref W", + "%.*s", (int)ob->size, ob->data) == NULL) goto out; rc = 1; @@ -1129,45 +1197,75 @@ return 1; } +/* + * Render list or definition list. Return FALSE on failure, TRUE on + * success. + */ static int rndr_list(struct nroff *st, struct bnodeq *obq, const struct lowdown_node *n, struct bnodeq *bq) { - struct bnode *bn; const char *type; int compact; - const struct lowdown_node *pn; + const struct lowdown_node *prev; - /* Lists for mdoc(7) are somewhat simple... */ + prev = TAILQ_PREV(n, lowdown_nodeq, entries); + compact = !(n->rndr_list.flags & HLIST_FL_DEF) && + !(n->rndr_list.flags & HLIST_FL_BLOCK); if (st->type == LOWDOWN_MDOC) { - pn = TAILQ_FIRST(&n->children); - - /* Output Pp prior to compact lists. */ - - compact = pn != NULL && pn->type == LOWDOWN_LISTITEM && - (pn->rndr_listitem.flags & HLIST_FL_BLOCK); + /* + * In mdoc(7), compact lists don't output leading + * vertical space, so add it in here if necessary. The + * only time this is *not* done is if there's a + * block prior to this. + */ - if (compact && !NODE_AFTER_HEAD(n) && + if (compact && + prev != NULL && + (prev->type == LOWDOWN_BLOCKCODE || + prev->type == LOWDOWN_LIST || + prev->type == LOWDOWN_DEFINITION || + prev->type == LOWDOWN_PARAGRAPH) && bqueue_block(obq, ".Pp") == NULL) return 0; + + /* Handle various types of list. */ + if (n->rndr_list.flags & HLIST_FL_DEF) type = "-tag -width Ds"; else if (n->rndr_list.flags & HLIST_FL_ORDERED) type = "-enum"; else type = "-bullet"; - if ((bn = bqueue_block(obq, ".Bl")) == NULL) + if (bqueue_blocknv(obq, ".Bl", "%s%s", type, + compact ? " -compact" : "") == NULL) return 0; - if (asprintf(&bn->nargs, "%s%s", type, - compact ? " -compact" : "") == -1) { - bn->nargs = NULL; - return 0; - } + + /* List content. */ + TAILQ_CONCAT(obq, bq, entries); return bqueue_block(obq, ".El") != NULL; } + /* + * In man(7), vertical space needs to be taken out for compact + * lists instead of the opposite as with mdoc(7). Take out + * vertical space if in a compact list without a prior + * block. (This also needs to happen for each list item: see + * rndr_listitem()). + */ + + if (compact && + (prev == NULL || + (prev->type != LOWDOWN_BLOCKCODE && + prev->type != LOWDOWN_LIST && + prev->type != LOWDOWN_DEFINITION && + prev->type != LOWDOWN_PARAGRAPH)) && + (bqueue_block(obq, ".if n \\\n.sp -1") == NULL || + bqueue_block(obq, ".if t \\\n.sp -0.25v\n") == NULL)) + return 0; + /* * For a nested man(7) or ms(7) list, use RS/RE to indent the * nested component. Otherwise the "IP" used for the titles and @@ -1178,6 +1276,8 @@ if (n->type == LOWDOWN_LISTITEM) break; + /* List content optionally sandwiched in RS/RE. */ + if (n != NULL && bqueue_block(obq, ".RS") == NULL) return 0; TAILQ_CONCAT(obq, bq, entries); @@ -1447,6 +1547,21 @@ return 1; } + /* + * Suppress leading space if we're not in a block and there's a + * list item that comes after us (i.e., anything after us). + */ + + if (TAILQ_PREV(n, lowdown_nodeq, entries) != NULL && + n->parent != NULL && + n->parent->type == LOWDOWN_LIST && + !(n->parent->rndr_list.flags & HLIST_FL_BLOCK) && + !(n->parent->rndr_list.flags & HLIST_FL_DEF) && + (bqueue_block(obq, ".if n \\\n.sp -1") == NULL || + bqueue_block(obq, ".if t \\\n.sp -0.25v\n") == NULL)) + return 0; + + /* * For man(7) and ms(7), when indenting for the number of bullet * preceding the line of text, use "indent" spaces as the @@ -1497,21 +1612,6 @@ bqueue_strip_paras(bq); TAILQ_CONCAT(obq, bq, entries); - - /* - * Suppress trailing space if we're not in a block and there's a - * list item that comes after us (i.e., anything after us). - */ - - if ((n->rndr_listitem.flags & HLIST_FL_BLOCK) || - (n->rndr_listitem.flags & HLIST_FL_DEF)) - return 1; - - if (TAILQ_NEXT(n, entries) != NULL && - (bqueue_block(obq, ".if n \\\n.sp -1") == NULL || - bqueue_block(obq, ".if t \\\n.sp -0.25v\n") == NULL)) - return 0; - return 1; } @@ -1827,8 +1927,6 @@ /* Now the body layout. */ hbuf_truncate(ob); - if ((bn = bqueue_block(obq, NULL)) == NULL) - goto out; for (i = 0; i < param->columns; i++) { if (i > 0 && !HBUF_PUTSL(ob, " ")) goto out; @@ -1849,7 +1947,8 @@ } if (!hbuf_putc(ob, '.')) goto out; - if ((bn->nbuf = strndup(ob->data, ob->size)) == NULL) + if (bqueue_blocknv(obq, NULL, "%.*s", + (int)ob->size, ob->data) == NULL) goto out; TAILQ_CONCAT(obq, bq, entries); @@ -2664,6 +2763,13 @@ rc = rndr_raw_html(st, obq, &n->rndr_raw_html); break; case LOWDOWN_NORMAL_TEXT: + /* + * Don't create a zero-length node: it will confuse + * bqueue_flush(), which looks-ahead to see what's in + * the next node. + */ + if (n->rndr_normal_text.text.size == 0) + break; if ((bn = bqueue_span(obq, NULL)) == NULL) goto out; bn->buf = hbuf_string(&n->rndr_normal_text.text); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/roff_manpage.c new/lowdown-3.0.1/roff_manpage.c --- old/lowdown-3.0.0/roff_manpage.c 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/roff_manpage.c 2026-03-18 21:41:56.000000000 +0100 @@ -432,8 +432,22 @@ if (buf->data[pos] == ']') return 0; + /* + * A difficult case. The vertical bar is on the top-level of the + * flags, so something like `foo -s | -v`. This isn't handled + * in the Fl case because it doesn't look ahead to the + * subsequent -v, so it's handled here. Don't use just a + * vertical bar because that will confuse the "magic" in + * bqueue_flush(), which looks at the span after a semiblock to + * see if it should output `Ns`. + */ + if (buf->data[pos] == '|') { - if (bqueue_span(nq, "|") == NULL) + if (st->type == LOWDOWN_MDOC && + bqueue_sblock(nq, ".No |") == NULL) + return -1; + if (st->type == LOWDOWN_MAN && + bqueue_span(nq, "| ") == NULL) return -1; return pos + 1; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/tree.c new/lowdown-3.0.1/tree.c --- old/lowdown-3.0.0/tree.c 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/tree.c 2026-03-18 21:41:56.000000000 +0100 @@ -341,16 +341,17 @@ return 0; break; case LOWDOWN_LIST: - if (!rndr_indent(ob, indent + 1)) - return 0; - if (!hbuf_printf(ob, "list type: %s\n", - HLIST_FL_ORDERED & root->rndr_list.flags ? - "ordered" : "unordered")) - return 0; - if (!rndr_indent(ob, indent + 1)) - return 0; - if (!hbuf_printf(ob, "list items: %zu\n", - root->rndr_list.items)) + if (!rndr_indent(ob, indent + 1) || + !hbuf_printf(ob, "list type: %s\n", + (root->rndr_list.flags & HLIST_FL_ORDERED) ? + "ordered" : "unordered") || + !rndr_indent(ob, indent + 1) || + !hbuf_printf(ob, "scope: %s\n", + (root->rndr_list.flags & HLIST_FL_BLOCK) ? + "block" : "span") || + !rndr_indent(ob, indent + 1) || + !hbuf_printf(ob, "list items: %zu\n", + root->rndr_list.items)) return 0; break; case LOWDOWN_META: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lowdown-3.0.0/versions.xml new/lowdown-3.0.1/versions.xml --- old/lowdown-3.0.0/versions.xml 2026-03-07 21:47:42.000000000 +0100 +++ new/lowdown-3.0.1/versions.xml 2026-03-18 21:41:56.000000000 +0100 @@ -1925,4 +1925,21 @@ </p> </aside> </article> + <article data-sblg-article="1" data-sblg-tags="version"> + <header> + <h1>3.0.1</h1> + <address>Kristaps Dzonsons</address> + <time datetime="2026-03-18">2026-03-18</time> + </header> + <aside> + <p> + Flesh out <b>-tmdoc</b> to handle macros flush against other words + and punctuation, e.g., <code>(*-abcd*):</code>. + </p> + <p> + Properly format <b>-tmdoc</b> and <b>-tman</b> compact lists, + including nested compact lists. + </p> + </aside> + </article> </articles> ++++++ lowdown.obsinfo ++++++ --- /var/tmp/diff_new_pack.3uFa5d/_old 2026-03-27 06:44:08.576693626 +0100 +++ /var/tmp/diff_new_pack.3uFa5d/_new 2026-03-27 06:44:08.580693792 +0100 @@ -1,5 +1,5 @@ name: lowdown -version: 3.0.0 -mtime: 1772916462 -commit: 882815adcbf0892bb854c3d6bc451fa9a0fa68fd +version: 3.0.1 +mtime: 1773866516 +commit: f4249d46942ac6c52a8abc3e31ea990cad5b6a22
