mdless 2.0.12 → 2.0.15

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: 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