slodown 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +66 -10
- data/lib/kramdown/converter/slodown_html.rb +1 -1
- data/lib/slodown.rb +0 -1
- data/lib/slodown/formatter.rb +88 -11
- data/lib/slodown/version.rb +1 -1
- data/slodown.gemspec +3 -3
- data/spec/basic_formatting_spec.rb +1 -1
- data/spec/metadata_extraction_spec.rb +46 -0
- metadata +31 -48
- data/lib/slodown/embed_transformer.rb +0 -26
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 49f19f4efa582699624089df1ceb43dcb0f095a9
|
4
|
+
data.tar.gz: 473dba59b4920bf8bd07bec99c5b5e3bdb01ef46
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 018e3cbab23eada8eae8f8fc3fa805cb9b5333fb2a50473a2e7330badf61af9bbce253573517a8db0e9993f9f3222c082dfe464bafe14ef265cc6178dd5ca77c
|
7
|
+
data.tar.gz: 7110e04ac94168c0d14230c812a46fa6f914a1194e6869485052ef1292f2af416e2eaa63b10c2c19f6ba55df40c7bda435d5f800eddb1d82973e9cb9f77cb05c
|
data/README.md
CHANGED
@@ -9,14 +9,13 @@
|
|
9
9
|
Here's what slodown does by default:
|
10
10
|
|
11
11
|
- **render extended Markdown into HTML**. It uses the [kramdown](http://kramdown.rubyforge.org/) library, so yes, footnotes are supported!
|
12
|
-
- **
|
13
|
-
- **
|
12
|
+
- **add syntax highlighting to Markdown code blocks** through [CodeRay](http://coderay.rubychan.de/).
|
13
|
+
- **support super-easy rich media embeds**, [sloblog.io-style](http://sloblog.io/~hmans/qhdsk2SMoAU). Just point the Markdown image syntax at, say, a Youtube video, and slodown will fetch the complete embed code through the magic of [ruby-oembed](https://github.com/judofyr/ruby-oembed).
|
14
14
|
- **auto-link contained URLs** using [Rinku](https://github.com/vmg/rinku), which is smart enough to not auto-link URLs contained in, say, code blocks.
|
15
15
|
- **sanitize the generated HTML** using the white-list based [sanitize](https://github.com/rgrove/sanitize) gem.
|
16
16
|
|
17
17
|
slodown is an extraction from [sloblog.io](http://sloblog.io). It is very easy to extend or modify, as it's just a plain old Ruby class you can inherit from.
|
18
18
|
|
19
|
-
|
20
19
|
## Installation
|
21
20
|
|
22
21
|
Add this line to your application's Gemfile:
|
@@ -33,7 +32,7 @@ Or install it yourself as:
|
|
33
32
|
|
34
33
|
## Usage
|
35
34
|
|
36
|
-
For every piece of user input that needs to be rendered, create an instance of `Slodown::Formatter` with the source text and use it to perform
|
35
|
+
For every piece of user input that needs to be rendered, create an instance of `Slodown::Formatter` with the source text and use it to perform some or all transformations on it. Finally, call `#to_s` to get the rendered output.
|
37
36
|
|
38
37
|
### Examples:
|
39
38
|
|
@@ -41,6 +40,9 @@ For every piece of user input that needs to be rendered, create an instance of `
|
|
41
40
|
# let's create an instance to work with
|
42
41
|
formatter = Slodown::Formatter.new(text)
|
43
42
|
|
43
|
+
# just extract metadata
|
44
|
+
formatter.extract_metadata.to_s
|
45
|
+
|
44
46
|
# just render Markdown to HTML
|
45
47
|
formatter.markdown.to_s
|
46
48
|
|
@@ -54,12 +56,47 @@ formatter.sanitize.to_s
|
|
54
56
|
formatter.markdown.sanitize.to_s
|
55
57
|
|
56
58
|
# this is the whole deal:
|
57
|
-
formatter.markdown.autolink.sanitize.to_s
|
59
|
+
formatter.extract_metadata.markdown.autolink.sanitize.to_s
|
58
60
|
|
59
61
|
# which is the same as:
|
60
62
|
formatter.complete.to_s
|
61
63
|
~~~
|
62
64
|
|
65
|
+
### Metadata
|
66
|
+
|
67
|
+
Slodown allows metadata, such as the creation date, to be defined in the text to be processed:
|
68
|
+
|
69
|
+
~~~markdown
|
70
|
+
#+title: Slodown
|
71
|
+
#+created_at: 2014-03-01 13:51:12 CET
|
72
|
+
# Installation
|
73
|
+
|
74
|
+
Add this line to your application's Gemfile:
|
75
|
+
|
76
|
+
gem 'slodown'
|
77
|
+
|
78
|
+
...
|
79
|
+
~~~
|
80
|
+
|
81
|
+
Metadata can be accessed with `Slodown::Formatter#metadata`:
|
82
|
+
|
83
|
+
~~~ruby
|
84
|
+
formatter.metadata[:title] # => "Slodown"
|
85
|
+
~~~
|
86
|
+
|
87
|
+
## OEmbed support
|
88
|
+
|
89
|
+
Slodown extends the Markdown image syntax to support OEmbed-based embeds.
|
90
|
+
Anything supported by the great [OEmbed gem](https://github.com/judofyr/ruby-oembed) will work. Just supply the URL:
|
91
|
+
|
92
|
+
~~~markdown
|
93
|
+
![youtube video](https://www.youtube.com/watch?v=oHg5SJYRHA0)
|
94
|
+
~~~
|
95
|
+
|
96
|
+
Some OEmbed providers will return IFRAME-based embeds. If you want to control
|
97
|
+
which hosts are allowed to have IFRAMEs on your site, override the `Formatter#allowed_iframe_hosts` method to return a regular expression that will be matched against the IFRAME source URL's host. Please note that this will also apply to
|
98
|
+
IFRAME HTML tags added by the user directly.
|
99
|
+
|
63
100
|
## Hints
|
64
101
|
|
65
102
|
* If you want to add more transformations or change the behavior of the `#complete` method, just subclass `Slodown::Formatter` and go wild. :-)
|
@@ -73,8 +110,27 @@ formatter.complete.to_s
|
|
73
110
|
|
74
111
|
## Contributing
|
75
112
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
113
|
+
Just like with my other gems, I am trying to keep slodown as sane (and small) as possible. If you
|
114
|
+
want to contribute code, **please talk to me before writing a patch or submitting
|
115
|
+
a pull request**! I'm serious about keeping things focused and would hate to cause
|
116
|
+
unnecessary disappointment. Thank you.
|
117
|
+
|
118
|
+
If you're still set on submitting a pull request, please consider the following:
|
119
|
+
|
120
|
+
1. Create your pull request from a _feature branch_.
|
121
|
+
2. The pull request must only contain changes _related to the feature_.
|
122
|
+
3. Please include specs where it makes sense.
|
123
|
+
4. Absolutely _no_ version bumps or similar.
|
124
|
+
|
125
|
+
## Version History
|
126
|
+
|
127
|
+
### 0.2.0
|
128
|
+
|
129
|
+
- Slodown is now whitelisting all domains for possible iframe/embed-based media embeds by default. If you don't want this, you can override `Formatter#allowed_iframe_hosts` to return a regular expression that will match against the embed URL's host.
|
130
|
+
- Bumped minimum required version of kramdown to 1.5.0 for all the nice new syntax highlighter integrations it offers (and changes required due to deprecated/changed options.)
|
131
|
+
- Support for Twitter oEmbed (using an unfortunately deprecated API, nonetheless.)
|
132
|
+
- Added `Slodown::Formatter#kramdown_options`, returning a hash of kramdown configuration options. Overload this in order to customize the formatter's behavior.
|
133
|
+
|
134
|
+
### 0.1.3
|
135
|
+
|
136
|
+
- first public release
|
@@ -9,7 +9,7 @@ class Kramdown::Converter::SlodownHtml < Kramdown::Converter::Html
|
|
9
9
|
def convert_img(el, indent)
|
10
10
|
oembed = OEmbed::Providers.get(el.attr['src'])
|
11
11
|
%q(<div class="embedded %s %s">%s</div>) % [oembed.type, oembed.provider_name.parameterize, oembed.html]
|
12
|
-
rescue
|
12
|
+
rescue StandardError => e
|
13
13
|
super
|
14
14
|
end
|
15
15
|
end
|
data/lib/slodown.rb
CHANGED
data/lib/slodown/formatter.rb
CHANGED
@@ -1,34 +1,61 @@
|
|
1
1
|
module Slodown
|
2
|
+
# This is the base Formatter class provided by Slodown. It works right
|
3
|
+
# out of the box if you want to use exactly the functionality provided by
|
4
|
+
# it, but in most projects, you'll probably want to create a new class
|
5
|
+
# inheriting from this one.
|
6
|
+
#
|
2
7
|
class Formatter
|
3
8
|
def initialize(source)
|
4
9
|
@current = @source = source.to_s
|
5
10
|
end
|
6
11
|
|
7
|
-
#
|
12
|
+
# Run the entire pipeline in a sane order.
|
8
13
|
#
|
9
14
|
def complete
|
10
|
-
markdown.autolink.sanitize
|
15
|
+
extract_metadata.markdown.autolink.sanitize
|
11
16
|
end
|
12
17
|
|
13
18
|
# Convert the current document state from Markdown into HTML.
|
14
19
|
#
|
15
20
|
def markdown
|
16
|
-
|
17
|
-
|
21
|
+
convert do |current|
|
22
|
+
Kramdown::Document.new(current, kramdown_options).to_slodown_html
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
# Auto-link URLs through Rinku.
|
21
27
|
#
|
22
28
|
def autolink
|
23
|
-
|
24
|
-
|
29
|
+
convert do |current|
|
30
|
+
Rinku.auto_link(current)
|
31
|
+
end
|
25
32
|
end
|
26
33
|
|
27
34
|
# Sanitize HTML tags.
|
28
35
|
#
|
29
36
|
def sanitize
|
30
|
-
|
31
|
-
|
37
|
+
convert do |current|
|
38
|
+
Sanitize.clean(current, sanitize_config)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def extract_metadata
|
43
|
+
@metadata = {}
|
44
|
+
|
45
|
+
convert do |current|
|
46
|
+
current.each_line.drop_while do |line|
|
47
|
+
next false if line !~ /^#\+([a-z_]+): (.*)/
|
48
|
+
|
49
|
+
key, value = $1, $2
|
50
|
+
@metadata[key.to_sym] = value
|
51
|
+
end.join('')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Return a hash with the extracted metadata
|
56
|
+
#
|
57
|
+
def metadata
|
58
|
+
@metadata
|
32
59
|
end
|
33
60
|
|
34
61
|
def to_s
|
@@ -37,12 +64,27 @@ module Slodown
|
|
37
64
|
|
38
65
|
private
|
39
66
|
|
67
|
+
# Applies a conversion of the current text state.
|
68
|
+
#
|
69
|
+
def convert(&blk)
|
70
|
+
@current = blk.call(@current)
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
def kramdown_options
|
75
|
+
{
|
76
|
+
syntax_highlighter: 'coderay',
|
77
|
+
syntax_highlighter_opts: {
|
78
|
+
}
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
40
82
|
def sanitize_config
|
41
83
|
{
|
42
84
|
elements: %w(
|
43
|
-
p a span sub sup strong em div hr abbr
|
85
|
+
p br a span sub sup strong em div hr abbr s
|
44
86
|
ul ol li
|
45
|
-
blockquote pre code
|
87
|
+
blockquote pre code kbd
|
46
88
|
h1 h2 h3 h4 h5 h6
|
47
89
|
img object param del
|
48
90
|
),
|
@@ -66,8 +108,43 @@ module Slodown
|
|
66
108
|
'li' => {'id' => ['fn']},
|
67
109
|
'sup' => {'id' => ['fnref']}
|
68
110
|
},
|
69
|
-
transformers:
|
111
|
+
transformers: transformers
|
70
112
|
}
|
71
113
|
end
|
114
|
+
|
115
|
+
def allowed_iframe_hosts
|
116
|
+
# By default, allow everything. Override this to return a regular expression
|
117
|
+
# that will be matched against the iframe/embed's src URL's host.
|
118
|
+
/.*/
|
119
|
+
end
|
120
|
+
|
121
|
+
def transformers
|
122
|
+
[embed_transformer]
|
123
|
+
end
|
124
|
+
|
125
|
+
def embed_transformer
|
126
|
+
lambda do |env|
|
127
|
+
node = env[:node]
|
128
|
+
node_name = env[:node_name]
|
129
|
+
|
130
|
+
# We're fine with a bunch of stuff -- but not <iframe> and <embed> tags.
|
131
|
+
return if env[:is_whitelisted] || !env[:node].element?
|
132
|
+
return unless %w[iframe embed].include? env[:node_name]
|
133
|
+
|
134
|
+
# We're dealing with an <iframe> or <embed> tag! Let's check its src attribute.
|
135
|
+
# If its host name matches our regular expression, we can whitelist it.
|
136
|
+
uri = URI(env[:node]['src'])
|
137
|
+
return unless uri.host =~ allowed_iframe_hosts
|
138
|
+
|
139
|
+
Sanitize.clean_node!(node, {
|
140
|
+
elements: %w[iframe embed],
|
141
|
+
attributes: {
|
142
|
+
all: %w[allowfullscreen frameborder height src width]
|
143
|
+
}
|
144
|
+
})
|
145
|
+
|
146
|
+
{ node_whitelist: [node] }
|
147
|
+
end
|
148
|
+
end
|
72
149
|
end
|
73
150
|
end
|
data/lib/slodown/version.rb
CHANGED
data/slodown.gemspec
CHANGED
@@ -10,18 +10,18 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.email = ["hendrik@mans.de"]
|
11
11
|
gem.description = %q{Markdown + oEmbed + Sanitize + CodeRay = the ultimate user input rendering pipeline.}
|
12
12
|
gem.summary = %q{Markdown + oEmbed + Sanitize + CodeRay = the ultimate user input rendering pipeline.}
|
13
|
-
gem.homepage = "
|
13
|
+
gem.homepage = "https://github.com/hmans/slodown"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
-
gem.add_dependency 'kramdown', '>=
|
20
|
+
gem.add_dependency 'kramdown', '>= 1.5.0'
|
21
21
|
gem.add_dependency 'coderay', '>= 1.0.0'
|
22
22
|
gem.add_dependency 'sanitize', '>= 2.0.0'
|
23
23
|
gem.add_dependency 'rinku', '>= 1.7.0'
|
24
|
-
gem.add_dependency 'ruby-oembed', '
|
24
|
+
gem.add_dependency 'ruby-oembed', '>= 0.8.8'
|
25
25
|
|
26
26
|
gem.add_development_dependency 'rspec', '>= 2.12.0'
|
27
27
|
gem.add_development_dependency 'rspec-html-matchers'
|
@@ -9,6 +9,6 @@ describe 'basic formatting syntax' do
|
|
9
9
|
# to test the whole of kramdown here. :)~
|
10
10
|
#
|
11
11
|
it "renders **this** as bold text" do
|
12
|
-
expect(render "**foo**").to eq "<p><strong>foo</strong></p
|
12
|
+
expect(render "**foo**").to eq "<p><strong>foo</strong></p>\n"
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe '#metadata' do
|
4
|
+
let(:text) do
|
5
|
+
<<-EOF.gsub(/^\t/, '')
|
6
|
+
#+title: A document with metadata
|
7
|
+
#+created_at: 2014-03-01 12:56:31 CET
|
8
|
+
# The first headline
|
9
|
+
|
10
|
+
A paragraph.
|
11
|
+
#+with: no metadata
|
12
|
+
EOF
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:formatter) { Slodown::Formatter.new(text).complete }
|
16
|
+
|
17
|
+
it 'returns metadata as a hash' do
|
18
|
+
expect(formatter.metadata).to be_a(Hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'contains every listed key' do
|
22
|
+
expect(formatter.metadata.keys).to match_array([:title, :created_at])
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'contains every listed value' do
|
26
|
+
expect(formatter.metadata.values).to match_array(['A document with metadata',
|
27
|
+
'2014-03-01 12:56:31 CET'])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'removes metadata from the source' do
|
31
|
+
expect(formatter.to_s).to_not match(/created_at/)
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'keys occuring more than once' do
|
35
|
+
let(:text) do
|
36
|
+
<<-EOF.gsub(/^\t/, '')
|
37
|
+
#+title: ignored
|
38
|
+
#+title: foo
|
39
|
+
EOF
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'uses the last definition' do
|
43
|
+
expect(formatter.metadata.fetch(:title)).to eql 'foo'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,142 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slodown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Hendrik Mans
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-02-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: kramdown
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 1.5.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: 1.5.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: coderay
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 1.0.0
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 1.0.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: sanitize
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: 2.0.0
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: 2.0.0
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rinku
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: 1.7.0
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: 1.7.0
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: ruby-oembed
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - ">="
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: 0.8.8
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - ">="
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: 0.8.8
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: rspec
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - ">="
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: 2.12.0
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - ">="
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: 2.12.0
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: rspec-html-matchers
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - ">="
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
|
-
- -
|
108
|
+
- - ">="
|
124
109
|
- !ruby/object:Gem::Version
|
125
110
|
version: '0'
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: rake
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
|
-
- -
|
115
|
+
- - ">="
|
132
116
|
- !ruby/object:Gem::Version
|
133
117
|
version: '0'
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
|
-
- -
|
122
|
+
- - ">="
|
140
123
|
- !ruby/object:Gem::Version
|
141
124
|
version: '0'
|
142
125
|
description: Markdown + oEmbed + Sanitize + CodeRay = the ultimate user input rendering
|
@@ -147,46 +130,46 @@ executables: []
|
|
147
130
|
extensions: []
|
148
131
|
extra_rdoc_files: []
|
149
132
|
files:
|
150
|
-
- .gitignore
|
151
|
-
- .rspec
|
152
|
-
- .travis.yml
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rspec"
|
135
|
+
- ".travis.yml"
|
153
136
|
- Gemfile
|
154
137
|
- LICENSE
|
155
138
|
- README.md
|
156
139
|
- Rakefile
|
157
140
|
- lib/kramdown/converter/slodown_html.rb
|
158
141
|
- lib/slodown.rb
|
159
|
-
- lib/slodown/embed_transformer.rb
|
160
142
|
- lib/slodown/formatter.rb
|
161
143
|
- lib/slodown/version.rb
|
162
144
|
- slodown.gemspec
|
163
145
|
- spec/basic_formatting_spec.rb
|
146
|
+
- spec/metadata_extraction_spec.rb
|
164
147
|
- spec/spec_helper.rb
|
165
|
-
homepage:
|
148
|
+
homepage: https://github.com/hmans/slodown
|
166
149
|
licenses: []
|
150
|
+
metadata: {}
|
167
151
|
post_install_message:
|
168
152
|
rdoc_options: []
|
169
153
|
require_paths:
|
170
154
|
- lib
|
171
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
172
|
-
none: false
|
173
156
|
requirements:
|
174
|
-
- -
|
157
|
+
- - ">="
|
175
158
|
- !ruby/object:Gem::Version
|
176
159
|
version: '0'
|
177
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
|
-
none: false
|
179
161
|
requirements:
|
180
|
-
- -
|
162
|
+
- - ">="
|
181
163
|
- !ruby/object:Gem::Version
|
182
164
|
version: '0'
|
183
165
|
requirements: []
|
184
166
|
rubyforge_project:
|
185
|
-
rubygems_version:
|
167
|
+
rubygems_version: 2.5.1
|
186
168
|
signing_key:
|
187
|
-
specification_version:
|
169
|
+
specification_version: 4
|
188
170
|
summary: Markdown + oEmbed + Sanitize + CodeRay = the ultimate user input rendering
|
189
171
|
pipeline.
|
190
172
|
test_files:
|
191
173
|
- spec/basic_formatting_spec.rb
|
174
|
+
- spec/metadata_extraction_spec.rb
|
192
175
|
- spec/spec_helper.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Slodown
|
2
|
-
class EmbedTransformer
|
3
|
-
ALLOWED_DOMAINS = %w[youtube.com soundcloud.com vimeo.com]
|
4
|
-
|
5
|
-
def self.call(env)
|
6
|
-
node = env[:node]
|
7
|
-
node_name = env[:node_name]
|
8
|
-
|
9
|
-
return if env[:is_whitelisted] || !env[:node].element?
|
10
|
-
return unless %w[iframe embed].include? env[:node_name]
|
11
|
-
|
12
|
-
uri = URI(env[:node]['src'])
|
13
|
-
domains = ALLOWED_DOMAINS.map { |d| Regexp.escape(d) }.join("|")
|
14
|
-
return unless uri.host =~ /^(.+\.)?(#{domains})/
|
15
|
-
|
16
|
-
Sanitize.clean_node!(node, {
|
17
|
-
elements: %w[iframe embed],
|
18
|
-
attributes: {
|
19
|
-
all: %w[allowfullscreen frameborder height src width]
|
20
|
-
}
|
21
|
-
})
|
22
|
-
|
23
|
-
{ node_whitelist: [node] }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|