Add all of the original Annatar work
[tengwarjs.git] / numbers.js
1
2 var Parser = require("./parser");
3
4 var array_ = Array.prototype;
5
6 module.exports = parseNumber;
7 function parseNumber(callback, options) {
8 var font = options.font;
9 var makeColumn = font.makeColumn;
10 return parseDigits(function (digits) {
11 if (digits) {
12 return parseConvert(callback, digits.join(""), makeColumn);
13 } else {
14 return callback();
15 }
16 });
17 }
18
19 var digits = "0123456789";
20 var parseDigit = function (callback) {
21 return function (character) {
22 if (character !== "" && digits.indexOf(character) !== -1) {
23 return callback(character);
24 } else {
25 return callback()(character);
26 }
27 };
28 };
29
30 function parseConvert(callback, number, makeColumn) {
31 return Parser.countPrimes(function (primes) {
32 return callback(convert(number, primes, makeColumn));
33 });
34 }
35
36 function convert(string, primes, makeColumn) {
37 var error;
38 var radix;
39 if (primes == 0) {
40 radix = 10;
41 } else {
42 radix = 12;
43 error = primes > 1;
44 }
45 var number = parseInt(string, 10);
46 var string = number.toString(radix).split("");
47 return string.map(function (character) {
48 var column = makeColumn(""+parseInt(character, 12));
49 if (error) {
50 column.addError("Numbers can only be parsed in either decimal or dudecimal.");
51 }
52 return column;
53 });
54 }
55
56 var parseDigits = Parser.makeParseSome(parseDigit);
57