2023-01-13 13:40:33 +09:00
|
|
|
import * as mfm from "mfm-js";
|
|
|
|
import { unique } from "@/scripts/array";
|
2021-04-02 10:36:11 +09:00
|
|
|
|
|
|
|
// unique without hash
|
|
|
|
// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
|
2023-01-13 13:40:33 +09:00
|
|
|
const removeHash = (x: string) => x.replace(/#[^#]*$/, "");
|
2021-04-02 10:36:11 +09:00
|
|
|
|
2023-01-13 13:40:33 +09:00
|
|
|
export function extractUrlFromMfm(
|
|
|
|
nodes: mfm.MfmNode[],
|
|
|
|
respectSilentFlag = true,
|
|
|
|
): string[] {
|
2021-04-11 00:18:29 +09:00
|
|
|
const urlNodes = mfm.extract(nodes, (node) => {
|
2023-01-13 13:40:33 +09:00
|
|
|
return (
|
|
|
|
node.type === "url" ||
|
2023-01-17 04:19:20 +09:00
|
|
|
(node.type === "link" && !(respectSilentFlag && node.props.silent))
|
2023-01-13 13:40:33 +09:00
|
|
|
);
|
2021-04-10 17:50:18 +09:00
|
|
|
});
|
2023-01-13 13:40:33 +09:00
|
|
|
const urls: string[] = unique(urlNodes.map((x) => x.props.url));
|
2021-04-02 10:36:11 +09:00
|
|
|
|
|
|
|
return urls.reduce((array, url) => {
|
2021-04-10 17:50:18 +09:00
|
|
|
const urlWithoutHash = removeHash(url);
|
2023-01-13 13:40:33 +09:00
|
|
|
if (!array.map((x) => removeHash(x)).includes(urlWithoutHash))
|
|
|
|
array.push(url);
|
2021-04-02 10:36:11 +09:00
|
|
|
return array;
|
|
|
|
}, [] as string[]);
|
|
|
|
}
|