-
Notifications
You must be signed in to change notification settings - Fork 1
/
markup_converter.rb
130 lines (103 loc) · 4.67 KB
/
markup_converter.rb
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
class SaferGsub
def sub(text, pattern, replace)
wrap_if_no_subs(text, text.gsub!(/#{pattern}/, replace))
end
def wrap_if_no_subs(original, after_sub)
after_sub == nil ? original : after_sub
end
end
class TagMap
# Match everything printable, in lazy chunks (not greedy whole-line chunks)
NonGreedyPrintableMatch = "[\x20-\x7E]"
def initialize(mwStart, mwEnd, wdStart, wdEnd)
@mwStart = mwStart
@mwEnd = mwEnd
@wdStart = wdStart
@wdEnd = wdEnd
@safeGs = SaferGsub.new
end
def convert(wikiText)
pattern = @mwStart + '(' + NonGreedyPrintableMatch + '*?)' + @mwEnd
replace = @wdStart + '\1' + @wdEnd
@safeGs.sub(wikiText, pattern, replace)
end
end
class MarkupConverter
def initialize(wikiText)
@wikiText = wikiText
@safeGs = SaferGsub.new
end
def convert
# Convert internal links from Wikimedia [[Link Content]] to Wikidot [[[Link Content]]]
# Note: External links 7.;;
@wikiText = TagMap.new('\[\[', '\]\]', '[[[', ']]]').convert(@wikiText)
# Turn categories into comments. They'll later be converted to tags.
# Note: Must happen AFTER the link regex, which will add an extra bracket.
@wikiText = TagMap.new('\[\[\[Category\:', '\]\]\]', '[!--Tag=', '--]').convert(@wikiText)
# Table of Contents
@safeGs.wrap_if_no_subs(@wikiText, @wikiText.gsub!(/__TOC__/i, '[[toc]]'));
# Comments
@wikiText = TagMap.new("\<\!--", "--\>", '[!-- ', ' --]').convert(@wikiText)
# Text not to be processed by the WIKI system:
@wikiText = TagMap.new("<nowiki>", "<\/nowiki>", '@@', '@@').convert(@wikiText)
@wikiText = TagMap.new("<pre>", "<\/pre>", '@@', '@@').convert(@wikiText)
# Strikeout
@wikiText = TagMap.new("<s>", "<\/s>", '--', '--').convert(@wikiText)
@wikiText = TagMap.new("<del>", "<\/del>", '--', '--').convert(@wikiText)
# Underlined
@wikiText = TagMap.new("<u>", "<\/u>", '__', '__').convert(@wikiText)
@wikiText = TagMap.new("<ins>", "<\/ins>", '__', '__').convert(@wikiText)
# Sub/Superscripts
@wikiText = TagMap.new("<sub>", "<\/sub>", ',,', ',,').convert(@wikiText)
@wikiText = TagMap.new("<sup>", "<\/sup>", '^^', '^^').convert(@wikiText)
# These two are a bit weird because they need to execute a block to do the substitution,
# and it doesn't fit the TagMap structure
# Convert Headings
# =Heading1= to + Heading1
# ==Heading2== to ++ Heading2
# etc.
pattern = "(=+)(" + TagMap::NonGreedyPrintableMatch + "*?)=+"
sub_with_block = @wikiText.gsub!(/#{pattern}/) { |str| ("+" * $1.length) + " " + $2 }
@safeGs.wrap_if_no_subs(@wikiText, sub_with_block)
# Include.
# Note: Must replace spaces.
pattern = "\\{\\{(" + TagMap::NonGreedyPrintableMatch + "*?)\\}\\}"
sub_with_block = @wikiText.gsub!(/#{pattern}/) { |str|
"[[include " + $1 + "]]" }
@safeGs.wrap_if_no_subs(@wikiText, sub_with_block)
# Convert Lists
# * Bullet A
# ** Bullet B
# ** Bullet C
# *** Bullet D
# * Bullet E
#
# becomes...
#
#* Bullet A
# * Bullet B
# * Bullet C
# * Bullet D
#* Bullet E
#
# Can also be #'s for a numbered list
pattern = "(^[\*#]+)(" + TagMap::NonGreedyPrintableMatch + "*?)$"
sub_with_block = @wikiText.gsub!(/#{pattern}/) { |str|
listMarker = $1[0,1]
listLevel = $1.length - 1
(" " * listLevel) + listMarker + $2 }
@safeGs.wrap_if_no_subs(@wikiText, sub_with_block)
# Convert Images [[[Image:Picture.jpg]]] to [[image files/Picture.jpg]]
# Note: assumes that all files will be uploaded to a "files" placeholder page
# Note #2: Happens after the link regex, which will add an extra bracket.
pattern = "\\[\\[\\[Image\\:(" + TagMap::NonGreedyPrintableMatch + "*?)\\]\\]\\]"
sub_with_block = @wikiText.gsub!(/#{pattern}/) { |str|
"[[image files/" + $1 + "]]" }
@safeGs.wrap_if_no_subs(@wikiText, sub_with_block)
# Bold and italic
# NOTE: Do this AFTER the lists so it doesn't get confused for bullets.
@wikiText = TagMap.new("'{3}", "'{3}", '**', '**').convert(@wikiText)
@wikiText = TagMap.new("'{2}", "'{2}", '*', '*').convert(@wikiText)
return @wikiText
end
end