diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 2168d76c..d4f09cd6 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -1,455 +1,455 @@ -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); - } +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='
'; - $out.='
'; - $out.='

'.$name.""; - $out.="
".$summary."

"; - $out.="
"; - - $out.="

".$desc."

"; - - $out.="

License: ".$license."

"; - - $out.="

"; - if(strlen($web)>0) - $out.='Website: '.$web.'
'; - if(strlen($issues)>0) - $out.='Issue Tracker: '.$issues.'
'; - if(strlen($source)>0) - $out.='Source Code: '.$source.'
'; - if($donate && strlen($donate)>0) - $out.='Donate: '.$donate.'
'; - $out.="

"; - - $out.="

Packages

"; - foreach($apks as $apk) { - $out.="

Version ".$apk['version']." - "; - $out.='download '; - $out.=$apk['size']." bytes"; - if($apk['srcname']) - $out.='
source tarball'; - $out.="

"; - } - - $out.='

Index

'; - - return $out; - } - } - return "

Application not found

"; - } - - - 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.='
'; - if($query_vars['fdfilter']===null) - $out.="All applications"; - else - $out.='Applications matching "'.$query_vars['fdfilter'].'"'; - $out.="
"; - - $out.='
'; - $out.='List | '; - $out.='Grid'; - $out.='
'; - - $out.='
'; - } - - if($numpages>0) { - $out.=$matches; - - $out.='

'; - if($query_vars['fdpage']==1) { - $out.="<<first "; - $out.="<prev "; - } else { - $out.='<<first '; - $out.='<<prev '; - } - $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' '; - if($query_vars['fdpage']==$numpages) { - $out.="next> "; - $out.="last>> "; - } else { - $out.='next> '; - $out.='last>> '; - } - $out.='

'; - } else if($query_vars['fdfilter']!='') { - $out.='

No matches

'; - } - - return $out; - } - - - function show_search($query_vars) { - - $out=''; - $out.='
'; - $out.='

'; - $out.='

'; - - $out.=''; - foreach($query_vars as $name => $value) { - if($value !== null && $name != 'fdfilter') - $out.=''; - } - - $out.='
'."\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 "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($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.="
\n"; - $out.='
'; - - $out.='
'; - - $out.='
'; - $out.='

Details...'; - $out.="

"; - $out.="
\n"; - - $out.='

'.$appinfo['name'].""; - $out.="
".$appinfo['summary']."

\n"; - - $out.="
\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".''."\n"; - } - - function outputEntry($query_vars, $appinfo) { - $link=makelink($query_vars, array('fdid'=>$appinfo['id'])); - - $out=''; - - if($this->itemCount%4 == 0 && $this->itemCount > 0) - { - $out.=''."\n"; - } - - $out.='\n"; - - $this->itemCount++; - return $out; - } - - function outputEnd() { - return '
'; - $out.='

'; - $out.='

"; - $out.='

'; - $out.="
'."\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(); - - -?> +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='
'; + $out.='
'; + $out.='

'.$name.""; + $out.="
".$summary."

"; + $out.="
"; + + $out.="

".$desc."

"; + + $out.="

License: ".$license."

"; + + $out.="

"; + if(strlen($web)>0) + $out.='Website: '.$web.'
'; + if(strlen($issues)>0) + $out.='Issue Tracker: '.$issues.'
'; + if(strlen($source)>0) + $out.='Source Code: '.$source.'
'; + if($donate && strlen($donate)>0) + $out.='Donate: '.$donate.'
'; + $out.="

"; + + $out.="

Packages

"; + foreach($apks as $apk) { + $out.="

Version ".$apk['version']." - "; + $out.='download '; + $out.=$apk['size']." bytes"; + if($apk['srcname']) + $out.='
source tarball'; + $out.="

"; + } + + $out.='

Index

'; + + return $out; + } + } + return "

Application not found

"; + } + + + 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.='
'; + if($query_vars['fdfilter']===null) + $out.="All applications"; + else + $out.='Applications matching "'.$query_vars['fdfilter'].'"'; + $out.="
"; + + $out.='
'; + $out.='List | '; + $out.='Grid'; + $out.='
'; + + $out.='
'; + } + + if($numpages>0) { + $out.=$matches; + + $out.='

'; + if($query_vars['fdpage']==1) { + $out.="<<first "; + $out.="<prev "; + } else { + $out.='<<first '; + $out.='<<prev '; + } + $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' '; + if($query_vars['fdpage']==$numpages) { + $out.="next> "; + $out.="last>> "; + } else { + $out.='next> '; + $out.='last>> '; + } + $out.='

'; + } else if($query_vars['fdfilter']!='') { + $out.='

No matches

'; + } + + return $out; + } + + + function show_search($query_vars) { + + $out=''; + $out.='
'; + $out.='

'; + $out.='

'; + + $out.=''; + foreach($query_vars as $name => $value) { + if($value !== null && $name != 'fdfilter') + $out.=''; + } + + $out.='
'."\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 "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($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.="
\n"; + $out.='
'; + + $out.='
'; + + $out.='
'; + $out.='

Details...'; + $out.="

"; + $out.="
\n"; + + $out.='

'.$appinfo['name'].""; + $out.="
".$appinfo['summary']."

\n"; + + $out.="
\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".''."\n"; + } + + function outputEntry($query_vars, $appinfo) { + $link=makelink($query_vars, array('fdid'=>$appinfo['id'])); + + $out=''; + + if($this->itemCount%4 == 0 && $this->itemCount > 0) + { + $out.=''."\n"; + } + + $out.='\n"; + + $this->itemCount++; + return $out; + } + + function outputEnd() { + return '
'; + $out.='

'; + $out.='

"; + $out.='

'; + $out.="
'."\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(); + + +?>