asciidoctor-bibliography 0.4.4 → 0.5.0
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 +5 -5
- data/README.adoc +23 -0
- data/lib/asciidoctor-bibliography/bibliographer.rb +7 -4
- data/lib/asciidoctor-bibliography/citation.rb +7 -10
- data/lib/asciidoctor-bibliography/index.rb +7 -14
- data/lib/asciidoctor-bibliography/version.rb +1 -1
- data/samples/standard/sample-targets.adoc +25 -0
- data/spec/macros_spec.rb +2 -2
- data/spec/sanity_spec.rb +100 -5
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 61e7b49f2a7f0748b403572c395888484d08fbd839c2b1936cd1b481b5ea6e55
|
4
|
+
data.tar.gz: 4082bfb58062751ae7f51da843513a941d7f1ed156c77cc31fffe42257c6ba03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c998f87e682d397e64da720491651556eb320bd7227162827fb3297b352635a5ecc874f33f62373939f9eae440d263bf565013f2b534a5ad61c60f7387573410
|
7
|
+
data.tar.gz: 139fe43a494d4cbbe0b2c616a9d89342169f03241c422dc0bc7d965418277ff0d712b90a0a26858b645ef94ff03a26df8856971de2473cb92c62041eeb6457ba
|
data/README.adoc
CHANGED
@@ -150,6 +150,29 @@ To render the bibliography you simply use the following block macro:
|
|
150
150
|
bibliography::[]
|
151
151
|
----
|
152
152
|
|
153
|
+
You can handle multiple bibliographies by providing a target parameter to
|
154
|
+
citation macros:
|
155
|
+
|
156
|
+
[source,asciidoc]
|
157
|
+
----
|
158
|
+
cite:foo[Aa2017]+bar[Bb2017]
|
159
|
+
----
|
160
|
+
|
161
|
+
You can then render all citations targeting a specific bibliography
|
162
|
+
by using the target parameter again:
|
163
|
+
|
164
|
+
[source,asciidoc]
|
165
|
+
----
|
166
|
+
## Index of Foos
|
167
|
+
|
168
|
+
bibliography::foo[]
|
169
|
+
|
170
|
+
## Index of Bars
|
171
|
+
|
172
|
+
bibliography::bar[]
|
173
|
+
----
|
174
|
+
|
175
|
+
Giving no target is equivalent to using `default` as a target.
|
153
176
|
|
154
177
|
=== Databases
|
155
178
|
|
@@ -11,16 +11,19 @@ module AsciidoctorBibliography
|
|
11
11
|
@citations = []
|
12
12
|
@indices = []
|
13
13
|
@database = nil
|
14
|
-
@occurring_keys = []
|
14
|
+
@occurring_keys = Hash.new([])
|
15
15
|
end
|
16
16
|
|
17
17
|
def add_citation(citation)
|
18
18
|
citations << citation
|
19
|
-
|
19
|
+
citation.citation_items.group_by(&:target).each do |target, citation_items|
|
20
|
+
@occurring_keys[target] ||= []
|
21
|
+
@occurring_keys[target].concat(citation_items.map(&:key)).uniq!
|
22
|
+
end
|
20
23
|
end
|
21
24
|
|
22
|
-
def appearance_index_of(id)
|
23
|
-
@occurring_keys.index(id) + 1
|
25
|
+
def appearance_index_of(target, id)
|
26
|
+
@occurring_keys[target].index(id) + 1
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
@@ -21,9 +21,9 @@ module AsciidoctorBibliography
|
|
21
21
|
@macro = macro
|
22
22
|
@citation_items = []
|
23
23
|
# rubocop:disable Performance/HashEachMethods
|
24
|
-
target_and_attributes_list_pairs.compact.each_slice(2).each do |
|
24
|
+
target_and_attributes_list_pairs.compact.each_slice(2).each do |target, attribute_list|
|
25
25
|
@citation_items << CitationItem.new do |cite|
|
26
|
-
|
26
|
+
cite.target = target.to_s.empty? ? "default" : target
|
27
27
|
cite.parse_attribute_list attribute_list
|
28
28
|
end
|
29
29
|
end
|
@@ -81,7 +81,7 @@ module AsciidoctorBibliography
|
|
81
81
|
|
82
82
|
def prepare_metadata(bibliographer, cite, affix: false)
|
83
83
|
bibliographer.database.find_entry_by_id(cite.key).
|
84
|
-
merge 'citation-number': bibliographer.appearance_index_of(cite.key),
|
84
|
+
merge 'citation-number': bibliographer.appearance_index_of(cite.target, cite.key),
|
85
85
|
'citation-label': cite.key, # TODO: smart label generators
|
86
86
|
'locator': cite.locator.nil? ? nil : " ",
|
87
87
|
'prefix': affix ? cite.prefix : nil,
|
@@ -93,7 +93,8 @@ module AsciidoctorBibliography
|
|
93
93
|
# TODO: hyperlink, suppress_author and only_author options
|
94
94
|
ci = citation_items.detect { |c| c.key == item.id }
|
95
95
|
wrap_item item, ci.prefix, ci.suffix if affix
|
96
|
-
|
96
|
+
id = xref_id "bibliography", ci.target, item.id
|
97
|
+
wrap_item item, "xref:#{id}{{{", "}}}" if options.hyperlinks?
|
97
98
|
item.label, item.locator = ci.locator
|
98
99
|
end
|
99
100
|
|
@@ -106,12 +107,8 @@ module AsciidoctorBibliography
|
|
106
107
|
":#{@uuid}:"
|
107
108
|
end
|
108
109
|
|
109
|
-
def xref_id(
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
def xref(key, label)
|
114
|
-
"xref:#{xref_id(key)}[#{label.gsub(']', '\]')}]"
|
110
|
+
def xref_id(*fragments)
|
111
|
+
fragments.compact.join("-")
|
115
112
|
end
|
116
113
|
end
|
117
114
|
end
|
@@ -9,7 +9,7 @@ module AsciidoctorBibliography
|
|
9
9
|
|
10
10
|
def initialize(macro, target, attributes)
|
11
11
|
@macro = macro
|
12
|
-
@target = target
|
12
|
+
@target = target.to_s.empty? ? "default" : target
|
13
13
|
@attributes = ::Asciidoctor::AttributeList.new(attributes).parse
|
14
14
|
end
|
15
15
|
|
@@ -19,7 +19,8 @@ module AsciidoctorBibliography
|
|
19
19
|
lines = []
|
20
20
|
formatter.bibliography.each_with_index do |reference, index|
|
21
21
|
line = "{empty}"
|
22
|
-
|
22
|
+
id = anchor_id "bibliography", target, formatter.data[index].id
|
23
|
+
line << "anchor:#{id}[]"
|
23
24
|
line << reference
|
24
25
|
lines << line
|
25
26
|
end
|
@@ -43,27 +44,19 @@ module AsciidoctorBibliography
|
|
43
44
|
end
|
44
45
|
|
45
46
|
def prepare_filtered_db(bibliographer)
|
46
|
-
bibliographer.occurring_keys.
|
47
|
+
bibliographer.occurring_keys[target].
|
47
48
|
map { |id| bibliographer.database.find_entry_by_id(id) }.
|
48
49
|
map { |entry| prepare_entry_metadata bibliographer, entry }
|
49
50
|
end
|
50
51
|
|
51
52
|
def prepare_entry_metadata(bibliographer, entry)
|
52
53
|
entry.
|
53
|
-
merge('citation-number': bibliographer.appearance_index_of(entry["id"])).
|
54
|
+
merge('citation-number': bibliographer.appearance_index_of(target, entry["id"])).
|
54
55
|
merge('citation-label': entry["id"]) # TODO: smart label generators
|
55
56
|
end
|
56
57
|
|
57
|
-
def anchor_id(
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
def render_entry_label(target, formatter)
|
62
|
-
formatter.render(:bibliography, id: target).join
|
63
|
-
end
|
64
|
-
|
65
|
-
def render_entry(target, formatter)
|
66
|
-
"anchor:#{anchor_id(target)}[]#{render_entry_label(target, formatter)}"
|
58
|
+
def anchor_id(*fragments)
|
59
|
+
fragments.compact.join("-")
|
67
60
|
end
|
68
61
|
end
|
69
62
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
= Sample usage of asciidoctor-bibliography
|
2
|
+
:bibliography-database: biblio.bib
|
3
|
+
:bibliography-hyperlinks: true
|
4
|
+
|
5
|
+
## Standard
|
6
|
+
|
7
|
+
cite:[Lane12a]
|
8
|
+
|
9
|
+
cite:foo[Anderson04]
|
10
|
+
|
11
|
+
cite:bar[Lane12a]+foo[Lane12b]
|
12
|
+
|
13
|
+
## Bibliographies
|
14
|
+
|
15
|
+
### Default
|
16
|
+
|
17
|
+
bibliography::default[]
|
18
|
+
|
19
|
+
### Foo
|
20
|
+
|
21
|
+
bibliography::foo[]
|
22
|
+
|
23
|
+
### Bar
|
24
|
+
|
25
|
+
bibliography::bar[]
|
data/spec/macros_spec.rb
CHANGED
@@ -7,8 +7,8 @@ describe "cite macro with apa style" do
|
|
7
7
|
expect(formatted_citation("cite:[Erdos65, prefix=see]+[Einstein35, page=41-43]",
|
8
8
|
options: { "bibliography-style" => "apa",
|
9
9
|
"bibliography-hyperlinks" => "true" })).
|
10
|
-
to eq "(xref:bibliography-Einstein35[Einstein, Podolsky, & Rosen, 1935, pp. 41-43]; " +
|
11
|
-
"xref:bibliography-Erdos65[seeErdős, Heyting, & Brouwer, 1965])"
|
10
|
+
to eq "(xref:bibliography-default-Einstein35[Einstein, Podolsky, & Rosen, 1935, pp. 41-43]; " +
|
11
|
+
"xref:bibliography-default-Erdos65[seeErdős, Heyting, & Brouwer, 1965])"
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
data/spec/sanity_spec.rb
CHANGED
@@ -42,6 +42,13 @@ describe "asciidoctor integration" do
|
|
42
42
|
publisher = {Publisher},
|
43
43
|
year = {2000}
|
44
44
|
}
|
45
|
+
|
46
|
+
@article{Qux00,
|
47
|
+
author = {Qux Zot},
|
48
|
+
title = {Title},
|
49
|
+
publisher = {Publisher},
|
50
|
+
year = {3000}
|
51
|
+
}
|
45
52
|
BIBTEX
|
46
53
|
|
47
54
|
describe "testing procedure" do
|
@@ -75,10 +82,10 @@ describe "asciidoctor integration" do
|
|
75
82
|
expect(File.read(output_path)).to include <<~'BODY'
|
76
83
|
<div id="content">
|
77
84
|
<div class="paragraph">
|
78
|
-
<p>Hello World. (<a href="#bibliography-Foo00">Bar, 2000</a>)</p>
|
85
|
+
<p>Hello World. (<a href="#bibliography-default-Foo00">Bar, 2000</a>)</p>
|
79
86
|
</div>
|
80
87
|
<div class="paragraph">
|
81
|
-
<p><a id="bibliography-Foo00"></a>Bar, F. (2000). Title.</p>
|
88
|
+
<p><a id="bibliography-default-Foo00"></a>Bar, F. (2000). Title.</p>
|
82
89
|
</div>
|
83
90
|
</div>
|
84
91
|
BODY
|
@@ -105,13 +112,101 @@ describe "asciidoctor integration" do
|
|
105
112
|
expect(File.read(output_path)).to include <<~'BODY'
|
106
113
|
<div id="content">
|
107
114
|
<div class="paragraph">
|
108
|
-
<p>Hello World. (<a href="#bibliography-Foo00">Bar, 2000</a>)</p>
|
115
|
+
<p>Hello World. (<a href="#bibliography-default-Foo00">Bar, 2000</a>)</p>
|
109
116
|
</div>
|
110
117
|
<div class="paragraph">
|
111
|
-
<p>This is content from a nested file. (<a href="#bibliography-Foo00">Bar, 2000</a>)</p>
|
118
|
+
<p>This is content from a nested file. (<a href="#bibliography-default-Foo00">Bar, 2000</a>)</p>
|
112
119
|
</div>
|
113
120
|
<div class="paragraph">
|
114
|
-
<p><a id="bibliography-Foo00"></a>Bar, F. (2000). Title.</p>
|
121
|
+
<p><a id="bibliography-default-Foo00"></a>Bar, F. (2000). Title.</p>
|
122
|
+
</div>
|
123
|
+
</div>
|
124
|
+
BODY
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "multiple bibliographies usage" do
|
129
|
+
it "works with a single file and multiple bibliographies" do
|
130
|
+
setup_file tmpdir, "nested.adoc", <<~ADOC
|
131
|
+
This is content from a nested file. cite:[Foo00]
|
132
|
+
|
133
|
+
bibliography::[]
|
134
|
+
ADOC
|
135
|
+
|
136
|
+
input_path, output_path = setup_main_document tmpdir, <<~ADOC
|
137
|
+
:bibliography-database: #{bibliography_path}
|
138
|
+
|
139
|
+
## Citations
|
140
|
+
|
141
|
+
cite:[Foo00]
|
142
|
+
|
143
|
+
cite:first[Qux00]
|
144
|
+
|
145
|
+
cite:first[Foo00]+last[Qux00]
|
146
|
+
|
147
|
+
## Bibliographies
|
148
|
+
|
149
|
+
### Default
|
150
|
+
|
151
|
+
bibliography::[]
|
152
|
+
|
153
|
+
### First
|
154
|
+
|
155
|
+
bibliography::first[]
|
156
|
+
|
157
|
+
### Last
|
158
|
+
|
159
|
+
bibliography::last[]
|
160
|
+
ADOC
|
161
|
+
|
162
|
+
expect { `asciidoctor -r asciidoctor-bibliography #{input_path} --trace` }.to_not raise_exception
|
163
|
+
expect(File.read(output_path)).to include <<~'BODY'
|
164
|
+
<div id="content">
|
165
|
+
<div class="sect1">
|
166
|
+
<h2 id="_citations">Citations</h2>
|
167
|
+
<div class="sectionbody">
|
168
|
+
<div class="paragraph">
|
169
|
+
<p>(<a href="#bibliography-default-Foo00">Bar, 2000</a>)</p>
|
170
|
+
</div>
|
171
|
+
<div class="paragraph">
|
172
|
+
<p>(<a href="#bibliography-first-Qux00">Zot, 3000</a>)</p>
|
173
|
+
</div>
|
174
|
+
<div class="paragraph">
|
175
|
+
<p>(<a href="#bibliography-first-Foo00">Bar, 2000</a>; <a href="#bibliography-last-Qux00">Zot, 3000</a>)</p>
|
176
|
+
</div>
|
177
|
+
</div>
|
178
|
+
</div>
|
179
|
+
<div class="sect1">
|
180
|
+
<h2 id="_bibliographies">Bibliographies</h2>
|
181
|
+
<div class="sectionbody">
|
182
|
+
<div class="sect2">
|
183
|
+
<h3 id="_default">Default</h3>
|
184
|
+
<div class="paragraph">
|
185
|
+
<p><a id="bibliography-default-Foo00"></a>Bar, F. (2000). Title.</p>
|
186
|
+
</div>
|
187
|
+
<div class="paragraph">
|
188
|
+
<p><a id="bibliography-default-Qux00"></a>Zot, Q. (3000). Title.</p>
|
189
|
+
</div>
|
190
|
+
</div>
|
191
|
+
<div class="sect2">
|
192
|
+
<h3 id="_first">First</h3>
|
193
|
+
<div class="paragraph">
|
194
|
+
<p><a id="bibliography-first-Foo00"></a>Bar, F. (2000). Title.</p>
|
195
|
+
</div>
|
196
|
+
<div class="paragraph">
|
197
|
+
<p><a id="bibliography-first-Qux00"></a>Zot, Q. (3000). Title.</p>
|
198
|
+
</div>
|
199
|
+
</div>
|
200
|
+
<div class="sect2">
|
201
|
+
<h3 id="_last">Last</h3>
|
202
|
+
<div class="paragraph">
|
203
|
+
<p><a id="bibliography-last-Foo00"></a>Bar, F. (2000). Title.</p>
|
204
|
+
</div>
|
205
|
+
<div class="paragraph">
|
206
|
+
<p><a id="bibliography-last-Qux00"></a>Zot, Q. (3000). Title.</p>
|
207
|
+
</div>
|
208
|
+
</div>
|
209
|
+
</div>
|
115
210
|
</div>
|
116
211
|
</div>
|
117
212
|
BODY
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asciidoctor-bibliography
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -258,6 +258,7 @@ files:
|
|
258
258
|
- samples/standard/sample-din.html
|
259
259
|
- samples/standard/sample-ieee.adoc
|
260
260
|
- samples/standard/sample-ieee.html
|
261
|
+
- samples/standard/sample-targets.adoc
|
261
262
|
- samples/tex/biblio.bib
|
262
263
|
- samples/tex/sample-authoryear.adoc
|
263
264
|
- samples/tex/sample-authoryear.html
|
@@ -319,8 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
319
320
|
- !ruby/object:Gem::Version
|
320
321
|
version: '0'
|
321
322
|
requirements: []
|
322
|
-
|
323
|
-
rubygems_version: 2.5.2
|
323
|
+
rubygems_version: 3.0.3
|
324
324
|
signing_key:
|
325
325
|
specification_version: 4
|
326
326
|
summary: Citations and bibliography the "asciidoctor-way"
|