render_editorjs 0.1.0 → 0.1.1
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/.github/workflows/ci.yml +37 -0
- data/.github/workflows/codeql-analysis.yml +70 -0
- data/.rubocop.yml +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +48 -4
- data/Guardfile +9 -0
- data/README.md +5 -5
- data/lib/render_editorjs/blocks/header.rb +6 -16
- data/lib/render_editorjs/blocks/image.rb +12 -6
- data/lib/render_editorjs/blocks/list.rb +14 -14
- data/lib/render_editorjs/blocks/paragraph.rb +19 -26
- data/lib/render_editorjs/default_renderer.rb +4 -0
- data/lib/render_editorjs/document.rb +27 -23
- data/lib/render_editorjs/version.rb +1 -1
- data/lib/render_editorjs.rb +1 -3
- data/render_editorjs.gemspec +1 -2
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afb48f475a907b32008641ef5749b4ac35ba8633296a883e309dd29a2ecd2632
|
4
|
+
data.tar.gz: 960fd6d51523abef86d19cf4bbdbcf95df905b087d45de6f493369e30877120d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5661597c851c45d391fbd2b01fb4d7d6eeade720645b43f5b080ed6af9eecad81e7838e6785e736476f2e47557562b2dee77f868fc5b7f53205619be9c2704e
|
7
|
+
data.tar.gz: aab631479c0c87892a943fe14145db11e80e821756765838aa3661b746f0d302556942eabe310ba590545e5590497b4e849918017f9b4139c87a8369bda83e96
|
@@ -0,0 +1,37 @@
|
|
1
|
+
name: RuboCop
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
fail-fast: false
|
14
|
+
matrix:
|
15
|
+
ruby: [2.5, 2.6, 2.7, 3.0, head, debug, truffleruby, truffleruby-head ] # jruby and jruby-head fails due nokogiri
|
16
|
+
continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby }}
|
23
|
+
- name: Cache gems
|
24
|
+
uses: actions/cache@v1
|
25
|
+
with:
|
26
|
+
path: vendor/bundle
|
27
|
+
key: ${{ runner.os }}-rubocop-${{ hashFiles('**/Gemfile.lock') }}
|
28
|
+
restore-keys: |
|
29
|
+
${{ runner.os }}-rubocop-
|
30
|
+
- name: Install gems
|
31
|
+
run: |
|
32
|
+
bundle config path vendor/bundle
|
33
|
+
bundle install --jobs 4 --retry 3
|
34
|
+
- name: Run tests
|
35
|
+
run: bundle exec rake test
|
36
|
+
- name: Run RuboCop
|
37
|
+
run: bundle exec rubocop --parallel
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# For most projects, this workflow file will not need changing; you simply need
|
2
|
+
# to commit it to your repository.
|
3
|
+
#
|
4
|
+
# You may wish to alter this file to override the set of languages analyzed,
|
5
|
+
# or to provide custom queries or build logic.
|
6
|
+
#
|
7
|
+
# ******** NOTE ********
|
8
|
+
# We have attempted to detect the languages in your repository. Please check
|
9
|
+
# the `language` matrix defined below to confirm you have the correct set of
|
10
|
+
# supported CodeQL languages.
|
11
|
+
#
|
12
|
+
name: "CodeQL"
|
13
|
+
|
14
|
+
on:
|
15
|
+
push:
|
16
|
+
branches: [ master ]
|
17
|
+
pull_request:
|
18
|
+
# The branches below must be a subset of the branches above
|
19
|
+
branches: [ master ]
|
20
|
+
schedule:
|
21
|
+
- cron: '27 16 * * 2'
|
22
|
+
|
23
|
+
jobs:
|
24
|
+
analyze:
|
25
|
+
name: Analyze
|
26
|
+
runs-on: ubuntu-latest
|
27
|
+
permissions:
|
28
|
+
actions: read
|
29
|
+
contents: read
|
30
|
+
security-events: write
|
31
|
+
|
32
|
+
strategy:
|
33
|
+
fail-fast: false
|
34
|
+
matrix:
|
35
|
+
language: [ 'ruby' ]
|
36
|
+
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
37
|
+
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
38
|
+
|
39
|
+
steps:
|
40
|
+
- name: Checkout repository
|
41
|
+
uses: actions/checkout@v2
|
42
|
+
|
43
|
+
# Initializes the CodeQL tools for scanning.
|
44
|
+
- name: Initialize CodeQL
|
45
|
+
uses: github/codeql-action/init@v1
|
46
|
+
with:
|
47
|
+
languages: ${{ matrix.language }}
|
48
|
+
# If you wish to specify custom queries, you can do so here or in a config file.
|
49
|
+
# By default, queries listed here will override any specified in a config file.
|
50
|
+
# Prefix the list here with "+" to use these queries and those in the config file.
|
51
|
+
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
52
|
+
|
53
|
+
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
54
|
+
# If this step fails, then you should remove it and run the build manually (see below)
|
55
|
+
- name: Autobuild
|
56
|
+
uses: github/codeql-action/autobuild@v1
|
57
|
+
|
58
|
+
# ℹ️ Command-line programs to run using the OS shell.
|
59
|
+
# 📚 https://git.io/JvXDl
|
60
|
+
|
61
|
+
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
62
|
+
# and modify them (or add more) to build your code if your project
|
63
|
+
# uses a compiled language
|
64
|
+
|
65
|
+
#- run: |
|
66
|
+
# make bootstrap
|
67
|
+
# make release
|
68
|
+
|
69
|
+
- name: Perform CodeQL Analysis
|
70
|
+
uses: github/codeql-action/analyze@v1
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
@@ -5,11 +5,15 @@ source "https://rubygems.org"
|
|
5
5
|
# Specify your gem's dependencies in render_editorjs.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
+
gem "guard"
|
9
|
+
gem "guard-minitest"
|
8
10
|
gem "minitest", "~> 5.0"
|
9
11
|
gem "minitest-focus"
|
12
|
+
gem "minitest-line"
|
10
13
|
gem "minitest-reporters"
|
11
14
|
gem "rake", "~> 12.0"
|
12
15
|
gem "rubocop", "~> 1.22", require: false
|
13
16
|
gem "rubocop-minitest", require: false
|
14
17
|
gem "rubocop-performance", require: false
|
15
18
|
gem "rubocop-thread_safety", require: false
|
19
|
+
gem "simplecov", require: false
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
render_editorjs (0.1.
|
4
|
+
render_editorjs (0.1.1)
|
5
5
|
actionview (>= 4)
|
6
6
|
json-schema (~> 2)
|
7
7
|
sanitize (~> 6.0.0)
|
@@ -27,31 +27,60 @@ GEM
|
|
27
27
|
ansi (1.5.0)
|
28
28
|
ast (2.4.2)
|
29
29
|
builder (3.2.4)
|
30
|
+
coderay (1.1.3)
|
30
31
|
concurrent-ruby (1.1.9)
|
31
32
|
crass (1.0.6)
|
33
|
+
docile (1.4.0)
|
32
34
|
erubi (1.10.0)
|
35
|
+
ffi (1.15.4)
|
36
|
+
formatador (0.3.0)
|
37
|
+
guard (2.18.0)
|
38
|
+
formatador (>= 0.2.4)
|
39
|
+
listen (>= 2.7, < 4.0)
|
40
|
+
lumberjack (>= 1.0.12, < 2.0)
|
41
|
+
nenv (~> 0.1)
|
42
|
+
notiffany (~> 0.0)
|
43
|
+
pry (>= 0.13.0)
|
44
|
+
shellany (~> 0.0)
|
45
|
+
thor (>= 0.18.1)
|
46
|
+
guard-compat (1.2.1)
|
47
|
+
guard-minitest (2.4.6)
|
48
|
+
guard-compat (~> 1.2)
|
49
|
+
minitest (>= 3.0)
|
33
50
|
i18n (1.8.11)
|
34
51
|
concurrent-ruby (~> 1.0)
|
35
52
|
json-schema (2.8.1)
|
36
53
|
addressable (>= 2.4)
|
54
|
+
listen (3.7.0)
|
55
|
+
rb-fsevent (~> 0.10, >= 0.10.3)
|
56
|
+
rb-inotify (~> 0.9, >= 0.9.10)
|
37
57
|
loofah (2.12.0)
|
38
58
|
crass (~> 1.0.2)
|
39
59
|
nokogiri (>= 1.5.9)
|
40
|
-
|
60
|
+
lumberjack (1.2.8)
|
61
|
+
method_source (1.0.0)
|
41
62
|
minitest (5.14.4)
|
42
63
|
minitest-focus (1.3.1)
|
43
64
|
minitest (>= 4, < 6)
|
65
|
+
minitest-line (0.6.5)
|
66
|
+
minitest (~> 5.0)
|
44
67
|
minitest-reporters (1.4.3)
|
45
68
|
ansi
|
46
69
|
builder
|
47
70
|
minitest (>= 5.0)
|
48
71
|
ruby-progressbar
|
49
|
-
|
50
|
-
|
72
|
+
nenv (0.3.0)
|
73
|
+
nokogiri (1.12.5-x86_64-darwin)
|
51
74
|
racc (~> 1.4)
|
75
|
+
notiffany (0.1.3)
|
76
|
+
nenv (~> 0.1)
|
77
|
+
shellany (~> 0.0)
|
52
78
|
parallel (1.21.0)
|
53
79
|
parser (3.0.2.0)
|
54
80
|
ast (~> 2.4.1)
|
81
|
+
pry (0.14.1)
|
82
|
+
coderay (~> 1.1)
|
83
|
+
method_source (~> 1.0)
|
55
84
|
public_suffix (4.0.6)
|
56
85
|
racc (1.6.0)
|
57
86
|
rails-dom-testing (2.0.3)
|
@@ -61,6 +90,9 @@ GEM
|
|
61
90
|
loofah (~> 2.3)
|
62
91
|
rainbow (3.0.0)
|
63
92
|
rake (12.3.3)
|
93
|
+
rb-fsevent (0.11.0)
|
94
|
+
rb-inotify (0.10.1)
|
95
|
+
ffi (~> 1.0)
|
64
96
|
regexp_parser (2.1.1)
|
65
97
|
rexml (3.2.5)
|
66
98
|
rubocop (1.22.3)
|
@@ -85,6 +117,14 @@ GEM
|
|
85
117
|
sanitize (6.0.0)
|
86
118
|
crass (~> 1.0.2)
|
87
119
|
nokogiri (>= 1.12.0)
|
120
|
+
shellany (0.0.1)
|
121
|
+
simplecov (0.21.2)
|
122
|
+
docile (~> 1.1)
|
123
|
+
simplecov-html (~> 0.11)
|
124
|
+
simplecov_json_formatter (~> 0.1)
|
125
|
+
simplecov-html (0.12.3)
|
126
|
+
simplecov_json_formatter (0.1.3)
|
127
|
+
thor (1.1.0)
|
88
128
|
tzinfo (2.0.4)
|
89
129
|
concurrent-ruby (~> 1.0)
|
90
130
|
unicode-display_width (2.1.0)
|
@@ -94,8 +134,11 @@ PLATFORMS
|
|
94
134
|
ruby
|
95
135
|
|
96
136
|
DEPENDENCIES
|
137
|
+
guard
|
138
|
+
guard-minitest
|
97
139
|
minitest (~> 5.0)
|
98
140
|
minitest-focus
|
141
|
+
minitest-line
|
99
142
|
minitest-reporters
|
100
143
|
rake (~> 12.0)
|
101
144
|
render_editorjs!
|
@@ -103,6 +146,7 @@ DEPENDENCIES
|
|
103
146
|
rubocop-minitest
|
104
147
|
rubocop-performance
|
105
148
|
rubocop-thread_safety
|
149
|
+
simplecov
|
106
150
|
|
107
151
|
BUNDLED WITH
|
108
152
|
2.1.4
|
data/Guardfile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
guard :minitest do
|
4
|
+
# with Minitest::Unit
|
5
|
+
watch(%r{^test/(.*)/?(.*)_test\.rb$})
|
6
|
+
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}#{m[2]}_test.rb" }
|
7
|
+
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[2]}_test.rb" }
|
8
|
+
watch(%r{^test/test_helper\.rb$}) { "test" }
|
9
|
+
end
|
data/README.md
CHANGED
@@ -41,7 +41,7 @@ RenderEditorjs.render(json) #=> HTML...
|
|
41
41
|
|
42
42
|
```ruby
|
43
43
|
renderer = RenderEditorjs::DefaultRenderer.new
|
44
|
-
document = RenderEditorjs::Document.new(
|
44
|
+
document = RenderEditorjs::Document.new(json, renderer)
|
45
45
|
|
46
46
|
document.valid? #=> true | false
|
47
47
|
document.errors #=> Array with the schema errors
|
@@ -54,7 +54,7 @@ Customize the DefaultRenderer adding or overriding blocks:
|
|
54
54
|
|
55
55
|
```ruby
|
56
56
|
renderer = RenderEditorjs::DefaultRenderer.new("header" => MyCustomHeader.new, "customBlock" => CustomBlock.new)
|
57
|
-
document = RenderEditorjs::Document.new(
|
57
|
+
document = RenderEditorjs::Document.new(json, renderer)
|
58
58
|
document.render #=> My custom HTML
|
59
59
|
```
|
60
60
|
|
@@ -62,7 +62,7 @@ Create your renderer class:
|
|
62
62
|
|
63
63
|
```ruby
|
64
64
|
renderer = MyOwnRenderer.new
|
65
|
-
document = RenderEditorjs::Document.new(
|
65
|
+
document = RenderEditorjs::Document.new(json, renderer)
|
66
66
|
document.render #=> My custom HTML
|
67
67
|
```
|
68
68
|
|
@@ -74,7 +74,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
74
74
|
|
75
75
|
## Contributing
|
76
76
|
|
77
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
77
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/ceritium/render_editorjs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/ceritium/render_editorjs/blob/master/CODE_OF_CONDUCT.md).
|
78
78
|
|
79
79
|
|
80
80
|
## License
|
@@ -83,4 +83,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
83
83
|
|
84
84
|
## Code of Conduct
|
85
85
|
|
86
|
-
Everyone interacting in the
|
86
|
+
Everyone interacting in the RenderEditorjs project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/ceritium/render_editorjs/blob/master/CODE_OF_CONDUCT.md).
|
@@ -2,11 +2,8 @@
|
|
2
2
|
|
3
3
|
module RenderEditorjs
|
4
4
|
module Blocks
|
5
|
+
# Compatible with https://github.com/editor-js/header
|
5
6
|
class Header < Base
|
6
|
-
DEFAULT_OPTIONS = {
|
7
|
-
alignment: "align-left"
|
8
|
-
}.freeze
|
9
|
-
|
10
7
|
SCHEMA = YAML.safe_load(<<~YAML)
|
11
8
|
type: object
|
12
9
|
additionalProperties: false
|
@@ -19,9 +16,9 @@ module RenderEditorjs
|
|
19
16
|
alignment:
|
20
17
|
type: string
|
21
18
|
enum:
|
22
|
-
-
|
23
|
-
-
|
24
|
-
-
|
19
|
+
- left
|
20
|
+
- center
|
21
|
+
- right
|
25
22
|
required:
|
26
23
|
- text
|
27
24
|
- level
|
@@ -31,15 +28,8 @@ module RenderEditorjs
|
|
31
28
|
return unless valid?(data)
|
32
29
|
|
33
30
|
alignment = data["alignment"]
|
34
|
-
|
35
|
-
|
36
|
-
class_name = [
|
37
|
-
class_name,
|
38
|
-
css_name("__#{alignment}")
|
39
|
-
].join(" ")
|
40
|
-
end
|
41
|
-
|
42
|
-
content_tag(:"h#{data["level"]}", sanitize(data["text"]).html_safe, class: class_name.presence)
|
31
|
+
css_class = alignment ? "align-#{alignment}" : nil
|
32
|
+
content_tag(:"h#{data["level"]}", sanitize(data["text"]).html_safe, class: css_class)
|
43
33
|
end
|
44
34
|
|
45
35
|
def sanitize(text)
|
@@ -4,8 +4,6 @@ module RenderEditorjs
|
|
4
4
|
module Blocks
|
5
5
|
# Render for https://github.com/editor-js/image
|
6
6
|
class Image < Base
|
7
|
-
DEFAULT_OPTIONS = {}.freeze
|
8
|
-
|
9
7
|
SCHEMA = YAML.safe_load(<<~YAML)
|
10
8
|
type: object
|
11
9
|
additionalProperties: false
|
@@ -32,9 +30,8 @@ module RenderEditorjs
|
|
32
30
|
def render(data)
|
33
31
|
return unless valid?(data)
|
34
32
|
|
35
|
-
|
36
|
-
|
37
|
-
caption = data["caption"]
|
33
|
+
url = sanitize_url(data["file"]["url"])
|
34
|
+
caption = sanitize_caption(data["caption"])
|
38
35
|
with_border = data["withBorder"]
|
39
36
|
with_background = data["withBackground"]
|
40
37
|
stretched = data["stretched"]
|
@@ -47,7 +44,8 @@ module RenderEditorjs
|
|
47
44
|
html_str = content_tag :div, class: html_class do
|
48
45
|
content_tag :img, "", src: url
|
49
46
|
end
|
50
|
-
html_str << content_tag(:div, caption.html_safe, class: "caption").html_safe
|
47
|
+
html_str << content_tag(:div, caption.html_safe, class: "caption").html_safe if caption.presence
|
48
|
+
html_str
|
51
49
|
end
|
52
50
|
|
53
51
|
def sanitize(data)
|
@@ -59,6 +57,14 @@ module RenderEditorjs
|
|
59
57
|
|
60
58
|
data
|
61
59
|
end
|
60
|
+
|
61
|
+
def sanitize_url(url)
|
62
|
+
Sanitize.fragment(url, remove_contents: true).strip.gsub("&", "&")
|
63
|
+
end
|
64
|
+
|
65
|
+
def sanitize_caption(caption)
|
66
|
+
Sanitize.fragment(caption, remove_contents: true).strip
|
67
|
+
end
|
62
68
|
end
|
63
69
|
end
|
64
70
|
end
|
@@ -4,6 +4,18 @@ module RenderEditorjs
|
|
4
4
|
module Blocks
|
5
5
|
# Render for https://github.com/editor-js/nested-list
|
6
6
|
class List < Base
|
7
|
+
# TODO: Consider extract it and the sanitize method with the other on
|
8
|
+
# Paragraph block to the DefaultRenderer
|
9
|
+
SAFE_TAGS = {
|
10
|
+
"b" => nil,
|
11
|
+
"i" => nil,
|
12
|
+
"u" => ["class"],
|
13
|
+
"del" => ["class"],
|
14
|
+
"a" => ["href"],
|
15
|
+
"mark" => ["class"],
|
16
|
+
"code" => ["class"]
|
17
|
+
}.freeze
|
18
|
+
|
7
19
|
SCHEMA = YAML.safe_load(<<~YAML)
|
8
20
|
type: object
|
9
21
|
additionalProperties: false
|
@@ -46,23 +58,11 @@ module RenderEditorjs
|
|
46
58
|
end
|
47
59
|
end
|
48
60
|
|
49
|
-
def safe_tags
|
50
|
-
{
|
51
|
-
"b" => nil,
|
52
|
-
"i" => nil,
|
53
|
-
"u" => ["class"],
|
54
|
-
"del" => ["class"],
|
55
|
-
"a" => ["href"],
|
56
|
-
"mark" => ["class"],
|
57
|
-
"code" => ["class"]
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
61
|
def sanitize(text)
|
62
62
|
Sanitize.fragment(
|
63
63
|
text,
|
64
|
-
elements:
|
65
|
-
attributes:
|
64
|
+
elements: SAFE_TAGS.keys,
|
65
|
+
attributes: SAFE_TAGS.select { |_k, v| v },
|
66
66
|
remove_contents: true
|
67
67
|
)
|
68
68
|
end
|
@@ -2,11 +2,23 @@
|
|
2
2
|
|
3
3
|
module RenderEditorjs
|
4
4
|
module Blocks
|
5
|
+
# Compatible with default Paragraph and paragraph-with-aligment
|
6
|
+
# https://github.com/kaaaaaaaaaaai/paragraph-with-alignment
|
5
7
|
class Paragraph < Base
|
6
8
|
DEFAULT_OPTIONS = {
|
7
9
|
tag: "p"
|
8
10
|
}.freeze
|
9
11
|
|
12
|
+
SAFE_TAGS = {
|
13
|
+
"b" => nil,
|
14
|
+
"i" => nil,
|
15
|
+
"u" => ["class"],
|
16
|
+
"del" => ["class"],
|
17
|
+
"a" => ["href"],
|
18
|
+
"mark" => ["class"],
|
19
|
+
"code" => ["class"]
|
20
|
+
}.freeze
|
21
|
+
|
10
22
|
SCHEMA = YAML.safe_load(<<~YAML)
|
11
23
|
type: object
|
12
24
|
additionalProperties: false
|
@@ -16,9 +28,9 @@ module RenderEditorjs
|
|
16
28
|
alignment:
|
17
29
|
type: string
|
18
30
|
enum:
|
19
|
-
-
|
20
|
-
-
|
21
|
-
-
|
31
|
+
- left
|
32
|
+
- center
|
33
|
+
- right
|
22
34
|
YAML
|
23
35
|
|
24
36
|
attr_reader :options
|
@@ -32,36 +44,17 @@ module RenderEditorjs
|
|
32
44
|
return unless valid?(data)
|
33
45
|
|
34
46
|
alignment = data["alignment"]
|
35
|
-
|
36
|
-
|
37
|
-
class_name_str = [
|
38
|
-
class_name_str,
|
39
|
-
css_name("__#{alignment}")
|
40
|
-
].join(" ")
|
41
|
-
end
|
42
|
-
|
43
|
-
content_tag(options[:tag], class: class_name_str.presence) do
|
47
|
+
css_class = alignment ? "align-#{alignment}" : nil
|
48
|
+
content_tag(options[:tag], class: css_class) do
|
44
49
|
sanitize(data["text"]).html_safe
|
45
50
|
end
|
46
51
|
end
|
47
52
|
|
48
|
-
def safe_tags
|
49
|
-
{
|
50
|
-
"b" => nil,
|
51
|
-
"i" => nil,
|
52
|
-
"u" => ["class"],
|
53
|
-
"del" => ["class"],
|
54
|
-
"a" => ["href"],
|
55
|
-
"mark" => ["class"],
|
56
|
-
"code" => ["class"]
|
57
|
-
}
|
58
|
-
end
|
59
|
-
|
60
53
|
def sanitize(text)
|
61
54
|
Sanitize.fragment(
|
62
55
|
text,
|
63
|
-
elements:
|
64
|
-
attributes:
|
56
|
+
elements: SAFE_TAGS.keys,
|
57
|
+
attributes: SAFE_TAGS.select { |_k, v| v },
|
65
58
|
remove_contents: true
|
66
59
|
)
|
67
60
|
end
|
@@ -4,50 +4,54 @@ module RenderEditorjs
|
|
4
4
|
class Document
|
5
5
|
attr_reader :renderer, :content, :errors
|
6
6
|
|
7
|
-
def initialize(
|
7
|
+
def initialize(content, renderer = RenderEditorjs::DefaultRenderer.new)
|
8
8
|
@renderer = renderer
|
9
9
|
@content = content.is_a?(Hash) ? content : JSON.parse(content)
|
10
|
-
|
11
|
-
@block_renderers = {}
|
12
10
|
@errors = []
|
13
11
|
end
|
14
12
|
|
15
|
-
def
|
16
|
-
|
17
|
-
block_renderer = block_renderers(block["type"])
|
18
|
-
next unless block_renderer
|
13
|
+
def valid?
|
14
|
+
return false unless valid_renderer?
|
19
15
|
|
20
|
-
|
21
|
-
@errors << validator.errors unless validator.valid?
|
22
|
-
end
|
23
|
-
end
|
16
|
+
validate_blocks
|
24
17
|
|
25
|
-
|
26
|
-
@block_renderers[block_type] ||= renderer.mapping[block_type]
|
18
|
+
@errors.empty?
|
27
19
|
end
|
28
20
|
|
29
|
-
def
|
30
|
-
|
21
|
+
def render
|
22
|
+
return "" unless valid_renderer?
|
23
|
+
|
24
|
+
content["blocks"].map do |block|
|
25
|
+
block_renderer = block_renderers(block["type"])
|
26
|
+
next unless block_renderer
|
27
|
+
|
28
|
+
block_renderer.render(block["data"])
|
29
|
+
end.join
|
31
30
|
end
|
32
31
|
|
33
|
-
|
34
|
-
validator.validate!
|
35
|
-
validate_blocks
|
32
|
+
private
|
36
33
|
|
37
|
-
|
34
|
+
def valid_renderer?
|
35
|
+
renderer.validator(content).validate!
|
38
36
|
rescue JSON::Schema::ValidationError => e
|
39
37
|
@errors << e.message
|
40
38
|
|
41
39
|
false
|
42
40
|
end
|
43
41
|
|
44
|
-
def
|
45
|
-
content["blocks"].
|
42
|
+
def validate_blocks
|
43
|
+
content["blocks"].each do |block|
|
46
44
|
block_renderer = block_renderers(block["type"])
|
47
45
|
next unless block_renderer
|
48
46
|
|
49
|
-
block_renderer.
|
50
|
-
|
47
|
+
validator = block_renderer.validator(block["data"])
|
48
|
+
@errors << validator.errors unless validator.valid?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def block_renderers(block_type)
|
53
|
+
@block_renderers ||= {}
|
54
|
+
@block_renderers[block_type] ||= renderer.mapping[block_type]
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
data/lib/render_editorjs.rb
CHANGED
@@ -9,9 +9,7 @@ loader = Zeitwerk::Loader.for_gem
|
|
9
9
|
loader.setup
|
10
10
|
|
11
11
|
module RenderEditorjs
|
12
|
-
class Error < StandardError; end
|
13
|
-
|
14
12
|
def self.render(content)
|
15
|
-
RenderEditorjs::Document.new(
|
13
|
+
RenderEditorjs::Document.new(content).render
|
16
14
|
end
|
17
15
|
end
|
data/render_editorjs.gemspec
CHANGED
@@ -8,8 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["José Galisteo"]
|
9
9
|
spec.email = ["ceritium@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = "A modular and customizable Ruby renderer for
|
12
|
-
"
|
11
|
+
spec.summary = "A modular and customizable Ruby renderer for https://editorjs.io"
|
13
12
|
spec.homepage = "https://github.com/ceritium/render_editorjs"
|
14
13
|
spec.license = "MIT"
|
15
14
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: render_editorjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- José Galisteo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionview
|
@@ -73,12 +73,15 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".github/workflows/ci.yml"
|
77
|
+
- ".github/workflows/codeql-analysis.yml"
|
76
78
|
- ".gitignore"
|
77
79
|
- ".rubocop.yml"
|
78
80
|
- ".travis.yml"
|
79
81
|
- CODE_OF_CONDUCT.md
|
80
82
|
- Gemfile
|
81
83
|
- Gemfile.lock
|
84
|
+
- Guardfile
|
82
85
|
- LICENSE.txt
|
83
86
|
- README.md
|
84
87
|
- Rakefile
|
@@ -119,5 +122,5 @@ requirements: []
|
|
119
122
|
rubygems_version: 3.1.6
|
120
123
|
signing_key:
|
121
124
|
specification_version: 4
|
122
|
-
summary: A modular and customizable Ruby renderer for
|
125
|
+
summary: A modular and customizable Ruby renderer for https://editorjs.io
|
123
126
|
test_files: []
|