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='&') { +function media_managerURL($params=false, $amp='&', $abs=false) { global $conf; global $ID; @@ -1498,7 +1501,7 @@ function media_managerURL($params=false, $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