Exemple #1
0
 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]");