xref: /plugin/combo/renderer/renderer.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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