kramdown-components 0.1.1 → 0.2.0
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/README.md +74 -4
- data/kramdown-components.gemspec +3 -3
- data/lib/kramdown/custom_document.rb +8 -36
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88fc82100145b4d17743313e5975016be37fbee2887a415ac784d5443b42ef43
|
4
|
+
data.tar.gz: 423666e61c2b28eb8ed764a688cfb3c0ec4e260ca7932810f32dcf075ef28217
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83c176d9d2e3affcf7f33a128550fb9a8af84b2193c2a39cca6d704d790a8ddba3be314e82b84e96c6b995def86fe438ab7911a4707c4c71c8a7351c9af48e17
|
7
|
+
data.tar.gz: ef7a2f3d053ab444fb87044f0ffe26a3ca8f929b03f23b753a199f99a333def509aa9e6ff568ef317be04183d8633e76712aedd3cfbb47084c0f632da2f49b20
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Kramdown Components
|
2
2
|
|
3
|
-
Rewrite sections of Markdown documents using HTML Custom Elements.
|
3
|
+
Rewrite and capture sections of Markdown documents using HTML Custom Elements.
|
4
4
|
|
5
|
-
Useful for enhancing code blocks and formatted markup with more sophisticated controls while maintaining a clean separation of presentation and content.
|
5
|
+
Useful for enhancing code blocks and formatted markup with more sophisticated controls while maintaining a clean separation of presentation and content. Extract content from custom elements.
|
6
6
|
|
7
7
|
## How it Works
|
8
8
|
|
@@ -38,7 +38,7 @@ class ImageGallery < Kramdown::CustomElement; end
|
|
38
38
|
Kramdown::CustomDocument.define_element("image-gallery", ImageGallery)
|
39
39
|
```
|
40
40
|
|
41
|
-
### DOM
|
41
|
+
### Rewriting the DOM
|
42
42
|
|
43
43
|
To rewrite DOM subtrees wrapped by the component, implement the `parse_dom` method of `CustomElement` and manipulate the internal `root` and `children` elements, with instances of `Kramdown::Element` to represent each node.
|
44
44
|
|
@@ -59,7 +59,7 @@ end
|
|
59
59
|
Kramdown::CustomDocument.define_element("button-list", ButtonList)
|
60
60
|
```
|
61
61
|
|
62
|
-
When
|
62
|
+
When this `#parse_dom` hook is applied, all child lists nested within the `<button-list>` component get rewritten to have the content of each list item wrapped in a `<button>`.
|
63
63
|
|
64
64
|
**Source:**
|
65
65
|
|
@@ -84,3 +84,73 @@ When the `ButtonList#parse_dom` rewrite is applied, all child lists nested withi
|
|
84
84
|
</ul>
|
85
85
|
</button-list>
|
86
86
|
```
|
87
|
+
|
88
|
+
## Extracting Content from the DOM
|
89
|
+
|
90
|
+
It’s also possible to use `#parse_dom` to extract content from the document, with or without rewriting.
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
class Color
|
94
|
+
def self.from_hex(value)
|
95
|
+
r, g, b = value.match(/^#(..)(..)(..)$/).captures.map(&:hex)
|
96
|
+
new(r, g, b)
|
97
|
+
end
|
98
|
+
|
99
|
+
attr_reader :r, :g, :b
|
100
|
+
|
101
|
+
def initialize(r, g, b)
|
102
|
+
@r = r
|
103
|
+
@g = g
|
104
|
+
@b = b
|
105
|
+
end
|
106
|
+
|
107
|
+
def to_css
|
108
|
+
"rgb(#{r}, #{g}, #{b})"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class ColorSwatch < Kramdown::CustomElement
|
113
|
+
def parse_dom(root)
|
114
|
+
ul = root.children.find { |child_el| child_el.type == :ul }
|
115
|
+
@colors = ul.children.map do |li|
|
116
|
+
li.children.first.children.first.value
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def to_a
|
121
|
+
@colors.map { |hex| Color.from_hex(hex) }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
Kramdown::CustomDocument.define_element("color-swatch", ColorSwatch)
|
126
|
+
```
|
127
|
+
|
128
|
+
**Source:**
|
129
|
+
|
130
|
+
```md
|
131
|
+
Using the [HoneyGB palette](https://lospec.com/palette-list/honeygb):
|
132
|
+
|
133
|
+
<color-swatch>
|
134
|
+
|
135
|
+
- #3e3a42
|
136
|
+
- #877286
|
137
|
+
- #f0b695
|
138
|
+
- #e9f5da
|
139
|
+
|
140
|
+
</color-swatch>
|
141
|
+
```
|
142
|
+
|
143
|
+
**Result:**
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
document = Kramdown::CustomDocument(source)
|
147
|
+
|
148
|
+
# Get a reference to the parsed `ColorSwatch` instance
|
149
|
+
color_swatch = document.custom_elements.first
|
150
|
+
|
151
|
+
# Use the custom `#to_a` method to get the first extracted color
|
152
|
+
color = color_swatch.to_a.first
|
153
|
+
|
154
|
+
# Render the color value as an RGB string
|
155
|
+
color.to_css
|
156
|
+
```
|
data/kramdown-components.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "kramdown-components"
|
3
|
-
spec.version = "0.
|
3
|
+
spec.version = "0.2.0"
|
4
4
|
spec.platform = Gem::Platform::RUBY
|
5
|
-
spec.summary = "Rewrite sections of Markdown documents using HTML Custom Elements."
|
6
|
-
spec.description = "Mix and match HTML and Markdown syntax. Generate nested DOM trees from a single top level element."
|
5
|
+
spec.summary = "Rewrite and capture sections of Markdown documents using HTML Custom Elements."
|
6
|
+
spec.description = "Mix and match HTML and Markdown syntax. Generate nested DOM trees from a single top level element. Extract content from custom elements."
|
7
7
|
spec.authors = ["Mark Rickerby"]
|
8
8
|
spec.email = "me@maetl.net"
|
9
9
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
@@ -13,15 +13,15 @@ module Kramdown
|
|
13
13
|
@@custom_elements[tag_name] = element
|
14
14
|
end
|
15
15
|
|
16
|
+
DEFAULTS = {
|
17
|
+
parse_block_html: true
|
18
|
+
}
|
19
|
+
|
16
20
|
attr_reader :custom_elements
|
17
21
|
|
18
|
-
def initialize(source)
|
22
|
+
def initialize(source, options={})
|
19
23
|
@source = source
|
20
|
-
@parsed_dom = Kramdown::Document.new(@source,
|
21
|
-
input: "GFM",
|
22
|
-
parse_block_html: true,
|
23
|
-
syntax_highlighter: "rouge"
|
24
|
-
})
|
24
|
+
@parsed_dom = Kramdown::Document.new(@source, DEFAULTS.merge(options))
|
25
25
|
@custom_elements = extract_custom_elements
|
26
26
|
end
|
27
27
|
|
@@ -37,25 +37,12 @@ module Kramdown
|
|
37
37
|
@parsed_dom.to_html
|
38
38
|
end
|
39
39
|
|
40
|
-
def has_js?
|
41
|
-
!@custom_elements.empty?
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_js
|
45
|
-
bundle = ["const EXAMPLE_HANDLERS = {}"]
|
46
|
-
|
47
|
-
@custom_elements.each do |element|
|
48
|
-
bundle << element.to_js
|
49
|
-
bundle << "EXAMPLE_HANDLERS[\"#{element.id}\"] = #{element.name}"
|
50
|
-
end
|
51
|
-
|
52
|
-
bundle.join("\n\n")
|
53
|
-
end
|
54
|
-
|
55
40
|
def method_missing(id, *attr, &block)
|
56
41
|
@parsed_dom.send(id, attr, &block)
|
57
42
|
end
|
58
43
|
|
44
|
+
private
|
45
|
+
|
59
46
|
def generate_el_id(tagname)
|
60
47
|
alphabet = [('a'..'z')].map(&:to_a).flatten
|
61
48
|
tag_id = (0...12).map { alphabet[rand(alphabet.length)] }.join
|
@@ -77,21 +64,6 @@ module Kramdown
|
|
77
64
|
element = custom_element_cls.new(outer_el.attr["id"])
|
78
65
|
element.parse_dom(outer_el)
|
79
66
|
|
80
|
-
# codeblocks = outer_el.children.filter { |child_el| child_el.type == :codeblock }
|
81
|
-
#
|
82
|
-
# outer_el.children = codeblocks.map do |codeblock|
|
83
|
-
# wrapper = Kramdown::Element.new(
|
84
|
-
# :html_element,
|
85
|
-
# "example-script",
|
86
|
-
# { label: LANG_LABELS[codeblock.options[:lang]] },
|
87
|
-
# { content_model: :block }
|
88
|
-
# )
|
89
|
-
# wrapper.children << codeblock
|
90
|
-
# wrapper
|
91
|
-
# end
|
92
|
-
#
|
93
|
-
# outer_el.children.first.attr[:selected] = true
|
94
|
-
|
95
67
|
elements << element
|
96
68
|
end
|
97
69
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kramdown-components
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rickerby
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.11.0
|
55
55
|
description: Mix and match HTML and Markdown syntax. Generate nested DOM trees from
|
56
|
-
a single top level element.
|
56
|
+
a single top level element. Extract content from custom elements.
|
57
57
|
email: me@maetl.net
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
@@ -90,5 +90,5 @@ requirements: []
|
|
90
90
|
rubygems_version: 3.1.2
|
91
91
|
signing_key:
|
92
92
|
specification_version: 4
|
93
|
-
summary: Rewrite sections of Markdown documents using HTML Custom Elements.
|
93
|
+
summary: Rewrite and capture sections of Markdown documents using HTML Custom Elements.
|
94
94
|
test_files: []
|