<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Developer on wt-modules</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/</link><description>Recent content in Developer on wt-modules</description><generator>Hugo</generator><language>en</language><atom:link href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI Scripts</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/cli-scripts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/cli-scripts/</guid><description>&lt;p&gt;The module ships CLI-only scripts. They are guarded: requested over HTTP (the &lt;code&gt;modules_v4&lt;/code&gt; directory is inside the web root) they answer &lt;code&gt;403&lt;/code&gt; instead of running.&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;Script&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Purpose&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Needs a webtrees install + 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;build/update the link index for the XREF overview&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yes&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;build/update the UID index for UID lookup&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yes&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;refresh the WTHB table of contents cache (&lt;a href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/wthb-toc-lang/"&gt;production&lt;/a&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yes&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;standalone unit tests for the text-tag collector&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;no&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;standalone unit tests for the link classifier (incl. target extraction)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;no&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;standalone unit tests for the UID tag collector&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;no&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;standalone unit tests for the UID index service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;no&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;scan records containing enhanced links, print every captured value&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yes&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 for Migration5 (UID index schema)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yes&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 measurement for the XREF overview&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;yes&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Run them from the webtrees root with the &lt;strong&gt;same PHP version&lt;/strong&gt; the instance runs on (webtrees requires PHP 8.3+):&lt;/p&gt;</description></item><item><title>Contributing</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/contributing/</guid><description>&lt;p&gt;If you&amp;rsquo;d like to contribute to this module, great! You can contribute by:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Contributing code&lt;/strong&gt; — check out the &lt;a href="https://codeberg.org/bschwede/linkenhancer/issues"&gt;issues&lt;/a&gt; for things that need attention. If you have changes you want to make not listed in an issue, please create one, then you can link your pull request.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt; — it&amp;rsquo;s all manual currently, please &lt;a href="https://codeberg.org/bschwede/linkenhancer/issues"&gt;create an issue&lt;/a&gt; for any bugs you find.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="translation"&gt;Translation&lt;a class="td-heading-self-link" href="#translation" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;You can contribute to this project on &lt;a href="https://translate.codeberg.org/projects/linkenhancer/"&gt;Codeberg Weblate&lt;/a&gt;. Updated translations will be included in the next release of this module.&lt;/p&gt;</description></item><item><title>Project Structure</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/project-structure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/project-structure/</guid><description>&lt;h2 id="directory-layout"&gt;Directory layout&lt;a class="td-heading-self-link" href="#directory-layout" 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 ← cronjob self-registration manifest&#10;├── latest-version.txt ← current version (synced to LinkEnhancerModule.php)&#10;├── composer.json ← PHP deps (wt-shared-libs, phpstan)&#10;├── package.json ← JS deps (gulp, rollup, mocha)&#10;├── gulpfile.mjs ← build tasks&#10;├── phpstan.neon ← static analysis config&#10;├── phpstan-bootstrap.php ← PSR-4 bootstrap for PHPStan&#10;├── phpstan-baseline.neon ← known issues&#10;├── src/ ← PHP (PSR-4)&#10;│ ├── LinkEnhancerModule.php&#10;│ ├── LinkEnhancerModuleExt.php&#10;│ ├── LinkEnhancerUtils.php&#10;│ ├── SettingInterface.php&#10;│ ├── CommonMark/ ← CommonMark extensions&#10;│ ├── DataFix/ ← data-fix handlers + dispatcher&#10;│ ├── Factories/ ← CustomMarkdownFactory&#10;│ ├── Http/ ← request handlers&#10;│ ├── Schema/ ← Migrations + SeedHelpTable&#10;│ └── Services/ ← business logic&#10;├── resources/&#10;│ ├── js/ ← JS source (src/) + build output (bundle-*)&#10;│ ├── css/ ← CSS source + build output&#10;│ ├── lang/ ← .pot / .po / .php (translations)&#10;│ ├── views/ ← PHTML views&#10;│ └── img/ ← screenshots&#10;├── cli/ ← CLI maintenance scripts&#10;├── tests/ ← standalone + smoke tests&#10;└── util/ ← build/maintenance shell scripts&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dependencies"&gt;Dependencies&lt;a class="td-heading-self-link" href="#dependencies" 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;) and&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/phpstan/"&gt;&lt;code&gt;phpstan&lt;/code&gt;&lt;/a&gt; (dev).&lt;/li&gt;&#10;&lt;li&gt;Conflicts with:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;webtrees &amp;lt;2.2&lt;/code&gt; and&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;runtime dependency &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="database-schema"&gt;Database schema&lt;a class="td-heading-self-link" href="#database-schema" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The module owns five tables (prefix &lt;code&gt;le_&lt;/code&gt;), created incrementally by &lt;code&gt;src/Schema/Migration#.php&lt;/code&gt;. Every migration is additive and idempotent, so the schema converges on each module load.&lt;/p&gt;</description></item><item><title>Class Hierarchy</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/class-hierarchy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/class-hierarchy/</guid><description>&lt;p&gt;&lt;em&gt;Auto-generated by &lt;code&gt;docs/tools/generate-class-hierarchy.php&lt;/code&gt; — do not edit manually.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="module"&gt;Module&lt;a class="td-heading-self-link" href="#module" 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-handlers"&gt;Request Handlers&lt;a class="td-heading-self-link" href="#request-handlers" 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>Development Environment</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/dev-environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/dev-environment/</guid><description>&lt;p&gt;What you need to build and test the module locally.&lt;/p&gt;&#10;&lt;h2 id="requirements"&gt;Requirements&lt;a class="td-heading-self-link" href="#requirements" 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;Component&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;Notes&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;same version the webtrees instance runs on&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;installs &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;for 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 or 2.3.x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;needed for PHPStan (&lt;code&gt;app/&lt;/code&gt; classes) and the 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/en/docs/wt-shared-libs/"&gt;wt-shared-libs&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;newest version&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sibling repo at &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="location"&gt;Location&lt;a class="td-heading-self-link" href="#location" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The module lives inside a webtrees installation at &lt;code&gt;modules_v4/linkenhancer/&lt;/code&gt;. Its &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; pulls in the sibling shared library as a local path repository:&lt;/p&gt;</description></item><item><title>Build System</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/build-system/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/build-system/</guid><description>&lt;p&gt;Bundling, translation compilation and versioning are driven by &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;, invoked with &lt;code&gt;npx gulp &amp;lt;task&amp;gt;&lt;/code&gt;. The &lt;code&gt;npm run *&lt;/code&gt; scripts cover testing only — see the &lt;a href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/testing/"&gt;Testing&lt;/a&gt; page.&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;Command&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;What it does&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;like &lt;code&gt;build&lt;/code&gt;, but Dev-Mode (no minify, source maps)&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;runs &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; → &lt;code&gt;xgettext&lt;/code&gt; over &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;compiles &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;keeps &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; in sync&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;requires a clean 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;adds issue refs to commit messages (needs &lt;code&gt;FORGEJO_TOKEN&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt;) - was used only once to migrate the repo from GitHub to 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; → (in parallel) JS + CSS.&lt;/p&gt;</description></item><item><title>Translation Pipeline</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/translation-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/translation-pipeline/</guid><description>&lt;p&gt;The module ships its own translations through the standard gettext chain, hosted on &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="flow"&gt;Flow&lt;a class="td-heading-self-link" href="#flow" 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️⃣ Code → 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️⃣ Translation&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;✅ Render&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="extracting-strings"&gt;Extracting strings&lt;a class="td-heading-self-link" href="#extracting-strings" 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; runs &lt;code&gt;xgettext&lt;/code&gt; over every &lt;code&gt;*.php&lt;/code&gt; / &lt;code&gt;*.phtml&lt;/code&gt; except &lt;code&gt;util/&lt;/code&gt;, &lt;code&gt;vendor/&lt;/code&gt;, &lt;code&gt;node_modules/&lt;/code&gt; and &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/en/docs/linkenhancer/dev/wthb-toc-lang/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/wthb-toc-lang/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;a class="td-heading-self-link" href="#overview" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;&lt;code&gt;linkenhancer-wthb-toc-lang&lt;/code&gt;&lt;/strong&gt; package delivers the table of contents (TOC) of the German webtrees manual — and its translations — to the &lt;a href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/features/wthb/"&gt;WTHB help feature&lt;/a&gt;. Its production is a &lt;strong&gt;round trip&lt;/strong&gt; that lives entirely outside the webtrees install: it reads the manual from &lt;strong&gt;GenWiki&lt;/strong&gt;, regenerates the TOC, writes the result back to GenWiki as a &lt;strong&gt;MediaWiki template&lt;/strong&gt;, and — in parallel — ships the structured data to an &lt;strong&gt;external Codeberg repo&lt;/strong&gt; that feeds &lt;strong&gt;Codeberg Pages&lt;/strong&gt;, &lt;strong&gt;Weblate&lt;/strong&gt; (translations) and, finally, the &lt;strong&gt;module&lt;/strong&gt;. This page documents the &lt;em&gt;production&lt;/em&gt; side; the &lt;em&gt;consumer&lt;/em&gt; side (cache, CLI, rendering) is covered on the &lt;a href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/features/wthb/"&gt;WTHB feature page&lt;/a&gt; and the &lt;a href="https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/cli-scripts/"&gt;CLI scripts&lt;/a&gt; page.&lt;/p&gt;</description></item><item><title>Testing</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/testing/</guid><description>&lt;p&gt;The full chain runs with:&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;which executes &lt;code&gt;test:php&lt;/code&gt; → &lt;code&gt;analyse:php&lt;/code&gt; → &lt;code&gt;test:js&lt;/code&gt;, each step required to pass before the next runs.&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;# runs every tests/test-*.php with the system PHP — no webtrees install, no 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;Covers&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 classifier (incl. target extraction)&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 markers&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-static-analysis"&gt;PHP static analysis&lt;a class="td-heading-self-link" href="#php-static-analysis" 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;# or: 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 — see the PHPStan page&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="smoke-tests-need-webtrees--db"&gt;Smoke tests (need webtrees + DB)&lt;a class="td-heading-self-link" href="#smoke-tests-need-webtrees--db" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;These exercise a real installation and are &lt;strong&gt;not&lt;/strong&gt; part of &lt;code&gt;npm test&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>PHPStan</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/phpstan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/phpstan/</guid><description>&lt;p&gt;Required: &lt;a href="https://phpstan.org/"&gt;PHPstan&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Static analysis is configured via &lt;code&gt;phpstan.neon&lt;/code&gt; (Level 6, baseline in &lt;code&gt;phpstan-baseline.neon&lt;/code&gt;).&lt;/p&gt;&#10;&lt;h3 id="run"&gt;Run&lt;a class="td-heading-self-link" href="#run" 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;The analysis requires a webtrees installation (for &lt;code&gt;app/&lt;/code&gt; classes + &lt;code&gt;vendor/autoload.php&lt;/code&gt;). Run it from the bind-mounted path:&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="configuration"&gt;Configuration&lt;a class="td-heading-self-link" href="#configuration" 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; (known issues)&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; registers PSR-4 namespaces directly (bypasses the version-gated autoloader in &lt;a href="https://bschwede.codeberg.page/wt-modules/en/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 directories&lt;/strong&gt;: &lt;code&gt;../../app/&lt;/code&gt; (webtrees core classes)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Exclude paths&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; (use in conjunction with &lt;a href="https://github.com/vesta-webtrees-2-custom-modules"&gt;Vesta modules&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Memory limit&lt;/strong&gt;: 1G&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Parallel&lt;/strong&gt;: disabled (single process, more reliable in CI)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="key-settings"&gt;Key settings&lt;a class="td-heading-self-link" href="#key-settings" 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; — prevents false positives from &lt;code&gt;@var&lt;/code&gt; assertions&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ignoreErrors&lt;/code&gt; for:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;AccessLevel&lt;/code&gt; Enum (WT 2.3-only class, not available in 2.2 runtime)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DB::prefix('')&lt;/code&gt; — intentional (getting prefix without identifier)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="regenerating-the-baseline"&gt;Regenerating the baseline&lt;a class="td-heading-self-link" href="#regenerating-the-baseline" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;After intentional changes that introduce new (acceptable) errors:&lt;/p&gt;</description></item><item><title>Releasing</title><link>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/release/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/en/docs/linkenhancer/dev/release/</guid><description>&lt;h2 id="steps"&gt;Steps&lt;a class="td-heading-self-link" href="#steps" 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. Bump the version (requires a clean 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 + compile translations + create the release archive&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="what-archive-does"&gt;What &lt;code&gt;archive&lt;/code&gt; does&lt;a class="td-heading-self-link" href="#what-archive-does" 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; runs &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;. The script:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Reads the version from &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;s the module into &lt;code&gt;dist/linkenhancer/&lt;/code&gt;, excluding everything that is not shipped (below).&lt;/li&gt;&#10;&lt;li&gt;Zips it to &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="excluded-from-the-archive"&gt;Excluded from the archive&lt;a class="td-heading-self-link" href="#excluded-from-the-archive" 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; drops, among others: &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;, the &lt;code&gt;util/*&lt;/code&gt; build scripts, &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;, and &lt;code&gt;.env&lt;/code&gt;. Only the built &lt;code&gt;bundle*&lt;/code&gt; JS/CSS, the compiled &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; and the module entry files are shipped.&lt;/p&gt;</description></item></channel></rss>