* @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 */ 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 .= ' 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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'] = "

\n
"; $link['suf'] = "
\n

"; }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'] = ''.$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 */ 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 = '

    '; if($rss){ foreach ($rss->items as $item ) { $link = array(); $link['url'] = $item['link']; $link['name'] = $item['title']; $link = format_link_externalurl($link); $ret .= '
  • '.format_link_build($link).'
  • '; } }else{ $link['url'] = $url; $link = format_link_externalurl($link); $ret .= '
  • '; $ret .= ''.$lang['rssfailed'].''; $ret .= format_link_build($link); $ret .= '
  • '; } $ret .= '
'; return $ret; } /** * Create cache images * * @author Andreas Gohr */ 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) */ 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 :