Alyce
Mar 31, 2006
- "Reverted to Mar 26, 2006 3:14 am"
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)
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$, "	", " ") '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 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:
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) 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$, "	", " ") '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 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 FunctionAnd for anyone interested here's the file structure: