|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = function footnote_block(state) {
|
|
|
|
var i, l, j, t, lastParagraph, list, tokens, current, currentLabel,
|
|
|
|
level = 0,
|
|
|
|
insideRef = false,
|
|
|
|
refTokens = {};
|
|
|
|
|
|
|
|
if (!state.env.footnotes) { return; }
|
|
|
|
|
|
|
|
state.tokens = state.tokens.filter(function(tok) {
|
|
|
|
if (tok.type === 'footnote_reference_open') {
|
|
|
|
insideRef = true;
|
|
|
|
current = [];
|
|
|
|
currentLabel = tok.label;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (tok.type === 'footnote_reference_close') {
|
|
|
|
insideRef = false;
|
|
|
|
// prepend ':' to avoid conflict with Object.prototype members
|
|
|
|
refTokens[':' + currentLabel] = current;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (insideRef) { current.push(tok); }
|
|
|
|
return !insideRef;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!state.env.footnotes.list) { return; }
|
|
|
|
list = state.env.footnotes.list;
|
|
|
|
|
|
|
|
state.tokens.push({
|
|
|
|
type: 'footnote_block_open',
|
|
|
|
level: level++
|
|
|
|
});
|
|
|
|
for (i = 0, l = list.length; i < l; i++) {
|
|
|
|
state.tokens.push({
|
|
|
|
type: 'footnote_open',
|
|
|
|
id: i,
|
|
|
|
level: level++
|
|
|
|
});
|
|
|
|
|
|
|
|
if (list[i].tokens) {
|
|
|
|
tokens = [];
|
|
|
|
tokens.push({
|
|
|
|
type: 'paragraph_open',
|
|
|
|
tight: false,
|
|
|
|
level: level++
|
|
|
|
});
|
|
|
|
tokens.push({
|
|
|
|
type: 'inline',
|
|
|
|
content: '',
|
|
|
|
level: level,
|
|
|
|
children: list[i].tokens
|
|
|
|
});
|
|
|
|
tokens.push({
|
|
|
|
type: 'paragraph_close',
|
|
|
|
tight: false,
|
|
|
|
level: --level
|
|
|
|
});
|
|
|
|
} else if (list[i].label) {
|
|
|
|
tokens = refTokens[':' + list[i].label];
|
|
|
|
}
|
|
|
|
|
|
|
|
state.tokens = state.tokens.concat(tokens);
|
|
|
|
if (state.tokens[state.tokens.length - 1].type === 'paragraph_close') {
|
|
|
|
lastParagraph = state.tokens.pop();
|
|
|
|
} else {
|
|
|
|
lastParagraph = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
t = list[i].count > 0 ? list[i].count : 1;
|
|
|
|
for (j = 0; j < t; j++) {
|
|
|
|
state.tokens.push({
|
|
|
|
type: 'footnote_anchor',
|
|
|
|
id: i,
|
|
|
|
subId: j,
|
|
|
|
level: level
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lastParagraph) {
|
|
|
|
state.tokens.push(lastParagraph);
|
|
|
|
}
|
|
|
|
|
|
|
|
state.tokens.push({
|
|
|
|
type: 'footnote_close',
|
|
|
|
level: --level
|
|
|
|
});
|
|
|
|
}
|
|
|
|
state.tokens.push({
|
|
|
|
type: 'footnote_block_close',
|
|
|
|
level: --level
|
|
|
|
});
|
|
|
|
};
|