jekyll-references 1.0.1
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 +7 -0
- data/lib/jekyll/references.rb +312 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 74206aaba5cc549d49a7a0d4b976e3a5fcc1761125c0196f5d37f92ffeb1812a
|
4
|
+
data.tar.gz: c62f101ec3c96890bea147c65fd5588ccabe536ae35f1a0fbfe73613660a43c9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1524c6e1b22ab00eaa0654754f17a03e169e2eee448b3372c10f577749a604264c5d55a9b7592ef2a90c05a996ad5a331cc9501049c1c42e629231cd5ff7846d
|
7
|
+
data.tar.gz: e41cf384615d10f80507308a41b851172d35cee8165ecd0dc63d069270f74a9021c4c6c1d4d8d017a5d46a17f46074d0c32a32bcc795117a34641a3e024441cc
|
@@ -0,0 +1,312 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
class ReferencesTag < Liquid::Tag
|
7
|
+
def initialize(tag_name, text, tokens)
|
8
|
+
super
|
9
|
+
@title = text
|
10
|
+
end
|
11
|
+
|
12
|
+
def reference(style, ref)
|
13
|
+
# Initialize return reference
|
14
|
+
final_reference = ''
|
15
|
+
|
16
|
+
# Parse article data according to style
|
17
|
+
case style
|
18
|
+
when 'apa', 'american psychological association'
|
19
|
+
# Parse authors
|
20
|
+
if ref["organization"].to_s != ''
|
21
|
+
# If organization, use full name
|
22
|
+
final_reference = ref["organization"].to_s + "."
|
23
|
+
else
|
24
|
+
# Otherwise, use APA abbreviations
|
25
|
+
ref["authors"].map! do |author|
|
26
|
+
author = author.split
|
27
|
+
last_name = author.pop
|
28
|
+
fist_names = author.map do |n|
|
29
|
+
n[0].upcase + "."
|
30
|
+
end
|
31
|
+
fist_names = fist_names.join
|
32
|
+
author = last_name + " " + fist_names
|
33
|
+
|
34
|
+
author
|
35
|
+
end
|
36
|
+
final_reference = ref["authors"].join(', ') + "."
|
37
|
+
end
|
38
|
+
# Parse publication date
|
39
|
+
if ref["publication"].to_s != ''
|
40
|
+
final_reference += " (" + ref["publication"].to_s + ")."
|
41
|
+
end
|
42
|
+
# Parse article title
|
43
|
+
final_reference += " " + ref["title"] + "."
|
44
|
+
# If published in a journal
|
45
|
+
if ref["journal"].to_s != ''
|
46
|
+
# Parse journal
|
47
|
+
final_reference += " " + ref["journal"]
|
48
|
+
# Parse volume and issue
|
49
|
+
if ref["volume"].to_s != '' and ref["issue"].to_s != ''
|
50
|
+
final_reference += ", " + ref["volume"].to_s + "(" + ref["issue"].to_s + ")"
|
51
|
+
elsif ref["volume"].to_s != ''
|
52
|
+
final_reference += ", " + ref["volume"].to_s
|
53
|
+
end
|
54
|
+
# Parse pages
|
55
|
+
if ref["pages"].to_s != ''
|
56
|
+
final_reference += ", " + ref["pages"].to_s
|
57
|
+
end
|
58
|
+
end
|
59
|
+
final_reference += "."
|
60
|
+
when 'mla', 'modern language association'
|
61
|
+
# Parse authors
|
62
|
+
if ref["organization"].to_s != ''
|
63
|
+
# If organization, use full name
|
64
|
+
final_reference = ref["organization"].to_s + ". "
|
65
|
+
elsif ref["authors"].length > 0
|
66
|
+
# Otherwise, use authors' list
|
67
|
+
author = ref["authors"][0].split
|
68
|
+
last_name = author.pop
|
69
|
+
author = author.join(" ")
|
70
|
+
author = last_name + ", " + author
|
71
|
+
|
72
|
+
# Append 'et al' is more than 1 author
|
73
|
+
if ref["authors"].length > 1
|
74
|
+
author += ", et al"
|
75
|
+
end
|
76
|
+
|
77
|
+
# Begin reference with author(s)
|
78
|
+
final_reference = author + ". "
|
79
|
+
end
|
80
|
+
# Parse article title
|
81
|
+
final_reference += "“" + ref["title"] + "”."
|
82
|
+
# Parse journal
|
83
|
+
if ref["journal"].to_s != ''
|
84
|
+
final_reference += " " + ref["journal"]
|
85
|
+
end
|
86
|
+
# Parse volume
|
87
|
+
if ref["volume"].to_s != ''
|
88
|
+
final_reference += ", vol. " + ref["volume"].to_s
|
89
|
+
end
|
90
|
+
# Parse issue
|
91
|
+
if ref["issue"].to_s != ''
|
92
|
+
final_reference += ", no. " + ref["issue"].to_s
|
93
|
+
end
|
94
|
+
# Parse publication date
|
95
|
+
if ref["publication"].to_s != ''
|
96
|
+
final_reference += ", " + ref["publication"].to_s
|
97
|
+
end
|
98
|
+
# Parse pages
|
99
|
+
if ref["pages"].to_s != ''
|
100
|
+
final_reference += ", " + (ref["pages"].include?("-") ? "pp" : "p") + ". "
|
101
|
+
final_reference += ref["pages"].to_s
|
102
|
+
end
|
103
|
+
final_reference += "."
|
104
|
+
when 'chicago-annotated-bibliography'
|
105
|
+
final_reference = []
|
106
|
+
# Parse authors
|
107
|
+
if ref["organization"].to_s != ''
|
108
|
+
# If organization, use full name
|
109
|
+
final_reference.push(ref["organization"].to_s)
|
110
|
+
else
|
111
|
+
# Otherwise, use Chicago listing
|
112
|
+
if ref["authors"].length > 2
|
113
|
+
last_author = ref["authors"].pop
|
114
|
+
final_reference.push(ref["authors"].join(', ') + ", & " + last_author)
|
115
|
+
elsif ref["authors"].length == 2
|
116
|
+
final_reference.push(ref["authors"].join(" & "))
|
117
|
+
else
|
118
|
+
final_reference.push(ref["authors"][0])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
# Parse publication date
|
122
|
+
if ref["publication"].to_s != ''
|
123
|
+
final_reference.push(ref["publication"].to_s)
|
124
|
+
end
|
125
|
+
# Parse article title
|
126
|
+
final_reference.push("“" + ref["title"] + "”")
|
127
|
+
# Parse journal
|
128
|
+
if ref["journal"].to_s != ''
|
129
|
+
journal = ref["journal"]
|
130
|
+
# Parse volume and issue
|
131
|
+
if ref["volume"].to_s != '' and ref["issue"].to_s != ''
|
132
|
+
journal += " " + ref["volume"].to_s + "(" + ref["issue"].to_s + ")"
|
133
|
+
elsif ref["volume"].to_s != ''
|
134
|
+
journal += " " + ref["volume"].to_s
|
135
|
+
end
|
136
|
+
# Parse pages
|
137
|
+
if ref["pages"].to_s != ''
|
138
|
+
journal += ": " + ref["pages"].to_s
|
139
|
+
end
|
140
|
+
|
141
|
+
final_reference.push(journal)
|
142
|
+
end
|
143
|
+
final_reference = final_reference.join(", ") + "."
|
144
|
+
when 'ieee', 'institute of electrical and electronics engineers'
|
145
|
+
final_reference = []
|
146
|
+
# Parse authors
|
147
|
+
if ref["organization"].to_s != ''
|
148
|
+
# If organization, use full name
|
149
|
+
final_reference.push(ref["organization"].to_s)
|
150
|
+
else
|
151
|
+
# Parse authors' name to IEEE abbreviation
|
152
|
+
ref["authors"].map! do |author|
|
153
|
+
author = author.split
|
154
|
+
last_name = author.pop
|
155
|
+
author.map do |name|
|
156
|
+
name[0].upcase + "."
|
157
|
+
end
|
158
|
+
author = author.join(' ') + ' ' + last_name
|
159
|
+
|
160
|
+
author
|
161
|
+
end
|
162
|
+
# And join them using Oxford-comma-conventions
|
163
|
+
if ref["authors"].length > 2
|
164
|
+
last_author = ref["authors"].pop
|
165
|
+
final_reference.push(ref["authors"].join(', ') + ", & " + last_author)
|
166
|
+
elsif ref["authors"].length == 2
|
167
|
+
final_reference.push(ref["authors"].join(" & "))
|
168
|
+
else
|
169
|
+
final_reference.push(ref["authors"][0])
|
170
|
+
end
|
171
|
+
end
|
172
|
+
# Parse article title
|
173
|
+
final_reference.push("“" + ref["title"] + "”")
|
174
|
+
# Parse journal
|
175
|
+
if ref["journal"].to_s != ''
|
176
|
+
final_reference.push(ref["journal"])
|
177
|
+
end
|
178
|
+
# Parse volume
|
179
|
+
if ref["volume"].to_s != ''
|
180
|
+
final_reference.push("vol. " + ref["volume"].to_s)
|
181
|
+
end
|
182
|
+
# Parse issue
|
183
|
+
if ref["issue"].to_s != ''
|
184
|
+
final_reference.push("no. " + ref["issue"].to_s)
|
185
|
+
end
|
186
|
+
# Parse pages
|
187
|
+
if ref["pages"].to_s != ''
|
188
|
+
final_reference.push((ref["pages"].include?("-") ? "pp" : "p") + ". " + ref["pages"].to_s)
|
189
|
+
end
|
190
|
+
# Parse publication date
|
191
|
+
if ref["publication"].to_s != ''
|
192
|
+
final_reference.push(ref["publication"].to_s)
|
193
|
+
end
|
194
|
+
final_reference = final_reference.join(", ") + "."
|
195
|
+
else # Vancouver, the default
|
196
|
+
# Parse authors
|
197
|
+
if ref["organization"].to_s != ''
|
198
|
+
# If organization, use full name
|
199
|
+
final_reference = ref["organization"].to_s + "."
|
200
|
+
else
|
201
|
+
# Otherwise, use Vancouver abbreviations
|
202
|
+
ref["authors"].map! do |author|
|
203
|
+
author = author.split
|
204
|
+
last_name = author.pop
|
205
|
+
fist_names = author.map do |n|
|
206
|
+
n[0].upcase
|
207
|
+
end
|
208
|
+
fist_names = fist_names.join('')
|
209
|
+
author = last_name + " " + fist_names
|
210
|
+
|
211
|
+
author
|
212
|
+
end
|
213
|
+
final_reference = ref["authors"].join(', ') + "."
|
214
|
+
end
|
215
|
+
# Parse article title
|
216
|
+
final_reference += " " + ref["title"] + "."
|
217
|
+
# If published in a journal
|
218
|
+
if ref["journal"].to_s != ''
|
219
|
+
# Parse journal
|
220
|
+
final_reference += " " + ref["journal"] + "."
|
221
|
+
# Parse publication date
|
222
|
+
if ref["publication"].to_s != ''
|
223
|
+
final_reference += " " + ref["publication"].to_s + ";"
|
224
|
+
end
|
225
|
+
# Parse volume and issue
|
226
|
+
if ref["volume"].to_s != '' and ref["issue"].to_s != ''
|
227
|
+
final_reference += ref["volume"].to_s + "(" + ref["issue"].to_s + ")"
|
228
|
+
elsif ref["volume"].to_s != ''
|
229
|
+
final_reference += ref["volume"].to_s
|
230
|
+
end
|
231
|
+
# Parse pages
|
232
|
+
if ref["pages"].to_s != ''
|
233
|
+
final_reference += ":" + ref["pages"].to_s
|
234
|
+
end
|
235
|
+
else
|
236
|
+
# Parse publication date
|
237
|
+
if ref["publication"].to_s != ''
|
238
|
+
final_reference += " " + ref["publication"].to_s
|
239
|
+
end
|
240
|
+
end
|
241
|
+
final_reference.gsub!(/;([:\.,])/, "\1")
|
242
|
+
final_reference += "."
|
243
|
+
end
|
244
|
+
|
245
|
+
# Return parsed reference
|
246
|
+
final_reference.gsub(/[\.,]{2}/, ".")
|
247
|
+
end
|
248
|
+
|
249
|
+
def parse_ref(ref, ref_style, ref_lang)
|
250
|
+
# Initialize return reference
|
251
|
+
final_reference = ""
|
252
|
+
|
253
|
+
if ref_style == 'chicago' or ref_style == 'turabian' or ref_style == 'chicago/turabian'
|
254
|
+
ref_style = 'chicago-annotated-bibliography'
|
255
|
+
elsif ref_style == ''
|
256
|
+
ref_style = 'vancouver'
|
257
|
+
end
|
258
|
+
|
259
|
+
if ref["doi"]
|
260
|
+
# If there is a DOI set, retrieve data from it
|
261
|
+
URI.open("https://doi.org/" + ref["doi"].to_s, 'Accept' => "text/bibliography; style=#{ref_style}; lang=#{ref_lang}") do |f|
|
262
|
+
f.each do |line|
|
263
|
+
final_reference = line
|
264
|
+
end
|
265
|
+
end
|
266
|
+
case ref_style
|
267
|
+
when 'apa', 'american psychological association'
|
268
|
+
final_reference.gsub!(/(https?:\/\/doi.org\/.+)$/, '<a href="\1" targer="_blank">DOI</a>')
|
269
|
+
when 'mla', 'modern language association'
|
270
|
+
final_reference.gsub!(/.”/, "”.")
|
271
|
+
final_reference.gsub!(/Crossref, (https?:\/\/doi.org\/.+)\.$/, '<a href="\1" targer="_blank">Crossref</a>.')
|
272
|
+
when 'chicago', 'turabian', 'chicago/turabian'
|
273
|
+
final_reference.gsub!(/,”/, "”,")
|
274
|
+
when 'ieee', 'institute of electrical and electronics engineers'
|
275
|
+
final_reference.gsub!(/^\[\d+\]/, '')
|
276
|
+
final_reference.gsub!(/,”/, "”,")
|
277
|
+
final_reference.gsub!(/doi: (.+)\.$/, '<a href="https://doi.org/\1" targer="_blank">doi</a>.')
|
278
|
+
else # Vancouver, the default
|
279
|
+
final_reference.gsub!(/^\d+\./, '')
|
280
|
+
final_reference.gsub!(/Available from: (.+)/, 'Available <a href="\1" targer="_blank">here</a>.')
|
281
|
+
end
|
282
|
+
else
|
283
|
+
# If there isn't a DOI, mount it from metadata
|
284
|
+
final_reference = reference(ref_style, ref)
|
285
|
+
end
|
286
|
+
|
287
|
+
# Return parsed reference
|
288
|
+
final_reference
|
289
|
+
end
|
290
|
+
|
291
|
+
def render(context)
|
292
|
+
# Retrieve references from page
|
293
|
+
refs = context.registers[:page]["references"]
|
294
|
+
# Retrieve references style
|
295
|
+
ref_style = context.registers[:site].config["references"]["style"].downcase
|
296
|
+
# Retrieve references language
|
297
|
+
ref_lang = context.registers[:site].config["references"]["lang"]
|
298
|
+
|
299
|
+
# Build output
|
300
|
+
output = "<h2>#{@title}</h2>\n"
|
301
|
+
output += "<ol>\n"
|
302
|
+
refs.each do |r|
|
303
|
+
output += "<li>#{parse_ref(r[1], ref_style, ref_lang)}</li>\n"
|
304
|
+
end
|
305
|
+
output += "</ol>"
|
306
|
+
# Return output
|
307
|
+
output
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
Liquid::Template.register_tag('references', Jekyll::ReferencesTag)
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-references
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Igor Padoim
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 2025-04-16 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: jekyll
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - "~>"
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '4.4'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - "~>"
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '4.4'
|
26
|
+
description: Create Liquid tags to parse and show reference lists
|
27
|
+
email: igorpadoim@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- lib/jekyll/references.rb
|
33
|
+
homepage: https://github.com/Nereare/jekyll-references/
|
34
|
+
licenses:
|
35
|
+
- WTFPL
|
36
|
+
metadata:
|
37
|
+
bug_tracker_uri: https://github.com/Nereare/jekyll-references/issues
|
38
|
+
source_code_uri: https://github.com/Nereare/jekyll-references
|
39
|
+
changelog_uri: https://github.com/Nereare/jekyll-references/blob/master/CHANGELOG.md
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.2.0
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.6.2
|
55
|
+
specification_version: 4
|
56
|
+
summary: Create Liquid tags to parse and show reference lists
|
57
|
+
test_files: []
|