asciidoctor-bibliography 0.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +17 -0
- data/Gemfile +1 -1
- data/Rakefile +3 -3
- data/asciidoctor-bibliography.gemspec +28 -26
- data/lib/asciidoctor-bibliography.rb +4 -1
- data/lib/asciidoctor-bibliography/asciidoctor.rb +3 -9
- data/lib/asciidoctor-bibliography/asciidoctor/bibliographer_preprocessor.rb +43 -15
- data/lib/asciidoctor-bibliography/asciidoctor/document_ext.rb +11 -0
- data/lib/asciidoctor-bibliography/bibliographer.rb +20 -9
- data/lib/asciidoctor-bibliography/citation.rb +74 -51
- data/lib/asciidoctor-bibliography/citation_item.rb +27 -0
- data/lib/asciidoctor-bibliography/database.rb +14 -7
- data/lib/asciidoctor-bibliography/databases/bibtex.rb +5 -4
- data/lib/asciidoctor-bibliography/exceptions.rb +5 -0
- data/lib/asciidoctor-bibliography/formatters/csl.rb +5 -0
- data/lib/asciidoctor-bibliography/formatters/tex.rb +20 -22
- data/lib/asciidoctor-bibliography/helpers.rb +3 -3
- data/lib/asciidoctor-bibliography/index.rb +21 -25
- data/lib/asciidoctor-bibliography/version.rb +1 -1
- data/samples/{biblio.bib → standard/biblio.bib} +0 -0
- data/samples/standard/sample-default.adoc +22 -0
- data/samples/standard/sample-default.html +476 -0
- data/samples/standard/sample-din.adoc +22 -0
- data/samples/standard/sample-din.html +476 -0
- data/samples/standard/sample-ieee.adoc +22 -0
- data/samples/standard/sample-ieee.html +476 -0
- data/samples/tex/biblio.bib +31 -0
- data/samples/{sample-authoryear.adoc → tex/sample-authoryear.adoc} +2 -3
- data/samples/{sample-authoryear.html → tex/sample-authoryear.html} +9 -6
- data/samples/tex/sample-din.adoc +74 -0
- data/samples/tex/sample-din.html +556 -0
- data/samples/{sample-numbers.adoc → tex/sample-numbers.adoc} +4 -0
- data/samples/{sample-numbers.html → tex/sample-numbers.html} +14 -8
- data/samples/tex/sample-ordering.adoc +20 -0
- data/samples/tex/sample-ordering.html +467 -0
- data/spec/citation_item_spec.rb +52 -0
- data/spec/database_spec.rb +39 -0
- data/spec/fixtures/database.bib +31 -0
- data/spec/fixtures/database.bibtex +6 -0
- data/spec/fixtures/database.unk +0 -0
- data/spec/throwaway_spec.rb +6 -0
- metadata +61 -25
- data/deprecated/asciidoctor-bibliography/asciidoctor/bibliographer_postprocessor.rb +0 -23
- data/deprecated/asciidoctor-bibliography/asciidoctor/bibliography_block_macro.rb +0 -77
- data/deprecated/asciidoctor-bibliography/asciidoctor/citation_processor.rb +0 -144
- data/deprecated/asciidoctor-bibliography/asciidoctor/cite_inline_macro.rb +0 -30
- data/deprecated/asciidoctor-bibliography/citationdata.rb +0 -23
- data/deprecated/asciidoctor-bibliography/citations.rb +0 -45
- data/deprecated/asciidoctor-bibliography/citationutils.rb +0 -67
- data/deprecated/asciidoctor-bibliography/extensions.rb +0 -64
- data/deprecated/asciidoctor-bibliography/filehandlers.rb +0 -32
- data/deprecated/asciidoctor-bibliography/index.rb +0 -31
- data/deprecated/asciidoctor-bibliography/processor.rb +0 -208
- data/deprecated/asciidoctor-bibliography/processorutils.rb +0 -34
- data/deprecated/asciidoctor-bibliography/styles.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6260e8b2da719aeb370dfe1946181cab10dadd35
|
4
|
+
data.tar.gz: f8e5f843bd9348f0333c1257b042578ce2f435b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cec621922c04cbefa6047adf59a648413c72253366172d2beda895708c6559ce52d79c07a13a71f20b573e04b3c6de69e0dc30c69ef07def99afc2689c3284b
|
7
|
+
data.tar.gz: a927d96b5e3c2725643ae0b20aea75147281d288de88d5dd578306c83559c2a27227217c4afb8e3639d7afa2fa4d8498365b6b142b3d8b976a5b9a44cd36e40e
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.3
|
3
|
+
Excludes:
|
4
|
+
- deprecated/**/*.rb
|
5
|
+
- spec/**/*.rb
|
6
|
+
|
7
|
+
Metrics/LineLength:
|
8
|
+
Max: 120
|
9
|
+
|
10
|
+
FrozenStringLiteralComment:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Style/FileName:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Documentation:
|
17
|
+
Enabled: false
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,40 +1,42 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require 'asciidoctor-bibliography/version'
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
8
|
+
spec.name = 'asciidoctor-bibliography'
|
9
9
|
spec.version = AsciidoctorBibliography::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
10
|
+
spec.authors = ['Ribose Inc.']
|
11
|
+
spec.email = ['open.source@ribose.com']
|
12
12
|
|
13
|
-
spec.summary =
|
14
|
-
spec.description =
|
15
|
-
asciidoctor-bibliography adds bibliography support for asciidoc documents by introducing
|
16
|
-
two new macros: `cite:[KEY]` and `bibliography::[]`. Citations are parsed and
|
17
|
-
replaced with formatted inline texts, and reference lists are automatically
|
18
|
-
generated and inserted into where `bibliography::[]` is placed. The
|
19
|
-
references are formatted using styles provided by CSL.
|
13
|
+
spec.summary = 'Bibliographic references for asciidoc'
|
14
|
+
spec.description = <<~END
|
15
|
+
asciidoctor-bibliography adds bibliography support for asciidoc documents by introducing
|
16
|
+
two new macros: `cite:[KEY]` and `bibliography::[]`. Citations are parsed and
|
17
|
+
replaced with formatted inline texts, and reference lists are automatically
|
18
|
+
generated and inserted into where `bibliography::[]` is placed. The
|
19
|
+
references are formatted using styles provided by CSL.
|
20
20
|
END
|
21
|
-
spec.homepage =
|
22
|
-
spec.license =
|
21
|
+
spec.homepage = 'https://github.com/riboseinc/asciidoctor-bibliography'
|
22
|
+
spec.license = 'MIT'
|
23
23
|
|
24
|
-
spec.require_paths = [
|
24
|
+
spec.require_paths = ['lib']
|
25
25
|
spec.files = `git ls-files`.split("\n")
|
26
26
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
27
|
-
spec.required_ruby_version = Gem::Requirement.new(
|
27
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
28
28
|
|
29
|
-
spec.add_dependency
|
30
|
-
spec.add_dependency
|
31
|
-
spec.add_dependency
|
32
|
-
spec.add_dependency
|
33
|
-
spec.add_dependency
|
29
|
+
spec.add_dependency 'asciidoctor'
|
30
|
+
spec.add_dependency 'citeproc-ruby'
|
31
|
+
spec.add_dependency 'csl-styles', '~> 1'
|
32
|
+
spec.add_dependency 'latex-decode', '~> 0.2'
|
33
|
+
spec.add_dependency 'bibtex-ruby'
|
34
34
|
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
35
|
+
spec.add_development_dependency 'bundler'
|
36
|
+
spec.add_development_dependency 'byebug'
|
37
|
+
spec.add_development_dependency 'rspec'
|
38
|
+
spec.add_development_dependency 'rake'
|
39
|
+
spec.add_development_dependency 'simplecov'
|
40
|
+
spec.add_development_dependency 'yard'
|
41
|
+
spec.add_development_dependency 'rubocop'
|
40
42
|
end
|
@@ -1,17 +1,11 @@
|
|
1
1
|
require 'asciidoctor/extensions'
|
2
2
|
|
3
3
|
require_relative 'asciidoctor/bibliographer_preprocessor'
|
4
|
+
require_relative 'asciidoctor/document_ext'
|
4
5
|
require_relative 'bibliographer'
|
5
6
|
|
7
|
+
Asciidoctor::Document.include AsciidoctorBibliography::Asciidoctor::DocumentExt
|
8
|
+
|
6
9
|
Asciidoctor::Extensions.register do
|
7
10
|
preprocessor AsciidoctorBibliography::Asciidoctor::BibliographerPreprocessor
|
8
11
|
end
|
9
|
-
|
10
|
-
module Asciidoctor
|
11
|
-
class Document
|
12
|
-
# All our document-level permanence passes through this attribute accessor.
|
13
|
-
def bibliographer
|
14
|
-
@bibliographer ||= AsciidoctorBibliography::Bibliographer.new
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'asciidoctor'
|
2
|
+
require 'pp'
|
2
3
|
|
3
4
|
require_relative '../helpers'
|
4
|
-
require_relative '../formatters/csl'
|
5
|
-
require_relative '../formatters/tex'
|
6
5
|
require_relative '../database'
|
7
6
|
require_relative '../citation'
|
8
7
|
require_relative '../index'
|
@@ -10,15 +9,16 @@ require_relative '../index'
|
|
10
9
|
module AsciidoctorBibliography
|
11
10
|
module Asciidoctor
|
12
11
|
class BibliographerPreprocessor < ::Asciidoctor::Extensions::Preprocessor
|
13
|
-
def process
|
12
|
+
def process(document, reader)
|
14
13
|
set_bibliographer_options(document, reader)
|
15
14
|
|
16
|
-
|
15
|
+
if document.bibliographer.options['database'].nil?
|
16
|
+
warn "No bibliographic database was provided: all bibliographic macros will be ignored. You can set it using the 'bibliography-database' option in the document's preamble."
|
17
|
+
return reader
|
18
|
+
end
|
19
|
+
|
20
|
+
# Load database(s).
|
17
21
|
document.bibliographer.database = Database.new(document.bibliographer.options['database'])
|
18
|
-
document.bibliographer.index_formatter = Formatters::CSL.new(document.bibliographer.options['reference-style'])
|
19
|
-
document.bibliographer.index_formatter.import document.bibliographer.database
|
20
|
-
document.bibliographer.citation_formatter = Formatters::TeX.new(document.bibliographer.options['citation-style'])
|
21
|
-
document.bibliographer.citation_formatter.import document.bibliographer.database
|
22
22
|
|
23
23
|
# Find, store and replace citations with uuids.
|
24
24
|
processed_lines = reader.read_lines.map do |line|
|
@@ -31,6 +31,7 @@ module AsciidoctorBibliography
|
|
31
31
|
reader = ::Asciidoctor::Reader.new processed_lines
|
32
32
|
|
33
33
|
# NOTE: retrieval and formatting are separated to allow sorting and numeric styles.
|
34
|
+
# document.bibliographer.sort
|
34
35
|
|
35
36
|
# Find and replace uuids with formatted citations.
|
36
37
|
processed_lines = reader.lines.join("\n") # for quicker matching
|
@@ -40,7 +41,6 @@ module AsciidoctorBibliography
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
processed_lines = processed_lines.lines.map(&:chomp)
|
43
|
-
|
44
44
|
reader = ::Asciidoctor::Reader.new processed_lines
|
45
45
|
|
46
46
|
# Find and format indices.
|
@@ -53,19 +53,47 @@ module AsciidoctorBibliography
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
processed_lines.flatten!
|
56
|
-
|
56
|
+
::Asciidoctor::Reader.new processed_lines
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
60
60
|
|
61
|
+
OPTIONS_PREFIX = 'bibliography-'.freeze
|
62
|
+
|
63
|
+
OPTIONS_DEFAULTS = {
|
64
|
+
'order' => 'alphabetical',
|
65
|
+
'reference-style' => 'apa',
|
66
|
+
'citation-style' => 'authoryear',
|
67
|
+
'hyperlinks' => 'true',
|
68
|
+
'database' => nil
|
69
|
+
}.freeze
|
70
|
+
|
61
71
|
def set_bibliographer_options(document, reader)
|
62
72
|
# We peek at the document attributes we need, without perturbing the parsing flow.
|
63
73
|
# NOTE: we're in a preprocessor and they haven't been parsed yet; doing it manually.
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
74
|
+
# pp reader
|
75
|
+
header_attributes = extract_header_attributes reader
|
76
|
+
user_options = filter_bibliography_attributes header_attributes
|
77
|
+
document.bibliographer.options = OPTIONS_DEFAULTS.merge user_options
|
78
|
+
end
|
79
|
+
|
80
|
+
def extract_header_attributes(reader)
|
81
|
+
tdoc = ::Asciidoctor::Document.new
|
82
|
+
treader = ::Asciidoctor::PreprocessorReader.new(
|
83
|
+
tdoc,
|
84
|
+
reader.source_lines
|
85
|
+
)
|
86
|
+
|
87
|
+
::Asciidoctor::Parser
|
88
|
+
.parse(treader, tdoc, header_only: true)
|
89
|
+
.attributes
|
90
|
+
end
|
91
|
+
|
92
|
+
def filter_bibliography_attributes(hash)
|
93
|
+
Helpers
|
94
|
+
.slice(hash, *OPTIONS_DEFAULTS.keys.map { |k| "#{OPTIONS_PREFIX}#{k}" })
|
95
|
+
.map { |k, v| [k[OPTIONS_PREFIX.length..-1], v] }.to_h
|
96
|
+
.reject { |_, value| value.nil? || value.empty? }.to_h
|
69
97
|
end
|
70
98
|
end
|
71
99
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Extends Document to support additional method
|
2
|
+
module AsciidoctorBibliography
|
3
|
+
module Asciidoctor
|
4
|
+
module DocumentExt
|
5
|
+
# All our document-level permanence passes through this accessor.
|
6
|
+
def bibliographer
|
7
|
+
@bibliographer ||= AsciidoctorBibliography::Bibliographer.new
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -3,29 +3,40 @@ module AsciidoctorBibliography
|
|
3
3
|
attr_accessor :citations
|
4
4
|
attr_accessor :indices
|
5
5
|
attr_accessor :database
|
6
|
-
attr_accessor :index_formatter
|
7
|
-
attr_accessor :citation_formatter
|
8
6
|
attr_reader :occurring_keys
|
9
7
|
attr_accessor :options
|
10
8
|
|
11
|
-
# NOTE: while database and formatter are singular, they're meant for future generalization.
|
12
|
-
|
13
9
|
def initialize
|
14
10
|
@options = {}
|
15
11
|
@citations = []
|
16
12
|
@indices = []
|
17
13
|
@database = nil
|
18
|
-
@index_formatter = nil
|
19
|
-
@citation_formatter = nil
|
20
14
|
@occurring_keys = []
|
21
15
|
end
|
22
16
|
|
23
17
|
def add_citation(citation)
|
24
18
|
citations << citation
|
25
|
-
@occurring_keys.concat(citation.
|
26
|
-
|
27
|
-
|
19
|
+
@occurring_keys.concat(citation.citation_items.map(&:key)).uniq!
|
20
|
+
end
|
21
|
+
|
22
|
+
def appearance_index_of(id)
|
23
|
+
@occurring_keys.index(id) + 1
|
24
|
+
end
|
25
|
+
|
26
|
+
def sort
|
27
|
+
if options['order'] == 'alphabetical'
|
28
|
+
@occurring_keys = @occurring_keys.sort_by do |target|
|
29
|
+
first_author_family_name(target)
|
30
|
+
end
|
28
31
|
end
|
29
32
|
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def first_author_family_name(key)
|
37
|
+
authors = database.find { |h| h['id'] == key }['author']
|
38
|
+
return '' if authors.nil?
|
39
|
+
authors.map { |h| h['family'] }.compact.first # TODO: is the first also alphabetically the first?
|
40
|
+
end
|
30
41
|
end
|
31
42
|
end
|
@@ -1,83 +1,106 @@
|
|
1
1
|
require 'securerandom'
|
2
|
-
|
2
|
+
require_relative 'formatters/csl'
|
3
|
+
require_relative 'formatters/tex'
|
4
|
+
require_relative 'citation_item'
|
3
5
|
|
4
6
|
module AsciidoctorBibliography
|
5
7
|
class Citation
|
6
8
|
TEX_MACROS_NAMES = Formatters::TeX::MACROS.keys.map { |s| Regexp.escape s }.concat(['fullcite']).join('|')
|
7
9
|
REGEXP = /\\?(#{TEX_MACROS_NAMES}):(?:(\S*?)?\[(|.*?[^\\])\])(?:\+(\S*?)?\[(|.*?[^\\])\])*/
|
8
|
-
REF_ATTRIBUTES = %i[chapter page section clause]
|
10
|
+
REF_ATTRIBUTES = %i[chapter page section clause].freeze
|
9
11
|
|
10
|
-
|
11
|
-
Cite = Struct.new(:key, :occurrence_index, :target, :positional_attributes, :named_attributes)
|
12
|
+
attr_reader :macro, :citation_items
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
def initialize(macro, *targets_and_attributes_list)
|
14
|
+
def initialize(macro, *target_and_attributes_list_pairs)
|
16
15
|
@uuid = SecureRandom.uuid
|
17
16
|
@macro = macro
|
18
|
-
@
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
@cites << Cite.new(
|
26
|
-
positional_attributes.first,
|
27
|
-
nil,
|
28
|
-
target,
|
29
|
-
positional_attributes,
|
30
|
-
named_attributes
|
31
|
-
)
|
17
|
+
@citation_items = []
|
18
|
+
target_and_attributes_list_pairs.compact.each_slice(2).each do |_target, attribute_list|
|
19
|
+
@citation_items << CitationItem.new do |cite|
|
20
|
+
# NOTE: we're not doing anything with targets right now.
|
21
|
+
# cite.target = _target
|
22
|
+
cite.parse_attribute_list attribute_list
|
23
|
+
end
|
32
24
|
end
|
33
25
|
end
|
34
26
|
|
35
27
|
def render(bibliographer)
|
36
|
-
if macro == '
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
mergeable_attributes = Helpers.slice(cites.first.named_attributes || {}, *(REF_ATTRIBUTES.map(&:to_s)))
|
41
|
-
|
42
|
-
# reject empty values
|
43
|
-
mergeable_attributes.reject! do |key, value|
|
44
|
-
value.nil? || value.empty?
|
45
|
-
end
|
46
|
-
# TODO: as is, cites other than the first are simply ignored.
|
47
|
-
database_entry = bibliographer.database.find { |e| e['id'] == cites.first.key }
|
48
|
-
database_entry.merge!(mergeable_attributes)
|
49
|
-
formatter.import([database_entry])
|
50
|
-
'{empty}' + Helpers.html_to_asciidoc(formatter.render(:bibliography, id: cites.first.key).join)
|
28
|
+
if macro == 'cite'
|
29
|
+
render_citation_with_csl(bibliographer)
|
30
|
+
elsif macro == 'fullcite'
|
31
|
+
render_fullcite_with_csl(bibliographer)
|
51
32
|
elsif Formatters::TeX::MACROS.keys.include? macro
|
52
|
-
bibliographer.
|
33
|
+
formatter = Formatters::TeX.new(bibliographer.options['citation-style'])
|
34
|
+
formatter.import bibliographer.database
|
35
|
+
formatter.render(bibliographer, self)
|
53
36
|
end
|
54
37
|
end
|
55
38
|
|
56
|
-
def
|
57
|
-
|
39
|
+
def render_citation_with_csl(bibliographer)
|
40
|
+
formatter = Formatters::CSL.new(bibliographer.options['reference-style'])
|
41
|
+
|
42
|
+
cites_with_local_attributes = citation_items.map { |cite| prepare_cite_metadata bibliographer, cite }
|
43
|
+
formatter.import cites_with_local_attributes
|
44
|
+
formatter.sort(mode: :citation)
|
45
|
+
items = formatter.data.map(&:cite)
|
46
|
+
items.each { |item| prepare_citation_item item, hyperlink: bibliographer.options['hyperlinks'] == 'true' }
|
47
|
+
|
48
|
+
formatted_citation = formatter.engine.renderer.render(items, formatter.engine.style.citation)
|
49
|
+
# We prepend an empty interpolation to avoid interferences w/ standard syntax (e.g. block role is "\n[foo]")
|
50
|
+
'{empty}' + formatted_citation.gsub(/{{{(?<xref_label>.*?)}}}/) do
|
51
|
+
# We escape closing square brackets inside the xref label.
|
52
|
+
['[', Regexp.last_match[:xref_label].gsub(']', '\]'), ']'].join
|
53
|
+
end
|
58
54
|
end
|
59
55
|
|
60
|
-
def
|
61
|
-
|
56
|
+
def prepare_cite_metadata(bibliographer, cite)
|
57
|
+
bibliographer.database.find { |e| e['id'] == cite.key }
|
58
|
+
.merge('citation-number': bibliographer.appearance_index_of(cite.key))
|
59
|
+
.merge('citation-label': cite.key) # TODO: smart label generators
|
60
|
+
.merge('locator': cite.locators.any? ? ' ' : nil)
|
61
|
+
# TODO: why is 'locator' necessary to display locators? (and not just in the item, later)
|
62
62
|
end
|
63
63
|
|
64
|
-
def
|
65
|
-
|
64
|
+
def prepare_citation_item(item, hyperlink:)
|
65
|
+
# Wrap into hyperlink
|
66
|
+
if hyperlink
|
67
|
+
item.prefix = "xref:#{xref_id(item.id)}{{{" + item.prefix.to_s
|
68
|
+
item.suffix = item.suffix.to_s + '}}}'
|
69
|
+
end
|
70
|
+
# Assign locator
|
71
|
+
locator = citation_items.find { |cite| cite.key == item.id }.locators.first
|
72
|
+
item.label, item.locator = locator unless locator.nil?
|
73
|
+
# TODO: suppress_author and only_author options?
|
66
74
|
end
|
67
75
|
|
68
|
-
def
|
69
|
-
|
76
|
+
def render_fullcite_with_csl(bibliographer)
|
77
|
+
formatter = Formatters::CSL.new(bibliographer.options['reference-style'])
|
78
|
+
|
79
|
+
# NOTE: being able to overwrite a more general family of attributes would be neat.
|
80
|
+
mergeable_attributes = Helpers.slice(citation_items.first.named_attributes || {}, *REF_ATTRIBUTES.map(&:to_s))
|
81
|
+
|
82
|
+
# reject empty values
|
83
|
+
mergeable_attributes.reject! do |_key, value|
|
84
|
+
value.nil? || value.empty?
|
85
|
+
end
|
86
|
+
# TODO: as is, citation items other than the first are simply ignored.
|
87
|
+
database_entry = bibliographer.database.find { |e| e['id'] == citation_items.first.key }
|
88
|
+
database_entry.merge!(mergeable_attributes)
|
89
|
+
formatter.import([database_entry])
|
90
|
+
'{empty}' + Helpers.html_to_asciidoc(formatter.render(:bibliography, id: citation_items.first.key).join)
|
91
|
+
# '{empty}' + Helpers.html_to_asciidoc(formatter.render(:citation, id: citation_items.first.key))
|
70
92
|
end
|
71
93
|
|
72
|
-
|
94
|
+
def uuid
|
95
|
+
":#{@uuid}:"
|
96
|
+
end
|
73
97
|
|
74
|
-
def
|
75
|
-
|
98
|
+
def xref_id(key)
|
99
|
+
['bibliography', key].compact.join('-')
|
76
100
|
end
|
77
101
|
|
78
|
-
def
|
79
|
-
"xref:#{
|
102
|
+
def xref(key, label)
|
103
|
+
"xref:#{xref_id(key)}[#{label.gsub(']', '\]')}]"
|
80
104
|
end
|
81
105
|
end
|
82
106
|
end
|
83
|
-
|