mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-08-20 14:45:59 +00:00
65 lines
1.3 KiB
JavaScript
65 lines
1.3 KiB
JavaScript
/*\
|
|
title: $:/core/modules/parsers/wikiparser/rules/rules.js
|
|
type: application/javascript
|
|
module-type: wikirule
|
|
|
|
Wiki pragma rule for rules specifications
|
|
|
|
```
|
|
\rules except ruleone ruletwo rulethree
|
|
\rules only ruleone ruletwo rulethree
|
|
```
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
exports.name = "rules";
|
|
exports.types = {pragma: true};
|
|
|
|
/*
|
|
Instantiate parse rule
|
|
*/
|
|
exports.init = function(parser) {
|
|
this.parser = parser;
|
|
// Regexp to match
|
|
this.matchRegExp = /^\\rules[^\S\n]/mg;
|
|
};
|
|
|
|
/*
|
|
Parse the most recent match
|
|
*/
|
|
exports.parse = function() {
|
|
// Move past the pragma invocation
|
|
this.parser.pos = this.matchRegExp.lastIndex;
|
|
// Parse whitespace delimited tokens terminated by a line break
|
|
var reMatch = /[^\S\n]*(\S+)|(\r?\n)/mg,
|
|
tokens = [];
|
|
reMatch.lastIndex = this.parser.pos;
|
|
var match = reMatch.exec(this.parser.source);
|
|
while(match && match.index === this.parser.pos) {
|
|
this.parser.pos = reMatch.lastIndex;
|
|
// Exit if we've got the line break
|
|
if(match[2]) {
|
|
break;
|
|
}
|
|
// Process the token
|
|
if(match[1]) {
|
|
tokens.push(match[1]);
|
|
}
|
|
// Match the next token
|
|
match = reMatch.exec(this.parser.source);
|
|
}
|
|
// Process the tokens
|
|
if(tokens.length > 0) {
|
|
this.parser.amendRules(tokens[0],tokens.slice(1));
|
|
}
|
|
// No parse tree nodes to return
|
|
return [];
|
|
};
|
|
|
|
})();
|