diff --git a/inc/format.php.bak b/inc/format.php.bak deleted file mode 100644 index 0a20b566c523d72ef0a37460a8501962dc1fde24..0000000000000000000000000000000000000000 --- a/inc/format.php.bak +++ /dev/null @@ -1,593 +0,0 @@ -<?php -/** - * link format functions - * - * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * @author Andreas Gohr <andi@splitbrain.org> - * @deprecated part of the XHTML renderer - */ - -trigger_error('deprecated parser.php included'); - - if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); - require_once(DOKU_INC.'conf/dokuwiki.php'); - require_once(DOKU_INC.'inc/common.php'); - - -/** - * Assembles all parts defined by the link formater below - * Returns HTML for the link - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_build($link){ - //make sure the url is XHTML compliant (skip mailto) - if(substr($link['url'],0,7) != 'mailto:'){ - $link['url'] = str_replace('&','&',$link['url']); - $link['url'] = str_replace('&amp;','&',$link['url']); - } - //remove double encodings in titles - $link['title'] = str_replace('&amp;','&',$link['title']); - - $ret = ''; - $ret .= $link['pre']; - $ret .= '<a href="'.$link['url'].'"'; - if($link['class']) $ret .= ' class="'.$link['class'].'"'; - if($link['target']) $ret .= ' target="'.$link['target'].'"'; - if($link['title']) $ret .= ' title="'.$link['title'].'"'; - if($link['style']) $ret .= ' style="'.$link['style'].'"'; - if($link['more']) $ret .= ' '.$link['more']; - $ret .= '>'; - $ret .= $link['name']; - $ret .= '</a>'; - $ret .= $link['suf']; - return $ret; -} - -/** - * Link Formaters - * - * Each of these functions need to set - * - * $link['url'] URL to use in href="" - * $link['name'] HTML to enclose in <a> with proper special char encoding - * $link['class'] CSS class to set on link - * $link['target'] which target to use (blank) for current window - * $link['style'] Additonal style attribute set with style="" - * $link['title'] Title to set with title="" - * $link['pre'] HTML to prepend to link - * $link['suf'] HTML to append to link - * $link['more'] Additonal HTML to include into the anchortag - * - */ - -/** - * format wiki links - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_wiki($link){ - global $conf; - global $ID; //we use this to get the current namespace - //obvious setup - $link['target'] = $conf['target']['wiki']; - $link['style'] = ''; - $link['pre'] = ''; - $link['suf'] = ''; - $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; - - $ns = getNS($ID); - - //if links starts with . add current namespace - if(strpos($link['url'],'.')===0){ - $link['url'] = $ns.':'.substr($link['url'],1); - } - - //if link contains no namespace. add current namespace (if any) - if($ns !== false && strpos($link['url'],':') === false){ - $link['url'] = $ns.':'.$link['url']; - } - - //keep hashlink if exists - list($link['url'],$hash) = split('#',$link['url'],2); - $hash = cleanID($hash); - - $file = wikiFN($link['url']); - $url = cleanID($link['url']); - - //check alternative plural/nonplural form - if(!@file_exists($file) && $conf['autoplural']){ - if(substr($url,-1) == 's'){ - $try = substr($url,0,-1); - }else{ - $try = $url.'s'; - } - $tryfile = wikiFN($try); - if(@file_exists($tryfile)){ - $file = $tryfile; - $url = $try; - } - } - - //set class and name depending on file existence and content - if(@file_exists($file)){ - $link['class']="wikilink1"; - if ($conf['useheading'] && empty($link['name'])) { - $hl = getFirstHeading(io_readFile($file)); - if ($hl) $link['name'] = $hl; - } - }else{ - $link['class']="wikilink2"; - } - - //if no name set yet, use (unclean) link without namespace - if(empty($link['name'])){ - if($conf['useslash']){ - $nssep = '[:;/]'; - }else{ - $nssep = '[:;]'; - } - $link['name'] = preg_replace('!.*'.$nssep.'!','',$link['url']); - } - $link['name'] = htmlspecialchars($link['name']); - - //set title - $link['title'] = $url; - - //construct the full link - $link['url'] = wl($url); - - //add hash if exists - if($hash) $link['url'] .= '#'.$hash; - - return $link; -} - -/** - * format external URLs - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_externalurl($link){ - global $conf; - //simple setup - $link['class'] = 'urlextern'; - $link['target'] = $conf['target']['extern']; - $link['pre'] = ''; - $link['suf'] = ''; - $link['style'] = ''; - $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; - $link['url'] = $link['url']; //keep it - $link['title'] = htmlspecialchars($link['url']); - if(!$link['name']) $link['name'] = htmlspecialchars($link['url']); - if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"'; - //thats it :-) - return $link; -} - -/** - * format windows share links - * - * this only works in IE :-( - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_windows($link){ - global $conf; - global $lang; - //simple setup - $link['class'] = 'windows'; - $link['target'] = $conf['target']['windows']; - $link['pre'] = ''; - $link['suf'] = ''; - $link['style'] = ''; - //Display error on browsers other than IE - $link['more'] = 'onclick="if(document.all == null){alert(\''.htmlspecialchars($lang['nosmblinks'],ENT_QUOTES).'\');}" onkeypress="if(document.all == null){alert(\''.htmlspecialchars($lang['nosmblinks'],ENT_QUOTES).'\');}"'; - - if(!$link['name']) $link['name'] = htmlspecialchars($link['url']); - $link['title'] = htmlspecialchars($link['url']); - $link['url'] = str_replace('\\','/',$link['url']); - $link['url'] = 'file:///'.$link['url']; - - return $link; -} - -/** - * format email addresses - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_email($link){ - global $conf; - //simple setup - $link['class'] = 'mail'; - $link['target'] = ''; - $link['pre'] = ''; - $link['suf'] = ''; - $link['style'] = ''; - $link['more'] = ''; - - $link['name'] = htmlspecialchars($link['name']); - - //shields up - if($conf['mailguard']=='visible'){ - //the mail name gets some visible encoding - $link['url'] = str_replace('@',' [at] ',$link['url']); - $link['url'] = str_replace('.',' [dot] ',$link['url']); - $link['url'] = str_replace('-',' [dash] ',$link['url']); - }elseif($conf['mailguard']=='hex'){ - for ($x=0; $x < strlen($link['url']); $x++) { - $encode .= '&#x' . bin2hex($link['url'][$x]).';'; - } - $link['url'] = $encode; - } - - $link['title'] = $link['url']; - if(!$link['name']) $link['name'] = $link['url']; - $link['url'] = 'mailto:'.$link['url']; - - return $link; -} - -/** - * format interwiki links - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_interwiki($link){ - global $conf; - - //obvious ones - $link['class'] = 'interwiki'; - $link['target'] = $conf['target']['interwiki']; - $link['pre'] = ''; - $link['suf'] = ''; - $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; - - //get interwiki short name - list($wiki,$link['url']) = split('>',$link['url'],2); - $wiki = strtolower(trim($wiki)); //always use lowercase - $link['url'] = trim($link['url']); - if(!$link['name']) $link['name'] = $link['url']; - - //encode special chars - $link['name'] = htmlspecialchars($link['name']); - - //set default to google - $url = 'http://www.google.com/search?q='; - $ico = 'google'; - - // Initialize as NULL - for the first fn call - static $iwlinks = NULL; - - // load interwikilinks if needed - if (!$iwlinks) $iwlinks = file('conf/interwiki.conf'); - - //add special case 'this' - $iwlinks[] = 'this '.DOKU_URL.'{NAME}'; - - //go through iwlinks and find URL for wiki - foreach ($iwlinks as $line){ - $line = preg_replace('/#.*/','',$line); //skip comments - $line = trim($line); - list($iw,$iwurl) = preg_split('/\s+/',$line); - if(!$iw or !$iwurl) continue; //skip broken or empty lines - //check for match - if(strtolower($iw) == $wiki){ - $ico = $wiki; - $url = $iwurl; - break; - } - } - - //if ico exists set additonal style - if(@file_exists('interwiki/'.$ico.'.png')){ - $link['style']='background: transparent url('.DOKU_BASE.'interwiki/'.$ico.'.png) 0px 1px no-repeat;'; - }elseif(@file_exists('interwiki/'.$ico.'.gif')){ - $link['style']='background: transparent url('.DOKU_BASE.'interwiki/'.$ico.'.gif) 0px 1px no-repeat;'; - } - - //do we stay at the same server? Use local target - if( strpos($url,DOKU_URL) === 0 ){ - $link['target'] = $conf['target']['wiki']; - } - - //replace placeholder - if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#',$url)){ - //use placeholders - $url = str_replace('{URL}',urlencode($link['url']),$url); - $url = str_replace('{NAME}',$link['url'],$url); - $parsed = parse_url($link['url']); - if(!$parsed['port']) $parsed['port'] = 80; - $url = str_replace('{SCHEME}',$parsed['scheme'],$url); - $url = str_replace('{HOST}',$parsed['host'],$url); - $url = str_replace('{PORT}',$parsed['port'],$url); - $url = str_replace('{PATH}',$parsed['path'],$url); - $url = str_replace('{QUERY}',$parsed['query'],$url); - $link['url'] = $url; - }else{ - //default - $link['url'] = $url.urlencode($link['url']); - } - - $link['title'] = htmlspecialchars($link['url']); - - //done :-) - return $link; -} - -/** - * format embedded media - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_link_media($link){ - global $conf; - global $ID; - - $link['class'] = 'media'; - $link['style'] = ''; - $link['pre'] = ''; - $link['suf'] = ''; - $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; - $class = 'media'; - - list($link['name'],$title) = split('\|',$link['name'],2); - $t = htmlspecialchars($title); - - //set alignment from spaces - if(substr($link['name'],0,1)==' ' && substr($link['name'],-1,1)==' '){ - $link['pre'] = "</p>\n<div align=\"center\">"; - $link['suf'] = "</div>\n<p>"; - }elseif(substr($link['name'],0,1)==' '){ - #$a = ' align="right"'; - $class = 'mediaright'; - }elseif(substr($link['name'],-1,1)==' '){ - #$a = ' align="left"'; - $class = 'medialeft'; - }else{ - $a = ' align="middle"'; - } - $link['name'] = trim($link['name']); - - //split into src and parameters (using the very last questionmark) - $pos = strrpos($link['name'], '?'); - if($pos !== false){ - $src = substr($link['name'],0,$pos); - $param = substr($link['name'],$pos+1); - }else{ - $src = $link['name']; - $param = ''; - } - - //parse width and height - if(preg_match('#(\d+)(x(\d+))?#i',$param,$size)){ - if($size[1]) $w = $size[1]; - if($size[3]) $h = $size[3]; - } - - //namespace mangling for internal images - if(!preg_match('#^https?://#i',$src)){ - $ns = getNS($ID); - //if src starts with . add current namespace - if(strpos($src,'.') === 0){ - $src = $ns.':'.substr($src,1); - } - //if src contains no namespace add current namespace if any - if($ns !== false && strpos($src,':') === false ){ - $src = $ns.':'.$src; - } - } - - //check for nocache/recache param - preg_match('/(nocache|recache)/i',$param,$cachemode); - - //do image caching, resizing and src rewriting - $cache = $src; - $isimg = img_cache($cache,$src,$w,$h,$cachemode[1]); - - //set link to src if none given - if(!$link['url']){ - $link['url'] = $src; - $link['target'] = $conf['target']['media']; - } - - //prepare name - if($isimg){ - $link['name'] = '<img src="'.$cache.'"'; - if($w) $link['name'] .= ' width="'.$w.'"'; - if($h) $link['name'] .= ' height="'.$h.'"'; - if($t) $link['name'] .= ' title="'.$t.'"'; - if($a) $link['name'] .= $a; - $link['name'] .= ' class="'.$class.'" border="0" alt="'.$t.'" />'; - }else{ - if($t){ - $link['name'] = $t; - }else{ - $link['name'] = basename($src); - } - } - - return $link; -} - -/** - * Build an URL list from a RSS feed - * - * Uses magpie - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_rss($url){ - global $lang; - define('MAGPIE_CACHE_ON', false); //we do our own caching - define('MAGPIE_DIR', 'inc/magpie/'); - define('MAGPIE_OUTPUT_ENCODING','UTF-8'); //return all feeds as UTF-8 - require_once(MAGPIE_DIR.'/rss_fetch.inc'); - - //disable warning while fetching - $elvl = error_reporting(E_ERROR); - $rss = fetch_rss($url); - error_reporting($elvl); - - $ret = '<ul class="rss">'; - if($rss){ - foreach ($rss->items as $item ) { - $link = array(); - $link['url'] = $item['link']; - $link['name'] = $item['title']; - $link = format_link_externalurl($link); - $ret .= '<li>'.format_link_build($link).'</li>'; - } - }else{ - $link['url'] = $url; - $link = format_link_externalurl($link); - $ret .= '<li>'; - $ret .= '<em>'.$lang['rssfailed'].'</em>'; - $ret .= format_link_build($link); - $ret .= '</li>'; - } - $ret .= '</ul>'; - return $ret; -} - -/** - * Create cache images - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function img_cache(&$csrc,&$src,&$w,&$h,$cachemode){ - global $conf; - - //container for various paths - $f['full']['web'] = $src; - $f['resz']['web'] = $src; - $f['full']['fs'] = $src; - $f['resz']['fs'] = $src; - - //generate cachename - $md5 = md5($src); - - //check if it is an image - if(preg_match('#\.(jpe?g|gif|png)$#i',$src,$match)){ - $ext = strtolower($match[1]); - $isimg = true; - } - - //check if it is external or a local mediafile - if(preg_match('#^([a-z0-9]+?)://#i',$src)){ - $isurl = true; - }else{ - $src = str_replace(':','/',$src); - $src = utf8_encodeFN($src); - $f['full']['web'] = $conf['mediaweb'].'/'.$src; - $f['resz']['web'] = $conf['mediaweb'].'/'.$src; - $f['full']['fs'] = $conf['mediadir'].'/'.$src; - $f['resz']['fs'] = $conf['mediadir'].'/'.$src; - } - - //download external images if allowed - if($isurl && $isimg && $cachemode != 'nocache'){ - $cache = $conf['mediadir']."/_cache/$md5.$ext"; - if ( ($cachemode == 'recache' && io_download($src,$cache)) || - @file_exists($cache) || io_download($src,$cache)){ - $f['full']['web'] = $conf['mediaweb']."/_cache/$md5.$ext"; - $f['resz']['web'] = $conf['mediaweb']."/_cache/$md5.$ext"; - $f['full']['fs'] = $conf['mediadir']."/_cache/$md5.$ext"; - $f['resz']['fs'] = $conf['mediadir']."/_cache/$md5.$ext"; - $isurl = false; - } - } - - //for local images (cached or media) do resizing - if($isimg && (!$isurl)){ - if($w){ - $info = getImageSize($f['full']['fs']); - //if $h not given calcualte it with correct aspect ratio - if(!$h){ - $h = round(($w * $info[1]) / $info[0]); - } - $cache = $conf['mediadir'].'/_cache/'.$md5.'.'.$w.'x'.$h.'.'.$ext; - //delete outdated cachefile - if(@file_exists($cache) && (filemtime($cache)<filemtime($f['full']['fs']))){ - unlink($cache); - } - //check if a resized cachecopy exists else create one - if(@file_exists($cache) || img_resize($ext,$f['full']['fs'],$info[0],$info[1],$cache,$w,$h)){ - $f['resz']['web'] = $conf['mediaweb'].'/_cache/'.$md5.'.'.$w.'x'.$h.'.'.$ext; - $f['resz']['fs'] = $conf['mediadir'].'/_cache/'.$md5.'.'.$w.'x'.$h.'.'.$ext; - } - }else{ - //if no new size was given just return the img size - $info = getImageSize($f['full']['fs']); - $w = $info[0]; - $h = $info[1]; - } - //urlencode (yes! secondtime! with force!) - $f['full']['web'] = utf8_encodeFN($f['full']['web'],false); - $f['resz']['web'] = utf8_encodeFN($f['resz']['web'],false); - } - - //set srcs - $src = $f['full']['web']; - $csrc = $f['resz']['web']; - return $isimg; -} - -/** - * resize images - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function img_resize($ext,$from,$from_w,$from_h,$to,$to_w,$to_h){ - global $conf; - - if($conf['gdlib'] < 1) return false; //no GDlib available or wanted - - // create an image of the given filetype - if ($ext == 'jpg' || $ext == 'jpeg'){ - if(!function_exists("imagecreatefromjpeg")) return false; - $image = @imagecreateFromjpeg($from); - }elseif($ext == 'png') { - if(!function_exists("imagecreatefrompng")) return false; - $image = @imagecreatefrompng($from); - }elseif($ext == 'gif') { - if(!function_exists("imagecreatefromgif")) return false; - $image = @imagecreatefromgif($from); - } - if(!$image) return false; - - if(($conf['gdlib']>1) && function_exists("imagecreatetruecolor")){ - $newimg = @imagecreatetruecolor ($to_w, $to_h); - } - if(!$newimg) $newimg = @imagecreate($to_w, $to_h); - if(!$newimg) return false; - - // create cachedir - io_makeFileDir($to); - - //try resampling first - if(function_exists("imagecopyresampled")){ - if(!@imagecopyresampled($newimg, $image, 0, 0, 0, 0, $to_w, $to_h, $from_w, $from_h)) { - imagecopyresized($newimg, $image, 0, 0, 0, 0, $to_w, $to_h, $from_w, $from_h); - } - }else{ - imagecopyresized($newimg, $image, 0, 0, 0, 0, $to_w, $to_h, $from_w, $from_h); - } - - if ($ext == 'jpg' || $ext == 'jpeg'){ - if(!function_exists("imagejpeg")) return false; - return imagejpeg($newimg, $to, 70); - }elseif($ext == 'png') { - if(!function_exists("imagepng")) return false; - return imagepng($newimg, $to); - }elseif($ext == 'gif') { - if(!function_exists("imagegif")) return false; - return imagegif($newimg, $to); - } - - return false; -} - - -//Setup VIM: ex: et ts=2 enc=utf-8 : diff --git a/inc/parser.php.bak b/inc/parser.php.bak deleted file mode 100644 index 8f4a188b7b419017bc4cbc7a2805e061397c7744..0000000000000000000000000000000000000000 --- a/inc/parser.php.bak +++ /dev/null @@ -1,862 +0,0 @@ -<?php -/** - * The DokuWiki parser - * - * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * @author Andreas Gohr <andi@splitbrain.org> - * @deprecated replaced by the new parser - */ - -trigger_error('deprecated parser.php included'); - - if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); - include_once(DOKU_INC.'inc/common.php'); - include_once(DOKU_INC.'inc/html.php'); - include_once(DOKU_INC.'inc/format.php'); - require_once(DOKU_INC.'lang/en/lang.php'); - require_once(DOKU_INC.'lang/'.$conf['lang'].'/lang.php'); - -/** - * The main parser function. - * - * Accepts raw data and returns valid xhtml - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function parse($text){ - global $parser; - global $conf; - $table = array(); - $hltable = array(); - - //preparse - $text = preparse($text,$table,$hltable); - - //padding with a newline - $text = "\n".$text."\n"; - - #for link matching - $urls = '(https?|telnet|gopher|file|wais|ftp|ed2k|irc)'; - $ltrs = '\w'; - $gunk = '/\#~:.?+=&%@!\-'; - $punc = '.:?\-;,'; - $host = $ltrs.$punc; - $any = $ltrs.$gunk.$punc; - - /* first pass */ - - //preformated texts - firstpass($table,$text,"#<nowiki>(.*?)</nowiki>#se","preformat('\\1','nowiki')"); - firstpass($table,$text,"#%%(.*?)%%#se","preformat('\\1','nowiki')"); - firstpass($table,$text,"#<code( (\w+))?>(.*?)</code>#se","preformat('\\3','code','\\2')"); - firstpass($table,$text,"#<file>(.*?)</file>#se","preformat('\\1','file')"); - - // html and php includes - firstpass($table,$text,"#<html>(.*?)</html>#se","preformat('\\1','html')"); - firstpass($table,$text,"#<php>(.*?)</php>#se","preformat('\\1','php')"); - - // codeblocks - firstpass($table,$text,"/(\n( {2,}|\t)[^\*\-\n ][^\n]+)(\n( {2,}|\t)[^\n]*)*/se","preformat('\\0','block')","\n"); - - //check if toc is wanted - if(!isset($parser['toc'])){ - if(strpos($text,'~~NOTOC~~')!== false){ - $text = str_replace('~~NOTOC~~','',$text); - $parser['toc'] = false; - }else{ - $parser['toc'] = true; - } - } - - //check if this file may be cached - if(!isset($parser['cache'])){ - if(strpos($text,'~~NOCACHE~~')!=false){ - $text = str_replace('~~NOCACHE~~','',$text); - $parser['cache'] = false; - }else{ - $parser['cache'] = true; - } - } - - //headlines - format_headlines($table,$hltable,$text); - - //links - firstpass($table,$text,"#\[\[([^\]]+?)\]\]#ie","linkformat('\\1')"); - - //media - firstpass($table,$text,"/\{\{([^\}]+)\}\}/se","mediaformat('\\1')"); - - //match full URLs (adapted from Perl cookbook) - firstpass($table,$text,"#(\b)($urls://[$any]+?)([$punc]*[^$any])#ie","linkformat('\\2')",'\1','\4'); - - //short www URLs - firstpass($table,$text,"#(\b)(www\.[$host]+?\.[$host]+?[$any]+?)([$punc]*[^$any])#ie","linkformat('http://\\2|\\2')",'\1','\3'); - - //windows shares - firstpass($table,$text,"#([$gunk$punc\s])(\\\\\\\\[$host]+?\\\\[$any]+?)([$punc]*[^$any])#ie","linkformat('\\2')",'\1','\3'); - - //short ftp URLs - firstpass($table,$text,"#(\b)(ftp\.[$host]+?\.[$host]+?[$any]+?)([$punc]*[^$any])#ie","linkformat('ftp://\\2')",'\1','\3'); - - // email@domain.tld - firstpass($table,$text,"#<([\w0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)>#ie", "linkformat('\\1@\\2')"); - - //CamelCase if wanted - if($conf['camelcase']){ - firstpass($table,$text,"#(\b)([A-Z]+[a-z]+[A-Z][A-Za-z]*)(\b)#se","linkformat('\\2')",'\1','\3'); - } - - $text = htmlspecialchars($text); - - //smileys - smileys($table,$text); - - //acronyms - acronyms($table,$text); - - /* second pass for simple formating */ - $text = simpleformat($text); - - /* third pass - insert the matches from 1st pass */ - reset($table); - while (list($key, $val) = each($table)) { - $text = str_replace($key,$val,$text); - } - - /* remove empty paragraphs */ - $text = preg_replace('"<p>\n*</p>"','',$text); - - /* remove padding */ - $text = trim($text); - return $text; -} - -/** - * Line by line preparser - * - * This preparses the text by walking it line by line. This - * is the only place where linenumbers are still available (needed - * for section edit. Some precautions have to be taken to not change - * any noparse block. - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function preparse($text,&$table,&$hltable){ - $lines = split("\n",$text); - - //prepare a tokens for paragraphs - $po = mkToken(); - $table[$po] = "<p>"; - $pc = mkToken(); - $table[$pc] = "</p>"; - - for ($l=0; $l<count($lines); $l++){ - //temporay line holder - $line = $lines[$l]; - - //look for end of multiline noparse areas - if($noparse){ - if(preg_match("#^.*?$noparse#",$line)){ - $noparse = ''; - $line = preg_replace("#^.*?$noparse#",$line,1); - }else{ - continue; - } - } - - if(!$noparse){ - //skip indented lines - if(preg_match('#^( |\t)#',$line)) continue; - //remove norparse areas which open and close on the same line - $line = preg_replace("#<nowiki>(.*?)</nowiki>#","",$line); - $line = preg_replace("#%%(.*?)%%#","",$line); - $line = preg_replace("#<code( (\w+))?>(.*?)</code>#","",$line); - $line = preg_replace("#<(file|html|php)>(.*?)</\\1>#","",$line); - //check for start of multiline noparse areas - if(preg_match('#^.*?<(nowiki|code|php|html|file)( (\w+))?>#',$line,$matches)){ - list($noparse) = split(" ",$matches[1]); //remove options - $noparse = '</'.$noparse.'>'; - continue; - }elseif(preg_match('#^.*?%%#',$line)){ - $noparse = '%%'; - continue; - } - } - - //handle headlines - if(preg_match('/^(\s)*(==+)(.+?)(==+)(\s*)$/',$lines[$l],$matches)){ - //get token - $tk = tokenize_headline($hltable,$matches[2],$matches[3],$l); - //replace line with token - $lines[$l] = $tk; - } - - //handle paragraphs - if(empty($lines[$l])){ - $lines[$l] = "$pc\n$po"; - } - } - - //reassemble full text - $text = join("\n",$lines); - //open first and close last paragraph - $text = "$po\n$text\n$pc"; - - return $text; -} - -/** - * Build TOC lookuptable - * - * This function adds some information about the given headline - * to a lookuptable to be processed later. Returns a unique token - * that idetifies the headline later - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function tokenize_headline(&$hltable,$pre,$hline,$lno){ - switch (strlen($pre)){ - case 2: - $lvl = 5; - break; - case 3: - $lvl = 4; - break; - case 4: - $lvl = 3; - break; - case 5: - $lvl = 2; - break; - default: - $lvl = 1; - break; - } - $token = mkToken(); - $hltable[] = array( 'name' => htmlspecialchars(trim($hline)), - 'level' => $lvl, - 'line' => $lno, - 'token' => $token ); - return $token; -} - -/** - * Headline formatter - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function format_headlines(&$table,&$hltable,&$text){ - global $parser; - global $conf; - global $lang; - global $ID; - - // walk the headline table prepared in preparsing - $last = 0; - $cnt = 0; - $hashs = array(); - foreach($hltable as $hl){ - $cnt++; - - //make unique headlinehash - $hash = cleanID($hl['name']); - $i=2; - while(in_array($hash,$hashs)) - $hash = cleanID($hl['name']).$i++; - $hashs[] = $hash; - - // build headline - $headline = "</p>\n"; //close paragraph - if($cnt - 1) $headline .= '</div>'; //no close on first HL - $headline .= '<a name="'.$hash.'"></a>'; - $headline .= '<h'.$hl['level'].'>'; - $headline .= $hl['name']; - $headline .= '</h'.$hl['level'].'>'; - $headline .= '<div class="level'.$hl['level'].'">'; - $headline .= "\n<p>"; //open new paragraph - - //remember for autoTOC - if($hl['level'] <= $conf['maxtoclevel']){ - $content[] = array('id' => $hash, - 'name' => $hl['name'], - 'level' => $hl['level']); - } - - //add link for section edit for HLs 1, and 3 - if( ($hl['level'] <= $conf['maxseclevel']) && - ($hl['line'] - $last > 1)){ - $secedit = '<!-- SECTION ['.$last.'-'.($hl['line'] - 1).'] -->'; - $headline = $secedit.$headline; - $last = $hl['line']; - } - - //put headline into firstpasstable - $table[$hl['token']] = $headline; - } - - //add link for editing the last section - if($last){ - $secedit = '<!-- SECTION ['.$last.'-] -->'; - $token = mktoken(); - $text .= $token; - $table[$token] = $secedit; - } - - //close last div - if ($cnt){ - $token = mktoken(); - $text .= $token; - $table[$token] = '</div>'; - } - - //prepend toc - if ($parser['toc'] && count($content) > 2){ - $token = mktoken(); - $text = $token.$text; - $table[$token] = html_toc($content); - } -} - -/** - * Formats various link types using the functions from format.php - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function linkformat($match){ - global $conf; - //unescape - $match = str_replace('\\"','"',$match); - - //prepare variables for the formaters - $link = array(); - list($link['url'],$link['name']) = split('\|',$match,2); - $link['url'] = trim($link['url']); - $link['name'] = trim($link['name']); - $link['class'] = ''; - $link['target'] = ''; - $link['style'] = ''; - $link['pre'] = ''; - $link['suf'] = ''; - $link['more'] = ''; - - //save real name for image check - $realname = $link['name']; - - /* put it into the right formater */ - if(strpos($link['url'],'>')){ - // InterWiki - $link = format_link_interwiki($link); - }elseif(preg_match('#^([a-z0-9]+?)://#i',$link['url'])){ - // external URL - $link = format_link_externalurl($link); - }elseif(preg_match("/^\\\\\\\\([a-z0-9\-_.]+)\\\\(.+)$/",$link['url'])){ - // windows shares - $link = format_link_windows($link); - }elseif(preg_match('#([a-z0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i',$link['url'])){ - // email - $link = format_link_email($link); - }else{ - // wiki link - $link = format_link_wiki($link); - } - - //is realname an image? use media formater - if(preg_match('#^{{.*?\.(gif|png|jpe?g)(\?.*?)?\s*(\|.*?)?}}$#',$realname)){ - $link['name'] = substr($realname,2,-2); - $link = format_link_media($link); - } - - // build the replacement with the variables set by the formaters - return format_link_build($link); -} - -/** - * Simple text formating and typography is done here - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function simpleformat($text){ - global $conf; - - $text = preg_replace('/__(.+?)__/s','<u>\1</u>',$text); //underline - $text = preg_replace('/\/\/(.+?)\/\//s','<em>\1</em>',$text); //emphasize - $text = preg_replace('/\*\*(.+?)\*\*/s','<strong>\1</strong>',$text); //bold - $text = preg_replace('/\'\'(.+?)\'\'/s','<code>\1</code>',$text); //code - $text = preg_replace('#<del>(.*?)</del>#is','<del>\1</del>',$text); //deleted - $text = preg_replace('/^\s*----+\s*$/m',"</p>\n<hr noshade=\"noshade\" size=\"1\" />\n<p>",$text); //hr - - //sub and superscript - $text = preg_replace('#<su([bp])>(.*?)</su\1>#is','<su\1>\2</su\1>',$text); - - //do quoting - $text = preg_replace("/\n((>)[^\n]*?\n)+/se","'\n'.quoteformat('\\0').'\n'",$text); - - // Typography - if($conf['typography']){ - $text = preg_replace('/(?<!-)--(?!-)/s','–',$text); //endash - $text = preg_replace('/(?<!-)---(?!-)/s','—',$text); //emdash - $text = preg_replace('/"([^\"]+?)"/s','“\1”',$text); //curly quotes - $text = preg_replace('/(?<=\s)\'(?=\S)/m','‘',$text); //single open quote - $text = preg_replace('/(?<=\S)\'/','’',$text); //single closing quote or apostroph - $text = preg_replace('/\.\.\./','…',$text); //ellipse - $text = preg_replace('/(?<=\d)x(?=\d)/i','×',$text); //640x480 - - $text = preg_replace('/>>/i','»',$text); // >> - $text = preg_replace('/<</i','«',$text); // << - - $text = preg_replace('/<->/i','↔',$text); // <-> - $text = preg_replace('/<-/i','←',$text); // <- - $text = preg_replace('/->/i','→',$text); // -> - - $text = preg_replace('/<=>/i','⇔',$text); // <=> - $text = preg_replace('/<=/i','⇐',$text); // <= - $text = preg_replace('/=>/i','⇒',$text); // => - - $text = preg_replace('/\(c\)/i','©',$text); // copyrigtht - $text = preg_replace('/\(r\)/i','®',$text); // registered - $text = preg_replace('/\(tm\)/i','™',$text); // trademark - } - - //forced linebreaks - $text = preg_replace('#\\\\\\\\(?=\s)#',"<br />",$text); - - // lists (blocks leftover after blockformat) - $text = preg_replace("/(\n( {2,}|\t)[\*\-][^\n]+)(\n( {2,}|\t)[^\n]*)*/se","\"\\n\".listformat('\\0')",$text); - - // tables - $text = preg_replace("/\n(([\|\^][^\n]*?)+[\|\^] *\n)+/se","\"\\n\".tableformat('\\0')",$text); - - // footnotes - $text = footnotes($text); - - // run custom text replacements - $text = customs($text); - - return $text; -} - -/** - * Footnote formating - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function footnotes($text){ - $num = 0; - while (preg_match('/\(\((.+?)\)\)/s',$text,$match)){ - $num++; - $fn = $match[1]; - $linkt = '<a href="#fn'.$num.'" name="fnt'.$num.'" class="fn_top">'.$num.')</a>'; - $linkb = '<a href="#fnt'.$num.'" name="fn'.$num.'" class="fn_bot">'.$num.')</a>'; - - $text = preg_replace('/ ?\(\((.+?)\)\)/s',$linkt,$text,1); - if($num == 1) $text .= '<div class="footnotes">'; - $text .= '<div class="fn">'.$linkb.' '.$fn.'</div>'; - } - - if($num) $text .= '</div>'; - return $text; -} - -/** - * Replace smileys with their graphic equivalents - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function smileys(&$table,&$text){ - $smileys = file('conf/smileys.conf'); - foreach($smileys as $smiley){ - $smiley = preg_replace('/#.*$/','',$smiley); //ignore comments - $smiley = trim($smiley); - if(empty($smiley)) continue; - $sm = preg_split('/\s+/',$smiley,2); - $sm[1] = '<img src="'.DOKU_BASE.'smileys/'.$sm[1].'" align="middle" alt="'.$sm[0].'" />'; - $sm[0] = preg_quote($sm[0],'/'); - firstpass($table,$text,'/(?<!\w)'.$sm[0].'(?!\w)/s',$sm[1]); - } -} - -/** - * Add acronym tags to known acronyms - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function acronyms(&$table,&$text){ - $acronyms = file('conf/acronyms.conf'); - foreach($acronyms as $acro){ - $acro = preg_replace('/#.*$/','',$acro); //ignore comments - $acro = trim($acro); - if(empty($acro)) continue; - list($ac,$desc) = preg_split('/\s+/',$acro,2); - $ac = preg_quote($ac,'/'); - firstpass($table,$text,'/\b('.$ac.')\b/s',"<acronym title=\"$desc\">\\1</acronym>"); - } -} - -/** - * Apply custom text replacements - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function customs($text){ - $reps = file ('conf/custom.conf'); - foreach($reps as $rep){ - //strip comments only outside a regexp - $rep = preg_replace('/#[^\/]*$/','',$rep); //ignore comments - $rep = trim($rep); - if(empty($rep)) continue; - if(preg_match('#^(/.+/\w*)\s+\'(.*)\'$#',$rep,$matches)){ - $text = preg_replace($matches[1],$matches[2],$text); - } - } - return $text; -} - -/** - * Replace regexp with token - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function firstpass(&$table,&$text,$regexp,$replace,$lpad='',$rpad=''){ - //extended regexps have to be disabled for inserting the token - //and later reenabled when handling the actual code: - $ext=''; - if(substr($regexp,-1) == 'e'){ - $ext='e'; - $regexp = substr($regexp,0,-1); - } - - while(preg_match($regexp,$text,$matches)){ - $token = mkToken(); - $match = $matches[0]; - $text = preg_replace($regexp,$lpad.$token.$rpad,$text,1); - $table[$token] = preg_replace($regexp.$ext,$replace,$match); - } -} - -/** - * create a random and hopefully unique token - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function mkToken(){ - return '~'.md5(uniqid(rand(), true)).'~'; -} - -/** - * Do quote blocks - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function quoteformat($block){ - $block = trim($block); - $lines = split("\n",$block); - - $lvl = 0; - $ret = ""; - foreach ($lines as $line){ - //remove '>' and count them - $cnt = 0; - while(substr($line,0,4) == '>'){ - $line = substr($line,4); - $cnt++; - } - //compare to last level and open or close new divs if needed - if($cnt > $lvl){ - $ret .= "</p>\n"; - for ($i=0; $i< $cnt - $lvl; $i++){ - $ret .= '<div class="quote">'; - } - $ret .= "\n<p>"; - }elseif($cnt < $lvl){ - $ret .= "\n</p>"; - for ($i=0; $i< $lvl - $cnt; $i++){ - $ret .= "</div>\n"; - } - $ret .= "<p>\n"; - }elseif(empty($line)){ - $ret .= "</p>\n<p>"; - } - //keep rest of line but trim left whitespaces - $ret .= ltrim($line)."\n"; - //remember level - $lvl = $cnt; - } - - //close remaining divs - $ret .= "</p>\n"; - for ($i=0; $i< $lvl; $i++){ - $ret .= "</div>\n"; - } - $ret .= "<p>\n"; - - return "$ret"; -} - -/** - * format inline tables - * - * @author Andreas Gohr <andi@splitbrain.org> - * @author Aaron Evans <aarone@klamathsystems.com> - */ -function tableformat($block) { - $block = trim($block); - $lines = split("\n",$block); - $ret = ""; - //build a row array - $rows = array(); - for($r=0; $r < count($lines); $r++){ - $line = $lines[$r]; - //remove last seperator and trailing whitespace - $line = preg_replace('/[\|\^]\s*$/', '', $line); - $c = -1; //prepare colcounter) - for($chr=0; $chr < strlen($line); $chr++){ - if($line[$chr] == '^'){ - $c++; - $rows[$r][$c]['head'] = true; - $rows[$r][$c]['data'] = ''; - }elseif($line[$chr] == '|'){ - $c++; - $rows[$r][$c]['head'] = false; - $rows[$r][$c]['data'] = ''; - }else{ - $rows[$r][$c]['data'].= $line[$chr]; - } - } - } - - //build table - $ret .= "</p>\n<table class=\"inline\">\n"; - for($r=0; $r < count($rows); $r++){ - $ret .= " <tr>\n"; - - for ($c=0; $c < count($rows[$r]); $c++){ - $cspan=1; - $data = $rows[$r][$c]['data']; - $head = $rows[$r][$c]['head']; - - //join cells if next is empty - while($c < count($rows[$r])-1 && $rows[$r][$c+1]['data'] == ''){ - $c++; - $cspan++; - } - if($cspan > 1){ - $cspan = 'colspan="'.$cspan.'"'; - }else{ - $cspan = ''; - } - - //determine alignment from whitespace - if (preg_match('/^\s\s/', $data)) { // right indentation - $td_class = "rightalign"; - if (preg_match('/\s\s$/', $data)) { // both left and right indentation - $td_class = "centeralign"; - } - } else { // left indentation (default) - $td_class = "leftalign"; - } - - $data = trim($data); - if ($head) { - $ret .= " <th class=\"$td_class\" $cspan>$data </th>\n"; // set css class for alignment - } else { - $ret .= " <td class=\"$td_class\" $cspan>$data </td>\n"; // set css class for alignment - } - } - $ret .= " </tr>\n"; - } - $ret .= "</table><br />\n<p>"; - - return $ret; -} - -/** - * format lists - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function listformat($block){ - //remove 1st newline - $block = substr($block,1); - //unescape - $block = str_replace('\\"','"',$block); - -//dbg($block); - - //walk line by line - $ret=''; - $lst=0; - $lvl=0; - $enc=0; - $lines = split("\n",$block); - - //build an item array - $cnt=0; - $items = array(); - foreach ($lines as $line){ - //get intendion level - $lvl = 0; - $lvl += floor(strspn($line,' ')/2); - $lvl += strspn($line,"\t"); - //remove indents - $line = preg_replace('/^[ \t]+/','',$line); - //get type of list - (substr($line,0,1) == '-') ? $type='ol' : $type='ul'; - // remove bullet and following spaces - $line = preg_replace('/^[*\-]\s*/','',$line); - //add item to the list - $items[$cnt]['level'] = $lvl; - $items[$cnt]['type'] = $type; - $items[$cnt]['text'] = $line; - //increase counter - $cnt++; - } - - $level = 0; - $opens = array(); - - foreach ($items as $item){ - if( $item['level'] > $level ){ - //open new list - $ret .= "\n<".$item['type'].">\n"; - array_push($opens,$item['type']); - }elseif( $item['level'] < $level ){ - //close last item - $ret .= "</li>\n"; - for ($i=0; $i<($level - $item['level']); $i++){ - //close higher lists - $ret .= '</'.array_pop($opens).">\n</li>\n"; - } - }elseif($item['type'] != $opens[count($opens)-1]){ - //close last list and open new - $ret .= '</'.array_pop($opens).">\n</li>\n"; - $ret .= "\n<".$item['type'].">\n"; - array_push($opens,$item['type']); - }else{ - //close last item - $ret .= "</li>\n"; - } - - //remember current level and type - $level = $item['level']; - - //print item - $ret .= '<li class="level'.$item['level'].'">'; - $ret .= '<span class="li">'.$item['text'].'</span>'; - } - - //close remaining items and lists - while ($open = array_pop($opens)){ - $ret .= "</li>\n"; - $ret .= '</'.$open.">\n"; - } - return "</p>\n".$ret."\n<p>"; -} - -/** - * Handle preformatted blocks - * - * Uses GeSHi for syntax highlighting - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function preformat($text,$type,$option=''){ - global $conf; - global $lang; - //unescape - $text = str_replace('\\"','"',$text); - - if($type == 'php' && !$conf['phpok']) $type='file'; - if($type == 'html' && !$conf['htmlok']) $type='file'; - - switch ($type){ - case 'php': - ob_start(); - eval($text); - $text = ob_get_contents(); - ob_end_clean(); - break; - case 'html': - break; - case 'nowiki': - $text = htmlspecialchars($text); - break; - case 'file': - $text = htmlspecialchars($text); - $text = "</p>\n<pre class=\"file\">".$text."</pre>\n<p>"; - break; - case 'code': - if(empty($option)){ - $text = htmlspecialchars($text); - $text = '<pre class="code">'.$text.'</pre>'; - }else{ - //strip leading blank line - $text = preg_replace('/^\s*?\n/','',$text); - //use geshi for highlighting - require_once("inc/geshi.php"); - $geshi = new GeSHi($text, strtolower($option), "inc/geshi"); - $geshi->set_encoding($lang['encoding']); - $geshi->enable_classes(); - $geshi->set_header_type(GESHI_HEADER_PRE); - $geshi->set_overall_class('code'); - $geshi->set_link_target($conf['target']['extern']); - $text = $geshi->parse_code(); - } - $text = "</p>\n".$text."\n<p>"; - break; - case 'block': - $text = substr($text,1); //remove 1st newline - $lines = split("\n",$text); //break into lines - $text = ''; - foreach($lines as $line){ - $text .= substr($line,2)."\n"; //remove indents - } - $text = htmlspecialchars($text); - $text = "</p>\n<pre class=\"pre\">".$text."</pre>\n<p>"; - break; - } - return $text; -} - -/** - * Format embedded media (images) - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function mediaformat($text){ - global $conf; - - //unescape - $text = str_replace('\\"','"',$text); - - // format RSS - if(substr($text,0,4) == 'rss>'){ - return format_rss(substr($text,4)); - } - - //handle normal media stuff - $link = array(); - $link['name'] = $text; - $link = format_link_media($link); - return format_link_build($link); -} - -/** - * Get first heading, to be used as a page title - * - * @author Jan Decaluwe <jan@jandecaluwe.com> - */ -function getFirstHeading($text){ - $title = ''; - $lines = split("\n",$text); - foreach($lines as $line){ - if(preg_match('/^\s*==+(.+?)==+\s*$/',$line,$matches)){ - $title = $matches[1]; - break; - } - } - return $title; -} - - -//Setup VIM: ex: et ts=2 enc=utf-8 :