grapho/md2tex

150 lines
2.7 KiB
Awk
Executable File

#!/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("usepackage[utf8]{inputenc}")
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
}
}
/^##* / {
d=length($1)
t="section"
for (i=3; i<=d; i++) t="sub"t
gsub(/^#* /, "", $0)
tag(t"{" inline($0) "}")
next
}
/^### / {
gsub(/^#* /, "", $0)
tag("subsection{" inline($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()
}
}