asciidoctor-interdoc-reftext 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fed3980f4a2bfa3f3c12b30ed11ffeb67271369c
4
+ data.tar.gz: dab27d0a17a2fcd44349879a58c87c18684f4033
5
+ SHA512:
6
+ metadata.gz: 5cb9baa9cc4604a27f7314f814ad65358fc4571b8cb42de27ef97c74c8b99100a7f16cc4fd056076aa7965445bc9bfd13b7c45c31d6ab99a2fc7c1f5cad22509
7
+ data.tar.gz: ce59c604c441f61eddb9f1409890e814f3fa7704b58b41c651ba40966d85e01d3e2b1cb424fbbb8dd297e6497e3fe585a2c6ce7cc40d3cb65f2dfe4268a59e12
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright 2018 Jakub Jirutka <jakub@jirutka.cz>.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.adoc ADDED
@@ -0,0 +1,93 @@
1
+ = Asciidoctor Inter-doc Reference Text
2
+ :source-language: shell
3
+ // custom
4
+ :gem-name: asciidoctor-interdoc-reftext
5
+ :gh-name: jirutka/{gem-name}
6
+ :gh-branch: master
7
+ :codacy-id: 7f60adeeb3fc49ee85863df2c65cd4eb
8
+
9
+ ifdef::env-github[]
10
+ image:https://travis-ci.org/{gh-name}.svg?branch={gh-branch}[Build Status, link="https://travis-ci.org/{gh-name}"]
11
+ image:https://api.codacy.com/project/badge/Coverage/{codacy-id}["Test Coverage", link="https://www.codacy.com/app/{gh-name}"]
12
+ image:https://api.codacy.com/project/badge/Grade/{codacy-id}["Codacy Code quality", link="https://www.codacy.com/app/{gh-name}"]
13
+ image:https://img.shields.io/gem/v/{gem-name}.svg?style=flat[Gem Version, link="https://rubygems.org/gems/{gem-name}"]
14
+ image:https://img.shields.io/badge/yard-docs-blue.svg[Yard Docs, link="http://www.rubydoc.info/github/{gh-name}/{gh-branch}"]
15
+ endif::env-github[]
16
+
17
+
18
+ This project is an http://asciidoctor.org/[Asciidoctor] extension providing implicit (automatic) reference text (label) for inter-document cross references.
19
+
20
+
21
+ == Examples
22
+
23
+ When you define a cross reference to another document “other.adoc” _without_ a label, e.g.:
24
+
25
+ ----
26
+ xref:other#[]
27
+ ----
28
+
29
+ Asciidoctor converts it into a plain link with the target document’s path as a text:
30
+
31
+ // GitHub doesn't render Example block as a box.
32
+ [subs="+macros"]
33
+ ----
34
+ link:other.html[other.html]
35
+ ----
36
+
37
+ but this extensions converts it into:
38
+
39
+ [subs="+macros"]
40
+ ----
41
+ link:other.html[Other Document]
42
+ ----
43
+
44
+ where “Other Document” is a *title* of the _other.adoc_.
45
+
46
+ Similarly with cross reference to a section in another document, e.g.:
47
+
48
+ ----
49
+ xref:other#sec1[]
50
+ ----
51
+
52
+ Asciidoctor converts it in the same way as above, but this extensions converts it into:
53
+
54
+ [subs="+macros"]
55
+ ----
56
+ link:other.html#sec1[The First Section]
57
+ ----
58
+
59
+ where “The First Section” is *title* of the section with id _sec1_ in _other.adoc_.
60
+
61
+
62
+ == Installation
63
+
64
+ To install (or update to the latest version):
65
+
66
+ [source, subs="+attributes"]
67
+ gem install {gem-name}
68
+
69
+ or to install the latest development version:
70
+
71
+ [source, subs="+attributes"]
72
+ gem install {gem-name} --pre
73
+
74
+
75
+ == Usage
76
+
77
+ Just `require '{gem-name}'`.
78
+ If you invoke Asciidoctor from command-line, use option `-r` to load the extension:
79
+
80
+ [source, subs="+attributes"]
81
+ asciidoctor -r {gem-name} README.adoc
82
+
83
+ If you don’t want the extension to be automatically registered in Asciidoctor, don’t _require_ `{gem-name}`, but `asciidoctor/interdoc_reftext/processor`.
84
+
85
+ IMPORTANT: Bundler automatically _requires_ all the specified gems.
86
+ To prevent it, use +
87
+ `gem '{gem-name}', require: false`.
88
+
89
+
90
+ == License
91
+
92
+ This project is licensed under http://opensource.org/licenses/MIT/[MIT License].
93
+ For the full text of the license, see the link:LICENSE[LICENSE] file.
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../lib/asciidoctor/interdoc_reftext/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'asciidoctor-interdoc-reftext'
5
+ s.version = Asciidoctor::InterdocReftext::VERSION
6
+ s.author = 'Jakub Jirutka'
7
+ s.email = 'jakub@jirutka.cz'
8
+ s.homepage = 'https://github.com/jirutka/asciidoctor-interdoc-reftext'
9
+ s.license = 'MIT'
10
+
11
+ s.summary = "Asciidoctor extension providing implicit (automatic) reference \
12
+ text (label) for inter-document cross references"
13
+
14
+ s.files = Dir['lib/**/*', '*.gemspec', 'LICENSE*', 'README*']
15
+ s.has_rdoc = 'yard'
16
+
17
+ s.required_ruby_version = '>= 2.1'
18
+
19
+ s.add_runtime_dependency 'asciidoctor', '~> 1.5.6'
20
+
21
+ s.add_development_dependency 'corefines', '~> 1.11'
22
+ s.add_development_dependency 'kramdown', '~> 1.16'
23
+ s.add_development_dependency 'rake', '~> 12.0'
24
+ s.add_development_dependency 'rspec', '~> 3.7'
25
+ s.add_development_dependency 'rspec-html-matchers', '~> 0.9.1'
26
+ s.add_development_dependency 'rubocop', '~> 0.51.0'
27
+ s.add_development_dependency 'simplecov', '~> 0.15'
28
+ s.add_development_dependency 'yard', '~> 0.9'
29
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/interdoc_reftext'
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/extensions'
3
+ require 'asciidoctor/interdoc_reftext/version'
4
+ require 'asciidoctor/interdoc_reftext/processor'
5
+
6
+ Asciidoctor::Extensions.register do
7
+ treeprocessor Asciidoctor::InterdocReftext::Processor
8
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/interdoc_reftext/version'
3
+ require 'asciidoctor'
4
+
5
+ module Asciidoctor::InterdocReftext
6
+ # Mixin intended to be prepended into `Asciidoctor::Inline`.
7
+ #
8
+ # It modifies the method `#text` to resolve the value via {Resolver} if it's
9
+ # not set, this node is an *inline_anchor* and has attribute *path* (i.e.
10
+ # represents an inter-document cross reference).
11
+ module InlineNodeMixin
12
+
13
+ # Returns text of this inline element.
14
+ #
15
+ # @note This method will override the same name attribute reader in
16
+ # class `Asciidoctor::Inline`.
17
+ #
18
+ # @return [String, nil]
19
+ def text
20
+ if (value = super)
21
+ value
22
+ # If this node is an inter-document cross reference...
23
+ elsif @node_name == 'inline_anchor' && @attributes['path']
24
+ resolver = interdoc_reftext_resolver
25
+ @text = resolver.call(@attributes['refid']) if resolver
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ # @return [#call, nil] an inter-document reftext resolver, or nil if not
32
+ # set for the document.
33
+ def interdoc_reftext_resolver
34
+ # This variable is injected into the document by {Processor}.
35
+ @document.instance_variable_get(Processor::RESOLVER_VAR_NAME)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/extensions'
3
+ require 'asciidoctor/interdoc_reftext/inline_node_mixin'
4
+ require 'asciidoctor/interdoc_reftext/resolver'
5
+ require 'asciidoctor/interdoc_reftext/version'
6
+
7
+ module Asciidoctor::InterdocReftext
8
+ # Asciidoctor processor that adds support for automatic cross-reference text
9
+ # for inter-document cross references.
10
+ #
11
+ # ### Implementation Considerations
12
+ #
13
+ # Asciidoctor does not allow to _cleanly_ change the way of resolving
14
+ # xreftext for `xref:path#[]` macro with path and without explicit xreflabel;
15
+ # it always uses path as the default xreflabel.
16
+ #
17
+ # 1. `xref:[]` macros are parsed and even converted in
18
+ # `Asciidoctor::Substitutors#sub_inline_xrefs` - a single, huge and nasty
19
+ # method that accepts a text (e.g. whole paragraph) and returns the text
20
+ # with converted `xref:[]` macros. The conversion is delegated to
21
+ # `Asciidoctor::Inline#convert` - for each macro a new instance of
22
+ # `Inline` node is created and then `#convert` is called.
23
+ #
24
+ # 2. `Inline#convert` just calls `converter.convert` with `self`, i.e. it's
25
+ # dispatched to converter's `inline_anchor` handler.
26
+ #
27
+ # 3. The built-in so called HTML5 converter looks into the catalog of
28
+ # references (`document.catalog[:refs]`) for reflabel for the xref's
29
+ # *refid*, but only if xref node does not define attribute *path* or
30
+ # *text* (explicit reflabel). If *text* is not set and *path* is set, i.e.
31
+ # it's an inter-document reference without explicit reflabel, catalog of
32
+ # references is bypassed and *path* is used as a reflabel.
33
+ #
34
+ # Eh, this is really nasty... The least evil way how to achieve the goal
35
+ # seems to be monkey-patching of the `Asciidoctor::Inline` class. This is
36
+ # done via {InlineNodeMixin} which is prepended into the `Inline` class on
37
+ # initialization of this processor.
38
+ #
39
+ # The actual logic that resolves reflabel for the given *refid* is
40
+ # implemented in class {Resolver}. The {Processor} is responsible for
41
+ # creating an instance of {Resolver} for the processed document and injecting
42
+ # it into instance variable {RESOLVER_VAR_NAME} in the document, so
43
+ # {InlineNodeMixin} can access it.
44
+ #
45
+ # Prepending {InlineNodeMixin} into the `Asciidoctor::Inline` class has
46
+ # (obviously) a global effect. However, if {RESOLVER_VAR_NAME} is not
47
+ # injected in the document object (e.g. extension is not active), `Inline`
48
+ # behaves the same as without {InlineNodeMixin}.
49
+ #
50
+ # NOTE: We use _reftext_ and _reflabel_ as interchangeable terms in this gem.
51
+ class Processor < ::Asciidoctor::Extensions::TreeProcessor
52
+
53
+ # Name of instance variable that is dynamically defined in a document
54
+ # object; it contains an instance of the Resolver for the document.
55
+ RESOLVER_VAR_NAME = :@_interdoc_reftext_resolver
56
+
57
+ # @param resolver_class [#new] the {Resolver} class to use.
58
+ # @param resolver_opts [Hash<Symbol, Object>] options to be passed into
59
+ # the resolver_class's initializer (see {Resolver#initialize}).
60
+ def initialize(resolver_class: Resolver, **resolver_opts)
61
+ super
62
+ @resolver_class = resolver_class
63
+ @resolver_opts = resolver_opts
64
+
65
+ # Monkey-patch Asciidoctor::Inline unless already patched.
66
+ unless ::Asciidoctor::Inline.include? InlineNodeMixin
67
+ ::Asciidoctor::Inline.send(:prepend, InlineNodeMixin)
68
+ end
69
+ end
70
+
71
+ # @param document [Asciidoctor::Document] the document to process.
72
+ def process(document)
73
+ resolver = @resolver_class.new(document, @resolver_opts)
74
+ document.instance_variable_set(RESOLVER_VAR_NAME, resolver)
75
+ nil
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/interdoc_reftext/version'
3
+ require 'asciidoctor'
4
+ require 'logger'
5
+
6
+ module Asciidoctor::InterdocReftext
7
+ # Resolver of inter-document cross reference texts.
8
+ class Resolver
9
+
10
+ # @param document [Asciidoctor::Document] the document associated with this resolver.
11
+ # @param asciidoc_exts [Array<String>] AsciiDoc file extensions (e.g. `.adoc`).
12
+ # @param logger [Logger] the logger to use for logging warning and errors.
13
+ # @param raise_exceptions [Boolean] whether to raise exceptions, or just log them.
14
+ def initialize(document,
15
+ asciidoc_exts: ['.adoc', '.asciidoc', '.ad'],
16
+ logger: ::Logger.new(STDERR),
17
+ raise_exceptions: true)
18
+
19
+ @document = document
20
+ @asciidoc_exts = asciidoc_exts.dup.freeze
21
+ @logger = logger
22
+ @raise_exceptions = raise_exceptions
23
+ @cache = {}
24
+ end
25
+
26
+ # @param refid [String] the target without a file extension, optionally with
27
+ # a fragment (e.g. `intro`, `intro#about`).
28
+ # @return [String, nil] reference text, or `nil` if not found.
29
+ # @raise ArgumentError if the *refid* is empty or starts with `#` and
30
+ # *raise_exceptions* is true.
31
+ def resolve_reftext(refid)
32
+ if refid.empty? || refid.start_with?('#')
33
+ msg = "interdoc-reftext: refid must not be empty or start with '#', but given: '#{refid}'"
34
+ raise ArgumentError, msg if @raise_exceptions
35
+ @logger.error msg
36
+ return nil
37
+ end
38
+
39
+ path, fragment = refid.split('#', 2)
40
+ path = resolve_target_path(path) or return nil
41
+
42
+ @cache["#{path}##{fragment}".freeze] ||= begin
43
+ lines = read_file(path) or return nil
44
+ parse_reftext(lines, fragment)
45
+ rescue => e # rubocop: disable RescueWithoutErrorClass
46
+ raise if @raise_exceptions
47
+ @logger.error "interdoc-reftext: #{e}"
48
+ nil
49
+ end
50
+ end
51
+
52
+ alias call resolve_reftext
53
+
54
+ protected
55
+
56
+ # @return [Hash<String, String>] a cache of resolved reftexts.
57
+ attr_reader :cache
58
+
59
+ # @param target_path [String] the target path without a file extension.
60
+ # @return [String, nil] file path of the *target_path*, or `nil` if not found.
61
+ def resolve_target_path(target_path)
62
+ # Include file is resolved relative to dir of the current include,
63
+ # or base_dir if within original docfile.
64
+ path = @document.normalize_system_path(target_path, @document.reader.dir,
65
+ nil, target_name: 'xref target')
66
+ return nil unless path
67
+
68
+ @asciidoc_exts.each do |extname|
69
+ filename = path + extname
70
+ return filename if ::File.file? filename
71
+ end
72
+ nil
73
+ end
74
+
75
+ # @param path [String] path of the file to read.
76
+ # @return [Enumerable<String>] lines of the file.
77
+ def read_file(path)
78
+ ::IO.foreach(path)
79
+ end
80
+
81
+ # @param input [Enumerable<String>] lines of the AsciiDoc document.
82
+ # @param fragment [String, nil] part of the target after `#`.
83
+ # @return [String, nil]
84
+ def parse_reftext(input, fragment = nil)
85
+ unless fragment
86
+ # Document title is typically defined at top of the document,
87
+ # so we try to parse just the first 10 lines to save resources.
88
+ # If document title is not here, we fallback to parsing whole document.
89
+ title = asciidoc_load(input.take(10)).doctitle
90
+ return title if title
91
+ end
92
+
93
+ doc = asciidoc_load(input)
94
+
95
+ if fragment
96
+ ref = doc.catalog[:refs][fragment]
97
+ ref.xreftext if ref
98
+ else
99
+ doc.doctitle
100
+ end
101
+ end
102
+
103
+ # @param input [Enumerable<String>, String] lines of the AsciiDoc document to load.
104
+ # @return [Asciidoctor::Document] a parsed document.
105
+ def asciidoc_load(input)
106
+ # Asciidoctor is dumb. It doesn't know enumerators and when we give it
107
+ # an Array, it calls #dup on it. At least it knows #readlines, so we just
108
+ # define it as an alias for #to_a.
109
+ if input.is_a?(::Enumerable) && !input.respond_to?(:readlines)
110
+ input.singleton_class.send(:alias_method, :readlines, :to_a)
111
+ end
112
+
113
+ ::Asciidoctor.load(input, @document.options)
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Asciidoctor
4
+ module InterdocReftext
5
+ # Version of the asciidoctor-interdoc-reftext gem.
6
+ VERSION = '0.1.0'.freeze
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asciidoctor-interdoc-reftext
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jakub Jirutka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: asciidoctor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: corefines
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: kramdown
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.16'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '12.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-html-matchers
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.9.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.51.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.51.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.15'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.15'
125
+ - !ruby/object:Gem::Dependency
126
+ name: yard
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.9'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.9'
139
+ description:
140
+ email: jakub@jirutka.cz
141
+ executables: []
142
+ extensions: []
143
+ extra_rdoc_files: []
144
+ files:
145
+ - LICENSE
146
+ - README.adoc
147
+ - asciidoctor-interdoc-reftext.gemspec
148
+ - lib/asciidoctor-interdoc-reftext.rb
149
+ - lib/asciidoctor/interdoc_reftext.rb
150
+ - lib/asciidoctor/interdoc_reftext/inline_node_mixin.rb
151
+ - lib/asciidoctor/interdoc_reftext/processor.rb
152
+ - lib/asciidoctor/interdoc_reftext/resolver.rb
153
+ - lib/asciidoctor/interdoc_reftext/version.rb
154
+ homepage: https://github.com/jirutka/asciidoctor-interdoc-reftext
155
+ licenses:
156
+ - MIT
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '2.1'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 2.6.11
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Asciidoctor extension providing implicit (automatic) reference text (label)
178
+ for inter-document cross references
179
+ test_files: []