@@ -11,37 +11,156 @@ export function isMetaPressed(e: MouseEvent | KeyboardEvent): boolean {
11
11
return Platform . isMacOS ? e . metaKey : e . ctrlKey ;
12
12
}
13
13
14
+ function getDaysOfWeek ( ) : string [ ] {
15
+ const { moment } = window ;
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ let weekStart = ( moment . localeData ( ) as any ) . _week . dow ;
18
+ const daysOfWeek = [
19
+ "sunday" ,
20
+ "monday" ,
21
+ "tuesday" ,
22
+ "wednesday" ,
23
+ "thursday" ,
24
+ "friday" ,
25
+ "saturday" ,
26
+ ] ;
27
+
28
+ while ( weekStart ) {
29
+ daysOfWeek . push ( daysOfWeek . shift ( ) ! ) ;
30
+ weekStart -- ;
31
+ }
32
+ return daysOfWeek ;
33
+ }
34
+
35
+ export function getDayOfWeekNumericalValue ( dayOfWeekName : string ) : number {
36
+ return getDaysOfWeek ( ) . indexOf ( dayOfWeekName . toLowerCase ( ) ) ;
37
+ }
38
+
14
39
export function applyTemplateTransformations (
15
40
filename : string ,
41
+ granularity : Granularity ,
16
42
date : Moment ,
17
43
format : string ,
18
44
rawTemplateContents : string
19
45
) : string {
20
- return rawTemplateContents
46
+ let templateContents = rawTemplateContents ;
47
+
48
+ templateContents = rawTemplateContents
21
49
. replace ( / { { \s * d a t e \s * } } / gi, filename )
22
50
. replace ( / { { \s * t i m e \s * } } / gi, window . moment ( ) . format ( "HH:mm" ) )
23
- . replace ( / { { \s * t i t l e \s * } } / gi, filename )
24
- . replace (
25
- / { { \s * ( d a t e | t i m e ) \s * ( ( [ + - ] \d + ) ( [ y q m w d h s ] ) ) ? \s * ( : .+ ?) ? } } / gi,
51
+ . replace ( / { { \s * t i t l e \s * } } / gi, filename ) ;
52
+
53
+ if ( granularity === "day" ) {
54
+ templateContents = templateContents
55
+ . replace ( / { { \s * y e s t e r d a y \s * } } / gi, date . clone ( ) . subtract ( 1 , "day" ) . format ( format ) )
56
+ . replace ( / { { \s * t o m o r r o w \s * } } / gi, date . clone ( ) . add ( 1 , "d" ) . format ( format ) )
57
+ . replace (
58
+ / { { \s * ( d a t e | t i m e ) \s * ( ( [ + - ] \d + ) ( [ y q m w d h s ] ) ) ? \s * ( : .+ ?) ? } } / gi,
59
+ ( _ , _timeOrDate , calc , timeDelta , unit , momentFormat ) => {
60
+ const now = window . moment ( ) ;
61
+ const currentDate = date . clone ( ) . set ( {
62
+ hour : now . get ( "hour" ) ,
63
+ minute : now . get ( "minute" ) ,
64
+ second : now . get ( "second" ) ,
65
+ } ) ;
66
+ if ( calc ) {
67
+ currentDate . add ( parseInt ( timeDelta , 10 ) , unit ) ;
68
+ }
69
+
70
+ if ( momentFormat ) {
71
+ return currentDate . format ( momentFormat . substring ( 1 ) . trim ( ) ) ;
72
+ }
73
+ return currentDate . format ( format ) ;
74
+ }
75
+ ) ;
76
+ }
77
+
78
+ if ( granularity === "week" ) {
79
+ templateContents = templateContents . replace (
80
+ / { { \s * ( s u n d a y | m o n d a y | t u e s d a y | w e d n e s d a y | t h u r s d a y | f r i d a y | s a t u r d a y ) \s * : ( .* ?) } } / gi,
81
+ ( _ , dayOfWeek , momentFormat ) => {
82
+ const day = getDayOfWeekNumericalValue ( dayOfWeek ) ;
83
+ return date . weekday ( day ) . format ( momentFormat . trim ( ) ) ;
84
+ }
85
+ ) ;
86
+ }
87
+
88
+ if ( granularity === "month" ) {
89
+ templateContents = templateContents . replace (
90
+ / { { \s * ( m o n t h ) \s * ( ( [ + - ] \d + ) ( [ y q m w d h s ] ) ) ? \s * ( : .+ ?) ? } } / gi,
26
91
( _ , _timeOrDate , calc , timeDelta , unit , momentFormat ) => {
27
92
const now = window . moment ( ) ;
28
- const currentDate = date . clone ( ) . set ( {
29
- hour : now . get ( "hour" ) ,
30
- minute : now . get ( "minute" ) ,
31
- second : now . get ( "second" ) ,
32
- } ) ;
93
+ const monthStart = date
94
+ . clone ( )
95
+ . startOf ( "month" )
96
+ . set ( {
97
+ hour : now . get ( "hour" ) ,
98
+ minute : now . get ( "minute" ) ,
99
+ second : now . get ( "second" ) ,
100
+ } ) ;
33
101
if ( calc ) {
34
- currentDate . add ( parseInt ( timeDelta , 10 ) , unit ) ;
102
+ monthStart . add ( parseInt ( timeDelta , 10 ) , unit ) ;
35
103
}
36
104
37
105
if ( momentFormat ) {
38
- return currentDate . format ( momentFormat . substring ( 1 ) . trim ( ) ) ;
106
+ return monthStart . format ( momentFormat . substring ( 1 ) . trim ( ) ) ;
39
107
}
40
- return currentDate . format ( format ) ;
108
+ return monthStart . format ( format ) ;
41
109
}
42
- )
43
- . replace ( / { { \s * y e s t e r d a y \s * } } / gi, date . clone ( ) . subtract ( 1 , "day" ) . format ( format ) )
44
- . replace ( / { { \s * t o m o r r o w \s * } } / gi, date . clone ( ) . add ( 1 , "d" ) . format ( format ) ) ;
110
+ ) ;
111
+ }
112
+
113
+ if ( granularity === "quarter" ) {
114
+ templateContents = templateContents . replace (
115
+ / { { \s * ( q u a r t e r ) \s * ( ( [ + - ] \d + ) ( [ y q m w d h s ] ) ) ? \s * ( : .+ ?) ? } } / gi,
116
+ ( _ , _timeOrDate , calc , timeDelta , unit , momentFormat ) => {
117
+ const now = window . moment ( ) ;
118
+ const monthStart = date
119
+ . clone ( )
120
+ . startOf ( "quarter" )
121
+ . set ( {
122
+ hour : now . get ( "hour" ) ,
123
+ minute : now . get ( "minute" ) ,
124
+ second : now . get ( "second" ) ,
125
+ } ) ;
126
+ if ( calc ) {
127
+ monthStart . add ( parseInt ( timeDelta , 10 ) , unit ) ;
128
+ }
129
+
130
+ if ( momentFormat ) {
131
+ return monthStart . format ( momentFormat . substring ( 1 ) . trim ( ) ) ;
132
+ }
133
+ return monthStart . format ( format ) ;
134
+ }
135
+ ) ;
136
+ }
137
+
138
+ if ( granularity === "year" ) {
139
+ templateContents = templateContents . replace (
140
+ / { { \s * ( y e a r ) \s * ( ( [ + - ] \d + ) ( [ y q m w d h s ] ) ) ? \s * ( : .+ ?) ? } } / gi,
141
+ ( _ , _timeOrDate , calc , timeDelta , unit , momentFormat ) => {
142
+ const now = window . moment ( ) ;
143
+ const monthStart = date
144
+ . clone ( )
145
+ . startOf ( "year" )
146
+ . set ( {
147
+ hour : now . get ( "hour" ) ,
148
+ minute : now . get ( "minute" ) ,
149
+ second : now . get ( "second" ) ,
150
+ } ) ;
151
+ if ( calc ) {
152
+ monthStart . add ( parseInt ( timeDelta , 10 ) , unit ) ;
153
+ }
154
+
155
+ if ( momentFormat ) {
156
+ return monthStart . format ( momentFormat . substring ( 1 ) . trim ( ) ) ;
157
+ }
158
+ return monthStart . format ( format ) ;
159
+ }
160
+ ) ;
161
+ }
162
+
163
+ return templateContents ;
45
164
}
46
165
47
166
export function getFormat ( calendarSet : CalendarSet , granularity : Granularity ) : string {
@@ -72,6 +191,7 @@ export async function applyPeriodicTemplateToFile(
72
191
) ;
73
192
const renderedContents = applyTemplateTransformations (
74
193
file . basename ,
194
+ metadata . granularity ,
75
195
metadata . date ,
76
196
format ,
77
197
templateContents
@@ -157,7 +277,6 @@ async function ensureFolderExists(app: App, path: string): Promise<void> {
157
277
}
158
278
159
279
export function getRelativeDate ( granularity : Granularity , date : Moment ) {
160
- const today = window . moment ( ) . startOf ( "day" ) ;
161
280
if ( granularity == "week" ) {
162
281
const thisWeek = window . moment ( ) . startOf ( granularity ) ;
163
282
const fromNow = window . moment ( date ) . diff ( thisWeek , "week" ) ;
@@ -170,6 +289,7 @@ export function getRelativeDate(granularity: Granularity, date: Moment) {
170
289
}
171
290
return window . moment . duration ( fromNow , granularity ) . humanize ( true ) ;
172
291
} else if ( granularity === "day" ) {
292
+ const today = window . moment ( ) . startOf ( "day" ) ;
173
293
const fromNow = window . moment ( date ) . from ( today ) ;
174
294
return window . moment ( date ) . calendar ( null , {
175
295
lastWeek : "[Last] dddd" ,
0 commit comments