+12








fcd7c979df
Co-authored-by: Artur <145776561+arturict@users.noreply.github.com> Co-authored-by: arturict <arturict@users.noreply.github.com> Co-authored-by: Thomas <thomas@ajnart.fr> Co-authored-by: Afonso Jorge Ramos <afonsojorgeramos@gmail.com> Co-authored-by: Danura30082 <danura30082+github@gmail.com> Co-authored-by: Kushie <122986913+kushiemoon-dev@users.noreply.github.com> Co-authored-by: ajnart <thomas@ajnart.fr> Co-authored-by: ajnart <thomas@ajnart.dev> Co-authored-by: chenjun <chenjun@foxmail.com> Co-authored-by: Wikibear <wikibear@users.noreply.github.com> Co-authored-by: Bergasha <bergasha@gmail.com> Co-authored-by: leafyelin <43306196+leafyelin@users.noreply.github.com> Co-authored-by: Lucas Araujo <lucas.lra@gmail.com> Co-authored-by: GreenMonito <86085570+GreenMonito@users.noreply.github.com> Co-authored-by: Nerdy-Technician <roffo@nerdy-technician.social> Co-authored-by: Jun <34545896+jcstrong@users.noreply.github.com> Co-authored-by: Edmond Abraham <54119952+gitedmond@users.noreply.github.com> Co-authored-by: thrawnx <tight.bulb9384@fastmail.com> Co-authored-by: Chris <58918656+nordada@users.noreply.github.com> Co-authored-by: yi111 <153097222+Yi-111-a@users.noreply.github.com> Co-authored-by: Yanis <naamaneyanis@gmail.com> Co-authored-by: Wikibear <me@sej.de> Co-authored-by: alessiottavo <93441886+alessiottavo@users.noreply.github.com>
67 lines
2.0 KiB
TypeScript
67 lines
2.0 KiB
TypeScript
import { getSafeApplicationUrl } from "../common/application-url";
|
|
|
|
export const directBookmarkPrefix = "url:";
|
|
|
|
export interface BookmarkItem {
|
|
id: string;
|
|
name: string;
|
|
description: string | null;
|
|
iconUrl?: string;
|
|
href: string | null;
|
|
}
|
|
|
|
export const normalizeBookmarkUrl = (value: string): string | undefined => {
|
|
const trimmedValue = value.trim();
|
|
if (trimmedValue.length === 0) return undefined;
|
|
|
|
const directUrl = getSafeApplicationUrl(trimmedValue);
|
|
if (directUrl) return directUrl;
|
|
|
|
if (/^(?:localhost(?::\d+)?|(?:[\w-]+\.)+[\w-]+(?::\d+)?)(?:[/?#].*)?$/i.test(trimmedValue)) {
|
|
return getSafeApplicationUrl(`https://${trimmedValue}`);
|
|
}
|
|
|
|
return undefined;
|
|
};
|
|
|
|
export const getDirectBookmarkValue = (url: string) => `${directBookmarkPrefix}${url}`;
|
|
|
|
export const getDirectBookmarkUrl = (value: string): string | undefined => {
|
|
if (!value.startsWith(directBookmarkPrefix)) return undefined;
|
|
return normalizeBookmarkUrl(value.slice(directBookmarkPrefix.length));
|
|
};
|
|
|
|
export const getBookmarkFaviconUrl = (href: string | null): string | undefined => {
|
|
const safeUrl = getSafeApplicationUrl(href);
|
|
if (!safeUrl) return undefined;
|
|
|
|
const url = new URL(safeUrl);
|
|
return `${url.origin}/favicon.ico`;
|
|
};
|
|
|
|
export const createDirectBookmark = (url: string): BookmarkItem | undefined => {
|
|
const href = normalizeBookmarkUrl(url);
|
|
if (!href) return undefined;
|
|
|
|
const parsedUrl = new URL(href);
|
|
return {
|
|
id: getDirectBookmarkValue(href),
|
|
name: parsedUrl.hostname,
|
|
description: null,
|
|
href,
|
|
};
|
|
};
|
|
|
|
export const splitBookmarkUrls = (value: string) =>
|
|
value.split(/\r?\n+/).flatMap((line) => {
|
|
const trimmedLine = line.trim();
|
|
if (trimmedLine.length === 0) return [];
|
|
|
|
const commaSeparatedValues = trimmedLine.split(",").map((part) => part.trim());
|
|
if (commaSeparatedValues.length > 1 && commaSeparatedValues.every((part) => normalizeBookmarkUrl(part))) {
|
|
return commaSeparatedValues;
|
|
}
|
|
|
|
return [trimmedLine];
|
|
});
|