]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
heuristics for paren linking (thanks @brion!)
authorEvan Prodromou <evan@controlyourself.ca>
Sun, 2 Nov 2008 09:02:41 +0000 (04:02 -0500)
committerEvan Prodromou <evan@controlyourself.ca>
Sun, 2 Nov 2008 09:02:41 +0000 (04:02 -0500)
darcs-hash:20081102090241-5ed1f-f5278c69aa0c7427294b40b91f8957530b07062f.gz

lib/util.php

index c65adc76bc58b8f4ae97fa37ce5d9a0e3526b550..44c75156c71252b3053644d2a0f5836b47c3db6d 100644 (file)
@@ -711,12 +711,40 @@ function common_render_text($text) {
        $r = htmlspecialchars($text);
 
        $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r);
-       $r = preg_replace('@https?://[^)\]>\s]+@', '<a href="\0" class="extlink">\0</a>', $r);
+       $r = preg_replace_callback('@https?://[^\]>\s]+@', 'common_render_uri_thingy', $r);
        $r = preg_replace('/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
        # XXX: machine tags
        return $r;
 }
 
+function common_render_uri_thingy($matches) {
+       $uri = $matches[0];
+       $trailer = '';
+
+       # Some heuristics for extracting URIs from surrounding punctuation
+       # Strip from trailing text...
+       if (preg_match('/^(.*)([,.:"\']+)$/', $uri, $matches)) {
+               $uri = $matches[1];
+               $trailer = $matches[2];
+       }
+
+       $pairs = array(
+               ']' => '[', # technically disallowed in URIs, but used in Java docs
+               ')' => '(', # far too frequent in Wikipedia and MSDN
+       );
+       $final = substr($uri, -1, 1);
+       if (isset($pairs[$final])) {
+               $openers = substr_count($uri, $pairs[$final]);
+               $closers = substr_count($uri, $final);
+               if ($closers > $openers) {
+                       // Assume the paren was opened outside the URI
+                       $uri = substr($uri, 0, -1);
+                       $trailer = $final . $trailer;
+               }
+       }
+       return '<a href="' . $uri . '" class="extlink">' . $uri . '</a>' . $trailer;
+}
+
 function common_tag_link($tag) {
        $canonical = common_canonical_tag($tag);
        $url = common_local_url('tag', array('tag' => $canonical));