2025-05-12 05:38:44 +09:00

73 lines
2.1 KiB
JavaScript

'use strict';
/**
* Module dependencies.
*/
var cheerio = require('cheerio');
var utils = require('./utils');
var cheerioLoad = function(html, options, encodeEntities) {
options = Object.assign({decodeEntities: false, _useHtmlParser2:true}, options);
html = encodeEntities(html);
return cheerio.load(html, options);
};
var createEntityConverters = function () {
var codeBlockLookup = [];
var encodeCodeBlocks = function(html) {
var blocks = module.exports.codeBlocks;
Object.keys(blocks).forEach(function(key) {
var re = new RegExp(blocks[key].start + '([\\S\\s]*?)' + blocks[key].end, 'g');
html = html.replace(re, function(match, subMatch) {
codeBlockLookup.push(match);
return 'JUICE_CODE_BLOCK_' + (codeBlockLookup.length - 1) + '_';
});
});
return html;
};
var decodeCodeBlocks = function(html) {
for(var index = 0; index < codeBlockLookup.length; index++) {
var re = new RegExp('JUICE_CODE_BLOCK_' + index + '_(="")?', 'gi');
html = html.replace(re, function() {
return codeBlockLookup[index];
});
}
return html;
};
return {
encodeEntities: encodeCodeBlocks,
decodeEntities: decodeCodeBlocks,
};
};
/**
* Parses the input, calls the callback on the parsed DOM, and generates the output
*
* @param {String} html input html to be processed
* @param {Object} options for the parser
* @param {Function} callback to be invoked on the DOM
* @param {Array} callbackExtraArguments to be passed to the callback
* @return {String} resulting html
*/
module.exports = function(html, options, callback, callbackExtraArguments) {
var entityConverters = createEntityConverters();
var $ = cheerioLoad(html, options, entityConverters.encodeEntities);
var args = [ $ ];
args.push.apply(args, callbackExtraArguments);
var doc = callback.apply(undefined, args) || $;
if (options && options.xmlMode) {
return entityConverters.decodeEntities(doc.xml());
}
return entityConverters.decodeEntities(doc.html());
};
module.exports.codeBlocks = {
EJS: { start: '<%', end: '%>' },
HBS: { start: '{{', end: '}}' }
};