Port templates to NodeBB 4.14 benchpress escaping (#19)
NodeBB 4.14 turned on real HTML escaping for single-brace template interpolations (4.13 used an identity escape). This ports raw-HTML output to the double-brace forms ({{helper(...)}}, {{txEscape(content)}}, {{tx(name)}}), mirroring the harmony 2.2.72 -> 3.0.15 and core 4.13.2 -> 4.14.0 template diffs. Fixes the escaped-markup breakage on westgate.pw after the 2026.07.11-1 deploy.
Verified on a fresh 4.14.0 dev stack: no escaped tags on /, /categories, /category/2, /topic/1, /search; contract tests pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: vickydotbat <vickydotbat@tutamail.com>
Reviewed-on: #19
Reviewed-by: xtul <mpiasecki720@protonmail.com>
Co-authored-by: gitea-bot <gitea-bot@noreply.git.westgate.pw>
Co-committed-by: gitea-bot <gitea-bot@noreply.git.westgate.pw>
This commit was merged in pull request #19.
This commit is contained in:
@@ -6,10 +6,10 @@
|
||||
<div class="category-header d-flex flex-column gap-2">
|
||||
<div class="d-flex gap-3 align-items-center mb-1 {{{ if config.theme.centerHeaderElements }}}justify-content-center flex-column{{{ end }}}">
|
||||
<div class="westgate-category-header-icon flex-shrink-0 {./class}">
|
||||
{buildCategoryIcon(@value, "60px", "rounded-1")}
|
||||
{{buildCategoryIcon(@value, "60px", "rounded-1")}}
|
||||
</div>
|
||||
<div class="d-flex flex-column gap-1">
|
||||
<h1 class="tracking-tight fs-3 fw-semibold mb-0">{./name}</h1>
|
||||
<h1 class="tracking-tight fs-3 fw-semibold mb-0">{{tx(./name)}}</h1>
|
||||
<div class="d-flex flex-wrap gap-2 align-items-center {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
|
||||
<span class="badge text-body border border-gray-300 stats text-xs">
|
||||
<span title="{formattedNumber(totalTopicCount)}" class="fw-bold">{humanReadableNumber(totalTopicCount)}</span>
|
||||
@@ -33,7 +33,7 @@
|
||||
</div>
|
||||
{{{ if ./descriptionParsed }}}
|
||||
<div class="description text-secondary text-sm lh-sm w-100 {{{ if config.theme.centerHeaderElements }}}text-center{{{ end }}} line-clamp-4 clamp-fade-sm-4">
|
||||
{./descriptionParsed}
|
||||
{{./descriptionParsed}}
|
||||
</div>
|
||||
{{{ end }}}
|
||||
{{{ if ./handleFull }}}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
{{{ end }}}
|
||||
</td>
|
||||
<td style="padding: 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; line-height: 16px; color: #3a3340;">
|
||||
<p style="margin: 0;"><a style="text-decoration:none !important; text-decoration:none; color: #a8893f;" href="{notifications.notification_url}">{notifications.bodyShort}</a></p>
|
||||
<p style="margin: 0;"><a style="text-decoration:none !important; text-decoration:none; color: #a8893f;" href="{notifications.notification_url}">{{notifications.bodyShort}}</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -73,7 +73,7 @@
|
||||
<li style="text-decoration: none; list-style-type: none; padding-bottom: 0.5em;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 32px; vertical-align: middle;">{renderDigestAvatar(@value)}</td>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 32px; vertical-align: middle;">{{renderDigestAvatar(@value)}}</td>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; line-height: 16px; color: #3a3340;">
|
||||
<p style="margin: 0;"><a style="text-decoration:none !important; text-decoration:none; color: #a8893f;" href="{url}/topic/{topTopics.slug}"><strong>{topTopics.title}</strong></a></p>
|
||||
<p style="margin: 0; font-size: 12px;"><a style="text-decoration:none !important; text-decoration:none; color: #9a9086; line-height: 16px;" href="{url}/uid/{topTopics.teaser.user.uid}"><strong>{topTopics.teaser.user.displayname}</strong></a></p>
|
||||
@@ -108,7 +108,7 @@
|
||||
<li style="text-decoration: none; list-style-type: none; padding-bottom: 0.5em;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 32px; vertical-align: middle;">{renderDigestAvatar(@value)}</td>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 32px; vertical-align: middle;">{{renderDigestAvatar(@value)}}</td>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; line-height: 16px; color: #3a3340;">
|
||||
<p style="margin: 0;"><a style="text-decoration:none !important; text-decoration:none; color: #a8893f;" href="{url}/topic/{popularTopics.slug}"><strong>{popularTopics.title}</strong></a></p>
|
||||
<p style="margin: 0; font-size: 12px;"><a style="text-decoration:none !important; text-decoration:none; color: #9a9086; line-height: 16px;" href="{url}/uid/{popularTopics.teaser.user.uid}"><strong>{popularTopics.teaser.user.displayname}</strong></a></p>
|
||||
@@ -143,7 +143,7 @@
|
||||
<li style="text-decoration: none; list-style-type: none; padding-bottom: 0.5em;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 32px; vertical-align: middle;">{renderDigestAvatar(@value)}</td>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 32px; vertical-align: middle;">{{renderDigestAvatar(@value)}}</td>
|
||||
<td style="padding: 6px 16px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; line-height: 16px; color: #3a3340;">
|
||||
<p style="margin: 0;"><a style="text-decoration:none !important; text-decoration:none; color: #a8893f;" href="{url}/topic/{recent.slug}"><strong>{recent.title}</strong></a></p>
|
||||
<p style="margin: 0; font-size: 12px;"><a style="text-decoration:none !important; text-decoration:none; color: #9a9086; line-height: 16px;" href="{url}/uid/{recent.teaser.user.uid}"><strong>{recent.teaser.user.displayname}</strong></a></p>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<tr class="notification-body">
|
||||
<td style="padding: 20px 40px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; font-size: 15px; line-height: 20px; color: #3a3340;">
|
||||
<p style="margin: 0; padding: 6px 0px; font-family: Jost, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; font-size: 13px; line-height: 26px; color: #3a3340;">
|
||||
{body}
|
||||
{{txEscape(body)}}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
<p><strong>[[post-queue:category]]</strong></p>
|
||||
<p><a href="{category.url}" style="color: #a8893f;">{category.name}</a></p>
|
||||
<p><a href="{notification.category.url}" style="color: #a8893f;">{{tx(notification.category.name)}}</a></p>
|
||||
<p>
|
||||
<strong
|
||||
>{{{ if topic.tid }}}[[post-queue:topic]]{{{ else }}}[[post-queue:title]]{{{
|
||||
>{{{ if notification.topic.tid }}}[[post-queue:topic]]{{{ else }}}[[post-queue:title]]{{{
|
||||
end }}}</strong
|
||||
>
|
||||
</p>
|
||||
<p>
|
||||
{{{ if topic.url }}}<a href="{topic.url}" style="color: #a8893f;">{topic.title}</a>{{{ else
|
||||
}}}{topic.title}{{{ end }}}
|
||||
{{{ if notification.topic.url }}}<a href="{notification.topic.url}" style="color: #a8893f;">{notification.topic.title}</a>{{{ else
|
||||
}}}{notification.topic.title}{{{ end }}}
|
||||
</p>
|
||||
<p><strong>[[post-queue:user]]</strong></p>
|
||||
<p>
|
||||
{{{ if user.url }}}<a href="{user.url}" style="color: #a8893f;">{user.username}</a>{{{ else
|
||||
}}}{user.username}{{{ end }}}
|
||||
{{{ if notification.user.url }}}<a href="{notification.user.url}" style="color: #a8893f;">{notification.user.username}</a>{{{ else
|
||||
}}}{notification.user.username}{{{ end }}}
|
||||
</p>
|
||||
<p style="color: #3a3340;">{content}</p>
|
||||
<p style="color: #3a3340;">{{txEscape(notification.content)}}</p>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
|
||||
<html lang="{localeToHTML(userLang, defaultLang)}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
|
||||
<head>
|
||||
<title>{browserTitle}</title>
|
||||
{{{each metaTags}}}{function.buildMetaTag}{{{end}}}
|
||||
{{{each metaTags}}}{{buildMetaTag(@value)}}{{{end}}}
|
||||
<link rel="stylesheet" type="text/css" href="{relative_path}/assets/client{{{if bootswatchSkin}}}-{bootswatchSkin}{{{end}}}{{{ if (languageDirection=="rtl") }}}-rtl{{{ end }}}.css?{config.cache-buster}" />
|
||||
{{{each linkTags}}}{function.buildLinkTag}{{{end}}}
|
||||
{{{each linkTags}}}{{buildLinkTag(@value)}}{{{end}}}
|
||||
|
||||
<script>
|
||||
var config = JSON.parse('{{configJSON}}');
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{{{ if !./isSection }}}
|
||||
<li data-cid="{./cid}" class="category-children-item small {./class}">
|
||||
<div class="westgate-category-child d-flex gap-1">
|
||||
{buildCategoryIcon(@value, "18px", "westgate-child-icon rounded-1")}
|
||||
{{buildCategoryIcon(@value, "18px", "westgate-child-icon rounded-1")}}
|
||||
<a href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" class="text-reset fw-semibold flex-1">{./name}</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<div class="d-flex col-lg-7 gap-2 gap-lg-3">
|
||||
<div class="flex-shrink-0">
|
||||
{buildCategoryIcon(@value, "40px", "rounded-1")}
|
||||
{{buildCategoryIcon(@value, "40px", "rounded-1")}}
|
||||
</div>
|
||||
<div class="flex-grow-1 d-flex flex-wrap gap-1 me-0 me-lg-2">
|
||||
<h2 class="title text-break fs-4 fw-semibold m-0 tracking-tight w-100">
|
||||
@@ -11,7 +11,7 @@
|
||||
</h2>
|
||||
{{{ if ./descriptionParsed }}}
|
||||
<div class="description text-muted text-sm w-100 line-clamp-sm-5">
|
||||
{./descriptionParsed}
|
||||
{{./descriptionParsed}}
|
||||
</div>
|
||||
{{{ end }}}
|
||||
{{{ if !./link }}}
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
{{{ if @first }}}
|
||||
<div component="category/posts" class="ps-2 text-xs d-flex flex-column h-100 gap-1">
|
||||
<div class="text-nowrap text-truncate">
|
||||
<a class="text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "18px", true)}</a>
|
||||
<a class="text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(posts.user, "18px", true)}}</a>
|
||||
<a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" title="{./timestampISO}" aria-label="[[global:lastpost]]"></a>
|
||||
</div>
|
||||
<div class="post-content text-xs text-break line-clamp-sm-2 lh-sm position-relative flex-fill">
|
||||
<a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" aria-label="[[global:lastpost]]"></a>
|
||||
{./content}
|
||||
{{txEscape(./content)}}
|
||||
</div>
|
||||
</div>
|
||||
{{{ end }}}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<span component="category-selector-selected" class="fw-semibold">
|
||||
{{{ if (selectedCategory && !showCategorySelectLabel) }}}
|
||||
<span class="category-item d-inline-flex align-items-center gap-1 {{{ if selectedCategory.class }}}{selectedCategory.class}{{{ end }}}">
|
||||
{buildCategoryIcon(selectedCategory, "24px", "rounded-circle")}
|
||||
<span class="category-name">{selectedCategory.name}</span>
|
||||
{{buildCategoryIcon(selectedCategory, "24px", "rounded-circle")}}
|
||||
<span class="category-name">{{tx(selectedCategory.name)}}</span>
|
||||
</span>
|
||||
{{{ else }}}
|
||||
<i class="fa fa-fw {{{ if selectCategoryIcon }}}{selectCategoryIcon}{{{ else }}}fa-list{{{ end }}} text-primary"></i>
|
||||
@@ -27,9 +27,9 @@
|
||||
<span component="category-markup" style="{{{ if ./match }}}font-weight: bold;{{{end}}}">
|
||||
<span class="category-item d-inline-flex align-items-center gap-1 {{{ if ./class }}}{./class}{{{ end }}}">
|
||||
{{{ if ./icon }}}
|
||||
{buildCategoryIcon(@value, "24px", "rounded-circle")}
|
||||
{{buildCategoryIcon(@value, "24px", "rounded-circle")}}
|
||||
{{{ end }}}
|
||||
<span class="category-name">{./name}</span>
|
||||
<span class="category-name">{{tx(./name)}}</span>
|
||||
</span>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -9,17 +9,17 @@
|
||||
<ul id="main-nav" class="wg-topbar__nav-list list-unstyled d-flex align-items-center mb-0">
|
||||
{{{ each navigation }}}
|
||||
{{{ if displayMenuItem(@root, @index) }}}
|
||||
<li class="nav-item {./class}{{{ if ./dropdown }}} dropdown{{{ end }}}" title="{./title}">
|
||||
<a class="nav-link navigation-link wg-topbar__nav-link d-flex gap-2 align-items-center {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}} {{{ if ./text }}}aria-label="{./text}"{{{ end }}}>
|
||||
<li class="nav-item {./class}{{{ if ./dropdown }}} dropdown{{{ end }}}" title="{tx(./title)}">
|
||||
<a class="nav-link navigation-link wg-topbar__nav-link d-flex gap-2 align-items-center {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}} {{{ if ./text }}}aria-label="{tx(./text)}"{{{ end }}}>
|
||||
{{{ if ./iconClass }}}
|
||||
<i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
|
||||
{{{ end }}}
|
||||
{{{ if ./text }}}<span class="nav-text text-truncate {./textClass}">{./text}</span>{{{ end }}}
|
||||
{{{ if ./text }}}<span class="nav-text text-truncate {./textClass}">{{tx(./text)}}</span>{{{ end }}}
|
||||
<span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
||||
</a>
|
||||
{{{ if ./dropdown }}}
|
||||
<ul class="dropdown-menu wg-topbar__dropdown p-1 shadow" role="menu">
|
||||
{./dropdownContent}
|
||||
{{./dropdownContent}}
|
||||
</ul>
|
||||
{{{ end }}}
|
||||
</li>
|
||||
@@ -100,7 +100,7 @@
|
||||
{{{ if displayMenuItem(@root, @index) }}}
|
||||
<a class="wg-topbar__drawer-link {./class}" href="{./route}" {{{ if ./targetBlank }}}target="_blank"{{{ end }}}>
|
||||
{{{ if ./iconClass }}}<i class="fa fa-fw {./iconClass}" aria-hidden="true"></i>{{{ end }}}
|
||||
{{{ if ./text }}}<span class="{./textClass}">{./text}</span>{{{ end }}}
|
||||
{{{ if ./text }}}<span class="{./textClass}">{{tx(./text)}}</span>{{{ end }}}
|
||||
<span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
||||
</a>
|
||||
{{{ end }}}
|
||||
|
||||
@@ -7,18 +7,18 @@
|
||||
<div class="post-body d-flex flex-column gap-1 mb-2">
|
||||
<div class="d-flex gap-2 post-info text-sm align-items-center">
|
||||
<div class="post-author d-flex align-items-center gap-1">
|
||||
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
|
||||
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "16px", true, "not-responsive")}}</a>
|
||||
<a class="lh-1 fw-semibold" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
|
||||
</div>
|
||||
<span class="timeago text-muted lh-1" title="{./timestampISO}"></span>
|
||||
</div>
|
||||
|
||||
<div component="post/content" class="content text-sm text-break">
|
||||
{./content}
|
||||
{{{ if ./txContent }}}{{tx(./content)}}{{{ else }}}{{txEscape(./content)}}{{{ end }}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3 d-flex flex-wrap gap-1 w-100">
|
||||
{buildCategoryLabel(./category, "a", "border")}
|
||||
{{buildCategoryLabel(./category, "a", "border")}}
|
||||
<span data-tid="{./topic.tid}" component="topic/tags" class="lh-1 tag-list d-flex flex-wrap gap-1 {{{ if !./topic.tags.length }}}hidden{{{ end }}}">
|
||||
{{{ each ./topic.tags }}}
|
||||
<a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
</a>
|
||||
<div class="d-flex gap-2 post-info px-2 text-xs">
|
||||
<div class="category-item d-inline-block ff-secondary">
|
||||
{buildCategoryLabel(posts.category, "span")}
|
||||
{{buildCategoryLabel(posts.category, "span")}}
|
||||
</div>
|
||||
<span class="timeago text-muted" title="{posts.timestampISO}"></span>
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<div class="post-body d-flex flex-column gap-1">
|
||||
<div class="d-flex gap-3 post-info">
|
||||
<div class="post-author d-flex gap-1">
|
||||
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
|
||||
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "16px", true, "not-responsive")}}</a>
|
||||
<a class="fw-semibold text-sm" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
|
||||
</div>
|
||||
<span class="timeago text-sm text-muted" title="{./timestampISO}"></span>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<ul component="category" class="topics-list westgate-topics-list list-unstyled" itemscope itemtype="http://www.schema.org/ItemList" data-nextstart="{nextStart}" data-set="{set}">
|
||||
|
||||
{{{ each topics }}}
|
||||
<li component="category/topic" class="westgate-topic-row category-item hover-parent d-flex flex-column flex-lg-row align-items-start {function.generateTopicClass}" <!-- IMPORT partials/data/category.tpl -->>
|
||||
<li component="category/topic" class="westgate-topic-row category-item hover-parent d-flex flex-column flex-lg-row align-items-start {generateTopicClass(@value)}" <!-- IMPORT partials/data/category.tpl -->>
|
||||
<link itemprop="url" content="{config.relative_path}/topic/{./slug}" />
|
||||
<meta itemprop="name" content="{function.stripTags, ./title}" />
|
||||
<meta itemprop="name" content="{./title}" />
|
||||
<meta itemprop="itemListOrder" content="descending" />
|
||||
<meta itemprop="position" content="{increment(./index, "1")}" />
|
||||
<a id="{./index}" data-index="{./index}" component="topic/anchor"></a>
|
||||
@@ -11,7 +11,7 @@
|
||||
<div class="d-flex p-0 col-12 col-lg-7 gap-2 gap-lg-3 pe-2 align-items-start {{{ if config.theme.mobileTopicTeasers }}}mb-2 mb-lg-0{{{ end }}}">
|
||||
<div class="flex-shrink-0 position-relative">
|
||||
<a class="d-inline-block text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
|
||||
{buildAvatar(./user, "40px", true)}
|
||||
{{buildAvatar(./user, "40px", true)}}
|
||||
</a>
|
||||
{{{ if showSelect }}}
|
||||
<div class="checkbox position-absolute top-100 start-50 translate-middle-x pt-2 m-0 d-none d-lg-flex" style="max-width:max-content">
|
||||
@@ -51,7 +51,7 @@
|
||||
{{{each ./icons}}}<span class="lh-1">{@value}</span>{{{end}}}
|
||||
|
||||
{{{ if (!template.category || (cid != ./cid)) }}}
|
||||
{buildCategoryLabel(./category, "a", "border")}
|
||||
{{buildCategoryLabel(./category, "a", "border")}}
|
||||
{{{ end }}}
|
||||
|
||||
<span data-tid="{./tid}" component="topic/tags" class="lh-1 tag-list d-flex flex-wrap gap-1 {{{ if !./tags.length }}}hidden{{{ end }}}">
|
||||
@@ -114,12 +114,12 @@
|
||||
{{{ else }}}
|
||||
{{{ if ./teaser.pid }}}
|
||||
<div class="ps-2">
|
||||
<a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{buildAvatar(./teaser.user, "18px", true)}</a>
|
||||
<a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{{buildAvatar(./teaser.user, "18px", true)}}</a>
|
||||
<a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}" aria-label="[[global:lastpost]]"></a>
|
||||
</div>
|
||||
<div class="post-content text-xs ps-2 line-clamp-sm-2 lh-sm text-break position-relative flex-fill">
|
||||
<a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" aria-label="[[global:lastpost]]"></a>
|
||||
{./teaser.content}
|
||||
{{txEscape(./teaser.content)}}
|
||||
</div>
|
||||
{{{ end }}}
|
||||
{{{ end }}}
|
||||
|
||||
Reference in New Issue
Block a user