From de9cae795f93d03e68d965c59af4b21d96df4ec7 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Mon, 23 Dec 2024 10:39:16 -0500 Subject: initial --- src/lib/lang.php | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/lib/lang.php (limited to 'src/lib/lang.php') diff --git a/src/lib/lang.php b/src/lib/lang.php new file mode 100644 index 0000000..84a4215 --- /dev/null +++ b/src/lib/lang.php @@ -0,0 +1,186 @@ + +/// +/// This file is part of CRIMSON. +/// +/// CRIMSON is free software; you can redistribute it and/or modify it +/// under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 3 of the License, or (at +/// your option) any later version. +/// +/// CRIMSON is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with CRIMSON. If not, see . + +/** + * Returns the lang string for the provided $key + * + * $key - The key of the lang string + * $default - The string to use if lang string $key is undefined + * $sub - List of values to substitute using php's sprinf + */ +function lang( + string $key, + ?string $default = NULL, + ?array $sub = NULL +): string { + $lang = ROUTER->get_lang(); + $result = NULL; + + // lookup lang key + if (isset($lang[$key])) + $result = $lang[$key]; + + // replace with $default if undefined + if ($result === NULL && $default !== NULL) + $result = $default; + + // error if undefined + if ($result === NULL) { + CRIMSON_WARNING('Undefined lang string: ' . $key); + return $key; + } + + // make substitutions + if ($sub) { + if (!is_array($sub)) + $sub = [$sub]; + $result = sprintf($result, ...$sub); + } + + return $result; +} + +/** + * Returns a html element (button, a, div, ...) containing content from + * the lang string, icon, aria tags, and/or tooltips. Text content and icon + * are contained in a seconed inner html element (span, h1, ...). + * + * ilang has up to four parts: text, tooltip, icon class, and icon content. + * Each part is loaded from a different lang string using $key as the prefix. + * + * == LANG_KEYS == + * + * NAME | LANG KEY | REQUIRED | DESCRIPTION + * -------------------------------------------------------------------------- + * text | $key_text | yes | The text content of the element. Text + * | | | content will always uppercase the first + * | | | letter. + * tip | $key_tip | no | The tool tip of the element. + * icon | $key_icon | no | Adds a element with the class + * | | | . + * content | $key_content | no | If icon, adds as the + * | | | inner html of the icon. + * + * == ARGUMENTS == + * + * NAME | REQUIRED | DEFAULT | DESCRIPTION + * --------------------------------------------------------------------------- + * $key | yes | | The key of the interface lang string. + * $class | no | | The class of the html element. + * $id | no | | The id of the html element. + * $sub | no | [] | Substitution arguments passed into lang() + * | | | in both $key_text and $key_tip. + * $type | no | 'a' | Sets the type of the html element. + * $subtype | no | 'span' | Sets the type of the inner html element. + * $attrs | no | array() | Sets html attributes using the key/value + * | | | pairs from $attrs. $class, $id, $href, and + * | | | and $onclick are all short hand for + * | | | $attrs['']; Named attr arguments take + * | | | priority over any defined in $attrs. + * $style | no | | $attrs['style'] = $style. + * $href | no | | $attrs['href'] = $href. $type = 'a'; + * $onclick | no | | $attrs['onclick'] = $onclick. $type = 'button'. + * + * NOTE: For any non required argument that is falsy, it is converted back to + * its default value. + * + * NOTE: For any non required argument that does not have a default value + * listed, falsy values turn off that attribute or functionality. + * + * WARNING: $href and $onclick also modify the default $type. If $type is + * passed to ilang, that type will be used instead. + * + * WARNING: Lang strings WILL be html escaped along with each atribute value. + * Everything else will not be sanitized by this function. + */ +function ilang( + string $key, + ?string $class = NULL, + ?string $id = NULL, + array $sub = [], + ?string $type = NULL, + string $subtype = 'span', + array $attrs = array(), + ?string $style = NULL, + ?string $href = NULL, + ?string $onclick = NULL, +): string { + // read lang keys + $text = lang("{$key}_text", sub: $sub); + $tip = lang("{$key}_tip", '', sub: $sub); + $icon = lang("{$key}_icon", ''); + $content = lang("{$key}_content", ''); + + // uppercase + $text = ucfirst($text); + + // set $type if falsy + if (!$type) { + if ($href) + $type = 'a'; + else if ($onclick) + $type = 'button'; + else + $type = 'a'; + } + + // populate $attrs with named arguments + if ($tip) { + $attrs['title'] = $tip; + $attrs['aria-label'] = $tip; + } + if ($class) + $attrs['class'] = "{$class} ilang"; + else + $attrs['class'] = "ilang"; + if ($id) + $attrs['id'] = $id; + if ($style) + $attrs['style'] = $style; + if ($href) + $attrs['href'] = $href; + if ($onclick) + $attrs['onclick'] = $onclick; + + $html = ""; + // open tag + $html .= "<{$type}"; + foreach ($attrs as $key => $value) { + $value = esc($value, TRUE); // html tag & string escape + $html .= " {$key}=\"{$value}\""; + } + $html .= ">"; + // icon + if ($icon) { + $icon = esc($icon, TRUE); // html tag & string escape + $html .= ""; + if ($content) { + $content = esc($content); // html tag escape + $html .= "{$content}"; + } + $html .= ""; + } + // content + $text = esc($text); // html tag escape + $html .= "<{$subtype}>{$text}"; + // close tag + $html .= ""; + + return $html; +} -- cgit v1.2.3-freya