Skip to content

Commit

Permalink
[WIP]
Browse files Browse the repository at this point in the history
  • Loading branch information
vkhrystiuk-ks committed Dec 10, 2024
1 parent 348ecfc commit 464c852
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 58 deletions.
4 changes: 1 addition & 3 deletions src/main/java/liqp/filters/date/fuzzy/FuzzyDateParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,13 @@ public class FuzzyDateParser extends BasicDateParser {
private static final PartRecognizer partRecognizer = new PartRecognizer();

@Override
public ZonedDateTime parse(String valAsString, Locale locale, ZoneId defaultZone) {
public ZonedDateTime parse(String normalized, Locale locale, ZoneId defaultZone) {
if (locale == null) {
locale = Locale.ENGLISH;
}
if (defaultZone == null) {
defaultZone = ZoneId.systemDefault();
}
String normalized = valAsString.toLowerCase();
ZonedDateTime zonedDateTime = parseUsingCachedPatterns(normalized, locale, defaultZone);
if (zonedDateTime != null) {
return zonedDateTime;
Expand All @@ -68,7 +67,6 @@ String guessPattern(String normalized, Locale locale) {
}
List<Part> parts = new ArrayList<>();
DatePatternRecognizingContext ctx = new DatePatternRecognizingContext(locale);
normalized = normalized.toLowerCase(locale);
parts.add(new NewPart(0, normalized.length(), normalized));

while (haveUnrecognized(parts)) {
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/liqp/filters/date/fuzzy/PartRecognizer.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,9 @@ private LookupResult lookup(List<Part> parts, PartExtractor partExtractor) {

private List<Part> markAsUnrecognized(List<Part> parts) {
List<Part> newParts = new ArrayList<>();
for (int i = 0; i < parts.size(); i++) {
Part p = parts.get(i);
for (Part p : parts) {
if (p.state() == Part.PartState.NEW) {
newParts.addAll(i, categorizeUnrecognized(p));
newParts.addAll(categorizeUnrecognized(p));
} else {
newParts.add(p);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class RegexPartExtractor implements PartExtractor {
protected final String formatterPattern;

public RegexPartExtractor(String regex, String formatterPattern) {
this.pattern = Pattern.compile(regex);
this.pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
this.formatterPattern = formatterPattern;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package liqp.filters.date.fuzzy.extractors;

import static liqp.LValue.isBlank;
import static liqp.filters.date.fuzzy.extractors.RegularTimeExtractor.repeat;

import java.util.regex.Matcher;

Expand All @@ -18,7 +19,7 @@ public PartExtractorResult extract(String source) {
PartExtractorResult result = new PartExtractorResult();
result.found = true;
result.start = matcher.start("year");
result.formatterPattern = "yyyy";
result.formatterPattern = repeat("y", Math.min(matcher.group("year").length(), matcher.group("year").length()));
String era = matcher.group("era");
if (!isBlank(era)) {
String eraSeparator = matcher.group("eraSeparator");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,60 +23,60 @@ public class FuzzyDateParserParametrizedTest {
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{null, "1995", "yyyy"},
{null, " 1995 ", " yyyy "},
{null, " 1995", " yyyy"},
{null, "1995 ", "yyyy "},
{null, "January 1995", "MMMM yyyy"},
{null, "January 1995 ", "MMMM yyyy "},
{null, " January 1995", " MMMM yyyy"},
{null, " 1995 January", " yyyy MMMM"},
{null, "Jan 1995", "MMM yyyy"},
{null, "1995 Jan ", "yyyy MMM "},
{Locale.GERMAN, "1995 Mai", "yyyy MMMM"},
FuzzyDateParser.CLDR_LOADED ?
new Object[]{
Locale.GERMAN, "??1995-----Dez.!", "'??'yyyy-----MMM'!'"}
: new Object[]{
Locale.GERMAN, "??1995-----Dez!", "'??'yyyy-----MMM'!'"}
,
{null, "1:23", "H:mm"},
{null, "01:23", "HH:mm"},
{null, "1:23:45", "H:mm:ss"},
{null, "01:23:45", "HH:mm:ss"},
{null, "1:23:45.6", "H:mm:ss.S"},
{null, "01:23:45.6", "HH:mm:ss.S"},
{null, "1:23:45.67", "H:mm:ss.SS"},
{null, "1:23:45.678", "H:mm:ss.SSS"},
{null, "1:23:45.6789", "H:mm:ss.SSSS"},
{null, "1:23:45.67890", "H:mm:ss.SSSSS"},
{null, "1:23:45.678901", "H:mm:ss.SSSSSS"},
{null, "1:23:45.6789012", "H:mm:ss.SSSSSSS"},
{null, "1:23:45.67890123", "H:mm:ss.SSSSSSSS"},
{null, "1:23:45.678901234", "H:mm:ss.SSSSSSSSS"},
{null, "1:23:45.678901234am", "h:mm:ss.SSSSSSSSSa"}, // correct
{null, "1:23:45.678901234a", "H:mm:ss.SSSSSSSSS'a'"}, // incorrect
{null, "1:23:45.678901234p", "H:mm:ss.SSSSSSSSS'p'"}, // incorrect
{null, "1:23:45.678901234pm", "h:mm:ss.SSSSSSSSSa"}, // correct
{null, "1:23:45.678901234 pm", "h:mm:ss.SSSSSSSSS a"}, // correct
{null, " 1:23:45.678", " H:mm:ss.SSS"},
{null, " 1:23:45.678 ", " H:mm:ss.SSS "},
{null, " 01:23:45.678 ", " HH:mm:ss.SSS "},
{null, " 1:23:45.678 am ", " h:mm:ss.SSS a "},
{null, " 1:23:45.678 PM ", " h:mm:ss.SSS a "},
{null, "12 Jan 1995T01:23:45.678", "'12' MMM yyyyTHH:mm:ss.SSS"},
{null, "12 AD", "yyyy GG"},
{null, " 12 AD ", " yyyy GG "},
{null, " 12 Anno Domini ", " yyyy GGGG "},
{null, " 12345 Before Christ ", " yyyy GGGG "},
{null, " 0 BC ", " yyyy GG "},
// {null, "1995", "yyyy"},
// {null, " 1995 ", " yyyy "},
// {null, " 1995", " yyyy"},
// {null, "1995 ", "yyyy "},
// {null, "January 1995", "MMMM yyyy"},
// {null, "January 1995 ", "MMMM yyyy "},
// {null, " January 1995", " MMMM yyyy"},
// {null, " 1995 January", " yyyy MMMM"},
// {null, "Jan 1995", "MMM yyyy"},
// {null, "1995 Jan ", "yyyy MMM "},
// {Locale.GERMAN, "1995 Mai", "yyyy MMMM"},
// FuzzyDateParser.CLDR_LOADED ?
// new Object[]{
// Locale.GERMAN, "??1995-----Dez.!", "'??'yyyy-----MMM'!'"}
// : new Object[]{
// Locale.GERMAN, "??1995-----Dez!", "'??'yyyy-----MMM'!'"}
// ,
// {null, "1:23", "H:mm"},
// {null, "01:23", "HH:mm"},
// {null, "1:23:45", "H:mm:ss"},
// {null, "01:23:45", "HH:mm:ss"},
// {null, "1:23:45.6", "H:mm:ss.S"},
// {null, "01:23:45.6", "HH:mm:ss.S"},
// {null, "1:23:45.67", "H:mm:ss.SS"},
// {null, "1:23:45.678", "H:mm:ss.SSS"},
// {null, "1:23:45.6789", "H:mm:ss.SSSS"},
// {null, "1:23:45.67890", "H:mm:ss.SSSSS"},
// {null, "1:23:45.678901", "H:mm:ss.SSSSSS"},
// {null, "1:23:45.6789012", "H:mm:ss.SSSSSSS"},
// {null, "1:23:45.67890123", "H:mm:ss.SSSSSSSS"},
// {null, "1:23:45.678901234", "H:mm:ss.SSSSSSSSS"},
// {null, "1:23:45.678901234am", "h:mm:ss.SSSSSSSSSa"}, // correct
// {null, "1:23:45.678901234a", "H:mm:ss.SSSSSSSSS'a'"}, // incorrect
// {null, "1:23:45.678901234p", "H:mm:ss.SSSSSSSSS'p'"}, // incorrect
// {null, "1:23:45.678901234pm", "h:mm:ss.SSSSSSSSSa"}, // correct
// {null, "1:23:45.678901234 pm", "h:mm:ss.SSSSSSSSS a"}, // correct
// {null, " 1:23:45.678", " H:mm:ss.SSS"},
// {null, " 1:23:45.678 ", " H:mm:ss.SSS "},
// {null, " 01:23:45.678 ", " HH:mm:ss.SSS "},
// {null, " 1:23:45.678 am ", " h:mm:ss.SSS a "},
// {null, " 1:23:45.678 PM ", " h:mm:ss.SSS a "},
// {null, "12 Jan 1995T01:23:45.678", "'12' MMM yyyy'T'HH:mm:ss.SSS"},
{null, "12 AD", "yy GG"},
{null, " 12 AD ", " yy GG "},
{null, " 12 Anno Domini ", " yy GGGG "},
{null, " 12345 Before Christ ", " yyyyy GGGG "},
{null, " 1 BC ", " y GG "},
{null, "12 January", "'12' MMMM"},
{null, " 12 January ", " '12' MMMM "},
{null, "12 Jan", "'12' MMM"},
{null, " 12 Jan ", " '12' MMM "},

{null, " 12 BC 12 Jan 01:23:45.678 ", " yyyy GG '12' MMM HH:mm:ss.SSS "},
{null, "12 Jan 01:23:45.678 12 Anno Domini", "'12' MMM HH:mm:ss.SSS yyyy GGGG"},
{null, " 12 BC 12 Jan 01:23:45.678 ", " yy GG '12' MMM HH:mm:ss.SSS "},
{null, "12 Jan 01:23:45.678 12 Anno Domini", "'12' MMM HH:mm:ss.SSS yy GGGG"},
{null, "Monday", "EEEE"},
{null, " Monday ", " EEEE "},
{null, "Monday ", "EEEE "},
Expand Down Expand Up @@ -116,7 +116,7 @@ public void shouldParse() {
try {
final FuzzyDateParser parser = new FuzzyDateParser();
pattern = parser.guessPattern(input, locale);
assertEquals(expectedPattern, pattern);
assertEquals(String.format("input is: [%s], expected pattern: [%s], real pattern: [%s]", input, expectedPattern, pattern), expectedPattern, pattern);
parsed = parser.parse(input, locale, null);
String formatted = parsed.format(DateTimeFormatter.ofPattern(pattern, locale)).toLowerCase(locale);
assertEquals(String.format("input is: [%s], expected pattern: [%s], real pattern: [%s], real date: [%s]", input, expectedPattern, pattern, parsed),
Expand Down

0 comments on commit 464c852

Please sign in to comment.