10000 REM ======================================= 10001 REM Quasi-textile processor 10002 REM 10003 REM INPUT - TFILE$ Textile file to read 10004 REM HFILE$ HTML file to write 10005 REM ======================================= 10010 DIM STK$(20) 10020 STKPOS = 0:CLEARALL = 0:POPSTOP = 0 10030 OPEN TFILE$ FOR INPUT AS #1 10040 OPEN HFILE$ FOR OUTPUT AS #2 10050 WHILE(NOT EOF(1)) 10060 LINE INPUT#1, LTXT$ 10065 PRDTXT$ = "" 10069 REM Pop if a blank line 10070 IF LEN(LTXT$) <= 0 THEN CLEARALL=1:GOSUB 11000:GOTO 10830 10079 REM Look for h1., p., bq., etc. 10080 PRDLOC = INSTR(LTXT$,".") 10083 IF PRDLOC > 1 THEN PRDTXT$ = MID$(LTXT$,1,PRDLOC-1) ELSE GOTO 10099 10085 IF PRDLOC > 3 THEN PRDLOC = -1:PRDTXT$ = "":GOTO 10099 10090 IF PRDTXT$ = "bq" OR PRDTXT$ = "p" OR MID$(PRDTXT$,1,1) = "h" THEN GOTO 10500 10099 REM Look for lists 10100 IF MID$(LTXT$,1,1) <> "*" THEN GOTO 10130 ELSE ISTAR=1:LSTTYPE$="u" 10110 WHILE(MID$(LTXT$,ISTAR+1,1) = "*"):ISTAR=ISTAR+1:WEND 10120 IF MID$(LTXT$,ISTAR+1,1) = " " THEN PRDLOC=ISTAR+1:PRDTXT$="*"+RIGHT$(STR$(ISTAR), LEN(STR$(ISTAR))-1):GOTO 10400 10129 REM Look for numbered lists 10130 IF MID$(LTXT$,1,1) <> "#" THEN GOTO 10160 ELSE ISTAR=1:LSTTYPE$="o" 10140 WHILE(MID$(LTXT$,ISTAR+1,1) = "#"):ISTAR=ISTAR+1:WEND 10150 IF MID$(LTXT$,ISTAR+1,1) = " " THEN PRDLOC=ISTAR+1:PRDTXT$="#"+RIGHT$(STR$(ISTAR), LEN(STR$(ISTAR))-1):GOTO 10400 10160 REM More tests could be here... 10170 GOTO 10600 10400 REM Process a list item 10409 REM First, check if the list is initialized 10410 GOSUB 11500 10500 REM Process the operator - dot operator - pop the whole stack! 10510 CLEARALL = 1:GOSUB 11000 10520 LTXT$ = RIGHT$(LTXT$, LEN(LTXT$) - PRDLOC) 10530 PUSHTXT$ = "##."+PRDTXT$ 10540 GOSUB 11300 10550 POPSTOP = 0 10600 REM Process the text itself 10610 LI = 1:LSTART = 1:LASTC$ = " " 10620 WHILE(LI <= LEN(LTXT$)) 10630 LC$ = MID$(LTXT$, LI, 1) 10640 IF LC$="_" OR LC$="*" OR LC$=CHR$(34) OR LC$="^" OR LC$="~" OR LC$="@" OR LC$="!" THEN GOTO 10650 ELSE GOTO 10800 10650 LCOPT$ = "##c"+LC$ 10660 GOSUB 11200 10664 REM If we're in a link, suppress any character processing 10665 IF LCOPT$ <> LASTOP$ AND LASTOP$ = "##c!" THEN GOTO 10800 10667 REM Links must have a space preceding the ! 10668 IF LC$ = "!" AND LASTC$ <> " " THEN GOTO 10800 10670 PUSHTXT$ = MID$(LTXT$, LSTART, LI-LSTART):GOSUB 11300 10680 LSTART=LI+1 10690 IF LCOPT$ = LASTOP$ AND (LCOPT$ = "##c"+CHR$(34) OR LCOPT$="##c!") AND MID$(LTXT$, LI+1, 1) = ":" THEN GOSUB 11400 ELSE LINK$ = "" 10700 IF LCOPT$ = LASTOP$ THEN CLEARALL=0:GOSUB 11000 ELSE PUSHTXT$ = LCOPT$:GOSUB 11300 10800 LI = LI + 1 10805 LASTC$ = LC$ 10810 WEND 10820 IF LSTART < LEN(LTXT$) THEN PUSHTXT$=MID$(LTXT$, LSTART):GOSUB 11300 10830 WEND 10840 IF STKPOS > 0 THEN CLEARALL=1:GOSUB 11000 10850 CLOSE#1 10860 CLOSE#2 10870 ERASE STK$ 10880 RETURN 11000 REM Stack pop operations sub 11001 REM If CLEARALL is 1, pop everything, otherwise, pop once 11008 IF STKPOS = POPSTOP THEN RETURN 11010 GOSUB 11200 11019 REM HTML building... 11020 IF LEN(LASTOP$) = 0 AND STKPOS > 0 THEN LASTOP$ = "##.p" 11029 REM Inline update 11030 IF MID$(LASTOP$, 1, 3) = "##c" THEN GOSUB 12000:GOTO 11050 11040 IF MID$(LASTOP$, 1, 3) = "##." THEN GOSUB 12500 11050 IF CLEARALL = 1 AND STKPOS > POPSTOP THEN GOTO 11010 11060 RETURN 11200 REM Last stack operator - search for the last stack op 11201 REM Returned as LASTOP$ 11210 IF STKPOS = 0 THEN LASTOP$ = "":RETURN 11210 FOR LASTI = STKPOS TO 1 STEP -1 11220 IF LEN(STK$(LASTI)) > 3 AND MID$(STK$(LASTI),1,2) = "##" THEN LASTOP$ = STK$(LASTI):RETURN 11230 NEXT LASTI 11240 LASTOP$ = "" 11250 RETURN 11300 REM Push to the stack 11301 REM PUSHTXT$ contains the item 11310 IF LASTOP$ 11310 STKPOS = STKPOS+1 11320 STK$(STKPOS) = PUSHTXT$ 11330 RETURN 11400 REM Link handling 11401 REM Assumes line is in LTXT$, LI is the latest search index 11402 REM and the link is returned in LINK$ 11410 ISPC = LI+2 11420 WHILE(MID$(LTXT$,ISPC,1) <> " " AND ISPC < LEN(LTXT$)) 11430 ISPC = ISPC + 1 11440 WEND 11450 LINK$ = MID$(LTXT$, LI+2, ISPC - (LI+2)) 11460 LI = ISPC:LSTART = LI 11470 RETURN 11500 REM List handling 11510 STKSRCH$ = "##."+LSTTYPE$+RIGHT$(STR$(ISTAR), LEN(STR$(ISTAR))-1) 11520 BACKSTK = STKPOS 11530 WHILE(BACKSTK > 0 AND STK$(BACKSTK) <> STKSRCH$):BACKSTK=BACKSTK-1:WEND 11540 IF BACKSTK > 0 THEN POPSTOP = BACKSTK:CLEARALL = 1:GOSUB 11000:GOTO 11580 11549 REM Clear the stack first - new list! 11550 GOSUB 11600:CLEARALL = 1:GOSUB 11000 11560 IF LSTTYPE$ = "u" THEN PRINT#2, "":POSTOP$="":OPARG$="":GOTO 12700 12630 IF MID$(LASTOP$,1,4) = "##.o" THEN PREOP$ = "":POSTOP$="":OPARG$="":GOTO 12700 12700 STKPOS = BACKSTK-1 12710 PRINT#2, PREOP$+OPARG$+POSTOP$ 12720 RETURN