aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2021-01-29 19:09:51 +0000
committerJohn Ankarström <john@ankarstrom.se>2021-01-29 19:09:51 +0000
commiteb8d329d93efa56c8afa4106932b0dfe62eef50e (patch)
tree8b6b279cfad468f72ada551619bf2a89f83ce20c
parent99e2817d51dfa45b59276e6d002c6dd95b9f4156 (diff)
downloadem-eb8d329d93efa56c8afa4106932b0dfe62eef50e.tar.gz
Add references and reference lists
-rwxr-xr-xem95
1 files changed, 64 insertions, 31 deletions
diff --git a/em b/em
index 4977ef3..010fa63 100755
--- a/em
+++ b/em
@@ -9,15 +9,20 @@ function newblock(name) {
printf "<%s>", name
}
+function closeblock(name) {
+ if (name == "nl") printf "</ol>\n"
+ else printf "</%s>\n", name
+}
+
function breakblock() {
if (openitem) {
printf "</li>\n"
while (itemlevel-- > 1)
- printf "</%s>\n", openblock
+ closeblock(openblock)
itemlevel = 1
}
if (opendef) printf "</dd>\n"
- if (openblock) printf "</%s>\n", openblock
+ if (openblock) closeblock(openblock)
openitem = 0
opendef = 0
openblock = 0
@@ -37,9 +42,22 @@ function item(level, type, line) {
if (level > itemlevel) printf "<ul>\n"
if (level < itemlevel) printf "</ul>\n"
itemlevel = level
- if (type == "ul") sub("^ +- ", "")
- if (type == "ol") sub("^ +[0-9]+\. ", "")
- printf "<li>"
+ if (type == "ul") {
+ sub("^ +- ", "")
+ printf "<li>"
+ }
+ if (type == "ol") {
+ match($0, "[0-9]+\.")
+ n = substr($0, RSTART, RLENGTH-1)
+ sub("^ +[0-9]+\. ", "")
+ printf "<li value=\"%s\">", n
+ }
+ if (type == "nl") {
+ match($0, "\[[0-9]+\]")
+ n = substr($0, RSTART+1, RLENGTH-2)
+ sub("^ +\[[0-9]+\] ", "")
+ printf "<li value=\"%d\" id=\"ref%d\">", n, n
+ }
}
function term(line, t) { # t is a local variable
@@ -52,29 +70,40 @@ function term(line, t) { # t is a local variable
printf "<dt>%s</dt><dd>", t
}
+function ref(n) {
+ return "[<a href=\"#ref" n "\">" n "</a>]"
+}
+
function format(line) {
n = split(line, w, "[ ]")
for (i = 0; i <= n; i++) {
- if (w[i] == "")
- continue;
+ if (w[i] == "") continue;
+
+ if (match(w[i], "^\[[0-9]+\]$"))
+ w[i] = ref(substr(w[i], 2, RLENGTH-2))
+ else if (match(w[i], "^\[[0-9]+\][.,:;?!]$"))
+ w[i] = ref(substr(w[i], 2, RLENGTH-3)) substr(w[i], RLENGTH)
+
if (match(w[i], "^`"))
w[i] = "<tt>" substr(w[i], 2)
else if (match(w[i], "^\\*"))
w[i] = "<i>" substr(w[i], 2)
else if (match(w[i], "^_"))
w[i] = "<b>" substr(w[i], 2)
+
if (match(w[i], "`$"))
- w[i] = substr(w[i], 1, RLENGTH-2) "</tt>"
+ w[i] = substr(w[i], 1, RSTART-1) "</tt>"
else if (match(w[i], "\\*$"))
- w[i] = substr(w[i], 1, RLENGTH-2) "</i>"
+ w[i] = substr(w[i], 1, RSTART-1) "</i>"
else if (match(w[i], "_$"))
- w[i] = substr(w[i], 1, RLENGTH-2) "</b>"
+ w[i] = substr(w[i], 1, RSTART-1) "</b>"
else if (match(w[i], "`[.,:;?!]$"))
w[i] = substr(w[i], 1, RSTART-1) "</tt>" substr(w[i], RSTART+1)
else if (match(w[i], "\\*\.$"))
w[i] = substr(w[i], 1, RSTART-1) "</i>" substr(w[i], RSTART+1)
else if (match(w[i], "_[.,:;?!]$"))
w[i] = substr(w[i], 1, RSTART-1) "</b>" substr(w[i], RSTART+1)
+
printf "%s", w[i]
if (i < n) printf " "
}
@@ -84,13 +113,14 @@ function format(line) {
BEGIN { expectblock = 1; itemlevel = 1 }
END { breakblock() }
-/^$/ { breakblock(); getline }
-expectblock && /^ / { newblock("table") }
-expectblock && /^ - / { newblock("ul") }
-expectblock && /^ [0-9]+\. / { newblock("ol") }
-expectblock && /^ .*: / { newblock("dl") }
-expectblock && /^ / { newblock("pre"); sub("^ ", "") }
-expectblock && /^---$/ { expectblock = 0; printf "<hr/>\n"; next }
+/^$/ { breakblock(); getline }
+expectblock && /^ / { newblock("table") }
+expectblock && /^ - / { newblock("ul") }
+expectblock && /^ [0-9]+\. / { newblock("ol") }
+expectblock && /^ \[[0-9]\]+ / { newblock("nl") }
+expectblock && /^ .*: / { newblock("dl") }
+expectblock && /^ / { newblock("pre"); sub("^ ", "") }
+expectblock && /^---$/ { expectblock = 0; printf "<hr/>\n"; next }
expectblock && /^= .* =$/ { heading(1, $0); next }
expectblock && /^== .* ==$/ { heading(3, $0); next }
expectblock && /^=== .* ===$/ { heading(3, $0); next }
@@ -99,19 +129,22 @@ expectblock && /^===== .* =====$/ { heading(5, $0); next }
expectblock && /^====== .* ======$/ { heading(6, $0); next }
expectblock { newblock("p") }
-block = "ul" && /^ -/ { item(1, "ul", line) }
-block = "ol" && /^ [0-9]+\./ { item(1, "ol", line) }
-block = "dl" && /^ .*:/ { term(line) }
-
-block = "ul" && /^ -/ { item(2, "ul", line) }
-block = "ol" && /^ [0-9]+\./ { item(2, "ol", line) }
-block = "ul" && /^ -/ { item(3, "ul", line) }
-block = "ol" && /^ [0-9]+\./ { item(3, "ol", line) }
-block = "ul" && /^ -/ { item(4, "ul", line) }
-block = "ol" && /^ [0-9]+\./ { item(4, "ol", line) }
-block = "ul" && /^ -/ { item(5, "ul", line) }
-block = "ol" && /^ [0-9]+\./ { item(5, "ol", line) }
-block = "ul" && /^ -/ { item(6, "ul", line) }
-block = "ol" && /^ [0-9]+\./ { item(6, "ol", line) }
+block = "ul" && /^ - / { item(1, "ul", line) }
+block = "ol" && /^ [0-9]+\. / { item(1, "ol", line) }
+block = "nl" && /^ \[[0-9]\]+ / { item(1, "nl", line) }
+block = "dl" && /^ .*: / { term(line) }
+
+block = "ul" && /^ -/ { item(2, "ul", line) }
+block = "ol" && /^ [0-9]+\./ { item(2, "ol", line) }
+block = "ul" && /^ -/ { item(3, "ul", line) }
+block = "ol" && /^ [0-9]+\./ { item(3, "ol", line) }
+block = "ul" && /^ -/ { item(4, "ul", line) }
+block = "ol" && /^ [0-9]+\./ { item(4, "ol", line) }
+block = "ul" && /^ -/ { item(5, "ul", line) }
+block = "ol" && /^ [0-9]+\./ { item(5, "ol", line) }
+block = "ul" && /^ -/ { item(6, "ul", line) }
+block = "ol" && /^ [0-9]+\./ { item(6, "ol", line) }
+
+block = "pre" && /^ / { sub("^ ", ""); printf "%s\n", $0; next }
{ format($0) }