cronli5 0.2.0 → 0.3.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.
- package/CHANGELOG.md +90 -0
- package/README.md +4 -4
- package/cronli5.min.js +2 -2
- package/dist/cronli5.cjs +514 -407
- package/dist/cronli5.js +514 -407
- package/dist/lang/de.cjs +296 -225
- package/dist/lang/de.js +296 -225
- package/dist/lang/en.cjs +471 -364
- package/dist/lang/en.js +471 -364
- package/dist/lang/es.cjs +318 -281
- package/dist/lang/es.js +318 -281
- package/dist/lang/fi.cjs +326 -276
- package/dist/lang/fi.js +326 -276
- package/dist/lang/zh.cjs +308 -236
- package/dist/lang/zh.js +308 -236
- package/package.json +1 -1
- package/src/core/analyze.ts +22 -21
- package/src/core/cadence.ts +164 -0
- package/src/core/index.ts +3 -1
- package/src/core/normalize.ts +3 -3
- package/src/core/parse.ts +1 -1
- package/src/core/{ir.ts → schedule.ts} +23 -24
- package/src/core/shapes.ts +8 -1
- package/src/core/specs.ts +1 -1
- package/src/core/util.ts +4 -83
- package/src/core/validate.ts +2 -2
- package/src/core/weekday.ts +54 -0
- package/src/cronli5.ts +7 -7
- package/src/lang/de/index.ts +329 -288
- package/src/lang/en/dialects.ts +1 -1
- package/src/lang/en/index.ts +640 -516
- package/src/lang/es/index.ts +342 -374
- package/src/lang/es/notes.md +1 -1
- package/src/lang/fi/dialects.ts +1 -1
- package/src/lang/fi/index.ts +367 -372
- package/src/lang/fi/notes.md +23 -8
- package/src/lang/fi/status.json +1 -1
- package/src/lang/zh/index.ts +344 -262
- package/src/types.ts +6 -6
- package/types/core/analyze.d.ts +4 -4
- package/types/core/cadence.d.ts +33 -0
- package/types/core/index.d.ts +3 -1
- package/types/core/normalize.d.ts +1 -1
- package/types/core/parse.d.ts +1 -1
- package/types/core/{ir.d.ts → schedule.d.ts} +16 -21
- package/types/core/shapes.d.ts +2 -1
- package/types/core/specs.d.ts +1 -1
- package/types/core/util.d.ts +1 -15
- package/types/core/weekday.d.ts +10 -0
- package/types/lang/de/index.d.ts +1 -1
- package/types/lang/en/dialects.d.ts +1 -1
- package/types/lang/en/index.d.ts +1 -1
- package/types/lang/es/index.d.ts +1 -1
- package/types/lang/fi/dialects.d.ts +1 -1
- package/types/lang/fi/index.d.ts +1 -1
- package/types/lang/zh/index.d.ts +1 -1
- package/types/types.d.ts +5 -5
package/dist/lang/zh.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
// src/core/
|
|
2
|
-
function isNonNegativeInteger(value) {
|
|
3
|
-
const digits = /^\d+$/;
|
|
4
|
-
return digits.test(value);
|
|
5
|
-
}
|
|
1
|
+
// src/core/cadence.ts
|
|
6
2
|
function arithmeticStep(values) {
|
|
7
3
|
if (values.length < 5) {
|
|
8
4
|
return null;
|
|
@@ -18,6 +14,70 @@ function arithmeticStep(values) {
|
|
|
18
14
|
}
|
|
19
15
|
return { start: values[0], interval, last: values[values.length - 1] };
|
|
20
16
|
}
|
|
17
|
+
function segmentsOf(schedule, field) {
|
|
18
|
+
return schedule.analyses.segments[field] ?? [];
|
|
19
|
+
}
|
|
20
|
+
function stepSegment(schedule, field) {
|
|
21
|
+
return segmentsOf(schedule, field)[0];
|
|
22
|
+
}
|
|
23
|
+
function singleValues(segments) {
|
|
24
|
+
const values = [];
|
|
25
|
+
for (const segment of segments) {
|
|
26
|
+
if (segment.kind !== "single") {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
values.push(+segment.value);
|
|
30
|
+
}
|
|
31
|
+
return values;
|
|
32
|
+
}
|
|
33
|
+
function offsetCleanStride(stride) {
|
|
34
|
+
return stride.start < stride.interval && 24 % stride.interval === 0;
|
|
35
|
+
}
|
|
36
|
+
function renderStride(spec, parts) {
|
|
37
|
+
const { start, interval, cycle } = spec;
|
|
38
|
+
const tiles = cycle % interval === 0;
|
|
39
|
+
if (start === 0 && tiles) {
|
|
40
|
+
return parts.bare();
|
|
41
|
+
}
|
|
42
|
+
if (start < interval && tiles) {
|
|
43
|
+
return parts.offset();
|
|
44
|
+
}
|
|
45
|
+
return parts.bounded();
|
|
46
|
+
}
|
|
47
|
+
function hourListStride(values) {
|
|
48
|
+
if (values.length < 2) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const interval = values[1] - values[0];
|
|
52
|
+
if (interval < 2) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
for (let i = 2; i < values.length; i += 1) {
|
|
56
|
+
if (values[i] - values[i - 1] !== interval) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (values[0] !== 0 && values.length < 5) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return { interval, last: values[values.length - 1], start: values[0] };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src/core/util.ts
|
|
67
|
+
function isNonNegativeInteger(value) {
|
|
68
|
+
const digits = /^\d+$/;
|
|
69
|
+
return digits.test(value);
|
|
70
|
+
}
|
|
71
|
+
function toFieldNumber(token, numberMap) {
|
|
72
|
+
return isNonNegativeInteger(token) ? +token : numberMap[token.toUpperCase()];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/core/shapes.ts
|
|
76
|
+
function isOpenStep(field) {
|
|
77
|
+
return field.indexOf("/") !== -1 && field.indexOf("-") === -1 && field.indexOf(",") === -1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// src/core/weekday.ts
|
|
21
81
|
function weekdayDisplayKey(value) {
|
|
22
82
|
return value === 0 ? 7 : value;
|
|
23
83
|
}
|
|
@@ -38,9 +98,6 @@ function orderWeekdaysForDisplay(segments) {
|
|
|
38
98
|
return pair[0];
|
|
39
99
|
});
|
|
40
100
|
}
|
|
41
|
-
function toFieldNumber(token, numberMap) {
|
|
42
|
-
return isNonNegativeInteger(token) ? +token : numberMap[token.toUpperCase()];
|
|
43
|
-
}
|
|
44
101
|
|
|
45
102
|
// src/core/specs.ts
|
|
46
103
|
var weekdayNumbers = {
|
|
@@ -88,38 +145,22 @@ function joinAnd(items) {
|
|
|
88
145
|
}
|
|
89
146
|
return items.slice(0, -1).join("\u3001") + "\u548C" + items[items.length - 1];
|
|
90
147
|
}
|
|
91
|
-
function fieldSegments(ir, field) {
|
|
92
|
-
return ir.analyses.segments[field] || [];
|
|
93
|
-
}
|
|
94
|
-
function stepSegment(ir, field) {
|
|
95
|
-
return fieldSegments(ir, field)[0];
|
|
96
|
-
}
|
|
97
148
|
function cadence(interval, unit) {
|
|
98
149
|
return interval === 1 ? "\u6BCF" + unit : "\u6BCF" + interval + unit;
|
|
99
150
|
}
|
|
100
|
-
function
|
|
151
|
+
function renderStride2(stride) {
|
|
101
152
|
const { interval, start, last, cycle, unit, mark, anchor } = stride;
|
|
102
|
-
const tiles = cycle % interval === 0;
|
|
103
|
-
if (start === 0 && tiles) {
|
|
104
|
-
return cadence(interval, unit);
|
|
105
|
-
}
|
|
106
153
|
const lead = anchor + "\u4ECE" + start + mark + "\u8D77" + cadence(interval, unit);
|
|
107
|
-
return start
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (segment.kind !== "single") {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
values.push(+segment.value);
|
|
116
|
-
}
|
|
117
|
-
return values;
|
|
154
|
+
return renderStride({ start, interval, cycle }, {
|
|
155
|
+
bare: () => cadence(interval, unit),
|
|
156
|
+
offset: () => lead,
|
|
157
|
+
bounded: () => lead + "\uFF0C\u81F3" + last + mark
|
|
158
|
+
});
|
|
118
159
|
}
|
|
119
160
|
function strideFromSegments(segments, unit, mark, anchor) {
|
|
120
161
|
const values = singleValues(segments);
|
|
121
162
|
const step = values && arithmeticStep(values);
|
|
122
|
-
return step ?
|
|
163
|
+
return step ? renderStride2({ ...step, cycle: 60, unit, mark, anchor }) : null;
|
|
123
164
|
}
|
|
124
165
|
function stepClause(segment, unit, mark, anchor) {
|
|
125
166
|
const start = segment.startToken === "*" ? 0 : +segment.startToken;
|
|
@@ -127,7 +168,7 @@ function stepClause(segment, unit, mark, anchor) {
|
|
|
127
168
|
if (segment.startToken.indexOf("-") !== -1 || short) {
|
|
128
169
|
return anchor + segment.fires.join("\u3001") + mark;
|
|
129
170
|
}
|
|
130
|
-
return
|
|
171
|
+
return renderStride2({
|
|
131
172
|
interval: segment.interval,
|
|
132
173
|
start,
|
|
133
174
|
last: segment.fires[segment.fires.length - 1],
|
|
@@ -177,9 +218,9 @@ function hourWord(hour) {
|
|
|
177
218
|
}
|
|
178
219
|
return hour === 12 ? "\u6B63\u5348" : hour + "\u70B9";
|
|
179
220
|
}
|
|
180
|
-
function hourFires(
|
|
221
|
+
function hourFires(schedule) {
|
|
181
222
|
const fires = [];
|
|
182
|
-
|
|
223
|
+
segmentsOf(schedule, "hour").forEach(function expand(segment) {
|
|
183
224
|
if (segment.kind === "step") {
|
|
184
225
|
fires.push(...segment.fires);
|
|
185
226
|
} else if (segment.kind === "range") {
|
|
@@ -233,15 +274,15 @@ function renderEveryMinute() {
|
|
|
233
274
|
function renderEveryHour() {
|
|
234
275
|
return "\u6BCF\u5C0F\u65F6";
|
|
235
276
|
}
|
|
236
|
-
function minuteHourClause(
|
|
237
|
-
const segments =
|
|
238
|
-
if (
|
|
239
|
-
return stepClause(stepSegment(
|
|
277
|
+
function minuteHourClause(schedule) {
|
|
278
|
+
const segments = segmentsOf(schedule, "minute");
|
|
279
|
+
if (schedule.shapes.minute === "step") {
|
|
280
|
+
return stepClause(stepSegment(schedule, "minute"), "\u5206\u949F", "\u5206", "\u6BCF\u5C0F\u65F6");
|
|
240
281
|
}
|
|
241
282
|
return strideFromSegments(segments, "\u5206\u949F", "\u5206", "\u6BCF\u5C0F\u65F6") ?? "\u6BCF\u5C0F\u65F6" + valueList(segments, "\u5206");
|
|
242
283
|
}
|
|
243
|
-
function renderMinutePast(
|
|
244
|
-
return minuteHourClause(
|
|
284
|
+
function renderMinutePast(schedule) {
|
|
285
|
+
return minuteHourClause(schedule);
|
|
245
286
|
}
|
|
246
287
|
function hourSegmentWords(segment) {
|
|
247
288
|
if (segment.kind === "range") {
|
|
@@ -252,62 +293,62 @@ function hourSegmentWords(segment) {
|
|
|
252
293
|
}
|
|
253
294
|
return [hourWord(+segment.value)];
|
|
254
295
|
}
|
|
255
|
-
function hourList(
|
|
256
|
-
const words =
|
|
296
|
+
function hourList(schedule) {
|
|
297
|
+
const words = segmentsOf(schedule, "hour").flatMap(hourSegmentWords);
|
|
257
298
|
return joinAnd(words);
|
|
258
299
|
}
|
|
259
|
-
function hourFrame(
|
|
260
|
-
if (
|
|
261
|
-
const [from, to] =
|
|
300
|
+
function hourFrame(schedule) {
|
|
301
|
+
if (schedule.shapes.hour === "range") {
|
|
302
|
+
const [from, to] = segmentsOf(schedule, "hour")[0].bounds;
|
|
262
303
|
return "\u5728" + hourWord(+from) + "\u81F3" + hourWord(+to) + "\u4E4B\u95F4\uFF0C";
|
|
263
304
|
}
|
|
264
|
-
return "\u5728" + hourList(
|
|
305
|
+
return "\u5728" + hourList(schedule) + "\uFF0C";
|
|
265
306
|
}
|
|
266
|
-
function renderMinuteFrequency(
|
|
267
|
-
const minuteStep = stepSegment(
|
|
307
|
+
function renderMinuteFrequency(schedule, plan) {
|
|
308
|
+
const minuteStep = stepSegment(schedule, "minute");
|
|
268
309
|
const base = stepClause(minuteStep, UNITS.minute, "\u5206", "\u6BCF\u5C0F\u65F6");
|
|
269
310
|
const { hours } = plan;
|
|
270
311
|
if (hours.kind === "step" || hours.kind === "during") {
|
|
271
|
-
const hourCad =
|
|
312
|
+
const hourCad = unevenHourCadence(schedule);
|
|
272
313
|
if (hourCad !== null) {
|
|
273
314
|
return hourCad + (hourCad.indexOf("\u81F3") === -1 ? "" : "\uFF0C") + base;
|
|
274
315
|
}
|
|
275
316
|
}
|
|
276
|
-
if (hours.kind === "
|
|
317
|
+
if (hours.kind === "window" && hours.from === hours.to) {
|
|
277
318
|
return "\u5728" + hourWord(hours.from) + "\u81F3" + hours.from + "\u70B9" + hours.last + "\u5206\u4E4B\u95F4\uFF0C" + base;
|
|
278
319
|
}
|
|
279
320
|
if (hours.kind === "window") {
|
|
280
321
|
return "\u5728" + hourWord(hours.from) + "\u81F3" + hourWord(hours.to) + "\u4E4B\u95F4\uFF0C" + base;
|
|
281
322
|
}
|
|
282
323
|
if (hours.kind === "during") {
|
|
283
|
-
return "\u5728" + hourList(
|
|
324
|
+
return "\u5728" + hourList(schedule) + "\uFF0C" + base;
|
|
284
325
|
}
|
|
285
326
|
return base;
|
|
286
327
|
}
|
|
287
|
-
function renderMinuteSpanInHour(
|
|
328
|
+
function renderMinuteSpanInHour(schedule, plan) {
|
|
288
329
|
const span = plan;
|
|
289
|
-
if (
|
|
330
|
+
if (schedule.pattern.minute === "*") {
|
|
290
331
|
return hourWord(span.hour) + "\u7684\u6BCF\u4E00\u5206\u949F";
|
|
291
332
|
}
|
|
292
333
|
return "\u5728" + hourWord(span.hour) + "\u81F3" + span.hour + "\u70B9" + span.span[1] + "\u5206\u4E4B\u95F4\uFF0C\u6BCF\u5206\u949F";
|
|
293
334
|
}
|
|
294
|
-
function renderMinutesAcrossHours(
|
|
335
|
+
function renderMinutesAcrossHours(schedule, plan) {
|
|
295
336
|
const { form } = plan;
|
|
296
|
-
const hourCad =
|
|
337
|
+
const hourCad = unevenHourCadence(schedule);
|
|
297
338
|
if (form === "wildcard") {
|
|
298
|
-
return hourCad === null ? "\u5728" + hourList(
|
|
339
|
+
return hourCad === null ? "\u5728" + hourList(schedule) + "\uFF0C\u6BCF\u5206\u949F" : hourCad + "\uFF0C\u6BCF\u5206\u949F";
|
|
299
340
|
}
|
|
300
|
-
return (hourCad ?? hourList(
|
|
341
|
+
return (hourCad ?? hourList(schedule)) + "\uFF0C" + minuteHourClause(schedule) + "\uFF0C\u6BCF\u5206\u949F";
|
|
301
342
|
}
|
|
302
|
-
function renderMinuteSpanAcrossHourStep(
|
|
303
|
-
const hourStep = stepSegment(
|
|
343
|
+
function renderMinuteSpanAcrossHourStep(schedule, plan) {
|
|
344
|
+
const hourStep = stepSegment(schedule, "hour");
|
|
304
345
|
const { form } = plan;
|
|
305
346
|
if (form === "list") {
|
|
306
|
-
return hourCadencePhrase(
|
|
347
|
+
return hourCadencePhrase(schedule) + "\uFF0C" + renderMinutePast(schedule);
|
|
307
348
|
}
|
|
308
|
-
const minuteTail = form === "wildcard" ? "\u6BCF\u5206\u949F" : minuteHourClause(
|
|
349
|
+
const minuteTail = form === "wildcard" ? "\u6BCF\u5206\u949F" : minuteHourClause(schedule) + "\uFF0C\u6BCF\u5206\u949F";
|
|
309
350
|
if (hourStep.startToken !== "*") {
|
|
310
|
-
return hourCadencePhrase(
|
|
351
|
+
return hourCadencePhrase(schedule) + "\uFF0C" + minuteTail;
|
|
311
352
|
}
|
|
312
353
|
if (hourStep.interval === 2 && form === "wildcard") {
|
|
313
354
|
return "\u5728\u5076\u6570\u5C0F\u65F6\uFF0C" + minuteTail;
|
|
@@ -315,62 +356,62 @@ function renderMinuteSpanAcrossHourStep(ir, plan) {
|
|
|
315
356
|
const cad = cadence(hourStep.interval, UNITS.hour);
|
|
316
357
|
return form === "wildcard" ? cad + "\u5185\uFF0C" + minuteTail : cad + "\uFF0C" + minuteTail;
|
|
317
358
|
}
|
|
318
|
-
function renderClockTimes(
|
|
319
|
-
const cad = hourCadenceText(
|
|
359
|
+
function renderClockTimes(schedule, plan, opts) {
|
|
360
|
+
const cad = hourCadenceText(schedule);
|
|
320
361
|
if (cad !== null) {
|
|
321
362
|
return cad;
|
|
322
363
|
}
|
|
323
364
|
const { times } = plan;
|
|
324
365
|
return joinAnd(times.map((t) => clockTime(t.hour, t.minute, t.second, opts)));
|
|
325
366
|
}
|
|
326
|
-
function renderCompactClockTimes(
|
|
327
|
-
const cad = hourCadenceText(
|
|
367
|
+
function renderCompactClockTimes(schedule, plan) {
|
|
368
|
+
const cad = hourCadenceText(schedule);
|
|
328
369
|
if (cad !== null) {
|
|
329
370
|
return cad;
|
|
330
371
|
}
|
|
331
372
|
const compact = plan;
|
|
332
|
-
const secs =
|
|
333
|
-
const tail = secs.length &&
|
|
373
|
+
const secs = segmentsOf(schedule, "second");
|
|
374
|
+
const tail = secs.length && schedule.pattern.second !== "0" ? "\uFF0C\u7B2C" + valueText(secs) + "\u79D2" : "";
|
|
334
375
|
if (!compact.fold) {
|
|
335
|
-
const hourCad =
|
|
336
|
-
return hourCad === null ? minuteHourClause(
|
|
376
|
+
const hourCad = unevenHourCadence(schedule);
|
|
377
|
+
return hourCad === null ? minuteHourClause(schedule) + "\uFF0C\u5728" + hourList(schedule) + tail : hourCad + "\uFF0C" + minuteHourClause(schedule) + tail;
|
|
337
378
|
}
|
|
338
379
|
if (compact.minute > 0) {
|
|
339
|
-
return minuteHourClause(
|
|
380
|
+
return minuteHourClause(schedule) + "\uFF0C\u5728" + hourList(schedule) + tail;
|
|
340
381
|
}
|
|
341
|
-
return hourList(
|
|
382
|
+
return hourList(schedule) + tail;
|
|
342
383
|
}
|
|
343
|
-
function renderHourRange(
|
|
384
|
+
function renderHourRange(schedule, plan) {
|
|
344
385
|
const range = plan;
|
|
345
386
|
if (range.minuteForm === "lead") {
|
|
346
|
-
const minuteSegs =
|
|
347
|
-
const past = minuteSegs.length &&
|
|
387
|
+
const minuteSegs = segmentsOf(schedule, "minute");
|
|
388
|
+
const past = minuteSegs.length && schedule.pattern.minute !== "0" ? minuteHourClause(schedule) : "\u6BCF\u5C0F\u65F6";
|
|
348
389
|
return "\u5728" + hourWord(range.from) + "\u81F3" + hourWord(range.to) + "\u4E4B\u95F4\uFF0C" + past;
|
|
349
390
|
}
|
|
350
391
|
if (range.minuteForm === "range") {
|
|
351
|
-
return "\u5728" + hourWord(range.from) + "\u81F3" + hourWord(range.to) + "\u4E4B\u95F4\uFF0C\u6BCF\u5C0F\u65F6" + valueList(
|
|
392
|
+
return "\u5728" + hourWord(range.from) + "\u81F3" + hourWord(range.to) + "\u4E4B\u95F4\uFF0C\u6BCF\u5C0F\u65F6" + valueList(segmentsOf(schedule, "minute"), "\u5206") + "\uFF0C\u6BCF\u5206\u949F";
|
|
352
393
|
}
|
|
353
394
|
return "\u5728" + hourWord(range.from) + "\u81F3" + range.to + "\u70B9" + range.last + "\u5206\u4E4B\u95F4\uFF0C\u6BCF\u5206\u949F";
|
|
354
395
|
}
|
|
355
|
-
function renderHourStep(
|
|
356
|
-
const segment = stepSegment(
|
|
396
|
+
function renderHourStep(schedule) {
|
|
397
|
+
const segment = stepSegment(schedule, "hour");
|
|
357
398
|
if (segment.fires.length <= 2) {
|
|
358
399
|
return joinAnd(segment.fires.map(hourWord));
|
|
359
400
|
}
|
|
360
|
-
return hourCadencePhrase(
|
|
401
|
+
return hourCadencePhrase(schedule);
|
|
361
402
|
}
|
|
362
|
-
function hourStride(
|
|
363
|
-
const segments =
|
|
403
|
+
function hourStride(schedule) {
|
|
404
|
+
const segments = segmentsOf(schedule, "hour");
|
|
364
405
|
if (segments.length === 1 && segments[0].kind === "step") {
|
|
365
406
|
const { fires, interval } = segments[0];
|
|
366
407
|
return { interval, start: fires[0], last: fires[fires.length - 1] };
|
|
367
408
|
}
|
|
368
409
|
const values = singleValues(segments);
|
|
369
|
-
return values &&
|
|
410
|
+
return values && hourListStride(values);
|
|
370
411
|
}
|
|
371
|
-
function hourCadencePhrase(
|
|
372
|
-
const stride = hourStride(
|
|
373
|
-
return stride &&
|
|
412
|
+
function hourCadencePhrase(schedule) {
|
|
413
|
+
const stride = hourStride(schedule);
|
|
414
|
+
return stride && renderStride2({
|
|
374
415
|
...stride,
|
|
375
416
|
cycle: 24,
|
|
376
417
|
unit: UNITS.hour,
|
|
@@ -378,76 +419,90 @@ function hourCadencePhrase(ir) {
|
|
|
378
419
|
anchor: ""
|
|
379
420
|
});
|
|
380
421
|
}
|
|
381
|
-
function
|
|
422
|
+
function unevenHourCadence(schedule) {
|
|
423
|
+
const stride = hourStride(schedule);
|
|
424
|
+
if (!stride) {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
if (schedule.shapes.hour !== "step" && offsetCleanStride(stride)) {
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
return hourCadencePhrase(schedule);
|
|
431
|
+
}
|
|
432
|
+
function shortCleanHourStride(stride) {
|
|
433
|
+
const fires = (stride.last - stride.start) / stride.interval + 1;
|
|
434
|
+
return fires <= maxClockTimes && offsetCleanStride(stride);
|
|
435
|
+
}
|
|
436
|
+
function minuteZeroConfinement(schedule, stride, prefix) {
|
|
382
437
|
if (stride.interval === 2 && stride.start === 0) {
|
|
383
|
-
return "\u5728\u5076\u6570\u5C0F\u65F60\u5206" + secondTail(
|
|
438
|
+
return "\u5728\u5076\u6570\u5C0F\u65F60\u5206" + secondTail(schedule);
|
|
384
439
|
}
|
|
385
440
|
if (prefix.indexOf("\u4ECE") !== -1) {
|
|
386
|
-
return prefix + "0\u5206" + secondTail(
|
|
441
|
+
return prefix + "0\u5206" + secondTail(schedule);
|
|
387
442
|
}
|
|
388
443
|
return null;
|
|
389
444
|
}
|
|
390
|
-
function hourCadence(
|
|
391
|
-
const stride = hourStride(
|
|
445
|
+
function hourCadence(schedule) {
|
|
446
|
+
const stride = hourStride(schedule);
|
|
392
447
|
if (!stride) {
|
|
393
448
|
return null;
|
|
394
449
|
}
|
|
395
|
-
|
|
396
|
-
if (ir.pattern.second === "0" && fires <= maxClockTimes) {
|
|
450
|
+
if (schedule.pattern.second === "0" && shortCleanHourStride(stride)) {
|
|
397
451
|
return null;
|
|
398
452
|
}
|
|
399
|
-
const prefix = hourCadencePhrase(
|
|
453
|
+
const prefix = hourCadencePhrase(schedule);
|
|
400
454
|
if (prefix.indexOf("\u81F3") !== -1) {
|
|
401
455
|
return null;
|
|
402
456
|
}
|
|
403
|
-
const minute = +
|
|
404
|
-
const subMinute =
|
|
457
|
+
const minute = +schedule.pattern.minute;
|
|
458
|
+
const subMinute = schedule.pattern.second === "*" || schedule.shapes.second === "step";
|
|
405
459
|
if (minute === 0 && subMinute) {
|
|
406
|
-
return minuteZeroConfinement(
|
|
460
|
+
return minuteZeroConfinement(schedule, stride, prefix);
|
|
407
461
|
}
|
|
408
462
|
if (minute === 0) {
|
|
409
|
-
return prefix + "0\u5206" + secondTail(
|
|
463
|
+
return prefix + "0\u5206" + secondTail(schedule);
|
|
410
464
|
}
|
|
411
|
-
return
|
|
465
|
+
return schedule.pattern.second === "0" ? prefix + minute + "\u5206" : prefix + minute + "\u5206" + secondTail(schedule);
|
|
412
466
|
}
|
|
413
|
-
function hourCadenceText(
|
|
414
|
-
if (
|
|
467
|
+
function hourCadenceText(schedule) {
|
|
468
|
+
if (schedule.shapes.minute !== "single") {
|
|
415
469
|
return null;
|
|
416
470
|
}
|
|
417
|
-
if (+
|
|
418
|
-
|
|
471
|
+
if (+schedule.pattern.minute === 0 && schedule.pattern.second === "0") {
|
|
472
|
+
const stride = hourStride(schedule);
|
|
473
|
+
return stride && !shortCleanHourStride(stride) ? hourCadencePhrase(schedule) : null;
|
|
419
474
|
}
|
|
420
|
-
return hourCadence(
|
|
475
|
+
return hourCadence(schedule);
|
|
421
476
|
}
|
|
422
|
-
function secondTail(
|
|
423
|
-
const sec = secondClause(
|
|
477
|
+
function secondTail(schedule) {
|
|
478
|
+
const sec = secondClause(schedule);
|
|
424
479
|
return sec === "\u6BCF\u79D2" ? "\u7684\u6BCF\u4E00\u79D2" : "\u7684" + sec;
|
|
425
480
|
}
|
|
426
|
-
function renderRangeOfMinutes(
|
|
427
|
-
return minuteHourClause(
|
|
481
|
+
function renderRangeOfMinutes(schedule) {
|
|
482
|
+
return minuteHourClause(schedule) + "\uFF0C\u6BCF\u5206\u949F";
|
|
428
483
|
}
|
|
429
|
-
function renderStandaloneSeconds(
|
|
430
|
-
const segs =
|
|
484
|
+
function renderStandaloneSeconds(schedule) {
|
|
485
|
+
const segs = segmentsOf(schedule, "second");
|
|
431
486
|
const first = segs[0];
|
|
432
487
|
if (segs.length === 1 && first.kind === "step" && first.startToken === "*") {
|
|
433
488
|
return cadence(first.interval, UNITS.second);
|
|
434
489
|
}
|
|
435
490
|
return strideFromSegments(segs, "\u79D2", "\u79D2", "\u6BCF\u5206\u949F") ?? "\u6BCF\u5206\u949F\u7B2C" + valueText(segs) + "\u79D2";
|
|
436
491
|
}
|
|
437
|
-
function renderSecondPastMinute(
|
|
438
|
-
return "\u6BCF\u5206\u949F\u7B2C" + valueText(
|
|
492
|
+
function renderSecondPastMinute(schedule) {
|
|
493
|
+
return "\u6BCF\u5206\u949F\u7B2C" + valueText(segmentsOf(schedule, "second")) + "\u79D2";
|
|
439
494
|
}
|
|
440
|
-
function renderSecondsWithinMinute(
|
|
441
|
-
const base = "\u6BCF\u5C0F\u65F6" +
|
|
442
|
-
const segs =
|
|
495
|
+
function renderSecondsWithinMinute(schedule) {
|
|
496
|
+
const base = "\u6BCF\u5C0F\u65F6" + schedule.pattern.minute + "\u5206";
|
|
497
|
+
const segs = segmentsOf(schedule, "second");
|
|
443
498
|
const first = segs[0];
|
|
444
499
|
if (segs.length === 1 && first.kind === "step" && first.startToken === "*") {
|
|
445
500
|
return base + "\uFF0C" + cadence(first.interval, UNITS.second);
|
|
446
501
|
}
|
|
447
502
|
return base + "\u7B2C" + valueText(segs) + "\u79D2";
|
|
448
503
|
}
|
|
449
|
-
function secondClause(
|
|
450
|
-
const segs =
|
|
504
|
+
function secondClause(schedule) {
|
|
505
|
+
const segs = segmentsOf(schedule, "second");
|
|
451
506
|
if (!segs.length) {
|
|
452
507
|
return "\u6BCF\u79D2";
|
|
453
508
|
}
|
|
@@ -457,34 +512,34 @@ function secondClause(ir) {
|
|
|
457
512
|
}
|
|
458
513
|
return strideFromSegments(segs, "\u79D2", "\u79D2", "\u6BCF\u5206\u949F") ?? "\u7B2C" + valueText(segs) + "\u79D2";
|
|
459
514
|
}
|
|
460
|
-
function minuteClause(
|
|
461
|
-
if (
|
|
515
|
+
function minuteClause(schedule) {
|
|
516
|
+
if (schedule.pattern.minute === "*") {
|
|
462
517
|
return "\u6BCF\u5206\u949F";
|
|
463
518
|
}
|
|
464
|
-
if (
|
|
465
|
-
return cadence(stepSegment(
|
|
519
|
+
if (schedule.shapes.minute === "step") {
|
|
520
|
+
return cadence(stepSegment(schedule, "minute").interval, UNITS.minute);
|
|
466
521
|
}
|
|
467
|
-
return valueList(
|
|
522
|
+
return valueList(segmentsOf(schedule, "minute"), "\u5206");
|
|
468
523
|
}
|
|
469
524
|
function clockRestCarriesSecond(rest) {
|
|
470
525
|
return rest.kind === "clockTimes" && rest.times.some((time) => Boolean(time.second));
|
|
471
526
|
}
|
|
472
|
-
function composeSecondsOnHour(
|
|
473
|
-
const sec = secondClause(
|
|
527
|
+
function composeSecondsOnHour(schedule, plan, opts) {
|
|
528
|
+
const sec = secondClause(schedule);
|
|
474
529
|
const { rest } = plan;
|
|
475
530
|
const composedClock = rest.kind === "clockTimes" || rest.kind === "compactClockTimes";
|
|
476
531
|
if (composedClock) {
|
|
477
|
-
const hourCad = hourCadence(
|
|
532
|
+
const hourCad = hourCadence(schedule);
|
|
478
533
|
if (hourCad !== null) {
|
|
479
534
|
return hourCad;
|
|
480
535
|
}
|
|
481
536
|
}
|
|
482
|
-
if (composedClock &&
|
|
483
|
-
return composeMinuteZeroClocks(
|
|
537
|
+
if (composedClock && schedule.pattern.minute === "0") {
|
|
538
|
+
return composeMinuteZeroClocks(schedule, sec);
|
|
484
539
|
}
|
|
485
|
-
const restText = render(
|
|
540
|
+
const restText = render(schedule, rest, opts);
|
|
486
541
|
const secTail = clockRestCarriesSecond(rest) ? "" : sec;
|
|
487
|
-
if (composedClock && isDaily(
|
|
542
|
+
if (composedClock && isDaily(schedule)) {
|
|
488
543
|
return "\u6BCF\u5929" + restText + secTail;
|
|
489
544
|
}
|
|
490
545
|
if (rest.kind === "singleMinute") {
|
|
@@ -492,79 +547,79 @@ function composeSecondsOnHour(ir, plan, opts) {
|
|
|
492
547
|
}
|
|
493
548
|
return restText + secTail;
|
|
494
549
|
}
|
|
495
|
-
function composeMinuteZeroClocks(
|
|
496
|
-
if (hasHourWindow(
|
|
497
|
-
return isDaily(
|
|
550
|
+
function composeMinuteZeroClocks(schedule, sec) {
|
|
551
|
+
if (hasHourWindow(schedule)) {
|
|
552
|
+
return isDaily(schedule) ? "\u6BCF\u5929" + hourRangeWindow(schedule, sec) : hourRangeWindow(schedule, sec);
|
|
498
553
|
}
|
|
499
|
-
const clocks = hourFires(
|
|
554
|
+
const clocks = hourFires(schedule).map(function clock(hour) {
|
|
500
555
|
return hour === 12 ? "\u6B63\u5348" : hourWord(hour) + "0\u5206";
|
|
501
556
|
});
|
|
502
|
-
const nested = strideFromSegments(
|
|
557
|
+
const nested = strideFromSegments(segmentsOf(schedule, "second"), "\u79D2", "\u79D2", "");
|
|
503
558
|
const tail = sec === "\u6BCF\u79D2" ? "\u7684\u6BCF\u4E00\u79D2" : "\u7684" + (nested ?? sec);
|
|
504
559
|
const core = joinAnd(clocks) + tail;
|
|
505
|
-
return isDaily(
|
|
560
|
+
return isDaily(schedule) ? "\u6BCF\u5929" + core : core;
|
|
506
561
|
}
|
|
507
|
-
function hasHourWindow(
|
|
508
|
-
return
|
|
562
|
+
function hasHourWindow(schedule) {
|
|
563
|
+
return segmentsOf(schedule, "hour").some(function range(segment) {
|
|
509
564
|
return segment.kind === "range";
|
|
510
565
|
});
|
|
511
566
|
}
|
|
512
|
-
function hourRangeWindow(
|
|
513
|
-
const span = hourList(
|
|
514
|
-
if (
|
|
567
|
+
function hourRangeWindow(schedule, sec) {
|
|
568
|
+
const span = hourList(schedule);
|
|
569
|
+
if (schedule.pattern.second === "*" || schedule.shapes.second === "step") {
|
|
515
570
|
return span + "0\u5206" + (sec === "\u6BCF\u79D2" ? "\u7684\u6BCF\u4E00\u79D2" : "\u7684" + sec);
|
|
516
571
|
}
|
|
517
572
|
return span + "\uFF0C" + sec;
|
|
518
573
|
}
|
|
519
|
-
function composeSecondsCadence(
|
|
520
|
-
const sec = secondClause(
|
|
521
|
-
const tail = minuteClause(
|
|
522
|
-
const hourCad =
|
|
574
|
+
function composeSecondsCadence(schedule) {
|
|
575
|
+
const sec = secondClause(schedule);
|
|
576
|
+
const tail = minuteClause(schedule) + sec;
|
|
577
|
+
const hourCad = unevenHourCadence(schedule);
|
|
523
578
|
if (hourCad !== null) {
|
|
524
579
|
return hourCad + (hourCad.indexOf("\u81F3") === -1 ? "\u7684" : "\uFF0C") + tail;
|
|
525
580
|
}
|
|
526
|
-
if (
|
|
527
|
-
return hourWord(hourFires(
|
|
581
|
+
if (schedule.shapes.hour === "single") {
|
|
582
|
+
return hourWord(hourFires(schedule)[0]) + "\u7684" + tail;
|
|
528
583
|
}
|
|
529
|
-
if (
|
|
530
|
-
if (
|
|
531
|
-
const minuteStep = stepSegment(
|
|
584
|
+
if (schedule.shapes.hour === "wildcard") {
|
|
585
|
+
if (schedule.shapes.minute === "step" && sec === "\u6BCF\u79D2") {
|
|
586
|
+
const minuteStep = stepSegment(schedule, "minute");
|
|
532
587
|
if (minuteStep.startToken === "*" && minuteStep.interval === 2) {
|
|
533
588
|
return "\u6BCF\u5076\u6570\u5206\u949F\u7684\u6BCF\u4E00\u79D2";
|
|
534
589
|
}
|
|
535
590
|
}
|
|
536
|
-
return sec + "\uFF0C" + minuteClause(
|
|
591
|
+
return sec + "\uFF0C" + minuteClause(schedule);
|
|
537
592
|
}
|
|
538
|
-
return hourFrame(
|
|
593
|
+
return hourFrame(schedule) + tail;
|
|
539
594
|
}
|
|
540
|
-
function composeSecondsListed(
|
|
541
|
-
const sec = secondClause(
|
|
542
|
-
const minutes = minuteHourClause(
|
|
543
|
-
if (
|
|
544
|
-
const minuteSegs =
|
|
595
|
+
function composeSecondsListed(schedule) {
|
|
596
|
+
const sec = secondClause(schedule);
|
|
597
|
+
const minutes = minuteHourClause(schedule);
|
|
598
|
+
if (schedule.shapes.hour === "single" && sec === "\u6BCF\u79D2") {
|
|
599
|
+
const minuteSegs = segmentsOf(schedule, "minute");
|
|
545
600
|
const minuteCad = strideFromSegments(minuteSegs, "\u5206\u949F", "\u5206", "") ?? valueList(minuteSegs, "\u5206");
|
|
546
|
-
return hourWord(hourFires(
|
|
601
|
+
return hourWord(hourFires(schedule)[0]) + minuteCad + "\u7684\u6BCF\u4E00\u79D2";
|
|
547
602
|
}
|
|
548
|
-
if (
|
|
603
|
+
if (schedule.shapes.hour === "wildcard") {
|
|
549
604
|
return minutes + "\uFF0C" + sec;
|
|
550
605
|
}
|
|
551
|
-
const hourCad =
|
|
606
|
+
const hourCad = unevenHourCadence(schedule);
|
|
552
607
|
if (hourCad !== null) {
|
|
553
608
|
return hourCad + "\uFF0C" + minutes + "\uFF0C" + sec;
|
|
554
609
|
}
|
|
555
|
-
return hourFrame(
|
|
610
|
+
return hourFrame(schedule) + minutes + "\uFF0C" + sec;
|
|
556
611
|
}
|
|
557
|
-
function renderComposeSeconds(
|
|
612
|
+
function renderComposeSeconds(schedule, plan, opts) {
|
|
558
613
|
const { rest } = plan;
|
|
559
614
|
const composedClock = rest.kind === "clockTimes" || rest.kind === "compactClockTimes";
|
|
560
|
-
if (
|
|
561
|
-
return composeSecondsOnHour(
|
|
615
|
+
if (schedule.pattern.minute === "0" || composedClock && schedule.shapes.minute === "single") {
|
|
616
|
+
return composeSecondsOnHour(schedule, plan, opts);
|
|
562
617
|
}
|
|
563
|
-
const minuteCadence =
|
|
618
|
+
const minuteCadence = schedule.pattern.minute === "*" || schedule.shapes.minute === "step" && stepSegment(schedule, "minute").startToken === "*";
|
|
564
619
|
if (minuteCadence) {
|
|
565
|
-
return composeSecondsCadence(
|
|
620
|
+
return composeSecondsCadence(schedule);
|
|
566
621
|
}
|
|
567
|
-
return composeSecondsListed(
|
|
622
|
+
return composeSecondsListed(schedule);
|
|
568
623
|
}
|
|
569
624
|
var renderers = {
|
|
570
625
|
clockTimes: renderClockTimes,
|
|
@@ -586,18 +641,18 @@ var renderers = {
|
|
|
586
641
|
singleMinute: renderMinutePast,
|
|
587
642
|
standaloneSeconds: renderStandaloneSeconds
|
|
588
643
|
};
|
|
589
|
-
function render(
|
|
644
|
+
function render(schedule, plan, opts) {
|
|
590
645
|
return renderers[plan.kind](
|
|
591
|
-
|
|
646
|
+
schedule,
|
|
592
647
|
plan,
|
|
593
648
|
opts
|
|
594
649
|
);
|
|
595
650
|
}
|
|
596
|
-
function monthPhrase(
|
|
597
|
-
if (
|
|
651
|
+
function monthPhrase(schedule) {
|
|
652
|
+
if (schedule.pattern.month === "*") {
|
|
598
653
|
return "";
|
|
599
654
|
}
|
|
600
|
-
const segs =
|
|
655
|
+
const segs = segmentsOf(schedule, "month");
|
|
601
656
|
const first = segs[0];
|
|
602
657
|
if (segs.length === 1 && first.kind === "step" && first.interval === 2) {
|
|
603
658
|
return "\u6BCF\u4E2A" + (first.fires[0] % 2 ? "\u5947" : "\u5076") + "\u6570\u6708";
|
|
@@ -615,8 +670,8 @@ function monthPhrase(ir) {
|
|
|
615
670
|
});
|
|
616
671
|
return nums.join("\u3001") + "\u6708";
|
|
617
672
|
}
|
|
618
|
-
function dayList(
|
|
619
|
-
const segs =
|
|
673
|
+
function dayList(schedule) {
|
|
674
|
+
const segs = segmentsOf(schedule, "date");
|
|
620
675
|
if (segs.every((seg) => seg.kind === "single")) {
|
|
621
676
|
return segs.map((seg) => seg.value).join("\u3001") + "\u65E5";
|
|
622
677
|
}
|
|
@@ -639,32 +694,46 @@ function quartzDate(token, monthPrefix) {
|
|
|
639
694
|
}
|
|
640
695
|
return monthPrefix + "\u6700\u63A5\u8FD1" + token.slice(0, -1) + "\u65E5\u7684\u5DE5\u4F5C\u65E5";
|
|
641
696
|
}
|
|
642
|
-
function
|
|
643
|
-
|
|
644
|
-
|
|
697
|
+
function oddEvenDay(dateField, monthLead) {
|
|
698
|
+
if (!isOpenStep(dateField)) {
|
|
699
|
+
return null;
|
|
700
|
+
}
|
|
701
|
+
const [start, step] = dateField.split("/");
|
|
702
|
+
if (+step !== 2) {
|
|
703
|
+
return null;
|
|
704
|
+
}
|
|
705
|
+
const lead = monthLead ? "\u6BCF\u6708" : "";
|
|
706
|
+
if (start === "*" || start === "1") {
|
|
707
|
+
return lead + "\u5355\u6570\u65E5";
|
|
708
|
+
}
|
|
709
|
+
return start === "2" ? lead + "\u53CC\u6570\u65E5" : null;
|
|
710
|
+
}
|
|
711
|
+
function datePhrase(schedule) {
|
|
712
|
+
const month = monthPhrase(schedule);
|
|
713
|
+
const date = schedule.pattern.date;
|
|
645
714
|
if (date === "*" || date === "?") {
|
|
646
715
|
return month;
|
|
647
716
|
}
|
|
648
|
-
if (
|
|
717
|
+
if (schedule.shapes.date === "quartz") {
|
|
649
718
|
return quartzDate(date, month || "\u672C\u6708");
|
|
650
719
|
}
|
|
651
|
-
if (
|
|
652
|
-
return month + cadence(stepSegment(
|
|
720
|
+
if (schedule.shapes.date === "step") {
|
|
721
|
+
return month + cadence(stepSegment(schedule, "date").interval, "\u5929");
|
|
653
722
|
}
|
|
654
723
|
if (!month) {
|
|
655
|
-
return "\u6BCF\u6708" + dayList(
|
|
724
|
+
return "\u6BCF\u6708" + dayList(schedule);
|
|
656
725
|
}
|
|
657
|
-
const monthMulti =
|
|
658
|
-
return month + (monthMulti ? "\uFF0C" : "") + dayList(
|
|
726
|
+
const monthMulti = schedule.shapes.month === "range" || schedule.shapes.month === "list";
|
|
727
|
+
return month + (monthMulti ? "\uFF0C" : "") + dayList(schedule);
|
|
659
728
|
}
|
|
660
|
-
function dateCore(
|
|
661
|
-
if (
|
|
662
|
-
return quartzDate(
|
|
729
|
+
function dateCore(schedule, quartzPrefix) {
|
|
730
|
+
if (schedule.shapes.date === "quartz") {
|
|
731
|
+
return quartzDate(schedule.pattern.date, quartzPrefix);
|
|
663
732
|
}
|
|
664
|
-
if (
|
|
665
|
-
return cadence(stepSegment(
|
|
733
|
+
if (schedule.shapes.date === "step") {
|
|
734
|
+
return cadence(stepSegment(schedule, "date").interval, "\u5929");
|
|
666
735
|
}
|
|
667
|
-
return dayList(
|
|
736
|
+
return dayList(schedule);
|
|
668
737
|
}
|
|
669
738
|
function weekdayName(token) {
|
|
670
739
|
const number = toFieldNumber(token, weekdayNumbers);
|
|
@@ -687,11 +756,11 @@ function quartzWeekday(token, monthPrefix) {
|
|
|
687
756
|
const [day, nth] = token.split("#");
|
|
688
757
|
return "\u7B2C" + nth + "\u4E2A" + weekdayName(day);
|
|
689
758
|
}
|
|
690
|
-
function weekdayPhrase(
|
|
691
|
-
if (
|
|
692
|
-
return quartzWeekday(
|
|
759
|
+
function weekdayPhrase(schedule, orContext, monthPrefix) {
|
|
760
|
+
if (schedule.shapes.weekday === "quartz") {
|
|
761
|
+
return quartzWeekday(schedule.pattern.weekday, monthPrefix);
|
|
693
762
|
}
|
|
694
|
-
const segs =
|
|
763
|
+
const segs = segmentsOf(schedule, "weekday");
|
|
695
764
|
if (segs.length === 1 && segs[0].kind === "range") {
|
|
696
765
|
const [from, to] = segs[0].bounds;
|
|
697
766
|
return "\u6BCF" + weekdayName(from) + "\u81F3" + weekdayName(to);
|
|
@@ -708,84 +777,87 @@ function weekdayPhrase(ir, orContext, monthPrefix) {
|
|
|
708
777
|
function isSet(token) {
|
|
709
778
|
return token !== "*" && token !== "?";
|
|
710
779
|
}
|
|
711
|
-
function qualifier(
|
|
712
|
-
const dateSet = isSet(
|
|
713
|
-
const weekdaySet = isSet(
|
|
780
|
+
function qualifier(schedule) {
|
|
781
|
+
const dateSet = isSet(schedule.pattern.date);
|
|
782
|
+
const weekdaySet = isSet(schedule.pattern.weekday);
|
|
714
783
|
if (dateSet && weekdaySet) {
|
|
715
|
-
const month = monthPhrase(
|
|
784
|
+
const month = monthPhrase(schedule);
|
|
716
785
|
if (month) {
|
|
717
|
-
|
|
786
|
+
const date2 = oddEvenDay(schedule.pattern.date, false) || dateCore(schedule, "");
|
|
787
|
+
return month + "\uFF0C" + date2 + "\u6216" + weekdayPhrase(schedule, true, "");
|
|
718
788
|
}
|
|
719
|
-
|
|
789
|
+
const date = oddEvenDay(schedule.pattern.date, true) || datePhrase(schedule);
|
|
790
|
+
return date + "\u6216" + weekdayPhrase(schedule, true, "\u672C\u6708");
|
|
720
791
|
}
|
|
721
792
|
if (dateSet) {
|
|
722
|
-
return datePhrase(
|
|
793
|
+
return datePhrase(schedule);
|
|
723
794
|
}
|
|
724
795
|
if (weekdaySet) {
|
|
725
|
-
const month = monthPhrase(
|
|
726
|
-
if (
|
|
727
|
-
return quartzWeekday(
|
|
796
|
+
const month = monthPhrase(schedule);
|
|
797
|
+
if (schedule.shapes.weekday === "quartz") {
|
|
798
|
+
return quartzWeekday(schedule.pattern.weekday, month || "\u672C\u6708");
|
|
728
799
|
}
|
|
729
|
-
return month + weekdayPhrase(
|
|
800
|
+
return month + weekdayPhrase(schedule, false, "\u672C\u6708");
|
|
730
801
|
}
|
|
731
|
-
return monthPhrase(
|
|
802
|
+
return monthPhrase(schedule);
|
|
732
803
|
}
|
|
733
|
-
function isDaily(
|
|
734
|
-
return !isSet(
|
|
804
|
+
function isDaily(schedule) {
|
|
805
|
+
return !isSet(schedule.pattern.date) && !isSet(schedule.pattern.weekday);
|
|
735
806
|
}
|
|
736
|
-
function composePoint(
|
|
737
|
-
const qual = qualifier(
|
|
738
|
-
if (isDaily(
|
|
807
|
+
function composePoint(schedule, core) {
|
|
808
|
+
const qual = qualifier(schedule);
|
|
809
|
+
if (isDaily(schedule)) {
|
|
739
810
|
return qual + "\u6BCF\u5929" + core;
|
|
740
811
|
}
|
|
741
|
-
const dateSet = isSet(
|
|
742
|
-
const weekdaySet = isSet(
|
|
743
|
-
const comma = dateSet && weekdaySet ||
|
|
812
|
+
const dateSet = isSet(schedule.pattern.date);
|
|
813
|
+
const weekdaySet = isSet(schedule.pattern.weekday);
|
|
814
|
+
const comma = dateSet && weekdaySet || schedule.shapes.date === "step";
|
|
744
815
|
return qual + (comma ? "\uFF0C" : "") + core;
|
|
745
816
|
}
|
|
746
|
-
function composeCadence(
|
|
747
|
-
const qual = qualifier(
|
|
817
|
+
function composeCadence(schedule, core) {
|
|
818
|
+
const qual = qualifier(schedule);
|
|
748
819
|
if (!qual) {
|
|
749
820
|
return core;
|
|
750
821
|
}
|
|
751
|
-
if (
|
|
752
|
-
const lead =
|
|
822
|
+
if (schedule.plan.kind === "minuteFrequency") {
|
|
823
|
+
const lead = schedule.plan.hours.kind !== "none";
|
|
753
824
|
return lead ? qual + "\uFF0C" + core : core + "\uFF0C" + qual;
|
|
754
825
|
}
|
|
755
|
-
if (
|
|
826
|
+
if (schedule.plan.kind === "compactClockTimes") {
|
|
756
827
|
return qual + "\uFF0C" + core;
|
|
757
828
|
}
|
|
758
|
-
const dateSet = isSet(
|
|
759
|
-
const weekdaySet = isSet(
|
|
760
|
-
const trail = dateSet && (
|
|
829
|
+
const dateSet = isSet(schedule.pattern.date);
|
|
830
|
+
const weekdaySet = isSet(schedule.pattern.weekday);
|
|
831
|
+
const trail = dateSet && (schedule.shapes.date !== "step" || weekdaySet);
|
|
761
832
|
return trail ? core + "\uFF0C" + qual : qual + "\uFF0C" + core;
|
|
762
833
|
}
|
|
763
|
-
function composeWindow(
|
|
764
|
-
|
|
834
|
+
function composeWindow(schedule, core) {
|
|
835
|
+
const union = isSet(schedule.pattern.date) && isSet(schedule.pattern.weekday);
|
|
836
|
+
return qualifier(schedule) + (union ? "\uFF0C" : "") + core;
|
|
765
837
|
}
|
|
766
|
-
function hourCadenceApplies(
|
|
767
|
-
return hourCadenceText(
|
|
838
|
+
function hourCadenceApplies(schedule) {
|
|
839
|
+
return hourCadenceText(schedule) !== null;
|
|
768
840
|
}
|
|
769
|
-
function describe(
|
|
770
|
-
const { kind } =
|
|
771
|
-
const core = render(
|
|
841
|
+
function describe(schedule, opts) {
|
|
842
|
+
const { kind } = schedule.plan;
|
|
843
|
+
const core = render(schedule, schedule.plan, opts);
|
|
772
844
|
let composed = core;
|
|
773
|
-
if (hourCadenceApplies(
|
|
774
|
-
composed = composeCadence(
|
|
775
|
-
} else if (kind === "clockTimes" || kind === "compactClockTimes" &&
|
|
776
|
-
composed = composePoint(
|
|
845
|
+
if (hourCadenceApplies(schedule)) {
|
|
846
|
+
composed = composeCadence(schedule, core);
|
|
847
|
+
} else if (kind === "clockTimes" || kind === "compactClockTimes" && schedule.pattern.minute === "0") {
|
|
848
|
+
composed = composePoint(schedule, core);
|
|
777
849
|
} else if (kind === "hourStep" || kind === "minuteFrequency" || kind === "minuteSpanAcrossHourStep" || kind === "compactClockTimes") {
|
|
778
|
-
composed = composeCadence(
|
|
850
|
+
composed = composeCadence(schedule, core);
|
|
779
851
|
} else if (kind === "hourRange") {
|
|
780
|
-
composed = composeWindow(
|
|
852
|
+
composed = composeWindow(schedule, core);
|
|
781
853
|
} else {
|
|
782
|
-
const qual = qualifier(
|
|
783
|
-
composed = qual ? composeCadence(
|
|
854
|
+
const qual = qualifier(schedule);
|
|
855
|
+
composed = qual ? composeCadence(schedule, core) : core;
|
|
784
856
|
}
|
|
785
|
-
if (
|
|
857
|
+
if (schedule.pattern.year === "*") {
|
|
786
858
|
return composed;
|
|
787
859
|
}
|
|
788
|
-
const year =
|
|
860
|
+
const year = segmentsOf(schedule, "year").map(function part(seg) {
|
|
789
861
|
if (seg.kind === "range") {
|
|
790
862
|
return seg.bounds[0] + "\u5E74\u81F3" + seg.bounds[1] + "\u5E74";
|
|
791
863
|
}
|