asciidoctor-epub3 2.2.0 → 2.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f47c314fc65663c2bd0a8341ea54d55567aa7919d749b329b8ca71c1a333bd6
4
- data.tar.gz: 90af9c361a43fb414ddbbc9307e4f796c1fba65e25b40ae68f8d070ac70f7c80
3
+ metadata.gz: 0dddf8fe89e08a5735ec8834f22bd922b8385c41d7115e8af62b16ebac212419
4
+ data.tar.gz: 8db49a9934ce142ffa4bd371abef329d939f4eb8bec928fbc54baa48a267c06d
5
5
  SHA512:
6
- metadata.gz: 8eb9d489580a19dfbc7a5b0f66850d3d68f1a9e18bb97e1435c54637b2885b131faa14059b9abdb89d825f822fef14948a3e80874510a8829c90750ed50e8003
7
- data.tar.gz: 3d1285ae734a37cebb56e4c1a02ada09ec6b7b216cba28b0a312d14f09dcf21704b182b88aaa4162bb2dff8e90bac0369d3fd6b513bc0b857182508346f551a3
6
+ metadata.gz: e21b62e05193e4b1c208ee8cce4e434f528d543909b0c71e04c7b3fecf43c2724c91d47a01a2f291b2bbbe5718857721412553bdde0db6d09110a59d83169c31
7
+ data.tar.gz: e9db7e08b20c644db5ad7a06367a668fc77997933bdc0f219121076bbfae902cf8c2ab31d0e7c870b3579d1f8dc6bbd9fc4fa5cb87f1753b40ed0d206c522ced
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,14 @@
5
5
  This document provides a high-level view of the changes to the {project-name} by release.
6
6
  For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
7
7
 
8
+ == 2.3.0 (2025-08-31) - @slonopotamus
9
+
10
+ * add docinfo support (#502)
11
+ * fix footnote HTML markup (#506)
12
+ * add list styles support #(508)
13
+ * improve CSS styles for example blocks (#516)
14
+ * fix off-by-one `:toclevels:` handling in multi-part books (#492)
15
+
8
16
  == 2.2.0 (2025-05-11) - @slonopotamus
9
17
 
10
18
  * fix crash when running in environments with non-Unicode locale (#475)
@@ -14,7 +22,7 @@ For a detailed view of what has changed, refer to the {uri-repo}/commits/master[
14
22
  * bump the oldest supported Ruby to 2.7
15
23
  * fix Ruby 3.4 compatibility
16
24
  * fix captions in example blocks (#497)
17
- * fix TOC being off-by-one when `:toclevels:` is set (#492)
25
+ * fix off-by-one `:toclevels:` handling (#492)
18
26
  * stop using H3 for list headings (#491)
19
27
 
20
28
  == 2.1.3 (2024-05-12) - @slonopotamus
data/README.adoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = {project-name}: A _native_ EPUB3 converter for AsciiDoc
2
2
  Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>
3
- v2.2.0, 2025-05-11
3
+ v2.2.0, 2025-08-31
4
4
  :project-name: Asciidoctor EPUB3
5
5
  :project-handle: asciidoctor-epub3
6
6
  :uri-project: https://github.com/asciidoctor/{project-handle}
@@ -36,17 +36,19 @@ Gem::Specification.new do |s|
36
36
  # TODO: switch to 'sass-embedded' when we drop Ruby 2.5 support
37
37
  s.add_dependency 'sass'
38
38
 
39
- s.add_development_dependency 'asciidoctor-diagram', '~> 2.0'
39
+ s.add_development_dependency 'asciidoctor-diagram', '~> 3.0'
40
+ s.add_development_dependency 'asciidoctor-diagram-ditaamini', '~> 1.0'
41
+ s.add_development_dependency 'asciidoctor-diagram-plantuml', '~> 1.2025'
40
42
  s.add_development_dependency 'asciimath', '~> 2.0'
41
43
  s.add_development_dependency 'coderay', '~> 1.1.0'
42
44
  s.add_development_dependency 'concurrent-ruby', '~> 1.0'
43
- s.add_development_dependency 'epubcheck-ruby', '~> 5.2.0.0'
44
- s.add_development_dependency 'pygments.rb', '~> 3.0.0'
45
- s.add_development_dependency 'rake', '~> 13.2.0'
46
- s.add_development_dependency 'rouge', '~> 3.0'
45
+ s.add_development_dependency 'epubcheck-ruby', '~> 5.2.1.0'
46
+ s.add_development_dependency 'pygments.rb', '~> 4.0.0'
47
+ s.add_development_dependency 'rake', '~> 13.3.0'
48
+ s.add_development_dependency 'rouge', '~> 4.6'
47
49
  s.add_development_dependency 'rspec', '~> 3.13.0'
48
- s.add_development_dependency 'rubocop', '~> 1.70.0'
49
- s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
50
+ s.add_development_dependency 'rubocop', '~> 1.80.0'
51
+ s.add_development_dependency 'rubocop-rake', '~> 0.7.1'
50
52
  s.add_development_dependency 'rubocop-rspec', '~> 3.3'
51
53
  s.add_development_dependency 'slim', '~> 5.0'
52
54
  s.add_development_dependency 'tilt', '~> 2.0'
@@ -207,7 +207,7 @@ th, td {
207
207
  body p,
208
208
  ul, ol, li, dl, dt, dd, footer,
209
209
  div.verse .attribution, table.table th, table.table td,
210
- figcaption, caption {
210
+ figcaption, caption, div.example-title {
211
211
  /* NOTE iBooks will forcefully override font-family of text inside div, p and span elements when font other than Original is selected */
212
212
  /* NOTE iBooks honors Original font for prose text if declared in display-options.xml */
213
213
  font-family: "Noto Serif", serif;
@@ -363,6 +363,16 @@ div.callout-list li > i.conum {
363
363
  width: 1.25em;
364
364
  }
365
365
 
366
+ div.example-title {
367
+ margin-top: 1em;
368
+ }
369
+
370
+ .example-content > * {
371
+ margin-top: 0.25em;
372
+ border: 1px solid $aside-border;
373
+ padding: 0.25em;
374
+ }
375
+
366
376
  div.itemized-list, div.ordered-list, div.description-list {
367
377
  margin-top: 1em;
368
378
  padding-bottom: 0.25em; /* REVIEW maybe, maybe not */
@@ -414,11 +424,39 @@ li > span.principal, dd > span.principal {
414
424
  text-align: justify;
415
425
  }
416
426
 
427
+ ol.arabic {
428
+ list-style-type: decimal
429
+ }
430
+
417
431
  ol.brief > li > span.principal,
418
432
  ul.brief > li > span.principal {
419
433
  text-align: left;
420
434
  }
421
435
 
436
+ ol.decimal {
437
+ list-style-type: decimal-leading-zero
438
+ }
439
+
440
+ ol.loweralpha {
441
+ list-style-type: lower-alpha
442
+ }
443
+
444
+ ol.lowergreek {
445
+ list-style-type: lower-greek
446
+ }
447
+
448
+ ol.lowerroman {
449
+ list-style-type: lower-roman
450
+ }
451
+
452
+ ol.upperalpha {
453
+ list-style-type: upper-alpha
454
+ }
455
+
456
+ ol.upperroman {
457
+ list-style-type: upper-roman
458
+ }
459
+
422
460
  /* REVIEW still considering keeping this one */
423
461
  /* disable justify within a link */
424
462
  /*
@@ -469,8 +507,10 @@ h4 {
469
507
 
470
508
  /* Removed due to multiple definitions, assuming only the last one will be considered by interpreters */
471
509
  /* font-size: 1.1em; */
472
- /* margin-top: 1em; */ /* 1.1rem */
473
- /* margin-bottom: -0.818em; */ /* -0.9rem, 0.1rem to content */
510
+ /* margin-top: 1em; */
511
+ /* 1.1rem */
512
+ /* margin-bottom: -0.818em; */
513
+ /* -0.9rem, 0.1rem to content */
474
514
 
475
515
  font-size: 1.2em;
476
516
  margin-top: 0.917em; /* 1.1rem */
@@ -783,7 +823,8 @@ figure.coalesce {
783
823
  }
784
824
 
785
825
  figcaption,
786
- caption {
826
+ caption,
827
+ div.example-title {
787
828
  font-size: 0.9em;
788
829
  font-style: italic;
789
830
  color: $caption-text;
@@ -245,6 +245,7 @@ module Asciidoctor
245
245
 
246
246
  nav_item = @book.add_item('nav.xhtml', id: 'nav').nav
247
247
 
248
+ # TODO: Why we default to toclevels=1?
248
249
  toclevels = [(node.attr 'toclevels', 1).to_i, 0].max
249
250
  outlinelevels = [(node.attr 'outlinelevels', toclevels).to_i, 0].max
250
251
 
@@ -388,9 +389,9 @@ module Asciidoctor
388
389
  if icon_names.empty?
389
390
  icon_css_head = ''
390
391
  else
391
- icon_defs = icon_names.map { |name|
392
+ icon_defs = icon_names.map do |name|
392
393
  %(.i-#{name}::before { content: "#{FontIconMap.unicode name}"; })
393
- } * LF
394
+ end * LF
394
395
  icon_css_head = %(<style>
395
396
  #{icon_defs}
396
397
  </style>
@@ -435,8 +436,19 @@ document.addEventListener('DOMContentLoaded', function(event, reader) {
435
436
  self_closing_tag_slash: '/')
436
437
  end
437
438
 
438
- lines << %(</head>
439
+ unless (docinfo_content = node.document.docinfo :head, '-epub.html').empty?
440
+ lines << docinfo_content
441
+ end
442
+
443
+ lines << '</head>
439
444
  <body>
445
+ '
446
+
447
+ unless (docinfo_content = node.document.docinfo :header, '-epub.html').empty?
448
+ lines << docinfo_content
449
+ end
450
+
451
+ lines << %(
440
452
  <section class="chapter" title=#{chapter_title.encode xml: :attr}#{epub_type_attr} id="#{filename}">
441
453
  #{header}
442
454
  #{content})
@@ -462,6 +474,10 @@ document.addEventListener('DOMContentLoaded', function(event, reader) {
462
474
  self_closing_tag_slash: '/')
463
475
  end
464
476
 
477
+ unless (docinfo_content = node.document.docinfo :footer, '-epub.html').empty?
478
+ lines << docinfo_content
479
+ end
480
+
465
481
  lines << '</body>
466
482
  </html>'
467
483
 
@@ -1257,7 +1273,7 @@ document.addEventListener('DOMContentLoaded', function(event, reader) {
1257
1273
  attrs = []
1258
1274
  attrs << %(id="#{node.id}") if node.id
1259
1275
 
1260
- %(<sup class="noteref">[<a#{prepend_space attrs * ' '}href="#note-#{index}" epub:type="noteref">#{index}</a>]</sup>)
1276
+ %(<sup class="noteref">[<a#{prepend_space attrs * ' '} href="#note-#{index}" epub:type="noteref">#{index}</a>]</sup>)
1261
1277
  elsif node.type == :xref
1262
1278
  %(<mark class="noteref" title="Unresolved note reference">#{node.text}</mark>)
1263
1279
  end
@@ -1377,7 +1393,7 @@ document.addEventListener('DOMContentLoaded', function(event, reader) {
1377
1393
 
1378
1394
  # Prepend a space to the value if it's non-nil, otherwise return empty string.
1379
1395
  def prepend_space(value)
1380
- value ? %( #{value}) : ''
1396
+ value.nil_or_empty? ? '' : %( #{value})
1381
1397
  end
1382
1398
 
1383
1399
  def add_theme_assets(doc)
@@ -1587,7 +1603,7 @@ body > svg {
1587
1603
  nil
1588
1604
  end
1589
1605
 
1590
- def nav_doc(doc, items, landmarks, depth)
1606
+ def nav_doc(doc, items, landmarks, levels)
1591
1607
  lines = [%(<?xml version='1.0' encoding='utf-8'?>
1592
1608
  <!DOCTYPE html>
1593
1609
  <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="#{lang = doc.attr 'lang',
@@ -1603,7 +1619,7 @@ body > svg {
1603
1619
  <h1 class="chapter-title"><small class="subtitle">#{doc.attr 'toc-title'}</small></h1>
1604
1620
  </header>
1605
1621
  <nav epub:type="toc" id="toc">)]
1606
- lines << (nav_level items, [depth, 0].max)
1622
+ lines << (nav_level items, levels)
1607
1623
  lines << '</nav>'
1608
1624
 
1609
1625
  unless landmarks.empty?
@@ -1624,41 +1640,40 @@ body > svg {
1624
1640
  lines * LF
1625
1641
  end
1626
1642
 
1627
- def nav_level(items, depth, state = {})
1643
+ def nav_level(items, levels, state = {})
1628
1644
  lines = []
1629
1645
 
1630
- if depth.positive?
1631
- lines << '<ol>'
1632
- items.each do |item|
1633
- # index = (state[:index] = (state.fetch :index, 0) + 1)
1634
- if (chapter_filename = get_chapter_filename item).nil?
1635
- item_label = sanitize_xml get_numbered_title(item), :pcdata
1636
- item_href = %(#{state[:content_doc_href]}##{item.id})
1637
- else
1638
- # NOTE: we sanitize the chapter titles because we use formatting to control layout
1639
- item_label = if item.context == :document
1640
- sanitize_doctitle_xml item, :cdata
1641
- else
1642
- sanitize_xml get_numbered_title(item), :cdata
1643
- end
1644
- item_href = (state[:content_doc_href] = %(#{chapter_filename}.xhtml))
1645
- end
1646
- lines << %(<li><a href="#{item_href}">#{item_label}</a>)
1647
- if (child_sections = item.sections).empty?
1648
- lines[-1] = %(#{lines[-1]}</li>)
1649
- else
1650
- lines << (nav_level child_sections, depth - 1, state)
1651
- lines << '</li>'
1652
- end
1653
- state.delete :content_doc_href unless chapter_filename.nil?
1646
+ items.each do |item|
1647
+ next if item.level > levels
1648
+
1649
+ # index = (state[:index] = (state.fetch :index, 0) + 1)
1650
+ if (chapter_filename = get_chapter_filename item).nil?
1651
+ item_label = sanitize_xml get_numbered_title(item), :pcdata
1652
+ item_href = %(#{state[:content_doc_href]}##{item.id})
1653
+ else
1654
+ # NOTE: we sanitize the chapter titles because we use formatting to control layout
1655
+ item_label = if item.context == :document
1656
+ sanitize_doctitle_xml item, :cdata
1657
+ else
1658
+ sanitize_xml get_numbered_title(item), :cdata
1659
+ end
1660
+ item_href = (state[:content_doc_href] = %(#{chapter_filename}.xhtml))
1661
+ end
1662
+ lines << %(<li><a href="#{item_href}">#{item_label}</a>)
1663
+ if (child_sections = item.sections).empty?
1664
+ lines[-1] = %(#{lines[-1]}</li>)
1665
+ else
1666
+ lines << (nav_level child_sections, levels, state)
1667
+ lines << '</li>'
1654
1668
  end
1655
- lines << '</ol>'
1669
+ state.delete :content_doc_href unless chapter_filename.nil?
1656
1670
  end
1657
1671
 
1672
+ lines = ['<ol>', *lines, %(</ol>)] unless lines.empty?
1658
1673
  lines * LF
1659
1674
  end
1660
1675
 
1661
- def ncx_doc(doc, items, depth)
1676
+ def ncx_doc(doc, items, levels)
1662
1677
  # TODO: populate docAuthor element based on unique authors in work
1663
1678
  lines = [%(<?xml version="1.0" encoding="utf-8"?>
1664
1679
  <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="#{doc.attr 'lang', 'en'}">
@@ -1670,17 +1685,19 @@ body > svg {
1670
1685
  </head>
1671
1686
  <docTitle><text>#{sanitize_doctitle_xml doc, :cdata}</text></docTitle>
1672
1687
  <navMap>)]
1673
- lines << (ncx_level items, depth, state = {})
1688
+ lines << (ncx_level items, levels, state = {})
1674
1689
  lines[0] = lines[0].sub '%<depth>s', %(<meta name="dtb:depth" content="#{state[:max_depth]}"/>)
1675
1690
  lines << %(</navMap>
1676
1691
  </ncx>)
1677
1692
  lines * LF
1678
1693
  end
1679
1694
 
1680
- def ncx_level(items, depth, state = {})
1695
+ def ncx_level(items, levels, state = {})
1681
1696
  lines = []
1682
1697
  state[:max_depth] = (state.fetch :max_depth, 0) + 1
1683
1698
  items.each do |item|
1699
+ next if item.level > levels
1700
+
1684
1701
  index = (state[:index] = (state.fetch :index, 0) + 1)
1685
1702
  item_id = %(nav_#{index})
1686
1703
  if (chapter_filename = get_chapter_filename item).nil?
@@ -1697,8 +1714,8 @@ body > svg {
1697
1714
  lines << %(<navPoint id="#{item_id}" playOrder="#{index}">)
1698
1715
  lines << %(<navLabel><text>#{item_label}</text></navLabel>)
1699
1716
  lines << %(<content src="#{item_href}"/>)
1700
- unless depth.zero? || (child_sections = item.sections).empty?
1701
- lines << (ncx_level child_sections, depth - 1, state)
1717
+ unless (child_sections = item.sections).empty?
1718
+ lines << (ncx_level child_sections, levels, state)
1702
1719
  end
1703
1720
  lines << %(</navPoint>)
1704
1721
  state.delete :content_doc_href unless chapter_filename.nil?
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module Epub3
5
- VERSION = '2.2.0'
5
+ VERSION = '2.3.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-epub3
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Allen
@@ -72,14 +72,42 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.0'
75
+ version: '3.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.0'
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: asciidoctor-diagram-ditaamini
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: asciidoctor-diagram-plantuml
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.2025'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.2025'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: asciimath
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,56 +156,56 @@ dependencies:
128
156
  requirements:
129
157
  - - "~>"
130
158
  - !ruby/object:Gem::Version
131
- version: 5.2.0.0
159
+ version: 5.2.1.0
132
160
  type: :development
133
161
  prerelease: false
134
162
  version_requirements: !ruby/object:Gem::Requirement
135
163
  requirements:
136
164
  - - "~>"
137
165
  - !ruby/object:Gem::Version
138
- version: 5.2.0.0
166
+ version: 5.2.1.0
139
167
  - !ruby/object:Gem::Dependency
140
168
  name: pygments.rb
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
171
  - - "~>"
144
172
  - !ruby/object:Gem::Version
145
- version: 3.0.0
173
+ version: 4.0.0
146
174
  type: :development
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - "~>"
151
179
  - !ruby/object:Gem::Version
152
- version: 3.0.0
180
+ version: 4.0.0
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: rake
155
183
  requirement: !ruby/object:Gem::Requirement
156
184
  requirements:
157
185
  - - "~>"
158
186
  - !ruby/object:Gem::Version
159
- version: 13.2.0
187
+ version: 13.3.0
160
188
  type: :development
161
189
  prerelease: false
162
190
  version_requirements: !ruby/object:Gem::Requirement
163
191
  requirements:
164
192
  - - "~>"
165
193
  - !ruby/object:Gem::Version
166
- version: 13.2.0
194
+ version: 13.3.0
167
195
  - !ruby/object:Gem::Dependency
168
196
  name: rouge
169
197
  requirement: !ruby/object:Gem::Requirement
170
198
  requirements:
171
199
  - - "~>"
172
200
  - !ruby/object:Gem::Version
173
- version: '3.0'
201
+ version: '4.6'
174
202
  type: :development
175
203
  prerelease: false
176
204
  version_requirements: !ruby/object:Gem::Requirement
177
205
  requirements:
178
206
  - - "~>"
179
207
  - !ruby/object:Gem::Version
180
- version: '3.0'
208
+ version: '4.6'
181
209
  - !ruby/object:Gem::Dependency
182
210
  name: rspec
183
211
  requirement: !ruby/object:Gem::Requirement
@@ -198,28 +226,28 @@ dependencies:
198
226
  requirements:
199
227
  - - "~>"
200
228
  - !ruby/object:Gem::Version
201
- version: 1.70.0
229
+ version: 1.80.0
202
230
  type: :development
203
231
  prerelease: false
204
232
  version_requirements: !ruby/object:Gem::Requirement
205
233
  requirements:
206
234
  - - "~>"
207
235
  - !ruby/object:Gem::Version
208
- version: 1.70.0
236
+ version: 1.80.0
209
237
  - !ruby/object:Gem::Dependency
210
238
  name: rubocop-rake
211
239
  requirement: !ruby/object:Gem::Requirement
212
240
  requirements:
213
241
  - - "~>"
214
242
  - !ruby/object:Gem::Version
215
- version: 0.6.0
243
+ version: 0.7.1
216
244
  type: :development
217
245
  prerelease: false
218
246
  version_requirements: !ruby/object:Gem::Requirement
219
247
  requirements:
220
248
  - - "~>"
221
249
  - !ruby/object:Gem::Version
222
- version: 0.6.0
250
+ version: 0.7.1
223
251
  - !ruby/object:Gem::Dependency
224
252
  name: rubocop-rspec
225
253
  requirement: !ruby/object:Gem::Requirement
@@ -356,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
356
384
  - !ruby/object:Gem::Version
357
385
  version: '0'
358
386
  requirements: []
359
- rubygems_version: 3.6.7
387
+ rubygems_version: 3.6.9
360
388
  specification_version: 4
361
389
  summary: Converts AsciiDoc documents to EPUB3 e-book format
362
390
  test_files: []