UNPKG

2.72 kBJavaScriptView Raw
1var async = require('async'),
2 cheerio = require('cheerio'),
3 lessjavascript = require('./lessjavascript.js'),
4 common = require('./common.js');
5
6function doFootnotes(file) {
7 function escapeHtml(string) {
8 var entityMap = {
9 "&": "&",
10 "<": "&lt;",
11 ">": "&gt;",
12 '"': '&quot;',
13 "'": '&#39;',
14 "/": '&#x2F;'
15 };
16 return String(string).replace(/[&<>"'\/]/g, function (s) {
17 return entityMap[s];
18 });
19 }
20 var $ = cheerio.load(file.contents);
21 var parsed_snippet;
22 var footnotes = $("sup.footnote, span.footnote");
23 if (footnotes.length == 0) {
24 return;
25 }
26
27 if (file.snippet) {
28 parsed_snippet = cheerio.load(file.snippet);
29 }
30
31 var back_references = [];
32 $(footnotes).each(function (i, elem) {
33 back_references.push("#" + $("a", elem).first().attr('id'));
34 });
35 $("a").each(function (i, elem) {
36 if (back_references.indexOf($(elem).attr('href')) != -1) {
37 $(elem).remove();
38 }
39 });
40 $("sup.footnote, span.footnote").each(function (i, elem) {
41 var link = $("a", elem).first();
42 var index = $(link).text();
43 var text = $("#" + $(link).attr('href').slice(1)).html().trim();
44 if (this.tagName == "sup" && text.indexOf(". ") == 0) {
45 text = text.slice(2);
46 }
47 text = escapeHtml(lessjavascript.doLessJavascript(text));
48 var new_element = '<span class="badge footnote default-tooltip" ' +
49 'data-toggle="popover" data-placement="top" ' +
50 'data-html="true" ' +
51 'data-content="' + text + '">' + index + '</span>';
52 $(elem).replaceWith($(new_element));
53 });
54 if (file.snippet) {
55 parsed_snippet("sup.footnote, span.footnote").each(function (i, elem) {
56 var link = $("a", elem).first();
57 var index = $(link).text();
58 var text = $("#" + $(link).attr('href').slice(1)).html().trim();
59 if (this.tagName == "sup" && text.indexOf(". ") == 0) {
60 text = text.slice(2);
61 }
62 text = escapeHtml(lessjavascript.doLessJavascript(text));
63 var new_element = '<span class="badge footnote default-tooltip" ' +
64 'data-toggle="popover" data-placement="top" ' +
65 'data-html="true" ' +
66 'data-content="' + text + '">' + index + '</span>';
67 parsed_snippet(elem).replaceWith($(new_element));
68 });
69 }
70 $("div#footnotes").remove();
71
72 file.contents = new Buffer($.html());
73 if (file.snippet) {
74 file.snippet = new Buffer(parsed_snippet.html());
75 }
76 return;
77};
78
79module.exports = function(config) {
80 return function(files, metalsmith, done) {
81 async.forEachOf(common.htmlfiles(files), function(file, filename, finished) {
82 doFootnotes(file);
83 finished();
84 }, function () {
85 done();
86 });
87 }
88};
89