schizm 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7974c85b370377641c71f2530a078dbe7fcbc8a
4
- data.tar.gz: 122f46ff65ee2704ea0da40cc26bb62eedfcef80
3
+ metadata.gz: e2123141f335e7349ec095d5b078acc21f09ed75
4
+ data.tar.gz: 7751549bb232c6cd6d9d4e63e5a3fd5d3a659574
5
5
  SHA512:
6
- metadata.gz: 4d96e2d5a4ee028fe26fdb14f63e05a493ad6a01fe0600697f3c6e377c8ef1050188928c74c28344ed0716c32126191f7894a647694d05dfd7213930aa198931
7
- data.tar.gz: 065ce47ca1aa7e726a9c7f2b551f577d9ead32d02c8f417775b326ba221c20a7fddda6def39ad9aa598205ecdc65a46bf88ab19fa7127675e9bde866faa8d647
6
+ metadata.gz: a5c82e3b896e625eaf65d54dbef821c192f9bbd742beeb1f2a4d0e73e42a258caf9766ca7c96efb2d3db7dd4f13948c0e85c289a20f8f89c948fb04bd2f79d5c
7
+ data.tar.gz: a2919358945784a928cc2d48201e23013ae5ce72983a2bf4e644c055dd1d4381db3877707f84c959dae8ae4bfff209766ef82f55ca7759680d927bddc38afff4
data/lib/schizm/match.rb CHANGED
@@ -33,6 +33,12 @@ module Schizm
33
33
  # Source path, extension put in match group 1.
34
34
  SOURCE_PATH = /^.*\.(c|cc|cpp|cxx|inl|tcc)$/
35
35
 
36
+ # Single quotes.
37
+ QUOTE1_STRING = /'((?:[^\\']*(?:\\.)*)*)'/u
38
+
39
+ # Double quotes.
40
+ QUOTE2_STRING = /"((?:[^\\"]*(?:\\.)*)*)"/u
41
+
36
42
  # Space sequence.
37
43
  SPACE = /\p{Space}+/u
38
44
 
@@ -100,13 +106,22 @@ module Schizm
100
106
  CHAR_ESCAPE = /\\(.)/u
101
107
 
102
108
  # Link definition, content put in match group 1, params put in match group 2.
103
- LINK_DEF = /^\((#{DELIM_PARENS})\):[ ]*(.*)[ ]*\n/u
109
+ LINK_DEF = /^\[(#{DELIM_BRACKS})\]:[ ]*(.*)[ ]*\n/u
104
110
 
105
111
  # Link reference, content put in match group 1, params put in match group 2.
106
- LINK_REF = /\[(#{DELIM_BRACKS})\]\((#{DELIM_PARENS})\)/um
112
+ LINK_REF_BRACKS = /\[(#{DELIM_BRACKS})\]\[(#{DELIM_BRACKS})\]/um
113
+
114
+ # Link reference, content put in match group 1, params put in match group 2.
115
+ LINK_REF_PARENS = /\[(#{DELIM_BRACKS})\]\((#{DELIM_PARENS})\)/um
116
+
117
+ # Image definition, entry put in match group 1, params put in match group 2.
118
+ IMAGE_DEF = /^!\[(#{DELIM_BRACKS})\]:[ ]*(.*)[ ]*\n/u
119
+
120
+ # Image reference, alt put in match group 1, params put in match group 2.
121
+ IMAGE_REF_PARENS = /!\[(#{DELIM_BRACKS})\]\((#{DELIM_PARENS})\)/u
107
122
 
108
- # Link params, title put in match group 1, target put in match group 2.
109
- LINK_PARAMS = /(?:"(.+?)"[ ]+)?(.+)/um
123
+ # Image reference, alt put in match group 1, params put in match group 2.
124
+ IMAGE_REF_BRACKS = /!\[(#{DELIM_BRACKS})\]\[(#{DELIM_BRACKS})\]/u
110
125
 
111
126
  # Center math, content put in match group 1.
112
127
  CENTER_MATH = /[$][$]((?:[^\\$]*(?:\\.)*)*)[$][$]/um
@@ -162,16 +177,16 @@ module Schizm
162
177
  ENTER_BUG = /^[ ]{0,3}[(][?][)]/u
163
178
 
164
179
  # Enter olist element.
165
- ENTER_OLIST = /^[ ]{0,3}--[#]/u
180
+ ENTER_OLIST = /^[ ]{0,3}--?[#]/u
166
181
 
167
182
  # Enter ulist element.
168
- ENTER_ULIST = /^[ ]{0,3}--[%]/u
183
+ ENTER_ULIST = /^[ ]{0,3}--?[%]/u
169
184
 
170
185
  # Enter tlist element, content put in match group 1.
171
186
  ENTER_TLIST = /^[ ]{0,3}\[([x ])\]/u
172
187
 
173
188
  # Enter dlist element, content put in match group 1.
174
- ENTER_DLIST = /^[ ]{0,3}\[(#{DELIM_BRACKS})\]:/u
189
+ ENTER_DLIST = /^[ ]{0,3}(.*?)::/u
175
190
 
176
191
  # Enter code block.
177
192
  ENTER_CODE = /^[ ]{4,}(?=\p{Graph})/u
@@ -186,11 +201,11 @@ module Schizm
186
201
  [/\(r\)/ui, 174], # Registered.
187
202
  [/\+-/u, 177], # Plus minus.
188
203
  [/==/u, 8801], # Identical.
189
- [/~=/u, 8773], # Congruent.
204
+ [/=~/u, 8773], # Congruent.
190
205
  [/!=/u, 8800], # Not equal.
191
206
  [/<=/u, 8804], # Less equal.
192
207
  [/>=/u, 8805], # Greater equal.
193
- [/~~/u, 8776], # Approximately.
208
+ [/~=/u, 8776], # Approximately.
194
209
  [/--/u, 8211], # En dash.
195
210
  [/---/u, 8212], # Em dash.
196
211
  [/\.{3}/u, 8230], # Ellipsis.
data/lib/schizm/parse.rb CHANGED
@@ -1,18 +1,18 @@
1
1
  # Copyright (c) 2017 M. Grady Saunders
2
- #
2
+ #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions
5
5
  # are met:
6
- #
6
+ #
7
7
  # 1. Redistributions of source code must retain the above
8
8
  # copyright notice, this list of conditions and the following
9
9
  # disclaimer.
10
- #
10
+ #
11
11
  # 2. Redistributions in binary form must reproduce the above
12
12
  # copyright notice, this list of conditions and the following
13
13
  # disclaimer in the documentation and/or other materials
14
14
  # provided with the distribution.
15
- #
15
+ #
16
16
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
17
  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
18
  # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
@@ -61,6 +61,18 @@ module Parse
61
61
  return @@links
62
62
  end
63
63
 
64
+ @@images =
65
+ Hash.new do |hash, where|
66
+ hash[where] =
67
+ Hash.new do |hash, entry|
68
+ hash[entry] = Hash.new
69
+ end
70
+ end
71
+
72
+ def self.images
73
+ return @@images
74
+ end
75
+
64
76
  # Hash attribute reference.
65
77
  class HashAttr
66
78
  def initialize hash, attr
@@ -116,7 +128,7 @@ module Parse
116
128
  max_glyph = glyph
117
129
  end
118
130
  end
119
- sscan.pointer =
131
+ sscan.pointer =
120
132
  sscan.pointer + max_glyph_len
121
133
  return false if max_glyph_len == 0
122
134
  return true
@@ -128,23 +140,31 @@ module Parse
128
140
  when sscan.skip(HTML_ENTITY) then sscan[0]
129
141
  when sscan.skip(HTML_ESCAPE) then sscan[0].codepoints[0]
130
142
  when sscan.skip(CHAR_ESCAPE) then sscan[0].codepoints[0]
131
- when sscan.skip(LINK_REF)
132
- attrs = Hash.new
133
- attrs["target"] = "_blank"
143
+ when sscan.skip(LINK_REF_PARENS)
134
144
  shown = String.new(sscan[1]).unescape("]")
135
145
  param = String.new(sscan[2]).unescape(")")
136
- param = LINK_PARAMS.match(param)
137
- if (param[2] =~ URI::regexp)
138
- attrs["href"] = param[2]
139
- attrs["title"] = param[1]
140
- else
141
- entry = param[2]
142
- attrs["href"] = HashAttr.new @@links[where][entry], "href"
143
- attrs["title"] = HashAttr.new @@links[where][entry], "title"
146
+ attrs = Hash.new
147
+ sscan2 = StringScanner.new(param)
148
+ until sscan2.eos?
149
+ case
150
+ when sscan2.skip(QUOTE1_STRING) then attrs["title"] = String.new(sscan2[1]).unescape("'")
151
+ when sscan2.skip(QUOTE2_STRING) then attrs["title"] = String.new(sscan2[1]).unescape("\"").gsub(/"/u, "'")
152
+ when sscan2.skip(/\p{Graph}+/u) then attrs["href"] = sscan2[0]
153
+ when sscan2.skip(/\p{Space}+/u) then nil
154
+ end
144
155
  end
145
156
  Markup.new("a")
157
+ .add_attrs("target" => "_blank")
146
158
  .add_attrs(attrs)
147
159
  .add_elems(line_elems(where, shown))
160
+ when sscan.skip(LINK_REF_BRACKS)
161
+ shown = String.new(sscan[1]).unescape("]")
162
+ param = String.new(sscan[2]).unescape("]")
163
+ Markup.new("a")
164
+ .add_attrs("target" => "_blank")
165
+ .add_attrs("title" => HashAttr.new(@@links[where][param], "title"))
166
+ .add_attrs("href" => HashAttr.new(@@links[where][param], "href"))
167
+ .add_elems(line_elems(where, shown))
148
168
  when sscan.skip(CENTER_MATH)
149
169
  Markup.new("script")
150
170
  .add_attrs(CENTER_MATH_ATTRS)
@@ -194,11 +214,11 @@ module Parse
194
214
  until sscan.eos?
195
215
  elems.add_elems(
196
216
  case
197
- when (sscan.skip EMPTY_LINE) then nil
198
- when (sscan.skip EOB_MARKER) then nil
199
- when (sscan.skip HRULE)
217
+ when sscan.skip(EMPTY_LINE) then nil
218
+ when sscan.skip(EOB_MARKER) then nil
219
+ when sscan.skip(HRULE)
200
220
  Markup.new "hr"
201
- when (sscan.skip HEADING_ATX)
221
+ when sscan.skip(HEADING_ATX)
202
222
  type = String.new sscan[1]
203
223
  text = String.new sscan[2]
204
224
  slug = text.slugify
@@ -211,7 +231,7 @@ module Parse
211
231
  when 5 then "h5"
212
232
  when 6 then "h6"
213
233
  end).add_elems(line_elems(where, text))
214
- when (sscan.skip HEADING_SETEXT)
234
+ when sscan.skip(HEADING_SETEXT)
215
235
  type = String.new sscan[2]
216
236
  text = String.new sscan[1]
217
237
  slug = text.slugify
@@ -222,30 +242,72 @@ module Parse
222
242
  end).add_attrs("id" => slug)
223
243
  .add_attrs("class" => "title")
224
244
  .add_elems(line_elems(where, text))
225
- when (sscan.skip LINK_DEF)
226
- entry = String.new(sscan[1]).unescape(")")
227
- param = String.new(sscan[2])#.unescape("]")
228
- param_match = LINK_PARAMS.match param
229
- @@links[where][entry]["href"] = param_match[2]
230
- @@links[where][entry]["title"] = param_match[1]
245
+ when sscan.skip(LINK_DEF)
246
+ entry = String.new(sscan[1]).unescape("]")
247
+ sscan2 = StringScanner.new(sscan[2])
248
+ until sscan2.eos?
249
+ case
250
+ when sscan2.skip(QUOTE1_STRING) then @@links[where][entry]["title"] = String.new(sscan2[1]).unescape("'")
251
+ when sscan2.skip(QUOTE2_STRING) then @@links[where][entry]["title"] = String.new(sscan2[1]).unescape("\"").gsub(/"/u, "'")
252
+ when sscan2.skip(/\p{Graph}+/u) then @@links[where][entry]["href"] = sscan2[0]
253
+ when sscan2.skip(/\p{Space}+/u) then nil
254
+ end
255
+ end
231
256
  nil
232
- when (sscan.skip /^#{CHUNK_LABEL}/u)
257
+ when sscan.skip(IMAGE_DEF)
258
+ entry = String.new(sscan[1]).unescape("]")
259
+ sscan2 = StringScanner.new(sscan[2])
260
+ until sscan2.eos?
261
+ case
262
+ when sscan2.skip(/w=(\d+)/u) then @@images[where][entry]["width"] = sscan2[1]
263
+ when sscan2.skip(/h=(\d+)/u) then @@images[where][entry]["height"] = sscan2[1]
264
+ when sscan2.skip(/\p{Graph}+/u) then @@images[where][entry]["src"] = sscan2[0]
265
+ when sscan2.skip(/\p{Space}+/u) then nil
266
+ end
267
+ end
268
+ when sscan.skip(/^[ ]{0,3}#{IMAGE_REF_PARENS}$/u)
269
+ alt = String.new(sscan[1]).unescape("]")
270
+ param = String.new(sscan[2]).unescape(")")
271
+ sscan2 = StringScanner.new(param)
272
+ attrs = Hash.new
273
+ until sscan2.eos?
274
+ case
275
+ when sscan2.skip(/w=(\d+)/u) then attrs["width"] = sscan2[1]
276
+ when sscan2.skip(/h=(\d+)/u) then attrs["height"] = sscan2[1]
277
+ when sscan2.skip(/\p{Graph}+/u) then attrs["src"] = sscan2[0]
278
+ when sscan2.skip(/\p{Space}+/u) then nil
279
+ end
280
+ end
281
+ Markup.new("img")
282
+ .add_attrs("alt" => alt)
283
+ .add_attrs(attrs)
284
+ when sscan.skip(/^[ ]{0,3}#{IMAGE_REF_BRACKS}$/u)
285
+ alt = String.new(sscan[1]).unescape("]")
286
+ entry = String.new(sscan[2]).unescape("]")
287
+ Markup.new("img")
288
+ .add_attrs("alt" => alt)
289
+ .add_attrs("src" => HashAttr.new(@@images[where][entry], "src"))
290
+ .add_attrs("width" => HashAttr.new(@@images[where][entry], "width"))
291
+ .add_attrs("height" => HashAttr.new(@@images[where][entry], "height"))
292
+ when sscan.skip(/^#{CHUNK_LABEL}/u)
233
293
  div = nil
234
294
  chunk = Chunk.hash[where][String.new(sscan[1]).unescape("]")]
235
295
  case
236
- when (sscan.skip /[ ]*->[ ]*(.*?)\n/u)
296
+ when sscan.skip(/[ ]*->[ ]*(.*?)\n/u)
237
297
  chunk.target = sscan[1].strip
238
- when (sscan.skip /[ ]*::[ ]*(.*?)\n/u)
298
+ when sscan.skip(/[ ]*::[ ]*(.*?)\n/u)
239
299
  case sscan[1].strip
240
300
  when "Share" then chunk.share = true
241
301
  when "Local" then chunk.share = false
242
302
  else raise "Unknown attribute."
243
303
  end
244
- when (sscan.skip /[ ]*\#=[ ]*(.*?)\n/u)
304
+ =begin
305
+ when sscan.skip(/[ ]*\#=[ ]*(.*?)\n/u)
245
306
  sscan[1].split(' ').each_with_index do |param, index|
246
307
  chunk.params[param][:index] = index
247
308
  end
248
- when (sscan.skip /[ ]*\+=[ ]*(?:#{CHUNK_BLOCK})?\n/u)
309
+ =end
310
+ when sscan.skip(/[ ]*\+=[ ]*(?:#{CHUNK_BLOCK})?\n/u)
249
311
  label = sscan[1]
250
312
  block = sscan.scan_until(END_INDENT)
251
313
  block = String.new(block).erase(INDENT).trim
@@ -287,7 +349,7 @@ module Parse
287
349
  ])
288
350
  end
289
351
  div
290
- when (sscan.skip ENTER_ASIDE)
352
+ when sscan.skip(ENTER_ASIDE)
291
353
  text = sscan.scan_until END_INDENT
292
354
  text = String.new(text).erase INDENT
293
355
  Markup.new("div")
@@ -300,7 +362,7 @@ module Parse
300
362
  .add_attrs("class" => "genericons-neue genericons-neue-info")),
301
363
  page_elems(where, text)
302
364
  ])
303
- when (sscan.skip ENTER_ALERT)
365
+ when sscan.skip(ENTER_ALERT)
304
366
  text = sscan.scan_until END_INDENT
305
367
  text = String.new(text).erase INDENT
306
368
  Markup.new("div")
@@ -313,7 +375,7 @@ module Parse
313
375
  .add_attrs("class" => "genericons-neue genericons-neue-notice")),
314
376
  page_elems(where, text)
315
377
  ])
316
- when (sscan.skip ENTER_BUG)
378
+ when sscan.skip(ENTER_BUG)
317
379
  text = sscan.scan_until END_INDENT
318
380
  text = String.new(text).erase INDENT
319
381
  Markup.new("div")
@@ -326,7 +388,7 @@ module Parse
326
388
  .add_attrs("class" => "genericons-neue genericons-neue-bug")),
327
389
  page_elems(where, text)
328
390
  ])
329
- when (sscan.skip ENTER_QUOTE)
391
+ when sscan.skip(ENTER_QUOTE)
330
392
  text = sscan.scan_until END_INDENT
331
393
  text = String.new(text).erase INDENT
332
394
  Markup.new("blockquote")
@@ -371,7 +433,6 @@ module Parse
371
433
  while sscan.skip ENTER_DLIST
372
434
  term = sscan[1]
373
435
  text = sscan.scan_until END_INDENT
374
- term = String.new(term).unescape("]")
375
436
  text = String.new(text).erase INDENT
376
437
  list.add_elems(Markup.new("dt").add_elems(line_elems(where, term)))
377
438
  list.add_elems(Markup.new("dd").add_elems(page_elems(where, text)))
data/res/scss/style.scss CHANGED
@@ -177,7 +177,7 @@ hr {
177
177
  padding-left: 48pt;
178
178
  padding-right: 48pt;
179
179
  margin-left: 192pt;
180
- max-width: 512pt;
180
+ max-width: 384pt;
181
181
  min-width: 192pt;
182
182
  }
183
183
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schizm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - M. Grady Saunders