.. _developer:
=========
Developer
=========
.. _developer-request-flow:
Request flow
============
The extension adds three PSR-15 middlewares to the frontend stack. No route
enhancer is involved: the middlewares answer the text files themselves and
remove ``.md`` before TYPO3 routes the request.
.. code-block:: text
request
├─ woit/si-llms-txt/markdown-suffix before typo3/cms-frontend/site
├─ typo3/cms-frontend/site
├─ woit/si-llms-txt/llms-txt before typo3/cms-frontend/base-redirect-resolver
├─ … page-resolver, prepare-tsfe-rendering, shortcut redirect
├─ woit/si-llms-txt/markdown-render after prepare-tsfe-rendering
└─ rendering
.. list-table::
:header-rows: 1
:widths: 30 70
* - Middleware
- Task
* - ``MarkdownSuffixMiddleware``
- ``/de/page.md`` → routes ``/de/page`` and sets the request attribute
``sillmstxt.markdown``. Responses without Markdown become a plain
404; redirects keep the ``.md`` suffix.
* - ``LlmsTxtMiddleware``
- Answers :file:`llms.txt` / :file:`llms-full.txt` for the site root
and every language base.
* - ``MarkdownRenderMiddleware``
- Uses the page field "LLM Markdown" or lets the page render and
converts the HTML. For the EXT:news detail page it takes the
news record (see :ref:`news`).
For normal HTML requests each middleware only compares a string and passes
the request on.
The event listener ``AddMarkdownAlternateLink``
(``AfterCacheableContentIsGeneratedEvent``) adds the ````
and ```` tags when a page is rendered; the result is
part of the page cache. The HTTP ``Link`` header with the same relations is
added by ``MarkdownRenderMiddleware`` on every request (see
:ref:`endpoints-discovery`).
.. _developer-classes:
Classes
=======
.. list-table::
:header-rows: 1
:widths: 30 70
* - Class
- Purpose
* - ``Service\LlmsTxtBuilder``
- Builds :file:`llms.txt`, :file:`llms-full.txt` and the frontmatter
of page and news documents; caching
* - ``Service\PageCollector``
- Walks the page tree, language overlay (strict)
* - ``Service\NewsCollector``
- News records of EXT:news (optional)
* - ``Service\MarkdownConverter``
- HTML → Markdown with league/html-to-markdown; removes navigation,
breadcrumbs, asides, forms, buttons, scripts, decorative images
and links without text; accordion titles and ````
become h3 headings; keeps button titles in headings; resolves
lazy-loaded images; moves card links onto their heading; makes
links absolute
* - ``Service\DiscoveryLinks``
- ``alternate`` and ``describedby`` links of a page, as HTML tags or
HTTP ``Link`` header
* - ``Service\MarkdownUrl``
- Page URL ↔ ``.md`` URL
* - ``Service\SiteConfig``
- Site set active? Settings, included page types
.. _developer-caching:
Caching
=======
* Cache ``sillmstxt`` (database backend, group ``pages``)
* Entries for :file:`llms.txt` and :file:`llms-full.txt` per site language
* Tags: ``pageId_`` of every listed page and the root page;
with EXT:news also ``tx_news``, ``tx_news_pid_``, ``tx_news_uid_``
* The intro of the language is part of the cache identifier
* :file:`llms-full.txt` with pages that could not be fetched is kept for
5 minutes only
* ``.md`` documents are not cached separately: the HTML comes from the page
cache, only the conversion runs per request
.. _developer-database:
Database
========
.. code-block:: sql
:caption: ext_tables.sql
CREATE TABLE pages (
tx_sillmstxt_exclude smallint(5) unsigned DEFAULT '0' NOT NULL,
tx_sillmstxt_priority int(11) DEFAULT '0' NOT NULL,
tx_sillmstxt_description text,
tx_sillmstxt_markdown mediumtext
);
``tx_sillmstxt_exclude`` and ``tx_sillmstxt_priority`` use
``l10n_mode = exclude`` (same value in all languages).