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.
- checksums.yaml +4 -4
- data/lib/schizm/chunk.rb +129 -101
- data/lib/schizm/env.rb +49 -14
- data/lib/schizm/env_colors.rb +28 -0
- data/lib/schizm/markup.rb +152 -120
- data/lib/schizm/match.rb +45 -0
- data/lib/schizm/parse.rb +350 -344
- data/lib/schizm/string.rb +179 -150
- data/res/fonts/{fira-code-bold.otf → Fira-Code-Bold.otf} +0 -0
- data/res/fonts/{fira-code-license → Fira-Code-LICENSE} +0 -0
- data/res/fonts/{fira-code-light.otf → Fira-Code-Light.otf} +0 -0
- data/res/fonts/{fira-code-medium.otf → Fira-Code-Medium.otf} +0 -0
- data/res/fonts/{fira-code-regular.otf → Fira-Code-Regular.otf} +0 -0
- data/res/fonts/{fira-code.css → Fira-Code.css} +4 -4
- data/res/fonts/{genericons-neue-license → Genericons-Neue-LICENSE} +0 -0
- data/res/fonts/{genericons-neue.css → Genericons-Neue.css} +0 -0
- data/res/fonts/{genericons-neue.eot → Genericons-Neue.eot} +0 -0
- data/res/fonts/{genericons-neue.ttf → Genericons-Neue.ttf} +0 -0
- data/res/fonts/{genericons-neue.woff2 → Genericons-Neue.woff2} +0 -0
- data/res/fonts/{social-logos-license → Social-Logos-LICENSE} +0 -0
- data/res/fonts/{social-logos.css → Social-Logos.css} +0 -0
- data/res/fonts/{social-logos.eot → Social-Logos.eot} +0 -0
- data/res/fonts/{social-logos.ttf → Social-Logos.ttf} +0 -0
- data/res/fonts/{social-logos.woff2 → Social-Logos.woff2} +0 -0
- data/res/schizm.liquid +4 -4
- data/res/scss/style.scss +1 -1
- metadata +17 -17
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
|
-
|
37
|
+
module Parse
|
11
38
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
45
|
+
# Markup hash accessor.
|
46
|
+
def self.hash
|
47
|
+
return @@hash
|
48
|
+
end
|
35
49
|
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
51
|
-
|
52
|
-
|
64
|
+
# Hash attribute reference.
|
65
|
+
class HashAttr
|
66
|
+
def initialize hash, attr
|
67
|
+
@hash = hash
|
68
|
+
@attr = attr
|
53
69
|
end
|
54
|
-
|
55
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
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
|
101
|
-
|
102
|
-
when
|
103
|
-
|
104
|
-
when
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
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
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
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
|
167
|
-
|
168
|
-
when (sscan.skip
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
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("
|
227
|
-
.add_attrs("class" => "panel")
|
238
|
+
.add_attrs("class" => "panel-head")
|
228
239
|
.add_elems([
|
229
240
|
Markup.new("div")
|
230
|
-
.add_attrs("
|
241
|
+
.add_attrs("style" => "float: left; width: 75%;")
|
231
242
|
.add_elems([
|
232
243
|
Markup.new("div")
|
233
|
-
.add_attrs("
|
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-
|
237
|
-
.add_elems(line_elems(where,
|
238
|
-
|
239
|
-
|
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("
|
256
|
-
.add_elems(
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
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" => "
|
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
|
-
|
274
|
-
|
275
|
-
|
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" => "
|
278
|
-
.add_elems(
|
279
|
-
Markup.new("
|
280
|
-
.add_attrs("class" => "
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
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
|
290
|
-
.
|
291
|
-
.add_elems
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
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
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
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
|
348
|
-
.
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
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
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
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
|
-
|
402
|
+
end # module Parse
|
395
403
|
|
396
404
|
end # module Schizm
|
397
|
-
|
398
|
-
# puts Schizm::Parse.page_elems('File.zrc', $stdin.read).to_s
|