prosemirror_to_html 0.1.0 → 0.2.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/CHANGELOG.md +24 -0
- data/Gemfile.lock +23 -21
- data/lib/prosemirror_to_html/marks/bold.rb +2 -8
- data/lib/prosemirror_to_html/marks/code.rb +2 -8
- data/lib/prosemirror_to_html/marks/italic.rb +2 -8
- data/lib/prosemirror_to_html/marks/link.rb +16 -8
- data/lib/prosemirror_to_html/marks/mark.rb +9 -7
- data/lib/prosemirror_to_html/marks/strike.rb +8 -0
- data/lib/prosemirror_to_html/marks/subscript.rb +8 -0
- data/lib/prosemirror_to_html/marks/superscript.rb +8 -0
- data/lib/prosemirror_to_html/marks/underline.rb +8 -0
- data/lib/prosemirror_to_html/nodes/blockquote.rb +8 -0
- data/lib/prosemirror_to_html/nodes/bullet_list.rb +2 -8
- data/lib/prosemirror_to_html/nodes/code_block.rb +2 -9
- data/lib/prosemirror_to_html/nodes/hard_break.rb +4 -6
- data/lib/prosemirror_to_html/nodes/heading.rb +13 -5
- data/lib/prosemirror_to_html/nodes/horizontal_rule.rb +12 -0
- data/lib/prosemirror_to_html/nodes/image.rb +11 -5
- data/lib/prosemirror_to_html/nodes/list_item.rb +2 -12
- data/lib/prosemirror_to_html/nodes/node.rb +27 -8
- data/lib/prosemirror_to_html/nodes/ordered_list.rb +9 -6
- data/lib/prosemirror_to_html/nodes/paragraph.rb +2 -8
- data/lib/prosemirror_to_html/nodes/table.rb +8 -0
- data/lib/prosemirror_to_html/nodes/table_cell.rb +17 -0
- data/lib/prosemirror_to_html/nodes/table_header.rb +17 -0
- data/lib/prosemirror_to_html/nodes/table_row.rb +8 -0
- data/lib/prosemirror_to_html/version.rb +1 -1
- data/lib/prosemirror_to_html.rb +224 -86
- data/prosemirror_to_html.gemspec +7 -7
- metadata +21 -15
- data/lib/prosemirror_to_html/nodes/code_block_wrapper.rb +0 -13
- data/lib/prosemirror_to_html/nodes/text.rb +0 -14
- data/lib/prosemirror_to_html/nodes/user.rb +0 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0ad426b14cb9437e9e87da4de83e2c2e7ad2a434e9f0e182f52ea9c5ef191bbe
|
|
4
|
+
data.tar.gz: 8e15b4ea153075170aa91f14d8508f2f1b7b9c93421791338453ac2ead11ec1b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 23465c8179834d71d61598fdac357fa5bcd6b9042d60bf00871fa91ca0123bd1a0eeed2f9d035c53d8b7282682106199afb06f40cd6b96ef1c57f6cb3eea42ff
|
|
7
|
+
data.tar.gz: bb64c1659950a072825a36bffbbd7f0ecaa0631534eec22f50ff1c5bec0d59ab14699053c7dab0951f1aed6c182a94c0c4561898228d5bf37cc7c338e6bdf9c6
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## [0.2.0] - 2023-07-03
|
|
2
|
+
|
|
3
|
+
Hans Lemuet (@Spone) is the new maintainer. The fork is now hosted at https://github.com/etaminstudio/prosemirror_to_html
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added support for marks `Strike`, `Subscript`, `Superscript`, `Underline`
|
|
8
|
+
- Added support for nodes `Blockquote`, `HorizontalRule`, `Table`, `TableCell`, `TableHeader`, `TableRow`
|
|
9
|
+
- `Link` mark: added support for conditional `target`, `title`, `rel` attributes
|
|
10
|
+
- `Heading` node: added support for `level` attribute
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Improve code style (always use snake_case for methods)
|
|
15
|
+
- Refactor `Renderer`
|
|
16
|
+
- Refactor `Node`
|
|
17
|
+
- Refactor specs to have one spec file for each node and mark
|
|
18
|
+
- Update dependencies
|
|
19
|
+
|
|
20
|
+
### Removed
|
|
21
|
+
|
|
22
|
+
- `CodeBlockWrapper` node removed in favor of `CodeBlock`
|
|
23
|
+
- `Text` node removed
|
|
24
|
+
- `User` node removed
|
data/Gemfile.lock
CHANGED
|
@@ -1,41 +1,43 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
prosemirror_to_html (0.1
|
|
4
|
+
prosemirror_to_html (0.2.1)
|
|
5
5
|
nokogiri
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
diff-lcs (1.
|
|
11
|
-
mini_portile2 (2.
|
|
12
|
-
nokogiri (1.
|
|
13
|
-
mini_portile2 (~> 2.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
rspec-
|
|
19
|
-
|
|
20
|
-
rspec-
|
|
21
|
-
rspec-
|
|
10
|
+
diff-lcs (1.5.0)
|
|
11
|
+
mini_portile2 (2.8.8)
|
|
12
|
+
nokogiri (1.18.3)
|
|
13
|
+
mini_portile2 (~> 2.8.2)
|
|
14
|
+
racc (~> 1.4)
|
|
15
|
+
racc (1.8.1)
|
|
16
|
+
rake (13.0.6)
|
|
17
|
+
rspec (3.12.0)
|
|
18
|
+
rspec-core (~> 3.12.0)
|
|
19
|
+
rspec-expectations (~> 3.12.0)
|
|
20
|
+
rspec-mocks (~> 3.12.0)
|
|
21
|
+
rspec-core (3.12.2)
|
|
22
|
+
rspec-support (~> 3.12.0)
|
|
23
|
+
rspec-expectations (3.12.3)
|
|
22
24
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
23
|
-
rspec-support (~> 3.
|
|
24
|
-
rspec-mocks (3.
|
|
25
|
+
rspec-support (~> 3.12.0)
|
|
26
|
+
rspec-mocks (3.12.5)
|
|
25
27
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
26
|
-
rspec-support (~> 3.
|
|
27
|
-
rspec-support (3.
|
|
28
|
-
yard (0.9.
|
|
28
|
+
rspec-support (~> 3.12.0)
|
|
29
|
+
rspec-support (3.12.1)
|
|
30
|
+
yard (0.9.36)
|
|
29
31
|
|
|
30
32
|
PLATFORMS
|
|
31
33
|
ruby
|
|
32
34
|
|
|
33
35
|
DEPENDENCIES
|
|
34
|
-
bundler (~> 2.
|
|
36
|
+
bundler (~> 2.3)
|
|
35
37
|
prosemirror_to_html!
|
|
36
|
-
rake (~>
|
|
38
|
+
rake (~> 13.0)
|
|
37
39
|
rspec (~> 3.0)
|
|
38
40
|
yard
|
|
39
41
|
|
|
40
42
|
BUNDLED WITH
|
|
41
|
-
2.
|
|
43
|
+
2.7.2
|
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Marks
|
|
3
3
|
class Link < Mark
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
@node.type === 'link'
|
|
7
|
-
end
|
|
4
|
+
@mark_type = 'link'
|
|
5
|
+
@tag_name = 'a'
|
|
8
6
|
|
|
9
7
|
def tag
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
attrs = {}
|
|
9
|
+
|
|
10
|
+
attrs['href'] = @mark.attrs.href
|
|
11
|
+
|
|
12
|
+
attrs['target'] = @mark.attrs.target if @mark.attrs.target
|
|
13
|
+
attrs['title'] = @mark.attrs.title if @mark.attrs.title
|
|
14
|
+
attrs['rel'] = @mark.attrs.rel if @mark.attrs.rel
|
|
15
|
+
|
|
16
|
+
[
|
|
17
|
+
{
|
|
18
|
+
tag: self.class.tag_name,
|
|
19
|
+
attrs: attrs
|
|
20
|
+
}
|
|
21
|
+
]
|
|
14
22
|
end
|
|
15
23
|
end
|
|
16
24
|
end
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Marks
|
|
3
3
|
class Mark
|
|
4
|
-
|
|
4
|
+
@mark_type = nil
|
|
5
|
+
@tag_name = nil
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
class << self
|
|
8
|
+
attr_reader :mark_type, :tag_name
|
|
8
9
|
end
|
|
9
10
|
|
|
10
|
-
def initialize(
|
|
11
|
-
@
|
|
11
|
+
def initialize(mark)
|
|
12
|
+
@mark = mark
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def matching
|
|
16
|
+
return @mark.type == self.class.mark_type if @mark.type
|
|
17
|
+
|
|
15
18
|
false
|
|
16
19
|
end
|
|
17
20
|
|
|
18
21
|
def tag
|
|
19
|
-
|
|
22
|
+
self.class.tag_name
|
|
20
23
|
end
|
|
21
|
-
|
|
22
24
|
end
|
|
23
25
|
end
|
|
24
26
|
end
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Nodes
|
|
3
3
|
class Heading < Node
|
|
4
|
+
@node_type = 'heading'
|
|
4
5
|
|
|
5
|
-
def
|
|
6
|
-
|
|
6
|
+
def tag
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
tag: "h#{@node.attrs.level}",
|
|
10
|
+
attrs: tag_attrs
|
|
11
|
+
}
|
|
12
|
+
]
|
|
7
13
|
end
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def tag_attrs
|
|
18
|
+
attrs_hash = @node.attrs.to_h
|
|
19
|
+
attrs_hash.slice(*attrs_hash.keys - %i[level])
|
|
11
20
|
end
|
|
12
|
-
|
|
13
21
|
end
|
|
14
22
|
end
|
|
15
23
|
end
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Nodes
|
|
3
3
|
class Image < Node
|
|
4
|
+
@node_type = 'image'
|
|
5
|
+
@tag_name = 'img'
|
|
4
6
|
|
|
5
|
-
def
|
|
6
|
-
|
|
7
|
+
def tag
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
tag: self.class.tag_name,
|
|
11
|
+
attrs: @node.attrs
|
|
12
|
+
}
|
|
13
|
+
]
|
|
7
14
|
end
|
|
8
15
|
|
|
9
|
-
def
|
|
10
|
-
|
|
11
|
-
'img'
|
|
16
|
+
def self_closing
|
|
17
|
+
true
|
|
12
18
|
end
|
|
13
19
|
end
|
|
14
20
|
end
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Nodes
|
|
3
3
|
class ListItem < Node
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
# @wrapper = { type: 'paragraph' }
|
|
7
|
-
# end
|
|
8
|
-
|
|
9
|
-
def matching
|
|
10
|
-
@node.type === 'list_item'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def tag
|
|
14
|
-
'li'
|
|
15
|
-
end
|
|
4
|
+
@node_type = 'list_item'
|
|
5
|
+
@tag_name = 'li'
|
|
16
6
|
end
|
|
17
7
|
end
|
|
18
8
|
end
|
|
@@ -1,29 +1,48 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Nodes
|
|
3
|
-
|
|
4
3
|
class Node
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
@node_type = nil
|
|
5
|
+
@tag_name = nil
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
class << self
|
|
8
|
+
attr_reader :node_type, :tag_name
|
|
10
9
|
end
|
|
11
10
|
|
|
12
|
-
def initialize(
|
|
13
|
-
@node =
|
|
11
|
+
def initialize(node)
|
|
12
|
+
@node = node
|
|
14
13
|
end
|
|
15
14
|
|
|
16
15
|
def matching
|
|
16
|
+
return underscore(@node.type) == self.class.node_type if @node.type
|
|
17
|
+
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self_closing
|
|
17
22
|
false
|
|
18
23
|
end
|
|
19
24
|
|
|
20
25
|
def tag
|
|
21
|
-
|
|
26
|
+
self.class.tag_name
|
|
22
27
|
end
|
|
23
28
|
|
|
24
29
|
def text
|
|
25
30
|
nil
|
|
26
31
|
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
# from https://github.com/rails/rails/blob/83217025a171593547d1268651b446d3533e2019/activesupport/lib/active_support/inflector/methods.rb#L92
|
|
36
|
+
def underscore(camel_cased_word)
|
|
37
|
+
return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word)
|
|
38
|
+
|
|
39
|
+
word = camel_cased_word.to_s.gsub("::", "/")
|
|
40
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
|
41
|
+
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
|
42
|
+
word.tr!("-", "_")
|
|
43
|
+
word.downcase!
|
|
44
|
+
word
|
|
45
|
+
end
|
|
27
46
|
end
|
|
28
47
|
end
|
|
29
48
|
end
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
module ProsemirrorToHtml
|
|
2
2
|
module Nodes
|
|
3
3
|
class OrderedList < Node
|
|
4
|
+
@node_type = 'ordered_list'
|
|
5
|
+
@tag_name = 'ol'
|
|
4
6
|
|
|
5
|
-
def
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
def tag
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
tag: self.class.tag_name,
|
|
11
|
+
attrs: @node.attrs
|
|
12
|
+
}
|
|
13
|
+
]
|
|
11
14
|
end
|
|
12
15
|
end
|
|
13
16
|
end
|
data/lib/prosemirror_to_html.rb
CHANGED
|
@@ -4,145 +4,283 @@ require "prosemirror_to_html/marks/bold"
|
|
|
4
4
|
require "prosemirror_to_html/marks/code"
|
|
5
5
|
require "prosemirror_to_html/marks/italic"
|
|
6
6
|
require "prosemirror_to_html/marks/link"
|
|
7
|
+
require "prosemirror_to_html/marks/strike"
|
|
8
|
+
require "prosemirror_to_html/marks/subscript"
|
|
9
|
+
require "prosemirror_to_html/marks/superscript"
|
|
10
|
+
require "prosemirror_to_html/marks/underline"
|
|
7
11
|
require "prosemirror_to_html/nodes/node"
|
|
12
|
+
require "prosemirror_to_html/nodes/blockquote"
|
|
8
13
|
require "prosemirror_to_html/nodes/bullet_list"
|
|
9
|
-
require "prosemirror_to_html/nodes/code_block_wrapper"
|
|
10
14
|
require "prosemirror_to_html/nodes/code_block"
|
|
11
15
|
require "prosemirror_to_html/nodes/hard_break"
|
|
16
|
+
require "prosemirror_to_html/nodes/horizontal_rule"
|
|
12
17
|
require "prosemirror_to_html/nodes/heading"
|
|
13
18
|
require "prosemirror_to_html/nodes/image"
|
|
14
19
|
require "prosemirror_to_html/nodes/list_item"
|
|
15
20
|
require "prosemirror_to_html/nodes/ordered_list"
|
|
16
21
|
require "prosemirror_to_html/nodes/paragraph"
|
|
17
|
-
require "prosemirror_to_html/nodes/
|
|
18
|
-
require "prosemirror_to_html/nodes/
|
|
22
|
+
require "prosemirror_to_html/nodes/table"
|
|
23
|
+
require "prosemirror_to_html/nodes/table_cell"
|
|
24
|
+
require "prosemirror_to_html/nodes/table_header"
|
|
25
|
+
require "prosemirror_to_html/nodes/table_row"
|
|
19
26
|
require 'nokogiri'
|
|
20
27
|
require 'json'
|
|
21
28
|
require "ostruct"
|
|
22
29
|
|
|
23
30
|
module ProsemirrorToHtml
|
|
24
31
|
class Error < StandardError; end
|
|
25
|
-
|
|
32
|
+
|
|
26
33
|
class Renderer
|
|
27
|
-
def initialize
|
|
28
|
-
@
|
|
29
|
-
|
|
30
|
-
ProsemirrorToHtml::Marks::Bold,
|
|
31
|
-
ProsemirrorToHtml::Marks::Code,
|
|
32
|
-
ProsemirrorToHtml::Marks::Italic,
|
|
33
|
-
ProsemirrorToHtml::Marks::Link
|
|
34
|
-
]
|
|
34
|
+
def initialize
|
|
35
|
+
@document = nil
|
|
36
|
+
|
|
35
37
|
@nodes = [
|
|
38
|
+
ProsemirrorToHtml::Nodes::Blockquote,
|
|
36
39
|
ProsemirrorToHtml::Nodes::BulletList,
|
|
37
|
-
ProsemirrorToHtml::Nodes::CodeBlockWrapper,
|
|
38
40
|
ProsemirrorToHtml::Nodes::CodeBlock,
|
|
39
41
|
ProsemirrorToHtml::Nodes::HardBreak,
|
|
40
42
|
ProsemirrorToHtml::Nodes::Heading,
|
|
43
|
+
ProsemirrorToHtml::Nodes::HorizontalRule,
|
|
41
44
|
ProsemirrorToHtml::Nodes::Image,
|
|
42
45
|
ProsemirrorToHtml::Nodes::ListItem,
|
|
43
46
|
ProsemirrorToHtml::Nodes::OrderedList,
|
|
44
47
|
ProsemirrorToHtml::Nodes::Paragraph,
|
|
45
|
-
|
|
46
|
-
ProsemirrorToHtml::Nodes::
|
|
48
|
+
ProsemirrorToHtml::Nodes::Table,
|
|
49
|
+
ProsemirrorToHtml::Nodes::TableCell,
|
|
50
|
+
ProsemirrorToHtml::Nodes::TableHeader,
|
|
51
|
+
ProsemirrorToHtml::Nodes::TableRow,
|
|
47
52
|
]
|
|
53
|
+
|
|
54
|
+
@marks = [
|
|
55
|
+
ProsemirrorToHtml::Marks::Bold,
|
|
56
|
+
ProsemirrorToHtml::Marks::Code,
|
|
57
|
+
ProsemirrorToHtml::Marks::Italic,
|
|
58
|
+
ProsemirrorToHtml::Marks::Link,
|
|
59
|
+
ProsemirrorToHtml::Marks::Strike,
|
|
60
|
+
ProsemirrorToHtml::Marks::Subscript,
|
|
61
|
+
ProsemirrorToHtml::Marks::Superscript,
|
|
62
|
+
ProsemirrorToHtml::Marks::Underline,
|
|
63
|
+
]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def with_marks(marks = nil)
|
|
67
|
+
@marks = marks if marks.is_a? Array
|
|
68
|
+
|
|
69
|
+
self
|
|
48
70
|
end
|
|
49
71
|
|
|
50
|
-
def
|
|
51
|
-
@nodes.
|
|
72
|
+
def with_nodes(nodes = nil)
|
|
73
|
+
@nodes = nodes if nodes.is_a? Array
|
|
74
|
+
|
|
75
|
+
self
|
|
52
76
|
end
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
77
|
+
|
|
78
|
+
def render(value)
|
|
79
|
+
json = case value
|
|
80
|
+
when Hash then value.to_json
|
|
81
|
+
when String then value
|
|
82
|
+
else raise Error
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
@document = JSON.parse(json, object_class: OpenStruct)
|
|
86
|
+
|
|
87
|
+
html = ''
|
|
88
|
+
|
|
89
|
+
content = @document.content.is_a?(Array) ? @document.content : []
|
|
90
|
+
|
|
91
|
+
content.each_with_index do |node, index|
|
|
92
|
+
prev_node = content[index - 1]
|
|
93
|
+
next_node = content[index + 1]
|
|
94
|
+
|
|
95
|
+
html << render_node(node, prev_node, next_node)
|
|
56
96
|
end
|
|
97
|
+
|
|
98
|
+
html
|
|
57
99
|
end
|
|
58
|
-
|
|
59
|
-
|
|
100
|
+
|
|
101
|
+
def add_node(node)
|
|
102
|
+
@nodes << node
|
|
103
|
+
|
|
104
|
+
self
|
|
60
105
|
end
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
106
|
+
|
|
107
|
+
def add_nodes(nodes)
|
|
108
|
+
@nodes.push nodes
|
|
109
|
+
|
|
110
|
+
self
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def add_mark(mark)
|
|
114
|
+
@marks << mark
|
|
115
|
+
|
|
116
|
+
self
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def add_marks(marks)
|
|
120
|
+
@marks.push marks
|
|
121
|
+
|
|
122
|
+
self
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def replace_node(search_node, replace_node)
|
|
126
|
+
@nodes.each do |key, node_klass|
|
|
127
|
+
if node_klass == search_node
|
|
128
|
+
@nodes[key] = replace_node
|
|
129
|
+
end
|
|
64
130
|
end
|
|
131
|
+
|
|
132
|
+
self
|
|
65
133
|
end
|
|
66
134
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
html += renderNode(node)
|
|
135
|
+
def replace_mark(search_mark, replace_mark)
|
|
136
|
+
@marks.each do |key, mark_klass|
|
|
137
|
+
if mark_klass == search_mark
|
|
138
|
+
@marks[key] = replace_mark
|
|
139
|
+
end
|
|
73
140
|
end
|
|
74
|
-
|
|
75
|
-
|
|
141
|
+
|
|
142
|
+
self
|
|
76
143
|
end
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
def render_node(node, prev_node, next_node)
|
|
148
|
+
html = ''
|
|
149
|
+
render_klass = nil
|
|
150
|
+
|
|
151
|
+
if node&.marks
|
|
152
|
+
node.marks.each do |mark|
|
|
153
|
+
@marks.each do |klass|
|
|
154
|
+
render_klass = klass.new(mark)
|
|
155
|
+
|
|
156
|
+
if render_klass.matching && mark_should_open(mark, prev_node)
|
|
157
|
+
html << render_opening_tag(render_klass.tag)
|
|
158
|
+
end
|
|
84
159
|
end
|
|
85
160
|
end
|
|
86
|
-
|
|
87
|
-
node = get_matching_node(item)
|
|
88
|
-
html.push(renderOpeningTag(node.tag)) if node
|
|
161
|
+
end
|
|
89
162
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
163
|
+
@nodes.each do |klass|
|
|
164
|
+
render_klass = klass.new(node)
|
|
165
|
+
|
|
166
|
+
if render_klass.matching
|
|
167
|
+
html << render_opening_tag(render_klass.tag)
|
|
168
|
+
break
|
|
96
169
|
end
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
if node&.content
|
|
173
|
+
node.content.each_with_index do |nested_node, index|
|
|
174
|
+
prev_nested_node = node.content[index - 1]
|
|
175
|
+
next_nested_node = node.content[index + 1]
|
|
176
|
+
|
|
177
|
+
html << render_node(nested_node, prev_nested_node, next_nested_node)
|
|
178
|
+
prev_node = nested_node
|
|
104
179
|
end
|
|
105
|
-
|
|
180
|
+
elsif node&.text
|
|
181
|
+
html << CGI.escapeHTML(node.text)
|
|
182
|
+
elsif text = render_klass.text
|
|
183
|
+
html << text
|
|
106
184
|
end
|
|
107
185
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
186
|
+
@nodes.each do |klass|
|
|
187
|
+
render_klass = klass.new(node)
|
|
188
|
+
|
|
189
|
+
if render_klass.self_closing
|
|
190
|
+
next
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
if render_klass.matching
|
|
194
|
+
html << render_closing_tag(render_klass.tag)
|
|
195
|
+
end
|
|
115
196
|
end
|
|
116
|
-
return all.join('')
|
|
117
|
-
end
|
|
118
197
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
198
|
+
if node&.marks
|
|
199
|
+
node.marks.reverse.each do |mark|
|
|
200
|
+
@marks.each do |klass|
|
|
201
|
+
render_klass = klass.new(mark)
|
|
202
|
+
|
|
203
|
+
if render_klass.matching && mark_should_close(mark, next_node)
|
|
204
|
+
html << render_closing_tag(render_klass.tag)
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
124
208
|
end
|
|
125
|
-
|
|
209
|
+
|
|
210
|
+
html
|
|
126
211
|
end
|
|
127
212
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return get_matching_class(item, @nodes)
|
|
213
|
+
def mark_should_open(mark, prev_node)
|
|
214
|
+
node_has_mark(prev_node, mark)
|
|
131
215
|
end
|
|
132
|
-
|
|
133
|
-
def
|
|
134
|
-
|
|
216
|
+
|
|
217
|
+
def mark_should_close(mark, next_node)
|
|
218
|
+
node_has_mark(next_node, mark)
|
|
135
219
|
end
|
|
136
|
-
|
|
137
|
-
def
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
220
|
+
|
|
221
|
+
def node_has_mark(node, mark)
|
|
222
|
+
return true unless node
|
|
223
|
+
return true if node.respond_to?(:marks)
|
|
224
|
+
|
|
225
|
+
# Other node has same mark
|
|
226
|
+
node.marks&.each do |other_mark|
|
|
227
|
+
if mark == other_mark
|
|
228
|
+
return false
|
|
142
229
|
end
|
|
143
230
|
end
|
|
144
|
-
|
|
231
|
+
|
|
232
|
+
true
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def render_opening_tag(tags)
|
|
236
|
+
tags = array_wrap(tags)
|
|
237
|
+
|
|
238
|
+
return nil if tags.empty?
|
|
239
|
+
|
|
240
|
+
tags.map do |tag|
|
|
241
|
+
if tag.is_a? String
|
|
242
|
+
"<#{tag}>"
|
|
243
|
+
else
|
|
244
|
+
tag = OpenStruct.new(tag) unless tag.is_a?(OpenStruct)
|
|
245
|
+
|
|
246
|
+
attrs = ''
|
|
247
|
+
if tag&.attrs
|
|
248
|
+
tag.attrs.each_pair do |attr, value|
|
|
249
|
+
escaped_value = CGI.escapeHTML(value.to_s)
|
|
250
|
+
attrs << " #{attr}=\"#{escaped_value}\""
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
"<#{tag.tag}#{attrs}>"
|
|
255
|
+
end
|
|
256
|
+
end.join
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def render_closing_tag(tags)
|
|
260
|
+
tags = array_wrap(tags).reverse
|
|
261
|
+
|
|
262
|
+
return nil if tags.empty?
|
|
263
|
+
|
|
264
|
+
tags.map do |tag|
|
|
265
|
+
if tag.is_a? String
|
|
266
|
+
"</#{tag}>"
|
|
267
|
+
else
|
|
268
|
+
tag = OpenStruct.new(tag) unless tag.is_a?(OpenStruct)
|
|
269
|
+
|
|
270
|
+
"</#{tag.tag}>"
|
|
271
|
+
end
|
|
272
|
+
end.join
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
# From https://github.com/rails/rails/blob/5f3ff60084ab5d5921ca3499814e4697f8350ee7/activesupport/lib/active_support/core_ext/array/wrap.rb
|
|
276
|
+
def array_wrap(object)
|
|
277
|
+
if object.nil?
|
|
278
|
+
[]
|
|
279
|
+
elsif object.respond_to?(:to_ary)
|
|
280
|
+
object.to_ary || [object]
|
|
281
|
+
else
|
|
282
|
+
[object]
|
|
283
|
+
end
|
|
145
284
|
end
|
|
146
|
-
|
|
147
285
|
end
|
|
148
286
|
end
|
data/prosemirror_to_html.gemspec
CHANGED
|
@@ -6,15 +6,15 @@ require "prosemirror_to_html/version"
|
|
|
6
6
|
Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "prosemirror_to_html"
|
|
8
8
|
spec.version = ProsemirrorToHtml::VERSION
|
|
9
|
-
spec.authors = ["Brian Kimball"]
|
|
10
|
-
spec.email = ["bvkimball@gmail.com"]
|
|
11
|
-
|
|
9
|
+
spec.authors = ["Hans Lemuet", "Brian Kimball"]
|
|
10
|
+
spec.email = ["hans@etamin.studio", "bvkimball@gmail.com"]
|
|
11
|
+
|
|
12
12
|
spec.summary = %q{Takes ProseMirror compatible JSON and outputs HTML.}
|
|
13
13
|
spec.description = %q{Takes ProseMirror compatible JSON and outputs HTML.}
|
|
14
|
-
spec.homepage = "https://github.com/
|
|
14
|
+
spec.homepage = "https://github.com/etaminstudio/prosemirror_to_html"
|
|
15
15
|
spec.license = "MIT"
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
|
19
19
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
|
20
20
|
# if spec.respond_to?(:metadata)
|
|
@@ -37,8 +37,8 @@ Gem::Specification.new do |spec|
|
|
|
37
37
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
38
38
|
spec.require_paths = ["lib"]
|
|
39
39
|
|
|
40
|
-
spec.add_development_dependency "bundler", "~> 2.
|
|
41
|
-
spec.add_development_dependency "rake", "~>
|
|
40
|
+
spec.add_development_dependency "bundler", "~> 2.3"
|
|
41
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
|
42
42
|
spec.add_development_dependency "rspec", "~> 3.0"
|
|
43
43
|
spec.add_development_dependency "yard"
|
|
44
44
|
spec.add_dependency "nokogiri"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: prosemirror_to_html
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
+
- Hans Lemuet
|
|
7
8
|
- Brian Kimball
|
|
8
|
-
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -16,28 +16,28 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 2.
|
|
19
|
+
version: '2.3'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 2.
|
|
26
|
+
version: '2.3'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '13.0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '13.0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -82,6 +82,7 @@ dependencies:
|
|
|
82
82
|
version: '0'
|
|
83
83
|
description: Takes ProseMirror compatible JSON and outputs HTML.
|
|
84
84
|
email:
|
|
85
|
+
- hans@etamin.studio
|
|
85
86
|
- bvkimball@gmail.com
|
|
86
87
|
executables: []
|
|
87
88
|
extensions: []
|
|
@@ -91,6 +92,7 @@ files:
|
|
|
91
92
|
- ".gitignore"
|
|
92
93
|
- ".rspec"
|
|
93
94
|
- ".travis.yml"
|
|
95
|
+
- CHANGELOG.md
|
|
94
96
|
- CODE_OF_CONDUCT.md
|
|
95
97
|
- Gemfile
|
|
96
98
|
- Gemfile.lock
|
|
@@ -105,27 +107,33 @@ files:
|
|
|
105
107
|
- lib/prosemirror_to_html/marks/italic.rb
|
|
106
108
|
- lib/prosemirror_to_html/marks/link.rb
|
|
107
109
|
- lib/prosemirror_to_html/marks/mark.rb
|
|
110
|
+
- lib/prosemirror_to_html/marks/strike.rb
|
|
111
|
+
- lib/prosemirror_to_html/marks/subscript.rb
|
|
112
|
+
- lib/prosemirror_to_html/marks/superscript.rb
|
|
113
|
+
- lib/prosemirror_to_html/marks/underline.rb
|
|
114
|
+
- lib/prosemirror_to_html/nodes/blockquote.rb
|
|
108
115
|
- lib/prosemirror_to_html/nodes/bullet_list.rb
|
|
109
116
|
- lib/prosemirror_to_html/nodes/code_block.rb
|
|
110
|
-
- lib/prosemirror_to_html/nodes/code_block_wrapper.rb
|
|
111
117
|
- lib/prosemirror_to_html/nodes/hard_break.rb
|
|
112
118
|
- lib/prosemirror_to_html/nodes/heading.rb
|
|
119
|
+
- lib/prosemirror_to_html/nodes/horizontal_rule.rb
|
|
113
120
|
- lib/prosemirror_to_html/nodes/image.rb
|
|
114
121
|
- lib/prosemirror_to_html/nodes/list_item.rb
|
|
115
122
|
- lib/prosemirror_to_html/nodes/node.rb
|
|
116
123
|
- lib/prosemirror_to_html/nodes/ordered_list.rb
|
|
117
124
|
- lib/prosemirror_to_html/nodes/paragraph.rb
|
|
118
|
-
- lib/prosemirror_to_html/nodes/
|
|
119
|
-
- lib/prosemirror_to_html/nodes/
|
|
125
|
+
- lib/prosemirror_to_html/nodes/table.rb
|
|
126
|
+
- lib/prosemirror_to_html/nodes/table_cell.rb
|
|
127
|
+
- lib/prosemirror_to_html/nodes/table_header.rb
|
|
128
|
+
- lib/prosemirror_to_html/nodes/table_row.rb
|
|
120
129
|
- lib/prosemirror_to_html/version.rb
|
|
121
130
|
- prosemirror_to_html.gemspec
|
|
122
131
|
- scripts/package
|
|
123
132
|
- scripts/release
|
|
124
|
-
homepage: https://github.com/
|
|
133
|
+
homepage: https://github.com/etaminstudio/prosemirror_to_html
|
|
125
134
|
licenses:
|
|
126
135
|
- MIT
|
|
127
136
|
metadata: {}
|
|
128
|
-
post_install_message:
|
|
129
137
|
rdoc_options: []
|
|
130
138
|
require_paths:
|
|
131
139
|
- lib
|
|
@@ -140,9 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
140
148
|
- !ruby/object:Gem::Version
|
|
141
149
|
version: '0'
|
|
142
150
|
requirements: []
|
|
143
|
-
|
|
144
|
-
rubygems_version: 2.7.6
|
|
145
|
-
signing_key:
|
|
151
|
+
rubygems_version: 3.7.2
|
|
146
152
|
specification_version: 4
|
|
147
153
|
summary: Takes ProseMirror compatible JSON and outputs HTML.
|
|
148
154
|
test_files: []
|