UNPKG

books-cli

Version:

由于本人经常性的写一些文档,然后现有的很多插件版本各方面存在问题,甚至还有一些作者已经放弃维护了,所以决定自己写一个综合性的插件用来满足个人需求。

92 lines (83 loc) 2.36 kB
/** * 代码高亮 */ var Prism = require('prismjs'); var languages = require('prismjs').languages; var cheerio = require('cheerio'); var DEFAULT_LANGUAGE = 'markup'; var MAP_LANGUAGES = { 'py': 'python', 'js': 'javascript', 'rb': 'ruby', 'cs': 'csharp', 'sh': 'bash', 'shell': 'bash', 'html': 'markup' }; // Base languages syntaxes (as of prism@1.6.0), extended by other syntaxes. // They need to be required before the others. var PRELUDE = [ 'markup-templating', 'clike', 'javascript', 'markup', 'c', 'ruby', 'css', // The following depends on previous ones 'java', 'php' ]; PRELUDE.map(requireSyntax); /** * Load the syntax definition for a language id */ function requireSyntax(lang) { require('prismjs/components/prism-' + lang + '.js'); } const cssNames = ['prismjs/themes/prism-okaidia.css']; const assets = { 'prismjs/themes': 'prismjs/themes/prism-okaidia.css' }; function code_highlighted(body, lang) { var highlighted = ''; if (lang !== undefined) { lang = lang.toLowerCase(); lang = MAP_LANGUAGES[lang] || lang; // Try and find the language definition in components folder if (!languages[lang]) { try { requireSyntax(lang); } catch (e) { console.warn('未能加载 prism 语法: ' + lang); console.warn(e); } } } if (!languages[lang]) lang = DEFAULT_LANGUAGE; // Check against html, prism "markup" works for this if (lang === 'html') { lang = 'markup'; } try { // The process can fail (failed to parse) highlighted = Prism.highlight(body, languages[lang]); } catch (e) { console.warn('高亮代码失败:'); console.warn(e); highlighted = body; } return highlighted; } function hooks_page(page) { var highlighted = false; var $ = cheerio.load(page.content); $('pre').each(function () { highlighted = true; const $this = $(this); $this.addClass('language-'); }); if (highlighted) { page.content = $("body").html(); } return page; } module.exports = { cssNames, assets, code_highlighted, hooks_page };