mdless 2.1.44 → 2.1.46
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mdless/console.rb +286 -274
- data/lib/mdless/converter.rb +143 -141
- data/lib/mdless/tables.rb +17 -16
- data/lib/mdless/version.rb +1 -1
- metadata +2 -2
data/lib/mdless/console.rb
CHANGED
@@ -24,7 +24,7 @@ module Redcarpet
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def xc
|
27
|
-
x + color(
|
27
|
+
x + color("text")
|
28
28
|
end
|
29
29
|
|
30
30
|
def x
|
@@ -36,16 +36,16 @@ module Redcarpet
|
|
36
36
|
input.split(/\n/).map do |line|
|
37
37
|
if first
|
38
38
|
if line =~ /^\+-+/
|
39
|
-
line.gsub!(/^/, color(
|
39
|
+
line.gsub!(/^/, color("table border"))
|
40
40
|
else
|
41
41
|
first = false
|
42
|
-
line.gsub!(/\|/, "#{color(
|
42
|
+
line.gsub!(/\|/, "#{color("table border")}|#{color("table header")}")
|
43
43
|
end
|
44
44
|
elsif line.strip =~ /^[|:\- +]+$/
|
45
|
-
line.gsub!(/^(.*)$/, "#{color(
|
46
|
-
line.gsub!(/([:\-+]+)/, "#{color(
|
45
|
+
line.gsub!(/^(.*)$/, "#{color("table border")}\\1#{color("table color")}")
|
46
|
+
line.gsub!(/([:\-+]+)/, "#{color("table divider")}\\1#{color("table border")}")
|
47
47
|
else
|
48
|
-
line.gsub!(/\|/, "#{color(
|
48
|
+
line.gsub!(/\|/, "#{color("table border")}|#{color("table color")}")
|
49
49
|
end
|
50
50
|
end.join("\n")
|
51
51
|
end
|
@@ -60,7 +60,7 @@ module Redcarpet
|
|
60
60
|
|
61
61
|
def code_bg(input, width)
|
62
62
|
input.split(/\n/).map do |line|
|
63
|
-
tail = line.uncolor.length < width ? "\u00A0" * (width - line.uncolor.length) :
|
63
|
+
tail = line.uncolor.length < width ? "\u00A0" * (width - line.uncolor.length) : ""
|
64
64
|
"#{x}#{line}#{tail}#{x}"
|
65
65
|
end.join("\n")
|
66
66
|
end
|
@@ -96,41 +96,40 @@ module Redcarpet
|
|
96
96
|
# end.join("\n").blackout(MDLess.theme['code_block']['bg']) + "#{xc}\n"
|
97
97
|
# end
|
98
98
|
|
99
|
-
if MDLess.options[:syntax_higlight] && !exec_available(
|
100
|
-
MDLess.log.error(
|
99
|
+
if MDLess.options[:syntax_higlight] && !exec_available("pygmentize")
|
100
|
+
MDLess.log.error("Syntax highlighting requested by pygmentize is not available")
|
101
101
|
MDLess.options[:syntax_higlight] = false
|
102
102
|
end
|
103
103
|
|
104
104
|
if MDLess.options[:syntax_higlight]
|
105
|
-
pyg = TTY::Which.which(
|
106
|
-
lexer = language&.valid_lexer? ? "-l #{language}" :
|
105
|
+
pyg = TTY::Which.which("pygmentize")
|
106
|
+
lexer = language&.valid_lexer? ? "-l #{language}" : "-g"
|
107
107
|
begin
|
108
|
-
pygments_theme = MDLess.options[:pygments_theme] || MDLess.theme[
|
108
|
+
pygments_theme = MDLess.options[:pygments_theme] || MDLess.theme["code_block"]["pygments_theme"]
|
109
109
|
|
110
110
|
unless pygments_theme.valid_pygments_theme?
|
111
111
|
MDLess.log.error("Invalid Pygments theme #{pygments_theme}, defaulting to 'default' for highlighting")
|
112
|
-
pygments_theme =
|
112
|
+
pygments_theme = "default"
|
113
113
|
end
|
114
114
|
|
115
115
|
cmd = [
|
116
116
|
"#{pyg} -f terminal256",
|
117
117
|
"-O style=#{pygments_theme}",
|
118
118
|
lexer,
|
119
|
-
|
120
|
-
].join(
|
119
|
+
"2> /dev/null",
|
120
|
+
].join(" ")
|
121
121
|
hilite, s = Open3.capture2(cmd,
|
122
122
|
stdin_data: code_block)
|
123
123
|
|
124
124
|
if s.success?
|
125
125
|
hilite = xc + hilite.split(/\n/).map do |l|
|
126
126
|
[
|
127
|
-
color(
|
128
|
-
MDLess.theme[
|
129
|
-
"#{color(
|
127
|
+
color("code_block marker"),
|
128
|
+
MDLess.theme["code_block"]["character"],
|
129
|
+
"#{color("code_block bg")}#{l}#{xc}",
|
130
130
|
].join
|
131
|
-
end.join("\n").blackout(MDLess.theme[
|
131
|
+
end.join("\n").blackout(MDLess.theme["code_block"]["bg"]) + "#{xc}\n"
|
132
132
|
end
|
133
|
-
|
134
133
|
rescue StandardError => e
|
135
134
|
MDLess.log.error(e)
|
136
135
|
hilite = code_block
|
@@ -138,32 +137,32 @@ module Redcarpet
|
|
138
137
|
else
|
139
138
|
hilite = code_block.split(/\n/).map do |line|
|
140
139
|
[
|
141
|
-
color(
|
142
|
-
MDLess.theme[
|
143
|
-
color(
|
140
|
+
color("code_block marker"),
|
141
|
+
MDLess.theme["code_block"]["character"],
|
142
|
+
color("code_block color"),
|
144
143
|
line,
|
145
|
-
xc
|
144
|
+
xc,
|
146
145
|
].join
|
147
|
-
end.join("\n").blackout(MDLess.theme[
|
146
|
+
end.join("\n").blackout(MDLess.theme["code_block"]["bg"]) + "#{xc}\n"
|
148
147
|
end
|
149
148
|
|
150
149
|
top_border = if language.nil? || language.empty?
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
150
|
+
"-" * longest_line
|
151
|
+
else
|
152
|
+
"--[ #{language} ]#{"-" * (longest_line - 6 - language.length)}"
|
153
|
+
end
|
155
154
|
[
|
156
155
|
xc,
|
157
|
-
color(
|
156
|
+
color("code_block border"),
|
158
157
|
top_border,
|
159
158
|
xc,
|
160
159
|
"\n",
|
161
|
-
color(
|
160
|
+
color("code_block color"),
|
162
161
|
code_bg(hilite.chomp, longest_line),
|
163
162
|
"\n",
|
164
|
-
color(
|
165
|
-
|
166
|
-
xc
|
163
|
+
color("code_block border"),
|
164
|
+
"-" * longest_line,
|
165
|
+
xc,
|
167
166
|
].join
|
168
167
|
end
|
169
168
|
|
@@ -200,56 +199,56 @@ module Redcarpet
|
|
200
199
|
|
201
200
|
def block_quote(quote)
|
202
201
|
ret = "\n\n"
|
203
|
-
quote.strip.wrap(MDLess.cols, color(
|
202
|
+
quote.strip.wrap(MDLess.cols, color("blockquote color")).split(/\n/).each do |line|
|
204
203
|
ret += [
|
205
|
-
color(
|
206
|
-
MDLess.theme[
|
207
|
-
color(
|
208
|
-
|
204
|
+
color("blockquote marker color"),
|
205
|
+
MDLess.theme["blockquote"]["marker"]["character"],
|
206
|
+
color("blockquote color"),
|
207
|
+
" ",
|
209
208
|
line,
|
210
|
-
"\n"
|
211
|
-
].join(
|
209
|
+
"\n",
|
210
|
+
].join("")
|
212
211
|
end
|
213
212
|
"#{ret}\n\n"
|
214
213
|
end
|
215
214
|
|
216
215
|
def block_html(raw_html)
|
217
|
-
"#{color(
|
216
|
+
"#{color("html color")}#{color_tags(raw_html)}#{xc}"
|
218
217
|
end
|
219
218
|
|
220
219
|
def header(text, header_level)
|
221
|
-
pad =
|
222
|
-
ansi =
|
220
|
+
pad = ""
|
221
|
+
ansi = ""
|
223
222
|
text.clean_header_ids!
|
224
|
-
uncolored = text.uncolor.gsub(/<<(pre|post)\d+>>/,
|
223
|
+
uncolored = text.uncolor.gsub(/<<(pre|post)\d+>>/, "")
|
225
224
|
uncolored.sub!(/\[(.*?)\]\(.*?\)/, '[\1][xxx]') if MDLess.options[:links] != :inline
|
226
225
|
|
227
226
|
text_length = uncolored.length
|
228
227
|
case header_level
|
229
228
|
when 1
|
230
|
-
ansi = color(
|
231
|
-
pad = color(
|
232
|
-
char = MDLess.theme[
|
229
|
+
ansi = color("h1 color")
|
230
|
+
pad = color("h1 pad")
|
231
|
+
char = MDLess.theme["h1"]["pad_char"] || "="
|
233
232
|
pad += text_length + 2 > MDLess.cols ? char * text_length : char * (MDLess.cols - (text_length + 1))
|
234
233
|
when 2
|
235
|
-
ansi = color(
|
236
|
-
pad = color(
|
237
|
-
char = MDLess.theme[
|
234
|
+
ansi = color("h2 color")
|
235
|
+
pad = color("h2 pad")
|
236
|
+
char = MDLess.theme["h2"]["pad_char"] || "-"
|
238
237
|
pad += text_length + 2 > MDLess.cols ? char * text_length : char * (MDLess.cols - (text_length + 1))
|
239
238
|
when 3
|
240
|
-
ansi = color(
|
239
|
+
ansi = color("h3 color")
|
241
240
|
when 4
|
242
|
-
ansi = color(
|
241
|
+
ansi = color("h4 color")
|
243
242
|
when 5
|
244
|
-
ansi = color(
|
243
|
+
ansi = color("h5 color")
|
245
244
|
else
|
246
|
-
ansi = color(
|
245
|
+
ansi = color("h6 color")
|
247
246
|
end
|
248
247
|
|
249
248
|
# If we're in iTerm and not paginating, add
|
250
249
|
# iTerm Marks for navigation on h1-3
|
251
250
|
if header_level < 4 &&
|
252
|
-
ENV[
|
251
|
+
ENV["TERM_PROGRAM"] =~ /^iterm/i &&
|
253
252
|
MDLess.options[:pager] == false
|
254
253
|
ansi = "\e]1337;SetMark\a#{ansi}"
|
255
254
|
end
|
@@ -258,20 +257,20 @@ module Redcarpet
|
|
258
257
|
end
|
259
258
|
|
260
259
|
def hrule()
|
261
|
-
"\n\n#{color(
|
260
|
+
"\n\n#{color("hr color")}#{"_" * MDLess.cols}#{xc}\n\n"
|
262
261
|
end
|
263
262
|
|
264
263
|
def paragraph(text)
|
265
264
|
text.scrub!
|
266
265
|
out = if MDLess.options[:preserve_linebreaks]
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
266
|
+
"#{xc}#{text.gsub(/ +/, " ").strip}#{xc}#{x}\n\n"
|
267
|
+
else
|
268
|
+
if text.uncolor =~ / {2,}$/ || text.uncolor =~ /^%/
|
269
|
+
"#{xc}#{text.gsub(/ +/, " ").strip}#{xc}#{x}\n"
|
270
|
+
else
|
271
|
+
"#{xc}#{text.gsub(/ +/, " ").gsub(/\n+(?![:-])/, " ").strip}#{xc}#{x}\n\n"
|
272
|
+
end
|
273
|
+
end
|
275
274
|
if MDLess.options[:at_tags] || MDLess.options[:taskpaper]
|
276
275
|
highlight_tags(out)
|
277
276
|
else
|
@@ -280,7 +279,7 @@ module Redcarpet
|
|
280
279
|
end
|
281
280
|
|
282
281
|
def uncolor_grafs(text)
|
283
|
-
text.gsub(/#{Regexp.escape(color(
|
282
|
+
text.gsub(/#{Regexp.escape(color("text"))}/, color("list color"))
|
284
283
|
end
|
285
284
|
|
286
285
|
@table_cols = nil
|
@@ -289,15 +288,15 @@ module Redcarpet
|
|
289
288
|
@header_row.map do |alignment|
|
290
289
|
case alignment
|
291
290
|
when :left
|
292
|
-
|
291
|
+
"|:---"
|
293
292
|
when :right
|
294
|
-
|
293
|
+
"|---:"
|
295
294
|
when :center
|
296
|
-
|
295
|
+
"|:--:"
|
297
296
|
else
|
298
|
-
|
297
|
+
"|----"
|
299
298
|
end
|
300
|
-
end.join(
|
299
|
+
end.join("") + "|"
|
301
300
|
end
|
302
301
|
|
303
302
|
def table(header, body)
|
@@ -305,8 +304,8 @@ module Redcarpet
|
|
305
304
|
"#{header}",
|
306
305
|
table_header_row,
|
307
306
|
"|\n",
|
308
|
-
"#{body}\n\n"
|
309
|
-
].join(
|
307
|
+
"#{body}\n\n",
|
308
|
+
].join(""))
|
310
309
|
@header_row = []
|
311
310
|
res = formatted.to_md
|
312
311
|
"#{color_table(res)}\n\n"
|
@@ -329,71 +328,71 @@ module Redcarpet
|
|
329
328
|
def autolink(link, _)
|
330
329
|
[
|
331
330
|
pre_element,
|
332
|
-
color(
|
333
|
-
|
334
|
-
color(
|
331
|
+
color("link brackets"),
|
332
|
+
"<",
|
333
|
+
color("link url"),
|
335
334
|
link,
|
336
|
-
color(
|
337
|
-
|
335
|
+
color("link brackets"),
|
336
|
+
">",
|
338
337
|
xc,
|
339
|
-
post_element
|
340
|
-
].join(
|
338
|
+
post_element,
|
339
|
+
].join("")
|
341
340
|
end
|
342
341
|
|
343
342
|
def codespan(code)
|
344
343
|
out = [
|
345
344
|
pre_element,
|
346
|
-
color(
|
347
|
-
MDLess.theme[
|
348
|
-
color(
|
345
|
+
color("code_span marker"),
|
346
|
+
MDLess.theme["code_span"]["character"],
|
347
|
+
color("code_span color"),
|
349
348
|
code,
|
350
|
-
color(
|
351
|
-
MDLess.theme[
|
349
|
+
color("code_span marker"),
|
350
|
+
MDLess.theme["code_span"]["character"],
|
352
351
|
xc,
|
353
|
-
post_element
|
352
|
+
post_element,
|
354
353
|
].join
|
355
354
|
end
|
356
355
|
|
357
356
|
def double_emphasis(text)
|
358
357
|
[
|
359
358
|
pre_element,
|
360
|
-
color(
|
361
|
-
MDLess.theme[
|
359
|
+
color("emphasis bold"),
|
360
|
+
MDLess.theme["emphasis"]["bold_character"],
|
362
361
|
text,
|
363
|
-
MDLess.theme[
|
362
|
+
MDLess.theme["emphasis"]["bold_character"],
|
364
363
|
xc,
|
365
|
-
post_element
|
364
|
+
post_element,
|
366
365
|
].join
|
367
366
|
end
|
368
367
|
|
369
368
|
def emphasis(text)
|
370
369
|
[
|
371
370
|
pre_element,
|
372
|
-
color(
|
373
|
-
MDLess.theme[
|
371
|
+
color("emphasis italic"),
|
372
|
+
MDLess.theme["emphasis"]["italic_character"],
|
374
373
|
text,
|
375
|
-
MDLess.theme[
|
374
|
+
MDLess.theme["emphasis"]["italic_character"],
|
376
375
|
xc,
|
377
|
-
post_element
|
376
|
+
post_element,
|
378
377
|
].join
|
379
378
|
end
|
380
379
|
|
381
380
|
def triple_emphasis(text)
|
382
381
|
[
|
383
382
|
pre_element,
|
384
|
-
color(
|
385
|
-
MDLess.theme[
|
386
|
-
MDLess.theme[
|
383
|
+
color("emphasis bold-italic"),
|
384
|
+
MDLess.theme["emphasis"]["italic_character"],
|
385
|
+
MDLess.theme["emphasis"]["bold_character"],
|
387
386
|
text,
|
388
|
-
MDLess.theme[
|
389
|
-
MDLess.theme[
|
387
|
+
MDLess.theme["emphasis"]["bold_character"],
|
388
|
+
MDLess.theme["emphasis"]["italic_character"],
|
390
389
|
xc,
|
391
|
-
post_element
|
390
|
+
post_element,
|
392
391
|
].join
|
393
392
|
end
|
394
393
|
|
395
394
|
def highlight(text)
|
396
|
-
"#{pre_element}#{color(
|
395
|
+
"#{pre_element}#{color("highlight")}#{text}#{xc}#{post_element}"
|
397
396
|
end
|
398
397
|
|
399
398
|
def image(link, title, alt_text)
|
@@ -407,35 +406,35 @@ module Redcarpet
|
|
407
406
|
def color_link(link, title, content)
|
408
407
|
[
|
409
408
|
pre_element,
|
410
|
-
color(
|
411
|
-
|
412
|
-
color(
|
409
|
+
color("link brackets"),
|
410
|
+
"[",
|
411
|
+
color("link text"),
|
413
412
|
content,
|
414
|
-
color(
|
415
|
-
|
416
|
-
color(
|
413
|
+
color("link brackets"),
|
414
|
+
"](",
|
415
|
+
color("link url"),
|
417
416
|
link,
|
418
|
-
title.nil? ?
|
419
|
-
color(
|
420
|
-
|
417
|
+
title.nil? ? "" : %( "#{title}"),
|
418
|
+
color("link brackets"),
|
419
|
+
")",
|
421
420
|
xc,
|
422
|
-
post_element
|
421
|
+
post_element,
|
423
422
|
].join
|
424
423
|
end
|
425
424
|
|
426
425
|
def color_image_tag(link, title, alt_text)
|
427
426
|
image = [
|
428
|
-
color(
|
429
|
-
|
430
|
-
color(
|
427
|
+
color("image brackets"),
|
428
|
+
"[",
|
429
|
+
color("image title"),
|
431
430
|
alt_text,
|
432
|
-
color(
|
433
|
-
|
434
|
-
color(
|
431
|
+
color("image brackets"),
|
432
|
+
"](",
|
433
|
+
color("image url"),
|
435
434
|
link,
|
436
|
-
title.nil? ?
|
437
|
-
color(
|
438
|
-
|
435
|
+
title.nil? ? "" : %( "#{title}"),
|
436
|
+
color("image brackets"),
|
437
|
+
")",
|
439
438
|
].join
|
440
439
|
|
441
440
|
@@links << {
|
@@ -443,67 +442,67 @@ module Redcarpet
|
|
443
442
|
url: link,
|
444
443
|
title: title,
|
445
444
|
content: alt_text,
|
446
|
-
image: true
|
445
|
+
image: true,
|
447
446
|
}
|
448
447
|
|
449
448
|
[
|
450
|
-
color(
|
451
|
-
|
449
|
+
color("image bang"),
|
450
|
+
"!",
|
452
451
|
image,
|
453
|
-
xc
|
452
|
+
xc,
|
454
453
|
].join
|
455
454
|
end
|
456
455
|
|
457
456
|
def color_link_reference(link, idx, content)
|
458
457
|
[
|
459
458
|
pre_element,
|
460
|
-
color(
|
461
|
-
|
462
|
-
color(
|
459
|
+
color("link brackets"),
|
460
|
+
"[",
|
461
|
+
color("link text"),
|
463
462
|
content,
|
464
|
-
color(
|
465
|
-
|
466
|
-
color(
|
463
|
+
color("link brackets"),
|
464
|
+
"][",
|
465
|
+
color("link url"),
|
467
466
|
idx,
|
468
|
-
color(
|
469
|
-
|
467
|
+
color("link brackets"),
|
468
|
+
"]",
|
470
469
|
xc,
|
471
|
-
post_element
|
470
|
+
post_element,
|
472
471
|
].join
|
473
472
|
end
|
474
473
|
|
475
474
|
def color_reference_link(link, title, content, image: false)
|
476
475
|
[
|
477
|
-
color(
|
478
|
-
|
479
|
-
color(
|
476
|
+
color("link brackets"),
|
477
|
+
"[",
|
478
|
+
color("link text"),
|
480
479
|
content,
|
481
|
-
color(
|
482
|
-
|
483
|
-
color(
|
484
|
-
|
485
|
-
image ? color(
|
480
|
+
color("link brackets"),
|
481
|
+
"]:",
|
482
|
+
color("text"),
|
483
|
+
" ",
|
484
|
+
image ? color("image url") : color("link url"),
|
486
485
|
link,
|
487
|
-
title.nil? ?
|
488
|
-
xc
|
486
|
+
title.nil? ? "" : %( "#{title}"),
|
487
|
+
xc,
|
489
488
|
].join
|
490
489
|
end
|
491
490
|
|
492
491
|
def color_image_reference(idx, content)
|
493
492
|
[
|
494
493
|
pre_element,
|
495
|
-
color(
|
496
|
-
|
497
|
-
color(
|
494
|
+
color("image brackets"),
|
495
|
+
"[",
|
496
|
+
color("image title"),
|
498
497
|
content,
|
499
|
-
color(
|
500
|
-
|
501
|
-
color(
|
498
|
+
color("image brackets"),
|
499
|
+
"][",
|
500
|
+
color("link url"),
|
502
501
|
idx,
|
503
|
-
color(
|
504
|
-
|
502
|
+
color("image brackets"),
|
503
|
+
"]",
|
505
504
|
xc,
|
506
|
-
post_element
|
505
|
+
post_element,
|
507
506
|
].join
|
508
507
|
end
|
509
508
|
|
@@ -513,25 +512,25 @@ module Redcarpet
|
|
513
512
|
link: res,
|
514
513
|
url: link,
|
515
514
|
title: title,
|
516
|
-
content: content
|
515
|
+
content: content,
|
517
516
|
}
|
518
517
|
res
|
519
518
|
end
|
520
519
|
|
521
520
|
def color_tags(html)
|
522
|
-
html.gsub(%r{((?!<)</?\w+( [^>]+)?>)}, "#{color(
|
521
|
+
html.gsub(%r{((?!<)</?\w+( [^>]+)?>)}, "#{color("html brackets")}\\1#{xc}")
|
523
522
|
end
|
524
523
|
|
525
524
|
def raw_html(raw_html)
|
526
|
-
"#{pre_element}#{color(
|
525
|
+
"#{pre_element}#{color("html color")}#{color_tags(raw_html)}#{xc}#{post_element}"
|
527
526
|
end
|
528
527
|
|
529
528
|
def strikethrough(text)
|
530
|
-
"#{pre_element}#{color(
|
529
|
+
"#{pre_element}#{color("strikethrough")}#{text}#{xc}#{post_element}"
|
531
530
|
end
|
532
531
|
|
533
532
|
def superscript(text)
|
534
|
-
"#{pre_element}#{color(
|
533
|
+
"#{pre_element}#{color("super")}^#{text}#{xc}#{post_element}"
|
535
534
|
end
|
536
535
|
|
537
536
|
def footnotes(text)
|
@@ -547,20 +546,20 @@ module Redcarpet
|
|
547
546
|
def color_footnote_def(idx)
|
548
547
|
text = @@footnotes[idx]
|
549
548
|
[
|
550
|
-
color(
|
549
|
+
color("footnote brackets"),
|
551
550
|
"[",
|
552
|
-
color(
|
551
|
+
color("footnote caret"),
|
553
552
|
"^",
|
554
|
-
color(
|
553
|
+
color("footnote title"),
|
555
554
|
idx,
|
556
|
-
color(
|
555
|
+
color("footnote brackets"),
|
557
556
|
"]:",
|
558
|
-
color(
|
559
|
-
|
557
|
+
color("footnote note"),
|
558
|
+
" ",
|
560
559
|
text.uncolor.strip,
|
561
560
|
xc,
|
562
|
-
"\n"
|
563
|
-
].join(
|
561
|
+
"\n",
|
562
|
+
].join("")
|
564
563
|
end
|
565
564
|
|
566
565
|
def footnote_def(text, idx)
|
@@ -570,18 +569,18 @@ module Redcarpet
|
|
570
569
|
def footnote_ref(text)
|
571
570
|
[
|
572
571
|
pre_element,
|
573
|
-
color(
|
572
|
+
color("footnote title"),
|
574
573
|
"[^#{text}]",
|
575
574
|
xc,
|
576
|
-
post_element
|
577
|
-
].join(
|
575
|
+
post_element,
|
576
|
+
].join("")
|
578
577
|
end
|
579
578
|
|
580
579
|
def insert_footnotes(input)
|
581
580
|
input.split(/\n/).map do |line|
|
582
581
|
notes = line.to_enum(:scan, /\[\^(?<ref>\d+)\]/).map { Regexp.last_match }
|
583
582
|
if notes.count.positive?
|
584
|
-
footnotes = notes.map { |n| color_footnote_def(n[
|
583
|
+
footnotes = notes.map { |n| color_footnote_def(n["ref"].to_i) }.join("\n")
|
585
584
|
"#{line}\n\n#{footnotes}\n\n\n"
|
586
585
|
else
|
587
586
|
line
|
@@ -609,7 +608,7 @@ module Redcarpet
|
|
609
608
|
|
610
609
|
lines = input.split(/\n/)
|
611
610
|
line1 = lines.shift
|
612
|
-
pre =
|
611
|
+
pre = " "
|
613
612
|
|
614
613
|
body = lines.map { |l| "#{pre}#{l.rstrip}" }.join("\n")
|
615
614
|
"#{line1}\n#{body}"
|
@@ -617,26 +616,26 @@ module Redcarpet
|
|
617
616
|
|
618
617
|
def color_list_item(indent, content, type, counter)
|
619
618
|
out = case type
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
619
|
+
when :unordered
|
620
|
+
[
|
621
|
+
" " * indent,
|
622
|
+
color("list bullet"),
|
623
|
+
MDLess.theme["list"]["ul_char"].strip,
|
624
|
+
" ",
|
625
|
+
color("list color"),
|
626
|
+
indent_lines(content).strip,
|
627
|
+
xc,
|
628
|
+
].join
|
629
|
+
when :ordered
|
630
|
+
[
|
631
|
+
" " * indent,
|
632
|
+
color("list number"),
|
633
|
+
"#{counter}. ",
|
634
|
+
color("list color"),
|
635
|
+
indent_lines(content).strip,
|
636
|
+
xc,
|
637
|
+
].join
|
638
|
+
end
|
640
639
|
if MDLess.options[:at_tags] || MDLess.options[:taskpaper]
|
641
640
|
color_tags(out)
|
642
641
|
else
|
@@ -657,7 +656,7 @@ module Redcarpet
|
|
657
656
|
def nest_lists(input, indent = 0)
|
658
657
|
input.gsub!(%r{<<list(?<id>\d+)-(?<type>.*?)>>(?<content>.*?)<</list\k<id>>>}m) do
|
659
658
|
m = Regexp.last_match
|
660
|
-
lines = m[
|
659
|
+
lines = m["content"].strip.split(/\n/)
|
661
660
|
|
662
661
|
list = nest_lists(lines.map do |l|
|
663
662
|
outdent = l.scan(%r{<</list\d+>>}).count
|
@@ -667,18 +666,18 @@ module Redcarpet
|
|
667
666
|
end.join("\n"), indent)
|
668
667
|
next if list.nil?
|
669
668
|
|
670
|
-
"<<main#{m[
|
669
|
+
"<<main#{m["id"]}>>#{list}<</main#{m["id"]}>>\n\n"
|
671
670
|
end
|
672
671
|
|
673
672
|
input.gsub(/^(?<indent> +)<<main(?<id>\d+)>>(?<content>.*?)<<\/main\k<id>>>/m) do
|
674
673
|
m = Regexp.last_match
|
675
|
-
"#{m[
|
674
|
+
"#{m["indent"]}#{m["content"]}"
|
676
675
|
end
|
677
676
|
end
|
678
677
|
|
679
678
|
def normalize_indentation(line)
|
680
679
|
line.gsub(/^([ \t]+)/) do |pre|
|
681
|
-
pre.gsub(/\t/,
|
680
|
+
pre.gsub(/\t/, " ")
|
682
681
|
end
|
683
682
|
end
|
684
683
|
|
@@ -686,8 +685,8 @@ module Redcarpet
|
|
686
685
|
content.gsub(%r{^(?<indent> *)<<listitem(?<id>\d+)-(?<type>(?:un)?ordered)>>(?<content>.*?)<</listitem\k<id>>>}m) do
|
687
686
|
m = Regexp.last_match
|
688
687
|
|
689
|
-
indent = m[
|
690
|
-
if m[
|
688
|
+
indent = m["indent"].length
|
689
|
+
if m["type"].to_sym == :ordered
|
691
690
|
if indent == last_indent
|
692
691
|
levels[indent] ||= 0
|
693
692
|
levels[indent] += 1
|
@@ -701,15 +700,15 @@ module Redcarpet
|
|
701
700
|
end
|
702
701
|
end
|
703
702
|
|
704
|
-
content = m[
|
705
|
-
color_list_item(indent, uncolor_grafs(content), m[
|
703
|
+
content = m["content"] =~ /<<listitem/ ? fix_items(m["content"], indent, levels) : m["content"]
|
704
|
+
color_list_item(indent, uncolor_grafs(content), m["type"].to_sym, levels[indent])
|
706
705
|
end
|
707
706
|
end
|
708
707
|
|
709
708
|
def fix_list_items(input)
|
710
709
|
input.gsub(%r{<<main(?<id>\d+)>>(?<content>.*?)<</main\k<id>>>}m) do
|
711
710
|
m = Regexp.last_match
|
712
|
-
fix_items(m[
|
711
|
+
fix_items(m["content"])
|
713
712
|
end
|
714
713
|
end
|
715
714
|
|
@@ -732,9 +731,9 @@ module Redcarpet
|
|
732
731
|
title = h[2]
|
733
732
|
end
|
734
733
|
@headers << [
|
735
|
-
|
734
|
+
"#" * hlevel,
|
736
735
|
title,
|
737
|
-
h[0]
|
736
|
+
h[0],
|
738
737
|
]
|
739
738
|
end
|
740
739
|
end
|
@@ -748,16 +747,16 @@ module Redcarpet
|
|
748
747
|
MDLess.meta = {}
|
749
748
|
first_line = input.split("\n").first
|
750
749
|
if first_line =~ /(?i-m)^---[ \t]*?$/
|
751
|
-
MDLess.log.info(
|
750
|
+
MDLess.log.info("Found YAML")
|
752
751
|
# YAML
|
753
752
|
in_yaml = true
|
754
753
|
input.sub!(/(?i-m)^---[ \t]*\n(?<content>(?:[\s\S]*?))\n[-.]{3}[ \t]*\n/m) do
|
755
754
|
m = Regexp.last_match
|
756
|
-
MDLess.log.info(
|
755
|
+
MDLess.log.info("Processing YAML header")
|
757
756
|
begin
|
758
|
-
MDLess.meta = YAML.load(m[
|
757
|
+
MDLess.meta = YAML.load(m["content"]).each_with_object({}) { |(k, v), h| h[k.downcase] = v }
|
759
758
|
rescue Psych::DisallowedClass => e
|
760
|
-
@log.error(
|
759
|
+
@log.error("Error reading YAML header")
|
761
760
|
@log.error(e)
|
762
761
|
MDLess.meta = {}
|
763
762
|
rescue StandardError => e
|
@@ -769,10 +768,10 @@ module Redcarpet
|
|
769
768
|
longest = longest < MDLess.cols ? longest + 1 : MDLess.cols
|
770
769
|
lines.map do |line|
|
771
770
|
if line =~ /^[-.]{3}\s*$/
|
772
|
-
line = "#{color(
|
771
|
+
line = "#{color("metadata marker")}#{"%" * longest}"
|
773
772
|
else
|
774
773
|
line.sub!(/^(.*?:)[ \t]+(\S)/, '\1 \2')
|
775
|
-
line = "#{color(
|
774
|
+
line = "#{color("metadata marker")}% #{color("metadata color")}#{line}"
|
776
775
|
end
|
777
776
|
line += "\u00A0" * (longest - line.uncolor.strip.length) if (longest - line.uncolor.strip.length).positive?
|
778
777
|
line + xc
|
@@ -781,7 +780,7 @@ module Redcarpet
|
|
781
780
|
end
|
782
781
|
|
783
782
|
if !in_yaml && first_line =~ /(?i-m)^[\w ]+:\s+\S+/
|
784
|
-
MDLess.log.info(
|
783
|
+
MDLess.log.info("Found MMD Headers")
|
785
784
|
input.sub!(/(?i-m)^([\S ]+:[\s\S]*?)+(?=\n *\n)/) do |mmd|
|
786
785
|
lines = mmd.split(/\n/)
|
787
786
|
return mmd if lines.count > 20
|
@@ -793,11 +792,11 @@ module Redcarpet
|
|
793
792
|
line.sub!(/^(.*?:)[ \t]+(\S)/, '\1 \2')
|
794
793
|
parts = line.match(/^[ \t]*(\S.*?):[ \t]+(\S.*?)$/)
|
795
794
|
if parts
|
796
|
-
key = parts[1].gsub(/[^a-z0-9\-_]/i,
|
795
|
+
key = parts[1].gsub(/[^a-z0-9\-_]/i, "")
|
797
796
|
value = parts[2].strip
|
798
797
|
MDLess.meta[key] = value
|
799
798
|
end
|
800
|
-
line = "#{color(
|
799
|
+
line = "#{color("metadata marker")}%#{color("metadata color")}#{line}"
|
801
800
|
line += "\u00A0" * (longest - line.uncolor.strip.length) if (longest - line.uncolor.strip.length).positive?
|
802
801
|
line + xc
|
803
802
|
end.join("\n") + "#{xc}\n"
|
@@ -808,15 +807,15 @@ module Redcarpet
|
|
808
807
|
end
|
809
808
|
|
810
809
|
def mmd_transclude(input)
|
811
|
-
return input unless MDLess.file || MDLess.meta.key?(
|
810
|
+
return input unless MDLess.file || MDLess.meta.key?("transcludebase")
|
812
811
|
|
813
812
|
input.gsub(/^{{(.*?)}}/) do |m|
|
814
813
|
filename = Regexp.last_match(1).strip
|
815
|
-
file = if MDLess.meta.key?(
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
814
|
+
file = if MDLess.meta.key?("transcludebase")
|
815
|
+
File.join(File.expand_path(MDLess.meta["transcludebase"]), filename)
|
816
|
+
else
|
817
|
+
File.join(File.dirname(MDLess.file), filename)
|
818
|
+
end
|
820
819
|
File.exist?(file) ? "\n\n#{mmd_transclude(IO.read(file).remove_meta)}\n\n" : m
|
821
820
|
end
|
822
821
|
end
|
@@ -851,7 +850,7 @@ module Redcarpet
|
|
851
850
|
|
852
851
|
if MDLess.options[:section]
|
853
852
|
new_content = []
|
854
|
-
MDLess.log.info("Matching section(s) #{MDLess.options[:section].join(
|
853
|
+
MDLess.log.info("Matching section(s) #{MDLess.options[:section].join(", ")}")
|
855
854
|
MDLess.options[:section].each do |sect|
|
856
855
|
comparison = MDLess.options[:section][0].is_a?(String) ? :regex : :numeric
|
857
856
|
|
@@ -888,7 +887,7 @@ module Redcarpet
|
|
888
887
|
# definition lists
|
889
888
|
input.gsub!(/(?mi)(?<=\n|\A)(?<term>(?!<:)[^\n]+)(?<def>(\n+: [^\n]+)+)/) do
|
890
889
|
m = Regexp.last_match
|
891
|
-
"#{color(
|
890
|
+
"#{color("dd term")}#{m["term"]}#{xc}#{color("dd color")}#{color_dd_def(m["def"])}"
|
892
891
|
end
|
893
892
|
|
894
893
|
input
|
@@ -898,11 +897,11 @@ module Redcarpet
|
|
898
897
|
input.gsub(/(?<=\n|\A)(?::)\s+(.*)/) do
|
899
898
|
m = Regexp.last_match
|
900
899
|
[
|
901
|
-
color(
|
900
|
+
color("dd marker"),
|
902
901
|
": ",
|
903
|
-
color(
|
902
|
+
color("dd color"),
|
904
903
|
m[1],
|
905
|
-
xc
|
904
|
+
xc,
|
906
905
|
].join
|
907
906
|
end
|
908
907
|
end
|
@@ -910,7 +909,7 @@ module Redcarpet
|
|
910
909
|
def color_links(input)
|
911
910
|
input.gsub(/(?mi)(?<!\\e)\[(?<text>[^\[]+)\]\((?<url>\S+)(?: +"(?<title>.*?)")? *\)/) do
|
912
911
|
m = Regexp.last_match
|
913
|
-
color_link(m[
|
912
|
+
color_link(m["url"].uncolor, m["title"]&.uncolor, m["text"].uncolor)
|
914
913
|
end
|
915
914
|
end
|
916
915
|
|
@@ -924,13 +923,26 @@ module Redcarpet
|
|
924
923
|
links_added = false
|
925
924
|
|
926
925
|
@@links.each do |link|
|
927
|
-
if graf =~ /#{Regexp.escape(link[:link].gsub(/\n/,
|
926
|
+
if graf =~ /#{Regexp.escape(link[:link].gsub(/\n/, " "))}/
|
927
|
+
table = graf.uncolor =~ /^ *\|/
|
928
928
|
url = link[:url].uncolor
|
929
929
|
content = link[:content]
|
930
930
|
title = link[:title]&.uncolor
|
931
931
|
image = link.key?(:image) && link[:image] ? true : false
|
932
932
|
colored_link = image ? color_image_reference(counter, content) : color_link_reference(url, counter, content)
|
933
|
-
|
933
|
+
if table
|
934
|
+
diff = link[:link].gsub(/\n/, " ").uncolor.length - colored_link.uncolor.gsub(/\n/, " ").length
|
935
|
+
graf.gsub!(/(?<=\|)([^\|]*?)#{Regexp.escape(link[:link].gsub(/\n/, " "))}(.*?)(?=\|)/) do
|
936
|
+
before = Regexp.last_match(1)
|
937
|
+
after = Regexp.last_match(2)
|
938
|
+
surround = "#{before}#{after}"
|
939
|
+
puts "**#{surround}**"
|
940
|
+
diff += 2 if surround.uncolor.gsub(/#{CLIMarkdown::MDTableCleanup::PAD_CHAR}*/, "").strip.length.zero?
|
941
|
+
"#{before}#{colored_link}#{after}#{" " * diff}"
|
942
|
+
end
|
943
|
+
else
|
944
|
+
graf.gsub!(/#{Regexp.escape(link[:link].gsub(/\n/, " "))}/, colored_link)
|
945
|
+
end
|
934
946
|
if MDLess.options[:links] == :paragraph
|
935
947
|
if links_added
|
936
948
|
graf += "\n#{color_reference_link(url, title, counter, image: image)}"
|
@@ -957,56 +969,56 @@ module Redcarpet
|
|
957
969
|
def fix_colors(input)
|
958
970
|
input.gsub(/<<pre(?<id>\d+)>>(?<content>.*?)<<post\k<id>>>/m) do
|
959
971
|
m = Regexp.last_match
|
960
|
-
pre = m.pre_match.gsub(/<<pre(?<id>\d+)>>.*?<<post\k<id>>>/m,
|
972
|
+
pre = m.pre_match.gsub(/<<pre(?<id>\d+)>>.*?<<post\k<id>>>/m, "")
|
961
973
|
last_color = pre.last_color_code
|
962
974
|
|
963
|
-
"#{fix_colors(m[
|
964
|
-
end.gsub(/<<(pre|post)\d+>>/,
|
975
|
+
"#{fix_colors(m["content"])}#{last_color}"
|
976
|
+
end.gsub(/<<(pre|post)\d+>>/, "")
|
965
977
|
end
|
966
978
|
|
967
979
|
def render_images(input)
|
968
980
|
input.gsub(%r{<<img>>(.*?)<</img>>}) do
|
969
981
|
link, title, alt_text = Regexp.last_match(1).split(/\|\|/)
|
970
982
|
|
971
|
-
if (exec_available(
|
972
|
-
if exec_available(
|
973
|
-
MDLess.log.info(
|
974
|
-
elsif exec_available(
|
975
|
-
MDLess.log.info(
|
983
|
+
if (exec_available("imgcat") || exec_available("chafa")) && MDLess.options[:local_images]
|
984
|
+
if exec_available("imgcat")
|
985
|
+
MDLess.log.info("Using imgcat for image rendering")
|
986
|
+
elsif exec_available("chafa")
|
987
|
+
MDLess.log.info("Using chafa for image rendering")
|
976
988
|
end
|
977
989
|
img_path = link
|
978
990
|
if img_path =~ /^http/ && MDLess.options[:remote_images]
|
979
|
-
if exec_available(
|
980
|
-
MDLess.log.info(
|
991
|
+
if exec_available("imgcat")
|
992
|
+
MDLess.log.info("Using imgcat for image rendering")
|
981
993
|
begin
|
982
994
|
res, s = Open3.capture2(%(curl -sS "#{img_path}" 2> /dev/null | imgcat))
|
983
995
|
|
984
996
|
if s.success?
|
985
|
-
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" :
|
986
|
-
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" :
|
997
|
+
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ""
|
998
|
+
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ""
|
987
999
|
result = pre + res + post
|
988
1000
|
end
|
989
1001
|
rescue StandardError => e
|
990
1002
|
MDLess.log.error(e)
|
991
1003
|
end
|
992
|
-
elsif exec_available(
|
993
|
-
MDLess.log.info(
|
994
|
-
term =
|
995
|
-
term = ENV[
|
996
|
-
term = ENV[
|
997
|
-
FileUtils.rm_r
|
998
|
-
Dir.mkdir(
|
999
|
-
Dir.chdir(
|
1004
|
+
elsif exec_available("chafa")
|
1005
|
+
MDLess.log.info("Using chafa for image rendering")
|
1006
|
+
term = "-f sixels"
|
1007
|
+
term = ENV["TERMINAL_PROGRAM"] =~ /iterm/i ? "-f iterm" : term
|
1008
|
+
term = ENV["TERMINAL_PROGRAM"] =~ /kitty/i ? "-f kitty" : term
|
1009
|
+
FileUtils.rm_r ".mdless_tmp", force: true if File.directory?(".mdless_tmp")
|
1010
|
+
Dir.mkdir(".mdless_tmp")
|
1011
|
+
Dir.chdir(".mdless_tmp")
|
1000
1012
|
`curl -SsO #{img_path} 2> /dev/null`
|
1001
1013
|
tmp_img = File.basename(img_path)
|
1002
1014
|
img = `chafa #{term} "#{tmp_img}"`
|
1003
|
-
pre = alt_text ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" :
|
1004
|
-
post = title ? "\n #{c(%i[b blue])}-- #{title} --" :
|
1015
|
+
pre = alt_text ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ""
|
1016
|
+
post = title ? "\n #{c(%i[b blue])}-- #{title} --" : ""
|
1005
1017
|
result = pre + img + post
|
1006
|
-
Dir.chdir(
|
1007
|
-
FileUtils.rm_r
|
1018
|
+
Dir.chdir("..")
|
1019
|
+
FileUtils.rm_r ".mdless_tmp", force: true
|
1008
1020
|
else
|
1009
|
-
MDLess.log.warn(
|
1021
|
+
MDLess.log.warn("No viewer for remote images")
|
1010
1022
|
end
|
1011
1023
|
else
|
1012
1024
|
if img_path =~ %r{^[~/]}
|
@@ -1016,14 +1028,14 @@ module Redcarpet
|
|
1016
1028
|
img_path = File.join(base, img_path)
|
1017
1029
|
end
|
1018
1030
|
if File.exist?(img_path)
|
1019
|
-
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" :
|
1020
|
-
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" :
|
1021
|
-
if exec_available(
|
1031
|
+
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ""
|
1032
|
+
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ""
|
1033
|
+
if exec_available("imgcat")
|
1022
1034
|
img = `imgcat "#{img_path}"`
|
1023
|
-
elsif exec_available(
|
1024
|
-
term =
|
1025
|
-
term = ENV[
|
1026
|
-
term = ENV[
|
1035
|
+
elsif exec_available("chafa")
|
1036
|
+
term = "-f sixels"
|
1037
|
+
term = ENV["TERMINAL_PROGRAM"] =~ /iterm/i ? "-f iterm" : term
|
1038
|
+
term = ENV["TERMINAL_PROGRAM"] =~ /kitty/i ? "-f kitty" : term
|
1027
1039
|
img = `chafa #{term} "#{img_path}"`
|
1028
1040
|
end
|
1029
1041
|
result = pre + img + post
|
@@ -1050,36 +1062,36 @@ module Redcarpet
|
|
1050
1062
|
end
|
1051
1063
|
[
|
1052
1064
|
pre_element,
|
1053
|
-
color(
|
1065
|
+
color("math brackets"),
|
1054
1066
|
brackets[0],
|
1055
1067
|
xc,
|
1056
|
-
color(
|
1068
|
+
color("math equation"),
|
1057
1069
|
equat,
|
1058
|
-
color(
|
1070
|
+
color("math brackets"),
|
1059
1071
|
brackets[1],
|
1060
1072
|
xc,
|
1061
|
-
post_element
|
1073
|
+
post_element,
|
1062
1074
|
].join
|
1063
1075
|
end
|
1064
1076
|
end
|
1065
1077
|
|
1066
1078
|
def highlight_tags(input)
|
1067
|
-
tag_color = color(
|
1068
|
-
value_color = color(
|
1079
|
+
tag_color = color("at_tags tag")
|
1080
|
+
value_color = color("at_tags value")
|
1069
1081
|
input.gsub(/(?<pre>\s|m)(?<tag>@[^ \]:;.?!,("'\n]+)(?:(?<lparen>\()(?<value>.*?)(?<rparen>\)))?/) do
|
1070
1082
|
m = Regexp.last_match
|
1071
1083
|
last_color = m.pre_match.last_color_code
|
1072
1084
|
[
|
1073
|
-
m[
|
1085
|
+
m["pre"],
|
1074
1086
|
tag_color,
|
1075
|
-
m[
|
1076
|
-
m[
|
1087
|
+
m["tag"],
|
1088
|
+
m["lparen"],
|
1077
1089
|
value_color,
|
1078
|
-
m[
|
1090
|
+
m["value"],
|
1079
1091
|
tag_color,
|
1080
|
-
m[
|
1092
|
+
m["rparen"],
|
1081
1093
|
xc,
|
1082
|
-
last_color
|
1094
|
+
last_color,
|
1083
1095
|
].join
|
1084
1096
|
end
|
1085
1097
|
end
|
@@ -1089,14 +1101,14 @@ module Redcarpet
|
|
1089
1101
|
content = Regexp.last_match(1)
|
1090
1102
|
[
|
1091
1103
|
pre_element,
|
1092
|
-
color(
|
1093
|
-
|
1094
|
-
color(
|
1104
|
+
color("link brackets"),
|
1105
|
+
"[[",
|
1106
|
+
color("link text"),
|
1095
1107
|
content,
|
1096
|
-
color(
|
1097
|
-
|
1108
|
+
color("link brackets"),
|
1109
|
+
"]]",
|
1098
1110
|
xc,
|
1099
|
-
post_element
|
1111
|
+
post_element,
|
1100
1112
|
].join
|
1101
1113
|
end
|
1102
1114
|
end
|