schizm 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/schizm/parse.rb CHANGED
@@ -1,3 +1,30 @@
1
+ # Copyright (c) 2017 M. Grady Saunders
2
+ #
3
+ # Redistribution and use in source and binary forms, with or without
4
+ # modification, are permitted provided that the following conditions
5
+ # are met:
6
+ #
7
+ # 1. Redistributions of source code must retain the above
8
+ # copyright notice, this list of conditions and the following
9
+ # disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above
12
+ # copyright notice, this list of conditions and the following
13
+ # disclaimer in the documentation and/or other materials
14
+ # provided with the distribution.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
+ # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24
+ # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
1
28
  require_relative 'chunk'
2
29
  require_relative 'match'
3
30
  require_relative 'markup'
@@ -7,392 +34,371 @@ require 'uri'
7
34
 
8
35
  module Schizm
9
36
 
10
- module Parse
37
+ module Parse
11
38
 
12
- CPP_HIGHLIGHT = [
13
- ["hi-comment", /\/\/.*$/u],
14
- ["hi-comment", /\/\*.*?\*\//um],
15
- ["hi-preproc", /\#(?:ifn?def|endif|if|else|elif|define|pragma|include)\b.*?(?<=[^\\])(?:\n|\z)/um],
16
- ["hi-type", /(?:auto|bool|char|short|long|int|(?:un)?signed|float|double|void)\b/u],
17
- ["hi-type", /(?:size|ptrdiff|char(?:16|32)|wchar|u?int(?:_least|_fast)?(?:8|16|32|64))_t\b/u],
18
- ["hi-type-spec", /(?:constexpr|const|volatile|static|mutable|thread_local|register|extern|inline|noexcept)\b/u],
19
- ["hi-flow", /(?:new|delete|do|while|for|if|else|try|throw|catch|switch|case|default|break|continue|goto|return)\b/u],
20
- ["hi-op", /(?:(?:and|or|xor|not)(?:_eq)?|bitand|bitor|compl|(?:(?:const|dynamic|static|reinterpret)_cast))\b/u],
21
- ["hi-value", /(?:true|false|this|nullptr|NULL)\b/u],
22
- ["hi-value", /'[^'\\]*(?:\\.[^'\\]*)*'/u], # Single quote
23
- ["hi-value", /"[^"\\]*(?:\\.[^"\\]*)*"/u], # Double quote
24
- ["hi-other", /(?:alignas|alignof|sizeof|decltype|template|typename|typedef|using|concept|requires|operator)\b/u],
25
- ["hi-other", /(?:namespace|class|struct|enum|public|protected|private|friend|final|virtual|override)\b/u],
26
- ["hi-ident", /\p{Word}+/u],
27
- [nil, /[^\p{Word}\p{Space}]+/um]
28
- ]
39
+ # Markup hash.
40
+ @@hash =
41
+ Hash.new do |hash, where|
42
+ hash[where] = Markup.new
43
+ end
29
44
 
30
- # Markup hash.
31
- @@hash =
32
- Hash.new do |hash, where|
33
- hash[where] = Markup.new
34
- end
45
+ # Markup hash accessor.
46
+ def self.hash
47
+ return @@hash
48
+ end
35
49
 
36
- # Markup hash accessor.
37
- def self.hash
38
- return @@hash
50
+ # Link hash.
51
+ @@links =
52
+ Hash.new do |hash, where|
53
+ hash[where] =
54
+ Hash.new do |hash, entry|
55
+ hash[entry] = Hash.new
56
+ end
39
57
  end
40
58
 
41
- # Link hash.
42
- @@links =
43
- Hash.new do |hash, where|
44
- hash[where] =
45
- Hash.new do |hash, entry|
46
- hash[entry] = Hash.new
47
- end
48
- end
59
+ # Link hash accessor.
60
+ def self.links
61
+ return @@links
62
+ end
49
63
 
50
- # Link hash accessor.
51
- def self.links
52
- return @@links
64
+ # Hash attribute reference.
65
+ class HashAttr
66
+ def initialize hash, attr
67
+ @hash = hash
68
+ @attr = attr
53
69
  end
54
-
55
- # Hash attribute reference.
56
- class HashAttr
57
- def initialize hash, attr
58
- @hash = hash
59
- @attr = attr
60
- end
61
- def to_s
62
- return @hash[@attr].to_s
63
- end
70
+ def to_s
71
+ return @hash[@attr].to_s
64
72
  end
73
+ end
65
74
 
66
- class ChunkRef
67
- def initialize where, label
68
- @where = where
69
- @label = label
70
- end
71
- def to_s
72
- Chunk.each do |chunk|
73
- if chunk.label == @label and
74
- (chunk.where == @where or chunk.share?)
75
- return Env.path_href(@where) + '#' + chunk.id(1)
76
- end
75
+ class ChunkRef
76
+ def initialize where, label
77
+ @where = where
78
+ @label = label
79
+ end
80
+ def to_s
81
+ Chunk.each do |chunk|
82
+ if chunk.label == @label and
83
+ (chunk.where == @where or chunk.share?)
84
+ return Env.path_href(@where) + '#' + chunk.id(1)
77
85
  end
78
- return ""
79
86
  end
87
+ return ""
80
88
  end
89
+ end
81
90
 
82
- class BlockRef
83
- def initialize chunk, index
84
- @chunk = chunk
85
- @index = index
86
- end
87
- def to_s
88
- return "" if @index < 1
89
- return "" if @index > @chunk.blocks.size
90
- Env.path_href(@chunk.where) + '#' + @chunk.id(@index)
91
- end
91
+ class BlockRef
92
+ def initialize chunk, index
93
+ @chunk = chunk
94
+ @index = index
95
+ end
96
+ def to_s
97
+ return "" if @index < 1
98
+ return "" if @index > @chunk.blocks.size
99
+ Env.path_href(@chunk.where) + '#' + @chunk.id(@index)
92
100
  end
101
+ end
93
102
 
94
- def self.line_elems where, input
95
- elems = Markup.new
96
- sscan = StringScanner.new input.strip
97
- until sscan.eos?
98
- elems.add_elems(
103
+ def self.line_elems where, input
104
+ elems = Markup.new
105
+ sscan = StringScanner.new input.strip
106
+ until sscan.eos?
107
+ elems.add_elems(
108
+ case
109
+ when (sscan.skip SPACE) then " "
110
+ when (sscan.skip HTML_ENTITY) then sscan[0]
111
+ when (sscan.skip HTML_ESCAPE) then sscan[0].codepoints[0]
112
+ when (sscan.skip CHAR_ESCAPE) then sscan[0].codepoints[0]
113
+ when (sscan.skip LINK_REF)
114
+ shown = String.new(sscan[1]).unescape(']')
115
+ param = String.new(sscan[2]).unescape(')')
116
+ param = LINK_PARAMS.match(param)
117
+ if (param[2] =~ URI::regexp)
118
+ attrs = {"href" => param[2],
119
+ "title" => param[1]}
120
+ else
121
+ entry = param[2]
122
+ attrs = {"href" => HashAttr.new(@@links[where][entry], "href"),
123
+ "title" => HashAttr.new(@@links[where][entry], "title")}
124
+ end
125
+ attrs["target"] = "_blank"
126
+ Markup.new("a")
127
+ .add_attrs(attrs)
128
+ .add_elems(line_elems(where, shown))
129
+ when (sscan.skip CENTER_MATH)
130
+ Markup.new("script")
131
+ .add_attrs(CENTER_MATH_ATTRS)
132
+ .add_elems(String.new(sscan[1]).slim)
133
+ when (sscan.skip INLINE_MATH)
134
+ Markup.new("script")
135
+ .add_attrs(INLINE_MATH_ATTRS)
136
+ .add_elems(String.new(sscan[1]).slim)
137
+ when (sscan.skip INLINE_EMPH)
138
+ depth = sscan[1].size
139
+ inner = line_elems(where, sscan[2])
99
140
  case
100
- when (sscan.skip SPACE) then " "
101
- when (sscan.skip HTML_ENTITY) then sscan[0]
102
- when (sscan.skip HTML_ESCAPE) then sscan[0].codepoints[0]
103
- when (sscan.skip CHAR_ESCAPE) then sscan[0].codepoints[0]
104
- when (sscan.skip LINK_REF)
105
- shown = String.new(sscan[1]).unescape(']')
106
- param = String.new(sscan[2]).unescape(')')
107
- param = LINK_PARAMS.match(param)
108
- if (param[2] =~ URI::regexp)
109
- attrs = {"href" => param[2],
110
- "title" => param[1]}
111
- else
112
- entry = param[2]
113
- attrs = {"href" => HashAttr.new(@@links[where][entry], "href"),
114
- "title" => HashAttr.new(@@links[where][entry], "title")}
115
- end
116
- attrs["target"] = "_blank"
117
- Markup.new("a")
118
- .add_attrs(attrs)
119
- .add_elems(line_elems(where, shown))
120
- when (sscan.skip CENTER_MATH)
121
- Markup.new("script")
122
- .add_attrs(CENTER_MATH_ATTRS)
123
- .add_elems(String.new(sscan[1]).slim)
124
- when (sscan.skip INLINE_MATH)
125
- Markup.new("script")
126
- .add_attrs(INLINE_MATH_ATTRS)
127
- .add_elems(String.new(sscan[1]).slim)
128
- when (sscan.skip INLINE_EMPH)
129
- depth = sscan[1].size
130
- inner = line_elems(where, sscan[2])
131
- case
132
- when depth <= 1
133
- Markup.new("em").add_elems(inner)
134
- when depth == 2
135
- Markup.new("strong").add_elems(inner)
136
- when depth >= 3
137
- Markup.new("strong").add_elems(Markup.new("em").add_elems(inner))
138
- end
139
- when sscan.skip(INLINE_CODE)
140
- Markup.new("code")
141
- .add_elems(String.new(sscan[1]).unescape("`").html)
142
- when sscan.skip(INLINE_SUP)
143
- Markup.new("sup").add_elems(line_elems(where, sscan[1]))
144
- when sscan.skip(INLINE_SUB)
145
- Markup.new("sub").add_elems(line_elems(where, sscan[1]))
146
- when (sscan.skip INLINE_INS)
147
- Markup.new("ins").add_elems(line_elems(where, sscan[1]))
148
- when (sscan.skip INLINE_DEL)
149
- Markup.new("del").add_elems(line_elems(where, sscan[1]))
150
- when sscan.skip(/\w+|\S/)
151
- sscan[0]
152
- end)
153
- end
154
- return elems
141
+ when depth <= 1
142
+ Markup.new("em").add_elems(inner)
143
+ when depth == 2
144
+ Markup.new("strong").add_elems(inner)
145
+ when depth >= 3
146
+ Markup.new("strong").add_elems(Markup.new("em").add_elems(inner))
147
+ end
148
+ when sscan.skip(INLINE_CODE)
149
+ Markup.new("code")
150
+ .add_elems(String.new(sscan[1]).unescape("`").html)
151
+ when sscan.skip(INLINE_SUP)
152
+ Markup.new("sup").add_elems(line_elems(where, sscan[1]))
153
+ when sscan.skip(INLINE_SUB)
154
+ Markup.new("sub").add_elems(line_elems(where, sscan[1]))
155
+ when (sscan.skip INLINE_INS)
156
+ Markup.new("ins").add_elems(line_elems(where, sscan[1]))
157
+ when (sscan.skip INLINE_DEL)
158
+ Markup.new("del").add_elems(line_elems(where, sscan[1]))
159
+ when sscan.skip(/\w+|\S/)
160
+ sscan[0]
161
+ end)
155
162
  end
163
+ return elems
164
+ end
156
165
 
157
- def self.page_elems where, input
158
- elems = Markup.new
159
- sscan = StringScanner.new(
160
- String.new(input)
161
- .expand_tab(4).trim_blank
162
- .concat("\n"))
163
- until sscan.eos?
164
- elems.add_elems(
166
+ def self.page_elems where, input
167
+ elems = Markup.new
168
+ sscan = StringScanner.new(
169
+ String.new(input)
170
+ .expand_tab(4).trim_blank
171
+ .concat("\n"))
172
+ until sscan.eos?
173
+ elems.add_elems(
174
+ case
175
+ when (sscan.skip EMPTY_LINE) then nil
176
+ when (sscan.skip EOB_MARKER) then nil
177
+ when (sscan.skip HRULE)
178
+ Markup.new "hr"
179
+ when (sscan.skip HEADING_ATX)
180
+ type = String.new sscan[1]
181
+ text = String.new sscan[2]
182
+ slug = text.slugify
183
+ Markup.new(
184
+ case type.size
185
+ when 1 then "h1"
186
+ when 2 then "h2"
187
+ when 3 then "h3"
188
+ when 4 then "h4"
189
+ when 5 then "h5"
190
+ when 6 then "h6"
191
+ end).add_elems(line_elems(where, text))
192
+ when (sscan.skip HEADING_SETEXT)
193
+ type = String.new sscan[2]
194
+ text = String.new sscan[1]
195
+ slug = text.slugify
196
+ Markup.new(
197
+ case type[0]
198
+ when "=" then "h1"
199
+ when "-" then "h2"
200
+ end).add_attrs("id" => slug)
201
+ .add_attrs("class" => "title")
202
+ .add_elems(line_elems(where, text))
203
+ when (sscan.skip LINK_DEF)
204
+ entry = String.new(sscan[1]).unescape(")")
205
+ param = String.new(sscan[2])#.unescape("]")
206
+ param_match = LINK_PARAMS.match param
207
+ @@links[where][entry]["href"] = param_match[2]
208
+ @@links[where][entry]["title"] = param_match[1]
209
+ nil
210
+ when (sscan.skip /^#{CHUNK_LABEL}/u)
211
+ div = nil
212
+ chunk = Chunk.hash[where][String.new(sscan[1]).unescape("]")]
165
213
  case
166
- when (sscan.skip EMPTY_LINE) then nil
167
- when (sscan.skip EOB_MARKER) then nil
168
- when (sscan.skip HRULE)
169
- Markup.new "hr"
170
- when (sscan.skip HEADING_ATX)
171
- type = String.new sscan[1]
172
- text = String.new sscan[2]
173
- slug = text.slugify
174
- Markup.new(
175
- case type.size
176
- when 1 then "h1"
177
- when 2 then "h2"
178
- when 3 then "h3"
179
- when 4 then "h4"
180
- when 5 then "h5"
181
- when 6 then "h6"
182
- end).add_attrs("id" => slug)
183
- .add_elems(line_elems(where, text))
184
- when (sscan.skip HEADING_SETEXT)
185
- type = String.new sscan[2]
186
- text = String.new sscan[1]
187
- slug = text.slugify
188
- Markup.new(
189
- case type[0]
190
- when "=" then "h1"
191
- when "-" then "h2"
192
- end).add_attrs("id" => slug)
193
- .add_attrs("class" => "title")
194
- .add_elems(line_elems(where, text))
195
- when (sscan.skip LINK_DEF)
196
- entry = String.new(sscan[1]).unescape(")")
197
- param = String.new(sscan[2])#.unescape("]")
198
- match = LINK_PARAMS.match param
199
- @@links[where][entry]["href"] = match[2]
200
- @@links[where][entry]["title"] = match[1]
201
- nil
202
- when (sscan.skip /^#{CHUNK_LABEL}/u)
203
- div = nil
204
- chunk = Chunk.hash[where][String.new(sscan[1]).unescape("]")]
205
- case
206
- when (sscan.skip /[ ]*->[ ]*(.*?)\n/u)
207
- chunk.target = sscan[1].strip
208
- when (sscan.skip /[ ]*::[ ]*(.*?)\n/u)
209
- case sscan[1].strip
210
- when "Share" then chunk.share = true
211
- when "Local" then chunk.share = false
212
- else raise "Unknown attribute."
213
- end
214
- when (sscan.skip /[ ]*\#=[ ]*(.*?)\n/u)
215
- sscan[1].split(' ').each_with_index do |param, index|
216
- chunk.params[param][:index] = index
217
- end
218
- when (sscan.skip /[ ]*\+=[ ]*(?:#{CHUNK_BLOCK})?\n/u)
219
- label = sscan[1]
220
- block = sscan.scan_until(END_INDENT)
221
- block = String.new(block).erase(INDENT).trim
222
- label = String.new(label).unescape(")") if label
223
- chunk.push block, label
224
- div =
214
+ when (sscan.skip /[ ]*->[ ]*(.*?)\n/u)
215
+ chunk.target = sscan[1].strip
216
+ when (sscan.skip /[ ]*::[ ]*(.*?)\n/u)
217
+ case sscan[1].strip
218
+ when "Share" then chunk.share = true
219
+ when "Local" then chunk.share = false
220
+ else raise "Unknown attribute."
221
+ end
222
+ when (sscan.skip /[ ]*\#=[ ]*(.*?)\n/u)
223
+ sscan[1].split(' ').each_with_index do |param, index|
224
+ chunk.params[param][:index] = index
225
+ end
226
+ when (sscan.skip /[ ]*\+=[ ]*(?:#{CHUNK_BLOCK})?\n/u)
227
+ label = sscan[1]
228
+ block = sscan.scan_until(END_INDENT)
229
+ block = String.new(block).erase(INDENT).trim
230
+ label = String.new(label).unescape(")") if label
231
+ chunk.push block, label
232
+ div =
233
+ Markup.new("div")
234
+ .add_attrs("id" => chunk.id)
235
+ .add_attrs("class" => "panel")
236
+ .add_elems([
225
237
  Markup.new("div")
226
- .add_attrs("id" => chunk.id)
227
- .add_attrs("class" => "panel")
238
+ .add_attrs("class" => "panel-head")
228
239
  .add_elems([
229
240
  Markup.new("div")
230
- .add_attrs("class" => "panel-head")
241
+ .add_attrs("style" => "float: left; width: 75%;")
231
242
  .add_elems([
232
243
  Markup.new("div")
233
- .add_attrs("style" => "float: left; width: 75%;")
234
- .add_elems([
244
+ .add_attrs("class" => "the-chunk")
245
+ .add_elems(line_elems(where, chunk.label)),
246
+ case
247
+ when label
235
248
  Markup.new("div")
236
- .add_attrs("class" => "the-chunk")
237
- .add_elems(line_elems(where, chunk.label)),
238
- case
239
- when label
240
- Markup.new("div")
241
- .add_attrs("class" => "the-block")
242
- .add_elems(line_elems(where, label))
243
- else nil
244
- end
245
- ]),
246
- Markup.new("div")
247
- .add_attrs("style" => "float: right;")
248
- .add_elems([
249
- Markup.new("a").add_attrs("class" => "panel-link", "href" => BlockRef.new(chunk, chunk.blocks.size - 1)).add_elems(Markup.new("span").add_attrs("class" => "genericons-neue genericons-neue-previous")),
250
- Markup.new("a").add_attrs("class" => "panel-link", "href" => BlockRef.new(chunk, chunk.blocks.size + 1)).add_elems(Markup.new("span").add_attrs("class" => "genericons-neue genericons-neue-next")),
251
- ]),
252
- Markup.new("div").add_attrs("style" => "clear: both;")
249
+ .add_attrs("class" => "the-block")
250
+ .add_elems(line_elems(where, label))
251
+ else nil
252
+ end
253
253
  ]),
254
254
  Markup.new("div")
255
- .add_attrs("class" => "panel-body")
256
- .add_elems(Markup.new("pre").add_elems(highlight(where, block, CPP_HIGHLIGHT)))
257
- ])
258
- end
259
- div
260
- when (sscan.skip ENTER_ASIDE)
261
- text = sscan.scan_until END_INDENT
262
- text = String.new(text).erase INDENT
263
- Markup.new("div")
264
- .add_attrs("class" => "aside")
265
- .add_elems([
255
+ .add_attrs("style" => "float: right;")
256
+ .add_elems([
257
+ Markup.new("a").add_attrs("class" => "panel-link", "href" => BlockRef.new(chunk, chunk.blocks.size - 1)).add_elems(Markup.new("span").add_attrs("class" => "genericons-neue genericons-neue-previous")),
258
+ Markup.new("a").add_attrs("class" => "panel-link", "href" => BlockRef.new(chunk, chunk.blocks.size + 1)).add_elems(Markup.new("span").add_attrs("class" => "genericons-neue genericons-neue-next")),
259
+ ]),
260
+ Markup.new("div").add_attrs("style" => "clear: both;")
261
+ ]),
266
262
  Markup.new("div")
267
- .add_attrs("class" => "icon-holder")
268
- .add_elems(
269
- Markup.new("span")
270
- .add_attrs("class" => "genericons-neue genericons-neue-info")),
271
- page_elems(where, text)
263
+ .add_attrs("class" => "panel-body")
264
+ .add_elems(Markup.new("pre").add_elems(highlight(where, block, CPP_HIGHLIGHT)))
272
265
  ])
273
- when (sscan.skip ENTER_ALERT)
274
- text = sscan.scan_until END_INDENT
275
- text = String.new(text).erase INDENT
266
+ end
267
+ div
268
+ when (sscan.skip ENTER_ASIDE)
269
+ text = sscan.scan_until END_INDENT
270
+ text = String.new(text).erase INDENT
271
+ Markup.new("div")
272
+ .add_attrs("class" => "aside")
273
+ .add_elems([
276
274
  Markup.new("div")
277
- .add_attrs("class" => "alert")
278
- .add_elems([
279
- Markup.new("div")
280
- .add_attrs("class" => "icon-holder")
281
- .add_elems(
282
- Markup.new("span")
283
- .add_attrs("class" => "genericons-neue genericons-neue-notice")),
284
- page_elems(where, text)
285
- ])
286
- when (sscan.skip ENTER_BUG)
275
+ .add_attrs("class" => "icon-holder")
276
+ .add_elems(
277
+ Markup.new("span")
278
+ .add_attrs("class" => "genericons-neue genericons-neue-info")),
279
+ page_elems(where, text)
280
+ ])
281
+ when (sscan.skip ENTER_ALERT)
282
+ text = sscan.scan_until END_INDENT
283
+ text = String.new(text).erase INDENT
284
+ Markup.new("div")
285
+ .add_attrs("class" => "alert")
286
+ .add_elems([
287
+ Markup.new("div")
288
+ .add_attrs("class" => "icon-holder")
289
+ .add_elems(
290
+ Markup.new("span")
291
+ .add_attrs("class" => "genericons-neue genericons-neue-notice")),
292
+ page_elems(where, text)
293
+ ])
294
+ when (sscan.skip ENTER_BUG)
295
+ text = sscan.scan_until END_INDENT
296
+ text = String.new(text).erase INDENT
297
+ Markup.new("div")
298
+ .add_attrs("class" => "alert")
299
+ .add_elems([
300
+ Markup.new("div")
301
+ .add_attrs("class" => "icon-holder")
302
+ .add_elems(
303
+ Markup.new("span")
304
+ .add_attrs("class" => "genericons-neue genericons-neue-bug")),
305
+ page_elems(where, text)
306
+ ])
307
+ when (sscan.skip ENTER_QUOTE)
308
+ text = sscan.scan_until END_INDENT
309
+ text = String.new(text).erase INDENT
310
+ Markup.new("blockquote")
311
+ .add_elems(page_elems(where, text))
312
+ when (sscan.match? ENTER_OLIST)
313
+ list = Markup.new "ol"
314
+ while sscan.skip ENTER_OLIST
287
315
  text = sscan.scan_until END_INDENT
288
316
  text = String.new(text).erase INDENT
289
- Markup.new("div")
290
- .add_attrs("class" => "alert")
291
- .add_elems([
292
- Markup.new("div")
293
- .add_attrs("class" => "icon-holder")
294
- .add_elems(
295
- Markup.new("span")
296
- .add_attrs("class" => "genericons-neue genericons-neue-bug")),
297
- page_elems(where, text)
298
- ])
299
- when (sscan.skip ENTER_QUOTE)
317
+ item = Markup.new "li"
318
+ item.add_elems page_elems(where, text)
319
+ list.add_elems item
320
+ sscan.skip EMPTY_LINES
321
+ end
322
+ list
323
+ when (sscan.match? ENTER_ULIST)
324
+ list = Markup.new "ul"
325
+ while sscan.skip ENTER_ULIST
300
326
  text = sscan.scan_until END_INDENT
301
327
  text = String.new(text).erase INDENT
302
- Markup.new("blockquote")
303
- .add_elems(page_elems(where, text))
304
- when (sscan.match? ENTER_OLIST)
305
- list = Markup.new "ol"
306
- while sscan.skip ENTER_OLIST
307
- text = sscan.scan_until END_INDENT
308
- text = String.new(text).erase INDENT
309
- item = Markup.new "li"
310
- item.add_elems page_elems(where, text)
311
- list.add_elems item
312
- sscan.skip EMPTY_LINES
313
- end
314
- list
315
- when (sscan.match? ENTER_ULIST)
316
- list = Markup.new "ul"
317
- while sscan.skip ENTER_ULIST
318
- text = sscan.scan_until END_INDENT
319
- text = String.new(text).erase INDENT
320
- item = Markup.new "li"
321
- item.add_elems page_elems(where, text)
322
- list.add_elems item
323
- sscan.skip EMPTY_LINES
324
- end
325
- list
326
- when (sscan.match? ENTER_TLIST)
327
- list = Markup.new "ul"
328
- list.add_attrs("class" => "tl")
329
- while sscan.skip ENTER_TLIST
330
- type = sscan[1]
331
- text = sscan.scan_until END_INDENT
332
- text = String.new(text).erase INDENT
333
- item = Markup.new "li"
334
- item.add_attrs("class" =>
335
- case
336
- when (type[0] == " ") then "li-todo"
337
- when (type[0] != " ") then "li-done"
338
- end)
339
- item.add_elems page_elems(where, text)
340
- list.add_elems item
341
- sscan.skip EMPTY_LINES
342
- end
343
- list
344
- when sscan.match?(ENTER_CODE)
328
+ item = Markup.new "li"
329
+ item.add_elems page_elems(where, text)
330
+ list.add_elems item
331
+ sscan.skip EMPTY_LINES
332
+ end
333
+ list
334
+ when (sscan.match? ENTER_TLIST)
335
+ list = Markup.new "ul"
336
+ list.add_attrs("class" => "tl")
337
+ while sscan.skip ENTER_TLIST
338
+ type = sscan[1]
345
339
  text = sscan.scan_until END_INDENT
346
340
  text = String.new(text).erase INDENT
347
- Markup.new("pre")
348
- .add_elems(
349
- Markup.new("code")
350
- .add_elems(String.new(text).trim.html))
351
- when sscan.match?(ENTER_TEXT)
352
- text = sscan.scan_until END_SIMPLE
353
- text = String.new(text).erase EOB_MARKER
354
- Markup.new("p").add_elems(line_elems(where, text))
355
- end)
356
- end
357
- return elems
341
+ item = Markup.new "li"
342
+ item.add_attrs("class" =>
343
+ case
344
+ when (type[0] == " ") then "li-todo"
345
+ when (type[0] != " ") then "li-done"
346
+ end)
347
+ item.add_elems page_elems(where, text)
348
+ list.add_elems item
349
+ sscan.skip EMPTY_LINES
350
+ end
351
+ list
352
+ when sscan.match?(ENTER_CODE)
353
+ text = sscan.scan_until END_INDENT
354
+ text = String.new(text).erase INDENT
355
+ Markup.new("pre")
356
+ .add_elems(
357
+ Markup.new("code")
358
+ .add_elems(String.new(text).trim.html))
359
+ when sscan.match?(ENTER_TEXT)
360
+ text = sscan.scan_until END_SIMPLE
361
+ text = String.new(text).erase EOB_MARKER
362
+ Markup.new("p").add_elems(line_elems(where, text))
363
+ end)
358
364
  end
365
+ return elems
366
+ end
359
367
 
360
- def self.highlight where, input, table
361
- elems = Markup.new
362
- sscan = StringScanner.new input
363
- until sscan.eos?
364
- if sscan.skip /\p{Space}+/um
365
- elems.add_elems(String.new(sscan[0]).html)
366
- next
367
- end
368
- if sscan.skip CHUNK_LABEL
369
- label = String.new(sscan[1]).unescape("]")
370
- elems.add_elems(
371
- Markup.new("a")
372
- .add_attrs("class" => "chunk")
373
- .add_attrs("href" => ChunkRef.new(where, label))
374
- .add_elems(line_elems(where, label)))
375
- next
376
- end
377
- table.each do |entry|
378
- if sscan.skip entry[1]
379
- if entry[0] == nil
380
- elems.add_elems(String.new(sscan[0]).html)
381
- else
382
- elems.add_elems(
383
- Markup.new("span")
384
- .add_attrs("class" => entry[0])
385
- .add_elems(String.new(sscan[0]).html))
386
- end
387
- break
368
+ def self.highlight where, input, table
369
+ elems = Markup.new
370
+ sscan = StringScanner.new input
371
+ until sscan.eos?
372
+ if sscan.skip /\p{Space}+/um
373
+ elems.add_elems(String.new(sscan[0]).html)
374
+ next
375
+ end
376
+ if sscan.skip CHUNK_LABEL
377
+ label = String.new(sscan[1]).unescape("]")
378
+ elems.add_elems(
379
+ Markup.new("a")
380
+ .add_attrs("class" => "chunk")
381
+ .add_attrs("href" => ChunkRef.new(where, label))
382
+ .add_elems(line_elems(where, label)))
383
+ next
384
+ end
385
+ table.each do |entry|
386
+ if sscan.skip entry[1]
387
+ if entry[0] == nil
388
+ elems.add_elems(String.new(sscan[0]).html)
389
+ else
390
+ elems.add_elems(
391
+ Markup.new("span")
392
+ .add_attrs("class" => entry[0])
393
+ .add_elems(String.new(sscan[0]).html))
388
394
  end
395
+ break
389
396
  end
390
397
  end
391
- return elems
392
398
  end
399
+ return elems
400
+ end
393
401
 
394
- end # module Parse
402
+ end # module Parse
395
403
 
396
404
  end # module Schizm
397
-
398
- # puts Schizm::Parse.page_elems('File.zrc', $stdin.read).to_s