From b9ca398d17863ad9a679d220dd742b0480fa80b6 Mon Sep 17 00:00:00 2001 From: Michael Hamann Date: Thu, 1 Aug 2013 20:50:37 +0200 Subject: Extension manager: implemented more extension info and basic repository access --- lib/plugins/extension/helper/repository.php | 112 ++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 lib/plugins/extension/helper/repository.php (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php new file mode 100644 index 000000000..37b9bc02c --- /dev/null +++ b/lib/plugins/extension/helper/repository.php @@ -0,0 +1,112 @@ + + */ + +if (!defined('EXTENSION_REPOSITORY_API_ENDPOINT')) + define('EXTENSION_REPSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php'); + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Class helper_plugin_extension_repository provides access to the extension repository on dokuwiki.org + */ +class helper_plugin_extension_repository extends DokuWiki_Plugin { + private $loaded_extensions = array(); + private $has_access = null; + /** + * Initialize the repository (cache), fetches data for all installed plugins + */ + public function init() { + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + if ($this->hasAccess()) { + $list = $plugin_controller->getList('', true); + $request_data = array('fmt' => 'php'); + $request_needed = false; + foreach ($list as $name) { + $cache = new cache('##extension_manager##'.$name, 'repo'); + $result = null; + if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { + $this->loaded_extensions[$name] = true; + $request_data['ext'][] = $name; + $request_needed = true; + } + } + + if ($request_needed) { + $httpclient = new DokuHTTPClient(); + $data = $httpclient->post(EXTENSION_REPSITORY_API, $request_data); + if ($data !== false) { + $extensions = unserialize($data); + foreach ($extensions as $extension) { + $cache = new cache('##extension_manager##'.$extension['plugin'], 'repo'); + $cache->storeCache(serialize($extension)); + } + } else { + $this->has_access = false; + } + } + } + } + + /** + * If repository access is available + * + * @return bool If repository access is available + */ + public function hasAccess() { + if ($this->has_access === null) { + $cache = new cache('##extension_manager###hasAccess', 'repo'); + $result = null; + if (!$cache->useCache(array('age' => 3600 * 24))) { + $httpclient = new DokuHTTPClient(); + $httpclient->timeout = 5; + $data = $httpclient->get(EXTENSION_REPSITORY_API.'?cmd=ping'); + if ($data !== false) { + $this->has_access = true; + $cache->storeCache(1); + } else { + $this->has_access = false; + $cache->storeCache(0); + } + } else { + $this->has_access = ($cache->retrieveCache(false) == 1); + } + } + return $this->has_access; + } + + /** + * Get the remote data of an individual plugin or template + * + * @param string $name The plugin name to get the data for, template names need to be prefix by 'template:' + * @return array The data or null if nothing was found (possibly no repository access) + */ + public function getData($name) { + $cache = new cache('##extension_manager##'.$name, 'repo'); + $result = null; + if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { + $this->loaded_extensions[$name] = true; + $httpclient = new DokuHTTPClient(); + $data = $httpclient->get(EXTENSION_REPSITORY_API.'?fmt=php&ext[]='.urlencode($name)); + if ($data !== false) { + $result = unserialize($data); + $cache->storeCache(serialize($result[0])); + return $result[0]; + } else { + $this->has_access = false; + } + } + if (file_exists($cache->cache)) { + return unserialize($cache->retrieveCache(false)); + } + return array(); + } +} + +// vim:ts=4:sw=4:et: -- cgit v1.2.3 From 141407788877f98d4acc6eabc7cc3e831eaa8317 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Sun, 4 Aug 2013 18:22:39 +0200 Subject: fixed typo in define --- lib/plugins/extension/helper/repository.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index 37b9bc02c..459d7cbec 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -6,8 +6,10 @@ * @author Michael Hamann */ +define('EXTENSION_REPOSITORY_API', 'http://localhost/dokuwiki/lib/plugins/pluginrepo/api.php'); + if (!defined('EXTENSION_REPOSITORY_API_ENDPOINT')) - define('EXTENSION_REPSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php'); + define('EXTENSION_REPOSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php'); // must be run within Dokuwiki if(!defined('DOKU_INC')) die(); @@ -40,7 +42,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { if ($request_needed) { $httpclient = new DokuHTTPClient(); - $data = $httpclient->post(EXTENSION_REPSITORY_API, $request_data); + $data = $httpclient->post(EXTENSION_REPOSITORY_API, $request_data); if ($data !== false) { $extensions = unserialize($data); foreach ($extensions as $extension) { @@ -66,7 +68,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { if (!$cache->useCache(array('age' => 3600 * 24))) { $httpclient = new DokuHTTPClient(); $httpclient->timeout = 5; - $data = $httpclient->get(EXTENSION_REPSITORY_API.'?cmd=ping'); + $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?cmd=ping'); if ($data !== false) { $this->has_access = true; $cache->storeCache(1); @@ -93,7 +95,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { $this->loaded_extensions[$name] = true; $httpclient = new DokuHTTPClient(); - $data = $httpclient->get(EXTENSION_REPSITORY_API.'?fmt=php&ext[]='.urlencode($name)); + $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?fmt=php&ext[]='.urlencode($name)); if ($data !== false) { $result = unserialize($data); $cache->storeCache(serialize($result[0])); -- cgit v1.2.3 From e45b5c14dbb09dd200d66ff21de1bba960113c68 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Sun, 4 Aug 2013 18:24:20 +0200 Subject: added connectivity recheck --- lib/plugins/extension/helper/repository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index 459d7cbec..a5012ccb5 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -65,7 +65,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { if ($this->has_access === null) { $cache = new cache('##extension_manager###hasAccess', 'repo'); $result = null; - if (!$cache->useCache(array('age' => 3600 * 24))) { + if (!$cache->useCache(array('age' => 3600 * 24, 'purge'=>1))) { $httpclient = new DokuHTTPClient(); $httpclient->timeout = 5; $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?cmd=ping'); -- cgit v1.2.3 From a218edff81be5cec78bfcb0f65042315ae4e656b Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Sun, 4 Aug 2013 20:24:28 +0200 Subject: removed test repository again --- lib/plugins/extension/helper/repository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index a5012ccb5..21082c0d8 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -6,7 +6,7 @@ * @author Michael Hamann */ -define('EXTENSION_REPOSITORY_API', 'http://localhost/dokuwiki/lib/plugins/pluginrepo/api.php'); +#define('EXTENSION_REPOSITORY_API', 'http://localhost/dokuwiki/lib/plugins/pluginrepo/api.php'); if (!defined('EXTENSION_REPOSITORY_API_ENDPOINT')) define('EXTENSION_REPOSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php'); -- cgit v1.2.3 From 55332151e03b99bbfd15e0fbaae391aae454d9eb Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Fri, 9 Aug 2013 13:43:35 +0200 Subject: some initial go at the search tab --- lib/plugins/extension/helper/repository.php | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index 21082c0d8..98128a9a3 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -109,6 +109,79 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { } return array(); } + + protected function cacheData($name, $data){ + + } + + /** + * Search for plugins or templates using the given query string + * + * @param string $q the query string + * @return array a list of matching extensions + */ + public function search($q){ + $query = $this->parse_query($q); + $query['fmt'] = 'php'; + + $httpclient = new DokuHTTPClient(); + $data = $httpclient->post(EXTENSION_REPOSITORY_API, $query); + if ($data === false) return array(); + $result = unserialize($data); + + $ids = array(); + + // store cache info for each extension + foreach($result as $ext){ + $name = $ext['name']; + $cache = new cache('##extension_manager##'.$name, 'repo'); + $cache->storeCache(serialize($ext)); + $ids[] = $name; + } + + return $ids; + } + + /** + * Parses special queries from the query string + * + * @param string $q + * @return array + */ + protected function parse_query($q){ + $parameters = array( + 'tag' => array(), + 'mail' => array(), + 'type' => array() + ); + + // extract tags + if(preg_match_all('/(^|\s)(tag:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['tag'][] = $m[3]; + } + } + // extract author ids + if(preg_match_all('/(^|\s)(authorid:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['mail'][] = $m[3]; + } + } + // extract types + if(preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['type'][] = $m[3]; + } + } + + // FIXME make integer from type value + + $parameters['q'] = trim($q); + return $parameters; + } } // vim:ts=4:sw=4:et: -- cgit v1.2.3 From 813d7e0910cdbb80dceef4d952adc551987c84e7 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Fri, 9 Aug 2013 14:06:34 +0200 Subject: fixed some confusion between base, id and name --- lib/plugins/extension/helper/repository.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index 98128a9a3..38e07786e 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -110,10 +110,6 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { return array(); } - protected function cacheData($name, $data){ - - } - /** * Search for plugins or templates using the given query string * @@ -133,7 +129,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { // store cache info for each extension foreach($result as $ext){ - $name = $ext['name']; + $name = $ext['plugin']; $cache = new cache('##extension_manager##'.$name, 'repo'); $cache->storeCache(serialize($ext)); $ids[] = $name; -- cgit v1.2.3 From 75e063084d865a011e074c29c5edb8569fe2cfe1 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Fri, 9 Aug 2013 22:58:01 +0200 Subject: made info mechanism work again --- lib/plugins/extension/helper/repository.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index 38e07786e..1f603a866 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -146,9 +146,10 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { */ protected function parse_query($q){ $parameters = array( - 'tag' => array(), + 'tag' => array(), 'mail' => array(), - 'type' => array() + 'type' => array(), + 'ext' => array() ); // extract tags @@ -165,6 +166,13 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { $parameters['mail'][] = $m[3]; } } + // extract extensions + if(preg_match_all('/(^|\s)(ext:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['ext'][] = $m[3]; + } + } // extract types if(preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ foreach($matches as $m){ -- cgit v1.2.3 From 59ac7beaa56f2b43310b88bceca6c68a685f19e6 Mon Sep 17 00:00:00 2001 From: Michael Hamann Date: Sat, 8 Mar 2014 11:27:28 +0100 Subject: Extension manager: Fix cache extension to be .repo The dot was missing i.e. the cache files had no real extension at all. --- lib/plugins/extension/helper/repository.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib/plugins/extension/helper/repository.php') diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php index 1f603a866..6ffe89eb7 100644 --- a/lib/plugins/extension/helper/repository.php +++ b/lib/plugins/extension/helper/repository.php @@ -31,7 +31,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { $request_data = array('fmt' => 'php'); $request_needed = false; foreach ($list as $name) { - $cache = new cache('##extension_manager##'.$name, 'repo'); + $cache = new cache('##extension_manager##'.$name, '.repo'); $result = null; if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { $this->loaded_extensions[$name] = true; @@ -46,7 +46,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { if ($data !== false) { $extensions = unserialize($data); foreach ($extensions as $extension) { - $cache = new cache('##extension_manager##'.$extension['plugin'], 'repo'); + $cache = new cache('##extension_manager##'.$extension['plugin'], '.repo'); $cache->storeCache(serialize($extension)); } } else { @@ -63,7 +63,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { */ public function hasAccess() { if ($this->has_access === null) { - $cache = new cache('##extension_manager###hasAccess', 'repo'); + $cache = new cache('##extension_manager###hasAccess', '.repo'); $result = null; if (!$cache->useCache(array('age' => 3600 * 24, 'purge'=>1))) { $httpclient = new DokuHTTPClient(); @@ -90,7 +90,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { * @return array The data or null if nothing was found (possibly no repository access) */ public function getData($name) { - $cache = new cache('##extension_manager##'.$name, 'repo'); + $cache = new cache('##extension_manager##'.$name, '.repo'); $result = null; if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { $this->loaded_extensions[$name] = true; @@ -130,7 +130,7 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin { // store cache info for each extension foreach($result as $ext){ $name = $ext['plugin']; - $cache = new cache('##extension_manager##'.$name, 'repo'); + $cache = new cache('##extension_manager##'.$name, '.repo'); $cache->storeCache(serialize($ext)); $ids[] = $name; } -- cgit v1.2.3