import { Template } from '../mixins/template';
import { hover_cite, bibliography_cite } from '../helpers/citation';
const T = Template('d-cite', `
`);
export class Cite extends T(HTMLElement) {
/* Lifecycle */
connectedCallback() {
this.outerSpan = this.root.querySelector('#citation-');
this.innerSpan = this.root.querySelector('.citation-number');
this.hoverBox = this.root.querySelector('d-hover-box');
window.customElements.whenDefined('d-hover-box').then(() => {
this.hoverBox.listen(this);
});
}
//TODO This causes an infinite loop on firefox with polyfills.
// This is only needed for interactive editing so no priority.
// disconnectedCallback() {
// const options = { detail: [this, this.keys], bubbles: true };
// const event = new CustomEvent('onCiteKeyRemoved', options);
// document.dispatchEvent(event);
// }
/* observe 'key' attribute */
static get observedAttributes() {
return ['key'];
}
attributeChangedCallback(name, oldValue, newValue) {
const eventName = oldValue ? 'onCiteKeyChanged' : 'onCiteKeyCreated';
const keys = newValue.split(',');
const options = { detail: [this, keys], bubbles: true };
const event = new CustomEvent(eventName, options);
document.dispatchEvent(event);
}
set key(value) {
this.setAttribute('key', value);
}
get key() {
return this.getAttribute('key');
}
get keys() {
return this.getAttribute('key').split(',');
}
/* Setters & Rendering */
set numbers(numbers) {
const numberStrings = numbers.map( index => {
return index == -1 ? '?' : index + 1 + '';
});
const textContent = '[' + numberStrings.join(', ') + ']';
if (this.innerSpan) {
this.innerSpan.textContent = textContent;
}
}
set entries(entries) {
if (this.hoverBox) {
this.hoverBox.innerHTML = `
${entries.map(hover_cite).map(html => `- ${html}
`).join('\n')}
`;
}
}
}