From c5de9e6a21c495241249962b87bca0b4b5d39248 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 21 Jul 2024 09:22:18 +0300 Subject: [single] Started work on Markdown parser --- single.awk | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 single.awk (limited to 'single.awk') diff --git a/single.awk b/single.awk new file mode 100644 index 0000000..37f9d3a --- /dev/null +++ b/single.awk @@ -0,0 +1,119 @@ +# Status: +# [.] Inline HTML +# [x] Autoescape +# [ ] Block elements +# [x] Paragraph +# [ ] Line break +# [.] Headers (atx and setex) +# [x] Blockquotes +# [ ] Lists +# [ ] Code blocks +# [x] Horizontal rules +# [ ] Span elements +# [ ] Links +# [ ] Emphasis +# [ ] Code +# [ ] Images +# [ ] Other +# [ ] Autolinks +# [ ] Escapes + +BEGIN { + prev_blankline = blankline = 1 + newStack("bq-level") +} + +{ + prev_blankline = blankline + blankline = 1 +} + +/[^[:blank:]]/ { + blankline = 0 +} + +# Blockquote Part 1/2 +/^>[[:blank:]]*$/ { next } +/^> / { + level = 0 + while (match($0, /^> [[:blank:]]*/)) { + $0 = substr($0, RLENGTH + 1) + level += RSTART + while (topStack("bq-level") > level) { + print "" + popStack("bq-level") + } + if (topStack("bq-level") < level) { + print "
" + pushStack("bq-level", level) + } + } +} + +# Inline HTML +/^[[:blank:]]*<\/?[[:alnum:]]+/ { + print + next +} + +# Horizontal rules +/^(-|\*|_) ?(-|\*|_) ?(-|\*|_)+$/ { + print "
" + blankline = 1 + next +} + +# atx-style headers +/^[[:blank:]]*#+/ { + match($0, /#+/) + if (RLENGTH <= 6) { + gsub(/^[[:blank:]]*#+[[:blank:]]*/, "") + gsub(/[[:blank:]]*#+[[:blank:]]*$/, "") + print "" $0 "" + blankline = 1 + next + } +} + +# setex-style headers TODO + +# Code blocks +/^( |\t)[[:blank:]]*/ { +} + +# Paragraphs +prev_blankline && !blankline && lengthStack("bq-level") == 0 { print "

" } +!prev_blankline && blankline && lengthStack("bq-level") == 0 { print "

" } + +# Blockquote Part 2/2 +blankline { + while (lengthStack("bq-level") > 0) { + print "
" + popStack("bq-level") + } +} + +# Auto-escape & +/&/ { + ampstart = 0 + while (match(substr($0, ampstart + 1), /&/)) { + ampstart += RSTART + if (match(substr($0, ampstart), /&[[:alnum:]#]+;/)) { continue } + + $0 = substr($0, 1, ampstart - 1) "&" substr($0, ampstart + 1) + } +} +# Auto-escape < +/" } + while (lengthStack("bq-level") > 0) { + print "" + popStack("bq-level") + } +} -- cgit v1.3.1-26-gb76a