kramdown-prismic 0.2.1 → 0.3.2
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/.github/workflows/ci.yml +23 -2
- data/CHANGELOG.md +41 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +7 -5
- data/README.md +20 -3
- data/Rakefile +3 -2
- data/bin/html2prismic +6 -0
- data/bin/markdown2prismic +6 -0
- data/bin/prismic2markdown +8 -0
- data/kramdown-prismic.gemspec +12 -8
- data/kramdown1.gemfile +6 -0
- data/kramdown2.gemfile +6 -0
- data/lib/kramdown-prismic.rb +2 -0
- data/lib/kramdown-prismic/version.rb +3 -1
- data/lib/kramdown/converter/prismic.rb +85 -47
- data/lib/kramdown/parser/prismic.rb +60 -29
- data/test/converter_test.rb +165 -118
- data/test/parser_test.rb +173 -52
- metadata +28 -13
- data/.travis.yml +0 -6
- data/Changelog.md +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ee09d3336016df7164dd139beccbdf493e4fa5c057b2c3d6480d1db7c352da4
|
4
|
+
data.tar.gz: 2b14fca6c580875817413ec64d3f5fc015ef00544ddf7a4aff6bfe0edb8e160c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a3b05a335d537eedcd4ab32f45dfd7fd28f258c7557a7efe087a8e98b77d1b65922c012c9b5737939d7ea6d1651117061d3158aad626c510408091abb4d210a
|
7
|
+
data.tar.gz: cf73a15a0961791104991790e2f46ee031d80f0265fdaca1e14601822747b43a815af87a7e3c74bb0a8e60774ec847b6e46e6b0bd0eca5a46b2bffe962ede4fe
|
data/.github/workflows/ci.yml
CHANGED
@@ -2,12 +2,33 @@ name: CI
|
|
2
2
|
|
3
3
|
on: [push, pull_request]
|
4
4
|
jobs:
|
5
|
-
test:
|
5
|
+
test-kramdown2:
|
6
6
|
strategy:
|
7
7
|
fail-fast: false
|
8
8
|
matrix:
|
9
9
|
os: [ubuntu-latest]
|
10
|
-
ruby: [2.
|
10
|
+
ruby: [2.6, 2.7, "3.0"]
|
11
|
+
gemfile: [ kramdown2 ]
|
12
|
+
env:
|
13
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }}.gemfile
|
14
|
+
runs-on: ${{ matrix.os }}
|
15
|
+
steps:
|
16
|
+
- uses: actions/checkout@v2
|
17
|
+
- uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: ${{ matrix.ruby }}
|
20
|
+
bundler-cache: true
|
21
|
+
- run: bundle exec rake test
|
22
|
+
|
23
|
+
test-kramdown1:
|
24
|
+
strategy:
|
25
|
+
fail-fast: false
|
26
|
+
matrix:
|
27
|
+
os: [ubuntu-latest]
|
28
|
+
ruby: [2.6, 2.7]
|
29
|
+
gemfile: [ kramdown1 ]
|
30
|
+
env:
|
31
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }}.gemfile
|
11
32
|
runs-on: ${{ matrix.os }}
|
12
33
|
steps:
|
13
34
|
- uses: actions/checkout@v2
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## Version 0.3.2
|
4
|
+
|
5
|
+
- Parse ordered and unordered lists
|
6
|
+
- Parse image with link
|
7
|
+
|
8
|
+
## Version 0.3.1
|
9
|
+
|
10
|
+
- Add binaries `html2primisc`, `markdown2prismic` and `primisc2markdown`.
|
11
|
+
- Add parsed embed support
|
12
|
+
|
13
|
+
## Version 0.3.0
|
14
|
+
|
15
|
+
- Relax the kramdown dependency to allows the version 2.
|
16
|
+
- XML elements support have been removed.
|
17
|
+
|
18
|
+
## Version 0.2.2
|
19
|
+
|
20
|
+
- Convert links with only an image inside. See #1.
|
21
|
+
|
22
|
+
## Version 0.2.1
|
23
|
+
|
24
|
+
- Parse embed elements
|
25
|
+
- Convert inline code
|
26
|
+
|
27
|
+
## Version 0.2.0
|
28
|
+
|
29
|
+
- Add parser to convert prismic to markdown
|
30
|
+
|
31
|
+
## Version 0.1.2
|
32
|
+
|
33
|
+
- fix output with empty paragraph
|
34
|
+
|
35
|
+
## Version 0.1.1
|
36
|
+
|
37
|
+
- Fix json of the image
|
38
|
+
|
39
|
+
## Version 0.1.0
|
40
|
+
|
41
|
+
- Initial version
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
kramdown-prismic (0.2
|
5
|
-
kramdown (
|
4
|
+
kramdown-prismic (0.3.2)
|
5
|
+
kramdown (>= 1, < 3)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
kramdown (
|
10
|
+
kramdown (2.3.1)
|
11
|
+
rexml
|
11
12
|
minitest (5.10.3)
|
12
|
-
rake (
|
13
|
+
rake (13.0.6)
|
14
|
+
rexml (3.2.5)
|
13
15
|
|
14
16
|
PLATFORMS
|
15
17
|
ruby
|
@@ -17,7 +19,7 @@ PLATFORMS
|
|
17
19
|
DEPENDENCIES
|
18
20
|
kramdown-prismic!
|
19
21
|
minitest (~> 5.0)
|
20
|
-
rake (~>
|
22
|
+
rake (~> 13.0)
|
21
23
|
|
22
24
|
BUNDLED WITH
|
23
25
|
1.17.2
|
data/README.md
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# Kramdown Prismic
|
2
2
|
|
3
|
-
A [Kramdown][] parser and converter to convert documents into [prismic][] rich text format and
|
3
|
+
A [Kramdown][] parser and converter to convert documents into [prismic][] rich text format and the other way around.
|
4
4
|
|
5
|
-
A useful usage is to convert markdown documents to prismic for import purpose. Then you can even convert prismic format back to markdown.
|
5
|
+
A useful usage is to convert markdown documents to prismic for [import purpose][prismic-import]. Then you can even convert prismic format back to markdown.
|
6
6
|
|
7
7
|
## Status
|
8
8
|
|
9
9
|
The converter part (kramdown to prismic) is working and fairly complete. See *Difference between markdown and rich text* below to know more about limitations.
|
10
10
|
|
11
|
-
The parser part is quite new and not feature complete
|
11
|
+
The parser part is quite new and not feature complete.
|
12
12
|
|
13
13
|
## Install
|
14
14
|
|
@@ -18,6 +18,22 @@ gem 'kramdown-prismic', '~> 0.1'
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
+
### With executables
|
22
|
+
|
23
|
+
*markdown2prismic*:
|
24
|
+
|
25
|
+
markdown2prismic $'# My Title\n\nHello world'
|
26
|
+
|
27
|
+
*html2prismic*:
|
28
|
+
|
29
|
+
html2prismic '<h1>My Title</h1><p>Hello world</p>'
|
30
|
+
|
31
|
+
*prismic2markdown*:
|
32
|
+
|
33
|
+
prismic2markdown '[{"type":"heading1","content":{"text":"My Title","spans":[]}},{"type":"paragraph","content":{"text":"Test","spans":[]}}]'
|
34
|
+
|
35
|
+
### As a library
|
36
|
+
|
21
37
|
**Convert kramdown documents to Prismic**
|
22
38
|
|
23
39
|
```ruby
|
@@ -123,3 +139,4 @@ MIT
|
|
123
139
|
|
124
140
|
[Kramdown]: https://kramdown.gettalong.org/
|
125
141
|
[prismic]: https://prismic.io/
|
142
|
+
[prismic-import]: https://prismic.io/docs/core-concepts/how-to-import-content
|
data/Rakefile
CHANGED
data/bin/html2prismic
ADDED
data/kramdown-prismic.gemspec
CHANGED
@@ -1,21 +1,25 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require File.expand_path('lib/kramdown-prismic/version', __dir__)
|
3
4
|
|
4
5
|
Gem::Specification.new do |s|
|
5
6
|
s.name = 'kramdown-prismic'
|
6
7
|
s.version = KramdownPrismic::VERSION
|
7
|
-
s.summary =
|
8
|
-
s.description =
|
9
|
-
s.authors = [
|
8
|
+
s.summary = 'A Kramdown converter to convert documents into prismic rich text format and the other way around.'
|
9
|
+
s.description = 'A Kramdown converter to convert documents into prismic rich text format and the other way around.'
|
10
|
+
s.authors = ['François de Metz']
|
10
11
|
s.email = 'francois@2metz.fr'
|
11
12
|
|
13
|
+
s.executables << 'markdown2prismic'
|
14
|
+
s.executables << 'html2prismic'
|
15
|
+
s.executables << 'prismic2markdown'
|
12
16
|
s.files = `git ls-files`.split("\n")
|
13
17
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
14
18
|
|
15
19
|
s.homepage = 'https://github.com/stormz/kramdown-prismic'
|
16
20
|
s.license = 'MIT'
|
17
21
|
|
18
|
-
s.add_dependency
|
19
|
-
s.add_development_dependency
|
20
|
-
s.add_development_dependency
|
22
|
+
s.add_dependency 'kramdown', '>= 1', '< 3'
|
23
|
+
s.add_development_dependency 'minitest', '~> 5.0'
|
24
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
21
25
|
end
|
data/kramdown1.gemfile
ADDED
data/kramdown2.gemfile
ADDED
data/lib/kramdown-prismic.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'kramdown/converter/base'
|
2
4
|
|
3
5
|
module Kramdown
|
4
6
|
module Converter
|
5
7
|
class Prismic < Base
|
6
8
|
def convert(root)
|
7
|
-
cleanup_ast(root).map
|
9
|
+
cleanup_ast(root).map do |child|
|
8
10
|
convert_element(child)
|
9
|
-
|
11
|
+
end.compact.flatten
|
10
12
|
end
|
11
13
|
|
12
14
|
private
|
@@ -21,20 +23,23 @@ module Kramdown
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def remove_blanks(root)
|
24
|
-
root.children = root.children.
|
26
|
+
root.children = root.children.each_with_object([]) do |child, memo|
|
25
27
|
unless child.type == :blank
|
26
28
|
remove_blanks(child)
|
27
29
|
memo << child
|
28
30
|
end
|
29
|
-
memo
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
34
|
def extract_non_nestable_elements(child, elements)
|
34
|
-
child.children = child.children.
|
35
|
-
if element.type == :img
|
35
|
+
child.children = child.children.each_with_object([]) do |element, memo|
|
36
|
+
if element.type == :a && element.children.size == 1 && element.children.first.type == :img
|
37
|
+
elements << element
|
38
|
+
elsif element.type == :img
|
36
39
|
elements << element
|
37
|
-
|
40
|
+
if child.children.size > 1
|
41
|
+
warning('images inside content will be moved to the top level and may be rendered differently')
|
42
|
+
end
|
38
43
|
elsif element.type == :ul
|
39
44
|
warning('nested list moved to the top level')
|
40
45
|
elements << element
|
@@ -43,7 +48,6 @@ module Kramdown
|
|
43
48
|
memo << element
|
44
49
|
extract_non_nestable_elements(element, elements)
|
45
50
|
end
|
46
|
-
memo
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
@@ -59,9 +63,10 @@ module Kramdown
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def convert_p(element)
|
62
|
-
return nil if element.children.size
|
66
|
+
return nil if element.children.size.zero?
|
67
|
+
|
63
68
|
{
|
64
|
-
type:
|
69
|
+
type: 'paragraph',
|
65
70
|
content: extract_content(element)
|
66
71
|
}
|
67
72
|
end
|
@@ -104,8 +109,7 @@ module Kramdown
|
|
104
109
|
}
|
105
110
|
end
|
106
111
|
|
107
|
-
def convert_hr(element)
|
108
|
-
end
|
112
|
+
def convert_hr(element); end
|
109
113
|
|
110
114
|
def convert_img(element)
|
111
115
|
{
|
@@ -116,57 +120,91 @@ module Kramdown
|
|
116
120
|
},
|
117
121
|
data: {
|
118
122
|
origin: {
|
119
|
-
url: element.attr[
|
123
|
+
url: element.attr['src']
|
124
|
+
},
|
125
|
+
alt: element.attr['alt']
|
126
|
+
}
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
130
|
+
# This can only apply when an link with an image inside has been detected
|
131
|
+
def convert_a(element)
|
132
|
+
image = element.children.first
|
133
|
+
{
|
134
|
+
type: 'image',
|
135
|
+
content: {
|
136
|
+
text: '',
|
137
|
+
spans: []
|
138
|
+
},
|
139
|
+
data: {
|
140
|
+
origin: {
|
141
|
+
url: image.attr['src']
|
120
142
|
},
|
121
|
-
alt:
|
143
|
+
alt: image.attr['alt'],
|
144
|
+
linkTo: {
|
145
|
+
url: element.attr['href']
|
146
|
+
}
|
122
147
|
}
|
123
148
|
}
|
124
149
|
end
|
125
150
|
|
126
151
|
def convert_html_element(element)
|
127
|
-
|
128
|
-
|
152
|
+
if element.value == 'iframe'
|
153
|
+
{
|
154
|
+
content: {
|
155
|
+
spans: [],
|
156
|
+
text: ''
|
157
|
+
},
|
158
|
+
type: 'embed',
|
159
|
+
data: {
|
160
|
+
embed_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
|
161
|
+
type: 'link'
|
162
|
+
}
|
163
|
+
}
|
164
|
+
else
|
165
|
+
warning('translating html elements is not supported')
|
166
|
+
nil
|
167
|
+
end
|
129
168
|
end
|
130
169
|
|
131
|
-
def convert_table(
|
170
|
+
def convert_table(_element)
|
132
171
|
warning('translating table is not supported')
|
133
172
|
nil
|
134
173
|
end
|
135
174
|
|
136
|
-
def convert_dl(
|
175
|
+
def convert_dl(_element)
|
137
176
|
warning('translating dl is not supported')
|
138
177
|
nil
|
139
178
|
end
|
140
179
|
|
141
|
-
def convert_math(
|
180
|
+
def convert_math(_element)
|
142
181
|
warning('translating math is not supported')
|
143
182
|
nil
|
144
183
|
end
|
145
184
|
|
146
|
-
def convert_comment(
|
185
|
+
def convert_comment(_element)
|
147
186
|
warning('translating comment is not supported')
|
148
187
|
nil
|
149
188
|
end
|
150
189
|
|
151
|
-
def
|
152
|
-
warning('translating
|
153
|
-
nil
|
154
|
-
end
|
155
|
-
|
156
|
-
def convert_xml_pi(element)
|
157
|
-
warning('translating xml_pi is not supported')
|
190
|
+
def convert_raw(_element)
|
191
|
+
warning('translating raw is not supported')
|
158
192
|
nil
|
159
193
|
end
|
160
194
|
|
161
|
-
def
|
162
|
-
|
163
|
-
|
195
|
+
def convert_text(element)
|
196
|
+
{
|
197
|
+
type: 'paragraph',
|
198
|
+
content: {
|
199
|
+
text: element.value,
|
200
|
+
spans: []
|
201
|
+
}
|
202
|
+
}
|
164
203
|
end
|
165
204
|
|
166
|
-
def extract_content(element, memo={text: '', spans: []})
|
167
|
-
element.children.
|
205
|
+
def extract_content(element, memo = { text: '', spans: [] })
|
206
|
+
element.children.each_with_object(memo) do |child, memo2|
|
168
207
|
send("extract_span_#{child.type}", child, memo2)
|
169
|
-
memo2
|
170
208
|
end
|
171
209
|
end
|
172
210
|
|
@@ -187,7 +225,7 @@ module Kramdown
|
|
187
225
|
insert_span(element, memo, {
|
188
226
|
type: 'hyperlink',
|
189
227
|
data: {
|
190
|
-
url: element.attr[
|
228
|
+
url: element.attr['href']
|
191
229
|
}
|
192
230
|
})
|
193
231
|
end
|
@@ -208,7 +246,7 @@ module Kramdown
|
|
208
246
|
extract_content(element, memo)
|
209
247
|
end
|
210
248
|
|
211
|
-
def extract_span_br(
|
249
|
+
def extract_span_br(_element, memo)
|
212
250
|
memo[:text] += "\n"
|
213
251
|
end
|
214
252
|
|
@@ -217,11 +255,11 @@ module Kramdown
|
|
217
255
|
memo[:text] += element.value
|
218
256
|
end
|
219
257
|
|
220
|
-
def extract_span_html_element(
|
258
|
+
def extract_span_html_element(_element, _memo)
|
221
259
|
warning('translating html elements is not supported')
|
222
260
|
end
|
223
261
|
|
224
|
-
def extract_span_footnote(
|
262
|
+
def extract_span_footnote(_element, _memo)
|
225
263
|
warning('translating footnote is not supported')
|
226
264
|
end
|
227
265
|
|
@@ -231,16 +269,16 @@ module Kramdown
|
|
231
269
|
end
|
232
270
|
|
233
271
|
TYPOGRAPHIC_SYMS = {
|
234
|
-
mdash: [
|
235
|
-
ndash: [
|
236
|
-
hellip: [
|
237
|
-
laquo_space: [
|
238
|
-
raquo_space: [
|
239
|
-
laquo: [
|
240
|
-
raquo: [
|
241
|
-
}
|
272
|
+
mdash: [Utils::Entities.entity('mdash')],
|
273
|
+
ndash: [Utils::Entities.entity('ndash')],
|
274
|
+
hellip: [Utils::Entities.entity('hellip')],
|
275
|
+
laquo_space: [Utils::Entities.entity('laquo'), Utils::Entities.entity('nbsp')],
|
276
|
+
raquo_space: [Utils::Entities.entity('nbsp'), Utils::Entities.entity('raquo')],
|
277
|
+
laquo: [Utils::Entities.entity('laquo')],
|
278
|
+
raquo: [Utils::Entities.entity('raquo')]
|
279
|
+
}.freeze
|
242
280
|
def extract_span_typographic_sym(element, memo)
|
243
|
-
value = TYPOGRAPHIC_SYMS[element.value].map
|
281
|
+
value = TYPOGRAPHIC_SYMS[element.value].map(&:char).join('')
|
244
282
|
memo[:text] += value
|
245
283
|
end
|
246
284
|
|
@@ -249,7 +287,7 @@ module Kramdown
|
|
249
287
|
end
|
250
288
|
|
251
289
|
def extract_span_smart_quote(element, memo)
|
252
|
-
memo[:text] +=
|
290
|
+
memo[:text] += Utils::Entities.entity(element.value.to_s).char
|
253
291
|
end
|
254
292
|
end
|
255
293
|
end
|