fancy citations, without bloat

This commit is contained in:
Christopher Olah
2017-01-10 02:08:28 -08:00
parent d5c70f7c19
commit 460a989897
3 changed files with 225 additions and 11 deletions
+116 -4
View File
@@ -8,12 +8,20 @@ export default function(dom, data) {
}*/
var citeTags = [].slice.apply(dom.querySelectorAll("dt-cite"));
citeTags.forEach(el => {
citeTags.forEach((el,n) => {
var key = el.getAttribute("key");
if (key) {
var keys = key.split(",");
var cite_string = inline_cite_short(keys);
el.innerHTML = cite_string;
el.innerHTML = `<span id="citation-${n}" class="citation">${cite_string}</span>`;
DistillHoverBox.bind(`#citation-${n}`, key)
DistillHoverBox.contentMap[key] = "";
keys.map((key,n) => {
if (n>0) DistillHoverBox.contentMap[key] += "<br>";
var cite_str = bibliography_cite(data.bibliography[key], true);
DistillHoverBox.contentMap[key] += cite_str;
})
}
});
@@ -57,7 +65,7 @@ export default function(dom, data) {
return keys.map(cite_string).join(", ");
}
function bibliography_cite(ent){
function bibliography_cite(ent, fancy){
if (ent){
var names = ent.author.split(" and ");
var cite = "";
@@ -77,7 +85,11 @@ export default function(dom, data) {
cite += name_strings[0]
}
cite += ", " + ent.year + ". "
cite += ent.title + ". "
if (fancy){
cite += "<b>" + ent.title + "</b>. "
} else {
cite += ent.title + ". "
}
cite += (ent.journal || ent.booktitle || "")
if ("volume" in ent){
var issue = ent.issue || ent.number;
@@ -88,6 +100,9 @@ export default function(dom, data) {
cite += ", pp. " + ent.pages
}
cite += ". "
if (fancy && ent.url && ent.url.slice(-4) == ".pdf") {
cite = `${cite} <a href="${ent.url}">[pdf]</a>`
}
return cite
} else {
return "?";
@@ -107,3 +122,100 @@ export default function(dom, data) {
}
}
// DistillHoverBox
//=====================================
function DistillHoverBox(key, pos){
if (!(key in DistillHoverBox.contentMap)){
console.error("No DistillHoverBox content registered for key", key);
}
if (key in DistillHoverBox.liveBoxes) {
console.error("There already exists a DistillHoverBox for key", key);
} else {
for (var k in DistillHoverBox.liveBoxes)
DistillHoverBox.liveBoxes[k].remove();
DistillHoverBox.liveBoxes[key] = this;
}
this.key = key;
var pretty = window.innerWidth > 600;
var padding = pretty? 18 : 12;
var outer_padding = pretty ? 18 : 0;
var bbox = document.querySelector("body").getBoundingClientRect();
var left = pos[0] - bbox.left, top = pos[1] - bbox.top;
var width = Math.min(window.innerWidth-2*outer_padding, 648);
left = Math.min(left, window.innerWidth-width-outer_padding);
width = width - 2*padding;
var str = `<div style="position: absolute;
background-color: #FFF;
opacity: 0.95;
width: ${width}px;
top: ${top}px;
left: ${left}px;
padding: ${padding}px;
border-radius: ${pretty? 6 : 0}px;
box-shadow: 0px 0px 18px 6px #777;" >
${DistillHoverBox.contentMap[key]}
</div>`;
this.div = appendBody(str);
DistillHoverBox.bind (this.div, key);
}
DistillHoverBox.prototype.remove = function remove(){
if (this.div) this.div.remove();
if (this.timeout) clearTimeout(this.timeout);
delete DistillHoverBox.liveBoxes[this.key];
}
DistillHoverBox.prototype.stopTimeout = function stopTimeout() {
if (this.timeout) clearTimeout(this.timeout);
}
DistillHoverBox.prototype.extendTimeout = function extendTimeout(T) {
//console.log("extend", T)
var this_ = this;
this.stopTimeout();
this.timeout = setTimeout(() => this_.remove(), T);
}
DistillHoverBox.liveBoxes = {};
DistillHoverBox.contentMap = {abc: "hello world!"};
DistillHoverBox.bind = function bind(node, key) {
if (typeof node == "string"){
node = document.querySelector(node);
}
node.addEventListener("mouseover", () => {
var bbox = node.getBoundingClientRect();
if (!(key in DistillHoverBox.liveBoxes)){
new DistillHoverBox(key, [bbox.right, bbox.bottom]);
}
DistillHoverBox.liveBoxes[key].stopTimeout();
});
node.addEventListener("mouseout", () => {
if (key in DistillHoverBox.liveBoxes){
DistillHoverBox.liveBoxes[key].extendTimeout(250);
}
});
}
function appendBody(str){
var node = nodeFromString(str);
var body = document.querySelector("body");
body.appendChild(node);
return node;
}
function nodeFromString(str) {
var div = document.createElement("div");
div.innerHTML = str;
return div.firstChild;
}
+108 -6
View File
@@ -4408,12 +4408,20 @@ var citation = function(dom, data) {
}*/
var citeTags = [].slice.apply(dom.querySelectorAll("dt-cite"));
citeTags.forEach(function (el) {
citeTags.forEach(function (el,n) {
var key = el.getAttribute("key");
if (key) {
var keys = key.split(",");
var cite_string = inline_cite_short(keys);
el.innerHTML = cite_string;
el.innerHTML = "<span id=\"citation-" + n + "\" class=\"citation\">" + cite_string + "</span>";
DistillHoverBox.bind(("#citation-" + n), key);
DistillHoverBox.contentMap[key] = "";
keys.map(function (key,n) {
if (n>0) { DistillHoverBox.contentMap[key] += "<br>"; }
var cite_str = bibliography_cite(data.bibliography[key], true);
DistillHoverBox.contentMap[key] += cite_str;
});
}
});
@@ -4457,7 +4465,7 @@ var citation = function(dom, data) {
return keys.map(cite_string).join(", ");
}
function bibliography_cite(ent){
function bibliography_cite(ent, fancy){
if (ent){
var names = ent.author.split(" and ");
var cite = "";
@@ -4477,7 +4485,11 @@ var citation = function(dom, data) {
cite += name_strings[0];
}
cite += ", " + ent.year + ". ";
cite += ent.title + ". ";
if (fancy){
cite += "<b>" + ent.title + "</b>. ";
} else {
cite += ent.title + ". ";
}
cite += (ent.journal || ent.booktitle || "");
if ("volume" in ent){
var issue = ent.issue || ent.number;
@@ -4488,6 +4500,9 @@ var citation = function(dom, data) {
cite += ", pp. " + ent.pages;
}
cite += ". ";
if (fancy && ent.url && ent.url.slice(-4) == ".pdf") {
cite = cite + " <a href=\"" + (ent.url) + "\">[pdf]</a>";
}
return cite
} else {
return "?";
@@ -4508,6 +4523,93 @@ var citation = function(dom, data) {
}
};
// DistillHoverBox
//=====================================
function DistillHoverBox(key, pos){
if (!(key in DistillHoverBox.contentMap)){
console.error("No DistillHoverBox content registered for key", key);
}
if (key in DistillHoverBox.liveBoxes) {
console.error("There already exists a DistillHoverBox for key", key);
} else {
for (var k in DistillHoverBox.liveBoxes)
{ DistillHoverBox.liveBoxes[k].remove(); }
DistillHoverBox.liveBoxes[key] = this;
}
this.key = key;
var pretty = window.innerWidth > 600;
var padding = pretty? 18 : 12;
var outer_padding = pretty ? 18 : 0;
var bbox = document.querySelector("body").getBoundingClientRect();
var left = pos[0] - bbox.left, top = pos[1] - bbox.top;
var width = Math.min(window.innerWidth-2*outer_padding, 648);
left = Math.min(left, window.innerWidth-width-outer_padding);
width = width - 2*padding;
var str = "<div style=\"position: absolute;\n background-color: #FFF;\n opacity: 0.95;\n width: " + width + "px;\n top: " + top + "px;\n left: " + left + "px;\n padding: " + padding + "px;\n border-radius: " + (pretty? 6 : 0) + "px;\n box-shadow: 0px 0px 18px 6px #777;\" >\n " + (DistillHoverBox.contentMap[key]) + "\n </div>";
this.div = appendBody(str);
DistillHoverBox.bind (this.div, key);
}
DistillHoverBox.prototype.remove = function remove(){
if (this.div) { this.div.remove(); }
if (this.timeout) { clearTimeout(this.timeout); }
delete DistillHoverBox.liveBoxes[this.key];
};
DistillHoverBox.prototype.stopTimeout = function stopTimeout() {
if (this.timeout) { clearTimeout(this.timeout); }
};
DistillHoverBox.prototype.extendTimeout = function extendTimeout(T) {
//console.log("extend", T)
var this_ = this;
this.stopTimeout();
this.timeout = setTimeout(function () { return this_.remove(); }, T);
};
DistillHoverBox.liveBoxes = {};
DistillHoverBox.contentMap = {abc: "hello world!"};
DistillHoverBox.bind = function bind(node, key) {
if (typeof node == "string"){
node = document.querySelector(node);
}
node.addEventListener("mouseover", function () {
var bbox = node.getBoundingClientRect();
if (!(key in DistillHoverBox.liveBoxes)){
new DistillHoverBox(key, [bbox.right, bbox.bottom]);
}
DistillHoverBox.liveBoxes[key].stopTimeout();
});
node.addEventListener("mouseout", function () {
if (key in DistillHoverBox.liveBoxes){
DistillHoverBox.liveBoxes[key].extendTimeout(250);
}
});
};
function appendBody(str){
var node = nodeFromString(str);
var body = document.querySelector("body");
body.appendChild(node);
return node;
}
function nodeFromString(str) {
var div = document.createElement("div");
div.innerHTML = str;
return div.firstChild;
}
var marked = createCommonjsModule(function (module, exports) {
/**
* marked - a markdown parser
@@ -6683,8 +6785,8 @@ var generateCrossref = function(data) {
{doi_batch_id: batch_id},
{timestamp: batch_timestamp},
{depositor: [
{depositor_name: "Distill Admin"},
{email_address: "admin@distill.pub"} ]},
{depositor_name: data.journal.depositorName},
{email_address: data.journal.email} ]},
{registrant: "Distill"} ]},
{body: [
+1 -1
View File
File diff suppressed because one or more lines are too long