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