burr 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: f849154fa08f4e730346d3f7568008af38b5a0d4
4
- data.tar.gz: 04056ac1475498bcfa8afd2eeb8d4313f96b2bf2
3
+ metadata.gz: f58fa5ed863368020b2943b77cae90a09bdc70ba
4
+ data.tar.gz: 17bb05a58a6e84a1bbcf7c84758bd3bd0611a084
5
5
  SHA512:
6
- metadata.gz: 0d046ab33e9dbe39a8a04eb2741a92777be18e3f2b4ae8be5be847d26b1df564452b47fb96d952aa39037ad00dfb445f75ca1164eed3b955954c8d55169ef06e
7
- data.tar.gz: 1d1fd65b40f58bc4333c0a93d42ae136cd4e182d3575bdc81e95198db184df88ab733881a6c0de05ddac8c2d50949490c6713be85ac64ec855571eddbc95cd8a
6
+ metadata.gz: 5313792ed6328c5190d8f725623f0fec04a3808d377a7360f6b89b9279da0f7b9e366b6ce512900949b902b420b260466cd08d22615bb910e68796ef1d92816e
7
+ data.tar.gz: dfbb7b83f60facec45fb897d44162161f942b18b2cb671fc9da275be74f7227d84f427cb25e87abeeda375e6d48ca6b8de59182b2e28f96db1ea87b3aca7f132
data/README.md CHANGED
@@ -67,7 +67,7 @@ burr 是一个 Ruby gem,可以像其他 gem 一样安装。但是由于没有
67
67
  在项目的 `Gemfile` 中加入以下代码:
68
68
 
69
69
  ```ruby
70
- gem 'burr', github: 'andorchen/burr'
70
+ gem 'burr'
71
71
  ```
72
72
 
73
73
  然后执行 `bundle` 命令安装。
@@ -159,7 +159,7 @@ kramdown 原生支持的代码块由 `~~~` 分隔,但我更习惯使用 GitHub
159
159
  ```
160
160
  {:caption="Ruby 方法定义示例" file="/path/to/file.rb"}
161
161
 
162
- 代码高亮通过 [pygments.rb](https://github.com/tmm1/pygments.rb) 实现。
162
+ 代码高亮通过 [rouge](http://rubygems.org/gems/rouge) 实现。
163
163
 
164
164
  ### 图片题注
165
165
 
@@ -26,10 +26,10 @@ Gem::Specification.new do |s|
26
26
  s.extra_rdoc_files = %w[README.md LICENSE.md]
27
27
 
28
28
  s.add_runtime_dependency('nokogiri', '~> 1.6.0')
29
- s.add_runtime_dependency('thor', '~> 0.18.1')
30
- s.add_runtime_dependency('liquid', '~> 2.5.4')
31
- s.add_runtime_dependency('kramdown', '~> 1.2.0')
32
- s.add_runtime_dependency('pygments.rb', '~> 0.5.4')
29
+ s.add_runtime_dependency('thor', '~> 0.19.0')
30
+ s.add_runtime_dependency('liquid', '~> 2.6.1')
31
+ s.add_runtime_dependency('kramdown', '~> 1.3.3')
32
+ s.add_runtime_dependency('rouge', '~> 1.3.3')
33
33
  s.add_runtime_dependency('eeepub', '~> 0.8.1')
34
34
 
35
35
  s.files = `git ls-files`.split($/)
@@ -1,5 +1,5 @@
1
1
  require 'burr/kramdown_ext/parser'
2
- require 'pygments'
2
+ require 'burr/rouge_ext/html_formatter'
3
3
 
4
4
  module Kramdown
5
5
  module Converter
@@ -27,15 +27,10 @@ module Kramdown
27
27
  def convert_codeblock(el, indent)
28
28
  attr = el.attr.dup
29
29
  lang = extract_code_language!(attr)
30
- lang = 'text' if lang.blank?
31
30
 
32
- pyg_opts = {
33
- :encoding => 'utf-8',
34
- :cssclass => "highlight type-#{lang}"
35
- }
36
31
  caption = attr['caption']
37
32
  file = attr['file']
38
- code = ::Pygments.highlight(el.value, :lexer => lang, :options => pyg_opts).chomp << "\n"
33
+ code = rouge_highlight(el.value, lang)
39
34
  output = '<div class="codeblock'
40
35
  output << ' has-caption' if caption
41
36
  output << '">'
@@ -140,6 +135,15 @@ module Kramdown
140
135
  "<div class=\"figure\">#{img_html}<p class=\"caption\">#{caption_html}</p></div>"
141
136
  end
142
137
 
138
+ def rouge_highlight(text, lexer, &b)
139
+ lexer = ::Rouge::Lexer.find(lexer) unless lexer.respond_to? :lex
140
+ lexer = ::Rouge::Lexers::PlainText unless lexer
141
+
142
+ formatter = ::Rouge::Formatters::BHTML.new(css_class: "highlight type-#{lexer.tag}")
143
+
144
+ formatter.format(lexer.lex(text), &b)
145
+ end
146
+
143
147
  end
144
148
  end
145
149
  end
@@ -0,0 +1,113 @@
1
+ require 'cgi'
2
+ require 'rouge'
3
+
4
+ module Rouge
5
+ module Formatters
6
+ # Transforms a token stream into HTML output.
7
+ class BHTML < Formatter
8
+ tag 'bhtml'
9
+
10
+ # @option opts [String] :css_class ('highlight')
11
+ # @option opts [true/false] :line_numbers (false)
12
+ # @option opts [Rouge::CSSTheme] :inline_theme (nil)
13
+ # @option opts [true/false] :wrap (true)
14
+ #
15
+ # Initialize with options.
16
+ #
17
+ # If `:inline_theme` is given, then instead of rendering the
18
+ # tokens as <span> tags with CSS classes, the styles according to
19
+ # the given theme will be inlined in "style" attributes. This is
20
+ # useful for formats in which stylesheets are not available.
21
+ #
22
+ # Content will be wrapped in a tag
23
+ # with the given `:css_class` unless `:wrap` is set to `false`.
24
+ def initialize(opts={})
25
+ @css_class = opts.fetch(:css_class, 'highlight')
26
+ @line_numbers = opts.fetch(:line_numbers, false)
27
+ @inline_theme = opts.fetch(:inline_theme, nil)
28
+ @wrap = opts.fetch(:wrap, true)
29
+ end
30
+
31
+ # @yield the html output.
32
+ def stream(tokens, &b)
33
+ if @line_numbers
34
+ stream_tableized(tokens, &b)
35
+ else
36
+ stream_untableized(tokens, &b)
37
+ end
38
+ end
39
+
40
+ private
41
+ def stream_untableized(tokens, &b)
42
+ yield "<div class=#{@css_class.inspect}><pre>" if @wrap
43
+ tokens.each do |tok, val|
44
+ span(tok, val, &b)
45
+ end
46
+ yield "</pre></div>\n" if @wrap
47
+ end
48
+
49
+ def stream_tableized(tokens)
50
+ num_lines = 0
51
+ last_val = ''
52
+ formatted = ''
53
+
54
+ tokens.each do |tok, val|
55
+ last_val = val
56
+ num_lines += val.scan(/\n/).size
57
+ span(tok, val) { |str| formatted << str }
58
+ end
59
+
60
+ # add an extra line for non-newline-terminated strings
61
+ if last_val[-1] != "\n"
62
+ num_lines += 1
63
+ span(Token::Tokens::Text::Whitespace, "\n") { |str| formatted << str }
64
+ end
65
+
66
+ # generate a string of newline-separated line numbers for the gutter
67
+ numbers = num_lines.times.map do |x|
68
+ %<<pre class="lineno">#{x+1}</pre>>
69
+ end.join
70
+
71
+ yield "<div class=#{@css_class.inspect}>" if @wrap
72
+ yield '<table style="border-spacing: 0"><tbody><tr>'
73
+
74
+ # the "gl" class applies the style for Generic.Lineno
75
+ yield '<td class="gutter gl" style="text-align: right">'
76
+ yield numbers
77
+ yield '</td>'
78
+
79
+ yield '<td class="code">'
80
+ yield '<pre>'
81
+ yield formatted
82
+ yield '</pre>'
83
+ yield '</td>'
84
+
85
+ yield "</tr></tbody></table>\n"
86
+ yield "</div>\n" if @wrap
87
+ end
88
+
89
+ TABLE_FOR_ESCAPE_HTML = {
90
+ '&' => '&amp;',
91
+ '<' => '&lt;',
92
+ '>' => '&gt;',
93
+ }
94
+
95
+ def span(tok, val)
96
+ val = val.gsub(/[&<>]/, TABLE_FOR_ESCAPE_HTML)
97
+ shortname = tok.shortname or raise "unknown token: #{tok.inspect} for #{val.inspect}"
98
+
99
+ if shortname.empty?
100
+ yield val
101
+ else
102
+ if @inline_theme
103
+ rules = @inline_theme.style_for(tok).rendered_rules
104
+
105
+ yield "<span style=\"#{rules.to_a.join(';')}\">#{val}</span>"
106
+ else
107
+ yield "<span class=\"#{shortname}\">#{val}</span>"
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -2,7 +2,7 @@ module Burr
2
2
  module Version
3
3
  MAJOR = '0'
4
4
  MINOR = '0'
5
- PATCH = '2'
5
+ PATCH = '3'
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: burr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andor Chen
@@ -30,56 +30,56 @@ dependencies:
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 0.18.1
33
+ version: 0.19.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 0.18.1
40
+ version: 0.19.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: liquid
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 2.5.4
47
+ version: 2.6.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 2.5.4
54
+ version: 2.6.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: kramdown
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 1.2.0
61
+ version: 1.3.3
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 1.2.0
68
+ version: 1.3.3
69
69
  - !ruby/object:Gem::Dependency
70
- name: pygments.rb
70
+ name: rouge
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ~>
74
74
  - !ruby/object:Gem::Version
75
- version: 0.5.4
75
+ version: 1.3.3
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
- version: 0.5.4
82
+ version: 1.3.3
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: eeepub
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +142,7 @@ files:
142
142
  - lib/burr/plugins/parser_plugin.rb
143
143
  - lib/burr/plugins/table.rb
144
144
  - lib/burr/plugins/toc.rb
145
+ - lib/burr/rouge_ext/html_formatter.rb
145
146
  - lib/burr/ruby_version_check.rb
146
147
  - lib/burr/server.rb
147
148
  - lib/burr/ui.rb