Summary Files Commits Branches @commit @diff @stats
path: root / single.awk
diff options
context:
space:
mode:
Commitafee47c616ca5551f1b7eef7428c416134d31789 (patch)
Author
 Syndamia <kamen@syndamia.com>
2024-12-31 20:20:07 +0200
Committer
 Syndamia <kamen@syndamia.com>
2024-12-31 20:20:07 +0200
Filesce6f6ef63a6b21e247036b2177e3c16266c14c46 /single.awk
csg-afee47c616ca5551f1b7eef7428c416134d31789.tar
csg-afee47c616ca5551f1b7eef7428c416134d31789.tar.gz
csg-afee47c616ca5551f1b7eef7428c416134d31789.zip
Parent885be8887eb05fff87c9ed150edff94cc2d3d6d7 (diff)
feat(single): Implement autoescaping
1 files changed, 22 insertions, 1 deletions
-rw-r--r--single.awk23
diff --git a/single.awk b/single.awk
index e19117d..a27d61c 100644
--- a/single.awk
+++ b/single.awk
@@ -1,6 +1,6 @@
# Status:
# [.] Inline HTML
-# [ ] Autoescape
+# [x] Autoescape
# [.] Block elements
# [x] Paragraph
# [x] Line break
@@ -155,6 +155,14 @@ blockquote_level > 0 && empty0 {
P1 = P1 "<pre><code>"
inside_codeblock = 1
}
+
+ ## Autoescape & and <
+ for (i = 1; match(substr($0, i), /&/); i += RSTART) {
+ RSTART += i - 1
+ sub_match("&amp;")
+ }
+ gsub(/</, "\\&lt;")
+
_next()
}
inside_codeblock && ! /^[ \t]*$/ {
@@ -192,6 +200,19 @@ inside_codeblock && ! /^[ \t]*$/ {
}
}
+# Autoescape &
+/&/ {
+ for (i = 1; match(substr($0, i), /&/); i += RSTART) {
+ RSTART += i - 1
+ if (substr($0, RSTART) ~ /&[A-Za-z0-9#]+;/) { continue }
+ sub_match("&amp;")
+ }
+}
+# Autoescape <
+/ < / {
+ gsub(/ < /, "\\&lt;")
+}
+
# Line break
/ $/ {
sub(/[ \t]* $/, "</br>")