martile 1.4.6 → 1.5.0

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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/martile.rb +323 -295
  4. data.tar.gz.sig +0 -0
  5. metadata +37 -36
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3072339279e9010415dab6b0aac593b625ad7fddce9895449cdf90d750ad6e82
4
- data.tar.gz: b32add46e7c651c1311778ca3ca25eaa8e171540d4bab14f23404218ad750730
3
+ metadata.gz: 18c6765c2caf1958e7ced7e78348e16fc3368e1f87854c822a45ecbfc66b9b10
4
+ data.tar.gz: 81b3ae3967ad9604521bf18723f4adf4894e7d26d2d6e0f7d8d603eb930b3285
5
5
  SHA512:
6
- metadata.gz: 8a52f3f5dec66a4c3b8c696657285c5e18ddd6ebcd76d2f0c26b02a9ca0f0d6374c93973a87374281e736aaec3b0e5d89ee763b2d00905768cd614f41ead6c39
7
- data.tar.gz: 5faf6a84bc1b8b587674c9b74677ff5a25ae343d225e735bf652dd37fd465fe883e30e0e5177672f74b33121c397c3df2d168d1435ff25a20d773d1057bd474f
6
+ metadata.gz: 5b95868a57546459aa12ea73df25e4963007c49eef727cfc6697c9e6d6cd0d8c15663def19a0e5ef62e6f5c8cdeef95fcd4b008cca704da528bbb10f40e58dfa
7
+ data.tar.gz: 182633395847fc88e7f9375112a9ff9fe11d8e3956492a37c2f17427b168610ff20e9792ea3b6a4a1caa6b1d922907389be287e1bd9825148569e3a3ab4846ff
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/martile.rb CHANGED
@@ -15,9 +15,12 @@ require 'jsmenubuilder'
15
15
  require 'htmlcom'
16
16
 
17
17
 
18
+ # bug fix: 01-Feb-2022 When a Martile document has nomarkdown2 tags applied,
19
+ # they will no longer be applied from a
20
+ # nested Martile statement
18
21
  # feature: 01-Sep-2020 Introduced the nomarkdown tag and nomarkdown2 tag.
19
- # The nomarkdown2 tag has the advantage of being used
20
- # inside tags which other Markdown parse don't read.
22
+ # The nomarkdown2 tag has the advantage of being used
23
+ # inside tags which other Markdown parse don't read.
21
24
  # The tag will remove itself before completion to_s.
22
25
  # feature: 08-Aug-2020 Implemented #to_Webpage
23
26
  # improvement: 23-Apr-2020 A self-closing sidenav tag is now valid
@@ -25,61 +28,61 @@ require 'htmlcom'
25
28
  # feature: 29-Feb-2020 The sidenav tag can now contain a raw hierachical list
26
29
  # feature: 22-Jan-2020 An HtmlCom::Accordion component can now be generated
27
30
  # using the tag <accordion>
28
- # feature: 16-Sep-2019 An HTML Tree component can now be generated when
31
+ # feature: 16-Sep-2019 An HTML Tree component can now be generated when
29
32
  # the tag <sidebar/> is used
30
33
  # feature: 16-Jul-2019 An HTML Tabs component can now be created from XML
31
34
  # XML can now be created using !tag notation e.g. !tabs
32
35
  # feature: 05-May-2019 Dimensions can now be supplied for an iframe
33
36
  # improvment: 06-Mar-2019 Checks for mindmap tags outside of other tags
34
- # feature: 03-Mar-2019 A high level mindmap with associated doc can now be
37
+ # feature: 03-Mar-2019 A high level mindmap with associated doc can now be
35
38
  # easily created using the -mm---identifier
36
- # bug fix: 25-Feb-2019 The section content is now rendered using to_s
39
+ # bug fix: 25-Feb-2019 The section content is now rendered using to_s
37
40
  # instead of to_html
38
- # feature: 16-Feb-2019 A hidden field cam now be rendered using
39
- # the syntax [? name: value]
40
- # feature: 11-Feb-2019 An apostrophe used between words is now preserved
41
+ # feature: 16-Feb-2019 A hidden field cam now be rendered using
42
+ # the syntax [? name: value]
43
+ # feature: 11-Feb-2019 An apostrophe used between words is now preserved
41
44
  # from Kramdown HTML rendering
42
- # feature: 23-Dec-2018 A SectionX or KVX object can now be referenced
45
+ # feature: 23-Dec-2018 A SectionX or KVX object can now be referenced
43
46
  # from interpolated variables
44
- # feature: 17-Dec-2018 Now automatically generates a toc when there are 3
47
+ # feature: 17-Dec-2018 Now automatically generates a toc when there are 3
45
48
  # sections or more
46
49
  # feature: 3-Oct-2018 An embed tag can now be used to dynamically load content
47
- # bug fix: 26-Sep-2018 An extra new line is added after a code block to
48
- # ensure the line directly below it is transformed to
50
+ # bug fix: 26-Sep-2018 An extra new line is added after a code block to
51
+ # ensure the line directly below it is transformed to
49
52
  # HTML correctly.
50
- # bug fix: 23-Sep-2018 mindmap tag is now properly
53
+ # bug fix: 23-Sep-2018 mindmap tag is now properly
51
54
  # transformed before parse__data__
52
55
  # feature: 23-Jul-2018 An HTML form can now be generated
53
- # feature: 12-Feb-2018 Transforms <mindmap> tags into a
56
+ # feature: 12-Feb-2018 Transforms <mindmap> tags into a
54
57
  # mindmap + related headings
55
58
  # feature: 8-Feb-2018 A section attribute id can now include a dash (-).
56
- # Markdown inside a section element is no longer
59
+ # Markdown inside a section element is no longer
57
60
  # rendered by RDiscount
58
- # minor improvement: 29-Sep-2017 A Markdownviz or Flowchartviz embedded
61
+ # minor improvement: 29-Sep-2017 A Markdownviz or Flowchartviz embedded
59
62
  # document can now be declared without the word viz at the end.
60
- # feature: 21-Sep-2017 A qrcode can now be rendered
63
+ # feature: 21-Sep-2017 A qrcode can now be rendered
61
64
  # e.g. !q[](http://github.com)
62
65
  # feature: 16-Sep-2017 A Flowchartviz raw document can now be embedded
63
66
  # feature: 9-Sep-2017 A Mindmapviz raw document can now be embedded
64
67
  # feature: 8-Sep-2017 An SVG doc can now be embedded from !s[]()
65
- # feature: 6-Sep-2017 The preparation of a Dynarex table in Markdown is now
68
+ # feature: 6-Sep-2017 The preparation of a Dynarex table in Markdown is now
66
69
  # done from the Dynarex object
67
- # bug fix: 13-Aug-2017 bug fixes: A markdown table is no longer interpreted
68
- # as <code> and a string containig a caret is no longer
69
- # interpreted as <nark> if it contains non
70
+ # bug fix: 13-Aug-2017 bug fixes: A markdown table is no longer interpreted
71
+ # as <code> and a string containig a caret is no longer
72
+ # interpreted as <nark> if it contains non
70
73
  # alphanumerical characters.
71
- # feature: 28-May-2017 Within the context of an embedded Dynarex table,
74
+ # feature: 28-May-2017 Within the context of an embedded Dynarex table,
72
75
  # the nomarkdown extension was wrapped around the inner HTML for each column
73
- #
76
+ #
74
77
  # Return characters are now stripped out.
75
78
  #
76
- # An embeded Dynarex table contents are now rendered to
79
+ # An embeded Dynarex table contents are now rendered to
77
80
  # Markdown by default
78
- # feature: 11-Mar-2017 A details and summary tag can now be generated from +>
81
+ # feature: 11-Mar-2017 A details and summary tag can now be generated from +>
79
82
  # e.g.
80
83
  # !+
81
84
  # This a paragraph
82
- #
85
+ #
83
86
  # ----------------
84
87
  #
85
88
  # * something
@@ -94,52 +97,64 @@ class Martile
94
97
 
95
98
  attr_reader :to_s, :to_html, :data_source
96
99
 
97
- def initialize(raw_s='', ignore_domainlabel: nil, toc: true, debug: false,
98
- log: nil)
100
+ # embedded: Is the Martile object being run inside another Martile object?
101
+ #
102
+ def initialize(raw_s='', ignore_domainlabel: nil, toc: true,
103
+ embedded: false, debug: false, log: nil)
99
104
 
100
105
 
101
106
  @debug = debug
102
107
  @data_source = {}
103
-
108
+
104
109
  @ignore_domainlabel, @log = ignore_domainlabel, log
105
-
110
+
106
111
  @css, @js = [], []
107
112
 
108
113
  raw_s.gsub!("\r",'')
109
-
114
+
110
115
  mmd = MindmapDoc.new(debug: debug)
111
116
  s5 = apply_filter(raw_s) {|x| mmd.to_mmd(x) }
112
117
  s10 = apply_filter(s5) {|x| mmd.transform(s5) }
113
118
  #puts 's10: ' + s10.inspect if debug
114
119
  #s10 = raw_s
115
120
  s20 = s10 =~ /^__DATA__$/ ? parse__data__(s10) : s10
116
- puts ('s20: ' + s20.inspect).debug if debug
117
-
121
+ puts ('s20: ' + s20.inspect).debug if debug
122
+
118
123
  s30 = apply_filter(s20) {|x| slashpre x }
124
+ puts ('s30: ' + s30.inspect).debug if @debug
125
+
119
126
  #puts 's1 : ' + s1.inspect
120
127
  s40 = apply_filter(s30) {|x| code_block_to_html(x.strip + "\n") }
128
+ puts ('s40: ' + s40.inspect).debug if @debug
129
+
130
+ s45 = if !embedded then
131
+ s40.gsub(/<pre[^>]*>/,'\0{::nomarkdown2}').gsub(/<\/pre>/,'{:2/}\0')
132
+ else
133
+ s40
134
+ end
135
+ puts ('s45: ' + s45.inspect).debug if @debug
121
136
 
122
- s45 = s40.gsub(/<pre[^>]*>/,'\0{::nomarkdown2}').gsub(/<\/pre>/,'{:2/}\0')
123
137
  #puts 's2 : ' + s2.inspect
124
138
  #s3 = apply_filter(s2, %w(ol ul)) {|x| explicit_list_to_html x }
125
139
  #puts 's3 : ' + s3.inspect
126
140
  s50 = apply_filter(s45) {|x| ordered_list_to_html x }
127
- #puts 's4 : ' + s4.inspect
141
+ puts ('s50: ' + s50.inspect).debug if @debug
128
142
 
129
143
  s60 = apply_filter(s50) {|x| unordered_list_to_html x }
130
- #puts 's5 : ' + s5.inspect
144
+ puts ('s60: ' + s60.inspect).debug if @debug
131
145
 
132
146
  s70 = apply_filter(s60) {|x| dynarex_to_markdown x }
133
- #puts 's6 :' + s6.inspect
147
+ puts ('s70: ' + s70.inspect).debug if @debug
134
148
 
135
149
  s80 = apply_filter(s70) {|x| table_to_html x }
136
- #puts 's7 : ' + s7.inspect
150
+ puts ('s80: ' + s80.inspect).debug if @debug
137
151
 
138
152
  s90 = apply_filter(s80) {|x| underline x}
139
153
  puts ('s90: ' + s90.inspect).debug if @debug
154
+
140
155
  s100 = apply_filter(s90) {|x| section x }
141
156
  puts ('s100: ' + s100.inspect).debug if @debug
142
-
157
+
143
158
  s110 = apply_filter(s100) {|x| smartlink x }
144
159
 
145
160
  puts 's110: ' + s110.inspect if @debug
@@ -147,69 +162,82 @@ class Martile
147
162
  #s11 = section s9
148
163
  #puts 's11 : ' + s11.inspect
149
164
  s120 = apply_filter(s110) {|x| audiotag x }
150
- #puts 's12 : ' + s12.inspect
165
+ puts 's120 : ' + s120.inspect if @debug
151
166
  s130 = apply_filter(s120) {|x| videotag x }
152
- #puts 's13 : ' + s13.inspect
167
+ puts 's130 : ' + s130.inspect if @debug
153
168
  s140 = apply_filter(s130) {|x| iframetag x }
154
- #puts 's14 : ' + s14.inspect
169
+ puts 's140 : ' + s140.inspect if @debug
155
170
  s150 = apply_filter(s140) {|x| kvx_to_dl x }
156
- #puts 's15 : ' + s15.inspect
171
+ puts 's150 : ' + s150.inspect if @debug
157
172
  s160 = apply_filter(s150) {|x| list_item_to_hyperlink x }
173
+ puts 's160 : ' + s160.inspect if @debug
158
174
  s165 = apply_filter(s160) {|x| formify x }
159
- #puts 's16 : ' + s16.inspect
175
+ puts 's165 : ' + s165.inspect if @debug
160
176
  s170 = apply_filter(s165) {|x| mtlite_utils x }
177
+ puts 's170 : ' + s170.inspect if @debug
161
178
  s180 = apply_filter(s170) {|x| hyperlinkify x }
179
+ puts 's180 : ' + s180.inspect if @debug
162
180
  s190 = apply_filter(s180) {|x| highlight x }
181
+ puts 's190 : ' + s190.inspect if @debug
163
182
  s200 = apply_filter(s190) {|x| details x }
183
+ puts 's200 : ' + s200.inspect if @debug
164
184
  s210 = apply_filter(s200) {|x| qrcodetag x }
185
+ puts 's210 : ' + s210.inspect if @debug
165
186
  s220 = apply_filter(s210) {|x| svgtag x }
187
+ puts 's220 : ' + s220.inspect if @debug
166
188
  s230 = apply_filter(s220) {|x| embedtag x }
189
+ puts 's230 : ' + s230.inspect if @debug
167
190
  s240 = apply_filter(s230) {|x| script_out x }
191
+ puts 's240 : ' + s240.inspect if @debug
168
192
  s245 = s240.gsub(/\{::nomarkdown2\}/,'').gsub(/\{:2\/\}/,'')
193
+ puts 's245 : ' + s245.inspect if @debug
169
194
  @to_s = s245.to_s
170
-
195
+
171
196
  s250 = apply_filter(s245) {|x| nomarkdown x }
197
+ puts 's250 : ' + s250.inspect if @debug
172
198
  s252 = sidenav(s250)
199
+ puts 's252 : ' + s252.inspect if @debug
173
200
  s253 = bang_xml(s252)
174
- puts ('s235 after bang_xml: ' + s253.inspect).debug if @debug
201
+ puts ('s253 after bang_xml: ' + s253.inspect).debug if @debug
175
202
 
176
203
  s255 = tabs(s253)
177
204
  puts ('s255 after tabs: ' + s255.inspect).debug if @debug
178
-
205
+
179
206
  s257 = accordion(s255)
180
-
181
- toc = false if s257 =~ /class=['"]sidenav['"]>/
182
-
207
+ puts 's257 : ' + s257.inspect if @debug
208
+
209
+ toc = false if s257 =~ /class=['"]sidenav['"]>/
210
+
183
211
  s260 = if toc then
184
212
  Yatoc.new(Kramdown::Document.new(s257).to_html, debug: debug).to_html
185
213
  else
186
214
  s257
187
215
  end
188
-
189
- puts ('s260: ' + s260.inspect).debug if debug
216
+
217
+ puts ('s260: ' + s260.inspect).debug if debug
190
218
  #puts 's17 : ' + s17.inspect
191
219
 
192
220
  @to_html = s260
193
-
221
+
194
222
  end
195
-
223
+
196
224
  def create_form(s)
197
225
 
198
226
  a = LineTree.new(s, ignore_blank_lines: true).to_a
199
-
227
+
200
228
  def create_form_input(raw_name)
201
229
 
202
230
  name = raw_name.downcase[/\w+/]
203
231
  type = name =~ /password/ ? :password : :text
204
232
 
205
- ['div', {},
206
- ['label', {for: name}, raw_name],
233
+ ['div', {},
234
+ ['label', {for: name}, raw_name],
207
235
  ['input', {type: type, id: name, name: name}]
208
236
  ]
209
237
  end
210
-
238
+
211
239
  a2 = a[0][1..-1].select {|x| x[0] =~ /[^:]+\:/}.map do |items|
212
-
240
+
213
241
  line = items[0]
214
242
  case line
215
243
  when /^\w/
@@ -228,21 +256,21 @@ class Martile
228
256
  doc = Rexle.new(a2)
229
257
  doc.root.element('div/input').attributes['autofocus'] = 'true'
230
258
  doc.xml pretty: true, declaration: false
231
-
259
+
232
260
  end
233
-
261
+
234
262
  def to_css()
235
263
  @css.join("\n")
236
264
  end
237
-
265
+
238
266
  def to_js()
239
267
  @js.join("\n")
240
268
  end
241
-
269
+
242
270
  def to_webpage()
243
271
 
244
272
  a = RexleBuilder.build do |xml|
245
- xml.html do
273
+ xml.html do
246
274
  xml.head do
247
275
  xml.meta name: "viewport", content: \
248
276
  "width=device-width, initial-scale=1"
@@ -252,58 +280,58 @@ class Martile
252
280
  end
253
281
  end
254
282
 
255
- doc = Rexle.new(a)
256
-
283
+ doc = Rexle.new(a)
284
+
257
285
  doc.root.element('body').add \
258
- Rexle::Element.new('script').add_text "\n" +
286
+ Rexle::Element.new('script').add_text "\n" +
259
287
  @js.join("\n").gsub(/^ +\/\/[^\n]+\n/,'')
260
-
288
+
261
289
  "<!DOCTYPE html>\n" + doc.xml(pretty: true, declaration: false)\
262
290
  .gsub(/<\/div>/,'\0' + "\n").gsub(/\n *<!--[^>]+>/,'')
263
-
291
+
264
292
  end
265
-
293
+
266
294
  private
267
-
295
+
268
296
  def accordion(s1)
269
-
297
+
270
298
  s = s1.clone
271
-
299
+
272
300
  doc = Rexle.new("<root>#{s}</root>")
273
301
  puts 'doc.root.xml: ' + doc.root.xml.inspect if @debug
274
302
  a = doc.root.xpath('accordion').map.with_index do |e, i |
275
-
303
+
276
304
  build = HtmlCom::Accordion.new(e.xml, debug: false)
277
-
305
+
278
306
  if i < 1 then
279
- @css << build.to_css
307
+ @css << build.to_css
280
308
  @js << build.to_js
281
309
  end
282
-
310
+
283
311
  build.to_html
284
-
285
-
312
+
313
+
286
314
  end
287
315
  puts 'accordion a:' + a.inspect if @debug
288
316
 
289
317
  # replaces the <accordion> XML with HTML
290
318
  a.each do |html|
291
-
319
+
292
320
  istart = s =~ /^<accordion[^>]*>/
293
321
  iend = s =~ /<\/accordion>/
294
322
  s.slice!(istart, (iend - istart) + '</accordion>'.length + 1)
295
323
  s.insert(istart, html)
296
-
324
+
297
325
  end
298
-
326
+
299
327
  return s
300
-
301
- end
302
-
328
+
329
+ end
330
+
303
331
  def audiotag(s)
304
-
332
+
305
333
  s.gsub(/\B!a\[\]\((https?:\/\/[^\)]+)\)\B/) do |x|
306
-
334
+
307
335
  files = ($1).split
308
336
 
309
337
  h = {/\.ogg$/ => 'ogg', /\.wav$/ => 'wav', /\.mp3$/ => 'mp3' }
@@ -314,17 +342,17 @@ class Martile
314
342
  end
315
343
 
316
344
  "<audio controls='controls'>\n%s\n</audio>" % [sources.join("\n")]
317
- end
345
+ end
318
346
 
319
347
  end
320
-
348
+
321
349
  def bang_xml(s)
322
350
 
323
- indent = -> (line) { ' ' + line }
324
- a = s.split(/(?=^\!\w+)/)
325
-
351
+ indent = -> (line) { ' ' + line }
352
+ a = s.split(/(?=^\![a-zA-Z]+)/)
353
+
326
354
  a.map do |s|
327
-
355
+
328
356
  if s =~ /^!!/ then
329
357
 
330
358
  parent, children = s.split(/^!!/,2)
@@ -337,18 +365,18 @@ class Martile
337
365
  else
338
366
  s
339
367
  end
340
-
368
+
341
369
  end.join
342
370
  end
343
371
 
344
372
  def code_block_to_html(s)
345
373
 
346
-
347
- s.split(/(?=<pre>)/).map do |s2|
348
-
374
+
375
+ s.split(/(?=<pre>)/).map do |s2|
376
+
349
377
  if s2[0] != '<' then
350
-
351
- s.lines.chunk {|x| x =~ /^\n|^ |\n/ }.map do |_, x|
378
+
379
+ s2.lines.chunk {|x| x =~ /^\n|^ |\n/ }.map do |_, x|
352
380
 
353
381
  if x.join.lstrip[/^ /] then
354
382
  "\n<pre><code>%s</code></pre>\n\n" % escape(x.join.gsub(/^ {4}/,''))
@@ -361,18 +389,18 @@ class Martile
361
389
  else
362
390
  s2
363
391
  end
364
-
392
+
365
393
  end.join
366
-
394
+
367
395
 
368
396
  end
369
397
 
370
398
  def details(s)
371
-
399
+
372
400
  puts ('inside details: ' + s.inspect).debug if @debug
373
-
401
+
374
402
  s.split(/(?=\!\+)/).map do |x|
375
-
403
+
376
404
  if x =~ /\!\+/ then
377
405
 
378
406
  x[2..-1].sub(/(.*)[^\+]+\n\+/m) do |x2|
@@ -382,23 +410,23 @@ class Martile
382
410
  [summary, Martile.new(detail.chop).to_html]
383
411
 
384
412
  end
385
-
413
+
386
414
  else
387
415
  x
388
416
  end
389
417
  end.join
390
418
 
391
419
  end
392
-
420
+
393
421
  def dynarex_to_markdown(s)
394
-
422
+
395
423
  s.gsub(/!d\[\]\(((#\w+|https?:\/\/)?[\w\/\.\-]+)\)(\{[^\}]+\})?/) do |match|
396
424
 
397
425
  source = ($1)
398
426
  raw_select = ($3)
399
427
 
400
428
  dx = if source =~ /^http/ then
401
- Dynarex.new(source)
429
+ Dynarex.new(source)
402
430
  else
403
431
  @data_source[source[/\w+/]]
404
432
  end
@@ -426,43 +454,43 @@ class Martile
426
454
  end
427
455
 
428
456
  end
429
-
457
+
430
458
  def embedtag(s)
431
-
432
- s.gsub(/\B!\(((?:https?|rse|dfs):\/\/[^\)]+)\)/) do
433
- RXFHelper.read(source=($1) ).first
459
+
460
+ s.gsub(/\B!\(((?:https?|rse|dfs):\/\/[^\)]+)\)/) do
461
+ RXFHelper.read(source=($1) ).first
434
462
  end
435
463
 
436
464
  end
437
-
438
-
465
+
466
+
439
467
  def escape(s)
440
468
  s.gsub('<','&lt;').gsub('>','&gt;')
441
469
  end
442
-
470
+
443
471
  def formify(s)
444
-
472
+
445
473
  s.split(/(?=\n\w+)/).map do |s|
446
-
474
+
447
475
  if s =~ /(?=\w+\n\n* \w+: +\[ +\])/ then
448
476
  create_form(s)
449
477
  else
450
478
  s
451
479
  end
452
-
480
+
453
481
  end.join
454
-
482
+
455
483
  end
456
-
484
+
457
485
  def iframetag(s)
458
-
486
+
459
487
  s.gsub(/\B!i\[\]\((https?:\/\/[^\)]+)\)(\{[^\}]+\})?/) do |x|
460
-
488
+
461
489
  url = ($1)
462
490
  attr = ($2)
463
491
 
464
492
  h = attr ? attr.scan(/(\w+):\s+['"]?(\w+)?/).to_h : {}
465
- attributes = h.any? ? (' ' +
493
+ attributes = h.any? ? (' ' +
466
494
  h.map {|k,v| "%s='%s'" % [k,v]}.join(' ')) : ''
467
495
 
468
496
  "<iframe src='%s'%s></iframe>" % [url, attributes]
@@ -470,8 +498,8 @@ class Martile
470
498
 
471
499
 
472
500
  end
473
-
474
-
501
+
502
+
475
503
 
476
504
  def list_to_html(s,symbol='#')
477
505
 
@@ -479,11 +507,11 @@ class Martile
479
507
  tag = {'#' => 'ol', '\*' => 'ul'}[symbol]
480
508
 
481
509
  s.split(/(?=\[#{symbol}|^#{symbol*2})/).map do |x|
482
-
510
+
483
511
  if x.strip.length > 0 then
484
512
  s2, remainder = [x[/\[#{symbol}.*#{symbol}[^\]]+\]/m], ($').to_s]
485
513
  end
486
-
514
+
487
515
  if s2 then
488
516
 
489
517
  raw_list = s2[1..-2].split(/^#{symbol}/).reject(&:empty?).map(&:strip)
@@ -492,23 +520,23 @@ class Martile
492
520
  ignore_domainlabel: @ignore_domainlabel).to_html)\
493
521
  .to_html[/<p>(.*)<\/p>/,1]}.join
494
522
  list + remainder.to_s
495
-
523
+
496
524
  else
497
-
525
+
498
526
  x
499
-
527
+
500
528
  end
501
-
529
+
502
530
  end.join
503
531
 
504
532
  end
505
-
533
+
506
534
  def filter_on(s)
507
535
 
508
536
  @filter = []
509
537
 
510
538
  a = s.split(/(?=\{::nomarkdown2?\})/).map.with_index do |row, i|
511
-
539
+
512
540
  row.sub(/\{::nomarkdown2?\}.*{:2?\/}/m) do |pattern|
513
541
  placeholder = '!' + Time.now.to_i.to_s + i.to_s
514
542
  @filter << [placeholder, pattern]
@@ -518,11 +546,11 @@ class Martile
518
546
  end
519
547
 
520
548
  a.join
521
-
522
- end
523
-
549
+
550
+ end
551
+
524
552
  def filter_off(raw_s)
525
-
553
+
526
554
  s = raw_s.clone
527
555
  @filter.each {|id, x| s.sub!(id, x) }
528
556
  return s
@@ -530,14 +558,14 @@ class Martile
530
558
  end
531
559
 
532
560
  def apply_filter(s)
533
-
561
+
534
562
  s1 = filter_on(s)
535
563
  s2 = yield s1
536
564
  s3 = filter_off s2
537
-
565
+
538
566
  return s3
539
567
  end
540
-
568
+
541
569
 
542
570
  def explicit_list_to_html(s)
543
571
 
@@ -562,25 +590,25 @@ class Martile
562
590
  else
563
591
  s
564
592
  end
565
-
593
+
566
594
  end
567
-
595
+
568
596
  def hyperlinkify(s)
569
-
597
+
570
598
  s.gsub(/\[([^\[]+)\]\(([^\)]+\)\)?\))/) do |x|
571
599
  "<a href='#{$2.chop}'>#{$1}</a>"
572
600
  end
573
601
 
574
602
  end
575
-
576
-
603
+
604
+
577
605
  def mtlite_utils(s)
578
-
606
+
579
607
  # convert square brackets to unicode check boxes
580
- # replaces a [] with a unicode checkbox,
608
+ # replaces a [] with a unicode checkbox,
581
609
  # and [x] with a unicode checked checkbox
582
610
  s2 = s.gsub(/\s\[ {0,1}\]\s/,' &#9744; ').gsub(/\s\[x\]\s/,' &#9745; ')
583
-
611
+
584
612
  # create domain labels for hyperlinks
585
613
  #
586
614
  s3 = s2.gsub(/(?:^\[|\s\[)[^\]]+\]\((https?:\/\/[^\s]+)/) do |x|
@@ -596,60 +624,60 @@ class Martile
596
624
  # e.g. -milk cow- becomes <del>milk cow</del>
597
625
  s3.gsub(/\s-[^-]+-?[^-]+-[\s\]]/) do |x|
598
626
  x.sub(/-([&\w]+.*\w+)-/,'<del>\1</del>')
599
- end
627
+ end
600
628
 
601
629
  end
602
-
630
+
603
631
  def nomarkdown(s)
604
632
  s.gsub(/\b'\b/,"{::nomarkdown}'{:/}")
605
633
  end
606
-
634
+
607
635
  def qrcodetag(s)
608
-
609
- s.gsub(/\B!q\[\]\((https?:\/\/[^\)]+)\)/) do
610
-
611
- svg = RQRCode::QRCode.new($1).as_svg
636
+
637
+ s.gsub(/\B!q\[\]\((https?:\/\/[^\)]+)\)/) do
638
+
639
+ svg = RQRCode::QRCode.new($1).as_svg
612
640
  svg.slice!(/.*(?=<svg)/m)
613
-
641
+
614
642
  svg
615
643
  end
616
644
 
617
- end
618
-
645
+ end
646
+
619
647
  def ordered_list_to_html(s)
620
648
  list_to_html s, '#'
621
649
  end
622
-
650
+
623
651
  def dx_render_table(dx, raw_select)
624
-
652
+
625
653
  fields, markdown, heading, inner = nil, true, true, true
626
-
654
+
627
655
  if raw_select then
628
656
 
629
657
  raw_fields = raw_select[/select:\s*["']([^"']+)/,1]
630
-
658
+
631
659
  fields = raw_fields.split(/\s*,\s*/) if raw_fields
632
660
  inner = false if raw_select[/\bmarkdown:\s*false\b/]
633
661
  heading = false if raw_select[/\bheading:\s*false\b/]
634
662
 
635
663
  end
636
-
637
664
 
638
- dx.to_table(markdown: true, fields: fields, innermarkdown: inner,
665
+
666
+ dx.to_table(markdown: true, fields: fields, innermarkdown: inner,
639
667
  heading: heading)
640
- end
641
-
668
+ end
669
+
642
670
  def dx_render_table2(dx, raw_select)
643
-
671
+
644
672
  markdown, heading = true, true
645
-
673
+
646
674
  if raw_select then
647
675
  raw_fields = raw_select[/select:\s*["']([^"']+)/,1]
648
676
  fields = raw_fields.split(/\s*,\s*/) if raw_fields
649
677
  markdown = false if raw_select[/\bmarkdown:\s*false\b/]
650
678
  heading = false if raw_select[/\bheading:\s*false\b/]
651
679
  end
652
-
680
+
653
681
  print_row = -> (row, widths) do
654
682
  '| ' + row.map\
655
683
  .with_index {|y,i| y.to_s.ljust(widths[i])}.join(' | ') + " |\n"
@@ -667,12 +695,12 @@ class Martile
667
695
 
668
696
 
669
697
  flat_records = raw_select ? dx.to_a(select: fields) : dx.to_a
670
-
698
+
671
699
  keys = flat_records.map(&:keys).first
672
700
  raw_vals = flat_records.map(&:values)
673
-
701
+
674
702
  # create Markdown hyperlinks for any URLs
675
-
703
+
676
704
  vals = raw_vals.map do |row|
677
705
 
678
706
  row.map do |col|
@@ -688,35 +716,35 @@ class Martile
688
716
  url_title = (a.join('.') + path)[0..39] + '...'
689
717
 
690
718
  "[%s](%s)" % [url_title, col]
691
-
719
+
692
720
  else
693
-
694
- if markdown then
695
- "{::nomarkdown}" +
721
+
722
+ if markdown then
723
+ "{::nomarkdown}" +
696
724
  RDiscount.new(col).to_html.strip.gsub("\n",'') + "{:/}"
697
725
  else
698
726
 
699
727
  col
700
-
728
+
701
729
  end
702
-
730
+
703
731
  end
704
-
732
+
705
733
  r
706
734
  end
707
- end
735
+ end
708
736
 
709
737
  widths = ([keys] + vals).transpose.map{|x| x.max_by(&:length).length}
710
-
711
-
738
+
739
+
712
740
  th = heading ? print_row.call(keys, widths) : ''
713
- th_line = print_thline.call widths.map {|x| '-' * (x+1)}, widths
714
- tb = print_rows.call(vals, widths)
715
-
741
+ th_line = print_thline.call widths.map {|x| '-' * (x+1)}, widths
742
+ tb = print_rows.call(vals, widths)
743
+
716
744
  table = th + th_line + tb
717
-
745
+
718
746
  end
719
-
747
+
720
748
  def unordered_list_to_html(s)
721
749
  list_to_html s, '\*'
722
750
  end
@@ -724,131 +752,131 @@ class Martile
724
752
  def parse__data__(s)
725
753
 
726
754
  puts 'inside parse__data__'.info if @debug
727
-
755
+
728
756
  a = s.split(/^__DATA__$/,2)
729
757
 
730
758
  data = a[-1]
731
-
759
+
732
760
  links, locals = data.split(/(?=<)/, 2)
733
-
761
+
734
762
  links.strip.split("\n").each do |line|
735
-
763
+
736
764
  puts ('line:' + line.inspect).debug if @debug
737
765
  next if line.nil?
738
-
766
+
739
767
  id, url = line.split(/:\s+/,2)
740
768
  puts 'id: ' + id.inspect if @debug
741
769
  puts 'url: ' + url.inspect if @debug
742
-
770
+
743
771
  obj, _ = RXFHelper.read(url, auto: true)
744
772
  define_singleton_method(id.to_sym) { @data_source[id] }
745
- @data_source[id] = obj
746
-
773
+ @data_source[id] = obj
774
+
747
775
  end
748
-
776
+
749
777
  puts 'before locals' if @debug
750
-
778
+
751
779
  locals ||= ''
752
-
780
+
753
781
  locals.split(/(?=<\?)/).each do |x|
754
782
 
755
783
  puts ('__data__ x: ' + x.inspect).debug if @debug
756
-
784
+
757
785
  s2 = x.strip
758
786
  next if s2.empty?
759
-
787
+
760
788
  id = s2.lines.first[/id=["']([^"']+)/,1]
761
-
762
- @data_source[id] = case s2
789
+
790
+ @data_source[id] = case s2
763
791
  when /^<\?dynarex /
764
-
792
+
765
793
  dx = Dynarex.new
766
794
  dx.import s2
767
795
  dx
768
-
796
+
769
797
  when /^<\?mindmap(?:viz)? /
770
798
  puts 's2: ' + s2.inspect if @debug
771
799
  Mindmapviz.new s2
772
-
800
+
773
801
  when /^<\?flowchart(?:viz)? /
774
-
775
- Flowchartviz.new s2
776
-
802
+
803
+ Flowchartviz.new s2
804
+
777
805
  when /^<\?graphvizml /
778
-
779
- GraphVizML.new s2
780
-
806
+
807
+ GraphVizML.new s2
808
+
781
809
  when /^<\?pxgraphviz /
782
810
  puts 'before PxGraphViz.new'.info if @debug
783
- PxGraphViz.new s2, debug: @debug
784
-
811
+ PxGraphViz.new s2, debug: @debug
812
+
785
813
  when /^<\?depviz /
786
-
787
- DepViz.new s2
788
-
814
+
815
+ DepViz.new s2
816
+
789
817
  when /^<\?sectionx /
790
-
818
+
791
819
  sx = SectionX.new
792
820
  sx.import s2
793
821
  define_singleton_method(id.to_sym) { @data_source[id] }
794
822
  sx
795
-
823
+
796
824
  when /^<\?kvx /
797
-
825
+
798
826
  kvx = Kvx.new s2
799
827
 
800
828
  define_singleton_method(id.to_sym) { @data_source[id] }
801
- kvx
802
-
803
- end
829
+ kvx
830
+
831
+ end
804
832
  end
805
-
833
+
806
834
  a[0..-2].join
807
-
835
+
808
836
  end
809
-
837
+
810
838
  def sidenav(s1)
811
-
839
+
812
840
  s = s1.clone
813
841
  if s =~ /^<sidenav/ then
814
-
842
+
815
843
  content = s[/(<sidenav[^>]+\/>|<sidenav[^>]+>([^<]*<[^>]+>)?)/]
816
844
  puts ('content: ' + content.inspect) if @debug
817
-
845
+
818
846
  doc = if content then
819
-
847
+
820
848
  s.sub!(content,'')
821
849
  doc2 = Rexle.new(content)
822
-
850
+
823
851
  h = doc2.root.attributes
824
852
  target = h[:target] || 'pgview'
825
-
853
+
826
854
  txt = if h[:src] then
827
855
  RXFHelper.read(h[:src]).first.sub(/<\?links[^>]+>\n/,'')
828
856
  else
829
857
  doc2.root.text
830
858
  end
831
-
859
+
832
860
  puts 'txt: ' + txt.inspect if @debug
833
-
861
+
834
862
  html = HtmlCom::Tree.new(txt).to_webpage
835
- puts 'html: ' + html.inspect if @debug
836
-
863
+ puts 'html: ' + html.inspect if @debug
864
+
837
865
  doc2 = Rexle.new(html)
838
-
866
+
839
867
  doc2.root.xpath('body/ul[@class="sidenav"]/li//a').each do |node|
840
868
  node.attributes[:target] = target
841
869
  end
842
-
870
+
843
871
  doc2
844
-
872
+
845
873
  else
846
874
  s.sub!(/^<sidenav\/>/,'')
847
875
  html = HtmlCom::Tree.new(s).to_webpage
848
876
  Rexle.new(html)
849
877
  end
850
-
851
-
878
+
879
+
852
880
  html2 = Kramdown::Document.new(Martile.new(s, toc: false).to_html)\
853
881
  .to_html
854
882
  div = Rexle.new("<div class='main'>%s</div>" % html2)
@@ -862,7 +890,7 @@ class Martile
862
890
  end
863
891
 
864
892
  def table_to_html(s)
865
-
893
+
866
894
  # create any tables
867
895
  s.gsub!(/^\[[^|]+\|[^\n]+\n\|[^\]]+\]/) do |x|
868
896
 
@@ -884,50 +912,50 @@ class Martile
884
912
  end
885
913
  return s
886
914
  end
887
-
915
+
888
916
  def tabs(s1)
889
-
917
+
890
918
  s = s1.clone
891
-
919
+
892
920
  doc = Rexle.new("<root>#{s}</root>")
893
921
  puts 'doc.root.xml: ' + doc.root.xml.inspect if @debug
894
922
  a = doc.root.xpath('tabs').map.with_index do |e, i |
895
-
923
+
896
924
  build = JsMenuBuilder.new()
897
925
  build.import(e.xml)
898
-
926
+
899
927
  if i < 1 then
900
- @css << build.to_css
928
+ @css << build.to_css
901
929
  @js << build.to_js
902
930
  end
903
-
931
+
904
932
  build.to_html
905
-
933
+
906
934
  end
907
935
  puts 'tabs a:' + a.inspect if @debug
908
936
 
909
937
  # replaces the <tabs> XML with HTML
910
938
  a.each do |html|
911
-
939
+
912
940
  istart = s =~ /^<tabs[^>]*>/
913
941
  iend = s =~ /<\/tabs>/
914
942
  s.slice!(istart, (iend - istart) + '</tab>'.length + 1)
915
943
  s.insert(istart, html)
916
-
944
+
917
945
  end
918
-
946
+
919
947
  return s
920
-
948
+
921
949
  end
922
950
 
923
951
  def underline(s)
924
952
 
925
- s.gsub(/_[^_\(\)\n]+_\b/) do |x|
953
+ s.gsub(/_[^_\(\)\n]+_\b/) do |x|
926
954
  "<span class='underline'>%s</span>" % x[1..-2]
927
955
  end
928
956
 
929
957
  end
930
-
958
+
931
959
  def highlight(s)
932
960
 
933
961
  s.gsub(/\^[\w ]+\^/) {|x| "<mark>%s</mark>" % x[1..-2] }
@@ -937,41 +965,41 @@ class Martile
937
965
  def script_out(s)
938
966
  s.gsub(/({!)[^}]+\}/) {|x| eval(x[/(?<={!)[^}]+/]) }
939
967
  end
940
-
968
+
941
969
  def smartlink(s)
942
-
970
+
943
971
  s.split(/(?= \?)/).inject('') do |r, substring|
944
972
 
945
973
  r << substring.gsub(/\B\?([^\n]+) +(https?:\/\/.[^\?]+\?)(?=\B)/) do |x|
946
-
974
+
947
975
  content, link = $1, ($2).chop
948
-
976
+
949
977
  if (link)[/\)$/] then
950
978
  "<a href='%s'>%s</a>" % [link, content]
951
979
  else
952
980
  "[%s](%s)" % [content, link]
953
981
  end
954
982
  end
955
-
956
- end
957
983
 
958
- end
959
-
984
+ end
985
+
986
+ end
987
+
960
988
  def slashpre(s)
961
989
  s.gsub(/^\/\/([^\/]+)^\/\//) do |x|
962
990
  "<pre>#{($1).lines.map{|y| y.sub(/^ +/,'')}.join}</pre>"
963
991
  end
964
-
992
+
965
993
  end
966
-
967
- # makes HTML sections out of string blocks which start with an
994
+
995
+ # makes HTML sections out of string blocks which start with an
968
996
  # equals sign and end with an equals sign
969
997
  def section(s)
970
998
 
971
999
  a = s.lines
972
1000
 
973
1001
  a2 = a.inject([[]]) do |r,x|
974
-
1002
+
975
1003
  match = x.match(/^={1}(?:#)?([\w-]+)?$/)
976
1004
 
977
1005
  if match then
@@ -981,10 +1009,10 @@ class Martile
981
1009
  list = r.pop
982
1010
  puts ('section | list: ' + list.inspect).debug if @debug
983
1011
 
984
- r << ["%s%s</section>" %
1012
+ r << ["%s%s</section>" %
985
1013
  [list[0], \
986
1014
  Martile.new(list[1..-1].join, \
987
- ignore_domainlabel: @ignore_domainlabel).to_s
1015
+ ignore_domainlabel: @ignore_domainlabel, embedded: true).to_s
988
1016
  ]
989
1017
  ]
990
1018
  puts ('section | r: ' + r.inspect) if @debug
@@ -992,10 +1020,10 @@ class Martile
992
1020
  else
993
1021
 
994
1022
  raw_id = match.captures.first
995
- id = raw_id ? (" id='%s'" % raw_id) : ''
1023
+ id = raw_id ? (" id='%s'" % raw_id) : ''
996
1024
  r << ["<section#{id} markdown='1'>"]
997
1025
  end
998
-
1026
+
999
1027
  else
1000
1028
 
1001
1029
  r.last << x
@@ -1006,44 +1034,44 @@ class Martile
1006
1034
 
1007
1035
  a2.join
1008
1036
  end
1009
-
1037
+
1010
1038
  def svgtag(s)
1011
-
1012
- s.gsub(/\B!s\[\]\((#\w+|https?:\/\/[^\)]+)\)/) do
1013
-
1014
- source = ($1)
1015
-
1039
+
1040
+ s.gsub(/\B!s\[\]\((#\w+|https?:\/\/[^\)]+)\)/) do
1041
+
1042
+ source = ($1)
1043
+
1016
1044
  svg = if source =~ /^http/ then
1017
-
1018
- RXFHelper.read(source).first
1019
-
1045
+
1046
+ RXFHelper.read(source).first
1047
+
1020
1048
  else
1021
-
1049
+
1022
1050
  @data_source[source[/\w+/]].to_svg
1023
-
1024
- end
1025
-
1051
+
1052
+ end
1053
+
1026
1054
  svg.slice!(/.*(?=<svg)/m)
1027
1055
  svg
1028
1056
  end
1029
1057
 
1030
1058
  end
1031
-
1032
-
1059
+
1060
+
1033
1061
  def videotag(s)
1034
-
1062
+
1035
1063
  s.gsub(/\B!v\[\]\((https?:\/\/[^\)]+)\)(\{[^\}]+\})?/) do |match|
1036
1064
 
1037
1065
  files = ($1).split
1038
1066
  attr = ($2)
1039
1067
 
1040
1068
  h = attr ? attr.scan(/(\w+):\s+(\w+)/).to_h : {}
1041
- attributes = h.any? ? (' ' +
1069
+ attributes = h.any? ? (' ' +
1042
1070
  h.map {|k,v| "%s='%s'" % [k,v]}.join(' ')) : ''
1043
1071
 
1044
1072
  h2 = {
1045
- /\.og[gv]$/ => 'ogg', /\.mp4$/ => 'mp4', /\.mov$/ => 'mov',
1046
- /\.webm$/ => 'webm'
1073
+ /\.og[gv]$/ => 'ogg', /\.mp4$/ => 'mp4', /\.mov$/ => 'mov',
1074
+ /\.webm$/ => 'webm'
1047
1075
  }
1048
1076
 
1049
1077
  sources = files.map do |file|
@@ -1053,13 +1081,13 @@ class Martile
1053
1081
  end
1054
1082
 
1055
1083
  "<video controls='controls'%s>\n%s\n</video>" % [attributes, sources.join("\n")]
1056
- end
1057
-
1084
+ end
1085
+
1058
1086
  end
1059
-
1087
+
1060
1088
  def list_item_to_hyperlink(s)
1061
-
1089
+
1062
1090
  s.gsub(/\B(\* +)([^\n]+)\s+(https?:\/\/.*)/,'\1[\2](\3)')
1063
1091
 
1064
- end
1092
+ end
1065
1093
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: martile
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.6
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,31 +11,31 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwOTE2MjEzODM5WhcN
15
- MjAwOTE1MjEzODM5WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCnenuP
17
- FWIwR7SoLI3RGCP/z/DId3Gn1vydwIIJoEjYUJo4ggN89r9DNybRna/5AkU/4ZqB
18
- qNATSqcDduNjOsaLnIkdhlsCZsF/JOETIXbnNK9Vq+yb1guQD5k5VYd4G+8YrVyq
19
- Ym7cFUZubzIpyMIJeWxlonT/pa9LasRKNIHjjagUU0HGUFXl45tzcJ9DI9GoXlLf
20
- VggQrlotu7odMgPaxyy5b44AWDByzS/0SawkeNCpN32QedSchhRN6n42w0SQodZg
21
- /aY58Z6UfbgXSEYMgWJ12yAhmBuMueD4evqLUTCG5wim8TgZ7qhTA4rjWPp6upAC
22
- uSkqtXBclU71u/k4UFpAOKWXibXrpZvuOg0J/GTdGZrsAHnPVpR5utG6nYL+/8qx
23
- vEYr8jtDiyaL7qI/lM95cei55s9/0OiI1TYa0Yffv2y2qLgtiYtc0pD+IDn2s/+3
24
- opQ7OV6G5Vl0Xuo6r+h8UbhHAFKsm88990Z02+yIP/1IddHSu8/8npXxe3kCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUX2EmAO1E
26
- PSABL4PMtcQQi626eGMwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjAxMTIxODA4WhcN
15
+ MjMwMjAxMTIxODA4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDKhrg5
17
+ KqIgw+RLws6nPWN06Zrb0xMSzmtm8Q1X6amedGq68uAMQoTpUTkz1V/15m0h/15S
18
+ dAo5kvXr7zAyFBreTwkzjRUBUoaBzXN2dplaHTjqgnZZlAQQbxjAyREU4wj9/wKi
19
+ 1QI1uErtQvR2bbziVan4GoftdS7KFRbPeqdoZahFnCpPY2JMgeMWhU/M70LjJJxX
20
+ cPKwVgM5MUXRsBB/Dj/qHBBtPdn65b5ZMPGBvBnjU1Qxev+9+Im9s12jq+M9eKXQ
21
+ nP2oIg8sEFXJtoekhVloroLfq9PWFn4h7rKWJoJ/Omld0f4EcRnNtAefq6FvCP3/
22
+ WU4W+SKb1Lk4ykIUyKYbngRPDuyAa1MEWOsdho6RVVyAGwYuGKYWL6EUdwZ53b3t
23
+ F7BO3KSLKcYj6dNLz+/DgL1y0lNIVYT8aKoG1oEEP6PIHgxqdm24HEJ3st//ZbyQ
24
+ NUrxHigFx/FsaBZHQP9KjHTE2pD4ja5f4CY1tAXsAbo7RNej/X2XB8B33AMCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUEEhUCcru
26
+ jZRwuqDct8vgJi8gbf0wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAQSJ/hREtKoMtmTPUdqbSlhgNt7EQwzpfDijG0MzV
29
- YaiohOzGuUtSS4YwS7el0uAm4GfR33FlSclL2YTRn0PrtXY4fqQpw7LpHO7qNTzH
30
- 4GEP1prieo5mnw1pbkqQoeTu36Z8P5GBLJC0C4tczXMrRB8ZmsubSir7XAEaU5vh
31
- 1tv9y0GBL/pzxT1JeJuDw/1ddw5oGZxKilkqq4/upO/Su2AnOzplMNccaFK1H1yP
32
- MjZtfGRVDtIKPH91jwfBtU+4IxeoY/HCZL03vTg9RAbJgg/5l5ndx8E17kcWK+cM
33
- oU4MMgC5Xl/m7dI9DIQgIXi3CU4Z4LF+i8kgUw7VOP1mDug67fcfSMVus8NbLWEe
34
- 6jg2WIgE1SSAq8SeDCEkqwLyvDirsS6jUfM20LXaGEeSPr4Vc6Y4FKYfrEv2Vp6S
35
- g0+rPDPUCWKVNHo7BG5zGRDcLsJO0QeIILy/AQaSAE3lQiHmC47nhsiBK0qNehWa
36
- 47XiKvz0ZVCGgrz4GEb723WC
28
+ BgkqhkiG9w0BAQsFAAOCAYEAMkGd71LQJVg9SUpo4v+uv1FQWDUnaml69mmt9o6K
29
+ sp2xIhTP7ZOr4xktFM1v2toFen5spnw2D27ydH7g/LyZfb6gvssfuelP6E8pnWEF
30
+ BBAj6z9JLqH/XYLttJ96RkvAxHFXAchiqjIknlesadvn49Y8LBsz6bw+9yVGZDwr
31
+ P2qlPhBZ8OCV2Fk7SaCGCMrN0XQb+wERg1hLgxEE1VwJbIKMKuODgrsPuNTDx3Lk
32
+ IDU0+h3wmirfIeWHGf3YOjWTBi9XNUP60jhi4SuPejlXZp9A7kL3kBtsMThb/k1n
33
+ VEnfzskAkhHzszdJyQCgiMm1Vq7gK2/s3QdSdgTSUef73SsAEaKJq510bDXxPinK
34
+ KZk39ZADGwdeqANr4XzQsVTdu1ELJzGIA0xTfC1FCR3Rx/hlOnSIIarc3jTOz5TJ
35
+ 6D95KZcJmHrfG4EGldnq07fqQvCHdxjq1Yg3FzORugyyjrO9+L73oxuf6alZi9bk
36
+ ELVtuWI4ASfMFfqxPi48ym1T
37
37
  -----END CERTIFICATE-----
38
- date: 2020-09-01 00:00:00.000000000 Z
38
+ date: 2022-02-01 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: yatoc
@@ -61,22 +61,22 @@ dependencies:
61
61
  name: rqrcode
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '1.1'
67
64
  - - ">="
68
65
  - !ruby/object:Gem::Version
69
- version: 1.1.2
66
+ version: 2.1.0
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.1'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: '1.1'
77
74
  - - ">="
78
75
  - !ruby/object:Gem::Version
79
- version: 1.1.2
76
+ version: 2.1.0
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '2.1'
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: mindmapdoc
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -126,7 +126,7 @@ dependencies:
126
126
  version: '0.2'
127
127
  - - ">="
128
128
  - !ruby/object:Gem::Version
129
- version: 0.2.4
129
+ version: 0.2.7
130
130
  type: :runtime
131
131
  prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
@@ -136,9 +136,9 @@ dependencies:
136
136
  version: '0.2'
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- version: 0.2.4
139
+ version: 0.2.7
140
140
  description:
141
- email: james@jamesrobertson.eu
141
+ email: digital.robertson@gmail.com
142
142
  executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
@@ -163,7 +163,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
163
  - !ruby/object:Gem::Version
164
164
  version: '0'
165
165
  requirements: []
166
- rubygems_version: 3.0.3
166
+ rubyforge_project:
167
+ rubygems_version: 2.7.10
167
168
  signing_key:
168
169
  specification_version: 4
169
170
  summary: Martile is a Markdown pre formatter which is designed to format custom Markdown
metadata.gz.sig CHANGED
Binary file