PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.6.4
Jetpack – WP Security, Backup, Speed, & Growth v12.6.4
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / nojimage / twitter-text-php / lib / Twitter / Text / HitHighlighter.php
jetpack / vendor / nojimage / twitter-text-php / lib / Twitter / Text Last commit date
Autolink.php 5 years ago Configuration.php 5 years ago EmojiRegex.php 5 years ago Extractor.php 5 years ago HitHighlighter.php 5 years ago ParseResults.php 5 years ago Parser.php 5 years ago Regex.php 5 years ago StringUtils.php 5 years ago TldLists.php 5 years ago Validator.php 5 years ago
HitHighlighter.php
191 lines
1 <?php
2
3 /**
4 * @author Nick Pope <nick@nickpope.me.uk>
5 * @copyright Copyright © 2010, Nick Pope
6 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
7 * @package Twitter.Text
8 */
9
10 namespace Twitter\Text;
11
12 /**
13 * Twitter HitHighlighter Class
14 *
15 * Performs "hit highlighting" on tweets that have been auto-linked already.
16 * Useful with the results returned from the search API.
17 *
18 * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
19 * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
20 * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
21 *
22 * @author Nick Pope <nick@nickpope.me.uk>
23 * @copyright Copyright © 2010, Nick Pope
24 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
25 * @package Twitter.Text
26 */
27 class HitHighlighter
28 {
29
30 /**
31 * The tag to surround hits with.
32 *
33 * @var string
34 */
35 protected $tag = 'em';
36
37 /**
38 * The tweet to be used in parsing.
39 *
40 * @var string
41 * @deprecated will be removed
42 */
43 protected $tweet = '';
44
45 /**
46 * Provides fluent method chaining.
47 *
48 * @param string $tweet [deprecated] The tweet to be hit highlighted.
49 * @param bool $full_encode [deprecated] Whether to encode all special characters.
50 *
51 * @see __construct()
52 *
53 * @return HitHighlighter
54 */
55 public static function create($tweet = null, $full_encode = false)
56 {
57 return new self($tweet, $full_encode);
58 }
59
60 /**
61 * Reads in a tweet to be parsed and hit highlighted.
62 *
63 * We take this opportunity to ensure that we escape user input.
64 *
65 * @see htmlspecialchars()
66 *
67 * @param string $tweet [deprecated] The tweet to be hit highlighted.
68 * @param bool $escape [deprecated] Whether to escape the tweet (default: true).
69 * @param bool $full_encode [deprecated] Whether to encode all special characters.
70 */
71 public function __construct($tweet = null, $escape = true, $full_encode = false)
72 {
73 if (!empty($tweet) && $escape) {
74 if ($full_encode) {
75 $this->tweet = htmlentities($tweet, ENT_QUOTES, 'UTF-8', false);
76 } else {
77 $this->tweet = htmlspecialchars($tweet, ENT_QUOTES, 'UTF-8', false);
78 }
79 } else {
80 $this->tweet = $tweet;
81 }
82 }
83
84 /**
85 * Set the highlighting tag to surround hits with. The default tag is 'em'.
86 *
87 * @return string The tag name.
88 */
89 public function getTag()
90 {
91 return $this->tag;
92 }
93
94 /**
95 * Set the highlighting tag to surround hits with. The default tag is 'em'.
96 *
97 * @param string $v The tag name.
98 *
99 * @return HitHighlighter Fluid method chaining.
100 */
101 public function setTag($v)
102 {
103 $this->tag = $v;
104 return $this;
105 }
106
107 /**
108 * Hit highlights the tweet.
109 *
110 * @param string $tweet The tweet to be hit highlighted.
111 * @param array $hits An array containing the start and end index pairs
112 * for the highlighting.
113 *
114 * @return string The hit highlighted tweet.
115 */
116 public function highlight($tweet = null, array $hits = null)
117 {
118 if ($tweet === null) {
119 $tweet = $this->tweet;
120 }
121 if (empty($hits)) {
122 return $tweet;
123 }
124 $highlightTweet = '';
125 $tags = array('<' . $this->tag . '>', '</' . $this->tag . '>');
126 # Check whether we can simply replace or whether we need to chunk...
127 if (strpos($tweet, '<') === false) {
128 $ti = 0; // tag increment (for added tags)
129 $highlightTweet = $tweet;
130 foreach ($hits as $hit) {
131 $highlightTweet = StringUtils::substrReplace($highlightTweet, $tags[0], $hit[0] + $ti, 0);
132 $ti += StringUtils::strlen($tags[0]);
133 $highlightTweet = StringUtils::substrReplace($highlightTweet, $tags[1], $hit[1] + $ti, 0);
134 $ti += StringUtils::strlen($tags[1]);
135 }
136 } else {
137 $chunks = preg_split('/[<>]/iu', $tweet);
138 $chunk = $chunks[0];
139 $chunk_index = 0;
140 $chunk_cursor = 0;
141 $offset = 0;
142 $start_in_chunk = false;
143 # Flatten the multidimensional hits array:
144 $hits_flat = call_user_func_array('array_merge', array_values($hits));
145 $hits_flat_count = count($hits_flat);
146 # Loop over the hit indices:
147 for ($index = 0; $index < $hits_flat_count; $index++) {
148 $hit = $hits_flat[$index];
149 $tag = $tags[$index % 2];
150 $placed = false;
151 while ($chunk !== null && $hit >= ($i = $offset + StringUtils::strlen($chunk))) {
152 $highlightTweet .= StringUtils::substr($chunk, $chunk_cursor);
153 if ($start_in_chunk && $hit === $i) {
154 $highlightTweet .= $tag;
155 $placed = true;
156 }
157 if (isset($chunks[$chunk_index + 1])) {
158 $highlightTweet .= '<' . $chunks[$chunk_index + 1] . '>';
159 }
160 $offset += StringUtils::strlen($chunk);
161 $chunk_cursor = 0;
162 $chunk_index += 2;
163 $chunk = (isset($chunks[$chunk_index]) ? $chunks[$chunk_index] : null);
164 $start_in_chunk = false;
165 }
166 if (!$placed && $chunk !== null) {
167 $hit_spot = $hit - $offset;
168 $highlightTweet .= StringUtils::substr($chunk, $chunk_cursor, $hit_spot - $chunk_cursor) . $tag;
169 $chunk_cursor = $hit_spot;
170 $start_in_chunk = ($index % 2 === 0);
171 $placed = true;
172 }
173 # Ultimate fallback - hits that run off the end get a closing tag:
174 if (!$placed) {
175 $highlightTweet .= $tag;
176 }
177 }
178 if ($chunk !== null) {
179 if ($chunk_cursor < StringUtils::strlen($chunk)) {
180 $highlightTweet .= StringUtils::substr($chunk, $chunk_cursor);
181 }
182 $chunks_count = count($chunks);
183 for ($index = $chunk_index + 1; $index < $chunks_count; $index++) {
184 $highlightTweet .= ($index % 2 === 0 ? $chunks[$index] : '<' . $chunks[$index] . '>');
185 }
186 }
187 }
188 return $highlightTweet;
189 }
190 }
191