asciidoctor-fb2 0.1.0 → 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/CHANGELOG.adoc +9 -1
- data/README.adoc +32 -9
- data/asciidoctor-fb2.gemspec +4 -4
- data/lib/asciidoctor_fb2.rb +46 -13
- data/lib/asciidoctor_fb2/version.rb +1 -1
- metadata +11 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b60e7a379175a8473e96c61ed95598104689ac84def256f01ec626d850025af
|
4
|
+
data.tar.gz: 96c60b98e0245a9aa4d61037d538f31b623dfd53e0c24407428c784a2753f9c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13bc939cf1450190c85b87e51333c6d58f3e2d3b2181be4c9a5af8705dd645900cd00a1290f74f68adfed42ad1570cfc4c6ed8974940b7317e5c524b96824b74
|
7
|
+
data.tar.gz: 314760eafb08dfda7c44087dab1d7d6a5309ac45f134612a455b84e894d1b8b328beb06d65be37e7e7a7d20de4bc589841a461c3b50c2e666264c8b8ae505ee6
|
data/CHANGELOG.adoc
CHANGED
@@ -7,6 +7,14 @@
|
|
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.2.0 (2020-11-23) - @slonopotamus
|
11
|
+
|
12
|
+
* add support for cover image via `+:front-cover-image:+` attribute. https://github.com/slonopotamus/asciidoctor-fb2/issues/3[#3]
|
13
|
+
* update fb2rb to 0.3.0
|
14
|
+
* add support for nested lists. https://github.com/slonopotamus/asciidoctor-fb2/issues/2[#2]
|
15
|
+
* output uncompressed book if filename doesn't end with `.zip`
|
16
|
+
* add support for `menu` inline macro. https://github.com/slonopotamus/asciidoctor-fb2/issues/12[#12]
|
17
|
+
|
10
18
|
== 0.1.0 (2020-07-24) - @slonopotamus
|
11
19
|
|
12
|
-
*
|
20
|
+
* initial release
|
data/README.adoc
CHANGED
@@ -14,24 +14,39 @@ image:{uri-project}/workflows/CI/badge.svg?branch=master[Build Status,link={uri-
|
|
14
14
|
|
15
15
|
== Installation
|
16
16
|
|
17
|
+
{project-name} is published on RubyGems.org.
|
18
|
+
You can install the published gem using the following command:
|
19
|
+
|
17
20
|
[source,shell script]
|
18
21
|
----
|
19
|
-
$ gem install asciidoctor-fb2
|
22
|
+
$ gem install asciidoctor-fb2
|
20
23
|
----
|
21
24
|
|
22
|
-
|
25
|
+
Assuming all the required gems install properly, verify you can run the `{project-handle}` script:
|
23
26
|
|
24
27
|
[source,shell script]
|
25
28
|
----
|
26
|
-
asciidoctor-fb2
|
29
|
+
$ asciidoctor-fb2 -v
|
27
30
|
----
|
28
31
|
|
29
|
-
|
32
|
+
If you see the version of {project-name} printed, you're ready to use {project-name}.
|
30
33
|
|
31
|
-
|
32
|
-
|
34
|
+
== Usage
|
35
|
+
|
36
|
+
Converting an AsciiDoc document to FB2 is as simple as passing your document to the `{project-handle}` command.
|
37
|
+
This command should be available on your PATH if you installed the `{project-handle}` gem.
|
38
|
+
Otherwise, you can find the command in the [path]_bin_ folder of the project.
|
39
|
+
We also recommend specifying an output directory using the `-D` option flag.
|
40
|
+
|
41
|
+
[source,shell script]
|
42
|
+
----
|
43
|
+
$ asciidoctor-fb2 -D output path/to/book.adoc
|
44
|
+
----
|
45
|
+
|
46
|
+
When the script completes, you'll see the file [file]_book.fb2.zip_ appear in the [path]_output_ directory.
|
47
|
+
Open that file with an FB2 reader to view the result.
|
33
48
|
|
34
|
-
|
49
|
+
== FB2-related AsciiDoc Attributes
|
35
50
|
|
36
51
|
The metadata in the generated FB2 file is populated from attributes in the AsciiDoc document.
|
37
52
|
The names of the attributes and the metadata elements to which they map are documented in this section.
|
@@ -48,10 +63,18 @@ The names of the attributes and the metadata elements to which they map are docu
|
|
48
63
|
|Populates the content language in FB2 metadata.
|
49
64
|
|
50
65
|
|keywords
|
51
|
-
|Populates keywords list in FB2 metadata
|
66
|
+
|Populates keywords list in FB2 metadata.
|
52
67
|
The keywords should be represented as comma-separated values (CSV).
|
53
68
|
|
54
69
|
|genres
|
55
|
-
|Populates genres list in FB2 metadata
|
70
|
+
|Populates genres list in FB2 metadata.
|
56
71
|
The genres should be represented as comma-separated values (CSV).
|
72
|
+
|
73
|
+
|front-cover-image
|
74
|
+
|Specifies path to front cover image.
|
57
75
|
|===
|
76
|
+
|
77
|
+
== Development
|
78
|
+
|
79
|
+
After checking out the repo, run `bundle install` to install dependencies.
|
80
|
+
Then, run `bundle exec rake spec` to run the tests.
|
data/asciidoctor-fb2.gemspec
CHANGED
@@ -19,11 +19,11 @@ 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.
|
22
|
+
s.add_runtime_dependency 'fb2rb', '~> 0.3.0'
|
23
23
|
|
24
24
|
s.add_development_dependency 'asciidoctor-diagram', '~> 2.0'
|
25
25
|
s.add_development_dependency 'rake', '~> 13.0'
|
26
|
-
s.add_development_dependency 'rspec', '~> 3.
|
27
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
28
|
-
s.add_development_dependency 'rubocop-rspec', '~> 1.
|
26
|
+
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'
|
29
29
|
end
|
data/lib/asciidoctor_fb2.rb
CHANGED
@@ -23,7 +23,7 @@ module Asciidoctor
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# @param node [Asciidoctor::Document]
|
26
|
-
def convert_document(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
26
|
+
def convert_document(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
27
27
|
@book = FB2rb::Book.new
|
28
28
|
document_info = @book.description.document_info
|
29
29
|
title_info = @book.description.title_info
|
@@ -57,6 +57,12 @@ module Asciidoctor
|
|
57
57
|
fb2date = FB2rb::FB2Date.new(date, Date.parse(date))
|
58
58
|
title_info.date = document_info.date = fb2date
|
59
59
|
|
60
|
+
unless (cover_image = node.attr('front-cover-image')).nil?
|
61
|
+
cover_image_path = node.image_uri(cover_image)
|
62
|
+
register_binary(node, cover_image_path)
|
63
|
+
title_info.coverpage = FB2rb::Coverpage.new([%(##{cover_image_path})])
|
64
|
+
end
|
65
|
+
|
60
66
|
document_info.id = node.attr('uuid', '')
|
61
67
|
document_info.version = node.attr('revnumber')
|
62
68
|
document_info.program_used = %(Asciidoctor FB2 #{VERSION} using Asciidoctor #{node.attr('asciidoctor-version')})
|
@@ -141,6 +147,20 @@ module Asciidoctor
|
|
141
147
|
%(#{open}#{node.text}#{close})
|
142
148
|
end
|
143
149
|
|
150
|
+
# @param node [Asciidoctor::Inline]
|
151
|
+
def convert_inline_menu(node)
|
152
|
+
caret = ' <strong>›</strong> '
|
153
|
+
menu = node.attr('menu')
|
154
|
+
menuitem = node.attr('menuitem')
|
155
|
+
submenus = node.attr('submenus').join(%(</b>#{caret}<b>))
|
156
|
+
|
157
|
+
result = %(<strong>#{menu}</strong>)
|
158
|
+
result += %(#{caret}<strong>#{submenus}</strong>) unless submenus.empty?
|
159
|
+
result += %(#{caret}<strong>#{menuitem}</strong>) unless menuitem.empty?
|
160
|
+
|
161
|
+
result
|
162
|
+
end
|
163
|
+
|
144
164
|
# @param node [Asciidoctor::Inline]
|
145
165
|
def convert_inline_anchor(node) # rubocop:disable Metrics/MethodLength
|
146
166
|
case node.type
|
@@ -169,13 +189,13 @@ module Asciidoctor
|
|
169
189
|
|
170
190
|
# @param node [Asciidoctor::Inline]
|
171
191
|
def convert_inline_image(node)
|
172
|
-
image_attrs =
|
192
|
+
image_attrs = register_binary(node, node.image_uri(node.target))
|
173
193
|
%(<image #{image_attrs * ' '}/>)
|
174
194
|
end
|
175
195
|
|
176
196
|
# @param node [Asciidoctor::Block]
|
177
197
|
def convert_image(node)
|
178
|
-
image_attrs =
|
198
|
+
image_attrs = register_binary(node, node.image_uri(node.attr('target')))
|
179
199
|
image_attrs << %(title="#{node.captioned_title}") if node.title?
|
180
200
|
image_attrs << %(id="#{node.id}") if node.id
|
181
201
|
%(<p><image #{image_attrs * ' '}/></p>)
|
@@ -190,8 +210,7 @@ module Asciidoctor
|
|
190
210
|
|
191
211
|
# @param node [Asciidoctor::AbstractNode]
|
192
212
|
# @param target [String]
|
193
|
-
def
|
194
|
-
target = node.image_uri(target)
|
213
|
+
def register_binary(node, target) # rubocop:disable Metrics/MethodLength
|
195
214
|
unless Asciidoctor::Helpers.uriish?(target)
|
196
215
|
out_dir = node.attr('outdir', nil, true) || doc_option(node.document, :to_dir)
|
197
216
|
fs_path = File.join(out_dir, target)
|
@@ -212,30 +231,40 @@ module Asciidoctor
|
|
212
231
|
|
213
232
|
# @param node [Asciidoctor::Block]
|
214
233
|
def convert_admonition(node)
|
215
|
-
%(<p><strong>#{node.title || node.caption}:</strong>
|
234
|
+
lines = [%(<p><strong>#{node.title || node.caption}:</strong>
|
216
235
|
#{node.content}
|
217
|
-
</p>)
|
236
|
+
</p>)]
|
237
|
+
lines << '<empty-line/>' unless node.has_role?('last')
|
238
|
+
lines * "\n"
|
218
239
|
end
|
219
240
|
|
220
241
|
# @param node [Asciidoctor::List]
|
221
242
|
def convert_ulist(node)
|
222
243
|
lines = []
|
244
|
+
@stack ||= []
|
245
|
+
|
223
246
|
node.items.each do |item|
|
224
|
-
|
247
|
+
@stack << '•'
|
248
|
+
lines << %(<p>#{@stack * ' '} #{item.text}</p>)
|
225
249
|
lines << %(<p>#{item.content}</p>) if item.blocks?
|
250
|
+
@stack.pop
|
226
251
|
end
|
227
|
-
|
252
|
+
|
253
|
+
lines << '<empty-line/>' unless node.has_role?('last') || !@stack.empty?
|
228
254
|
lines * "\n"
|
229
255
|
end
|
230
256
|
|
231
257
|
# @param node [Asciidoctor::List]
|
232
|
-
def convert_olist(node)
|
258
|
+
def convert_olist(node) # rubocop:disable Metrics/AbcSize
|
233
259
|
lines = []
|
260
|
+
@stack ||= []
|
234
261
|
node.items.each_with_index do |item, index|
|
235
|
-
|
262
|
+
@stack << %(#{index + 1}.)
|
263
|
+
lines << %(<p>#{@stack * ' '} #{item.text}</p>)
|
236
264
|
lines << %(<p>#{item.content}</p>) if item.blocks?
|
265
|
+
@stack.pop
|
237
266
|
end
|
238
|
-
lines << '<empty-line/>' unless node.has_role?('last')
|
267
|
+
lines << '<empty-line/>' unless node.has_role?('last') || !@stack.empty?
|
239
268
|
lines * "\n"
|
240
269
|
end
|
241
270
|
|
@@ -319,7 +348,11 @@ module Asciidoctor
|
|
319
348
|
|
320
349
|
# @param output [FB2rb::Book]
|
321
350
|
def write(output, target)
|
322
|
-
|
351
|
+
if target.respond_to?(:end_with?) && target.end_with?('.zip')
|
352
|
+
output.write_compressed(target)
|
353
|
+
else
|
354
|
+
output.write_uncompressed(target)
|
355
|
+
end
|
323
356
|
end
|
324
357
|
end
|
325
358
|
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.
|
4
|
+
version: 0.2.0
|
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
|
+
date: 2020-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.3.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.
|
40
|
+
version: 0.3.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: asciidoctor-diagram
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,42 +72,42 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.
|
75
|
+
version: 3.10.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: 3.
|
82
|
+
version: 3.10.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: 0.93.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
96
|
+
version: 0.93.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop-rspec
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.
|
103
|
+
version: 1.44.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.
|
110
|
+
version: 1.44.0
|
111
111
|
description:
|
112
112
|
email:
|
113
113
|
- marat@slonopotamus.org
|
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
- !ruby/object:Gem::Version
|
156
156
|
version: '0'
|
157
157
|
requirements: []
|
158
|
-
rubygems_version: 3.1.
|
158
|
+
rubygems_version: 3.1.4
|
159
159
|
signing_key:
|
160
160
|
specification_version: 4
|
161
161
|
summary: Converts AsciiDoc documents to FB2 e-book formats
|