asciidoctor-bibliography 0.1 → 0.2.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 +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
|
-
|