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
+    
+      ยท 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.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
+    
+      ยท 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.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
 

Reply via email to