xref: /plugin/combo/action/linkwizard.php (revision 04fd306c7c155fa133ebb3669986875d65988276) !
1c3437056SNickeau<?php
2c3437056SNickeau
3*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
4*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
5*04fd306cSNickeauuse ComboStrap\ExecutionContext;
6*04fd306cSNickeauuse ComboStrap\FileSystems;
7*04fd306cSNickeauuse ComboStrap\HttpResponseStatus;
8c3437056SNickeauuse ComboStrap\Json;
9c3437056SNickeauuse ComboStrap\LogUtility;
10*04fd306cSNickeauuse ComboStrap\LinkMarkup;
11*04fd306cSNickeauuse ComboStrap\Mime;
12c3437056SNickeauuse ComboStrap\PluginUtility;
13*04fd306cSNickeauuse ComboStrap\Search;
14*04fd306cSNickeauuse ComboStrap\Site;
15*04fd306cSNickeauuse ComboStrap\SiteConfig;
16c3437056SNickeauuse ComboStrap\Sqlite;
174cadd4f8SNickeauuse ComboStrap\StringUtility;
18c3437056SNickeau
19c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
20c3437056SNickeau
21c3437056SNickeau
22c3437056SNickeau/**
23*04fd306cSNickeau *
24*04fd306cSNickeau *
25*04fd306cSNickeau * This action enhance the search of page in:
26*04fd306cSNickeau * linkwiz: the editor toolbar action
27*04fd306cSNickeau *
28*04fd306cSNickeau * The entry point is in the {@link Ajax::callLinkwiz()}
29*04fd306cSNickeau * function
30*04fd306cSNickeau *
31c3437056SNickeau */
32c3437056SNickeauclass action_plugin_combo_linkwizard extends DokuWiki_Action_Plugin
33c3437056SNickeau{
34c3437056SNickeau
35c3437056SNickeau    const CONF_ENABLE_ENHANCED_LINK_WIZARD = "enableEnhancedLinkWizard";
36c3437056SNickeau    const CANONICAL = "linkwizard";
37*04fd306cSNickeau    const CALL = "linkwiz";
38*04fd306cSNickeau    const MINIMAL_WORD_LENGTH = 3;
39*04fd306cSNickeau
40c3437056SNickeau
41c3437056SNickeau    /**
42c3437056SNickeau     * @param Doku_Event_Handler $controller
43c3437056SNickeau     */
44c3437056SNickeau    function register(Doku_Event_Handler $controller)
45c3437056SNickeau    {
46c3437056SNickeau
47c3437056SNickeau        /**
48c3437056SNickeau         * https://www.dokuwiki.org/devel:event:search_query_pagelookup
49c3437056SNickeau         */
50*04fd306cSNickeau        $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'BEFORE', $this, 'linkWizard', array());
51*04fd306cSNickeau
52c3437056SNickeau
53c3437056SNickeau    }
54c3437056SNickeau
55c3437056SNickeau
56c3437056SNickeau    /**
57c3437056SNickeau     * Modify the returned pages
58c3437056SNickeau     * The {@link callLinkWiz} of inc/Ajax.php do
59c3437056SNickeau     * just a page search with {@link ft_pageLookup()}
60c3437056SNickeau     * https://www.dokuwiki.org/search
61c3437056SNickeau     * @param Doku_Event $event
62c3437056SNickeau     * @param $params
63c3437056SNickeau     * The path are initialized in {@link init_paths}
64c3437056SNickeau     * @return void
65c3437056SNickeau     */
66*04fd306cSNickeau    function linkWizard(Doku_Event $event, $params)
67c3437056SNickeau    {
68*04fd306cSNickeau
69c3437056SNickeau        global $INPUT;
70*04fd306cSNickeau
71c3437056SNickeau        $postCall = $INPUT->post->str('call');
72*04fd306cSNickeau        if ($postCall !== self::CALL) {
73c3437056SNickeau            return;
74c3437056SNickeau        }
75*04fd306cSNickeau
76*04fd306cSNickeau        if (SiteConfig::getConfValue(self::CONF_ENABLE_ENHANCED_LINK_WIZARD, 1) === 0) {
77c3437056SNickeau            return;
78c3437056SNickeau        }
79*04fd306cSNickeau
80c3437056SNickeau
81c3437056SNickeau        $searchTerm = $event->data["id"]; // yes id is the search term
82*04fd306cSNickeau        $pages = Search::getPages($searchTerm);
83*04fd306cSNickeau
84*04fd306cSNickeau
85*04fd306cSNickeau        /**
86*04fd306cSNickeau         * Adapted from {@link Ajax::callLinkwiz()}
87*04fd306cSNickeau         * because link-wizard delete the pages in the same namespace and shows the group instead
88*04fd306cSNickeau         * Breaking the flow
89*04fd306cSNickeau         */
90*04fd306cSNickeau
91*04fd306cSNickeau        global $lang;
92*04fd306cSNickeau        if (!count($pages)) {
93*04fd306cSNickeau            ExecutionContext::getActualOrCreateFromEnv()
94*04fd306cSNickeau                ->response()
95*04fd306cSNickeau                ->setStatus(HttpResponseStatus::ALL_GOOD)
96*04fd306cSNickeau                ->setBody("<div>" . $lang['nothingfound'] . "</div>", Mime::getHtml())
97*04fd306cSNickeau                ->end();
98c3437056SNickeau            return;
99c3437056SNickeau        }
100*04fd306cSNickeau
101*04fd306cSNickeau        // output the found data
102*04fd306cSNickeau        $even = 1;
103*04fd306cSNickeau        $html = "";
104*04fd306cSNickeau        $lowerSearchTerm = strtolower($searchTerm);
105*04fd306cSNickeau        foreach ($pages as $page) {
106*04fd306cSNickeau            try {
107*04fd306cSNickeau                $id = $page->getWikiId();
108*04fd306cSNickeau            } catch (ExceptionBadArgument $e) {
109*04fd306cSNickeau                LogUtility::internalError("The selection should return wiki path", self::CANONICAL, $e);
1104cadd4f8SNickeau                continue;
1114cadd4f8SNickeau            }
112*04fd306cSNickeau            $path = $page->getPathObject()->toAbsoluteId();
113*04fd306cSNickeau            /**
114*04fd306cSNickeau             * The name is the label that is put
115*04fd306cSNickeau             * punt in the markup link
116*04fd306cSNickeau             * We set it in lowercase then.
117*04fd306cSNickeau             * Nobody want uppercase letter in their link label
118*04fd306cSNickeau             */
119*04fd306cSNickeau            $name = strtolower($page->getNameOrDefault());
120*04fd306cSNickeau            $title = $page->getTitleOrDefault();
121*04fd306cSNickeau            $h1 = $page->getH1OrDefault();
122*04fd306cSNickeau            $even *= -1; //zebra
123*04fd306cSNickeau            $link = wl($id);
124*04fd306cSNickeau            $evenOrOdd = (($even > 0) ? 'even' : 'odd');
125*04fd306cSNickeau            $label = null;
126*04fd306cSNickeau            if (strpos(strtolower($title), $lowerSearchTerm) !== false) {
127*04fd306cSNickeau                $label = "Title: $title";
1284cadd4f8SNickeau            }
129*04fd306cSNickeau            if ($label === null && strpos(strtolower($h1), $lowerSearchTerm) !== false) {
130*04fd306cSNickeau                $label = "H1: $h1";
131*04fd306cSNickeau            } else {
132*04fd306cSNickeau                $label = "Title: $title";
133*04fd306cSNickeau            }
134*04fd306cSNickeau            $class = "";
135*04fd306cSNickeau            if (!FileSystems::exists($page->getPathObject())) {
136*04fd306cSNickeau                $errorClass = LinkMarkup::getHtmlClassNotExist();
137*04fd306cSNickeau                $class = "class=\"$errorClass\"";
138*04fd306cSNickeau            }
139*04fd306cSNickeau            /**
140*04fd306cSNickeau             * Because path is used in the title to create the link
141*04fd306cSNickeau             * by {@link file linkwiz.js} we set a title on the span
142*04fd306cSNickeau             */
143*04fd306cSNickeau            $html .= <<<EOF
144*04fd306cSNickeau<div class="$evenOrOdd">
145*04fd306cSNickeau   <a href="$link" title="$path" $class>$path</a><span title="$label">$name</span>
146*04fd306cSNickeau</div>
147c3437056SNickeauEOF;
148c3437056SNickeau        }
149*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()
150*04fd306cSNickeau            ->response()
151*04fd306cSNickeau            ->setStatus(HttpResponseStatus::ALL_GOOD)
152*04fd306cSNickeau            ->setBody($html, Mime::getHtml())
153*04fd306cSNickeau            ->end();
154c3437056SNickeau
155c3437056SNickeau    }
156c3437056SNickeau
157c3437056SNickeau
158c3437056SNickeau}
159