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 = ``; } } }