xref: /webtrees/app/Html.php (revision 5bfc689774bb9a6401271c4ed15a6d50652c991b)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2022 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees;
21
22use function e;
23use function http_build_query;
24use function implode;
25use function is_int;
26use function is_string;
27use function strtr;
28
29use const PHP_QUERY_RFC3986;
30
31/**
32 * Class Html - Add HTML markup to elements consistently.
33 */
34class Html
35{
36    /**
37     * Convert an array of HTML attributes to an HTML string.
38     *
39     * @param array<string,string|int|bool> $attributes
40     *
41     * @return string
42     */
43    public static function attributes(array $attributes): string
44    {
45        $html = [];
46        foreach ($attributes as $key => $value) {
47            if (is_string($value)) {
48                $html[] = e($key) . '="' . e($value) . '"';
49            } elseif (is_int($value)) {
50                $html[] = e($key) . '="' . $value . '"';
51            } elseif ($value === true) {
52                $html[] = e($key) . '="' . e($key) . '"';
53            }
54        }
55
56        return implode(' ', $html);
57    }
58
59    /**
60     * Encode a URL.
61     *
62     * @param string                                    $path
63     * @param array<bool|int|string|array<string>|null> $data
64     *
65     * @return string
66     */
67    public static function url(string $path, array $data): string
68    {
69        $path = strtr($path, [' ' => '%20']);
70
71        if ($data !== []) {
72            $path .= '?' . http_build_query($data, '', '&', PHP_QUERY_RFC3986);
73        }
74
75        return $path;
76    }
77
78    /**
79     * Filenames are (almost?) always LTR, even on RTL systems.
80     *
81     * @param string $filename
82     *
83     * @return string
84     */
85    public static function filename(string $filename): string
86    {
87        return '<samp class="filename" dir="ltr">' . e($filename) . '</samp>';
88    }
89}
90