-
Notifications
You must be signed in to change notification settings - Fork 0
/
unedtfy.pegjs
85 lines (70 loc) · 1.47 KB
/
unedtfy.pegjs
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
start
= interval
/ multiple
/ set
/ approximate_or_undertain
/ date
interval = d1:comp '/' d2:comp {
return {
interval: true,
dates: [d1, d2]
}
}
set = '[' d1:comp d2:(',' d:comp{return d})+ ']' {
return{
set: true,
dates: [d1].concat(d2)
}
}
multiple = '{' d1:comp d2:(',' d:comp{return d})+ '}' {
return{
multiple: true,
dates: [d1].concat(d2)
}
}
comp
= approximate_or_undertain
/ date
approximate_or_undertain
= d:date u:'?'? a:'~'? {
var answer = d
if (u) answer.uncertain = true
if (a) answer.approximate = true
return answer
}
date
= open
/ unknown
/ year_month_day
/ year_season
/ year_month
/ y:year {return {year: y}}
year_month_day = y:year '-' m:month '-' d:day{
return {year: y, month: m, day: d}
}
year_month = y:year '-' m:month{
return {year: y, month: m}
}
year_season = y:year '-' s:season{
return {year: y, season: s}
}
year = 'y'? a:('-'? yeardigits) {return a.join('')}
yeardigits = $(d:(DIGIT+ / !'/') u:(UNKNOWN* / !'/'))
season
= $('21' / '22' / '23' / '24')
month
= $(UNKNOWN_MONTH UNKNOWN / UNKNOWN_MONTH DIGIT)
/ d:DIGIT {return '0' + d}
/ 'u' {return 'uu'}
/ 'x' {return 'xx'}
day
= $(UNKNOWN_DAY UNKNOWN / UNKNOWN_DAY DIGIT)
/ d:DIGIT {return '0' + d}
/ 'u' {return 'uu'}
/ 'x' {return 'xx'}
open = 'open' {return {open: true}}
unknown = 'unknown' {return {unknown: true}}
DIGIT = [0-9]
UNKNOWN = 'u' / 'x'
UNKNOWN_MONTH = UNKNOWN / [0-1]
UNKNOWN_DAY = UNKNOWN / [0-3]