timewarp 0.4.0

NLP library for parsing English and German natural language into dates and times.
Documentation
//
// 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* }