|
!(() => { |
|
var ttFnSel = d3.select('body').selectAppend('div.tooltip-footnote.tooltip-footnote-hidden') |
|
|
|
function index2superscipt(i){ |
|
return (i + 1 + '') |
|
.split('') |
|
.map(num => '⁰¹²³⁴⁵⁶⁷⁸⁹'[num]) |
|
.join('') |
|
} |
|
|
|
var footendSel = d3.selectAll('.footend') |
|
.each(function(d, i){ |
|
var sel = d3.select(this) |
|
var ogHTML = sel.parent().html() |
|
|
|
sel |
|
.at({href: '#footstart-' + i, id: 'footend-' + i}) |
|
.text(index2superscipt(i)) |
|
.datum(ogHTML) |
|
}) |
|
|
|
footendSel.parent().parent().selectAll('br').remove() |
|
|
|
var footstartSel = d3.selectAll('.footstart') |
|
.each(function(d, i){ |
|
d3.select(this) |
|
.at({ |
|
href: '#footend-' + i, |
|
}) |
|
.text(index2superscipt(i)) |
|
.datum(footendSel.data()[i]) |
|
.parent().at({id: 'footstart-' + i}) |
|
}) |
|
.call(addLockedTooltip) |
|
|
|
|
|
function addLockedTooltip(sel){ |
|
sel |
|
.on('mouseover', function(d, i){ |
|
ttFnSel |
|
.classed('tooltip-footnote-hidden', 0) |
|
.html(d).select('.footend').remove() |
|
|
|
var [x, y] = d3.mouse(d3.select('html').node()) |
|
var bb = ttFnSel.node().getBoundingClientRect(), |
|
left = d3.clamp(20, (x-bb.width/2), window.innerWidth - bb.width - 20), |
|
top = innerHeight + scrollY > y + 20 + bb.height ? y + 20 : y - bb.height - 10; |
|
|
|
ttFnSel.st({left, top}) |
|
}) |
|
.on('mousemove', mousemove) |
|
.on('mouseout', mouseout) |
|
|
|
ttFnSel |
|
.on('mousemove', mousemove) |
|
.on('mouseout', mouseout) |
|
|
|
function mousemove(){ |
|
if (window.__ttfade) window.__ttfade.stop() |
|
} |
|
|
|
function mouseout(){ |
|
if (window.__ttfade) window.__ttfade.stop() |
|
window.__ttfade = d3.timeout( |
|
() => ttFnSel.classed('tooltip-footnote-hidden', 1), |
|
250 |
|
) |
|
} |
|
} |
|
|
|
})() |
|
|
|
|
|
|