]> git.mjollnir.org Git - moodle.git/commitdiff
"MDL-17381, improve wikimedia repository plugin and supports thumbnail, credits to...
authorDongsheng Cai <unoter@gmail.com>
Thu, 17 Dec 2009 07:31:01 +0000 (07:31 +0000)
committerDongsheng Cai <unoter@gmail.com>
Thu, 17 Dec 2009 07:31:01 +0000 (07:31 +0000)
lang/en_utf8/repository_wikimedia.php
repository/wikimedia/repository.class.php
repository/wikimedia/wikimedia.php

index e7f2a0e2b10bf7c1d445fed7cbe03cbc5ba2920e..77d0cb4187e683282f79e6ab9cd8a94eb2a9fee4 100644 (file)
@@ -1,4 +1,4 @@
 <?php
-$string['keyword'] = 'Image name';
+$string['keyword'] = 'Full text';
 $string['repositoryname'] = 'Wikimedia';
 $string['wikimedia:view'] = 'View wikimedia repository';
index 0069a20209fe5c43644e0935b68a90bd392405d5..27a19845fdea4fff5db099f55122bcf778093eb3 100644 (file)
@@ -33,26 +33,18 @@ class repository_wikimedia extends repository {
     public function __construct($repositoryid, $context = SITEID, $options = array()) {
         parent::__construct($repositoryid, $context, $options);
         $this->keyword = optional_param('wikimedia_keyword', '', PARAM_RAW);
+        if (empty($this->keyword)) {   
+            $this->keyword = optional_param('s', '', PARAM_RAW);
+        }
     }
     public function get_listing($path = '', $page = '') {
-        global $OUTPUT;
         $client = new wikimedia;
-        $result = $client->search_images($this->keyword);
         $list = array();
-        $list['list'] = array();
-        foreach ($result as $title=>$url) {
-            $list['list'][] = array(
-                'title'=>substr($title, 5),
-                'thumbnail'=>$OUTPUT->pix_url(file_extension_icon('xx.jpg', 32)),
-                // plugin-dependent unique path to the file (id, url, path, etc.)
-                'source'=>$url,
-                // the accessible url of the file
-                'url'=>$url
-            );
-        }
+        $list['list'] = $client->search_images($this->keyword);
+        $list['nologin'] = true;
         return $list;
     }
-    // login
+   // login
     public function check_login() {
         return !empty($this->keyword);
     }
@@ -75,15 +67,16 @@ class repository_wikimedia extends repository {
     public function global_search() {
         return false;
     }
-    public function search($text) {
+    public function search($search_text) {
+        $client = new wikimedia;
         $search_result = array();
-        $search_result['list'] = array();
+        $search_result['list'] = $client->search_images($search_text);
         return $search_result;
     }
     // when logout button on file picker is clicked, this function will be
     // called.
     public function logout() {
-        return true;
+        return $this->print_login();
     }
     public static function get_type_option_names() {
         return null;
index d2f06a2639d5da93b17da828876de43b828227c2..5ec8258607875854bac06217cdd2b9e50e0e570b 100644 (file)
 
 /**
  * wikimedia class
- * A class used to browse images from wikimedia
+ * class for communication with Wikimedia Commons API
  *
- * @author Dongsheng Cai <dongsheng@moodle.com>
+ * @author Dongsheng Cai <dongsheng@moodle.com>, Raul Kern <raunator@gmail.com>
  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- */
+*/
+
+define('WIKIMEDIA_THUMBS_PER_PAGE', 24);
+define('WIKIMEDIA_FILE_NS', 6);
+define('WIKIMEDIA_IMAGE_SIDE_LENGTH', 1024);
+
 class wikimedia {
     private $_conn  = null;
     private $_param = array();
+    
     public function __construct($url = '') {
         if (empty($url)) {
             $this->api = 'http://commons.wikimedia.org/w/api.php';
@@ -90,21 +96,92 @@ class wikimedia {
         }
         return $image_urls;
     }
-    public function search_images($title) {
-        $image_urls = array();
+    /**
+     * Generate thumbnail URL from image URL.
+     *
+     * @param string $image_url
+     * @param int $orig_width
+     * @param int $orig_height
+     * @param int $thumb_width
+     * @global object OUTPUT
+     * @return string
+     */
+    public function get_thumb_url($image_url, $orig_width, $orig_height, $thumb_width=75) {
+        global $OUTPUT;
+    
+        if ($orig_width <= $thumb_width AND $orig_height <= $thumb_width) {
+            return $image_url;
+        } else {
+            $thumb_url = '';
+            $commons_main_dir = 'http://upload.wikimedia.org/wikipedia/commons/';
+            if ($image_url) {
+                $short_path = str_replace($commons_main_dir, '', $image_url);
+                $extension = pathinfo($short_path, PATHINFO_EXTENSION); 
+                if (strcmp($extension, 'gif') == 0) {  //no thumb for gifs
+                    return $OUTPUT->pix_url(file_extension_icon('xx.jpg', 32));
+                }
+                $dir_parts = explode('/', $short_path);
+                $file_name = end($dir_parts);
+                if ($orig_height > $orig_width) {
+                    $thumb_width = round($thumb_width * $orig_width/$orig_height);
+                }
+                $thumb_url = $commons_main_dir . 'thumb/' . implode('/', $dir_parts) . '/'. $thumb_width .'px-' . $file_name;
+                if (strcmp($extension, 'svg') == 0) {  //png thumb for svg-s
+                    $thumb_url .= '.png';
+                }
+            }
+            return $thumb_url;
+        }
+    }
+    /**
+     * Search for images and return photos array.
+     *
+     * @param string $keyword
+     * @return array
+     */
+    public function search_images($keyword) {
+        $files_array = array();
         $this->_param['action'] = 'query';
         $this->_param['generator'] = 'search';
-        $this->_param['gsrsearch'] = $title;
-        $this->_param['gsrnamespace'] = 6;
+        $this->_param['gsrsearch'] = $keyword;
+        $this->_param['gsrnamespace'] = WIKIMEDIA_FILE_NS;
+        $this->_param['gsrlimit'] = WIKIMEDIA_THUMBS_PER_PAGE;
         $this->_param['prop']   = 'imageinfo';
-        $this->_param['iiprop'] = 'url';
-        $content = $this->_conn->post($this->api, $this->_param);
+        $this->_param['iiprop'] = 'url|dimensions|mime';
+        $this->_param['iiurlwidth'] = WIKIMEDIA_IMAGE_SIDE_LENGTH;
+        $this->_param['iiurlheight'] = WIKIMEDIA_IMAGE_SIDE_LENGTH;
+        //didn't work with POST
+        $content = $this->_conn->get($this->api, $this->_param);
         $result = unserialize($content);
         if (!empty($result['query']['pages'])) {
             foreach ($result['query']['pages'] as $page) {
-                $image_urls[$page['title']] = $page['imageinfo'][0]['url'];
+                $title = $page['title'];
+                $file_type = $page['imageinfo'][0]['mime'];
+                $image_types = array('image/jpeg', 'image/png', 'image/gif', 'image/svg+xml');
+                if (in_array($file_type, $image_types)) {  //is image
+                    $thumbnail = $this->get_thumb_url($page['imageinfo'][0]['url'], $page['imageinfo'][0]['width'], $page['imageinfo'][0]['height']);
+                    $source = $page['imageinfo'][0]['thumburl'];        //upload scaled down image
+                    $extension = pathinfo($title, PATHINFO_EXTENSION);
+                    if (strcmp($extension, 'svg') == 0) {               //upload png version of svg-s
+                        $title .= '.png';
+                    }
+                } else {                                   //other file types
+                    $thumbnail = '';
+                    $source = $page['imageinfo'][0]['url'];
+                }
+                $files_array[] = array(
+                    'title'=>substr($title, 5),         //chop off 'File:'
+                    'thumbnail'=>$thumbnail,
+                    'thumbnail_width'=>120,
+                    'thumbnail_height'=>120,
+                    // plugin-dependent unique path to the file (id, url, path, etc.)
+                    'source'=>$source,
+                    // the accessible url of the file
+                    'url'=>$page['imageinfo'][0]['descriptionurl']
+                );
             }
         }
-        return $image_urls;
+        return $files_array;
     }
+
 }