src/main.js

Summary

Maintainability
A
1 hr
Test Coverage
var dict = ['古代', '现在', '此时', '此刻', '等于', '是', '今天'];
var combinedDict = [];

//子丑寅卯辰巳午未申酉戌亥
var oldTime = [
    {time: '子时', from: '23', to: '1'},
    {time: '丑时', from: '1', to: '3'},
    {time: '寅时', from: '3', to: '5'},
    {time: '卯时', from: '5', to: '7'},
    {time: '辰时', from: '7', to: '9'},
    {time: '巳时', from: '9', to: '11'},
    {time: '午时', from: '11', to: '13'},
    {time: '未时', from: '13', to: '15'},
    {time: '申时', from: '15', to: '17'},
    {time: '酉时', from: '17', to: '19'},
    {time: '戌时', from: '19', to: '21'},
    {time: '亥时', from: '21', to: '23'}
];

var nowWords = ['现在','Today','此时','此刻','今天'];
var eq = ['是', '等于'];

var Utils = {};

Utils.combinedObjString = function (dict, str) {
    if(typeof str[0] !== 'object'){
        str.forEach(function (data) {
            dict.push(data);
        });
    } else {
        str.forEach(function (time) {
            dict.push(time.time);
        });
    }

    return dict;
};

Utils.objectToStringRegex = function (str) {
    var result = "";
    str.forEach(function (time) {
        result = result + time.time + "|";
    });

    return result.substring(0, result.length - 1);
};

Utils.arrayToStringRegex = function (str) {
    var result = "";
    str.forEach(function (data) {
        result = result + data + "|";
    });

    return result.substring(0, result.length - 1);
};

Utils.stringToRegex = function (str) {
    return new RegExp(str);
};

Utils.extend = function (object) {
    var source, prop;
    for (var i = 1, length = arguments.length; i < length; i++) {
        source = arguments[i];
        for (prop in source) {
            if (hasOwnProperty.call(source, prop)) {
                object[prop] = source[prop];
            }
        }
    }
    return object;
};

combinedDict = Utils.combinedObjString(dict, oldTime);
combinedDict = Utils.combinedObjString(combinedDict, nowWords);
combinedDict = Utils.combinedObjString(combinedDict, eq);

var Geng = function () {
};

Geng.parser = function (time) {
    this.time = time;
    return this;
};

Geng.convert = function () {
    var results = {},
        result,
        trieTree = new Geng.trie(),
        lexer = new Geng.lexer();

    trieTree.init(combinedDict);

    var oldTimeRegex = Utils.stringToRegex(Utils.objectToStringRegex(oldTime));
    lexer.addRule(oldTimeRegex, function (lexme) {
        var result = {};
        oldTime.forEach(function (time) {
            if (time.time === lexme) {
                result = time;
                delete result.time;
            }
        });

        return {time: result};
    });

    var newWordsRegex = Utils.stringToRegex(Utils.arrayToStringRegex(nowWords));
    lexer.addRule(newWordsRegex, function () {
        return {now: true};
    });

    var eqRegex = Utils.stringToRegex(Utils.arrayToStringRegex(eq));
    lexer.addRule(eqRegex, function () {
        return {condition: "equal"};
    });

    var words = trieTree.splitWords(this.time);
    words.forEach(function (word) {
        lexer.setInput(word);
        result = lexer.lex();
        Utils.extend(results, result);
    });

    return results.time;
};

Geng.version = Geng.VERSION = '0.0.2';