devcenter 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/devcenter.gemspec +1 -0
- data/lib/devcenter/gem_version_checker.rb +11 -15
- data/lib/devcenter/md_parser.rb +42 -11
- data/lib/devcenter/version.rb +1 -1
- metadata +17 -1
data/devcenter.gemspec
CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_runtime_dependency('excon', '~>0.15.4')
|
23
23
|
gem.add_runtime_dependency('launchy', '~>2.1.0')
|
24
24
|
gem.add_runtime_dependency('maruku', '~>0.6.1')
|
25
|
+
gem.add_runtime_dependency('sanitize', '~>2.0.3')
|
25
26
|
gem.add_runtime_dependency('nokogiri', '~>1.5.5')
|
26
27
|
gem.add_runtime_dependency('coderay', '~>1.0.8')
|
27
28
|
gem.add_runtime_dependency('thin', '~>1.5.0')
|
@@ -1,22 +1,18 @@
|
|
1
1
|
require_relative 'version'
|
2
2
|
|
3
|
-
module Devcenter
|
3
|
+
module Devcenter::GemVersionChecker
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
remote && (Gem::Version.new(remote) > Gem::Version.new(Devcenter::VERSION))
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.last_remote_version
|
13
|
-
json = Excon.get('https://rubygems.org/api/v1/versions/devcenter.json').body
|
14
|
-
versions = JSON.parse(json).map{ |v| v['number'] }
|
15
|
-
versions.sort{ |a,b| Gem::Version.new(a) <=> Gem::Version.new(b) }.last
|
16
|
-
rescue
|
17
|
-
nil
|
18
|
-
end
|
5
|
+
def self.new_version_available?
|
6
|
+
remote = last_remote_version
|
7
|
+
remote && (Gem::Version.new(remote) > Gem::Version.new(Devcenter::VERSION))
|
8
|
+
end
|
19
9
|
|
10
|
+
def self.last_remote_version
|
11
|
+
json = Excon.get('https://rubygems.org/api/v1/versions/devcenter.json').body
|
12
|
+
versions = JSON.parse(json).map{ |v| v['number'] }
|
13
|
+
versions.sort{ |a,b| Gem::Version.new(a) <=> Gem::Version.new(b) }.last
|
14
|
+
rescue
|
15
|
+
nil
|
20
16
|
end
|
21
17
|
|
22
18
|
end
|
data/lib/devcenter/md_parser.rb
CHANGED
@@ -2,11 +2,52 @@
|
|
2
2
|
require 'maruku'
|
3
3
|
require 'nokogiri'
|
4
4
|
require 'coderay'
|
5
|
+
require 'sanitize'
|
5
6
|
|
6
7
|
module Devcenter::MdParser
|
7
8
|
class InvalidMarkdownError < Exception; end
|
8
9
|
class InvalidRawHTMLError < Exception; end
|
9
10
|
|
11
|
+
def self.to_html(markdown)
|
12
|
+
html = to_unsanitized_html(markdown)
|
13
|
+
html = sanitize(html)
|
14
|
+
highlight(html)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.to_unsanitized_html(markdown)
|
18
|
+
html = Maruku.new(markdown, :on_error => :raise).to_html
|
19
|
+
html = Nokogiri::HTML::DocumentFragment.parse(html).to_html(:encoding => 'utf-8')
|
20
|
+
verify_raw_html(html)
|
21
|
+
html = underscores_to_dashes_in_subheader_anchors(html)
|
22
|
+
rescue InvalidRawHTMLError => e
|
23
|
+
raise InvalidMarkdownError, e.message
|
24
|
+
rescue => e
|
25
|
+
raise InvalidMarkdownError, parse_maruku_error(e.message)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.sanitize(html)
|
29
|
+
Sanitize.clean(html, sanitize_config)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.sanitize_config
|
33
|
+
return @@sanitize_config if defined?(@@sanitize_config)
|
34
|
+
config = Sanitize::Config::RELAXED
|
35
|
+
config[:attributes][:all] += %w{ id class style name width height border align }
|
36
|
+
config[:attributes]['a'] += %w{ target }
|
37
|
+
config[:elements] += %w{ div span hr tt }
|
38
|
+
|
39
|
+
# embedded videos
|
40
|
+
config[:attributes][:all] += %w{ value src type allowscriptaccess allowfullscreen }
|
41
|
+
config[:elements] += %w{ object param embed }
|
42
|
+
config[:add_attributes] = {
|
43
|
+
'object' => {'allowscriptaccess' => 'never'},
|
44
|
+
'embed' => {'allowscriptaccess' => 'never'},
|
45
|
+
'param' => {'allowscriptaccess' => 'never'}
|
46
|
+
}
|
47
|
+
|
48
|
+
@@sanitize_config = config.merge({remove_contents: true, allow_comments: true})
|
49
|
+
end
|
50
|
+
|
10
51
|
def self.highlight(html)
|
11
52
|
element = "pre>code"
|
12
53
|
pattern = /\A\s*:::(\w+)\s*\n/i
|
@@ -37,19 +78,9 @@ module Devcenter::MdParser
|
|
37
78
|
end
|
38
79
|
end
|
39
80
|
|
40
|
-
def self.to_html(markdown)
|
41
|
-
html = Maruku.new(markdown, :on_error => :raise).to_html
|
42
|
-
verify_raw_html(html)
|
43
|
-
html = underscores_to_dashes_in_subheader_anchors(html)
|
44
|
-
highlight(html)
|
45
|
-
rescue InvalidRawHTMLError => e
|
46
|
-
raise InvalidMarkdownError, e.message
|
47
|
-
rescue => e
|
48
|
-
raise InvalidMarkdownError, parse_maruku_error(e.message)
|
49
|
-
end
|
50
|
-
|
51
81
|
def self.underscores_to_dashes_in_subheader_anchors(html)
|
52
82
|
doc = Nokogiri::HTML::DocumentFragment.parse(html)
|
83
|
+
|
53
84
|
doc.css("h2,h3,h4,h5,h6").each do |node|
|
54
85
|
if node.attributes['id'] && node.attributes['id'].value
|
55
86
|
node.attributes['id'].value = node.attributes['id'].value.gsub(/_+/,'-')
|
data/lib/devcenter/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devcenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -108,6 +108,22 @@ dependencies:
|
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.6.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sanitize
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 2.0.3
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 2.0.3
|
111
127
|
- !ruby/object:Gem::Dependency
|
112
128
|
name: nokogiri
|
113
129
|
requirement: !ruby/object:Gem::Requirement
|