Author's notes:

Ever since Brad Moore published the great article "Working With Strings - Part 3" in LB Newsletter #141 I had been looking for a suitable 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 the job--but it's V E R Y S L O W. I'm sure the experts can fix that. In the spirit of "community" I'm not putting my name on it and expect anyone with a better idea to just go in and edit it. If a better one is created just remove it.

Because it takes several seconds to parse the entire lesson file I added 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.)

 'Replace Strings function was posted by Brad Moore on conforums 11-27-05 

leng=90 'length of texteditor line
Global leng, tag$, comment$

WindowWidth=760
WindowHeight=590
UpperLeftX = Int((DisplayWidth - WindowWidth)/2)
UpperLeftY = Int((DisplayHeight - WindowHeight)/2) - 14

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 getTutorial
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"
Open fileName$ For Input As #1
Do
Line Input #1, comment$
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

Select Case tag$
Case "<lesson-title>"
Call 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
Loop While eof(#1) = 0
Print #main.status, ""
Close #1
Print #main.status, "!Hide"
Print #main.tb1, "!origin 1 1" ;
End if
End Sub

Sub getText fileName$
Open fileName$ For Input As #1
Print #main.tb1, "!contents #1";
Close #1
print #main.tb1, "!lines countVar" ; print #main.tb1, countVar End 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 If
End Sub

Sub lessonTitle 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 Sub

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))); title$
End Sub

Sub 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

Sub 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 Sub

Sub printCode comment$
If Right$(comment$, 32) = "no code example for this section" Then Exit Sub
If Right$(comment$, 28) = "place your example code here" Then Exit Sub
line3$=replaceStr$(comment$, "&#9;", " ") 'convert tab
comment$ = line3$
line3$=replaceStr$(comment$, "&quot;", chr$(34)) 'quotation mark
comment$ = line3$
line3$=replaceStr$(comment$, "&lt;", "<") 'lesser than
comment$ = line3$
line3$=replaceStr$(comment$, "&gt;", ">") 'greater than
comment$ = line3$
line3$=replaceStr$(comment$, "&amp;", "&") 'ampersand
comment$ = line3$
newCode$=replaceStr$(comment$,"&#13;&#10;",chr$(13)+chr$(10)) 'line break
Print #main.tb1, newCode$
End Sub

Sub printComments comment$
x=1
longLine$=Word$(comment$,x,"&#13;&#10;")
While longLine$ <> ""
If longLine$ <> "&#13;&#10;" Then
y=1
Do
Do Until Len(line2$) > leng
line1$=Word$(longLine$,y)
line3$=replaceStr$(line1$, "&#9;", " ") 'convert tab
line1$ = line3$
line3$=replaceStr$(line1$, "&quot;", chr$(34)) 'quotation mark
line1$ = line3$
line3$=replaceStr$(line1$, "&lt;", "<") 'lesser than
line1$ = line3$
line3$=replaceStr$(line1$, "&gt;", ">") 'greater than
line1$ = line3$
line3$=replaceStr$(comment$, "&amp;", "&") '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,"&#13;&#10;")
Wend
End Sub

Sub blankLines num
For x=1 To num
Print #main.tb1, ""
Next x
End Sub

Function replaceStr$(original$, toReplace$, replacement$)
final$ = original$
If len(original$) > 0 And len(toReplace$) > 0 Then
pos = instr(original$, toReplace$)
If pos > 0 Then
l$ = left$(original$, pos-1)
r$ = mid$(original$, pos+len(toReplace$))
final$ = l$ + replacement$ + r$
End If
End If
If instr(original$, toReplace$, 1) > 0 Then
final$ = replaceStr$(final$, toReplace$, replacement$)
End If
replaceStr$ = final$
End Function

And for anyone interested here's the file structure:

 ____________<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>