var makeDocumentParser = require("./document-parser");
var normalize = require("./normalize");
var punctuation = require("./punctuation");
+var parseNumber = require("./numbers");
exports.name = "Mode of Beleriand";
columns.concat([column])
);
} else {
- return callback(columns);
+ return function (character) {
+ if (/\d/.test(character)) {
+ return parseNumber(function (number) {
+ return parseWord(callback, options, columns.concat(number));
+ }, options)(character);
+ } else {
+ return callback(columns)(character);
+ }
+ };
}
}, options);
}
return callback(makeColumn("silme").addError("Z does not appear in the mode of Beleriand"));
} else if (punctuation[character]) {
return callback(makeColumn(punctuation[character]));
- } else if (Parser.isBreak(character)) {
+ } else if (Parser.isBreak(character) || /\d/.test(character)) {
return callback()(character);
} else {
return callback(makeColumn("anna").addError("Unexpected character: " + JSON.stringify(character)));
var makeDocumentParser = require("./document-parser");
var normalize = require("./normalize");
var punctuation = require("./punctuation");
+var parseNumber = require("./numbers");
exports.name = "Classical Mode";
return function (character) {
if (Parser.isBreak(character)) {
return callback([])(character);
+ } else if (/\d/.test(character)) {
+ return parseNumber(callback, options)(character);
} else if (punctuation[character]) {
return callback([makeColumn(punctuation[character])]);
} else {
"close-paren": "œ",
"flourish-left": "Ğ",
"flourish-right": "ğ",
- // numerals
- "#0": "",
- "#1": "Ò",
- "#2": "Ú",
- "#3": "Û",
- "#4": "Ù",
- "#5": "ı",
- "#6": "ˆ",
- "#7": "˜",
- "#8": "¯",
- "#9": "˘",
- "#10": "˙",
- "#11": "˚"
+ // numbers
+ "0": "ð",
+ "1": "ñ",
+ "2": "ò",
+ "3": "ó",
+ "4": "ô",
+ "5": "õ",
+ "6": "ö",
+ "7": "÷",
+ "8": "ø",
+ "9": "ù",
+ "10": "ú",
+ "11": "û"
};
exports.tehtar = {
});
}
-var parseAnySpaces = Parser.makeParseAny(" ");
-var parseSomeSpaces = Parser.makeParseSome(" ");
+var parseSpace = Parser.makeExpect(" ");
+var parseAnySpaces = Parser.makeParseAny(parseSpace);
+var parseSomeSpaces = Parser.makeParseSome(parseSpace);
var parseNewline = Parser.makeExpect("\n");
-var parseNewlines = Parser.makeParseSome("\n");
+var parseNewlines = Parser.makeParseSome(parseNewline);
function parseNewlineSpace(callback) {
return parseAnySpaces(function () {
var makeDocumentParser = require("./document-parser");
var normalize = require("./normalize");
var punctuation = require("./punctuation");
-var parseNumber = require("./numerals");
+var parseNumber = require("./numbers");
exports.name = "General Use Mode";
return function (character) {
if (Parser.isBreak(character)) {
return callback([]);
+ } else if (/\d/.test(character)) {
+ return parseNumber(callback, options)(character);
} else if (punctuation[character]) {
return callback([makeColumn(punctuation[character])]);
} else {
dan-smith.js \
alphabet.js \
punctuation.js \
- numerals.js \
+ numbers.js \
notation.js \
normalize.js \
parser.js \
--- /dev/null
+
+var Parser = require("./parser");
+
+var array_ = Array.prototype;
+
+module.exports = parseNumber;
+function parseNumber(callback, options) {
+ var font = options.font;
+ var makeColumn = font.makeColumn;
+ return parseDigits(function (digits) {
+ if (digits) {
+ return parseConvert(callback, digits.join(""), makeColumn);
+ } else {
+ return callback();
+ }
+ });
+}
+
+var digits = "0123456789";
+var parseDigit = function (callback) {
+ return function (character) {
+ if (character !== "" && digits.indexOf(character) !== -1) {
+ return callback(character);
+ } else {
+ return callback()(character);
+ }
+ };
+};
+
+function parseConvert(callback, number, makeColumn) {
+ return Parser.countPrimes(function (primes) {
+ return callback(convert(number, primes, makeColumn));
+ });
+}
+
+function convert(string, primes, makeColumn) {
+ var error;
+ var radix;
+ if (primes == 0) {
+ radix = 10;
+ } else {
+ radix = 12;
+ error = primes > 1;
+ }
+ var number = parseInt(string, 10);
+ var string = number.toString(radix).split("");
+ return string.map(function (character) {
+ var column = makeColumn(""+parseInt(character, 12));
+ if (error) {
+ column.addError("Numbers can only be parsed in either decimal or dudecimal.");
+ }
+ return column;
+ });
+}
+
+
+var parseDigits = Parser.makeParseSome(parseDigit);
+var parseDot = Parser.makeExpect(".");
+
+++ /dev/null
-
-var array_ = Array.prototype;
-
-module.exports = function parseNumber(text, radix, options) {
- var font = options.font;
- var makeColumn = font.makeColumn;
- return array_.map.call(parseInt(text, radix).toString(radix), function (character) {
- return makeColumn("#" + character);
- });
-};
-
}
exports.makeParseSome = makeParseSome;
-function makeParseSome(expected) {
+function makeParseSome(parseOne) {
var parseSome = function (callback) {
- return function (character) {
- if (character === expected) {
- return parseRemaining(callback);
+ return parseOne(function (one) {
+ if (one != null) {
+ return parseRemaining(callback, [one]);
} else {
- return callback()(character);
+ return callback([]);
}
- };
+ });
};
- var parseRemaining = makeParseAny(expected);
+ var parseRemaining = makeParseAny(parseOne);
return parseSome;
}
exports.makeParseAny = makeParseAny;
-function makeParseAny(expected) {
- return function parseRemaining(callback) {
- return function (character) {
- if (character === expected) {
- return parseRemaining(callback);
+function makeParseAny(parseOne) {
+ return function parseRemaining(callback, any) {
+ any = any || [];
+ return parseOne(function (one) {
+ if (one != null) {
+ return parseRemaining(callback, any.concat([one]));
} else {
- return callback(expected)(character);
+ return callback(any);
}
- };
+ });
};
}