From 6dd095f599ed20044f98d324cda37bedd57b3d3e Mon Sep 17 00:00:00 2001
From: Kate Arzamastseva <pshns@ukr.net>
Date: Tue, 2 Aug 2011 19:15:11 +0300
Subject: [PATCH] issue #10 media revisions/changes in RSS feed

---
 feed.php          | 150 +++++++++++++++++++++++++++++++++++-----------
 inc/changelog.php |   3 +-
 inc/media.php     |  11 ++--
 inc/template.php  |   2 +-
 4 files changed, 123 insertions(+), 43 deletions(-)

diff --git a/feed.php b/feed.php
index cca8661f4..1b3641cff 100644
--- a/feed.php
+++ b/feed.php
@@ -117,6 +117,8 @@ function rss_parseOptions(){
                   'show_minor'   => array('minor', false),
                   // String, only used in search mode
                   'search_query' => array('q', null),
+                // One of: pages, media, both
+                  'content_type' => array('view', 'both')
 
                  ) as $name => $val) {
         $opt[$name] = (isset($_REQUEST[$val[0]]) && !empty($_REQUEST[$val[0]]))
@@ -188,7 +190,9 @@ function rss_buildItems(&$rss,&$data,$opt){
 
             $item = new FeedItem();
             $id   = $ditem['id'];
-            $meta = p_get_metadata($id);
+            if(!$ditem['media']) {
+                $meta = p_get_metadata($id);
+            }
 
             // add date
             if($ditem['date']){
@@ -213,62 +217,134 @@ function rss_buildItems(&$rss,&$data,$opt){
             // add item link
             switch ($opt['link_to']){
                 case 'page':
-                    $item->link = wl($id,'rev='.$date,true,'&');
+                    if ($ditem['media']) {
+                        $item->link = media_managerURL(array('image' => $id,
+                            'ns' => getNS($id),
+                            'rev' => $date), '&', true);
+                    } else {
+                        $item->link = wl($id,'rev='.$date,true,'&', true);
+                    }
                     break;
                 case 'rev':
-                    $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
+                    if ($ditem['media']) {
+                        $item->link = media_managerURL(array('image' => $id,
+                            'ns' => getNS($id),
+                            'rev' => $date,
+                            'tab_details' => 'history'), '&', true);
+                    } else {
+                        $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
+                    }
                     break;
                 case 'current':
-                    $item->link = wl($id, '', true,'&');
+                    if ($ditem['media']) {
+                        $item->link = media_managerURL(array('image' => $id,
+                            'ns' => getNS($id)), '&', true);
+                    } else {
+                        $item->link = wl($id, '', true,'&');
+                    }
                     break;
                 case 'diff':
                 default:
-                    $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
+                    if ($ditem['media']) {
+                        $item->link = media_managerURL(array('image' => $id,
+                            'ns' => getNS($id),
+                            'rev' => $date,
+                            'tab_details' => 'history',
+                            'mediado' => 'diff'), '&', true);
+                    } else {
+                        $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
+                    }
             }
 
             // add item content
             switch ($opt['item_content']){
                 case 'diff':
                 case 'htmldiff':
-                    require_once(DOKU_INC.'inc/DifferenceEngine.php');
-                    $revs = getRevisions($id, 0, 1);
-                    $rev = $revs[0];
-
-                    if($rev){
-                        $df  = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
-                                        explode("\n",htmlspecialchars(rawWiki($id,''))));
-                    }else{
-                        $df  = new Diff(array(''),
-                                        explode("\n",htmlspecialchars(rawWiki($id,''))));
-                    }
-
-                    if($opt['item_content'] == 'htmldiff'){
-                        $tdf = new TableDiffFormatter();
-                        $content  = '<table>';
-                        $content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
-                        $content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
-                        $content .= $tdf->format($df);
-                        $content .= '</table>';
-                    }else{
-                        $udf = new UnifiedDiffFormatter();
-                        $content = "<pre>\n".$udf->format($df)."\n</pre>";
+                    if ($ditem['media']) {
+                        $revs = getRevisions($id, 0, 1, 8192, true);
+                        $rev = $revs[0];
+                        $src_r = '';
+                        $src_l = '';
+
+                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
+                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+                            $src_r = ml($id, $more);
+                        }
+                        if ($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)){
+                            $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
+                            $src_l = ml($id, $more);
+                        }
+                        $content = '';
+                        if ($src_r) {
+                            $content  = '<table>';
+                            $content .= '<tr><th width="50%">'.$rev.'</th>';
+                            $content .= '<th width="50%">'.$lang['current'].'</th></tr>';
+                            $content .= '<tr align="center"><td><img src="'.$src_l.'" alt="" /></td><td>';
+                            $content .= '<img src="'.$src_r.'" alt="'.$id.'" /></td></tr>';
+                            $content .= '</table>';
+                        }
+
+                    } else {
+                        require_once(DOKU_INC.'inc/DifferenceEngine.php');
+                        $revs = getRevisions($id, 0, 1);
+                        $rev = $revs[0];
+
+                        if($rev){
+                            $df  = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
+                                            explode("\n",htmlspecialchars(rawWiki($id,''))));
+                        }else{
+                            $df  = new Diff(array(''),
+                                            explode("\n",htmlspecialchars(rawWiki($id,''))));
+                        }
+
+                        if($opt['item_content'] == 'htmldiff'){
+                            $tdf = new TableDiffFormatter();
+                            $content  = '<table>';
+                            $content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
+                            $content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
+                            $content .= $tdf->format($df);
+                            $content .= '</table>';
+                        }else{
+                            $udf = new UnifiedDiffFormatter();
+                            $content = "<pre>\n".$udf->format($df)."\n</pre>";
+                        }
                     }
                     break;
                 case 'html':
-                    $content = p_wiki_xhtml($id,$date,false);
-                    // no TOC in feeds
-                    $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
-
-                    // make URLs work when canonical is not set, regexp instead of rerendering!
-                    if(!$conf['canonical']){
-                        $base = preg_quote(DOKU_REL,'/');
-                        $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
+                    if ($ditem['media']) {
+                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
+                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+                            $src = ml($id, $more);
+                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
+                        } else {
+                            $content = '';
+                        }
+                    } else {
+                        $content = p_wiki_xhtml($id,$date,false);
+                        // no TOC in feeds
+                        $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
+
+                        // make URLs work when canonical is not set, regexp instead of rerendering!
+                        if(!$conf['canonical']){
+                            $base = preg_quote(DOKU_REL,'/');
+                            $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
+                        }
                     }
 
                     break;
                 case 'abstract':
                 default:
-                    $content = $meta['description']['abstract'];
+                    if ($ditem['media']) {
+                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
+                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+                            $src = ml($id, $more);
+                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
+                        } else {
+                            $content = '';
+                        }
+                    } else {
+                        $content = $meta['description']['abstract'];
+                    }
             }
             $item->description = $content; //FIXME a plugin hook here could be senseful
 
@@ -336,6 +412,8 @@ function rss_buildItems(&$rss,&$data,$opt){
 function rssRecentChanges($opt){
     $flags = RECENTS_SKIP_DELETED;
     if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
+    if($opt['content_type'] == 'media') $flags += RECENTS_MEDIA_CHANGES;
+    if($opt['content_type'] == 'both') $flags += RECENTS_MEDIA_PAGES_MIXED;
 
     $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
     return $recents;
diff --git a/inc/changelog.php b/inc/changelog.php
index 188670397..395e793c1 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -316,8 +316,7 @@ function _handleRecent($line,$ns,$flags,&$seen){
     if ($recent['perms'] < AUTH_READ) return false;
 
     // check existance
-    $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id']));
-    if((!@file_exists($fn)) && ($flags & RECENTS_SKIP_DELETED)) return false;
+    if(!@file_exists(wikiFN($recent['id'])) && !@file_exists(mediaFN($recent['id'])) && $flags & RECENTS_SKIP_DELETED) return false;
 
     return $recent;
 }
diff --git a/inc/media.php b/inc/media.php
index 99567632c..c57afedfb 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -905,14 +905,13 @@ function media_preview_buttons($image, $auth, $rev=false) {
  * @param JpegMeta $meta
  * @return array
  */
-function media_image_preview_size($image, $rev, $meta) {
+function media_image_preview_size($image, $rev, $meta, $size = 500) {
     if (!preg_match("/\.(jpe?g|gif|png)$/", $image)) return false;
 
     $info = getimagesize(mediaFN($image, $rev));
     $w = (int) $info[0];
     $h = (int) $info[1];
 
-    $size = 500;
     if($meta && ($w > $size || $h > $size)){
         $ratio = $meta->getResizeRatio($size, $size);
         $w = floor($w * $ratio);
@@ -1017,6 +1016,10 @@ function media_diff($image, $ns, $auth) {
     }else{
         $rev2 = (int) $_REQUEST['rev2'];
     }
+
+    if ($rev1 && !file_exists(mediaFN($image, $rev1))) $rev1 = false;
+    if ($rev2 && !file_exists(mediaFN($image, $rev2))) $rev2 = false;
+
     if($rev1 && $rev2){            // two specific revisions wanted
         // make sure order is correct (older on the left)
         if($rev1 < $rev2){
@@ -1477,7 +1480,7 @@ function media_printimgdetail($item, $fullscreen=false){
  * @param string $amp - separator
  * @return string - link
  */
-function media_managerURL($params=false, $amp='&amp;') {
+function media_managerURL($params=false, $amp='&amp;', $abs=false) {
     global $conf;
     global $ID;
 
@@ -1498,7 +1501,7 @@ function media_managerURL($params=false, $amp='&amp;') {
         unset($gets['tab_details']);
     }
 
-    return wl($ID,$gets,false,$amp);
+    return wl($ID,$gets,$abs,$amp);
 }
 
 /**
diff --git a/inc/template.php b/inc/template.php
index 2a840a01b..a48a099e0 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -1176,7 +1176,7 @@ function tpl_fileDetails($image, $rev){
     global $NS;
 
     if (!$image || !file_exists(mediaFN($image))) return '';
-    if ($rev && !file_exists(mediaFN($image, $rev))) return '';
+    if ($rev && !file_exists(mediaFN($image, $rev))) $rev = false;
     if (isset($NS) && getNS($image) != $NS) return '';
     $do = $_REQUEST['mediado'];
 
-- 
GitLab