diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b96db2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +_agent-data/ diff --git a/README.md b/README.md index 1649907..7a327eb 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,14 @@ Key settings: ## Features and usage +### 0) Editor toolbar: Code block button + +The plugin adds a custom button to the DokuWiki editor toolbar for quickly inserting `` blocks. + +When editing a page, click the code block button (angle brackets icon `<>`) in the toolbar to wrap selected text in `` tags, or to insert an empty code block at the cursor position. + +This complements DokuWiki's built-in monospace formatting (`''`) by providing quick access to HTML code blocks. + ### 1) List files by glob pattern ``` diff --git a/action.php b/action.php index 652de33..d1f5c8b 100644 --- a/action.php +++ b/action.php @@ -10,9 +10,20 @@ use dokuwiki\Extension\EventHandler; class action_plugin_luxtools extends ActionPlugin { /** @inheritdoc */ - public function register(EventHandler $controller) + public function register(Doku_Event_Handler $controller) { - $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'addScripts'); + $controller->register_hook( + "TPL_METAHEADER_OUTPUT", + "BEFORE", + $this, + "addScripts", + ); + $controller->register_hook( + "TOOLBAR_DEFINE", + "AFTER", + $this, + "addToolbarButton", + ); } /** @@ -22,22 +33,43 @@ class action_plugin_luxtools extends ActionPlugin * @param mixed $param * @return void */ - public function addScripts(Event $event, $param) + public function addScripts(Event $event, $param) { - $base = DOKU_BASE . 'lib/plugins/luxtools/js/'; - $scripts = array( - 'lightbox.js', - 'gallery-thumbnails.js', - 'open-service.js', - 'scratchpads.js', - 'main.js' - ); + $base = DOKU_BASE . "lib/plugins/luxtools/js/"; + $scripts = [ + "lightbox.js", + "gallery-thumbnails.js", + "open-service.js", + "scratchpads.js", + "main.js", + ]; foreach ($scripts as $script) { - $event->data['script'][] = array( - 'type' => 'text/javascript', - 'src' => $base . $script - ); + $event->data["script"][] = [ + "type" => "text/javascript", + "src" => $base . $script, + ]; } } + + /** + * 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" => "", + "sample" => $this->getLang("toolbar_code_sample"), + "close" => "", + "block" => false, + ]; + } } diff --git a/deploy.sh b/deploy.sh index d181719..56461b7 100755 --- a/deploy.sh +++ b/deploy.sh @@ -69,6 +69,7 @@ RSYNC_ARGS=( --exclude=deploy.sh --exclude=.git/ --exclude=_dokuwiki/ + --exclude=_agent-data/ --exclude=.github/ --exclude=.vscode/ --exclude=_test/ diff --git a/images/code.png b/images/code.png new file mode 100644 index 0000000..26ef184 Binary files /dev/null and b/images/code.png differ diff --git a/images/code.svg b/images/code.svg new file mode 100644 index 0000000..d656f1e --- /dev/null +++ b/images/code.svg @@ -0,0 +1,3 @@ + + + diff --git a/lang/de/lang.php b/lang/de/lang.php index 0078d12..dd7a657 100644 --- a/lang/de/lang.php +++ b/lang/de/lang.php @@ -7,53 +7,69 @@ * @author Gina Haeussge */ -$lang['filename'] = 'Dateiname'; -$lang['filesize'] = 'Dateigröße'; -$lang['lastmodified'] = 'Letzte Änderung'; -$lang['openlocation'] = 'Ort öffnen'; -$lang['error_nomatch'] = 'Keine Treffer'; -$lang['error_outsidejail'] = 'Zugriff verweigert'; +$lang["filename"] = "Dateiname"; +$lang["filesize"] = "Dateigröße"; +$lang["lastmodified"] = "Letzte Änderung"; +$lang["openlocation"] = "Ort öffnen"; +$lang["error_nomatch"] = "Keine Treffer"; +$lang["error_outsidejail"] = "Zugriff verweigert"; -$lang['empty_files'] = 'Keine Dateien'; -$lang['empty_images'] = 'Keine Bilder'; +$lang["empty_files"] = "Keine Dateien"; +$lang["empty_images"] = "Keine Bilder"; -$lang['menu'] = 'luxtools'; -$lang['settings'] = 'luxtools-Einstellungen'; -$lang['legend'] = 'Einstellungen'; -$lang['btn_save'] = 'Speichern'; -$lang['saved'] = 'Einstellungen gespeichert.'; -$lang['err_save'] = 'Einstellungen konnten nicht gespeichert werden. Bitte Schreibrechte für conf/local.php prüfen.'; -$lang['err_security'] = 'Sicherheits-Token ungültig. Bitte erneut versuchen.'; +$lang["menu"] = "luxtools"; +$lang["settings"] = "luxtools-Einstellungen"; +$lang["legend"] = "Einstellungen"; +$lang["btn_save"] = "Speichern"; +$lang["saved"] = "Einstellungen gespeichert."; +$lang["err_save"] = + "Einstellungen konnten nicht gespeichert werden. Bitte Schreibrechte für conf/local.php prüfen."; +$lang["err_security"] = "Sicherheits-Token ungültig. Bitte erneut versuchen."; +$lang["paths"] = + "Erlaubte Basis-Pfade (eine pro Zeile). Optional: Pfad mit A>-Alias ergaenzen."; +$lang["scratchpad_paths"] = + "Scratchpad-Dateien (eine pro Zeile). Jeder Dateipfad muss eine Erweiterung enthalten. Mit einer folgenden A>-Zeile wird der Pad-Name gesetzt, der im Wiki verwendet wird."; +$lang["extensions"] = "Kommagetrennte Liste erlaubter Dateiendungen."; -$lang['paths'] = 'Erlaubte Basis-Pfade (eine pro Zeile). Optional: Pfad mit A>-Alias ergaenzen.'; -$lang['scratchpad_paths'] = 'Scratchpad-Dateien (eine pro Zeile). Jeder Dateipfad muss eine Erweiterung enthalten. Mit einer folgenden A>-Zeile wird der Pad-Name gesetzt, der im Wiki verwendet wird.'; -$lang['extensions'] = 'Kommagetrennte Liste erlaubter Dateiendungen.'; +$lang["listing_defaults"] = "Listen-Standardwerte"; +$lang["default_sort"] = + "Standard-Sortierschlüssel (name|iname|ctime|mtime|size)."; +$lang["default_order"] = "Standard-Sortierreihenfolge (asc|desc)."; +$lang["default_style"] = "Standard-Ausgabeformat (list|olist|table)."; +$lang["default_tableheader"] = "Tabellenkopf standardmäßig anzeigen."; +$lang["default_foldersfirst"] = "Ordner standardmäßig vor Dateien sortieren."; +$lang["default_recursive"] = "Unterverzeichnisse standardmäßig einbeziehen."; +$lang["default_titlefile"] = "Standard-Name der Titeldatei (z.B. _title.txt)."; +$lang["default_cache"] = + "Seiten-Caching standardmäßig aktivieren (0 deaktiviert Caching)."; +$lang["default_randlinks"] = + "Standardmäßig Cache-Busting-Parameter auf Basis mtime hinzufügen."; +$lang["default_showsize"] = + "Dateigröße standardmäßig anzeigen (falls unterstützt)."; +$lang["default_showdate"] = + "Änderungsdatum standardmäßig anzeigen (falls unterstützt)."; +$lang["default_listsep"] = + 'Standard-Trennzeichen für Listenausgabe (z.B. ", ").'; +$lang["default_maxheight"] = + "Standard max-height in px für Scroll-Container (-1 deaktiviert)."; -$lang['listing_defaults'] = 'Listen-Standardwerte'; -$lang['default_sort'] = 'Standard-Sortierschlüssel (name|iname|ctime|mtime|size).'; -$lang['default_order'] = 'Standard-Sortierreihenfolge (asc|desc).'; -$lang['default_style'] = 'Standard-Ausgabeformat (list|olist|table).'; -$lang['default_tableheader'] = 'Tabellenkopf standardmäßig anzeigen.'; -$lang['default_foldersfirst'] = 'Ordner standardmäßig vor Dateien sortieren.'; -$lang['default_recursive'] = 'Unterverzeichnisse standardmäßig einbeziehen.'; -$lang['default_titlefile'] = 'Standard-Name der Titeldatei (z.B. _title.txt).'; -$lang['default_cache'] = 'Seiten-Caching standardmäßig aktivieren (0 deaktiviert Caching).'; -$lang['default_randlinks'] = 'Standardmäßig Cache-Busting-Parameter auf Basis mtime hinzufügen.'; -$lang['default_showsize'] = 'Dateigröße standardmäßig anzeigen (falls unterstützt).'; -$lang['default_showdate'] = 'Änderungsdatum standardmäßig anzeigen (falls unterstützt).'; -$lang['default_listsep'] = 'Standard-Trennzeichen für Listenausgabe (z.B. ", ").'; -$lang['default_maxheight'] = 'Standard max-height in px für Scroll-Container (-1 deaktiviert).'; +$lang["defaults"] = + "Legacy-Standardoptionen (fortgeschritten). Vorhandene Werte werden weiterhin berücksichtigt, sind aber nicht mehr über die UI konfigurierbar."; +$lang["thumb_placeholder"] = + "MediaManager-ID für den Platzhalter der Galerie-Thumbnails."; +$lang["gallery_thumb_scale"] = + "Skalierungsfaktor für Galerie-Thumbnails. 2 erzeugt schärfere Thumbnails auf HiDPI-Displays (Anzeige bleibt 150×150)."; +$lang["open_service_url"] = + "URL des lokalen Client-Dienstes für {{open>...}} (z.B. http://127.0.0.1:8765)."; -$lang['defaults'] = 'Legacy-Standardoptionen (fortgeschritten). Vorhandene Werte werden weiterhin berücksichtigt, sind aber nicht mehr über die UI konfigurierbar.'; -$lang['thumb_placeholder'] = 'MediaManager-ID für den Platzhalter der Galerie-Thumbnails.'; -$lang['gallery_thumb_scale'] = 'Skalierungsfaktor für Galerie-Thumbnails. 2 erzeugt schärfere Thumbnails auf HiDPI-Displays (Anzeige bleibt 150×150).'; -$lang['open_service_url'] = 'URL des lokalen Client-Dienstes für {{open>...}} (z.B. http://127.0.0.1:8765).'; +$lang["scratchpad_edit"] = "Scratchpad bearbeiten"; +$lang["scratchpad_save"] = "Speichern"; +$lang["scratchpad_cancel"] = "Abbrechen"; +$lang["scratchpad_err_nopath"] = "Scratchpad-Pfad fehlt"; +$lang["scratchpad_err_badpath"] = "Ungültiger Scratchpad-Pfad"; +$lang["scratchpad_err_unknown"] = "Unbekannter Scratchpad-Name"; +$lang["scratchpad_err_unreadable"] = "Scratchpad-Datei ist nicht lesbar"; -$lang['scratchpad_edit'] = 'Scratchpad bearbeiten'; -$lang['scratchpad_save'] = 'Speichern'; -$lang['scratchpad_cancel'] = 'Abbrechen'; -$lang['scratchpad_err_nopath'] = 'Scratchpad-Pfad fehlt'; -$lang['scratchpad_err_badpath'] = 'Ungültiger Scratchpad-Pfad'; -$lang['scratchpad_err_unknown'] = 'Unbekannter Scratchpad-Name'; -$lang['scratchpad_err_unreadable'] = 'Scratchpad-Datei ist nicht lesbar'; +$lang["toolbar_code_title"] = "Code-Block"; +$lang["toolbar_code_sample"] = "Ihr Code hier"; diff --git a/lang/en/lang.php b/lang/en/lang.php index dfc8fbd..083dabb 100644 --- a/lang/en/lang.php +++ b/lang/en/lang.php @@ -7,54 +7,69 @@ * @author Gina Haeussge */ -$lang['filename'] = 'Filename'; -$lang['filesize'] = 'Filesize'; -$lang['lastmodified'] = 'Last modified'; -$lang['openlocation'] = 'Open Location'; -$lang['error_nomatch'] = 'No match'; -$lang['error_outsidejail'] = 'Access denied'; +$lang["filename"] = "Filename"; +$lang["filesize"] = "Filesize"; +$lang["lastmodified"] = "Last modified"; +$lang["openlocation"] = "Open Location"; +$lang["error_nomatch"] = "No match"; +$lang["error_outsidejail"] = "Access denied"; -$lang['empty_files'] = 'No Files'; -$lang['empty_images'] = 'No Images'; +$lang["empty_files"] = "No Files"; +$lang["empty_images"] = "No Images"; -$lang['menu'] = 'luxtools'; -$lang['settings'] = 'luxtools settings'; -$lang['legend'] = 'Settings'; -$lang['btn_save'] = 'Save'; -$lang['saved'] = 'Settings saved.'; -$lang['err_save'] = 'Could not save settings. Please check write permissions for conf/local.php.'; -$lang['err_security'] = 'Security token mismatch. Please retry.'; +$lang["menu"] = "luxtools"; +$lang["settings"] = "luxtools settings"; +$lang["legend"] = "Settings"; +$lang["btn_save"] = "Save"; +$lang["saved"] = "Settings saved."; +$lang["err_save"] = + "Could not save settings. Please check write permissions for conf/local.php."; +$lang["err_security"] = "Security token mismatch. Please retry."; +$lang["paths"] = + "Allowed base paths (one per line). Optional: follow a path with A> alias."; +$lang["scratchpad_paths"] = + "Scratchpad files (one per line). Each file path must include the extension. Use a following A> line to set the pad name used in the wiki."; +$lang["extensions"] = + "Comma-separated list of allowed file extensions to list."; -$lang['paths'] = 'Allowed base paths (one per line). Optional: follow a path with A> alias.'; -$lang['scratchpad_paths'] = 'Scratchpad files (one per line). Each file path must include the extension. Use a following A> line to set the pad name used in the wiki.'; -$lang['extensions'] = 'Comma-separated list of allowed file extensions to list.'; +$lang["listing_defaults"] = "Listing defaults"; +$lang["default_sort"] = "Default sort key (name|iname|ctime|mtime|size)."; +$lang["default_order"] = "Default sort order (asc|desc)."; +$lang["default_style"] = "Default output style (list|olist|table)."; +$lang["default_tableheader"] = "Render table header row by default."; +$lang["default_foldersfirst"] = "Group folders before files by default."; +$lang["default_recursive"] = "Recurse into subdirectories by default."; +$lang["default_titlefile"] = "Default title file name (e.g. _title.txt)."; +$lang["default_cache"] = "Enable page caching by default (0 disables caching)."; +$lang["default_randlinks"] = + "Add cache-busting query parameter based on mtime by default."; +$lang["default_showsize"] = "Show file size by default (where supported)."; +$lang["default_showdate"] = + "Show last modified date by default (where supported)."; +$lang["default_tablecolumns"] = + 'Default table columns (comma-separated). Available: name, size, date. Example: "name,size,date" shows all columns.'; +$lang["default_listsep"] = + 'Default separator used in list-style rendering (e.g. ", ").'; +$lang["default_maxheight"] = + "Default max-height in px for scroll container (-1 disables)."; -$lang['listing_defaults'] = 'Listing defaults'; -$lang['default_sort'] = 'Default sort key (name|iname|ctime|mtime|size).'; -$lang['default_order'] = 'Default sort order (asc|desc).'; -$lang['default_style'] = 'Default output style (list|olist|table).'; -$lang['default_tableheader'] = 'Render table header row by default.'; -$lang['default_foldersfirst'] = 'Group folders before files by default.'; -$lang['default_recursive'] = 'Recurse into subdirectories by default.'; -$lang['default_titlefile'] = 'Default title file name (e.g. _title.txt).'; -$lang['default_cache'] = 'Enable page caching by default (0 disables caching).'; -$lang['default_randlinks'] = 'Add cache-busting query parameter based on mtime by default.'; -$lang['default_showsize'] = 'Show file size by default (where supported).'; -$lang['default_showdate'] = 'Show last modified date by default (where supported).'; -$lang['default_tablecolumns'] = 'Default table columns (comma-separated). Available: name, size, date. Example: "name,size,date" shows all columns.'; -$lang['default_listsep'] = 'Default separator used in list-style rendering (e.g. ", ").'; -$lang['default_maxheight'] = 'Default max-height in px for scroll container (-1 disables).'; +$lang["defaults"] = + "Legacy default options string (advanced). Existing values are still honored, but this is no longer configurable via the UI."; +$lang["thumb_placeholder"] = + "MediaManager ID for the gallery thumbnail placeholder."; +$lang["gallery_thumb_scale"] = + "Gallery thumbnail scale factor. Use 2 for sharper thumbnails on HiDPI screens (still displayed as 150×150)."; +$lang["open_service_url"] = + "Local client service URL for the {{open>...}} button (e.g. http://127.0.0.1:8765)."; -$lang['defaults'] = 'Legacy default options string (advanced). Existing values are still honored, but this is no longer configurable via the UI.'; -$lang['thumb_placeholder'] = 'MediaManager ID for the gallery thumbnail placeholder.'; -$lang['gallery_thumb_scale'] = 'Gallery thumbnail scale factor. Use 2 for sharper thumbnails on HiDPI screens (still displayed as 150×150).'; -$lang['open_service_url'] = 'Local client service URL for the {{open>...}} button (e.g. http://127.0.0.1:8765).'; +$lang["scratchpad_edit"] = "Edit scratchpad"; +$lang["scratchpad_save"] = "Save"; +$lang["scratchpad_cancel"] = "Cancel"; +$lang["scratchpad_err_nopath"] = "Scratchpad path missing"; +$lang["scratchpad_err_badpath"] = "Invalid scratchpad path"; +$lang["scratchpad_err_unknown"] = "Unknown scratchpad pad name"; +$lang["scratchpad_err_unreadable"] = "Scratchpad file is not readable"; -$lang['scratchpad_edit'] = 'Edit scratchpad'; -$lang['scratchpad_save'] = 'Save'; -$lang['scratchpad_cancel'] = 'Cancel'; -$lang['scratchpad_err_nopath'] = 'Scratchpad path missing'; -$lang['scratchpad_err_badpath'] = 'Invalid scratchpad path'; -$lang['scratchpad_err_unknown'] = 'Unknown scratchpad pad name'; -$lang['scratchpad_err_unreadable'] = 'Scratchpad file is not readable'; +$lang["toolbar_code_title"] = "Code Block"; +$lang["toolbar_code_sample"] = "your code here";