-
Andreas Gohr authored
This patch replaces the use of the date() function with the strftime() function. The latter will respect a set locale and will use localized strings for things like month names. Because the format options for strftime differ from the ones used in date, DokuWiki will rest the value of $conf['dformat'] if it contains an old date format string (detected by missing % characters). Plugins or templates using the $conf['dformat'] need to be updated. darcs-hash:20080223124045-7ad00-6afb2b839afc58781463e25577e06adb675fff79.gz
Andreas Gohr authoredThis patch replaces the use of the date() function with the strftime() function. The latter will respect a set locale and will use localized strings for things like month names. Because the format options for strftime differ from the ones used in date, DokuWiki will rest the value of $conf['dformat'] if it contains an old date format string (detected by missing % characters). Plugins or templates using the $conf['dformat'] need to be updated. darcs-hash:20080223124045-7ad00-6afb2b839afc58781463e25577e06adb675fff79.gz
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
html.php 36.58 KiB
<?php
/**
* HTML output functions
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) define('DOKU_INC',fullpath(dirname(__FILE__).'/../').'/');
if(!defined('NL')) define('NL',"\n");
require_once(DOKU_INC.'inc/parserutils.php');
require_once(DOKU_INC.'inc/form.php');
/**
* Convenience function to quickly build a wikilink
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_wikilink($id,$name=NULL,$search=''){
static $xhtml_renderer = NULL;
if(is_null($xhtml_renderer)){
require_once(DOKU_INC.'inc/parser/xhtml.php');
$xhtml_renderer = new Doku_Renderer_xhtml();
}
return $xhtml_renderer->internallink($id,$name,$search,true);
}
/**
* 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);
}
/**
* The loginform
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_login(){
global $lang;
global $conf;
global $ID;
global $auth;
print p_locale_xhtml('login');
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['u'], $lang['user'], 'focus__this', 'block'));
$form->addElement(form_makePasswordField('p', $lang['pass'], '', 'block'));
$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>';
}
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>';
}
print '</div>'.NL;
}
/**
* prints a section editing button
* used as a callback in html_secedit
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_secedit_button($matches){
global $ID;
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']),
'post', $name);
$secedit .= '</div>';
return $secedit;
}
/**
* inserts section edit buttons if wanted or removes the markers
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_secedit($text,$show=true){
global $INFO;
if($INFO['writable'] && $show && !$INFO['rev']){
$text = preg_replace_callback('#<!-- SECTION "(.*?)" \[(\d+-\d*)\] -->#',
'html_secedit_button', $text);
}else{
$text = preg_replace('#<!-- SECTION "(.*?)" \[(\d+-\d*)\] -->#','',$text);
}
return $text;
}
/**
* Just the back to top button (in its own form)
*
* @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>';
return $ret;
}
/**
* Displays a button (using its own form)
* If tooltip exists, the access key tooltip is replaced.
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_btn($name,$id,$akey,$params,$method='get',$tooltip=''){
global $conf;
global $lang;
$label = $lang['btn_'.$name];
$ret = '';
$tip = '';
//filter id (without urlencoding)
$id = idfilter($id,false);
//make nice URLs even for buttons
if($conf['userewrite'] == 2){
$script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
}elseif($conf['userewrite']){
$script = DOKU_BASE.$id;
}else{
$script = DOKU_BASE.DOKU_SCRIPT;
$params['id'] = $id;
}
$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 .= ' [ALT+'.strtoupper($akey).']';
$ret .= 'accesskey="'.$akey.'" ';
}
$ret .= 'title="'.$tip.'" ';
$ret .= '/>';
$ret .= '</div></form>';
return $ret;
}
/**
* show a wiki page
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_show($txt=''){
global $ID;
global $REV;
global $HIGH;
global $INFO;
//disable section editing for old revisions or in preview
if($txt || $REV){
$secedit = false;
}else{
$secedit = true;
}
if ($txt){
//PreviewHeader
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>';
}else{
if ($REV) print p_locale_xhtml('showrev');
$html = p_wiki_xhtml($ID,$REV,true);
$html = html_secedit($html,$secedit);
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'].' '. strftime($conf['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);
}
/**
* Highlights searchqueries in HTML code
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Harry Fuecks <hfuecks@gmail.com>
*/
function html_hilight($html,$regex){
// strip everything that's special except pipes:
$regex = preg_replace('![\[\]()/\\\\?\.+*]+!','',$regex);
if ($regex === '') return $html;
$html = preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html);
return $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>';
}
return $hlight;
}
/**
* Run a search and display the result
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_search(){
require_once(DOKU_INC.'inc/search.php');
require_once(DOKU_INC.'inc/fulltext.php');
global $conf;
global $QUERY;
global $ID;
global $lang;
print p_locale_xhtml('searchpage');
flush();
//check if search is restricted to namespace
if(preg_match('/([^@]*)@([^@]*)/',$QUERY,$match)) {
$id = cleanID($match[1]);
if(empty($id)) {
print '<div class="nothing">'.$lang['nothingfound'].'</div>';
flush();
return;
}
} else {
$id = cleanID($QUERY);
}
//show progressbar
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;
flush();
//do quick pagesearch
$data = array();
$data = ft_pageLookup($id);
if(count($data)){
sort($data);
print '<div class="search_quickresult">';
print '<h3>'.$lang['quickhits'].':</h3>';
print '<ul class="search_quickhits">';
foreach($data as $id){
print '<li> ';
print html_wikilink(':'.$id,noNS($id));
print '</li> ';
}
print '</ul> ';
//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);
if(count($data)){
$num = 1;
foreach($data as $id => $cnt){
print '<div class="search_result">';
print html_wikilink(':'.$id,$conf['useheading']?NULL:$id,$regex);
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>';
}
print '</div>';
flush();
$num++;
}
}else{
print '<div class="nothing">'.$lang['nothingfound'].'</div>';
}
//hide progressbar
print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
print 'hideLoadBar("dw__loading");'.NL;
print '//--><!]]></script>'.NL;
flush();
}
/**
* Display error on locked pages
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_locked(){
global $ID;
global $conf;
global $lang;
global $INFO;
$locktime = filemtime(wikiLockFN($ID));
$expire = @strftime($conf['dformat'], $locktime + $conf['locktime'] );
$min = round(($conf['locktime'] - (time() - $locktime) )/60);
print p_locale_xhtml('locked');
print '<ul>';
print '<li><div class="li"><strong>'.$lang['lockedby'].':</strong> '.$INFO['locked'].'</li>';
print '<li><div class="li"><strong>'.$lang['lockexpire'].':</strong> '.$expire.' ('.$min.' min)</div></li>';
print '</ul>';
}
/**
* list old revisions
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
function html_revisions($first=0){
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 = @strftime($conf['dformat'],$INFO['lastmod']);
print p_locale_xhtml('revisions');
print '<form action="'.wl($ID).'" method="post" id="page__revisions">';
print '<ul>';
if($INFO['exists'] && $first==0){
print (isset($INFO['meta']) && isset($INFO['meta']['last_change']) && $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) ? '<li class="minor">' : '<li>';
print '<div class="li">';
print '<input type="checkbox" name="rev2[]" value="current" /> ';
print $date;
print ' <img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" /> ';
print '<a class="wikilink1" href="'.wl($ID).'">'.$ID.'</a> ';
print ' – ';
print $INFO['sum'];
print ' <span class="user">';
print (empty($INFO['editor']))?('('.$lang['external_edit'].')'):$INFO['editor'];
print '</span> ';
print '('.$lang['current'].')';
print '</div>';
print '</li>';
}
foreach($revisions as $rev){
$date = strftime($conf['dformat'],$rev);
$info = getRevisionInfo($ID,$rev,true);
$exists = page_exists($ID,$rev);
print ($info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) ? '<li class="minor">' : '<li>';
print '<div class="li">';
if($exists){
print '<input type="checkbox" name="rev2[]" value="'.$rev.'" /> ';
}else{
print '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="14" height="11" alt="" /> ';
}
print $date;
if($exists){
print ' <a href="'.wl($ID,"rev=$rev,do=diff").'">';
$p = array();
$p['src'] = DOKU_BASE.'lib/images/diff.png';
$p['width'] = 15;
$p['height'] = 11;
$p['title'] = $lang['diff'];
$p['alt'] = $lang['diff'];
$att = buildAttributes($p);
print "<img $att />";
print '</a> ';
print '<a class="wikilink1" href="'.wl($ID,"rev=$rev").'">'.$ID.'</a>';
}else{
print ' <img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" /> ';
print $ID;
}
print ' – ';
print htmlspecialchars($info['sum']);
print ' <span class="user">';
if($info['user']){
print $info['user'];
}else{
print $info['ip'];
}
print '</span>';
print '</div>';
print '</li>';
}
print '</ul>';
print '<input name="do[diff]" type="submit" value="'.$lang['diff2'].'" class="button" />';
print '</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));
print '</div>';
}
print '</div>';
}
/**
* display recent changes
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
function html_recent($first=0){
global $conf;
global $lang;
global $ID;
/* 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
}
print p_locale_xhtml('recent');
print '<ul>';
foreach($recents as $recent){
$date = strftime($conf['dformat'],$recent['date']);
print ($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) ? '<li class="minor">' : '<li>';
print '<div class="li">';
print $date.' ';
print '<a href="'.wl($recent['id'],"do=diff").'">';
$p = array();
$p['src'] = DOKU_BASE.'lib/images/diff.png';
$p['width'] = 15;
$p['height'] = 11;
$p['title'] = $lang['diff'];
$p['alt'] = $lang['diff'];
$att = buildAttributes($p);
print "<img $att />";
print '</a> ';
print '<a href="'.wl($recent['id'],"do=revisions").'">';
$p = array();
$p['src'] = DOKU_BASE.'lib/images/history.png';
$p['width'] = 12;
$p['height'] = 14;
$p['title'] = $lang['btn_revs'];
$p['alt'] = $lang['btn_revs'];
$att = buildAttributes($p);
print "<img $att />";
print '</a> ';
print html_wikilink(':'.$recent['id'],$conf['useheading']?NULL:$recent['id']);
print ' – '.htmlspecialchars($recent['sum']);
print ' <span class="user">';
if($recent['user']){
print $recent['user'];
}else{
print $recent['ip'];
}
print '</span>';
print '</div>';
print '</li>';
}
print '</ul>';
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','',"p",array('do' => 'recent', 'first' => $first));
print '</div>';
}
if ($hasNext) {
print '<div class="pagenav-next">';
print html_btn('older','',"n",array('do' => 'recent', 'first' => $last));
print '</div>';
}
print '</div>';
}
/**
* Display page index
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_index($ns){
require_once(DOKU_INC.'inc/search.php');
global $conf;
global $ID;
$dir = $conf['datadir'];
$ns = cleanID($ns);
#fixme use appropriate function
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>';
}
/**
* Index item formatter
*
* User function for html_buildlist()
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_list_index($item){
global $ID;
$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>';
$ret .= $base;
$ret .= '</strong></a>';
}else{
$ret .= html_wikilink(':'.$item['id']);
}
return $ret;
}
/**
* 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
*
* 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.
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
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";
}
//remember current level
$level = $item['level'];
//print item
$ret .= call_user_func($lifunc,$item);
$ret .= '<div class="li">';
$ret .= call_user_func($func,$item);
$ret .= '</div>';
}
//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>
*/
function html_backlinks(){
require_once(DOKU_INC.'inc/fulltext.php');
global $ID;
global $conf;
global $lang;
print p_locale_xhtml('backlinks');
$data = ft_backlinks($ID);
if(!empty($data)) {
print '<ul class="idx">';
foreach($data as $blink){
print '<li><div class="li">';
print html_wikilink(':'.$blink,$conf['useheading']?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>
*/
function html_diff($text='',$intro=true){
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];
}else{
$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.' '.strftime($conf['dformat'],@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 right)
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];
}
$l_text = rawWiki($ID,$l_rev);
$r_text = rawWiki($ID,$r_rev);
$l_head = '<a class="wikilink1" href="'.wl($ID,"rev=$l_rev").'">'.
$ID.' '.strftime($conf['dformat'],$l_rev).'</a>';
if($r_rev){
$r_head = '<a class="wikilink1" href="'.wl($ID,"rev=$r_rev").'">'.
$ID.' '.strftime($conf['dformat'],$r_rev).'</a>';
}else{
$r_head = '<a class="wikilink1" href="'.wl($ID).'">'.
$ID.' '.strftime($conf['dformat'],@filemtime(wikiFN($ID))).'</a> '.
$lang['current'];
}
}
$df = new Diff(explode("\n",htmlspecialchars($l_text)),
explode("\n",htmlspecialchars($r_text)));
$tdf = new TableDiffFormatter();
if($intro) print p_locale_xhtml('diff');
?>
<table class="diff">
<tr>
<th colspan="2">
<?php echo $l_head?>
</th>
<th colspan="2">
<?php echo $r_head?>
</th>
</tr>
<?php echo $tdf->format($df)?>
</table>
<?php
}
/**
* show warning on conflict detection
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_conflict($text,$summary){
global $ID;
global $lang;
print p_locale_xhtml('conflict');
$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;
}
/**
* Prints the global message array
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_msgarea(){
global $MSG;
if(!isset($MSG)) return;
foreach($MSG as $msg){
print '<div class="'.$msg['lvl'].'">';
print $msg['msg'];
print '</div>';
}
}
/**
* Prints the registration form
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_register(){
global $lang;
global $conf;
global $ID;
print p_locale_xhtml('register');
print '<div class="centeralign">'.NL;
$form = new Doku_Form('dw__register', wl($ID));
$form->startFieldset($lang['register']);
$form->addHidden('do', 'register');
$form->addHidden('save', '1');
$form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], null, 'block', array('size'=>'50')));
if (!$conf['autopasswd']) {
$form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', array('size'=>'50')));
$form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
}
$form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', array('size'=>'50')));
$form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', array('size'=>'50')));
$form->addElement(form_makeButton('submit', '', $lang['register']));
$form->endFieldset();
html_form('register', $form);
print '</div>'.NL;
}
/**
* Print the update profile form
*
* @author Christopher Smith <chris@jalakai.co.uk>
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_updateprofile(){
global $lang;
global $conf;
global $ID;
global $INFO;
global $auth;
print p_locale_xhtml('updateprofile');
if (empty($_POST['fullname'])) $_POST['fullname'] = $INFO['userinfo']['name'];
if (empty($_POST['email'])) $_POST['email'] = $INFO['userinfo']['mail'];
print '<div class="centeralign">'.NL;
$form = new Doku_Form('dw__register', wl($ID));
$form->startFieldset($lang['profile']);
$form->addHidden('do', 'profile');
$form->addHidden('save', '1');
$form->addElement(form_makeTextField('fullname', $_SERVER['REMOTE_USER'], $lang['user'], '', 'block', array('size'=>'50', 'disabled'=>'disabled')));
$attr = array('size'=>'50');
if (!$auth->canDo('modName')) $attr['disabled'] = 'disabled';
$form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', $attr));
$attr = array('size'=>'50');
if (!$auth->canDo('modMail')) $attr['disabled'] = 'disabled';
$form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', $attr));
$form->addElement(form_makeTag('br'));
if ($auth->canDo('modPass')) {
$form->addElement(form_makePasswordField('newpass', $lang['newpass'], '', 'block', array('size'=>'50')));
$form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
}
if ($conf['profileconfirm']) {
$form->addElement(form_makeTag('br'));
$form->addElement(form_makePasswordField('oldpass', $lang['oldpass'], '', 'block', array('size'=>'50')));
}
$form->addElement(form_makeButton('submit', '', $lang['btn_save']));
$form->addElement(form_makeButton('reset', '', $lang['btn_reset']));
$form->endFieldset();
html_form('updateprofile', $form);
print '</div>'.NL;
}
/**
* This displays the edit form (lots of logic included)
*
* @fixme this is a huge lump of code and should be modularized
* @triggers HTML_PAGE_FROMTEMPLATE
* @triggers HTML_EDITFORM_INJECTION
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_edit($text=null,$include='edit'){ //FIXME: include needed?
global $ID;
global $REV;
global $DATE;
global $RANGE;
global $PRE;
global $SUF;
global $INFO;
global $SUM;
global $lang;
global $conf;
//set summary default
if(!$SUM){
if($REV){
$SUM = $lang['restored'];
}elseif(!$INFO['exists']){
$SUM = $lang['created'];
}
}
//no text? Load it!
if(!isset($text)){
$pr = false; //no preview mode
if($INFO['exists']){
if($RANGE){
list($PRE,$text,$SUF) = rawWikiSlices($RANGE,$ID,$REV);
}else{
$text = rawWiki($ID,$REV);
}
$check = md5($text);
$mod = false;
}else{
//try to load a pagetemplate
$data = array($ID);
$text = trigger_event('HTML_PAGE_FROMTEMPLATE',$data,'pageTemplate',true);
$check = md5('');
$mod = $text!=='';
}
}else{
$pr = true; //preview mode
if (isset($_REQUEST['changecheck'])) {
$check = $_REQUEST['changecheck'];
$mod = md5($text)!==$check;
} else {
// Why? Assume default text is unmodified.
$check = md5($text);
$mod = false;
}
}
$wr = $INFO['writable'];
if($wr){
if ($REV) print p_locale_xhtml('editrev');
print p_locale_xhtml($include);
}else{
// check pseudo action 'source'
if(!actionOK('source')){
msg('Command disabled: source',-1);
return;
}
print p_locale_xhtml('read');
}
if(!$DATE) $DATE = $INFO['lastmod'];
?>
<div style="width:99%;">
<div class="toolbar">
<div id="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.strftime($conf['dformat']);?></div>
<div id="tool__bar"><?php if($wr){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
<?php if($wr){?>
<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--
<?php /* sets changed to true when previewed */?>
textChanged = <?php ($mod) ? print 'true' : print 'false' ?>;
//--><!]]></script>
<span id="spell__action"></span>
<div id="spell__suggest"></div>
<?php } ?>
</div>
<div id="spell__result"></div>
<?php
$form = new Doku_Form('dw__editform');
$form->addHidden('id', $ID);
$form->addHidden('rev', $REV);
$form->addHidden('date', $DATE);
$form->addHidden('prefix', $PRE);
$form->addHidden('suffix', $SUF);
$form->addHidden('changecheck', $check);
$attr = array('tabindex'=>'1');
if (!$wr) $attr['readonly'] = 'readonly';
$form->addElement(form_makeWikiText($text, $attr));
$form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar')));
$form->addElement(form_makeOpenTag('div', array('id'=>'size__ctl')));
$form->addElement(form_makeCloseTag('div'));
if ($wr) {
$form->addElement(form_makeOpenTag('div', array('class'=>'editButtons')));
$form->addElement(form_makeButton('submit', 'save', $lang['btn_save'], array('id'=>'edbtn__save', 'accesskey'=>'s', 'tabindex'=>'4')));
$form->addElement(form_makeButton('submit', 'preview', $lang['btn_preview'], array('id'=>'edbtn__preview', 'accesskey'=>'p', 'tabindex'=>'5')));
$form->addElement(form_makeButton('submit', 'draftdel', $lang['btn_cancel'], array('tabindex'=>'6')));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeOpenTag('div', array('class'=>'summary')));
$form->addElement(form_makeTextField('summary', $SUM, $lang['summary'], 'edit__summary', 'nowrap', array('size'=>'50', 'tabindex'=>'2')));
$elem = html_minoredit();
if ($elem) $form->addElement($elem);
$form->addElement(form_makeCloseTag('div'));
}
$form->addElement(form_makeCloseTag('div'));
html_form('edit', $form);
print '</div>'.NL;
}
/**
* Adds a checkbox for minor edits for logged in users
*
* @author Andrea Gohr <andi@splitbrain.org>
*/
function html_minoredit(){
global $conf;
global $lang;
// minor edits are for logged in users only
if(!$conf['useacl'] || !$_SERVER['REMOTE_USER']){
return false;
}
$p = array();
$p['tabindex'] = 3;
if(!empty($_REQUEST['minor'])) $p['checked']='checked';
return form_makeCheckboxField('minor', '1', $lang['minoredit'], 'minoredit', 'nowrap', $p);
}
/**
* prints some debug info
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_debug(){
global $conf;
global $lang;
global $auth;
global $INFO;
//remove sensitive data
$cnf = $conf;
$cnf['auth']='***';
$cnf['notify']='***';
$cnf['ftp']='***';
$nfo = $INFO;
$nfo['userinfo'] = '***';
$ses = $_SESSION;
$ses[$conf['title']]['auth'] = '***';
print '<html><body>';
print '<p>When reporting bugs please send all the following ';
print 'output as a mail to andi@splitbrain.org ';
print 'The best way to do this is to save this page in your browser</p>';
print '<b>$INFO:</b><pre>';
print_r($nfo);
print '</pre>';
print '<b>$_SERVER:</b><pre>';
print_r($_SERVER);
print '</pre>';
print '<b>$conf:</b><pre>';
print_r($cnf);
print '</pre>';
print '<b>DOKU_BASE:</b><pre>';
print DOKU_BASE;
print '</pre>';
print '<b>abs DOKU_BASE:</b><pre>';
print DOKU_URL;
print '</pre>';
print '<b>rel DOKU_BASE:</b><pre>';
print dirname($_SERVER['PHP_SELF']).'/';
print '</pre>';
print '<b>PHP Version:</b><pre>';
print phpversion();
print '</pre>';
print '<b>locale:</b><pre>';
print setlocale(LC_ALL,0);
print '</pre>';
print '<b>encoding:</b><pre>';
print $lang['encoding'];
print '</pre>';
if($auth){
print '<b>Auth backend capabilities:</b><pre>';
print_r($auth->cando);
print '</pre>';
}
print '<b>$_SESSION:</b><pre>';
print_r($ses);
print '</pre>';
print '<b>Environment:</b><pre>';
print_r($_ENV);
print '</pre>';
print '<b>PHP settings:</b><pre>';
$inis = ini_get_all();
print_r($inis);
print '</pre>';
print '</body></html>';
}
function html_admin(){
global $ID;
global $INFO;
global $lang;
global $conf;
print p_locale_xhtml('admin');
// build menu of admin functions from the plugins that handle them
$pluginlist = plugin_list('admin');
$menu = array();
foreach ($pluginlist as $p) {
if($obj =& plugin_load('admin',$p) === NULL) continue;
// check permissions
if($obj->forAdminOnly() && !$INFO['isadmin']) continue;
$menu[] = array('plugin' => $p,
'prompt' => $obj->getMenuText($conf['lang']),
'sort' => $obj->getMenuSort()
);
}
usort($menu, 'p_sort_modes');
// output the menu
ptln('<ul>');
foreach ($menu as $item) {
if (!$item['prompt']) continue;
ptln(' <li><div class="li"><a href="'.wl($ID, 'do=admin&page='.$item['plugin']).'">'.$item['prompt'].'</a></div></li>');
}
ptln('</ul>');
}
/**
* Form to request a new password for an existing account
*
* @author Benoit Chesneau <benoit@bchesneau.info>
*/
function html_resendpwd() {
global $lang;
global $conf;
global $ID;
print p_locale_xhtml('resendpwd');
print '<div class="centeralign">'.NL;
$form = new Doku_Form('dw__resendpwd', wl($ID));
$form->startFieldset($lang['resendpwd']);
$form->addHidden('do', 'resendpwd');
$form->addHidden('save', '1');
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], '', 'block'));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
$form->endFieldset();
html_form('resendpwd', $form);
print '</div>'.NL;
}
/**
* Return the TOC rendered to XHTML
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_TOC($toc){
if(!count($toc)) return '';
global $lang;
$out = '<!-- TOC START -->'.DOKU_LF;
$out .= '<div class="toc">'.DOKU_LF;
$out .= '<div class="tocheader toctoggle" id="toc__header">';
$out .= $lang['toc'];
$out .= '</div>'.DOKU_LF;
$out .= '<div id="toc__inside">'.DOKU_LF;
$out .= html_buildlist($toc,'toc','html_list_toc');
$out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
$out .= '<!-- TOC END -->'.DOKU_LF;
return $out; }
/**
* Callback for html_buildlist
*/
function html_list_toc($item){
if($item['hid']){
$link = '#'.$item['hid'];
}else{
$link = $item['link'];
}
return '<span class="li"><a href="'.$link.'" class="toc">'.
hsc($item['title']).'</a></span>';
}
/**
* Helper function to build TOC items
*
* Returns an array ready to be added to a TOC array
*
* @param string $link - where to link (if $hash set to '#' it's a local anchor)
* @param string $text - what to display in the TOC
* @param int $level - nesting level
* @param string $hash - is prepended to the given $link, set blank if you want full links
*/
function html_mktocitem($link, $text, $level, $hash='#'){
global $conf;
return array( 'link' => $hash.$link,
'title' => $text,
'type' => 'ul',
'level' => $level);
}
/**
* Output a Doku_Form object.
* Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function html_form($name, &$form) {
// Safety check in case the caller forgets.
$form->endFieldset();
trigger_event('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
}
/**
* Form print function.
* Just calls printForm() on the data object.
*/
function html_form_output($data) {
$data->printForm();
}
//Setup VIM: ex: et ts=2 enc=utf-8 :