diff --git a/scripts/gen-keybinds.sh b/scripts/gen-keybinds.sh index dcab227..3feeeec 100755 --- a/scripts/gen-keybinds.sh +++ b/scripts/gen-keybinds.sh @@ -42,17 +42,27 @@ gen() { echo "> GENERATED by \`scripts/gen-keybinds.sh\` from \`$(basename "$KBD")\` — do not edit by hand." echo awk ' - # section header: // ─── Name ─── - /^[[:space:]]*\/\/[[:space:]]*─+ (.+) ─+[[:space:]]*$/ { + # Section marker: a comment decorated with box-drawing dashes on both sides, + # `// ─── Name ───`. The dash is matched as a LITERAL and removed with gsub — never + # with a quantifier on the multibyte character. Under LC_ALL=C (cron, systemd units, + # agent shells) gawk works byte-wise, `─+` then means "the last byte of ─, repeated", + # and every header vanishes while the script still exits 0. Plain comments stay + # comments: only a dash-decorated one opens a section. + /^[[:space:]]*\/\/[[:space:]]*─/ { s = $0 - sub(/^[[:space:]]*\/\/[[:space:]]*─+ /, "", s) - sub(/ ─+[[:space:]]*$/, "", s) - if (in_table) print "" - print "## " s - print "" - print "| Key | Action |" - print "|-----|--------|" - in_table = 1 + sub(/^[[:space:]]*\/\/[[:space:]]*/, "", s) + sub(/[[:space:]]+$/, "", s) + if (s ~ /─ .*─/) { + gsub(/─/, "", s) + gsub(/[[:space:]]+/, " ", s) + sub(/^ /, "", s); sub(/ $/, "", s) + if (in_table) print "" + print "## " s + print "" + print "| Key | Action |" + print "|-----|--------|" + in_table = 1 + } next } # bind line: KEY [flags] [hotkey-overlay-title="..."] { action; } diff --git a/tests/gen-keybinds.bats b/tests/gen-keybinds.bats index 70edf8b..8823e11 100755 --- a/tests/gen-keybinds.bats +++ b/tests/gen-keybinds.bats @@ -48,6 +48,16 @@ teardown() { [[ "$output" != *"a plain comment"* ]] } +@test "section headers survive a C locale, where awk reads bytes instead of characters" { + # Cron, systemd units and agent shells get LC_ALL=C while Frank's terminal does not. + # A matcher that puts a quantifier on a multibyte character then loses EVERY section + # header and prints a sheet with no sections at all — silently, exit status 0. + run env LC_ALL=C "$GEN" "$TMP/keybinds.kdl" + [[ "$output" == *"## Applications"* ]] + [[ "$output" == *"## Screenshots"* ]] + [[ "$output" != *"a plain comment"* ]] +} + @test "row count matches bind count" { run "$GEN" "$TMP/keybinds.kdl" local rows