Update to latest relative_time_plus.jinja

This commit is contained in:
2024-07-24 15:58:55 -04:00
parent 9fea293c23
commit 707c03804d

View File

@ -4,243 +4,417 @@
combine contains the text to combine the last time fraction, and error the text to display on wrong date input combine contains the text to combine the last time fraction, and error the text to display on wrong date input
#} #}
{%- set _time_period_phrases = [ {%- set _time_period_phrases = [
{ {
'language': 'en', 'language': 'en',
'phrases': 'phrases': {
{ 'year': ['year', 'years', 'yr'],
'year': ['year', 'years', 'yr'], 'month': ['month', 'months', 'mth'],
'month': ['month', 'months', 'mth'], 'week': ['week', 'weeks', 'wk'],
'week': ['week', 'weeks', 'wk'], 'day': ['day', 'days', 'day'],
'day': ['day', 'days', 'day'], 'hour': ['hour', 'hours', 'hr'],
'hour': ['hour', 'hours', 'hr'], 'minute': ['minute', 'minutes', 'min'],
'minute': ['minute', 'minutes', 'min'], 'second': ['second', 'seconds', 'sec'],
'second': ['second', 'seconds', 'sec'], 'millisecond': ['millisecond', 'milliseconds', 'ms'],
'millisecond': ['millisecond', 'milliseconds', 'ms'], 'combine': 'and',
'combine': 'and', 'error': 'Invalid date',
'error': 'Invalid date' }
} },
}, {
{ 'language': 'pl',
'language': 'pl', 'phrases': {
'phrases': 'year': ['rok', 'lat', 'r'],
{ 'month': ['miesiąc', 'miesięcy', 'msc'],
'year': ['rok', 'lat', 'r'], 'week': ['tydzień', 'tygodni', 'tyg'],
'month': ['miesiąc', 'miesięcy', 'msc'], 'day': ['dzień', 'dni', 'dzień'],
'week': ['tydzi', 'tygodni', 'tyg'], 'hour': ['godzina', 'godzin', 'godz'],
'day': ['dzień', 'dni', 'dzień'], 'minute': ['minuta', 'minut', 'min'],
'hour': ['godzina', 'godzin', 'godz'], 'second': ['sekunda', 'sekund', 'sek'],
'minute': ['minuta', 'minut', 'min'], 'millisecond': ['milisekunda', 'milisekund', 'ms'],
'second': ['sekunda', 'sekund', 'sek'], 'combine': 'i',
'millisecond': ['milisekunda', 'milisekund', 'ms'], 'error': 'Niepoprawna data',
'combine': 'i', }
'error': 'Niepoprawna data' },
} {
}, 'language': 'fr',
{ 'phrases': {
'language': 'fr', 'year': ['année', 'années', 'an'],
'phrases': 'month': ['mois', 'mois', 'mois'],
{ 'week': ['semaine', 'semaines', 'sem'],
'year': ['année', 'années', 'an'], 'day': ['jour', 'jours', 'j'],
'month': ['mois', 'mois', 'mois'], 'hour': ['heure', 'heures', 'h'],
'week': ['semaine', 'semaines', 'sem'], 'minute': ['minute', 'minutes', 'min'],
'day': ['jour', 'jours', 'j'], 'second': ['seconde', 'secondes', 'sec'],
'hour': ['heure', 'heures', 'h'], 'millisecond': ['milliseconde', 'millisecondes', 'ms'],
'minute': ['minute', 'minutes', 'min'], 'combine': 'et',
'second': ['seconde', 'secondes', 'sec'], 'error': 'Date non valide',
'millisecond': ['milliseconde', 'millisecondes', 'ms'], }
'combine': 'et', },
'error': 'Date non valide' {
} 'language': 'it',
}, 'phrases': {
{ 'year': ['anno', 'anni', 'aa'],
'language': 'it', 'month': ['mese', 'mesi', 'mm'],
'phrases': 'week': ['settimana', 'settimane', 'set'],
{ 'day': ['giorno', 'giorni', 'gg'],
'year': ['anno', 'anni', 'aa'], 'hour': ['ora', 'ore', 'h'],
'month': ['mese', 'mesi', 'mm'], 'minute': ['minuto', 'minuti', 'min'],
'week': ['settimana', 'settimane', 'set'], 'second': ['secondo', 'secondi', 'sec'],
'day': ['giorno', 'giorni', 'gg'], 'millisecond': ['millisecondo', 'millisecondi', 'ms'],
'hour': ['ora', 'ore', 'h'], 'combine': 'e',
'minute': ['minuto', 'minuti', 'min'], 'error': 'Data non valida',
'second': ['secondo', 'secondi', 'sec'], }
'millisecond': ['millisecondo', 'millisecondi', 'ms'], },
'combine': 'e', {
'error': 'Data non valida' 'language': 'nb',
} 'phrases': {
}, 'year': ['år', 'år', 'år'],
{ 'month': ['måned', 'måneder', 'mnd'],
'language': 'nl', 'week': ['uke', 'uker', 'u'],
'phrases': 'day': ['dag', 'dager', 'd'],
{ 'hour': ['time', 'timer', 't'],
'year': ['jaar', 'jaar', 'jr'], 'minute': ['minutt', 'minutter', 'min'],
'month': ['maand', 'maanden', 'mnd'], 'second': ['sekund', 'sekunder', 'sek'],
'week': ['week', 'weken', 'wk'], 'millisecond': ['millisekund', 'millisekunder', 'ms'],
'day': ['dag', 'dagen', 'dg'], 'combine': 'og',
'hour': ['uur', 'uur', 'u'], 'error': 'Ugyldig dato',
'minute': ['minuut', 'minuten', 'min'], }
'second': ['seconde', 'seconden', 'sec'], },
'millisecond': ['milliseconde', 'milliseconden', 'ms'], {
'combine': 'en', 'language': 'nl',
'error': 'Ongeldige datum' 'phrases': {
} 'year': ['jaar', 'jaar', 'jr'],
}, 'month': ['maand', 'maanden', 'mnd'],
{ 'week': ['week', 'weken', 'wk'],
'language': 'de', 'day': ['dag', 'dagen', 'dg'],
'phrases': 'hour': ['uur', 'uur', 'u'],
{ 'minute': ['minuut', 'minuten', 'min'],
'year': ['Jahr', 'Jahre', 'J.'], 'second': ['seconde', 'seconden', 'sec'],
'month': ['Monat', 'Monate', 'M.'], 'millisecond': ['milliseconde', 'milliseconden', 'ms'],
'week': ['Woche', 'Wochen', 'Wo.'], 'combine': 'en',
'day': ['Tag', 'Tage', 'Tg.'], 'error': 'Ongeldige datum',
'hour': ['Stunde', 'Stunden', 'Std.'], }
'minute': ['Minute', 'Minuten', 'Min.'], },
'second': ['Sekunde', 'Sekunden', 'Sek.'], {
'millisecond': ['Milliseconde', 'Milliseconden', 'ms'], 'language': 'nn',
'combine': 'und', 'phrases': {
'error': 'Falsches Datum' 'year': ['år', 'år', 'år'],
} 'month': ['månad', 'månader', 'mnd'],
}, 'week': ['veke', 'veker', 'v'],
{ 'day': ['dag', 'dagar', 'd'],
'language': 'pt', 'hour': ['time', 'timar', 't'],
'phrases': 'minute': ['minutt', 'minutt', 'min'],
{ 'second': ['sekund', 'sekund', 'sek'],
'year': ['ano', 'anos', 'aa'], 'millisecond': ['millisekund', 'millisekund', 'ms'],
'month': ['mês', 'meses', 'mm'], 'combine': 'og',
'week': ['semana', 'semanas', 'sem'], 'error': 'Ugyldig dato',
'day': ['dia', 'dias', 'd'], }
'hour': ['hora', 'horas', 'h'], },
'minute': ['minuto', 'minutos', 'min'], {
'second': ['segundo', 'segundos', 'seg'], 'language': 'de',
'millisecond': ['millissegundo', 'millissegundos', 'ms'], 'phrases': {
'combine': 'e', 'year': ['Jahr', 'Jahre', 'J.'],
'error': 'Data Inválida' 'month': ['Monat', 'Monate', 'M.'],
} 'week': ['Woche', 'Wochen', 'Wo.'],
}, 'day': ['Tag', 'Tage', 'Tg.'],
{ 'hour': ['Stunde', 'Stunden', 'Std.'],
'language': 'dk', 'minute': ['Minute', 'Minuten', 'Min.'],
'phrases': 'second': ['Sekunde', 'Sekunden', 'Sek.'],
{ 'millisecond': ['Millisekunde', 'Millisekunden', 'ms'],
'year': ['år', 'år', 'år'], 'combine': 'und',
'month': ['måned', 'måneder', 'mnd'], 'error': 'Falsches Datum',
'week': ['uge', 'uger', 'uge'], }
'day': ['dag', 'dage', 'dag'], },
'hour': ['time', 'timer', 't.'], {
'minute': ['minut', 'minuter', 'min.'], 'language': 'pt',
'second': ['sekund', 'sekunder', 'sek.'], 'phrases': {
'millisecond': ['millisekund', 'millisekunder', 'ms.'], 'year': ['ano', 'anos', 'aa'],
'combine': 'og', 'month': ['mês', 'meses', 'mm'],
'error': 'Ugyldig dato' 'week': ['semana', 'semanas', 'sem'],
} 'day': ['dia', 'dias', 'd'],
} 'hour': ['hora', 'horas', 'h'],
] 'minute': ['minuto', 'minutos', 'min'],
%} 'second': ['segundo', 'segundos', 'seg'],
'millisecond': ['millissegundo', 'millissegundos', 'ms'],
'combine': 'e',
'error': 'Data Inválida',
}
},
{
'language': 'dk',
'phrases': {
'year': ['år', 'år', 'år'],
'month': ['måned', 'måneder', 'mnd'],
'week': ['uge', 'uger', 'uge'],
'day': ['dag', 'dage', 'dag'],
'hour': ['time', 'timer', 't.'],
'minute': ['minut', 'minuter', 'min.'],
'second': ['sekund', 'sekunder', 'sek.'],
'millisecond': ['millisekund', 'millisekunder', 'ms.'],
'combine': 'og',
'error': 'Ugyldig dato',
}
},
{
'language': 'sv',
'phrases': {
'year': ['år', 'år', 'år'],
'month': ['månad', 'månader', 'mån'],
'week': ['vecka', 'veckor', 'v'],
'day': ['dag', 'dagar', 'dag'],
'hour': ['timme', 'timmar', 'tim'],
'minute': ['minut', 'minuter', 'min'],
'second': ['sekund', 'sekunder', 'sek'],
'millisecond': ['millisekund', 'millisekunder', 'ms'],
'combine': 'och',
'error': 'Ogiltigt datum',
}
},
{
'language': 'cs',
'phrases': {
'year': ['rok', 'roky', 'rok'],
'month': ['měsíc', 'měsíce', 'měs'],
'week': ['týden', 'týdny', 'týd'],
'day': ['den', 'dny', 'd'],
'hour': ['hodina', 'hodiny', 'hod'],
'minute': ['minuta', 'minuty', 'min'],
'second': ['sekunda', 'sekundy', 'sek'],
'millisecond': ['millisekunda', 'millisekundy', 'ms'],
'combine': 'a',
'error': 'špatný datum'
}
},
{
'language': 'fi',
'phrases': {
'year': ['vuosi', 'vuotta', 'v'],
'month': ['kuukausi', 'kuukautta', 'kk'],
'week': ['viikko', 'viikkoa', 'vk'],
'day': ['päivä', 'päivää', 'pv'],
'hour': ['tunti', 'tuntia', 't'],
'minute': ['minuutti', 'minuuttia', 'min'],
'second': ['sekunti', 'sekuntia', 's'],
'millisecond': ['millisekunti', 'millisekuntia', 'ms'],
'combine': 'ja',
'error': 'Väärä päivämäärä',
}
},
{
'language': 'ru',
'phrases': {
'year': ['год', 'года', 'г'],
'month': ['месяц', 'месяцы', 'м'],
'week': ['неделя', 'недели', 'н'],
'day': ['день', 'дни', 'д'],
'hour': ['час', 'часы', 'ч'],
'minute': ['минута', 'минут', 'м'],
'second': ['секунд', 'секунды', 'с'],
'millisecond': ['милисекунд', 'милисекунды', 'мс'],
'combine': 'и',
'error': 'Неверная дата',
}
},
{
'language': 'uk',
'phrases': {
'year': ['рік', 'років', 'р'],
'month': ['місяць', 'місяців', 'м'],
'week': ['тиждень', 'тижнів', 'тижд'],
'day': ['день', 'днів', 'дн'],
'hour': ['годину', 'годин', 'год'],
'minute': ['хвилину', 'хвилин', 'хв'],
'second': ['секунду', 'секунд', 'сек'],
'millisecond': ['мілісекунду', 'мілісекунд', 'мсек'],
'combine': 'та',
'error': 'Недійсна дата',
}
},
] -%}
{# macro to convert the abbreviated input for the not_use and always_show lists to the full time part names #}
{%- macro _abbr_to_full(input) -%}
{# determine not_use list #}
{%- set abbr_to_full = dict(yr='year', mth='month', wk='week', day='day', hr='hour', min='minute', sec='second', ms='millisecond') -%}
{%- set list = input if input is list else (input | replace(' ', '')).split(',') -%}
{%- if list | select('in', abbr_to_full) | list | count > 0 -%}
{%- set ns = namespace(output=[]) -%}
{%- for i in list -%}
{%- set ns.output = ns.output + [abbr_to_full[i] | default(i)] -%}
{%- endfor -%}
{%- set list = ns.output -%}
{%- endif -%}
{{- list | select('in', abbr_to_full.values()) | list | to_json -}}
{%- endmacro -%}
{# {#
macro to split a timedelta in years, months, weeks, days, hours, minutes, seconds macro to split a timedelta in years, months, weeks, days, hours, minutes, seconds and milliseconds
used by the relative time plus macro, set up as a seperate macro so it can be reused used by the relative time plus macro, set up as a seperate macro so it can be reused
#} #}
{%- macro time_split(date, compare_date=now(), time=true, not_use=[]) -%} {%- macro time_split(date, parts=8, compare_date=now(), not_use=[], always_show=['all'], time=true, round_mode='floor') -%}
{# set defaults for variables #} {#- set defaults for input if not entered #}
{%- set date = date | as_local if time else date.date()-%} {%- set date = date if date is datetime else date | as_datetime('invalid') -%}
{%- set compare_date = compare_date if compare_date is datetime else compare_date | as_datetime('invalid') -%}
{%- set time = time | bool(true) -%} {%- set time = time | bool(true) -%}
{%- set comp_date = compare_date if time else compare_date.date() -%} {%- set parts = [parts | int(1), always_show | count] | max -%}
{%- set date_max = [comp_date, date] | max -%} {# 1: check if date input is correct #}
{%- set date_min = [comp_date, date] | min -%} {%- if date is datetime and compare_date is datetime -%}
{#- set time periods in seconds #} {# convert date input to local or date only #}
{%- set m, h, d, w = 60, 3600, 86400, 604800 -%} {%- set date = date | as_local if time else (date | as_local).date() -%}
{#- set numer of years, and set lowest date using this number of years #} {%- set compare_date = compare_date | as_local if time else (compare_date | as_local).date() -%}
{%- set yrs = date_max.year - date_min.year - (1 if date_max.replace(year=date_min.year) < date_min else 0) -%} {# determine highest and lowest date #}
{%- set date_max = date_max.replace(year=date_max.year - yrs) -%} {%- set date_max = [compare_date, date] | max -%}
{#- set numer of months, and set lowest date using this number of months #} {%- set date_min = [compare_date, date] | min -%}
{%- if 'month' not in not_use -%} {#- set time periods in seconds #}
{%- set mth = (date_max.month - date_min.month - (1 if date_max.day < date_min.day else 0) + 12) % 12 -%} {%- set days_year = 365 + (1 if (compare_date.replace(month=3, day=1) - timedelta(days=1)).day == 29 else 0) -%}
{%- set month_new = (((date_max.month - mth) + 12) % 12) | default(12, true) -%} {%- set days_month = ((compare_date.replace(day=20) + timedelta(days=20)).replace(day=1) - timedelta(days=1)).day -%}
{%- set day_max = ((date_max.replace(day=1, month=month_new) + timedelta(days=31)).replace(day=1) - timedelta(days=1)).day -%} {%- set dur = dict(
{%- set extra_days = [0, date_max.day - day_max] | max -%} year=days_year * 86400000,
{%- set date_temp = date_max.replace(month=month_new, day=[date_max.day, day_max]|min) -%} month=days_month * 86400000,
{%- set date_max = date_temp if date_temp <= date_max else date_temp.replace(year=date_max.year-1) -%} week=604800000,
{%- set mth = mth + yrs * 12 if 'year' in not_use else mth -%} day=86400000,
{%- endif -%} hour=3600000,
{%- set date_max = date_max.replace(year=date_max.year + yrs) if 'year' in not_use and 'month' in not_use else date_max -%} minute=60000,
{%- set yrs = 0 if 'year' in not_use else yrs -%} second=1000,
{#- set other time period variables #} millisecond=1,
{%- set s = (date_max - date_min).total_seconds() + extra_days | default(0) * 86400 -%} )
{%- set wks = 0 if 'week' in not_use else (s // w) | int -%} -%}
{%- set day = 0 if 'day' in not_use else ((s - wks * w) // d) | int -%} {# make sure input for not_use and always_show is correct #}
{%- set hrs = 0 if 'hour' in not_use else ((s - wks * w - day * d) // h) | int -%} {%- if not not_use in [['millisecond'], []] -%}
{%- set min = 0 if 'minute' in not_use else ((s - wks * w - day * d - hrs * h) // m) | int -%} {%- set not_use = _abbr_to_full(not_use) | from_json -%}
{%- set sec = 0 if 'second' in not_use else (s - wks * w - day * d - hrs * h - min * m) | int -%} {%- endif -%}
{%- set ms = (s % 1 * 1000) | round | int -%} {%- set not_use = not_use + ['hour', 'minute', 'second', 'millisecond' ] if not time else not_use -%}
{# output result #} {%- if always_show in [['all'], 'all'] -%}
{%- set output = dict(year=yrs, month=mth | default(0), week=wks, day=day, hour=hrs, minute=min, second=sec, millisecond=ms) %} {%- set always_show = dur.keys() | list -%}
{{- dict(output.items() | rejectattr('0', 'in', not_use)) | to_json -}} {%- elif always_show != [] -%}
{%- set always_show = _abbr_to_full(always_show) | from_json | reject('in' , not_use) | list -%}
{%- endif -%}
{%- set always_show = always_show | reject('in', not_use) | list -%}
{%- set do_use = dur.keys() | reject('in', not_use) | list -%}
{# determine number of milliseconds #}
{%- set ms = ((date_max - date_min).total_seconds() * 1000) | round(0, 'ceil')-%}
{# 2: Check if the number of milliseconds is more then the duration of the last time part to output #}
{%- if do_use and ms < dur[do_use|last] -%}
{{- {do_use | last: (ms / dur[do_use|last]) | round(0, round_mode)} | to_json -}}
{%- else -%}
{# check if it is needed to determine years #}
{%- if ms >= dur.day * 365 -%}
{#- set numer of years, and set highest date using this number of years #}
{%- set yrs = date_max.year - date_min.year - (1 if date_max.replace(year=date_min.year) < date_min else 0) -%}
{%- set date_max = date_max.replace(year=date_max.year - yrs) -%}
{%- set ms = (date_max - date_min).total_seconds() * 1000 -%}
{%- set ms_yrs = ms -%}
{%- endif -%}
{%- set yrs = yrs | default(0) -%}
{# check if it is needed to determine months #}
{%- set check_mth =
ms >= dur.day * 28
and 'month' in do_use
-%}
{%- if check_mth -%}
{#- set numer of months, and set highest date using this number of months #}
{%- set ns = namespace(dm=date_max, mth=0) -%}
{%- set dmd = ns.dm.day -%}
{%- for m in range(1, 12) -%}
{%- set dmm, dmy = ns.dm.month, ns.dm.year -%}
{%- set day_max = (ns.dm.replace(day=1) - timedelta(days=1)).day -%}
{%- set dm = ns.dm.replace(
month=12 if dmm == 1 else dmm - 1,
year=dmy - 1 if dmm == 1 else dmy,
day= [dmd, day_max] | min
)
-%}
{%- if dm < date_min -%}
{%- break -%}
{%- else -%}
{%- set ns.mth = ns.mth + 1 -%}
{%- set ns.dm = dm -%}
{%- endif -%}
{%- endfor -%}
{%- set date_max, mth = ns.dm, ns.mth -%}
{%- set mth = mth + yrs * 12 if 'year' in not_use else mth -%}
{%- set ms = (date_max - date_min).total_seconds() * 1000 -%}
{%- endif -%}
{%- set mth = mth | default(0) -%}
{# prepare for other time parts #}
{%- set date_max = date_max.replace(year=date_max.year + yrs) if 'year' in not_use and 'month' in not_use else date_max -%}
{#- set other time period variables #}
{%- set ms = ((date_max - date_min).total_seconds() * 1000 + extra_days | default(0) * dur.day) | round(0) -%}
{%- set wks = (ms // dur.week) | int -%}
{%- set days = ((ms % dur.week // dur.day) + (wks * dur.week / dur.day if 'week' in not_use else 0)) | int -%}
{%- set hrs = ((ms % dur.day // dur.hour) + (days * dur.day / dur.hour if 'day' in not_use else 0)) | int -%}
{%- set min = ((ms % dur.hour // dur.minute) + (hrs * dur.hour / dur.minute if 'hour' in not_use else 0)) | int -%}
{%- set sec = ((ms % dur.minute // dur.second) + (min * dur.minute / dur.second if 'minute' in not_use else 0)) | int -%}
{%- set mis = ((ms % dur.second) | round + (sec * dur.second if 'second' in not_use else 0)) | int -%}
{# prepare dict with ouput #}
{%- set output = dict(year=yrs, month=mth | default(0), week=wks, day=days, hour=hrs, minute=min, second=sec, millisecond=mis) -%}
{%- set output = dict(output.items() | selectattr('0', 'in', do_use)) -%}
{%- set keys = output.keys() | list -%}
{%- set with_value = output.items() | rejectattr('1', 'eq', 0) | map(attribute='0') | list -%}
{%- set first = with_value | first | default('millisecond') -%}
{%- set first = keys | select('in', always_show | default([], true) + [first]) | first -%}
{%- set to_use = keys[keys.index(first):] -%}
{%- set to_output = to_use[:parts] -%}
{%- set last = to_output | last |default('millisecond') -%}
{# 3: check if there is anything left to use #}
{%- if to_use -%}
{%- set to_output = to_use[:parts] -%}
{%- set always_return = to_output | last -%}
{# check if all values for always_show are included #}
{%- set as_check = always_show | reject('in', to_output) | list | count -%}
{%- if always_show and as_check > 0 -%}
{%- set to_reject = to_use | reject('in', to_output) | reject('in', always_show) | list -%}
{%- set not_use = not_use + to_output[as_check*-1:] + to_reject -%}
{%- set to_output = to_output | reject('in', not_use) | list + always_show -%}
{%- set to_output = keys | select('in', to_output) | list -%}
{%- set output = time_split(date, parts, compare_date, not_use, always_show, time, round_mode) | from_json -%}
{%- endif -%}
{# apply round if needed #}
{%- if round_mode in ['common', 'ceil'] and last != 'millisecond' -%}
{# determine first and last item with data #}
{%- set ms = ms_yrs if last == 'year' else ms -%}
{%- set remain = ms % dur[last] -%}
{%- set remain_part = remain / dur[last] -%}
{%- set to_round = 1 if remain_part >= 0.5 and round_mode == 'common' else remain_part | round(0, round_mode) -%}
{%- set sec_to_add = ((dur[last] + (dur.day if last in ['year', 'month'] else 1) - remain) | round(0, 'ceil') * to_round) / 1000 -%}
{%- set round_mode = 'floor' -%}
{%- set date_max = [compare_date, date] | max + timedelta(seconds=sec_to_add) -%}
{%- set date_min = [compare_date, date] | min -%}
{%- set output = time_split(date_max, parts, date_min, not_use, always_show, time, round_mode) | from_json -%}
{%- endif -%}
{# output result #}
{%- set zero_values = output.items() | selectattr('1', 'eq', 0) | map(attribute='0') | list -%}
{%- set reject_list = zero_values | reject('in', always_show) | list -%}
{{- dict(output.items() | selectattr('0', 'in', to_output) | rejectattr('0', 'in', reject_list)) | default({always_return: 0}, true) | to_json -}}
{%- else -%} {{- dict(error='No time parts left to output') | to_json -}}
{%- endif -%} {# 3 #}
{%- endif -%} {# 2 #}
{%- else -%} {{- dict(error='Invalid date input') | to_json -}}
{%- endif -%} {# 1 #}
{%- endmacro -%} {%- endmacro -%}
{# macro to output a timedelta in a readable format #} {# macro to output a timedelta in a readable format #}
{%- macro relative_time_plus(date, parts=1, abbr=false, verbose=false, language='en', compare_date=now(), month=none, week=none, millisecond=none, not_use=['millisecond'], always_show=[], time=true) -%} {%- macro relative_time_plus(date, parts=1, abbr=false, language='en', compare_date=now(), not_use=['millisecond'], always_show=[], time=true, round_mode='floor') -%}
{#- set defaults for input if not entered #}
{%- set date = date if date is datetime else date | as_datetime -%}
{%- set compare_date = compare_date if compare_date is datetime else compare_date | as_datetime -%}
{#- select correct phrases bases on language input #} {#- select correct phrases bases on language input #}
{%- set phrases = _time_period_phrases -%} {%- set phrases = _time_period_phrases -%}
{%- set languages = phrases | map(attribute='language') | list -%} {%- set languages = phrases | map(attribute='language') | list -%}
{%- set language = iif(language in languages, language, 'en') -%} {%- set language = iif(language in languages, language, 'en') -%}
{%- set phr = phrases | selectattr('language', 'eq', language) | map(attribute='phrases') | list | first -%} {%- set phr = phrases | selectattr('language', 'eq', language) | map(attribute='phrases') | list | first -%}
{#- perform smart stuff #} {%- set abbr = abbr | bool(false) -%}
{%- if date is datetime and compare_date is datetime -%} {# split timedelta #}
{# determine not_use list #} {%- set time_parts = time_split(date, parts, compare_date, not_use, always_show, time, round_mode) | from_json -%}
{%- set abbr_to_full = dict(yr='year', mth='month', wk='week', hr='hour', min='minute', sec='second', ms='millisecond') -%} {# check for error #}
{%- set add = [('month', month),('week',week),('millisecond',millisecond)] | selectattr('1', 'eq', false) | map(attribute='0') | list -%} {%- if 'error' in time_parts -%}
{%- set not_use = not_use if not_use is list else (not_use | replace(' ', '')).split(',') -%} {{- time_parts['error'] -}}
{%- set not_use = (not_use + add) | unique | list -%}
{%- if not_use | select('in', abbr_to_full) | list | count > 0 -%}
{%- set ns = namespace(not_use=[]) -%}
{%- for i in not_use -%}
{%- set ns.not_use = ns.not_use + [abbr_to_full[i] | default(i)] -%}
{%- endfor -%}
{%- set not_use = ns.not_use | unique | list -%}
{%- endif -%}
{# set variables #}
{%- set date, compare_date = date | as_local, compare_date | as_local -%}
{%- set parts = parts | int(1) -%}
{%- set time = time | bool(true) -%}
{%- set abbr = abbr | bool(false) or verbose | bool(false) -%}
{# split timedelta #}
{%- set time_parts = time_split(date, compare_date, time, not_use) | from_json -%}
{#- find first non zero time period #}
{%- set time_periods = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'] -%}
{%- set do_use = time_periods | reject('in', not_use) | list -%}
{# continue if there are still time periods to use #}
{%- if do_use | count > 0 -%}
{%- set always_return = do_use | last -%}
{%- set always_show = always_show if always_show is list else (always_show | replace(' ', '')).split(',') -%}
{%- if always_show | select('in', abbr_to_full) | list | count > 0 -%}
{%- set ns = namespace(always_show=[]) -%}
{%- for i in always_show -%}
{%- set ns.always_show = ns.always_show + [abbr_to_full[i] | default(i)] -%}
{%- endfor -%}
{%- set always_show = ns.always_show | unique | list -%}
{%- endif -%}
{%- set parts = [parts, always_show | count] | max -%}
{%- set to_show = (time_parts.items() | selectattr('1') | map(attribute='0') | list + always_show) | unique | list | default([always_return], true) -%}
{%- set first = do_use | select('in', to_show) | first -%}
{#-select itemw to show based on input #}
{%- set index_first = (time_parts.keys() | list).index(first) -%}
{%- set items = (time_parts.keys() | list)[index_first:index_first + parts] -%}
{# convert to phrases #}
{%- set ns = namespace(phrases=[]) -%}
{%- for i in items if i in to_show or i == first -%}
{%- set phr_abbr = phr[i][2] -%}
{%- set phr_verb = phr[i][1] if time_parts[i] != 1 else phr[i][0] -%}
{%- set phrase = '{} {}'.format(time_parts[i], phr_abbr if abbr else phr_verb) -%}
{%- set ns.phrases = ns.phrases + [phrase] -%}
{%- endfor -%}
{#- join phrases in a string, using phr.combine for the last item #}
{{- '{} {} {}'.format(ns.phrases[:-1] | join(', '), phr.combine, ns.phrases[-1]) if ns.phrases | count > 1 else ns.phrases | first -}}
{%- else -%}
All time periods are excluded
{%- endif -%}
{%- else -%} {%- else -%}
{{- phr.error -}} {# convert to phrases #}
{%- set ns = namespace(phrases=[]) -%}
{%- for i in time_parts.keys() -%}
{%- set phr_abbr = phr[i][2] -%}
{%- set phr_verb = phr[i][1] if time_parts[i] != 1 else phr[i][0] -%}
{%- set phrase = '{} {}'.format(time_parts[i], phr_abbr if abbr else phr_verb) -%}
{%- set ns.phrases = ns.phrases + [phrase] -%}
{%- endfor -%}
{#- join phrases in a string, using phr.combine for the last item #}
{{- '{} {} {}'.format(ns.phrases[:-1] | join(', '), phr.combine, ns.phrases[-1]) if ns.phrases | count > 1 else ns.phrases | first -}}
{%- endif -%} {%- endif -%}
{%- endmacro -%} {%- endmacro -%}