1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3007225e5Sgerardnicouse ComboStrap\AdsUtility; 4007225e5Sgerardnicouse ComboStrap\FsWikiUtility; 5a6bf47aaSNickeauuse ComboStrap\XhtmlUtility; 6531e725cSNickeauuse ComboStrap\PluginUtility; 7007225e5Sgerardnicouse ComboStrap\TableUtility; 8007225e5Sgerardnicouse ComboStrap\TocUtility; 9007225e5Sgerardnico 10007225e5Sgerardnico 11*4cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 12*4cadd4f8SNickeau 13007225e5Sgerardnico 14007225e5Sgerardnico/** 15007225e5Sgerardnico * Class renderer_plugin_combo_renderer 16007225e5Sgerardnico * The last two parts ie `combo_renderer` is the id for dokuwiki 17007225e5Sgerardnico * The last part should also be equal to the name 18007225e5Sgerardnico */ 19007225e5Sgerardnicoclass renderer_plugin_combo_renderer extends Doku_Renderer_xhtml 20007225e5Sgerardnico{ 21007225e5Sgerardnico const COMBO_RENDERER_NAME = 'combo_renderer'; 22007225e5Sgerardnico 23007225e5Sgerardnico /** 24007225e5Sgerardnico * @var array that hold the position of the parent 25007225e5Sgerardnico */ 26007225e5Sgerardnico protected $nodeParentPosition = []; 27007225e5Sgerardnico 28007225e5Sgerardnico /** 29007225e5Sgerardnico * @var array that hold the current position of an header for a level 30007225e5Sgerardnico * $headerNum[level]=position 31007225e5Sgerardnico */ 32007225e5Sgerardnico protected $header = []; 33007225e5Sgerardnico 34007225e5Sgerardnico /** 35007225e5Sgerardnico * @var array that will contains the whole doc but by section 36007225e5Sgerardnico */ 37007225e5Sgerardnico protected $sections = []; 38007225e5Sgerardnico 39007225e5Sgerardnico /** 40007225e5Sgerardnico * @var int the section number 41007225e5Sgerardnico */ 42007225e5Sgerardnico protected $sectionNumber = 0; 43007225e5Sgerardnico 44007225e5Sgerardnico /** 45007225e5Sgerardnico * @var string variable that permits to carry the header text of a previous section 46007225e5Sgerardnico */ 47007225e5Sgerardnico protected $previousSectionTextHeader = ''; 48007225e5Sgerardnico 49007225e5Sgerardnico 50007225e5Sgerardnico /** 51007225e5Sgerardnico * @var int variable that permits to carry the position of a previous section 52007225e5Sgerardnico */ 53007225e5Sgerardnico protected $previousNodePosition = 0; 54007225e5Sgerardnico 55007225e5Sgerardnico /** 56007225e5Sgerardnico * @var int variable that permits to carry the position of a previous section 57007225e5Sgerardnico */ 58007225e5Sgerardnico protected $previousNodeLevel = 0; 59007225e5Sgerardnico 60007225e5Sgerardnico /** 61007225e5Sgerardnico * @var int variable that permits to carry the number of words 62007225e5Sgerardnico */ 63007225e5Sgerardnico protected $lineCounter = 0; 64007225e5Sgerardnico 65007225e5Sgerardnico 66007225e5Sgerardnico function getFormat() 67007225e5Sgerardnico { 68007225e5Sgerardnico return 'xhtml'; 69007225e5Sgerardnico } 70007225e5Sgerardnico 71007225e5Sgerardnico /* 72007225e5Sgerardnico * Function that enable to list the plugin in the options for config:renderer_xhtml 73007225e5Sgerardnico * http://www.dokuwiki.org/config:renderer_xhtml 74007225e5Sgerardnico * setting in its Configuration Manager. 75007225e5Sgerardnico */ 76007225e5Sgerardnico public function canRender($format) 77007225e5Sgerardnico { 78007225e5Sgerardnico return ($format == 'xhtml'); 79007225e5Sgerardnico } 80007225e5Sgerardnico 81007225e5Sgerardnico 82007225e5Sgerardnico /** 83007225e5Sgerardnico * Render a heading 84007225e5Sgerardnico * 85007225e5Sgerardnico * The rendering of the heading is done through the parent 86007225e5Sgerardnico * The function just: 87007225e5Sgerardnico * - save the rendering between each header in the class variable $this->sections 88007225e5Sgerardnico * This variblae is used in the function document_end to recreate the whole doc. 89007225e5Sgerardnico * - add the numbering to the header text 90007225e5Sgerardnico * 91007225e5Sgerardnico * @param string $text the text to display 92007225e5Sgerardnico * @param int $level header level 93007225e5Sgerardnico * @param int $pos byte position in the original source 94007225e5Sgerardnico */ 95007225e5Sgerardnico function header($text, $level, $pos) 96007225e5Sgerardnico { 97007225e5Sgerardnico 98e06795b8Sgerardnico /** 99531e725cSNickeau * Save the H1 even if the heading dokuwiki is not enable 100e06795b8Sgerardnico */ 101531e725cSNickeau if (!PluginUtility::getConfValue(syntax_plugin_combo_headingwiki::CONF_WIKI_HEADING_ENABLE)) { 1021c5862d3Sgerardnico /** 1031c5862d3Sgerardnico * $ACT == 'show' 104531e725cSNickeau * Otherwise we may capture the title of the admin page ... 1051c5862d3Sgerardnico */ 1061c5862d3Sgerardnico global $ACT; 1071c5862d3Sgerardnico if ($ACT == 'show') { 108531e725cSNickeau syntax_plugin_combo_heading::processHeadingMetadataH1($level, $text); 109e06795b8Sgerardnico } 1101c5862d3Sgerardnico } 111007225e5Sgerardnico 112007225e5Sgerardnico // We are going from 2 to 3 113007225e5Sgerardnico // The parent is 2 114007225e5Sgerardnico if ($level > $this->previousNodeLevel) { 115007225e5Sgerardnico $nodePosition = 1; 116007225e5Sgerardnico // Keep the position of the parent 117007225e5Sgerardnico $this->nodeParentPosition[$this->previousNodeLevel] = $this->previousNodePosition; 118007225e5Sgerardnico } elseif 119007225e5Sgerardnico // We are going from 3 to 2 120007225e5Sgerardnico // The parent is 1 121007225e5Sgerardnico ($level < $this->previousNodeLevel 122007225e5Sgerardnico ) { 123007225e5Sgerardnico $nodePosition = $this->nodeParentPosition[$level] + 1; 124007225e5Sgerardnico } else { 125007225e5Sgerardnico $nodePosition = $this->previousNodePosition + 1; 126007225e5Sgerardnico } 127007225e5Sgerardnico 128007225e5Sgerardnico // Grab the doc from the previous section 129007225e5Sgerardnico $this->sections[$this->sectionNumber] = array( 130007225e5Sgerardnico 'level' => $this->previousNodeLevel, 131007225e5Sgerardnico 'position' => $this->previousNodePosition, 132007225e5Sgerardnico 'content' => $this->doc, 133007225e5Sgerardnico 'text' => $this->previousSectionTextHeader); 134007225e5Sgerardnico 135007225e5Sgerardnico // And reset it 136007225e5Sgerardnico $this->doc = ''; 137007225e5Sgerardnico // Set the looping variable 138007225e5Sgerardnico $this->sectionNumber = $this->sectionNumber + 1; 139007225e5Sgerardnico $this->previousNodeLevel = $level; 140007225e5Sgerardnico $this->previousNodePosition = $nodePosition; 141007225e5Sgerardnico $this->previousSectionTextHeader = $text; 142007225e5Sgerardnico 143531e725cSNickeau 14421913ab3SNickeau /** 145531e725cSNickeau * Rendering is done by the parent 146531e725cSNickeau * And should be the last one 147531e725cSNickeau * Because we delete the heading 148531e725cSNickeau * with {@link syntax_plugin_combo_heading::reduceToFirstOpeningTagAndReturnAttributes()} 149531e725cSNickeau * in order to be able to add the toc and section 150531e725cSNickeau * 15121913ab3SNickeau */ 152531e725cSNickeau parent::header($text, $level, $pos); 153007225e5Sgerardnico 154007225e5Sgerardnico 155007225e5Sgerardnico } 156007225e5Sgerardnico 157007225e5Sgerardnico 158007225e5Sgerardnico function document_end() 159007225e5Sgerardnico { 160007225e5Sgerardnico 161007225e5Sgerardnico global $ID; 162007225e5Sgerardnico // The id of the page (not of the sidebar) 163007225e5Sgerardnico $id = $ID; 164007225e5Sgerardnico $isSidebar = FsWikiUtility::isSideBar(); 165007225e5Sgerardnico 166007225e5Sgerardnico 167007225e5Sgerardnico // Pump the last doc 168007225e5Sgerardnico $this->sections[$this->sectionNumber] = array('level' => $this->previousNodeLevel, 'position' => $this->previousNodePosition, 'content' => $this->doc, 'text' => $this->previousSectionTextHeader); 169007225e5Sgerardnico 170007225e5Sgerardnico // Recreate the doc 171007225e5Sgerardnico $this->doc = ''; 172007225e5Sgerardnico $rollingLineCount = 0; 173007225e5Sgerardnico $currentLineCountSinceLastAd = 0; 174007225e5Sgerardnico $adsCounter = 0; 175007225e5Sgerardnico foreach ($this->sections as $sectionNumber => $section) { 176007225e5Sgerardnico 177007225e5Sgerardnico $sectionContent = $section['content']; 178007225e5Sgerardnico 179007225e5Sgerardnico 180007225e5Sgerardnico if ($section['level'] == 1 and $section['position'] == 1) { 181007225e5Sgerardnico 182531e725cSNickeau // Add the hierarchical breadcrumb detail after the first header 183*4cadd4f8SNickeau global $conf; 184*4cadd4f8SNickeau 185*4cadd4f8SNickeau // Deprecated 186*4cadd4f8SNickeau // As the main slot is read before the main header and footer 187*4cadd4f8SNickeau // there is no way to known at the end if it was used 188*4cadd4f8SNickeau // 189*4cadd4f8SNickeau // 190*4cadd4f8SNickeau // if ($conf['youarehere']) { 191*4cadd4f8SNickeau // $sectionContent .= syntax_plugin_combo_breadcrumb::toBreadCrumbHtml(); 192*4cadd4f8SNickeau // } 193531e725cSNickeau 194007225e5Sgerardnico if (TocUtility::showToc($this)) { 195007225e5Sgerardnico $sectionContent .= TocUtility::renderToc($this); 196007225e5Sgerardnico } 197007225e5Sgerardnico 198007225e5Sgerardnico } 199007225e5Sgerardnico 200007225e5Sgerardnico # Split by element line 201007225e5Sgerardnico # element p, h, br, tr, li, pre (one line for pre) 202a6bf47aaSNickeau $sectionLineCount = XhtmlUtility::countLines($sectionContent); 203007225e5Sgerardnico $currentLineCountSinceLastAd += $sectionLineCount; 204007225e5Sgerardnico $rollingLineCount += $sectionLineCount; 205007225e5Sgerardnico 206007225e5Sgerardnico // The content 207007225e5Sgerardnico if ($this->getConf('ShowCount') == 1 && $isSidebar == FALSE) { 208007225e5Sgerardnico $this->doc .= "<p>Section " . $sectionNumber . ": (" . $sectionLineCount . "|" . $currentLineCountSinceLastAd . "|" . $rollingLineCount . ")</p>"; 209007225e5Sgerardnico } 210007225e5Sgerardnico $this->doc .= $sectionContent; 211007225e5Sgerardnico 212007225e5Sgerardnico // No ads on private page 213007225e5Sgerardnico 214007225e5Sgerardnico 215007225e5Sgerardnico $isLastSection = $sectionNumber === count($this->sections) - 1; 216007225e5Sgerardnico if (AdsUtility::showAds( 217007225e5Sgerardnico $sectionLineCount, 218007225e5Sgerardnico $currentLineCountSinceLastAd, 219007225e5Sgerardnico $sectionNumber, 220007225e5Sgerardnico $adsCounter, 221007225e5Sgerardnico $isLastSection 222007225e5Sgerardnico )) { 223007225e5Sgerardnico 224007225e5Sgerardnico 225007225e5Sgerardnico // Counter 226007225e5Sgerardnico $adsCounter += 1; 227007225e5Sgerardnico $currentLineCountSinceLastAd = 0; 228007225e5Sgerardnico 229007225e5Sgerardnico $attributes = array("name" => AdsUtility::PREFIX_IN_ARTICLE_ADS . $adsCounter); 230007225e5Sgerardnico $this->doc .= AdsUtility::render($attributes); 231007225e5Sgerardnico 232007225e5Sgerardnico 233007225e5Sgerardnico } 234007225e5Sgerardnico 235007225e5Sgerardnico 236007225e5Sgerardnico } 237007225e5Sgerardnico 238007225e5Sgerardnico parent::document_end(); 239007225e5Sgerardnico 240007225e5Sgerardnico } 241007225e5Sgerardnico 242007225e5Sgerardnico /** 243007225e5Sgerardnico * Start a table 244007225e5Sgerardnico * 245007225e5Sgerardnico * @param int $maxcols maximum number of columns 246007225e5Sgerardnico * @param int $numrows NOT IMPLEMENTED 247007225e5Sgerardnico * @param int $pos byte position in the original source 248007225e5Sgerardnico * @param string|string[] classes - have to be valid, do not pass unfiltered user input 249007225e5Sgerardnico */ 250007225e5Sgerardnico function table_open($maxcols = null, $numrows = null, $pos = null, $classes = NULL) 251007225e5Sgerardnico { 252007225e5Sgerardnico // initialize the row counter used for classes 253007225e5Sgerardnico $this->_counter['row_counter'] = 0; 254007225e5Sgerardnico TableUtility::tableOpen($this, $pos); 255007225e5Sgerardnico } 256007225e5Sgerardnico 257007225e5Sgerardnico 258007225e5Sgerardnico} 259