summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/parsers/zh-Hant/ZHHantTimeExpressionParser.js
diff options
context:
space:
mode:
Diffstat (limited to 'bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/parsers/zh-Hant/ZHHantTimeExpressionParser.js')
-rw-r--r--bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/parsers/zh-Hant/ZHHantTimeExpressionParser.js427
1 files changed, 427 insertions, 0 deletions
diff --git a/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/parsers/zh-Hant/ZHHantTimeExpressionParser.js b/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/parsers/zh-Hant/ZHHantTimeExpressionParser.js
new file mode 100644
index 00000000..7d1b7834
--- /dev/null
+++ b/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/parsers/zh-Hant/ZHHantTimeExpressionParser.js
@@ -0,0 +1,427 @@
+/*
+
+
+*/
+
+var moment = require('moment');
+var Parser = require('../parser').Parser;
+var ParsedResult = require('../../result').ParsedResult;
+var ParsedComponents = require('../../result').ParsedComponents;
+
+var util = require('../../utils/ZH-Hant.js');
+
+var patternString1 = '(?:由|從|自)?' +
+ '(?:' +
+ '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +
+ '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +
+ '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +
+ '(?:[\\s,,]*)' +
+ '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +
+ ')?' +
+ '(?:[\\s,,]*)' +
+ '(?:(\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\s*)(?:點|時|:|:)' +
+ '(?:\\s*)' +
+ '(\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\s*)(?:分|:|:)?' +
+ '(?:\\s*)' +
+ '(\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\s*)(?:秒)?)' +
+ '(?:\\s*(A\.M\.|P\.M\.|AM?|PM?))?';
+
+var patternString2 = '(?:\\s*(?:到|至|\\-|\\–|\\~|\\〜)\\s*)' +
+ '(?:' +
+ '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +
+ '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +
+ '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +
+ '(?:[\\s,,]*)' +
+ '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +
+ ')?' +
+ '(?:[\\s,,]*)' +
+ '(?:(\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\s*)(?:點|時|:|:)' +
+ '(?:\\s*)' +
+ '(\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\s*)(?:分|:|:)?' +
+ '(?:\\s*)' +
+ '(\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\s*)(?:秒)?)' +
+ '(?:\\s*(A\.M\.|P\.M\.|AM?|PM?))?';
+
+var FIRST_REG_PATTERN = new RegExp(patternString1, 'i');
+var SECOND_REG_PATTERN = new RegExp(patternString2, 'i');
+
+var DAY_GROUP_1 = 1;
+var ZH_AM_PM_HOUR_GROUP_1 = 2;
+var ZH_AM_PM_HOUR_GROUP_2 = 3;
+var DAY_GROUP_3 = 4;
+var ZH_AM_PM_HOUR_GROUP_3 = 5;
+var HOUR_GROUP = 6;
+var MINUTE_GROUP = 7;
+var SECOND_GROUP = 8;
+var AM_PM_HOUR_GROUP = 9;
+
+exports.Parser = function ZHHantTimeExpressionParser() {
+
+ Parser.apply(this, arguments);
+
+ this.pattern = function() {
+ return FIRST_REG_PATTERN;
+ };
+
+ this.extract = function(text, ref, match, opt) {
+
+ // This pattern can be overlaped Ex. [12] AM, 1[2] AM
+ if (match.index > 0 && text[match.index - 1].match(/\w/)) return null;
+ var refMoment = moment(ref);
+ var result = new ParsedResult();
+ result.ref = ref;
+ result.index = match.index;
+ result.text = match[0];
+ result.tags.ZHTimeExpressionParser = true;
+
+ var startMoment = refMoment.clone();
+
+ // ----- Day
+ if (match[DAY_GROUP_1]) {
+ var day1 = match[DAY_GROUP_1];
+ if (day1 == '明' || day1 == '聽') {
+ // Check not "Tomorrow" on late night
+ if(refMoment.hour() > 1) {
+ startMoment.add(1, 'day');
+ }
+ } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {
+ startMoment.add(-1, 'day');
+ } else if (day1 == "前"){
+ startMoment.add(-2, 'day');
+ } else if (day1 == "大前"){
+ startMoment.add(-3, 'day');
+ } else if (day1 == "後"){
+ startMoment.add(2, 'day');
+ } else if (day1 == "大後"){
+ startMoment.add(3, 'day');
+ }
+ result.start.assign('day', startMoment.date());
+ result.start.assign('month', startMoment.month() + 1);
+ result.start.assign('year', startMoment.year());
+ } else if (match[DAY_GROUP_3]) {
+ var day3 = match[DAY_GROUP_3];
+ if (day3 == '明' || day3 == '聽') {
+ startMoment.add(1, 'day');
+ } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {
+ startMoment.add(-1, 'day');
+ } else if (day3 == "前"){
+ startMoment.add(-2, 'day');
+ } else if (day3 == "大前"){
+ startMoment.add(-3, 'day');
+ } else if (day3 == "後"){
+ startMoment.add(2, 'day');
+ } else if (day3 == "大後"){
+ startMoment.add(3, 'day');
+ }
+ result.start.assign('day', startMoment.date());
+ result.start.assign('month', startMoment.month() + 1);
+ result.start.assign('year', startMoment.year());
+ } else {
+ result.start.imply('day', startMoment.date());
+ result.start.imply('month', startMoment.month() + 1);
+ result.start.imply('year', startMoment.year());
+ }
+
+ var hour = 0;
+ var minute = 0;
+ var meridiem = -1;
+
+ // ----- Second
+ if (match[SECOND_GROUP]) {
+ var second = parseInt(match[SECOND_GROUP]);
+ if (isNaN(second)) {
+ second = util.zhStringToNumber(match[SECOND_GROUP]);
+ }
+ if (second >= 60) return null;
+ result.start.assign('second', second);
+ }
+
+ hour = parseInt(match[HOUR_GROUP]);
+ if (isNaN(hour)) {
+ hour = util.zhStringToNumber(match[HOUR_GROUP]);
+ }
+
+ // ----- Minutes
+ if (match[MINUTE_GROUP]) {
+ if (match[MINUTE_GROUP] == '半') {
+ minute = 30;
+ } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {
+ minute = 0;
+ } else {
+ minute = parseInt(match[MINUTE_GROUP]);
+ if (isNaN(minute)) {
+ minute = util.zhStringToNumber(match[MINUTE_GROUP]);
+ }
+ }
+ } else if (hour > 100) {
+ minute = hour % 100;
+ hour = parseInt(hour / 100);
+ }
+
+ if (minute >= 60) {
+ return null;
+ }
+
+ if (hour > 24) {
+ return null;
+ }
+ if (hour >= 12) {
+ meridiem = 1;
+ }
+
+ // ----- AM & PM
+ if (match[AM_PM_HOUR_GROUP]) {
+ if (hour > 12) return null;
+ var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
+ if (ampm == "a") {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ }
+
+ if (ampm == "p") {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {
+ var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];
+ var zhAMPM1 = zhAMPMString1[0];
+ if (zhAMPM1 == '朝' || zhAMPM1 == '早') {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ } else if (zhAMPM1 == '晚') {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {
+ var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];
+ var zhAMPM2 = zhAMPMString2[0];
+ if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {
+ var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];
+ var zhAMPM3 = zhAMPMString3[0];
+ if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ }
+
+ result.start.assign('hour', hour);
+ result.start.assign('minute', minute);
+
+ if (meridiem >= 0) {
+ result.start.assign('meridiem', meridiem);
+ } else {
+ if (hour < 12) {
+ result.start.imply('meridiem', 0);
+ } else {
+ result.start.imply('meridiem', 1);
+ }
+ }
+
+ // ==============================================================
+ // Extracting the 'to' chunk
+ // ==============================================================
+
+ match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));
+ if (!match) {
+ // Not accept number only result
+ if (result.text.match(/^\d+$/)) {
+ return null;
+ }
+ return result;
+ }
+
+ var endMoment = startMoment.clone();
+ result.end = new ParsedComponents(null, null);
+
+ // ----- Day
+ if (match[DAY_GROUP_1]) {
+ var day1 = match[DAY_GROUP_1];
+ if (day1 == '明' || day1 == '聽') {
+ // Check not "Tomorrow" on late night
+ if(refMoment.hour() > 1) {
+ endMoment.add(1, 'day');
+ }
+ } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {
+ endMoment.add(-1, 'day');
+ } else if (day1 == "前"){
+ endMoment.add(-2, 'day');
+ } else if (day1 == "大前"){
+ endMoment.add(-3, 'day');
+ } else if (day1 == "後"){
+ endMoment.add(2, 'day');
+ } else if (day1 == "大後"){
+ endMoment.add(3, 'day');
+ }
+ result.end.assign('day', endMoment.date());
+ result.end.assign('month', endMoment.month() + 1);
+ result.end.assign('year', endMoment.year());
+ } else if (match[DAY_GROUP_3]) {
+ var day3 = match[DAY_GROUP_3];
+ if (day3 == '明' || day3 == '聽') {
+ endMoment.add(1, 'day');
+ } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {
+ endMoment.add(-1, 'day');
+ } else if (day3 == "前"){
+ endMoment.add(-2, 'day');
+ } else if (day3 == "大前"){
+ endMoment.add(-3, 'day');
+ } else if (day3 == "後"){
+ endMoment.add(2, 'day');
+ } else if (day3 == "大後"){
+ endMoment.add(3, 'day');
+ }
+ result.end.assign('day', endMoment.date());
+ result.end.assign('month', endMoment.month() + 1);
+ result.end.assign('year', endMoment.year());
+ } else {
+ result.end.imply('day', endMoment.date());
+ result.end.imply('month', endMoment.month() + 1);
+ result.end.imply('year', endMoment.year());
+ }
+
+ hour = 0;
+ minute = 0;
+ meridiem = -1;
+
+ // ----- Second
+ if (match[SECOND_GROUP]) {
+ var second = parseInt(match[SECOND_GROUP]);
+ if (isNaN(second)) {
+ second = util.zhStringToNumber(match[SECOND_GROUP]);
+ }
+
+ if (second >= 60) return null;
+ result.end.assign('second', second);
+ }
+
+ hour = parseInt(match[HOUR_GROUP]);
+ if (isNaN(hour)) {
+ hour = util.zhStringToNumber(match[HOUR_GROUP]);
+ }
+
+ // ----- Minutes
+ if (match[MINUTE_GROUP]) {
+ if (match[MINUTE_GROUP] == '半') {
+ minute = 30;
+ } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {
+ minute = 0;
+ } else {
+ minute = parseInt(match[MINUTE_GROUP]);
+ if (isNaN(minute)) {
+ minute = util.zhStringToNumber(match[MINUTE_GROUP]);
+ }
+ }
+ } else if (hour > 100) {
+ minute = hour % 100;
+ hour = parseInt(hour / 100);
+ }
+
+ if (minute >= 60) {
+ return null;
+ }
+
+ if (hour > 24) {
+ return null;
+ }
+ if (hour >= 12) {
+ meridiem = 1;
+ }
+
+ // ----- AM & PM
+ if (match[AM_PM_HOUR_GROUP]) {
+ if (hour > 12) return null;
+ var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
+ if (ampm == "a") {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ }
+
+ if (ampm == "p") {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+
+ if (!result.start.isCertain('meridiem')) {
+ if (meridiem == 0) {
+
+ result.start.imply('meridiem', 0);
+
+ if (result.start.get('hour') == 12) {
+ result.start.assign('hour', 0);
+ }
+
+ } else {
+
+ result.start.imply('meridiem', 1);
+
+ if (result.start.get('hour') != 12) {
+ result.start.assign('hour', result.start.get('hour') + 12);
+ }
+ }
+ }
+
+ } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {
+ var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];
+ var zhAMPM1 = zhAMPMString1[0];
+ if (zhAMPM1 == '朝' || zhAMPM1 == '早') {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ } else if (zhAMPM1 == '晚') {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {
+ var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];
+ var zhAMPM2 = zhAMPMString2[0];
+ if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {
+ var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];
+ var zhAMPM3 = zhAMPMString3[0];
+ if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {
+ meridiem = 0;
+ if (hour == 12) hour = 0;
+ } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {
+ meridiem = 1;
+ if (hour != 12) hour += 12;
+ }
+ }
+
+ result.text = result.text + match[0];
+ result.end.assign('hour', hour);
+ result.end.assign('minute', minute);
+ if (meridiem >= 0) {
+ result.end.assign('meridiem', meridiem);
+ } else {
+ var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;
+ if (startAtPM && result.start.get('hour') > hour) {
+ // 10pm - 1 (am)
+ result.end.imply('meridiem', 0);
+
+ } else if (hour > 12) {
+ result.end.imply('meridiem', 1);
+ }
+ }
+
+ if (result.end.date().getTime() < result.start.date().getTime()) {
+ result.end.imply('day', result.end.get('day') + 1)
+ }
+
+ return result;
+ };
+};