From f7a1999c151b1b7e91b46ba20a903ccf673495ac Mon Sep 17 00:00:00 2001 From: Zach Prezkuta Date: Sun, 26 Aug 2012 18:18:43 -0600 Subject: [PATCH] manually fix escaped underscores in links --- include/bb2diaspora.php | 16 ++++++++++++++++ include/bbcode.php | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index f007417903..75fe1ef35d 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -162,6 +162,22 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) { $md = new Markdownify(false, false, false); $Text = $md->parseString($Text); + // The Markdownify converter converts underscores '_' in URLs to '\_', which + // messes up the URL. Manually fix these + $count = 1; + $pos = bb_find_open_close($Text, '[', ']', $count); + while($pos !== false) { + $start = substr($Text, 0, $pos['start']); + $subject = substr($Text, $pos['start'], $pos['end'] - $pos['start'] + 1); + $end = substr($Text, $pos['end'] + 1); + + $subject = str_replace('\_', '_', $subject); + $Text = $start . $subject . $end; + + $count++; + $pos = bb_find_open_close($Text, '[', ']', $count); + } + // If the text going into bbcode() has a plain URL in it, i.e. // with no [url] tags around it, it will come out of parseString() // looking like: , which gets removed by strip_tags(). diff --git a/include/bbcode.php b/include/bbcode.php index 6f22d19702..c30908e2d4 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -47,6 +47,30 @@ function bb_unspacefy_and_trim($st) { return $unspacefied; } +function bb_find_open_close($s, $open, $close, $occurance = 1) { + + if($occurance < 1) + $occurance = 1; + + $start_pos = -1; + for($i = 1; $i <= $occurance; $i++) { + if( $start_pos !== false) + $start_pos = strpos($s, $open, $start_pos + 1); + } + + if( $start_pos === false) + return false; + + $end_pos = strpos($s, $close, $start_pos); + + if( $end_pos === false) + return false; + + $res = array( 'start' => $start_pos, 'end' => $end_pos ); + + return $res; +} + function get_bb_tag_pos($s, $name, $occurance = 1) { if($occurance < 1)