ko-chrono 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +237 -66
- package/dist/cjs/event.d.ts +20 -0
- package/dist/cjs/event.js +33 -0
- package/dist/cjs/index.d.ts +55 -0
- package/dist/cjs/index.js +192 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/parsers/absoluteDate.d.ts +3 -0
- package/dist/cjs/parsers/absoluteDate.js +95 -0
- package/dist/cjs/parsers/duration.d.ts +3 -0
- package/dist/cjs/parsers/duration.js +45 -0
- package/dist/cjs/parsers/holiday.d.ts +3 -0
- package/dist/cjs/parsers/holiday.js +72 -0
- package/dist/cjs/parsers/offset.d.ts +3 -0
- package/dist/cjs/parsers/offset.js +64 -0
- package/dist/cjs/parsers/recurrence.d.ts +5 -0
- package/dist/cjs/parsers/recurrence.js +117 -0
- package/dist/cjs/parsers/relativeDay.d.ts +3 -0
- package/dist/cjs/parsers/relativeDay.js +26 -0
- package/dist/cjs/parsers/relativeMonth.d.ts +3 -0
- package/dist/cjs/parsers/relativeMonth.js +30 -0
- package/dist/cjs/parsers/relativeYear.d.ts +3 -0
- package/dist/cjs/parsers/relativeYear.js +30 -0
- package/dist/cjs/parsers/time.d.ts +3 -0
- package/dist/cjs/parsers/time.js +152 -0
- package/dist/cjs/parsers/weekday.d.ts +3 -0
- package/dist/cjs/parsers/weekday.js +109 -0
- package/dist/cjs/resolve.d.ts +21 -0
- package/dist/cjs/resolve.js +446 -0
- package/dist/cjs/types.d.ts +125 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/util/lunarHolidays.d.ts +11 -0
- package/dist/cjs/util/lunarHolidays.js +82 -0
- package/dist/cjs/util/number.d.ts +5 -0
- package/dist/cjs/util/number.js +42 -0
- package/dist/cjs/util/timezone.d.ts +4 -0
- package/dist/cjs/util/timezone.js +55 -0
- package/dist/event.d.ts +20 -0
- package/dist/event.js +30 -0
- package/dist/index.d.ts +18 -1
- package/dist/index.js +54 -6
- package/dist/parsers/absoluteDate.js +6 -2
- package/dist/parsers/duration.js +4 -2
- package/dist/parsers/holiday.d.ts +3 -0
- package/dist/parsers/holiday.js +68 -0
- package/dist/parsers/offset.js +6 -3
- package/dist/parsers/recurrence.d.ts +5 -0
- package/dist/parsers/recurrence.js +112 -0
- package/dist/parsers/time.js +22 -2
- package/dist/parsers/weekday.js +10 -0
- package/dist/resolve.d.ts +2 -2
- package/dist/resolve.js +164 -13
- package/dist/types.d.ts +53 -0
- package/dist/util/lunarHolidays.d.ts +11 -0
- package/dist/util/lunarHolidays.js +76 -0
- package/dist/util/timezone.d.ts +4 -0
- package/dist/util/timezone.js +51 -0
- package/package.json +13 -5
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.time = void 0;
|
|
4
|
+
const number_js_1 = require("../util/number.js");
|
|
5
|
+
// "오후 3시", "3시 반", "오전 10시 30분", "새벽 2시", "저녁 7시", "낮 12시", "15시", "7시30", "3시 정각"
|
|
6
|
+
const CLOCK = /(오전|오후|새벽|아침|저녁|밤|낮|정오)?\s*(\d{1,2}|한|두|세|네|다섯|여섯|일곱|여덟|아홉|열|열한|열두)\s*시(?!간)\s*(?:(반)|(\d{1,2})\s*분|(\d{2})(?![\d가-힣])|정각)?/g;
|
|
7
|
+
// "5시 10분 전" → 4:50
|
|
8
|
+
const BEFORE = /(오전|오후|새벽|아침|저녁|밤|낮)?\s*(\d{1,2}|한|두|세|네|다섯|여섯|일곱|여덟|아홉|열|열한|열두)\s*시\s*(\d{1,2})\s*분\s*전(?=[\s,에까]|$)/g;
|
|
9
|
+
// "오전 중으로", "오후 중에" → 그 시간대의 끝(12시/18시)까지
|
|
10
|
+
const HALF_DAY = /(오전|오후)\s*중(?!순)(?:으로|에는|에)?/g;
|
|
11
|
+
// "3pm", "9 AM", "12pm"
|
|
12
|
+
const AMPM = /(?<![\d:])(\d{1,2})(?::(\d{2}))?\s*([ap])\.?m\.?(?![a-z])/gi;
|
|
13
|
+
// "3~5시", "오후 3~5시" → "오후 3" + "5시" 두 조각 (index.ts가 "~"로 구간을 합친다)
|
|
14
|
+
const SHORT_RANGE = /(오전|오후|새벽|아침|저녁|밤|낮)?\s*(\d{1,2}|한|두|세|네|다섯|여섯|일곱|여덟|아홉|열|열한|열두)\s*~\s*((\d{1,2}|한|두|세|네|다섯|여섯|일곱|여덟|아홉|열|열한|열두)\s*시)/g;
|
|
15
|
+
// "15:30", "3:00", "오후 3:30"
|
|
16
|
+
const COLON = /(?:(오전|오후|새벽|아침|저녁|밤|낮)\s*)?(?<!\d)(\d{1,2}):(\d{2})(?!\d)/g;
|
|
17
|
+
// 단독 시간 단어. "낮"은 "낮다"와 겹쳐서 뒤에 공백/조사가 올 때만
|
|
18
|
+
const WORD = /(정오|자정|점심|아침|저녁|밤(?!새|낮)|퇴근|낮(?=[\s에,]|$))(?!\s*\d)/g;
|
|
19
|
+
// "내일 오후", "오전에" → 9시/15시 (규칙 25). 뒤에 조사·공백·끝만 허용하고,
|
|
20
|
+
// "오전반", "오후 반차", "오전오후"처럼 다른 낱말이 붙으면 잡지 않는다
|
|
21
|
+
const HALF_WORD = /(?<![가-힣])(오전|오후)(?=(?:에는|에|엔|은|는|도|쯤|께)?(?:[\s,.!?~]|$))(?!\s*(?:반|오전|오후|\d))/g;
|
|
22
|
+
const WORD_HOUR = {
|
|
23
|
+
정오: 12, 자정: 0, 점심: 12, 아침: 8, 저녁: 19, 밤: 21, 퇴근: 18, 낮: 12, 오전: 9, 오후: 15,
|
|
24
|
+
};
|
|
25
|
+
// "내일 이 시간", "다음 주 이 시간" → 기준 시각의 시:분. "같이 시간 내자"는 잡지 않는다
|
|
26
|
+
const SAME_TIME = /(?<![가-힣])이\s*시간(?!대|\s*(?:뒤|후|전|동안|이내|안에))/g;
|
|
27
|
+
function applyMeridiem(prefix, hour) {
|
|
28
|
+
if (hour === 24)
|
|
29
|
+
return 0;
|
|
30
|
+
switch (prefix) {
|
|
31
|
+
case '밤':
|
|
32
|
+
// 밤 12시 = 자정, 밤 1~5시 = 새벽
|
|
33
|
+
return hour === 12 ? 0 : hour <= 5 ? hour : hour < 12 ? hour + 12 : hour;
|
|
34
|
+
case '오후':
|
|
35
|
+
case '저녁':
|
|
36
|
+
case '낮':
|
|
37
|
+
return hour < 12 ? hour + 12 : hour;
|
|
38
|
+
case '오전':
|
|
39
|
+
case '새벽':
|
|
40
|
+
case '아침':
|
|
41
|
+
return hour === 12 ? 0 : hour;
|
|
42
|
+
case '정오':
|
|
43
|
+
return 12;
|
|
44
|
+
default:
|
|
45
|
+
return hour;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** 시각 표현 */
|
|
49
|
+
const time = (text) => {
|
|
50
|
+
const out = [];
|
|
51
|
+
const taken = [];
|
|
52
|
+
const take = (i, len) => {
|
|
53
|
+
if (taken.some(([s, e]) => i < e && i + len > s))
|
|
54
|
+
return false;
|
|
55
|
+
taken.push([i, i + len]);
|
|
56
|
+
return true;
|
|
57
|
+
};
|
|
58
|
+
for (const m of text.matchAll(SHORT_RANGE)) {
|
|
59
|
+
const a = (0, number_js_1.parseKoreanNumber)(m[2]), b = (0, number_js_1.parseKoreanNumber)(m[4]);
|
|
60
|
+
if (a == null || b == null || a > 24 || b > 24)
|
|
61
|
+
continue;
|
|
62
|
+
const bIndex = m.index + m[0].length - m[3].length;
|
|
63
|
+
if (!take(m.index, m[0].length))
|
|
64
|
+
continue;
|
|
65
|
+
const startText = m[0].slice(0, m[0].indexOf('~')).trimEnd();
|
|
66
|
+
const start = { hour: applyMeridiem(m[1], a), minute: 0 };
|
|
67
|
+
if (m[1])
|
|
68
|
+
start.meridiem = true;
|
|
69
|
+
out.push({ text: startText, index: m.index, components: start });
|
|
70
|
+
out.push({ text: m[3], index: bIndex, components: { hour: b === 24 ? 0 : b, minute: 0 } });
|
|
71
|
+
}
|
|
72
|
+
for (const m of text.matchAll(BEFORE)) {
|
|
73
|
+
const raw = (0, number_js_1.parseKoreanNumber)(m[2]);
|
|
74
|
+
if (raw == null || raw > 24 || +m[3] > 59)
|
|
75
|
+
continue;
|
|
76
|
+
if (!take(m.index, m[0].length))
|
|
77
|
+
continue;
|
|
78
|
+
const total = applyMeridiem(m[1], raw) * 60 - +m[3];
|
|
79
|
+
const c = { hour: Math.floor(total / 60), minute: total % 60 };
|
|
80
|
+
if (m[1])
|
|
81
|
+
c.meridiem = true;
|
|
82
|
+
out.push({ text: m[0], index: m.index, components: c });
|
|
83
|
+
}
|
|
84
|
+
for (const m of text.matchAll(HALF_DAY)) {
|
|
85
|
+
if (!take(m.index, m[0].length))
|
|
86
|
+
continue;
|
|
87
|
+
const hour = m[1] === '오전' ? 12 : 18;
|
|
88
|
+
out.push({ text: m[0], index: m.index, components: { hour, minute: 0, meridiem: true, isEnd: true } });
|
|
89
|
+
}
|
|
90
|
+
for (const m of text.matchAll(AMPM)) {
|
|
91
|
+
const raw = +m[1];
|
|
92
|
+
if (raw < 1 || raw > 12)
|
|
93
|
+
continue;
|
|
94
|
+
if (!take(m.index, m[0].length))
|
|
95
|
+
continue;
|
|
96
|
+
const hour = applyMeridiem(m[3].toLowerCase() === 'p' ? '오후' : '오전', raw);
|
|
97
|
+
out.push({ text: m[0], index: m.index, components: { hour, minute: m[2] ? +m[2] : 0, meridiem: true } });
|
|
98
|
+
}
|
|
99
|
+
for (const m of text.matchAll(CLOCK)) {
|
|
100
|
+
const raw = (0, number_js_1.parseKoreanNumber)(m[2]);
|
|
101
|
+
if (raw == null || raw > 24)
|
|
102
|
+
continue;
|
|
103
|
+
if (!take(m.index, m[0].length))
|
|
104
|
+
continue;
|
|
105
|
+
const hour = applyMeridiem(m[1], raw);
|
|
106
|
+
let minute = 0;
|
|
107
|
+
if (m[3])
|
|
108
|
+
minute = 30;
|
|
109
|
+
else if (m[4] ?? m[5])
|
|
110
|
+
minute = +(m[4] ?? m[5]);
|
|
111
|
+
if (minute > 59)
|
|
112
|
+
continue;
|
|
113
|
+
const c = { hour, minute };
|
|
114
|
+
if (m[1])
|
|
115
|
+
c.meridiem = true;
|
|
116
|
+
if (raw === 24 || (m[1] === '밤' && raw === 12))
|
|
117
|
+
c.midnight = true;
|
|
118
|
+
out.push({ text: m[0], index: m.index, components: c });
|
|
119
|
+
}
|
|
120
|
+
for (const m of text.matchAll(COLON)) {
|
|
121
|
+
const raw = +m[2], minute = +m[3];
|
|
122
|
+
if (raw > 23 || minute > 59)
|
|
123
|
+
continue;
|
|
124
|
+
if (!take(m.index, m[0].length))
|
|
125
|
+
continue;
|
|
126
|
+
const hour = applyMeridiem(m[1], raw);
|
|
127
|
+
out.push({ text: m[0], index: m.index, components: { hour, minute, meridiem: true } });
|
|
128
|
+
}
|
|
129
|
+
for (const m of text.matchAll(SAME_TIME)) {
|
|
130
|
+
if (!take(m.index, m[0].length))
|
|
131
|
+
continue;
|
|
132
|
+
out.push({ text: m[0], index: m.index, components: { sameTime: true } });
|
|
133
|
+
}
|
|
134
|
+
for (const m of text.matchAll(HALF_WORD)) {
|
|
135
|
+
if (!take(m.index, m[0].length))
|
|
136
|
+
continue;
|
|
137
|
+
out.push({ text: m[0], index: m.index, components: { hour: WORD_HOUR[m[1]], minute: 0, meridiem: true, approximate: true } });
|
|
138
|
+
}
|
|
139
|
+
for (const m of text.matchAll(WORD)) {
|
|
140
|
+
if (!take(m.index, m[0].length))
|
|
141
|
+
continue;
|
|
142
|
+
const c = { hour: WORD_HOUR[m[1]], minute: 0, meridiem: true };
|
|
143
|
+
if (m[1] === '자정')
|
|
144
|
+
c.midnight = true;
|
|
145
|
+
// 정오·자정은 정확한 시각, 나머지(아침·저녁·밤·점심·낮·퇴근)는 관례
|
|
146
|
+
else if (m[1] !== '정오')
|
|
147
|
+
c.approximate = true;
|
|
148
|
+
out.push({ text: m[0], index: m.index, components: c });
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
};
|
|
152
|
+
exports.time = time;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.weekday = void 0;
|
|
4
|
+
const number_js_1 = require("../util/number.js");
|
|
5
|
+
const WEEKDAY = { 일: 0, 월: 1, 화: 2, 수: 3, 목: 4, 금: 5, 토: 6 };
|
|
6
|
+
const WEEK_WORDS = {
|
|
7
|
+
지지난: -2, 저저번: -2, 지난: -1, 저번: -1, 이번: 0, 다음: 1, 다다음: 2, 다담: 2, 담: 1,
|
|
8
|
+
};
|
|
9
|
+
const WEEK_WORD = '지지난|저저번|지난|저번|이번|다다음|다음|다담|담';
|
|
10
|
+
const DAY = '월|화|수|목|금|토|일';
|
|
11
|
+
// "이번 주말", "다음주말", "지난 주말" → 그 주의 토요일
|
|
12
|
+
const WEEKEND = new RegExp(`(${WEEK_WORD})\\s*주말`, 'g');
|
|
13
|
+
// "월~금", "화~목요일" → 두 조각 (index.ts가 "~"로 구간을 합친다)
|
|
14
|
+
const RANGE = new RegExp(`(?<![\\d가-힣])(${DAY})\\s*~\\s*((${DAY})(?:요일|욜)?)(?![가-힣])`, 'g');
|
|
15
|
+
// "11/3(화)", "11월 5일 (목)" 뒤에 붙는 요일 표시
|
|
16
|
+
const PAREN = new RegExp(`\\((${DAY})\\)`, 'g');
|
|
17
|
+
// "11월 첫째 주 월요일", "둘째 주 수요일", "마지막 주 금요일", "12월 셋째 주"
|
|
18
|
+
// 요일 글자만 쓸 때("첫째 주 월")는 뒤에 한글이 없어야 한다 ("둘째 주 일정"의 "일"은 요일이 아님)
|
|
19
|
+
const NTH = new RegExp(`(?:(\\d{1,2})\\s*월\\s*)?(첫째|첫|둘째|셋째|넷째|다섯째|마지막)\\s*주(?:\\s*(${DAY})(?:요일|욜|(?![가-힣])))?`, 'g');
|
|
20
|
+
const NTH_NUM = { 첫째: 1, 첫: 1, 둘째: 2, 셋째: 3, 넷째: 4, 다섯째: 5, 마지막: -1 };
|
|
21
|
+
// "2주 뒤 월요일", "3주 후 금요일" → N주 뒤의 그 주의 X요일 ("다다음주 월요일"과 같은 계산)
|
|
22
|
+
const WEEKS_LATER = new RegExp(`(\\d{1,2}|한|두|세|네|다섯)\\s*주\\s*(?:뒤|후)\\s*(${DAY})(?:요일|욜)`, 'g');
|
|
23
|
+
// "지난 금요일" = 오늘 제외 가장 가까운 과거, "다음 금요일" = 오늘 제외 가장 가까운 미래
|
|
24
|
+
const DIR = new RegExp(`(지난|저번|다음)\\s*(${DAY})(?:요일|욜)`, 'g');
|
|
25
|
+
// "주말에 보자" ("이번 주말"은 위 WEEKEND가 먼저 잡는다)
|
|
26
|
+
const BARE_WEEKEND = /(?<![가-힣])주말(?=[\s,에엔은는도까부]|$)/g;
|
|
27
|
+
// "다음주 화요일", "이번 주 금", "다다음주 월요일", "담주 월욜"
|
|
28
|
+
const WITH_WEEK = new RegExp(`(${WEEK_WORD})\\s*주\\s*(${DAY})(요일|욜)?`, 'g');
|
|
29
|
+
// "화요일", "화욜" 단독 (요일 글자만은 오탐이 많아 '요일'/'욜'까지 요구)
|
|
30
|
+
const BARE = /(?<![가-힣])(월|화|수|목|금|토|일)(?:요일|욜)/g;
|
|
31
|
+
// "다음주", "이번주" 단독 (요일 없음) → 그 주의 시작 요일
|
|
32
|
+
const WEEK_ONLY = new RegExp(`(${WEEK_WORD})\\s*주(\\s*이맘때)?(?!\\s*(${DAY}))`, 'g');
|
|
33
|
+
/** 요일 관련 표현 */
|
|
34
|
+
const weekday = (text) => {
|
|
35
|
+
const out = [];
|
|
36
|
+
const taken = [];
|
|
37
|
+
const overlaps = (i, len) => taken.some(([s, e]) => i < e && i + len > s);
|
|
38
|
+
for (const m of text.matchAll(WEEKS_LATER)) {
|
|
39
|
+
const n = (0, number_js_1.parseKoreanNumber)(m[1]);
|
|
40
|
+
if (n == null)
|
|
41
|
+
continue;
|
|
42
|
+
out.push({ text: m[0], index: m.index, components: { weekOffset: n, weekday: WEEKDAY[m[2]] } });
|
|
43
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
44
|
+
}
|
|
45
|
+
for (const m of text.matchAll(NTH)) {
|
|
46
|
+
const c = { nthWeek: NTH_NUM[m[2]] };
|
|
47
|
+
if (m[1]) {
|
|
48
|
+
const month = +m[1];
|
|
49
|
+
if (month < 1 || month > 12)
|
|
50
|
+
continue;
|
|
51
|
+
c.month = month;
|
|
52
|
+
}
|
|
53
|
+
if (m[3])
|
|
54
|
+
c.weekday = WEEKDAY[m[3]];
|
|
55
|
+
out.push({ text: m[0], index: m.index, components: c });
|
|
56
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
57
|
+
}
|
|
58
|
+
for (const m of text.matchAll(RANGE)) {
|
|
59
|
+
const bIndex = m.index + m[0].length - m[2].length;
|
|
60
|
+
out.push({ text: m[1], index: m.index, components: { weekday: WEEKDAY[m[1]] } });
|
|
61
|
+
out.push({ text: m[2], index: bIndex, components: { weekday: WEEKDAY[m[3]] } });
|
|
62
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
63
|
+
}
|
|
64
|
+
for (const m of text.matchAll(PAREN)) {
|
|
65
|
+
out.push({ text: m[0], index: m.index, components: { weekday: WEEKDAY[m[1]] } });
|
|
66
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
67
|
+
}
|
|
68
|
+
for (const m of text.matchAll(DIR)) {
|
|
69
|
+
const dir = m[1] === '다음' ? 'next' : 'past';
|
|
70
|
+
out.push({ text: m[0], index: m.index, components: { weekday: WEEKDAY[m[2]], weekdayDir: dir } });
|
|
71
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
72
|
+
}
|
|
73
|
+
for (const m of text.matchAll(WEEKEND)) {
|
|
74
|
+
out.push({ text: m[0], index: m.index, components: { weekOffset: WEEK_WORDS[m[1]], weekday: 6 } });
|
|
75
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
76
|
+
}
|
|
77
|
+
for (const m of text.matchAll(BARE_WEEKEND)) {
|
|
78
|
+
if (overlaps(m.index, m[0].length))
|
|
79
|
+
continue;
|
|
80
|
+
out.push({ text: m[0], index: m.index, components: { weekday: 6, weekend: true } });
|
|
81
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
82
|
+
}
|
|
83
|
+
for (const m of text.matchAll(WITH_WEEK)) {
|
|
84
|
+
if (overlaps(m.index, m[0].length))
|
|
85
|
+
continue;
|
|
86
|
+
out.push({
|
|
87
|
+
text: m[0],
|
|
88
|
+
index: m.index,
|
|
89
|
+
components: { weekOffset: WEEK_WORDS[m[1]], weekday: WEEKDAY[m[2]] },
|
|
90
|
+
});
|
|
91
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
92
|
+
}
|
|
93
|
+
for (const m of text.matchAll(BARE)) {
|
|
94
|
+
if (overlaps(m.index, m[0].length))
|
|
95
|
+
continue;
|
|
96
|
+
out.push({ text: m[0], index: m.index, components: { weekday: WEEKDAY[m[1]] } });
|
|
97
|
+
taken.push([m.index, m.index + m[0].length]);
|
|
98
|
+
}
|
|
99
|
+
for (const m of text.matchAll(WEEK_ONLY)) {
|
|
100
|
+
if (overlaps(m.index, m[0].length))
|
|
101
|
+
continue;
|
|
102
|
+
const c = { weekOffset: WEEK_WORDS[m[1]] };
|
|
103
|
+
if (m[2])
|
|
104
|
+
c.sameDay = true;
|
|
105
|
+
out.push({ text: m[0], index: m.index, components: c });
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
};
|
|
109
|
+
exports.weekday = weekday;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Components, Fragment, ParseResult, ResolveOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 인접한 조각(fragment)을 하나로 합친다.
|
|
4
|
+
* 예: "다음주 화요일" + "오후 3시" → 하나의 결과.
|
|
5
|
+
* 인접 기준: 사이에 공백/쉼표/조사(에,의,엔,은,는,도)/어림말(쯤,경,께)만 있을 때.
|
|
6
|
+
*/
|
|
7
|
+
export declare function groupFragments(fragments: Fragment[], text: string): Fragment[][];
|
|
8
|
+
export declare function merge(list: Components[]): Components;
|
|
9
|
+
/** 날짜 정보 없이 시각만 있는 조각인지 ("5시까지", "17:00") */
|
|
10
|
+
export declare function isTimeOnly(c: Components): boolean;
|
|
11
|
+
/** 날짜 정보가 요일뿐인 조각인지 ("금요일까지") */
|
|
12
|
+
export declare function isWeekdayOnly(c: Components): boolean;
|
|
13
|
+
/** 날짜 정보가 "N일"뿐인 조각인지 ("3일까지") */
|
|
14
|
+
export declare function isDayOnly(c: Components): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* 시 범위의 끝을 시작에 맞춘다 (규칙 16).
|
|
17
|
+
* 끝을 시작과 같은 날에 놓고, 시작보다 이르면 오전/오후를 이어받거나(+12h) 다음날로 넘긴다.
|
|
18
|
+
* "오후 3~5시" → 17시, "오후 11시부터 1시까지" → 다음날 1시, "오후 3시부터 오전 1시까지" → 다음날 1시
|
|
19
|
+
*/
|
|
20
|
+
export declare function alignEnd(start: Date, end: Components): Date;
|
|
21
|
+
export declare function resolve(group: Fragment[], opts: ResolveOptions): ParseResult | null;
|