xref: /plugin/combo/syntax/related.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico/**
3007225e5Sgerardnico * DokuWiki Syntax Plugin Related.
4007225e5Sgerardnico *
5007225e5Sgerardnico */
6007225e5Sgerardnico
7*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
84cadd4f8SNickeauuse ComboStrap\LogUtility;
9*04fd306cSNickeauuse ComboStrap\LinkMarkup;
10*04fd306cSNickeauuse ComboStrap\MarkupPath;
11007225e5Sgerardnicouse ComboStrap\PluginUtility;
12*04fd306cSNickeauuse ComboStrap\Site;
13*04fd306cSNickeauuse ComboStrap\SiteConfig;
14*04fd306cSNickeauuse ComboStrap\Tag\RelatedTag;
151fa8c418SNickeauuse ComboStrap\TagAttributes;
16007225e5Sgerardnico
17007225e5Sgerardnico
18007225e5Sgerardnicorequire_once(DOKU_INC . 'inc/parserutils.php');
19007225e5Sgerardnico
20007225e5Sgerardnico/**
21007225e5Sgerardnico * All DokuWiki plugins to extend the parser/rendering mechanism
22007225e5Sgerardnico * need to inherit from this class
23007225e5Sgerardnico *
24007225e5Sgerardnico * The name of the class must follow a pattern (don't change it)
25007225e5Sgerardnico *
26007225e5Sgerardnico * The index and the metadata key for backlinks is  called 'relation_references'
27007225e5Sgerardnico * It's the key value that you need to pass in the {@link lookupKey} of the {@link \dokuwiki\Search\Indexer}
28007225e5Sgerardnico *
29007225e5Sgerardnico * Type of conf[index]/index:
30007225e5Sgerardnico *   * page.idx (id of the page is the element number)
31007225e5Sgerardnico *   * title
32007225e5Sgerardnico *   * relation_references_w.idx - _w for words
33007225e5Sgerardnico *   * relation_references_w.idx - _i for lines (index by lines)
34007225e5Sgerardnico *
35007225e5Sgerardnico * The index is a associative map by key
36007225e5Sgerardnico *
37007225e5Sgerardnico *
38007225e5Sgerardnico */
39007225e5Sgerardnicoclass syntax_plugin_combo_related extends DokuWiki_Syntax_Plugin
40007225e5Sgerardnico{
41007225e5Sgerardnico
42007225e5Sgerardnico
43c3437056SNickeau    /**
44007225e5Sgerardnico     * Syntax Type.
45007225e5Sgerardnico     *
46007225e5Sgerardnico     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
47007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::getType()
48007225e5Sgerardnico     */
49007225e5Sgerardnico    function getType()
50007225e5Sgerardnico    {
51007225e5Sgerardnico        return 'substition';
52007225e5Sgerardnico    }
53007225e5Sgerardnico
54007225e5Sgerardnico    /**
55007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::getPType()
56007225e5Sgerardnico     */
57007225e5Sgerardnico    function getPType()
58007225e5Sgerardnico    {
59007225e5Sgerardnico        return 'block';
60007225e5Sgerardnico    }
61007225e5Sgerardnico
62007225e5Sgerardnico    /**
63007225e5Sgerardnico     * @see Doku_Parser_Mode::getSort()
64007225e5Sgerardnico     */
65007225e5Sgerardnico    function getSort()
66007225e5Sgerardnico    {
67007225e5Sgerardnico        return 100;
68007225e5Sgerardnico    }
69007225e5Sgerardnico
70007225e5Sgerardnico    /**
71007225e5Sgerardnico     * Create a pattern that will called this plugin
72007225e5Sgerardnico     *
73007225e5Sgerardnico     * @param string $mode
74007225e5Sgerardnico     * @see Doku_Parser_Mode::connectTo()
75007225e5Sgerardnico     */
76007225e5Sgerardnico    function connectTo($mode)
77007225e5Sgerardnico    {
78*04fd306cSNickeau
79007225e5Sgerardnico
80007225e5Sgerardnico        // To replace backlinks, you may add it in the configuration
81*04fd306cSNickeau        $extraPattern = $this->getConf(RelatedTag::EXTRA_PATTERN_CONF);
82007225e5Sgerardnico        if ($extraPattern != "") {
83007225e5Sgerardnico            $this->Lexer->addSpecialPattern($extraPattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
84007225e5Sgerardnico        }
85007225e5Sgerardnico
86007225e5Sgerardnico    }
87007225e5Sgerardnico
88007225e5Sgerardnico    /**
89007225e5Sgerardnico     *
90007225e5Sgerardnico     * The handle function goal is to parse the matched syntax through the pattern function
91007225e5Sgerardnico     * and to return the result for use in the renderer
92007225e5Sgerardnico     * This result is always cached until the page is modified.
93007225e5Sgerardnico     * @param string $match
94007225e5Sgerardnico     * @param int $state
95007225e5Sgerardnico     * @param int $pos
96007225e5Sgerardnico     * @param Doku_Handler $handler
97007225e5Sgerardnico     * @return array|bool
98007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::handle()
99007225e5Sgerardnico     *
100007225e5Sgerardnico     */
101007225e5Sgerardnico    function handle($match, $state, $pos, Doku_Handler $handler)
102007225e5Sgerardnico    {
103007225e5Sgerardnico
104007225e5Sgerardnico        // As there is only one call to connect to in order to a add a pattern,
105007225e5Sgerardnico        // there is only one state entering the function
106007225e5Sgerardnico        // but I leave it for better understanding of the process flow
107*04fd306cSNickeau        if ($state == DOKU_LEXER_SPECIAL) {
108c3437056SNickeau            $qualifiedMach = trim($match);
109c3437056SNickeau            $attributes = [];
110c3437056SNickeau            if ($qualifiedMach[0] === "<") {
111c3437056SNickeau                // not an extra pattern
112c3437056SNickeau                $tagAttributes = TagAttributes::createFromTagMatch($match);
113c3437056SNickeau                $attributes = $tagAttributes->toCallStackArray();
114007225e5Sgerardnico            }
115c3437056SNickeau            return array(
116c3437056SNickeau                PluginUtility::STATE => $state,
117c3437056SNickeau                PluginUtility::ATTRIBUTES => $attributes
118c3437056SNickeau            );
119007225e5Sgerardnico        }
120007225e5Sgerardnico
121007225e5Sgerardnico        // Cache the values
122007225e5Sgerardnico        return array($state);
123007225e5Sgerardnico    }
124007225e5Sgerardnico
125007225e5Sgerardnico    /**
126007225e5Sgerardnico     * Render the output
127007225e5Sgerardnico     * @param string $format
128007225e5Sgerardnico     * @param Doku_Renderer $renderer
129007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
130007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
131007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
132007225e5Sgerardnico     *
133007225e5Sgerardnico     *
134007225e5Sgerardnico     */
135*04fd306cSNickeau    function render($format, Doku_Renderer $renderer, $data): bool
136007225e5Sgerardnico    {
137007225e5Sgerardnico
138007225e5Sgerardnico
139007225e5Sgerardnico        if ($format == 'xhtml') {
140007225e5Sgerardnico
141*04fd306cSNickeau            $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES])
142*04fd306cSNickeau                ->setLogicalTag(RelatedTag::TAG);
143*04fd306cSNickeau            $renderer->doc .= RelatedTag::render($tagAttributes);
144007225e5Sgerardnico            return true;
145007225e5Sgerardnico        }
146007225e5Sgerardnico        return false;
147007225e5Sgerardnico    }
148007225e5Sgerardnico
1491fa8c418SNickeau    public static function getTag(): string
150007225e5Sgerardnico    {
151*04fd306cSNickeau        return RelatedTag::TAG;
152007225e5Sgerardnico    }
153007225e5Sgerardnico
154007225e5Sgerardnico
155007225e5Sgerardnico}
156