mdless 2.0.12 → 2.0.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c79d8ac3d3e9579dd89e46ba18e9e0e91eba3c4c47d3af390c897ebe1067ac6d
4
- data.tar.gz: 27c2b032b65a05d9c8109e41b4a50e8906335d008335752d69c395eb79832bb1
3
+ metadata.gz: 863102e504ba07c2ab9b018687d50053ca3395206666d1abffcf79997023db9e
4
+ data.tar.gz: bbba927ea37503308dac7356cb2d72e84e4cf53c5cf28f3f2b210c68b745cbf1
5
5
  SHA512:
6
- metadata.gz: a3289ed0b1bf504f5bb3c044e123184ba0f96fdd14498d1f94d3a1b51dd13dd20a0a97dee523ed63fa0abe3c34cb7aeebc50b0fbddc57d69bdbba01c57bc73f6
7
- data.tar.gz: b11921b4b2bc1af7ecf58c075f6af118bd2378ad7d7a7385923b2ace54077d1224ecf64cc99cdbba2b1017c1e54d67eb33a006bf3068a9dca155c5efd14e947c
6
+ metadata.gz: 92d0edc1d4722074e897981138c585a02fb9c287c8e8fc270885cc19b6274a2490bcd69b92c198c9876d4c4c1bf9b0ec0226c0e97660791fbfdf6c8e85f5592b
7
+ data.tar.gz: d738066449abc9ee9a8d0331b6ef64db675686cc53c9d0bbf3fa320a63a70c9f33312e0a6fe6c7055caffca7ba13deefcce10ee57f7e3fd7e291a8447e9674fd
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 NONE).
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) [NOT CURRENTLY IMPLEMENTED]
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
@@ -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 preprocess(input)
554
- in_yaml = false
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,38 @@ module Redcarpet
592
593
  line + xc
593
594
  end.join("\n") + "#{"\u00A0" * longest}#{xc}\n"
594
595
  end
596
+ end
595
597
 
598
+ input
599
+ end
600
+
601
+ def preprocess(input)
602
+ in_yaml = false
603
+
604
+ if @options[:taskpaper] == :auto
605
+ @options[:taskpaper] = if @file =~ /\.taskpaper/
606
+ @log.info('TaskPaper extension detected')
607
+ true
608
+ elsif CLIMarkdown::TaskPaper.is_taskpaper?(input)
609
+ @log.info('TaskPaper document detected')
610
+ true
611
+ else
612
+ false
613
+ end
596
614
  end
597
615
 
616
+ input = color_meta(input)
617
+
618
+ if @options[:taskpaper]
619
+ input = CLIMarkdown::TaskPaper.highlight(input, @theme)
620
+ input = highlight_tags(input)
621
+ return input
622
+ end
623
+
624
+
598
625
  ## Replace setex headers with ATX
599
- input.gsub!(/^([^\n]+)\n={3,}\s*$/m, "# \\1\n")
600
- input.gsub!(/^([^\n]+?)\n-{3,}\s*$/m, "## \\1\n")
626
+ input.gsub!(/^([^\n]+)\n={2,}\s*$/m, "# \\1\n")
627
+ input.gsub!(/^([^\n]+?)\n-{2,}\s*$/m, "## \\1\n")
601
628
 
602
629
  @@headers = get_headers(input)
603
630
 
@@ -808,9 +835,49 @@ module Redcarpet
808
835
  end
809
836
  end
810
837
 
838
+ def highlight_tags(input)
839
+ tag_color = color('at_tags tag')
840
+ value_color = color('at_tags value')
841
+ input.gsub(/(?<pre>\s|m)(?<tag>@[^ \].?!,("']+)(?:(?<lparen>\()(?<value>.*?)(?<rparen>\)))?/) do
842
+ m = Regexp.last_match
843
+ last_color = m.pre_match.last_color_code
844
+ [
845
+ m['pre'],
846
+ tag_color,
847
+ m['tag'],
848
+ m['lparen'],
849
+ value_color,
850
+ m['value'],
851
+ tag_color,
852
+ m['rparen'],
853
+ xc,
854
+ last_color
855
+ ].join
856
+ end
857
+ end
858
+
859
+ def highlight_wiki_links(input)
860
+ input.gsub(/\[\[(.*?)\]\]/) do
861
+ content = Regexp.last_match(1)
862
+ [
863
+ pre_element,
864
+ color('link brackets'),
865
+ '[[',
866
+ color('link text'),
867
+ content,
868
+ color('link brackets'),
869
+ ']]',
870
+ xc,
871
+ post_element
872
+ ].join
873
+ end
874
+ end
875
+
811
876
  def postprocess(input)
812
877
  input.scrub!
813
878
 
879
+ input = highlight_wiki_links(input) if @options[:wiki_links]
880
+
814
881
  if @options[:inline_footnotes]
815
882
  input = insert_footnotes(input)
816
883
  else
@@ -832,6 +899,7 @@ module Redcarpet
832
899
  # lists
833
900
  input = fix_lists(input, 0)
834
901
  input = render_images(input) if @options[:local_images]
902
+ input = highlight_tags(input) if @options[:at_tags] || @options[:taskpaper]
835
903
  fix_colors(input)
836
904
  end
837
905
  end
@@ -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 NONE).') do |type|
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,16 @@ 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
+
149
+ @options[:wiki_links] ||= false
150
+ opts.on('--[no-]wiki-links', 'Highlight [[wiki links]]') do |opt|
151
+ @options[:wiki_links] = opt
152
+ end
153
+
116
154
  opts.on('-v', '--version', 'Display version number') do
117
155
  puts version
118
156
  exit
@@ -137,12 +175,13 @@ module CLIMarkdown
137
175
  exit 1
138
176
  end
139
177
 
140
- unless File.exist?(config)
178
+ if !File.exist?(config) || @options[:update_config]
141
179
  FileUtils.mkdir_p(File.dirname(config))
142
180
  File.open(config, 'w') do |f|
143
181
  opts = @options.dup
144
182
  opts.delete(:list)
145
183
  opts.delete(:section)
184
+ opts.delete(:update_config)
146
185
  f.puts YAML.dump(opts)
147
186
  warn "Config file saved to #{config}"
148
187
  end
@@ -165,12 +204,13 @@ module CLIMarkdown
165
204
  renderer.options = @options
166
205
 
167
206
  markdown = Redcarpet::Markdown.new(renderer,
207
+ no_intra_emphasis: !@options[:intra_emphasis],
168
208
  autolink: true,
169
209
  fenced_code_blocks: true,
170
210
  footnotes: true,
171
211
  hard_wrap: false,
172
212
  highlight: true,
173
- lax_spacing: true,
213
+ lax_spacing: @options[:lax_spacing],
174
214
  quote: false,
175
215
  space_after_headers: false,
176
216
  strikethrough: true,
@@ -189,6 +229,9 @@ module CLIMarkdown
189
229
  rescue StandardError
190
230
  input = IO.read(file)
191
231
  end
232
+ raise 'Nil input' if input.nil?
233
+
234
+ input.scrub!
192
235
  input.gsub!(/\r?\n/, "\n")
193
236
  if @options[:list]
194
237
  puts list_headers(input)
@@ -200,11 +243,7 @@ module CLIMarkdown
200
243
  printout
201
244
  elsif !$stdin.isatty
202
245
  @file = nil
203
- begin
204
- input = $stdin.read.force_encoding('utf-8')
205
- rescue StandardError
206
- input = $stdin.read
207
- end
246
+ input = $stdin.read.scrub
208
247
  input.gsub!(/\r?\n/, "\n")
209
248
  if @options[:list]
210
249
  puts list_headers(input)
@@ -0,0 +1,77 @@
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>[^- \t].*?:)(?<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
+ if projects.count > 1
43
+ projects.each do |proj|
44
+ tasks += proj.scan(TASK_RX).count
45
+ end
46
+ end
47
+
48
+ tasks >= 6
49
+ end
50
+
51
+ def highlight(input, theme)
52
+ @theme = theme
53
+ mc = color('taskpaper marker')
54
+ tc = color('taskpaper task')
55
+ pc = color('taskpaper project')
56
+ nc = color('taskpaper note')
57
+
58
+ input.gsub!(PROJECT_RX) do
59
+ m = Regexp.last_match
60
+ "#{m['indent']}#{pc}#{m['project']}#{m['tags']}"
61
+ end
62
+
63
+ input.gsub!(TASK_RX) do
64
+ m = Regexp.last_match
65
+ "#{m['indent']}#{mc}- #{tc}#{m['task']}"
66
+ end
67
+
68
+ input.gsub!(NOTE_RX) do
69
+ m = Regexp.last_match
70
+ "#{m['indent']}#{nc}#{m['note']}"
71
+ end
72
+
73
+ input
74
+ end
75
+ end
76
+ end
77
+ 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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CLIMarkdown
4
- VERSION = '2.0.12'
4
+ VERSION = '2.0.15'
5
5
  end
data/lib/mdless.rb CHANGED
@@ -9,6 +9,7 @@ require 'mdless/colors'
9
9
  require 'mdless/tables'
10
10
  require 'mdless/hash'
11
11
  require 'mdless/string'
12
+ require 'mdless/taskpaper'
12
13
  require 'mdless/theme'
13
14
  require 'redcarpet'
14
15
  require 'mdless/console'
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.12
4
+ version: 2.0.15
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/
@@ -113,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
114
  - !ruby/object:Gem::Version
114
115
  version: '0'
115
116
  requirements: []
116
- rubygems_version: 3.2.15
117
+ rubygems_version: 3.2.16
117
118
  signing_key:
118
119
  specification_version: 4
119
120
  summary: A pager like less, but for Markdown files