ko-chrono 0.4.0 → 0.4.1

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.
@@ -8,6 +8,10 @@ const WEEK_WORDS = {
8
8
  };
9
9
  const WEEK_WORD = '지지난|저저번|지난|저번|이번|다다음|다음|다담|담';
10
10
  const DAY = '월|화|수|목|금|토|일';
11
+ // 요일 글자만 쓸 때(규칙 36) 뒤에 와야 하는 것: 끝, 구두점, 시각("월 2시", "금 저녁"), 다른 요일 글자("수, 목"),
12
+ // 조사("금에", "월까지"). "다음주 일정", "다음주 일 많아", "이번주 목 아파"의 일·목은 요일이 아님
13
+ const DAY_ALONE = `(?=\\s*$|\\s*[,.!?~~)]|\\s*(?:\\d|오전|오후|새벽|아침|점심|낮(?!잠)|저녁|밤(?!새)|(?:${DAY})(?![가-힣]))` +
14
+ `|(?:에|엔|은|는|도|나|이나|쯤)(?![가-힣])|에는|까지|부터)`;
11
15
  // "이번 주말", "다음주말", "지난 주말" → 그 주의 토요일
12
16
  const WEEKEND = new RegExp(`(${WEEK_WORD})\\s*주말`, 'g');
13
17
  // "월~금", "화~목요일" → 두 조각 (index.ts가 "~"로 구간을 합친다)
@@ -15,8 +19,8 @@ const RANGE = new RegExp(`(?<![\\d가-힣])(${DAY})\\s*~\\s*((${DAY})(?:요일|
15
19
  // "11/3(화)", "11월 5일 (목)" 뒤에 붙는 요일 표시
16
20
  const PAREN = new RegExp(`\\((${DAY})\\)`, 'g');
17
21
  // "11월 첫째 주 월요일", "둘째 주 수요일", "마지막 주 금요일", "12월 셋째 주"
18
- // 요일 글자만 쓸 때("첫째 주 월")는 뒤에 한글이 없어야 한다 ("둘째 주 일정"의 "일"은 요일이 아님)
19
- const NTH = new RegExp(`(?:(\\d{1,2})\\s*월\\s*)?(첫째|첫|둘째|셋째|넷째|다섯째|마지막)\\s*주(?:\\s*(${DAY})(?:요일|욜|(?![가-힣])))?`, 'g');
22
+ // 요일 글자만 쓸 때("첫째 주 월")는 DAY_ALONE을 따른다 ("둘째 주 일정"의 "일"은 요일이 아님)
23
+ const NTH = new RegExp(`(?:(\\d{1,2})\\s*월\\s*)?(첫째|첫|둘째|셋째|넷째|다섯째|마지막)\\s*주(?:\\s*(${DAY})(?:요일|욜|${DAY_ALONE}))?`, 'g');
20
24
  const NTH_NUM = { 첫째: 1, 첫: 1, 둘째: 2, 셋째: 3, 넷째: 4, 다섯째: 5, 마지막: -1 };
21
25
  // "2주 뒤 월요일", "3주 후 금요일" → N주 뒤의 그 주의 X요일 ("다다음주 월요일"과 같은 계산)
22
26
  const WEEKS_LATER = new RegExp(`(\\d{1,2}|한|두|세|네|다섯)\\s*주\\s*(?:뒤|후)\\s*(${DAY})(?:요일|욜)`, 'g');
@@ -31,12 +35,12 @@ const FORMAL_WEEK_ONLY = /(?<![가-힣])(?:(전전|차차|차|익)주(?=\s*(?:
31
35
  const DIR = new RegExp(`(지난|저번|다음)\\s*(${DAY})(?:요일|욜)`, 'g');
32
36
  // "주말에 보자" ("이번 주말"은 위 WEEKEND가 먼저 잡는다)
33
37
  const BARE_WEEKEND = /(?<![가-힣])주말(?=[\s,에엔은는도까부]|$)/g;
34
- // "다음주 화요일", "이번 주 금", "다다음주 월요일", "담주 월욜"
35
- const WITH_WEEK = new RegExp(`(${WEEK_WORD})\\s*주\\s*(${DAY})(요일|욜)?`, 'g');
38
+ // "다음주 화요일", "이번 주 금", "다다음주 월요일", "담주 월욜", "담주 월 2시"
39
+ const WITH_WEEK = new RegExp(`(${WEEK_WORD})\\s*주\\s*(${DAY})(?:요일|욜|${DAY_ALONE})`, 'g');
36
40
  // "화요일", "화욜" 단독 (요일 글자만은 오탐이 많아 '요일'/'욜'까지 요구)
37
41
  const BARE = /(?<![가-힣])(월|화|수|목|금|토|일)(?:요일|욜)/g;
38
42
  // "다음주", "이번주" 단독 (요일 없음) → 그 주의 시작 요일
39
- const WEEK_ONLY = new RegExp(`(${WEEK_WORD})\\s*주(\\s*이맘때)?(?!\\s*(${DAY}))`, 'g');
43
+ const WEEK_ONLY = new RegExp(`(${WEEK_WORD})\\s*주(\\s*이맘때)?(?!\\s*(?:${DAY})(?:요일|욜|${DAY_ALONE}))`, 'g');
40
44
  /** 요일 관련 표현 */
41
45
  const weekday = (text) => {
42
46
  const out = [];
@@ -5,6 +5,10 @@ const WEEK_WORDS = {
5
5
  };
6
6
  const WEEK_WORD = '지지난|저저번|지난|저번|이번|다다음|다음|다담|담';
7
7
  const DAY = '월|화|수|목|금|토|일';
8
+ // 요일 글자만 쓸 때(규칙 36) 뒤에 와야 하는 것: 끝, 구두점, 시각("월 2시", "금 저녁"), 다른 요일 글자("수, 목"),
9
+ // 조사("금에", "월까지"). "다음주 일정", "다음주 일 많아", "이번주 목 아파"의 일·목은 요일이 아님
10
+ const DAY_ALONE = `(?=\\s*$|\\s*[,.!?~~)]|\\s*(?:\\d|오전|오후|새벽|아침|점심|낮(?!잠)|저녁|밤(?!새)|(?:${DAY})(?![가-힣]))` +
11
+ `|(?:에|엔|은|는|도|나|이나|쯤)(?![가-힣])|에는|까지|부터)`;
8
12
  // "이번 주말", "다음주말", "지난 주말" → 그 주의 토요일
9
13
  const WEEKEND = new RegExp(`(${WEEK_WORD})\\s*주말`, 'g');
10
14
  // "월~금", "화~목요일" → 두 조각 (index.ts가 "~"로 구간을 합친다)
@@ -12,8 +16,8 @@ const RANGE = new RegExp(`(?<![\\d가-힣])(${DAY})\\s*~\\s*((${DAY})(?:요일|
12
16
  // "11/3(화)", "11월 5일 (목)" 뒤에 붙는 요일 표시
13
17
  const PAREN = new RegExp(`\\((${DAY})\\)`, 'g');
14
18
  // "11월 첫째 주 월요일", "둘째 주 수요일", "마지막 주 금요일", "12월 셋째 주"
15
- // 요일 글자만 쓸 때("첫째 주 월")는 뒤에 한글이 없어야 한다 ("둘째 주 일정"의 "일"은 요일이 아님)
16
- const NTH = new RegExp(`(?:(\\d{1,2})\\s*월\\s*)?(첫째|첫|둘째|셋째|넷째|다섯째|마지막)\\s*주(?:\\s*(${DAY})(?:요일|욜|(?![가-힣])))?`, 'g');
19
+ // 요일 글자만 쓸 때("첫째 주 월")는 DAY_ALONE을 따른다 ("둘째 주 일정"의 "일"은 요일이 아님)
20
+ const NTH = new RegExp(`(?:(\\d{1,2})\\s*월\\s*)?(첫째|첫|둘째|셋째|넷째|다섯째|마지막)\\s*주(?:\\s*(${DAY})(?:요일|욜|${DAY_ALONE}))?`, 'g');
17
21
  const NTH_NUM = { 첫째: 1, 첫: 1, 둘째: 2, 셋째: 3, 넷째: 4, 다섯째: 5, 마지막: -1 };
18
22
  // "2주 뒤 월요일", "3주 후 금요일" → N주 뒤의 그 주의 X요일 ("다다음주 월요일"과 같은 계산)
19
23
  const WEEKS_LATER = new RegExp(`(\\d{1,2}|한|두|세|네|다섯)\\s*주\\s*(?:뒤|후)\\s*(${DAY})(?:요일|욜)`, 'g');
@@ -28,12 +32,12 @@ const FORMAL_WEEK_ONLY = /(?<![가-힣])(?:(전전|차차|차|익)주(?=\s*(?:
28
32
  const DIR = new RegExp(`(지난|저번|다음)\\s*(${DAY})(?:요일|욜)`, 'g');
29
33
  // "주말에 보자" ("이번 주말"은 위 WEEKEND가 먼저 잡는다)
30
34
  const BARE_WEEKEND = /(?<![가-힣])주말(?=[\s,에엔은는도까부]|$)/g;
31
- // "다음주 화요일", "이번 주 금", "다다음주 월요일", "담주 월욜"
32
- const WITH_WEEK = new RegExp(`(${WEEK_WORD})\\s*주\\s*(${DAY})(요일|욜)?`, 'g');
35
+ // "다음주 화요일", "이번 주 금", "다다음주 월요일", "담주 월욜", "담주 월 2시"
36
+ const WITH_WEEK = new RegExp(`(${WEEK_WORD})\\s*주\\s*(${DAY})(?:요일|욜|${DAY_ALONE})`, 'g');
33
37
  // "화요일", "화욜" 단독 (요일 글자만은 오탐이 많아 '요일'/'욜'까지 요구)
34
38
  const BARE = /(?<![가-힣])(월|화|수|목|금|토|일)(?:요일|욜)/g;
35
39
  // "다음주", "이번주" 단독 (요일 없음) → 그 주의 시작 요일
36
- const WEEK_ONLY = new RegExp(`(${WEEK_WORD})\\s*주(\\s*이맘때)?(?!\\s*(${DAY}))`, 'g');
40
+ const WEEK_ONLY = new RegExp(`(${WEEK_WORD})\\s*주(\\s*이맘때)?(?!\\s*(?:${DAY})(?:요일|욜|${DAY_ALONE}))`, 'g');
37
41
  /** 요일 관련 표현 */
38
42
  export const weekday = (text) => {
39
43
  const out = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ko-chrono",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "한국어 자연어 날짜/시간 파서 — '다음주 화요일 오후 3시' → Date",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",