xref: /plugin/combo/syntax/metadata.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnico
4*04fd306cSNickeauuse ComboStrap\Html;
5007225e5Sgerardnicouse ComboStrap\PluginUtility;
6007225e5Sgerardnico
7007225e5Sgerardnico
8*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php');
9007225e5Sgerardnico
10007225e5Sgerardnico/**
11007225e5Sgerardnico * Class syntax_plugin_combo_metadata
122c067407Sgerardnico * Add the metadata box
13007225e5Sgerardnico */
14007225e5Sgerardnicoclass syntax_plugin_combo_metadata extends DokuWiki_Syntax_Plugin
15007225e5Sgerardnico{
16c3437056SNickeau    /**
17c3437056SNickeau     * A regular expression to filter the output
18c3437056SNickeau     */
19c3437056SNickeau    public const EXCLUDE_ATTRIBUTE = "exclude";
20c3437056SNickeau    /**
21c3437056SNickeau     * The default attributes
22c3437056SNickeau     */
23c3437056SNickeau    public const CONF_METADATA_DEFAULT_ATTRIBUTES = "metadataViewerDefaultAttributes";
24c3437056SNickeau    public const TITLE_ATTRIBUTE = "title";
25c3437056SNickeau    /**
26c3437056SNickeau     * The HTML tag
27c3437056SNickeau     */
28c3437056SNickeau    public const TAG = "metadata";
29c3437056SNickeau    /**
30c3437056SNickeau     * The HTML id of the box (for testing purpose)
31c3437056SNickeau     */
32c3437056SNickeau    public const META_MESSAGE_BOX_ID = "metadata-viewer";
33c3437056SNickeau
34c3437056SNickeau    /**
35c3437056SNickeau     *
36*04fd306cSNickeau     * @param syntax_plugin_combo_metadata $plugin - the calling dokuwiki plugin
37c3437056SNickeau     * @param $inlineAttributes - the inline attribute of a component if any
38c3437056SNickeau     * @return string - an HTML box of the array
39c3437056SNickeau     */
40c3437056SNickeau    public static function getHtmlMetadataBox($plugin, $inlineAttributes = array()): string
41c3437056SNickeau    {
42c3437056SNickeau
43c3437056SNickeau        // Attributes processing
44c3437056SNickeau        $defaultStringAttributes = $plugin->getConf(self::CONF_METADATA_DEFAULT_ATTRIBUTES);
45c3437056SNickeau        $defaultAttributes = PluginUtility::parseAttributes($defaultStringAttributes);
46c3437056SNickeau        $attributes = PluginUtility::mergeAttributes($inlineAttributes, $defaultAttributes);
47c3437056SNickeau
48c3437056SNickeau        // Building the box
49c3437056SNickeau        $content = '<div id="' . self::META_MESSAGE_BOX_ID . '" class="alert alert-success " role="note">';
50c3437056SNickeau        if (array_key_exists(self::TITLE_ATTRIBUTE, $attributes)) {
51c3437056SNickeau            $content .= '<h2 class="alert-heading" ">' . $attributes[self::TITLE_ATTRIBUTE] . '</h2>';
52c3437056SNickeau        }
53c3437056SNickeau        global $ID;
54c3437056SNickeau        $metadata = p_read_metadata($ID);
55c3437056SNickeau        $metas = $metadata['persistent'];
56c3437056SNickeau
57c3437056SNickeau
58c3437056SNickeau        if (array_key_exists(self::EXCLUDE_ATTRIBUTE, $attributes)) {
59c3437056SNickeau            $filter = $attributes[self::EXCLUDE_ATTRIBUTE];
60c3437056SNickeau            \ComboStrap\ArrayUtility::filterArrayByKey($metas, $filter);
61c3437056SNickeau        }
62c3437056SNickeau        if (!array_key_exists("canonical", $metas)) {
63c3437056SNickeau            $metas["canonical"] = PluginUtility::getDocumentationHyperLink("canonical", "No Canonical");
64c3437056SNickeau        }
65c3437056SNickeau
66c3437056SNickeau        $content .= \ComboStrap\ArrayUtility::formatAsHtmlList($metas);
67c3437056SNickeau
68c3437056SNickeau
69c3437056SNickeau        $referenceStyle = array(
70c3437056SNickeau            "font-size" => "95%",
71c3437056SNickeau            "clear" => "both",
72c3437056SNickeau            "bottom" => "10px",
73c3437056SNickeau            "right" => "15px",
74c3437056SNickeau            "position" => "absolute",
75c3437056SNickeau            "font-style" => "italic"
76c3437056SNickeau        );
77c3437056SNickeau
78*04fd306cSNickeau        $content .= '<div style="' . Html::array2InlineStyle($referenceStyle) . '">' . $plugin->getLang('message_come_from') . PluginUtility::getDocumentationHyperLink("metadata:viewer", "ComboStrap Metadata Viewer") . '</div>';
79c3437056SNickeau        $content .= '</div>';
80c3437056SNickeau        return $content;
81c3437056SNickeau
82c3437056SNickeau    }
83007225e5Sgerardnico
84007225e5Sgerardnico    /**
85007225e5Sgerardnico     * Syntax Type.
86007225e5Sgerardnico     *
87007225e5Sgerardnico     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
88007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::getType()
89007225e5Sgerardnico     */
90007225e5Sgerardnico    function getType()
91007225e5Sgerardnico    {
92007225e5Sgerardnico        return 'substition';
93007225e5Sgerardnico    }
94007225e5Sgerardnico
95007225e5Sgerardnico    /**
96007225e5Sgerardnico     * How Dokuwiki will add P element
97007225e5Sgerardnico     *
98007225e5Sgerardnico     * * 'normal' - The plugin can be used inside paragraphs
99007225e5Sgerardnico     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
100007225e5Sgerardnico     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
101007225e5Sgerardnico     *
102007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::getPType()
103007225e5Sgerardnico     */
104007225e5Sgerardnico    function getPType()
105007225e5Sgerardnico    {
106007225e5Sgerardnico        return 'block';
107007225e5Sgerardnico    }
108007225e5Sgerardnico
109007225e5Sgerardnico    /**
110007225e5Sgerardnico     * @return array
111007225e5Sgerardnico     * Allow which kind of plugin inside
112007225e5Sgerardnico     *
113007225e5Sgerardnico     * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
114007225e5Sgerardnico     * because we manage self the content and we call self the parser
115007225e5Sgerardnico     *
116007225e5Sgerardnico     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
117007225e5Sgerardnico     */
118007225e5Sgerardnico    function getAllowedTypes()
119007225e5Sgerardnico    {
120007225e5Sgerardnico        return array();
121007225e5Sgerardnico    }
122007225e5Sgerardnico
123007225e5Sgerardnico    function getSort()
124007225e5Sgerardnico    {
125007225e5Sgerardnico        return 201;
126007225e5Sgerardnico    }
127007225e5Sgerardnico
128007225e5Sgerardnico
129007225e5Sgerardnico    function connectTo($mode)
130007225e5Sgerardnico    {
131007225e5Sgerardnico
132007225e5Sgerardnico
133c3437056SNickeau        $pattern = PluginUtility::getEmptyTagPattern(self::TAG);
1349337a630SNickeau        $this->Lexer->addSpecialPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
135007225e5Sgerardnico
136007225e5Sgerardnico
137007225e5Sgerardnico    }
138007225e5Sgerardnico
139007225e5Sgerardnico    /**
140007225e5Sgerardnico     *
141007225e5Sgerardnico     * The handle function goal is to parse the matched syntax through the pattern function
142007225e5Sgerardnico     * and to return the result for use in the renderer
143007225e5Sgerardnico     * This result is always cached until the page is modified.
144007225e5Sgerardnico     * @param string $match
145007225e5Sgerardnico     * @param int $state
146007225e5Sgerardnico     * @param int $pos
147007225e5Sgerardnico     * @param Doku_Handler $handler
148007225e5Sgerardnico     * @return array|bool
149007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::handle()
150007225e5Sgerardnico     *
151007225e5Sgerardnico     */
152007225e5Sgerardnico    function handle($match, $state, $pos, Doku_Handler $handler)
153007225e5Sgerardnico    {
154007225e5Sgerardnico        /**
155007225e5Sgerardnico         * There is only one state call ie DOKU_LEXER_SPECIAL
156007225e5Sgerardnico         * because of the connect to
157007225e5Sgerardnico         */
158007225e5Sgerardnico
159eee76a3dSgerardnico        return PluginUtility::getTagAttributes($match);
160007225e5Sgerardnico
161007225e5Sgerardnico    }
162007225e5Sgerardnico
163007225e5Sgerardnico    /**
164007225e5Sgerardnico     * Render the output
165007225e5Sgerardnico     * @param string $format
166007225e5Sgerardnico     * @param Doku_Renderer $renderer
167007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
168007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
169007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
170007225e5Sgerardnico     *
171007225e5Sgerardnico     *
172007225e5Sgerardnico     */
173007225e5Sgerardnico    function render($format, Doku_Renderer $renderer, $data)
174007225e5Sgerardnico    {
175007225e5Sgerardnico        if ($format == 'xhtml') {
176007225e5Sgerardnico
177007225e5Sgerardnico            /** @var Doku_Renderer_xhtml $renderer */
178007225e5Sgerardnico
179c3437056SNickeau            $renderer->doc .= self::getHtmlMetadataBox($this, $data);
180007225e5Sgerardnico            return true;
181007225e5Sgerardnico
182007225e5Sgerardnico        }
183007225e5Sgerardnico
184007225e5Sgerardnico        // unsupported $mode
185007225e5Sgerardnico        return false;
186007225e5Sgerardnico    }
187007225e5Sgerardnico
188007225e5Sgerardnico
189007225e5Sgerardnico}
190007225e5Sgerardnico
191