mdToHtml,
pictrsDeleteToast,
randomStr,
+ relTags,
setupTippy,
setupTribute,
toast,
href={markdownHelpUrl}
class="btn btn-sm text-muted font-weight-bold"
title={i18n.t("formatting_help")}
- rel="noopener"
+ rel={relTags}
>
<Icon icon="help-circle" classes="icon-inline" />
</a>
loading="lazy"
className={classNames({
"img-fluid": !this.props.icon && !this.props.iconOverlay,
- "banner": this.props.banner,
- "thumbnail rounded": this.props.thumbnail && !this.props.icon && !this.props.banner,
+ banner: this.props.banner,
+ "thumbnail rounded":
+ this.props.thumbnail && !this.props.icon && !this.props.banner,
"img-expanded slight-radius":
!this.props.thumbnail && !this.props.icon,
"img-blur": this.props.thumbnail && this.props.nsfw,
import { Component, linkEvent } from "inferno";
import { SortType } from "lemmy-js-client";
import { i18n } from "../../i18next";
-import { randomStr, sortingHelpUrl } from "../../utils";
+import { randomStr, relTags, sortingHelpUrl } from "../../utils";
import { Icon } from "./icon";
interface SortSelectProps {
<a
className="text-muted"
href={sortingHelpUrl}
- rel="noopener"
+ rel={relTags}
title={i18n.t("sorting_help")}
>
<Icon icon="help-circle" classes="icon-inline" />
import { Component } from "inferno";
import { Link } from "inferno-router";
import { CommunitySafe } from "lemmy-js-client";
-import { hostname, showAvatars } from "../../utils";
+import { hostname, relTags, showAvatars } from "../../utils";
import { PictrsImage } from "../common/pictrs-image";
interface CommunityLinkProps {
title={apubName}
className={`${this.props.muted ? "text-muted" : ""}`}
href={link}
+ rel={relTags}
>
{this.avatarAndName(displayName)}
</a>
getPageFromProps,
getSortTypeFromProps,
notifyPost,
+ relTags,
restoreScrollPosition,
saveCommentRes,
saveScrollPosition,
<span class="mr-2">
<SortSelect sort={this.state.sort} onChange={this.handleSortChange} />
</span>
- <a href={communityRss} title="RSS" rel="noopener">
+ <a href={communityRss} title="RSS" rel={relTags}>
<Icon icon="rss" classes="text-muted small" />
</a>
<link rel="alternate" type="application/atom+xml" href={communityRss} />
mdToHtml,
notifyPost,
numToSI,
+ relTags,
restoreScrollPosition,
saveCommentRes,
saveScrollPosition,
</span>
{this.state.listingType == ListingType.All && (
<>
- <a href={allRss} rel="noopener" title="RSS">
+ <a href={allRss} rel={relTags} title="RSS">
<Icon icon="rss" classes="text-muted small" />
</a>
<link rel="alternate" type="application/atom+xml" href={allRss} />
)}
{this.state.listingType == ListingType.Local && (
<>
- <a href={localRss} rel="noopener" title="RSS">
+ <a href={localRss} rel={relTags} title="RSS">
<Icon icon="rss" classes="text-muted small" />
</a>
<link rel="alternate" type="application/atom+xml" href={localRss} />
{UserService.Instance.myUserInfo &&
this.state.listingType == ListingType.Subscribed && (
<>
- <a href={frontRss} title="RSS" rel="noopener">
+ <a href={frontRss} title="RSS" rel={relTags}>
<Icon icon="rss" classes="text-muted small" />
</a>
<link
import { Component } from "inferno";
import { GetSiteResponse } from "lemmy-js-client";
import { i18n } from "../../i18next";
-import { setIsoData } from "../../utils";
+import { relTags, setIsoData } from "../../utils";
import { HtmlTags } from "../common/html-tags";
interface InstancesState {
<ul>
{items.map(i => (
<li>
- <a href={`https://${i}`} rel="noopener">
+ <a href={`https://${i}`} rel={relTags}>
{i}
</a>
</li>
editCommentRes,
fetchLimit,
isBrowser,
+ relTags,
saveCommentRes,
setIsoData,
setupTippy,
<h5 class="mb-2">
{i18n.t("inbox")}
<small>
- <a href={inboxRss} title="RSS" rel="noopener">
+ <a href={inboxRss} title="RSS" rel={relTags}>
<Icon icon="rss" classes="ml-2 text-muted small" />
</a>
<link
import { Component } from "inferno";
import { Link } from "inferno-router";
import { PersonSafe } from "lemmy-js-client";
-import { hostname, isCakeDay, showAvatars } from "../../utils";
+import { hostname, isCakeDay, relTags, showAvatars } from "../../utils";
import { PictrsImage } from "../common/pictrs-image";
import { CakeDay } from "./cake-day";
title={apubName}
className={this.props.muted ? "text-muted" : "text-info"}
href={link}
+ rel={relTags}
>
{this.avatarAndName(displayName)}
</a>
mdToHtml,
numToSI,
previewLines,
+ relTags,
restoreScrollPosition,
routeSortTypeToEnum,
saveCommentRes,
hideHot
hideMostComments
/>
- <a href={profileRss} rel="noopener" title="RSS">
+ <a href={profileRss} rel={relTags} title="RSS">
<Icon icon="rss" classes="text-muted small mx-2" />
</a>
<link rel="alternate" type="application/atom+xml" href={profileRss} />
className={`d-flex align-self-start btn btn-secondary mr-2 ${
!pv.person.matrix_user_id && "invisible"
}`}
- rel="noopener"
+ rel={relTags}
href={`https://matrix.to/#/${pv.person.matrix_user_id}`}
>
{i18n.t("send_secure_message")}
isBrowser,
personSelectName,
personToChoice,
+ relTags,
setIsoData,
setTheme,
setupTippy,
</div>
<div class="form-group row">
<label class="col-sm-5 col-form-label" htmlFor="matrix-user-id">
- <a href={elementUrl} rel="noopener">
+ <a href={elementUrl} rel={relTags}>
{i18n.t("matrix_user_id")}
</a>
</label>
import { Component, linkEvent } from "inferno";
import { Post } from "lemmy-js-client";
import { i18n } from "../../i18next";
+import { relTags } from "../../utils";
import { Icon } from "../common/icon";
interface MetadataCardProps {
<div class="card-body">
{post.name !== post.embed_title && [
<h5 class="card-title d-inline">
- <a class="text-body" href={post.url} rel="noopener">
+ <a class="text-body" href={post.url} rel={relTags}>
{post.embed_title}
</a>
</h5>,
<a
class="text-muted font-italic"
href={post.url}
- rel="noopener"
+ rel={relTags}
>
{new URL(post.url).hostname}
<Icon icon="external-link" classes="ml-1" />
isBrowser,
isImage,
pictrsDeleteToast,
+ relTags,
setupTippy,
toast,
validTitle,
this.state.postForm.url
)}`}
class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
- rel="noopener"
+ rel={relTags}
>
archive.org {i18n.t("archive_link")}
</a>
this.state.postForm.url
)}`}
class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
- rel="noopener"
+ rel={relTags}
>
ghostarchive.org {i18n.t("archive_link")}
</a>
this.state.postForm.url
)}`}
class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
- rel="noopener"
+ rel={relTags}
>
archive.today {i18n.t("archive_link")}
</a>
mdToHtml,
numToSI,
previewLines,
+ relTags,
setupTippy,
showScores,
wsClient,
<a
class="text-body d-inline-block position-relative mb-2"
href={post.url}
- rel="noopener"
+ rel={relTags}
title={post.url}
>
{this.imgThumb(this.imageSrc)}
className="text-body"
href={post.url}
title={post.url}
- rel="noopener"
+ rel={relTags}
>
<div class="thumbnail rounded bg-light d-flex justify-content-center">
<Icon icon="external-link" classes="d-flex align-items-center" />
className="text-muted font-italic"
href={post_view.post.url}
title={post_view.post.url}
- rel="noopener"
+ rel={relTags}
>
{hostname(post_view.post.url)}
</a>
className={!post.stickied ? "text-body" : "text-primary"}
href={post.url}
title={post.url}
- rel="noopener"
+ rel={relTags}
>
{post.name}
</a>
authField,
capitalizeFirstLetter,
isBrowser,
+ relTags,
setupTippy,
toast,
wsClient,
#
<a
class="alert-link"
- rel="noopener"
+ rel={relTags}
href="https://element.io/get-started"
>
#
export const fetchLimit = 20;
export const mentionDropdownFetchLimit = 10;
+export const relTags = "noopener nofollow";
+
export const themes = [
"litera",
"materia",