coradoc 1.0.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +35 -0
- data/{.docker/readme.md → README.Docker.adoc} +21 -25
- data/README.adoc +121 -0
- data/coradoc.gemspec +4 -0
- data/docker-compose.yml +14 -0
- data/exe/coradoc +5 -0
- data/exe/reverse_adoc +24 -34
- data/exe/w2a +16 -28
- data/lib/coradoc/cli.rb +105 -0
- data/lib/coradoc/converter.rb +145 -0
- data/lib/coradoc/document.rb +13 -0
- data/lib/coradoc/element/admonition.rb +5 -0
- data/lib/coradoc/element/attribute_list.rb +1 -1
- data/lib/coradoc/element/author.rb +4 -4
- data/lib/coradoc/element/bibliography.rb +24 -0
- data/lib/coradoc/element/bibliography_entry.rb +24 -0
- data/lib/coradoc/element/block/core.rb +6 -4
- data/lib/coradoc/element/block/example.rb +1 -0
- data/lib/coradoc/element/block/pass.rb +21 -0
- data/lib/coradoc/element/block/quote.rb +1 -1
- data/lib/coradoc/element/block/reviewer_comment.rb +19 -0
- data/lib/coradoc/element/block/side.rb +4 -2
- data/lib/coradoc/element/block/sourcecode.rb +1 -0
- data/lib/coradoc/element/block.rb +2 -0
- data/lib/coradoc/element/comment_block.rb +22 -0
- data/lib/coradoc/element/comment_line.rb +18 -0
- data/lib/coradoc/element/document_attributes.rb +8 -1
- data/lib/coradoc/element/header.rb +1 -1
- data/lib/coradoc/element/image/block_image.rb +8 -0
- data/lib/coradoc/element/image/core.rb +7 -4
- data/lib/coradoc/element/include.rb +18 -0
- data/lib/coradoc/element/inline/citation.rb +24 -0
- data/lib/coradoc/element/inline/cross_reference.rb +29 -8
- data/lib/coradoc/element/inline.rb +1 -0
- data/lib/coradoc/element/list/core.rb +16 -3
- data/lib/coradoc/element/list/definition.rb +3 -1
- data/lib/coradoc/element/list_item.rb +15 -5
- data/lib/coradoc/element/paragraph.rb +8 -5
- data/lib/coradoc/element/revision.rb +1 -1
- data/lib/coradoc/element/section.rb +11 -3
- data/lib/coradoc/element/table.rb +6 -1
- data/lib/coradoc/element/tag.rb +19 -0
- data/lib/coradoc/element/term.rb +21 -0
- data/lib/coradoc/element/text_element.rb +9 -1
- data/lib/coradoc/element/title.rb +2 -2
- data/lib/coradoc/generator.rb +2 -0
- data/lib/coradoc/input/adoc.rb +28 -0
- data/lib/coradoc/input/docx.rb +35 -0
- data/lib/coradoc/{reverse_adoc → input/html}/README.adoc +9 -9
- data/lib/coradoc/{reverse_adoc → input/html}/cleaner.rb +19 -6
- data/lib/coradoc/input/html/config.rb +75 -0
- data/lib/coradoc/{reverse_adoc → input/html}/converters/a.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/aside.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/audio.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/base.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/blockquote.rb +2 -2
- data/lib/coradoc/{reverse_adoc → input/html}/converters/br.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/bypass.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/code.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/div.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/dl.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/drop.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/em.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/figure.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/h.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/head.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/hr.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/ignore.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/img.rb +17 -10
- data/lib/coradoc/{reverse_adoc → input/html}/converters/li.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/mark.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/markup.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/math.rb +3 -3
- data/lib/coradoc/{reverse_adoc → input/html}/converters/ol.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/p.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/pass_through.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/pre.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/q.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/strong.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/sub.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/sup.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/table.rb +36 -11
- data/lib/coradoc/{reverse_adoc → input/html}/converters/td.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/text.rb +2 -2
- data/lib/coradoc/{reverse_adoc → input/html}/converters/th.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/tr.rb +1 -1
- data/lib/coradoc/{reverse_adoc → input/html}/converters/video.rb +1 -1
- data/lib/coradoc/input/html/converters.rb +57 -0
- data/lib/coradoc/input/html/errors.rb +12 -0
- data/lib/coradoc/{reverse_adoc → input/html}/html_converter.rb +37 -22
- data/lib/coradoc/{reverse_adoc → input/html}/plugin.rb +6 -6
- data/lib/coradoc/{reverse_adoc → input/html}/plugins/plateau.rb +62 -30
- data/lib/coradoc/{reverse_adoc → input/html}/postprocessor.rb +13 -9
- data/lib/coradoc/input/html.rb +59 -0
- data/lib/coradoc/input.rb +12 -0
- data/lib/coradoc/output/adoc.rb +17 -0
- data/lib/coradoc/output/coradoc_tree_debug.rb +19 -0
- data/lib/coradoc/output.rb +11 -0
- data/lib/coradoc/parser/asciidoc/admonition.rb +24 -0
- data/lib/coradoc/parser/asciidoc/attribute_list.rb +67 -0
- data/lib/coradoc/parser/asciidoc/base.rb +101 -13
- data/lib/coradoc/parser/asciidoc/bibliography.rb +30 -0
- data/lib/coradoc/parser/asciidoc/block.rb +82 -0
- data/lib/coradoc/parser/asciidoc/citation.rb +48 -0
- data/lib/coradoc/parser/asciidoc/content.rb +15 -120
- data/lib/coradoc/parser/asciidoc/document_attributes.rb +12 -5
- data/lib/coradoc/parser/asciidoc/header.rb +1 -4
- data/lib/coradoc/parser/asciidoc/inline.rb +72 -0
- data/lib/coradoc/parser/asciidoc/list.rb +81 -0
- data/lib/coradoc/parser/asciidoc/paragraph.rb +33 -0
- data/lib/coradoc/parser/asciidoc/section.rb +36 -31
- data/lib/coradoc/parser/asciidoc/table.rb +32 -0
- data/lib/coradoc/parser/asciidoc/term.rb +23 -0
- data/lib/coradoc/parser/base.rb +39 -4
- data/lib/coradoc/transformer.rb +353 -82
- data/lib/coradoc/util.rb +10 -0
- data/lib/coradoc/version.rb +1 -1
- data/lib/coradoc.rb +8 -4
- data/lib/reverse_adoc.rb +6 -6
- data/utils/parser_analyzer.rb +66 -0
- data/utils/round_trip.rb +37 -0
- metadata +113 -54
- data/.docker/Makefile +0 -35
- data/.docker/docker-compose.yml +0 -14
- data/Makefile +0 -1
- data/README.md +0 -73
- data/docker-compose.yml +0 -1
- data/lib/coradoc/reverse_adoc/config.rb +0 -73
- data/lib/coradoc/reverse_adoc/converters.rb +0 -53
- data/lib/coradoc/reverse_adoc/errors.rb +0 -10
- data/lib/coradoc/reverse_adoc.rb +0 -30
- /data/{.docker/Dockerfile → Dockerfile} +0 -0
- /data/lib/coradoc/{reverse_adoc → input/html}/LICENSE.txt +0 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
module Coradoc
|
4
|
+
class Converter
|
5
|
+
attr_accessor :input, :output, :config
|
6
|
+
|
7
|
+
def initialize(input = nil, output = nil, **config)
|
8
|
+
@input = input || $stdin
|
9
|
+
@output = output || $stdout
|
10
|
+
|
11
|
+
@config = {
|
12
|
+
input_options: {},
|
13
|
+
output_options: {},
|
14
|
+
}.merge(config)
|
15
|
+
|
16
|
+
yield if block_given?
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.call(*args, **kwargs, &block)
|
20
|
+
new(*args, **kwargs, &block).convert
|
21
|
+
end
|
22
|
+
|
23
|
+
def input_processor
|
24
|
+
if config[:input_processor]
|
25
|
+
Input[config[:input_processor]]
|
26
|
+
else
|
27
|
+
Input.select_processor(input)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def output_processor
|
32
|
+
if config[:output_processor]
|
33
|
+
Output[config[:output_processor]]
|
34
|
+
else
|
35
|
+
Output.select_processor(output)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def convert(data = nil)
|
40
|
+
input_id = input_processor.processor_id
|
41
|
+
output_id = output_processor.processor_id
|
42
|
+
|
43
|
+
unless data
|
44
|
+
input = self.input
|
45
|
+
input = File.open(input, "rb") if input.is_a? String
|
46
|
+
data = input.read
|
47
|
+
input_path = input.path if input.respond_to? :path
|
48
|
+
end
|
49
|
+
|
50
|
+
# Some input processors may prefer filenames
|
51
|
+
if input_processor.respond_to? :processor_wants_filenames
|
52
|
+
unless input.respond_to? :path
|
53
|
+
raise NoInputPathError,
|
54
|
+
"no input path given, but #{input_processor} wants that " +
|
55
|
+
"form. Ensure you don't read from standard input."
|
56
|
+
end
|
57
|
+
|
58
|
+
data = input.path
|
59
|
+
end
|
60
|
+
|
61
|
+
# We may need to configure destination path.
|
62
|
+
output = self.output
|
63
|
+
if output.is_a? String
|
64
|
+
FileUtils.mkdir_p(File.dirname(output))
|
65
|
+
output = File.open(output, "wb")
|
66
|
+
end
|
67
|
+
output_path = output.path if output.respond_to?(:path)
|
68
|
+
|
69
|
+
input_options = config[:input_options]
|
70
|
+
input_options = input_options.merge(destination: output_path) if output_path
|
71
|
+
input_options = input_options.merge(sourcedir: File.dirname(input_path)) if input_path
|
72
|
+
|
73
|
+
data = input_processor.processor_execute(data, input_options)
|
74
|
+
|
75
|
+
# Two options are possible at this point:
|
76
|
+
# Either we have a document we want to write to some output, or
|
77
|
+
# we have a Hash, that contains a list of files and their
|
78
|
+
# documents (where a nil key denotes the main file). Let's normalize
|
79
|
+
# those cases.
|
80
|
+
data = { nil => data } unless data.is_a? Hash
|
81
|
+
|
82
|
+
# Let's check an edge case of non-nil keys and no output path
|
83
|
+
if !output_path && data.keys.any? { |i| !i.nil? }
|
84
|
+
raise NoOutputPathError,
|
85
|
+
"no output path given, while wanting to write multiple files"
|
86
|
+
end
|
87
|
+
|
88
|
+
data = output_processor.processor_execute(data, config[:output_options])
|
89
|
+
|
90
|
+
if input_processor.respond_to?(:processor_postprocess)
|
91
|
+
data = input_processor.processor_postprocess(
|
92
|
+
data, input_options.merge(output_processor: output_id)
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Now we have all, let's write.
|
97
|
+
data.each do |filename, content|
|
98
|
+
if filename.nil?
|
99
|
+
file = output
|
100
|
+
else
|
101
|
+
dirname = File.dirname(output_path)
|
102
|
+
file = "#{dirname}/#{filename}"
|
103
|
+
FileUtils.mkdir_p(File.dirname(file))
|
104
|
+
file = File.open(file, "wb")
|
105
|
+
end
|
106
|
+
|
107
|
+
file.write(content)
|
108
|
+
file.close
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class ConverterArgumentError < ArgumentError; end
|
113
|
+
|
114
|
+
class NoInputPathError < ConverterArgumentError; end
|
115
|
+
class NoOutputPathError < ConverterArgumentError; end
|
116
|
+
class NoProcessorError < ConverterArgumentError; end
|
117
|
+
|
118
|
+
module CommonInputOutputMethods
|
119
|
+
def define(const)
|
120
|
+
@processors[const.processor_id] = const
|
121
|
+
end
|
122
|
+
|
123
|
+
def [](id)
|
124
|
+
@processors[id.to_sym]
|
125
|
+
end
|
126
|
+
|
127
|
+
def keys
|
128
|
+
@processors.keys
|
129
|
+
end
|
130
|
+
|
131
|
+
def select_processor(filename)
|
132
|
+
filename = filename.path if filename.respond_to? :path
|
133
|
+
unless filename.is_a? String
|
134
|
+
raise Converter::NoProcessorError,
|
135
|
+
"Can't find a path for #{filename}. You must manually select the processor."
|
136
|
+
end
|
137
|
+
|
138
|
+
@processors.values.find do |i|
|
139
|
+
i.processor_match?(filename)
|
140
|
+
end or raise Converter::NoProcessorError,
|
141
|
+
"You must manually select the processor for #{filename}"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/lib/coradoc/document.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
require_relative "element/base"
|
2
2
|
require_relative "element/title"
|
3
3
|
require_relative "element/block"
|
4
|
+
require_relative "element/bibliography"
|
5
|
+
require_relative "element/bibliography_entry"
|
6
|
+
require_relative "element/comment_block"
|
7
|
+
require_relative "element/comment_line"
|
8
|
+
require_relative "element/include"
|
4
9
|
require_relative "element/section"
|
5
10
|
require_relative "element/attribute"
|
6
11
|
require_relative "element/attribute_list"
|
@@ -12,12 +17,14 @@ require_relative "element/header"
|
|
12
17
|
require_relative "element/document_attributes"
|
13
18
|
require_relative "element/paragraph"
|
14
19
|
require_relative "element/table"
|
20
|
+
require_relative "element/tag"
|
15
21
|
require_relative "element/list"
|
16
22
|
require_relative "element/inline"
|
17
23
|
require_relative "element/image"
|
18
24
|
require_relative "element/audio"
|
19
25
|
require_relative "element/video"
|
20
26
|
require_relative "element/break"
|
27
|
+
require_relative "element/term"
|
21
28
|
|
22
29
|
module Coradoc
|
23
30
|
class Document
|
@@ -60,5 +67,11 @@ module Coradoc
|
|
60
67
|
@sections = options.fetch(:sections, [])
|
61
68
|
self
|
62
69
|
end
|
70
|
+
|
71
|
+
def to_adoc
|
72
|
+
Coradoc::Generator.gen_adoc(@header) +
|
73
|
+
Coradoc::Generator.gen_adoc(@document_attributes) +
|
74
|
+
Coradoc::Generator.gen_adoc(@sections)
|
75
|
+
end
|
63
76
|
end
|
64
77
|
end
|
@@ -13,10 +13,10 @@ module Coradoc
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def to_adoc
|
16
|
-
adoc = "#{@first_name}
|
17
|
-
adoc << "#{@middle_name}
|
18
|
-
adoc << @last_name.to_s
|
19
|
-
adoc << " <#{@email}
|
16
|
+
adoc = "#{@first_name}"
|
17
|
+
adoc << " #{@middle_name}" if @middle_name
|
18
|
+
adoc << " #{@last_name.to_s}"
|
19
|
+
adoc << " <#{@email}>\n" if @email
|
20
20
|
adoc
|
21
21
|
end
|
22
22
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
class Bibliography < Base
|
4
|
+
attr_accessor :id, :title, :entries
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
@id = options.fetch(:id, nil)
|
8
|
+
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
9
|
+
@title = options.fetch(:title, nil)
|
10
|
+
@entries = options.fetch(:entries,nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_adoc
|
14
|
+
adoc = "#{gen_anchor}\n"
|
15
|
+
adoc << "[bibliography]"
|
16
|
+
adoc << "== #{@title}\n\n"
|
17
|
+
@entries.each do |entry|
|
18
|
+
adoc << "#{entry.to_adoc}\n"
|
19
|
+
end
|
20
|
+
adoc
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
class BibliographyEntry < Base
|
4
|
+
attr_accessor :anchor_name, :document_id, :ref_text, :line_break
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
@anchor_name = options.fetch(:anchor_name, nil)
|
8
|
+
@document_id = options.fetch(:document_id, nil)
|
9
|
+
@ref_text = options.fetch(:ref_text, nil)
|
10
|
+
@line_break = options.fetch(:line_break, "")
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_adoc
|
14
|
+
text = Coradoc::Generator.gen_adoc(@ref_text) if @ref_text
|
15
|
+
adoc = "* [[[#{@anchor_name}"
|
16
|
+
adoc << ",#{@document_id}" if @document_id
|
17
|
+
adoc << "]]]"
|
18
|
+
adoc << "#{text}" if @ref_text
|
19
|
+
adoc << @line_break
|
20
|
+
adoc
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -10,13 +10,13 @@ module Coradoc
|
|
10
10
|
|
11
11
|
def initialize(title, options = {})
|
12
12
|
@title = title
|
13
|
-
@
|
13
|
+
@id = options.fetch(:id, nil)
|
14
|
+
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
14
15
|
@type_str = options.fetch(:type, nil)
|
15
|
-
@delimiter = options.fetch(:delimiter, "")
|
16
16
|
@attributes = options.fetch(:attributes, AttributeList.new)
|
17
|
+
@delimiter = options.fetch(:delimiter, "")
|
17
18
|
@lang = options.fetch(:lang, nil)
|
18
|
-
@
|
19
|
-
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
19
|
+
@lines = options.fetch(:lines, [])
|
20
20
|
end
|
21
21
|
|
22
22
|
def type
|
@@ -37,6 +37,7 @@ module Coradoc
|
|
37
37
|
def gen_attributes
|
38
38
|
attrs = @attributes.to_adoc(false)
|
39
39
|
return "#{attrs}\n" if !attrs.empty?
|
40
|
+
|
40
41
|
""
|
41
42
|
end
|
42
43
|
|
@@ -65,6 +66,7 @@ module Coradoc
|
|
65
66
|
"----" => :source,
|
66
67
|
"====" => :example,
|
67
68
|
"...." => :literal,
|
69
|
+
"++++" => :pass,
|
68
70
|
}
|
69
71
|
end
|
70
72
|
end
|
@@ -8,6 +8,7 @@ module Coradoc
|
|
8
8
|
@title = title
|
9
9
|
@id = options.fetch(:id, nil)
|
10
10
|
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
11
|
+
@attributes = options.fetch(:attributes, AttributeList.new)
|
11
12
|
@lines = options.fetch(:lines, [])
|
12
13
|
@delimiter_char = "="
|
13
14
|
@delimiter_len = options.fetch(:delimiter_len, 4)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
module Block
|
4
|
+
class Pass < Core
|
5
|
+
def initialize(options = {})
|
6
|
+
@id = options.fetch(:id, nil)
|
7
|
+
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
8
|
+
@title = options.fetch(:title, "")
|
9
|
+
@attributes = options.fetch(:attributes, AttributeList.new)
|
10
|
+
@delimiter_char = "+"
|
11
|
+
@delimiter_len = options.fetch(:delimiter_len, 4)
|
12
|
+
@lines = options.fetch(:lines, [])
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_adoc
|
16
|
+
"\n\n#{gen_anchor}#{gen_title}#{gen_attributes}#{gen_delimiter}\n" << gen_lines << "\n#{gen_delimiter}\n\n"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
module Block
|
4
|
+
class ReviewerComment < Core
|
5
|
+
def initialize(options = {})
|
6
|
+
@title = options.fetch(:title, "")
|
7
|
+
@attributes = options.fetch(:attributes, AttributeList.new)
|
8
|
+
@delimiter_char = "*"
|
9
|
+
@delimiter_len = options.fetch(:delimiter_len, 4)
|
10
|
+
@lines = options.fetch(:lines, [])
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_adoc
|
14
|
+
"\n\n#{gen_title}#{gen_attributes}#{gen_delimiter}\n" << gen_lines << "\n#{gen_delimiter}\n\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -3,13 +3,15 @@ module Coradoc
|
|
3
3
|
module Block
|
4
4
|
class Side < Core
|
5
5
|
def initialize(options = {})
|
6
|
-
@
|
6
|
+
@title = options.fetch(:title, "")
|
7
|
+
@attributes = options.fetch(:attributes, AttributeList.new)
|
7
8
|
@delimiter_char = "*"
|
8
9
|
@delimiter_len = options.fetch(:delimiter_len, 4)
|
10
|
+
@lines = options.fetch(:lines, [])
|
9
11
|
end
|
10
12
|
|
11
13
|
def to_adoc
|
12
|
-
"\n\n#{gen_delimiter}" << gen_lines << "\n#{gen_delimiter}\n\n"
|
14
|
+
"\n\n#{gen_title}#{gen_attributes}#{gen_delimiter}\n" << gen_lines << "\n#{gen_delimiter}\n\n"
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -6,6 +6,7 @@ module Coradoc
|
|
6
6
|
@id = options.fetch(:id, nil)
|
7
7
|
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
8
8
|
@lang = options.fetch(:lang, "")
|
9
|
+
@attributes = options.fetch(:attributes, AttributeList.new)
|
9
10
|
@lines = options.fetch(:lines, [])
|
10
11
|
@delimiter_char = "-"
|
11
12
|
@delimiter_len = options.fetch(:delimiter_len, 4)
|
@@ -9,5 +9,7 @@ require_relative "block/core"
|
|
9
9
|
require_relative "block/example"
|
10
10
|
require_relative "block/literal"
|
11
11
|
require_relative "block/quote"
|
12
|
+
require_relative "block/pass"
|
12
13
|
require_relative "block/side"
|
13
14
|
require_relative "block/sourcecode"
|
15
|
+
require_relative "block/reviewer_comment"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
module Comment
|
4
|
+
class Block < Base
|
5
|
+
attr_accessor :text
|
6
|
+
|
7
|
+
def initialize(text, options = {})
|
8
|
+
@text = text
|
9
|
+
@line_break = options.fetch(:line_break, "\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_adoc
|
13
|
+
<<~ADOC.chomp
|
14
|
+
////
|
15
|
+
#{@text}
|
16
|
+
////#{@line_break}
|
17
|
+
ADOC
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
module Comment
|
4
|
+
class Line < Base
|
5
|
+
attr_accessor :text
|
6
|
+
|
7
|
+
def initialize(text, options = {})
|
8
|
+
@text = text
|
9
|
+
@line_break = options.fetch(:line_break, "\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_adoc
|
13
|
+
"// #{@text}#{@line_break}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -11,10 +11,17 @@ module Coradoc
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def to_hash
|
14
|
-
data.to_h do |attribute|
|
14
|
+
@data.to_h do |attribute|
|
15
15
|
[attribute.key.to_s, attribute.value.to_s.gsub("'", "")]
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
def to_adoc
|
20
|
+
to_hash.map do |key, value|
|
21
|
+
v = value.to_s.empty? ? "" : " #{value}"
|
22
|
+
":#{key}:#{v}\n"
|
23
|
+
end.join + "\n"
|
24
|
+
end
|
18
25
|
end
|
19
26
|
end
|
20
27
|
end
|
@@ -7,6 +7,14 @@ module Coradoc
|
|
7
7
|
@colons = "::"
|
8
8
|
end
|
9
9
|
|
10
|
+
def to_adoc
|
11
|
+
missing = "// FIXME: Missing image: #{@annotate_missing}\n" if @annotate_missing
|
12
|
+
anchor = @anchor.nil? ? "" : "#{@anchor.to_adoc}\n"
|
13
|
+
title = ".#{@title}\n" unless @title.to_s.empty?
|
14
|
+
attrs = @attributes.to_adoc
|
15
|
+
[missing, anchor, title, "image", @colons, @src, attrs, @line_break].join("")
|
16
|
+
end
|
17
|
+
|
10
18
|
def validate_named
|
11
19
|
@attributes.validate_named(VALIDATORS_NAMED, VALIDATORS_NAMED_BLOCK)
|
12
20
|
end
|
@@ -9,21 +9,24 @@ module Coradoc
|
|
9
9
|
def initialize(title, id, src, options = {})
|
10
10
|
@title = title
|
11
11
|
@id = id
|
12
|
-
@anchor = @id.nil? ? nil :
|
12
|
+
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
13
13
|
@src = src
|
14
14
|
@attributes = options.fetch(:attributes, AttributeList.new)
|
15
|
-
@
|
15
|
+
@annotate_missing = options.fetch(:annotate_missing, nil)
|
16
|
+
@title = options.fetch(:title, nil) unless @title
|
16
17
|
if @attributes.any?
|
17
18
|
@attributes.validate_positional(VALIDATORS_POSITIONAL)
|
18
19
|
@attributes.validate_named(VALIDATORS_NAMED)
|
19
20
|
end
|
21
|
+
@line_break = options.fetch(:line_break, "")
|
20
22
|
end
|
21
23
|
|
22
24
|
def to_adoc
|
25
|
+
missing = "// FIXME: Missing image: #{@annotate_missing}\n" if @annotate_missing
|
23
26
|
anchor = @anchor.nil? ? "" : "#{@anchor.to_adoc}\n"
|
24
27
|
title = ".#{@title}\n" unless @title.to_s.empty?
|
25
|
-
attrs = @
|
26
|
-
[anchor, title, "image", @colons, @src, attrs].join("")
|
28
|
+
attrs = @attributes_macro.to_adoc
|
29
|
+
[missing, anchor, title, "image", @colons, @src, attrs, @line_break].join("")
|
27
30
|
end
|
28
31
|
|
29
32
|
extend AttributeList::Matchers
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
class Include
|
4
|
+
attr_accessor :text
|
5
|
+
|
6
|
+
def initialize(path, options = {})
|
7
|
+
@path = path
|
8
|
+
@attributes = options.fetch(:attributes, AttributeList.new)
|
9
|
+
@line_break = options.fetch(:line_break, "\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_adoc
|
13
|
+
attrs = @attributes.to_adoc(true)
|
14
|
+
"include::#{@path}#{attrs}#{@line_break}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Coradoc
|
2
|
+
module Element
|
3
|
+
module Inline
|
4
|
+
class Citation < Base
|
5
|
+
attr_accessor :cross_reference, :comment
|
6
|
+
|
7
|
+
declare_children :cross_reference, :comment
|
8
|
+
|
9
|
+
def initialize(opts = {})
|
10
|
+
@cross_reference = opts.fetch(:cross_reference, nil)
|
11
|
+
@comment = opts.fetch(:comment, nil)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_adoc
|
15
|
+
adoc = "[.source]\n"
|
16
|
+
adoc << @cross_reference.to_adoc if @cross_reference
|
17
|
+
adoc << "\n" if @cross_reference && !@comment
|
18
|
+
adoc << Coradoc::Generator.gen_adoc(@comment) if @comment
|
19
|
+
adoc
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -2,21 +2,42 @@ module Coradoc
|
|
2
2
|
module Element
|
3
3
|
module Inline
|
4
4
|
class CrossReference < Base
|
5
|
-
attr_accessor :href, :
|
5
|
+
attr_accessor :href, :args
|
6
6
|
|
7
|
-
declare_children :href, :
|
7
|
+
declare_children :href, :args
|
8
8
|
|
9
|
-
def initialize(href,
|
9
|
+
def initialize(href, args = nil)
|
10
10
|
@href = href
|
11
|
-
@
|
11
|
+
@args = args
|
12
|
+
@args = nil if @args == ""
|
13
|
+
@args = [@args] unless @args.is_a?(Array) || @args == nil
|
12
14
|
end
|
13
15
|
|
14
16
|
def to_adoc
|
15
|
-
if @
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
if @args
|
18
|
+
args = @args.map{|a|
|
19
|
+
Coradoc::Generator.gen_adoc(a)}.join(',')
|
20
|
+
if args.empty?
|
21
|
+
return "<<#{@href}>>"
|
22
|
+
else
|
23
|
+
return "<<#{@href},#{args}>>"
|
24
|
+
end
|
19
25
|
end
|
26
|
+
"<<#{@href}>>"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class CrossReferenceArg < Base
|
31
|
+
attr_accessor :key, :delimiter, :value
|
32
|
+
|
33
|
+
def initialize(key, delimiter, value)
|
34
|
+
@key = key
|
35
|
+
@delimiter = delimiter
|
36
|
+
@value = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_adoc
|
40
|
+
[@key,@delimiter,@value].join
|
20
41
|
end
|
21
42
|
end
|
22
43
|
end
|
@@ -8,6 +8,7 @@ end
|
|
8
8
|
require_relative "inline/anchor"
|
9
9
|
require_relative "inline/bold"
|
10
10
|
require_relative "inline/cross_reference"
|
11
|
+
require_relative "inline/citation"
|
11
12
|
require_relative "inline/hard_line_break"
|
12
13
|
require_relative "inline/highlight"
|
13
14
|
require_relative "inline/italic"
|
@@ -14,7 +14,15 @@ module Coradoc
|
|
14
14
|
@items = [@items] unless @items.is_a?(Array)
|
15
15
|
@id = options.fetch(:id, nil)
|
16
16
|
@anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
|
17
|
-
@ol_count = options.fetch(:ol_count,
|
17
|
+
@ol_count = options.fetch(:ol_count, nil)
|
18
|
+
if @ol_count.nil?
|
19
|
+
m = @items.select do |i|
|
20
|
+
i.is_a?(Coradoc::Element::ListItem) &&
|
21
|
+
!i.marker.nil?
|
22
|
+
end.first&.marker
|
23
|
+
@ol_count = m.size if m.is_a?(String)
|
24
|
+
end
|
25
|
+
@ol_count = 1 if @ol_count.nil?
|
18
26
|
@attrs = options.fetch(:attrs, AttributeList.new)
|
19
27
|
end
|
20
28
|
|
@@ -25,8 +33,13 @@ module Coradoc
|
|
25
33
|
@items.each do |item|
|
26
34
|
c = Coradoc::Generator.gen_adoc(item)
|
27
35
|
if !c.empty?
|
28
|
-
|
29
|
-
|
36
|
+
# If there's a list inside a list directly, we want to
|
37
|
+
# skip adding an empty list item.
|
38
|
+
# See: https://github.com/metanorma/coradoc/issues/96
|
39
|
+
unless item.is_a? List::Core
|
40
|
+
content << prefix.to_s
|
41
|
+
content << " " if c[0] != " "
|
42
|
+
end
|
30
43
|
content << c
|
31
44
|
end
|
32
45
|
end
|