mdless 2.0.12 → 2.0.14
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 +3 -2
- data/lib/mdless/colors.rb +0 -56
- data/lib/mdless/console.rb +49 -5
- data/lib/mdless/converter.rb +40 -9
- data/lib/mdless/taskpaper.rb +75 -0
- data/lib/mdless/theme.rb +11 -1
- data/lib/mdless/version.rb +1 -1
- data/lib/mdless.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cdb39184ea897e4e43081add5c4c70791f4c04af12b4d54f8cb67e1ba262a551
|
4
|
+
data.tar.gz: 0160b5cda00979788b772a7db721abbe46ec3e6c39d2c1a4459b8fc8f04141b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f1d7fdd5b1b26ca1a1baf8bf9492c5d1ff51ba5b07c16aaeb1dfe43a91ff0e2025196a08e71687da15b380dedcd5649d06e3107e1e449d3f064e5b178b7f11d
|
7
|
+
data.tar.gz: ca412964bf3a3af4dd6d63453ed818d9715615682866e70602f116fe050174e14f21d60c13f11b1b2d236f14637eeeb5711d7c7eb591538cd45808906331600c
|
data/README.md
CHANGED
@@ -58,15 +58,16 @@ The pager used is determined by system configuration in this order of preference
|
|
58
58
|
-c, --[no-]color Colorize output (default on)
|
59
59
|
-d, --debug LEVEL Level of debug messages to output (1-4, 4 to see all messages)
|
60
60
|
-h, --help Display this screen
|
61
|
-
-i, --images=TYPE Include [local|remote (both)] images in output (requires chafa or imgcat, default
|
61
|
+
-i, --images=TYPE Include [local|remote (both)|none] images in output (requires chafa or imgcat, default none).
|
62
62
|
-I, --all-images Include local and remote images in output (requires imgcat or chafa)
|
63
63
|
--syntax Syntax highlight code blocks
|
64
|
-
--links=FORMAT Link style ([inline, reference], default inline
|
64
|
+
--links=FORMAT Link style ([inline, reference, paragraph], default inline, "paragraph" will position reference links after each paragraph)
|
65
65
|
-l, --list List headers in document and exit
|
66
66
|
-p, --[no-]pager Formatted output to pager (default on)
|
67
67
|
-P Disable pager (same as --no-pager)
|
68
68
|
-s, --section=NUMBER[,NUMBER] Output only a headline-based section of the input (numeric from --list)
|
69
69
|
-t, --theme=THEME_NAME Specify an alternate color theme to load
|
70
|
+
-@, --at_tags Highlight @tags and values in the document
|
70
71
|
-v, --version Display version number
|
71
72
|
-w, --width=COLUMNS Column width to format for (default: terminal width)
|
72
73
|
--[no-]inline_footnotes Display footnotes immediately after the paragraph that references them
|
data/lib/mdless/colors.rb
CHANGED
@@ -114,62 +114,6 @@ module CLIMarkdown
|
|
114
114
|
escape + "\e[#{[fg, bg].delete_if(&:nil?).join(';')}m"
|
115
115
|
end
|
116
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
|
-
|
173
117
|
def blackout(bgcolor)
|
174
118
|
key = bgcolor.to_sym
|
175
119
|
bg = COLORS.key?(key) ? COLORS[key] : 40
|
data/lib/mdless/console.rb
CHANGED
@@ -3,6 +3,7 @@ module Redcarpet
|
|
3
3
|
class Console < Base
|
4
4
|
include CLIMarkdown::Colors
|
5
5
|
include CLIMarkdown::Theme
|
6
|
+
|
6
7
|
attr_writer :theme, :cols, :log, :options, :file
|
7
8
|
|
8
9
|
@@listitemid = 0
|
@@ -550,8 +551,8 @@ module Redcarpet
|
|
550
551
|
@@headers
|
551
552
|
end
|
552
553
|
|
553
|
-
def
|
554
|
-
|
554
|
+
def color_meta(text)
|
555
|
+
input = text.dup
|
555
556
|
first_line = input.split("\n").first
|
556
557
|
if first_line =~ /(?i-m)^---[ \t]*?$/
|
557
558
|
@log.info('Found YAML')
|
@@ -592,12 +593,19 @@ module Redcarpet
|
|
592
593
|
line + xc
|
593
594
|
end.join("\n") + "#{"\u00A0" * longest}#{xc}\n"
|
594
595
|
end
|
595
|
-
|
596
596
|
end
|
597
597
|
|
598
|
+
input
|
599
|
+
end
|
600
|
+
|
601
|
+
def preprocess(input)
|
602
|
+
in_yaml = false
|
603
|
+
|
604
|
+
input = color_meta(input)
|
605
|
+
|
598
606
|
## Replace setex headers with ATX
|
599
|
-
input.gsub!(/^([^\n]+)\n={
|
600
|
-
input.gsub!(/^([^\n]+?)\n-{
|
607
|
+
input.gsub!(/^([^\n]+)\n={2,}\s*$/m, "# \\1\n")
|
608
|
+
input.gsub!(/^([^\n]+?)\n-{2,}\s*$/m, "## \\1\n")
|
601
609
|
|
602
610
|
@@headers = get_headers(input)
|
603
611
|
|
@@ -639,6 +647,20 @@ module Redcarpet
|
|
639
647
|
"#{color('dd term')}#{m['term']}#{xc}#{color('dd color')}#{color_dd_def(m['def'])}"
|
640
648
|
end
|
641
649
|
|
650
|
+
if @options[:taskpaper] == :auto
|
651
|
+
@options[:taskpaper] = if @file =~ /\.taskpaper/
|
652
|
+
@log.info('TaskPaper extension detected')
|
653
|
+
true
|
654
|
+
elsif CLIMarkdown::TaskPaper.is_taskpaper?(input)
|
655
|
+
@log.info('TaskPaper document detected')
|
656
|
+
true
|
657
|
+
else
|
658
|
+
false
|
659
|
+
end
|
660
|
+
end
|
661
|
+
|
662
|
+
input = CLIMarkdown::TaskPaper.highlight(input, @theme) if @options[:taskpaper]
|
663
|
+
|
642
664
|
input
|
643
665
|
end
|
644
666
|
|
@@ -808,6 +830,27 @@ module Redcarpet
|
|
808
830
|
end
|
809
831
|
end
|
810
832
|
|
833
|
+
def highlight_tags(input)
|
834
|
+
tag_color = color('at_tags tag')
|
835
|
+
value_color = color('at_tags value')
|
836
|
+
input.gsub(/(?<pre>\s|m)(?<tag>@[^ ("']+)(?:(?<lparen>\()(?<value>.*?)(?<rparen>\)))?/) do
|
837
|
+
m = Regexp.last_match
|
838
|
+
last_color = m.pre_match.last_color_code
|
839
|
+
[
|
840
|
+
m['pre'],
|
841
|
+
tag_color,
|
842
|
+
m['tag'],
|
843
|
+
m['lparen'],
|
844
|
+
value_color,
|
845
|
+
m['value'],
|
846
|
+
tag_color,
|
847
|
+
m['rparen'],
|
848
|
+
xc,
|
849
|
+
last_color
|
850
|
+
].join
|
851
|
+
end
|
852
|
+
end
|
853
|
+
|
811
854
|
def postprocess(input)
|
812
855
|
input.scrub!
|
813
856
|
|
@@ -832,6 +875,7 @@ module Redcarpet
|
|
832
875
|
# lists
|
833
876
|
input = fix_lists(input, 0)
|
834
877
|
input = render_images(input) if @options[:local_images]
|
878
|
+
input = highlight_tags(input) if @options[:at_tags] || @options[:taskpaper]
|
835
879
|
fix_colors(input)
|
836
880
|
end
|
837
881
|
end
|
data/lib/mdless/converter.rb
CHANGED
@@ -45,7 +45,7 @@ module CLIMarkdown
|
|
45
45
|
@options[:local_images] ||= false
|
46
46
|
@options[:remote_images] ||= false
|
47
47
|
opts.on('-i', '--images=TYPE',
|
48
|
-
'Include [local|remote (both)] images in output (requires chafa or imgcat, default
|
48
|
+
'Include [local|remote (both)|none] 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
51
|
when /^(r|b|a)/i
|
@@ -75,6 +75,23 @@ module CLIMarkdown
|
|
75
75
|
@options[:syntax_higlight] = p
|
76
76
|
end
|
77
77
|
|
78
|
+
@options[:update_config] ||= false
|
79
|
+
opts.on('--update_config', 'Update the configuration file with new keys and current command line options') do
|
80
|
+
@options[:update_config] = true
|
81
|
+
end
|
82
|
+
|
83
|
+
@options[:taskpaper] ||= false
|
84
|
+
opts.on('--taskpaper=OPTION', 'Highlight TaskPaper format (true|false|auto)') do |tp|
|
85
|
+
@options[:taskpaper] = case tp
|
86
|
+
when /^[ty1]/
|
87
|
+
true
|
88
|
+
when /^a/
|
89
|
+
:auto
|
90
|
+
else
|
91
|
+
false
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
78
95
|
@options[:links] ||= :inline
|
79
96
|
opts.on('--links=FORMAT',
|
80
97
|
'Link style ([inline, reference, paragraph], default inline, "paragraph" will position reference links after each paragraph)') do |fmt|
|
@@ -88,6 +105,16 @@ module CLIMarkdown
|
|
88
105
|
end
|
89
106
|
end
|
90
107
|
|
108
|
+
@options[:lax_spacing] ||= true
|
109
|
+
opts.on('--[no-]lax-spacing', 'Allow lax spacing') do |opt|
|
110
|
+
@options[:lax_spacing] = opt
|
111
|
+
end
|
112
|
+
|
113
|
+
@options[:intra_emphasis] ||= true
|
114
|
+
opts.on('--[no-]intra-emphasis', 'Parse emphasis inside of words (e.g. Mark_down_)') do |opt|
|
115
|
+
@options[:intra_emphasis] = opt
|
116
|
+
end
|
117
|
+
|
91
118
|
@options[:list] ||= false
|
92
119
|
opts.on('-l', '--list', 'List headers in document and exit') do
|
93
120
|
@options[:list] = true
|
@@ -98,6 +125,7 @@ module CLIMarkdown
|
|
98
125
|
@options[:pager] = p
|
99
126
|
end
|
100
127
|
|
128
|
+
@options[:pager] ||= true
|
101
129
|
opts.on('-P', 'Disable pager (same as --no-pager)') do
|
102
130
|
@options[:pager] = false
|
103
131
|
end
|
@@ -113,6 +141,11 @@ module CLIMarkdown
|
|
113
141
|
@options[:theme] = theme
|
114
142
|
end
|
115
143
|
|
144
|
+
@options[:at_tags] ||= false
|
145
|
+
opts.on('-@', '--at_tags', 'Highlight @tags and values in the document') do
|
146
|
+
@options[:at_tags] = true
|
147
|
+
end
|
148
|
+
|
116
149
|
opts.on('-v', '--version', 'Display version number') do
|
117
150
|
puts version
|
118
151
|
exit
|
@@ -137,12 +170,13 @@ module CLIMarkdown
|
|
137
170
|
exit 1
|
138
171
|
end
|
139
172
|
|
140
|
-
|
173
|
+
if !File.exist?(config) || @options[:update_config]
|
141
174
|
FileUtils.mkdir_p(File.dirname(config))
|
142
175
|
File.open(config, 'w') do |f|
|
143
176
|
opts = @options.dup
|
144
177
|
opts.delete(:list)
|
145
178
|
opts.delete(:section)
|
179
|
+
opts.delete(:update_config)
|
146
180
|
f.puts YAML.dump(opts)
|
147
181
|
warn "Config file saved to #{config}"
|
148
182
|
end
|
@@ -165,12 +199,13 @@ module CLIMarkdown
|
|
165
199
|
renderer.options = @options
|
166
200
|
|
167
201
|
markdown = Redcarpet::Markdown.new(renderer,
|
202
|
+
no_intra_emphasis: !@options[:intra_emphasis],
|
168
203
|
autolink: true,
|
169
204
|
fenced_code_blocks: true,
|
170
205
|
footnotes: true,
|
171
206
|
hard_wrap: false,
|
172
207
|
highlight: true,
|
173
|
-
lax_spacing:
|
208
|
+
lax_spacing: @options[:lax_spacing],
|
174
209
|
quote: false,
|
175
210
|
space_after_headers: false,
|
176
211
|
strikethrough: true,
|
@@ -189,7 +224,7 @@ module CLIMarkdown
|
|
189
224
|
rescue StandardError
|
190
225
|
input = IO.read(file)
|
191
226
|
end
|
192
|
-
input.gsub!(/\r?\n/, "\n")
|
227
|
+
input.gsub!(/\r?\n/, "\n").scrub!
|
193
228
|
if @options[:list]
|
194
229
|
puts list_headers(input)
|
195
230
|
Process.exit 0
|
@@ -200,11 +235,7 @@ module CLIMarkdown
|
|
200
235
|
printout
|
201
236
|
elsif !$stdin.isatty
|
202
237
|
@file = nil
|
203
|
-
|
204
|
-
input = $stdin.read.force_encoding('utf-8')
|
205
|
-
rescue StandardError
|
206
|
-
input = $stdin.read
|
207
|
-
end
|
238
|
+
input = $stdin.read.scrub
|
208
239
|
input.gsub!(/\r?\n/, "\n")
|
209
240
|
if @options[:list]
|
210
241
|
puts list_headers(input)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CLIMarkdown
|
4
|
+
module TaskPaper
|
5
|
+
TASK_RX = /^(?<indent>(?: |\t)+)(?<marker>-)(?<task>\s+\S.*?)$/
|
6
|
+
PROJECT_RX = /^(?<indent>(?: |\t)*)(?<project>\S.*?:)(?<tags> @\S+)*$/
|
7
|
+
NOTE_RX = /^(?<indent>(?: |\t)+)(?<note>(?<!- ).*?(?!:))$/
|
8
|
+
|
9
|
+
class << self
|
10
|
+
include CLIMarkdown::Colors
|
11
|
+
attr_writer :theme
|
12
|
+
|
13
|
+
def color(key)
|
14
|
+
val = nil
|
15
|
+
keys = key.split(/[ ,>]/)
|
16
|
+
if @theme.key?(keys[0])
|
17
|
+
val = @theme[keys.shift]
|
18
|
+
else
|
19
|
+
@log.error("Invalid theme key: #{key}") unless keys[0] =~ /^text/
|
20
|
+
return c([:reset])
|
21
|
+
end
|
22
|
+
keys.each do |k|
|
23
|
+
if val.key?(k)
|
24
|
+
val = val[k]
|
25
|
+
else
|
26
|
+
@log.error("Invalid theme key: #{k}")
|
27
|
+
return c([:reset])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
if val.is_a? String
|
31
|
+
val = "x #{val}"
|
32
|
+
res = val.split(/ /).map(&:to_sym)
|
33
|
+
c(res)
|
34
|
+
else
|
35
|
+
c([:reset])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def is_taskpaper?(input)
|
40
|
+
projects = input.split(PROJECT_RX)
|
41
|
+
tasks = 0
|
42
|
+
projects.each do |proj|
|
43
|
+
tasks += proj.scan(TASK_RX).count
|
44
|
+
end
|
45
|
+
|
46
|
+
tasks >= 6
|
47
|
+
end
|
48
|
+
|
49
|
+
def highlight(input, theme)
|
50
|
+
@theme = theme
|
51
|
+
mc = color('taskpaper marker')
|
52
|
+
tc = color('taskpaper task')
|
53
|
+
pc = color('taskpaper project')
|
54
|
+
nc = color('taskpaper note')
|
55
|
+
|
56
|
+
input.gsub!(PROJECT_RX) do
|
57
|
+
m = Regexp.last_match
|
58
|
+
"#{m['indent']}#{pc}#{m['project']}#{m['tags']}"
|
59
|
+
end
|
60
|
+
|
61
|
+
input.gsub!(TASK_RX) do
|
62
|
+
m = Regexp.last_match
|
63
|
+
"#{m['indent']}#{mc}- #{tc}#{m['task']}"
|
64
|
+
end
|
65
|
+
|
66
|
+
input.gsub!(NOTE_RX) do
|
67
|
+
m = Regexp.last_match
|
68
|
+
"#{m['indent']}#{nc}#{m['note']}"
|
69
|
+
end
|
70
|
+
|
71
|
+
input
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/mdless/theme.rb
CHANGED
@@ -103,7 +103,17 @@ module CLIMarkdown
|
|
103
103
|
'equation' => 'b blue'
|
104
104
|
},
|
105
105
|
'super' => 'b green',
|
106
|
-
'text' => 'white'
|
106
|
+
'text' => 'white',
|
107
|
+
'at_tags' => {
|
108
|
+
'tag' => 'magenta',
|
109
|
+
'value' => 'b white'
|
110
|
+
},
|
111
|
+
'taskpaper' => {
|
112
|
+
'marker' => 'b white',
|
113
|
+
'project' => 'b green',
|
114
|
+
'task' => 'white',
|
115
|
+
'note' => 'd white'
|
116
|
+
}
|
107
117
|
}
|
108
118
|
|
109
119
|
def load_theme_file(theme_file)
|
data/lib/mdless/version.rb
CHANGED
data/lib/mdless.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brett Terpstra
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- lib/mdless/hash.rb
|
85
85
|
- lib/mdless/string.rb
|
86
86
|
- lib/mdless/tables.rb
|
87
|
+
- lib/mdless/taskpaper.rb
|
87
88
|
- lib/mdless/theme.rb
|
88
89
|
- lib/mdless/version.rb
|
89
90
|
homepage: http://brettterpstra.com/project/mdless/
|