PluginProbe ʕ •ᴥ•ʔ
Smash Balloon Social Post Feed – Simple Social Feeds for WordPress / 4.12.0
Smash Balloon Social Post Feed – Simple Social Feeds for WordPress v4.12.0
4.12.0 4.10.0 4.9.0 4.8.1 trunk 1.0 1.1 1.12.1 1.2.3 1.2.4 1.2.5 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.5 1.5.1 1.5.2 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.5.1 1.6.6 1.6.6.1 1.6.6.2 1.6.6.3 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.9.0 1.9.1 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.8.1 1.9.9 1.9.9.1 1.9.9.2 1.9.9.3 2.0 2.0.1 2.1 2.1.1 2.1.2 2.1.3 2.10 2.11 2.11.1 2.12 2.12.1 2.12.2 2.12.3 2.12.4 2.13 2.14 2.14.1 2.15 2.15.1 2.16 2.16.1 2.17 2.17.1 2.18 2.18.1 2.18.2 2.18.3 2.19 2.19.1 2.19.2 2.19.3 2.2 2.2.1 2.3 2.3.1 2.3.10 2.3.2 2.3.3 2.3.4 2.3.6 2.3.7 2.3.8 2.3.9 2.4 2.4.1 2.4.1.1 2.4.1.2 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5 2.5.1 2.5.2 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.7 2.7.1 2.7.2 2.8 2.9 2.9.1 4.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.1 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.3.0 4.3.1 4.3.2 4.3.3 4.3.4 4.7.5 4.7.6 4.7.7
custom-facebook-feed / inc / CFF_Autolink.php
custom-facebook-feed / inc Last commit date
Admin 2 weeks ago Builder 2 weeks ago Helpers 2 weeks ago Integrations 2 weeks ago UsageTracking 2 weeks ago CFF_Autolink.php 2 weeks ago CFF_Blocks.php 2 weeks ago CFF_Cache.php 2 weeks ago CFF_Education.php 2 weeks ago CFF_Elementor_Base.php 2 weeks ago CFF_Elementor_Widget.php 2 weeks ago CFF_Error_Reporter.php 2 weeks ago CFF_FB_Settings.php 2 weeks ago CFF_Feed_Elementor_Control.php 2 weeks ago CFF_Feed_Locator.php 2 weeks ago CFF_Feed_Pro.php 2 weeks ago CFF_GDPR_Integrations.php 2 weeks ago CFF_Group_Posts.php 2 weeks ago CFF_HTTP_Request.php 2 weeks ago CFF_Oembed.php 2 weeks ago CFF_Parse.php 2 weeks ago CFF_Resizer.php 2 weeks ago CFF_Response.php 2 weeks ago CFF_Shortcode.php 2 weeks ago CFF_Shortcode_Display.php 2 weeks ago CFF_SiteHealth.php 2 weeks ago CFF_Utils.php 2 weeks ago CFF_View.php 2 weeks ago Custom_Facebook_Feed.php 2 weeks ago Email_Notification.php 2 weeks ago Platform_Data.php 2 weeks ago SB_Facebook_Data_Encryption.php 2 weeks ago SB_Facebook_Data_Manager.php 2 weeks ago index.php 2 weeks ago
CFF_Autolink.php
305 lines
1 <?php
2
3 /**
4 * Autolink
5 *
6 * @since 2.19
7 */
8
9 namespace CustomFacebookFeed;
10
11 if (!defined('ABSPATH')) {
12 exit; // Exit if accessed directly
13 }
14
15 class CFF_Autolink
16 {
17 public static function cff_autolink($text = '', $link_color = '', $span_tag = false, $limit = 100, $tagfill = 'class="cff-break-word"', $auto_title = true)
18 {
19 $text = self::cff_autolink_do($text, $link_color, '![a-z][a-z-]+://!i', $limit, $tagfill, $auto_title, $span_tag);
20 $text = self::cff_autolink_do($text, $link_color, '!(mailto|skype):!i', $limit, $tagfill, $auto_title, $span_tag);
21 $text = self::cff_autolink_do($text, $link_color, '!www\\.!i', $limit, $tagfill, $auto_title, 'http://', $span_tag);
22 return $text;
23 }
24
25 public static function cff_autolink_do($text, $link_color, $sub, $limit, $tagfill, $auto_title, $span_tag, $force_prefix = null)
26 {
27 $text_l = StrToLower($text);
28 $cursor = 0;
29 $loop = 1;
30 $buffer = '';
31
32 $autolink_options = [
33 // Should http:// be visibly stripped from the front
34 // of URLs?
35 'strip_protocols' => true,
36 ];
37
38 while (($cursor < strlen($text)) && $loop) {
39 $ok = 1;
40 $matched = preg_match($sub, $text_l, $m, PREG_OFFSET_CAPTURE, $cursor);
41
42 if (!$matched) {
43 $loop = 0;
44 $ok = 0;
45 } else {
46 $pos = $m[0][1];
47 $sub_len = strlen($m[0][0]);
48
49 $pre_hit = substr($text, $cursor, $pos - $cursor);
50 $hit = substr($text, $pos, $sub_len);
51 $pre = substr($text, 0, $pos);
52 $post = substr($text, $pos + $sub_len);
53
54 $fail_text = $pre_hit . $hit;
55 $fail_len = strlen($fail_text);
56
57 //
58 // substring found - first check to see if we're inside a link tag already...
59 //
60
61 $bits = preg_split("!</a>!i", $pre);
62 $last_bit = array_pop($bits);
63 if (preg_match("!<a\s!i", $last_bit)) {
64 // echo "fail 1 at $cursor<br />\n";
65
66 $ok = 0;
67 $cursor += $fail_len;
68 $buffer .= $fail_text;
69 }
70 }
71
72 //
73 // looks like a nice spot to autolink from - check the pre
74 // to see if there was whitespace before this match
75 //
76
77 if ($ok) {
78 if ($pre) {
79 if (!preg_match('![\s\(\[\{>]$!s', $pre)) {
80 // echo "fail 2 at $cursor ($pre)<br />\n";
81
82 $ok = 0;
83 $cursor += $fail_len;
84 $buffer .= $fail_text;
85 }
86 }
87 }
88
89 //
90 // we want to autolink here - find the extent of the url
91 //
92
93 if ($ok) {
94 if (preg_match('/^([a-z0-9\-\.\/\-_%~!?=,:;&+*#@\(\)\$]+)/i', $post, $matches)) {
95 $url = $hit . $matches[1];
96
97 $cursor += strlen($url) + strlen($pre_hit);
98 $buffer .= $pre_hit;
99
100 $url = html_entity_decode($url);
101
102
103 //
104 // remove trailing punctuation from url
105 //
106
107 while (preg_match('|[.,!;:?]$|', $url)) {
108 $url = substr($url, 0, strlen($url) - 1);
109 $cursor--;
110 }
111 foreach (array('()', '[]', '{}') as $pair) {
112 $o = substr($pair, 0, 1);
113 $c = substr($pair, 1, 1);
114 if (preg_match("!^(\\$c|^)[^\\$o]+\\$c$!", $url)) {
115 $url = substr($url, 0, strlen($url) - 1);
116 $cursor--;
117 }
118 }
119
120
121 //
122 // nice-i-fy url here
123 //
124
125 $link_url = $url;
126 $display_url = $url;
127
128 if ($force_prefix) {
129 $link_url = $force_prefix . $link_url;
130 }
131
132 if ($autolink_options['strip_protocols']) {
133 if (preg_match('!^(http|https)://!i', $display_url, $m)) {
134 $display_url = substr($display_url, strlen($m[1]) + 3);
135 }
136 }
137
138 $display_url = self::cff_autolink_label($display_url, $limit);
139
140
141 //
142 // add the url
143 //
144
145 if ($display_url != $link_url && !preg_match('@title=@msi', $tagfill) && $auto_title) {
146 $display_quoted = preg_quote($display_url, '!');
147
148 if (!preg_match("!^(http|https)://{$display_quoted}$!i", $link_url)) {
149 $tagfill .= ' title="' . $link_url . '"';
150 }
151 }
152
153 $link_url_enc = HtmlSpecialChars($link_url);
154 $display_url_enc = HtmlSpecialChars($display_url);
155
156
157 if (substr($link_url_enc, 0, 4) !== "http") {
158 $link_url_enc = 'https://' . $link_url_enc;
159 }
160 $buffer .= "<a href=\"{$link_url_enc}\" rel='nofollow noopener noreferrer'>{$display_url_enc}</a>";
161 } else {
162 // echo "fail 3 at $cursor<br />\n";
163
164 $ok = 0;
165 $cursor += $fail_len;
166 $buffer .= $fail_text;
167 }
168 }
169 }
170
171 //
172 // add everything from the cursor to the end onto the buffer.
173 //
174
175 $buffer .= substr($text, $cursor);
176
177 return $buffer;
178 }
179
180
181 public static function cff_autolink_label($text, $limit)
182 {
183 if (!$limit) {
184 return $text;
185 }
186
187 if (strlen($text) > $limit) {
188 return substr($text, 0, $limit - 3) . '...';
189 }
190
191 return $text;
192 }
193
194
195 public static function cff_autolink_email($text = '', $tagfill = '')
196 {
197 $atom = '[^()<>@,;:\\\\".\\[\\]\\x00-\\x20\\x7f]+'; // from RFC822
198
199 // die($atom);
200
201 $text_l = StrToLower($text);
202 $cursor = 0;
203 $loop = 1;
204 $buffer = '';
205
206 while (($cursor < strlen($text)) && $loop) {
207 //
208 // find an '@' symbol
209 //
210
211 $ok = 1;
212 $pos = strpos($text_l, '@', $cursor);
213
214 if ($pos === false) {
215 $loop = 0;
216 $ok = 0;
217 } else {
218 $pre = substr($text, $cursor, $pos - $cursor);
219 $hit = substr($text, $pos, 1);
220 $post = substr($text, $pos + 1);
221
222 $fail_text = $pre . $hit;
223 $fail_len = strlen($fail_text);
224
225 // die("$pre::$hit::$post::$fail_text");
226
227 //
228 // substring found - first check to see if we're inside a link tag already...
229 //
230
231 $bits = preg_split("!</a>!i", $pre);
232 $last_bit = array_pop($bits);
233 if (preg_match("!<a\s!i", $last_bit)) {
234 // echo "fail 1 at $cursor<br />\n";
235
236 $ok = 0;
237 $cursor += $fail_len;
238 $buffer .= $fail_text;
239 }
240 }
241
242 //
243 // check backwards
244 //
245
246 if ($ok) {
247 if (preg_match("!($atom(\.$atom)*)\$!", $pre, $matches)) {
248 // move matched part of address into $hit
249
250 $len = strlen($matches[1]);
251 $plen = strlen($pre);
252
253 $hit = substr($pre, $plen - $len) . $hit;
254 $pre = substr($pre, 0, $plen - $len);
255 } else {
256 // echo "fail 2 at $cursor ($pre)<br />\n";
257
258 $ok = 0;
259 $cursor += $fail_len;
260 $buffer .= $fail_text;
261 }
262 }
263
264 //
265 // check forwards
266 //
267
268 if ($ok) {
269 if (preg_match("!^($atom(\.$atom)*)!", $post, $matches)) {
270 // move matched part of address into $hit
271
272 $len = strlen($matches[1]);
273
274 $hit .= substr($post, 0, $len);
275 $post = substr($post, $len);
276 } else {
277 // echo "fail 3 at $cursor ($post)<br />\n";
278
279 $ok = 0;
280 $cursor += $fail_len;
281 $buffer .= $fail_text;
282 }
283 }
284
285 //
286 // commit
287 //
288
289 if ($ok) {
290 $cursor += strlen($pre) + strlen($hit);
291 $buffer .= $pre;
292 $buffer .= "<a href=\"mailto:$hit\"$tagfill>$hit</a>";
293 }
294 }
295
296 //
297 // add everything from the cursor to the end onto the buffer.
298 //
299
300 $buffer .= substr($text, $cursor);
301
302 return $buffer;
303 }
304 }
305