chiark / gitweb /
Merge branch 'search'. Descriptions are now being part of a search.
authorHans-Emil Skogh <hansemil@gmail.com>
Tue, 3 Jan 2012 19:28:24 +0000 (20:28 +0100)
committerHans-Emil Skogh <hansemil@gmail.com>
Tue, 3 Jan 2012 19:28:24 +0000 (20:28 +0100)
1  2 
wp-fdroid/wp-fdroid.php

index d4f09cd64606bd62463e76d451eb31fbddf87df9,bf728ac85a7018af9707852b5589bc00c010d68b..8da63b7434a67678792f7d004e835f3df5931043
 -<?php\r
 -/*\r
 -Plugin Name: WP FDroid\r
 -Plugin URI: http://f-droid.org/repository\r
 -Description: An FDroid repository browser\r
 -Author: Ciaran Gultnieks\r
 -Version: 0.01\r
 -Author URI: http://ciarang.com\r
 -\r
 -Revision history\r
 -0.01 - 2010-12-04: Initial development version\r
 -\r
 -*/\r
 -\r
 -class FDroid\r
 -{\r
 -\r
 -    // Our text domain, for internationalisation\r
 -    private $textdom='wp-fdroid';\r
 -\r
 -      private $site_path;\r
 -\r
 -    // Constructor\r
 -    function FDroid() {\r
 -        // Add filters etc here!\r
 -        add_shortcode('fdroidrepo',array($this, 'do_shortcode'));\r
 -        add_filter('query_vars',array($this, 'queryvars'));\r
 -        $this->inited=false;\r
 -        $this->site_path=getenv('DOCUMENT_ROOT');\r
 -    }\r
 -\r
 -\r
 -    // Register additional query variables. (Handler for the 'query_vars' filter)\r
 -    function queryvars($qvars) {\r
 -        $qvars[]='fdfilter';\r
 -        $qvars[]='fdid';\r
 -        $qvars[]='fdpage';\r
 -        $qvars[]='fdstyle';\r
 -        return $qvars;\r
 -    }\r
 -\r
 -\r
 -    // Lazy initialise. All non-trivial members should call this before doing anything else.\r
 -    function lazyinit() {\r
 -        if(!$this->inited) {\r
 -            load_plugin_textdomain($this->textdom, PLUGINDIR.'/'.dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));\r
 -\r
 -            $this->inited=true;\r
 -        }\r
 -    }\r
 -\r
 -    // Gets a required query parameter by name.\r
 -    function getrequiredparam($name) {\r
 -        global $wp_query;\r
 -        if(!isset($wp_query->query_vars[$name]))\r
 -            wp_die("Missing parameter ".$name,"Error");\r
 -        return $wp_query->query_vars[$name];\r
 -    }\r
 -\r
 -    // Handler for the 'fdroidrepo' shortcode.\r
 -    //  $attribs - shortcode attributes\r
 -    //  $content - optional content enclosed between the starting and\r
 -    //             ending shortcode\r
 -    // Returns the generated content.\r
 -    function do_shortcode($attribs,$content=null) {\r
 -        global $wp_query,$wp_rewrite;\r
 -        $this->lazyinit();\r
 -\r
 -              \r
 -              // Init local query vars\r
 -              foreach($this->queryvars(array()) as $qv) {\r
 -                      if(array_key_exists($qv,$wp_query->query_vars)) {\r
 -                              $query_vars[$qv] = $wp_query->query_vars[$qv];\r
 -                      } else {\r
 -                              $query_vars[$qv] = null;\r
 -                      }\r
 -              }\r
 -      \r
 -              // Santiy check query vars\r
 -              if(!isset($query_vars['fdpage']) || !is_numeric($query_vars['fdpage']) || $query_vars['fdpage'] <= 0) {\r
 -                      $query_vars['fdpage'] = 1;\r
 -              }\r
 -\r
 -              $out = '';\r
 -\r
 -              if(isset($attribs['search']) && $query_vars['fdfilter']===null) {\r
 -                      $query_vars['fdfilter'] = '';\r
 -              }\r
 -\r
 -              if($query_vars['fdid']!==null) {\r
 -            $out.=$this->get_app($query_vars);\r
 -              } else {\r
 -                      if($query_vars['fdfilter'] !== null)\r
 -                              $out.=$this->show_search($query_vars);\r
 -\r
 -            $out.=$this->get_apps($query_vars);\r
 -              }\r
 -        return $out;\r
 -\r
 -    }\r
 -\r
 -\r
 -    function get_app($query_vars) {\r
 -\r
 -        $xml = simplexml_load_file($this->site_path."/repo/index.xml");\r
 -        foreach($xml->children() as $app) {\r
 -\r
 -            $attrs=$app->attributes();\r
 -            if($attrs['id']==$query_vars['fdid']) {\r
 -                $apks=array();;\r
 -                foreach($app->children() as $el) {\r
 -                    switch($el->getName()) {\r
 -                        case "name":\r
 -                            $name=$el;\r
 -                            break;\r
 -                        case "icon":\r
 -                            $icon=$el;\r
 -                            break;\r
 -                        case "summary":\r
 -                            $summary=$el;\r
 -                            break;\r
 -                        case "description":\r
 -                            $desc=$el;\r
 -                            break;\r
 -                        case "license":\r
 -                            $license=$el;\r
 -                            break;\r
 -                        case "source":\r
 -                            $source=$el;\r
 -                            break;\r
 -                        case "tracker":\r
 -                            $issues=$el;\r
 -                            break;\r
 -                        case "donate":\r
 -                            $donate=$el;\r
 -                            break;\r
 -                        case "web":\r
 -                            $web=$el;\r
 -                            break;\r
 -                        case "package":\r
 -                            $thisapk=array();\r
 -                            foreach($el->children() as $pel) {\r
 -                                switch($pel->getName()) {\r
 -                                case "version":\r
 -                                    $thisapk['version']=$pel;\r
 -                                    break;\r
 -                                case "vercode":\r
 -                                    $thisapk['vercode']=$pel;\r
 -                                    break;\r
 -                                case "apkname":\r
 -                                    $thisapk['apkname']=$pel;\r
 -                                    break;\r
 -                                case "srcname":\r
 -                                    $thisapk['srcname']=$pel;\r
 -                                    break;\r
 -                                case "hash":\r
 -                                    $thisapk['hash']=$pel;\r
 -                                    break;\r
 -                                case "size":\r
 -                                    $thisapk['size']=$pel;\r
 -                                    break;\r
 -                                case "sdkver":\r
 -                                    $thisapk['sdkver']=$pel;\r
 -                                    break;\r
 -                                case "permissions":\r
 -                                    $thisapk['permissions']=$pel;\r
 -                                    break;\r
 -                                }\r
 -                            }\r
 -                            $apks[]=$thisapk;\r
 -\r
 -                    }\r
 -                }\r
 -\r
 -                $out='<div id="appheader">';\r
 -                $out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$icon.'" width=48></div>';\r
 -                $out.='<p><span style="font-size:20px">'.$name."</span>";\r
 -                $out.="<br>".$summary."</p>";\r
 -                $out.="</div>";\r
 -\r
 -                $out.="<p>".$desc."</p>";\r
 -\r
 -                $out.="<p><b>License:</b> ".$license."</p>";\r
 -\r
 -                $out.="<p>";\r
 -                if(strlen($web)>0)\r
 -                    $out.='<b>Website:</b> <a href="'.$web.'">'.$web.'</a><br />';\r
 -                if(strlen($issues)>0)\r
 -                    $out.='<b>Issue Tracker:</b> <a href="'.$issues.'">'.$issues.'</a><br />';\r
 -                if(strlen($source)>0)\r
 -                    $out.='<b>Source Code:</b> <a href="'.$source.'">'.$source.'</a><br />';\r
 -                if($donate && strlen($donate)>0)\r
 -                    $out.='<b>Donate:</b> <a href="'.$donate.'">'.$donate.'</a><br />';\r
 -                $out.="</p>";\r
 -\r
 -                $out.="<h3>Packages</h3>";\r
 -                foreach($apks as $apk) {\r
 -                    $out.="<p><b>Version ".$apk['version']."</b> - ";\r
 -                    $out.='<a href="http://f-droid.org/repo/'.$apk['apkname'].'">download</a> ';\r
 -                    $out.=$apk['size']." bytes";\r
 -                    if($apk['srcname'])\r
 -                        $out.='<br><a href="http://f-droid.org/repo/'.$apk['srcname'].'">source tarball</a>';\r
 -                    $out.="</p>";\r
 -                }\r
 -\r
 -                $out.='<hr><p><a href="'.makelink($query_vars,array('fdid'=>null)).'">Index</a></p>';\r
 -\r
 -                return $out;\r
 -            }\r
 -        }\r
 -        return "<p>Application not found</p>";\r
 -    }\r
 -\r
 -\r
 -    function get_apps($query_vars) {\r
 -\r
 -          $xml = simplexml_load_file($this->site_path."/repo/index.xml");\r
 -              $matches = $this->show_apps($xml,$query_vars,$numpages);\r
 -      \r
 -              $out='';\r
 -\r
 -              if(($query_vars['fdfilter']===null || $query_vars['fdfilter']!='') && $numpages>0)\r
 -              {\r
 -                      $out.='<div style="float:left;">';\r
 -                      if($query_vars['fdfilter']===null)\r
 -                              $out.="All applications";\r
 -                      else\r
 -                              $out.='Applications matching "'.$query_vars['fdfilter'].'"';\r
 -                      $out.="</div>";\r
 -\r
 -                      $out.='<div style="float:right;">';\r
 -                              $out.='<a href="'.makelink($query_vars, array('fdstyle'=>'list','fdpage'=>'1')).'">List</a> | ';\r
 -                              $out.='<a href="'.makelink($query_vars, array('fdstyle'=>'grid','fdpage'=>'1')).'">Grid</a>';\r
 -                      $out.='</div>';\r
 -\r
 -                      $out.='<br break="all"/>';\r
 -              } \r
 -              \r
 -              if($numpages>0) {\r
 -                      $out.=$matches;\r
 -                      \r
 -                      $out.='<hr><p>';\r
 -                      if($query_vars['fdpage']==1) {\r
 -                              $out.="&lt;&lt;first ";\r
 -                              $out.="&lt;prev ";\r
 -                      } else {\r
 -                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>1)).'">&lt;&lt;first</a> ';\r
 -                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']-1))).'">&lt;&lt;prev</a> ';\r
 -                      }\r
 -                      $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' ';\r
 -                      if($query_vars['fdpage']==$numpages) {\r
 -                              $out.="next&gt; ";\r
 -                              $out.="last&gt;&gt; ";\r
 -                      } else {\r
 -                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']+1))).'">next&gt;</a> ';\r
 -                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>$numpages)).'">last&gt;&gt;</a> ';\r
 -                      }\r
 -                      $out.='</p>';\r
 -              } else if($query_vars['fdfilter']!='') {\r
 -                      $out.='<p>No matches</p>';\r
 -              }\r
 -\r
 -        return $out;\r
 -    }\r
 -\r
 -      \r
 -    function show_search($query_vars) {\r
 -\r
 -              $out='';\r
 -              $out.='<form name="searchform" action="" method="get">';\r
 -              $out.='<p><input name="fdfilter" type="text" value="'.$query_vars['fdfilter'].'" size="30"> ';\r
 -              $out.='<input type="submit" value="Search"></p>';\r
 -\r
 -              $out.='<input type="hidden" name="page_id" value="'.get_query_var('page_id').'">';\r
 -              foreach($query_vars as $name => $value) {\r
 -                      if($value !== null && $name != 'fdfilter')\r
 -                              $out.='<input type="hidden" name="'.$name.'" value="'.$value.'">';\r
 -              }\r
 -              \r
 -              $out.='</form>'."\n";\r
 -              \r
 -        return $out;\r
 -    }\r
 -      \r
 -\r
 -    function show_apps($xml,$query_vars,&$numpages) {\r
 -      \r
 -        $skipped=0;\r
 -        $got=0;\r
 -        $total=0;\r
 -\r
 -              if($query_vars['fdstyle']=='grid') {\r
 -                      $outputter = new FDOutGrid();\r
 -              } else {\r
 -                      $outputter = new FDOutList();\r
 -              }\r
 -              \r
 -              $out = "";\r
 -              \r
 -              $out.=$outputter->outputStart();\r
 -              \r
 -        foreach($xml->children() as $app) {\r
 -\r
 -            if($app->getName() == 'repo') continue;\r
 -            $appinfo['attrs']=$app->attributes();\r
 -            $appinfo['id']=$appinfo['attrs']['id'];\r
 -            foreach($app->children() as $el) {\r
 -                switch($el->getName()) {\r
 -                    case "name":\r
 -                        $appinfo['name']=$el;\r
 -                        break;\r
 -                    case "icon":\r
 -                        $appinfo['icon']=$el;\r
 -                        break;\r
 -                    case "summary":\r
 -                        $appinfo['summary']=$el;\r
 -                        break;\r
 -                    case "description":\r
 -                        $appinfo['description']=$el;\r
 -                        break;\r
 -                    case "license":\r
 -                        $appinfo['license']=$el;\r
 -                        break;\r
 -                }\r
 -            }\r
 -\r
 -            if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']) || stristr($appinfo['description'],$query_vars['fdfilter']))) {\r
 -                if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) {\r
 -                    $skipped++;\r
 -                } else if($got<$outputter->perpage) {\r
 -                                      $out.=$outputter->outputEntry($query_vars, $appinfo);\r
 -                    $got++;\r
 -                }\r
 -                $total++;\r
 -            }\r
 -\r
 -        }\r
 -              \r
 -              $out.=$outputter->outputEnd();\r
 -              \r
 -              $numpages = ceil((float)$total/$outputter->perpage);\r
 -              \r
 -              return $out;\r
 -      }\r
 -}\r
 -\r
 -// Class to output app entries in a detailed list format\r
 -class FDOutList\r
 -{\r
 -      var $perpage=30;\r
 -\r
 -      function FDOutList() {\r
 -      }\r
 -\r
 -      function outputStart() {\r
 -              return '';\r
 -      }\r
 -      \r
 -      function outputEntry($query_vars, $appinfo) {\r
 -              $out="";\r
 -              $out.="<hr>\n";\r
 -              $out.='<div id="appheader">';\r
 -\r
 -              $out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;"></div>';\r
 -\r
 -              $out.='<div style="float:right;">';\r
 -              $out.='<p><a href="';\r
 -              $out.=makelink($query_vars, array('fdid'=>$appinfo['id']));\r
 -              $out.='">Details...</a>';\r
 -              $out.="</p>";\r
 -              $out.="</div>\n";\r
 -\r
 -              $out.='<p><span style="font-size:20px">'.$appinfo['name']."</span>";\r
 -              $out.="<br>".$appinfo['summary']."</p>\n";\r
 -\r
 -              $out.="</div>\n";\r
 -              \r
 -              return $out;\r
 -      }\r
 -\r
 -      function outputEnd() {\r
 -              return '';\r
 -      }\r
 -}\r
 -\r
 -// Class to output app entries in a compact grid format\r
 -class FDOutGrid\r
 -{\r
 -      var $perpage=80;\r
 -\r
 -      var $itemCount = 0;\r
 -\r
 -      function FDOutGrid() {\r
 -      }\r
 -\r
 -      function outputStart() {\r
 -              return "\n".'<table border="0" width="100%"><tr>'."\n";\r
 -      }\r
 -      \r
 -      function outputEntry($query_vars, $appinfo) {\r
 -              $link=makelink($query_vars, array('fdid'=>$appinfo['id']));\r
 -\r
 -              $out='';\r
 -\r
 -              if($this->itemCount%4 == 0 && $this->itemCount > 0)\r
 -              {\r
 -                      $out.='</tr><tr>'."\n";\r
 -              }\r
 -\r
 -              $out.='<td align="center" valign="top" style="background-color:#F8F8F8;">';\r
 -              $out.='<p>';\r
 -              $out.='<div id="appheader" style="text-align:center;width:110px;">';\r
 -\r
 -              $out.='<a href="'.$link.'" style="border-bottom-style:none;">';\r
 -              $out.='<img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;border-width:0;padding-top:5px;padding-bottom:5px;"><br/>';\r
 -              $out.=$appinfo['name'].'<br/>';\r
 -              $out.='</a>';\r
 -\r
 -              $out.="</div>";\r
 -              $out.='</p>';\r
 -              $out.="</td>\n";\r
 -              \r
 -              $this->itemCount++;\r
 -              return $out;\r
 -      }\r
 -\r
 -      function outputEnd() {\r
 -              return '</tr></table>'."\n";\r
 -      }\r
 -}\r
 -\r
 -// Make a link to this page, with the current query vars attached and desired params added/modified\r
 -function makelink($query_vars, $params=array()) {\r
 -      $link=get_permalink();\r
 -      $vars=linkify(array_merge($query_vars, $params));\r
 -      if(strlen($vars)==0)\r
 -              return $link;\r
 -      if(strpos($link,'?')===false)\r
 -              $link.='?';\r
 -      else\r
 -              $link.='&';\r
 -      return $link.$vars;\r
 -}\r
 -\r
 -// Return the key value pairs in http-get-parameter format as a string\r
 -function linkify($vars) {\r
 -      $retvar = '';\r
 -      foreach($vars as $k => $v) {\r
 -              if($k!==null && $v!==null && $v!='')\r
 -                      $retvar .= $k.'='.$v.'&';\r
 -      }\r
 -      return substr($retvar,0,-1);\r
 -}\r
 -\r
 -\r
 -$wp_fdroid = new FDroid();\r
 -\r
 -\r
 -?>\r
 +<?php
 +/*
 +Plugin Name: WP FDroid
 +Plugin URI: http://f-droid.org/repository
 +Description: An FDroid repository browser
 +Author: Ciaran Gultnieks
 +Version: 0.01
 +Author URI: http://ciarang.com
 +
 +Revision history
 +0.01 - 2010-12-04: Initial development version
 +
 +*/
 +
 +class FDroid
 +{
 +
 +      // Our text domain, for internationalisation
 +      private $textdom='wp-fdroid';
 +
 +      private $site_path;
 +
 +      // Constructor
 +      function FDroid() {
 +              // Add filters etc here!
 +              add_shortcode('fdroidrepo',array($this, 'do_shortcode'));
 +              add_filter('query_vars',array($this, 'queryvars'));
 +              $this->inited=false;
 +              $this->site_path=getenv('DOCUMENT_ROOT');
 +      }
 +
 +
 +      // Register additional query variables. (Handler for the 'query_vars' filter)
 +      function queryvars($qvars) {
 +              $qvars[]='fdfilter';
 +              $qvars[]='fdid';
 +              $qvars[]='fdpage';
 +              $qvars[]='fdstyle';
 +              return $qvars;
 +      }
 +
 +
 +      // Lazy initialise. All non-trivial members should call this before doing anything else.
 +      function lazyinit() {
 +              if(!$this->inited) {
 +                      load_plugin_textdomain($this->textdom, PLUGINDIR.'/'.dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));
 +
 +                      $this->inited=true;
 +              }
 +      }
 +
 +      // Gets a required query parameter by name.
 +      function getrequiredparam($name) {
 +              global $wp_query;
 +              if(!isset($wp_query->query_vars[$name]))
 +                      wp_die("Missing parameter ".$name,"Error");
 +              return $wp_query->query_vars[$name];
 +      }
 +
 +      // Handler for the 'fdroidrepo' shortcode.
 +      //  $attribs - shortcode attributes
 +      //  $content - optional content enclosed between the starting and
 +      //                       ending shortcode
 +      // Returns the generated content.
 +      function do_shortcode($attribs,$content=null) {
 +              global $wp_query,$wp_rewrite;
 +              $this->lazyinit();
 +
 +              // Init local query vars
 +              foreach($this->queryvars(array()) as $qv) {
 +                      if(array_key_exists($qv,$wp_query->query_vars)) {
 +                              $query_vars[$qv] = $wp_query->query_vars[$qv];
 +                      } else {
 +                              $query_vars[$qv] = null;
 +                      }
 +              }
 +
 +              // Santiy check query vars
 +              if(!isset($query_vars['fdpage']) || !is_numeric($query_vars['fdpage']) || $query_vars['fdpage'] <= 0) {
 +                      $query_vars['fdpage'] = 1;
 +              }
 +
 +              $out = '';
 +
 +              if(isset($attribs['search']) && $query_vars['fdfilter']===null) {
 +                      $query_vars['fdfilter'] = '';
 +              }
 +
 +              if($query_vars['fdid']!==null) {
 +                      $out.=$this->get_app($query_vars);
 +              } else {
 +                      if($query_vars['fdfilter'] !== null)
 +                              $out.=$this->show_search($query_vars);
 +
 +                      $out.=$this->get_apps($query_vars);
 +              }
 +
 +              return $out;
 +      }
 +
 +
 +      function get_app($query_vars) {
 +
 +              $xml = simplexml_load_file($this->site_path."/repo/index.xml");
 +              foreach($xml->children() as $app) {
 +
 +                      $attrs=$app->attributes();
 +                      if($attrs['id']==$query_vars['fdid']) {
 +                              $apks=array();;
 +                              foreach($app->children() as $el) {
 +                                      switch($el->getName()) {
 +                                              case "name":
 +                                                      $name=$el;
 +                                                      break;
 +                                              case "icon":
 +                                                      $icon=$el;
 +                                                      break;
 +                                              case "summary":
 +                                                      $summary=$el;
 +                                                      break;
 +                                              case "description":
 +                                                      $desc=$el;
 +                                                      break;
 +                                              case "license":
 +                                                      $license=$el;
 +                                                      break;
 +                                              case "source":
 +                                                      $source=$el;
 +                                                      break;
 +                                              case "tracker":
 +                                                      $issues=$el;
 +                                                      break;
 +                                              case "donate":
 +                                                      $donate=$el;
 +                                                      break;
 +                                              case "web":
 +                                                      $web=$el;
 +                                                      break;
 +                                              case "package":
 +                                                      $thisapk=array();
 +                                                      foreach($el->children() as $pel) {
 +                                                              switch($pel->getName()) {
 +                                                              case "version":
 +                                                                      $thisapk['version']=$pel;
 +                                                                      break;
 +                                                              case "vercode":
 +                                                                      $thisapk['vercode']=$pel;
 +                                                                      break;
 +                                                              case "apkname":
 +                                                                      $thisapk['apkname']=$pel;
 +                                                                      break;
 +                                                              case "srcname":
 +                                                                      $thisapk['srcname']=$pel;
 +                                                                      break;
 +                                                              case "hash":
 +                                                                      $thisapk['hash']=$pel;
 +                                                                      break;
 +                                                              case "size":
 +                                                                      $thisapk['size']=$pel;
 +                                                                      break;
 +                                                              case "sdkver":
 +                                                                      $thisapk['sdkver']=$pel;
 +                                                                      break;
 +                                                              case "permissions":
 +                                                                      $thisapk['permissions']=$pel;
 +                                                                      break;
 +                                                              }
 +                                                      }
 +                                                      $apks[]=$thisapk;
 +
 +                                      }
 +                              }
 +
 +                              $out='<div id="appheader">';
 +                              $out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$icon.'" width=48></div>';
 +                              $out.='<p><span style="font-size:20px">'.$name."</span>";
 +                              $out.="<br>".$summary."</p>";
 +                              $out.="</div>";
 +
 +                              $out.="<p>".$desc."</p>";
 +
 +                              $out.="<p><b>License:</b> ".$license."</p>";
 +
 +                              $out.="<p>";
 +                              if(strlen($web)>0)
 +                                      $out.='<b>Website:</b> <a href="'.$web.'">'.$web.'</a><br />';
 +                              if(strlen($issues)>0)
 +                                      $out.='<b>Issue Tracker:</b> <a href="'.$issues.'">'.$issues.'</a><br />';
 +                              if(strlen($source)>0)
 +                                      $out.='<b>Source Code:</b> <a href="'.$source.'">'.$source.'</a><br />';
 +                              if($donate && strlen($donate)>0)
 +                                      $out.='<b>Donate:</b> <a href="'.$donate.'">'.$donate.'</a><br />';
 +                              $out.="</p>";
 +
 +                              $out.="<h3>Packages</h3>";
 +                              foreach($apks as $apk) {
 +                                      $out.="<p><b>Version ".$apk['version']."</b> - ";
 +                                      $out.='<a href="http://f-droid.org/repo/'.$apk['apkname'].'">download</a> ';
 +                                      $out.=$apk['size']." bytes";
 +                                      if($apk['srcname'])
 +                                              $out.='<br><a href="http://f-droid.org/repo/'.$apk['srcname'].'">source tarball</a>';
 +                                      $out.="</p>";
 +                              }
 +
 +                              $out.='<hr><p><a href="'.makelink($query_vars,array('fdid'=>null)).'">Index</a></p>';
 +
 +                              return $out;
 +                      }
 +              }
 +              return "<p>Application not found</p>";
 +      }
 +
 +
 +      function get_apps($query_vars) {
 +
 +              $xml = simplexml_load_file($this->site_path."/repo/index.xml");
 +              $matches = $this->show_apps($xml,$query_vars,$numpages);
 +
 +              $out='';
 +
 +              if(($query_vars['fdfilter']===null || $query_vars['fdfilter']!='') && $numpages>0)
 +              {
 +                      $out.='<div style="float:left;">';
 +                      if($query_vars['fdfilter']===null)
 +                              $out.="All applications";
 +                      else
 +                              $out.='Applications matching "'.$query_vars['fdfilter'].'"';
 +                      $out.="</div>";
 +
 +                      $out.='<div style="float:right;">';
 +                              $out.='<a href="'.makelink($query_vars, array('fdstyle'=>'list','fdpage'=>'1')).'">List</a> | ';
 +                              $out.='<a href="'.makelink($query_vars, array('fdstyle'=>'grid','fdpage'=>'1')).'">Grid</a>';
 +                      $out.='</div>';
 +
 +                      $out.='<br break="all"/>';
 +              }
 +
 +              if($numpages>0) {
 +                      $out.=$matches;
 +
 +                      $out.='<hr><p>';
 +                      if($query_vars['fdpage']==1) {
 +                              $out.="&lt;&lt;first ";
 +                              $out.="&lt;prev ";
 +                      } else {
 +                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>1)).'">&lt;&lt;first</a> ';
 +                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']-1))).'">&lt;&lt;prev</a> ';
 +                      }
 +                      $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' ';
 +                      if($query_vars['fdpage']==$numpages) {
 +                              $out.="next&gt; ";
 +                              $out.="last&gt;&gt; ";
 +                      } else {
 +                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']+1))).'">next&gt;</a> ';
 +                              $out.='<a href="'.makelink($query_vars, array('fdpage'=>$numpages)).'">last&gt;&gt;</a> ';
 +                      }
 +                      $out.='</p>';
 +              } else if($query_vars['fdfilter']!='') {
 +                      $out.='<p>No matches</p>';
 +              }
 +
 +              return $out;
 +      }
 +
 +
 +      function show_search($query_vars) {
 +
 +              $out='';
 +              $out.='<form name="searchform" action="" method="get">';
 +              $out.='<p><input name="fdfilter" type="text" value="'.$query_vars['fdfilter'].'" size="30"> ';
 +              $out.='<input type="submit" value="Search"></p>';
 +
 +              $out.='<input type="hidden" name="page_id" value="'.get_query_var('page_id').'">';
 +              foreach($query_vars as $name => $value) {
 +                      if($value !== null && $name != 'fdfilter')
 +                              $out.='<input type="hidden" name="'.$name.'" value="'.$value.'">';
 +              }
 +
 +              $out.='</form>'."\n";
 +
 +              return $out;
 +      }
 +
 +
 +      function show_apps($xml,$query_vars,&$numpages) {
 +
 +              $skipped=0;
 +              $got=0;
 +              $total=0;
 +
 +              if($query_vars['fdstyle']=='grid') {
 +                      $outputter = new FDOutGrid();
 +              } else {
 +                      $outputter = new FDOutList();
 +              }
 +
 +              $out = "";
 +
 +              $out.=$outputter->outputStart();
 +
 +              foreach($xml->children() as $app) {
 +
 +                      if($app->getName() == 'repo') continue;
 +                      $appinfo['attrs']=$app->attributes();
 +                      $appinfo['id']=$appinfo['attrs']['id'];
 +                      foreach($app->children() as $el) {
 +                              switch($el->getName()) {
 +                                      case "name":
 +                                              $appinfo['name']=$el;
 +                                              break;
 +                                      case "icon":
 +                                              $appinfo['icon']=$el;
 +                                              break;
 +                                      case "summary":
 +                                              $appinfo['summary']=$el;
 +                                              break;
++                                      case "description":
++                                              $appinfo['description']=$el;
++                                              break;
 +                                      case "license":
 +                                              $appinfo['license']=$el;
 +                                              break;
 +                              }
 +                      }
 +
-                       if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']))) {
++                      if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']) || stristr($appinfo['description'],$query_vars['fdfilter']))) {
 +                              if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) {
 +                                      $skipped++;
 +                              } else if($got<$outputter->perpage) {
 +                                      $out.=$outputter->outputEntry($query_vars, $appinfo);
 +                                      $got++;
 +                              }
 +                              $total++;
 +                      }
++
 +              }
 +
 +              $out.=$outputter->outputEnd();
 +
 +              $numpages = ceil((float)$total/$outputter->perpage);
 +
 +              return $out;
 +      }
 +}
 +
 +// Class to output app entries in a detailed list format
 +class FDOutList
 +{
 +      var $perpage=30;
 +
 +      function FDOutList() {
 +      }
 +
 +      function outputStart() {
 +              return '';
 +      }
 +
 +      function outputEntry($query_vars, $appinfo) {
 +              $out="";
 +              $out.="<hr>\n";
 +              $out.='<div id="appheader">';
 +
 +              $out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;"></div>';
 +
 +              $out.='<div style="float:right;">';
 +              $out.='<p><a href="';
 +              $out.=makelink($query_vars, array('fdid'=>$appinfo['id']));
 +              $out.='">Details...</a>';
 +              $out.="</p>";
 +              $out.="</div>\n";
 +
 +              $out.='<p><span style="font-size:20px">'.$appinfo['name']."</span>";
 +              $out.="<br>".$appinfo['summary']."</p>\n";
 +
 +              $out.="</div>\n";
 +
 +              return $out;
 +      }
 +
 +      function outputEnd() {
 +              return '';
 +      }
 +}
 +
 +// Class to output app entries in a compact grid format
 +class FDOutGrid
 +{
 +      var $perpage=80;
 +
 +      var $itemCount = 0;
 +
 +      function FDOutGrid() {
 +      }
 +
 +      function outputStart() {
 +              return "\n".'<table border="0" width="100%"><tr>'."\n";
 +      }
 +
 +      function outputEntry($query_vars, $appinfo) {
 +              $link=makelink($query_vars, array('fdid'=>$appinfo['id']));
 +
 +              $out='';
 +
 +              if($this->itemCount%4 == 0 && $this->itemCount > 0)
 +              {
 +                      $out.='</tr><tr>'."\n";
 +              }
 +
 +              $out.='<td align="center" valign="top" style="background-color:#F8F8F8;">';
 +              $out.='<p>';
 +              $out.='<div id="appheader" style="text-align:center;width:110px;">';
 +
 +              $out.='<a href="'.$link.'" style="border-bottom-style:none;">';
 +              $out.='<img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;border-width:0;padding-top:5px;padding-bottom:5px;"><br/>';
 +              $out.=$appinfo['name'].'<br/>';
 +              $out.='</a>';
 +
 +              $out.="</div>";
 +              $out.='</p>';
 +              $out.="</td>\n";
 +
 +              $this->itemCount++;
 +              return $out;
 +      }
 +
 +      function outputEnd() {
 +              return '</tr></table>'."\n";
 +      }
 +}
 +
 +// Make a link to this page, with the current query vars attached and desired params added/modified
 +function makelink($query_vars, $params=array()) {
 +      $link=get_permalink();
 +      $vars=linkify(array_merge($query_vars, $params));
 +      if(strlen($vars)==0)
 +              return $link;
 +      if(strpos($link,'?')===false)
 +              $link.='?';
 +      else
 +              $link.='&';
 +      return $link.$vars;
 +}
 +
 +// Return the key value pairs in http-get-parameter format as a string
 +function linkify($vars) {
 +      $retvar = '';
 +      foreach($vars as $k => $v) {
 +              if($k!==null && $v!==null && $v!='')
 +                      $retvar .= $k.'='.$v.'&';
 +      }
 +      return substr($retvar,0,-1);
 +}
 +
 +
 +$wp_fdroid = new FDroid();
 +
 +
 +?>