Add rule attribute for WikiText AST nodes

This commit is contained in:
Gk0Wk 2023-11-29 20:45:00 +08:00
parent 4200495055
commit d3e62ec56a
1 changed files with 10 additions and 2 deletions

View File

@ -215,6 +215,8 @@ WikiParser.prototype.parsePragmas = function() {
// Set the start and end positions of the pragma rule if // Set the start and end positions of the pragma rule if
if (subTree[0].start === undefined) subTree[0].start = start; if (subTree[0].start === undefined) subTree[0].start = start;
if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos; if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;
var rule = Object.getPrototypeOf(nextMatch.rule);
for (const node of subTree) node.rule = rule;
// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment // Quick hack; we only cope with a single parse tree node being returned, which is true at the moment
currentTreeBranch.push.apply(currentTreeBranch,subTree); currentTreeBranch.push.apply(currentTreeBranch,subTree);
subTree[0].children = []; subTree[0].children = [];
@ -244,13 +246,15 @@ WikiParser.prototype.parseBlock = function(terminatorRegExpString) {
if (subTree[0].start === undefined) subTree[0].start = start; if (subTree[0].start === undefined) subTree[0].start = start;
if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos; if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;
} }
var rule = Object.getPrototypeOf(nextMatch.rule);
for (const node of subTree) node.rule = rule;
return subTree; return subTree;
} }
// Treat it as a paragraph if we didn't find a block rule // Treat it as a paragraph if we didn't find a block rule
var start = this.pos; var start = this.pos;
var children = this.parseInlineRun(terminatorRegExp); var children = this.parseInlineRun(terminatorRegExp);
var end = this.pos; var end = this.pos;
return [{type: "element", tag: "p", children: children, start: start, end: end }]; return [{type: "element", tag: "p", children: children, start: start, end: end, parseRule: null }];
}; };
/* /*
@ -349,6 +353,8 @@ WikiParser.prototype.parseInlineRunUnterminated = function(options) {
if (subTree[0].start === undefined) subTree[0].start = start; if (subTree[0].start === undefined) subTree[0].start = start;
if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos; if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;
} }
var rule = Object.getPrototypeOf(nextMatch.rule);
for (const node of subTree) node.rule = rule;
tree.push.apply(tree,subTree); tree.push.apply(tree,subTree);
// Look for the next run rule // Look for the next run rule
nextMatch = this.findNextMatch(this.inlineRules,this.pos); nextMatch = this.findNextMatch(this.inlineRules,this.pos);
@ -407,6 +413,8 @@ WikiParser.prototype.parseInlineRunTerminatedExtended = function(terminatorRegEx
if (subTree[0].start === undefined) subTree[0].start = start; if (subTree[0].start === undefined) subTree[0].start = start;
if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos; if (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;
} }
var rule = Object.getPrototypeOf(inlineRuleMatch.rule);
for (const node of subTree) node.rule = rule;
tree.push.apply(tree,subTree); tree.push.apply(tree,subTree);
// Look for the next inline rule // Look for the next inline rule
inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos); inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);
@ -433,7 +441,7 @@ WikiParser.prototype.pushTextWidget = function(array,text,start,end) {
text = $tw.utils.trim(text); text = $tw.utils.trim(text);
} }
if(text) { if(text) {
array.push({type: "text", text: text, start: start, end: end}); array.push({type: "text", text: text, start: start, end: end, parseRule: null});
} }
}; };