html-renderer 0.0.6 → 0.1.0
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/.gemspec +0 -2
- data/Rakefile +2 -3
- data/TODO.md +2 -0
- data/VERSION +1 -1
- data/lib/html-renderer/base.rb +3 -4
- metadata +4 -6
- data/bin/html2ansi +0 -248
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff38e106acb336902c8cfbfec5dff664be97cd9363741a610fc9ffe619d9bd02
|
4
|
+
data.tar.gz: d3a8b5ce270e4229d7821062696df741765f0911ba2f428dbc705ec6611b1322
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d370198a4ae836fb62b37030cba865d00d08cfd87c5bf37ea24b26e1c34be827bf36c2f5f3f10333d9ad81e1f2bcc3559491025b80c8fa14a08cd073d1f4e59
|
7
|
+
data.tar.gz: cd0d53f4d19c32073d519d83b3023aba9c5228c8ecac590943d9a2364c2092e201f49aff59fbfb1a2dfc50616b4f27ed697e470d5377454aec170f13d50f37af
|
data/.gemspec
CHANGED
@@ -13,11 +13,9 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.authors = ["epitron"]
|
14
14
|
|
15
15
|
s.files = `git ls`.lines.map(&:strip)
|
16
|
-
s.executables = ['html2ansi']
|
17
16
|
s.extra_rdoc_files = ["README.md", "LICENSE"]
|
18
17
|
|
19
18
|
s.add_dependency "oga", "~> 2"
|
20
19
|
s.add_dependency "terminal-table", "~> 1.8"
|
21
20
|
s.add_dependency "term-ansicolor", "~> 1.7"
|
22
|
-
# s.add_development "ansi", "~> 1"
|
23
21
|
end
|
data/Rakefile
CHANGED
data/TODO.md
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
## Base class
|
4
4
|
|
5
|
+
! add HTMLRenderer.reflow_paragraph
|
5
6
|
* #render takes options (and passes them to subclasses)
|
6
7
|
* :debug option (hide parse errors unless 'true')
|
7
8
|
|
8
9
|
## ANSI renderer
|
9
10
|
|
11
|
+
* use HTMLRenderer.reflow_paragraph
|
10
12
|
* :wrap option (with optional terminal width)
|
11
13
|
* Better table renderer (with line-drawing)
|
12
14
|
* Follow `<table>` style attributes when drawing tables (eg: borders)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/html-renderer/base.rb
CHANGED
@@ -65,7 +65,7 @@ private
|
|
65
65
|
content.blank? ? normal_text(content) : nil
|
66
66
|
|
67
67
|
when Oga::XML::Element
|
68
|
-
case node.name
|
68
|
+
case node.name.downcase
|
69
69
|
when "a"
|
70
70
|
url = node["href"]
|
71
71
|
title = node["title"]
|
@@ -151,7 +151,7 @@ private
|
|
151
151
|
table(header, rows)
|
152
152
|
|
153
153
|
when "html", "body", "nav", "span", "form", "label", "input", "button", "section", "fieldset",
|
154
|
-
"menu", "article", "header", "time", "aside", "footer", "nobr", "wbr",
|
154
|
+
"pre", "menu", "article", "header", "time", "aside", "footer", "nobr", "wbr",
|
155
155
|
"table", "tr", "td", "th", "tt", "thead", "tbody", "noscript", "select",
|
156
156
|
"address", "center", "small"
|
157
157
|
render_children(node, state)
|
@@ -165,8 +165,7 @@ private
|
|
165
165
|
render_children(node, state)
|
166
166
|
end
|
167
167
|
|
168
|
-
when Oga::XML::Comment
|
169
|
-
# skip it
|
168
|
+
when Oga::XML::Comment, Oga::XML::Cdata
|
170
169
|
|
171
170
|
else
|
172
171
|
raise "Unhandled Oga node type: #{node.class}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- epitron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oga
|
@@ -56,8 +56,7 @@ description: Easily implement an HTML renderer by creating a subclass and adding
|
|
56
56
|
methods, similar to RedCarpet. (Examples are included for rendering HTML to ANSI
|
57
57
|
and plain text.)
|
58
58
|
email: chris@ill-logic.com
|
59
|
-
executables:
|
60
|
-
- html2ansi
|
59
|
+
executables: []
|
61
60
|
extensions: []
|
62
61
|
extra_rdoc_files:
|
63
62
|
- README.md
|
@@ -69,7 +68,6 @@ files:
|
|
69
68
|
- Rakefile
|
70
69
|
- TODO.md
|
71
70
|
- VERSION
|
72
|
-
- bin/html2ansi
|
73
71
|
- examples/ansi_renderer.rb
|
74
72
|
- examples/debug_renderer.rb
|
75
73
|
- examples/plain_text_renderer.rb
|
@@ -98,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
96
|
- !ruby/object:Gem::Version
|
99
97
|
version: '0'
|
100
98
|
requirements: []
|
101
|
-
rubygems_version: 3.
|
99
|
+
rubygems_version: 3.1.2
|
102
100
|
signing_key:
|
103
101
|
specification_version: 4
|
104
102
|
summary: HTML Renderer
|
data/bin/html2ansi
DELETED
@@ -1,248 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#######################################################################################
|
3
|
-
require 'html-renderer'
|
4
|
-
require 'terminal-table'
|
5
|
-
require 'term/ansicolor'
|
6
|
-
require 'coderay'
|
7
|
-
#######################################################################################
|
8
|
-
|
9
|
-
class String
|
10
|
-
# include ANSI::Mixin
|
11
|
-
include Term::ANSIColor
|
12
|
-
|
13
|
-
def grey; self.black.bold; end
|
14
|
-
end
|
15
|
-
|
16
|
-
#######################################################################################
|
17
|
-
|
18
|
-
def lesspipe(*args)
|
19
|
-
if args.any? and args.last.is_a?(Hash)
|
20
|
-
options = args.pop
|
21
|
-
else
|
22
|
-
options = {}
|
23
|
-
end
|
24
|
-
|
25
|
-
output = args.first if args.any?
|
26
|
-
|
27
|
-
params = []
|
28
|
-
params << "-R" unless options[:color] == false
|
29
|
-
params << "-S" unless options[:wrap] == true
|
30
|
-
params << "-F" unless options[:always] == true
|
31
|
-
if options[:tail] == true
|
32
|
-
params << "+\\>"
|
33
|
-
$stderr.puts "Seeking to end of stream..."
|
34
|
-
end
|
35
|
-
params << "-X"
|
36
|
-
|
37
|
-
IO.popen("less #{params * ' '}", "w") do |less|
|
38
|
-
if output
|
39
|
-
less.puts output
|
40
|
-
else
|
41
|
-
yield less
|
42
|
-
end
|
43
|
-
end
|
44
|
-
rescue Errno::EPIPE, Interrupt
|
45
|
-
# less just quit -- eat the exception.
|
46
|
-
end
|
47
|
-
|
48
|
-
#######################################################################################
|
49
|
-
|
50
|
-
class ANSIRenderer < HTMLRenderer::Base
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def indented?(text)
|
55
|
-
indent_sizes = text.lines.map{ |line| if line =~ /^(\s+)/ then $1 else '' end }.map(&:size)
|
56
|
-
indent_sizes.all? {|dent| dent > 0 }
|
57
|
-
end
|
58
|
-
|
59
|
-
def unwrap(text)
|
60
|
-
return text unless indented? text
|
61
|
-
text.lines.to_a.map(&:strip).join ' '
|
62
|
-
end
|
63
|
-
|
64
|
-
def indent(text,amount=2)
|
65
|
-
text.lines.map{|line| " "*amount + line }.join
|
66
|
-
end
|
67
|
-
|
68
|
-
def smash(s)
|
69
|
-
s&.downcase&.scan(/\w+/)&.join
|
70
|
-
end
|
71
|
-
|
72
|
-
def subscript(s)
|
73
|
-
"[#{s}]"
|
74
|
-
end
|
75
|
-
|
76
|
-
public
|
77
|
-
|
78
|
-
def normal_text(text)
|
79
|
-
text
|
80
|
-
end
|
81
|
-
|
82
|
-
def underline(content)
|
83
|
-
content.magenta.bold
|
84
|
-
end
|
85
|
-
|
86
|
-
def superscript(content)
|
87
|
-
"^(#{content})"
|
88
|
-
end
|
89
|
-
|
90
|
-
def link(link, title, content)
|
91
|
-
unless content&.[] /^Back /
|
92
|
-
str = ""
|
93
|
-
# str += "<15>#{content}</15>" if content
|
94
|
-
str += content.white.bold if content
|
95
|
-
if smash(link) != smash(content)
|
96
|
-
# str += " <8>(</8><11>#{link}</11><8>)</8>"
|
97
|
-
str += " #{"(".grey}#{link&.cyan&.bold}#{")".grey}"
|
98
|
-
end
|
99
|
-
|
100
|
-
str
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def anchor(name, title=nil, content=nil)
|
105
|
-
result = "Anchor: ##{name}"
|
106
|
-
result << " (#{title})" if title
|
107
|
-
result << "\n"
|
108
|
-
result << "#{content}\n" if content
|
109
|
-
result
|
110
|
-
end
|
111
|
-
|
112
|
-
def image(link, title, content)
|
113
|
-
link(link, nil, title)
|
114
|
-
end
|
115
|
-
|
116
|
-
def italic(text)
|
117
|
-
text.yellow.bold
|
118
|
-
end
|
119
|
-
|
120
|
-
def block_code(code, language)
|
121
|
-
language ||= :ruby
|
122
|
-
|
123
|
-
language = language[1..-1] if language[0] == "." # strip leading "."
|
124
|
-
language = :cpp if language == "C++"
|
125
|
-
|
126
|
-
require 'coderay'
|
127
|
-
"#{indent CodeRay.scan(code, language).term, 4}\n"
|
128
|
-
end
|
129
|
-
|
130
|
-
def block_quote(text)
|
131
|
-
indent paragraph(text)
|
132
|
-
end
|
133
|
-
|
134
|
-
def codespan(code)
|
135
|
-
code.cyan
|
136
|
-
end
|
137
|
-
|
138
|
-
def header(title, level, anchor=nil)
|
139
|
-
bar = ("-"*(title.size+4)).grey
|
140
|
-
|
141
|
-
title = case level
|
142
|
-
when 1 then title.bold.yellow
|
143
|
-
when 2 then title.bold.cyan
|
144
|
-
when 3 then title.bold.blue
|
145
|
-
else title.magenta
|
146
|
-
end
|
147
|
-
|
148
|
-
"#{bar}\n #{title}\n#{bar}\n\n"
|
149
|
-
end
|
150
|
-
|
151
|
-
def double_emphasis(text)
|
152
|
-
text.bold.green
|
153
|
-
end
|
154
|
-
|
155
|
-
def emphasis(text)
|
156
|
-
text.green
|
157
|
-
end
|
158
|
-
|
159
|
-
def linebreak
|
160
|
-
"\n"
|
161
|
-
end
|
162
|
-
|
163
|
-
def paragraph(text)
|
164
|
-
div(text) + "\n"
|
165
|
-
end
|
166
|
-
|
167
|
-
def div(text)
|
168
|
-
"#{indented?(text) ? text : unwrap(text)}\n"
|
169
|
-
end
|
170
|
-
|
171
|
-
def list(content, list_type)
|
172
|
-
case list_type
|
173
|
-
when :ordered
|
174
|
-
@counter = 0
|
175
|
-
"#{content}\n"
|
176
|
-
when :unordered
|
177
|
-
"#{content}\n"
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def list_item(content, list_type)
|
182
|
-
case list_type
|
183
|
-
when :ordered
|
184
|
-
@counter ||= 0
|
185
|
-
@counter += 1
|
186
|
-
# " <8>#{@counter}.</8> #{content.strip}\n".colorize
|
187
|
-
" #{@counter.to_s.grey}. #{content.strip}\n"
|
188
|
-
when :unordered
|
189
|
-
# " <8>*</8> #{content.strip}\n".colorize
|
190
|
-
" #{"*".grey} #{content.strip}\n"
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
def definition_list(defs)
|
195
|
-
defs.each do |dt, dd|
|
196
|
-
puts "<15>#{dt}<7>:".colorize
|
197
|
-
puts " #{dd}"
|
198
|
-
puts
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
def table(header, rows)
|
203
|
-
if header
|
204
|
-
table = Terminal::Table.new(headings: header, rows: rows)
|
205
|
-
else
|
206
|
-
table = Terminal::Table.new(rows: rows)
|
207
|
-
end
|
208
|
-
"#{table}\n\n"
|
209
|
-
end
|
210
|
-
|
211
|
-
def separator
|
212
|
-
"_____________________________\n\n"
|
213
|
-
end
|
214
|
-
|
215
|
-
end
|
216
|
-
|
217
|
-
#######################################################################################
|
218
|
-
|
219
|
-
def render(stream, paged=false)
|
220
|
-
output = ANSIRenderer.render(stream)
|
221
|
-
if paged
|
222
|
-
lesspipe { |less| less.puts output }
|
223
|
-
else
|
224
|
-
puts output
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
#######################################################################################
|
229
|
-
|
230
|
-
opts, args = ARGV.partition { |arg| arg[/^--?\w/] }
|
231
|
-
|
232
|
-
if opts.include?("-h") or opts.include?("--help")
|
233
|
-
puts "usage:"
|
234
|
-
puts " html2ansi [options] <file.html>"
|
235
|
-
puts " or"
|
236
|
-
puts " curl http://host/path.html | html2ansi [options]"
|
237
|
-
puts
|
238
|
-
puts "options:"
|
239
|
-
puts " -p Paged (redirect output to less)"
|
240
|
-
puts
|
241
|
-
else
|
242
|
-
paged = opts.include?("-p") or opts.include?("--paged")
|
243
|
-
if args.empty?
|
244
|
-
render($stdin, paged)
|
245
|
-
else
|
246
|
-
args.each { |arg| render(open(arg), paged) }
|
247
|
-
end
|
248
|
-
end
|