html-pipeline-linuxfr 0.14.14 → 0.14.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
  SHA1:
3
- metadata.gz: ca03c628a97820d1f2de6cddc31dae94e75e0318
4
- data.tar.gz: 22eb1bc7bc2ef12a8893340e91a7ece773500a91
3
+ metadata.gz: 222d2b8194550b2a465246236b25b25edd27b04e
4
+ data.tar.gz: 9834df883b5faf5bd3e3f24ad43a91c5f6327cbe
5
5
  SHA512:
6
- metadata.gz: b3b9efb07a334ade27b4854e3453950d310ec229487c21a643c71cdc95dee706f65ad424b5628a4187f1608acd4d862c2db700337cde88336accfc8c3a7605fd
7
- data.tar.gz: 01bd2f57e15f69183cd9cb80bbb39dd960eabc1383bb467c143c8e4f329e984e5b7a5fba696710ed128acace6b69f97ad7c655b3f9afac9e3ed22a43301f0a0e
6
+ metadata.gz: 45892b9b29759d4ed53ade7e51fadf105a8bc4dbcd40e032ba8cb047d734276db4bfb8b2e5bfd70bc77d4b25a1868bd910b3b702ebaa94dbd5abdbff2403b27a
7
+ data.tar.gz: 6e9bfba0ca96191212bafd5bc95d35a17d697b11bb6eecf6adf229c80b53740fc5637158fbf0fef61ff4a3dcd1158887bafec230d61b81e29bcede9d332cadc1
data/README.md CHANGED
@@ -9,6 +9,7 @@ the standard markdown:
9
9
  * words with several underscores are left unchanged (no italics)
10
10
  * PHP Markdown Extra-style tables are supported
11
11
  * external images are proxified
12
+ * `$ eqn $` and `$$ eqn $$` are transformed to SVG (TeX maths support)
12
13
  * and some other extensions
13
14
 
14
15
  To do that, I hacked the html-pipeline from Github to remove some
@@ -21,4 +21,5 @@ Gem::Specification.new do |gem|
21
21
  gem.add_dependency "sanitize", "~> 2.0"
22
22
  gem.add_dependency "escape_utils", "~> 1.0"
23
23
  gem.add_dependency "activesupport", "~> 3.0"
24
+ gem.add_dependency "patron", "~> 0.4"
24
25
  end
@@ -29,6 +29,7 @@ module HTML
29
29
  autoload :TextFilter, 'html/pipeline/text_filter'
30
30
  autoload :MarkdownFilter, 'html/pipeline/markdown_filter'
31
31
  autoload :TableOfContentsFilter, 'html/pipeline/toc_filter'
32
+ autoload :SVGTeX, 'html/pipeline/svgtex'
32
33
  autoload :SyntaxHighlightFilter, 'html/pipeline/syntax_highlight_filter'
33
34
  autoload :RelativeLinksFilter, 'html/pipeline/relative_links_filter'
34
35
  autoload :CustomLinksFilter, 'html/pipeline/custom_links_filter'
@@ -6,17 +6,19 @@ module HTML
6
6
  CONTEXT = {
7
7
  toc_minimal_length: 5000,
8
8
  toc_header: "<h2 class=\"sommaire\">Sommaire</h2>\n",
9
+ svgtex_url: "http://localhost:16000",
9
10
  host: "linuxfr.org"
10
11
  }
11
12
 
12
13
  def self.render(text)
13
14
  pipeline = HTML::Pipeline.new [
15
+ HTML::Pipeline::SVGTeX::PreFilter,
14
16
  HTML::Pipeline::MarkdownFilter,
15
17
  HTML::Pipeline::TableOfContentsFilter,
18
+ HTML::Pipeline::SVGTeX::PostFilter,
16
19
  HTML::Pipeline::SyntaxHighlightFilter,
17
20
  HTML::Pipeline::RelativeLinksFilter,
18
21
  HTML::Pipeline::CustomLinksFilter,
19
- HTML::Pipeline::SanitizationFilter
20
22
  ], CONTEXT
21
23
  result = pipeline.call text
22
24
  result[:output].to_s
@@ -7,8 +7,6 @@ module HTML
7
7
 
8
8
  # LinuxFr Flavored Markdown
9
9
  class LFMarkdown < Redcarpet::Render::HTML
10
- attr_accessor :image_class
11
-
12
10
  PARSER_OPTIONS = {
13
11
  :no_intra_emphasis => true,
14
12
  :tables => true,
@@ -62,13 +60,6 @@ module HTML
62
60
  #
63
61
  # This filter does not write any additional information to the context hash.
64
62
  class MarkdownFilter < TextFilter
65
- def initialize(text, context = nil, result = nil)
66
- super text, context, result
67
- @text = @text.gsub "\r", ''
68
- end
69
-
70
- # Convert Markdown to HTML using the best available implementation
71
- # and convert into a DocumentFragment.
72
63
  def call
73
64
  lfm = Redcarpet::Markdown.new LFMarkdown, LFMarkdown::PARSER_OPTIONS
74
65
  lfm.render @text
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+ require 'base64'
3
+ require 'digest/sha1'
4
+ require 'patron'
5
+
6
+ module HTML
7
+ class Pipeline
8
+ class SVGTeX
9
+
10
+ class PreFilter < TextFilter
11
+ def initialize(text, context = nil, result = nil)
12
+ super text, context, result
13
+ @text = @text.gsub "\r", ''
14
+ @codemap = {}
15
+ end
16
+
17
+ def call
18
+ extract_code!
19
+ @text.gsub!(/^\$\$([^$]+)\$\$\s*$/) do
20
+ "\n\n```mathjax\n\\displaystyle{#{$1.gsub "\\", "\\\\\\\\"}}\n```\n\n"
21
+ end
22
+ extract_code!
23
+ @text.gsub!(/\$([^$\n]+)\$/) do
24
+ "`{mathjax} #{$1}`"
25
+ end
26
+ reinsert_code!
27
+ @text
28
+ end
29
+
30
+ # Code taken from gollum (http://github.com/github/gollum)
31
+ def extract_code!
32
+ @text.gsub!(/^``` ?(.+?)\r?\n(.+?)\r?\n```\r?$/m) do
33
+ id = Digest::SHA1.hexdigest($2)
34
+ @codemap[id] = { :lang => $1, :code => $2 }
35
+ id
36
+ end
37
+ end
38
+
39
+ def reinsert_code!
40
+ @codemap.each do |id, spec|
41
+ @text.gsub!(id, "```#{spec[:lang]}\n#{spec[:code]}\n```")
42
+ end
43
+ end
44
+ end
45
+
46
+ class PostFilter < Filter
47
+ def call
48
+ doc.search('code.mathjax').each do |node|
49
+ eqn = node.inner_text
50
+ rsp = session.post(context[:svgtex_url], :q => eqn)
51
+ if rsp.status == 200
52
+ node.parent.replace rsp.body.gsub(/margin-(left|right): 0px; /, "")
53
+ else
54
+ node.remove_attribute 'class'
55
+ end
56
+ end
57
+ doc.search('code:not([class])').each do |node|
58
+ eqn = node.inner_text
59
+ next unless eqn.sub!(/\A\{mathjax\} /, '')
60
+ rsp = session.post(context[:svgtex_url], :q => eqn)
61
+ if rsp.status == 200
62
+ node.replace "<img src='data:image/svg+xml;base64,#{Base64.encode64 rsp.body}' alt='#{CGI.escape_html eqn}' />"
63
+ else
64
+ node.inner_text = eqn
65
+ end
66
+ end
67
+ doc
68
+ end
69
+
70
+ def session
71
+ @session ||= Patron::Session.new
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -4,7 +4,7 @@ module HTML
4
4
  class Pipeline
5
5
 
6
6
  # HTML Filter that syntax highlights code blocks wrapped
7
- # in <pre lang="...">.
7
+ # in <code lang="...">.
8
8
  class SyntaxHighlightFilter < Filter
9
9
  def call
10
10
  doc.search('code').each do |node|
@@ -1,5 +1,5 @@
1
1
  module HTML
2
2
  class Pipeline
3
- VERSION = "0.14.14"
3
+ VERSION = "0.14.15"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html-pipeline-linuxfr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.14
4
+ version: 0.14.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Tomayko
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-02-15 00:00:00.000000000 Z
13
+ date: 2014-03-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -96,6 +96,20 @@ dependencies:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
98
  version: '3.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: patron
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0.4'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '0.4'
99
113
  description: LinuxFr.org HTML processing filters and utilities, adapted from those
100
114
  of GitHub
101
115
  email:
@@ -122,6 +136,7 @@ files:
122
136
  - lib/html/pipeline/markdown_filter.rb
123
137
  - lib/html/pipeline/relative_links_filter.rb
124
138
  - lib/html/pipeline/sanitization_filter.rb
139
+ - lib/html/pipeline/svgtex.rb
125
140
  - lib/html/pipeline/syntax_highlight_filter.rb
126
141
  - lib/html/pipeline/text_filter.rb
127
142
  - lib/html/pipeline/toc_filter.rb
@@ -157,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
172
  version: '0'
158
173
  requirements: []
159
174
  rubyforge_project:
160
- rubygems_version: 2.2.0
175
+ rubygems_version: 2.2.2
161
176
  signing_key:
162
177
  specification_version: 4
163
178
  summary: Helpers for processing content through a chain of filters