editor_js 0.2.2 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e86cd6d867f3751fae7644a529b9a81940189acff184a7a9d57c835603c1a10c
4
- data.tar.gz: e8650afadb86745553ae949f67b26766e866d4213f4f2da49a1fb3b8a27b6f8d
3
+ metadata.gz: 3331b44289e858fff9fe9dff634c67c385c355f54f26a671ca32caf0b2736c2a
4
+ data.tar.gz: 3a6690dad7bf834d108855d1bf80de681c285ccec755ca7f0e9b799dff7a3c76
5
5
  SHA512:
6
- metadata.gz: 39595b63e56f1f8d68ef2ca9ab3b83daf5539c87a88a5456f278444739c0705b8bb2ce3290f284e0ed13f84271c47ee0b0a851e8004be3d36082395017b0fefd
7
- data.tar.gz: 70d3d7bfb418837f95d1e8140197a68daf1a2225e7fa1076f164991d6698decfcf83d515ff3dc280e2304141674ede9cf9cf3f70affa995511a64d64cc8801d8
6
+ metadata.gz: ad9f9f867736e7bc0db5497d64f8253d4c381088c1e2b65dc6d6747c508809a901e609868fa354733b137d217ef49ab43f27ddc2d40d27d7fe8243b856d16da9
7
+ data.tar.gz: '09dd651215451db432c4c3ef27a772db470fd6dba5b4d216b592fef2373b5dfec6b12c5efdda3b69be94c20f82b2f76c719eb2f732db80a33b2c96650848e113'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- editor_js (0.2.2)
4
+ editor_js (0.3.1)
5
5
  actionview (>= 4)
6
6
  activesupport (>= 4)
7
7
  coderay (~> 1.1, >= 1.1.2)
@@ -13,18 +13,18 @@ PATH
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
- actionview (6.0.2.1)
17
- activesupport (= 6.0.2.1)
16
+ actionview (6.0.3.1)
17
+ activesupport (= 6.0.3.1)
18
18
  builder (~> 3.1)
19
19
  erubi (~> 1.4)
20
20
  rails-dom-testing (~> 2.0)
21
21
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
22
- activesupport (6.0.2.1)
22
+ activesupport (6.0.3.1)
23
23
  concurrent-ruby (~> 1.0, >= 1.0.2)
24
24
  i18n (>= 0.7, < 2)
25
25
  minitest (~> 5.1)
26
26
  tzinfo (~> 1.1)
27
- zeitwerk (~> 2.2)
27
+ zeitwerk (~> 2.2, >= 2.2.2)
28
28
  addressable (2.7.0)
29
29
  public_suffix (>= 2.0.2, < 5.0)
30
30
  ast (2.4.0)
@@ -42,13 +42,13 @@ GEM
42
42
  json (2.3.0)
43
43
  json-schema (2.8.1)
44
44
  addressable (>= 2.4)
45
- loofah (2.4.0)
45
+ loofah (2.5.0)
46
46
  crass (~> 1.0.2)
47
47
  nokogiri (>= 1.5.9)
48
48
  method_source (0.9.2)
49
49
  mini_portile2 (2.4.0)
50
- minitest (5.13.0)
51
- nokogiri (1.10.7)
50
+ minitest (5.14.1)
51
+ nokogiri (1.10.9)
52
52
  mini_portile2 (~> 2.4.0)
53
53
  nokogumbo (2.0.2)
54
54
  nokogiri (~> 1.8, >= 1.8.4)
@@ -58,14 +58,14 @@ GEM
58
58
  pry (0.12.2)
59
59
  coderay (~> 1.1.0)
60
60
  method_source (~> 0.9.0)
61
- public_suffix (4.0.1)
61
+ public_suffix (4.0.3)
62
62
  rails-dom-testing (2.0.3)
63
63
  activesupport (>= 4.2.0)
64
64
  nokogiri (>= 1.6)
65
65
  rails-html-sanitizer (1.3.0)
66
66
  loofah (~> 2.3)
67
67
  rainbow (3.0.0)
68
- rake (10.5.0)
68
+ rake (13.0.1)
69
69
  redcarpet (3.5.0)
70
70
  rspec (3.9.0)
71
71
  rspec-core (~> 3.9.0)
@@ -98,7 +98,7 @@ GEM
98
98
  simplecov-html (~> 0.10.0)
99
99
  simplecov-html (0.10.2)
100
100
  thread_safe (0.3.6)
101
- tzinfo (1.2.5)
101
+ tzinfo (1.2.7)
102
102
  thread_safe (~> 0.1)
103
103
  unicode-display_width (1.6.0)
104
104
  zeitwerk (2.2.2)
@@ -110,10 +110,10 @@ DEPENDENCIES
110
110
  bundler (~> 2.0)
111
111
  editor_js!
112
112
  pry (~> 0.12.2)
113
- rake (~> 10.0)
113
+ rake (~> 13.0)
114
114
  rspec (~> 3.0)
115
115
  rubocop (~> 0.77.0)
116
116
  simplecov (~> 0.17.1)
117
117
 
118
118
  BUNDLED WITH
119
- 2.0.2
119
+ 2.1.4
@@ -33,6 +33,6 @@ Gem::Specification.new do |spec|
33
33
  spec.add_dependency 'redcarpet', '~> 3.5'
34
34
  spec.add_dependency 'coderay', '~> 1.1', '>= 1.1.2'
35
35
  spec.add_development_dependency "bundler", "~> 2.0"
36
- spec.add_development_dependency "rake", "~> 10.0"
36
+ spec.add_development_dependency "rake", "~> 13.0"
37
37
  spec.add_development_dependency "rspec", "~> 3.0"
38
38
  end
@@ -24,6 +24,7 @@ require 'editor_js/blocks/paragraph_block'
24
24
  require 'editor_js/blocks/qiniu_image_block'
25
25
  require 'editor_js/blocks/quote_block'
26
26
  require 'editor_js/blocks/table_block'
27
+ require 'editor_js/blocks/attaches_block'
27
28
  require 'editor_js/document'
28
29
 
29
30
  module EditorJs
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EditorJs
4
+ module Blocks
5
+ class AttachesBlock < Base
6
+ include ActiveSupport::NumberHelper
7
+
8
+ def schema
9
+ YAML.safe_load(<<~YAML)
10
+ type: object
11
+ additionalProperties: false
12
+ properties:
13
+ file:
14
+ type: object
15
+ additionalProperties: false
16
+ properties:
17
+ url:
18
+ type: string
19
+ name:
20
+ type: string
21
+ type:
22
+ type: string
23
+ size:
24
+ type: number
25
+ title:
26
+ type: string
27
+ required:
28
+ - file
29
+ YAML
30
+ end
31
+
32
+ EXTENSIONS = {
33
+ 'doc' => '#3e74da',
34
+ 'docx' => '#3e74da',
35
+ 'odt' => '#3e74da',
36
+ 'pdf' => '#d47373',
37
+ 'rtf' => '#656ecd',
38
+ 'tex' => '#5a5a5b',
39
+ 'txt' => '#5a5a5b',
40
+ 'pptx' => '#e07066',
41
+ 'ppt' => '#e07066',
42
+ 'mp3' => '#eab456',
43
+ 'mp4' => '#f676a6',
44
+ 'xls' => '#3f9e64',
45
+ 'html' => '#2988f0',
46
+ 'htm' => '#2988f0',
47
+ 'png' => '#f676a6',
48
+ 'jpg' => '#f67676',
49
+ 'jpeg' => '#f67676',
50
+ 'gif' => '#f6af76',
51
+ 'zip' => '#4f566f',
52
+ 'rar' => '#4f566f',
53
+ 'exe' => '#e26f6f',
54
+ 'svg' => '#bf5252',
55
+ 'key' => '#e07066',
56
+ 'sketch' => '#df821c',
57
+ 'ai' => '#df821c',
58
+ 'psd' => '#388ae5',
59
+ 'dmg' => '#e26f6f',
60
+ 'json' => '#2988f0',
61
+ 'csv' => '#3f9e64'
62
+ }
63
+
64
+ ICONS = {
65
+ file_icon: '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="40"><path d="M17 0l15 14V3v34a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h20-6zm0 2H3a1 1 0 0 0-1 1v34a1 1 0 0 0 1 1h26a1 1 0 0 0 1-1V14H17V2zm2 10h7.926L19 4.602V12z"></path></svg>',
66
+ custom_file_icon: '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="40"><g fill="#A8ACB8" fill-rule="evenodd"><path fill-rule="nonzero" d="M17 0l15 14V3v34a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h20-6zm0 2H3a1 1 0 0 0-1 1v34a1 1 0 0 0 1 1h26a1 1 0 0 0 1-1V14H17V2zm2 10h7.926L19 4.602V12z"></path><path d="M7 22h18v2H7zm0 4h18v2H7zm0 4h18v2H7z"></path></g></svg>',
67
+ download_icon: '<svg xmlns="http://www.w3.org/2000/svg" width="17pt" height="17pt" viewBox="0 0 17 17"><path d="M9.457 8.945V2.848A.959.959 0 0 0 8.5 1.89a.959.959 0 0 0-.957.957v6.097L4.488 5.891a.952.952 0 0 0-1.351 0 .952.952 0 0 0 0 1.351l4.687 4.688a.955.955 0 0 0 1.352 0l4.687-4.688a.952.952 0 0 0 0-1.351.952.952 0 0 0-1.351 0zM3.59 14.937h9.82a.953.953 0 0 0 .953-.957.952.952 0 0 0-.953-.953H3.59a.952.952 0 0 0-.953.953c0 .532.425.957.953.957zm0 0" fill-rule="evenodd"></path></svg>'
68
+ }
69
+
70
+ def render(_options = {})
71
+ file_info = data['file']
72
+ title = data['title']
73
+ extension = file_info['name']&.split('.')&.last
74
+ extension = '' unless EXTENSIONS.key?(extension)
75
+
76
+ content_tag :div, class: css_name do
77
+ html_str = content_tag :div, class: "#{css_name}__file-icon", data: {extension: extension}, style: "color: #{EXTENSIONS[extension]};" do
78
+ (EXTENSIONS[extension] ? ICONS[:file_icon] : ICONS[:custom_file_icon]).html_safe
79
+ end
80
+
81
+ html_str += content_tag :div, class: "#{css_name}__file-info" do
82
+ [
83
+ content_tag(:div, title, class: "#{css_name}__title"),
84
+ content_tag(:div, number_to_human_size(file_info['size']), class: "#{css_name}__size")
85
+ ].join().html_safe
86
+ end
87
+
88
+ html_str += content_tag :a, class: "#{css_name}__download-button", href: file_info['url'], target: '_blank', rel: 'nofollow noindex noreferrer' do
89
+ ICONS[:download_icon].html_safe
90
+ end
91
+ html_str.html_safe
92
+ end
93
+ end
94
+
95
+ def sanitize!
96
+ data['title'] = Sanitize.fragment(data['title'], remove_contents: true).strip
97
+ file_info = data['file'] || {}
98
+ file_info.each do |key, val|
99
+ break if key == 'size'
100
+
101
+ file_info[key] = Sanitize.fragment(val, remove_contents: true).strip
102
+ end
103
+ data['file'] = file_info
104
+ end
105
+
106
+ def plain
107
+ decode_html data['title'].strip
108
+ end
109
+ end
110
+ end
111
+ end
@@ -28,7 +28,7 @@ module EditorJs
28
28
  data['items'].map do |item|
29
29
  content_tag(:div, class: css_name('__warrper')) do
30
30
  html_str = content_tag(:input, nil, type: 'checkbox', disabled: true, checked: item['checked'])
31
- html_str += content_tag(:label, item['text'])
31
+ html_str += content_tag(:label, item['text'].html_safe)
32
32
  html_str.html_safe
33
33
  end.html_safe
34
34
  end.join.html_safe
@@ -36,8 +36,21 @@ module EditorJs
36
36
  end
37
37
 
38
38
  def sanitize!
39
+ safe_tags = {
40
+ 'b' => nil,
41
+ 'i' => nil,
42
+ 'a' => ['href'],
43
+ 'mark' => ['class'],
44
+ 'code' => ['class']
45
+ }
46
+
39
47
  data['items'].each do |item|
40
- item['text'] = Sanitize.fragment(item['text'], remove_contents: true).strip
48
+ item['text'] = Sanitize.fragment(
49
+ item['text'],
50
+ elements: safe_tags.keys,
51
+ attributes: safe_tags.select {|k, v| v},
52
+ remove_contents: true
53
+ )
41
54
  end
42
55
  end
43
56
 
@@ -42,8 +42,12 @@ module EditorJs
42
42
  end
43
43
 
44
44
  def sanitize!
45
- %w(caption embed height service source width).each do |key|
46
- data[key] = Sanitize.fragment(data[key], remove_contents: true).strip
45
+ %w[caption embed height service source width].each do |key|
46
+ str = Sanitize.fragment(data[key], remove_contents: true).strip
47
+ if %w[embed service source].include?(key)
48
+ str.gsub!('&amp;', '&')
49
+ end
50
+ data[key] = str
47
51
  end
48
52
  end
49
53
 
@@ -44,7 +44,13 @@ module EditorJs
44
44
  end
45
45
 
46
46
  def sanitize!
47
- data['caption'] = Sanitize.fragment(data['caption'], remove_contents: true)
47
+ %w[caption url].each do |key|
48
+ str = Sanitize.fragment(data[key], remove_contents: true).strip
49
+ if key == 'url'
50
+ str.gsub!('&amp;', '&')
51
+ end
52
+ data[key] = str
53
+ end
48
54
  end
49
55
 
50
56
  def plain
@@ -34,7 +34,8 @@ module EditorJs
34
34
  'i' => nil,
35
35
  'a' => ['href'],
36
36
  'mark' => ['class'],
37
- 'code' => ['class']
37
+ 'code' => ['class'],
38
+ 'br' => nil
38
39
  }
39
40
 
40
41
  %w(text caption).each do |key|
@@ -42,7 +43,7 @@ module EditorJs
42
43
  data[key],
43
44
  elements: safe_tags.keys,
44
45
  attributes: safe_tags.select {|k, v| v},
45
- remove_contents: true
46
+ remove_contents: false
46
47
  )
47
48
  end
48
49
  data['alignment'] = Sanitize.fragment(data['alignment'], remove_contents: true)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EditorJs
4
- VERSION = '0.2.2'
4
+ VERSION = '0.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: editor_js
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - xiaohui
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-19 00:00:00.000000000 Z
11
+ date: 2020-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -140,14 +140,14 @@ dependencies:
140
140
  requirements:
141
141
  - - "~>"
142
142
  - !ruby/object:Gem::Version
143
- version: '10.0'
143
+ version: '13.0'
144
144
  type: :development
145
145
  prerelease: false
146
146
  version_requirements: !ruby/object:Gem::Requirement
147
147
  requirements:
148
148
  - - "~>"
149
149
  - !ruby/object:Gem::Version
150
- version: '10.0'
150
+ version: '13.0'
151
151
  - !ruby/object:Gem::Dependency
152
152
  name: rspec
153
153
  requirement: !ruby/object:Gem::Requirement
@@ -182,6 +182,7 @@ files:
182
182
  - bin/setup
183
183
  - editor_js.gemspec
184
184
  - lib/editor_js.rb
185
+ - lib/editor_js/blocks/attaches_block.rb
185
186
  - lib/editor_js/blocks/base.rb
186
187
  - lib/editor_js/blocks/checklist_block.rb
187
188
  - lib/editor_js/blocks/code_block.rb
@@ -219,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
220
  - !ruby/object:Gem::Version
220
221
  version: '0'
221
222
  requirements: []
222
- rubygems_version: 3.0.6
223
+ rubygems_version: 3.0.8
223
224
  signing_key:
224
225
  specification_version: 4
225
226
  summary: Ruby gem for editorjs.io text editor