@@ -122,44 +122,65 @@ Month? _expectMonth(DateParsingParameters parameters) {
122
122
(element) => timestamp.contains (element.name.toLowerCase ()),
123
123
);
124
124
125
- return month.firstOrNullExtenstion ?? english.firstOrNullExtenstion ;
125
+ return month.firstOrNullExtension ?? english.firstOrNullExtension ;
126
126
}
127
127
128
128
Weekday ? _expectWeekday (DateParsingParameters parameters) {
129
+ // TODO(gbassisp): allow weekday in any part of the string
130
+ // currently unsupported because some locales can have a conflict between
131
+ // month and weekday (e.g., "Mar" in French for Mardi and Mars)
129
132
final timestamp = parameters.formattedString.toLowerCase ();
130
- final weekday = parameters.parserInfo.weekdays
133
+ var weekday = parameters.parserInfo.weekdays
131
134
.where (
132
135
(element) => timestamp.startsWith (element.name.toLowerCase ()),
136
+ // (element) => timestamp
137
+ // .contains(RegExp('\\D${element.name}', caseSensitive: false)),
133
138
)
134
- .firstOrNullExtenstion;
135
- final english = allWeekdays
139
+ .firstOrNullExtension;
140
+ if (weekday != null ) return weekday;
141
+ // weekday = parameters.parserInfo.weekdays
142
+ // .where((element) => timestamp.endsWith(element.name.toLowerCase()))
143
+ // .firstOrNullExtension;
144
+ // if (weekday != null) return weekday;
145
+
146
+ // english
147
+ weekday = allWeekdays
136
148
.where (
137
149
(element) => timestamp.startsWith (element.name.toLowerCase ()),
138
150
)
139
- .firstOrNullExtenstion;
151
+ .firstOrNullExtension;
152
+ if (weekday != null ) return weekday;
140
153
141
- return weekday ?? english;
154
+ return allWeekdays
155
+ .where (
156
+ (element) => timestamp.endsWith (element.name.toLowerCase ()),
157
+ )
158
+ .firstOrNullExtension;
142
159
}
143
160
144
161
final _exprs = [...idealTimePatterns]..removeLast ();
145
162
final _betterTimeComponent = CleanupRule ((params) {
146
163
String padLeft (String ? original) => (original ?? '' ).padLeft (2 , '0' );
147
164
String padRight (String ? original) => (original ?? '' ).padRight (3 , '0' );
165
+ String cleanAmpm (String ? original) =>
166
+ original? .replaceAll (RegExp (r'(\.|-)' ), '' ).toLowerCase () ?? '' ;
148
167
149
168
for (final e in _exprs) {
150
- final re = RegExp (e);
151
- final matches = re.allMatches (params.formattedString);
169
+ const ampm = r'\s*(?<ampm>(a|p)(\.|-)?m(\.|-)?\W)?' ;
170
+ final re = RegExp (e + ampm, caseSensitive: false );
171
+ final s = '${params .formattedString } ' ;
172
+ final matches = re.allMatches (s);
152
173
// unsure what to do if many matches
153
174
if (matches.length == 1 ) {
154
175
final m = matches.first;
155
- final newString = params.formattedString. replaceAllMapped (
156
- re,
157
- (match) => '${padLeft (m .namedGroup ( 'hour ' ))}: '
158
- '${padLeft ( m .tryNamedGroup ('minute' ))}: '
159
- '${padLeft (m .tryNamedGroup ('second ' ))}'
160
- '${m .tryNamedGroup ('microsecond' ) != null ? '.'
161
- '${ padRight ( m . tryNamedGroup ( 'microsecond' ))}' : '' }' ,
162
- );
176
+ final newTime = ' ${ padLeft ( m . namedGroup ( 'hour' ))}:'
177
+ '${ padLeft ( m . tryNamedGroup ( 'minute' ))}:'
178
+ '${padLeft (m .tryNamedGroup ( 'second ' ))}'
179
+ '${m .tryNamedGroup ('microsecond' ) != null ? '. '
180
+ '${padRight (m .tryNamedGroup ('microsecond ' ))}' : '' } '
181
+ '${cleanAmpm ( m .tryNamedGroup ('ampm' ))}' ;
182
+ final newString = s. replaceAllMapped (re, (_) => '' ) + newTime;
183
+
163
184
params
164
185
..formattedString = newString
165
186
..simplifiedString = newString;
@@ -198,6 +219,6 @@ extension _GroupNames on RegExpMatch {
198
219
}
199
220
200
221
extension _IterableX <T > on Iterable <T > {
201
- T ? get firstOrNullExtenstion => isEmpty ? null : first;
222
+ T ? get firstOrNullExtension => isEmpty ? null : first;
202
223
// T? get lastOrNull => isEmpty ? null : last;
203
224
}
0 commit comments