Older Version
Newer Version
Alyce
Mar 31, 2006
- "Reverted to Mar 26, 2006 3:14 am"
Here's an updated version ofAuthor's notes: Ever since Brad Moore published thecode. Usesgreat article "Working With Strings - Part 3" in LB Newsletter #141 I had been looking for aportion ofsuitable project to test it on. When Carl suggested a Lesson Formatter I went right to work. I'm only a yearling but I did what I could with it. It's plain and it does thecode fromjob--but it's V E R Y S L O W. I'm sure theprevious version but muchexperts can fix that. In the spirit of "community" I'm not putting my name on itis replacedand expect anyone withfastera better idea to just go in andeasier-to-follow solutions. This versionedit it. If a better one isapprox 800% faster thancreated just remove it. Because it takes several seconds to parse theprevious version. No new features has beenentire lesson file I addedthough.the ability to save and reopen the results as a text file. I did give it a Print utility but I removed it. The font had to be reduced to a tiny point 9 and with "!lines countVar" reporting almost 5,000 lines it would take 70+ pages to print it out. Someone must know a better way. Hopefully it will at least spark an interest in XML parsing. I'll probably remove these notes after a few days. (The dangling semi-colons are actually displayed in the lessons--they had me going for a while until I realized that.) [[code]] 'Replace Strings function was posted by Brad Moore on conforums 11-27-05 leng=90 'length of texteditor line Globalleng ',leng, tag$, comment$ WindowWidth=760 WindowHeight=590 UpperLeftX = Int((DisplayWidth - WindowWidth)/2) UpperLeftY = Int((DisplayHeight - WindowHeight)/2) Nomainwin Menu #main, "&File", "&Open", getTutorial, "&Save", saveText, "&Quit", quitMenu Texteditor #main.tb1, 5, 5, 740, 500 Statictext #main.status, "", 680, 510, 60, 25 Open "Parse Liberty Basic 4 Tutorial" for Window as #main Print #main, "Trapclose quit" Print #main.tb1, "!autoresize"; Print #main, "Font Courier_New 10" Print #main.status, "!Font Courier_New 11 Bold" Print #main.status, "!Hide" 'otherwise will be visible if texteditor is maximized Call getTutorial Wait '********************** SUBS AND FUNCTIONS ************************* Sub quitMenu Call quit handle$ End Sub Sub quit handle$ Close #main End Sub Sub getTutorialoldtimer = time$("ms")Filedialog "Open Liberty Basic lesson file", "*.lsn;*.txt", fileName$ If Right$(fileName$,3) = "txt" Then Call getText fileName$ If fileName$<>"" Then Print #main.status, "!Show"OpenOpen fileName$ For Input As #1Open fileName$; ".txt" For Output As #2 ProgressLOF = LOF(#1)Do'Read next lineLine Input #1, comment$'Get the tag of current line "<TAG>"startPos=Instr(comment$,"<",marker) endPos=Instr(comment$,">",marker) tag$ = Left$(comment$,endPos-startPos+1) progress=progress+1 Print #main.status, Int(progress*.051); " %" 'calculated by 100/1958 lines'Update progressbar Gosub [ProgressUpdate] 'Print 2 blank lines in 'front of lesson titlesSelect Case tag$CaseCase "<lesson-title>"Call printBlankLinesCall blankLines 2 Call lessonTitle comment$ Call blankLines 2 Case "<lesson-comment>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printComments comment$ Call blankLines 2 Case "<lesson-code>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printCode comment$ Call blankLines 2 Case "<chapter-title>" Call chapterTitle comment$ Call blankLines 2 Case "<chapter-comment>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printComments comment$ Call blankLines 2 Case "<section-title>" Call sectionTitle comment$ Call blankLines 2 Case "<section-comment>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printComments comment$ Call blankLines 2 Case "<section-code>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printCode comment$ Call blankLines 2 Case "<example-title>" Call exampleTitle comment$ Call blankLines 2 Case "<example-comment>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printComments comment$ Call blankLines 2 Case "<example-code>" Line Input #1, comment$ progress=progress+1 Print #main.status, Int(progress*.051); " %" Call printCode comment$ Call blankLines 2 End Select'Print value (code, comments or title) Select Case tag$ case "<lesson-code>", "<section-code>", "<example-code>" Line Input #1, comment$ Gosub [ProgressUpdate] Call printCode comment$ Case "<lesson-comment>", "<chapter-comment>", "<section-comment>", "<example-comment>" Line Input #1, comment$ Gosub [ProgressUpdate] Call printComments comment$ Case "<lesson-title>", "<section-title>", "<chapter-title>", "<example-title>" startPos=Instr(comment$,">",1)+1 endPos=Instr(comment$,"</",1)-1 comment$=Mid$(comment$,startPos,endPos-(startPos-1)) call printTitle comment$ Case Else comment$ = "" End Select 'Print 2 blank lines 'below the value if (comment$ <> "") then call printBlankLines 2 End ifLoop While eof(#1) = 0 Print #main.status, "" Close #1Close #2 text$ = GetFileContents$(fileName$; ".txt") Print #main.tb1, "!contents text$"Print #main.status, "!Hide" Print #main.tb1, "!origin 1 1" ;EndEnd ifPrint "Time: "; time$("ms") - oldtimer Exit Sub [ProgressUpdate] 'See how far we have read in the 'lsn file and calculate the new 'progress %, only update the 'status when the progress % 'has actually changed ProgressLOC = LOC(#1) ProgressNew = Int((ProgressLOC / ProgressLOF) * 100) If (ProgressNew <> ProgressOld) Then ProgressOld = ProgressNew Print #main.status, ProgressNew; " %" End If Return EndEnd Sub Sub getText fileName$ Open fileName$ For Input As #1 Print #main.tb1, "!contents #1"; Close #1EndEnd Sub Sub saveText Filedialog "Save As... (TEXT ONLY)", "*.txt", fileName2$ If fileName2$<> "" Then Open fileName2$ For Output As #1 Print #main.tb1, "!contents? textTutorial$"; Print #1, textTutorial$ Close #1 End IfEndEnd Sub SubprintTitlelessonTitle comment$ startPos=Instr(comment$,"<lesson-title>",1)+14 endPos=Instr(comment$,"</lesson-title>",1)-1 title$=Mid$(comment$,startPos,endPos-(startPos-1)) Print #main.tb1, Space$(int(leng/2)-(int(len(title$)/2))); title$ End SubPrint #2,Sub chapterTitle comment$ startPos=Instr(comment$,"<chapter-title>",1)+15 endPos=Instr(comment$,"</chapter-title>",1)-1 title$=Mid$(comment$,startPos,endPos-(startPos-1)) Print #main.tb1, Space$(int(leng/2)-(int(len(title$)/2)));Print #2,title$ End SubEndSub sectionTitle comment$ startPos=Instr(comment$,"<section-title>",1)+15 endPos=Instr(comment$,"</section-title>",1)-1 title$=Mid$(comment$,startPos,endPos-(startPos-1)) Print #main.tb1, Space$(int(leng/2)-(int(len(title$)/2))); title$ End Sub SubprintCode code$exampleTitle comment$ startPos=Instr(comment$,"<example-title>",1)+15 endPos=Instr(comment$,"</example-title>",1)-1 title$=Mid$(comment$,startPos,endPos-(startPos-1)) Print #main.tb1, Space$(int(leng/2)-(int(len(title$)/2))); title$ End SubIf Right$(code$,Sub printCode comment$ If Right$(comment$, 32) = "no code example for this section" Then Exit SubIf Right$(code$,If Right$(comment$, 28) = "place your example code here" Then Exit SubCall ConvHTML2Text code$ Call WordWrapCode code$, leng Print #2, code$ Endline3$=replaceStr$(comment$, "	", " ") 'convert tab comment$ = line3$ line3$=replaceStr$(comment$, """, chr$(34)) 'quotation mark comment$ = line3$ line3$=replaceStr$(comment$, "<", "<") 'lesser than comment$ = line3$ line3$=replaceStr$(comment$, ">", ">") 'greater than comment$ = line3$ line3$=replaceStr$(comment$, "&", "&") 'ampersand comment$ = line3$ newCode$=replaceStr$(comment$," ",chr$(13)+chr$(10)) 'line break Print #main.tb1, newCode$ End Sub Sub printComments comment$ x=1 longLine$=Word$(comment$,x," ") While longLine$ <> "" If longLine$ <> " " Then y=1 Do Do Until Len(line2$) > leng line1$=Word$(longLine$,y) line3$=replaceStr$(line1$, "	", " ") 'convert tab line1$ = line3$ line3$=replaceStr$(line1$, """, chr$(34)) 'quotation mark line1$ = line3$ line3$=replaceStr$(line1$, "<", "<") 'lesser than line1$ = line3$ line3$=replaceStr$(line1$, ">", ">") 'greater than line1$ = line3$ line3$=replaceStr$(comment$, "&", "&") 'ampersand comment$ = line3$ temp$ = line2$ + line1$ + " " If len(temp$) > leng Then Exit Do y=y+1 line2$=temp$ Loop line3$=Trim$(line2$) Print #main.tb1, line2$ line2$="" Loop While line1$ <> "" Else Print #main.tb1, "" End If x=x+1 longLine$=Word$(comment$,x," ") Wend End SubCall ConvHTML2Text comment$ Call WordWrapCode comment$, leng Print #2, comment$Sub blankLines num For x=1 To num Print #main.tb1, "" Next x End SubEnd Sub Sub printBlankLines num For x=1 To num Print #2, "" Next x End Sub Sub ConvHTML2Text ByRef Text$ Call ReplaceText Text$, "	", " " Call ReplaceText Text$, """, Chr$(34) Call ReplaceText Text$, "<", "<" Call ReplaceText Text$, ">", ">" Call ReplaceText Text$, "&", "&" Call ReplaceText Text$, " ", Chr$(13) + Chr$(10) End Sub Sub ReplaceText ByRef Text$, ReplaceFrom$, ReplaceTo$ PosFunction replaceStr$(original$, toReplace$, replacement$) final$ =InStr(Text$, ReplaceFrom$) Do While (Posoriginal$ If len(original$) >0) Text$ = Left$(Text$, Pos - 1) + ReplaceTo$ + Mid$(Text$, Pos + Len(ReplaceFrom$)) Pos = InStr(Text$, ReplaceFrom$) Loop End Sub Sub WordWrapCode ByRef Text$, length CurrStart = 1 Do CurrEnd = InStr(Text$, Chr$(13) + Chr$(10), CurrStart) If (CurrEnd = 0)0 And len(toReplace$) > 0 ThenCurrEndpos =(Len(Text$) + 1) CurrLength = (CurrEnd - CurrStart - 1) If (CurrLength < length)instr(original$, toReplace$) If pos > 0 ThenCurrStartl$ =(CurrEnd + 2) Else CurrEndleft$(original$, pos-1) r$ =CurrStart Do LastEndmid$(original$, pos+len(toReplace$)) final$ =CurrEnd CurrEnd = InStr(Text$, " ", CurrEndl$ +1) If (CurrEnd = 0) Then CurrEnd = (Len(Text$)replacement$ +1) Exit Dor$ End IfCurrLength = (CurrEnd - CurrStart - 1) Loop While (CurrLength < length) Text$ = Left$(Text$, LastEnd) + Chr$(13) + Chr$(10) + Mid$(Text$, LastEnd + 1) CurrStart = (LastEnd + 3)End IfLoop While (CurrStart < Len(Text$))If instr(original$, toReplace$, 1) > 0 Then final$ = replaceStr$(final$, toReplace$, replacement$) End If replaceStr$ = final$ End Function [[code]]End SubAnd for anyone interested here's the file structure:Function GetFileContents$(Filename$)[[code]] ____________<lesson> | | <lesson-title></lesson-title> | <author></author> | <lesson-comment></lesson-comment> | <lesson-code></lesson-code> | | ____________<chapters> | | | | _______<chapter> | | | | | | <chapter-title></chapter-title> | | | <chapter-comment></chapter-comment> | | | <chapter-code></chapter-code> | | | | | | ____________<sections> | | | | | | | | _______<section> | | | | | | | | | | <section-title></section-title> | | | | | <section-comment></section-comment> | | | | | <section-code></section-code> | | | | | | | | | | ____________<examples> | | | | | | | | | | | | _______<example> | | | | | | | | | | | | | | <example-title></example-title> | | | | | | | <example-comment></example-comment> | | | | | | | <example-code></example-code> | | | | | | | | | | | | | |_______</example> | | | | | | | | | | | |____________</examples> | | | | | | | | | |_________________</section> | | | | | | | |______________________</sections> | | | | | |___________________________</chapter> | | | |________________________________</chapters> | |_____________________________________</lesson>Open Filename$ For Input As #2 GetFileContents$ = Input$(#2, LOF(#2)) Close #2 End Function[[code]]