]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Hacky support for geo URI detection
authorMikael Nordfeldth <mmn@hethane.se>
Wed, 3 Feb 2016 13:19:08 +0000 (14:19 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Wed, 3 Feb 2016 13:19:08 +0000 (14:19 +0100)
Won't work with common_purify yet because there is no geo uri scheme for it

classes/File_redirection.php
lib/util.php

index e901c464d745b5cd3d48f7b2432499fc754f6cc1..057647dfc5b3863434cd18144df925a371f87140 100644 (file)
@@ -343,6 +343,11 @@ class File_redirection extends Managed_DataObject
                 // don't touch anything
                 break;
 
+            // URLs with coordinates, not browsable domain names
+            case 'geo':
+                // don't touch anything
+                break;
+
             default:
                 $out_url = $default_scheme . ltrim($out_url, '/');
                 $p = parse_url($out_url);
index 3f6e5e94ecf3645fa74b4b5e2c1fae0b58895f33..5b28aa7aed9f16b751468dc99dd9c215b3c3e1fd 100644 (file)
@@ -884,6 +884,7 @@ function common_render_text($text)
 define('_URL_SCHEME_COLON_DOUBLE_SLASH', 1);
 define('_URL_SCHEME_SINGLE_COLON', 2);
 define('_URL_SCHEME_NO_DOMAIN', 4);
+define('_URL_SCHEME_COLON_COORDINATES', 8);
 
 function common_url_schemes($filter=null)
 {
@@ -913,6 +914,7 @@ function common_url_schemes($filter=null)
                 'tel'       => _URL_SCHEME_SINGLE_COLON,
                 'xmpp'      => _URL_SCHEME_SINGLE_COLON,
                 'magnet'    => _URL_SCHEME_NO_DOMAIN,
+                'geo'       => _URL_SCHEME_COLON_COORDINATES,
                 ];
 
     return array_keys(
@@ -931,6 +933,13 @@ function common_url_schemes($filter=null)
  * @param mixed $arg: optional argument will be passed on to the callback
  */
 function common_replace_urls_callback($text, $callback, $arg = null) {
+    $geouri_labeltext_regex = '\pN\pL\-';
+    $geouri_mark_regex = '\-\_\.\!\~\*\\\'\(\)';    // the \\\' is really pretty
+    $geouri_unreserved_regex = '\pN\pL' . $geouri_mark_regex;
+    $geouri_punreserved_regex = '\[\]\:\&\+\$';
+    $geouri_pctencoded_regex = '(?:\%[0-9a-fA-F][0-9a-fA-F])';
+    $geouri_paramchar_regex = $geouri_unreserved_regex . $geouri_punreserved_regex; //FIXME: add $geouri_pctencoded_regex here so it works
+
     // Start off with a regex
     $regex = '#'.
     '(?:^|[\s\<\>\(\)\[\]\{\}\\\'\\\";]+)(?![\@\!\#])'.
@@ -951,6 +960,16 @@ function common_replace_urls_callback($text, $callback, $arg = null) {
                     ')'.
                 ')'.
             ')'.
+            '|(?:'.
+                '(?:' . implode('|', common_url_schemes(_URL_SCHEME_COLON_COORDINATES)) . '):'.
+                // There's an order that must be followed here too, if ;crs= is used, it must precede ;u=
+                // Also 'crsp' (;crs=$crsp) must match $geouri_labeltext_regex
+                // Also 'uval' (;u=$uval) must be a pnum: \-?[0-9]+
+                '(?:'.
+                    '(?:[0-9]+(?:\.[0-9]+)?(?:\,[0-9]+(?:\.[0-9]+)?){1,2})'.    // 1(.23)?(,4(.56)){1,2}
+                    '(?:\;(?:['.$geouri_labeltext_regex.']+)(?:\=['.$geouri_paramchar_regex.']+)*)*'.
+                ')'.
+            ')'.
             // URLs without domain name, like magnet:?xt=...
             '|(?:(?:' . implode('|', common_url_schemes(_URL_SCHEME_NO_DOMAIN)) . '):)'.
             (common_config('linkify', 'bare_ipv4')   // Convert IPv4 addresses to hyperlinks