1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3*04fd306cSNickeauuse ComboStrap\Tag\AdTag; 4007225e5Sgerardnicouse ComboStrap\FsWikiUtility; 5*04fd306cSNickeauuse ComboStrap\HeadingTag; 6*04fd306cSNickeauuse ComboStrap\Xml\XhtmlUtility; 7531e725cSNickeauuse ComboStrap\PluginUtility; 8*04fd306cSNickeauuse ComboStrap\Tag\TableTag; 9*04fd306cSNickeauuse ComboStrap\Toc; 10007225e5Sgerardnico 11007225e5Sgerardnico 124cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 134cadd4f8SNickeau 14007225e5Sgerardnico 15007225e5Sgerardnico/** 16007225e5Sgerardnico * Class renderer_plugin_combo_renderer 17007225e5Sgerardnico * The last two parts ie `combo_renderer` is the id for dokuwiki 18007225e5Sgerardnico * The last part should also be equal to the name 19007225e5Sgerardnico */ 20007225e5Sgerardnicoclass renderer_plugin_combo_renderer extends Doku_Renderer_xhtml 21007225e5Sgerardnico{ 22007225e5Sgerardnico const COMBO_RENDERER_NAME = 'combo_renderer'; 23007225e5Sgerardnico 24007225e5Sgerardnico /** 25007225e5Sgerardnico * @var array that hold the position of the parent 26007225e5Sgerardnico */ 27007225e5Sgerardnico protected $nodeParentPosition = []; 28007225e5Sgerardnico 29007225e5Sgerardnico /** 30007225e5Sgerardnico * @var array that hold the current position of an header for a level 31007225e5Sgerardnico * $headerNum[level]=position 32007225e5Sgerardnico */ 33007225e5Sgerardnico protected $header = []; 34007225e5Sgerardnico 35007225e5Sgerardnico /** 36007225e5Sgerardnico * @var array that will contains the whole doc but by section 37007225e5Sgerardnico */ 38007225e5Sgerardnico protected $sections = []; 39007225e5Sgerardnico 40007225e5Sgerardnico /** 41007225e5Sgerardnico * @var int the section number 42007225e5Sgerardnico */ 43007225e5Sgerardnico protected $sectionNumber = 0; 44007225e5Sgerardnico 45007225e5Sgerardnico /** 46007225e5Sgerardnico * @var string variable that permits to carry the header text of a previous section 47007225e5Sgerardnico */ 48007225e5Sgerardnico protected $previousSectionTextHeader = ''; 49007225e5Sgerardnico 50007225e5Sgerardnico 51007225e5Sgerardnico /** 52007225e5Sgerardnico * @var int variable that permits to carry the position of a previous section 53007225e5Sgerardnico */ 54007225e5Sgerardnico protected $previousNodePosition = 0; 55007225e5Sgerardnico 56007225e5Sgerardnico /** 57007225e5Sgerardnico * @var int variable that permits to carry the position of a previous section 58007225e5Sgerardnico */ 59007225e5Sgerardnico protected $previousNodeLevel = 0; 60007225e5Sgerardnico 61007225e5Sgerardnico /** 62007225e5Sgerardnico * @var int variable that permits to carry the number of words 63007225e5Sgerardnico */ 64007225e5Sgerardnico protected $lineCounter = 0; 65007225e5Sgerardnico 66007225e5Sgerardnico 67007225e5Sgerardnico function getFormat() 68007225e5Sgerardnico { 69007225e5Sgerardnico return 'xhtml'; 70007225e5Sgerardnico } 71007225e5Sgerardnico 72007225e5Sgerardnico /* 73007225e5Sgerardnico * Function that enable to list the plugin in the options for config:renderer_xhtml 74007225e5Sgerardnico * http://www.dokuwiki.org/config:renderer_xhtml 75007225e5Sgerardnico * setting in its Configuration Manager. 76007225e5Sgerardnico */ 77007225e5Sgerardnico public function canRender($format) 78007225e5Sgerardnico { 79007225e5Sgerardnico return ($format == 'xhtml'); 80007225e5Sgerardnico } 81007225e5Sgerardnico 82007225e5Sgerardnico 83007225e5Sgerardnico /** 84007225e5Sgerardnico * Render a heading 85007225e5Sgerardnico * 86007225e5Sgerardnico * The rendering of the heading is done through the parent 87007225e5Sgerardnico * The function just: 88007225e5Sgerardnico * - save the rendering between each header in the class variable $this->sections 89007225e5Sgerardnico * This variblae is used in the function document_end to recreate the whole doc. 90007225e5Sgerardnico * - add the numbering to the header text 91007225e5Sgerardnico * 92007225e5Sgerardnico * @param string $text the text to display 93007225e5Sgerardnico * @param int $level header level 94007225e5Sgerardnico * @param int $pos byte position in the original source 95007225e5Sgerardnico */ 96e1662ea5Sgerardnico function header($text, $level, $pos, $returnonly = false) 97007225e5Sgerardnico { 98007225e5Sgerardnico 99007225e5Sgerardnico 100007225e5Sgerardnico // We are going from 2 to 3 101007225e5Sgerardnico // The parent is 2 102007225e5Sgerardnico if ($level > $this->previousNodeLevel) { 103007225e5Sgerardnico $nodePosition = 1; 104007225e5Sgerardnico // Keep the position of the parent 105007225e5Sgerardnico $this->nodeParentPosition[$this->previousNodeLevel] = $this->previousNodePosition; 106007225e5Sgerardnico } elseif 107007225e5Sgerardnico // We are going from 3 to 2 108007225e5Sgerardnico // The parent is 1 109007225e5Sgerardnico ($level < $this->previousNodeLevel 110007225e5Sgerardnico ) { 111007225e5Sgerardnico $nodePosition = $this->nodeParentPosition[$level] + 1; 112007225e5Sgerardnico } else { 113007225e5Sgerardnico $nodePosition = $this->previousNodePosition + 1; 114007225e5Sgerardnico } 115007225e5Sgerardnico 116007225e5Sgerardnico // Grab the doc from the previous section 117007225e5Sgerardnico $this->sections[$this->sectionNumber] = array( 118007225e5Sgerardnico 'level' => $this->previousNodeLevel, 119007225e5Sgerardnico 'position' => $this->previousNodePosition, 120007225e5Sgerardnico 'content' => $this->doc, 121007225e5Sgerardnico 'text' => $this->previousSectionTextHeader); 122007225e5Sgerardnico 123007225e5Sgerardnico // And reset it 124007225e5Sgerardnico $this->doc = ''; 125007225e5Sgerardnico // Set the looping variable 126007225e5Sgerardnico $this->sectionNumber = $this->sectionNumber + 1; 127007225e5Sgerardnico $this->previousNodeLevel = $level; 128007225e5Sgerardnico $this->previousNodePosition = $nodePosition; 129007225e5Sgerardnico $this->previousSectionTextHeader = $text; 130007225e5Sgerardnico 131531e725cSNickeau 13221913ab3SNickeau /** 133531e725cSNickeau * Rendering is done by the parent 134531e725cSNickeau * And should be the last one 135531e725cSNickeau * Because we delete the heading 136*04fd306cSNickeau * with {@link HeadingTag::reduceToFirstOpeningTagAndReturnAttributes()} 137531e725cSNickeau * in order to be able to add the toc and section 138531e725cSNickeau * 13921913ab3SNickeau */ 140531e725cSNickeau parent::header($text, $level, $pos); 141007225e5Sgerardnico 142007225e5Sgerardnico 143007225e5Sgerardnico } 144007225e5Sgerardnico 145007225e5Sgerardnico 146007225e5Sgerardnico function document_end() 147007225e5Sgerardnico { 148007225e5Sgerardnico 149007225e5Sgerardnico global $ID; 150007225e5Sgerardnico // The id of the page (not of the sidebar) 151007225e5Sgerardnico $id = $ID; 152007225e5Sgerardnico $isSidebar = FsWikiUtility::isSideBar(); 153007225e5Sgerardnico 154007225e5Sgerardnico 155007225e5Sgerardnico // Pump the last doc 156007225e5Sgerardnico $this->sections[$this->sectionNumber] = array('level' => $this->previousNodeLevel, 'position' => $this->previousNodePosition, 'content' => $this->doc, 'text' => $this->previousSectionTextHeader); 157007225e5Sgerardnico 158007225e5Sgerardnico // Recreate the doc 159007225e5Sgerardnico $this->doc = ''; 160007225e5Sgerardnico $rollingLineCount = 0; 161007225e5Sgerardnico $currentLineCountSinceLastAd = 0; 162007225e5Sgerardnico foreach ($this->sections as $sectionNumber => $section) { 163007225e5Sgerardnico 164007225e5Sgerardnico $sectionContent = $section['content']; 165007225e5Sgerardnico 166007225e5Sgerardnico # Split by element line 167007225e5Sgerardnico # element p, h, br, tr, li, pre (one line for pre) 168a6bf47aaSNickeau $sectionLineCount = XhtmlUtility::countLines($sectionContent); 169007225e5Sgerardnico $currentLineCountSinceLastAd += $sectionLineCount; 170007225e5Sgerardnico $rollingLineCount += $sectionLineCount; 171007225e5Sgerardnico 172007225e5Sgerardnico // The content 173*04fd306cSNickeau if ($this->getConf('ShowCount') == 1) { 174007225e5Sgerardnico $this->doc .= "<p>Section " . $sectionNumber . ": (" . $sectionLineCount . "|" . $currentLineCountSinceLastAd . "|" . $rollingLineCount . ")</p>"; 175007225e5Sgerardnico } 176007225e5Sgerardnico $this->doc .= $sectionContent; 177007225e5Sgerardnico 178007225e5Sgerardnico 179007225e5Sgerardnico } 180007225e5Sgerardnico 181007225e5Sgerardnico parent::document_end(); 182007225e5Sgerardnico 183007225e5Sgerardnico } 184007225e5Sgerardnico 185007225e5Sgerardnico 186007225e5Sgerardnico} 187