Skip to content

Instantly share code, notes, and snippets.

@tommy4st
Last active November 9, 2015 13:14
Show Gist options
  • Save tommy4st/a0c86e83eb51875ba6c8 to your computer and use it in GitHub Desktop.
Save tommy4st/a0c86e83eb51875ba6c8 to your computer and use it in GitHub Desktop.
Bookmarklet: Converts BibTex from serveral Sources to APA Style References
(function(){window.open().document.body.innerHTML=(function(txt){
txt = txt.replace(/\\(.)\{?\\?(\w)\}?/g, function(m,p1,p2) {
switch (p1) {
case "`":
return p2 + "̀";
case "'":
return p2 + "́";
case "^":
return p2 + "̂";
case "~":
return p2 + "̃";
case "=":
return p2 + "̄";
case "u":
return p2 + "̆";
case ".":
return p2 + "̇";
case "\"":
return p2 + "̈";
case "r":
return p2 + "̊";
case "H":
return p2 + "̋";
case "v":
return p2 + "̌";
case "c":
return "&" + p2 + "cedil;";
case "k":
return "&" + p2 + "ogon;";
default:
return p2;
}
});
txt = txt.replace(/{(([a-zA-Z()-]|&#\d+;)+)}/g, "$1");
var re = function(f,t) {
var r = new RegExp("\\s" + f + "\\s*=\\s*\\{?(.+?)\\}?(,[\n\r]|\\})", "g");
var m = r.exec(t);
return m ? m[1].replace(/\{(.+?)\}/g, "$1") : undefined;
};
var a = re("author",txt);
var y = re("year",txt);
var t = re("title",txt);
var b = re("booktitle",txt);
var j = re("journal",txt);
var v = re("volume",txt);
var n = re("number",txt);
var p = re("pages",txt);
var d = re("doi",txt);
var u = re("url",txt);
var s = re("series",txt);
var bu = re("biburl",txt);
a = a.split(/\s+and\s+/g).map(function(fn){
fn = fn.split(/\s*,\s*/g).reverse().join(" ").split(/\s+/g);
var ln = fn.pop();
fn = fn.map(function(n) {
return n[0] + ".";
});
return ln + ", " + fn.join(" ");
});
var la = a.pop();
a = a.length > 0 ? a.join(", ") + ", & " + la : la;
t = bu ? "<a href=\"" + bu + "\">" + t + "</a>" : t;
p = p ? ", " + p.replace(/--/g, "-").replace(/\\/g, "") : "";
v = v ? ", <i>" + v + "</i>" + (n ? "(" + n + ")" : "") : "";
s = s ? ", <i>" + s + "</i>" : "";
j = j ? ". <i>" + j.replace(/\\/g, "").replace(/&amp;/g, "&") + "</i>" + s + v : "";
d = d ? " <a href=\"" + (u ? u : "https://doi.org/" + d) + "\">doi:" + d + "</a>" : "";
b = b ? ". <i>" + b + "</i>" + s : undefined;
y = y ? y : "n.d.";
return a + " (" + y + "). " + t + (b || j) + p + "." + d;
})(window.getSelection().getRangeAt(0).cloneContents().textContent.split("\n").join(" ").replace(/\s+/g, " "));
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment