#!/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 "" print "" t "" if(head != "") printf("%s",head) print "" print ""; ### ---- change as you like ---- ### print "" print "" print "" print "" print "" print "
\"address\"\"Logo\"Powered by Pegasus
" ### ---- end of change ------ ### title=1 } function clean(n){# local n # clean stops: list, table n=0 if(li && ++n) print "" # if(bq && ++n) print "" if(ta && ++n) print "" # if(ptag) print "

" # if(n) print "" # else 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 ("
\"%s\"
\n",a[1],a[1]) else if(n==2 && match(v,"[0-9]+")) printf ("
\"%s\"
\n",a[1],a[1],a[2],a[2]) else if(n==2 && match(v,"[0-9]+")==0) printf ("
\"%s\"
\n",a[1],a[2]) else printf ("
\"%s\"
\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 "" # 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 ""
        	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("\n",w[n],d[n])
        		NF0=NF
        	}
        	else{
        		if(align[1]) printf("\n",align[1],w[1],conv($1))
        		for(n=2; n<=NF0; n++0)
        			if(align[n]) printf("\n",align[n], w[n],conv($n))
        	}
        	print ""
        	ta++
        	next}
        /^.+/{
        	print "

        " conv($0) "

        " next} /^$/{ clean() # print "

        " next} END{ clean() if(pre) print "" print ""}

        " getv($0) "
        %s%s%s