asciidoctor-fb2 0.2.4 → 0.5.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: 10a3aff0401e84e1ad7ef6e5beb2cd823dacb368ccd5171326597eb72fadb355
4
- data.tar.gz: 0120b9bf29fbde68b6bdea2245bc903a27404da357f419116b07ba41c35e7742
3
+ metadata.gz: 191e9008da2371aa05c0f179901db6e452a1a15306cf9672243461dd60843279
4
+ data.tar.gz: 2e553897787cd096962a72a448a1763ad9584a73987ddb660735e354fa38f1f8
5
5
  SHA512:
6
- metadata.gz: 8e1d26f435621c97a0b0a62d2de350ad39fa6d4acac36bf6b5d15d330e881bd7dfd5bcf55cbeea8c4e76ac0cf996583ecf27931012427ee4e34b30f7a8f49d2b
7
- data.tar.gz: fbd79588f67f4295829c4b0012d5178dd292167c14be8d5294fe9fe514fa20073b2afd2fea6d2db8db99a58964fc59c1e9b7a505ebe7871b153dbb97d4ec10c0
6
+ metadata.gz: 3ce011a8f7b12cf2a2fc1c82882fc746b8e22905606afa78d6dec730617c06abb9f9925f4d2ead4dcf9d8a96e843ae7786af66ff65cfe4d12e2fb47f5592c7ed
7
+ data.tar.gz: ef5fc4eb0738e197709aefb45b4385ef7af908c9a5435092ec0119864389130364e306a3044dc50072f37602c8fd6cfbb9e72879b5445ae23241ea481518db2b
@@ -6,3 +6,8 @@ updates:
6
6
  directory: "/"
7
7
  schedule:
8
8
  interval: "daily"
9
+
10
+ - package-ecosystem: "github-actions"
11
+ directory: "/"
12
+ schedule:
13
+ interval: "daily"
@@ -9,18 +9,16 @@ jobs:
9
9
  - name: Set up Ruby
10
10
  uses: ruby/setup-ruby@v1
11
11
  with:
12
- ruby-version: 2.7
13
- - name: Build
14
- run: bundle install --jobs 4 --retry 3
12
+ ruby-version: '3.0'
13
+ bundler-cache: true
15
14
  - name: Lint
16
15
  run: bundle exec rake lint
17
16
  test:
18
17
  strategy:
19
18
  matrix:
20
- # ruby: [jruby, 2.4, 2.5, 2.6, 2.7]
21
- ruby: [2.4, 2.5, 2.6, 2.7]
22
- platform: [ubuntu-latest, macos-latest, windows-latest]
23
- runs-on: ${{ matrix.platform }}
19
+ ruby: ['jruby', '2.4', '2.5', '2.6', '2.7', '3.0']
20
+ os: [ubuntu-latest, macos-latest, windows-latest]
21
+ runs-on: ${{ matrix.os }}
24
22
  steps:
25
23
  - name: Checkout
26
24
  uses: actions/checkout@v2
@@ -28,7 +26,6 @@ jobs:
28
26
  uses: ruby/setup-ruby@v1
29
27
  with:
30
28
  ruby-version: ${{ matrix.ruby }}
31
- - name: Build
32
- run: bundle install --jobs 4 --retry 3
29
+ bundler-cache: true
33
30
  - name: Test
34
31
  run: bundle exec rake spec
@@ -11,14 +11,9 @@ jobs:
11
11
  - name: Set up Ruby
12
12
  uses: ruby/setup-ruby@v1
13
13
  with:
14
- ruby-version: 2.7
14
+ ruby-version: '3.0'
15
15
  - name: Publish to RubyGems.org
16
- run: |
17
- mkdir -p $HOME/.gem
18
- touch $HOME/.gem/credentials
19
- chmod 0600 $HOME/.gem/credentials
20
- printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}\n" > $HOME/.gem/credentials
21
- gem build *.gemspec
22
- gem push *.gem
23
- env:
24
- RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
16
+ uses: dawidd6/action-publish-gem@v1
17
+ with:
18
+ api_key: ${{ secrets.RUBYGEMS_API_KEY }}
19
+
data/CHANGELOG.adoc CHANGED
@@ -1,12 +1,42 @@
1
1
  = {project-name} Changelog
2
2
  :project-name: Asciidoctor FB2
3
3
  :project-handle: asciidoctor-fb2
4
- :slug: slonopotamus/{project-handle}
4
+ :slug: asciidoctor/{project-handle}
5
5
  :uri-project: https://github.com/{slug}
6
6
 
7
7
  This document provides a high-level view of the changes to the {project-name} by release.
8
8
  For a detailed view of what has changed, refer to the {uri-project}/commits/master[commit history] on GitHub.
9
9
 
10
+ == 0.5.1 (2021-04-01) - @slonopotamus
11
+
12
+ * add basic support for stem blocks
13
+
14
+ == 0.5.0 (2021-03-31) - @slonopotamus
15
+
16
+ * add support for `indexterm` and `intexterm2` inline macros
17
+ * add support for inline callouts
18
+ * add support for open blocks
19
+ * add support for example blocks
20
+ * fix crash if document contains a page break
21
+ * add support for floating title
22
+ * fix crash if document contains thematic break
23
+
24
+ == 0.4.0 (2021-02-14) - @slonopotamus
25
+
26
+ * fix table cells markup
27
+ * bump fb2rb to 0.6.0
28
+
29
+ == 0.3.1 (2020-11-29) - @slonopotamus
30
+
31
+ * fix crash on `+toc::[]+` macro
32
+ * avoid adding `notes` body to FB2 if document doesn't have any footnotes
33
+ * fix invalid XML syntax for table cells
34
+
35
+ == 0.3.0 (2020-11-25) - @slonopotamus
36
+
37
+ * output MIME type for FB2 embedded binary files. https://github.com/slonopotamus/asciidoctor-fb2/issues/19[#19]
38
+ * handle `+image:file[]+` syntax for `+:front-cover-image:+` document attribute. https://github.com/slonopotamus/asciidoctor-fb2/issues/19[#19]
39
+
10
40
  == 0.2.4 (2020-11-24) - @slonopotamus
11
41
 
12
42
  * add support for table captions
data/README.adoc CHANGED
@@ -2,11 +2,12 @@
2
2
  Marat Radchenko <marat@slonopotamus.org>
3
3
  :project-name: Asciidoctor FB2
4
4
  :project-handle: asciidoctor-fb2
5
- :slug: slonopotamus/{project-handle}
5
+ :slug: asciidoctor/{project-handle}
6
6
  :uri-project: https://github.com/{slug}
7
7
  :uri-ci: {uri-project}/actions?query=branch%3Amaster
8
8
  :uri-gem: https://rubygems.org/gems/{project-handle}
9
9
 
10
+ image:https://img.shields.io/badge/zulip-join_chat-brightgreen.svg[project chat,link=https://asciidoctor.zulipchat.com/]
10
11
  image:https://img.shields.io/gem/v/{project-handle}.svg[Latest Release,link={uri-gem}]
11
12
  image:{uri-project}/workflows/CI/badge.svg?branch=master[Build Status,link={uri-ci}]
12
13
 
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.authors = ['Marat Radchenko']
9
9
  s.email = ['marat@slonopotamus.org']
10
10
  s.summary = 'Converts AsciiDoc documents to FB2 e-book formats'
11
- s.homepage = 'https://github.com/slonopotamus/asciidoctor-fb2'
11
+ s.homepage = 'https://github.com/asciidoctor/asciidoctor-fb2'
12
12
  s.license = 'MIT'
13
13
  s.required_ruby_version = '>= 2.4.0'
14
14
 
@@ -19,11 +19,13 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ['lib']
20
20
 
21
21
  s.add_runtime_dependency 'asciidoctor', '~> 2.0'
22
- s.add_runtime_dependency 'fb2rb', '~> 0.4.0'
22
+ s.add_runtime_dependency 'fb2rb', '~> 0.6.0'
23
+ s.add_runtime_dependency 'mime-types', '~> 3.0'
23
24
 
24
25
  s.add_development_dependency 'asciidoctor-diagram', '~> 2.0'
25
26
  s.add_development_dependency 'rake', '~> 13.0'
26
27
  s.add_development_dependency 'rspec', '~> 3.10.0'
27
- s.add_development_dependency 'rubocop', '~> 0.93.0'
28
- s.add_development_dependency 'rubocop-rspec', '~> 1.44.0'
28
+ s.add_development_dependency 'rubocop', '~> 1.12.0'
29
+ s.add_development_dependency 'rubocop-rake', '~> 0.5.0'
30
+ s.add_development_dependency 'rubocop-rspec', '~> 2.2.0'
29
31
  end
@@ -3,6 +3,7 @@
3
3
  require 'asciidoctor'
4
4
  require 'asciidoctor/converter'
5
5
  require 'fb2rb'
6
+ require 'mime/types'
6
7
 
7
8
  module Asciidoctor
8
9
  module FB2
@@ -13,6 +14,7 @@ module Asciidoctor
13
14
  include ::Asciidoctor::Writer
14
15
 
15
16
  CSV_DELIMITER_REGEX = /\s*,\s*/.freeze
17
+ IMAGE_ATTRIBUTE_VALUE_RX = /^image:{1,2}(.*?)\[(.*?)\]$/.freeze
16
18
 
17
19
  register_for 'fb2'
18
20
 
@@ -42,29 +44,28 @@ module Asciidoctor
42
44
  end
43
45
  node.authors.each do |author|
44
46
  title_info.authors << FB2rb::Author.new(
45
- author.firstname,
46
- author.middlename,
47
- author.lastname,
48
- nil,
49
- [],
50
- author.email.nil? ? [] : [author.email]
47
+ first_name: author.firstname,
48
+ middle_name: author.middlename,
49
+ last_name: author.lastname,
50
+ emails: author.email.nil? ? [] : [author.email]
51
51
  )
52
52
  end
53
53
 
54
54
  if node.attr? 'series-name'
55
55
  series_name = node.attr 'series-name'
56
56
  series_volume = node.attr 'series-volume', 1
57
- title_info.sequences << FB2rb::Sequence.new(series_name, series_volume)
57
+ title_info.sequences << FB2rb::Sequence.new(name: series_name, number: series_volume)
58
58
  end
59
59
 
60
60
  date = node.attr('revdate') || node.attr('docdate')
61
- fb2date = FB2rb::FB2Date.new(date, Date.parse(date))
61
+ fb2date = FB2rb::FB2Date.new(display_value: date, value: Date.parse(date))
62
62
  title_info.date = document_info.date = fb2date
63
63
 
64
64
  unless (cover_image = node.attr('front-cover-image')).nil?
65
+ cover_image = Regexp.last_match(1) if cover_image =~ IMAGE_ATTRIBUTE_VALUE_RX
65
66
  cover_image_path = node.image_uri(cover_image)
66
- register_binary(node, cover_image_path)
67
- title_info.coverpage = FB2rb::Coverpage.new([%(##{cover_image_path})])
67
+ register_binary(node, cover_image_path, 'image')
68
+ title_info.coverpage = FB2rb::Coverpage.new(images: [%(##{cover_image_path})])
68
69
  end
69
70
 
70
71
  document_info.id = node.attr('uuid', '')
@@ -78,8 +79,8 @@ module Asciidoctor
78
79
  <title><p>#{node.doctitle}</p></title>
79
80
  #{node.content}
80
81
  </section>)
81
- @book.bodies << FB2rb::Body.new(nil, body)
82
- if node.document.footnotes
82
+ @book.bodies << FB2rb::Body.new(content: body)
83
+ unless node.document.footnotes.empty?
83
84
  notes = []
84
85
  node.document.footnotes.each do |footnote|
85
86
  notes << %(<section id="note-#{footnote.index}">
@@ -87,7 +88,7 @@ module Asciidoctor
87
88
  <p>#{footnote.text}</p>
88
89
  </section>)
89
90
  end
90
- @book.bodies << FB2rb::Body.new('notes', notes * "\n")
91
+ @book.bodies << FB2rb::Body.new(name: 'notes', content: notes * "\n")
91
92
  end
92
93
  @book
93
94
  end
@@ -112,6 +113,31 @@ module Asciidoctor
112
113
  end
113
114
  end
114
115
 
116
+ # @param _node [Asciidoctor::Block]
117
+ def convert_toc(_node)
118
+ ''
119
+ end
120
+
121
+ # @param _node [Asciidoctor::Block]
122
+ def convert_page_break(_node)
123
+ ''
124
+ end
125
+
126
+ # @param node [Asciidoctor::Block]
127
+ def convert_stem(node)
128
+ %(<p><code>#{node.content}</code></p>)
129
+ end
130
+
131
+ # @param node [Asciidoctor::Block]
132
+ def convert_floating_title(node)
133
+ %(<subtitle id="#{node.id}">#{node.title}</subtitle>)
134
+ end
135
+
136
+ # @param _node [Asciidoctor::Block]
137
+ def convert_thematic_break(_node)
138
+ ''
139
+ end
140
+
115
141
  # @param node [Asciidoctor::Block]
116
142
  def convert_paragraph(node)
117
143
  lines = [
@@ -209,6 +235,14 @@ module Asciidoctor
209
235
  node.text
210
236
  end
211
237
 
238
+ # @param node [Asciidoctor::Block]
239
+ def convert_example(node)
240
+ lines = []
241
+ lines << %(<p><strong>#{node.title}:</strong></p>) if node.title?
242
+ lines << node.content
243
+ lines * "\n"
244
+ end
245
+
212
246
  # @param node [Asciidoctor::Inline]
213
247
  def convert_inline_button(node)
214
248
  %([<strong>#{node.text}</strong>])
@@ -247,18 +281,38 @@ module Asciidoctor
247
281
 
248
282
  # @param node [Asciidoctor::Inline]
249
283
  def convert_inline_image(node)
250
- image_attrs = register_binary(node, node.image_uri(node.target))
284
+ image_attrs = register_binary(node, node.image_uri(node.target), 'image')
251
285
  %(<image #{image_attrs * ' '}/>)
252
286
  end
253
287
 
288
+ # @param node [Asciidoctor::Inline]
289
+ def convert_inline_indexterm(node)
290
+ node.type == :visible ? node.text : ''
291
+ end
292
+
293
+ # @param node [Asciidoctor::Inline]
294
+ def convert_inline_callout(node)
295
+ %(<strong>(#{node.text})</strong>)
296
+ end
297
+
298
+ # @param node [Asciidoctor::List]
299
+ def convert_colist(node)
300
+ convert_olist(node)
301
+ end
302
+
254
303
  # @param node [Asciidoctor::Block]
255
304
  def convert_image(node)
256
- image_attrs = register_binary(node, node.image_uri(node.attr('target')))
305
+ image_attrs = register_binary(node, node.image_uri(node.attr('target')), 'image')
257
306
  image_attrs << %(title="#{node.captioned_title}") if node.title?
258
307
  image_attrs << %(id="#{node.id}") if node.id
259
308
  %(<p><image #{image_attrs * ' '}/></p>)
260
309
  end
261
310
 
311
+ # @param node [Asciidoctor::Block]
312
+ def convert_open(node)
313
+ convert_paragraph(node)
314
+ end
315
+
262
316
  # @param doc [Asciidoctor::Document]
263
317
  # @return [Asciidoctor::Document]
264
318
  def root_document(doc)
@@ -266,9 +320,15 @@ module Asciidoctor
266
320
  doc
267
321
  end
268
322
 
323
+ def determine_mime_type(filename, media_type)
324
+ mime_types = MIME::Types.type_for(filename)
325
+ mime_types.delete_if { |x| x.media_type != media_type }
326
+ mime_types.empty? ? nil : mime_types[0].content_type
327
+ end
328
+
269
329
  # @param node [Asciidoctor::AbstractNode]
270
330
  # @param target [String]
271
- def register_binary(node, target) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
331
+ def register_binary(node, target, media_type) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
272
332
  unless Asciidoctor::Helpers.uriish?(target)
273
333
  out_dir = node.attr('outdir', nil, true) || doc_option(node.document, :to_dir)
274
334
  fs_path = File.join(out_dir, target)
@@ -282,7 +342,8 @@ module Asciidoctor
282
342
  target.sub!('/', '_')
283
343
  target.sub!('\\', '_')
284
344
 
285
- @book.add_binary(target, fs_path)
345
+ mime_type = determine_mime_type(target, media_type)
346
+ @book.add_binary(target, fs_path, mime_type)
286
347
  target = %(##{target})
287
348
  end
288
349
  end
@@ -367,30 +428,36 @@ module Asciidoctor
367
428
  lines * "\n"
368
429
  end
369
430
 
431
+ # @param cell [Asciidoctor::Table::Cell]
432
+ def get_cell_content(cell) # rubocop:disable Metrics/MethodLength
433
+ case cell.style
434
+ when :asciidoc
435
+ cell.content
436
+ when :emphasis
437
+ %(<emphasis>#{cell.text}</emphasis>)
438
+ when :literal
439
+ %(<code>#{cell.text}</code>)
440
+ when :monospaced
441
+ %(<code>#{cell.text}</code>)
442
+ when :strong
443
+ %(<strong>#{cell.text}</strong>)
444
+ else
445
+ cell.text
446
+ end
447
+ end
448
+
370
449
  # @param node [Asciidoctor::Table]
371
450
  def convert_table(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
372
451
  lines = []
373
452
  lines << %(<subtitle>#{node.captioned_title}</subtitle>) if node.title?
374
453
  lines << '<table>'
375
- node.rows.to_h.each do |tsec, rows| # rubocop:disable Metrics/BlockLength
454
+ node.rows.to_h.each do |tsec, rows|
376
455
  next if rows.empty?
377
456
 
378
457
  rows.each do |row|
379
458
  lines << '<tr>'
380
459
  row.each do |cell|
381
- cell_content = if tsec == :head
382
- cell.text
383
- else
384
- case cell.style
385
- when :asciidoc
386
- cell.content
387
- when :literal
388
- %(<p><pre>#{cell.text}</pre></p>)
389
- else
390
- (cell_content = cell.content).empty? ? '' : %(<p>#{cell_content * "</p>\n<p>"}</p>)
391
- end
392
- end
393
-
460
+ cell_content = get_cell_content(cell)
394
461
  cell_tag_name = (tsec == :head || cell.style == :header ? 'th' : 'td')
395
462
  cell_attrs = [
396
463
  %(halign="#{cell.attr 'halign'}"),
@@ -398,7 +465,7 @@ module Asciidoctor
398
465
  ]
399
466
  cell_attrs << %(colspan="#{cell.colspan}") if cell.colspan
400
467
  cell_attrs << %(rowspan="#{cell.rowspan}") if cell.rowspan
401
- lines << %(<#{cell_tag_name} #{cell_attrs * ' '}">#{cell_content}</#{cell_tag_name}>)
468
+ lines << %(<#{cell_tag_name} #{cell_attrs * ' '}>#{cell_content}</#{cell_tag_name}>)
402
469
  end
403
470
  lines << '</tr>'
404
471
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module FB2
5
- VERSION = '0.2.4'
5
+ VERSION = '0.5.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-fb2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marat Radchenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-24 00:00:00.000000000 Z
11
+ date: 2021-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -30,14 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.4.0
33
+ version: 0.6.0
34
34
  type: :runtime
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: 0.4.0
40
+ version: 0.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: mime-types
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: asciidoctor-diagram
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +100,42 @@ dependencies:
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.93.0
103
+ version: 1.12.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.12.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.5.0
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: 0.93.0
124
+ version: 0.5.0
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rubocop-rspec
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - "~>"
102
130
  - !ruby/object:Gem::Version
103
- version: 1.44.0
131
+ version: 2.2.0
104
132
  type: :development
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
- version: 1.44.0
138
+ version: 2.2.0
111
139
  description:
112
140
  email:
113
141
  - marat@slonopotamus.org
@@ -137,7 +165,7 @@ files:
137
165
  - tasks/console.rake
138
166
  - tasks/rspec.rake
139
167
  - tasks/rubocop.rake
140
- homepage: https://github.com/slonopotamus/asciidoctor-fb2
168
+ homepage: https://github.com/asciidoctor/asciidoctor-fb2
141
169
  licenses:
142
170
  - MIT
143
171
  metadata: {}
@@ -156,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
184
  - !ruby/object:Gem::Version
157
185
  version: '0'
158
186
  requirements: []
159
- rubygems_version: 3.1.4
187
+ rubygems_version: 3.2.3
160
188
  signing_key:
161
189
  specification_version: 4
162
190
  summary: Converts AsciiDoc documents to FB2 e-book formats