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.)

[[code]]
    '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)

    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
    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
[[code]]

And for anyone interested here's the file structure:

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

[[code]]