asciidoctor-bibtex 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3d66291de5bde00c8773c279133b29d5c2a70735
4
+ data.tar.gz: a86cb9606d51b1ce9110d2a93c64fa0aa19c92c4
5
+ SHA512:
6
+ metadata.gz: e7c0a804b7ce6f69df4a80bccb8ad22f62a1b946ca5eeba9840b93563311f5efe5ba3c32d236e829b0ce98d685a3e070ca677fbec92b46ecf9fbd3f5c1083b5b
7
+ data.tar.gz: 76e579bd5924ed9c38d6c0142b9bfa4ca4b29b36bf5a573817d72de911ebe430d009d182b9878dd51911b3290cdd425f05a574a98c73b4b50d90b6e8edd32f41
@@ -0,0 +1,24 @@
1
+ # Open Works License
2
+
3
+ This is version 0.9.2 of the Open Works License
4
+
5
+ ## Terms
6
+
7
+ Permission is hereby granted by the copyright holder(s), author(s), and
8
+ contributor(s) of this work, to any person who obtains a copy of this work in
9
+ any form, to reproduce, modify, distribute, publish, sell, use, or otherwise
10
+ deal in the licensed material without restriction, provided the following
11
+ conditions are met:
12
+
13
+ Redistributions, modified or unmodified, in whole or in part, must retain
14
+ applicable copyright notices, the above license notice, these conditions, and
15
+ the following disclaimer.
16
+
17
+ NO WARRANTY OF ANY KIND IS IMPLIED BY, OR SHOULD BE INFERRED FROM, THIS LICENSE
18
+ OR THE ACT OF DISTRIBUTION UNDER THE TERMS OF THIS LICENSE, INCLUDING BUT NOT
19
+ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
20
+ AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF
22
+ CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE
23
+ WORK, OR THE USE OF OR OTHER DEALINGS IN THE WORK.
24
+
@@ -0,0 +1,166 @@
1
+ = asciidoctor-bibtex: add bibtex functionality to asciidoc
2
+
3
+ asciidoctor-bibtex is a fork of
4
+ {asciidoc-bib}[https://github.com/petercrlane/asciidoc-bib] It generates in-text
5
+ references and a reference list for an asciidoc file, using a bibtex file as a
6
+ source of citation information. However, asciidoctor-bibtex proposes a
7
+ different citation and reference grammar, which resembles the bibtex grammar
8
+ in LaTeX. The grammar follows asciidoc inline and block macro semantics.
9
+
10
+ == Why a fork
11
+
12
+ When I began switching from latex/word to asciidoc, I searched for an easy way
13
+ to integrate bibtex like references into asciidoc. Then I came across
14
+ asciidoc-bib, which nearly meet my needs. I can insert citations, generate
15
+ automatically a complete reference list. But there are aspects in asciidoc-bib
16
+ that are not pleasing to work with.
17
+
18
+ The first is the overriding of `[bibliography]`. Asciidoctor introduces
19
+ `[xxx]` as an mechanism to customize block styles, roles, etc.
20
+ `[bibliography]` is reserved for the bibliography section style. asciidoc-bib
21
+ breaks it and there is no apparent way to fix it.
22
+
23
+ The second is the grammar inconsistency with the rest of asciidoc. The
24
+ `[cite:xxx]` is actually an inline macro but it does not follow the grammar of
25
+ inline macros. This makes asciidoc-bib not that confortable to write with
26
+ since it breaks the semantic memory.
27
+
28
+ The last is asciidoc-bib does not support asciidoctor arguments and
29
+ extensions. So I can not use asciidoctor-pdf with it.
30
+
31
+ To accommodate the above problems, I create this fork. This fork tries to be
32
+ as consistent with asciidoctor as possible.
33
+
34
+ == Features
35
+
36
+ - bibtex-like syntax for adding a citation within text and placing bibliography
37
+ - formatting of references and reference list according to range of styles supported by citeproc-ruby
38
+ - supports some styling of citation text (page numbers, bracket placement)
39
+ - can be used as an asciidoctor extension
40
+
41
+ == Install
42
+
43
+ > gem install asciidoctor-bibtex
44
+
45
+ Installs two executable programs:
46
+
47
+ - 'asciidoc-bibtex' for transforming source text into asciidoc
48
+ - 'asciidoctor-bibtex' uses asciidoctor extension for single-pass output
49
+
50
+ asciidoctor-bibtex depends on bibtex-ruby[http://github.com/inukshuk/bibtex-ruby],
51
+ citeproc-ruby[http://github.com/inukshuk/citeproc-ruby] and
52
+ csl-styles[http://github.com/inukshuk/csl-styles].
53
+ (Ensure 'ruby-dev' and 'libxslt1-dev' are installed, so the dependencies will
54
+ compile.)
55
+
56
+ asciidoctor[https://github.com/asciidoctor/asciidoctor] must also be installed
57
+ for 'asciidoctor-bibtex' to work. asciidoctor version 1.5.2 or higher is
58
+ required.
59
+
60
+ == Use
61
+
62
+ There are three ways of using asciidoctor-bibtex.
63
+
64
+ The first is required if using _asciidoc_.
65
+ 'asciidoc-bibtex' works by transforming an asciidoc document containing syntax
66
+ to include citations and a bibliography. The transformed document will
67
+ contain a complete reference and bibliography list where indicated, and
68
+ can then be processed further by asciidoc's toolchain to produce a completed
69
+ document.
70
+
71
+ The second is to use 'asciidoctor-bibtex' to transform your bibtex-enabled
72
+ documents directly to any backend format supported by asciidoctor. It uses the
73
+ asciidoctor extension mechanism to hook in the asciidoctor preprocessing
74
+ process. It support all asciidoctor command-line options.
75
+
76
+ The third is to use asciidoctor-bibtex as an asciidoctor extension. It works
77
+ the same way as the second approach. In addition, one can use other extensions
78
+ together to provides even richer functionality.
79
+
80
+ Styles must be one of those supported by CSL: https://github.com/citation-style-language/styles
81
+
82
+ === Citation syntax
83
+
84
+ Syntax for inserting a citation is the following inline macro:
85
+
86
+ cite|citenp:[ref(pages)]
87
+
88
+ where '(pages)' is optional. The ref and optional pages may be repeated
89
+ multiple times, separated by ','. A citation _must_ be complete on a single
90
+ line of text.
91
+
92
+ Examples of +chicago-author-date+ style:
93
+
94
+ [cite:[Lane12]] becomes "(Lane 2012)"
95
+
96
+ [citenp:[Lane12]] becomes "Lane (2012)"
97
+
98
+ [cite:[Lane12(59)]] becomes "(Lane 2012, 59)"
99
+
100
+ For +apa+ (Harvard-like) style:
101
+
102
+ [cite:[Lane12]] becomes "(Lane, 2012)"
103
+
104
+ [citenp:[Lane12]] becomes "Lane (2012)"
105
+
106
+ [cite:[Lane12(59)]] becomes "(Lane, 2012, p.59)"
107
+
108
+ For +ieee+, a numeric style:
109
+
110
+ [cite:[Lane12,Lane11]] becomes "[1, 2]"
111
+
112
+ === Place bibliography in text
113
+
114
+ [bibliography::[]] on a line by itself.
115
+
116
+ === Processing Text: Asciidoctor
117
+
118
+ > asciidoctor-bibtex [OPTIONS] filename
119
+
120
+ Looks for a bib file in current folder and in ~/Documents.
121
+
122
+ Outputs an html file, including all citations and references.
123
+
124
+ asciidoctor-bibtex support all command-line options of asciidoctor, for
125
+ example, use the follow command to output docbook file:
126
+
127
+ asciidoctor-bibtex -b docbook filename
128
+
129
+ One may also use as an asciidoctor extension, for example:
130
+
131
+ asciidoctor -r asciidoctor-bibtex -r asciidoctor-pdf -b pdf filename
132
+
133
+ Options are set through the command-line using the asciidoctor attributes
134
+ setting syntax:
135
+
136
+ > asciidoctor-bibtex -h
137
+
138
+ ...
139
+ AsciidoctorBibtex related options:
140
+
141
+ -a bib-file=FILENAME Set BibTex filename (default: auto-find)
142
+ -a bib-style=STYLE Set BibTex items style (default: apa)
143
+ -a bib-numeric-order=<alphabetical|appearance>
144
+ Set citation order scheme (default: alphabetical)
145
+ -a bib-no-links=1 Do not use links (default: use links)
146
+
147
+ === Processing text: Asciidoc
148
+
149
+ > asciidoc-bibtex filename.txt
150
+
151
+ Looks for a bib file in current folder and in ~/Documents.
152
+
153
+ Outputs a new file: filename-ref.txt
154
+ which includes your references.
155
+
156
+ asciidoc-bibtex supports the same command-line options as asciidoc-bib. The
157
+ only difference is the citation and bibliography syntex.
158
+
159
+ == License
160
+
161
+ The files within this project may be distributed under the terms of
162
+ the Open Works License: http://owl.apotheon.org
163
+
164
+ == Links
165
+
166
+ See [https://github.com/petercrlane/asciidoc-bib] for the original asciidoc-bib.
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Executable for asciidoc-bibtex
4
+ #
5
+ # Provides some command line options for adding reference material
6
+ # to asciidoc files, generating revised files for processing by
7
+ # asciidoc.
8
+ #
9
+ # Copyright (c) Peter Lane, 2012-13.
10
+ # Released under Open Works License, 0.9.2
11
+
12
+ unless $:.include?(libdir = File.expand_path('../lib', File.dirname(__FILE__)))
13
+ $:.unshift libdir
14
+ end
15
+ require 'asciidoctor-bibtex'
16
+
17
+ options = AsciidoctorBibtex::Options.new
18
+ options.parse!
19
+ AsciidoctorBibtex::Processor.run options
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Executable asciidoctor-bib
4
+ #
5
+ # Uses asciidoctor preprocessor extension to include citations and bibliography
6
+ # in a single pass.
7
+ #
8
+ # Copyright (c) Peter Lane, 2013.
9
+ # Released under Open Works License, 0.9.2
10
+
11
+ unless $:.include?(libdir = File.expand_path('../lib', File.dirname(__FILE__)))
12
+ $:.unshift libdir
13
+ end
14
+ require 'asciidoctor-bibtex'
15
+ require 'asciidoctor/cli'
16
+
17
+ # Treat '--version' specially, like that in asciidoctor-pdf
18
+ options = Asciidoctor::Cli::Options.new
19
+ unless (ARGV & ['-V', '--version']).empty?
20
+ $stdout.write %(Asciidoctor Bib #{AsciidoctorBibtex::VERSION} using )
21
+ # NOTE the print_version method was added in Asciidoctor 1.5.2
22
+ if options.respond_to? :print_version
23
+ options.print_version
24
+ else
25
+ puts %(Asciidoctor #{::Asciidoctor::VERSION} [http://asciidoctor.org])
26
+ end
27
+ exit 0
28
+ end
29
+
30
+ # Add help information on how to set bibtex related values via asciidoctor
31
+ # commandline. This is the usual CLI attributes definition.
32
+ if not (ARGV & ['-h', '--help']).empty?
33
+ # parse argument with asciidoctor to print asciidoctor's helps
34
+ options.parse! ARGV
35
+ puts ""
36
+ puts "AsciidoctorBibtex related options:"
37
+ puts ""
38
+ puts " -a bib-file=FILENAME Set BibTex filename (default: auto-find)"
39
+ puts " -a bib-style=STYLE Set BibTex items style (default: apa)"
40
+ puts " -a bib-numeric-order=<alphabetical|appearance>"
41
+ puts " Set citation order scheme (default: alphabetical)"
42
+ puts " -a bib-no-links=1 Do not use links (default: use links)"
43
+ puts ""
44
+ exit 0
45
+ end
46
+
47
+ # Use standard asciidoctor CLI mechanism to call asciidoctor, so we can accept
48
+ # all asciidoctor options. Note that we only accept asciidoctor options here.
49
+ # This code is stolen shamlessly from asciidoctor-pdf
50
+ case (result = options.parse! ARGV)
51
+ when Integer
52
+ exit result
53
+ else
54
+ invoker = Asciidoctor::Cli::Invoker.new options
55
+ GC.start
56
+ invoker.invoke!
57
+ exit invoker.code
58
+ end
@@ -0,0 +1,25 @@
1
+ # asciidoctor-bibtex.rb
2
+ #
3
+ # Copyright (c) Peter Lane, 2012-13.
4
+ # Released under Open Works License, 0.9.2
5
+
6
+ require 'bibtex'
7
+ require 'citeproc'
8
+ require 'csl/styles'
9
+ require 'set'
10
+
11
+ # Only require asciidoctor file if asciidoctor gem is installed
12
+ unless Gem::Specification.find_all_by_name('asciidoctor').empty?
13
+ require_relative 'asciidoctor-bibtex/asciidoctor'
14
+ end
15
+ require_relative 'asciidoctor-bibtex/citation'
16
+ require_relative 'asciidoctor-bibtex/citationdata'
17
+ require_relative 'asciidoctor-bibtex/citationutils'
18
+ require_relative 'asciidoctor-bibtex/citations'
19
+ require_relative 'asciidoctor-bibtex/extensions'
20
+ require_relative 'asciidoctor-bibtex/filehandlers'
21
+ require_relative 'asciidoctor-bibtex/options'
22
+ require_relative 'asciidoctor-bibtex/processorutils'
23
+ require_relative 'asciidoctor-bibtex/processor'
24
+ require_relative 'asciidoctor-bibtex/styles'
25
+ require_relative 'asciidoctor-bibtex/version'
@@ -0,0 +1,6 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'bibextension'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ preprocessor AsciidoctorBibtex::Asciidoctor::AsciidoctorBibtexExtension
6
+ end
@@ -0,0 +1,66 @@
1
+ # Uses Asciidoctor extension mechanism to insert asciidoc-bib processing
2
+ # as a preprocessor step. This provides single-pass compilation of
3
+ # documents, including citations and references.
4
+ #
5
+ # Copyright (c) Peter Lane, 2013.
6
+ # Released under Open Works License, 0.9.2
7
+
8
+ require 'asciidoctor'
9
+ require 'asciidoctor/extensions'
10
+ require 'asciidoctor/cli'
11
+ require_relative 'options'
12
+
13
+ module AsciidoctorBibtex
14
+ module Asciidoctor
15
+
16
+ class AsciidoctorBibtexExtension < ::Asciidoctor::Extensions::Preprocessor
17
+
18
+ def process document, reader
19
+ return reader if reader.eof?
20
+
21
+ options = Options.new
22
+ options.parse_attributes document.attributes
23
+
24
+ # -- read in all lines from reader, processing the lines
25
+
26
+ lines = reader.readlines
27
+ biblio = BibTeX.open options.bibfile
28
+
29
+ processor = Processor.new biblio, options.links, options.style
30
+ lines.each do |line|
31
+ processor.citations.add_from_line line
32
+ end
33
+
34
+ # -- replace cites with correct text
35
+
36
+ lines.each do |line|
37
+ processor.citations.retrieve_citations(line).each do |citation|
38
+ line.gsub!(citation.original, processor.complete_citation(citation))
39
+ end
40
+ end
41
+
42
+ # -- add in bibliography
43
+
44
+ biblio_index = lines.index do |line|
45
+ # find bibliography macro on line by itself, with or without newline
46
+ (line =~ BIBMACRO_FULL) != nil
47
+ end
48
+ unless biblio_index.nil?
49
+ lines.delete_at biblio_index
50
+ processor.sorted_cites.reverse.each do |ref|
51
+ lines.insert biblio_index, "\n"
52
+ lines.insert biblio_index, processor.get_reference(ref)
53
+ lines.insert biblio_index, "[normal]\n" # ? needed to force paragraph breaks
54
+ end
55
+ end
56
+
57
+ reader.unshift_lines lines
58
+
59
+ return reader
60
+ end
61
+
62
+ BIBMACRO_FULL = /bibliography::(.*?)\[(\w+)?\]/
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,25 @@
1
+ # citation class
2
+ #
3
+ # Copyright (c) Peter Lane, 2012.
4
+ # Released under Open Works License, 0.9.2
5
+
6
+ module AsciidoctorBibtex
7
+ # Class to hold information about a single citation:
8
+ # its reference and any page numbers
9
+ class Citation
10
+ attr_reader :ref, :pages
11
+
12
+ def initialize ref, pages
13
+ @ref = ref
14
+ @pages = pages
15
+ # clean up pages
16
+ @pages = '' unless @pages
17
+ @pages.gsub!("--","-")
18
+ end
19
+
20
+ def to_s
21
+ "#{@ref}:#{@pages}"
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,23 @@
1
+ # citationdata class
2
+ #
3
+ # Copyright (c) Peter Lane, 2013.
4
+ # Released under Open Works License, 0.9.2
5
+
6
+ module AsciidoctorBibtex
7
+ # Class to hold information about a citation in text:
8
+ # the text forming the citation, its type, pretext, and enclosed cites
9
+ class CitationData
10
+ attr_reader :original, :type, :pretext, :cites
11
+
12
+ def initialize original, type, pretext, cites
13
+ @original = original
14
+ @type = type
15
+ @pretext = if pretext.nil?
16
+ ''
17
+ else
18
+ pretext
19
+ end
20
+ @cites = cites
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ #
2
+ # Class to hold and manage citations
3
+ #
4
+ # Copyright (c) Peter Lane, 2013.
5
+ # Released under Open Works License, 0.9.2
6
+
7
+ module AsciidoctorBibtex
8
+ # Class to store list of citations used in document
9
+ class Citations
10
+ include CitationUtils
11
+
12
+ attr_reader :cites_used
13
+
14
+ def initialize
15
+ @cites_used = []
16
+ end
17
+
18
+ # Given a line of text, extract any citations and include new citation references in current list
19
+ def add_from_line line
20
+ retrieve_citations(line).each do |citation|
21
+ @cites_used += citation.cites.collect {|cite| cite.ref}
22
+ end
23
+ @cites_used.uniq! {|item| item.to_s} # only keep each reference once
24
+ end
25
+
26
+ # Return a list of citation references in document, sorted into order
27
+ def sorted_cites biblio
28
+ @cites_used.sort_by do |ref|
29
+ bibitem = biblio[ref]
30
+
31
+ unless bibitem.nil?
32
+ # extract the reference, and uppercase.
33
+ # Remove { } from grouped names for sorting.
34
+ author = bibitem.author
35
+ if author.nil?
36
+ author = bibitem.editor
37
+ end
38
+ author_chicago(author).collect {|s| s.upcase.gsub("{","").gsub("}","")} + [bibitem.year]
39
+ else
40
+ [ref]
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,67 @@
1
+ # Utility functions for citations class
2
+ #
3
+ # Copyright (c) Peter Lane, 2013.
4
+ # Released under Open Works License, 0.9.2
5
+
6
+ module AsciidoctorBibtex
7
+ # Some utility functions used in Citations class
8
+ module CitationUtils
9
+
10
+ # Given a line, return a list of CitationData instances
11
+ # containing information on each set of citation information
12
+ def retrieve_citations line
13
+ result = []
14
+ md = CITATION_FULL.match line
15
+ while md
16
+ data = CitationData.new md[0], md[1], nil, []
17
+ cm = CITATION_KEY.match md[2]
18
+ while cm
19
+ pages = nil
20
+ if cm[2]
21
+ pages = cm[2][1...-1]
22
+ end
23
+ data.cites << Citation.new(cm[1], pages)
24
+ # look for next ref within citation
25
+ cm = CITATION_KEY.match cm.post_match
26
+ end
27
+ result << data
28
+ # look for next citation on line
29
+ md = CITATION_FULL.match md.post_match
30
+ end
31
+
32
+ return result
33
+ end
34
+
35
+ # arrange author string, flag for order of surname/initials
36
+ def arrange_authors authors, surname_first
37
+ return [] if authors.nil?
38
+ authors.split(/\band\b/).collect do |name|
39
+ if name.include?(", ")
40
+ parts = name.strip.rpartition(", ")
41
+ if surname_first
42
+ "#{parts.first}, #{parts.third}"
43
+ else
44
+ "#{parts.third} #{parts.first}"
45
+ end
46
+ else
47
+ name
48
+ end
49
+ end
50
+ end
51
+
52
+ # Arrange given author string into Chicago format
53
+ def author_chicago authors
54
+ arrange_authors authors, true
55
+ end
56
+
57
+ # matches a citation key, such as 'Dan2012(99-100)'
58
+ CITATION_KEY = /(\w+)(\(\d+(-\d+)*\))?/
59
+ # matches a citation type
60
+ CITATION_TYPE = /cite|citenp/
61
+ # matches a citation list
62
+ CITATION_LIST_TAIL = /(\s*,\s*#{CITATION_KEY})*/
63
+ CITATION_LIST = /(?:#{CITATION_KEY}#{CITATION_LIST_TAIL})/
64
+ # matches the whole citation
65
+ CITATION_FULL = /(#{CITATION_TYPE}):\[(#{CITATION_LIST})\]/
66
+ end
67
+ end
@@ -0,0 +1,64 @@
1
+ # Some extension and helper methods.
2
+ #
3
+ # Copyright (c) Peter Lane, 2012-13.
4
+ # Released under Open Works License, 0.9.2
5
+
6
+ module AsciidoctorBibtexArrayExtensions
7
+
8
+ # Retrieve the third item of an array
9
+ # Note: no checks for validity
10
+ def third
11
+ self[2]
12
+ end
13
+
14
+ # Join items in array using commas and 'and' on last item
15
+ def comma_and_join
16
+ if size < 2
17
+ return self.join("")
18
+ end
19
+ result = ""
20
+ self.each_with_index do |item, index|
21
+ if index.zero?
22
+ result << item
23
+ elsif index == size-1
24
+ result << " and #{item}"
25
+ else
26
+ result << ", #{item}"
27
+ end
28
+ end
29
+
30
+ return result
31
+ end
32
+ end
33
+
34
+ # monkey patch the extension methods to Array
35
+ class Array
36
+ include AsciidoctorBibtexArrayExtensions
37
+ end
38
+
39
+ # Converts html output produced by citeproc to asciidoc markup
40
+ module StringHtmlToAsciiDoc
41
+ def html_to_asciidoc
42
+ r = self.gsub(/<\/?i>/, '_')
43
+ r = r.gsub(/<\/?b>/, '*')
44
+ r = r.gsub(/<\/?span.*?>/, '')
45
+ r = r.gsub(/\{|\}/, '')
46
+ r
47
+ end
48
+ end
49
+
50
+ # Provides a check that a string is in integer
51
+ # Taken from:
52
+ # http://stackoverflow.com/questions/1235863/test-if-a-string-is-basically-an-integer-in-quotes-using-ruby
53
+ module IntegerCheck
54
+ def is_i?
55
+ !!(self =~ /^[-+]?[0-9]+$/)
56
+ end
57
+ end
58
+
59
+ # monkey patch the extension methods into String
60
+ class String
61
+ include StringHtmlToAsciiDoc
62
+ include IntegerCheck
63
+ end
64
+
@@ -0,0 +1,32 @@
1
+ #
2
+ # filehandlers.rb
3
+ # Contains top-level file utility methods
4
+ #
5
+
6
+ module AsciidoctorBibtex
7
+
8
+ module FileHandlers
9
+ # Locate a bibliography file to read in given dir
10
+ def FileHandlers.find_bibliography dir
11
+ begin
12
+ candidates = Dir.glob("#{dir}/*.bib")
13
+ if candidates.empty?
14
+ return ""
15
+ else
16
+ return candidates.first
17
+ end
18
+ rescue # catch all errors, and return empty string
19
+ return ""
20
+ end
21
+ end
22
+
23
+ # Add '-ref' before the extension of a filename
24
+ def FileHandlers.add_ref filename
25
+ file_dir = File.dirname(File.expand_path(filename))
26
+ file_base = File.basename(filename, ".*")
27
+ file_ext = File.extname(filename)
28
+ return "#{file_dir}#{File::SEPARATOR}#{file_base}-ref#{file_ext}"
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,141 @@
1
+ # Class to read in asciidoc-bibtex options from command-line, and
2
+ # store results in an accessible form.
3
+ #
4
+ # Copyright (c) Peter Lane, 2013.
5
+ # Released under Open Works License, 0.9.2
6
+
7
+ require 'optparse'
8
+
9
+ module AsciidoctorBibtex
10
+ class Options
11
+ attr_reader :bibfile, :filename, :links, :style
12
+
13
+ def initialize(program_name = 'asciidoc-bibtex')
14
+ @bibfile = ''
15
+ @links = true
16
+ @numeric_order = :alphabetical
17
+ @style = AsciidoctorBibtex::Styles.default_style
18
+ @program_name = program_name
19
+ end
20
+
21
+ # Public: Parse options from commandline.
22
+ # This function is used by asciidoc-bib command.
23
+ def parse!(args = ARGV)
24
+ options = OptionParser.new do |opts|
25
+ opts.banner = "Usage: #{@program_name} filename"
26
+ opts.on("-h", "--help", "help message") do |v|
27
+ puts "#{@program_name} #{AsciidoctorBibtex::VERSION}"
28
+ puts
29
+ puts options
30
+ puts
31
+ puts "All styles available through CSL are supported."
32
+ puts "The default style is 'apa'."
33
+ exit!
34
+ end
35
+ opts.on("-b", "--bibfile FILE", "location of bib file") do |v|
36
+ @bibfile = v
37
+ end
38
+ opts.on("-n", "--no-links", "do not add internal links") do |v|
39
+ @links = false
40
+ end
41
+ opts.on('', '--numeric-alphabetic-order', 'sort numeric styles in alphabetical order (DEFAULT)') do |v|
42
+ @numeric_order = :alphabetical
43
+ end
44
+ opts.on('', '--numeric-appearance-order', 'sort numeric styles in order of appearance') do |v|
45
+ @numeric_order = :appearance
46
+ end
47
+ opts.on("-s", "--style STYLE", "reference style") do |v|
48
+ @style = v
49
+ end
50
+ opts.on("-v", "--version", "show version") do |v|
51
+ puts "#{@program_name} version #{AsciidoctorBibtex::VERSION}"
52
+ exit!
53
+ end
54
+ end
55
+
56
+ begin
57
+ options.parse! args
58
+ rescue
59
+ puts options
60
+ exit!
61
+ end
62
+
63
+ # unless specified by caller, try to find the bibliography
64
+ if @bibfile.empty?
65
+ @bibfile = AsciidoctorBibtex::FileHandlers.find_bibliography "."
66
+ if @bibfile.empty?
67
+ @bibfile = AsciidoctorBibtex::FileHandlers.find_bibliography "#{ENV['HOME']}/Documents"
68
+ end
69
+ end
70
+ if @bibfile.empty?
71
+ puts "Error: could not find a bibliography file"
72
+ exit
73
+ end
74
+ unless AsciidoctorBibtex::Styles.valid? @style
75
+ puts "Error: style #{@style} was not one of the available styles"
76
+ exit
77
+ end
78
+
79
+ if args.length == 1
80
+ @filename = args[0]
81
+ else
82
+ puts "Error: a single file to convert must be given"
83
+ exit
84
+ end
85
+
86
+ puts "Reading biblio: #{@bibfile}"
87
+ puts "Reference style: #{@style}"
88
+ puts "Numerical order: #{@numeric_order}"
89
+ end
90
+
91
+ # Public: Parse values given `attrs`
92
+ # This function is used by asciidoctor preprocessor to determine options
93
+ # from document attributes.
94
+ def parse_attributes(attrs)
95
+ if attrs['bib-style']
96
+ @style = attrs['bib-style']
97
+ end
98
+ if attrs['bib-file']
99
+ @bibfile = attrs['bib-file']
100
+ end
101
+ if attrs['bib-numeric-order']
102
+ order = attrs['bib-numeric-order']
103
+ if order == "appearance"
104
+ @numeric_order = :appearance
105
+ elsif order == "alphabetical"
106
+ @numeric_order = :alphabetical
107
+ else
108
+ raise RuntimeError.new "Unknown numeric order: #{order}"
109
+ end
110
+ end
111
+ if attrs['bib-no-links']
112
+ @links = false
113
+ end
114
+
115
+ # unless specified by caller, try to find the bibliography
116
+ if @bibfile.empty?
117
+ @bibfile = AsciidoctorBibtex::FileHandlers.find_bibliography "."
118
+ if @bibfile.empty?
119
+ @bibfile = AsciidoctorBibtex::FileHandlers.find_bibliography "#{ENV['HOME']}/Documents"
120
+ end
121
+ end
122
+ if @bibfile.empty?
123
+ puts "Error: could not find a bibliography file"
124
+ exit
125
+ end
126
+ unless AsciidoctorBibtex::Styles.valid? @style
127
+ puts "Error: style #{@style} was not one of the available styles"
128
+ exit
129
+ end
130
+
131
+ puts "Reading biblio: #{@bibfile}"
132
+ puts "Reference style: #{@style}"
133
+ puts "Numerical order: #{@numeric_order}"
134
+ end
135
+
136
+ def numeric_in_appearance_order?
137
+ @numeric_order == :appearance
138
+ end
139
+ end
140
+ end
141
+
@@ -0,0 +1,270 @@
1
+ #
2
+ # Manage the current set of citations, the document settings,
3
+ # and main operations.
4
+ #
5
+
6
+ module AsciidoctorBibtex
7
+
8
+ # Class used through utility method to hold data about citations for
9
+ # current document, and run the different steps to add the citations
10
+ # and bibliography
11
+ class Processor
12
+ include ProcessorUtils
13
+
14
+ # Top-level method to include citations in given asciidoc file
15
+ def Processor.run options
16
+ processor = Processor.new BibTeX.open(options.bibfile), options.links, options.style, options.numeric_in_appearance_order?
17
+ processor.read_filenames options.filename
18
+ processor.read_citations
19
+ processor.add_citations
20
+ end
21
+
22
+ attr_reader :biblio, :links, :style, :citations
23
+
24
+ def initialize biblio, links, style, numeric_in_appearance_order = false
25
+ @biblio = biblio
26
+ @links = links
27
+ @numeric_in_appearance_order = numeric_in_appearance_order
28
+ @style = style
29
+ @citations = Citations.new
30
+ @filenames = Set.new
31
+
32
+ @citeproc = CiteProc::Processor.new style: @style, format: :html
33
+ @citeproc.import @biblio.to_citeproc
34
+ end
35
+
36
+ # Given an asciidoc filename, reads in all dependent files based on 'include::' statements
37
+ # Leaving a list of files in @filenames
38
+ def read_filenames filename
39
+ puts "Reading file: #{filename}"
40
+ files_to_process = [filename]
41
+
42
+ begin
43
+ @filenames.add files_to_process.first
44
+ File.new(files_to_process.shift).each_line do |line|
45
+ if line.include?("include::")
46
+ line.split("include::").drop(1).each do |filetxt|
47
+ file = File.expand_path(filetxt.partition(/\s|\[/).first)
48
+ files_to_process << file unless @filenames.include?(file)
49
+ end
50
+ end
51
+ end
52
+ end until files_to_process.empty?
53
+ end
54
+
55
+ # Scans each filename and extracts citations
56
+ def read_citations
57
+ @filenames.each do |file|
58
+ IO.foreach(file) do |line|
59
+ @citations.add_from_line line
60
+ end
61
+ end
62
+ end
63
+
64
+ # Read given text to add cites and biblio to a new file
65
+ # Order is always decided by author surname first with year.
66
+ # If no author present, then use editor field.
67
+ # Links indicates if internal links to be added.
68
+ # Assumes @filenames has been set to list of filenames to process.
69
+ def add_citations
70
+ @filenames.each do |curr_file|
71
+ ref_filename = FileHandlers.add_ref(curr_file)
72
+ puts "Writing file: #{ref_filename}"
73
+ output = File.new(ref_filename, "w")
74
+
75
+ IO.foreach(curr_file) do |line|
76
+ begin # catch any errors, and ensure the lines of text are written
77
+ case
78
+ when line.include?('include::')
79
+ output_include_line output, line
80
+ when (line =~ BIBMACRO_FULL) != nil
81
+ output_bibliography output
82
+ else
83
+ output_cite_completed_line output, line
84
+ end
85
+ rescue # Any errors, just output the line
86
+ output.puts line
87
+ end
88
+ end
89
+
90
+ output.close
91
+ end
92
+ end
93
+
94
+ # Output bibliography to given output
95
+ def output_bibliography output
96
+ cites = if Styles.is_numeric?(@style) and @numeric_in_appearance_order
97
+ @citations.cites_used
98
+ else
99
+ sorted_cites
100
+ end
101
+ cites.each do |ref|
102
+ output.puts get_reference(ref)
103
+ output.puts
104
+ end
105
+ end
106
+
107
+ def output_include_line output, line
108
+ line.split("include::").drop(1).each do |filetxt|
109
+ ifile = filetxt.partition(/\s|\[/).first
110
+ file = File.expand_path ifile
111
+ # make sure included file points to the -ref version
112
+ line.gsub!("include::#{ifile}", "include::#{FileHandlers.add_ref(file)}")
113
+ end
114
+ output.puts line
115
+ end
116
+
117
+ # For each citation in given line, expand into complete citation text
118
+ # before outputting the line
119
+ def output_cite_completed_line output, line
120
+ @citations.retrieve_citations(line).each do |citation|
121
+ line.gsub!(citation.original, complete_citation(citation))
122
+ end
123
+ output.puts line
124
+ end
125
+
126
+ # Return the complete citation text for given cite_data
127
+ def complete_citation cite_data
128
+ result = ''
129
+ ob, cb = '(', ')'
130
+
131
+ cite_data.cites.each_with_index do |cite, index|
132
+ # before all items apart from the first, insert appropriate separator
133
+ result << "#{separator} " unless index.zero?
134
+
135
+ # @links requires adding hyperlink to reference
136
+ result << "<<#{cite.ref}," if @links
137
+
138
+ # if found, insert reference information
139
+ unless biblio[cite.ref].nil?
140
+ item = biblio[cite.ref].clone
141
+ cite_text, ob, cb = make_citation item, cite.ref, cite_data, cite
142
+ else
143
+ puts "Unknown reference: #{cite.ref}"
144
+ cite_text = "#{cite.ref}"
145
+ end
146
+
147
+ result << cite_text.html_to_asciidoc
148
+ # @links requires finish hyperlink
149
+ result << ">>" if @links
150
+ end
151
+
152
+ unless @links
153
+ # combine numeric ranges
154
+ if Styles.is_numeric? @style
155
+ result = combine_consecutive_numbers result
156
+ end
157
+ end
158
+
159
+ include_pretext result, cite_data, ob, cb
160
+ end
161
+
162
+ # Retrieve text for reference in given style
163
+ # - ref is reference for item to give reference for
164
+ def get_reference ref
165
+ result = ""
166
+ result << ". " if Styles.is_numeric? @style
167
+
168
+ begin
169
+ cptext = @citeproc.render :bibliography, id: ref
170
+ rescue Exception => e
171
+ puts "Failed to render #{ref}: #{e}"
172
+ end
173
+ result << "[[#{ref}]]" if @links
174
+ if cptext.nil?
175
+ return result+ref
176
+ else
177
+ result << cptext.first
178
+ end
179
+
180
+ return result.html_to_asciidoc
181
+ end
182
+
183
+ def separator
184
+ if Styles.is_numeric? @style
185
+ ','
186
+ else
187
+ ';'
188
+ end
189
+ end
190
+
191
+ # Format pages with pp/p as appropriate
192
+ def with_pp pages
193
+ return '' if pages.empty?
194
+
195
+ if @style.include? "chicago"
196
+ pages
197
+ elsif pages.include? '-'
198
+ "pp.&#160;#{pages}"
199
+ else
200
+ "p.&#160;#{pages}"
201
+ end
202
+ end
203
+
204
+ # Return page string for given cite
205
+ def page_str cite
206
+ result = ''
207
+ unless cite.pages.empty?
208
+ result << "," unless Styles.is_numeric? @style
209
+ result << " #{with_pp(cite.pages)}"
210
+ end
211
+
212
+ return result
213
+ end
214
+
215
+ def include_pretext result, cite_data, ob, cb
216
+ pretext = cite_data.pretext
217
+ pretext += ' ' unless pretext.empty? # add space after any content
218
+
219
+ if Styles.is_numeric? @style
220
+ "#{pretext}#{ob}#{result}#{cb}"
221
+ elsif cite_data.type == "cite"
222
+ "#{ob}#{pretext}#{result}#{cb}"
223
+ else
224
+ "#{pretext}#{result}"
225
+ end
226
+ end
227
+
228
+ # Numeric citations are handled by computing the position of the reference
229
+ # in the list of used citations.
230
+ # Other citations are formatted by citeproc.
231
+ def make_citation item, ref, cite_data, cite
232
+ if Styles.is_numeric? @style
233
+ cite_text = if @numeric_in_appearance_order
234
+ "#{@citations.cites_used.index(cite.ref) + 1}"
235
+ else
236
+ "#{sorted_cites.index(cite.ref) + 1}"
237
+ end
238
+ fc = '['
239
+ lc = ']'
240
+ else
241
+ cite_text = @citeproc.process id: ref, mode: :citation
242
+
243
+ fc = cite_text[0,1]
244
+ lc = cite_text[-1,1]
245
+ cite_text = cite_text[1..-2]
246
+ end
247
+
248
+ if Styles.is_numeric? @style
249
+ cite_text << "#{page_str(cite)}"
250
+ elsif cite_data.type == "citenp"
251
+ cite_text.gsub!(item.year, "#{fc}#{item.year}#{page_str(cite)}#{lc}")
252
+ cite_text.gsub!(", #{fc}", " #{fc}")
253
+ else
254
+ cite_text << page_str(cite)
255
+ end
256
+
257
+ cite_text.gsub!(",", "&#44;") if @links # replace comma
258
+
259
+ return cite_text, fc, lc
260
+ end
261
+
262
+ def sorted_cites
263
+ @citations.sorted_cites @biblio
264
+ end
265
+
266
+ BIBMACRO_FULL = /bibliography::(.*?)\[(\w+)?\]/
267
+ end
268
+ end
269
+
270
+
@@ -0,0 +1,34 @@
1
+
2
+ module AsciidoctorBibtex
3
+ module ProcessorUtils
4
+ # Used with numeric styles to combine consecutive numbers into ranges
5
+ # e.g. 1,2,3 -> 1-3, or 1,2,3,6,7,8,9,12 -> 1-3,6-9,12
6
+ # leave references with page numbers alone
7
+ def combine_consecutive_numbers str
8
+ nums = str.split(",").collect(&:strip)
9
+ res = ""
10
+ # Loop through ranges
11
+ start_range = 0
12
+ while start_range < nums.length do
13
+ end_range = start_range
14
+ while (end_range < nums.length-1 and
15
+ nums[end_range].is_i? and
16
+ nums[end_range+1].is_i? and
17
+ nums[end_range+1].to_i == nums[end_range].to_i + 1) do
18
+ end_range += 1
19
+ end
20
+ if end_range - start_range >= 2
21
+ res += "#{nums[start_range]}-#{nums[end_range]}, "
22
+ else
23
+ start_range.upto(end_range) do |i|
24
+ res += "#{nums[i]}, "
25
+ end
26
+ end
27
+ start_range = end_range + 1
28
+ end
29
+ # finish by removing last comma
30
+ res.gsub(/, $/, '')
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,27 @@
1
+ #
2
+ # styles.rb
3
+ # Simple checks on available styles through CSL
4
+ #
5
+
6
+ module AsciidoctorBibtex
7
+
8
+ module Styles
9
+
10
+ def Styles.available
11
+ CSL::Style.ls
12
+ end
13
+
14
+ def Styles.default_style
15
+ 'apa'
16
+ end
17
+
18
+ def Styles.valid? style
19
+ Styles.available.include? style
20
+ end
21
+
22
+ def Styles.is_numeric? style
23
+ CSL::Style.load(style).citation_format == :numeric
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,3 @@
1
+ module AsciidoctorBibtex
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,31 @@
1
+ @book{Lane12a,
2
+ author = {P. Lane},
3
+ title = {Book title},
4
+ publisher = {Publisher},
5
+ year = {2000}
6
+ }
7
+
8
+ @book{Lane12b,
9
+ author = {P. Lane and D. Smith},
10
+ title = {Book title},
11
+ publisher = {Publisher},
12
+ year = {2000}
13
+ }
14
+
15
+ @book{Anderson98,
16
+ editor = {J. R. Anderson and C. Lebiere},
17
+ title = {The Atomic Components of Thought},
18
+ publisher = {Lawrence Erlbaum},
19
+ address = {Mahwah, NJ},
20
+ year = {1998}
21
+ }
22
+
23
+ @article{Anderson04,
24
+ author = {J. R. Anderson and D. Bothell and M. D. Byrne and S. Douglass and C. Lebiere and Y. L. Qin},
25
+ title = {An integrated theory of the mind},
26
+ journal = {Psychological Review},
27
+ volume = {111},
28
+ number = {4},
29
+ pages = {1036--1060},
30
+ year = {2004}
31
+ }
@@ -0,0 +1,23 @@
1
+ = Sample of using asciidoc-bib =
2
+
3
+ The bibliography is searched in the folder of the document, and then
4
+ in ~/Documents.
5
+
6
+ Author-year references can use different styles such as: cite:[Lane12a] or
7
+ citenp:[Lane12a].
8
+
9
+ Page numbers can be added: cite:[Lane12a(89)] or citenp:[Lane12a(89-93)].
10
+
11
+ A bit of pretext can be included too: See cite:[Lane12a(89)]
12
+
13
+ We can include other files, which are also processed:
14
+
15
+ include::sample-2.txt[]
16
+
17
+ To include the reference list, use the section template before
18
+ title, to prevent problems with a2x.
19
+
20
+ [sect2]
21
+ == Bibliography ==
22
+
23
+ bibliography::[]
@@ -0,0 +1,18 @@
1
+ == Sample file 2: multiple authors ==
2
+
3
+ Author-year references can use different styles such as: cite:[Lane12b] or
4
+ citenp:[Lane12b].
5
+
6
+ Page numbers can be added: cite:[Lane12b(89)] or citenp:[Lane12b(89-93)].
7
+
8
+ A bit of pretext can be included too: See cite:[Lane12b(89)]
9
+
10
+ === multiple refs ===
11
+
12
+ One citation can include several references, such as cite:[Lane12a,Lane12b].
13
+
14
+ These can include pages and be in-text: citenp:[Lane12a(78), Lane12b(89-93)].
15
+
16
+ And include pretext: See cite:[Lane12a, Lane12b(89-93)]
17
+
18
+ Note: citations cannot be split over lines; each citation must be on one line.
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asciidoctor-bibtex
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Zhang YANG
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bibtex-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 4.0.11
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '4.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 4.0.11
33
+ - !ruby/object:Gem::Dependency
34
+ name: citeproc-ruby
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.0.5
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.0'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.0.5
53
+ - !ruby/object:Gem::Dependency
54
+ name: csl-styles
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.1.6
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.0.1.6
73
+ description: |
74
+ asciidoctor-bibtex is a fork of asciidoc-bib. It generates in-text references
75
+ and a reference list for an asciidoc file, using a bibtex file as a source of
76
+ citation information. The citation syntax tries to assemble asciidoc inline
77
+ macros and block macros, with `cite:[bibref]` for in-text citation and
78
+ `bibliography::[]` for reference list. It can be used standalone or as an
79
+ asciidoctor extension. See the README for more examples and further options.
80
+ The references are formatted using styles provided by CSL.
81
+ email: zyangmath@gmail.com
82
+ executables:
83
+ - asciidoctor-bibtex
84
+ - asciidoc-bibtex
85
+ extensions: []
86
+ extra_rdoc_files:
87
+ - README.rdoc
88
+ files:
89
+ - LICENSE.txt
90
+ - README.rdoc
91
+ - bin/asciidoc-bibtex
92
+ - bin/asciidoctor-bibtex
93
+ - lib/asciidoctor-bibtex.rb
94
+ - lib/asciidoctor-bibtex/asciidoctor.rb
95
+ - lib/asciidoctor-bibtex/bibextension.rb
96
+ - lib/asciidoctor-bibtex/citation.rb
97
+ - lib/asciidoctor-bibtex/citationdata.rb
98
+ - lib/asciidoctor-bibtex/citations.rb
99
+ - lib/asciidoctor-bibtex/citationutils.rb
100
+ - lib/asciidoctor-bibtex/extensions.rb
101
+ - lib/asciidoctor-bibtex/filehandlers.rb
102
+ - lib/asciidoctor-bibtex/options.rb
103
+ - lib/asciidoctor-bibtex/processor.rb
104
+ - lib/asciidoctor-bibtex/processorutils.rb
105
+ - lib/asciidoctor-bibtex/styles.rb
106
+ - lib/asciidoctor-bibtex/version.rb
107
+ - samples/biblio.bib
108
+ - samples/sample-1.txt
109
+ - samples/sample-2.txt
110
+ homepage: https://github.com/ProgramFan/asciidoctor-bibtex
111
+ licenses:
112
+ - OWL
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '2.0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.4.6
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: asciidoctor-bibtex adds bibtex references to an asciidoc file.
134
+ test_files: []