diff --git a/doku.php b/doku.php index f44e09aa85..2059f9761d 100644 --- a/doku.php +++ b/doku.php @@ -34,6 +34,7 @@ $ID = getID(); $REV = $INPUT->int('rev'); +$DATE_AT= $INPUT->int('at'); $IDX = $INPUT->str('idx'); $DATE = $INPUT->int('date'); $RANGE = $INPUT->str('range'); @@ -47,7 +48,19 @@ $SUF = cleanText($INPUT->post->str('suffix')); $SUM = $INPUT->post->str('summary'); -//make info about the selected page available +if($DATE_AT) { + $rev_t = getProperRevision($ID,$DATE_AT); + if($rev_t === '') { + $REV = ''; + } else if ($rev_t === false) { + msg('Seite gab es zu diesem Zeitpunkt noch nicht'); + $REV = $DATE_AT; + } else { + $REV = $rev_t; + } +} + +//make infos about the selected page available $INFO = pageinfo(); //export minimal info to JS, plugins can add more diff --git a/inc/changelog.php b/inc/changelog.php index de26fdf6ac..0a33f6a6e5 100644 --- a/inc/changelog.php +++ b/inc/changelog.php @@ -814,3 +814,26 @@ function getRevisions($id, $first, $num, $chunk_size=8192, $media=false) { $log = new PageRevisionLog($id, $chunk_size); return $log->getRevisions($first, $num, $media); } + +/** +* Return an existing revision for a specific date which is +* the current one or less or equal then the date +* +* @param string $id +* @param number $date_at +* @param boolean $media +* @return string revision ('' for current) +*/ +function getProperRevision($id,$date_at,$media = false){ + $create_time = @filemtime($media?mediaFN($id):wikiFN($id)); + if(((int)$date_at) >= $create_time) { //requestet REV older then time($id) => load current + return ''; + } else { + $log = new PageRevisionLog($id); + if($rev = $log->getRelativeRevision($date_at+1, -1,$media)) { + return $rev; + } else { + return false; + } + } +} \ No newline at end of file diff --git a/inc/common.php b/inc/common.php index dd30b53ab8..e5e4f78c85 100644 --- a/inc/common.php +++ b/inc/common.php @@ -161,7 +161,7 @@ function pageinfo() { if($REV) { //check if current revision was meant if($info['exists'] && (@filemtime($info['filepath']) == $REV)) { - $REV = ''; + //$REV = ''; //if we enter a rev we want to see that revision (inc media files) } elseif($RANGE) { //section editing does not work with old revisions! $REV = ''; diff --git a/inc/html.php b/inc/html.php index b48a17fc5c..5b79ab659c 100644 --- a/inc/html.php +++ b/inc/html.php @@ -207,6 +207,7 @@ function html_show($txt=null){ global $REV; global $HIGH; global $INFO; + global $DATE_AT; //disable section editing for old revisions or in preview if($txt || $REV){ $secedit = false; @@ -226,8 +227,8 @@ function html_show($txt=null){ echo ''; }else{ - if ($REV) print p_locale_xhtml('showrev'); - $html = p_wiki_xhtml($ID,$REV,true); + if ($REV||$DATE_AT) print p_locale_xhtml('showrev'); + $html = p_wiki_xhtml($ID,$REV,true,$DATE_AT); $html = html_secedit($html,$secedit); if($INFO['prependTOC']) $html = tpl_toc(true).$html; $html = html_hilight($html,$HIGH); diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index fd02c0ce00..a677db2768 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -28,6 +28,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // @access public var $doc = ''; // will contain the whole document var $toc = array(); // will contain the Table of Contents + var $rev = ''; + var $date_at = ''; var $sectionedits = array(); // A stack of section edit data private $lastsecid = 0; // last section edit id, used by startSectionEdit @@ -618,6 +620,11 @@ function internallink($id, $name = null, $search=null,$returnonly=false,$linktyp } $link['more'] = ''; $link['class'] = $class; + if($this->date_at) { + $params['at'] = $this->date_at; + } else if($this->rev) { + //$params['at'] = $this->rev; + } $link['url'] = wl($id, $params); $link['name'] = $name; $link['title'] = $id; @@ -792,7 +799,11 @@ function internalmedia ($src, $title=null, $align=null, $width=null, list($ext,$mime,$dl) = mimetype($src,false); if(substr($mime,0,5) == 'image' && $render){ - $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); + if(($this->rev||$this->date_at)) { + $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache,'rev'=>$this->_getProperMediaRevision($src)),($linking=='direct')); + } else { + $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),($linking=='direct')); + } }elseif($mime == 'application/x-shockwave-flash' && $render){ // don't link flash movies $noLink = true; @@ -800,7 +811,11 @@ function internalmedia ($src, $title=null, $align=null, $width=null, // add file icons $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); $link['class'] .= ' mediafile mf_'.$class; - $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); + if(($this->rev||$this->date_at)) { + $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache,'rev'=>$this->_getProperMediaRevision($src)),true); + } else { + $link['url'] = ml($src,array('id'=>$ID,'cache'=>$cache),true); + } if ($exists) $link['title'] .= ' (' . filesize_h(filesize(mediaFN($src))).')'; } @@ -1048,7 +1063,7 @@ function _media ($src, $title=null, $align=null, $width=null, $height=null, $cache=null, $render = true) { $ret = ''; - + $intern = !is_externalmedia($src); list($ext,$mime,$dl) = mimetype($src); if(substr($mime,0,5) == 'image'){ // first get the $title @@ -1073,7 +1088,11 @@ function _media ($src, $title=null, $align=null, $width=null, return $title; } //add image tag - $ret .= 'rev||$this->date_at)) { + $ret .= '$width,'h'=>$height,'cache'=>$cache)).'"'; + } $ret .= ' class="media'.$align.'"'; if ($title) { @@ -1221,6 +1240,23 @@ function _getMediaLinkConf($src, $title, $align, $width, $height, $cache, $rende return $link; } + + /** + * _getProperMediaRevision is a helperfunction to internalmedia() and _media() + * which returns an existing media revision less or equal to rev or date_at + * + * @author lisps + * @param string $media_id + * @access protected + * @return string revision ('' for current) + */ + function _getProperMediaRevision($media_id){ + $rev = $this->rev; + if($this->date_at){ + $rev = $this->date_at; + } + return getProperRevision($media_id,$rev,true); + } } diff --git a/inc/parserutils.php b/inc/parserutils.php index b67daaabb6..c50bf7332f 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -56,7 +56,7 @@ * * @author Andreas Gohr */ -function p_wiki_xhtml($id, $rev='', $excuse=true){ +function p_wiki_xhtml($id, $rev='', $excuse=true,$date_at=''){ $file = wikiFN($id,$rev); $ret = ''; @@ -65,9 +65,9 @@ function p_wiki_xhtml($id, $rev='', $excuse=true){ $keep = $ID; $ID = $id; - if($rev){ + if($rev || $date_at){ if(@file_exists($file)){ - $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info); //no caching on old revisions + $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info,$rev,$date_at); //no caching on old revisions }elseif($excuse){ $ret = p_locale_xhtml('norev'); } @@ -583,7 +583,7 @@ function p_sort_modes($a, $b){ * @author Harry Fuecks * @author Andreas Gohr */ -function p_render($mode,$instructions,&$info){ +function p_render($mode,$instructions,&$info,$rev='',$date_at=''){ if(is_null($instructions)) return ''; $Renderer =& p_get_renderer($mode); @@ -591,6 +591,13 @@ function p_render($mode,$instructions,&$info){ $Renderer->reset(); + if($rev) { + $Renderer->rev = $rev; + } + if($date_at) { + $Renderer->date_at = $date_at; + } + $Renderer->smileys = getSmileys(); $Renderer->entities = getEntities(); $Renderer->acronyms = getAcronyms(); diff --git a/inc/template.php b/inc/template.php index 60e178d1a4..ac85059a88 100644 --- a/inc/template.php +++ b/inc/template.php @@ -1031,6 +1031,7 @@ function tpl_img_getTag($tags, $alt = '', $src = null) { function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) { global $IMG; global $INPUT; + global $REV; $w = tpl_img_getTag('File.Width'); $h = tpl_img_getTag('File.Height'); @@ -1055,8 +1056,8 @@ function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) { } //prepare URLs - $url = ml($IMG, array('cache'=> $INPUT->str('cache')), true, '&'); - $src = ml($IMG, array('cache'=> $INPUT->str('cache'), 'w'=> $w, 'h'=> $h), true, '&'); + $url = ml($IMG, array('cache'=> $INPUT->str('cache'),'rev'=>$REV), true, '&'); + $src = ml($IMG, array('cache'=> $INPUT->str('cache'),'rev'=>$REV, 'w'=> $w, 'h'=> $h), true, '&'); //prepare attributes $alt = tpl_img_getTag('Simple.Title'); diff --git a/lib/exe/detail.php b/lib/exe/detail.php index cd3f362ad6..daa55f405b 100644 --- a/lib/exe/detail.php +++ b/lib/exe/detail.php @@ -5,6 +5,9 @@ $IMG = getID('media'); $ID = cleanID($INPUT->str('id')); +$REV = & $INPUT->ref('rev'); +//sanitize revision +$REV = preg_replace('/[^0-9]/', '', $REV); // this makes some general info available as well as the info about the // "parent" page @@ -35,7 +38,7 @@ $AUTH = auth_quickaclcheck($IMG); if($AUTH >= AUTH_READ){ // check if image exists - $SRC = mediaFN($IMG); + $SRC = mediaFN($IMG,$REV); if(!@file_exists($SRC)){ //doesn't exist! http_status(404); diff --git a/lib/tpl/dokuwiki/detail.php b/lib/tpl/dokuwiki/detail.php index ec846f6fd9..49249612b0 100644 --- a/lib/tpl/dokuwiki/detail.php +++ b/lib/tpl/dokuwiki/detail.php @@ -49,7 +49,7 @@ if($ERROR): echo '

'.$ERROR.'

'; else: ?> - +