public static function highlight($text, $match, &$n = null) { $n = 0; if ($match === null || $match === false || $match === "" || $text == "") { return htmlspecialchars($text); } $mtext = $text; $offsetmap = null; $flags = ""; if (is_object($match)) { if (!isset($match->preg_raw)) { $match = $match->preg_utf8; $flags = "u"; } else { if (preg_match('/[\\x80-\\xFF]/', $text)) { list($mtext, $offsetmap) = UnicodeHelper::deaccent_offsets($mtext); $match = $match->preg_utf8; $flags = "u"; } else { $match = $match->preg_raw; } } } $s = $clean_initial_nonletter = false; if ($match !== null && $match !== "") { if (str_starts_with($match, self::UTF8_INITIAL_NONLETTER)) { $clean_initial_nonletter = true; } if ($match[0] !== "{") { $match = "{(" . $match . ")}is" . $flags; } $s = preg_split($match, $mtext, -1, PREG_SPLIT_DELIM_CAPTURE); } if (!$s || count($s) == 1) { return htmlspecialchars($text); } $n = (int) (count($s) / 2); if ($offsetmap) { for ($i = $b = $o = 0; $i < count($s); ++$i) { if ($s[$i] !== "") { $o += strlen($s[$i]); $e = UnicodeHelper::deaccent_translate_offset($offsetmap, $o); $s[$i] = substr($text, $b, $e - $b); $b = $e; } } } if ($clean_initial_nonletter) { for ($i = 1; $i < count($s); $i += 2) { if ($s[$i] !== "" && preg_match('{\\A((?!\\pL|\\pN)\\X)(.*)\\z}us', $s[$i], $m)) { $s[$i - 1] .= $m[1]; $s[$i] = $m[2]; } } } for ($i = 0; $i < count($s); ++$i) { if ($i % 2 && $s[$i] !== "") { $s[$i] = '<span class="match">' . htmlspecialchars($s[$i]) . "</span>"; } else { $s[$i] = htmlspecialchars($s[$i]); } } return join("", $s); }
xassert_eqq(UnicodeHelper::utf8_prefix("a̓a̓a̓a̓a̓a̓a̓a̓", 8), "a̓a̓a̓a̓a̓a̓a̓a̓"); xassert_eqq(UnicodeHelper::utf8_prefix("a̓a̓a̓a̓a̓a̓a̓a̓", 9), "a̓a̓a̓a̓a̓a̓a̓a̓"); xassert_eqq(UnicodeHelper::utf8_word_prefix("aaaaaaaa bbb", 7), "aaaaaaaa"); xassert_eqq(UnicodeHelper::utf8_word_prefix("aaaaaaaa bbb", 8), "aaaaaaaa"); xassert_eqq(UnicodeHelper::utf8_word_prefix("aaaaaaaa bbb", 9), "aaaaaaaa"); xassert_eqq(UnicodeHelper::utf8_word_prefix("aaaaaaaa bbb", 10), "aaaaaaaa"); xassert_eqq(UnicodeHelper::utf8_glyphlen("aaaaaaaa"), 8); xassert_eqq(UnicodeHelper::utf8_glyphlen("áááááááá"), 8); xassert_eqq(UnicodeHelper::utf8_glyphlen("a̓a̓a̓a̓a̓a̓a̓a̓"), 8); xassert_eqq(prefix_word_wrap("+ ", "This is a thing to be wrapped.", "- ", 10), "+ This is\n- a thing\n- to be\n- wrapped.\n"); xassert_eqq(prefix_word_wrap("+ ", "This is a thing to be wrapped.", "- ", 9), "+ This is\n- a thing\n- to be\n- wrapped.\n"); xassert_eqq(prefix_word_wrap("+ ", "This\nis\na thing\nto\nbe wrapped.", "- ", 9), "+ This\n- is\n- a thing\n- to\n- be\n- wrapped.\n"); xassert_eqq(!!preg_match('/\\A\\pZ\\z/u', ' '), true); // deaccent tests xassert_eqq(UnicodeHelper::deaccent("Á é î ç ø U"), "A e i c o U"); $do = UnicodeHelper::deaccent_offsets("Á é î ç ø U .K"); xassert_eqq($do[0], "A e i c o U .K"); xassert_eqq(json_encode($do[1]), "[[0,0],[1,2],[3,5],[5,8],[7,11],[9,14],[14,21]]"); $regex = (object) ["preg_raw" => Text::word_regex("foo"), "preg_utf8" => Text::utf8_word_regex("foo")]; xassert_eqq(Text::highlight("Is foo bar føo bar fóó bar highlit right? foö", $regex), "Is <span class=\"match\">foo</span> bar <span class=\"match\">føo</span> bar <span class=\"match\">fóó</span> bar highlit right? <span class=\"match\">foö</span>"); // Qobject tests $q = new Qobject(["a" => 1, "b" => 2]); xassert_eqq($q->a, 1); xassert_eqq($q->b, 2); xassert_eqq(count($q), 2); xassert_eqq($q->c, null); xassert_eqq(count($q), 2); $q->c = array(); xassert_eqq(count($q), 3); $q->c[] = 1; xassert_eqq(json_encode($q->c), "[1]");