10cecf9d5Sandi<?php 2b625487dSandi/** 3b625487dSandi * Renderer for XHTML output 4b625487dSandi * 5b625487dSandi * @author Harry Fuecks <hfuecks@gmail.com> 6b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 7b625487dSandi */ 8b625487dSandi 90cecf9d5Sandiif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 100cecf9d5Sandi 110cecf9d5Sandiif ( !defined('DOKU_LF') ) { 120cecf9d5Sandi // Some whitespace to help View > Source 130cecf9d5Sandi define ('DOKU_LF',"\n"); 140cecf9d5Sandi} 150cecf9d5Sandi 160cecf9d5Sandiif ( !defined('DOKU_TAB') ) { 170cecf9d5Sandi // Some whitespace to help View > Source 180cecf9d5Sandi define ('DOKU_TAB',"\t"); 190cecf9d5Sandi} 200cecf9d5Sandi 210e1c636eSandirequire_once DOKU_INC . 'inc/parser/renderer.php'; 22ee20e7d1Sandirequire_once DOKU_INC . 'inc/pluginutils.php'; 230e1c636eSandi 240cecf9d5Sandi/** 25b625487dSandi * The Renderer 260cecf9d5Sandi */ 27ac83b9d8Sandiclass Doku_Renderer_xhtml extends Doku_Renderer { 280cecf9d5Sandi 290cecf9d5Sandi var $doc = ''; 300cecf9d5Sandi 310cecf9d5Sandi var $headers = array(); 320cecf9d5Sandi 330cecf9d5Sandi var $footnotes = array(); 340cecf9d5Sandi 350cecf9d5Sandi var $acronyms = array(); 360cecf9d5Sandi var $smileys = array(); 370cecf9d5Sandi var $badwords = array(); 380cecf9d5Sandi var $entities = array(); 390cecf9d5Sandi var $interwiki = array(); 400cecf9d5Sandi 41af587fa8Sandi var $lastsec = 0; 42af587fa8Sandi 437764a90aSandi var $store = ''; 447764a90aSandi 450cecf9d5Sandi function document_start() { 460cecf9d5Sandi } 470cecf9d5Sandi 480cecf9d5Sandi function document_end() { 491d47afe1Sandi // add button for last section if any and more than one 50433bef32Sandi if($this->lastsec > 1) $this->_secedit($this->lastsec,''); 510cecf9d5Sandi 520cecf9d5Sandi if ( count ($this->footnotes) > 0 ) { 53a2d649c4Sandi $this->doc .= '<div class="footnotes">'.DOKU_LF; 54*d74aace9Schris 55*d74aace9Schris $id = 0; 560cecf9d5Sandi foreach ( $this->footnotes as $footnote ) { 57*d74aace9Schris $id++; // the number of the current footnote 58*d74aace9Schris 59*d74aace9Schris // check its not a placeholder that indicates actual footnote text is elsewhere 60*d74aace9Schris if (substr($footnote, 0, 5) != "@@FNT") { 61*d74aace9Schris 62*d74aace9Schris // open the footnote and set the anchor and backlink 63*d74aace9Schris $this->doc .= '<div class="fn">'; 64*d74aace9Schris $this->doc .= '<a href="#fnt'.$id.'" id="fn'.$id.'" name="fn'.$id.'" class="fn_bot">'; 65*d74aace9Schris $this->doc .= $id.')</a> '.DOKU_LF; 66*d74aace9Schris 67*d74aace9Schris // get any other footnotes that use the same markup 68*d74aace9Schris $alt = array_keys($this->footnotes, "@@FNT$id"); 69*d74aace9Schris 70*d74aace9Schris if (count($alt)) { 71*d74aace9Schris foreach ($alt as $ref) { 72*d74aace9Schris // set anchor and backlink for the other footnotes 73*d74aace9Schris $this->doc .= ', <a href="#fnt'.($ref+1).'" id="fn'.($ref+1).'" name="fn'.($ref+1).'" class="fn_bot">'; 74*d74aace9Schris $this->doc .= ($ref+1).')</a> '.DOKU_LF; 75*d74aace9Schris } 76*d74aace9Schris } 77*d74aace9Schris 78*d74aace9Schris // add footnote markup and close this footnote 79a2d649c4Sandi $this->doc .= $footnote; 80*d74aace9Schris $this->doc .= '</div>' . DOKU_LF; 81*d74aace9Schris } 820cecf9d5Sandi } 83a2d649c4Sandi $this->doc .= '</div>'.DOKU_LF; 840cecf9d5Sandi } 850cecf9d5Sandi } 860cecf9d5Sandi 87ee20e7d1Sandi //handles plugin rendering 88ee20e7d1Sandi function plugin($name,$data){ 89ee20e7d1Sandi $plugin = null; 90ee20e7d1Sandi if(plugin_load('syntax',$name,$plugin)){ 91ee20e7d1Sandi $plugin->render('xhtml',$this,$data); 92ee20e7d1Sandi } 93ee20e7d1Sandi } 94ee20e7d1Sandi 950cecf9d5Sandi function toc_open() { 96d35041baSandi global $lang; 97a2d649c4Sandi $this->doc .= '<div class="toc">'.DOKU_LF; 98d35041baSandi $this->doc .= '<div class="tocheader">'; 9990f3a5b1Sandi $this->doc .= ' <script type="text/javascript">showTocToggle("+","-")</script>'; 100d35041baSandi $this->doc .= $lang['toc']; 101e4a9930bSmatthiasgrimm $this->doc .= '</div>'.DOKU_LF; 102a2d649c4Sandi $this->doc .= '<div id="tocinside">'.DOKU_LF; 1030cecf9d5Sandi } 1040cecf9d5Sandi 1050cecf9d5Sandi function tocbranch_open($level) { 106a2d649c4Sandi $this->doc .= '<ul class="toc">'.DOKU_LF; 1070cecf9d5Sandi } 1080cecf9d5Sandi 1090cecf9d5Sandi function tocitem_open($level, $empty = FALSE) { 1100cecf9d5Sandi if ( !$empty ) { 111a2d649c4Sandi $this->doc .= '<li class="level'.$level.'">'; 1120cecf9d5Sandi } else { 113a2d649c4Sandi $this->doc .= '<li class="clear">'; 1140cecf9d5Sandi } 1150cecf9d5Sandi } 1160cecf9d5Sandi 1170cecf9d5Sandi function tocelement($level, $title) { 118a2d649c4Sandi $this->doc .= '<span class="li"><a href="#'.$this->_headerToLink($title).'" class="toc">'; 119a2d649c4Sandi $this->doc .= $this->_xmlEntities($title); 120a2d649c4Sandi $this->doc .= '</a></span>'; 1210cecf9d5Sandi } 1220cecf9d5Sandi 1230cecf9d5Sandi function tocitem_close($level) { 124a2d649c4Sandi $this->doc .= '</li>'.DOKU_LF; 1250cecf9d5Sandi } 1260cecf9d5Sandi 1270cecf9d5Sandi function tocbranch_close($level) { 128a2d649c4Sandi $this->doc .= '</ul>'.DOKU_LF; 1290cecf9d5Sandi } 1300cecf9d5Sandi 1310cecf9d5Sandi function toc_close() { 132a2d649c4Sandi $this->doc .= '</div>'.DOKU_LF.'</div>'.DOKU_LF; 1330cecf9d5Sandi } 1340cecf9d5Sandi 135af587fa8Sandi function header($text, $level, $pos) { 136af587fa8Sandi global $conf; 137af587fa8Sandi //handle section editing 138af587fa8Sandi if($level <= $conf['maxseclevel']){ 139af587fa8Sandi // add button for last section if any 140433bef32Sandi if($this->lastsec) $this->_secedit($this->lastsec,$pos-1); 141af587fa8Sandi // remember current position 142af587fa8Sandi $this->lastsec = $pos; 143af587fa8Sandi } 144af587fa8Sandi 145a2d649c4Sandi $this->doc .= DOKU_LF.'<a name="'.$this->_headerToLink($text).'"></a><h'.$level.'>'; 146a2d649c4Sandi $this->doc .= $this->_xmlEntities($text); 147a2d649c4Sandi $this->doc .= "</h$level>".DOKU_LF; 1480cecf9d5Sandi } 1490cecf9d5Sandi 1500cecf9d5Sandi function section_open($level) { 151a2d649c4Sandi $this->doc .= "<div class=\"level$level\">".DOKU_LF; 1520cecf9d5Sandi } 1530cecf9d5Sandi 1540cecf9d5Sandi function section_close() { 155a2d649c4Sandi $this->doc .= DOKU_LF.'</div>'.DOKU_LF; 1560cecf9d5Sandi } 1570cecf9d5Sandi 1580cecf9d5Sandi function cdata($text) { 159a2d649c4Sandi $this->doc .= $this->_xmlEntities($text); 1600cecf9d5Sandi } 1610cecf9d5Sandi 1620cecf9d5Sandi function p_open() { 163a2d649c4Sandi $this->doc .= DOKU_LF.'<p>'.DOKU_LF; 1640cecf9d5Sandi } 1650cecf9d5Sandi 1660cecf9d5Sandi function p_close() { 167a2d649c4Sandi $this->doc .= DOKU_LF.'</p>'.DOKU_LF; 1680cecf9d5Sandi } 1690cecf9d5Sandi 1700cecf9d5Sandi function linebreak() { 171a2d649c4Sandi $this->doc .= '<br/>'.DOKU_LF; 1720cecf9d5Sandi } 1730cecf9d5Sandi 1740cecf9d5Sandi function hr() { 175a2d649c4Sandi $this->doc .= '<hr noshade="noshade" size="1" />'.DOKU_LF; 1760cecf9d5Sandi } 1770cecf9d5Sandi 1780cecf9d5Sandi function strong_open() { 179a2d649c4Sandi $this->doc .= '<strong>'; 1800cecf9d5Sandi } 1810cecf9d5Sandi 1820cecf9d5Sandi function strong_close() { 183a2d649c4Sandi $this->doc .= '</strong>'; 1840cecf9d5Sandi } 1850cecf9d5Sandi 1860cecf9d5Sandi function emphasis_open() { 187a2d649c4Sandi $this->doc .= '<em>'; 1880cecf9d5Sandi } 1890cecf9d5Sandi 1900cecf9d5Sandi function emphasis_close() { 191a2d649c4Sandi $this->doc .= '</em>'; 1920cecf9d5Sandi } 1930cecf9d5Sandi 1940cecf9d5Sandi function underline_open() { 195a2d649c4Sandi $this->doc .= '<u>'; 1960cecf9d5Sandi } 1970cecf9d5Sandi 1980cecf9d5Sandi function underline_close() { 199a2d649c4Sandi $this->doc .= '</u>'; 2000cecf9d5Sandi } 2010cecf9d5Sandi 2020cecf9d5Sandi function monospace_open() { 203a2d649c4Sandi $this->doc .= '<code>'; 2040cecf9d5Sandi } 2050cecf9d5Sandi 2060cecf9d5Sandi function monospace_close() { 207a2d649c4Sandi $this->doc .= '</code>'; 2080cecf9d5Sandi } 2090cecf9d5Sandi 2100cecf9d5Sandi function subscript_open() { 211a2d649c4Sandi $this->doc .= '<sub>'; 2120cecf9d5Sandi } 2130cecf9d5Sandi 2140cecf9d5Sandi function subscript_close() { 215a2d649c4Sandi $this->doc .= '</sub>'; 2160cecf9d5Sandi } 2170cecf9d5Sandi 2180cecf9d5Sandi function superscript_open() { 219a2d649c4Sandi $this->doc .= '<sup>'; 2200cecf9d5Sandi } 2210cecf9d5Sandi 2220cecf9d5Sandi function superscript_close() { 223a2d649c4Sandi $this->doc .= '</sup>'; 2240cecf9d5Sandi } 2250cecf9d5Sandi 2260cecf9d5Sandi function deleted_open() { 227a2d649c4Sandi $this->doc .= '<del>'; 2280cecf9d5Sandi } 2290cecf9d5Sandi 2300cecf9d5Sandi function deleted_close() { 231a2d649c4Sandi $this->doc .= '</del>'; 2320cecf9d5Sandi } 2330cecf9d5Sandi 2343fd0b676Sandi /** 2353fd0b676Sandi * Callback for footnote start syntax 2363fd0b676Sandi * 2373fd0b676Sandi * All following content will go to the footnote instead of 238*d74aace9Schris * the document. To achieve this the previous rendered content 2393fd0b676Sandi * is moved to $store and $doc is cleared 2403fd0b676Sandi * 2413fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 2423fd0b676Sandi */ 2430cecf9d5Sandi function footnote_open() { 2447764a90aSandi 2457764a90aSandi // move current content to store and record footnote 2467764a90aSandi $this->store = $this->doc; 2477764a90aSandi $this->doc = ''; 2480cecf9d5Sandi } 2490cecf9d5Sandi 2503fd0b676Sandi /** 2513fd0b676Sandi * Callback for footnote end syntax 2523fd0b676Sandi * 2533fd0b676Sandi * All rendered content is moved to the $footnotes array and the old 2543fd0b676Sandi * content is restored from $store again 2553fd0b676Sandi * 2563fd0b676Sandi * @author Andreas Gohr 2573fd0b676Sandi */ 2580cecf9d5Sandi function footnote_close() { 2597764a90aSandi 260*d74aace9Schris // recover footnote into the stack and restore old content 261*d74aace9Schris $footnote = $this->doc; 2627764a90aSandi $this->doc = $this->store; 2637764a90aSandi $this->store = ''; 264*d74aace9Schris 265*d74aace9Schris // check to see if this footnote has been seen before 266*d74aace9Schris $i = array_search($footnote, $this->footnotes); 267*d74aace9Schris 268*d74aace9Schris if ($i === false) { 269*d74aace9Schris // its a new footnote, add it to the $footnotes array 270*d74aace9Schris $id = count($this->footnotes)+1; 271*d74aace9Schris $this->footnotes[count($this->footnotes)] = $footnote; 272*d74aace9Schris } else { 273*d74aace9Schris // seen this one before, translate the index to an id and save a placeholder 274*d74aace9Schris $i++; 275*d74aace9Schris $id = count($this->footnotes)+1; 276*d74aace9Schris $this->footnotes[count($this->footnotes)] = "@@FNT".($i); 277*d74aace9Schris } 278*d74aace9Schris 279*d74aace9Schris // output the footnote reference and link, incl. onmouseover for insitu footnote popup 280*d74aace9Schris $this->doc .= '<a href="#fn'.$id.'" name="fnt'.$id.'" class="fn_top" onmouseover="fnt(\''.$id.'\', this, event);">'.$id.')</a>'; 2810cecf9d5Sandi } 2820cecf9d5Sandi 2830cecf9d5Sandi function listu_open() { 284a2d649c4Sandi $this->doc .= '<ul>'.DOKU_LF; 2850cecf9d5Sandi } 2860cecf9d5Sandi 2870cecf9d5Sandi function listu_close() { 288a2d649c4Sandi $this->doc .= '</ul>'.DOKU_LF; 2890cecf9d5Sandi } 2900cecf9d5Sandi 2910cecf9d5Sandi function listo_open() { 292a2d649c4Sandi $this->doc .= '<ol>'.DOKU_LF; 2930cecf9d5Sandi } 2940cecf9d5Sandi 2950cecf9d5Sandi function listo_close() { 296a2d649c4Sandi $this->doc .= '</ol>'.DOKU_LF; 2970cecf9d5Sandi } 2980cecf9d5Sandi 2990cecf9d5Sandi function listitem_open($level) { 300a2d649c4Sandi $this->doc .= '<li class="level'.$level.'">'; 3010cecf9d5Sandi } 3020cecf9d5Sandi 3030cecf9d5Sandi function listitem_close() { 304a2d649c4Sandi $this->doc .= '</li>'.DOKU_LF; 3050cecf9d5Sandi } 3060cecf9d5Sandi 3070cecf9d5Sandi function listcontent_open() { 30890db23d7Schris $this->doc .= '<div class="li">'; 3090cecf9d5Sandi } 3100cecf9d5Sandi 3110cecf9d5Sandi function listcontent_close() { 31290db23d7Schris $this->doc .= '</div>'.DOKU_LF; 3130cecf9d5Sandi } 3140cecf9d5Sandi 3150cecf9d5Sandi function unformatted($text) { 316a2d649c4Sandi $this->doc .= $this->_xmlEntities($text); 3170cecf9d5Sandi } 3180cecf9d5Sandi 3190cecf9d5Sandi /** 3203fd0b676Sandi * Execute PHP code if allowed 3213fd0b676Sandi * 3223fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 3230cecf9d5Sandi */ 3240cecf9d5Sandi function php($text) { 3254de671bcSandi global $conf; 3264de671bcSandi if($conf['phpok']){ 327bad0b545Sandi ob_start(); 3284de671bcSandi eval($text); 3293fd0b676Sandi $this->doc .= ob_get_contents(); 330bad0b545Sandi ob_end_clean(); 3314de671bcSandi }else{ 3324de671bcSandi $this->file($text); 3334de671bcSandi } 3340cecf9d5Sandi } 3350cecf9d5Sandi 3360cecf9d5Sandi /** 3373fd0b676Sandi * Insert HTML if allowed 3383fd0b676Sandi * 3393fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 3400cecf9d5Sandi */ 3410cecf9d5Sandi function html($text) { 3424de671bcSandi global $conf; 3434de671bcSandi if($conf['htmlok']){ 344a2d649c4Sandi $this->doc .= $text; 3454de671bcSandi }else{ 3460cecf9d5Sandi $this->file($text); 3470cecf9d5Sandi } 3484de671bcSandi } 3490cecf9d5Sandi 3500cecf9d5Sandi function preformatted($text) { 351a2d649c4Sandi $this->doc .= '<pre class="code">' . $this->_xmlEntities($text) . '</pre>'. DOKU_LF; 3520cecf9d5Sandi } 3530cecf9d5Sandi 3540cecf9d5Sandi function file($text) { 355a2d649c4Sandi $this->doc .= '<pre class="file">' . $this->_xmlEntities($text). '</pre>'. DOKU_LF; 3560cecf9d5Sandi } 3570cecf9d5Sandi 3580cecf9d5Sandi function quote_open() { 3595e100747Sandi $this->doc .= '<blockquote>'.DOKU_LF; 3600cecf9d5Sandi } 3610cecf9d5Sandi 3620cecf9d5Sandi function quote_close() { 3635e100747Sandi $this->doc .= '</blockquote>'.DOKU_LF; 3640cecf9d5Sandi } 3650cecf9d5Sandi 3660cecf9d5Sandi /** 3673fd0b676Sandi * Callback for code text 3683fd0b676Sandi * 3693fd0b676Sandi * Uses GeSHi to highlight language syntax 3703fd0b676Sandi * 3713fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 3720cecf9d5Sandi */ 3730cecf9d5Sandi function code($text, $language = NULL) { 3744de671bcSandi global $conf; 3750cecf9d5Sandi 3760cecf9d5Sandi if ( is_null($language) ) { 3770cecf9d5Sandi $this->preformatted($text); 3780cecf9d5Sandi } else { 379313da78aSandi //strip leading blank line 380313da78aSandi $text = preg_replace('/^\s*?\n/','',$text); 381313da78aSandi // Handle with Geshi here 3827196b541Sandi require_once(DOKU_INC . 'inc/geshi.php'); 3837196b541Sandi $geshi = new GeSHi($text, strtolower($language), DOKU_INC . 'inc/geshi'); 384313da78aSandi $geshi->set_encoding('utf-8'); 3850cecf9d5Sandi $geshi->enable_classes(); 3860cecf9d5Sandi $geshi->set_header_type(GESHI_HEADER_PRE); 387750fd6a8SChristopher Smith $geshi->set_overall_class("code $language"); 3884de671bcSandi $geshi->set_link_target($conf['target']['extern']); 3890cecf9d5Sandi 3900cecf9d5Sandi $text = $geshi->parse_code(); 391a2d649c4Sandi $this->doc .= $text; 3920cecf9d5Sandi } 3930cecf9d5Sandi } 3940cecf9d5Sandi 3950cecf9d5Sandi function acronym($acronym) { 3960cecf9d5Sandi 3970cecf9d5Sandi if ( array_key_exists($acronym, $this->acronyms) ) { 3980cecf9d5Sandi 399433bef32Sandi $title = $this->_xmlEntities($this->acronyms[$acronym]); 4000cecf9d5Sandi 401a2d649c4Sandi $this->doc .= '<acronym title="'.$title 402433bef32Sandi .'">'.$this->_xmlEntities($acronym).'</acronym>'; 4030cecf9d5Sandi 4040cecf9d5Sandi } else { 405a2d649c4Sandi $this->doc .= $this->_xmlEntities($acronym); 4060cecf9d5Sandi } 4070cecf9d5Sandi } 4080cecf9d5Sandi 4090cecf9d5Sandi function smiley($smiley) { 4100cecf9d5Sandi if ( array_key_exists($smiley, $this->smileys) ) { 411433bef32Sandi $title = $this->_xmlEntities($this->smileys[$smiley]); 412f62ea8a1Sandi $this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley]. 4130cecf9d5Sandi '" align="middle" alt="'. 414433bef32Sandi $this->_xmlEntities($smiley).'" />'; 4150cecf9d5Sandi } else { 416a2d649c4Sandi $this->doc .= $this->_xmlEntities($smiley); 4170cecf9d5Sandi } 4180cecf9d5Sandi } 4190cecf9d5Sandi 420f62ea8a1Sandi /* 4214de671bcSandi * not used 4220cecf9d5Sandi function wordblock($word) { 4230cecf9d5Sandi if ( array_key_exists($word, $this->badwords) ) { 424a2d649c4Sandi $this->doc .= '** BLEEP **'; 4250cecf9d5Sandi } else { 426a2d649c4Sandi $this->doc .= $this->_xmlEntities($word); 4270cecf9d5Sandi } 4280cecf9d5Sandi } 4294de671bcSandi */ 4300cecf9d5Sandi 4310cecf9d5Sandi function entity($entity) { 4320cecf9d5Sandi if ( array_key_exists($entity, $this->entities) ) { 433a2d649c4Sandi $this->doc .= $this->entities[$entity]; 4340cecf9d5Sandi } else { 435a2d649c4Sandi $this->doc .= $this->_xmlEntities($entity); 4360cecf9d5Sandi } 4370cecf9d5Sandi } 4380cecf9d5Sandi 4390cecf9d5Sandi function multiplyentity($x, $y) { 440a2d649c4Sandi $this->doc .= "$x×$y"; 4410cecf9d5Sandi } 4420cecf9d5Sandi 4430cecf9d5Sandi function singlequoteopening() { 444a2d649c4Sandi $this->doc .= "‘"; 4450cecf9d5Sandi } 4460cecf9d5Sandi 4470cecf9d5Sandi function singlequoteclosing() { 448a2d649c4Sandi $this->doc .= "’"; 4490cecf9d5Sandi } 4500cecf9d5Sandi 4510cecf9d5Sandi function doublequoteopening() { 452a2d649c4Sandi $this->doc .= "“"; 4530cecf9d5Sandi } 4540cecf9d5Sandi 4550cecf9d5Sandi function doublequoteclosing() { 456a2d649c4Sandi $this->doc .= "”"; 4570cecf9d5Sandi } 4580cecf9d5Sandi 4590cecf9d5Sandi /** 4600cecf9d5Sandi */ 4610cecf9d5Sandi function camelcaselink($link) { 46211d0aa47Sandi $this->internallink($link,$link); 4630cecf9d5Sandi } 4640cecf9d5Sandi 4650b7c14c2Sandi 4660b7c14c2Sandi function locallink($hash, $name = NULL){ 4670b7c14c2Sandi global $ID; 4680b7c14c2Sandi $name = $this->_getLinkTitle($name, $hash, $isImage); 4690b7c14c2Sandi $hash = $this->_headerToLink($hash); 4700b7c14c2Sandi $title = $ID.' ↵'; 4710b7c14c2Sandi $this->doc .= '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">'; 4720b7c14c2Sandi $this->doc .= $name; 4730b7c14c2Sandi $this->doc .= '</a>'; 4740b7c14c2Sandi } 4750b7c14c2Sandi 476cffcc403Sandi /** 4773fd0b676Sandi * Render an internal Wiki Link 4783fd0b676Sandi * 479cffcc403Sandi * $search and $returnonly are not for the renderer but are used 480cffcc403Sandi * elsewhere - no need to implement them in other renderers 4813fd0b676Sandi * 4823fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 483cffcc403Sandi */ 484cffcc403Sandi function internallink($id, $name = NULL, $search=NULL,$returnonly=false) { 485ba11bd29Sandi global $conf; 48637e34a5eSandi global $ID; 4870339c872Sjan // default name is based on $id as given 4880339c872Sjan $default = $this->_simpleTitle($id); 4890339c872Sjan // now first resolve and clean up the $id 49037e34a5eSandi resolve_pageid(getNS($ID),$id,$exists); 4910339c872Sjan $name = $this->_getLinkTitle($name, $default, $isImage, $id); 4920e1c636eSandi if ( !$isImage ) { 4930e1c636eSandi if ( $exists ) { 494ba11bd29Sandi $class='wikilink1'; 4950cecf9d5Sandi } else { 496ba11bd29Sandi $class='wikilink2'; 4970cecf9d5Sandi } 4980cecf9d5Sandi } else { 499ba11bd29Sandi $class='media'; 5000cecf9d5Sandi } 5010cecf9d5Sandi 502a1685bedSandi //keep hash anchor 503a1685bedSandi list($id,$hash) = split('#',$id,2); 504a1685bedSandi 505ba11bd29Sandi //prepare for formating 506ba11bd29Sandi $link['target'] = $conf['target']['wiki']; 507ba11bd29Sandi $link['style'] = ''; 508ba11bd29Sandi $link['pre'] = ''; 509ba11bd29Sandi $link['suf'] = ''; 51040eb54bbSjan // highlight link to current page 51140eb54bbSjan if ($id == $ID) { 51292795d04Sandi $link['pre'] = '<span class="curid">'; 51392795d04Sandi $link['suf'] = '</span>'; 51440eb54bbSjan } 515ba11bd29Sandi $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; 516ba11bd29Sandi $link['class'] = $class; 517ba11bd29Sandi $link['url'] = wl($id); 518ba11bd29Sandi $link['name'] = $name; 519ba11bd29Sandi $link['title'] = $id; 520723d78dbSandi //add search string 521723d78dbSandi if($search){ 522723d78dbSandi ($conf['userewrite']) ? $link['url'].='?s=' : $link['url'].='&s='; 523723d78dbSandi $link['url'] .= urlencode($search); 524723d78dbSandi } 525723d78dbSandi 526a1685bedSandi //keep hash 527a1685bedSandi if($hash) $link['url'].='#'.$hash; 528a1685bedSandi 529ba11bd29Sandi //output formatted 530cffcc403Sandi if($returnonly){ 531cffcc403Sandi return $this->_formatLink($link); 532cffcc403Sandi }else{ 533a2d649c4Sandi $this->doc .= $this->_formatLink($link); 5340cecf9d5Sandi } 535cffcc403Sandi } 5360cecf9d5Sandi 537b625487dSandi function externallink($url, $name = NULL) { 538b625487dSandi global $conf; 5390cecf9d5Sandi 540433bef32Sandi $name = $this->_getLinkTitle($name, $url, $isImage); 5416f0c5dbfSandi 5426f0c5dbfSandi // add protocol on simple short URLs 54326b8b699Sandi if(substr($url,0,3) == 'ftp' && (substr($url,0,6) != 'ftp://')) $url = 'ftp://'.$url; 5446f0c5dbfSandi if(substr($url,0,3) == 'www') $url = 'http://'.$url; 5450cecf9d5Sandi 5460cecf9d5Sandi if ( !$isImage ) { 547b625487dSandi $class='urlextern'; 5480cecf9d5Sandi } else { 549b625487dSandi $class='media'; 5500cecf9d5Sandi } 5510cecf9d5Sandi 552b625487dSandi //prepare for formating 553b625487dSandi $link['target'] = $conf['target']['extern']; 554b625487dSandi $link['style'] = ''; 555b625487dSandi $link['pre'] = ''; 556b625487dSandi $link['suf'] = ''; 557b625487dSandi $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; 558b625487dSandi $link['class'] = $class; 559b625487dSandi $link['url'] = $url; 560b625487dSandi $link['name'] = $name; 561433bef32Sandi $link['title'] = $this->_xmlEntities($url); 562b625487dSandi if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"'; 5630cecf9d5Sandi 564b625487dSandi //output formatted 565a2d649c4Sandi $this->doc .= $this->_formatLink($link); 5660cecf9d5Sandi } 5670cecf9d5Sandi 5680cecf9d5Sandi /** 5690cecf9d5Sandi */ 57097a3e4e3Sandi function interwikilink($match, $name = NULL, $wikiName, $wikiUri) { 571b625487dSandi global $conf; 5720cecf9d5Sandi 57397a3e4e3Sandi $link = array(); 57497a3e4e3Sandi $link['target'] = $conf['target']['interwiki']; 57597a3e4e3Sandi $link['pre'] = ''; 57697a3e4e3Sandi $link['suf'] = ''; 57797a3e4e3Sandi $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; 578433bef32Sandi $link['name'] = $this->_getLinkTitle($name, $wikiUri, $isImage); 5790cecf9d5Sandi 5800cecf9d5Sandi if ( !$isImage ) { 58197a3e4e3Sandi $link['class'] = 'interwiki'; 5820cecf9d5Sandi } else { 58397a3e4e3Sandi $link['class'] = 'media'; 5840cecf9d5Sandi } 5850cecf9d5Sandi 58697a3e4e3Sandi //get interwiki URL 58797a3e4e3Sandi if ( isset($this->interwiki[$wikiName]) ) { 58897a3e4e3Sandi $url = $this->interwiki[$wikiName]; 58997a3e4e3Sandi } else { 59097a3e4e3Sandi // Default to Google I'm feeling lucky 59197a3e4e3Sandi $url = 'http://www.google.com/search?q={URL}&btnI=lucky'; 59297a3e4e3Sandi $wikiName = 'go'; 5930cecf9d5Sandi } 5940cecf9d5Sandi 59597a3e4e3Sandi if(!$isImage){ 59697a3e4e3Sandi //if ico exists set additional style 597f62ea8a1Sandi if(@file_exists(DOKU_INC.'lib/images/interwiki/'.$wikiName.'.png')){ 598f62ea8a1Sandi $link['style']='background-image: url('.DOKU_BASE.'lib/images/interwiki/'.$wikiName.'.png)'; 59960fc4191Sandi }elseif(@file_exists(DOKU_INC.'lib/images/interwiki/'.$wikiName.'.gif')){ 600f62ea8a1Sandi $link['style']='background-image: url('.DOKU_BASE.'lib/images/interwiki/'.$wikiName.'.gif)'; 60197a3e4e3Sandi } 60297a3e4e3Sandi } 6030cecf9d5Sandi 60497a3e4e3Sandi //do we stay at the same server? Use local target 60597a3e4e3Sandi if( strpos($url,DOKU_URL) === 0 ){ 60697a3e4e3Sandi $link['target'] = $conf['target']['wiki']; 60797a3e4e3Sandi } 6080cecf9d5Sandi 60997a3e4e3Sandi //replace placeholder 61097a3e4e3Sandi if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#',$url)){ 61197a3e4e3Sandi //use placeholders 61297a3e4e3Sandi $url = str_replace('{URL}',urlencode($wikiUri),$url); 61397a3e4e3Sandi $url = str_replace('{NAME}',$wikiUri,$url); 61497a3e4e3Sandi $parsed = parse_url($wikiUri); 61597a3e4e3Sandi if(!$parsed['port']) $parsed['port'] = 80; 61697a3e4e3Sandi $url = str_replace('{SCHEME}',$parsed['scheme'],$url); 61797a3e4e3Sandi $url = str_replace('{HOST}',$parsed['host'],$url); 61897a3e4e3Sandi $url = str_replace('{PORT}',$parsed['port'],$url); 61997a3e4e3Sandi $url = str_replace('{PATH}',$parsed['path'],$url); 62097a3e4e3Sandi $url = str_replace('{QUERY}',$parsed['query'],$url); 62197a3e4e3Sandi $link['url'] = $url; 62297a3e4e3Sandi }else{ 62397a3e4e3Sandi //default 62497a3e4e3Sandi $link['url'] = $url.urlencode($wikiUri); 62597a3e4e3Sandi } 62697a3e4e3Sandi 62797a3e4e3Sandi $link['title'] = htmlspecialchars($link['url']); 62897a3e4e3Sandi 62997a3e4e3Sandi //output formatted 630a2d649c4Sandi $this->doc .= $this->_formatLink($link); 6310cecf9d5Sandi } 6320cecf9d5Sandi 6330cecf9d5Sandi /** 6340cecf9d5Sandi */ 6351d47afe1Sandi function windowssharelink($url, $name = NULL) { 6361d47afe1Sandi global $conf; 6371d47afe1Sandi global $lang; 6381d47afe1Sandi //simple setup 6391d47afe1Sandi $link['target'] = $conf['target']['windows']; 6401d47afe1Sandi $link['pre'] = ''; 6411d47afe1Sandi $link['suf'] = ''; 6421d47afe1Sandi $link['style'] = ''; 6431d47afe1Sandi //Display error on browsers other than IE 6441d47afe1Sandi $link['more'] = 'onclick="if(document.all == null){alert(\''. 645433bef32Sandi $this->_xmlEntities($lang['nosmblinks'],ENT_QUOTES). 6461d47afe1Sandi '\');}" onkeypress="if(document.all == null){alert(\''. 647433bef32Sandi $this->_xmlEntities($lang['nosmblinks'],ENT_QUOTES).'\');}"'; 6480cecf9d5Sandi 649433bef32Sandi $link['name'] = $this->_getLinkTitle($name, $url, $isImage); 6500cecf9d5Sandi if ( !$isImage ) { 6511d47afe1Sandi $link['class'] = 'windows'; 6520cecf9d5Sandi } else { 6531d47afe1Sandi $link['class'] = 'media'; 6540cecf9d5Sandi } 6550cecf9d5Sandi 6560cecf9d5Sandi 657433bef32Sandi $link['title'] = $this->_xmlEntities($url); 6581d47afe1Sandi $url = str_replace('\\','/',$url); 6591d47afe1Sandi $url = 'file:///'.$url; 6601d47afe1Sandi $link['url'] = $url; 6610cecf9d5Sandi 6621d47afe1Sandi //output formatted 663a2d649c4Sandi $this->doc .= $this->_formatLink($link); 6640cecf9d5Sandi } 6650cecf9d5Sandi 66671352defSandi function emaillink($address, $name = NULL) { 66771352defSandi global $conf; 66871352defSandi //simple setup 66971352defSandi $link = array(); 67071352defSandi $link['target'] = ''; 67171352defSandi $link['pre'] = ''; 67271352defSandi $link['suf'] = ''; 67371352defSandi $link['style'] = ''; 67471352defSandi $link['more'] = ''; 6750cecf9d5Sandi 67671352defSandi //we just test for image here - we need to encode the title our self 677433bef32Sandi $this->_getLinkTitle($name, $address, $isImage); 6780cecf9d5Sandi if ( !$isImage ) { 67971352defSandi $link['class']='mail'; 6800cecf9d5Sandi } else { 68171352defSandi $link['class']='media'; 6820cecf9d5Sandi } 6830cecf9d5Sandi 68471352defSandi //shields up 68571352defSandi if($conf['mailguard']=='visible'){ 68671352defSandi //the mail name gets some visible encoding 68771352defSandi $address = str_replace('@',' [at] ',$address); 68871352defSandi $address = str_replace('.',' [dot] ',$address); 68971352defSandi $address = str_replace('-',' [dash] ',$address); 6900cecf9d5Sandi 691433bef32Sandi $title = $this->_xmlEntities($address); 69271352defSandi if(empty($name)){ 693433bef32Sandi $name = $this->_xmlEntities($address); 69471352defSandi }else{ 695433bef32Sandi $name = $this->_xmlEntities($name); 69671352defSandi } 69771352defSandi }elseif($conf['mailguard']=='hex'){ 69871352defSandi //encode every char to a hex entity 69971352defSandi for ($x=0; $x < strlen($address); $x++) { 70071352defSandi $encode .= '&#x' . bin2hex($address[$x]).';'; 70171352defSandi } 70271352defSandi $address = $encode; 70371352defSandi $title = $encode; 70471352defSandi if(empty($name)){ 70571352defSandi $name = $encode; 70671352defSandi }else{ 707433bef32Sandi $name = $this->_xmlEntities($name); 70871352defSandi } 70971352defSandi }else{ 71071352defSandi //keep address as is 711433bef32Sandi $title = $this->_xmlEntities($address); 71271352defSandi if(empty($name)){ 713433bef32Sandi $name = $this->_xmlEntities($address); 71471352defSandi }else{ 715433bef32Sandi $name = $this->_xmlEntities($name); 71671352defSandi } 71771352defSandi } 7180cecf9d5Sandi 71938c08c2bSAlexandre ROSSI $link['url'] = 'mailto:'.rawurlencode($address); 72071352defSandi $link['name'] = $name; 72171352defSandi $link['title'] = $title; 7220cecf9d5Sandi 72371352defSandi //output formatted 724a2d649c4Sandi $this->doc .= $this->_formatLink($link); 7250cecf9d5Sandi } 7260cecf9d5Sandi 7270cecf9d5Sandi /** 7284826ab45Sandi * @todo don't add link for flash 7290cecf9d5Sandi */ 7304826ab45Sandi function internalmedia ($src, $title=NULL, $align=NULL, $width=NULL, 7314826ab45Sandi $height=NULL, $cache=NULL) { 7323685f775Sandi global $conf; 73337e34a5eSandi global $ID; 73437e34a5eSandi resolve_mediaid(getNS($ID),$src, $exists); 7350cecf9d5Sandi 7363685f775Sandi $link = array(); 7373685f775Sandi $link['class'] = 'media'; 7383685f775Sandi $link['style'] = ''; 7393685f775Sandi $link['pre'] = ''; 7403685f775Sandi $link['suf'] = ''; 7413685f775Sandi $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; 7423685f775Sandi $link['target'] = $conf['target']['media']; 7433685f775Sandi 744433bef32Sandi $link['title'] = $this->_xmlEntities($src); 74555efc227SAndreas Gohr list($ext,$mime) = mimetype($src); 7462684e50aSAndreas Gohr if(substr($mime,0,5) == 'image' && !preg_match('#^(https?|ftp)://#i',$src)){ 74755efc227SAndreas Gohr $link['url']= DOKU_BASE.'lib/exe/detail.php?id='.$ID.'&cache='.$cache.'&media='.urlencode($src); 74855efc227SAndreas Gohr }else{ 749f62ea8a1Sandi $link['url']= DOKU_BASE.'lib/exe/fetch.php?cache='.$cache.'&media='.urlencode($src); 75055efc227SAndreas Gohr } 751433bef32Sandi $link['name'] = $this->_media ($src, $title, $align, $width, $height, $cache); 7523685f775Sandi 7533685f775Sandi 7543685f775Sandi //output formatted 755a2d649c4Sandi $this->doc .= $this->_formatLink($link); 7560cecf9d5Sandi } 7570cecf9d5Sandi 7580cecf9d5Sandi /** 7594826ab45Sandi * @todo don't add link for flash 7600cecf9d5Sandi */ 7614826ab45Sandi function externalmedia ($src, $title=NULL, $align=NULL, $width=NULL, 7624826ab45Sandi $height=NULL, $cache=NULL) { 7633685f775Sandi global $conf; 7640cecf9d5Sandi 7653685f775Sandi $link = array(); 7663685f775Sandi $link['class'] = 'media'; 7673685f775Sandi $link['style'] = ''; 7683685f775Sandi $link['pre'] = ''; 7693685f775Sandi $link['suf'] = ''; 7703685f775Sandi $link['more'] = 'onclick="return svchk()" onkeypress="return svchk()"'; 7713685f775Sandi $link['target'] = $conf['target']['media']; 7723685f775Sandi 773433bef32Sandi $link['title'] = $this->_xmlEntities($src); 774f62ea8a1Sandi $link['url'] = DOKU_BASE.'lib/exe/fetch.php?cache='.$cache.'&media='.urlencode($src); 775433bef32Sandi $link['name'] = $this->_media ($src, $title, $align, $width, $height, $cache); 7763685f775Sandi 7773685f775Sandi 7783685f775Sandi //output formatted 779a2d649c4Sandi $this->doc .= $this->_formatLink($link); 7800cecf9d5Sandi } 7810cecf9d5Sandi 7824826ab45Sandi /** 7833fd0b676Sandi * Renders an RSS feed using Magpie 784b625487dSandi * 785b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 786b625487dSandi */ 787b625487dSandi function rss ($url){ 788b625487dSandi global $lang; 789b625487dSandi define('MAGPIE_CACHE_ON', false); //we do our own caching 790b625487dSandi define('MAGPIE_DIR', DOKU_INC.'inc/magpie/'); 791b625487dSandi define('MAGPIE_OUTPUT_ENCODING','UTF-8'); //return all feeds as UTF-8 792b625487dSandi require_once(MAGPIE_DIR.'/rss_fetch.inc'); 793b625487dSandi 794b625487dSandi //disable warning while fetching 795b625487dSandi $elvl = error_reporting(E_ERROR); 796b625487dSandi $rss = fetch_rss($url); 797b625487dSandi error_reporting($elvl); 798b625487dSandi 799a2d649c4Sandi $this->doc .= '<ul class="rss">'; 800b625487dSandi if($rss){ 801b625487dSandi foreach ($rss->items as $item ) { 802a2d649c4Sandi $this->doc .= '<li>'; 803b625487dSandi $this->externallink($item['link'],$item['title']); 804a2d649c4Sandi $this->doc .= '</li>'; 805b625487dSandi } 806b625487dSandi }else{ 807a2d649c4Sandi $this->doc .= '<li>'; 808a2d649c4Sandi $this->doc .= '<em>'.$lang['rssfailed'].'</em>'; 809b625487dSandi $this->externallink($url); 810a2d649c4Sandi $this->doc .= '</li>'; 811b625487dSandi } 812a2d649c4Sandi $this->doc .= '</ul>'; 813b625487dSandi } 814b625487dSandi 8150cecf9d5Sandi // $numrows not yet implemented 8160cecf9d5Sandi function table_open($maxcols = NULL, $numrows = NULL){ 817a2d649c4Sandi $this->doc .= '<table class="inline">'.DOKU_LF; 8180cecf9d5Sandi } 8190cecf9d5Sandi 8200cecf9d5Sandi function table_close(){ 821a2d649c4Sandi $this->doc .= '</table>'.DOKU_LF.'<br />'.DOKU_LF; 8220cecf9d5Sandi } 8230cecf9d5Sandi 8240cecf9d5Sandi function tablerow_open(){ 825a2d649c4Sandi $this->doc .= DOKU_TAB . '<tr>' . DOKU_LF . DOKU_TAB . DOKU_TAB; 8260cecf9d5Sandi } 8270cecf9d5Sandi 8280cecf9d5Sandi function tablerow_close(){ 829a2d649c4Sandi $this->doc .= DOKU_LF . DOKU_TAB . '</tr>' . DOKU_LF; 8300cecf9d5Sandi } 8310cecf9d5Sandi 8320cecf9d5Sandi function tableheader_open($colspan = 1, $align = NULL){ 833a2d649c4Sandi $this->doc .= '<th'; 8340cecf9d5Sandi if ( !is_null($align) ) { 835a2d649c4Sandi $this->doc .= ' class="'.$align.'align"'; 8360cecf9d5Sandi } 8370cecf9d5Sandi if ( $colspan > 1 ) { 838a2d649c4Sandi $this->doc .= ' colspan="'.$colspan.'"'; 8390cecf9d5Sandi } 840a2d649c4Sandi $this->doc .= '>'; 8410cecf9d5Sandi } 8420cecf9d5Sandi 8430cecf9d5Sandi function tableheader_close(){ 844a2d649c4Sandi $this->doc .= '</th>'; 8450cecf9d5Sandi } 8460cecf9d5Sandi 8470cecf9d5Sandi function tablecell_open($colspan = 1, $align = NULL){ 848a2d649c4Sandi $this->doc .= '<td'; 8490cecf9d5Sandi if ( !is_null($align) ) { 850a2d649c4Sandi $this->doc .= ' class="'.$align.'align"'; 8510cecf9d5Sandi } 8520cecf9d5Sandi if ( $colspan > 1 ) { 853a2d649c4Sandi $this->doc .= ' colspan="'.$colspan.'"'; 8540cecf9d5Sandi } 855a2d649c4Sandi $this->doc .= '>'; 8560cecf9d5Sandi } 8570cecf9d5Sandi 8580cecf9d5Sandi function tablecell_close(){ 859a2d649c4Sandi $this->doc .= '</td>'; 8600cecf9d5Sandi } 8610cecf9d5Sandi 8620cecf9d5Sandi //---------------------------------------------------------- 8630cecf9d5Sandi // Utils 8640cecf9d5Sandi 865ba11bd29Sandi /** 8663fd0b676Sandi * Build a link 8673fd0b676Sandi * 8683fd0b676Sandi * Assembles all parts defined in $link returns HTML for the link 869ba11bd29Sandi * 870ba11bd29Sandi * @author Andreas Gohr <andi@splitbrain.org> 871ba11bd29Sandi */ 872433bef32Sandi function _formatLink($link){ 873ba11bd29Sandi //make sure the url is XHTML compliant (skip mailto) 874ba11bd29Sandi if(substr($link['url'],0,7) != 'mailto:'){ 875ba11bd29Sandi $link['url'] = str_replace('&','&',$link['url']); 876ba11bd29Sandi $link['url'] = str_replace('&amp;','&',$link['url']); 877ba11bd29Sandi } 878ba11bd29Sandi //remove double encodings in titles 879ba11bd29Sandi $link['title'] = str_replace('&amp;','&',$link['title']); 880ba11bd29Sandi 881ba11bd29Sandi $ret = ''; 882ba11bd29Sandi $ret .= $link['pre']; 883ba11bd29Sandi $ret .= '<a href="'.$link['url'].'"'; 884ba11bd29Sandi if($link['class']) $ret .= ' class="'.$link['class'].'"'; 885ba11bd29Sandi if($link['target']) $ret .= ' target="'.$link['target'].'"'; 886ba11bd29Sandi if($link['title']) $ret .= ' title="'.$link['title'].'"'; 887ba11bd29Sandi if($link['style']) $ret .= ' style="'.$link['style'].'"'; 888ba11bd29Sandi if($link['more']) $ret .= ' '.$link['more']; 889ba11bd29Sandi $ret .= '>'; 890ba11bd29Sandi $ret .= $link['name']; 891ba11bd29Sandi $ret .= '</a>'; 892ba11bd29Sandi $ret .= $link['suf']; 893ba11bd29Sandi return $ret; 894ba11bd29Sandi } 895ba11bd29Sandi 896ba11bd29Sandi /** 897ba11bd29Sandi * Removes any Namespace from the given name but keeps 898ba11bd29Sandi * casing and special chars 899ba11bd29Sandi * 900ba11bd29Sandi * @author Andreas Gohr <andi@splitbrain.org> 901ba11bd29Sandi */ 902433bef32Sandi function _simpleTitle($name){ 903ba11bd29Sandi global $conf; 904bd111079Sandi 905ba11bd29Sandi if($conf['useslash']){ 906ba11bd29Sandi $nssep = '[:;/]'; 907ba11bd29Sandi }else{ 908ba11bd29Sandi $nssep = '[:;]'; 909ba11bd29Sandi } 910bd111079Sandi $name = preg_replace('!.*'.$nssep.'!','',$name); 911bd111079Sandi //if there is a hash we use the ancor name only 912bd111079Sandi $name = preg_replace('!.*#!','',$name); 913bd111079Sandi return $name; 914ba11bd29Sandi } 915ba11bd29Sandi 9163fd0b676Sandi /** 9173fd0b676Sandi * Renders internal and external media 9183fd0b676Sandi * 9193fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 9203fd0b676Sandi */ 9213fd0b676Sandi function _media ($src, $title=NULL, $align=NULL, $width=NULL, 9223fd0b676Sandi $height=NULL, $cache=NULL) { 9233fd0b676Sandi 9243fd0b676Sandi $ret = ''; 9253fd0b676Sandi 9263fd0b676Sandi list($ext,$mime) = mimetype($src); 9273fd0b676Sandi if(substr($mime,0,5) == 'image'){ 9283fd0b676Sandi //add image tag 929f62ea8a1Sandi $ret .= '<img src="'.DOKU_BASE.'lib/exe/fetch.php?w='.$width.'&h='.$height. 9303fd0b676Sandi '&cache='.$cache.'&media='.urlencode($src).'"'; 9313fd0b676Sandi 9323fd0b676Sandi $ret .= ' class="media'.$align.'"'; 9333fd0b676Sandi 9343fd0b676Sandi if (!is_null($title)) { 9353fd0b676Sandi $ret .= ' title="'.$this->_xmlEntities($title).'"'; 9363fd0b676Sandi $ret .= ' alt="'.$this->_xmlEntities($title).'"'; 93755efc227SAndreas Gohr }elseif($ext == 'jpg' || $ext == 'jpeg'){ 93855efc227SAndreas Gohr //try to use the caption from IPTC/EXIF 93955efc227SAndreas Gohr require_once(DOKU_INC.'inc/JpegMeta.php'); 94055efc227SAndreas Gohr $jpeg =& new JpegMeta(mediaFN($src)); 94155efc227SAndreas Gohr if($jpeg !== false) $cap = $jpeg->getTitle(); 94255efc227SAndreas Gohr if($cap){ 94355efc227SAndreas Gohr $ret .= ' title="'.$this->_xmlEntities($cap).'"'; 94455efc227SAndreas Gohr $ret .= ' alt="'.$this->_xmlEntities($cap).'"'; 94555efc227SAndreas Gohr } 9463fd0b676Sandi }else{ 9473fd0b676Sandi $ret .= ' alt=""'; 9483fd0b676Sandi } 9493fd0b676Sandi 9503fd0b676Sandi if ( !is_null($width) ) 9513fd0b676Sandi $ret .= ' width="'.$this->_xmlEntities($width).'"'; 9523fd0b676Sandi 9533fd0b676Sandi if ( !is_null($height) ) 9543fd0b676Sandi $ret .= ' height="'.$this->_xmlEntities($height).'"'; 9553fd0b676Sandi 9563fd0b676Sandi $ret .= ' />'; 9573fd0b676Sandi 9583fd0b676Sandi }elseif($mime == 'application/x-shockwave-flash'){ 9593fd0b676Sandi $ret .= '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'. 9603fd0b676Sandi ' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"'; 9613fd0b676Sandi if ( !is_null($width) ) $ret .= ' width="'.$this->_xmlEntities($width).'"'; 9623fd0b676Sandi if ( !is_null($height) ) $ret .= ' height="'.$this->_xmlEntities($height).'"'; 9633fd0b676Sandi $ret .= '>'.DOKU_LF; 964f62ea8a1Sandi $ret .= '<param name="movie" value="'.DOKU_BASE.'lib/exe/fetch.php?media='.urlencode($src).'" />'.DOKU_LF; 9653fd0b676Sandi $ret .= '<param name="quality" value="high" />'.DOKU_LF; 966f62ea8a1Sandi $ret .= '<embed src="'.DOKU_BASE.'lib/exe/fetch.php?media='.urlencode($src).'"'. 9673fd0b676Sandi ' quality="high"'; 9683fd0b676Sandi if ( !is_null($width) ) $ret .= ' width="'.$this->_xmlEntities($width).'"'; 9693fd0b676Sandi if ( !is_null($height) ) $ret .= ' height="'.$this->_xmlEntities($height).'"'; 9703fd0b676Sandi $ret .= ' type="application/x-shockwave-flash"'. 9713fd0b676Sandi ' pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>'.DOKU_LF; 9723fd0b676Sandi $ret .= '</object>'.DOKU_LF; 9733fd0b676Sandi 9743fd0b676Sandi }elseif(!is_null($title)){ 9753fd0b676Sandi // well at least we have a title to display 9763fd0b676Sandi $ret .= $this->_xmlEntities($title); 9773fd0b676Sandi }else{ 9783fd0b676Sandi // just show the source 9793fd0b676Sandi $ret .= $this->_xmlEntities($src); 9803fd0b676Sandi } 9813fd0b676Sandi 9823fd0b676Sandi return $ret; 9833fd0b676Sandi } 9843fd0b676Sandi 985433bef32Sandi function _xmlEntities($string) { 9860cecf9d5Sandi return htmlspecialchars($string); 9870cecf9d5Sandi } 9880cecf9d5Sandi 989433bef32Sandi function _headerToLink($title) { 990ecf0d0d0Sandi return str_replace(':','',cleanID($title)); 9910cecf9d5Sandi } 9920cecf9d5Sandi 993af587fa8Sandi /** 994af587fa8Sandi * Adds code for section editing button 9953fd0b676Sandi * 9963fd0b676Sandi * This is just aplaceholder and gets replace by the button if 9973fd0b676Sandi * section editing is allowed 9983fd0b676Sandi * 9993fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 1000af587fa8Sandi */ 1001433bef32Sandi function _secedit($f, $t){ 1002a2d649c4Sandi $this->doc .= '<!-- SECTION ['.$f.'-'.$t.'] -->'; 1003af587fa8Sandi } 1004af587fa8Sandi 10053fd0b676Sandi /** 10063fd0b676Sandi * Construct a title and handle images in titles 10073fd0b676Sandi * 10080b7c14c2Sandi * @author Harry Fuecks <hfuecks@gmail.com> 10093fd0b676Sandi */ 1010433bef32Sandi function _getLinkTitle($title, $default, & $isImage, $id=NULL) { 1011bb0a59d4Sjan global $conf; 1012bb0a59d4Sjan 10130cecf9d5Sandi $isImage = FALSE; 10140cecf9d5Sandi if ( is_null($title) ) { 1015bb0a59d4Sjan if ($conf['useheading'] && $id) { 1016bb0a59d4Sjan $heading = p_get_first_heading($id); 1017bb0a59d4Sjan if ($heading) { 1018433bef32Sandi return $this->_xmlEntities($heading); 1019bb0a59d4Sjan } 1020bb0a59d4Sjan } 1021433bef32Sandi return $this->_xmlEntities($default); 10220cecf9d5Sandi } else if ( is_string($title) ) { 1023433bef32Sandi return $this->_xmlEntities($title); 10240cecf9d5Sandi } else if ( is_array($title) ) { 10250cecf9d5Sandi $isImage = TRUE; 1026433bef32Sandi return $this->_imageTitle($title); 10270cecf9d5Sandi } 10280cecf9d5Sandi } 10290cecf9d5Sandi 10300cecf9d5Sandi /** 10313fd0b676Sandi * Returns an HTML code for images used in link titles 10323fd0b676Sandi * 10333fd0b676Sandi * @todo Resolve namespace on internal images 10343fd0b676Sandi * @author Andreas Gohr <andi@splitbrain.org> 10350cecf9d5Sandi */ 1036433bef32Sandi function _imageTitle($img) { 1037433bef32Sandi return $this->_media($img['src'], 10384826ab45Sandi $img['title'], 10394826ab45Sandi $img['align'], 10404826ab45Sandi $img['width'], 10414826ab45Sandi $img['height'], 10424826ab45Sandi $img['cache']); 10430cecf9d5Sandi } 10440cecf9d5Sandi} 10450cecf9d5Sandi 10464826ab45Sandi//Setup VIM: ex: et ts=4 enc=utf-8 : 1047