mirror of
https://github.com/miniflux/v2.git
synced 2025-08-26 18:21:01 +00:00
When `target="_blank"` is used, it has the same effect than rel="noopener", so we can remove the latter. Moreover, since we're already setting `<meta name="referrer" content="no-referrer" />` in the `<head>`, there is no need to set it on every single link in the HTML, as we're rendering everything in the same origin. Note that we need to keep adding those in the sanitizer, the entry content HTML can be consumed by third-party clients via the Miniflux/GoogleReader/Fever API. See https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/noopener and https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Referrer-Policy#integration_with_html
102 lines
5.8 KiB
HTML
102 lines
5.8 KiB
HTML
{{ define "feed_list" }}
|
|
<div class="items">
|
|
{{ range .feeds }}
|
|
<article
|
|
class="item feed-item {{ if ne .ParsingErrorCount 0 }}feed-parsing-error{{ else if ne .UnreadCount 0 }}feed-has-unread{{ end }}"
|
|
aria-labelledby="feed-title-{{ .ID }} feed-entries-counter"
|
|
tabindex="-1"
|
|
>
|
|
<header class="item-header" dir="auto">
|
|
<h2 id="feed-title-{{ .ID }}" class="item-title">
|
|
<a href="{{ route "feedEntries" "feedID" .ID }}">
|
|
{{ if and (.Icon) (gt .Icon.IconID 0) }}
|
|
<img src="{{ route "feedIcon" "externalIconID" .Icon.ExternalIconID }}" width="16" height="16" loading="lazy" alt="">
|
|
{{ end }}
|
|
{{ if .Disabled }} 🚫 {{ end }}
|
|
{{ .Title }}
|
|
</a>
|
|
</h2>
|
|
<span id="feed-entries-counter" class="feed-entries-counter">
|
|
<span aria-hidden="true">(</span>
|
|
<span class="sr-only">{{ plural "page.unread_entry_count" .UnreadCount .UnreadCount }}</span>
|
|
<span aria-hidden="true">{{ .UnreadCount }} /</span>
|
|
<span class="sr-only">{{ plural "page.total_entry_count" .NumberOfVisibleEntries .NumberOfVisibleEntries }}</span>
|
|
<span aria-hidden="true">{{ .NumberOfVisibleEntries }} )</span>
|
|
</span>
|
|
<span class="category">
|
|
<a id="feed-category-{{ .ID }}"
|
|
href="{{ route "categoryEntries" "categoryID" .Category.ID }}"
|
|
aria-label="{{ t "page.category_label" .Category.Title }}"
|
|
>
|
|
{{ .Category.Title }}
|
|
</a>
|
|
</span>
|
|
</header>
|
|
<div class="item-meta">
|
|
<ul class="item-meta-info">
|
|
<li class="item-meta-info-site-url" dir="auto">
|
|
<a href="{{ .SiteURL | safeURL }}" title="{{ .SiteURL }}" {{ if $.user.OpenExternalLinksInNewTab }}target="_blank"{{ else }}rel="noopener"{{ end }} data-original-link="{{ $.user.MarkReadOnView }}">
|
|
{{ domain .SiteURL }}
|
|
</a>
|
|
</li>
|
|
<li class="item-meta-info-checked-at">
|
|
{{ t "page.feeds.last_check" }} <time datetime="{{ isodate .CheckedAt }}" title="{{ isodate .CheckedAt }}">{{ elapsed $.user.Timezone .CheckedAt }}</time>
|
|
</li>
|
|
{{ $nextCheckDuration := duration .NextCheckAt }}
|
|
{{ if ne $nextCheckDuration "" }}
|
|
<li class="item-meta-info-next-check-at">
|
|
{{ t "page.feeds.next_check" }} <time datetime="{{ isodate .NextCheckAt }}" title="{{ isodate .NextCheckAt }}">{{ $nextCheckDuration }}</time>
|
|
</li>
|
|
{{ end }}
|
|
</ul>
|
|
<ul class="item-meta-icons">
|
|
<li class="item-meta-icons-refresh">
|
|
<a href="{{ route "refreshFeed" "feedID" .ID }}" aria-describedby="feed-title-{{ .ID }}">
|
|
{{ icon "refresh" }}<span class="icon-label">{{ t "menu.refresh_feed" }}</span>
|
|
</a>
|
|
</li>
|
|
<li class="item-meta-icons-edit">
|
|
<a href="{{ route "editFeed" "feedID" .ID }}" aria-describedby="feed-title-{{ .ID }}">
|
|
{{ icon "edit" }}<span class="icon-label">{{ t "menu.edit_feed" }}</span>
|
|
</a>
|
|
</li>
|
|
<li class="item-meta-icons-remove">
|
|
<button
|
|
aria-describedby="feed-title-{{ .ID }}"
|
|
data-confirm="true"
|
|
data-label-question="{{ t "confirm.question" }}"
|
|
data-label-yes="{{ t "confirm.yes" }}"
|
|
data-label-no="{{ t "confirm.no" }}"
|
|
data-label-loading="{{ t "confirm.loading" }}"
|
|
{{ if $.categoryID }}
|
|
data-url="{{ route "removeCategoryFeed" "categoryID" $.categoryID "feedID" .ID }}"
|
|
{{ else }}
|
|
data-url="{{ route "removeFeed" "feedID" .ID }}"
|
|
{{ end }}>{{ icon "delete" }}<span class="icon-label">{{ t "action.remove" }}</span></button>
|
|
</li>
|
|
{{ if .UnreadCount }}
|
|
<li class="item-meta-icons-mark-as-read">
|
|
<button
|
|
aria-describedby="feed-title-{{ .ID }}"
|
|
data-confirm="true"
|
|
data-label-question="{{ t "confirm.question" }}"
|
|
data-label-yes="{{ t "confirm.yes" }}"
|
|
data-label-no="{{ t "confirm.no" }}"
|
|
data-label-loading="{{ t "confirm.loading" }}"
|
|
data-url="{{ route "markFeedAsRead" "feedID" .ID }}">
|
|
{{ icon "read" }}<span class="icon-label">{{ t "menu.mark_all_as_read" }}</span>
|
|
</button>
|
|
</li>
|
|
{{ end }}
|
|
</ul>
|
|
</div>
|
|
{{ if ne .ParsingErrorCount 0 }}
|
|
<div class="parsing-error">
|
|
<strong title="{{ .ParsingErrorMsg }}" class="parsing-error-count">{{ plural "page.feeds.error_count" .ParsingErrorCount .ParsingErrorCount }}</strong>
|
|
- <small class="parsing-error-message">{{ .ParsingErrorMsg }}</small>
|
|
</div>
|
|
{{ end }}
|
|
</article>
|
|
{{ end }}
|
|
</div>
|
|
{{ end }}
|