home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / E / AMIE32AR.LHA / E_v3.2a / Src.lha / Src / Various / dokkenou / dokkenou.e < prev    next >
Encoding:
Text File  |  1992-09-02  |  4.7 KB  |  214 lines

  1. -> DokkeNou!
  2.  
  3. OPT OSVERSION=37, PREPROCESS
  4.  
  5. MODULE 'tools/file', 'tools/ctype'
  6.  
  7. DEF slist:PTR TO LONG,snum,scur=0,ofh=NIL,tabwidth=8,
  8.     detailstemp[1000]:STRING,style
  9.  
  10. PROC main() HANDLE
  11.   DEF m=NIL,l,args:PTR TO LONG,rdargs=NIL,texf[100]:STRING,x
  12.   args:=[0,0,0,0,0,0]
  13.   IF (rdargs:=ReadArgs('TEXT/A,TEXFILE,TABWIDTH/K/N,STYLE,A4/S,A4COL/S',args,NIL))=NIL THEN Raise("ARGS")
  14.   IF args[1]
  15.     texf:=args[1]
  16.   ELSE
  17.     IF (x:=InStr(args[0],'.'))<1 THEN x:=ALL
  18.     StrCopy(texf,args[0],x)
  19.     StrAdd(texf,'.tex')
  20.   ENDIF
  21.   IF args[2] THEN tabwidth:=Long(args[2])
  22.   style:=IF args[3] THEN args[3] ELSE ''
  23.   IF args[4] THEN style:='[a4din]'
  24.   IF args[5] THEN style:='[a4din,twocolumn]'
  25.   WriteF('DokkeNou! (c) 1994 Text2Tex conversion by Wouter\n' +
  26.          'converting "\s" to "\s"\n',args[0],texf)
  27.   m,l:=readfile(args[0])
  28.   snum:=countstrings(m,l)
  29.   slist:=stringsinfile(m,l,snum)
  30.   IF (ofh:=Open(texf,NEWFILE))=NIL THEN Raise("OPEN")
  31.   all()
  32. EXCEPT DO
  33.   IF rdargs THEN FreeArgs(rdargs)
  34.   IF m THEN freefile(m)
  35.   IF ofh THEN Close(ofh)
  36.   SELECT exception
  37.     CASE "ARGS"; WriteF('Bad Args!\n')
  38.     CASE "EOF";  WriteF('Done.\n')
  39.     DEFAULT;     WriteF('exception: "\s" (\h), info: "\s"\n',
  40.                  [exception,0],exception,IF exceptioninfo THEN exceptioninfo ELSE '')
  41.   ENDSELECT
  42. ENDPROC
  43.  
  44. PROC next(n) IS IF scur+n<snum THEN slist[scur+n] ELSE ''
  45. PROC getnext() IS scur++ BUT IF scur<snum THEN slist[scur] ELSE Raise("EOF")
  46.  
  47. #define GETCUR slist[scur]
  48. #define SKIP scur++
  49. #define BACK scur--
  50.  
  51. PROC put(s) IS Fputs(ofh,s)
  52. PROC putln(s) IS Fputs(ofh,s) BUT FputC(ofh,"\n")
  53.  
  54. PROC iswhite(c) IS (c=" ") OR (c="\t")
  55. PROC isnotwhite(c) IS (c<>" ") AND (c<>"\t")
  56.  
  57. PROC spaces(s)
  58.   DEF n=0
  59.   LOOP
  60.     IF s[]=" "
  61.       n++
  62.     ELSEIF s[]="\t"
  63.       n:=n+tabwidth
  64.     ELSE
  65.       RETURN n,s
  66.     ENDIF
  67.     s++
  68.   ENDLOOP
  69. ENDPROC
  70.  
  71. PROC all() HANDLE
  72.   DEF str[3]:ARRAY OF LONG,a=0,s,d
  73.   REPEAT
  74.     s:=GETCUR
  75.     d,s:=spaces(s)
  76.     IF s[] THEN str[a++]:=s
  77.     getnext()
  78.   UNTIL a=3
  79.   put('% generated by DokkeNou! (tm) text2tex formatting utility (c) Wouter 1994\n\n')
  80.   put('\\documentstyle')
  81.   put(style)
  82.   put('{article}\n')
  83.   put('\\title{')
  84.   put(str[0])
  85.   put('}\n\\author{')
  86.   put(str[1])
  87.   put('}\n\\date{')
  88.   put(str[2])
  89.   put('}\n')
  90.   put('\\begin{document}\\maketitle\n')
  91.   process()
  92. EXCEPT DO
  93.   putln('\\end{document}')
  94.   ReThrow()
  95. ENDPROC
  96.  
  97. PROC process(indent=0)
  98.   DEF s,sn,sp,spn,numblank=0
  99.   s:=GETCUR
  100.   LOOP
  101.     s[-1]:=" "
  102.     IF s[]
  103.       IF numblank>1 THEN putln('\\vskip .0cm\\noindent ')
  104.       numblank:=0
  105.     ELSE
  106.       numblank++
  107.     ENDIF
  108.     sp,s:=spaces(s)
  109.     IF sp<indent THEN RETURN
  110.     spn,sn:=spaces(next(1))
  111.     IF StrCmp(sn,'====',STRLEN)
  112.       put('\\section{'); put(details(s)); put('}\n')
  113.       SKIP
  114.     ELSEIF StrCmp(sn,'----',STRLEN)
  115.       put('\\subsection{'); put(details(s)); put('}\n')
  116.       SKIP
  117.     ELSEIF StrCmp(sn,'****',STRLEN)
  118.       put('\\subsubsection{'); put(details(s)); put('}\n')
  119.       SKIP
  120.     ELSEIF (s[]=">") AND iswhite(s[1])
  121.       verbatim(s)
  122.     ELSEIF ((s[]="*") OR (s[]="-")) AND iswhite(s[1])
  123.       itemize(s,s[],sp)
  124.     ELSE
  125.       putln(details(s))
  126.     ENDIF
  127.     s:=getnext()
  128.   ENDLOOP
  129. ENDPROC
  130.  
  131. PROC itemize(s,ic,ind) HANDLE
  132.   DEF d
  133.   put('\\begin{itemize}\n')
  134.   REPEAT
  135.     put('\\item ')
  136.     putln(details(s+2))
  137.     SKIP
  138.     process(ind+2)
  139.     d,s:=spaces(GETCUR)
  140.   UNTIL (s[]<>ic) OR isnotwhite(s[1])
  141.   BACK
  142. EXCEPT DO
  143.   put('\\end{itemize}\n')
  144.   ReThrow()
  145. ENDPROC
  146.  
  147. PROC verbatim(s) HANDLE
  148.   DEF d
  149.   put('\\begin{verbatim}\n')
  150.   REPEAT
  151.     putln(s+1)
  152.     d,s:=spaces(getnext())
  153.   UNTIL (s[]<>">") OR isnotwhite(s[1])
  154.   BACK
  155. EXCEPT DO
  156.   put('\\end{verbatim}\n')
  157.   ReThrow()
  158. ENDPROC
  159.  
  160. PROC details(s)
  161.   DEF r
  162.   IF StrLen(s)>500 THEN RETURN 'TOO LONG'
  163.   r:=detailstemp
  164.   s,r:=dodet(s,r,0)
  165.   r[]:=0
  166. ENDPROC detailstemp
  167.  
  168. PROC dorange(s,r,end,text,c)
  169.   IF iswhite(s[-2])
  170.     AstrCopy(r,text)
  171.     r:=r+StrLen(text)
  172.     s,r:=dodet(s,r,end)
  173.     r[]++:="}"
  174.   ELSE
  175.     r[]++:=c
  176.   ENDIF
  177. ENDPROC s,r
  178.  
  179. PROC dodet(s,r,stop)
  180.   DEF c
  181.   WHILE c:=s[]++
  182.     IF c=stop THEN RETURN s,r
  183.     SELECT 128 OF c
  184.       CASE "#","$","%","&","~","^","\\","{","}"     ->,"|",">","<"
  185.         r[]++:="\\"
  186.         r[]++:=c
  187.       CASE "["
  188.         s,r:=dorange(s,r,"]",'\\footnote{',c)        -> footnotes
  189.       CASE "_"
  190.         IF isgraph(s[])
  191.           s,r:=dorange(s,r,"_",'{\\em ',c)        -> emphasized
  192.         ELSE
  193.           r[]++:="\\"
  194.           r[]++:=c
  195.         ENDIF
  196.       CASE "*"
  197.         s,r:=dorange(s,r,"*",'{\\bf ',c)        -> bold
  198.       CASE "`"
  199.         IF iswhite(s[-2])                -> inline verbatim
  200.           AstrCopy(r,'\\verb|')
  201.           r:=r+STRLEN
  202.           WHILE ((c:=s[]++)<>"'") AND (c<>0) DO r[]++:=c
  203.           IF c=0 THEN s--
  204.           r[]++:="|"
  205.         ELSE
  206.           r[]++:=c
  207.         ENDIF
  208.       DEFAULT                        -> normal chars
  209.         r[]++:=c
  210.     ENDSELECT
  211.   ENDWHILE
  212.   s--
  213. ENDPROC s,r
  214.