mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-24 00:50:28 +00:00
added quote rules
This commit is contained in:
parent
593503fe09
commit
2ec58f7fa2
98
core/modules/parsers/wikiparser/rules/quote.js
Normal file
98
core/modules/parsers/wikiparser/rules/quote.js
Normal file
@ -0,0 +1,98 @@
|
||||
/*\
|
||||
title: $:/core/modules/parsers/wikiparser/rules/quote.js
|
||||
type: application/javascript
|
||||
module-type: wikirule
|
||||
|
||||
Wiki text block rule for quotes. For example:
|
||||
|
||||
```
|
||||
> This is aquote
|
||||
> It has two paragraphs
|
||||
|
||||
> This is another quite
|
||||
>> This is a quoted quote
|
||||
> And another paragraph
|
||||
```
|
||||
|
||||
A CSS class can be applied to a quote item as follows:
|
||||
|
||||
```
|
||||
> First quoted paragraph
|
||||
>.active Second prargraph has the class `active`
|
||||
> Third quoted paragraph
|
||||
```
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
exports.name = "quote";
|
||||
exports.types = {block: true};
|
||||
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /(>+)/mg;
|
||||
};
|
||||
|
||||
var quoteInfo = {quoteTag: "blockquote", paraTag: "p", attributes: { class: { type: "string", value:"tw-quote" }}};
|
||||
|
||||
/*
|
||||
Parse the most recent match
|
||||
*/
|
||||
exports.parse = function() {
|
||||
// Array of parse tree nodes for the previous row of the quote
|
||||
var quoteStack = [];
|
||||
// Cycle through the items in the quote
|
||||
while(true) {
|
||||
// Match the list marker
|
||||
var reMatch = /(>+)/mg;
|
||||
reMatch.lastIndex = this.parser.pos;
|
||||
var match = reMatch.exec(this.parser.source);
|
||||
if(!match || match.index !== this.parser.pos) {
|
||||
break;
|
||||
}
|
||||
// Move past the quote marker
|
||||
this.parser.pos = match.index + match[0].length;
|
||||
// Walk through the quote markers for the current row
|
||||
for(var t=0; t<match[0].length; t++) {
|
||||
// Construct the quote element or reuse the previous one at this level
|
||||
if(quoteStack.length <= t) {
|
||||
var quoteElement = {type: "element", tag: quoteInfo.quoteTag, attributes: quoteInfo.attributes, children: [
|
||||
{type: "element", tag: quoteInfo.paraTag, children: []}
|
||||
]};
|
||||
// Link this list element into the last child item of the parent list item
|
||||
if(t) {
|
||||
var prevQuoteItem = quoteStack[t-1].children[quoteStack[t-1].children.length-1];
|
||||
prevQuoteItem.children.push(quoteElement);
|
||||
}
|
||||
// Save this element in the stack
|
||||
quoteStack[t] = quoteElement;
|
||||
} else if(t === (match[0].length - 1)) {
|
||||
quoteStack[t].children.push({type: "element", tag: quoteInfo.paraTag, children: []});
|
||||
}
|
||||
}
|
||||
if(quoteStack.length > match[0].length) {
|
||||
quoteStack.splice(match[0].length,quoteStack.length - match[0].length);
|
||||
}
|
||||
// Process the body of the list item into the last list item
|
||||
var lastQuoteChildren = quoteStack[quoteStack.length-1].children,
|
||||
lastQuoteItem = lastQuoteChildren[lastQuoteChildren.length-1],
|
||||
classes = this.parser.parseClasses();
|
||||
this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});
|
||||
var tree = this.parser.parseInlineRun(/(\r?\n)/mg);
|
||||
lastQuoteItem.children.push.apply(lastQuoteItem.children,tree);
|
||||
if(classes.length > 0) {
|
||||
$tw.utils.addClassToParseTreeNode(lastQuoteItem,classes.join(" "));
|
||||
}
|
||||
// Consume any whitespace following the list item
|
||||
this.parser.skipWhitespace();
|
||||
}
|
||||
// Return the root element of the list
|
||||
return [quoteStack[0]];
|
||||
};
|
||||
|
||||
})();
|
96
core/modules/parsers/wikiparser/rules/quoteblock.js
Normal file
96
core/modules/parsers/wikiparser/rules/quoteblock.js
Normal file
@ -0,0 +1,96 @@
|
||||
/*\
|
||||
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 = ["tw-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
|
||||
});
|
||||
}
|
||||
|
||||
// Move past the <s
|
||||
this.parser.pos = this.matchRegExp.lastIndex;
|
||||
|
||||
// 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
|
||||
}];
|
||||
};
|
||||
|
||||
})();
|
Loading…
Reference in New Issue
Block a user