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