Skip to content

Commit

Permalink
[WIP]
Browse files Browse the repository at this point in the history
  • Loading branch information
msangel committed Jan 5, 2025
1 parent 65faffc commit 8b575b9
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 72 deletions.
35 changes: 31 additions & 4 deletions src/main/java/liqp/filters/date/BasicDateParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.util.function.Function;

import static java.time.temporal.ChronoField.*;
import static liqp.LValue.isBlank;

public abstract class BasicDateParser {

Expand Down Expand Up @@ -75,10 +76,36 @@ protected ZonedDateTime parseUsingCachedPatterns(String str, Locale locale, Zone
}

protected TemporalAccessor parseUsingPattern(String normalized, String pattern, Locale locale) {
DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern(pattern)
.toFormatter(locale);
if (pattern.contains("yy") && pattern.contains("MM") && pattern.contains("dd") && pattern.contains("EEE")) {
pattern = pattern.replace("EEEE", "");
pattern = pattern.replace("EEE", "");
normalized = normalized.replaceAll("Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday", "");
normalized = normalized.replaceAll("Mon|Tue|Wed|Thu|Fri|Sat|Sun", "");
}

DateTimeFormatter timeFormatter;
if (pattern.contains("yy") && !pattern.contains("yyyy")) {
String[] partsAroundYear = pattern.split("yy");
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder()
.parseCaseInsensitive();
if (partsAroundYear.length > 0 && !partsAroundYear[0].isEmpty()) {
builder.appendPattern(partsAroundYear[0]);
}
if (!pattern.contains("GG")) {
builder.appendValueReduced(YEAR, 2, 2, 1950);
} else {
builder.appendValue(YEAR);
}
if (partsAroundYear.length > 1 && !partsAroundYear[1].isEmpty()) {
builder.appendPattern(partsAroundYear[1]);
}
timeFormatter = builder.toFormatter(locale);
} else {
timeFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern(pattern)
.toFormatter(locale);
}

return timeFormatter.parse(normalized);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/liqp/filters/date/fuzzy/FuzzyDateParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ private GuessingResult getGuessingResult(Stream<String> guessingStream, String n
try {
temporalAccessor = parseUsingPattern(normalized, pattern, locale);
} catch (Exception e) {
// ignore
e.printStackTrace();
}
if (temporalAccessor != null) {
GuessingResult result = new GuessingResult();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,57 +23,57 @@ 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", "dd 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", "dd MMMM"},
{null, " 12 January ", " dd MMMM "},
{null, "12 Jan", "dd MMM"},
{null, " 12 Jan ", " dd MMM "},
// {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", "dd 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", "dd MMMM"},
// {null, " 12 January ", " dd MMMM "},
// {null, "12 Jan", "dd MMM"},
// {null, " 12 Jan ", " dd MMM "},

{null, " 12 BC 12 Jan 01:23:45.678 ", " yy GG dd MMM HH:mm:ss.SSS "},
{null, "12 Jan 01:23:45.678 12 Anno Domini", "dd MMM HH:mm:ss.SSS yy GGGG"},
Expand Down
49 changes: 33 additions & 16 deletions src/test/java/liqp/filters/date/fuzzy/StandardsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,34 +21,51 @@ public class StandardsTest {
*/
@Test
public void testRFC822() {
String[] samples = {
// "Sun, 06 Nov 1994 08:49:37 GMT",
FuzzyDateParser parser = new FuzzyDateParser();
String[] samplesWithSeconds = {
"Sun, 06 Nov 1994 08:49:37 GMT",
"Sun, 06 Nov 94 08:49:37 GMT",
"Sun, 6 Nov 1994 08:49:37 GMT",
"Sun, 6 Nov 94 08:49:37 GMT",
"Sun, 06 Nov 1994 8:49:37 GMT",
"Sun, 06 Nov 94 8:49:37 GMT",
"Sun, 6 Nov 1994 8:49:37 GMT",
"Sun, 6 Nov 94 8:49:37 GMT",
"Sun, 06 Nov 1994 08:49 GMT",
"Sun, 06 Nov 94 08:49 GMT",
"Sun, 6 Nov 1994 08:49 GMT",
"Sun, 6 Nov 94 08:49 GMT",
"Sun, 06 Nov 1994 8:49 GMT",
"Sun, 06 Nov 94 8:49 GMT",
"Sun, 6 Nov 1994 8:49 GMT",
"Sun, 6 Nov 94 8:49 GMT",
"Sun, 06 Nov 1994",
"Sun, 06 Nov 94",
"Sun, 6 Nov 1994",
"Sun, 6 Nov 94"
};

FuzzyDateParser parser = new FuzzyDateParser();
for (String sample : samples) {
for (String sample : samplesWithSeconds) {
ZonedDateTime datetime = parser.parse(sample, null, ZoneOffset.UTC);
assertEquals("wrong sample:[" + sample + "]", ZonedDateTime.of(1994, 11, 6, 8, 49, 37, 0, ZoneOffset.UTC), datetime);
}

String[] samplesWithoutSeconds = {
"Sun, 06 Nov 1994 08:49 GMT",
"Sun, 06 Nov 94 08:49 GMT",
"Sun, 6 Nov 1994 08:49 GMT",
"Sun, 6 Nov 94 08:49 GMT",
"Sun, 06 Nov 1994 8:49 GMT",
"Sun, 06 Nov 94 8:49 GMT",
"Sun, 6 Nov 1994 8:49 GMT",
"Sun, 6 Nov 94 8:49 GMT",
};

for (String sample : samplesWithoutSeconds) {
ZonedDateTime datetime = parser.parse(sample, null, ZoneOffset.UTC);
assertEquals("wrong sample:[" + sample + "]", ZonedDateTime.of(1994, 11, 6, 8, 49, 0, 0, ZoneOffset.UTC), datetime);
}

String[] samplesWithoutTime = {
"Sun, 06 Nov 1994",
"Sun, 06 Nov 94",
"Sun, 6 Nov 1994",
"Sun, 6 Nov 94"
};

for (String sample : samplesWithoutTime) {
ZonedDateTime datetime = parser.parse(sample, null, ZoneOffset.UTC);
assertEquals("wrong sample:[" + sample + "]", ZonedDateTime.of(1994, 11, 6, 0, 0, 0, 0, ZoneOffset.UTC), datetime);
}

}

/**
Expand Down

0 comments on commit 8b575b9

Please sign in to comment.