markita 3.3.210918 → 3.4.210922

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00f2378d6afe1f1ed2251e78d0e413305cc3a2616da3dfeccfe3446faac0712c
4
- data.tar.gz: 8d099fe74a6bd50829c1a09f9bbc492893113c868dc4731cd41bd4380d19cbe5
3
+ metadata.gz: df6d287bdc5a83164680b7218d6a1b097dddc703ba731f5ae3568e51756385c7
4
+ data.tar.gz: eca3f9de5cd993be7c206c8bdd8cbcf89d99bb0799960aed60a3140d3f3ba9e6
5
5
  SHA512:
6
- metadata.gz: 0d13c5e56db469e15a3d5b11048cb1f70b3ffae0f02dec77b02edef36b47d8393218f66755fa5619c2755861e163b1c4d3d05edba9f55f06d44f1c61366ee239
7
- data.tar.gz: 958c7442e49d7efd39bc9c99d843c788c0f5e1e29ca87e5965816f04fff8a61494ccc1acaa2b855e9ce543edc6b9a4b1e505043159d494a8f9820bd0d4461b02
6
+ metadata.gz: 87f88ceb92a5bd24eddcaf3cbefa4dce1a4098befe0534eef5f68a90931441dd7324bfd5d1cb135351c28451d2a3891c259cbf8e7e2433cdbff54e76a4fbcf15
7
+ data.tar.gz: c691c08fde7db7ff8ee8f3b72a17b7f8cd32df9bf6b4b970699102b6c9dc3aedae4ce19c183ae912527b9c55432a75f47b337c85c8802130116fca708aa27e32
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Markita
2
2
 
3
- * [VERSION 3.3.210918](https://github.com/carlosjhr64/markita/releases)
3
+ * [VERSION 3.4.210922](https://github.com/carlosjhr64/markita/releases)
4
4
  * [github](https://www.github.com/carlosjhr64/markita)
5
5
  * [rubygems](https://rubygems.org/gems/markita)
6
6
 
@@ -269,8 +269,9 @@ Markdown:
269
269
 
270
270
  !> /path-to/ascii_art.txt
271
271
 
272
- Must be a `*.txt` file.
273
272
  Useful for ASCII art.
273
+ Unless an `*.html` file, the text is embedded in `pre` tags.
274
+ Further more unless a `*.txt` file, the text is embedded in `code` tags.
274
275
 
275
276
  ### Emojis
276
277
 
@@ -294,6 +295,16 @@ Markdown:
294
295
  [^2]: Cash is money in currency.
295
296
  [^3]: Read as "Nan took it."
296
297
 
298
+ ### Meta-data
299
+
300
+ Markdown:
301
+
302
+ ---
303
+ Title: The Title You Want For Your Page
304
+ 1: https://way.to/create/ref/links
305
+ ---
306
+ You can now [link](1) with a reference number.
307
+
297
308
  ## HOW-TOs
298
309
 
299
310
  ### Set site password:
@@ -6,6 +6,7 @@ class Markdown
6
6
  def initialize(title)
7
7
  @title = title
8
8
  @line=@html=@file=@opt=nil
9
+ @metadata = {}
9
10
  end
10
11
 
11
12
  def start
@@ -14,6 +15,9 @@ class Markdown
14
15
  end
15
16
 
16
17
  def finish
18
+ if title = @metadata['Title']
19
+ @html << %Q(<script> document.title = "#{title}" </script>\n)
20
+ end
17
21
  @html << HTML.footer
18
22
  @line = nil
19
23
  end
@@ -62,7 +66,10 @@ class Markdown
62
66
  CODE = lambda {|m| "<code>#{m[1]}</code>"}
63
67
 
64
68
  Ax = /\[([^\[\]]+)\]\(([^()]+)\)/
65
- A = lambda {|m| %Q(<a href="#{m[2]}">#{m[1]}</a>)}
69
+ def anchor(m)
70
+ href = ((_=m[2]).match?(/^\d+$/) and @metadata[_] or _)
71
+ %Q(<a href="#{href}">#{m[1]}</a>)
72
+ end
66
73
 
67
74
  URLx = %r(\[(https?://[\w\.\-\/\&\+\?\%]+)\])
68
75
  URL = lambda {|m| %Q(<a href="#{m[1]}">#{m[1]}</a>)}
@@ -95,9 +102,9 @@ class Markdown
95
102
  return (block ? block.call(entry) : entry)
96
103
  end
97
104
 
98
- INLINE = lambda do |entry|
105
+ def inline(entry)
99
106
  string = Markdown.tag(entry, CODEx, CODE) do |entry|
100
- Markdown.tag(entry, Ax, A) do |entry|
107
+ Markdown.tag(entry, Ax, method(:anchor)) do |entry|
101
108
  Markdown.tag(entry, URLx, URL) do |entry|
102
109
  entry = Markdown.tag(entry, EMOJIx, EMOJI)
103
110
  entry = Markdown.tag(entry, Bx, B)
@@ -128,7 +135,7 @@ class Markdown
128
135
  @html << "<ol#{@opt[:attributes]}>\n"
129
136
  @opt.delete(:attributes)
130
137
  while md and level==md[1].length
131
- @html << " <li>#{INLINE[md[2]]}</li>\n"
138
+ @html << " <li>#{inline(md[2])}</li>\n"
132
139
  if md = (@line=@file.gets)&.match(ORDERED)
133
140
  if level < md[1].length
134
141
  ordered(md, md[1].length)
@@ -148,7 +155,7 @@ class Markdown
148
155
  @html << "<p#{@opt[:attributes]}>\n"
149
156
  @opt.delete(:attributes)
150
157
  while md
151
- @html << INLINE[@line]
158
+ @html << inline(@line)
152
159
  md = (@line=@file.gets)&.match PARAGRAPHS
153
160
  end
154
161
  @html << "</p>\n"
@@ -163,7 +170,7 @@ class Markdown
163
170
  @html << "<ul#{@opt[:attributes]}>\n"
164
171
  @opt.delete(:attributes)
165
172
  while md and level==md[1].length
166
- @html << " <li>#{INLINE[md[2]]}</li>\n"
173
+ @html << " <li>#{inline(md[2])}</li>\n"
167
174
  if md = (@line=@file.gets)&.match(UNORDERED)
168
175
  if level < md[1].length
169
176
  unordered(md, md[1].length)
@@ -187,7 +194,7 @@ class Markdown
187
194
  li = (x=='x')?
188
195
  %q{<li style="list-style-type: '&#9745; '">} :
189
196
  %q{<li style="list-style-type: '&#9744; '">}
190
- @html << " #{li}#{INLINE[t]}</li>\n"
197
+ @html << " #{li}#{inline(t)}</li>\n"
191
198
  md = (@line=@file.gets)&.match BALLOTS
192
199
  end
193
200
  @html << "</ul>\n"
@@ -203,8 +210,8 @@ class Markdown
203
210
  @opt.delete(:attributes)
204
211
  while md
205
212
  item = md[1]
206
- @html << ((item[-1]==':')? "<dt>#{INLINE[item[0..-2]]}</dt>\n" :
207
- "<dd>#{INLINE[item]}</dd>\n")
213
+ @html << ((item[-1]==':')? "<dt>#{inline(item[0..-2])}</dt>\n" :
214
+ "<dd>#{inline(item)}</dd>\n")
208
215
  md = (@line=@file.gets)&.match DEFINITIONS
209
216
  end
210
217
  @html << "</dl>\n"
@@ -217,9 +224,9 @@ class Markdown
217
224
  def headers
218
225
  md = HEADERS.match(@line) or return false
219
226
  i,header = md[1].length,md[2]
220
- id = header.strip.gsub(/\s+/,'+')
227
+ id = header.gsub(/\([^\(\)]*\)/,'').scan(/\w+/).join('+')
221
228
  @html << %Q(<a id="#{id}">\n)
222
- @html << " <h#{i}#{@opt[:attributes]}>#{INLINE[header]}</h#{i}>\n"
229
+ @html << " <h#{i}#{@opt[:attributes]}>#{inline(header)}</h#{i}>\n"
223
230
  @html << "</a>\n"
224
231
  @opt.delete(:attributes)
225
232
  @line = @file.gets
@@ -234,7 +241,7 @@ class Markdown
234
241
  @html << "<blockquote#{@opt[:attributes]}>\n"
235
242
  @opt.delete(:attributes)
236
243
  while md
237
- @html << INLINE[md[1]]
244
+ @html << inline(md[1])
238
245
  @html << "\n"
239
246
  md = (@line=@file.gets)&.match BLOCKQS
240
247
  end
@@ -278,14 +285,31 @@ class Markdown
278
285
  true
279
286
  end
280
287
 
281
- # Horizontal rule
288
+ # Meta-data
289
+ METADATAS = /^(\w+): (.*)$/
290
+ def metadata
291
+ md = METADATAS.match(@line) or return false
292
+ while md
293
+ @metadata[md[1]] = md[2]
294
+ md = (@line=@file.gets)&.match METADATAS
295
+ end
296
+ true
297
+ end
298
+
299
+ # Horizontal rule or Meta-data
282
300
  HRS = /^---+$/
283
301
  PARSERS << :hrs
284
302
  def hrs
285
303
  HRS.match? @line or return false
286
- @html << "<hr#{@opt[:attributes]}>\n"
287
- @opt.delete(:attributes)
288
304
  @line = @file.gets
305
+ if metadata
306
+ # Optional closing HRS
307
+ @line = @file.gets if @line&.match? HRS
308
+ else
309
+ # Display HR
310
+ @html << "<hr#{@opt[:attributes]}>\n"
311
+ @opt.delete(:attributes)
312
+ end
289
313
  true
290
314
  end
291
315
 
@@ -297,7 +321,7 @@ class Markdown
297
321
  @html << "<table#{@opt[:attributes]}>\n"
298
322
  @opt.delete(:attributes)
299
323
  @html << '<thead><tr><th>'
300
- @html << @line[1...-1].split('|').map{INLINE[_1.strip]}.join('</th><th>')
324
+ @html << @line[1...-1].split('|').map{inline(_1.strip)}.join('</th><th>')
301
325
  @html << "</th></tr></thead>\n"
302
326
  align = []
303
327
  while (@line=@file.gets)&.match TABLES
@@ -314,7 +338,7 @@ class Markdown
314
338
  align[i] = ' align="left"'
315
339
  @html << '<td><hr></td>'
316
340
  else
317
- @html << "<td#{align[i]}>#{INLINE[cell.strip]}</td>"
341
+ @html << "<td#{align[i]}>#{inline(cell.strip)}</td>"
318
342
  end
319
343
  end
320
344
  @html << "</tr>\n"
@@ -426,14 +450,27 @@ form << %Q{ #{field}:<input type="#{type}" name="#{name}" value="#{value}">}
426
450
  end
427
451
 
428
452
  # Embed text
429
- EMBED_TEXTS = /^!> (#{PAGE_KEY}\.txt)$/
453
+ EMBED_TEXTS = /^!> (#{PAGE_KEY}\.\w+)$/
430
454
  PARSERS << :embed_texts
431
455
  def embed_texts
432
456
  md = EMBED_TEXTS.match(@line) or return false
433
457
  if File.exist?(filename=File.join(ROOT, md[1]))
434
- @html << "<pre>\n"
435
- @html << File.read(filename)
436
- @html << "</pre>\n"
458
+ extension,lang = filename.split('.').last,nil
459
+ unless extension=='html'
460
+ lang = Rouge::Lexer.find extension
461
+ klass = lang ? ' class="highlight"' : nil
462
+ @html << "<pre#{klass}#{@opt[:attributes]}>"
463
+ @opt.delete(:attributes)
464
+ @html << '<code>' unless extension=='txt'
465
+ @html << "\n"
466
+ end
467
+ code = File.read(filename)
468
+ @html << (lang ? ROUGE.format(lang.new.lex(code)) : code)
469
+ unless extension=='html'
470
+ @html << '</code>' unless extension=='txt'
471
+ @html << '</pre>'
472
+ @html << "\n"
473
+ end
437
474
  else
438
475
  @html << @line
439
476
  end
@@ -448,7 +485,7 @@ form << %Q{ #{field}:<input type="#{type}" name="#{name}" value="#{value}">}
448
485
  md = FOOTNOTES.match(@line) or return false
449
486
  @html << "<small>\n"
450
487
  while md
451
- @html << INLINE[@line.chomp]+"<br>\n"
488
+ @html << inline(@line.chomp)+"<br>\n"
452
489
  md = (@line=@file.gets)&.match FOOTNOTES
453
490
  end
454
491
  @html << "</small>\n"
data/lib/markita.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Markita
2
- VERSION = '3.3.210918'
2
+ VERSION = '3.4.210922'
3
3
 
4
4
  def self.run!
5
5
  # Standard libraries
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markita
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.210918
4
+ version: 3.4.210922
5
5
  platform: ruby
6
6
  authors:
7
7
  - CarlosJHR64
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-18 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: help_parser