You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
2.6 KiB
145 lines
2.6 KiB
#!/usr/bin/awk -f |
|
BEGIN { |
|
headed = 0 |
|
stack_pos = 0 |
|
tag("documentclass[a4paper]{article}") |
|
# tag("special{papersize=210mm,297mm}") |
|
tag("usepackage[margin=1in]{geometry}") |
|
tag("setlength{\\parskip}{\\baselineskip}%") |
|
tag("setlength{\\parindent}{0pt}%") |
|
tag("usepackage{listings}") |
|
tag("lstset{basicstyle=\\ttfamily\\footnotesize,breaklines=true}") |
|
tag("usepackage{hyperref}") |
|
tag("usepackage{graphicx}") |
|
tag("sloppy") |
|
tag("parindent0mm") |
|
} |
|
|
|
function tag(val) { |
|
printf("\\%s\n", val) |
|
} |
|
|
|
function push(what, arg) { |
|
stack[stack_pos++] = what; |
|
tag("begin{" what "}" arg) |
|
} |
|
|
|
function peek() { |
|
return stack[stack_pos-1] |
|
} |
|
|
|
function pop() { |
|
tag("end{" stack[--stack_pos] "}") |
|
} |
|
|
|
function inline(text) { |
|
gsub(/\\/, "\\textbackslash ", text) |
|
gsub(/\{/, "\\{", text) |
|
gsub(/\}/, "\\}", text) |
|
gsub(/~/, "\\textasciitilde ", text) |
|
gsub(/\$/, "\\$", text) |
|
gsub(/_/, "\\_", text) |
|
gsub(/#/, "\\#", text) |
|
gsub(/%/, "\\%", text) |
|
gsub(/&/, "\\&", text) |
|
gsub(/\^/, "\\textasciicircum ", text) |
|
gsub(/\.{3,}/, "\\ldots", text) |
|
text = gensub(/\*\*([^\*]*)\*\*/, "\\textbf{\\1}", "g", text) |
|
text = gensub(/\*([^\*]*)\*/, "\\emph{\\1}", "g", text) |
|
text = gensub(/`([^`]*)`/, "\\texttt{\\1}", "g", text) |
|
# links |
|
text = gensub(/\[(.*)\]\((.*)\)/, "\\href{\\2}{\\1}\\footnote{\\url{\\2}}", "g", text) |
|
return text |
|
} |
|
|
|
/^---$/ { |
|
parse_meta = !parse_meta |
|
next |
|
} |
|
|
|
{ |
|
if(parse_meta) { |
|
split($0, r, ": ") |
|
gsub(/(^"|"$)/, "", r[2]) |
|
meta[r[1]]=r[2] |
|
next |
|
} |
|
} |
|
|
|
/^# / { |
|
gsub(/^#* /, "", $0) |
|
if (!meta["title"]) meta["title"] = $0 |
|
next |
|
} |
|
|
|
{ |
|
if (!headed) { |
|
if (meta["title"]) tag("title{" meta["title"] "}") |
|
if (meta["author"]) tag("author{" meta["author"] "}") |
|
push("document") |
|
tag("maketitle") |
|
headed = 1 |
|
} |
|
} |
|
|
|
/^## / { |
|
gsub(/^#* /, "", $0) |
|
tag("section{" $0 "}") |
|
next |
|
} |
|
|
|
/^### / { |
|
gsub(/^#* /, "", $0) |
|
tag("subsection{" $0 "}") |
|
next |
|
} |
|
|
|
/^```$/ { |
|
if (peek() == "lstlisting") { |
|
pop() |
|
} else { |
|
push("lstlisting") |
|
} |
|
next |
|
} |
|
|
|
{ |
|
if (peek() == "lstlisting") { |
|
print($0) |
|
next |
|
} |
|
} |
|
|
|
/^$/ { |
|
while(peek() && peek() != "document") pop() |
|
} |
|
|
|
/^!\[.*\]\(.*\)$/ { |
|
txt = $0 |
|
filenam = $0 |
|
gsub(/(^!\[|\].*$)/, "", txt) |
|
gsub(/(^!.*\(|\)$)/, "", filenam) |
|
gsub(/\.(jpg|png|gif|jpeg)$/, "", filenam) |
|
push("figure", "[htp]") |
|
tag("includegraphics[width=\\textwidth]{" filenam "}") |
|
tag("caption{" inline(txt) "}") |
|
next |
|
} |
|
|
|
/^- / { |
|
gsub(/^- /, "", $0) |
|
if (peek() != "itemize") push("itemize") |
|
tag("item") |
|
print(inline($0)) |
|
next |
|
} |
|
|
|
{ |
|
print(inline($0)) |
|
} |
|
|
|
END { |
|
while (peek()) { |
|
pop() |
|
} |
|
}
|
|
|