Parse block attribute list lines

This code is of strategic importance, but its output is so far unused.
This commit is contained in:
Přemysl Eric Janouch 2023-06-10 15:06:19 +02:00
parent 29bf109a51
commit bd1013f16a
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 55 additions and 3 deletions

View File

@ -1,6 +1,6 @@
# asciiman.awk: simplified AsciiDoc to manual page converter # asciiman.awk: simplified AsciiDoc to manual page converter
# #
# Copyright (c) 2022, Přemysl Eric Janouch <p@janouch.name> # Copyright (c) 2022 - 2023, Přemysl Eric Janouch <p@janouch.name>
# SPDX-License-Identifier: 0BSD # SPDX-License-Identifier: 0BSD
# #
# This is not intended to produce great output, merely useful output. # This is not intended to produce great output, merely useful output.
@ -92,6 +92,47 @@ NR == 1 {
print ".nh" print ".nh"
} }
function readattrlist(line, posattrs, namedattrs, name, value, n) {
if (!match(line, /^\[.*\]$/))
return 0
line = expand(substr(line, RSTART + 1, RLENGTH - 2))
while (line) {
name = ""
if (match(line, /^[[:alnum:]][[:alnum:]-]*/)) {
value = substr(line, RSTART, RLENGTH)
if (match(substr(line, RSTART + RLENGTH),
/^[[:space:]]*=[[:space:]]*/)) {
name = value
line = substr(line, 1 + length(name) + RLENGTH)
}
}
# The quoting syntax actually is awful like this.
if (match(line, /^"(\\.|[^"\\])*"/)) {
value = substr(line, RSTART + 1, RLENGTH - 2)
gsub(/\\"/, "\"", value)
} else if (match(line, /^'(\\.|[^'\\])*'/)) {
value = substr(line, RSTART + 1, RLENGTH - 2)
gsub(/\\'/, "'", value)
} else {
match(line, /^[^,]*/)
value = substr(line, RSTART, RLENGTH)
sub(/[[:space:]]*$/, "", value)
}
line = substr(line, RSTART + RLENGTH)
sub(/^[[:space:]]*,[[:space:]]*/, "", line)
if (!name)
posattrs[++n] = value
else if (value == "None")
delete namedattrs[name]
else
namedattrs[name] = value
}
return 1
}
function format(line, v) { function format(line, v) {
# Pass-through, otherwise useful for hacks, is a bit of a lie here, # Pass-through, otherwise useful for hacks, is a bit of a lie here,
# and formatting doesn't fully respect word boundaries. # and formatting doesn't fully respect word boundaries.
@ -154,7 +195,7 @@ function inline(line) {
} }
# Returns 1 iff the left-over $0 should be processed further. # Returns 1 iff the left-over $0 should be processed further.
function process(firstline) { function process(firstline, posattrs, namedattrs) {
if (readattribute(firstline)) if (readattribute(firstline))
return 0 return 0
if (getline <= 0) { if (getline <= 0) {
@ -162,6 +203,17 @@ function process(firstline) {
return 0 return 0
} }
# Block attribute list lines.
delete posattrs[0]
delete namedattrs[0]
while (readattrlist(firstline, posattrs, namedattrs)) {
firstline = $0
if (getline <= 0) {
inline(firstline)
return 0
}
}
# mandoc(1) automatically precedes section headers with blank lines. # mandoc(1) automatically precedes section headers with blank lines.
if (length(firstline) == length($0) && /^-+$/) { if (length(firstline) == length($0) && /^-+$/) {
print ".SH \"" escape(toupper(expand(firstline))) "\"" print ".SH \"" escape(toupper(expand(firstline))) "\""
@ -199,7 +251,7 @@ function process(firstline) {
return 1 return 1
} }
# We generally assume these block end with a blank line. # We generally assume these blocks end with a blank line.
if (match(firstline, /^[[:space:]]*[*][[:space:]]+/)) { if (match(firstline, /^[[:space:]]*[*][[:space:]]+/)) {
flushspace() flushspace()