lwe_slate_serializer 1.0.3 → 1.0.4
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/Gemfile.lock +6 -4
- data/lib/slate_serializer/html.rb +121 -142
- data/lib/slate_serializer/version.rb +1 -1
- data/slate_serializer.gemspec +4 -4
- metadata +4 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee065454439454fb5ea945ea83d59a254832b285211bb41e0d58e34a88e763c9
|
4
|
+
data.tar.gz: b30286ecdfa37885288a12f168353d80e63e3b0e5f91eb5387ca15829f103484
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cbcd0f9bfdcdcad1e9f53d4a14fb2dfc2e50f6a095ef0b15e169746a899f9fc7b119cd6f2b88fcbee5e57eade53b4710179901a87e7300ae8cebbe7319438d0
|
7
|
+
data.tar.gz: 26f233a45d443c56d9ef108e27d372010367ad3f3c83259b39f09b15d0567d283ee31b25b5affcd7e0675d9d89d7b4ace3efe8e3bceedbcb848bfa1d1c1d200e
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
|
4
|
+
slate_serializer (1.0.4)
|
5
5
|
nokogiri (~> 1.11)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
diff-lcs (1.4.4)
|
11
|
-
|
11
|
+
mini_portile2 (2.8.4)
|
12
|
+
nokogiri (1.15.4)
|
13
|
+
mini_portile2 (~> 2.8.2)
|
12
14
|
racc (~> 1.4)
|
13
|
-
racc (1.
|
15
|
+
racc (1.7.1)
|
14
16
|
rake (13.0.3)
|
15
17
|
rspec (3.10.0)
|
16
18
|
rspec-core (~> 3.10.0)
|
@@ -31,9 +33,9 @@ PLATFORMS
|
|
31
33
|
|
32
34
|
DEPENDENCIES
|
33
35
|
bundler (~> 2.2)
|
34
|
-
lwe_slate_serializer!
|
35
36
|
rake (~> 13.0)
|
36
37
|
rspec (~> 3.0)
|
38
|
+
slate_serializer!
|
37
39
|
|
38
40
|
BUNDLED WITH
|
39
41
|
2.2.22
|
@@ -11,6 +11,7 @@ module SlateSerializer
|
|
11
11
|
'p': 'paragraph',
|
12
12
|
'div': 'paragraph',
|
13
13
|
'ol1': 'ordered-list',
|
14
|
+
'ola': 'alpha-ordered-list',
|
14
15
|
'ol': 'ordered-list',
|
15
16
|
'ul': 'unordered-list',
|
16
17
|
'table': 'table',
|
@@ -30,179 +31,157 @@ module SlateSerializer
|
|
30
31
|
MARK_ELEMENTS = {
|
31
32
|
'em': 'italic',
|
32
33
|
'strong': 'bold',
|
33
|
-
'b': 'bold',
|
34
34
|
'u': 'underline'
|
35
35
|
}.freeze
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
@
|
41
|
-
@
|
42
|
-
@
|
43
|
-
@
|
44
|
-
@
|
45
|
-
|
46
|
-
(options
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
"<#{tag}/>"
|
59
|
-
end
|
60
|
-
),
|
61
|
-
SerializerHandler.new(elements: ['text']),
|
62
|
-
SerializerHandler.new(elements: ['i', 'em'], mark: 'italic'),
|
63
|
-
SerializerHandler.new(elements: ['u'], mark: 'underline'),
|
64
|
-
SerializerHandler.new(elements: ['strong', 'b'], mark: 'bold'),
|
65
|
-
SerializerHandler.new(elements: ['a'], node: 'link'),
|
66
|
-
SerializerHandler.new(elements: ['ol'], node: 'ordered-list'),
|
67
|
-
SerializerHandler.new(elements: ['ul'], node: 'unordered-list'),
|
68
|
-
SerializerHandler.new(elements: ['li'], node: 'list-item'),
|
69
|
-
SerializerHandler.new(elements: ['p', 'div'], node: 'paragraph'),
|
70
|
-
SerializerHandler.new(elements: ['table'], node: 'table'),
|
71
|
-
SerializerHandler.new(elements: ['tbody'], node: 'tbody'),
|
72
|
-
SerializerHandler.new(elements: ['tr'], node: 'tr'),
|
73
|
-
SerializerHandler.new(elements: ['td'], node: 'td'),
|
74
|
-
SerializerHandler.new(elements: ['figure'], node: 'figure'),
|
75
|
-
SerializerHandler.new(elements: ['figcaption'], node: 'figcaption'),
|
76
|
-
]).each do |handler|
|
77
|
-
register_handler(handler)
|
37
|
+
class << self
|
38
|
+
# Convert html to a Slate document
|
39
|
+
#
|
40
|
+
# @param html format [String] the HTML
|
41
|
+
# @param options [Hash]
|
42
|
+
# @option options [Array] :elements Lookup list to convert html tags to object types
|
43
|
+
# @option options [Array] :block_elemnts List of block types
|
44
|
+
# @option options [Array] :inline_elemnts List of inline types
|
45
|
+
# @option options [Array] :mark_elemnts List of mark types
|
46
|
+
def deserializer(html, options = {})
|
47
|
+
return empty_state if html.nil? || html == ''
|
48
|
+
|
49
|
+
self.elements = options[:elements] || ELEMENTS
|
50
|
+
self.block_elements = options[:block_elements] || BLOCK_ELEMENTS
|
51
|
+
self.inline_elements = options[:inline_elements] || INLINE_ELEMENTS
|
52
|
+
self.mark_elements = options[:mark_elements] || MARK_ELEMENTS
|
53
|
+
|
54
|
+
html = html.gsub('<br>', "\n")
|
55
|
+
Nokogiri::HTML.fragment(html).elements.map do |element|
|
56
|
+
element_to_node(element)
|
57
|
+
end
|
78
58
|
end
|
79
|
-
end
|
80
59
|
|
81
|
-
|
82
|
-
|
83
|
-
|
60
|
+
# Convert html to a Slate document
|
61
|
+
#
|
62
|
+
# @param value format [Hash] the Slate document
|
63
|
+
# @return [String] plain text version of the Slate documnent
|
64
|
+
def serializer(value)
|
65
|
+
return '' unless value.is_a?(Array)
|
66
|
+
|
67
|
+
value.map { |n| serialize_node(n) }.join
|
84
68
|
end
|
85
|
-
@node_register[handler.node] = handler.serialize
|
86
|
-
@tag_register[handler.node] = handler.elements.first
|
87
|
-
end
|
88
69
|
|
89
|
-
|
90
|
-
attr_reader :elements, :node, :serialize, :deserialize, :mark
|
70
|
+
private
|
91
71
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
72
|
+
attr_accessor :elements, :block_elements, :inline_elements, :mark_elements
|
73
|
+
|
74
|
+
def element_to_node(element)
|
75
|
+
type = convert_name_to_type(element)
|
76
|
+
children = element.children.flat_map do |child|
|
77
|
+
if block?(child)
|
78
|
+
element_to_node(child)
|
79
|
+
elsif inline?(child)
|
80
|
+
element_to_inline(child)
|
81
|
+
else
|
82
|
+
next if child.text.strip == ''
|
83
|
+
|
84
|
+
element_to_texts(child)
|
104
85
|
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
86
|
+
end.compact
|
108
87
|
|
109
|
-
|
110
|
-
#
|
111
|
-
# @param value format [Hash] the Slate document
|
112
|
-
# @return [String] plain text version of the Slate documnent
|
113
|
-
def serialize(value)
|
114
|
-
return '' unless value.is_a?(Array)
|
88
|
+
children << { text: '' } if children.empty? && type != 'image'
|
115
89
|
|
116
|
-
|
117
|
-
|
90
|
+
node = {
|
91
|
+
children: children,
|
92
|
+
type: type
|
93
|
+
}
|
118
94
|
|
119
|
-
|
120
|
-
#
|
121
|
-
# @param html format [String] the HTML
|
122
|
-
# @param options [Hash]
|
123
|
-
# @option options [Array] :elements Lookup list to convert html tags to object types
|
124
|
-
# @option options [Array] :block_elemnts List of block types
|
125
|
-
# @option options [Array] :inline_elemnts List of inline types
|
126
|
-
# @option options [Array] :mark_elemnts List of mark types
|
127
|
-
def deserialize(html)
|
128
|
-
return empty_state if html.nil? || html == ''
|
129
|
-
|
130
|
-
html = html.gsub('<br>', "\n")
|
131
|
-
Nokogiri::HTML.fragment(html).elements.flat_map do |element|
|
132
|
-
element_to_node(element)
|
95
|
+
type.is_a?(Proc) ? type.call(node, element) : node
|
133
96
|
end
|
134
|
-
end
|
135
97
|
|
136
|
-
|
98
|
+
def element_to_inline(element)
|
99
|
+
type = convert_name_to_type(element)
|
100
|
+
nodes = element.children.flat_map do |child|
|
101
|
+
element_to_texts(child)
|
102
|
+
end
|
137
103
|
|
138
|
-
|
104
|
+
{
|
105
|
+
children: nodes,
|
106
|
+
type: type
|
107
|
+
}
|
108
|
+
end
|
139
109
|
|
140
|
-
|
141
|
-
|
142
|
-
|
110
|
+
def element_to_texts(element)
|
111
|
+
nodes = []
|
112
|
+
mark = convert_name_to_mark(element.name)
|
143
113
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
next if child.text.strip == ''
|
149
|
-
element_to_text(child, marks)
|
114
|
+
if element.class == Nokogiri::XML::Element
|
115
|
+
element.children.each do |child|
|
116
|
+
nodes << element_to_text(child, mark)
|
117
|
+
end
|
150
118
|
else
|
151
|
-
|
119
|
+
nodes << element_to_text(element)
|
152
120
|
end
|
153
|
-
end.compact
|
154
121
|
|
155
|
-
|
156
|
-
|
157
|
-
return children unless handler
|
158
|
-
handler.deserialize.call(children, element)
|
159
|
-
end
|
122
|
+
nodes
|
123
|
+
end
|
160
124
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
text[m.to_sym] = true
|
125
|
+
def element_to_text(element, mark = nil)
|
126
|
+
{
|
127
|
+
text: element.text
|
128
|
+
}.tap do |text|
|
129
|
+
[mark, convert_name_to_mark(element.name)].compact.each do |m|
|
130
|
+
text[m[:type].to_sym] = true
|
131
|
+
end
|
169
132
|
end
|
170
133
|
end
|
171
|
-
end
|
172
134
|
|
173
|
-
|
174
|
-
|
135
|
+
def convert_name_to_type(element)
|
136
|
+
type = [element.name, element.attributes['type']&.value].compact.join
|
137
|
+
elements[type.to_sym] || elements[:p]
|
138
|
+
end
|
175
139
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
140
|
+
def convert_name_to_mark(name)
|
141
|
+
type = mark_elements[name.to_sym]
|
142
|
+
|
143
|
+
return nil unless type
|
181
144
|
|
182
|
-
def empty_state
|
183
|
-
[
|
184
145
|
{
|
185
|
-
type:
|
186
|
-
children: [
|
187
|
-
{
|
188
|
-
text: ''
|
189
|
-
}
|
190
|
-
]
|
146
|
+
type: type
|
191
147
|
}
|
192
|
-
|
193
|
-
|
148
|
+
end
|
149
|
+
|
150
|
+
def block?(element)
|
151
|
+
block_elements.include?(element.name)
|
152
|
+
end
|
153
|
+
|
154
|
+
def inline?(element)
|
155
|
+
inline_elements.include?(element.name)
|
156
|
+
end
|
194
157
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
158
|
+
def empty_state
|
159
|
+
[
|
160
|
+
{
|
161
|
+
type: 'paragraph',
|
162
|
+
children: [
|
163
|
+
{
|
164
|
+
text: ''
|
165
|
+
}
|
166
|
+
]
|
167
|
+
}
|
168
|
+
]
|
169
|
+
end
|
201
170
|
|
202
|
-
|
171
|
+
def serialize_node(node)
|
172
|
+
if node[:text]
|
173
|
+
node[:text]
|
174
|
+
else
|
175
|
+
children = node[:children].map { |n| serialize_node(n) }.join
|
203
176
|
|
204
|
-
|
205
|
-
|
177
|
+
element = ELEMENTS.find { |_, v| v == node[:type] }[0]
|
178
|
+
|
179
|
+
if %i[ol1 ola].include?(element)
|
180
|
+
element = :ol
|
181
|
+
end
|
182
|
+
|
183
|
+
"<#{element}>#{children}</#{element}>"
|
184
|
+
end
|
206
185
|
end
|
207
186
|
end
|
208
187
|
end
|
data/slate_serializer.gemspec
CHANGED
@@ -5,12 +5,12 @@ require 'slate_serializer/version'
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'lwe_slate_serializer'
|
7
7
|
spec.version = SlateSerializer::VERSION
|
8
|
-
spec.authors = ['Wesley Stam'
|
9
|
-
spec.email = ['wesley@stam.me'
|
8
|
+
spec.authors = ['Wesley Stam']
|
9
|
+
spec.email = ['wesley@stam.me']
|
10
10
|
spec.license = 'MIT'
|
11
11
|
|
12
12
|
spec.summary = 'Serializer for Slate documents written in Ruby'
|
13
|
-
spec.homepage = 'https://github.com/
|
13
|
+
spec.homepage = 'https://github.com/wesleystam/slate_serializer'
|
14
14
|
|
15
15
|
# Specify which files should be added to the gem when it is released.
|
16
16
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
19
|
end
|
20
20
|
spec.bindir = 'exe'
|
21
|
-
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ['lib']
|
23
23
|
|
24
24
|
spec.add_dependency 'nokogiri', '~> 1.11'
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lwe_slate_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wesley Stam
|
8
|
-
- Paul Crabtree
|
9
8
|
autorequire:
|
10
9
|
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2023-08-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: nokogiri
|
@@ -70,7 +69,6 @@ dependencies:
|
|
70
69
|
description:
|
71
70
|
email:
|
72
71
|
- wesley@stam.me
|
73
|
-
- paul@learningwithexperts.com
|
74
72
|
executables: []
|
75
73
|
extensions: []
|
76
74
|
extra_rdoc_files: []
|
@@ -90,7 +88,7 @@ files:
|
|
90
88
|
- lib/slate_serializer/plain.rb
|
91
89
|
- lib/slate_serializer/version.rb
|
92
90
|
- slate_serializer.gemspec
|
93
|
-
homepage: https://github.com/
|
91
|
+
homepage: https://github.com/wesleystam/slate_serializer
|
94
92
|
licenses:
|
95
93
|
- MIT
|
96
94
|
metadata: {}
|
@@ -109,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
107
|
- !ruby/object:Gem::Version
|
110
108
|
version: '0'
|
111
109
|
requirements: []
|
112
|
-
rubygems_version: 3.
|
110
|
+
rubygems_version: 3.4.18
|
113
111
|
signing_key:
|
114
112
|
specification_version: 4
|
115
113
|
summary: Serializer for Slate documents written in Ruby
|