Add configurable file exclusion for Atom feeds

Replaces hardcoded script and style stripping with a substring-based
exclusion list defined in custom/config.ini. Excluded files continue
to render on actual web pages.
This commit is contained in:
Ruben 2026-05-10 21:27:22 +02:00
parent 0866fe93ba
commit a22281c896
3 changed files with 34 additions and 7 deletions

View file

@ -96,20 +96,30 @@ if (str_ends_with($ctx->requestPath, 'feed.xml')) {
$items = buildListItems($dir, $ctx, $metadata); $items = buildListItems($dir, $ctx, $metadata);
// Render full content for each item // Render full content for each item
// Load feed exclusion patterns from config (comma-separated substrings)
$customConfigPath = dirname(__DIR__) . '/custom/config.ini';
$feedConfig = file_exists($customConfigPath) ? (parse_ini_file($customConfigPath, true)['feed'] ?? []) : [];
$excludePatterns = array_map('trim', explode(',', $feedConfig['exclude_files'] ?? ''));
$excludePatterns = array_filter($excludePatterns);
foreach ($items as &$item) { foreach ($items as &$item) {
$item['content'] = ''; $item['content'] = '';
$itemMetadata = loadMetadata($item['dirPath']); $itemMetadata = loadMetadata($item['dirPath']);
getPluginManager()->loadPagePlugins($itemMetadata); getPluginManager()->loadPagePlugins($itemMetadata);
$contentFiles = findAllContentFiles($item['dirPath']); $contentFiles = findAllContentFiles($item['dirPath']);
foreach ($contentFiles as $file) { foreach ($contentFiles as $file) {
$item['content'] .= renderContentFile($file, $ctx); $basename = basename($file);
$excluded = false;
foreach ($excludePatterns as $pattern) {
if (str_contains($basename, $pattern)) {
$excluded = true;
break;
}
}
if (!$excluded) {
$item['content'] .= renderContentFile($file, $ctx);
}
} }
// Strip <script> and <style> blocks — not useful in feed readers
$stripped = preg_replace('#<script[^>]*>.*?</script>#is', '', $item['content']);
if ($stripped !== null) {
$stripped = preg_replace('#<style[^>]*>.*?</style>#is', '', $stripped);
}
$item['content'] = $stripped ?? $item['content'];
} }
unset($item); unset($item);

View file

@ -85,6 +85,18 @@ To disable all plugins, leave the value empty:
enabled = "" enabled = ""
``` ```
### `[feed]`
Exclude content files from Atom feed rendering. Files are matched by substring against their basename.
```ini
[feed]
exclude_files = "nyhetsbrev, petition-form"
```
Comma-separated substrings. `"nyhetsbrev"` excludes `20-nyhetsbrev.php`, `_35-nyhetsbrev.php` etc.
Excluded files still render on actual pages — only feed output is affected.
### Custom Sections ### Custom Sections
Add your own configuration sections for custom plugins: Add your own configuration sections for custom plugins:
@ -275,6 +287,7 @@ FolderWeb doesn't enforce a schema—you can add any sections and keys you need.
| `languages` | `default` | string | `"en"` | Default language code | | `languages` | `default` | string | `"en"` | Default language code |
| `languages` | `available` | string | `"en,no"` | Comma-separated language codes | | `languages` | `available` | string | `"en,no"` | Comma-separated language codes |
| `plugins` | `enabled` | string | `"languages"` | Comma-separated plugin names | | `plugins` | `enabled` | string | `"languages"` | Comma-separated plugin names |
| `feed` | `exclude_files` | string | `""` | Comma-separated substrings to exclude from feed rendering |
All other sections are custom and plugin-specific. All other sections are custom and plugin-specific.

View file

@ -208,6 +208,10 @@ feed = true
**Applies to:** List pages only (directories with subdirectories) **Applies to:** List pages only (directories with subdirectories)
**Effect:** Generates an Atom XML feed containing the full rendered content of each list item. Also adds an autodiscovery `<link>` tag in the HTML `<head>`. **Effect:** Generates an Atom XML feed containing the full rendered content of each list item. Also adds an autodiscovery `<link>` tag in the HTML `<head>`.
**Content inclusion:** By default, all content files in each item's directory are rendered into the feed entry. This includes `.md` files and `.php` templates — anything that would render on the actual page.
If certain files should be excluded from the feed (e.g., newsletter signup forms, interactive widgets), use the `[feed] exclude_files` config option in `custom/config.ini`. See [Configuration Reference → Feed](01-configuration.md#feed).
## Language-Specific Overrides ## Language-Specific Overrides
Add language-specific sections to override fields: Add language-specific sections to override fields: