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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/jekyll/references.rb +312 -0
  3. 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 += "&ldquo;" + ref["title"] + "&rdquo;."
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(', ') + ", &amp; " + last_author)
115
+ elsif ref["authors"].length == 2
116
+ final_reference.push(ref["authors"].join(" &amp; "))
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("&ldquo;" + ref["title"] + "&rdquo;")
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(', ') + ", &amp; " + last_author)
166
+ elsif ref["authors"].length == 2
167
+ final_reference.push(ref["authors"].join(" &amp; "))
168
+ else
169
+ final_reference.push(ref["authors"][0])
170
+ end
171
+ end
172
+ # Parse article title
173
+ final_reference.push("&ldquo;" + ref["title"] + "&rdquo;")
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!(/.”/, "&rdquo;.")
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!(/,”/, "&rdquo;,")
274
+ when 'ieee', 'institute of electrical and electronics engineers'
275
+ final_reference.gsub!(/^\[\d+\]/, '')
276
+ final_reference.gsub!(/,”/, "&rdquo;,")
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: []