Skip to content

Commit 9ee53b3

Browse files
committed
add link preview generation
1 parent 2073dfc commit 9ee53b3

File tree

4 files changed

+65
-23
lines changed

4 files changed

+65
-23
lines changed

embeds/generic-preview.ts

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,44 @@
1-
import { Setting } from "obsidian";
1+
import { Setting, requestUrl } from "obsidian";
22
import { PluginSettings } from "settings";
33
import { EmbedSource, EnableEmbedKey } from "./";
4-
5-
import got from "got";
6-
import metascraperModule from "metascraper";
7-
import metascraperTitleModule from "metascraper-title";
8-
import metascraperDescriptionModule from "metascraper-description";
9-
import metascraperImageModule from "metascraper-image";
10-
11-
const metascraper = metascraperModule([
12-
metascraperTitleModule(),
13-
metascraperImageModule(),
14-
metascraperDescriptionModule(),
15-
]);
4+
import { getPreviewFromContent } from "link-preview-js";
165

176
export class GenericPreviewEmbed implements EmbedSource {
187
name = "Generic Preview";
198
enabledKey: EnableEmbedKey = "replaceGenericLinks";
20-
// unmatchable regex
21-
// this embed will be created as a fallback on all others failing to match
22-
regex = new RegExp("(?!)");
9+
regex = new RegExp("");
2310

2411
createEmbed(
2512
link: string,
2613
container: HTMLElement,
2714
settings: Readonly<PluginSettings>,
2815
currentTheme: "light" | "dark",
2916
) {
30-
const preview = document.createElement("div");
31-
preview.textContent = "Loading...";
17+
const preview = document.createElement("a");
18+
preview.setAttr("href", link);
19+
preview.classList.add("preview");
20+
preview.textContent = "Loading embed...";
3221

3322
const loadPreview = async () => {
34-
const { body: html, url } = await got(link);
35-
const metadata = await metascraper({ html, url });
36-
preview.innerHTML = `<h2>${metadata.title}</h2> <br> <p>${metadata.description}</p>`
23+
const res = await requestUrl({ url: link });
24+
const metadata = await getPreviewFromContent({
25+
headers: res.headers,
26+
data: res.text,
27+
url: link
28+
});
29+
30+
if (!("title" in metadata)) return;
31+
32+
preview.innerHTML =
33+
String.raw`
34+
<div class="image-container">
35+
${ metadata.images.length ? String.raw`<img src="${metadata.images[0]}" />` : "" }
36+
</div>
37+
<div class="content">
38+
<div class="title">${metadata.title}</div>
39+
<div class="description">${metadata.description ? metadata.description : ""}</div>
40+
</div>
41+
`;
3742
}
3843
loadPreview();
3944

manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"id": "simple-embeds",
3-
"name": "Simple Embeds",
2+
"id": "simple-embeds-dev",
3+
"name": "Simple Embeds Dev",
44
"version": "1.12.0",
55
"minAppVersion": "0.13.8",
66
"description": "Replaces links, like Twitter and YouTube, with embeds when previewing a file.",

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@codemirror/stream-parser": "https://github.com/lishid/stream-parser",
2525
"@codemirror/view": "^0.19.0",
2626
"@rollup/plugin-commonjs": "^18.0.0",
27+
"@rollup/plugin-json": "^4.1.0",
2728
"@rollup/plugin-node-resolve": "^11.2.1",
2829
"@rollup/plugin-typescript": "^8.2.1",
2930
"@types/jest": "^27.0.2",
@@ -38,6 +39,7 @@
3839
},
3940
"dependencies": {
4041
"got": "^12.3.1",
42+
"link-preview-js": "^3.0.3",
4143
"metascraper": "^5.30.2",
4244
"metascraper-description": "^5.30.2",
4345
"metascraper-image": "^5.30.2",

styles.css

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,41 @@
8080
left: calc(50% - 75px);
8181
}
8282

83+
/* Generic Preview */
84+
.embed-container.generic-preview .preview {
85+
text-decoration: none;
86+
color: inherit;
87+
background: var(--background-secondary);
88+
border: 1px solid var(--background-modifier-border);;
89+
display: flex;
90+
flex-direction: row;
91+
align-items: center;
92+
justify-content: flex-start;
93+
margin: 0.5rem 0;
94+
}
95+
.embed-container.generic-preview .preview:hover {
96+
background: var(--background-secondary-alt);
97+
cursor: pointer;
98+
}
99+
100+
.embed-container.generic-preview .preview .image-container {
101+
max-width: 100px;
102+
}
103+
104+
.embed-container.generic-preview .preview .content {
105+
margin: 0.5rem;
106+
margin-left: 1rem;
107+
}
108+
109+
.embed-container.generic-preview .preview .content .title {
110+
font-size: 1.05rem;
111+
font-weight: 600;
112+
}
113+
114+
.embed-container.generic-preview .preview .content .description {
115+
color: var(--text-muted);
116+
}
117+
83118
/* Settings */
84119
.simple-embeds-settings details > summary {
85120
display: flex;

0 commit comments

Comments
 (0)