xref: /plugin/combo/renderer/renderer.php (revision e1662ea5bd74af8ed6d884265651a5c8621cb1cb)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnicouse ComboStrap\AdsUtility;
4007225e5Sgerardnicouse ComboStrap\FsWikiUtility;
5a6bf47aaSNickeauuse ComboStrap\XhtmlUtility;
6531e725cSNickeauuse ComboStrap\PluginUtility;
7007225e5Sgerardnicouse ComboStrap\TableUtility;
8007225e5Sgerardnicouse ComboStrap\TocUtility;
9007225e5Sgerardnico
10007225e5Sgerardnico
114cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
124cadd4f8SNickeau
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     */
95*e1662ea5Sgerardnico    function header($text, $level, $pos, $returnonly = false)
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
1834cadd4f8SNickeau                global $conf;
1844cadd4f8SNickeau
1854cadd4f8SNickeau                // Deprecated
1864cadd4f8SNickeau                // As the main slot is read before the main header and footer
1874cadd4f8SNickeau                // there is no way to known at the end if it was used
1884cadd4f8SNickeau                //
1894cadd4f8SNickeau                //
1904cadd4f8SNickeau                // if ($conf['youarehere']) {
1914cadd4f8SNickeau                //    $sectionContent .= syntax_plugin_combo_breadcrumb::toBreadCrumbHtml();
1924cadd4f8SNickeau                // }
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