xref: /plugin/combo/syntax/disqus.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3c3437056SNickeauuse ComboStrap\DisqusIdentifier;
4007225e5Sgerardnicouse ComboStrap\LogUtility;
5007225e5Sgerardnicouse ComboStrap\MetadataUtility;
6007225e5Sgerardnicouse ComboStrap\PluginUtility;
771f916b9Sgerardnicouse ComboStrap\Page;
8007225e5Sgerardnico
937748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
10007225e5Sgerardnico
11007225e5Sgerardnico/**
12007225e5Sgerardnico * Disqus integration
13007225e5Sgerardnico * https://combostrap.com/disqus
14007225e5Sgerardnico */
15007225e5Sgerardnicoclass syntax_plugin_combo_disqus extends DokuWiki_Syntax_Plugin
16007225e5Sgerardnico{
17007225e5Sgerardnico
18007225e5Sgerardnico    const CONF_DEFAULT_ATTRIBUTES = 'disqusDefaultAttributes';
19007225e5Sgerardnico
20007225e5Sgerardnico    const ATTRIBUTE_SHORTNAME = "shortname";
21007225e5Sgerardnico    const ATTRIBUTE_IDENTIFIER = 'id';
22007225e5Sgerardnico    const ATTRIBUTE_TITLE = 'title';
23007225e5Sgerardnico    const ATTRIBUTE_URL = 'url';
24007225e5Sgerardnico
25007225e5Sgerardnico    const TAG = 'disqus';
26007225e5Sgerardnico
27007225e5Sgerardnico    const ATTRIBUTE_CATEGORY = "category";
28007225e5Sgerardnico
29007225e5Sgerardnico    /**
30007225e5Sgerardnico     * Syntax Type.
31007225e5Sgerardnico     *
32007225e5Sgerardnico     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
33007225e5Sgerardnico     * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types
34007225e5Sgerardnico     */
35007225e5Sgerardnico    function getType()
36007225e5Sgerardnico    {
37007225e5Sgerardnico        return 'substition';
38007225e5Sgerardnico    }
39007225e5Sgerardnico
40007225e5Sgerardnico    /**
41007225e5Sgerardnico     * Syntax Type.
42007225e5Sgerardnico     *
43007225e5Sgerardnico     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
44007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::getType()
45007225e5Sgerardnico     */
46007225e5Sgerardnico    function getPType()
47007225e5Sgerardnico    {
48007225e5Sgerardnico        return 'block';
49007225e5Sgerardnico    }
50007225e5Sgerardnico
51007225e5Sgerardnico    /**
52007225e5Sgerardnico     * Plugin priority
53007225e5Sgerardnico     *
54007225e5Sgerardnico     * @see Doku_Parser_Mode::getSort()
55007225e5Sgerardnico     *
56007225e5Sgerardnico     * the mode with the lowest sort number will win out
57007225e5Sgerardnico     */
58007225e5Sgerardnico    function getSort()
59007225e5Sgerardnico    {
60007225e5Sgerardnico        return 160;
61007225e5Sgerardnico    }
62007225e5Sgerardnico
63007225e5Sgerardnico    /**
64007225e5Sgerardnico     * Create a pattern that will called this plugin
65007225e5Sgerardnico     *
66007225e5Sgerardnico     * @param string $mode
67007225e5Sgerardnico     * @see Doku_Parser_Mode::connectTo()
68007225e5Sgerardnico     */
69007225e5Sgerardnico    function connectTo($mode)
70007225e5Sgerardnico    {
71007225e5Sgerardnico        $pattern = PluginUtility::getEmptyTagPattern(self::TAG);
729337a630SNickeau        $this->Lexer->addSpecialPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
73007225e5Sgerardnico    }
74007225e5Sgerardnico
75007225e5Sgerardnico    /**
76007225e5Sgerardnico     *
77007225e5Sgerardnico     * The handle function goal is to parse the matched syntax through the pattern function
78007225e5Sgerardnico     * and to return the result for use in the renderer
79007225e5Sgerardnico     * This result is always cached until the page is modified.
80007225e5Sgerardnico     * @param string $match
81007225e5Sgerardnico     * @param int $state
82007225e5Sgerardnico     * @param int $pos
83007225e5Sgerardnico     * @param Doku_Handler $handler
84007225e5Sgerardnico     * @return array|bool
85007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::handle()
86007225e5Sgerardnico     *
87007225e5Sgerardnico     */
88007225e5Sgerardnico    function handle($match, $state, $pos, Doku_Handler $handler)
89007225e5Sgerardnico    {
90007225e5Sgerardnico
91007225e5Sgerardnico
92007225e5Sgerardnico        $attributes = PluginUtility::getTagAttributes($match);
93007225e5Sgerardnico        return array($attributes);
94007225e5Sgerardnico
95007225e5Sgerardnico
96007225e5Sgerardnico    }
97007225e5Sgerardnico
98007225e5Sgerardnico    /**
99007225e5Sgerardnico     * Render the output
100007225e5Sgerardnico     * @param string $format
101007225e5Sgerardnico     * @param Doku_Renderer $renderer
102007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
103007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
104007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
105007225e5Sgerardnico     *
106007225e5Sgerardnico     */
107*4cadd4f8SNickeau    function render($format, Doku_Renderer $renderer, $data): bool
108007225e5Sgerardnico    {
109007225e5Sgerardnico
110007225e5Sgerardnico        switch ($format) {
111007225e5Sgerardnico
112007225e5Sgerardnico            case 'xhtml':
113007225e5Sgerardnico
114007225e5Sgerardnico                list($attributes) = $data;
115007225e5Sgerardnico                /** @var Doku_Renderer_xhtml $renderer */
116007225e5Sgerardnico
117c3437056SNickeau                $page = Page::createPageFromRequestedPage();
118007225e5Sgerardnico
119007225e5Sgerardnico                /**
120007225e5Sgerardnico                 * Disqus configuration
121007225e5Sgerardnico                 * https://help.disqus.com/en/articles/1717084-javascript-configuration-variables
122007225e5Sgerardnico                 */
123007225e5Sgerardnico                $default = PluginUtility::getTagAttributes($this->getConf(self::CONF_DEFAULT_ATTRIBUTES));
124007225e5Sgerardnico                $attributes = PluginUtility::mergeAttributes($attributes, $default);
125007225e5Sgerardnico                $forumShortName = $attributes[self::ATTRIBUTE_SHORTNAME];
126007225e5Sgerardnico                if (empty($forumShortName)) {
127007225e5Sgerardnico                    LogUtility::msg("The disqus forum shortName should not be empty", LogUtility::LVL_MSG_ERROR, self::TAG);
128007225e5Sgerardnico                    return false;
129007225e5Sgerardnico                }
130007225e5Sgerardnico                $forumShortName = hsc($forumShortName);
131007225e5Sgerardnico
132c3437056SNickeau                /**
133c3437056SNickeau                 * @deprecated the page id is used
134c3437056SNickeau                 */
135c3437056SNickeau                $disqusIdentifier = $page->getMetadata(DisqusIdentifier::PROPERTY_NAME);
136007225e5Sgerardnico                if (empty($disqusIdentifier)) {
137007225e5Sgerardnico
138007225e5Sgerardnico                    $disqusIdentifier = $attributes[self::ATTRIBUTE_IDENTIFIER];
139007225e5Sgerardnico                    if (empty($disqusIdentifier)) {
140c3437056SNickeau                        $disqusIdentifier = $page->getPageId();
141c3437056SNickeau                        if ($disqusIdentifier === null) {
142c3437056SNickeau                            LogUtility::msg("The page id has not been yet set, therefore the disqus forum can not render", LogUtility::LVL_MSG_ERROR, self::TAG);
143c3437056SNickeau                            return false;
144c3437056SNickeau                        }
145007225e5Sgerardnico                    }
146007225e5Sgerardnico
147007225e5Sgerardnico                }
148007225e5Sgerardnico                $disqusConfig = "this.page.identifier = \"$disqusIdentifier\";";
149007225e5Sgerardnico
150007225e5Sgerardnico                $url = $attributes[self::ATTRIBUTE_URL];
151007225e5Sgerardnico                if (empty($url)) {
152c3437056SNickeau                    $url = $page->getCanonicalUrl();
153007225e5Sgerardnico                }
154007225e5Sgerardnico                $disqusConfig .= "this.page.url = $url;";
1555f891b7eSNickeau
156007225e5Sgerardnico
157007225e5Sgerardnico                $title = $attributes[self::ATTRIBUTE_TITLE];
158007225e5Sgerardnico                if (empty($title)) {
159007225e5Sgerardnico                    $title = action_plugin_combo_metatitle::getTitle();
160007225e5Sgerardnico                    if (!empty($title)) {
161007225e5Sgerardnico                        $disqusConfig .= "this.page.title = $title;";
162007225e5Sgerardnico                    }
163007225e5Sgerardnico                }
164007225e5Sgerardnico
165007225e5Sgerardnico                $category = $attributes[self::ATTRIBUTE_CATEGORY];
166007225e5Sgerardnico                if (empty($category)) {
167007225e5Sgerardnico                    $disqusConfig .= "this.page.category_id = $category;";
168007225e5Sgerardnico                }
169007225e5Sgerardnico
170007225e5Sgerardnico
171007225e5Sgerardnico                /**
172007225e5Sgerardnico                 * The javascript
173007225e5Sgerardnico                 */
174007225e5Sgerardnico                $renderer->doc .= <<<EOD
175007225e5Sgerardnico<script charset="utf-8" type="text/javascript">
176007225e5Sgerardnico
177007225e5Sgerardnico    // Configuration
178007225e5Sgerardnico
179007225e5Sgerardnico    // The disqus_config should be a var to give it the global scope
180007225e5Sgerardnico    // Otherwise, disqus will see no config
181007225e5Sgerardnico    // noinspection ES6ConvertVarToLetConst
182007225e5Sgerardnico    var disqus_config = function () {
183007225e5Sgerardnico        $disqusConfig
184007225e5Sgerardnico    };
185007225e5Sgerardnico
186007225e5Sgerardnico    // Embed the library
187007225e5Sgerardnico    (function() {
188007225e5Sgerardnico        const d = document, s = d.createElement('script');
189007225e5Sgerardnico        s.src = 'https://$forumShortName.disqus.com/embed.js';
190007225e5Sgerardnico        s.setAttribute('data-timestamp', (+new Date()).toString());
191007225e5Sgerardnico        (d.head || d.body).appendChild(s);
192007225e5Sgerardnico    })();
193007225e5Sgerardnico
194007225e5Sgerardnico</script>
195007225e5Sgerardnico<noscript><a href="https://disqus.com/home/discussion/$forumShortName/$disqusIdentifier/">View the discussion thread.</a></noscript>
196007225e5SgerardnicoEOD;
197007225e5Sgerardnico                // The tag
198007225e5Sgerardnico                $renderer->doc .= '<div id="disqus_thread"></div>';
199007225e5Sgerardnico
200007225e5Sgerardnico                return true;
201007225e5Sgerardnico                break;
202007225e5Sgerardnico            case 'metadata':
203007225e5Sgerardnico
204007225e5Sgerardnico        }
205007225e5Sgerardnico        return false;
206007225e5Sgerardnico
207007225e5Sgerardnico    }
208007225e5Sgerardnico
209007225e5Sgerardnico
210007225e5Sgerardnico}
211007225e5Sgerardnico
212