2014-05-20 11:46:57 -07:00
|
|
|
var rr = {};
|
|
|
|
|
|
|
|
|
|
rr.Literal_ = function(value) {
|
2014-05-20 12:49:30 -07:00
|
|
|
this.value_ = value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.Literal_.prototype.match = function(input) {
|
|
|
|
|
if (input.slice(0, this.value_.length) == this.value_) {
|
|
|
|
|
return [this.value_.length, null];
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.Literal_.prototype.search = function(input) {
|
|
|
|
|
var index = input.indexOf(this.value_);
|
|
|
|
|
if (index == -1) {
|
|
|
|
|
return null;
|
|
|
|
|
} else {
|
|
|
|
|
return index;
|
|
|
|
|
}
|
2014-05-20 11:46:57 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.Literal = function(value) {
|
|
|
|
|
return (rr.Literal.cache[value] ||
|
|
|
|
|
(rr.Literal.cache[value] = new rr.Literal_(value)));
|
|
|
|
|
};
|
|
|
|
|
rr.Literal.cache = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.Ref_ = function(key) {
|
2014-05-20 12:49:30 -07:00
|
|
|
this.key_ = key;
|
2014-05-20 11:46:57 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.Ref = function(key) {
|
|
|
|
|
return (rr.Ref.cache[key] ||
|
|
|
|
|
(rr.Ref.cache[key] = new rr.Ref_(key)));
|
|
|
|
|
};
|
|
|
|
|
rr.Ref.cache = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.EndOfLine_ = function() {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.EndOfLine = function() {
|
|
|
|
|
return rr.EndOfLine.cache;
|
|
|
|
|
}
|
|
|
|
|
rr.EndOfLine.cache = new rr.EndOfLine_();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.MultiLineText_ = function() {
|
|
|
|
|
};
|
|
|
|
|
|
2014-05-20 12:49:30 -07:00
|
|
|
rr.MultiLineText_.prototype.minimize = true;
|
|
|
|
|
|
2014-05-20 11:46:57 -07:00
|
|
|
rr.MultiLineText = function() {
|
|
|
|
|
return rr.MultiLineText.cache;
|
|
|
|
|
};
|
|
|
|
|
rr.MultiLineText.cache = new rr.MultiLineText_();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.Or_ = function(options) {
|
2014-05-20 12:49:30 -07:00
|
|
|
this.options_ = options;
|
2014-05-20 11:46:57 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.Or = function() {
|
|
|
|
|
return new rr.Or_(arguments);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.SingleLineText_ = function() {
|
|
|
|
|
};
|
|
|
|
|
|
2014-05-20 12:49:30 -07:00
|
|
|
rr.SingleLineText_.prototype.minimize = true;
|
|
|
|
|
|
|
|
|
|
rr.SingleLineText_.prototype.match = function(input) {
|
|
|
|
|
var newLine = input.indexOf('\n');
|
|
|
|
|
if (newLine == -1) {
|
|
|
|
|
return [input.length, document.createTextNode(input)];
|
|
|
|
|
} else {
|
|
|
|
|
return [newLine, document.createTextNode(input.slice(0, newLine))];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2014-05-20 11:46:57 -07:00
|
|
|
rr.SingleLineText = function() {
|
|
|
|
|
return rr.SingleLineText.cache;
|
|
|
|
|
};
|
|
|
|
|
rr.SingleLineText.cache = new rr.SingleLineText_();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.StartOfLine_ = function() {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.StartOfLine = function() {
|
|
|
|
|
return rr.StartOfLine.cache;
|
|
|
|
|
};
|
|
|
|
|
rr.StartOfLine.cache = new rr.StartOfLine_();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.WordText_ = function() {
|
|
|
|
|
};
|
|
|
|
|
|
2014-05-20 12:49:30 -07:00
|
|
|
rr.WordText_.prototype.minimize = true;
|
|
|
|
|
|
2014-05-20 11:46:57 -07:00
|
|
|
rr.WordText = function() {
|
|
|
|
|
return rr.WordText.cache;
|
|
|
|
|
};
|
|
|
|
|
rr.WordText.cache = new rr.WordText_();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rr.ZeroOrMore_ = function(key) {
|
2014-05-20 12:49:30 -07:00
|
|
|
this.key_ = key;
|
2014-05-20 11:46:57 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
rr.ZeroOrMore = function(key) {
|
|
|
|
|
return (rr.ZeroOrMore.cache[key] ||
|
|
|
|
|
(rr.ZeroOrMore.cache[key] = new rr.ZeroOrMore_(key)));
|
|
|
|
|
};
|
|
|
|
|
rr.ZeroOrMore.cache = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var RecentRunes = function(dictionary) {
|
|
|
|
|
this.dictionary_ = dictionary;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
RecentRunes.prototype.parse = function(nodeType, input) {
|
2014-05-20 12:49:30 -07:00
|
|
|
var ret = document.createElement(nodeType);
|
|
|
|
|
var rules = this.dictionary_[nodeType];
|
|
|
|
|
var inputIndex = 0;
|
|
|
|
|
var lastRuleMinimize = false;
|
|
|
|
|
for (var i = 0; i < rules.length; i++) {
|
|
|
|
|
var rule = rules[i];
|
|
|
|
|
if (rule.minimize) {
|
|
|
|
|
if (lastRuleMinimize) {
|
|
|
|
|
// Two minimize rules in a row is ambiguous
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
lastRuleMinimize = true;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (lastRuleMinimize) {
|
|
|
|
|
// Check if this rule can find a match in the string
|
|
|
|
|
var loc = rule.search(input.slice(inputIndex));
|
|
|
|
|
if (loc == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if the previous rule will match the interim data
|
|
|
|
|
var prevMatch = rules[i - 1].match(
|
|
|
|
|
input.slice(inputIndex, inputIndex + loc));
|
|
|
|
|
if (!prevMatch) {
|
|
|
|
|
return null;
|
|
|
|
|
};
|
|
|
|
|
inputIndex += prevMatch[0];
|
|
|
|
|
if (prevMatch[1]) {
|
|
|
|
|
ret.appendChild(prevMatch[1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var match = rule.match(input.slice(inputIndex));
|
|
|
|
|
if (!match) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
inputIndex += match[0];
|
|
|
|
|
if (match[1]) {
|
|
|
|
|
ret.appendChild(match[1]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
return [inputIndex, ret];
|
2014-05-20 11:46:57 -07:00
|
|
|
};
|