kramdown-prismic 0.2.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|