function* previewCorrection(pElem) {
const getDimensions = elem => ({elem: elem, dims: elem.getBoundingClientRect()});
let cell = getDimensions(pElem.parentNode);
let spacerElem = undefined;
if (cell.dims.height < 120) {
spacerElem = document.createElement('div');
spacerElem.classList.add('footnoteSpacer');
cell.elem.appendChild(spacerElem);
spacerElem.style['height'] = `${200}px`;
yield pElem;
cell = getDimensions(cell.elem);
const linkElems = pElem.querySelectorAll('.footlink-container');
for (let linkElem of linkElems) {
linkElem.addEventListener('mouseenter', e => {
e.preventDefault();
if (spacerElem.classList.contains('out')) spacerElem.classList.remove('out');
const preview = getDimensions(e.target.querySelector('.footlink-preview'));
const p = getDimensions(e.target.parentNode);
const yDiff = (preview.dims.y + preview.dims.height) - (p.dims.y + p.dims.height);
if (yDiff > 0) spacerElem.style['height'] = `${yDiff}px`;
});
linkElem.addEventListener('mouseleave', e => {
e.preventDefault();
// add class for different transition property on mouseleave
spacerElem.classList.add('out');
spacerElem.style['height'] = '0';
});
}
}
const previewElems = pElem.querySelectorAll('.footlink-preview');
for (let previewElem of previewElems) {
let preview = getDimensions(previewElem);
// if preview is only a single line, constrain its width to content
if (preview.dims.height < 34) {
preview.elem.style['min-width'] = '0';
preview.elem.style['max-width'] = 'none';
preview.elem.style['white-space'] = 'nowrap';
preview = getDimensions(preview.elem);
}
// make sure that preview remains inside the bounds of the cell
const xDiff = cell.dims.x - preview.dims.x;
const yDiff = (preview.dims.y + preview.dims.height) - (cell.dims.y + cell.dims.height);
const widthDiff = (preview.dims.x + preview.dims.width) - (cell.dims.x + width);
if (xDiff > 0) preview.elem.style['margin-left'] = xDiff+'px';
if (yDiff > 0) preview.elem.style['margin-bottom'] = (yDiff+26)+'px';
if (widthDiff > 0) preview.elem.style['margin-left'] = '-'+widthDiff+'px';
}
// make spacer invisible by default
if (spacerElem !== undefined) spacerElem.style['height'] = '0';
yield pElem;
}