From f00a95c6a3d7dbb28dc1baf9ec85cdaa75595074 Mon Sep 17 00:00:00 2001 From: Konstantin Nazarov Date: Sun, 1 Aug 2021 22:40:37 +0100 Subject: [PATCH] Add support for better bold/italic formatting --- README.md | 2 +- markdown.awk | 53 +++++++++++++++++++++++++++++----------------------- test.sh | 21 +++++++++++++++++++++ 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 1bfc53a..2fd68af 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Here's a list of supported markdown primitives - Headers - Paragraphs -- Text formatting: bold +- Text formatting: bold/italic - Code blocks - Blockquotes - Lists, both bulleted and numbered diff --git a/markdown.awk b/markdown.awk index 471006c..99b6517 100644 --- a/markdown.awk +++ b/markdown.awk @@ -7,7 +7,7 @@ function parse_header(str, hnum, content) { if (substr(str, 1, 1) == "#") { gsub(/ *#* *$/, "", str); match(str, /#+/); - hnum = RLENGTH; + hnum = RLENGTH; gsub(/^#+ */, "", str); content = parse_line(str); @@ -240,20 +240,34 @@ function escape_text(str) { return str; } -function extract_emphasis(str, i, sstr, arr, num, c) { - sstr=substr(str, i, length(str) - i + 1); - c = "" +function extract_emphasis(str, i, sstr) { + sstr=substr(str, i, length(str) - i + 1); - if (match(sstr, /^\*{1,3}[^\*]/)) { - c = "*"; - num = RLENGTH; + if (match(sstr, /^\*[^\*]+\*/) || + match(sstr, /^\*\*[^\*]+\*\*/) || + match(sstr, /^\*\*\*[^\*]+\*\*\*/) || + match(sstr, /^_[^_]+_/) || + match(sstr, /^__[^_]+__/) || + match(sstr, /^___[^_]+___/)) + return substr(str, i, RLENGTH); + + return ""; +} + +function parse_emphasis(str, i) { + match(str, /^[\*_]{1,3}/); + num = RLENGTH; + + if (num == 1) { + return "" parse_line(substr(str, 2, length(str) - 2)) ""; } - - if (match(sstr, /^_{1,3}[^_]/)) { - c = "_"; - num = RLENGTH; + if (num == 2) { + return "" parse_line(substr(str, 3, length(str) - 4)) ""; } - + if (num == 3) { + return "" parse_line(substr(str, 4, length(str) - 6)) ""; + } + return ""; } function parse_line(str, result, end, i, c) { @@ -262,17 +276,10 @@ function parse_line(str, result, end, i, c) { for (i=1; i<=length(str); i++) { c = substr(str, i, 1); - if (c == "*" && is_token(str, i, "**")){ - end = find(str, "**", i+2); - - if (end != 0) { - result = result "" parse_line(substr(str, i+2, end - i - 2)) ""; - i = end+1; - } - else { - result = result "**"; - i++; - } + if ((c == "*" || c == "_") && extract_emphasis(str, i) != ""){ + emphasis = extract_emphasis(str, i); + result = result parse_emphasis(emphasis) + i = i + length(emphasis) - 1; } else if (c == "`" && is_token(str, i, "```")) { end = find(str, "```", i+3); diff --git a/test.sh b/test.sh index 25012bb..9b527f7 100755 --- a/test.sh +++ b/test.sh @@ -103,10 +103,31 @@ underlined header 2

underlined header 2

EOF +check <<-EOF +*italic* + +_italic_ +--- +

italic

+

italic

+EOF + check <<-EOF **bold** + +__bold__ ---

bold

+

bold

+EOF + +check <<-EOF +***bold italic*** + +___bold italic___ +--- +

bold italic

+

bold italic

EOF check <<-EOF