-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathrenderer.js
More file actions
118 lines (93 loc) · 3.08 KB
/
renderer.js
File metadata and controls
118 lines (93 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function renderer(context) {
const {
wrapBibliography,
bibliographyTitle,
bibliographyContentsWrapper,
bibliographyEntryWrapper,
linkToBibliography,
allowMissingRefs,
} = context.options;
function reference(tokens, idx, options, env) {
// Sanity check for when a different parser is being used
if (env.bib === undefined) {
env.bib = {};
}
if (env.bib.currentRefs === undefined) {
env.bib.currentRefs = [];
}
if (env.bib.counter === undefined) {
env.bib.counter = 1;
}
let citationCluster;
try {
citationCluster = context.citeproc.processCitationCluster(tokens[idx].meta.citation, [], []);
} catch (err) {
if (allowMissingRefs === true) {
return tokens[idx].meta.ref;
}
throw new Error(`Reference not found '${tokens[idx].meta.ref}': ${err}`);
}
env.bib.currentRefs.push(tokens[idx].meta);
const citeId = `cite-${env.bib.counter}-${tokens[idx].meta.citation.citationItems[0].number}`;
const bibRef = `${env.bib.counter}-${tokens[idx].meta.citation.citationItems[0].id}`;
let citation = `<span id="${citeId}" class="citation">${citationCluster[1][0][1]}</span>`;
if (linkToBibliography === true) {
citation = `<a href="#bib-${bibRef}">${citation}</a>`;
}
return citation;
}
function bibliographyOpen(tokens, idx, options, env) {
if (env.bib === undefined || env.bib.currentRefs === undefined) {
return '';
}
let rendered = '';
if (wrapBibliography === true) {
rendered += '<div class="bibliography">\n';
}
rendered += `${bibliographyTitle}\n`;
return rendered;
}
function bibliographyContents(tokens, idx, options, env) {
if (env.bib === undefined || env.bib.currentRefs === undefined) {
return '';
}
const seen = [];
env.bib.currentRefs.forEach((ref) => {
ref.citation.citationItems.forEach((item) => {
seen.push(item.id);
});
});
const bibIds = context.citeproc.updateItems(seen);
const contents = context.citeproc.makeBibliography()[1].map((entry, i) => {
entry = entry.replace('<div', `<div id="bib-${env.bib.counter}-${bibIds[i]}"`);
if (bibliographyEntryWrapper !== 'div') {
entry = entry.replace('<div', `<${bibliographyEntryWrapper}`);
entry = entry.replace('</div', `</${bibliographyEntryWrapper}`);
}
return entry;
});
return `<${bibliographyContentsWrapper} class="bibliography-contents">\n${contents.join(
''
)}</${bibliographyContentsWrapper}>\n`;
}
function bibliographyClose(tokens, idx, options, env) {
if (env.bib === undefined || env.bib.currentRefs === undefined) {
return '';
}
env.bib.currentRefs = [];
env.bib.counter += 1;
if (wrapBibliography === true) {
return '</div>\n';
}
return '';
}
return {
reference,
bibliographyOpen,
bibliographyContents,
bibliographyClose,
};
}
module.exports = {
renderer,
};