Skip to content

Commit 562247e

Browse files
authored
Link previews: use selector field from API (#619)
Requires: * readthedocs/readthedocs.org#12301 * readthedocs/ext-theme#626 Closes #554
1 parent edf200d commit 562247e

File tree

5 files changed

+43
-2
lines changed

5 files changed

+43
-2
lines changed

public/_/readthedocs-addons.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
},
122122
"linkpreviews": {
123123
"enabled": true
124+
"selector": "[role=main] a",
124125
},
125126
"notifications": {
126127
"enabled": true,

src/data-validation.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,10 @@ const addons_linkpreviews = {
534534
},
535535
linkpreviews: {
536536
type: "object",
537-
required: ["enabled"],
537+
required: ["enabled", "selector"],
538538
properties: {
539539
enabled: { type: "boolean" },
540+
selector: { type: ["string", "null"] },
540541
},
541542
},
542543
},

src/linkpreviews.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ export class LinkPreviewsElement extends LitElement {
247247
const rootSelector =
248248
this.config.addons.options.root_selector || docTool.getRootSelector();
249249

250-
const selector = docTool.getLinkSelector();
250+
const selector =
251+
this.config.addons.linkpreviews.selector || docTool.getLinkSelector();
251252

252253
console.debug(
253254
`${LinkPreviewsAddon.addonName}: Using '${selector}' as CSS selector.`,

tests/linkpreviews.test.html

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
},
3131
linkpreviews: {
3232
enabled: true,
33+
selector: null,
3334
},
3435
},
3536
};
@@ -40,6 +41,9 @@
4041
server.restore();
4142

4243
document.querySelectorAll("div.tooltip").forEach((el) => el.remove());
44+
document
45+
.querySelectorAll(".link-preview")
46+
.forEach((el) => el.classList.remove("link-preview"));
4347
});
4448

4549
describe("Link previews tests", () => {
@@ -61,6 +65,28 @@
6165
expect(linkExternal).to.not.have.class("link-preview");
6266
});
6367

68+
it("use CSS selector from API", async () => {
69+
config.addons.linkpreviews.selector = "section p a";
70+
let linkInternal = document.querySelector("#linkpreview-internal");
71+
let linkExternal = document.querySelector("#linkpreview-external");
72+
let linkCustom = document.querySelector("#linkpreview-custom");
73+
74+
expect(linkInternal).to.not.have.class("link-preview");
75+
expect(linkExternal).to.not.have.class("link-preview");
76+
expect(linkCustom).to.not.have.class("link-preview");
77+
78+
const addon = new linkpreviews.LinkPreviewsAddon(config);
79+
const element = document.querySelector("readthedocs-linkpreviews");
80+
await elementUpdated(element);
81+
82+
// Custom link should have a specific class
83+
expect(linkCustom).to.have.class("link-preview");
84+
85+
// Intenrnal and external link shouldn't be previewed
86+
expect(linkExternal).to.not.have.class("link-preview");
87+
expect(linkInternal).to.not.have.class("link-preview");
88+
});
89+
6490
it("trigger mouseenter event without response to show Loading... tooltip", async () => {
6591
const addon = new linkpreviews.LinkPreviewsAddon(config);
6692
const element = document.querySelector("readthedocs-linkpreviews");
@@ -150,5 +176,15 @@
150176
>.
151177
</p>
152178
</main>
179+
180+
<!-- Add a link _outside_ main to use with a custom CSS selector -->
181+
<section>
182+
<p>
183+
Link with
184+
<a id="linkpreview-custom" href="http://localhost:8000/custom.html"
185+
>custom CSS selector</a
186+
>.
187+
</p>
188+
</section>
153189
</body>
154190
</html>

tests/linkpreviews.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ describe("LinkPreviews addon", () => {
2323
},
2424
linkpreviews: {
2525
enabled: false,
26+
selector: "[role=main] a.internal",
2627
},
2728
},
2829
}),
@@ -38,6 +39,7 @@ describe("LinkPreviews addon", () => {
3839
},
3940
linkpreviews: {
4041
enabled: true,
42+
selector: "[role=main] a.internal",
4143
},
4244
},
4345
}),

0 commit comments

Comments
 (0)