-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmdtohtml.bas
More file actions
147 lines (126 loc) · 6.33 KB
/
Copy pathmdtohtml.bas
File metadata and controls
147 lines (126 loc) · 6.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
DECLARE FUNCTION TextHeading$ (myString$, mdTag$, htmlStart$, htmlEnd$)
DECLARE FUNCTION TextMarkup$ (myString$, mdTag$, htmlStart$, htmlEnd$)
DECLARE FUNCTION FormatLinks$ (myString$)
DECLARE FUNCTION AddToHTML$ (html$, update$)
If Command$ = "" Then
Input "Markdown file: ", fileMD$
Input "CSS Theme:", fileCSS$
ElseIf InStr(Command$, " ") > 0 Then
fileMD$ = _StartDir$ + "\" + Left$(Command$, InStr(Command$, " ") - 1)
fileCSS$ = Right$(Command$, Len(Command$) - Len(Left$(Command$, InStr(Command$, " "))))
Else
fileMD$ = _StartDir$ + "\" + Command$
End If
Print fileMD$
Print fileCSS$ + ".css"
'HTML file created for output
fileHTML$ = Left$(fileMD$, InStr(fileMD$, ".") - 1) + ".html"
'fileHTML$ = Left$(fileMD$, InStr(fileMD$, ".") - 1) + ".htm" 'use this line instead when porting to older QB (DOS)
html$ = "<!doctype html>" + Chr$(10)
html$ = html$ + "" + Chr$(10)
html$ = html$ + "<html lang=" + Chr$(34) + "en" + Chr$(34) + ">" + Chr$(10)
html$ = html$ + "<head>" + Chr$(10)
html$ = html$ + " <meta charset=" + Chr$(34) + "utf-8" + Chr$(34) + ">" + Chr$(10)
html$ = html$ + " <meta name=" + Chr$(34) + "viewport" + Chr$(34) + " content=" + Chr$(34) + "width=device-width, initial-scale=1" + Chr$(34) + ">" + Chr$(10)
html$ = html$ + " <title></title>" + Chr$(10)
html$ = html$ + " <link rel=" + Chr$(34) + "stylesheet" + Chr$(34) + " href=" + Chr$(34) + "themes/" + fileCSS$ + ".css" + Chr$(34) + ">" + Chr$(10)
html$ = html$ + "</head>" + Chr$(10)
html$ = html$ + "" + Chr$(10)
html$ = html$ + "<body>" + Chr$(10)
InUnorderedList = 0
InOrderedList = 0
InBlockQuote = 0
Open fileMD$ For Input As #1
Open fileHTML$ For Output As #2
While Not EOF(1)
Line Input #1, markdown$ 'Loads (next) line from MD file
'Check if still in a list
If InUnorderedList = 1 And Left$(markdown$, 2) <> "* " And Left$(markdown$, 2) <> "- " And Left$(markdown$, 2) <> "+ " Then
html$ = AddToHTML$(html$, "</ul>")
InUnorderedList = 0
End If
IF InOrderedList = 1 AND LEFT$(markdown$, 3) <> "1. " AND LEFT$(markdown$, 3) <> "2. " AND LEFT$(markdown$, 3) <> "3. " AND LEFT$(markdown$, 3) <> "4. " AND LEFT$(markdown$, 3) <> "5. " AND LEFT$(markdown$, 3) <> "6. " AND LEFT$(markdown$, 3) <> _
"7. " AND LEFT$(markdown$, 3) <> "8. " AND LEFT$(markdown$, 3) <> "9. " THEN
html$ = AddToHTML$(html$, "</ol>")
InOrderedList = 0
End If
'Check for headings
For i = 1 To 6
markdown$ = TextHeading$(markdown$, String$(i, "#"), "<h" + LTrim$(Str$(i)) + ">", "</h" + LTrim$(Str$(i)) + ">")
Next
'Check for unordered lists
If Left$(markdown$, 2) = "* " Or Left$(markdown$, 2) = "- " Or Left$(markdown$, 2) = "+ " Then
If InUnorderedList = 0 Then
InUnorderedList = 1
markdown$ = "<ul><li>" + Right$(markdown$, Len(markdown$) - 2) + "</li>"
Else
markdown$ = " <li>" + Right$(markdown$, Len(markdown$) - 2) + "</li>"
End If
'Check for ordered lists
ELSEIF LEFT$(markdown$, 3) = "1. " OR LEFT$(markdown$, 3) = "2. " OR LEFT$(markdown$, 3) = "3. " OR LEFT$(markdown$, 3) = "4. " OR LEFT$(markdown$, 3) = "5. " OR LEFT$(markdown$, 3) = "6. " OR LEFT$(markdown$, 3) = "7. " OR LEFT$(markdown$, 3) = _
"8. " OR LEFT$(markdown$, 3) = "9. " THEN
If InOrderedList = 0 Then
InOrderedList = 1
markdown$ = "<ol><li>" + Right$(markdown$, Len(markdown$) - 2) + "</li>"
Else
markdown$ = " <li>" + Right$(markdown$, Len(markdown$) - 2) + "</li>"
End If
End If
'Check for blockquotes
If Left$(markdown$, 2) = "> " Then
markdown$ = "<blockquote>" + Right$(markdown$, Len(markdown$) - 2) + "</blockquote>"
End If
'Check for bold/italic parts
markdown$ = TextMarkup$(markdown$, "***", "<em><strong>", "</strong></em>")
markdown$ = TextMarkup$(markdown$, "**", "<strong>", "</strong>")
markdown$ = TextMarkup$(markdown$, "*", "<em>", "</em>")
markdown$ = TextMarkup$(markdown$, "___", "<em><strong>", "</strong></em>")
markdown$ = TextMarkup$(markdown$, "__", "<strong>", "</strong>")
markdown$ = TextMarkup$(markdown$, "_", "<em>", "</em>")
'Check for line breaks
If Right$(markdown$, 2) = " " Then
markdown$ = markdown$ + "<br />"
End If
'Check for links
markdown$ = FormatLinks$(markdown$)
html$ = AddToHTML$(html$, markdown$)
Wend
html$ = AddToHTML$(html$, "</body>")
html$ = AddToHTML$(html$, "</html>")
Print #2, html$
Close #1
Close #2
System 'Exit program without "Press any key" prompt
Function FormatLinks$ (myString$)
FormatLinks$ = myString$
If InStr(myString$, "[") > 0 Then
linkBefore$ = Left$(myString$, InStr(myString$, "[") - 1)
linkName$ = Mid$(myString$, InStr(myString$, "[") + 1, InStr(myString$, "]") - InStr(myString$, "[") - 1)
linkURL$ = Mid$(myString$, InStr(myString$, "(") + 1, InStr(myString$, ")") - InStr(myString$, "(") - 1)
linkAfter$ = Right$(myString$, Len(myString$) - InStr(myString$, ")"))
combinedOutput$ = linkBefore$ + "<a href=" + Chr$(34) + linkURL$ + Chr$(34) + ">" + linkName$ + "</a>" + linkAfter$
FormatLinks$ = FormatLinks$(combinedOutput$)
End If
End Function
' This function replaces
Function TextHeading$ (myString$, mdTag$, htmlStart$, htmlEnd$)
TextHeading$ = myString$
If Left$(myString$, Len(mdTag$) + 1) = mdTag$ + " " Then
TextHeading$ = htmlStart$ + Right$(myString$, Len(myString$) - Len(mdTag$) - 1) + htmlEnd$
End If
End Function
' Deals
Function TextMarkup$ (myString$, mdTag$, htmlStart$, htmlEnd$)
TextMarkup$ = myString$
If InStr(myString$, mdTag$) > 0 Then
beforeMarkup$ = Left$(myString$, InStr(myString$, mdTag$) - 1)
afterMarkup$ = Right$(myString$, Len(myString$) - Len(beforeMarkup$) - Len(mdTag$))
duringMarkup$ = Left$(afterMarkup$, InStr(afterMarkup$, mdTag$) - 1)
afterMarkup$ = Right$(afterMarkup$, Len(afterMarkup$) - Len(duringMarkup$) - Len(mdTag$))
combinedOutput$ = beforeMarkup$ + htmlStart$ + duringMarkup$ + htmlEnd$ + afterMarkup$
TextMarkup$ = TextMarkup$(combinedOutput$, mdTag$, htmlStart$, htmlEnd$)
End If
End Function
Function AddToHTML$ (html$, update$)
AddToHTML$ = html$ + update$ + Chr$(10)
End Function