Johann150
288a194392
Some checks failed
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/lint-client Pipeline was successful
ci/woodpecker/push/lint-backend Pipeline was successful
ci/woodpecker/push/lint-foundkey-js Pipeline was successful
ci/woodpecker/push/lint-sw Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
ci/woodpecker/pr/lint-client Pipeline failed
ci/woodpecker/pr/lint-backend Pipeline failed
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/lint-sw Pipeline failed
ci/woodpecker/pr/lint-foundkey-js Pipeline was successful
ci/woodpecker/pr/test Pipeline failed
55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { toArray } from '@/prelude/array.js';
|
|
import { IObject, isHashtag, IApHashtag, isLink, ILink } from '../type.js';
|
|
|
|
export function extractApHashtags(tags: IObject | IObject[] | null | undefined) {
|
|
if (tags == null) return [];
|
|
|
|
const hashtags = extractApHashtagObjects(tags);
|
|
|
|
return hashtags.map(tag => {
|
|
const m = tag.name.match(/^#(.+)/);
|
|
return m ? m[1] : null;
|
|
}).filter((x): x is string => x != null);
|
|
}
|
|
|
|
export function extractApHashtagObjects(tags: IObject | IObject[] | null | undefined): IApHashtag[] {
|
|
if (tags == null) return [];
|
|
return toArray(tags).filter(isHashtag);
|
|
}
|
|
|
|
// implements FEP-e232: Object Links (2022-12-23 version)
|
|
export function extractQuoteUrl(tags: IObject | IObject[] | null | undefined): string | null {
|
|
if (tags == null) return null;
|
|
|
|
// filter out correct links
|
|
let quotes: ILink[] = toArray(tags)
|
|
.filter(isLink)
|
|
.filter(link =>
|
|
[
|
|
'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
|
|
'application/activity+json'
|
|
].includes(link.mediaType?.toLowerCase())
|
|
);
|
|
|
|
// sort quotes with the right rel first
|
|
function hasRel(link: ILink): boolean {
|
|
link.rel != null
|
|
&&
|
|
toArray(link.rel)
|
|
.includes('https://misskey-hub.net/ns#_misskey_quote')
|
|
}
|
|
quotes.sort((a, b) => {
|
|
return hasRel(b) - hasRel(a);
|
|
});
|
|
|
|
// deduplicate by href
|
|
quotes = quotes.filter((x, i, arr) => arr.findIndex(y => x.href === y.href) === i);
|
|
|
|
if (quotes.length === 0) return null;
|
|
|
|
// If there is more than one quote, we just pick the first/a random one.
|
|
// Note that links with the correct `rel` were sorted to the front above
|
|
// so they will be preferred.
|
|
return quotes[0].href;
|
|
}
|