UNPKG

@yeatszhang/tiddlywiki

Version:
91 lines (76 loc) 1.85 kB
/*\ title: $:/core/modules/parsers/wikiparser/rules/quoteblock.js type: application/javascript module-type: wikirule Wiki text rule for quote blocks. For example: ``` <<<.optionalClass(es) optional cited from a quote <<< <<<.optionalClass(es) a quote <<< optional cited from ``` Quotes can be quoted by putting more <s ``` <<< Quote Level 1 <<<< QuoteLevel 2 <<<< <<< ``` \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; exports.name = "quoteblock"; exports.types = {block: true}; exports.init = function(parser) { this.parser = parser; // Regexp to match this.matchRegExp = /(<<<+)/mg; }; exports.parse = function() { var classes = ["tc-quote"]; // Get all the details of the match var reEndString = "^" + this.match[1] + "(?!<)"; // Move past the <s this.parser.pos = this.matchRegExp.lastIndex; // Parse any classes, whitespace and then the optional cite itself classes.push.apply(classes, this.parser.parseClasses()); this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true}); var cite = this.parser.parseInlineRun(/(\r?\n)/mg); // before handling the cite, parse the body of the quote var tree= this.parser.parseBlocks(reEndString); // If we got a cite, put it before the text if(cite.length > 0) { tree.unshift({ type: "element", tag: "cite", children: cite }); } // Parse any optional cite this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true}); cite = this.parser.parseInlineRun(/(\r?\n)/mg); // If we got a cite, push it if(cite.length > 0) { tree.push({ type: "element", tag: "cite", children: cite }); } // Return the blockquote element return [{ type: "element", tag: "blockquote", attributes: { class: { type: "string", value: classes.join(" ") }, }, children: tree }]; }; })();