]> git.mxchange.org Git - friendica.git/blobdiff - include/bb2diaspora.php
Merge pull request #350 from fermionic/improve-bb2diaspora-conversions
[friendica.git] / include / bb2diaspora.php
old mode 100755 (executable)
new mode 100644 (file)
index c26b0c3..6f8f925
@@ -8,75 +8,80 @@ require_once('include/html2bbcode.php');
 
 // we don't want to support a bbcode specific markdown interpreter
 // and the markdown library we have is pretty good, but provides HTML output.
-// So we'll use that to convert to HTML, then convert the HTML back to bbcode, 
+// So we'll use that to convert to HTML, then convert the HTML back to bbcode,
 // and then clean up a few Diaspora specific constructs.
 
 function diaspora2bb($s) {
 
+       // for testing purposes: Collect raw markdown articles
+       // $file = tempnam("/tmp/friendica/", "markdown");
+       // file_put_contents($file, $s);
+
        $s = html_entity_decode($s,ENT_COMPAT,'UTF-8');
-    $s = str_replace("\r","\n",$s);
+
+       // Too many new lines. So deactivated the following line
+       // $s = str_replace("\r","\n",$s);
+       // Simply remove cr.
+       $s = str_replace("\r","",$s);
+
+       // <br/> is invalid. Replace it with the valid expression
+       $s = str_replace("<br/>","<br />",$s);
 
        $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s);
 
-    $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
+       // Escaping the hash tags - doesn't always seem to work
+       // $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
+       // This seems to work
+       $s = preg_replace('/\#([^\s\#])/','&#35;$1',$s);
 
        $s = Markdown($s);
 
-    $s = str_replace('&#35;','#',$s);
-    $s = str_replace("\n",'<br />',$s);
+       $s = str_replace('&#35;','#',$s);
+
+       $s = str_replace("\n",'<br />',$s);
 
        $s = html2bbcode($s);
 //     $s = str_replace('&#42;','*',$s);
 
+       // Convert everything that looks like a link to a link
+       $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
 
-    $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s); 
-    $s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s); 
-       $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s); 
-       $s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s); 
-       $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2$3$4[/url]',$s);
+       //$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
+       $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s);
+       $s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s);
+       $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s);
+       $s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s);
        // remove duplicate adjacent code tags
        $s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
-       $s = scale_diaspora_images($s);
-
-       return $s;
-}
 
+       // Don't show link to full picture (until it is fixed)
+       $s = scale_external_images($s, false);
 
-function scale_diaspora_images($s,$include_link = true) {
-
-       $matches = null;
-       $c = preg_match_all('/\[img\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
-       if($c) {
-               require_once('include/Photo.php');
-               foreach($matches as $mtch) {
-                       logger('scale_diaspora_image: ' . $mtch[1]);
-                       $i = fetch_url($mtch[1]);
-                       if($i) {
-                               $ph = new Photo($i);
-                               if($ph->is_valid()) {
-                                       if($ph->getWidth() > 600 || $ph->getHeight() > 600) {
-                                               $ph->scaleImage(600);
-                                               $new_width = $ph->getWidth();
-                                               $new_height = $ph->getHeight();
-                                               logger('scale_diaspora_image: ' . $new_width . 'w ' . $new_height . 'h' . 'match: ' . $mtch[0], LOGGER_DEBUG);
-                                               $s = str_replace($mtch[0],'[img=' . $new_width . 'x' . $new_height. ']' . $mtch[1] . '[/img]'
-                                                       . "\n" . (($include_link) 
-                                                               ? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
-                                                               : ''),$s);
-                                               logger('scale_diaspora_image: new string: ' . $s, LOGGER_DEBUG);
-                                       }
-                               }
-                       }
-               }
-       }
        return $s;
 }
 
+
 function stripdcode_br_cb($s) {
        return '[code]' . str_replace('<br />', "\n\t", $s[1]) . '[/code]';
 }
 
 
+function diaspora_ul($s) {
+       // Replace "[\\*]" followed by any number (including zero) of
+       // spaces by "* " to match Diaspora's list format
+       return preg_replace("/\[\\\\\*\]( *)/", "* ", $s[1]);
+}
+
+
+function diaspora_ol($s) {
+       // A hack: Diaspora will create a properly-numbered ordered list even
+       // if you use '1.' for each element of the list, like:
+       //              1. First element
+       //              1. Second element
+       //              1. Third element
+       return preg_replace("/\[\\\\\*\]( *)/", "1. ", $s[1]);
+}
+
 
 function bb2diaspora($Text,$preserve_nl = false) {
 
@@ -95,6 +100,11 @@ function bb2diaspora($Text,$preserve_nl = false) {
 
        if($preserve_nl)
                $Text = str_replace(array("\n","\r"), array('',''),$Text);
+       else
+               // Remove the "return" character, as Diaspora uses only the "newline"
+               // character, so having the "return" character can cause signature
+               // failures
+               $Text = str_replace("\r", "", $Text);
 
        // Set up the parameters for a URL search string
        $URLSearchString = "^\[\]";
@@ -135,38 +145,45 @@ function bb2diaspora($Text,$preserve_nl = false) {
        // Check for bold text
        $Text = preg_replace("(\[b\](.*?)\[\/b\])is",'**$1**',$Text);
 
-       // Check for Italics text
+       // Check for italics text
        $Text = preg_replace("(\[i\](.*?)\[\/i\])is",'_$1_',$Text);
 
-       // Check for Underline text
-//     $Text = preg_replace("(\[u\](.*?)\[\/u\])is",'<u>$1</u>',$Text);
+       // Check for underline text
+       // Replace with italics since Diaspora doesn't have underline
+       $Text = preg_replace("(\[u\](.*?)\[\/u\])is",'_$1_',$Text);
 
        // Check for strike-through text
-//     $Text = preg_replace("(\[s\](.*?)\[\/s\])is",'<strike>$1</strike>',$Text);
+       $Text = preg_replace("(\[s\](.*?)\[\/s\])is",'**[strike]**$1**[/strike]**',$Text);
 
        // Check for over-line text
 //     $Text = preg_replace("(\[o\](.*?)\[\/o\])is",'<span class="overline">$1</span>',$Text);
 
        // Check for colored text
-//     $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])is","<span style=\"color: $1;\">$2</span>",$Text);
+       // Remove color since Diaspora doesn't support it
+       $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])is","$2",$Text);
 
        // Check for sized text
-//     $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])is","<span style=\"font-size: $1;\">$2</span>",$Text);
+       // Remove it since Diaspora doesn't support sizes very well
+       $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])is","$2",$Text);
 
        // Check for list text
-//     $Text = preg_replace("/\[list\](.*?)\[\/list\]/is", '<ul class="listbullet">$1</ul>' ,$Text);
-//     $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/is", '<ul class="listdecimal">$1</ul>' ,$Text);
-//     $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/s",'<ul class="listlowerroman">$1</ul>' ,$Text);
-//     $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/s", '<ul class="listupperroman">$1</ul>' ,$Text);
-//     $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/s", '<ul class="listloweralpha">$1</ul>' ,$Text);
-//     $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/s", '<ul class="listupperalpha">$1</ul>' ,$Text);
+       $Text = preg_replace_callback("/\[list\](.*?)\[\/list\]/is", 'diaspora_ul', $Text);
+       $Text = preg_replace_callback("/\[ul\](.*?)\[\/ul\]/is", 'diaspora_ul', $Text);
+       $Text = preg_replace_callback("/\[list=1\](.*?)\[\/list\]/is", 'diaspora_ol', $Text);
+       $Text = preg_replace_callback("/\[list=i\](.*?)\[\/list\]/s",'diaspora_ol', $Text);
+       $Text = preg_replace_callback("/\[list=I\](.*?)\[\/list\]/s", 'diaspora_ol', $Text);
+       $Text = preg_replace_callback("/\[list=a\](.*?)\[\/list\]/s", 'diaspora_ol', $Text);
+       $Text = preg_replace_callback("/\[list=A\](.*?)\[\/list\]/s", 'diaspora_ol', $Text);
+       $Text = preg_replace_callback("/\[ol\](.*?)\[\/ol\]/is", 'diaspora_ol', $Text);
 //     $Text = preg_replace("/\[li\](.*?)\[\/li\]/s", '<li>$1</li>' ,$Text);
 
-//     $Text = preg_replace("/\[td\](.*?)\[\/td\]/s", '<td>$1</td>' ,$Text);
-//     $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/s", '<tr>$1</tr>' ,$Text);
-//     $Text = preg_replace("/\[table\](.*?)\[\/table\]/s", '<table>$1</table>' ,$Text);
+       // Just get rid of table tags since Diaspora doesn't support tables
+       $Text = preg_replace("/\[th\](.*?)\[\/th\]/s", '$1' ,$Text);
+       $Text = preg_replace("/\[td\](.*?)\[\/td\]/s", '$1' ,$Text);
+       $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/s", '$1' ,$Text);
+       $Text = preg_replace("/\[table\](.*?)\[\/table\]/s", '$1' ,$Text);
 
-//     $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/s", '<table border="1" >$1</table>' ,$Text);
+       $Text = preg_replace("/\[table border=(.*?)\](.*?)\[\/table\]/s", '$2' ,$Text);
 //     $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/s", '<table border="0" >$1</table>' ,$Text);
 
        
@@ -176,7 +193,7 @@ function bb2diaspora($Text,$preserve_nl = false) {
 //     $Text = preg_replace("(\[font=(.*?)\](.*?)\[\/font\])","<span style=\"font-family: $1;\">$2</span>",$Text);
 
 
-    $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/is",'stripdcode_br_cb',$Text);
+       $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/is",'stripdcode_br_cb',$Text);
 
        // Check for [code] text
        $Text = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/is","\t$2\n", $Text);
@@ -188,6 +205,7 @@ function bb2diaspora($Text,$preserve_nl = false) {
        //      $QuoteLayout = '<blockquote>$1</blockquote>';                     
        // Check for [quote] text
        $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/is",">$1\n\n", $Text);
+       $Text = preg_replace("/\[quote=(.*?)\](.*?)\[\/quote\]/is",">$2\n\n", $Text);
          
        // Images
 
@@ -202,9 +220,9 @@ function bb2diaspora($Text,$preserve_nl = false) {
        // [img=widthxheight]image source[/img]
 //     $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/", '<img src="$3" style="height:{$2}px; width:{$1}px;" >', $Text);
 
-    $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism",'http://www.youtube.com/watch?v=$1',$Text); 
-    $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'http://www.youtube.com/watch?v=$1',$Text); 
-    $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'http://www.youtube.com/watch?v=$1',$Text); 
+       $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism",'http://www.youtube.com/watch?v=$1',$Text); 
+       $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'http://www.youtube.com/watch?v=$1',$Text); 
+       $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'http://www.youtube.com/watch?v=$1',$Text); 
        $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", 'http://www.youtube.com/watch?v=$1', $Text);
 
        $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'http://vimeo.com/$1',$Text); 
@@ -232,13 +250,22 @@ function bb2diaspora($Text,$preserve_nl = false) {
 
        $Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text);
 
-       $Text = preg_replace('/\[(.*?)\]\((.*?)\\\\_(.*?)\)/ism','[$1]($2_$3)',$Text);
+       $Text = preg_replace_callback('/\[(.*?)\]\((.*?)\)/ism','unescape_underscores_in_links',$Text);
+
+       // Remove any leading or trailing whitespace, as this will mess up
+       // the Diaspora signature verification and cause the item to disappear
+       $Text = trim($Text);
        
        call_hooks('bb2diaspora',$Text);
 
        return $Text;
 }
 
+function unescape_underscores_in_links($m) {
+       $y = str_replace('\\_','_', $m[2]);
+       return('[' . $m[1] . '](' . $y . ')');
+}
+
 function format_event_diaspora($ev) {
 
        $a = get_app();