X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2FLinkUtils.php;h=9d9ae3cb29f603f6a82a8125bf3cc4b8860c1183;hb=cd9368953790bc86a9d3235fa8f60566fd733673;hp=d8dc8b5e01a2dc01112cdb5b874626012c650d10;hpb=5816801b15e1a0e53f87aa48267243bff44b5f64;p=github%2Fshaarli%2FShaarli.git
diff --git a/application/LinkUtils.php b/application/LinkUtils.php
index d8dc8b5e..9d9ae3cb 100644
--- a/application/LinkUtils.php
+++ b/application/LinkUtils.php
@@ -9,8 +9,8 @@
*/
function html_extract_title($html)
{
- if (preg_match('!
(.*?)!is', $html, $matches)) {
- return trim(str_replace("\n", ' ', $matches[1]));
+ if (preg_match('!(.*?)!is', $html, $matches)) {
+ return trim(str_replace("\n", '', $matches[1]));
}
return false;
}
@@ -70,10 +70,102 @@ function headers_extract_charset($headers)
function html_extract_charset($html)
{
// Get encoding specified in HTML header.
- preg_match('#/]+)"? */?>#Usi', $html, $enc);
+ preg_match('#/]+)["\']? */?>#Usi', $html, $enc);
if (!empty($enc[1])) {
return strtolower($enc[1]);
}
return false;
}
+
+/**
+ * Count private links in given linklist.
+ *
+ * @param array|Countable $links Linklist.
+ *
+ * @return int Number of private links.
+ */
+function count_private($links)
+{
+ $cpt = 0;
+ foreach ($links as $link) {
+ $cpt = $link['private'] == true ? $cpt + 1 : $cpt;
+ }
+
+ return $cpt;
+}
+
+/**
+ * In a string, converts URLs to clickable links.
+ *
+ * @param string $text input string.
+ * @param string $redirector if a redirector is set, use it to gerenate links.
+ *
+ * @return string returns $text with all links converted to HTML links.
+ *
+ * @see Function inspired from http://www.php.net/manual/en/function.preg-replace.php#85722
+ */
+function text2clickable($text, $redirector = '')
+{
+ $regex = '!(((?:https?|ftp|file)://|apt:|magnet:)\S+[[:alnum:]]/?)!si';
+
+ if (empty($redirector)) {
+ return preg_replace($regex, '$1', $text);
+ }
+ // Redirector is set, urlencode the final URL.
+ return preg_replace_callback(
+ $regex,
+ function ($matches) use ($redirector) {
+ return ''. $matches[1] .'';
+ },
+ $text
+ );
+}
+
+/**
+ * Auto-link hashtags.
+ *
+ * @param string $description Given description.
+ * @param string $indexUrl Root URL.
+ *
+ * @return string Description with auto-linked hashtags.
+ */
+function hashtag_autolink($description, $indexUrl = '')
+{
+ /*
+ * To support unicode: http://stackoverflow.com/a/35498078/1484919
+ * \p{Pc} - to match underscore
+ * \p{N} - numeric character in any script
+ * \p{L} - letter from any language
+ * \p{Mn} - any non marking space (accents, umlauts, etc)
+ */
+ $regex = '/(^|\s)#([\p{Pc}\p{N}\p{L}\p{Mn}]+)/mui';
+ $replacement = '$1#$2';
+ return preg_replace($regex, $replacement, $description);
+}
+
+/**
+ * This function inserts where relevant so that multiple spaces are properly displayed in HTML
+ * even in the absence of (This is used in description to keep text formatting).
+ *
+ * @param string $text input text.
+ *
+ * @return string formatted text.
+ */
+function space2nbsp($text)
+{
+ return preg_replace('/(^| ) /m', '$1 ', $text);
+}
+
+/**
+ * Format Shaarli's description
+ *
+ * @param string $description shaare's description.
+ * @param string $redirector if a redirector is set, use it to gerenate links.
+ * @param string $indexUrl URL to Shaarli's index.
+ *
+ * @return string formatted description.
+ */
+function format_description($description, $redirector = '', $indexUrl = '') {
+ return nl2br(space2nbsp(hashtag_autolink(text2clickable($description, $redirector), $indexUrl)));
+}