feat: support <link rel=alternate type=application/activitypub+json> (#10)

* feat: support `<link rel=alternate type=application/activitypub+json>`

* Update index.ts

* build
This commit is contained in:
Kagami Sascha Rosylight 2023-07-20 08:36:26 +02:00 committed by GitHub
parent 77dd5654bb
commit 089a0ad8e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 46 additions and 0 deletions

View File

@ -165,6 +165,7 @@ export default async (_url, lang = null) => {
const favicon = $('link[rel="shortcut icon"]').attr('href') ||
$('link[rel="icon"]').attr('href') ||
'/favicon.ico';
const activityPub = $('link[rel="alternate"][type="application/activitypub+json"]').attr('href') || null;
const sensitive = $('.tweet').attr('data-possibly-sensitive') === 'true';
const find = async (path) => {
const target = new URL(path, url.href);
@ -201,5 +202,6 @@ export default async (_url, lang = null) => {
},
sitename: siteName || null,
sensitive,
activityPub,
};
};

View File

@ -40,5 +40,6 @@ export async function summarize(url) {
allow: playerUrl ? ['fullscreen', 'encrypted-media'] : [],
},
sitename: 'Amazon',
activityPub: null,
};
}

View File

@ -33,5 +33,6 @@ export async function summarize(url) {
allow: [],
},
sitename: 'Wikipedia',
activityPub: null,
};
}

4
built/summary.d.ts vendored
View File

@ -27,6 +27,10 @@ declare type Summary = {
* Possibly sensitive
*/
sensitive?: boolean;
/**
* The url of the ActivityPub representation of that web page
*/
activityPub: string | null;
};
export default Summary;
export declare type Player = {

View File

@ -203,6 +203,9 @@ export default async (_url: URL | string, lang: string | null = null): Promise<S
$('link[rel="icon"]').attr('href') ||
'/favicon.ico';
const activityPub =
$('link[rel="alternate"][type="application/activitypub+json"]').attr('href') || null;
const sensitive = $('.tweet').attr('data-possibly-sensitive') === 'true'
const find = async (path: string) => {
@ -244,5 +247,6 @@ export default async (_url: URL | string, lang: string | null = null): Promise<S
},
sitename: siteName || null,
sensitive,
activityPub,
};
};

View File

@ -55,5 +55,6 @@ export async function summarize(url: URL): Promise<summary> {
allow: playerUrl ? ['fullscreen', 'encrypted-media'] : [],
},
sitename: 'Amazon',
activityPub: null,
};
}

View File

@ -42,5 +42,6 @@ export async function summarize(url: URL): Promise<summary> {
allow: [],
},
sitename: 'Wikipedia',
activityPub: null,
};
}

View File

@ -33,6 +33,11 @@ type Summary = {
* Possibly sensitive
*/
sensitive?: boolean;
/**
* The url of the ActivityPub representation of that web page
*/
activityPub: string | null;
};
export default Summary;

View File

@ -0,0 +1,3 @@
<!DOCTYPE html>
<meta charset="utf-8">
<link rel="alternate" type="application/activitypub+json" href="https://misskey.test/notes/abcdefg">

View File

@ -369,3 +369,27 @@ describe("oEmbed", () => {
expect(summary.player.height).toBe(300);
});
});
describe('ActivityPub', () => {
test('Basic', async () => {
app = fastify();
app.get('*', (request, reply) => {
return reply.send(fs.createReadStream(_dirname + '/htmls/activitypub.html'));
});
await app.listen({ port });
const summary = await summaly(host);
expect(summary.activityPub).toBe('https://misskey.test/notes/abcdefg');
});
test('Null', async () => {
app = fastify();
app.get('*', (request, reply) => {
return reply.send(fs.createReadStream(_dirname + '/htmls/basic.html'));
});
await app.listen({ port });
const summary = await summaly(host);
expect(summary.activityPub).toBe(null);
});
});