|
|
@@ -5,8 +5,11 @@ import MarkdownFixer from './PreProcessor/MarkdownFixer';
|
|
|
import Linker from './PreProcessor/Linker';
|
|
|
import ImageExpander from './PreProcessor/ImageExpander';
|
|
|
|
|
|
+import Tsv2Table from './LangProcessor/Tsv2Table';
|
|
|
+
|
|
|
export default class CrowiRenderer {
|
|
|
|
|
|
+
|
|
|
constructor(plugins) {
|
|
|
this.preProcessors = [
|
|
|
new MarkdownFixer(),
|
|
|
@@ -16,6 +19,14 @@ export default class CrowiRenderer {
|
|
|
|
|
|
this.postProcessors = [
|
|
|
];
|
|
|
+
|
|
|
+ this.langProcessors = {
|
|
|
+ 'tsv2table': new Tsv2Table(),
|
|
|
+ 'tsv2table-h': new Tsv2Table({header: true}),
|
|
|
+ };
|
|
|
+
|
|
|
+ this.parseMarkdown = this.parseMarkdown.bind(this);
|
|
|
+ this.codeRenderer = this.codeRenderer.bind(this);
|
|
|
}
|
|
|
|
|
|
preProcess(markdown) {
|
|
|
@@ -38,34 +49,48 @@ export default class CrowiRenderer {
|
|
|
return html;
|
|
|
}
|
|
|
|
|
|
+ codeRenderer(code, lang, escaped) {
|
|
|
+ let result = '', hl;
|
|
|
+
|
|
|
+ if (lang && this.langProcessors[lang]) {
|
|
|
+ return this.langProcessors[lang].process(code);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lang) {
|
|
|
+ try {
|
|
|
+ hl = hljs.highlight(lang, code);
|
|
|
+ result = hl.value;
|
|
|
+ escaped = true;
|
|
|
+ } catch (e) {
|
|
|
+ result = code;
|
|
|
+ }
|
|
|
+
|
|
|
+ result = (escape ? result : Crowi.escape(result, true));
|
|
|
+ return `<pre><code class="lang-${lang}">${result}\n</code></pre>\n`;
|
|
|
+ }
|
|
|
+
|
|
|
+ // no lang specified
|
|
|
+ return `<pre><code>${Crowi.escape(code, true)}\n</code></pre>`;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
parseMarkdown(markdown) {
|
|
|
let parsed = '';
|
|
|
|
|
|
+ const markedRenderer = new marked.Renderer();
|
|
|
+ markedRenderer.code = this.codeRenderer;
|
|
|
+
|
|
|
try {
|
|
|
// TODO
|
|
|
marked.setOptions({
|
|
|
gfm: true,
|
|
|
- highlight: function (code, lang) {
|
|
|
- let result, hl;
|
|
|
- if (lang) {
|
|
|
- try {
|
|
|
- hl = hljs.highlight(lang, code);
|
|
|
- result = hl.value;
|
|
|
- } catch (e) {
|
|
|
- result = code;
|
|
|
- }
|
|
|
- } else {
|
|
|
- result = code;
|
|
|
- }
|
|
|
- return result;
|
|
|
- },
|
|
|
tables: true,
|
|
|
breaks: true,
|
|
|
pedantic: false,
|
|
|
sanitize: false,
|
|
|
smartLists: true,
|
|
|
smartypants: false,
|
|
|
- langPrefix: 'lang-'
|
|
|
+ renderer: markedRenderer,
|
|
|
});
|
|
|
|
|
|
parsed = marked(markdown);
|