Blame


1 2ad4a6a2 2022-01-23 op #!/usr/bin/awk -f
2 2ad4a6a2 2022-01-23 op #
3 2ad4a6a2 2022-01-23 op # Copyright (c) 2022 Omar Polo <op@omarpolo.com>
4 2ad4a6a2 2022-01-23 op #
5 2ad4a6a2 2022-01-23 op # Permission to use, copy, modify, and distribute this software for any
6 2ad4a6a2 2022-01-23 op # purpose with or without fee is hereby granted, provided that the above
7 2ad4a6a2 2022-01-23 op # copyright notice and this permission notice appear in all copies.
8 2ad4a6a2 2022-01-23 op #
9 2ad4a6a2 2022-01-23 op # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 2ad4a6a2 2022-01-23 op # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 2ad4a6a2 2022-01-23 op # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 2ad4a6a2 2022-01-23 op # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 2ad4a6a2 2022-01-23 op # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 2ad4a6a2 2022-01-23 op # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 2ad4a6a2 2022-01-23 op # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 2ad4a6a2 2022-01-23 op
17 2ad4a6a2 2022-01-23 op BEGIN {
18 2ad4a6a2 2022-01-23 op in_pre = 0;
19 2ad4a6a2 2022-01-23 op in_list = 0;
20 2ad4a6a2 2022-01-23 op }
21 2ad4a6a2 2022-01-23 op
22 2ad4a6a2 2022-01-23 op !in_pre && /^###/ { output("<h3>", substr($0, 4), "</h3>"); next }
23 2ad4a6a2 2022-01-23 op !in_pre && /^##/ { output("<h2>", substr($0, 3), "</h2>"); next }
24 2ad4a6a2 2022-01-23 op !in_pre && /^#/ { output("<h1>", substr($0, 2), "</h1>"); next }
25 2ad4a6a2 2022-01-23 op !in_pre && /^>/ { output("<blockquote>", substr($0, 2), "</blockquote>"); next }
26 2ad4a6a2 2022-01-23 op !in_pre && /^\* / { output("<li>", substr($0, 2), "</li>"); next }
27 2ad4a6a2 2022-01-23 op
28 2ad4a6a2 2022-01-23 op !in_pre && /^=>/ {
29 2ad4a6a2 2022-01-23 op $0 = substr($0, 3);
30 2ad4a6a2 2022-01-23 op link = $1;
31 2ad4a6a2 2022-01-23 op $1 = "";
32 2ad4a6a2 2022-01-23 op output_link(link, $0);
33 2ad4a6a2 2022-01-23 op next;
34 2ad4a6a2 2022-01-23 op }
35 2ad4a6a2 2022-01-23 op
36 2ad4a6a2 2022-01-23 op !in_pre && /^```/ {
37 2ad4a6a2 2022-01-23 op in_pre = 1;
38 2ad4a6a2 2022-01-23 op if (in_list) {
39 2ad4a6a2 2022-01-23 op in_list = 0;
40 2ad4a6a2 2022-01-23 op print("</ul>");
41 2ad4a6a2 2022-01-23 op }
42 2ad4a6a2 2022-01-23 op print "<pre>";
43 2ad4a6a2 2022-01-23 op next
44 2ad4a6a2 2022-01-23 op }
45 2ad4a6a2 2022-01-23 op
46 2ad4a6a2 2022-01-23 op in_pre && /^```/ { in_pre = 0; print "</pre>"; next }
47 2ad4a6a2 2022-01-23 op !in_pre { output("<p>", $0, "</p>"); next }
48 2ad4a6a2 2022-01-23 op in_pre { print san($0); next }
49 2ad4a6a2 2022-01-23 op
50 2ad4a6a2 2022-01-23 op END {
51 2ad4a6a2 2022-01-23 op if (in_list)
52 2ad4a6a2 2022-01-23 op print "</ul>"
53 2ad4a6a2 2022-01-23 op if (in_pre)
54 2ad4a6a2 2022-01-23 op print "</pre>"
55 2ad4a6a2 2022-01-23 op }
56 2ad4a6a2 2022-01-23 op
57 2ad4a6a2 2022-01-23 op function trim(s) {
58 2ad4a6a2 2022-01-23 op sub("^[ \t]*", "", s);
59 2ad4a6a2 2022-01-23 op return s;
60 2ad4a6a2 2022-01-23 op }
61 2ad4a6a2 2022-01-23 op
62 2ad4a6a2 2022-01-23 op function san(s) {
63 2ad4a6a2 2022-01-23 op gsub("&", "\\&amp;", s)
64 2ad4a6a2 2022-01-23 op gsub("<", "\\&lt;", s)
65 2ad4a6a2 2022-01-23 op gsub(">", "\\&gt;", s)
66 2ad4a6a2 2022-01-23 op return s;
67 2ad4a6a2 2022-01-23 op }
68 2ad4a6a2 2022-01-23 op
69 2ad4a6a2 2022-01-23 op function output(ot, content, et) {
70 2ad4a6a2 2022-01-23 op content = trim(content);
71 2ad4a6a2 2022-01-23 op
72 2ad4a6a2 2022-01-23 op if (!in_list && ot == "<li>") {
73 2ad4a6a2 2022-01-23 op in_list = 1;
74 2ad4a6a2 2022-01-23 op print "<ul>";
75 2ad4a6a2 2022-01-23 op }
76 2ad4a6a2 2022-01-23 op
77 2ad4a6a2 2022-01-23 op if (in_list && ot != "<li>") {
78 2ad4a6a2 2022-01-23 op in_list = 0;
79 2ad4a6a2 2022-01-23 op print "</ul>";
80 2ad4a6a2 2022-01-23 op }
81 2ad4a6a2 2022-01-23 op
82 2ad4a6a2 2022-01-23 op if (ot == "<p>" && content == "")
83 2ad4a6a2 2022-01-23 op return;
84 2ad4a6a2 2022-01-23 op
85 2ad4a6a2 2022-01-23 op printf("%s%s%s\n", ot, san(content), et);
86 2ad4a6a2 2022-01-23 op }
87 2ad4a6a2 2022-01-23 op
88 2ad4a6a2 2022-01-23 op function output_link(link, content) {
89 2ad4a6a2 2022-01-23 op if (in_list) {
90 2ad4a6a2 2022-01-23 op in_list = 0;
91 2ad4a6a2 2022-01-23 op print "</ul>";
92 2ad4a6a2 2022-01-23 op }
93 2ad4a6a2 2022-01-23 op
94 2ad4a6a2 2022-01-23 op if (content == "")
95 2ad4a6a2 2022-01-23 op content = link;
96 2ad4a6a2 2022-01-23 op
97 2ad4a6a2 2022-01-23 op printf("<p><a href=\"%s\">%s</a></p>\n", link, trim(san(content)));
98 2ad4a6a2 2022-01-23 op }