diff --git a/src/main/java/com/knowledgepixels/nanodash/Utils.java b/src/main/java/com/knowledgepixels/nanodash/Utils.java index da7e9c22f..31d3f44c9 100644 --- a/src/main/java/com/knowledgepixels/nanodash/Utils.java +++ b/src/main/java/com/knowledgepixels/nanodash/Utils.java @@ -10,6 +10,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; +import org.apache.wicket.util.string.Strings; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Statement; @@ -410,6 +411,39 @@ public static boolean looksLikeHtml(String value) { return LEADING_TAG.matcher(value).find(); } + /** + * Matches an xsd:dateTime-style literal with a time component, e.g. + * "2026-04-16T08:27:12.954Z" or "2026-04-16T08:27:12+02:00". + */ + private static final Pattern DATETIME_LITERAL = + Pattern.compile("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$"); + + /** + * Checks whether a (raw query-result) string looks like an ISO-8601 date-time literal. + * + * @param value the string to check + * @return true if the string parses as an xsd:dateTime-style value + */ + public static boolean isDateTimeLiteral(String value) { + return value != null && DATETIME_LITERAL.matcher(value).matches(); + } + + /** + * Renders a {@code