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