Published
Edited
Jun 28, 2020
Importers
2 stars
Insert cell
Insert cell
references = md`## References

<style>
ol.references {
counter-reset: list;
padding-left: 0;
}

ol.references li {
list-style: none;
}

ol.references li:before {
content: "[" counter(list) "] ";
counter-increment: list;
}

ol.references a {
font-family: var(--sans-serif);
font-size: 92%;
}
</style>

<ol class="references">
${data.map(d => html`
<li>
<a title="${d.title}" href="${d.url}" class="reference">
${DOM.text(d.displayUrl)}
</a>`)}`
Insert cell
data = {
refresh;

// Remove previous references.
for (const element of [...document.getElementsByClassName(classname)]) {
element.remove();
}

// Find links and add references.
const links = [];

for (const element of [...document.getElementsByTagName("A")]) {
let url = element.href;

if (element.innerText === url || !url || url.startsWith(current_location + '#'))
continue;
if (element.classList.contains("reference"))
continue;

let skip = false;

for (let parent = element; parent != null; parent = parent.parentElement) {
if (parent.classList.contains("observablehq--inspect")) {
skip = true;
break;
}
}

if (skip)
continue;

url = decodeURIComponent(url);

const displayUrl = url.replace(/^https?\:\/\/|\/$/, ""),
existingLinkIndex = links.findIndex(r => r.displayUrl === displayUrl);

const referenceNumber = existingLinkIndex === -1
? links.push({ displayUrl, references: [], title: element.innerText, url })
: existingLinkIndex + 1;

// Add link to closest ID, if possible.
let id = undefined;

for (let parent = element; parent != null; parent = parent.parentElement) {
if (parent.id !== '') {
id = parent.id;
break;
}
}

links[referenceNumber - 1].references.push({ text: element.innerText, id });

// Add reference number.
const span = document.createElement('SPAN');

span.className = classname;
span.title = element.innerText;
span.textContent = referenceNumber.toString().replace(/\d/g, i => superscript[i]);

element.insertAdjacentElement('afterend', span);
}

return links;
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more