coradoc 2.0.26 → 2.0.28
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/lib/coradoc/cli.rb +5 -5
- data/lib/coradoc/configurable.rb +6 -3
- data/lib/coradoc/coradoc.rb +2 -2
- data/lib/coradoc/core_model/abstract_block.rb +11 -0
- data/lib/coradoc/core_model/attribute_reference_resolver.rb +19 -7
- data/lib/coradoc/core_model/base.rb +52 -2
- data/lib/coradoc/core_model/comment_line.rb +1 -1
- data/lib/coradoc/core_model/definition_item.rb +22 -1
- data/lib/coradoc/core_model/horizontal_rule_block.rb +4 -0
- data/lib/coradoc/core_model/include_level_offset.rb +1 -1
- data/lib/coradoc/core_model/include_options.rb +1 -0
- data/lib/coradoc/core_model/inline_content.rb +1 -0
- data/lib/coradoc/core_model/list_block.rb +1 -1
- data/lib/coradoc/core_model/listing_block.rb +4 -0
- data/lib/coradoc/core_model/literal_block.rb +4 -0
- data/lib/coradoc/core_model/partintro_block.rb +11 -0
- data/lib/coradoc/core_model/pass_block.rb +4 -0
- data/lib/coradoc/core_model/source_block.rb +4 -0
- data/lib/coradoc/core_model/stem_block.rb +4 -0
- data/lib/coradoc/core_model.rb +2 -0
- data/lib/coradoc/dispatch.rb +1 -0
- data/lib/coradoc/errors.rb +1 -1
- data/lib/coradoc/format_catalog.rb +19 -0
- data/lib/coradoc/hooks.rb +1 -1
- data/lib/coradoc/include_selectors/level_offset.rb +0 -2
- data/lib/coradoc/include_selectors/lines.rb +2 -2
- data/lib/coradoc/include_selectors/tags.rb +2 -4
- data/lib/coradoc/introspection/element_counter.rb +2 -2
- data/lib/coradoc/link_rewriter/visitor.rb +5 -14
- data/lib/coradoc/pipeline.rb +11 -9
- data/lib/coradoc/query.rb +8 -8
- data/lib/coradoc/registry.rb +6 -6
- data/lib/coradoc/resolve_includes.rb +2 -2
- data/lib/coradoc/validation.rb +4 -4
- data/lib/coradoc/version.rb +1 -1
- data/lib/coradoc.rb +1 -1
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6f0dbc8feba7133bc83baf88a6458774f364f7266b79625a0afc50434beeac89
|
|
4
|
+
data.tar.gz: f4fe999b18666604d2b615545acb073e1b6f74d7b26c3ff8fa8fd403ee45ec5d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c4c0f7a479cfdf622faa4a26cad085c60b4e943d3ba30348e5d0426ebb10c9fbd417ceb5d069225f1e72dd9ff0960ca5e5304572d6d6cf4018236a579c4c391c
|
|
7
|
+
data.tar.gz: 6e4e649b83732a5cbf77c1edf16c70fb04a167d2d3b7ad3c3c657a029ebea5b079408dc78641f432241ac8737afb2a46fc1d3b6e2113c01075c332c2efadde9e
|
data/lib/coradoc/cli.rb
CHANGED
|
@@ -23,15 +23,15 @@ module Coradoc
|
|
|
23
23
|
option :section_number_levels, desc: 'Section numbering depth (1-6)', type: :numeric, default: 3
|
|
24
24
|
option :lang, desc: 'Document language code', type: :string, default: 'en'
|
|
25
25
|
option :resolve_includes, desc: 'Resolve include:: directives inline (default: leave as link nodes)',
|
|
26
|
-
|
|
26
|
+
type: :boolean, default: false
|
|
27
27
|
option :base_dir, desc: 'Base directory for include resolution (default: dirname of FILE)',
|
|
28
|
-
|
|
28
|
+
type: :string
|
|
29
29
|
option :missing_include, desc: 'Policy for missing includes: error, warn, silent, passthrough',
|
|
30
|
-
|
|
30
|
+
type: :string, default: 'error'
|
|
31
31
|
option :max_include_depth, desc: 'Maximum include nesting depth', type: :numeric,
|
|
32
|
-
|
|
32
|
+
default: 64
|
|
33
33
|
option :allow_unsafe_includes, desc: 'Disable path-traversal protection (asciidoctor :unsafe mode)',
|
|
34
|
-
|
|
34
|
+
type: :boolean, default: false
|
|
35
35
|
def convert(file)
|
|
36
36
|
source_format = resolve_format(file, :from)
|
|
37
37
|
target_format = options[:to] ? Coradoc.normalize_format(options[:to]) : Coradoc.resolve_output_format(options[:output])
|
data/lib/coradoc/configurable.rb
CHANGED
|
@@ -99,7 +99,10 @@ module Coradoc
|
|
|
99
99
|
def apply_options(options)
|
|
100
100
|
options.each do |key, value|
|
|
101
101
|
setter = "#{key}="
|
|
102
|
-
|
|
102
|
+
# Use public_send (not instance_variable_set) so we route
|
|
103
|
+
# through the public setter method — encapsulation is
|
|
104
|
+
# preserved and any setter-side validation runs.
|
|
105
|
+
public_send(setter, value) if public_methods.include?(setter.to_sym)
|
|
103
106
|
end
|
|
104
107
|
end
|
|
105
108
|
end
|
|
@@ -521,7 +524,7 @@ module Coradoc
|
|
|
521
524
|
#
|
|
522
525
|
# @yield [Configuration]
|
|
523
526
|
# @return [void]
|
|
524
|
-
def self.configure(&
|
|
525
|
-
Configurable.configure(&
|
|
527
|
+
def self.configure(&)
|
|
528
|
+
Configurable.configure(&) if block_given?
|
|
526
529
|
end
|
|
527
530
|
end
|
data/lib/coradoc/coradoc.rb
CHANGED
|
@@ -56,8 +56,8 @@ module Coradoc
|
|
|
56
56
|
|
|
57
57
|
def registry = FormatCatalog.registry
|
|
58
58
|
|
|
59
|
-
def register_format(format_name, format_module, **
|
|
60
|
-
FormatCatalog.register_format(format_name, format_module, **
|
|
59
|
+
def register_format(format_name, format_module, **)
|
|
60
|
+
FormatCatalog.register_format(format_name, format_module, **)
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def get_format(format_name) = FormatCatalog.get_format(format_name)
|
|
@@ -61,7 +61,7 @@ module Coradoc
|
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def rebuild_children(node)
|
|
64
|
-
return node unless node.
|
|
64
|
+
return node unless node.is_a?(CoreModel::HasChildren)
|
|
65
65
|
|
|
66
66
|
original = node.children
|
|
67
67
|
return node if original.nil?
|
|
@@ -79,23 +79,27 @@ module Coradoc
|
|
|
79
79
|
original = node.public_send(attr_name)
|
|
80
80
|
return node if original.nil?
|
|
81
81
|
|
|
82
|
-
updated = original.is_a?(Array)
|
|
83
|
-
original.map { |c| visit(c) }
|
|
82
|
+
updated = if original.is_a?(Array)
|
|
83
|
+
original.map { |c| visit(c) }
|
|
84
|
+
else
|
|
84
85
|
visit(original)
|
|
86
|
+
end
|
|
85
87
|
return node if updated == original
|
|
86
88
|
|
|
87
89
|
node.dup.tap { |copy| copy.public_send("#{attr_name}=", updated) }
|
|
88
90
|
end
|
|
89
91
|
|
|
90
92
|
def rebuild_block(node)
|
|
91
|
-
return node unless node.
|
|
93
|
+
return node unless node.is_a?(CoreModel::HasChildren)
|
|
92
94
|
|
|
93
95
|
original_children = node.children
|
|
94
96
|
return node if original_children.nil?
|
|
95
97
|
|
|
96
|
-
updated_children = original_children.is_a?(Array)
|
|
97
|
-
original_children.map { |c| visit(c) }
|
|
98
|
+
updated_children = if original_children.is_a?(Array)
|
|
99
|
+
original_children.map { |c| visit(c) }
|
|
100
|
+
else
|
|
98
101
|
visit(original_children)
|
|
102
|
+
end
|
|
99
103
|
|
|
100
104
|
if inline_resolvable?(node)
|
|
101
105
|
original_content = node.content
|
|
@@ -113,7 +117,15 @@ module Coradoc
|
|
|
113
117
|
end
|
|
114
118
|
|
|
115
119
|
def inline_resolvable?(node)
|
|
116
|
-
|
|
120
|
+
# Capability check: nodes that include ChildrenContent expose a
|
|
121
|
+
# `content` attribute alongside `children`. We resolve attribute
|
|
122
|
+
# references only when content is a String (plain-text inline
|
|
123
|
+
# content). Using is_a?(ChildrenContent) instead of
|
|
124
|
+
# respond_to?(:content) catches type drift early: if a node
|
|
125
|
+
# acquires string content without including ChildrenContent,
|
|
126
|
+
# this method returns false (no resolution) rather than
|
|
127
|
+
# silently resolving on a mis-typed node.
|
|
128
|
+
node.is_a?(CoreModel::ChildrenContent) && node.content.is_a?(String)
|
|
117
129
|
end
|
|
118
130
|
|
|
119
131
|
# Resolve attribute references inside a flat content string.
|
|
@@ -41,6 +41,13 @@ module Coradoc
|
|
|
41
41
|
# @return [Array<MetadataEntry>] additional metadata entries
|
|
42
42
|
attribute :metadata_entries, MetadataEntry, collection: true
|
|
43
43
|
|
|
44
|
+
# 1-indexed source line where this element begins, when known.
|
|
45
|
+
# Populated by format transformers (e.g., AsciiDoc's SourceLineExtractor)
|
|
46
|
+
# so consumers can map AST nodes back to the source text. nil for
|
|
47
|
+
# programmatically constructed models. Single source of truth across
|
|
48
|
+
# all CoreModel types (Issue 1, STATUS-2026-06-28).
|
|
49
|
+
attribute :source_line, :integer
|
|
50
|
+
|
|
44
51
|
# Construct an instance and yield it for in-place mutation.
|
|
45
52
|
#
|
|
46
53
|
# This is the programmatic-construction entry point for CoreModel
|
|
@@ -140,7 +147,7 @@ module Coradoc
|
|
|
140
147
|
end
|
|
141
148
|
|
|
142
149
|
def flat_text
|
|
143
|
-
|
|
150
|
+
''
|
|
144
151
|
end
|
|
145
152
|
|
|
146
153
|
# Flatten this element to a plain-text string.
|
|
@@ -153,7 +160,50 @@ module Coradoc
|
|
|
153
160
|
#
|
|
154
161
|
# @return [String]
|
|
155
162
|
def flat_text
|
|
156
|
-
|
|
163
|
+
''
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# True when this node counts as real body content for empty-body
|
|
167
|
+
# detection and similar structural queries. Default is true;
|
|
168
|
+
# ephemeral and metadata nodes override to false.
|
|
169
|
+
#
|
|
170
|
+
# Override sites: CommentBlock, CommentLine, FrontmatterBlock.
|
|
171
|
+
# Adding a new "skip me" type = overriding this method locally —
|
|
172
|
+
# no central walker to edit (OCP).
|
|
173
|
+
#
|
|
174
|
+
# @return [Boolean]
|
|
175
|
+
def body_content?
|
|
176
|
+
true
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# True when this node's text content should be processed by text
|
|
180
|
+
# consumers (link rewriters, spell checkers, search indexers, etc.).
|
|
181
|
+
# Default delegates to +body_content?+ — ephemeral/metadata nodes
|
|
182
|
+
# (CommentBlock, FrontmatterBlock, …) are not prose because they
|
|
183
|
+
# are not body content. Verbatim block subclasses (SourceBlock,
|
|
184
|
+
# ListingBlock, LiteralBlock, PassBlock, StemBlock) override this
|
|
185
|
+
# to false because their text is literal, not subject to
|
|
186
|
+
# substitution or spell-checking.
|
|
187
|
+
#
|
|
188
|
+
# Override sites for verbatim: SourceBlock, ListingBlock,
|
|
189
|
+
# LiteralBlock, PassBlock, StemBlock, HorizontalRuleBlock.
|
|
190
|
+
#
|
|
191
|
+
# Distinct from +body_content?+: a SourceBlock IS body content
|
|
192
|
+
# (the doc has real substance) but its text is not prose (a link
|
|
193
|
+
# shaped string inside source is literal text, not a link).
|
|
194
|
+
#
|
|
195
|
+
# @return [Boolean]
|
|
196
|
+
def prose?
|
|
197
|
+
body_content?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# True when this node is structurally present but carries no
|
|
201
|
+
# visible characters (e.g., a paragraph whose text strips to
|
|
202
|
+
# empty). Default is false; inline content and paragraphs override.
|
|
203
|
+
#
|
|
204
|
+
# @return [Boolean]
|
|
205
|
+
def whitespace_only?
|
|
206
|
+
false
|
|
157
207
|
end
|
|
158
208
|
|
|
159
209
|
# Accept a visitor to traverse this element
|
|
@@ -3,14 +3,35 @@
|
|
|
3
3
|
module Coradoc
|
|
4
4
|
module CoreModel
|
|
5
5
|
class DefinitionItem < Base
|
|
6
|
+
# Primary term (first term in source order). For multi-term `<dt>`'s
|
|
7
|
+
# (AsciiDoc `term1::\nterm2::`), use {#terms} which carries the
|
|
8
|
+
# full list. `term` is kept as the singular accessor for legacy
|
|
9
|
+
# consumers; new consumers should prefer {#terms}.
|
|
6
10
|
attribute :term, :string
|
|
11
|
+
|
|
12
|
+
# All terms on this `<dt>`. Single-element for the common case;
|
|
13
|
+
# multi-element for shared-`<dd>` AsciiDoc forms like
|
|
14
|
+
# term1::
|
|
15
|
+
# term2::
|
|
16
|
+
# shared definition
|
|
17
|
+
# Order matches source order. Renderers emit one `<dt>` per entry.
|
|
18
|
+
attribute :terms, :string, collection: true, default: []
|
|
19
|
+
|
|
7
20
|
attribute :definitions, :string, collection: true
|
|
8
21
|
attribute :nested, DefinitionList
|
|
22
|
+
# `+`-continuation blocks attached to this dd in AsciiDoc source.
|
|
23
|
+
# Each entry is a CoreModel block (ParagraphBlock, AdmonitionBlock,
|
|
24
|
+
# etc.) that followed the dd after a `+` line — rendered as
|
|
25
|
+
# additional children of the dd.
|
|
26
|
+
attribute :attached_children, Base, collection: true, initialize_empty: true
|
|
9
27
|
|
|
10
28
|
def initialize(args = {})
|
|
11
29
|
@term_children = args.delete(:term_children) || []
|
|
12
30
|
@definition_children = args.delete(:definition_children) || []
|
|
13
31
|
super
|
|
32
|
+
# Backward-compat: if caller passed only `term:` (no `terms:`),
|
|
33
|
+
# seed the collection so #terms is always consistent with #term.
|
|
34
|
+
self.terms = [term].compact if terms.empty? && !term.to_s.empty?
|
|
14
35
|
end
|
|
15
36
|
|
|
16
37
|
attr_reader :term_children, :definition_children
|
|
@@ -40,7 +61,7 @@ module Coradoc
|
|
|
40
61
|
private
|
|
41
62
|
|
|
42
63
|
def comparable_attributes
|
|
43
|
-
super + %i[term definitions nested term_children definition_children]
|
|
64
|
+
super + %i[term terms definitions nested term_children definition_children attached_children]
|
|
44
65
|
end
|
|
45
66
|
end
|
|
46
67
|
end
|
|
@@ -58,7 +58,7 @@ module Coradoc
|
|
|
58
58
|
private
|
|
59
59
|
|
|
60
60
|
def matched_offset(trimmed)
|
|
61
|
-
|
|
61
|
+
/\A(?<sign>[+-]?)(?<digits>\d+)\z/.match(trimmed) do |m|
|
|
62
62
|
digits = m[:digits].to_i
|
|
63
63
|
signed = m[:sign] == '-' ? -digits : digits
|
|
64
64
|
mode = m[:sign].empty? ? 'absolute' : 'relative'
|
|
@@ -119,7 +119,7 @@ module Coradoc
|
|
|
119
119
|
# end
|
|
120
120
|
#
|
|
121
121
|
# Returns self for chaining at the list level.
|
|
122
|
-
def add_item(marker:
|
|
122
|
+
def add_item(marker: marker_type == 'ordered' ? '.' : '*')
|
|
123
123
|
item = ListItem.build(marker: marker) { |li| yield li if block_given? }
|
|
124
124
|
self.items = Array(items) + [item]
|
|
125
125
|
self
|
data/lib/coradoc/core_model.rb
CHANGED
|
@@ -69,6 +69,8 @@ module Coradoc
|
|
|
69
69
|
autoload :ExampleBlock, "#{__dir__}/core_model/example_block"
|
|
70
70
|
autoload :QuoteBlock, "#{__dir__}/core_model/quote_block"
|
|
71
71
|
autoload :SidebarBlock, "#{__dir__}/core_model/sidebar_block"
|
|
72
|
+
autoload :AbstractBlock, "#{__dir__}/core_model/abstract_block"
|
|
73
|
+
autoload :PartintroBlock, "#{__dir__}/core_model/partintro_block"
|
|
72
74
|
autoload :LiteralBlock, "#{__dir__}/core_model/literal_block"
|
|
73
75
|
autoload :PassBlock, "#{__dir__}/core_model/pass_block"
|
|
74
76
|
autoload :StemBlock, "#{__dir__}/core_model/stem_block"
|
data/lib/coradoc/dispatch.rb
CHANGED
data/lib/coradoc/errors.rb
CHANGED
|
@@ -360,7 +360,7 @@ module Coradoc
|
|
|
360
360
|
private
|
|
361
361
|
|
|
362
362
|
def build_message
|
|
363
|
-
msg = "Format '#{requested_format}' is not
|
|
363
|
+
msg = "Format '#{requested_format}' is not registered"
|
|
364
364
|
msg += ". Available formats: #{available_formats.join(', ')}" if available_formats.any?
|
|
365
365
|
msg
|
|
366
366
|
end
|
|
@@ -18,6 +18,25 @@ module Coradoc
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def get_format(format_name)
|
|
21
|
+
registry.get(format_name) || lazy_load_format(format_name)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# If a format gem (e.g. coradoc-adoc) is in the bundle but has not
|
|
25
|
+
# been required yet, attempt to require it on first lookup. This
|
|
26
|
+
# removes the friction where `Coradoc.parse(text, format: :asciidoc)`
|
|
27
|
+
# blows up just because the user only wrote `require "coradoc"` and
|
|
28
|
+
# never explicitly required `coradoc/asciidoc`. The require is for
|
|
29
|
+
# an external gem, not internal library code, so it stays within
|
|
30
|
+
# the autoload-over-require_relative rule.
|
|
31
|
+
def lazy_load_format(format_name)
|
|
32
|
+
return nil if format_name.nil? || format_name.to_s.empty?
|
|
33
|
+
|
|
34
|
+
begin
|
|
35
|
+
require "coradoc/#{format_name}"
|
|
36
|
+
rescue LoadError
|
|
37
|
+
return nil
|
|
38
|
+
end
|
|
39
|
+
|
|
21
40
|
registry.get(format_name)
|
|
22
41
|
end
|
|
23
42
|
|
data/lib/coradoc/hooks.rb
CHANGED
|
@@ -89,7 +89,7 @@ module Coradoc
|
|
|
89
89
|
modified_args = invoke(hook_point, *args, **kwargs)
|
|
90
90
|
result = yield(*modified_args)
|
|
91
91
|
|
|
92
|
-
after_point = "after_#{hook_point.to_s.sub('before_', '')}"
|
|
92
|
+
after_point = :"after_#{hook_point.to_s.sub('before_', '')}"
|
|
93
93
|
result = invoke(after_point, result, **kwargs) if HOOK_POINTS.key?(after_point)
|
|
94
94
|
|
|
95
95
|
result
|
|
@@ -11,12 +11,12 @@ module Coradoc
|
|
|
11
11
|
# Out-of-bounds clamps gracefully (SPEC 3.4). One-based indexing
|
|
12
12
|
# (asciidoctor convention).
|
|
13
13
|
module Lines
|
|
14
|
-
SPEC_PART =
|
|
14
|
+
SPEC_PART = /
|
|
15
15
|
\A
|
|
16
16
|
(?<start>\d+)
|
|
17
17
|
(?:\.\.(?<finish>\d+))?
|
|
18
18
|
\z
|
|
19
|
-
|
|
19
|
+
/x
|
|
20
20
|
|
|
21
21
|
# @param text [String]
|
|
22
22
|
# @param options [Coradoc::CoreModel::IncludeOptions]
|
|
@@ -17,8 +17,8 @@ module Coradoc
|
|
|
17
17
|
# Markers may appear on their own line; they must be the first
|
|
18
18
|
# non-whitespace token on that line (asciidoctor convention).
|
|
19
19
|
module Tags
|
|
20
|
-
MARKER_OPEN =
|
|
21
|
-
MARKER_CLOSE =
|
|
20
|
+
MARKER_OPEN = %r{\A[[:space:]]*(?://+|#+)[[:space:]]*tag::([^\[\]]+)\[[[:space:]]*\]}
|
|
21
|
+
MARKER_CLOSE = %r{\A[[:space:]]*(?://+|#+)[[:space:]]*end::([^\[\]]+)\[[[:space:]]*\]}
|
|
22
22
|
|
|
23
23
|
# @param text [String] raw included file content
|
|
24
24
|
# @param options [Coradoc::CoreModel::IncludeOptions]
|
|
@@ -134,5 +134,3 @@ module Coradoc
|
|
|
134
134
|
end
|
|
135
135
|
end
|
|
136
136
|
end
|
|
137
|
-
|
|
138
|
-
require 'set'
|
|
@@ -17,10 +17,10 @@ module Coradoc
|
|
|
17
17
|
attr_reader :counts
|
|
18
18
|
|
|
19
19
|
def visit(element)
|
|
20
|
-
return super
|
|
20
|
+
return super unless element.is_a?(CoreModel::Base)
|
|
21
21
|
|
|
22
22
|
@counts[type_key_for(element)] += 1
|
|
23
|
-
super
|
|
23
|
+
super
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
private
|
|
@@ -12,23 +12,14 @@ module Coradoc
|
|
|
12
12
|
# new link-bearing subclass means overriding +link_kind+ on it,
|
|
13
13
|
# not editing a case/when here (OCP).
|
|
14
14
|
#
|
|
15
|
-
# Verbatim block
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
15
|
+
# Verbatim block recognition is delegated to +CoreModel::Base#prose?+
|
|
16
|
+
# — each block class answers "is my text live or literal?". Adding a
|
|
17
|
+
# new verbatim block type means overriding +prose?+ on it, not editing
|
|
18
|
+
# a list here. The visitor is closed for that change.
|
|
19
19
|
#
|
|
20
20
|
# Dispatch is class-based (no +respond_to?+ duck-typing). Unrecognized
|
|
21
21
|
# classes are returned unchanged — the visitor is closed by design.
|
|
22
22
|
class Visitor
|
|
23
|
-
# Verbatim block classes — content is raw, no link semantics.
|
|
24
|
-
VERBATIM_TYPES = [
|
|
25
|
-
Coradoc::CoreModel::SourceBlock,
|
|
26
|
-
Coradoc::CoreModel::ListingBlock,
|
|
27
|
-
Coradoc::CoreModel::LiteralBlock,
|
|
28
|
-
Coradoc::CoreModel::PassBlock,
|
|
29
|
-
Coradoc::CoreModel::StemBlock
|
|
30
|
-
].freeze
|
|
31
|
-
|
|
32
23
|
# Structural/container classes that own a child collection. Each
|
|
33
24
|
# entry maps the class to the reader method that exposes its
|
|
34
25
|
# children. MECE — every "recurse into the children" case lands
|
|
@@ -68,7 +59,7 @@ module Coradoc
|
|
|
68
59
|
private
|
|
69
60
|
|
|
70
61
|
def visit_subtree(node)
|
|
71
|
-
return node
|
|
62
|
+
return node unless node.prose?
|
|
72
63
|
return rewrite_inline(node) if node.is_a?(Coradoc::CoreModel::InlineElement)
|
|
73
64
|
|
|
74
65
|
reader = reader_for(node)
|
data/lib/coradoc/pipeline.rb
CHANGED
|
@@ -14,9 +14,8 @@ module Coradoc
|
|
|
14
14
|
def parse(text, format:)
|
|
15
15
|
format_module = FormatCatalog.get_format(format)
|
|
16
16
|
unless format_module
|
|
17
|
-
raise UnsupportedFormatError,
|
|
18
|
-
|
|
19
|
-
"Available formats: #{FormatCatalog.registered_formats.join(', ')}"
|
|
17
|
+
raise UnsupportedFormatError.new(format,
|
|
18
|
+
available: FormatCatalog.registered_formats)
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
text = Hooks.invoke(:before_parse, text, format: format)
|
|
@@ -43,8 +42,8 @@ module Coradoc
|
|
|
43
42
|
)
|
|
44
43
|
end
|
|
45
44
|
|
|
46
|
-
def rewrite_links(document, rewriter: nil, &
|
|
47
|
-
Coradoc::LinkRewriter.rewrite(document, rewriter: rewriter, &
|
|
45
|
+
def rewrite_links(document, rewriter: nil, &)
|
|
46
|
+
Coradoc::LinkRewriter.rewrite(document, rewriter: rewriter, &)
|
|
48
47
|
end
|
|
49
48
|
|
|
50
49
|
def convert(text, from:, to:, **)
|
|
@@ -66,15 +65,15 @@ module Coradoc
|
|
|
66
65
|
|
|
67
66
|
def serialize(model, to:, **)
|
|
68
67
|
format_module = FormatCatalog.get_format(to)
|
|
69
|
-
raise UnsupportedFormatError,
|
|
68
|
+
raise UnsupportedFormatError.new(to, available: FormatCatalog.registered_formats) unless format_module
|
|
70
69
|
|
|
71
70
|
model = Hooks.invoke(:before_serialize, model, format: to)
|
|
72
71
|
result = format_module.serialize(model, **)
|
|
73
72
|
Hooks.invoke(:after_serialize, result, format: to)
|
|
74
73
|
end
|
|
75
74
|
|
|
76
|
-
def build(&
|
|
77
|
-
CoreModel::DocumentElement.build(children: [], &
|
|
75
|
+
def build(&)
|
|
76
|
+
CoreModel::DocumentElement.build(children: [], &)
|
|
78
77
|
end
|
|
79
78
|
|
|
80
79
|
def parse_file(path, format: nil)
|
|
@@ -84,7 +83,10 @@ module Coradoc
|
|
|
84
83
|
raise UnsupportedFormatError, "Could not detect format for: #{path}" unless source_format
|
|
85
84
|
|
|
86
85
|
format_module = FormatCatalog.get_format(source_format)
|
|
87
|
-
|
|
86
|
+
unless format_module
|
|
87
|
+
raise UnsupportedFormatError.new(source_format,
|
|
88
|
+
available: FormatCatalog.registered_formats)
|
|
89
|
+
end
|
|
88
90
|
|
|
89
91
|
if FormatCatalog.binary_format?(source_format)
|
|
90
92
|
format_module.parse_to_core(path)
|
data/lib/coradoc/query.rb
CHANGED
|
@@ -234,8 +234,8 @@ module Coradoc
|
|
|
234
234
|
@elements = Array(elements).compact
|
|
235
235
|
end
|
|
236
236
|
|
|
237
|
-
def each(&
|
|
238
|
-
@elements.each(&
|
|
237
|
+
def each(&)
|
|
238
|
+
@elements.each(&)
|
|
239
239
|
end
|
|
240
240
|
|
|
241
241
|
def [](index)
|
|
@@ -272,16 +272,16 @@ module Coradoc
|
|
|
272
272
|
ResultSet.new(results.uniq)
|
|
273
273
|
end
|
|
274
274
|
|
|
275
|
-
def map(&
|
|
276
|
-
ResultSet.new(@elements.map(&
|
|
275
|
+
def map(&)
|
|
276
|
+
ResultSet.new(@elements.map(&))
|
|
277
277
|
end
|
|
278
278
|
|
|
279
|
-
def select(&
|
|
280
|
-
ResultSet.new(@elements.select(&
|
|
279
|
+
def select(&)
|
|
280
|
+
ResultSet.new(@elements.select(&))
|
|
281
281
|
end
|
|
282
282
|
|
|
283
|
-
def reject(&
|
|
284
|
-
ResultSet.new(@elements.reject(&
|
|
283
|
+
def reject(&)
|
|
284
|
+
ResultSet.new(@elements.reject(&))
|
|
285
285
|
end
|
|
286
286
|
|
|
287
287
|
def to_a
|
data/lib/coradoc/registry.rb
CHANGED
|
@@ -102,24 +102,24 @@ module Coradoc
|
|
|
102
102
|
#
|
|
103
103
|
# @yield [Symbol, Object] name and item
|
|
104
104
|
# @return [Enumerator]
|
|
105
|
-
def each(&
|
|
106
|
-
@items.each(&
|
|
105
|
+
def each(&)
|
|
106
|
+
@items.each(&)
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
# Iterate over item values
|
|
110
110
|
#
|
|
111
111
|
# @yield [Object]
|
|
112
112
|
# @return [Enumerator]
|
|
113
|
-
def each_value(&
|
|
114
|
-
@items.each_value(&
|
|
113
|
+
def each_value(&)
|
|
114
|
+
@items.each_value(&)
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
# Iterate over item names
|
|
118
118
|
#
|
|
119
119
|
# @yield [Symbol]
|
|
120
120
|
# @return [Enumerator]
|
|
121
|
-
def each_key(&
|
|
122
|
-
@items.each_key(&
|
|
121
|
+
def each_key(&)
|
|
122
|
+
@items.each_key(&)
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
# Find an item whose processor_match? returns true for the given filename
|
|
@@ -24,8 +24,8 @@ module Coradoc
|
|
|
24
24
|
DEFAULT_MAX_DEPTH = 64
|
|
25
25
|
|
|
26
26
|
class << self
|
|
27
|
-
def call(core, resolver:, base_dir:, **
|
|
28
|
-
new(resolver: resolver, base_dir: base_dir, **
|
|
27
|
+
def call(core, resolver:, base_dir:, **)
|
|
28
|
+
new(resolver: resolver, base_dir: base_dir, **).call(core)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
data/lib/coradoc/validation.rb
CHANGED
|
@@ -600,8 +600,8 @@ module Coradoc
|
|
|
600
600
|
#
|
|
601
601
|
# @yield Schema definition block
|
|
602
602
|
# @return [Schema] The defined schema
|
|
603
|
-
def define(&
|
|
604
|
-
Schema.define(&
|
|
603
|
+
def define(&)
|
|
604
|
+
Schema.define(&)
|
|
605
605
|
end
|
|
606
606
|
|
|
607
607
|
# Generate a validation schema from a CoreModel class
|
|
@@ -614,8 +614,8 @@ module Coradoc
|
|
|
614
614
|
# schema = Coradoc::Validation.auto_schema(Coradoc::CoreModel::Block)
|
|
615
615
|
# result = schema.validate(document)
|
|
616
616
|
#
|
|
617
|
-
def auto_schema(model_class, **
|
|
618
|
-
SchemaGenerator.generate(model_class, **
|
|
617
|
+
def auto_schema(model_class, **)
|
|
618
|
+
SchemaGenerator.generate(model_class, **)
|
|
619
619
|
end
|
|
620
620
|
|
|
621
621
|
# Validate a document with default schema
|
data/lib/coradoc/version.rb
CHANGED
data/lib/coradoc.rb
CHANGED
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
# Coradoc.serialize(doc, to: :html)
|
|
31
31
|
|
|
32
32
|
require_relative 'coradoc/coradoc'
|
|
33
|
-
require_relative 'coradoc/version'
|
|
34
33
|
|
|
35
34
|
module Coradoc
|
|
35
|
+
autoload :VERSION, 'coradoc/version'
|
|
36
36
|
autoload :CLI, 'coradoc/cli'
|
|
37
37
|
autoload :Visitor, 'coradoc/visitor'
|
|
38
38
|
autoload :LinkRewriter, 'coradoc/link_rewriter'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: coradoc
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.28
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
@@ -55,6 +55,7 @@ files:
|
|
|
55
55
|
- lib/coradoc/configurable.rb
|
|
56
56
|
- lib/coradoc/coradoc.rb
|
|
57
57
|
- lib/coradoc/core_model.rb
|
|
58
|
+
- lib/coradoc/core_model/abstract_block.rb
|
|
58
59
|
- lib/coradoc/core_model/annotation_block.rb
|
|
59
60
|
- lib/coradoc/core_model/attribute_reference_resolver.rb
|
|
60
61
|
- lib/coradoc/core_model/base.rb
|
|
@@ -94,6 +95,7 @@ files:
|
|
|
94
95
|
- lib/coradoc/core_model/open_block.rb
|
|
95
96
|
- lib/coradoc/core_model/output_artifact.rb
|
|
96
97
|
- lib/coradoc/core_model/paragraph_block.rb
|
|
98
|
+
- lib/coradoc/core_model/partintro_block.rb
|
|
97
99
|
- lib/coradoc/core_model/pass_block.rb
|
|
98
100
|
- lib/coradoc/core_model/quote_block.rb
|
|
99
101
|
- lib/coradoc/core_model/raw_inline_element.rb
|
|
@@ -142,6 +144,7 @@ metadata:
|
|
|
142
144
|
homepage_uri: https://github.com/lutaml/coradoc
|
|
143
145
|
source_code_uri: https://github.com/lutaml/coradoc
|
|
144
146
|
changelog_uri: https://github.com/lutaml/coradoc/blob/main/CHANGELOG.md
|
|
147
|
+
rubygems_mfa_required: 'true'
|
|
145
148
|
rdoc_options: []
|
|
146
149
|
require_paths:
|
|
147
150
|
- lib
|