//
// date_matcher
// Author: mig
//
// Beugungsformen
BEUG = _{ ( "r" | "n" | "s" ) }
ORD = _{ "." | "st" | "nd" | "rd" | "th" }
WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
/// pink
days = { ^"day" ~ ^"s"? | ^"tag" ~ ^"e"? }
monday = ${ ^"monday" | ^"Montag" | ^"mon" | ^"Mo" }
tuesday = ${ ^"tuesday" | ^"Dienstag" | ^"tue" | ^"Di" }
wednesday = ${ ^"wednesday" | ^"Mittwoch" | ^"wed" | ^"Mi" }
thursday = ${ ^"thursday" | ^"Donnerstag" | ^"thu" | ^"Do" }
friday = ${ ^"friday" | ^"Freitag" | ^"fri" | ^"Fr" }
saturday = ${ ^"saturday" | ^"Samstag" | ^"Sonnabend" | ^"sat" | ^"Sa" }
sunday = ${ ^"sunday" | ^"Sonntag" | ^"sun" | ^"So" }
day_of_week = ${ monday | tuesday | thursday | wednesday | friday | saturday | sunday }
weeks = { ^"week" ~ ^"s"? | ^"woche" ~ ^"n"? }
months = { ^"month" ~ ^"s"? | ^"monat" ~ ^"e"? }
january = { ^"january" | ^"Januar" | ^"jan" }
february = { ^"february" | ^"Februar" | ^"feb" }
march = { ^"march" | ^"März" | ^"Maerz" | ^"mar" | ^"Mär" }
april = { ^"april" | ^"apr" }
may = { ^"may" | ^"mai" }
june = { ^"june" | ^"juni" | ^"jun" }
july = { ^"july" | ^"juli" | ^"jul" }
august = { ^"august" | ^"aug" }
september = { ^"september" | ^"sep" }
october = { ^"october" | ^"oct" | ^"oktober" | ^"okt" }
november = { ^"november" | ^"nov" }
december = { ^"december" | ^"dezember" | ^"dec" | ^"dez" }
month = ${ january | february | march | april | may | june | july | august | september | october | november | december }
years = { ^"year" ~ ^"s"? | ^"jahr" ~ ^"e"? }
// Date-Parser
/// pink
yyyy = { ASCII_DIGIT{4} | ASCII_DIGIT{2} }
/// pink
mm = { "1" ~ ("0" | "1" | "2") | "0"? ~ ASCII_DIGIT }
/// pink
dd = { ("1" | "2") ~ ASCII_DIGIT | "3" ~ ("0" | "1") | "0"? ~ ASCII_DIGIT }
kw = { ("0" | "1" | "2" | "3" | "4" | "5")? ~ ASCII_DIGIT }
date_iso = ${ yyyy ~ "-" ~ mm ~ "-" ~ dd }
date_en = ${ mm ~ "/" ~ dd ~ "/" ~ yyyy }
date_de = ${ dd ~ "." ~ mm ~ "." ~ yyyy? }
date_kw = { ( (^"kw" | ^"cw" | ^"week" | ^"woche" ) ~ yyyy ~ ("-" | "/") ~ kw | yyyy ~ "-"? ~ ^"W" ~ kw) }
date_long = { ( month ~ dd ~ ORD? ~ yyyy | dd ~ ORD? ~ month ~ yyyy ) }
/// purple
timeunit = ${ days | weeks | months | years }
/// red
amount = ${ ( "+" | "-" ) ~ ASCII_DIGIT+ }
yesterday = ${ ^"gestern" | ^"yesterday" }
today = ${ ^"today" | ^"heute" }
last = ${ ^"last" | ^"previous" | ^"prev" | ^"letzte" ~ BEUG? | ^"vorige" ~ BEUG? | ^"vorherige" ~ BEUG? }
fore_last = ${ ^"forelast" | ^"vorletzte" ~ BEUG }
/// blue
past = _{ yesterday | today | (fore_last | last? ) ~ ( day_of_week | month ) }
tomorrow = ${ ^"tomorrow" | ^"morgen" }
next = ${ ^"next" | ^"coming" | ^"nächste" ~ BEUG | ^"kommende" ~ BEUG }
after_next = ${ "übernächste" ~ BEUG }
/// green
future = _{ tomorrow | (after_next | next) ~ ( day_of_week | month ) }
offset = _{ amount ~ timeunit | future | past }
date_matcher = { WHITESPACE* ~ ( date_iso | date_de | date_en | date_long | date_kw | offset ) ~ WHITESPACE* }