<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Entwicklung on wt-modules</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/</link><description>Recent content in Entwicklung on wt-modules</description><generator>Hugo</generator><language>de</language><atom:link href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI-Skripte</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/cli-scripts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/cli-scripts/</guid><description>&lt;p&gt;Das Modul bringt ausschließlich CLI-Skripte mit. Sie sind geschützt: bei Aufruf über HTTP (das Verzeichnis &lt;code&gt;modules_v4&lt;/code&gt; liegt innerhalb des Web-Roots) antworten sie mit &lt;code&gt;403&lt;/code&gt; anstatt auszuführen.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Skript&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Zweck&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Braucht eine webtrees-Installation + DB?&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cli/build-link-index.php [--limit=N] [--tree=&amp;lt;id&amp;gt;] [--rebuild] [--flush]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;baut/aktualisiert den Link-Index für die XREF-Übersicht&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ja&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cli/build-uid-index.php [--limit=N] [--tree=&amp;lt;id&amp;gt;] [--rebuild] [--flush] [--force]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;baut/aktualisiert den UID-Index für die UID-Suche&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ja&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cli/refresh-wthb-toc.php [--all] [--lang=&amp;lt;list&amp;gt;] [--clear] [--force]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;aktualisiert den WTHB-Inhaltsverzeichnis-Cache (&lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/wthb-toc-lang/"&gt;Produktion&lt;/a&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ja&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-text-tag-collector.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-text-tag-collector.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;eigenständige Unit-Tests für den Text-Tag-Collector&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nein&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-link-classifier.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-link-classifier.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;eigenständige Unit-Tests für den Link-Klassifizierer (inkl. Ziel-Extraktion)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nein&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-uid-tag-collector.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-uid-tag-collector.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;eigenständige Unit-Tests für den UID-Tag-Collector&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nein&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-uid-index-service.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-uid-index-service.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;eigenständige Unit-Tests für den UID-Index-Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nein&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;tests/smoke-text-tag-collector.php [limit]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;scannt Datensätze mit erweiterten Links, gibt jeden erfassten Wert aus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ja&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/smoke-migration5.php" target="_blank" rel="noopener"&gt;&lt;code&gt;smoke-migration5.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SQLite-Smoke-Test für Migration5 (UID-Index-Schema)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ja&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;tests/p1-measure.php [--tree=&amp;lt;id&amp;gt;]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Read-only-Scaling-Messung für die XREF-Übersicht&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ja&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Ausführen vom webtrees-Root aus mit der &lt;strong&gt;gleichen PHP-Version&lt;/strong&gt;, mit der die Instanz läuft (webtrees benötigt PHP 8.3+):&lt;/p&gt;</description></item><item><title>Mitwirken</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/contributing/</guid><description>&lt;p&gt;Wenn Sie zu diesem Modul beitragen möchten, großartig! Sie können beitragen, indem Sie:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Code beisteuern&lt;/strong&gt; — schauen Sie sich die &lt;a href="https://codeberg.org/bschwede/linkenhancer/issues"&gt;Issues&lt;/a&gt; für Dinge an, die Aufmerksamkeit brauchen. Wenn Sie Änderungen vornehmen möchten, die nicht in einem Issue aufgeführt sind, erstellen Sie bitte eines, damit Sie Ihren Pull Request verlinken können.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Testen&lt;/strong&gt; — derzeit ist alles manuell; bitte &lt;a href="https://codeberg.org/bschwede/linkenhancer/issues"&gt;erstellen Sie ein Issue&lt;/a&gt; für jeden Bug, den Sie finden.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="übersetzung"&gt;Übersetzung&lt;a class="td-heading-self-link" href="#%c3%bcbersetzung" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Sie können zu diesem Projekt auf &lt;a href="https://translate.codeberg.org/projects/linkenhancer/"&gt;Codeberg Weblate&lt;/a&gt; beitragen. Aktualisierte Übersetzungen werden in der nächsten Version dieses Moduls enthalten sein.&lt;/p&gt;</description></item><item><title>Projektstruktur</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/project-structure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/project-structure/</guid><description>&lt;h2 id="verzeichnislayout"&gt;Verzeichnislayout&lt;a class="td-heading-self-link" href="#verzeichnislayout" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;linkenhancer/&#10;├── module.php ← webtrees-Entry-Point&#10;├── autoload.php ← PSR-4-Autoloader&#10;├── cron-jobs.php ← Self-Registration-Manifest für cronjob&#10;├── latest-version.txt ← aktuelle Version (mit LinkEnhancerModule.php synchron)&#10;├── composer.json ← PHP-Abhängigkeiten (wt-shared-libs, phpstan)&#10;├── package.json ← JS-Abhängigkeiten (gulp, rollup, mocha)&#10;├── gulpfile.mjs ← Build-Tasks&#10;├── phpstan.neon ← Konfiguration der statischen Analyse&#10;├── phpstan-bootstrap.php ← PSR-4-Bootstrap für PHPStan&#10;├── phpstan-baseline.neon ← bekannte Probleme&#10;├── src/ ← PHP (PSR-4)&#10;│ ├── LinkEnhancerModule.php&#10;│ ├── LinkEnhancerModuleExt.php&#10;│ ├── LinkEnhancerUtils.php&#10;│ ├── SettingInterface.php&#10;│ ├── CommonMark/ ← CommonMark-Extensionen&#10;│ ├── DataFix/ ← Datenkorrektur-Handler + Dispatcher&#10;│ ├── Factories/ ← CustomMarkdownFactory&#10;│ ├── Http/ ← Request-Handler&#10;│ ├── Schema/ ← Migrations + SeedHelpTable&#10;│ └── Services/ ← Geschäftslogik&#10;├── resources/&#10;│ ├── js/ ← JS-Quellcode (src/) + Build-Ausgabe (bundle-*)&#10;│ ├── css/ ← CSS-Quellcode + Build-Ausgabe&#10;│ ├── lang/ ← .pot / .po / .php (Übersetzungen)&#10;│ ├── views/ ← PHTML-Views&#10;│ └── img/ ← Screenshots&#10;├── cli/ ← CLI-Wartungsskripte&#10;├── tests/ ← Standalone- + Smoke-Tests&#10;└── util/ ← Build-/Wartungs-Shell-Skripte&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="abhängigkeiten"&gt;Abhängigkeiten&lt;a class="td-heading-self-link" href="#abh%c3%a4ngigkeiten" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt; (&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/composer.json" target="_blank" rel="noopener"&gt;&lt;code&gt;composer.json&lt;/code&gt;&lt;/a&gt;&#10;):&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;bschwede/wt-shared-libs&lt;/code&gt; (Path-Repo &lt;code&gt;../wt-shared-libs&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/phpstan/"&gt;&lt;code&gt;phpstan&lt;/code&gt;&lt;/a&gt; (dev).&lt;/li&gt;&#10;&lt;li&gt;Konflikte mit:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;webtrees &amp;lt;2.2&lt;/code&gt; und&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/elysch/webtrees-mitalteli-misc-features"&gt;&lt;code&gt;elysch/webtrees-mitalteli-misc-features&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;JS&lt;/strong&gt; (&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/package.json" target="_blank" rel="noopener"&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt;&#10;):&#10;&lt;ul&gt;&#10;&lt;li&gt;Laufzeit-Abhängigkeit &lt;a href="https://github.com/jefago/tiny-markdown-editor"&gt;&lt;code&gt;tiny-markdown-editor&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Dev-Tooling — Gulp, Rollup, PostCSS (autoprefixer, cssnano), Mocha + chai + sinon, jsdom&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="datenbank-schema"&gt;Datenbank-Schema&lt;a class="td-heading-self-link" href="#datenbank-schema" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Das Modul besitzt fünf Tabellen (Präfix &lt;code&gt;le_&lt;/code&gt;), die inkrementell durch &lt;code&gt;src/Schema/Migration#.php&lt;/code&gt; erstellt werden. Jede Migration ist additiv und idempotent, sodass das Schema bei jedem Modul-Load konvergiert.&lt;/p&gt;</description></item><item><title>Klassenhierarchie</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/class-hierarchy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/class-hierarchy/</guid><description>&lt;p&gt;&lt;em&gt;Automatisch generiert durch &lt;code&gt;docs/tools/generate-class-hierarchy.php&lt;/code&gt; — nicht manuell bearbeiten.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="modul"&gt;Modul&lt;a class="td-heading-self-link" href="#modul" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;LinkEnhancerModule&lt;/code&gt; extends &lt;code&gt;AbstractModule&lt;/code&gt; implements &lt;code&gt;MiddlewareInterface&lt;/code&gt;, &lt;code&gt;ModuleCustomInterface&lt;/code&gt;, &lt;code&gt;ModuleGlobalInterface&lt;/code&gt;, &lt;code&gt;ModuleConfigInterface&lt;/code&gt;, &lt;code&gt;ModuleDataFixInterface&lt;/code&gt;, &lt;code&gt;ModuleListInterface&lt;/code&gt;, &lt;code&gt;ModuleTabInterface&lt;/code&gt;, &lt;code&gt;SettingInterface&lt;/code&gt; — &lt;code&gt;LinkEnhancerModule.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;SettingInterface&lt;/code&gt; — &lt;code&gt;SettingInterface.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;LinkEnhancerUtils&lt;/code&gt; — &lt;code&gt;LinkEnhancerUtils.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;LinkEnhancerModuleExt&lt;/code&gt; extends &lt;code&gt;LinkEnhancerModule&lt;/code&gt; implements &lt;code&gt;ModuleExtGlobalInterface&lt;/code&gt; — &lt;code&gt;LinkEnhancerModuleExt.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="commonmark-extensions"&gt;CommonMark (Extensions)&lt;a class="td-heading-self-link" href="#commonmark-extensions" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;LeImageRenderer&lt;/code&gt; (final) implements &lt;code&gt;NodeRendererInterface&lt;/code&gt;, &lt;code&gt;XmlNodeRendererInterface&lt;/code&gt;, &lt;code&gt;ConfigurationAwareInterface&lt;/code&gt; — &lt;code&gt;CommonMark/LeImageRenderer.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;SmartPunctHelper&lt;/code&gt; — &lt;code&gt;CommonMark/SmartPunctHelper.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;LeTableOfContentsRenderer&lt;/code&gt; (final) implements &lt;code&gt;NodeRendererInterface&lt;/code&gt;, &lt;code&gt;XmlNodeRendererInterface&lt;/code&gt; — &lt;code&gt;CommonMark/LeTableOfContentsRenderer.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="factories"&gt;Factories&lt;a class="td-heading-self-link" href="#factories" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;CustomMarkdownFactory&lt;/code&gt; extends &lt;code&gt;MarkdownFactory&lt;/code&gt; — &lt;code&gt;Factories/CustomMarkdownFactory.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="request-handler"&gt;Request-Handler&lt;a class="td-heading-self-link" href="#request-handler" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;DataFixBlocksAction&lt;/code&gt; implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/DataFixBlocksAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;HelpWthbAction&lt;/code&gt; implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/HelpWthbAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XrefDetailData&lt;/code&gt; (final) implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/XrefDetailData.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XrefOverviewListData&lt;/code&gt; (final) implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/XrefOverviewListData.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GotoIdTreeAction&lt;/code&gt; extends &lt;code&gt;GotoIdAction&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/GotoIdTreeAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GotoUidTreeAction&lt;/code&gt; extends &lt;code&gt;GotoUidAction&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/GotoUidTreeAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GotoXrefAction&lt;/code&gt; implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/GotoXrefAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DataFixRebuildIndexAction&lt;/code&gt; implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/DataFixRebuildIndexAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;RenumberActionHandler&lt;/code&gt; (final) — &lt;code&gt;Http/RequestHandlers/RenumberActionHandler.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;HelpMdAction&lt;/code&gt; implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/HelpMdAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AdminXrefOverviewData&lt;/code&gt; (final) implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/AdminXrefOverviewData.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GotoIdAction&lt;/code&gt; extends &lt;code&gt;AbstractGotoAction&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/GotoIdAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;HelpWtCoreAction&lt;/code&gt; implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/HelpWtCoreAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WthbAdminHandler&lt;/code&gt; (final) — &lt;code&gt;Http/RequestHandlers/WthbAdminHandler.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GotoUidAction&lt;/code&gt; extends &lt;code&gt;AbstractGotoAction&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/GotoUidAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AbstractGotoAction&lt;/code&gt; (abstract) implements &lt;code&gt;RequestHandlerInterface&lt;/code&gt; — &lt;code&gt;Http/RequestHandlers/AbstractGotoAction.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="schema"&gt;Schema&lt;a class="td-heading-self-link" href="#schema" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;SeedHelpTable&lt;/code&gt; implements &lt;code&gt;SeedInterface&lt;/code&gt; — &lt;code&gt;Schema/SeedHelpTable.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration6&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration6.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration2&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration2.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration7&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration7.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration3&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration3.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration4&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration4.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration1&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration1.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration5&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration5.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Migration0&lt;/code&gt; implements &lt;code&gt;MigrationInterface&lt;/code&gt; — &lt;code&gt;Schema/Migration0.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="services"&gt;Services&lt;a class="td-heading-self-link" href="#services" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;AdminSettingsBuilder&lt;/code&gt; (final) — &lt;code&gt;Services/AdminSettingsBuilder.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;MarkdownEditorActivationService&lt;/code&gt; (final) — &lt;code&gt;Services/MarkdownEditorActivationService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;IndexRebuildScheduler&lt;/code&gt; (final) — &lt;code&gt;Services/IndexRebuildScheduler.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;UidTagCollector&lt;/code&gt; (final) — &lt;code&gt;Services/UidTagCollector.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;TextTagCollector&lt;/code&gt; (final) — &lt;code&gt;Services/TextTagCollector.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ContentBuilder&lt;/code&gt; (final) — &lt;code&gt;Services/ContentBuilder.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;RenumberWithLinksService&lt;/code&gt; (final) — &lt;code&gt;Services/RenumberWithLinksService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DataFiles&lt;/code&gt; (final) — &lt;code&gt;Services/DataFiles.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XrefOverviewColumns&lt;/code&gt; (final) — &lt;code&gt;Services/XrefOverviewColumns.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;LinkIndexService&lt;/code&gt; (final) — &lt;code&gt;Services/LinkIndexService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XrefsService&lt;/code&gt; (final) — &lt;code&gt;Services/XrefsService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XrefDetailService&lt;/code&gt; (final) — &lt;code&gt;Services/XrefDetailService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WthbService&lt;/code&gt; — &lt;code&gt;Services/WthbService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;IdResolver&lt;/code&gt; (final) — &lt;code&gt;Services/IdResolver.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;LinkRenderer&lt;/code&gt; (final) — &lt;code&gt;Services/LinkRenderer.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WthbTocService&lt;/code&gt; (final) — &lt;code&gt;Services/WthbTocService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;UidIndexService&lt;/code&gt; (final) — &lt;code&gt;Services/UidIndexService.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="datafix"&gt;DataFix&lt;a class="td-heading-self-link" href="#datafix" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;FixHandlerInterface&lt;/code&gt; — &lt;code&gt;DataFix/FixHandlerInterface.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DataFixDispatcher&lt;/code&gt; — &lt;code&gt;DataFix/DataFixDispatcher.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;TreeLookupTrait&lt;/code&gt; — &lt;code&gt;DataFix/TreeLookupTrait.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DanglingLinksFix&lt;/code&gt; (final) implements &lt;code&gt;FixHandlerInterface&lt;/code&gt; — &lt;code&gt;DataFix/Handlers/DanglingLinksFix.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DuplicateUidFix&lt;/code&gt; (final) implements &lt;code&gt;FixHandlerInterface&lt;/code&gt; — &lt;code&gt;DataFix/Handlers/DuplicateUidFix.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WtTypeFix&lt;/code&gt; (final) implements &lt;code&gt;FixHandlerInterface&lt;/code&gt; — &lt;code&gt;DataFix/Handlers/WtTypeFix.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XrefUidSwapFix&lt;/code&gt; (final) implements &lt;code&gt;FixHandlerInterface&lt;/code&gt; — &lt;code&gt;DataFix/Handlers/XrefUidSwapFix.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AmbiguousUidFix&lt;/code&gt; (final) implements &lt;code&gt;FixHandlerInterface&lt;/code&gt; — &lt;code&gt;DataFix/Handlers/AmbiguousUidFix.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Entwicklungsumgebung</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/dev-environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/dev-environment/</guid><description>&lt;p&gt;Was man zum Bauen und Testen des Moduls lokal braucht.&lt;/p&gt;&#10;&lt;h2 id="voraussetzungen"&gt;Voraussetzungen&lt;a class="td-heading-self-link" href="#voraussetzungen" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Komponente&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Version&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Hinweise&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PHP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8.3+&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dieselbe Version, mit der die webtrees-Instanz läuft&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Composer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;installiert &lt;code&gt;wt-shared-libs&lt;/code&gt; + &lt;code&gt;phpstan&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Node.js&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;18+ (LTS)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;für Gulp / Rollup / Mocha&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;webtrees&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.2.x oder 2.3.x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nötig für PHPStan (&lt;code&gt;app/&lt;/code&gt;-Klassen) und die Smoke-Tests&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/wt-shared-libs/"&gt;wt-shared-libs&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;neueste Version&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Schwester-Repo unter &lt;code&gt;modules_v4/wt-shared-libs&lt;/code&gt; (Composer-Path-Repo)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="lage"&gt;Lage&lt;a class="td-heading-self-link" href="#lage" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Das Modul liegt innerhalb einer webtrees-Installation unter &lt;code&gt;modules_v4/linkenhancer/&lt;/code&gt;. Sein &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/composer.json" target="_blank" rel="noopener"&gt;&lt;code&gt;composer.json&lt;/code&gt;&lt;/a&gt;&#10; zieht die Schwester-Bibliothek als lokales Path-Repository ein:&lt;/p&gt;</description></item><item><title>Build-System</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/build-system/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/build-system/</guid><description>&lt;p&gt;Bundling, Übersetzungs-Kompilierung und Versionierung werden über &lt;a href="https://gulpjs.com/"&gt;&lt;strong&gt;Gulp&lt;/strong&gt;&lt;/a&gt;-Tasks in &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/gulpfile.mjs" target="_blank" rel="noopener"&gt;&lt;code&gt;gulpfile.mjs&lt;/code&gt;&lt;/a&gt;&#10; gesteuert, aufgerufen mit &lt;code&gt;npx gulp &amp;lt;task&amp;gt;&lt;/code&gt;. Die &lt;code&gt;npm run *&lt;/code&gt;-Skripte decken nur das Testing ab — siehe die Seite &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/testing/"&gt;Testing&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="tasks"&gt;Tasks&lt;a class="td-heading-self-link" href="#tasks" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Task&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Befehl&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Wirkung&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;build&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp build&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;clean&lt;/code&gt; → JS (&lt;a href="https://rollupjs.org/"&gt;Rollup&lt;/a&gt;) + CSS (&lt;a href="https://postcss.org/"&gt;PostCSS&lt;/a&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;devbuild&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp devbuild&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;wie &lt;code&gt;build&lt;/code&gt;, aber Dev-Mode (kein Minify, SourceMaps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;updatepo&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp updatepo&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;führt &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/update-po-files.sh" target="_blank" rel="noopener"&gt;&lt;code&gt;update-po-files.sh&lt;/code&gt;&lt;/a&gt;&#10; aus → &lt;code&gt;xgettext&lt;/code&gt; über &lt;code&gt;src/&lt;/code&gt; → &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/resources/lang/messages.pot" target="_blank" rel="noopener"&gt;&lt;code&gt;messages.pot&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;po2php&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp po2php&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kompiliert &lt;code&gt;resources/lang/*.po&lt;/code&gt; → &lt;code&gt;resources/lang/*.php&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;syncversion&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp syncversion&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;hält &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/latest-version.txt" target="_blank" rel="noopener"&gt;&lt;code&gt;latest-version.txt&lt;/code&gt;&lt;/a&gt;&#10; ↔ &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/src/LinkEnhancerModule.php" target="_blank" rel="noopener"&gt;&lt;code&gt;LinkEnhancerModule.php&lt;/code&gt;&lt;/a&gt;&#10; synchron&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;bumpversion&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp bumpversion&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;erfordert einen sauberen git-Tree → Version-Bump → &lt;code&gt;syncversion&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;archive&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp archive&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;build&lt;/code&gt; + &lt;code&gt;po2php&lt;/code&gt; + &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/create-archive.sh" target="_blank" rel="noopener"&gt;&lt;code&gt;create-archive.sh&lt;/code&gt;&lt;/a&gt;&#10; (Release-ZIP)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;forgejo:issue-refs&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;npx gulp forgejo:issue-refs[:dry]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ergänzt Issue-Referenzen in Commit-Messages (braucht &lt;code&gt;FORGEJO_TOKEN&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt;) - wurde nur einmalig angewendet für die Übernahme des Repos von GitHub zu Codeberg&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="js--css-bundling"&gt;JS / CSS Bundling&lt;a class="td-heading-self-link" href="#js--css-bundling" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;build&lt;/code&gt; = &lt;code&gt;clean&lt;/code&gt; → (parallel) JS + CSS.&lt;/p&gt;</description></item><item><title>Übersetzungs-Pipeline</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/translation-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/translation-pipeline/</guid><description>&lt;p&gt;Das Modul bringt seine eigenen Übersetzungen über die Standard-gettext-Kette ein, gehostet auf &lt;a href="https://translate.codeberg.org/projects/wt-modules/linkenhancer/"&gt;&lt;strong&gt;Codeberg Weblate&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="ablauf"&gt;Ablauf&lt;a class="td-heading-self-link" href="#ablauf" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&#10;&#10;&#10;&lt;pre class="mermaid"&gt;flowchart TB&#10; subgraph Extraction[&amp;#34;1️⃣ Quellcode → POT&amp;#34;]&#10; direction LR&#10; PHP[&amp;#34;📝 src/*.php&amp;#34;] --&amp;gt;|npx gulp updatepo| POT[&amp;#34;📄 messages.pot&amp;#34;]&#10; end&#10;&#10; subgraph Translation[&amp;#34;2️⃣ Übersetzung&amp;#34;]&#10; direction LR&#10; WEBLATE[&amp;#34;🌐 Weblate&amp;#34;] --&amp;gt;|download| PO[&amp;#34;🗝 &amp;lt;lang&amp;gt;.po&amp;#34;]&#10; end&#10;&#10; subgraph Rendering[&amp;#34;3️⃣ Webtrees&amp;#34;]&#10; direction LR&#10; PHPARR[&amp;#34;📦 lang.php&amp;#34;] --&amp;gt;|I18N| RENDER[&amp;#34;✅ Rendering&amp;#34;]&#10; end&#10;&#10; POT --&amp;gt;|upload| Translation&#10; PO --&amp;gt;|npx gulp po2php| Rendering&#10;&#10; classDef sourceStyle fill:#e3f2fd,stroke:#1565C0,stroke-width:2px&#10; classDef fileStyle fill:#e8f5e9,stroke:#2E7D32,stroke-width:2px&#10; classDef weblateStyle fill:#f3e5f5,stroke:#7B1FA2,stroke-width:2px&#10; classDef renderStyle fill:#fce4ec,stroke:#C2185B,stroke-width:2px&#10;&#10; class PHP sourceStyle&#10; class POT,PO,PHPARR fileStyle&#10; class WEBLATE weblateStyle&#10; class RENDER renderStyle&#10;&lt;/pre&gt;&#10;&lt;h2 id="strings-extrahieren"&gt;Strings extrahieren&lt;a class="td-heading-self-link" href="#strings-extrahieren" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/update-po-files.sh" target="_blank" rel="noopener"&gt;&lt;code&gt;update-po-files.sh&lt;/code&gt;&lt;/a&gt;&#10; führt &lt;code&gt;xgettext&lt;/code&gt; über jede &lt;code&gt;*.php&lt;/code&gt; / &lt;code&gt;*.phtml&lt;/code&gt; aus, außer &lt;code&gt;util/&lt;/code&gt;, &lt;code&gt;vendor/&lt;/code&gt;, &lt;code&gt;node_modules/&lt;/code&gt; und &lt;code&gt;tests/&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>WTHB-TOC-Language-Pipeline</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/wthb-toc-lang/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/wthb-toc-lang/</guid><description>&lt;h2 id="überblick"&gt;Überblick&lt;a class="td-heading-self-link" href="#%c3%bcberblick" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Das Paket &lt;strong&gt;&lt;code&gt;linkenhancer-wthb-toc-lang&lt;/code&gt;&lt;/strong&gt; stellt das Inhaltsverzeichnis (TOC) des deutschen webtrees-Handbuchs — samt Übersetzungen — der &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/features/wthb/"&gt;WTHB-Hilfefunktion&lt;/a&gt; zur Verfügung. Die Produktion ist ein &lt;strong&gt;Rundlauf&lt;/strong&gt;, der komplett außerhalb der webtrees-Installation läuft: Er liest das Handbuch von &lt;strong&gt;GenWiki&lt;/strong&gt;, erzeugt das TOC neu, schreibt das Ergebnis als &lt;strong&gt;MediaWiki-Template&lt;/strong&gt; zurück nach GenWiki und — parallel — die strukturierten Daten in ein &lt;strong&gt;externes Codeberg-Repo&lt;/strong&gt;, das &lt;strong&gt;Codeberg Pages&lt;/strong&gt;, &lt;strong&gt;Weblate&lt;/strong&gt; (Übersetzungen) und schließlich das &lt;strong&gt;Modul&lt;/strong&gt; versorgt. Diese Seite dokumentiert die &lt;em&gt;Produktionsseite&lt;/em&gt;; die &lt;em&gt;Konsumenten-Seite&lt;/em&gt; (Cache, CLI, Rendering) steht auf der &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/features/wthb/"&gt;WTHB-Funktionsseite&lt;/a&gt; und der Seite &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/cli-scripts/"&gt;CLI-Skripte&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Testing</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/testing/</guid><description>&lt;p&gt;Die komplette Kette läuft mit:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm &lt;span style="color:#91d7e3"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das führt &lt;code&gt;test:php&lt;/code&gt; → &lt;code&gt;analyse:php&lt;/code&gt; → &lt;code&gt;test:js&lt;/code&gt; aus, wobei jeder Schritt bestehen muss, bevor der nächste läuft.&lt;/p&gt;&#10;&lt;h2 id="javascript-mocha--jsdom"&gt;JavaScript (Mocha + jsdom)&lt;a class="td-heading-self-link" href="#javascript-mocha--jsdom" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run test:js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e738d;font-style:italic"&gt;# mocha &amp;#39;resources/js/tests/**/*.test.js&amp;#39; --require jsdom-global/register&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="php-standalone-unit-tests"&gt;PHP-Standalone-Unit-Tests&lt;a class="td-heading-self-link" href="#php-standalone-unit-tests" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run test:php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e738d;font-style:italic"&gt;# führt jedes tests/test-*.php mit dem System-PHP aus — ohne webtrees, ohne DB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Test&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Abgedeckt&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-text-tag-collector.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-text-tag-collector.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Text-Tag-Collector&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-link-classifier.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-link-classifier.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Link-Klassifizierer (inkl. Ziel-Extraktion)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-uid-tag-collector.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-uid-tag-collector.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;UID-Tag-Collector&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-uid-index-service.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-uid-index-service.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;UID-Index-Service&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-i18n-mark.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-i18n-mark.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;i18n-Marker&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/tests/test-wthb-toc-service.php" target="_blank" rel="noopener"&gt;&lt;code&gt;test-wthb-toc-service.php&lt;/code&gt;&lt;/a&gt;&#10;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WTHB-TOC-Service&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="php-statische-analyse"&gt;PHP-Statische Analyse&lt;a class="td-heading-self-link" href="#php-statische-analyse" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run analyse:php &lt;span style="color:#6e738d;font-style:italic"&gt;# oder: composer analyse&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e738d;font-style:italic"&gt;# PHPStan Level 6 — siehe die PHPStan-Seite&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="smoke-tests-brauchen-webtrees--db"&gt;Smoke-Tests (brauchen webtrees + DB)&lt;a class="td-heading-self-link" href="#smoke-tests-brauchen-webtrees--db" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Diese üben eine echte Installation und sind &lt;strong&gt;nicht&lt;/strong&gt; Teil von &lt;code&gt;npm test&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>PHPStan</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/phpstan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/phpstan/</guid><description>&lt;p&gt;Benötigt wird: &lt;a href="https://phpstan.org/"&gt;PHPstan&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Die statische Analyse ist über &lt;code&gt;phpstan.neon&lt;/code&gt; konfiguriert (Level 6, Baseline in &lt;code&gt;phpstan-baseline.neon&lt;/code&gt;).&lt;/p&gt;&#10;&lt;h3 id="ausführen"&gt;Ausführen&lt;a class="td-heading-self-link" href="#ausf%c3%bchren" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;composer analyse&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Analyse benötigt eine webtrees-Installation (für die &lt;code&gt;app/&lt;/code&gt;-Klassen + &lt;code&gt;vendor/autoload.php&lt;/code&gt;). Ausführen vom bind-mounted-Pfad:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#91d7e3"&gt;cd&lt;/span&gt; /path/to/webtrees/modules_v4/linkenhancer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;composer analyse&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="konfiguration"&gt;Konfiguration&lt;a class="td-heading-self-link" href="#konfiguration" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Level&lt;/strong&gt;: 6&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Baseline&lt;/strong&gt;: &lt;code&gt;phpstan-baseline.neon&lt;/code&gt; (bekannte Probleme)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bootstrap&lt;/strong&gt;: &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/phpstan-bootstrap.php" target="_blank" rel="noopener"&gt;&lt;code&gt;phpstan-bootstrap.php&lt;/code&gt;&lt;/a&gt;&#10; registriert die PSR-4-Namespaces direkt (umgeht den versionsgeprüften Autoloader in &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/wt-shared-libs/"&gt;&lt;code&gt;wt-shared-libs&lt;/code&gt;&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Scan-Verzeichnisse&lt;/strong&gt;: &lt;code&gt;../../app/&lt;/code&gt; (webtrees-Core-Klassen)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ausgeschlossene Pfade&lt;/strong&gt;: &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/src/LinkEnhancerModuleExt.php" target="_blank" rel="noopener"&gt;&lt;code&gt;LinkEnhancerModuleExt.php&lt;/code&gt;&lt;/a&gt;&#10; (Verwendung im Zusammenhang mit &lt;a href="https://github.com/vesta-webtrees-2-custom-modules"&gt;Vesta-Modulen&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Speichergrenze&lt;/strong&gt;: 1G&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Parallel&lt;/strong&gt;: deaktiviert (Single-Prozess, zuverlässiger in CI)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="wichtige-einstellungen"&gt;Wichtige Einstellungen&lt;a class="td-heading-self-link" href="#wichtige-einstellungen" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;treatPhpDocTypesAsCertain: false&lt;/code&gt; — verhindert False Positives aus &lt;code&gt;@var&lt;/code&gt;-Assertions&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ignoreErrors&lt;/code&gt; für:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;AccessLevel&lt;/code&gt; Enum (nur-Klasse in WT 2.3, in der 2.2-Laufzeit nicht verfügbar)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DB::prefix('')&lt;/code&gt; — beabsichtigt (Präfix ohne Identifier holen)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="baseline-neu-generieren"&gt;Baseline neu generieren&lt;a class="td-heading-self-link" href="#baseline-neu-generieren" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Nach beabsichtigten Änderungen, die neue (akzeptable) Fehler einführen:&lt;/p&gt;</description></item><item><title>Release</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/release/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/linkenhancer/dev/release/</guid><description>&lt;h2 id="schritte"&gt;Schritte&lt;a class="td-heading-self-link" href="#schritte" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e738d;font-style:italic"&gt;# 1. Version erhöhen (erfordert einen sauberen git-Tree)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx gulp bumpversion&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e738d;font-style:italic"&gt;# 2. Build + Übersetzungen kompilieren + Release-Archiv erstellen&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx gulp archive&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="was-archive-tut"&gt;Was &lt;code&gt;archive&lt;/code&gt; tut&lt;a class="td-heading-self-link" href="#was-archive-tut" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;npx gulp archive&lt;/code&gt; führt &lt;code&gt;build&lt;/code&gt; → &lt;code&gt;po2php&lt;/code&gt; → &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/create-archive.sh" target="_blank" rel="noopener"&gt;&lt;code&gt;create-archive.sh&lt;/code&gt;&lt;/a&gt;&#10; aus. Das Skript:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Liest die Version aus &lt;a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/latest-version.txt" target="_blank" rel="noopener"&gt;&lt;code&gt;latest-version.txt&lt;/code&gt;&lt;/a&gt;&#10;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;rsync&lt;/code&gt; das Modul nach &lt;code&gt;dist/linkenhancer/&lt;/code&gt; und schließt alles aus, das nicht ausgeliefert wird (unten).&lt;/li&gt;&#10;&lt;li&gt;Erzeugt &lt;code&gt;dist/linkenhancer_v&amp;lt;version&amp;gt;.zip&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="aus-dem-archiv-ausgeschlossen"&gt;Aus dem Archiv ausgeschlossen&lt;a class="td-heading-self-link" href="#aus-dem-archiv-ausgeschlossen" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;create-archive.sh&lt;/code&gt; lässt unter anderem aus: &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;.git*&lt;/code&gt;, &lt;code&gt;gulpfile.mjs&lt;/code&gt;, &lt;code&gt;package*.json&lt;/code&gt;, &lt;code&gt;phpstan*&lt;/code&gt;, &lt;code&gt;tests/&lt;/code&gt;, die &lt;code&gt;util/*&lt;/code&gt;-Buildskripte, &lt;code&gt;resources/js/src&lt;/code&gt;, &lt;code&gt;resources/js/tests&lt;/code&gt;, &lt;code&gt;resources/img/&lt;/code&gt;, &lt;code&gt;resources/lang/*.po&lt;/code&gt; / &lt;code&gt;*.mo&lt;/code&gt; und &lt;code&gt;.env&lt;/code&gt;. Ausgeliefert werden nur die gebauten &lt;code&gt;bundle*&lt;/code&gt;-JS/CSS, die kompilierten &lt;code&gt;resources/lang/*.php&lt;/code&gt;, &lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;resources/views/&lt;/code&gt;, &lt;code&gt;resources/css/&lt;/code&gt; und die Modul-Entry-Dateien.&lt;/p&gt;</description></item></channel></rss>