/
parse.js
70 lines (56 loc) · 1.68 KB
/
parse.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
'use strict'
const assert = require('assert')
const dateparser = require('dateparser').parse
const easyPattern = require('easypattern')
const chrono = require('chrono-node')
const openGithubIssue = require('./issue')
const patterns = [
'to {task} on {time}',
'to {task} at {time}',
'to {task} in {interval}',
'in {interval} to {task}',
'on {time} to {task}',
'at {time} to {task}',
'{time} to {task}',
'that {task} on {time}',
'that {task} at {time}',
'that {task} in {interval}',
'to {task} tomorrow'
]
module.exports = function parse (input) {
assert(typeof input, 'string', 'input must be a string')
let result = {
input: input
}
input = input
.replace(/^remind /i, '')
.replace(/^me /i, '')
.replace(/ to /ig, '__to__') // hack to circumvent greedy regex matches for the wrong 'to'
.replace(/__to__/i, ' to ')
patterns.some(function (_) {
var pattern = easyPattern(_)
if (pattern.test(input)) {
result = pattern.match(input)
// special case for trailing tomorrow
if (!result.time && _.match(/tomorrow$/i)) {
result.time = chrono.parse('tomorrow')[0].start.date()
}
if (result.interval) {
result.interval = dateparser(result.interval).value
result.time = Date.now() + result.interval
}
// undo the regex 'to' hack
result.task = result.task.replace(/__to__/ig, ' to ')
if (typeof result.time === 'string') {
result.time = chrono.parse(result.time)[0].start.date()
}
return true
}
})
if (result.time && result.task) {
return result
} else {
openGithubIssue(result)
throw(new Error(`unrecognized pattern: ${result.input}`))
}
}