208 lines
6.0 KiB
PHP
208 lines
6.0 KiB
PHP
<?php
|
|
|
|
use dokuwiki\Extension\ActionPlugin;
|
|
use dokuwiki\Extension\Event;
|
|
use dokuwiki\Extension\EventHandler;
|
|
use dokuwiki\plugin\luxtools\PageLink;
|
|
|
|
require_once(__DIR__ . '/autoload.php');
|
|
|
|
/**
|
|
* luxtools action plugin: register JS assets.
|
|
*/
|
|
class action_plugin_luxtools extends ActionPlugin
|
|
{
|
|
/** @inheritdoc */
|
|
public function register(Doku_Event_Handler $controller)
|
|
{
|
|
$controller->register_hook(
|
|
"TPL_METAHEADER_OUTPUT",
|
|
"BEFORE",
|
|
$this,
|
|
"addScripts",
|
|
);
|
|
$controller->register_hook(
|
|
"TPL_CONTENT_DISPLAY",
|
|
"BEFORE",
|
|
$this,
|
|
"addPageLinkStatus",
|
|
);
|
|
$controller->register_hook(
|
|
"CSS_STYLES_INCLUDED",
|
|
"BEFORE",
|
|
$this,
|
|
"addTemporaryInputStyles",
|
|
);
|
|
$controller->register_hook(
|
|
"TOOLBAR_DEFINE",
|
|
"AFTER",
|
|
$this,
|
|
"addToolbarButton",
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Add plugin JavaScript files in a deterministic order.
|
|
*
|
|
* @param Event $event
|
|
* @param mixed $param
|
|
* @return void
|
|
*/
|
|
public function addScripts(Event $event, $param)
|
|
{
|
|
$plugin = $this->getPluginName();
|
|
$base = DOKU_BASE . "lib/plugins/$plugin/js/";
|
|
$scripts = [
|
|
"lightbox.js",
|
|
"gallery-thumbnails.js",
|
|
"open-service.js",
|
|
"scratchpads.js",
|
|
"date-fix.js",
|
|
"page-link.js",
|
|
"linkfavicon.js",
|
|
"main.js",
|
|
];
|
|
|
|
foreach ($scripts as $script) {
|
|
$event->data["script"][] = [
|
|
"type" => "text/javascript",
|
|
"src" => $base . $script,
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Include temporary global input styling via css.php so @ini_* placeholders resolve.
|
|
*
|
|
* @param Event $event
|
|
* @param mixed $param
|
|
* @return void
|
|
*/
|
|
public function addTemporaryInputStyles(Event $event, $param)
|
|
{
|
|
if (!isset($event->data['mediatype']) || $event->data['mediatype'] !== 'screen') {
|
|
return;
|
|
}
|
|
|
|
if (!isset($event->data['files']) || !is_array($event->data['files'])) {
|
|
return;
|
|
}
|
|
|
|
$plugin = $this->getPluginName();
|
|
$event->data['files'][DOKU_PLUGIN . $plugin . '/temp-input-colors.css'] = DOKU_BASE . 'lib/plugins/' . $plugin . '/';
|
|
}
|
|
|
|
/**
|
|
* Add custom toolbar button for code blocks.
|
|
*
|
|
* @param Event $event
|
|
* @param mixed $param
|
|
* @return void
|
|
*/
|
|
public function addToolbarButton(Event $event, $param)
|
|
{
|
|
$event->data[] = [
|
|
"type" => "format",
|
|
"title" => $this->getLang("toolbar_code_title"),
|
|
"icon" => "../../plugins/luxtools/images/code.png",
|
|
"key" => "C",
|
|
"open" => "<code>",
|
|
"sample" => $this->getLang("toolbar_code_sample"),
|
|
"close" => "</code>",
|
|
"block" => false,
|
|
];
|
|
|
|
// Date Fix: normalize selected timestamp
|
|
$event->data[] = [
|
|
"type" => "LuxtoolsDatefix",
|
|
"title" => $this->getLang("toolbar_datefix_title"),
|
|
"icon" => "../../plugins/luxtools/images/date-fix.svg",
|
|
"key" => "t",
|
|
"block" => false,
|
|
];
|
|
|
|
// Date Fix All: normalize all timestamps on page
|
|
$event->data[] = [
|
|
"type" => "LuxtoolsDatefixAll",
|
|
"title" => $this->getLang("toolbar_datefix_all_title"),
|
|
"icon" => "../../plugins/luxtools/images/date-fix-all.svg",
|
|
"block" => false,
|
|
];
|
|
|
|
// Page Link: create a page-scoped UUID for .pagelink linking
|
|
$event->data[] = [
|
|
"type" => "LuxtoolsPageLink",
|
|
"title" => $this->getLang("toolbar_pagelink_title"),
|
|
"icon" => "../../plugins/luxtools/images/pagelink.svg",
|
|
"block" => false,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Inject page link status above the page content.
|
|
*
|
|
* @param Event $event
|
|
* @param mixed $param
|
|
* @return void
|
|
*/
|
|
public function addPageLinkStatus(Event $event, $param)
|
|
{
|
|
global $ACT, $ID;
|
|
|
|
if (!is_string($ACT) || $ACT !== 'show') {
|
|
return;
|
|
}
|
|
|
|
if (!is_string($ID) || $ID === '') {
|
|
return;
|
|
}
|
|
|
|
$pageId = $ID;
|
|
if (function_exists('cleanID')) {
|
|
$pageId = (string)cleanID($pageId);
|
|
}
|
|
if ($pageId === '') return;
|
|
|
|
$pathConfig = (string)$this->getConf('paths');
|
|
$depth = (int)$this->getConf('pagelink_search_depth');
|
|
if ($depth < 0) $depth = 0;
|
|
|
|
$pageLink = new PageLink($pathConfig, $depth);
|
|
$uuid = $pageLink->getPageUuid($pageId);
|
|
if ($uuid === null) return;
|
|
|
|
$linkInfo = $pageLink->resolveUuid($uuid);
|
|
$folder = $linkInfo['folder'] ?? null;
|
|
$multiple = !empty($linkInfo['multiple']);
|
|
|
|
$statusText = '';
|
|
$copyable = false;
|
|
$title = '';
|
|
if (is_string($folder) && $folder !== '') {
|
|
$trimmed = rtrim($folder, '/\\');
|
|
$statusText = basename($trimmed);
|
|
$title = $trimmed;
|
|
} else {
|
|
$statusText = (string)$this->getLang('pagelink_unlinked');
|
|
$copyable = true;
|
|
}
|
|
|
|
$warning = '';
|
|
if ($multiple) {
|
|
$warning = '<span class="luxtools-pagelink-warning" title="' . hsc((string)$this->getLang('pagelink_multi_warning')) . '" aria-hidden="true">⚠</span>';
|
|
}
|
|
|
|
$html = '<span class="luxtools-pagelink-status" data-luxtools-pagelink="1"'
|
|
. ' data-uuid="' . hsc($uuid) . '"'
|
|
. ' data-copy="' . ($copyable ? '1' : '0') . '"'
|
|
. ' data-multiple="' . ($multiple ? '1' : '0') . '"'
|
|
. ($title !== '' ? ' title="' . hsc($title) . '"' : '')
|
|
. '>'
|
|
. hsc($statusText)
|
|
. $warning
|
|
. '</span>';
|
|
|
|
$event->data = $html . $event->data;
|
|
}
|
|
}
|