Easier way to switch between subscribed newsgroups
[banana.git] / banana / misc.inc.php
index bea2223..7a782c4 100644 (file)
@@ -30,18 +30,99 @@ function textFormat_translate($format)
     }
 }
 
-function redirect($params)
+/** Redirect to the page with the given parameter
+ * @ref makeLink
+ */
+function redirectInBanana($params)
 {
-       header('Location: ' . makeLink($params));
+    header('Location: ' . makeLink($params));
 }
 
+/** Make a link using the given parameters
+ * @param ARRAY params, the parameters with
+ *       key => value
+ * Known key are:
+ *  - group       = group name
+ *  - artid/first = article id the the group
+ *  - subscribe   = to show the subscription page
+ *  - action      = action to do (new, cancel, view)
+ *  - part        = to show the given MIME part of the article
+ *  - pj          = to get the given attachment
+ *  - xface       = to make a link to an xface
+ *
+ * Can be overloaded by defining a hook_makeLink function
+ */
 function makeLink($params)
 {
-    $proto = empty($_SERVER['HTTPS']) ? 'http://' : 'http://';
+    if (function_exists('hook_makeLink')
+            && $res = hook_makeLink($params)) {
+        return $res;
+    }
+    $proto = empty($_SERVER['HTTPS']) ? 'http://' : 'https://';
     $host  = $_SERVER['HTTP_HOST'];
     $file  = $_SERVER['PHP_SELF'];
 
-       return $proto . $host . $file . '?' . $params;
+    if (isset($params['xface'])) {
+        $file = dirname($file) . '/xface.php';
+        $get  = 'face=' . $params['xface'];
+    } else if (count($params) != 0) {
+        $get = '?';
+        foreach ($params as $key=>$value) {
+            if (strlen($get) != 1) {
+                $get .= '&';
+            }
+            $get .= $key . '=' . $value;
+        }
+    } else {
+        $get = '';
+    }
+
+    return $proto . $host . $file . $get;
+}
+
+/** Format a link to be use in a link
+ * @ref makeLink
+ */
+function makeHREF($params, $text = null)
+{
+    $link = makeLink($params);
+    if (is_null($text)) {
+        $text = $link;
+    }
+    $target = null;
+    if (isset($params['action']) && $params['action'] == 'view') {
+        $target = ' target="_blank"';
+    }
+    return '<a href="' . htmlentities($link) . $target . '">' . $text . '</a>';
+}
+
+/** Format tree images links
+ * @param img STRING Image name (without extension)
+ * @param alt STRING alternative string
+ * @param width INT  to force width of the image (null if not defined)
+ *
+ * This function can be overloaded by defining hook_makeImg()
+ */
+function makeImg($img, $alt, $height = null, $width = null)
+{
+    if (function_exists('hook_makeImg')
+            && $res = hook_makeImg($img, $alt, $height, $width)) {
+        return $res;
+    }
+
+    if (!is_null($width)) {
+        $width = ' width="' . $width . '"';
+    }
+    if (!is_null($height)) {
+        $height = ' height="' . $height . '"';
+    }
+    
+    $proto = empty($_SERVER['HTTPS']) ? 'http://' : 'https://';
+    $host  = $_SERVER['HTTP_HOST'];
+    $file  = dirname($_SERVER['PHP_SELF']) . '/img/' . $img . '.gif';
+    $url   = $proto . $host . $file; 
+
+    return '<img src="' . $url . '"' . $height . $width . ' alt="' . $alt . '" />';
 }
 
 /********************************************************************************
@@ -177,7 +258,7 @@ function formatDisplayHeader($_header,$_text) {
             $res = "";
             $groups = preg_split("/[\t ]*,[\t ]*/",$_text);
             foreach ($groups as $g) {
-                $res.="<a href='?group=$g'>$g</a>, ";
+                $res .= makeHREF(Array('group' => $g), $g) . ', ';
             }
             return substr($res,0, -2);
 
@@ -198,13 +279,13 @@ function formatDisplayHeader($_header,$_text) {
                 $p = $banana->spool->overview[$p]->parent;
             }
             foreach (array_reverse($par_ok) as $p) {
-                $rsl .= "<a href=\"?group={$banana->spool->group}&amp;artid=$p\">$ndx</a> ";
+                $rsl .= makeHREF(Array('group' => $banana->spool->group), $ndx) . ' ';
                 $ndx++;
             }
             return $rsl;
 
         case "x-face":
-            return '<img src="xface.php?face='.urlencode(base64_encode($_text)).'"  alt="x-face" />';
+            return '<img src="' . makeLink(Array('xface' => urlencode(base64_encode($_text)))) .'"  alt="x-face" />';
         
         default:
             if (function_exists('hook_formatDisplayHeader')
@@ -264,15 +345,18 @@ function displayshortcuts($first = -1) {
     extract($banana->state);
 
     $res  = '<div class="banana_scuts">';
-    $res .= '[<a href="?">'._b_('Liste des forums').'</a>] ';
+    $res .= '[' . makeHREF(Array(), _b_('Liste des forums')) . '] ';
     if (is_null($group)) {
-        return $res.'[<a href="?subscribe=1">'._b_('Abonnements').'</a>]</div>';
+        return $res.'[' . makeHREF(Array('subscribe' => 1), _b_('Abonnements')) . ']</div>';
     }
    
-    $res .= "[<a href=\"?group=$group\">$group</a>] ";
+    $res .= '[' . makeHREF(Array('group' => $group), $group) . '] ';
 
     if (is_null($artid)) {
-        $res .= "[<a href=\"?group=$group&amp;action=new\">"._b_('Nouveau message')."</a>] ";
+        $res .= '[' . makeHREF(Array('group'  => $group,
+                                     'action' => 'new'),
+                               _b_('Nouveau message'))
+              . '] ';
         if (sizeof($banana->spool->overview)>$banana->tmax) {
             $res .= '<br />';
             $n = intval(log(count($banana->spool->overview), 10))+1;
@@ -280,17 +364,26 @@ function displayshortcuts($first = -1) {
                 if ($first==$ndx) {
                     $fmt = "[%0{$n}u-%0{$n}u] ";
                 } else {
-                    $fmt = "[<a href=\"?group=$group&amp;first=$ndx\">%0{$n}u-%0{$n}u</a>] ";
+                    $fmt = '[' . makeHREF(Array('group' => $group,
+                                                'first' => $ndx),
+                                          '%0' . $n . 'u-%0' . $n . 'u')
+                         . '] ';
                 }
                 $res .= sprintf($fmt, $ndx, min($ndx+$banana->tmax-1,sizeof($banana->spool->overview)));
             }
         }
     } else {
-        $res .= "[<a href=\"?group=$group&amp;artid=$artid&amp;action=new\">"
-             ._b_('RĂ©pondre')."</a>] ";
+        $res .= '[' . makeHREF(Array('group'  => $group,
+                                     'artid'  => $artid,
+                                     'action' => 'new'),
+                               _b_('RĂ©pondre'))
+              . '] ';
         if ($banana->post && $banana->post->checkcancel()) {
-            $res .= "[<a href=\"?group=$group&amp;artid=$artid&amp;action=cancel\">"
-                 ._b_('Annuler ce message')."</a>] ";
+            $res .= '[' . makeHREF(Array('group'  => $group,
+                                         'artid'  => $artid,
+                                         'action' => 'cancel'), 
+                                   _b_('Annuler ce message'))
+                  . '] ';
         }
     }
     return $res.'</div>';
@@ -397,6 +490,12 @@ function formatbody($_text, $format='plain', $flowed=false)
         $res = '<br/>'.html_entity_decode(to_entities(richtextToHtml($_text))).'<br/>';
     } else {
         $res  = "\n\n" . to_entities(wrap($_text, "", $flowed))."\n\n";
+        $formatting = Array('\*' => 'strong',
+                            '_' => 'u',
+                            '/' => 'em');
+        foreach ($formatting as $limit=>$mark) {
+            $res = preg_replace('@' . $limit . '([^\s]+)' . $limit . '@', "<$mark>\\1</$mark>", $res);
+        }
     }
 
     if ($format != 'html') {
@@ -421,11 +520,11 @@ function formatbody($_text, $format='plain', $flowed=false)
         while (preg_match("@(^|<pre>|\n)&gt;@i", $res)) {
             $res  = preg_replace("@(^|<pre>|\n)((&gt;[^\n]*\n)+)@ie",
                 "'\\1</pre><blockquote><pre>'"
-                   .".stripslashes(preg_replace('@(^|<pre>|\n)&gt;[ \\t\\r]*@i', '\\1', '\\2'))"
-                   .".'</pre></blockquote><pre>'",
-                   $res);
+                .".stripslashes(preg_replace('@(^|<pre>|\n)&gt;[ \\t\\r]*@i', '\\1', '\\2'))"
+                .".'</pre></blockquote><pre>'",
+                $res);
         }
-       $res = preg_replace("@<pre>-- ?\n@", "<pre>\n-- \n", $res);
+        $res = preg_replace("@<pre>-- ?\n@", "<pre>\n-- \n", $res);
         $parts = preg_split("/\n-- ?\n/", $res);
     }
 
@@ -444,4 +543,5 @@ function formatbody($_text, $format='plain', $flowed=false)
     }
 }
 
+// vim:set et sw=4 sts=4 ts=4
 ?>