lwe_slate_serializer 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e1afc95f11d60edc3272a0097520e1bddca78ee9a8c37cd6908ff63ed0563bd
4
- data.tar.gz: 98c0ee15eebb1e2e5e7537419c4144d2985121487c8fa65cc26064da3871b02f
3
+ metadata.gz: 2baa0cc32467d4363e5fc73033befb4a9cd79ec838afe6e6753993d2b2c84e86
4
+ data.tar.gz: ca07a3ecdce7fadbf02cc5959ab9ca236839900483d68b51f4a5e224915bdc4d
5
5
  SHA512:
6
- metadata.gz: 4d84ccba0d9b4027b1888696aa01a34de921d51826c0665671497c640b9d559ddbfa739b09a1d5c0a946671a5539b29b26149ad4056466ae44404351109f4f9b
7
- data.tar.gz: e5f8ff256e04ef82167592b755699ebe1fa80506edcb0d4f99bf46ccc5474f4454011cb32488b50fb08a8882034ae36d7a1d8bcd1a78614af96bac7d4a62dbb9
6
+ metadata.gz: 4526ab16ef29cd444bbfc7db268987fe98f0740e35bd6d5f1a6c4f3dab76582bad196f82b4a0d762e5c031692e6b86c701814cdf3f9e9933188ab84723b308bc
7
+ data.tar.gz: 97f0425e77ef5b752aec8b02b5bf071f3e5d424cfd93bc5e45ac37d2267571120c4bb764ad2040207e054a9ecec8d40368f6ece85f3e5a4df6fdd0ff134ae469
@@ -11,7 +11,6 @@ module SlateSerializer
11
11
  'p': 'paragraph',
12
12
  'div': 'paragraph',
13
13
  'ol1': 'ordered-list',
14
- 'ola': 'alpha-ordered-list',
15
14
  'ol': 'ordered-list',
16
15
  'ul': 'unordered-list',
17
16
  'table': 'table',
@@ -31,157 +30,183 @@ module SlateSerializer
31
30
  MARK_ELEMENTS = {
32
31
  'em': 'italic',
33
32
  'strong': 'bold',
33
+ 'b': 'bold',
34
34
  'u': 'underline'
35
35
  }.freeze
36
36
 
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
37
+ def initialize(options = {})
38
+ @elements = options[:elements] || ELEMENTS
39
+ @block_elements = options[:block_elements] || BLOCK_ELEMENTS
40
+ @inline_elements = options[:inline_elements] || INLINE_ELEMENTS
41
+ @mark_elements = options[:mark_elements] || MARK_ELEMENTS
42
+ @element_register = {}
43
+ @node_register = {}
44
+ @tag_register = {}
45
+
46
+ (options[:handlers] || [
47
+ SerializerHandler.new(
48
+ elements: ['img'],
49
+ node: 'image',
50
+ serialize: ->(node, children, tag) do
51
+ "<#{tag} src=\"#{node[:url]}\"/>"
52
+ end
53
+ ),
54
+ SerializerHandler.new(
55
+ elements: ['hr'],
56
+ node: 'hr',
57
+ serialize: ->(node, children, tag) do
58
+ "<#{tag}/>"
59
+ end
60
+ ),
61
+ SerializerHandler.new(elements: ['a'], node: 'link'),
62
+ SerializerHandler.new(elements: ['ol'], node: 'ordered-list'),
63
+ SerializerHandler.new(elements: ['ul'], node: 'unordered-list'),
64
+ SerializerHandler.new(elements: ['li'], node: 'list-item'),
65
+ SerializerHandler.new(elements: ['p', 'div'], node: 'paragraph'),
66
+ SerializerHandler.new(elements: ['table'], node: 'table'),
67
+ SerializerHandler.new(elements: ['tbody'], node: 'tbody'),
68
+ SerializerHandler.new(elements: ['tr'], node: 'tr'),
69
+ SerializerHandler.new(elements: ['td'], node: 'td'),
70
+ SerializerHandler.new(elements: ['figure'], node: 'figure'),
71
+ SerializerHandler.new(elements: ['figcaption'], node: 'figcaption'),
72
+ ]).each do |handler|
73
+ register_handler(handler)
58
74
  end
75
+ end
59
76
 
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
77
+ def register_handler(handler)
78
+ handler.elements.each do |element|
79
+ @element_register[element] = handler.deserialize
68
80
  end
81
+ @node_register[handler.node] = handler.serialize
82
+ @tag_register[handler.node] = handler.elements.first
83
+ end
69
84
 
70
- private
71
-
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 == ''
85
+ class SerializerHandler
86
+ attr_reader :elements, :node, :serialize, :deserialize
83
87
 
84
- element_to_texts(child)
85
- end
86
- end.compact
88
+ def initialize(elements: [], node: nil, serialize: nil, deserialize: nil)
89
+ @elements = elements
90
+ @node = node
91
+ @serialize = serialize || ->(node, children, tag) do
92
+ "<#{tag}>#{children}</#{tag}>"
93
+ end
94
+ @deserialize = deserialize || ->(node, element) do
95
+ node.merge(type: @node)
96
+ end
97
+ end
98
+ end
87
99
 
88
- children << { text: '' } if children.empty? && type != 'image'
100
+ # Convert html to a Slate document
101
+ #
102
+ # @param value format [Hash] the Slate document
103
+ # @return [String] plain text version of the Slate documnent
104
+ def serialize(value)
105
+ return '' unless value.is_a?(Array)
89
106
 
90
- node = {
91
- children: children,
92
- type: type
93
- }
107
+ value.map { |n| serialize_node(n) }.join
108
+ end
94
109
 
95
- type.is_a?(Proc) ? type.call(node, element) : node
110
+ # Convert html to a Slate document
111
+ #
112
+ # @param html format [String] the HTML
113
+ # @param options [Hash]
114
+ # @option options [Array] :elements Lookup list to convert html tags to object types
115
+ # @option options [Array] :block_elemnts List of block types
116
+ # @option options [Array] :inline_elemnts List of inline types
117
+ # @option options [Array] :mark_elemnts List of mark types
118
+ def deserialize(html)
119
+ return empty_state if html.nil? || html == ''
120
+
121
+ html = html.gsub('<br>', "\n")
122
+ Nokogiri::HTML.fragment(html).elements.map do |element|
123
+ element_to_node(element)
96
124
  end
125
+ end
97
126
 
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
127
+ private
103
128
 
104
- {
105
- children: nodes,
106
- type: type
107
- }
108
- end
129
+ attr_accessor :elements, :block_elements, :inline_elements, :mark_elements
109
130
 
110
- def element_to_texts(element)
111
- nodes = []
112
- mark = convert_name_to_mark(element.name)
131
+ def element_to_node(element, marks = [])
132
+ handler = @element_register[element.name]
133
+
134
+ mark = convert_name_to_mark(element.name)
135
+ marks = [*marks, mark].compact
113
136
 
114
- if element.class == Nokogiri::XML::Element
115
- element.children.each do |child|
116
- nodes << element_to_text(child, mark)
117
- end
137
+ children = element.children.flat_map do |child|
138
+ if child.text?
139
+ next if child.text.strip == ''
140
+ element_to_text(child, marks)
118
141
  else
119
- nodes << element_to_text(element)
142
+ element_to_node(child, marks)
120
143
  end
144
+ end.compact
121
145
 
122
- nodes
123
- end
146
+ children << { text: '' } if children.empty?
124
147
 
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
132
- end
133
- end
148
+ return children unless handler
149
+ handler.call({ children: children }, element)
150
+ end
134
151
 
135
- def convert_name_to_type(element)
136
- type = [element.name, element.attributes['type']&.value].compact.join
137
- elements[type.to_sym] || elements[:p]
152
+ # def element_to_texts(element)
153
+ # nodes = []
154
+ # mark = convert_name_to_mark(element.name)
155
+
156
+ # if element.class == Nokogiri::XML::Element
157
+ # element.children.each do |child|
158
+ # nodes << element_to_text(child, mark)
159
+ # end
160
+ # else
161
+ # nodes << element_to_text(element)
162
+ # end
163
+
164
+ # nodes
165
+ # end
166
+
167
+ def element_to_text(element, marks = [])
168
+ {
169
+ text: element.text
170
+ }.tap do |text|
171
+ marks.compact.each do |m|
172
+ text[m[:type].to_sym] = true
173
+ end
138
174
  end
175
+ end
139
176
 
140
- def convert_name_to_mark(name)
141
- type = mark_elements[name.to_sym]
177
+ def convert_name_to_mark(name)
178
+ type = mark_elements[name.to_sym]
142
179
 
143
- return nil unless type
180
+ return nil unless type
181
+ {
182
+ type: type
183
+ }
184
+ end
144
185
 
186
+ def empty_state
187
+ [
145
188
  {
146
- type: type
189
+ type: 'paragraph',
190
+ children: [
191
+ {
192
+ text: ''
193
+ }
194
+ ]
147
195
  }
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
157
-
158
- def empty_state
159
- [
160
- {
161
- type: 'paragraph',
162
- children: [
163
- {
164
- text: ''
165
- }
166
- ]
167
- }
168
- ]
169
- end
196
+ ]
197
+ end
170
198
 
171
- def serialize_node(node)
172
- if node[:text]
173
- node[:text]
174
- else
175
- children = node[:children].map { |n| serialize_node(n) }.join
199
+ def serialize_node(node)
200
+ if node[:text]
201
+ node[:text]
202
+ else
203
+ handler = @node_register[node[:type]]
204
+ children = node[:children].map { |n| serialize_node(n) }.join
176
205
 
177
- element = ELEMENTS.find { |_, v| v == node[:type] }[0]
178
-
179
- if %i[ol1 ola].include?(element)
180
- element = :ol
181
- end
206
+ return children unless handler
182
207
 
183
- "<#{element}>#{children}</#{element}>"
184
- end
208
+ tag = @tag_register[node[:type]]
209
+ handler.call(node, children, tag)
185
210
  end
186
211
  end
187
212
  end
@@ -1,3 +1,3 @@
1
1
  module SlateSerializer
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lwe_slate_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wesley Stam