Newer
Older
/**
* HTML output functions
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('NL')) define('NL',"\n");
require_once(DOKU_INC.'inc/parserutils.php');
require_once(DOKU_INC.'inc/form.php');
function html_wikilink($id,$name=NULL,$search=''){
static $xhtml_renderer = NULL;
if(is_null($xhtml_renderer)){
$xhtml_renderer = p_get_renderer('xhtml');
Chris Smith
committed
return $xhtml_renderer->internallink($id,$name,$search,true,'navigation');
/**
* Helps building long attribute lists
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_attbuild($attributes){
$ret = '';
foreach ( $attributes as $key => $value ) {
$ret .= $key.'="'.formtext($value).'" ';
}
return trim($ret);
}
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_login(){
global $lang;
global $conf;
global $ID;
print '<div class="centeralign">'.NL;
$form = new Doku_Form('dw__login');
$form->startFieldset($lang['btn_login']);
$form->addHidden('id', $ID);
$form->addHidden('do', 'login');
$form->addElement(form_makeTextField('u', ((!$_REQUEST['http_credentials']) ? $_REQUEST['u'] : ''), $lang['user'], 'focus__this', 'block'));
$form->addElement(form_makePasswordField('p', $lang['pass'], '', 'block'));
if($conf['rememberme']) {
$form->addElement(form_makeCheckboxField('r', '1', $lang['remember'], 'remember__me', 'simple'));
}
$form->addElement(form_makeButton('submit', '', $lang['btn_login']));
$form->endFieldset();
html_form('login', $form);
if($auth && $auth->canDo('addUser') && actionOK('register')){
print '<p>';
print $lang['reghere'];
print ': <a href="'.wl($ID,'do=register').'" rel="nofollow" class="wikilink1">'.$lang['register'].'</a>';
print '</p>';
}
chris
committed
if ($auth && $auth->canDo('modPass') && actionOK('resendpwd')) {
print '<p>';
print $lang['pwdforget'];
print ': <a href="'.wl($ID,'do=resendpwd').'" rel="nofollow" class="wikilink1">'.$lang['btn_resendpwd'].'</a>';
print '</p>';
* used as a callback in html_secedit
function html_secedit_button($matches){
global $INFO;
$section = $matches[2];
$name = $matches[1];
$secedit = '';
$secedit .= '<div class="secedit">';
$secedit .= html_btn('secedit',$ID,'',
array('do' => 'edit',
'lines' => "$section",
'rev' => $INFO['lastmod']),
/**
* inserts section edit buttons if wanted or removes the markers
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
if($INFO['writable'] && $show && !$INFO['rev']){
$text = preg_replace_callback('#<!-- SECTION "(.*?)" \[(\d+-\d*)\] -->#',
'html_secedit_button', $text);
$text = preg_replace('#<!-- SECTION "(.*?)" \[(\d+-\d*)\] -->#','',$text);
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_topbtn(){
global $lang;
$ret = '';
$ret = '<a class="nolink" href="#dokuwiki__top"><input type="button" class="button" value="'.$lang['btn_top'].'" onclick="window.scrollTo(0, 0)" title="'.$lang['btn_top'].'" /></a>';
/**
* Displays a button (using its own form)
* If tooltip exists, the access key tooltip is replaced.
function html_btn($name,$id,$akey,$params,$method='get',$tooltip=''){
//filter id (without urlencoding)
$id = idfilter($id,false);
if($conf['userewrite'] == 2){
$script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
}elseif($conf['userewrite']){
$script = DOKU_BASE.$id;
}else{
$ret .= '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
if(is_array($params)){
reset($params);
while (list($key, $val) = each($params)) {
$ret .= '<input type="hidden" name="'.$key.'" ';
$ret .= 'value="'.htmlspecialchars($val).'" />';
}
if ($tooltip!='') {
$tip = htmlspecialchars($tooltip);
}else{
$tip = htmlspecialchars($label);
}
$ret .= '<input type="submit" value="'.htmlspecialchars($label).'" class="button" ';
if($akey){
$tip .= ' ['.strtoupper($akey).']';
/**
* show a wiki page
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
echo '<br id="scroll__here" />';
echo p_locale_xhtml('preview');
echo '<div class="preview">';
$html = html_secedit(p_render('xhtml',p_get_instructions($txt),$info),$secedit);
if($INFO['prependTOC']) $html = tpl_toc(true).$html;
echo $html;
echo '<div class="clearer"></div>';
echo '</div>';
if ($REV) print p_locale_xhtml('showrev');
$html = p_wiki_xhtml($ID,$REV,true);
if($INFO['prependTOC']) $html = tpl_toc(true).$html;
$html = html_hilight($html,$HIGH);
echo $html;
/**
* ask the user about how to handle an exisiting draft
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_draft(){
global $INFO;
global $ID;
global $lang;
global $conf;
$draft = unserialize(io_readFile($INFO['draft'],false));
$text = cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
print p_locale_xhtml('draft');
$form = new Doku_Form('dw__editform');
$form->addHidden('id', $ID);
$form->addHidden('date', $draft['date']);
$form->addElement(form_makeWikiText($text, array('readonly'=>'readonly')));
$form->addElement(form_makeOpenTag('div', array('id'=>'draft__status')));
$form->addElement($lang['draftdate'].' '. dformat(filemtime($INFO['draft'])));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeButton('submit', 'recover', $lang['btn_recover'], array('tabindex'=>'1')));
$form->addElement(form_makeButton('submit', 'draftdel', $lang['btn_draftdel'], array('tabindex'=>'2')));
$form->addElement(form_makeButton('submit', 'show', $lang['btn_cancel'], array('tabindex'=>'3')));
html_form('draft', $form);
* @author Harry Fuecks <hfuecks@gmail.com>
function html_hilight($html,$phrases){
$phrases = array_filter((array) $phrases);
$regex = join('|',array_map('preg_quote_cb',$phrases));
if ($regex === '') return $html;
$html = preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html);
* Callback used by html_hilight()
*
* @author Harry Fuecks <hfuecks@gmail.com>
function html_hilight_callback($m) {
$hlight = unslash($m[0]);
if ( !isset($m[2])) {
$hlight = '<span class="search_hit">'.$hlight.'</span>';
* Run a search and display the result
*
* @author Andreas Gohr <andi@splitbrain.org>
require_once(DOKU_INC.'inc/search.php');
global $conf;
global $QUERY;
global $ID;
global $lang;
//check if search is restricted to namespace
$id = cleanID($match[1]);
} else {
$id = cleanID($QUERY);
}
print '<div class="centeralign" id="dw__loading">'.NL;
print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
print 'showLoadBar();'.NL;
print '//--><!]]></script>'.NL;
print '<br /></div>'.NL;
if($id) $data = ft_pageLookup($id);
if(count($data)){
print '<div class="search_quickresult">';
print '<h3>'.$lang['quickhits'].':</h3>';
$ns = getNS($id);
if($ns){
$name = shorten(noNS($id), ' ('.$ns.')',30);
}else{
$name = $id;
}
print html_wikilink(':'.$id,$name);
//clear float (see http://www.complexspiral.com/publications/containing-floats/)
print '<div class="clearer"> </div>';
print '</div>';
}
flush();
//do fulltext search
$data = ft_pageSearch($QUERY,$regex);
$num = 1;
foreach($data as $id => $cnt){
Chris Smith
committed
print html_wikilink(':'.$id,useHeading('navigation')?NULL:$id,$regex);
if($cnt !== 0){
print ': <span class="search_cnt">'.$cnt.' '.$lang['hits'].'</span><br />';
if($num < 15){ // create snippets for the first number of matches only #FIXME add to conf ?
print '<div class="search_snippet">'.ft_snippet($id,$regex).'</div>';
}
$num++;
print '<div class="nothing">'.$lang['nothingfound'].'</div>';
print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
print 'hideLoadBar("dw__loading");'.NL;
print '//--><!]]></script>'.NL;
/**
* Display error on locked pages
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
$expire = dformat($locktime + $conf['locktime']);
$min = round(($conf['locktime'] - (time() - $locktime) )/60);
print '<li><div class="li"><strong>'.$lang['lockedby'].':</strong> '.editorinfo($INFO['locked']).'</div></li>';
print '<li><div class="li"><strong>'.$lang['lockexpire'].':</strong> '.$expire.' ('.$min.' min)</div></li>';
/**
* list old revisions
*
* @author Andreas Gohr <andi@splitbrain.org>
global $ID;
global $INFO;
global $conf;
global $lang;
/* we need to get one additionally log entry to be able to
* decide if this is the last page or is there another one.
* see html_recent()
*/
$revisions = getRevisions($ID, $first, $conf['recent']+1);
if(count($revisions)==0 && $first!=0){
$first=0;
$revisions = getRevisions($ID, $first, $conf['recent']+1);;
}
$hasNext = false;
if (count($revisions)>$conf['recent']) {
$hasNext = true;
array_pop($revisions); // remove extra log entry
}
$date = dformat($INFO['lastmod']);
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
$form = new Doku_Form('page__revisions', wl($ID));
$form->addElement(form_makeOpenTag('ul'));
if($INFO['exists'] && $first==0){
if (isset($INFO['meta']) && isset($INFO['meta']['last_change']) && $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
$form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
else
$form->addElement(form_makeOpenTag('li'));
$form->addElement(form_makeOpenTag('div', array('class' => 'li')));
$form->addElement(form_makeTag('input', array(
'type' => 'checkbox',
'name' => 'rev2[]',
'value' => 'current')));
$form->addElement(form_makeOpenTag('span', array('class' => 'date')));
$form->addElement($date);
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeTag('img', array(
'src' => DOKU_BASE.'lib/images/blank.gif',
'width' => '15',
'height' => '11',
'alt' => '')));
$form->addElement(form_makeOpenTag('a', array(
'class' => 'wikilink1',
'href' => wl($ID))));
$form->addElement($ID);
$form->addElement(form_makeCloseTag('a'));
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
$form->addElement(' – ');
$form->addElement(htmlspecialchars($INFO['sum']));
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('span', array('class' => 'user')));
$form->addElement((empty($INFO['editor']))?('('.$lang['external_edit'].')'):editorinfo($INFO['editor']));
$form->addElement(form_makeCloseTag('span'));
$form->addElement('('.$lang['current'].')');
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeCloseTag('li'));
$info = getRevisionInfo($ID,$rev,true);
$exists = page_exists($ID,$rev);
if ($info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
$form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
else
$form->addElement(form_makeOpenTag('li'));
$form->addElement(form_makeOpenTag('div', array('class' => 'li')));
$form->addElement(form_makeTag('input', array(
'type' => 'checkbox',
'name' => 'rev2[]',
'value' => $rev)));
$form->addElement(form_makeTag('img', array(
'src' => DOKU_BASE.'lib/images/blank.gif',
'width' => 14,
'height' => 11,
'alt' => '')));
$form->addElement(form_makeOpenTag('span', array('class' => 'date')));
$form->addElement($date);
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('a', array('href' => wl($ID,"rev=$rev,do=diff", false, '&'), 'class' => 'diff_link')));
$form->addElement(form_makeTag('img', array(
'src' => DOKU_BASE.'lib/images/diff.png',
'width' => 15,
'height' => 11,
'title' => $lang['diff'],
'alt' => $lang['diff'])));
$form->addElement(form_makeCloseTag('a'));
$form->addElement(form_makeOpenTag('a', array('href' => wl($ID,"rev=$rev",false,'&'), 'class' => 'wikilink1')));
$form->addElement($ID);
$form->addElement(form_makeCloseTag('a'));
$form->addElement(form_makeTag('img', array(
'src' => DOKU_BASE.'lib/images/blank.gif',
'width' => '15',
'height' => '11',
'alt' => '')));
$form->addElement($ID);
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
$form->addElement(' – ');
$form->addElement(htmlspecialchars($info['sum']));
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('span', array('class' => 'user')));
$form->addElement(editorinfo($info['user']));
if(auth_ismanager()){
$form->addElement(' ('.$info['ip'].')');
}
$form->addElement($info['ip']);
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeCloseTag('li'));
$form->addElement(form_makeCloseTag('ul'));
$form->addElement(form_makeButton('submit', 'diff', $lang['diff2']));
html_form('revisions', $form);
print '<div class="pagenav">';
$last = $first + $conf['recent'];
if ($first > 0) {
$first -= $conf['recent'];
if ($first < 0) $first = 0;
print '<div class="pagenav-prev">';
print html_btn('newer',$ID,"p",array('do' => 'revisions', 'first' => $first));
print '</div>';
}
if ($hasNext) {
print '<div class="pagenav-next">';
print html_btn('older',$ID,"n",array('do' => 'revisions', 'first' => $last));
/**
* display recent changes
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
/* we need to get one additionally log entry to be able to
* decide if this is the last page or is there another one.
* This is the cheapest solution to get this information.
*/
$recents = getRecents($first,$conf['recent'] + 1,getNS($ID));
if(count($recents) == 0 && $first != 0){
$first=0;
$recents = getRecents($first,$conf['recent'] + 1,getNS($ID));
}
$hasNext = false;
if (count($recents)>$conf['recent']) {
$hasNext = true;
array_pop($recents); // remove extra log entry
if (getNS($ID) != '')
print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>';
$form = new Doku_Form('dw__recent', script(), 'get');
$form->addHidden('sectok', null);
$form->addHidden('do', 'recent');
$form->addHidden('id', $ID);
$form->addElement(form_makeOpenTag('ul'));
foreach($recents as $recent){
$date = dformat($recent['date']);
if ($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
$form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
else
$form->addElement(form_makeOpenTag('li'));
$form->addElement(form_makeOpenTag('div', array('class' => 'li')));
$form->addElement(form_makeOpenTag('span', array('class' => 'date')));
$form->addElement($date);
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('a', array('class' => 'diff_link', 'href' => wl($recent['id'],"do=diff", false, '&'))));
$form->addElement(form_makeTag('img', array(
'src' => DOKU_BASE.'lib/images/diff.png',
'width' => 15,
'height'=> 11,
'title' => $lang['diff'],
'alt' => $lang['diff']
)));
$form->addElement(form_makeCloseTag('a'));
$form->addElement(form_makeOpenTag('a', array('class' => 'revisions_link', 'href' => wl($recent['id'],"do=revisions",false,'&'))));
$form->addElement(form_makeTag('img', array(
'src' => DOKU_BASE.'lib/images/history.png',
'width' => 12,
'height'=> 14,
'title' => $lang['btn_revs'],
'alt' => $lang['btn_revs']
)));
$form->addElement(form_makeCloseTag('a'));
Chris Smith
committed
$form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?NULL:$recent['id']));
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
$form->addElement(' – '.htmlspecialchars($recent['sum']));
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('span', array('class' => 'user')));
$form->addElement(editorinfo($recent['user']));
if(auth_ismanager()){
$form->addElement(' ('.$recent['ip'].')');
}
$form->addElement($recent['ip']);
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeCloseTag('li'));
$form->addElement(form_makeCloseTag('ul'));
$form->addElement(form_makeOpenTag('div', array('class' => 'pagenav')));
$form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-prev')));
$form->addElement(form_makeTag('input', array(
'type' => 'submit',
'name' => 'first['.$first.']',
'value' => $lang['btn_newer'],
'accesskey' => 'n',
'title' => $lang['btn_newer'].' [N]',
)));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-next')));
$form->addElement(form_makeTag('input', array(
'type' => 'submit',
'name' => 'first['.$last.']',
'value' => $lang['btn_older'],
'accesskey' => 'p',
'title' => $lang['btn_older'].' [P]',
)));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeCloseTag('div'));
html_form('recent', $form);
/**
* Display page index
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
require_once(DOKU_INC.'inc/search.php');
global $conf;
global $ID;
$dir = $conf['datadir'];
$ns = cleanID($ns);
if(empty($ns)){
$ns = dirname(str_replace(':','/',$ID));
if($ns == '.') $ns ='';
}
$ns = utf8_encodeFN(str_replace(':','/',$ns));
echo p_locale_xhtml('index');
echo '<div id="index__tree">';
$data = array();
search($data,$conf['datadir'],'search_index',array('ns' => $ns));
echo html_buildlist($data,'idx','html_list_index','html_li_index');
echo '</div>';
$ret = '';
$base = ':'.$item['id'];
$base = substr($base,strrpos($base,':')+1);
if($item['type']=='d'){
$ret .= '<a href="'.wl($ID,'idx='.rawurlencode($item['id'])).'" class="idx_dir"><strong>';
}else{
$ret .= html_wikilink(':'.$item['id']);
}
return $ret;
}
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
/**
* Index List item
*
* This user function is used in html_build_lidt to build the
* <li> tags for namespaces when displaying the page index
* it gives different classes to opened or closed "folders"
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_li_index($item){
if($item['type'] == "f"){
return '<li class="level'.$item['level'].'">';
}elseif($item['open']){
return '<li class="open">';
}else{
return '<li class="closed">';
}
}
/**
* Default List item
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_li_default($item){
return '<li class="level'.$item['level'].'">';
}
* Build an unordered list from the given $data array
* Each item in the array has to have a 'level' property
* the item itself gets printed by the given $func user
* function. The second and optional function is used to
* print the <li> tag. Both user function need to accept
* a single item.
* Both user functions can be given as array to point to
* a member of an object.
*
function html_buildlist($data,$class,$func,$lifunc='html_li_default'){
$level = 0;
$opens = 0;
$ret = '';
foreach ($data as $item){
if( $item['level'] > $level ){
//open new list
for($i=0; $i<($item['level'] - $level); $i++){
if ($i) $ret .= "<li class=\"clear\">\n";
$ret .= "\n<ul class=\"$class\">\n";
}
}elseif( $item['level'] < $level ){
//close last item
$ret .= "</li>\n";
for ($i=0; $i<($level - $item['level']); $i++){
//close higher lists
$ret .= "</ul>\n</li>\n";
}
}else{
//close last item
$ret .= "</li>\n";
}
$ret .= call_user_func($lifunc,$item);
$ret .= call_user_func($func,$item);
}
//close remaining items and lists
for ($i=0; $i < $level; $i++){
$ret .= "</li></ul>\n";
}
return $ret;
}
/**
* display backlinks
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Michael Klier <chi@chimeric.de>
require_once(DOKU_INC.'inc/fulltext.php');
if(!empty($data)) {
print '<ul class="idx">';
foreach($data as $blink){
print '<li><div class="li">';
Chris Smith
committed
print html_wikilink(':'.$blink,useHeading('navigation')?NULL:$blink);
print '</div></li>';
}
print '</ul>';
} else {
print '<div class="level1"><p>' . $lang['nothingfound'] . '</p></div>';
/**
* show diff
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
require_once(DOKU_INC.'inc/DifferenceEngine.php');
global $ID;
global $REV;
global $lang;
global $conf;
// we're trying to be clever here, revisions to compare can be either
// given as rev and rev2 parameters, with rev2 being optional. Or in an
// array in rev2.
$rev1 = $REV;
if(is_array($_REQUEST['rev2'])){
$rev1 = (int) $_REQUEST['rev2'][0];
$rev2 = (int) $_REQUEST['rev2'][1];
if(!$rev1){
$rev1 = $rev2;
unset($rev2);
}
$rev2 = (int) $_REQUEST['rev2'];
}
if($text){ // compare text to the most current revision
$l_rev = '';
$l_text = rawWiki($ID,'');
$l_head = '<a class="wikilink1" href="'.wl($ID).'">'.
$ID.' '.dformat((int) @filemtime(wikiFN($ID))).'</a> '.
$lang['current'];
$r_rev = '';
$r_text = cleanText($text);
$r_head = $lang['yours'];
}else{
if($rev1 && $rev2){ // two specific revisions wanted
// make sure order is correct (older on the left)
if($rev1 < $rev2){
$l_rev = $rev1;
$r_rev = $rev2;
}else{
$l_rev = $rev2;
$r_rev = $rev1;
}elseif($rev1){ // single revision given, compare to current
$r_rev = '';
$l_rev = $rev1;
}else{ // no revision was given, compare previous to current
$r_rev = '';
$revs = getRevisions($ID, 0, 1);
$l_rev = $revs[0];
$REV = $l_rev; // store revision back in $REV
// when both revisions are empty then the page was created just now
if(!$l_rev && !$r_rev){
$l_text = '';
}else{
$l_text = rawWiki($ID,$l_rev);
}
$r_text = rawWiki($ID,$r_rev);
if(!$l_rev){
$l_head = '—';
}else{
$l_info = getRevisionInfo($ID,$l_rev,true);
if($l_info['user']){ $l_user = editorinfo($l_info['user']);
if(auth_ismanager()) $l_user .= ' ('.$l_info['ip'].')';
} else { $l_user = $l_info['ip']; }
$l_user = '<span class="user">'.$l_user.'</span>';
$l_sum = ($l_info['sum']) ? '<span class="sum">'.hsc($l_info['sum']).'</span>' : '';
if ($l_info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) $l_minor = 'class="minor"';
$l_head = '<a class="wikilink1" href="'.wl($ID,"rev=$l_rev").'">'.
$ID.' ['.dformat($l_rev).']</a>'.
'<br />'.$l_user.' '.$l_sum;
$r_info = getRevisionInfo($ID,$r_rev,true);
if($r_info['user']){ $r_user = editorinfo($r_info['user']);
if(auth_ismanager()) $r_user .= ' ('.$r_info['ip'].')';
} else { $r_user = $r_info['ip']; }
$r_user = '<span class="user">'.$r_user.'</span>';
$r_sum = ($r_info['sum']) ? '<span class="sum">'.hsc($r_info['sum']).'</span>' : '';
if ($r_info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
$r_head = '<a class="wikilink1" href="'.wl($ID,"rev=$r_rev").'">'.
$ID.' ['.dformat($r_rev).']</a>'.
'<br />'.$r_user.' '.$r_sum;
}elseif($_rev = @filemtime(wikiFN($ID))){
$_info = getRevisionInfo($ID,$_rev,true);
if($_info['user']){ $_user = editorinfo($_info['user']);
if(auth_ismanager()) $_user .= ' ('.$_info['ip'].')';
} else { $_user = $_info['ip']; }
$_user = '<span class="user">'.$_user.'</span>';
$_sum = ($_info['sum']) ? '<span class="sum">'.hsc($_info['sum']).'</span>' : '';
if ($_info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
$r_head = '<a class="wikilink1" href="'.wl($ID).'">'.
$ID.' ['.dformat($_rev).']</a> '.
}else{
$r_head = '— ('.$lang['current'].')';
$df = new Diff(explode("\n",htmlspecialchars($l_text)),
explode("\n",htmlspecialchars($r_text)));
<table class="diff">
<th colspan="2" <?php echo $l_minor?>>
<th colspan="2" <?php echo $r_minor?>>
/**
* show warning on conflict detection
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_conflict($text,$summary){
global $ID;
global $lang;
$form = new Doku_Form('dw__editform');
$form->addHidden('id', $ID);
$form->addHidden('wikitext', $text);
$form->addHidden('summary', $summary);
$form->addElement(form_makeButton('submit', 'save', $lang['btn_save'], array('accesskey'=>'s')));
$form->addElement(form_makeButton('submit', 'cancel', $lang['btn_cancel']));
html_form('conflict', $form);
print '<br /><br /><br /><br />'.NL;