register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'addInterwikisToJSINFO'); } public function addInterwikisToJSINFO(Doku_Event $event) { global $JSINFO; $JSINFO['plugins']['interwikipaste']['patterns'] = json_encode($this->getInterwikiPatterns()); } /** * Loads interwiki configuration and transforms it into regular expressions * * @return array */ protected function getInterwikiPatterns() { $patterns = []; $wikis = getInterwiki(); // sort urls by longer first (probably more specific matches) uasort($wikis, function ($a, $b) { if (strlen($a) === strlen($b)) { return 0; } return (strlen($a) > strlen($b)) ? -1 : 1; }); foreach ($wikis as $shortcut => $url) { // escaping now makes it easier to manipulate regex patterns later $pattern = preg_quote_cb($url); $encode = (preg_match('/{URL|QUERY\\\}/', $url) === 1); // replace already escaped placeholders with named groups $cnt = 0; $pattern = preg_replace( '/\\\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\\\}/', '([^ ]+)?', $pattern, -1, $cnt ); if (!$cnt) { $pattern .= '([^ ]+)?'; } $patterns[] = [ 'shortcut' => $shortcut, 'pattern' => $pattern, 'encode' => $encode, ]; } return $patterns; } }