#!/bin/awk -f
#
# t2h: a text processor for making HTML documents
# coded by Kenar (Kenji Arisawa)
# E-mail: arisawa@aichi-u.ac.jp
#
# MEMO
# hr > head> p, image, pre > quote > list , table
# Ta:
# parent:
# child: None
# UL:, OL:. DL: # list
# parent:
# child: None
# N:
# parent
# child: list
function trim(s,n){# local n
sub("^[ \t]*","",s)
sub("[ \t]*$","",s)
return s}
function gsub0(u,t,s,n,m,v,k){ # u is a simple pattern
j=length(u)
v=""
m=1
k=0
while(n=index(substr(s,m),u)){ # assign =
v = v substr(s,m,n-1) t
m += n+j-1
k++
}
return v substr(s,m)}
function getv(v){return substr(v,match(v,":[ ]*")+RLENGTH)}
function conv(v,u,n,ok,s){
for(u in tar)
v=gsub0(u,tar[u],v)
n=match(v,uri)
ok=0
if(n==1) ok=1
else if(n>1){
t=substr(v,n-1,1)
# if(index("\"=",t)==0) ok=1
if(index(" \t",t)) ok=1
}
if(ok){
s=substr(v,RSTART,RLENGTH)
s=sprintf("%s",s,s)
sub(uri, s, v)
}
return v}
function text2html(v){
gsub("&","\\&",v); gsub("<","\\<",v); gsub(">","\\>",v); return v}
function print_header(t){
print ""
print "
![]() | "
print " Powered by Pegasus | "
print "
" # bq=0; li=0; ai=0; ap=0; ta=0; FS=FS0 li=0; ai=0; ap=0; ta=0; FS=FS0 } BEGIN{ raw=0 comment=0 head="" FS0=FS uri="[a-zA-Z]+://[^ \t\"\(\)]+" ptag=0 } comment { if($0==comment) comment=0 next} raw { if($0==raw) raw=0 else print $0 next} code { if($0==code){ code=0 print "" } else print text2html($0) next} bq { if($0==bq){ bq=0 print "" next} } /^#!\//{print $0; next} /^D:/{v=getv($0); split(v,a,"[ \t]"); tar[a[1]] = a[2]; next} /^#:/{next} /^##:/{comment=getv($0);next} /^T:/{print_header(getv($0)); next} /^\t/{ if(pre) printf "\n%s",text2html($0); else {printf "
%s",text2html($0); pre=1}
next}
#!pre && /^\t/{printf "%s",text2html($0); pre=1;next}
#pre && /^\t/ {printf "\n%s",text2html($0); next}
pre && /^.*/ {printf "
\n"; pre=0}
/^H:/{
t=getv($0)
head = head t "\n"
next}
/^H.:/{
n=substr($0,2,1); t=conv(getv($0))
if(!title) print_header(t)
clean()
if(n==1) printf "%s \n",n,t,n
else print "" t " "
ptag=1
next}
/^R:/{
clean()
print "
"
next}
/^I:/{
v=getv($0); n=split(v,a,"[ \t]");
if(n == 1)
printf ("
\n",a[1],a[1])
else if(n==2 && match(v,"[0-9]+"))
printf ("
\n",a[1],a[1],a[2],a[2])
else if(n==2 && match(v,"[0-9]+")==0)
printf ("
\n",a[1],a[2])
else
printf ("
\n",a[1],a[3],a[2],a[2])
next}
/^C:/{print "" conv(getv($0)) "
"; next}
/^N:/{
clean()
s=getv($0)
print "",conv(s),"
"
next}
/^[DOU]L:/{
if(li) print "" li ">"
# if(bq) print " "
}
/^OL:/{
print ""
li="ol"
next;}
/^UL:/{
print ""
li="ul"
next;}
/^DL:/{
print ""
li="dl"
next;}
/^A:/{
v=getv($0); n=split(v,a,"[ \t]");
if(n){
n=match(v,"[ \t]*[^ \t]+[ \t]+")
printf("%s
\n", a[1], substr(v,1+RLENGTH))
}
next}
/^AI:/{
ai=1
next}
/^AI\+:/{
ap=1
next}
li=="dl" && /^-[ \t]/{
if(ai)
print "
- " conv(substr($0,length($2)+4)) ""
else if(ap)
print "
- " $2 " " conv(substr($0,length($2)+4))
else
printf "
- %s\n
- \n", conv(substr($0,3))
next}
!li && /^-[ \t]/{
print "
"
li="ul"}
li && /^-$/{
clean()
next}
li && /^-[ \t]/{
if(ai)
print "- " conv(substr($0,length($2)+4)) "
"
else if(ap)
print " - " $2 " " conv(substr($0,length($2)+4)) "
"
else
print " - " conv(substr($0,3)) "
"
next}
li && (/.+/){
print conv($0) "
"
next}
/^!:/{raw=getv($0);next}
/^P:/{ code=getv($0)
if(length(code)==0) code="\n"
print ""
next}
/^Ta:/{
# format of Ta tag
# Ta: [del] attr
# where del is delimiter of single character
# and attr is HTML attribute
v=getv($0); n=split(v,a,"[ \t]");
f="border=2 cellspacing=0 cellpadding=5 align=\"center\""
if(n){
if(length(a[1])==1){
FS=a[1]
g=substr(v,index(v,FS)+1)
n=match(g, "[ \t]+[^ \t]")
if(n) f=substr(g,n)
}
else f=v
}
printf("\n", f)
ta=1
next}
ta && /^Cap:/{
print "" getv($0) " "
next}
ta && NF{
if(ta==1) print ""
print ""
if(ta==1){
# format of table header:
# header:< # left align
# header:> # right align
# header: # center align
# header # center align
# trim them first
for(n=1; n<=NF; n++){
$n=trim($n)
}
for(n=1; n<=NF; n++0){
align[n]="center"
w[n]=0
# k=match($n, ":[^:]*$")
# above code should work but
# Plan9 match is weird, so I use index
k=index($n,":")
if(k){
s=substr($n,k+1)
t=substr(s,1,1)
i=0
if(t=="<" && ++i) align[n]="left"
else if(t==">" && ++i) align[n]="right"
else if(t=="-" && ++i) align[n]=0
s=substr(s,i+1)
if(match(s,"[0-9]+")) w[n]=s
else if(s != "") k=length($n)+1
d[n]=substr($n,1,k-1)
}
else d[n]=$n
}
k=0
for(n=1; n<=NF; n++)
if(align[n] && d[n] != "") k++
if(k)
for(n=1; n<=NF; n++)
if(align[n]) printf("%s \n",w[n],d[n])
NF0=NF
}
else{
if(align[1]) printf("%s \n",align[1],w[1],conv($1))
for(n=2; n<=NF0; n++0)
if(align[n]) printf("%s \n",align[n], w[n],conv($n))
}
print " "
ta++
next}
/^.+/{
print "" conv($0) "
"
next}
/^$/{
clean()
# print ""
next}
END{
clean()
if(pre) print ""
print ""}