mdless 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +15 -0
- data/lib/mdless/colors.rb +113 -0
- data/lib/mdless/console.rb +184 -101
- data/lib/mdless/converter.rb +7 -3
- data/lib/mdless/string.rb +12 -0
- data/lib/mdless/theme.rb +16 -2
- data/lib/mdless/version.rb +3 -1
- data/lib/mdless.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a8bb0bc65cda56264422a8f0fc98ed7c8d75f67d6604791fe157d111223d358
|
4
|
+
data.tar.gz: 25fa19dec8c2c34bccaa00b3fccf542c13384e12498cda7f1b529f703a7b8399
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65664be5ef8893f3f2c1e377633bdb69c3780e2a957c2f555e50add0e059242a966663bb0faaf609d6a9015d4ec49aba18c849bcdee58bc62e2ab7cd251505e2
|
7
|
+
data.tar.gz: 6b784620a50a0c182a49244640bf278e7ab19a6e3e840d8bc1c83eb308709f5fcb0979120157b8671101b0135cbec6a1bf52ec3cd42d765ae08aed8a940cab45
|
data/README.md
CHANGED
@@ -94,6 +94,21 @@ Font and color settings are set using a string of color names and modifiers. A t
|
|
94
94
|
|
95
95
|
Some extra (non-color) settings are available for certain keys, e.g. `pad_char` to define the right padding character used on level 1 and 2 headlines. Note that you can change the [Pygments](http://pygments.org/) theme used for syntax highlighting with the code_block.pygments_theme setting. For a list of available styles (assuming you have Pygments installed), use `pygmentize -L styles`.
|
96
96
|
|
97
|
+
The display of characters around emphasis and code spans can be configured. By default, the surrounding character for bold is `**`, italic is `_`, and code span is \`. You can leave these keys empty to not display characters at all. For triple-emphasized text, the text will be surrounded by italic and bold characters, in that order.
|
98
|
+
|
99
|
+
```yaml
|
100
|
+
emphasis:
|
101
|
+
bold: b
|
102
|
+
bold_character: "**"
|
103
|
+
italic: u i
|
104
|
+
italic_character: ""
|
105
|
+
bold-italic: b u i
|
106
|
+
code_span:
|
107
|
+
marker: b white
|
108
|
+
color: b white on_intense_black
|
109
|
+
character: ""
|
110
|
+
```
|
111
|
+
|
97
112
|
*Note:* the ANSI escape codes are reset every time the color changes, so, for example, if you have a key that defines underlines for the url in a link, the underline will automatically be removed when it gets to a bracket. This also means that if you define a background color, you'll need to define it again on all the keys that it should affect.
|
98
113
|
|
99
114
|
Base colors:
|
data/lib/mdless/colors.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module CLIMarkdown
|
2
2
|
module Colors
|
3
|
+
ESCAPE_REGEX = /(?<=\[)(?:(?:(?:[349]|10)[0-9]|[0-9])?;?)+(?=m)/.freeze
|
3
4
|
|
4
5
|
COLORS = {
|
5
6
|
:reset => 0, # synonym for :clear
|
@@ -57,6 +58,118 @@ module CLIMarkdown
|
|
57
58
|
self.gsub(/\e\[[\d;]+m/,'')
|
58
59
|
end
|
59
60
|
|
61
|
+
# Get the calculated ANSI color at the end of the
|
62
|
+
# string
|
63
|
+
#
|
64
|
+
# @return ANSI escape sequence to match color
|
65
|
+
#
|
66
|
+
def last_color_code
|
67
|
+
m = scan(ESCAPE_REGEX)
|
68
|
+
|
69
|
+
em = ['0']
|
70
|
+
fg = nil
|
71
|
+
bg = nil
|
72
|
+
rgbf = nil
|
73
|
+
rgbb = nil
|
74
|
+
|
75
|
+
m.each do |c|
|
76
|
+
case c
|
77
|
+
when '0'
|
78
|
+
em = ['0']
|
79
|
+
fg, bg, rgbf, rgbb = nil
|
80
|
+
when /^[34]8/
|
81
|
+
case c
|
82
|
+
when /^3/
|
83
|
+
fg = nil
|
84
|
+
rgbf = c
|
85
|
+
when /^4/
|
86
|
+
bg = nil
|
87
|
+
rgbb = c
|
88
|
+
end
|
89
|
+
else
|
90
|
+
c.split(/;/).each do |i|
|
91
|
+
x = i.to_i
|
92
|
+
if x <= 9
|
93
|
+
em << x
|
94
|
+
elsif x >= 30 && x <= 39
|
95
|
+
rgbf = nil
|
96
|
+
fg = x
|
97
|
+
elsif x >= 40 && x <= 49
|
98
|
+
rgbb = nil
|
99
|
+
bg = x
|
100
|
+
elsif x >= 90 && x <= 97
|
101
|
+
rgbf = nil
|
102
|
+
fg = x
|
103
|
+
elsif x >= 100 && x <= 107
|
104
|
+
rgbb = nil
|
105
|
+
bg = x
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
escape = "\e[#{em.join(';')}m"
|
112
|
+
escape += "\e[#{rgbb}m" if rgbb
|
113
|
+
escape += "\e[#{rgbf}m" if rgbf
|
114
|
+
escape + "\e[#{[fg, bg].delete_if(&:nil?).join(';')}m"
|
115
|
+
end
|
116
|
+
|
117
|
+
# Get the calculated ANSI color at the end of the
|
118
|
+
# string
|
119
|
+
#
|
120
|
+
# @return ANSI escape sequence to match color
|
121
|
+
#
|
122
|
+
def last_color_code
|
123
|
+
m = scan(ESCAPE_REGEX)
|
124
|
+
|
125
|
+
em = ['0']
|
126
|
+
fg = nil
|
127
|
+
bg = nil
|
128
|
+
rgbf = nil
|
129
|
+
rgbb = nil
|
130
|
+
|
131
|
+
m.each do |c|
|
132
|
+
case c
|
133
|
+
when '0'
|
134
|
+
em = ['0']
|
135
|
+
fg, bg, rgbf, rgbb = nil
|
136
|
+
when /^[34]8/
|
137
|
+
case c
|
138
|
+
when /^3/
|
139
|
+
fg = nil
|
140
|
+
rgbf = c
|
141
|
+
when /^4/
|
142
|
+
bg = nil
|
143
|
+
rgbb = c
|
144
|
+
end
|
145
|
+
else
|
146
|
+
c.split(/;/).each do |i|
|
147
|
+
x = i.to_i
|
148
|
+
if x <= 9
|
149
|
+
em << x
|
150
|
+
elsif x >= 30 && x <= 39
|
151
|
+
rgbf = nil
|
152
|
+
fg = x
|
153
|
+
elsif x >= 40 && x <= 49
|
154
|
+
rgbb = nil
|
155
|
+
bg = x
|
156
|
+
elsif x >= 90 && x <= 97
|
157
|
+
rgbf = nil
|
158
|
+
fg = x
|
159
|
+
elsif x >= 100 && x <= 107
|
160
|
+
rgbb = nil
|
161
|
+
bg = x
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
escape = "\e[#{em.join(';')}m"
|
168
|
+
escape += "\e[#{rgbb}m" if rgbb
|
169
|
+
escape += "\e[#{rgbf}m" if rgbf
|
170
|
+
escape + "\e[#{[fg, bg].delete_if(&:nil?).join(';')}m"
|
171
|
+
end
|
172
|
+
|
60
173
|
def blackout(bgcolor)
|
61
174
|
key = bgcolor.to_sym
|
62
175
|
bg = COLORS.key?(key) ? COLORS[key] : 40
|
data/lib/mdless/console.rb
CHANGED
@@ -7,11 +7,21 @@ module Redcarpet
|
|
7
7
|
|
8
8
|
@@listitemid = 0
|
9
9
|
@@listid = 0
|
10
|
+
@@elementid = 0
|
10
11
|
@@footnotes = []
|
11
12
|
@@headers = []
|
12
13
|
@@links = []
|
13
14
|
@@footer_links = []
|
14
15
|
|
16
|
+
def pre_element
|
17
|
+
@@elementid += 1
|
18
|
+
"<<pre#{@@elementid}>>"
|
19
|
+
end
|
20
|
+
|
21
|
+
def post_element
|
22
|
+
"<<post#{@@elementid}>>"
|
23
|
+
end
|
24
|
+
|
15
25
|
def xc
|
16
26
|
x + color('text')
|
17
27
|
end
|
@@ -268,42 +278,72 @@ module Redcarpet
|
|
268
278
|
|
269
279
|
def autolink(link, _)
|
270
280
|
[
|
281
|
+
pre_element,
|
271
282
|
color('link brackets'),
|
272
283
|
'<',
|
273
284
|
color('link url'),
|
274
285
|
link,
|
275
286
|
color('link brackets'),
|
276
287
|
'>',
|
277
|
-
xc
|
288
|
+
xc,
|
289
|
+
post_element
|
278
290
|
].join('')
|
279
291
|
end
|
280
292
|
|
281
293
|
def codespan(code)
|
282
294
|
[
|
295
|
+
pre_element,
|
283
296
|
color('code_span marker'),
|
284
|
-
'
|
297
|
+
@theme['code_span']['character'],
|
285
298
|
color('code_span color'),
|
286
299
|
code,
|
287
300
|
color('code_span marker'),
|
288
|
-
'
|
289
|
-
xc
|
301
|
+
@theme['code_span']['character'],
|
302
|
+
xc,
|
303
|
+
post_element
|
290
304
|
].join('')
|
291
305
|
end
|
292
306
|
|
293
307
|
def double_emphasis(text)
|
294
|
-
|
308
|
+
[
|
309
|
+
pre_element,
|
310
|
+
color('emphasis bold'),
|
311
|
+
@theme['emphasis']['bold_character'],
|
312
|
+
text,
|
313
|
+
@theme['emphasis']['bold_character'],
|
314
|
+
xc,
|
315
|
+
post_element
|
316
|
+
].join
|
295
317
|
end
|
296
318
|
|
297
319
|
def emphasis(text)
|
298
|
-
|
320
|
+
[
|
321
|
+
pre_element,
|
322
|
+
color('emphasis italic'),
|
323
|
+
@theme['emphasis']['italic_character'],
|
324
|
+
text,
|
325
|
+
@theme['emphasis']['italic_character'],
|
326
|
+
xc,
|
327
|
+
post_element
|
328
|
+
].join
|
299
329
|
end
|
300
330
|
|
301
331
|
def triple_emphasis(text)
|
302
|
-
|
332
|
+
[
|
333
|
+
pre_element,
|
334
|
+
color('emphasis bold-italic'),
|
335
|
+
@theme['emphasis']['italic_character'],
|
336
|
+
@theme['emphasis']['bold_character'],
|
337
|
+
text,
|
338
|
+
@theme['emphasis']['bold_character'],
|
339
|
+
@theme['emphasis']['italic_character'],
|
340
|
+
xc,
|
341
|
+
post_element
|
342
|
+
].join
|
303
343
|
end
|
304
344
|
|
305
345
|
def highlight(text)
|
306
|
-
"#{color('highlight')}#{text}#{xc}"
|
346
|
+
"#{pre_element}#{color('highlight')}#{text}#{xc}#{post_element}"
|
307
347
|
end
|
308
348
|
|
309
349
|
def color_image_tag(link, title, alt_text)
|
@@ -321,78 +361,12 @@ module Redcarpet
|
|
321
361
|
title.nil? ? '' : %( "#{title}"),
|
322
362
|
color('image brackets'),
|
323
363
|
')',
|
324
|
-
xc
|
364
|
+
xc,
|
325
365
|
].join
|
326
366
|
end
|
327
367
|
|
328
368
|
def image(link, title, alt_text)
|
329
|
-
|
330
|
-
if exec_available('imgcat')
|
331
|
-
@log.info('Using imgcat for image rendering')
|
332
|
-
elsif exec_available('chafa')
|
333
|
-
@log.info('Using chafa for image rendering')
|
334
|
-
end
|
335
|
-
img_path = link
|
336
|
-
if img_path =~ /^http/ && @options[:remote_images]
|
337
|
-
if exec_available('imgcat')
|
338
|
-
@log.info('Using imgcat for image rendering')
|
339
|
-
begin
|
340
|
-
res, s = Open3.capture2(%(curl -sS "#{img_path}" 2> /dev/null | imgcat))
|
341
|
-
|
342
|
-
if s.success?
|
343
|
-
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
|
344
|
-
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ''
|
345
|
-
result = pre + res + post
|
346
|
-
end
|
347
|
-
rescue StandardError => e
|
348
|
-
@log.error(e)
|
349
|
-
end
|
350
|
-
elsif exec_available('chafa')
|
351
|
-
@log.info('Using chafa for image rendering')
|
352
|
-
term = '-f sixels'
|
353
|
-
term = ENV['TERMINAL_PROGRAM'] =~ /iterm/i ? '-f iterm' : term
|
354
|
-
term = ENV['TERMINAL_PROGRAM'] =~ /kitty/i ? '-f kitty' : term
|
355
|
-
FileUtils.rm_r '.mdless_tmp', force: true if File.directory?('.mdless_tmp')
|
356
|
-
Dir.mkdir('.mdless_tmp')
|
357
|
-
Dir.chdir('.mdless_tmp')
|
358
|
-
`curl -SsO #{img_path} 2> /dev/null`
|
359
|
-
tmp_img = File.basename(img_path)
|
360
|
-
img = `chafa #{term} "#{tmp_img}"`
|
361
|
-
pre = alt_text ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
|
362
|
-
post = title ? "\n #{c(%i[b blue])}-- #{tail} --" : ''
|
363
|
-
result = pre + img + post
|
364
|
-
Dir.chdir('..')
|
365
|
-
FileUtils.rm_r '.mdless_tmp', force: true
|
366
|
-
else
|
367
|
-
@log.warn('No viewer for remote images')
|
368
|
-
end
|
369
|
-
else
|
370
|
-
if img_path =~ %r{^[~/]}
|
371
|
-
img_path = File.expand_path(img_path)
|
372
|
-
elsif @file
|
373
|
-
base = File.expand_path(File.dirname(@file))
|
374
|
-
img_path = File.join(base, img_path)
|
375
|
-
end
|
376
|
-
if File.exist?(img_path)
|
377
|
-
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
|
378
|
-
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ''
|
379
|
-
if exec_available('imgcat')
|
380
|
-
img = `imgcat "#{img_path}"`
|
381
|
-
elsif exec_available('chafa')
|
382
|
-
term = '-f sixels'
|
383
|
-
term = ENV['TERMINAL_PROGRAM'] =~ /iterm/i ? '-f iterm' : term
|
384
|
-
term = ENV['TERMINAL_PROGRAM'] =~ /kitty/i ? '-f kitty' : term
|
385
|
-
img = `chafa #{term} "#{img_path}"`
|
386
|
-
end
|
387
|
-
result = pre + img + post
|
388
|
-
end
|
389
|
-
end
|
390
|
-
end
|
391
|
-
if result.nil?
|
392
|
-
color_image_tag(link, title, alt_text)
|
393
|
-
else
|
394
|
-
result + xc
|
395
|
-
end
|
369
|
+
"<<img>>#{link}||#{title}||#{alt_text}<</img>>"
|
396
370
|
end
|
397
371
|
|
398
372
|
def linebreak
|
@@ -401,6 +375,7 @@ module Redcarpet
|
|
401
375
|
|
402
376
|
def color_link(link, title, content)
|
403
377
|
[
|
378
|
+
pre_element,
|
404
379
|
color('link brackets'),
|
405
380
|
'[',
|
406
381
|
color('link text'),
|
@@ -412,12 +387,14 @@ module Redcarpet
|
|
412
387
|
title.nil? ? '' : %( "#{title}"),
|
413
388
|
color('link brackets'),
|
414
389
|
')',
|
415
|
-
xc
|
390
|
+
xc,
|
391
|
+
post_element
|
416
392
|
].join
|
417
393
|
end
|
418
394
|
|
419
395
|
def color_link_reference(link, idx, content)
|
420
396
|
[
|
397
|
+
pre_element,
|
421
398
|
color('link brackets'),
|
422
399
|
'[',
|
423
400
|
color('link text'),
|
@@ -428,7 +405,8 @@ module Redcarpet
|
|
428
405
|
idx,
|
429
406
|
color('link brackets'),
|
430
407
|
']',
|
431
|
-
xc
|
408
|
+
xc,
|
409
|
+
post_element
|
432
410
|
].join
|
433
411
|
end
|
434
412
|
|
@@ -461,19 +439,19 @@ module Redcarpet
|
|
461
439
|
end
|
462
440
|
|
463
441
|
def color_tags(html)
|
464
|
-
html.gsub(%r{(<\S+(
|
442
|
+
html.gsub(%r{(<\S+( [^>]+)?>)}, "#{color('html brackets')}\\1#{xc}")
|
465
443
|
end
|
466
444
|
|
467
445
|
def raw_html(raw_html)
|
468
|
-
"#{color('html color')}#{color_tags(raw_html)}#{xc}"
|
446
|
+
"#{pre_element}#{color('html color')}#{color_tags(raw_html)}#{xc}#{post_element}"
|
469
447
|
end
|
470
448
|
|
471
449
|
def strikethrough(text)
|
472
|
-
"#{color('strikethrough')}#{text}#{xc}"
|
450
|
+
"#{pre_element}#{color('strikethrough')}#{text}#{xc}#{post_element}"
|
473
451
|
end
|
474
452
|
|
475
453
|
def superscript(text)
|
476
|
-
"#{color('super')}^#{text}#{xc}"
|
454
|
+
"#{pre_element}#{color('super')}^#{text}#{xc}#{post_element}"
|
477
455
|
end
|
478
456
|
|
479
457
|
def footnotes(text)
|
@@ -511,9 +489,11 @@ module Redcarpet
|
|
511
489
|
|
512
490
|
def footnote_ref(text)
|
513
491
|
[
|
492
|
+
pre_element,
|
514
493
|
color('footnote title'),
|
515
494
|
"[^#{text}]",
|
516
|
-
xc
|
495
|
+
xc,
|
496
|
+
post_element
|
517
497
|
].join('')
|
518
498
|
end
|
519
499
|
|
@@ -572,7 +552,8 @@ module Redcarpet
|
|
572
552
|
|
573
553
|
def preprocess(input)
|
574
554
|
in_yaml = false
|
575
|
-
|
555
|
+
first_line = input.split("\n").first
|
556
|
+
if first_line =~ /(?i-m)^---[ \t]*?$/
|
576
557
|
@log.info('Found YAML')
|
577
558
|
# YAML
|
578
559
|
in_yaml = true
|
@@ -596,10 +577,12 @@ module Redcarpet
|
|
596
577
|
end
|
597
578
|
end
|
598
579
|
|
599
|
-
if !in_yaml &&
|
580
|
+
if !in_yaml && first_line =~ /(?i-m)^[\w ]+:\s+\S+/
|
600
581
|
@log.info('Found MMD Headers')
|
601
582
|
input.sub!(/(?i-m)^([\S ]+:[\s\S]*?)+(?=\n\n)/) do |mmd|
|
602
583
|
lines = mmd.split(/\n/)
|
584
|
+
return mmd if lines.count > 20
|
585
|
+
|
603
586
|
longest = lines.inject { |memo, word| memo.length > word.length ? memo : word }.length
|
604
587
|
longest = longest < @cols ? longest + 1 : @cols
|
605
588
|
lines.map do |line|
|
@@ -717,7 +700,117 @@ module Redcarpet
|
|
717
700
|
end
|
718
701
|
end
|
719
702
|
|
703
|
+
def fix_colors(input)
|
704
|
+
input.gsub(/<<pre(?<id>\d+)>>(?<content>.*?)<<post\k<id>>>/m) do
|
705
|
+
m = Regexp.last_match
|
706
|
+
pre = m.pre_match
|
707
|
+
last_color = pre.last_color_code
|
708
|
+
"#{fix_colors(m['content'])}#{last_color}"
|
709
|
+
end.gsub(/<<(pre|post)\d+>>/, '')
|
710
|
+
end
|
711
|
+
|
712
|
+
def render_images(input)
|
713
|
+
input.gsub(%r{<<img>>(.*?)<</img>>}) do
|
714
|
+
link, title, alt_text = Regexp.last_match(1).split(/\|\|/)
|
715
|
+
|
716
|
+
if (exec_available('imgcat') || exec_available('chafa')) && @options[:local_images]
|
717
|
+
if exec_available('imgcat')
|
718
|
+
@log.info('Using imgcat for image rendering')
|
719
|
+
elsif exec_available('chafa')
|
720
|
+
@log.info('Using chafa for image rendering')
|
721
|
+
end
|
722
|
+
img_path = link
|
723
|
+
if img_path =~ /^http/ && @options[:remote_images]
|
724
|
+
if exec_available('imgcat')
|
725
|
+
@log.info('Using imgcat for image rendering')
|
726
|
+
begin
|
727
|
+
res, s = Open3.capture2(%(curl -sS "#{img_path}" 2> /dev/null | imgcat))
|
728
|
+
|
729
|
+
if s.success?
|
730
|
+
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
|
731
|
+
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ''
|
732
|
+
result = pre + res + post
|
733
|
+
end
|
734
|
+
rescue StandardError => e
|
735
|
+
@log.error(e)
|
736
|
+
end
|
737
|
+
elsif exec_available('chafa')
|
738
|
+
@log.info('Using chafa for image rendering')
|
739
|
+
term = '-f sixels'
|
740
|
+
term = ENV['TERMINAL_PROGRAM'] =~ /iterm/i ? '-f iterm' : term
|
741
|
+
term = ENV['TERMINAL_PROGRAM'] =~ /kitty/i ? '-f kitty' : term
|
742
|
+
FileUtils.rm_r '.mdless_tmp', force: true if File.directory?('.mdless_tmp')
|
743
|
+
Dir.mkdir('.mdless_tmp')
|
744
|
+
Dir.chdir('.mdless_tmp')
|
745
|
+
`curl -SsO #{img_path} 2> /dev/null`
|
746
|
+
tmp_img = File.basename(img_path)
|
747
|
+
img = `chafa #{term} "#{tmp_img}"`
|
748
|
+
pre = alt_text ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
|
749
|
+
post = title ? "\n #{c(%i[b blue])}-- #{tail} --" : ''
|
750
|
+
result = pre + img + post
|
751
|
+
Dir.chdir('..')
|
752
|
+
FileUtils.rm_r '.mdless_tmp', force: true
|
753
|
+
else
|
754
|
+
@log.warn('No viewer for remote images')
|
755
|
+
end
|
756
|
+
else
|
757
|
+
if img_path =~ %r{^[~/]}
|
758
|
+
img_path = File.expand_path(img_path)
|
759
|
+
elsif @file
|
760
|
+
base = File.expand_path(File.dirname(@file))
|
761
|
+
img_path = File.join(base, img_path)
|
762
|
+
end
|
763
|
+
if File.exist?(img_path)
|
764
|
+
pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
|
765
|
+
post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ''
|
766
|
+
if exec_available('imgcat')
|
767
|
+
img = `imgcat "#{img_path}"`
|
768
|
+
elsif exec_available('chafa')
|
769
|
+
term = '-f sixels'
|
770
|
+
term = ENV['TERMINAL_PROGRAM'] =~ /iterm/i ? '-f iterm' : term
|
771
|
+
term = ENV['TERMINAL_PROGRAM'] =~ /kitty/i ? '-f kitty' : term
|
772
|
+
img = `chafa #{term} "#{img_path}"`
|
773
|
+
end
|
774
|
+
result = pre + img + post
|
775
|
+
end
|
776
|
+
end
|
777
|
+
end
|
778
|
+
if result.nil?
|
779
|
+
color_image_tag(link, title, alt_text)
|
780
|
+
else
|
781
|
+
"#{pre_element}#{result}#{xc}#{post_element}"
|
782
|
+
end
|
783
|
+
end
|
784
|
+
end
|
785
|
+
|
786
|
+
def fix_equations(input)
|
787
|
+
input.gsub(/((\\\\\[|\$\$)(.*?)(\\\\\]|\$\$)|(\\\\\(|\$)(.*?)(\\\\\)|\$))/) do
|
788
|
+
m = Regexp.last_match
|
789
|
+
if m[2]
|
790
|
+
brackets = [m[2], m[4]]
|
791
|
+
equat = m[3]
|
792
|
+
else
|
793
|
+
brackets = [m[5], m[7]]
|
794
|
+
equat = m[6]
|
795
|
+
end
|
796
|
+
[
|
797
|
+
pre_element,
|
798
|
+
color('math brackets'),
|
799
|
+
brackets[0],
|
800
|
+
xc,
|
801
|
+
color('math equation'),
|
802
|
+
equat,
|
803
|
+
color('math brackets'),
|
804
|
+
brackets[1],
|
805
|
+
xc,
|
806
|
+
post_element
|
807
|
+
].join
|
808
|
+
end
|
809
|
+
end
|
810
|
+
|
720
811
|
def postprocess(input)
|
812
|
+
input.scrub!
|
813
|
+
|
721
814
|
if @options[:inline_footnotes]
|
722
815
|
input = insert_footnotes(input)
|
723
816
|
else
|
@@ -731,25 +824,15 @@ module Redcarpet
|
|
731
824
|
# escaped characters
|
732
825
|
input.gsub!(/\\(\S)/, '\1')
|
733
826
|
# equations
|
734
|
-
input
|
735
|
-
m = Regexp.last_match
|
736
|
-
if m[2]
|
737
|
-
brackets = [m[2], m[4]]
|
738
|
-
equat = m[3]
|
739
|
-
else
|
740
|
-
brackets = [m[5], m[7]]
|
741
|
-
equat = m[6]
|
742
|
-
end
|
743
|
-
"#{c(%i[b black])}#{brackets[0]}#{xc}#{c(%i[b blue])}#{equat}#{c(%i[b black])}#{brackets[1]}" + xc
|
744
|
-
end
|
827
|
+
input = fix_equations(input)
|
745
828
|
# misc html
|
746
|
-
input.gsub!(%r{<br */?>}, "\n")
|
829
|
+
input.gsub!(%r{<br */?>}, "#{pre_element}\n#{post_element}")
|
747
830
|
# format links
|
748
|
-
if @options[:links] == :reference || @options[:links] == :paragraph
|
749
|
-
input = reference_links(input)
|
750
|
-
end
|
831
|
+
input = reference_links(input) if @options[:links] == :reference || @options[:links] == :paragraph
|
751
832
|
# lists
|
752
|
-
fix_lists(input, 0)
|
833
|
+
input = fix_lists(input, 0)
|
834
|
+
input = render_images(input) if @options[:local_images]
|
835
|
+
fix_colors(input)
|
753
836
|
end
|
754
837
|
end
|
755
838
|
end
|
data/lib/mdless/converter.rb
CHANGED
@@ -14,7 +14,7 @@ module CLIMarkdown
|
|
14
14
|
|
15
15
|
def initialize(args)
|
16
16
|
@log = Logger.new($stderr)
|
17
|
-
@log.level = Logger::
|
17
|
+
@log.level = Logger::WARN
|
18
18
|
|
19
19
|
@options = {}
|
20
20
|
config = File.expand_path('~/.config/mdless/config.yml')
|
@@ -47,11 +47,15 @@ module CLIMarkdown
|
|
47
47
|
opts.on('-i', '--images=TYPE',
|
48
48
|
'Include [local|remote (both)] images in output (requires chafa or imgcat, default NONE).') do |type|
|
49
49
|
if exec_available('imgcat') || exec_available('chafa')
|
50
|
-
|
50
|
+
case type
|
51
|
+
when /^(r|b|a)/i
|
51
52
|
@options[:local_images] = true
|
52
53
|
@options[:remote_images] = true
|
53
|
-
|
54
|
+
when /^l/i
|
54
55
|
@options[:local_images] = true
|
56
|
+
when /^n/
|
57
|
+
@options[:local_images] = false
|
58
|
+
@options[:remote_images] = false
|
55
59
|
end
|
56
60
|
else
|
57
61
|
@log.warn('images turned on but imgcat/chafa not found')
|
data/lib/mdless/theme.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module CLIMarkdown
|
2
2
|
module Theme
|
3
|
-
|
4
3
|
THEME_DEFAULTS = {
|
5
4
|
'metadata' => {
|
6
5
|
'border' => 'd blue on_black',
|
@@ -9,9 +8,12 @@ module CLIMarkdown
|
|
9
8
|
},
|
10
9
|
'emphasis' => {
|
11
10
|
'bold' => 'b',
|
11
|
+
'bold_character' => '**',
|
12
12
|
'italic' => 'u i',
|
13
|
+
'italic_character' => '_',
|
13
14
|
'bold-italic' => 'b u i'
|
14
15
|
},
|
16
|
+
'highlight' => 'b black on_yellow',
|
15
17
|
'h1' => {
|
16
18
|
'color' => 'b intense_black on_white',
|
17
19
|
'pad' => 'd black on_white',
|
@@ -58,7 +60,8 @@ module CLIMarkdown
|
|
58
60
|
},
|
59
61
|
'code_span' => {
|
60
62
|
'marker' => 'b white',
|
61
|
-
'color' => 'b white on_intense_black'
|
63
|
+
'color' => 'b white on_intense_black',
|
64
|
+
'character' => '`'
|
62
65
|
},
|
63
66
|
'code_block' => {
|
64
67
|
'marker' => 'intense_black',
|
@@ -69,6 +72,13 @@ module CLIMarkdown
|
|
69
72
|
'eol' => 'intense_black on_black',
|
70
73
|
'pygments_theme' => 'monokai'
|
71
74
|
},
|
75
|
+
'blockquote' => {
|
76
|
+
'marker' => {
|
77
|
+
'character' => '>',
|
78
|
+
'color' => 'yellow'
|
79
|
+
},
|
80
|
+
'color' => 'b white'
|
81
|
+
},
|
72
82
|
'dd' => {
|
73
83
|
'term' => 'black on_white',
|
74
84
|
'marker' => 'd red',
|
@@ -88,6 +98,10 @@ module CLIMarkdown
|
|
88
98
|
'brackets' => 'd yellow on_black',
|
89
99
|
'color' => 'yellow on_black'
|
90
100
|
},
|
101
|
+
'math' => {
|
102
|
+
'brackets' => 'b black',
|
103
|
+
'equation' => 'b blue'
|
104
|
+
},
|
91
105
|
'super' => 'b green',
|
92
106
|
'text' => 'white'
|
93
107
|
}
|
data/lib/mdless/version.rb
CHANGED
data/lib/mdless.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mdless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brett Terpstra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redcarpet
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- lib/mdless/console.rb
|
83
83
|
- lib/mdless/converter.rb
|
84
84
|
- lib/mdless/hash.rb
|
85
|
+
- lib/mdless/string.rb
|
85
86
|
- lib/mdless/tables.rb
|
86
87
|
- lib/mdless/theme.rb
|
87
88
|
- lib/mdless/version.rb
|
@@ -112,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
113
|
- !ruby/object:Gem::Version
|
113
114
|
version: '0'
|
114
115
|
requirements: []
|
115
|
-
rubygems_version: 3.2.
|
116
|
+
rubygems_version: 3.2.15
|
116
117
|
signing_key:
|
117
118
|
specification_version: 4
|
118
119
|
summary: A pager like less, but for Markdown files
|