mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-23 18:17:20 +00:00
Further improvements to parser rule implementation
This commit is contained in:
parent
31b283ef36
commit
2bef7c2c5c
15
core/boot.js
15
core/boot.js
@ -444,6 +444,21 @@ $tw.modules.applyMethods = function(moduleType,targetObject) {
|
||||
return targetObject;
|
||||
};
|
||||
|
||||
/*
|
||||
Return an array of subclasses created from the modules of a specified type
|
||||
*/
|
||||
$tw.modules.createSubclassesFromModules = function(moduleType,baseClass) {
|
||||
var classes = {};
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,moduleExports) {
|
||||
var newClass = function() {};
|
||||
newClass.prototype = new baseClass();
|
||||
newClass.prototype.constructor = baseClass;
|
||||
$tw.utils.extend(newClass.prototype,moduleExports);
|
||||
classes[moduleExports.name] = newClass;
|
||||
});
|
||||
return classes;
|
||||
};
|
||||
|
||||
/////////////////////////// Barebones tiddler object
|
||||
|
||||
/*
|
||||
|
@ -14,7 +14,8 @@ Wiki text block rule for headings
|
||||
|
||||
exports.name = "heading";
|
||||
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /(!{1,6})/mg;
|
||||
};
|
||||
|
@ -48,7 +48,8 @@ A CSS class can be applied to a list item as follows:
|
||||
|
||||
exports.name = "list";
|
||||
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /([\\*#;:]+)/mg;
|
||||
};
|
||||
|
@ -23,7 +23,8 @@ exports.name = "macrodef";
|
||||
/*
|
||||
Instantiate parse rule
|
||||
*/
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /^\\define\s*([^(\s]+)\(\s*([^)]*)\)(\r?\n)?/mg;
|
||||
};
|
||||
|
@ -18,7 +18,8 @@ Wiki text run rule for HTML entities. For example:
|
||||
|
||||
exports.name = "entity";
|
||||
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;
|
||||
};
|
||||
|
@ -27,7 +27,8 @@ exports.name = "html";
|
||||
|
||||
var voidElements = "area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr".split(",");
|
||||
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /<(_)?([A-Za-z]+)(\s*[^>]*?)(\/)?>/mg;
|
||||
};
|
||||
|
@ -18,7 +18,8 @@ Wiki rule for macro calls
|
||||
|
||||
exports.name = "macrocall";
|
||||
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = /<<([^\s>]+)\s*([\s\S]*?)>>/mg;
|
||||
};
|
||||
|
@ -35,7 +35,8 @@ textPrimitives.wikiLink = textPrimitives.upperLetter + "+" +
|
||||
textPrimitives.upperLetter +
|
||||
textPrimitives.anyLetter + "*";
|
||||
|
||||
exports.init = function() {
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
// Regexp to match
|
||||
this.matchRegExp = new RegExp(textPrimitives.unWikiLink + "?" + textPrimitives.wikiLink,"mg");
|
||||
};
|
||||
|
@ -12,24 +12,28 @@ Base class for wiki parser rules
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
var WikiRuleDefaultProperties = {};
|
||||
/*
|
||||
This constructor is always overridden with a blank constructor, and so shouldn't be used
|
||||
*/
|
||||
var WikiRule = function() {
|
||||
};
|
||||
|
||||
/*
|
||||
To be overridden by individual rules
|
||||
*/
|
||||
WikiRuleDefaultProperties.init = function() {
|
||||
|
||||
WikiRule.prototype.init = function(parser) {
|
||||
this.parser = parser;
|
||||
};
|
||||
|
||||
/*
|
||||
Default implementation of findNextMatch looks uses RegExp matching
|
||||
Default implementation of findNextMatch uses RegExp matching
|
||||
*/
|
||||
WikiRuleDefaultProperties.findNextMatch = function(startPos) {
|
||||
WikiRule.prototype.findNextMatch = function(startPos) {
|
||||
this.matchRegExp.lastIndex = startPos;
|
||||
this.match = this.matchRegExp.exec(this.parser.source);
|
||||
return this.match ? this.match.index : undefined;
|
||||
};
|
||||
|
||||
exports.WikiRuleDefaultProperties = WikiRuleDefaultProperties;
|
||||
exports.WikiRule = WikiRule;
|
||||
|
||||
})();
|
||||
|
@ -38,12 +38,12 @@ var WikiParser = function(vocabulary,type,text,options) {
|
||||
// Initialise the things that pragma rules can change
|
||||
this.macroDefinitions = {}; // Hash map of macro definitions
|
||||
// Instantiate the pragma parse rules
|
||||
this.pragmaRules = this.instantiateRules(this.vocabulary.pragmaRules,0);
|
||||
this.pragmaRules = this.instantiateRules(this.vocabulary.pragmaRuleClasses,0);
|
||||
// Parse any pragmas
|
||||
this.parsePragmas();
|
||||
// Instantiate the parser block and run rules
|
||||
this.blockRules = this.instantiateRules(this.vocabulary.blockRules,this.pos);
|
||||
this.runRules = this.instantiateRules(this.vocabulary.runRules,this.pos);
|
||||
this.blockRules = this.instantiateRules(this.vocabulary.blockRuleClasses,this.pos);
|
||||
this.runRules = this.instantiateRules(this.vocabulary.runRuleClasses,this.pos);
|
||||
// Parse the text into runs or blocks
|
||||
if(this.type === "text/vnd.tiddlywiki-run") {
|
||||
this.tree = this.parseRun();
|
||||
@ -61,7 +61,7 @@ WikiParser.prototype.instantiateRules = function(classes,startPos) {
|
||||
$tw.utils.each(classes,function(RuleClass) {
|
||||
// Instantiate the rule
|
||||
var rule = new RuleClass(self);
|
||||
rule.init();
|
||||
rule.init(self);
|
||||
var matchIndex = rule.findNextMatch(startPos);
|
||||
if(matchIndex !== undefined) {
|
||||
rulesInfo.push({
|
||||
|
@ -13,27 +13,15 @@ module-type: global
|
||||
var WikiVocabulary = function(options) {
|
||||
this.wiki = options.wiki;
|
||||
// Hashmaps of the various parse rule classes
|
||||
this.pragmaRules = this.createRuleClasses("wikipragmarule");
|
||||
this.blockRules = this.createRuleClasses("wikiblockrule");
|
||||
this.runRules = this.createRuleClasses("wikirunrule");
|
||||
this.pragmaRuleClasses = $tw.modules.createSubclassesFromModules("wikipragmarule",$tw.WikiRule);
|
||||
this.blockRuleClasses = $tw.modules.createSubclassesFromModules("wikiblockrule",$tw.WikiRule);
|
||||
this.runRuleClasses = $tw.modules.createSubclassesFromModules("wikirunrule",$tw.WikiRule);
|
||||
// Hashmap of the various renderer classes
|
||||
this.rendererClasses = $tw.modules.applyMethods("wikirenderer");
|
||||
// Hashmap of the available widgets
|
||||
this.widgetClasses = $tw.modules.applyMethods("widget");
|
||||
};
|
||||
|
||||
WikiVocabulary.prototype.createRuleClasses = function(moduleType) {
|
||||
var ruleClasses = {};
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,moduleExports) {
|
||||
var ruleClass = function(parser) {
|
||||
this.parser = parser;
|
||||
}
|
||||
$tw.utils.extend(ruleClass.prototype,$tw.WikiRuleDefaultProperties,moduleExports);
|
||||
ruleClasses[moduleExports.name] = ruleClass;
|
||||
});
|
||||
return ruleClasses;
|
||||
};
|
||||
|
||||
WikiVocabulary.prototype.parseText = function(type,text) {
|
||||
return new $tw.WikiParser(this,type,text,{wiki: this.wiki});
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user