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