metanorma-plugin-datastruct 0.2.3 → 0.2.4
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/.gitignore +5 -1
- data/lib/metanorma/plugin/datastruct/base_structured_text_preprocessor.rb +21 -3
- data/lib/metanorma/plugin/datastruct/json2_text_preprocessor.rb +4 -0
- data/lib/metanorma/plugin/datastruct/source_extractor.rb +99 -0
- data/lib/metanorma/plugin/datastruct/version.rb +1 -1
- data/lib/metanorma/plugin/datastruct/yaml2_text_preprocessor.rb +10 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 506a0c248f1bcd37ddc11b9927517a0e64244a56e19f482fd2b49e7cf753d1f9
|
4
|
+
data.tar.gz: 933f231c3e43cce3f0d7058a036c4f3d80c028c5a463bc7823d5ff8b938fa417
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49014c580c342ceab3e6a86b2ab9e056ba78f03b76e7e260c5ce44f7de3e139e668670ce99266db3aa2f6fd39a8d71749dcaa8863f60a566890153db81fffebe
|
7
|
+
data.tar.gz: 92c523b5a89060a8754073c5f5fd776a167f160bb2219254325c4ecb1d0f79e180da9cdbf1a75a35169068d55294f1675d2db409a2a9be2e1e0c5d2f607e5859
|
data/.gitignore
CHANGED
@@ -8,6 +8,7 @@ require "liquid/custom_blocks/with_yaml_nested_context"
|
|
8
8
|
require "liquid/custom_blocks/with_json_nested_context"
|
9
9
|
require "liquid/custom_filters/values"
|
10
10
|
require "liquid/custom_filters/replace_regex"
|
11
|
+
require "metanorma/plugin/datastruct/source_extractor"
|
11
12
|
|
12
13
|
Liquid::Template.register_tag("keyiterator", Liquid::CustomBlocks::KeyIterator)
|
13
14
|
Liquid::Template
|
@@ -28,8 +29,15 @@ module Metanorma
|
|
28
29
|
BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z/.freeze
|
29
30
|
|
30
31
|
def process(document, reader)
|
31
|
-
input_lines = reader.readlines
|
32
|
-
|
32
|
+
input_lines = reader.readlines
|
33
|
+
Metanorma::Plugin::Datastruct::SourceExtractor.extract(
|
34
|
+
document,
|
35
|
+
input_lines,
|
36
|
+
)
|
37
|
+
|
38
|
+
Asciidoctor::Reader.new(
|
39
|
+
processed_lines(document, input_lines.to_enum),
|
40
|
+
)
|
33
41
|
end
|
34
42
|
|
35
43
|
protected
|
@@ -38,6 +46,10 @@ module Metanorma
|
|
38
46
|
raise ArgumentError, "Implement `content_from_file` in your class"
|
39
47
|
end
|
40
48
|
|
49
|
+
def content_from_anchor(_document, _file_path)
|
50
|
+
raise ArgumentError, "Implement `content_from_anchor` in your class"
|
51
|
+
end
|
52
|
+
|
41
53
|
private
|
42
54
|
|
43
55
|
def processed_lines(document, input_lines)
|
@@ -109,7 +121,13 @@ module Metanorma
|
|
109
121
|
def parse_template(document, current_block, block_match)
|
110
122
|
transformed_liquid_lines = current_block
|
111
123
|
.map(&method(:transform_line_liquid))
|
112
|
-
|
124
|
+
|
125
|
+
context_items = if block_match[1].start_with?("#")
|
126
|
+
content_from_anchor(document, block_match[1][1..-1])
|
127
|
+
else
|
128
|
+
content_from_file(document, block_match[1])
|
129
|
+
end
|
130
|
+
|
113
131
|
parse_context_block(document: document,
|
114
132
|
context_lines: transformed_liquid_lines,
|
115
133
|
context_items: context_items,
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Metanorma
|
2
|
+
module Plugin
|
3
|
+
module Datastruct
|
4
|
+
class SourceExtractor
|
5
|
+
# example:
|
6
|
+
# - [[abc]]
|
7
|
+
ANCHOR_REGEX_1 = /^\[\[(?<id>[^\]]*)\]\]\s*$/.freeze
|
8
|
+
|
9
|
+
# examples:
|
10
|
+
# - [#abc]
|
11
|
+
# - [source#abc,ruby]
|
12
|
+
ANCHOR_REGEX_2 = /^\[[^#,]*#(?<id>[^,\]]*)[,\]]/.freeze
|
13
|
+
|
14
|
+
# examples:
|
15
|
+
# - [id=abc]
|
16
|
+
# - [source,id="abc"]
|
17
|
+
ANCHOR_REGEX_3 = /^\[(?:.+,)?id=['"]?(?<id>[^,\]'"]*)['"]?[,\]]/.freeze
|
18
|
+
|
19
|
+
def initialize(document, input_lines)
|
20
|
+
@document = document
|
21
|
+
@input_lines = input_lines
|
22
|
+
|
23
|
+
@document.attributes["source_blocks"] ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.extract(document, input_lines)
|
27
|
+
new(document, input_lines).extract
|
28
|
+
end
|
29
|
+
|
30
|
+
def extract
|
31
|
+
lines = @input_lines.to_enum
|
32
|
+
|
33
|
+
loop do
|
34
|
+
line = lines.next
|
35
|
+
|
36
|
+
if /^embed::|^include::/.match?(line.strip)
|
37
|
+
file_lines = read(filename(@document, line))
|
38
|
+
SourceExtractor.extract(@document, file_lines)
|
39
|
+
elsif m = match_anchor(line)
|
40
|
+
@document.attributes["source_blocks"][m[:id]] = read_section lines
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def match_anchor(line)
|
48
|
+
line.match(ANCHOR_REGEX_1) ||
|
49
|
+
line.match(ANCHOR_REGEX_2) ||
|
50
|
+
line.match(ANCHOR_REGEX_3)
|
51
|
+
end
|
52
|
+
|
53
|
+
def readlines_safe(file)
|
54
|
+
return [] if file.eof?
|
55
|
+
|
56
|
+
file.readlines
|
57
|
+
end
|
58
|
+
|
59
|
+
def read(inc_path)
|
60
|
+
::File.open inc_path, "r" do |fd|
|
61
|
+
readlines_safe(fd).map(&:chomp)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def filename(document, line)
|
66
|
+
m = /(^include::|^embed::)([^\[]+)\[/.match(line)
|
67
|
+
return nil unless m
|
68
|
+
|
69
|
+
file_path = relative_file_path(document, m[2])
|
70
|
+
|
71
|
+
File.exist?(file_path) ? file_path : nil
|
72
|
+
end
|
73
|
+
|
74
|
+
def relative_file_path(document, file_path)
|
75
|
+
docfile_directory = File.dirname(
|
76
|
+
document.attributes["docfile"] || ".",
|
77
|
+
)
|
78
|
+
document
|
79
|
+
.path_resolver
|
80
|
+
.system_path(file_path, docfile_directory)
|
81
|
+
end
|
82
|
+
|
83
|
+
def read_section(lines)
|
84
|
+
m = lines.next.match(/^--+/)
|
85
|
+
return "" unless m
|
86
|
+
|
87
|
+
end_mark = m[0]
|
88
|
+
current_section = []
|
89
|
+
|
90
|
+
while (line = lines.next) != end_mark
|
91
|
+
current_section << line
|
92
|
+
end
|
93
|
+
|
94
|
+
current_section.join("\n")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -43,7 +43,16 @@ module Metanorma
|
|
43
43
|
File.read(relative_file_path(document, file_path), encoding: "UTF-8"),
|
44
44
|
permitted_classes: [Date, Time],
|
45
45
|
permitted_symbols: [],
|
46
|
-
aliases: true
|
46
|
+
aliases: true,
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
def content_from_anchor(document, anchor)
|
51
|
+
YAML.safe_load(
|
52
|
+
document.attributes["source_blocks"][anchor],
|
53
|
+
permitted_classes: [Date, Time],
|
54
|
+
permitted_symbols: [],
|
55
|
+
aliases: true,
|
47
56
|
)
|
48
57
|
end
|
49
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metanorma-plugin-datastruct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -234,6 +234,7 @@ files:
|
|
234
234
|
- lib/metanorma-plugin-datastruct.rb
|
235
235
|
- lib/metanorma/plugin/datastruct/base_structured_text_preprocessor.rb
|
236
236
|
- lib/metanorma/plugin/datastruct/json2_text_preprocessor.rb
|
237
|
+
- lib/metanorma/plugin/datastruct/source_extractor.rb
|
237
238
|
- lib/metanorma/plugin/datastruct/version.rb
|
238
239
|
- lib/metanorma/plugin/datastruct/yaml2_text_preprocessor.rb
|
239
240
|
- metanorma-plugin-datastruct.gemspec
|