diff --git a/application/source/data/transformer.mjs b/application/source/data/transformer.mjs index 4e9fe3fe868254c6ada300534119c0ee260901a7..3bc54736c8be59f19c12481c7e7fd5d9007f5586 100644 --- a/application/source/data/transformer.mjs +++ b/application/source/data/transformer.mjs @@ -5,6 +5,7 @@ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html */ +import {getLocaleOfDocument} from "../dom/locale.mjs"; import {Base} from "../types/base.mjs"; import {getGlobal, getGlobalObject} from "../types/global.mjs"; import {ID} from "../types/id.mjs"; @@ -169,6 +170,11 @@ function transform(value) { let element; let attribute; let translations; + let date; + let locale; + let timestamp; + let map; + let keyValue; switch (this.command) { case "static": @@ -405,25 +411,25 @@ function transform(value) { if (key === undefined) { throw new Error("missing key parameter"); } - + // add empty strings - if (isString(key)&&key.trim()==="") { - concat += key; + if (isString(key) && key.trim() === "") { + concat += key; continue; } - + if (!pf2.exists(key)) { concat += key; continue; } let v = pf2.getVia(key); - if(!isPrimitive(v)) { + if (!isPrimitive(v)) { throw new Error("value is not primitive"); } concat += v; } - + return concat; case "path": key = args.shift(); @@ -491,6 +497,117 @@ function transform(value) { throw new Error("type not supported"); + + case "map": + map = new Map(); + while (args.length > 0) { + keyValue = args.shift(); + if (keyValue === undefined) { + throw new Error("missing key parameter"); + } + + keyValue = keyValue.split("="); + map.set(keyValue[0], keyValue[1]); + } + + return map.get(value); + + case "timestamp": + date = new Date(value); + timestamp = date.getTime(); + if (isNaN(timestamp)) { + throw new Error("invalid date"); + } + return timestamp; + + case "time": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + try { + locale = getLocaleOfDocument(); + return date.toLocaleTimeString(locale); + + } catch (e) { + throw new Error("unsupported locale or missing format (" + e.message + ")"); + } + + + case "year": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getFullYear(); + + case "month": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getMonth() + 1; + + case "day": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getDate(); + + case "weekday": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getDay(); + + case "hour": + case "hours": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getHours(); + + case "minute": + case "minutes": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getMinutes(); + + case "second": + case "seconds": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + return date.getSeconds(); + + case "date": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + try { + locale = getLocaleOfDocument(); + return date.toLocaleDateString(locale); + + } catch (e) { + throw new Error("unsupported locale or missing format (" + e.message + ")"); + } + case "i18n": case "translation": translations = getDocumentTranslations(); diff --git a/development/test/cases/data/transformer.mjs b/development/test/cases/data/transformer.mjs index f2991d44755830e9383759b5eb98ca80df55ea22..1bb7aa2ffd66ff6ec9bb84a4704ec897b7b2e27d 100644 --- a/development/test/cases/data/transformer.mjs +++ b/development/test/cases/data/transformer.mjs @@ -27,6 +27,17 @@ describe('Transformer', function () { describe('Transformer.run()', function () { [ + ['map:a=4:b=5:c=6', "a", "4"], + ['date', "2023-02-14", "14.2.2023"], + ['year', "2023-02-14", 2023], + ['month', "2023-02-14", 2], + ['day', "2023-02-14", 14], + ['weekday', "2023-02-14", 2], + ['minutes', "2023-02-14 06:12:21", 12], + ['seconds', "2023-02-14 06:12:21", 21], + ['hours', "2023-02-14 06:12:21", 6], + ['time', "2023-02-14 06:12:21", "06:12:21"], + ['timestamp', "2023-02-14", 1676332800000], ['concat:a.b.c:test:a.b.d', {a: {b: {c: 4, d: 6}}}, "4test6"], ['concat:a.b.c:\\ \\ :a.b.d', {a: {b: {c: 4, d: 6}}}, "4 6"], ['concat:a.b.c:,:a.b.d', {a: {b: {c: 4, d: 6}}}, "4,6"],