asciidoctor-reducer 1.0.0.alpha.2 → 1.0.0.alpha.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +13 -0
- data/README.adoc +11 -3
- data/lib/asciidoctor/reducer/cli.rb +2 -2
- data/lib/asciidoctor/reducer/preprocessor.rb +2 -14
- data/lib/asciidoctor/reducer/preprocessor_directive_tracker.rb +103 -0
- data/lib/asciidoctor/reducer/tree_processor.rb +8 -3
- data/lib/asciidoctor/reducer/version.rb +1 -1
- metadata +3 -3
- data/lib/asciidoctor/reducer/ext/asciidoctor/preprocessor_reader.rb +0 -89
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b0c9530e403be351428ec664c9a5d763a0f27686505e8328d831f46f9ad580b
|
4
|
+
data.tar.gz: ea5116a19ea8e1199415f5e50ee9339dcec66b87b2c574f60306c8b68e9083b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3f8025d47b14f4701c4883151403e7fc1aa498cb3d82b9180f7935e14e2aa95a149517e9b037f92d4086d01bd1133aae3088158018ecd088de8f0dc221d5602
|
7
|
+
data.tar.gz: 79ee7b026d7de3f74b2423e193b85c3e0d8d1e1a783e27af4e838522f13c7712871c1379556757ebc432999a0625590d8e03c80d6ef5259104c088a412fa8d25
|
data/CHANGELOG.adoc
CHANGED
@@ -4,6 +4,15 @@
|
|
4
4
|
This document provides a high-level view of the changes to the Asciidoctor Reducer by release.
|
5
5
|
For a detailed view of what has changed, refer to the {url-repo}/commits/main[commit history] on GitHub.
|
6
6
|
|
7
|
+
== 1.0.0.alpha.3 (2022-02-02) - @mojavelinux
|
8
|
+
|
9
|
+
=== Changed
|
10
|
+
|
11
|
+
* Rename PreprocessorReader ext module to PreprocessorReaderTracker
|
12
|
+
* Encapsulate logic to enhance PreprocessorReader inside PreprocessorReaderTracker module
|
13
|
+
* Only reload document if source lines have changed; otherwise, update source lines on reader directly
|
14
|
+
* Change default safe mode for CLI to :unsafe
|
15
|
+
|
7
16
|
== 1.0.0.alpha.2 (2022-01-27) - @mojavelinux
|
8
17
|
|
9
18
|
=== Added
|
@@ -34,3 +43,7 @@ Initial release.
|
|
34
43
|
=== Details
|
35
44
|
|
36
45
|
{url-repo}/releases/tag/v1.0.0.alpha.2[git tag]
|
46
|
+
|
47
|
+
=== Details
|
48
|
+
|
49
|
+
{url-repo}/releases/tag/v1.0.0.alpha.3[git tag]
|
data/README.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= {project-name}
|
2
2
|
Dan Allen <https://github.com/mojavelinux[@mojavelinux]>
|
3
|
-
v1.0.0.alpha.
|
3
|
+
v1.0.0.alpha.3, 2022-02-02
|
4
4
|
:idprefix:
|
5
5
|
:idseparator: -
|
6
6
|
ifndef::env-github[:icons: font]
|
@@ -80,7 +80,7 @@ To use the command, pass the AsciiDoc file as the sole argument:
|
|
80
80
|
$ asciidoctor-reducer input.adoc
|
81
81
|
|
82
82
|
By default, the command will output the reduced AsciiDoc document to the terminal (via stdout).
|
83
|
-
To write the output to a file, specify an output file using the `-o` option
|
83
|
+
To write the output to a file, specify an output file using the `-o` option:
|
84
84
|
|
85
85
|
$ asciidoctor-reducer -o output.adoc input.adoc
|
86
86
|
|
@@ -89,7 +89,7 @@ To use the command in this way, pass `-` as the first argument:
|
|
89
89
|
|
90
90
|
$ cat input.adoc | asciidoctor-reducer -
|
91
91
|
|
92
|
-
To write the output to a file, also specify the `-o` option:
|
92
|
+
To write the output to a file instead of stdout, also specify an output file using the `-o` option:
|
93
93
|
|
94
94
|
$ cat input.adoc | asciidoctor-reducer -o output.adoc -
|
95
95
|
|
@@ -137,6 +137,14 @@ As it goes, it also removes lines that have been excluded by the preprocessor co
|
|
137
137
|
Finally, it loads the document again and returns it.
|
138
138
|
The reduced source is available on the reconstructed document (via `Document#source` or `Document#source_lines`).
|
139
139
|
|
140
|
+
=== Impact on Extensions
|
141
|
+
|
142
|
+
If the sourcemap is enabled, and the reducer finds lines to replace or filter, the reducer will load the document again using `Asciidoctor.load`.
|
143
|
+
This step is necessary to synchronize the sourcemap with the reduced source.
|
144
|
+
This call will cause extensions that run during the load phase to be invoked again.
|
145
|
+
An extension can check for this secondary load by checking for the `:reduced` option in the `Document#options` hash.
|
146
|
+
If this option is set (the value of which will be `true`), then Asciidoctor is loading the reduced document.
|
147
|
+
|
140
148
|
== Development
|
141
149
|
|
142
150
|
Follow the instructions below to learn how to help develop the project or test-drive the development version.
|
@@ -8,7 +8,7 @@ module Asciidoctor::Reducer
|
|
8
8
|
|
9
9
|
class Cli
|
10
10
|
def parse args
|
11
|
-
options = { attributes: {}, safe: :
|
11
|
+
options = { attributes: {}, safe: :unsafe }
|
12
12
|
|
13
13
|
opt_parser = ::OptionParser.new do |opts|
|
14
14
|
opts.program_name = 'asciidoctor-reducer'
|
@@ -91,7 +91,7 @@ module Asciidoctor::Reducer
|
|
91
91
|
end
|
92
92
|
::Pathname === to ? (to.write reduced, encoding: ::Encoding::UTF_8) : (to.write reduced)
|
93
93
|
0
|
94
|
-
rescue
|
94
|
+
rescue
|
95
95
|
$stderr.write %(asciidoctor-reducer: #{$!.message}\n)
|
96
96
|
1
|
97
97
|
ensure
|
@@ -1,23 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'preprocessor_directive_tracker'
|
4
4
|
|
5
5
|
module Asciidoctor::Reducer
|
6
6
|
class Preprocessor < ::Asciidoctor::Extensions::Preprocessor
|
7
7
|
def process doc, reader
|
8
|
-
|
9
|
-
reader.singleton_class.prepend AsciidoctorExt::PreprocessorReader
|
10
|
-
reader.instance_variable_set :@x_include_replacements, ([{ drop: [] }].extend Current)
|
11
|
-
reader.instance_variable_set :@x_parents, [0]
|
12
|
-
nil
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
module Current
|
17
|
-
attr_accessor :current
|
18
|
-
|
19
|
-
def self.extended obj
|
20
|
-
obj.current = obj[-1]
|
8
|
+
doc.options[:reduced] ? reader : (reader.extend PreprocessorDirectiveTracker)
|
21
9
|
end
|
22
10
|
end
|
23
11
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Asciidoctor::Reducer
|
4
|
+
module PreprocessorDirectiveTracker
|
5
|
+
attr_writer :source_lines
|
6
|
+
attr_reader :x_include_replacements
|
7
|
+
|
8
|
+
def self.extended instance
|
9
|
+
instance.instance_variable_set :@x_include_replacements, ([{ drop: [] }].extend CurrentPointer)
|
10
|
+
instance.instance_variable_set :@x_parents, [0]
|
11
|
+
end
|
12
|
+
|
13
|
+
def preprocess_conditional_directive keyword, target, delimiter, text
|
14
|
+
return super if (opts = @document.options)[:preserve_conditionals] || opts[:reduced]
|
15
|
+
skip_active = @skipping
|
16
|
+
depth = @conditional_stack.length
|
17
|
+
cond_lineno = @lineno - 1
|
18
|
+
result = super
|
19
|
+
return result if @skipping && skip_active
|
20
|
+
drop = @x_include_replacements.current[:drop]
|
21
|
+
if (depth_change = @conditional_stack.length - depth) < 0
|
22
|
+
if skip_active
|
23
|
+
drop.push(*(drop.pop..cond_lineno))
|
24
|
+
else
|
25
|
+
drop << cond_lineno
|
26
|
+
end
|
27
|
+
elsif depth_change > 0 || cond_lineno == @lineno - 1
|
28
|
+
drop << cond_lineno
|
29
|
+
else
|
30
|
+
drop << [cond_lineno, text]
|
31
|
+
end
|
32
|
+
result
|
33
|
+
end
|
34
|
+
|
35
|
+
def preprocess_include_directive target, attrlist
|
36
|
+
@x_include_directive_line = %(include::#{target}[#{attrlist}])
|
37
|
+
@x_push_include_called = false
|
38
|
+
inc_lineno = @lineno - 1 # we're currently on the include line, which is 1-based
|
39
|
+
result = super
|
40
|
+
return result if @x_push_include_called
|
41
|
+
parent_depth = (parents = @x_parents).length
|
42
|
+
if (depth_change = @include_stack.length - (parent_depth - 1)) < 0
|
43
|
+
parent_depth -= (parents.slice! parent_depth + depth_change, -depth_change).length
|
44
|
+
end
|
45
|
+
inc_lines = ((line = lines[0].to_s).start_with? 'Unresolved directive in ') && (line.end_with? ']') ? [line] : []
|
46
|
+
push_include_replacement inc_lines, parent_depth, inc_lineno
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
def push_include data, file, path, lineno, attrs
|
51
|
+
@x_push_include_called = true
|
52
|
+
inc_lineno = @lineno - 2 # we're below the include line, which is 1-based
|
53
|
+
prev_inc_depth = @include_stack.length
|
54
|
+
# Q: can we do this without resetting the lineno?
|
55
|
+
lineno = 1 # rubocop:disable Lint/ShadowedArgument
|
56
|
+
super
|
57
|
+
parent_depth = (parents = @x_parents).length
|
58
|
+
# push_include did not push to the stack
|
59
|
+
if (inc_depth = @include_stack.length) == prev_inc_depth
|
60
|
+
if (depth_change = inc_depth - (parent_depth - 1)) < 0
|
61
|
+
parent_depth -= (parents.slice! parent_depth + depth_change, -depth_change).length
|
62
|
+
end
|
63
|
+
else
|
64
|
+
if (depth_change = inc_depth - parent_depth) > 0
|
65
|
+
parents << @x_include_replacements.length.pred
|
66
|
+
parent_depth += 1
|
67
|
+
elsif depth_change < 0
|
68
|
+
parent_depth -= (parents.slice! parent_depth + depth_change, -depth_change).length
|
69
|
+
end
|
70
|
+
inc_lines = lines
|
71
|
+
end
|
72
|
+
push_include_replacement inc_lines, parent_depth, inc_lineno
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
def pop_include
|
77
|
+
@x_include_replacements.current = @x_include_replacements[@x_include_replacements.current[:into] || 0]
|
78
|
+
super
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def push_include_replacement inc_lines, parent_depth, inc_lineno
|
84
|
+
@x_include_replacements << {
|
85
|
+
lines: inc_lines || [],
|
86
|
+
drop: [],
|
87
|
+
into: @x_parents[parent_depth - 1],
|
88
|
+
index: inc_lineno,
|
89
|
+
replace: @x_include_directive_line,
|
90
|
+
}
|
91
|
+
@x_include_replacements.current = @x_include_replacements[-1] if inc_lines
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
module CurrentPointer
|
97
|
+
attr_accessor :current
|
98
|
+
|
99
|
+
def self.extended instance
|
100
|
+
instance.current = instance[-1]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -4,7 +4,7 @@ module Asciidoctor::Reducer
|
|
4
4
|
class TreeProcessor < ::Asciidoctor::Extensions::TreeProcessor
|
5
5
|
def process doc
|
6
6
|
return if doc.options[:reduced]
|
7
|
-
inc_replacements = doc.reader.
|
7
|
+
inc_replacements = doc.reader.x_include_replacements
|
8
8
|
unless inc_replacements.length == 1 && inc_replacements[0][:drop].empty?
|
9
9
|
inc_replacements[0][:lines] = doc.source_lines.dup
|
10
10
|
inc_replacements.reverse_each do |it|
|
@@ -19,8 +19,13 @@ module Asciidoctor::Reducer
|
|
19
19
|
end
|
20
20
|
target_lines[index] = lines if target_lines
|
21
21
|
end
|
22
|
-
|
23
|
-
|
22
|
+
source_lines = inc_replacements[0][:lines].flatten
|
23
|
+
if doc.sourcemap
|
24
|
+
# WARNING: if include directives remain that can still be resolved, the sourcemap won't match the source lines
|
25
|
+
doc = ::Asciidoctor.load source_lines, (doc.options.merge reduced: true)
|
26
|
+
else
|
27
|
+
doc.reader.source_lines = source_lines
|
28
|
+
end
|
24
29
|
end
|
25
30
|
doc
|
26
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asciidoctor-reducer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.alpha.
|
4
|
+
version: 1.0.0.alpha.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Allen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -69,9 +69,9 @@ files:
|
|
69
69
|
- lib/asciidoctor-reducer.rb
|
70
70
|
- lib/asciidoctor/reducer.rb
|
71
71
|
- lib/asciidoctor/reducer/cli.rb
|
72
|
-
- lib/asciidoctor/reducer/ext/asciidoctor/preprocessor_reader.rb
|
73
72
|
- lib/asciidoctor/reducer/extensions.rb
|
74
73
|
- lib/asciidoctor/reducer/preprocessor.rb
|
74
|
+
- lib/asciidoctor/reducer/preprocessor_directive_tracker.rb
|
75
75
|
- lib/asciidoctor/reducer/tree_processor.rb
|
76
76
|
- lib/asciidoctor/reducer/version.rb
|
77
77
|
homepage: https://asciidoctor.org
|
@@ -1,89 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Asciidoctor::Reducer
|
4
|
-
module AsciidoctorExt
|
5
|
-
module PreprocessorReader
|
6
|
-
def preprocess_conditional_directive keyword, target, delimiter, text
|
7
|
-
return super if (opts = @document.options)[:preserve_conditionals] || opts[:reduced]
|
8
|
-
skip_active = @skipping
|
9
|
-
depth = @conditional_stack.length
|
10
|
-
cond_lineno = @lineno - 1
|
11
|
-
result = super
|
12
|
-
return result if @skipping && skip_active
|
13
|
-
drop = @x_include_replacements.current[:drop]
|
14
|
-
if (depth_change = @conditional_stack.length - depth) < 0
|
15
|
-
if skip_active
|
16
|
-
drop.push(*(drop.pop..cond_lineno))
|
17
|
-
else
|
18
|
-
drop << cond_lineno
|
19
|
-
end
|
20
|
-
elsif depth_change > 0 || cond_lineno == @lineno - 1
|
21
|
-
drop << cond_lineno
|
22
|
-
else
|
23
|
-
drop << [cond_lineno, text]
|
24
|
-
end
|
25
|
-
result
|
26
|
-
end
|
27
|
-
|
28
|
-
def preprocess_include_directive target, attrlist
|
29
|
-
@x_include_directive_line = %(include::#{target}[#{attrlist}])
|
30
|
-
@x_push_include_called = false
|
31
|
-
inc_lineno = @lineno - 1 # we're currently on the include line, which is 1-based
|
32
|
-
result = super
|
33
|
-
return result if @x_push_include_called
|
34
|
-
parent_depth = (parents = @x_parents).length
|
35
|
-
if (depth_change = @include_stack.length - (parent_depth - 1)) < 0
|
36
|
-
parent_depth -= (parents.slice! parent_depth + depth_change, -depth_change).length
|
37
|
-
end
|
38
|
-
lines = ((line = @lines[-1].to_s).start_with? 'Unresolved directive in ') && (line.end_with? ']') ? [line] : []
|
39
|
-
push_include_replacement lines, parent_depth, inc_lineno
|
40
|
-
result
|
41
|
-
end
|
42
|
-
|
43
|
-
def push_include data, file, path, lineno, attrs
|
44
|
-
@x_push_include_called = true
|
45
|
-
inc_lineno = @lineno - 2 # we're below the include line, which is 1-based
|
46
|
-
prev_inc_depth = @include_stack.length
|
47
|
-
# Q: can we do this without resetting the lineno?
|
48
|
-
lineno = 1 # rubocop:disable Lint/ShadowedArgument
|
49
|
-
super
|
50
|
-
parent_depth = (parents = @x_parents).length
|
51
|
-
# push_include did not push to the stack
|
52
|
-
if (inc_depth = @include_stack.length) == prev_inc_depth
|
53
|
-
if (depth_change = inc_depth - (parent_depth - 1)) < 0
|
54
|
-
parent_depth -= (parents.slice! parent_depth + depth_change, -depth_change).length
|
55
|
-
end
|
56
|
-
else
|
57
|
-
if (depth_change = inc_depth - parent_depth) > 0
|
58
|
-
parents << @x_include_replacements.length.pred
|
59
|
-
parent_depth += 1
|
60
|
-
elsif depth_change < 0
|
61
|
-
parent_depth -= (parents.slice! parent_depth + depth_change, -depth_change).length
|
62
|
-
end
|
63
|
-
lines = @lines.reverse
|
64
|
-
end
|
65
|
-
push_include_replacement lines, parent_depth, inc_lineno
|
66
|
-
self
|
67
|
-
end
|
68
|
-
|
69
|
-
def pop_include
|
70
|
-
@x_include_replacements.current = @x_include_replacements[@x_include_replacements.current[:into] || 0]
|
71
|
-
super
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def push_include_replacement lines, parent_depth, inc_lineno
|
77
|
-
@x_include_replacements << {
|
78
|
-
lines: lines || [],
|
79
|
-
drop: [],
|
80
|
-
into: @x_parents[parent_depth - 1],
|
81
|
-
index: inc_lineno,
|
82
|
-
replace: @x_include_directive_line,
|
83
|
-
}
|
84
|
-
@x_include_replacements.current = @x_include_replacements[-1] if lines
|
85
|
-
nil
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|