summaryrefslogtreecommitdiff
path: root/support/l2a/l2a.l
diff options
context:
space:
mode:
Diffstat (limited to 'support/l2a/l2a.l')
-rw-r--r--support/l2a/l2a.l385
1 files changed, 385 insertions, 0 deletions
diff --git a/support/l2a/l2a.l b/support/l2a/l2a.l
new file mode 100644
index 0000000000..0e6b127191
--- /dev/null
+++ b/support/l2a/l2a.l
@@ -0,0 +1,385 @@
+ /* l2a.l -*- C -*-
+ +-----------------------------------------------------------------------------
+ | Abstract:
+ | Lex filter to detexify texts (handles really LaTeX, and a bit of TeX).
+ |
+ | Authorship:
+ | Copyright (c) 1988, 1990 Gisle Hannemyr.
+ |
+ | Permission is granted to hack, make and distribute copies of this program
+ | as long as this notice and the copyright notices are not removed.
+ | If you intend to distribute changed versions of this program, please make
+ | an entry in the "history" log (below) and mark the hacked lines with your
+ | initials. I maintain the program, and shall appreiciate copies of bug
+ | fixes and new versions.
+ | Flames, bug reports, comments and improvements to:
+ | snail: Gisle Hannemyr, Brageveien 3A, 0452 Oslo, Norway
+ | EAN: C=no;PRMD=uninett;O=nr;S=Hannemyr;G=Gisle (X.400 SA format)
+ | gisle.hannemyr@nr.no (RFC-822 format)
+ | Inet: gisle@ifi.uio.no
+ | UUCP: ...!mcsun!ifi!gisle
+ |
+ | History:
+ | 1.0 8 oct 90 [gh] Version 1 posted on comp.sources.misc.
+ | 0.0 27 dec 88 [gh] Started it.
+ |
+ | Bugs:
+ | * Works for my style of Latex, but will proably barf on other peoples
+ | files.
+ | * I can't see how \kill can be handled by lex only.
+ | * \cite is hacked. Should be fixed.
+ |
+ | Environment:
+ | None.
+ |
+ | Diagnostics:
+ | Prints plain error messages. Does not return error codes.
+ +---------------------------------------------------------------------------*/
+
+
+%{
+
+ /*---( start of user written lex prologue )---------------------------------*/
+
+
+#include <stdio.h>
+#include <string.h>
+
+#define VERSION "1.0"
+#define MAXEROR 100
+#define ENGLISH 0
+#define NORWEGIAN 1
+
+ void parseerror();
+ void bibhead();
+ void ptabular();
+ void pfigure();
+ void pcaption();
+ void phorline();
+ void pappendix();
+ void verbatim();
+ void pfotnote();
+ void footnote();
+
+
+ /*---( globals )------------------------------------------------------------*/
+
+char About[] = "\
+L2A is a filter to remove markup commands from LaTeX manuscripts.\n\n\
+Flames, bug reports, comments and improvements to:\n\
+ snail: Gisle Hannemyr, Brageveien 3A, 0452 Oslo, Norway\n\
+ EAN: C=no;PRMD=uninett;O=nr;S=Hannemyr;G=Gisle (X.400 SA format)\n\
+ gisle.hannemyr@nr.no (RFC-822 format)\n\
+ Inet: gisle@ifi.uio.no\n\
+ UUCP: ...!mcsun!ifi!gisle\n";
+
+char Usage[] = " Usage: l2a (options)\n\
+ Valid options:\n\
+\t-a -- about l2a\n\
+\t-h -- print this\n\
+\t-n -- norwegian text\n";
+
+int LineNo; /* Line number for debugging */
+int Enumber; /* Number for enumerate */
+int Fnumber = 0; /* Number for footnotes/endnotes */
+FILE *BFile; /* Bibliography file. */
+FILE *FNote; /* Temp. file for footnotes. */
+int Language = ENGLISH; /* language for inserted text */
+
+ /*---( end of user written lex prologue )-----------------------------------*/
+
+%}
+
+%START EN FN IT QU MM
+%n 1000
+%p 6000
+%a 4000
+%e 2000
+
+sp [ \t\n]*
+an [0-9a-zA-Z]+
+
+%%
+
+^"\\begin{thebibliography".* { bibhead(); }
+^"\\end{thebibliography}" { ; }
+^"\\bibitem["{an}"]{"{an}"}" { fputs(yytext,stderr); }
+"\\cite{"[^{\n]*"}" { yytext[0] = '('; yytext[strlen(yytext)] = ')'; printf("@CITE%s@ ",yytext); }
+"\\ref{"[^{\n]*"}" { yytext[0] = '('; yytext[strlen(yytext)] = ')'; printf("@REF%s@ ", yytext); }
+^"\\begin{enumerate}" { BEGIN EN; Enumber = 0; }
+^"\\end{enumerate}" { BEGIN 0; }
+^"\\begin{itemize}" { BEGIN IT; }
+^"\\end{itemize}" { BEGIN 0; }
+^"\\begin{quote}" { BEGIN QU; }
+^"\\end{quote}" { BEGIN 0; }
+^"\\begin{quotation}" { BEGIN QU; }
+^"\\end{quotation}" { BEGIN 0; }
+<IT>"\\item" { putchar('*'); }
+<EN>"\\item" { Enumber++; printf("%d)",Enumber); }
+"\\item" { putchar('+'); }
+<QU>\n { ECHO; LineNo++; fputs(" ",stdout); }
+<FN>. { footnote(); BEGIN 0; }
+"$" { BEGIN MM; }
+<MM>"$" { BEGIN 0; }
+<MM>"\\langle" { putchar('<'); }
+<MM>"\\rangle" { putchar('>'); }
+<MM>"\\backslash" { putchar('\\'); }
+^"\\begin{tabular".* { ptabular(); }
+^"\\end{tabular}" { phorline(); }
+^"\\begin{figure".* { pfigure(); }
+^"\\end{figure}" { phorline(); }
+^"\\caption{" { pcaption(); }
+"\\footnote" { Fnumber++; printf("<%d>",Fnumber); BEGIN FN; }
+"\\appendix" { pappendix(); }
+"\\verb" { verbatim(); }
+"\\'{e}"{sp} { putchar('e'); }
+\\ae{sp} { putchar('{'); }
+\\o{sp} { putchar('|'); }
+\\aa{sp} { putchar('}'); }
+\\AE{sp} { putchar('['); }
+\\O{sp} { putchar('\\'); }
+\\AA{sp} { putchar(']'); }
+"&" { putchar('\t'); }
+"\\>" { putchar('\t'); }
+"~" { putchar(' '); }
+"\\ " { putchar(' '); }
+"\\$" { putchar('$'); }
+"\\&" { putchar('&'); }
+"\\%" { putchar('%'); }
+"\\#" { putchar('#'); }
+"\\_" { putchar('_'); }
+"\\{" { putchar('{'); }
+"\\}" { putchar('{'); }
+"\\\\"{sp} { putchar('\n'); }
+^"\\vspace".* { putchar('\n'); }
+^"\\title" { putchar('\n'); }
+^"\\author" { putchar('\n'); }
+^"\\date".* { putchar('\n'); }
+^"\\maketitle" { putchar('\n'); }
+^"\\part" { putchar('\n'); }
+^"\\chapter" { putchar('\n'); }
+^"\\section" {;}
+^"\\subsection" {;}
+^"\\subsubsection" {;}
+^"\\paragraph" {;}
+^"\\subparagraph" {;}
+^"\\input lcustom" {;}
+^"\\documentstyle".* {;}
+^"\\pagenumbering".* {;}
+^"\\setcounter".* {;}
+^"\\newcommand".* {;}
+^"\\setlength".* {;}
+^"\\hyphenation".* {;}
+^"\\label".* {;}
+^"\\draftfalse" {;}
+^"\\begin{document}" {;}
+^"\\end{document}" {;}
+^"\\begin{sloppypar}" {;}
+^"\\end{sloppypar}" {;}
+^"\\begin{tabbing}" {;}
+^"\\end{tabbing}" {;}
+"\\TeX" { fputs("TeX", stdout); }
+"\\LaTeX" { fputs("LaTeX", stdout); }
+"\\LtoA" { fputs("L2A", stdout); }
+"\\ldots" { fputs("...", stdout); }
+"\\tiny" {;}
+"\\scriptsize" {;}
+"\\footnotesize" {;}
+"\\small" {;}
+"\\normalsize" {;}
+"\\large" {;}
+"\\Large" {;}
+"\\LARGE" {;}
+"\\huge" {;}
+"\\Huge" {;}
+"\\rm"{sp} {;}
+"\\em"{sp} {;}
+"\\bf"{sp} {;}
+"\\it"{sp} {;}
+"\\sl"{sp} {;}
+"\\sf"{sp} {;}
+"\\sc"{sp} {;}
+"\\tt"{sp} {;}
+"{" {;}
+"}" {;}
+"%".* {;}
+"\\-" {;}
+\n { ECHO; LineNo++; }
+. { ECHO; }
+"\\"[@A-Za-z]+ { parseerror(12,yytext); yytext[0] = '('; printf("@%s)@ ",yytext); }
+
+%%
+
+ /*---( routines )-----------------------------------------------------------*/
+
+ void parseerror(type,ss)
+ int type;
+ char *ss;
+ {
+ static errcnt = 0;
+
+ fprintf(stderr,"l2a: Error %d -- ",type);
+ switch (type) {
+ case 1: fputs("Instruction not recognized",stderr); break;
+ case 2: fputs("Wrong number of parameters",stderr); break;
+ case 3: fputs("Bad parameter received",stderr); break;
+ case 5: fputs("Unknown character set",stderr); break;
+ case 6: fputs("Position overflow",stderr); break;
+ case 10: fputs("Bogus output request",stderr); break;
+ case 11: fputs("Unimplemented command",stderr); break; /* No function */
+ case 12: fputs("Unrecognized markup command",stderr); break; /* No grammar */
+ case 13: fputs("Unhandled command",stderr); break; /* No semantic */
+ default: fputs("Unknown error (internal)",stderr); break;
+ } /* switch */
+ fprintf(stderr,"\n @ line %3d: \"%s\"\n",LineNo,ss);
+ errcnt++;
+ if (errcnt > MAXEROR) {
+ fputs(" Too many errors -- aborting\n",stderr);
+ exit(-1);
+ }
+ } /* parseerror */
+
+
+ void bibhead()
+ {
+ switch (Language) {
+ case ENGLISH: puts("\nReferences:"); break;
+ case NORWEGIAN: puts("\nLitteratur:"); break;
+ } /* switch */
+ } /* bibhead */
+
+
+ void ptabular()
+ {
+ switch (Language) {
+ case ENGLISH: puts("\t<<=============== NB! Typeset as table. NB! ================>>"); break;
+ case NORWEGIAN: puts("\t<<============== NB! Settes som tabell. NB! ================>>"); break;
+ } /* switch */
+ }
+
+
+ void pfigure()
+ {
+ switch (Language) {
+ case ENGLISH: puts("\t<<=========== NB! Please insert figure here. NB! ===========>>"); break;
+ case NORWEGIAN: puts("\t<<=========== NB! Figur skal settes inn her. NB! ===========>>"); break;
+ } /* switch */
+
+ }
+
+
+ void pcaption()
+ {
+ switch (Language) {
+ case ENGLISH: puts("\t --------------- Caption for figure or table: -------------"); break;
+ case NORWEGIAN: puts("\t --------------- Undertekst for bilde/tabell: -------------"); break;
+ } /* switch */
+ }
+
+
+ void phorline()
+ {
+ puts("<<==========================================================>>");
+ }
+
+
+ void pappendix()
+ {
+ switch (Language) {
+ case ENGLISH: puts("\n\nAPPENDIX\n========\n"); break;
+ case NORWEGIAN: puts("\n\nAPPENDIX\n========\n"); break;
+ } /* switch */
+ }
+
+ void verbatim()
+ {
+ int cc, ts;
+
+ ts = input();
+ for (;;) {
+ cc = input();
+ if (cc == ts) break;
+ putchar(cc);
+ } /* forever */
+ } /* verbatim */
+
+
+ void pfotnote()
+ {
+ switch (Language) {
+ case ENGLISH: puts("\n\nENDNOTES\n========\n"); break;
+ case NORWEGIAN: puts("\n\nNOTER\n=====\n"); break;
+ } /* switch */
+ }
+
+
+ void footnote()
+ {
+ int cc, be = 1;
+
+ fprintf(FNote,"<%d>: ", Fnumber);
+ while (be) {
+ cc = input();
+ if (cc == '{') be++;
+ else if (cc == '}') be--;
+ else putc(cc,FNote);
+ }
+ putc('\n',FNote);
+ putc('\n',FNote);
+ } /* footnote */
+
+
+ void bibitem()
+ {
+ int cc, be = 1;
+
+ fprintf(FNote,"<%d>: ", Fnumber);
+ while (be) {
+ cc = input();
+ if (cc == '{') be++;
+ else if (cc == '}') be--;
+ else putc(cc,FNote);
+ }
+ putc('\n',FNote);
+ putc('\n',FNote);
+ } /* footnote */
+
+ /*---( main )---------------------------------------------------------------*/
+
+ main (argc, argv)
+ int argc;
+ char **argv;
+ {
+
+ fprintf(stderr,"l2a, version %s -- Copyright (c) 1988, 1990 Gisle Hannemyr\n\n",VERSION);
+
+ argc--; argv++; /* skip program name */
+ while (argc && (**argv == '-')) {
+ (*argv)++; /* skip initial '-' */
+ switch (**argv) {
+ case 'a': fputs(About,stderr); exit(1);
+ case 'n': Language = NORWEGIAN; break;
+ default : fputs(Usage,stderr); exit(1);
+ } /* switch */
+ argc--; argv++;
+ } /* while options */
+ if (argc) { fputs(Usage,stderr); exit(1); }
+
+ BEGIN 0;
+ LineNo = 0;
+ FNote = fopen("FN.TMP","w");
+ /* BFile = fopen("references.tex","r"); */
+ yylex();
+
+ fclose(FNote);
+ if (Fnumber) {
+ char buff[80];
+ FNote = fopen("FN.TMP","r");
+ pfotnote();
+ while (fgets(buff,80,FNote)) fputs(buff,stdout);
+ } /* if */
+ unlink("FN.TMP");
+ puts("..EOF");
+ } /* main */
+
+ /*---( EOF lex input file )-------------------------------------------------*/