Add bibtex-key to d-cite for framework compatability

This commit is contained in:
Ludwig Schubert
2019-12-16 10:21:38 -08:00
parent 042da68b9a
commit f569b07151
5 changed files with 258 additions and 249 deletions
+31 -27
View File
@@ -12,10 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { Template } from '../mixins/template';
import { hover_cite, bibliography_cite } from '../helpers/citation';
import { Template } from "../mixins/template";
import { hover_cite, bibliography_cite } from "../helpers/citation";
const T = Template('d-cite', `
const T = Template(
"d-cite",
`
<style>
:host {
@@ -69,10 +71,10 @@ ul li:last-of-type {
<div id="citation-" class="citation">
<span class="citation-number"></span>
</div>
`);
`
);
export class Cite extends T(HTMLElement) {
/* Lifecycle */
constructor() {
super();
@@ -81,53 +83,53 @@ export class Cite extends T(HTMLElement) {
}
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.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);
});
// in case this component got connected after values were set
if (this.numbers) {
this.displayNumbers(this.numbers)
this.displayNumbers(this.numbers);
}
if (this.entries) {
this.displayEntries(this.entries)
this.displayEntries(this.entries);
}
}
//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);
// 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'];
return ["key", "bibtex-key"];
}
attributeChangedCallback(name, oldValue, newValue) {
const eventName = oldValue ? 'onCiteKeyChanged' : 'onCiteKeyCreated';
const keys = newValue.split(',').map(k => k.trim());
const eventName = oldValue ? "onCiteKeyChanged" : "onCiteKeyCreated";
const keys = newValue.split(",").map(k => k.trim());
const options = { detail: [this, keys], bubbles: true };
const event = new CustomEvent(eventName, options);
document.dispatchEvent(event);
}
set key(value) {
this.setAttribute('key', value);
this.setAttribute("key", value);
}
get key() {
return this.getAttribute('key');
return this.getAttribute("key") || this.getAttribute("bibtex-key");
}
get keys() {
return this.getAttribute('key').split(',');
return this.key.split(",");
}
/* Setters & Rendering */
@@ -143,16 +145,16 @@ export class Cite extends T(HTMLElement) {
displayNumbers(numbers) {
if (!this.innerSpan) return;
const numberStrings = numbers.map( index => {
return index == -1 ? '?' : index + 1 + '';
const numberStrings = numbers.map(index => {
return index == -1 ? "?" : index + 1 + "";
});
const textContent = '[' + numberStrings.join(', ') + ']';
const textContent = "[" + numberStrings.join(", ") + "]";
this.innerSpan.textContent = textContent;
}
set entries(entries) {
this._entries = entries;
this.displayEntries(entries)
this.displayEntries(entries);
}
get entries() {
@@ -160,10 +162,12 @@ export class Cite extends T(HTMLElement) {
}
displayEntries(entries) {
if (!this.hoverBox) return
if (!this.hoverBox) return;
this.hoverBox.innerHTML = `<ul>
${entries.map(hover_cite).map(html => `<li>${html}</li>`).join('\n')}
${entries
.map(hover_cite)
.map(html => `<li>${html}</li>`)
.join("\n")}
</ul>`;
}
}
+4 -2
View File
@@ -173,8 +173,10 @@ export const Controller = {
}
const frontMatterTag = document.querySelector('d-front-matter');
const data = parseFrontmatter(frontMatterTag);
Controller.listeners.onFrontMatterChanged({detail: data});
if (frontMatterTag) {
const data = parseFrontmatter(frontMatterTag);
Controller.listeners.onFrontMatterChanged({detail: data});
}
// Resolving "citations" dependency due to initial DOM load
frontMatter.citations = collect_citations();
+103 -90
View File
@@ -12,74 +12,85 @@
// See the License for the specific language governing permissions and
// limitations under the License.
export function collect_citations(dom=document) {
export function collect_citations(dom = document) {
const citations = new Set();
const citeTags = dom.querySelectorAll('d-cite');
const citeTags = dom.querySelectorAll("d-cite");
for (const tag of citeTags) {
const keys = tag.getAttribute('key').split(',');
for (const key of keys) {
for (const key of tag.keys) {
citations.add(key);
}
}
return [...citations];
}
export function inline_cite_short(keys){
function cite_string(key){
if (key in data.bibliography){
var n = data.citations.indexOf(key)+1;
return ''+n;
export function inline_cite_short(keys) {
function cite_string(key) {
if (key in data.bibliography) {
var n = data.citations.indexOf(key) + 1;
return "" + n;
} else {
return '?';
return "?";
}
}
return '['+keys.map(cite_string).join(', ')+']';
return "[" + keys.map(cite_string).join(", ") + "]";
}
export function inline_cite_long(keys){
function cite_string(key){
if (key in data.bibliography){
export function inline_cite_long(keys) {
function cite_string(key) {
if (key in data.bibliography) {
var ent = data.bibliography[key];
var names = ent.author.split(' and ');
names = names.map(name => name.split(',')[0].trim());
var names = ent.author.split(" and ");
names = names.map(name => name.split(",")[0].trim());
var year = ent.year;
if (names.length == 1) return names[0] + ', ' + year;
if (names.length == 2) return names[0] + ' & ' + names[1] + ', ' + year;
if (names.length > 2) return names[0] + ', et al., ' + year;
if (names.length == 1) return names[0] + ", " + year;
if (names.length == 2) return names[0] + " & " + names[1] + ", " + year;
if (names.length > 2) return names[0] + ", et al., " + year;
} else {
return '?';
return "?";
}
}
return keys.map(cite_string).join(', ');
return keys.map(cite_string).join(", ");
}
function author_string(ent, template, sep, finalSep){
if (ent.author == null) { return ''; }
var names = ent.author.split(' and ');
function author_string(ent, template, sep, finalSep) {
if (ent.author == null) {
return "";
}
var names = ent.author.split(" and ");
let name_strings = names.map(name => {
name = name.trim();
if (name.indexOf(',') != -1){
var last = name.split(',')[0].trim();
var firsts = name.split(',')[1];
} else if (name.indexOf(' ') != -1) {
var last = name.split(' ').slice(-1)[0].trim();
var firsts = name.split(' ').slice(0,-1).join(' ');
if (name.indexOf(",") != -1) {
var last = name.split(",")[0].trim();
var firsts = name.split(",")[1];
} else if (name.indexOf(" ") != -1) {
var last = name
.split(" ")
.slice(-1)[0]
.trim();
var firsts = name
.split(" ")
.slice(0, -1)
.join(" ");
} else {
var last = name.trim();
}
var initials = '';
var initials = "";
if (firsts != undefined) {
initials = firsts.trim().split(' ').map(s => s.trim()[0]);
initials = initials.join('.')+'.';
initials = firsts
.trim()
.split(" ")
.map(s => s.trim()[0]);
initials = initials.join(".") + ".";
}
return template.replace('${F}', firsts)
.replace('${L}', last)
.replace('${I}', initials)
return template
.replace("${F}", firsts)
.replace("${L}", last)
.replace("${I}", initials)
.trim(); // in case one of first or last was empty
});
if (names.length > 1) {
var str = name_strings.slice(0, names.length-1).join(sep);
str += (finalSep || sep) + name_strings[names.length-1];
var str = name_strings.slice(0, names.length - 1).join(sep);
str += (finalSep || sep) + name_strings[names.length - 1];
return str;
} else {
return name_strings[0];
@@ -87,69 +98,71 @@ function author_string(ent, template, sep, finalSep){
}
function venue_string(ent) {
var cite = (ent.journal || ent.booktitle || '');
if ('volume' in ent){
var cite = ent.journal || ent.booktitle || "";
if ("volume" in ent) {
var issue = ent.issue || ent.number;
issue = (issue != undefined)? '('+issue+')' : '';
cite += ', Vol ' + ent.volume + issue;
issue = issue != undefined ? "(" + issue + ")" : "";
cite += ", Vol " + ent.volume + issue;
}
if ('pages' in ent){
cite += ', pp. ' + ent.pages;
if ("pages" in ent) {
cite += ", pp. " + ent.pages;
}
if (cite != '') cite += '. ';
if ('publisher' in ent){
if (cite != "") cite += ". ";
if ("publisher" in ent) {
cite += ent.publisher;
if (cite[cite.length-1] != '.') cite += '.';
if (cite[cite.length - 1] != ".") cite += ".";
}
return cite;
}
function link_string(ent){
if ('url' in ent){
function link_string(ent) {
if ("url" in ent) {
var url = ent.url;
var arxiv_match = (/arxiv\.org\/abs\/([0-9\.]*)/).exec(url);
if (arxiv_match != null){
var arxiv_match = /arxiv\.org\/abs\/([0-9\.]*)/.exec(url);
if (arxiv_match != null) {
url = `http://arxiv.org/pdf/${arxiv_match[1]}.pdf`;
}
if (url.slice(-4) == '.pdf'){
var label = 'PDF';
} else if (url.slice(-5) == '.html') {
var label = 'HTML';
if (url.slice(-4) == ".pdf") {
var label = "PDF";
} else if (url.slice(-5) == ".html") {
var label = "HTML";
}
return ` &ensp;<a href="${url}">[${label||'link'}]</a>`;
}/* else if ("doi" in ent){
return ` &ensp;<a href="${url}">[${label || "link"}]</a>`;
} /* else if ("doi" in ent){
return ` &ensp;<a href="https://doi.org/${ent.doi}" >[DOI]</a>`;
}*/ else {
return '';
return "";
}
}
function doi_string(ent, new_line){
if ('doi' in ent) {
return `${new_line?'<br>':''} <a href="https://doi.org/${ent.doi}" style="text-decoration:inherit;">DOI: ${ent.doi}</a>`;
function doi_string(ent, new_line) {
if ("doi" in ent) {
return `${new_line ? "<br>" : ""} <a href="https://doi.org/${
ent.doi
}" style="text-decoration:inherit;">DOI: ${ent.doi}</a>`;
} else {
return '';
return "";
}
}
function title_string(ent) {
return '<span class="title">' + ent.title + '</span> ';
return '<span class="title">' + ent.title + "</span> ";
}
export function bibliography_cite(ent, fancy){
if (ent){
export function bibliography_cite(ent, fancy) {
if (ent) {
var cite = title_string(ent);
cite += link_string(ent) + '<br>';
cite += link_string(ent) + "<br>";
if (ent.author) {
cite += author_string(ent, '${L}, ${I}', ', ', ' and ');
cite += author_string(ent, "${L}, ${I}", ", ", " and ");
if (ent.year || ent.date) {
cite += ', ';
cite += ", ";
}
}
if (ent.year || ent.date) {
cite += (ent.year || ent.date) + '. ';
cite += (ent.year || ent.date) + ". ";
} else {
cite += '. ';
cite += ". ";
}
cite += venue_string(ent);
cite += doi_string(ent);
@@ -166,39 +179,39 @@ export function bibliography_cite(ent, fancy){
cite += link_string(ent);
return cite*/
} else {
return '?';
return "?";
}
}
export function hover_cite(ent){
if (ent){
var cite = '';
cite += '<strong>' + ent.title + '</strong>';
export function hover_cite(ent) {
if (ent) {
var cite = "";
cite += "<strong>" + ent.title + "</strong>";
cite += link_string(ent);
cite += '<br>';
cite += "<br>";
var a_str = author_string(ent, '${I} ${L}', ', ') + '.';
var v_str = venue_string(ent).trim() + ' ' + ent.year + '. ' + doi_string(ent, true);
var a_str = author_string(ent, "${I} ${L}", ", ") + ".";
var v_str =
venue_string(ent).trim() + " " + ent.year + ". " + doi_string(ent, true);
if ((a_str+v_str).length < Math.min(40, ent.title.length)) {
cite += a_str + ' ' + v_str;
if ((a_str + v_str).length < Math.min(40, ent.title.length)) {
cite += a_str + " " + v_str;
} else {
cite += a_str + '<br>' + v_str;
cite += a_str + "<br>" + v_str;
}
return cite;
} else {
return '?';
return "?";
}
}
//https://scholar.google.com/scholar?q=allintitle%3ADocument+author%3Aolah
function get_GS_URL(ent){
if (ent){
var names = ent.author.split(' and ');
names = names.map(name => name.split(',')[0].trim());
var title = ent.title.split(' ');//.replace(/[,:]/, "")
var url = 'http://search.labs.crossref.org/dois?';//""https://scholar.google.com/scholar?"
url += uris({q: names.join(' ') + ' ' + title.join(' ')});
function get_GS_URL(ent) {
if (ent) {
var names = ent.author.split(" and ");
names = names.map(name => name.split(",")[0].trim());
var title = ent.title.split(" "); //.replace(/[,:]/, "")
var url = "http://search.labs.crossref.org/dois?"; //""https://scholar.google.com/scholar?"
url += uris({ q: names.join(" ") + " " + title.join(" ") });
}
}