commit ab43605070546bac8657198a3d5cff42218af170
parent b232106526069091fe885675882c01d93a2211aa
Author: Dan Stillman <dstillman@zotero.org>
Date: Thu, 11 Aug 2011 07:01:19 +0000
Update SVN translators manually, for now
Diffstat:
47 files changed, 6446 insertions(+), 3188 deletions(-)
diff --git a/repotime.txt b/repotime.txt
@@ -1 +1 @@
-2011-04-25 18:05:00
+2011-08-03 01:05:00
diff --git a/translators/ACM.js b/translators/ACM.js
@@ -275,6 +275,9 @@ function scrapeAttachments(doc, url) {
Zotero.debug("Text Page: " + textURL);
attachments.push({title:"ACM Full Text HTML", mimeType:"text/html", url:textURL});
}
+
+ // Break at a reasonable limit
+ if (attachments.length > 20) return attachments;
}
return attachments;
diff --git a/translators/APA PsycNET.js b/translators/APA PsycNET.js
@@ -1,19 +1,20 @@
{
- "translatorID":"1e1e35be-6264-45a0-ad2e-7212040eb984",
- "translatorType":4,
- "label":"APA PsycNET",
- "creator":"Michael Berkowitz",
- "target":"http://psycnet\\.apa\\.org/",
- "minVersion":"1.0.0b4.r5",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2009-01-08 08:19:07"
+ "translatorID": "1e1e35be-6264-45a0-ad2e-7212040eb984",
+ "label": "APA PsycNET",
+ "creator": "Michael Berkowitz",
+ "target": "^http://psycnet\\.apa\\.org/",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-29 01:03:06"
}
function detectWeb(doc, url) {
if (url.match(/search\.searchResults/)) {
- return "multiple";
+ return false;
+ //return "multiple";
} else if (url.match(/search\.displayRecord/)) {
return "journalArticle";
}
@@ -24,12 +25,11 @@ function associateXPath(xpath, doc, ns) {
}
function doWeb(doc, url) {
- var namespace = doc.documentElement.namespaceURI;
- var nsResolver = namespace ? function(prefix) {
- if (prefix == 'x') return namespace; else return null;
- } : null;
-
- var arts = new Array();
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+ var arts = new Array();
if (detectWeb(doc, url) == "multiple") {
var items = new Object();
var titles = doc.evaluate('//div[@class="srhcTitle"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null);
@@ -41,22 +41,32 @@ function doWeb(doc, url) {
for (var i in items) {
arts.push(i);
}
+ Zotero.Utilities.processDocuments(arts, scrape, function() {Zotero.done();});
} else {
- arts = [url];
+ scrape(doc);
}
- Zotero.Utilities.processDocuments(arts, function(doc) {
+ Zotero.wait();
+}
+
+function scrape (doc) {
+ var namespace = null;
var newurl = doc.location.href;
- if (doc.evaluate('//input[@name="id"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
- var id = doc.evaluate('//input[@name="id"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
- var lstSelectedUIDs = doc.evaluate('//input[@name="lstUIDs"][@id="srhLstUIDs"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
- var get = 'http://psycnet.apa.org/index.cfm?fa=search.export&id=' + id + '&lstSelectedUIDs=' + lstSelectedUIDs + '&lstUIDs=&records=selected&displayFormat=&exportFormat=referenceSoftware&printDoc=0';
- Zotero.Utilities.HTTP.doGet(get, function(text) {
+ if (doc.evaluate('//input[@name="id"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var id = doc.evaluate('//input[@name="id"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
+ var lstSelectedUIDs = doc.evaluate('//input[@name="lstUIDs"][@id="srhLstUIDs"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
+ var get = 'http://psycnet.apa.org/index.cfm?fa=search.export'
+ var post = 'id=' + id + '&lstUIDs=' + lstSelectedUIDs + '&lstSelectedUIDs=&records=records&displayFormat=&exportFormat=referenceSoftware&printDoc=0';
+ // http://psycnet.apa.org/index.cfm?fa=search.exportFormat&singlerecord=1
+ // id=&lstSelectedUIDs=&lstUIDs=2004-16644-010&records=records&displayFormat=&exportFormat=referenceSoftware&printDoc=0
+ Zotero.Utilities.HTTP.doPost(get, post, function(text) {
+ // http://psycnet.apa.org/index.cfm?fa=search.export
var translator = Zotero.loadTranslator("import");
translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
translator.setString(text);
+ //Z.debug(text);
translator.setHandler("itemDone", function(obj, item) {
- item.url = newurl;
- item.attachments = [{url:newurl, title:"APA PsycNET Snapshot", mimeType:"text/html"}];
+ //item.url = newurl;
+ //item.attachments = [{url:newurl, title:"APA PsycNET Snapshot", mimeType:"text/html"}];
item.complete();
});
translator.translate();
@@ -77,6 +87,59 @@ function doWeb(doc, url) {
item.abstractNote = associateXPath('//div[@id="rdRecord"]/div[@class="rdRecordSection"][2]', doc, nsResolver);
item.complete();
}
- }, function() {Zotero.done();});
- Zotero.wait();
-}
-\ No newline at end of file
+ }/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://psycnet.apa.org/index.cfm?fa=search.displayRecord&uid=2004-16644-010",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "lastName": "Hervey",
+ "firstName": "Aaron S.",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Epstein",
+ "firstName": "Jeffery N.",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Curry",
+ "firstName": "John F.",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "attention-deficit/hyperactivity disorder",
+ "adults",
+ "behavioral inhibition",
+ "neuropsychological performance",
+ "developmental considerations",
+ "neuropsychological deficits",
+ "empirical methods"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "itemID": "2004-16644-010",
+ "title": "Neuropsychology of Adults With Attention-Deficit/Hyperactivity Disorder: A Meta-Analytic Review.",
+ "publicationTitle": "Neuropsychology",
+ "volume": "18",
+ "issue": "3",
+ "pages": "485-503",
+ "date": "2004",
+ "publisher": "US: American Psychological Association",
+ "ISBN": "1931-1559 (Electronic); 0894-4105 (Print)",
+ "ISSN": "1931-1559 (Electronic); 0894-4105 (Print)",
+ "abstractNote": "A comprehensive, empirically based review of the published studies addressing neuropsychological performance in adults diagnosed with attention-deficit/hyperactivity disorder (ADHD) was conducted to identify patterns of performance deficits. Findings from 33 published studies were submitted to a meta-analytic procedure producing sample-size-weighted mean effect sizes across test measures. Results suggest that neuropsychological deficits are expressed in adults with ADHD across multiple domains of functioning, with notable impairments in attention, behavioral inhibition, and memory, whereas normal performance is noted in simple reaction time. Theoretical and developmental considerations are discussed, including the role of behavioral inhibition and working memory impairment. Future directions for research based on these findings are highlighted, including further exploration of specific impairments and an emphasis on particular tests and testing conditions. (PsycINFO Database Record (c) 2010 APA, all rights reserved)",
+ "DOI": "10.1037/0894-4105.18.3.485",
+ "libraryCatalog": "APA PsycNET",
+ "shortTitle": "Neuropsychology of Adults With Attention-Deficit/Hyperactivity Disorder"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Amazon.com.js b/translators/Amazon.com.js
@@ -9,14 +9,14 @@
"inRepository": true,
"translatorType": 4,
"browserSupport": "gcs",
- "lastUpdated": "2011-07-03 04:56:24"
+ "lastUpdated": "2011-07-19 00:16:21"
}
function detectWeb(doc, url) {
var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
var suffixMatch = suffixRe.exec(url);
var suffix = suffixMatch[1];
- var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/|[^/]+/lm/|gp/richpub/)');
+ var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/|s\\?|[^/]+/lm/|gp/richpub/)');
Zotero.debug(searchRe.test(doc.location.href));
if(searchRe.test(doc.location.href)) {
return "multiple";
@@ -53,7 +53,7 @@ function doWeb(doc, url) {
var suffixMatch = suffixRe.exec(url);
suffix = suffixMatch[1];
- var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/|[^/]+/lm/|gp/richpub/)');
+ var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/|s\\?|[^/]+/lm/|gp/richpub/)');
var m = searchRe.exec(doc.location.href);
var uris = new Array();
if (suffix == "co.jp"){
@@ -86,22 +86,22 @@ function doWeb(doc, url) {
i++;
}
} while (elmt = elmts.iterateNext());
-
+
Zotero.selectItems(availableItems, function(items) {
- if(!items) {
- return true;
- }
-
- for(var i in items) {
- var timestamp = encodeURIComponent(generateISODate());
- var params = "AWSAccessKeyId=AKIAIPYIWJ24AGZJ64AA&ItemId=" + Zotero.Utilities.trim(asins[i]) + "&Operation=ItemLookup&ResponseGroup=ItemAttributes&Service=AWSECommerceService&Timestamp="+timestamp+"&Version=2006-06-28";
- var signString = "GET\necs.amazonaws."+suffix+"\n/onca/xml\n"+params;
- var signature = b64_hmac_sha256("054vk/Lt3LJMxch1srIHUbvI+2T/fZ6E5c0qwlbj", signString);
- signature = encodeURIComponent(signature);
- uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?"+params+"&Signature="+signature+"%3D"); //wants the %3D for some reason
- }
-
- Zotero.Utilities.HTTP.doGet(uris, parseXML, function() {Zotero.done();}, null);
+ if(!items) {
+ return true;
+ }
+
+ for(var i in items) {
+ var timestamp = encodeURIComponent(generateISODate());
+ var params = "AWSAccessKeyId=AKIAIPYIWJ24AGZJ64AA&ItemId=" + Zotero.Utilities.trim(asins[i]) + "&Operation=ItemLookup&ResponseGroup=ItemAttributes&Service=AWSECommerceService&Timestamp="+timestamp+"&Version=2006-06-28";
+ var signString = "GET\necs.amazonaws."+suffix+"\n/onca/xml\n"+params;
+ var signature = b64_hmac_sha256("054vk/Lt3LJMxch1srIHUbvI+2T/fZ6E5c0qwlbj", signString);
+ signature = encodeURIComponent(signature);
+ uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?"+params+"&Signature="+signature+"%3D"); //wants the %3D for some reason
+ }
+
+ Zotero.Utilities.HTTP.doGet(uris, parseXML, function() {Zotero.done();}, null);
});
} else {
@@ -116,7 +116,7 @@ function doWeb(doc, url) {
var signature = b64_hmac_sha256("054vk/Lt3LJMxch1srIHUbvI+2T/fZ6E5c0qwlbj", signString);
signature = encodeURIComponent(signature);
uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?"+params+"&Signature="+signature+"%3D"); //wants the %3D for some reason
- Zotero.Utilities.HTTP.doGet(uris, parseXML, function() {Zotero.done();}, null);
+ Zotero.Utilities.HTTP.doGet(uris, parseXML, function() {Zotero.done();}, null);
}
Zotero.wait();
}
@@ -130,9 +130,9 @@ function parseXML(text) {
var publisher = "";
if (!ZU.xpath(xml, "//Errors").length) {
- var publisher = getXPathNodeTrimmed(xml, "Publisher");
- var binding = getXPathNodeTrimmed(xml, "Binding");
- var productGroup = getXPathNodeTrimmed(xml, "ProductGroup");
+ var publisher = getXPathNodeTrimmed(xml, "Publisher");
+ var binding = getXPathNodeTrimmed(xml, "Binding");
+ var productGroup = getXPathNodeTrimmed(xml, "ProductGroup");
if (productGroup=="Book") {
var newItem = new Zotero.Item("book");
@@ -142,46 +142,46 @@ function parseXML(text) {
var newItem = new Zotero.Item("audioRecording");
newItem.label = publisher;
newItem.audioRecordingType = binding;
- getCreatorNodes(xml, "Artist", newItem, "performer");
+ getCreatorNodes(xml, "Artist", newItem, "performer");
}
else if (productGroup == "DVD" | productGroup == "Video") {
var newItem = new Zotero.Item("videoRecording");
newItem.studio = publisher;
newItem.videoRecordingType = binding;
- getCreatorNodes(xml, "Actor", newItem, "castMember");
- getCreatorNodes(xml, "Director", newItem, "director");
+ getCreatorNodes(xml, "Actor", newItem, "castMember");
+ getCreatorNodes(xml, "Director", newItem, "director");
}
else{
var newItem = new Zotero.Item("book");
newItem.publisher = publisher;
}
- newItem.runningTime = getXPathNodeTrimmed(xml, "RunningTime");
+ newItem.runningTime = getXPathNodeTrimmed(xml, "RunningTime");
// Retrieve authors and other creators
- getCreatorNodes(xml, "Author", newItem, "author");
+ getCreatorNodes(xml, "Author", newItem, "author");
if (newItem.creators.length == 0){
- getCreatorNodes(xml, "Creator", newItem, "author");
+ getCreatorNodes(xml, "Creator", newItem, "author");
}
- newItem.date = getXPathNodeTrimmed(xml, "PublicationDate");
+ newItem.date = getXPathNodeTrimmed(xml, "PublicationDate");
if (!newItem.date){
newItem.date = getXPathNodeTrimmed(xml, "ReleaseDate");
}
- newItem.edition = getXPathNodeTrimmed(xml, "Edition");
- newItem.ISBN = getXPathNodeTrimmed(xml, "ISBN");
- newItem.numPages = getXPathNodeTrimmed(xml, "NumberOfPages");
+ newItem.edition = getXPathNodeTrimmed(xml, "Edition");
+ newItem.ISBN = getXPathNodeTrimmed(xml, "ISBN");
+ newItem.numPages = getXPathNodeTrimmed(xml, "NumberOfPages");
var title = getXPathNodeTrimmed(xml, "Title");
if(title.lastIndexOf("(") != -1 && title.lastIndexOf(")") == title.length-1) {
title = title.substring(0, title.lastIndexOf("(")-1);
}
- var ASIN = getXPathNodeTrimmed(xml, "ASIN");
+ var ASIN = getXPathNodeTrimmed(xml, "ASIN");
if (ASIN){
var url = "http://www.amazon." + suffix + "/dp/" + ASIN;
newItem.attachments.push({title:"Amazon.com Link", snapshot:false, mimeType:"text/html", url:url});
}
- newItem.extra = getXPathNodeTrimmed(xml, "OriginalReleaseDate");
+ newItem.extra = getXPathNodeTrimmed(xml, "OriginalReleaseDate");
newItem.title = title;
newItem.complete();
@@ -190,15 +190,15 @@ function parseXML(text) {
function getXPathNodeTrimmed(xml, name) {
var node = ZU.xpath(xml, "//"+name);
- var val = "";
- if(node.length){
+ var val = "";
+ if(node.length){
val = Zotero.Utilities.trimInternal(node[0].textContent);
}
- return val;
+ return val;
}
function getCreatorNodes(xml, name, newItem, creatorType) {
- var nodes = ZU.xpath(xml, "//"+name);
+ var nodes = ZU.xpath(xml, "//"+name);
for(var i=0; i<nodes.length; i++) {
newItem.creators.push(Zotero.Utilities.cleanAuthor(nodes[i].textContent, creatorType));
}
@@ -247,7 +247,7 @@ function any_hmac_sha256(k, d, e)
function sha256_vm_test()
{
return hex_sha256("abc").toLowerCase() ==
- "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
+ "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
}
/*
@@ -269,8 +269,8 @@ function rstr_hmac_sha256(key, data)
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
- ipad[i] = bkey[i] ^ 0x36363636;
- opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
@@ -288,9 +288,9 @@ function rstr2hex(input)
var x;
for(var i = 0; i < input.length; i++)
{
- x = input.charCodeAt(i);
- output += hex_tab.charAt((x >>> 4) & 0x0F)
- + hex_tab.charAt( x & 0x0F);
+ x = input.charCodeAt(i);
+ output += hex_tab.charAt((x >>> 4) & 0x0F)
+ + hex_tab.charAt( x & 0x0F);
}
return output;
}
@@ -306,14 +306,14 @@ function rstr2b64(input)
var len = input.length;
for(var i = 0; i < len; i += 3)
{
- var triplet = (input.charCodeAt(i) << 16)
- | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
- | (i + 2 < len ? input.charCodeAt(i+2) : 0);
- for(var j = 0; j < 4; j++)
- {
- if(i * 8 + j * 6 > input.length * 8) output += b64pad;
- else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
- }
+ var triplet = (input.charCodeAt(i) << 16)
+ | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
+ | (i + 2 < len ? input.charCodeAt(i+2) : 0);
+ for(var j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > input.length * 8) output += b64pad;
+ else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
+ }
}
return output;
}
@@ -331,7 +331,7 @@ function rstr2any(input, encoding)
var dividend = Array(Math.ceil(input.length / 2));
for(i = 0; i < dividend.length; i++)
{
- dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
+ dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
}
/*
@@ -342,30 +342,30 @@ function rstr2any(input, encoding)
*/
while(dividend.length > 0)
{
- quotient = Array();
- x = 0;
- for(i = 0; i < dividend.length; i++)
- {
- x = (x << 16) + dividend[i];
- q = Math.floor(x / divisor);
- x -= q * divisor;
- if(quotient.length > 0 || q > 0)
- quotient[quotient.length] = q;
- }
- remainders[remainders.length] = x;
- dividend = quotient;
+ quotient = Array();
+ x = 0;
+ for(i = 0; i < dividend.length; i++)
+ {
+ x = (x << 16) + dividend[i];
+ q = Math.floor(x / divisor);
+ x -= q * divisor;
+ if(quotient.length > 0 || q > 0)
+ quotient[quotient.length] = q;
+ }
+ remainders[remainders.length] = x;
+ dividend = quotient;
}
/* Convert the remainders to the output string */
var output = "";
for(i = remainders.length - 1; i >= 0; i--)
- output += encoding.charAt(remainders[i]);
+ output += encoding.charAt(remainders[i]);
/* Append leading zero equivalents */
var full_length = Math.ceil(input.length * 8 /
- (Math.log(encoding.length) / Math.log(2)))
+ (Math.log(encoding.length) / Math.log(2)))
for(i = output.length; i < full_length; i++)
- output = encoding[0] + output;
+ output = encoding[0] + output;
return output;
}
@@ -382,30 +382,30 @@ function str2rstr_utf8(input)
while(++i < input.length)
{
- /* Decode utf-16 surrogate pairs */
- x = input.charCodeAt(i);
- y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
- if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
- {
- x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
- i++;
- }
-
- /* Encode output as utf-8 */
- if(x <= 0x7F)
- output += String.fromCharCode(x);
- else if(x <= 0x7FF)
- output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
- 0x80 | ( x & 0x3F));
- else if(x <= 0xFFFF)
- output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
- 0x80 | ((x >>> 6 ) & 0x3F),
- 0x80 | ( x & 0x3F));
- else if(x <= 0x1FFFFF)
- output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
- 0x80 | ((x >>> 12) & 0x3F),
- 0x80 | ((x >>> 6 ) & 0x3F),
- 0x80 | ( x & 0x3F));
+ /* Decode utf-16 surrogate pairs */
+ x = input.charCodeAt(i);
+ y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
+ if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
+ {
+ x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
+ i++;
+ }
+
+ /* Encode output as utf-8 */
+ if(x <= 0x7F)
+ output += String.fromCharCode(x);
+ else if(x <= 0x7FF)
+ output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
+ 0x80 | ( x & 0x3F));
+ else if(x <= 0xFFFF)
+ output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
+ 0x80 | ((x >>> 6 ) & 0x3F),
+ 0x80 | ( x & 0x3F));
+ else if(x <= 0x1FFFFF)
+ output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
+ 0x80 | ((x >>> 12) & 0x3F),
+ 0x80 | ((x >>> 6 ) & 0x3F),
+ 0x80 | ( x & 0x3F));
}
return output;
}
@@ -417,8 +417,8 @@ function str2rstr_utf16le(input)
{
var output = "";
for(var i = 0; i < input.length; i++)
- output += String.fromCharCode( input.charCodeAt(i) & 0xFF,
- (input.charCodeAt(i) >>> 8) & 0xFF);
+ output += String.fromCharCode( input.charCodeAt(i) & 0xFF,
+ (input.charCodeAt(i) >>> 8) & 0xFF);
return output;
}
@@ -426,8 +426,8 @@ function str2rstr_utf16be(input)
{
var output = "";
for(var i = 0; i < input.length; i++)
- output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
- input.charCodeAt(i) & 0xFF);
+ output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
+ input.charCodeAt(i) & 0xFF);
return output;
}
@@ -439,9 +439,9 @@ function rstr2binb(input)
{
var output = Array(input.length >> 2);
for(var i = 0; i < output.length; i++)
- output[i] = 0;
+ output[i] = 0;
for(var i = 0; i < input.length * 8; i += 8)
- output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
+ output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
return output;
}
@@ -452,7 +452,7 @@ function binb2rstr(input)
{
var output = "";
for(var i = 0; i < input.length * 32; i += 8)
- output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
+ output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
return output;
}
@@ -490,7 +490,7 @@ var sha256_K = new Array
function binb_sha256(m, l)
{
var HASH = new Array(1779033703, -1150833019, 1013904242, -1521486534,
- 1359893119, -1694144372, 528734635, 1541459225);
+ 1359893119, -1694144372, 528734635, 1541459225);
var W = new Array(64);
var a, b, c, d, e, f, g, h;
var i, j, T1, T2;
@@ -501,42 +501,42 @@ function binb_sha256(m, l)
for(i = 0; i < m.length; i += 16)
{
- a = HASH[0];
- b = HASH[1];
- c = HASH[2];
- d = HASH[3];
- e = HASH[4];
- f = HASH[5];
- g = HASH[6];
- h = HASH[7];
-
- for(j = 0; j < 64; j++)
- {
- if (j < 16) W[j] = m[j + i];
- else W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
- sha256_Gamma0256(W[j - 15])), W[j - 16]);
-
- T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
- sha256_K[j]), W[j]);
- T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
- h = g;
- g = f;
- f = e;
- e = safe_add(d, T1);
- d = c;
- c = b;
- b = a;
- a = safe_add(T1, T2);
- }
-
- HASH[0] = safe_add(a, HASH[0]);
- HASH[1] = safe_add(b, HASH[1]);
- HASH[2] = safe_add(c, HASH[2]);
- HASH[3] = safe_add(d, HASH[3]);
- HASH[4] = safe_add(e, HASH[4]);
- HASH[5] = safe_add(f, HASH[5]);
- HASH[6] = safe_add(g, HASH[6]);
- HASH[7] = safe_add(h, HASH[7]);
+ a = HASH[0];
+ b = HASH[1];
+ c = HASH[2];
+ d = HASH[3];
+ e = HASH[4];
+ f = HASH[5];
+ g = HASH[6];
+ h = HASH[7];
+
+ for(j = 0; j < 64; j++)
+ {
+ if (j < 16) W[j] = m[j + i];
+ else W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
+ sha256_Gamma0256(W[j - 15])), W[j - 16]);
+
+ T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
+ sha256_K[j]), W[j]);
+ T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
+ h = g;
+ g = f;
+ f = e;
+ e = safe_add(d, T1);
+ d = c;
+ c = b;
+ b = a;
+ a = safe_add(T1, T2);
+ }
+
+ HASH[0] = safe_add(a, HASH[0]);
+ HASH[1] = safe_add(b, HASH[1]);
+ HASH[2] = safe_add(c, HASH[2]);
+ HASH[3] = safe_add(d, HASH[3]);
+ HASH[4] = safe_add(e, HASH[4]);
+ HASH[5] = safe_add(f, HASH[5]);
+ HASH[6] = safe_add(g, HASH[6]);
+ HASH[7] = safe_add(h, HASH[7]);
}
return HASH;
}
@@ -617,7 +617,7 @@ var testCases = [
],
"label": "Sire / London/Rhino",
"audioRecordingType": "Audio CD",
- "date": "1991",
+ "date": "1991-11-05",
"extra": "1991-11-05",
"title": "Loveless",
"libraryCatalog": "Amazon.com"
@@ -663,6 +663,11 @@ var testCases = [
"libraryCatalog": "Amazon.com"
}
]
+ },
+ {
+ "type": "web",
+ "url": "http://www.amazon.com/s?ie=UTF8&keywords=The%20Harvard%20Concise%20Dictionary%20of%20Music%20and%20Musicians&index=blended&Go=o",
+ "items": "multiple"
}
]
-/** END TEST CASES **/
-\ No newline at end of file
+/** END TEST CASES **/
diff --git a/translators/BibTeX.js b/translators/BibTeX.js
@@ -1,17 +1,20 @@
{
- "translatorID":"9cb70025-a888-4a29-a210-93ec52da40d4",
- "translatorType":3,
- "label":"BibTeX",
- "creator":"Simon Kornblith and Richard Karnesky",
- "target":"bib",
- "minVersion":"2.1.3",
- "maxVersion":"",
- "priority":200,
- "browserSupport":"gcs",
- "configOptions":{"dataMode":"block"},
- "displayOptions":{"exportCharset":"UTF-8", "exportNotes":true, "exportFileData":false},
- "inRepository":true,
- "lastUpdated":"2011-07-02 00:39:53"
+ "translatorID": "9cb70025-a888-4a29-a210-93ec52da40d4",
+ "label": "BibTeX",
+ "creator": "Simon Kornblith and Richard Karnesky",
+ "target": "bib",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 200,
+ "displayOptions": {
+ "exportCharset": "UTF-8",
+ "exportNotes": true,
+ "exportFileData": false
+ },
+ "inRepository": true,
+ "translatorType": 3,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-29 03:35:07"
}
function detectImport() {
@@ -39,7 +42,10 @@ function detectImport() {
// read until next newline
block = "";
inComment = true;
- } else if((chr == "\n" || chr == "\r") && block) {
+ } else if((chr == "\n" || chr == "\r"
+ // allow one-line entries
+ || i == (buffer.length - 1))
+ && block) {
// check if this is a BibTeX entry
if(re.test(block)) {
return true;
@@ -125,7 +131,7 @@ var bibtex2zoteroTypeMap = {
* LaTeX book.)
*/
var months = ["jan", "feb", "mar", "apr", "may", "jun",
- "jul", "aug", "sep", "oct", "nov", "dec"];
+ "jul", "aug", "sep", "oct", "nov", "dec"];
/*
* new mapping table based on that from Matthias Steffens,
@@ -133,1400 +139,1400 @@ var months = ["jan", "feb", "mar", "apr", "may", "jun",
*/
var mappingTable = {
- "\u00A0":"~", // NO-BREAK SPACE
- "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK
- "\u00A2":"{\\textcent}", // CENT SIGN
- "\u00A3":"{\\textsterling}", // POUND SIGN
- "\u00A5":"{\\textyen}", // YEN SIGN
- "\u00A6":"{\\textbrokenbar}", // BROKEN BAR
- "\u00A7":"{\\textsection}", // SECTION SIGN
- "\u00A8":"{\\textasciidieresis}", // DIAERESIS
- "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN
- "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR
- "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- "\u00AC":"{\\textlnot}", // NOT SIGN
- "\u00AD":"-", // SOFT HYPHEN
- "\u00AE":"{\\textregistered}", // REGISTERED SIGN
- "\u00AF":"{\\textasciimacron}", // MACRON
- "\u00B0":"{\\textdegree}", // DEGREE SIGN
- "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN
- "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO
- "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE
- "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT
- "\u00B5":"{\\textmu}", // MICRO SIGN
- "\u00B6":"{\\textparagraph}", // PILCROW SIGN
- "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT
- "\u00B8":"{\\c\\ }", // CEDILLA
- "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE
- "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR
- "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER
- "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF
- "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS
- "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK
- "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE
- "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH
- "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN
- "\U00D8":"{\\O}", // LATIN CAPITAL LETTER O WITH STROKE
- "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN
- "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S
- "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE
- "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH
- "\u00F7":"{\\textdiv}", // DIVISION SIGN
- "\U00F8":"{\\o}", // LATIN SMALL LETTER O WITH STROKE
- "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN
- "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I
- "\u0132":"IJ", // LATIN CAPITAL LIGATURE IJ
- "\u0133":"ij", // LATIN SMALL LIGATURE IJ
- "\u0138":"k", // LATIN SMALL LETTER KRA
- "\u0149":"'n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
- "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG
- "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG
- "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE
- "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE
- "\u017F":"s", // LATIN SMALL LETTER LONG S
- "\u02B9":"'", // MODIFIER LETTER PRIME
- "\u02BB":"'", // MODIFIER LETTER TURNED COMMA
- "\u02BC":"'", // MODIFIER LETTER APOSTROPHE
- "\u02BD":"'", // MODIFIER LETTER REVERSED COMMA
- "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT
- "\u02C8":"'", // MODIFIER LETTER VERTICAL LINE
- "\u02C9":"-", // MODIFIER LETTER MACRON
- "\u02CC":",", // MODIFIER LETTER LOW VERTICAL LINE
- "\u02D0":":", // MODIFIER LETTER TRIANGULAR COLON
- "\u02DA":"o", // RING ABOVE
- "\u02DC":"\\~{}", // SMALL TILDE
- "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT
- "\u0374":"'", // GREEK NUMERAL SIGN
- "\u0375":",", // GREEK LOWER NUMERAL SIGN
- "\u037E":";", // GREEK QUESTION MARK
- "\u2000":" ", // EN QUAD
- "\u2001":" ", // EM QUAD
- "\u2002":" ", // EN SPACE
- "\u2003":" ", // EM SPACE
- "\u2004":" ", // THREE-PER-EM SPACE
- "\u2005":" ", // FOUR-PER-EM SPACE
- "\u2006":" ", // SIX-PER-EM SPACE
- "\u2007":" ", // FIGURE SPACE
- "\u2008":" ", // PUNCTUATION SPACE
- "\u2009":" ", // THIN SPACE
- "\u2010":"-", // HYPHEN
- "\u2011":"-", // NON-BREAKING HYPHEN
- "\u2012":"-", // FIGURE DASH
- "\u2013":"{\\textendash}", // EN DASH
- "\u2014":"{\\textemdash}", // EM DASH
- "\u2015":"{\\textemdash}", // HORIZONTAL BAR or QUOTATION DASH (not in LaTeX -- use EM DASH)
- "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE
- "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE
- "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK
- "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK
- "`" : "\u2018", // LEFT SINGLE QUOTATION MARK
- "'" : "\u2019", // RIGHT SINGLE QUOTATION MARK
- "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK
- "\u201B":"'", // SINGLE HIGH-REVERSED-9 QUOTATION MARK
- "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK
- "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK
- "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK
- "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
- "\u2020":"{\\textdagger}", // DAGGER
- "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER
- "\u2022":"{\\textbullet}", // BULLET
- "\u2023":">", // TRIANGULAR BULLET
- "\u2024":".", // ONE DOT LEADER
- "\u2025":"..", // TWO DOT LEADER
- "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS
- "\u2027":"-", // HYPHENATION POINT
- "\u202F":" ", // NARROW NO-BREAK SPACE
- "\u2030":"{\\textperthousand}", // PER MILLE SIGN
- "\u2032":"'", // PRIME
- "\u2033":"'", // DOUBLE PRIME
- "\u2034":"'''", // TRIPLE PRIME
- "\u2035":"`", // REVERSED PRIME
- "\u2036":"``", // REVERSED DOUBLE PRIME
- "\u2037":"```", // REVERSED TRIPLE PRIME
- "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- "\u203C":"!!", // DOUBLE EXCLAMATION MARK
- "\u203E":"-", // OVERLINE
- "\u2043":"-", // HYPHEN BULLET
- "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH
- "\u2048":"?!", // QUESTION EXCLAMATION MARK
- "\u2049":"!?", // EXCLAMATION QUESTION MARK
- "\u204A":"7", // TIRONIAN SIGN ET
- "\u2070":"$^{0}$", // SUPERSCRIPT ZERO
- "\u2074":"$^{4}$", // SUPERSCRIPT FOUR
- "\u2075":"$^{5}$", // SUPERSCRIPT FIVE
- "\u2076":"$^{6}$", // SUPERSCRIPT SIX
- "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN
- "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT
- "\u2079":"$^{9}$", // SUPERSCRIPT NINE
- "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN
- "\u207B":"$^{-}$", // SUPERSCRIPT MINUS
- "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN
- "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS
- "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS
- "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N
- "\u2080":"$_{0}$", // SUBSCRIPT ZERO
- "\u2081":"$_{1}$", // SUBSCRIPT ONE
- "\u2082":"$_{2}$", // SUBSCRIPT TWO
- "\u2083":"$_{3}$", // SUBSCRIPT THREE
- "\u2084":"$_{4}$", // SUBSCRIPT FOUR
- "\u2085":"$_{5}$", // SUBSCRIPT FIVE
- "\u2086":"$_{6}$", // SUBSCRIPT SIX
- "\u2087":"$_{7}$", // SUBSCRIPT SEVEN
- "\u2088":"$_{8}$", // SUBSCRIPT EIGHT
- "\u2089":"$_{9}$", // SUBSCRIPT NINE
- "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN
- "\u208B":"$_{-}$", // SUBSCRIPT MINUS
- "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN
- "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS
- "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS
- "\u20AC":"{\\texteuro}", // EURO SIGN
- "\u2100":"a/c", // ACCOUNT OF
- "\u2101":"a/s", // ADDRESSED TO THE SUBJECT
- "\u2103":"{\\textcelsius}", // DEGREE CELSIUS
- "\u2105":"c/o", // CARE OF
- "\u2106":"c/u", // CADA UNA
- "\u2109":"F", // DEGREE FAHRENHEIT
- "\u2113":"l", // SCRIPT SMALL L
- "\u2116":"{\\textnumero}", // NUMERO SIGN
- "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT
- "\u2120":"{\\textservicemark}", // SERVICE MARK
- "\u2121":"TEL", // TELEPHONE SIGN
- "\u2122":"{\\texttrademark}", // TRADE MARK SIGN
- "\u2126":"{\\textohm}", // OHM SIGN
- "\u212A":"K", // KELVIN SIGN
- "\u212B":"A", // ANGSTROM SIGN
- "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL
- "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD
- "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS
- "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH
- "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS
- "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS
- "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS
- "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH
- "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS
- "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH
- "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS
- "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS
- "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS
- "\u215F":" 1/", // FRACTION NUMERATOR ONE
- "\u2160":"I", // ROMAN NUMERAL ONE
- "\u2161":"II", // ROMAN NUMERAL TWO
- "\u2162":"III", // ROMAN NUMERAL THREE
- "\u2163":"IV", // ROMAN NUMERAL FOUR
- "\u2164":"V", // ROMAN NUMERAL FIVE
- "\u2165":"VI", // ROMAN NUMERAL SIX
- "\u2166":"VII", // ROMAN NUMERAL SEVEN
- "\u2167":"VIII", // ROMAN NUMERAL EIGHT
- "\u2168":"IX", // ROMAN NUMERAL NINE
- "\u2169":"X", // ROMAN NUMERAL TEN
- "\u216A":"XI", // ROMAN NUMERAL ELEVEN
- "\u216B":"XII", // ROMAN NUMERAL TWELVE
- "\u216C":"L", // ROMAN NUMERAL FIFTY
- "\u216D":"C", // ROMAN NUMERAL ONE HUNDRED
- "\u216E":"D", // ROMAN NUMERAL FIVE HUNDRED
- "\u216F":"M", // ROMAN NUMERAL ONE THOUSAND
- "\u2170":"i", // SMALL ROMAN NUMERAL ONE
- "\u2171":"ii", // SMALL ROMAN NUMERAL TWO
- "\u2172":"iii", // SMALL ROMAN NUMERAL THREE
- "\u2173":"iv", // SMALL ROMAN NUMERAL FOUR
- "\u2174":"v", // SMALL ROMAN NUMERAL FIVE
- "\u2175":"vi", // SMALL ROMAN NUMERAL SIX
- "\u2176":"vii", // SMALL ROMAN NUMERAL SEVEN
- "\u2177":"viii", // SMALL ROMAN NUMERAL EIGHT
- "\u2178":"ix", // SMALL ROMAN NUMERAL NINE
- "\u2179":"x", // SMALL ROMAN NUMERAL TEN
- "\u217A":"xi", // SMALL ROMAN NUMERAL ELEVEN
- "\u217B":"xii", // SMALL ROMAN NUMERAL TWELVE
- "\u217C":"l", // SMALL ROMAN NUMERAL FIFTY
- "\u217D":"c", // SMALL ROMAN NUMERAL ONE HUNDRED
- "\u217E":"d", // SMALL ROMAN NUMERAL FIVE HUNDRED
- "\u217F":"m", // SMALL ROMAN NUMERAL ONE THOUSAND
- "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW
- "\u2191":"{\\textuparrow}", // UPWARDS ARROW
- "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW
- "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW
- "\u2194":"<->", // LEFT RIGHT ARROW
- "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW
- "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW
- "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW
- "\u2212":"-", // MINUS SIGN
- "\u2215":"/", // DIVISION SLASH
- "\u2216":"\\", // SET MINUS
- "\u2217":"*", // ASTERISK OPERATOR
- "\u2218":"o", // RING OPERATOR
- "\u2219":".", // BULLET OPERATOR
- "\u221E":"$\\infty$", // INFINITY
- "\u2223":"|", // DIVIDES
- "\u2225":"||", // PARALLEL TO
- "\u2236":":", // RATIO
- "\u223C":"\\~{}", // TILDE OPERATOR
- "\u2260":"/=", // NOT EQUAL TO
- "\u2261":"=", // IDENTICAL TO
- "\u2264":"<=", // LESS-THAN OR EQUAL TO
- "\u2265":">=", // GREATER-THAN OR EQUAL TO
- "\u226A":"<<", // MUCH LESS-THAN
- "\u226B":">>", // MUCH GREATER-THAN
- "\u2295":"(+)", // CIRCLED PLUS
- "\u2296":"(-)", // CIRCLED MINUS
- "\u2297":"(x)", // CIRCLED TIMES
- "\u2298":"(/)", // CIRCLED DIVISION SLASH
- "\u22A2":"|-", // RIGHT TACK
- "\u22A3":"-|", // LEFT TACK
- "\u22A6":"|-", // ASSERTION
- "\u22A7":"|=", // MODELS
- "\u22A8":"|=", // TRUE
- "\u22A9":"||-", // FORCES
- "\u22C5":".", // DOT OPERATOR
- "\u22C6":"*", // STAR OPERATOR
- "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO
- "\u22D8":"<<<", // VERY MUCH LESS-THAN
- "\u22D9":">>>", // VERY MUCH GREATER-THAN
- "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET
- "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET
- "\u2400":"NUL", // SYMBOL FOR NULL
- "\u2401":"SOH", // SYMBOL FOR START OF HEADING
- "\u2402":"STX", // SYMBOL FOR START OF TEXT
- "\u2403":"ETX", // SYMBOL FOR END OF TEXT
- "\u2404":"EOT", // SYMBOL FOR END OF TRANSMISSION
- "\u2405":"ENQ", // SYMBOL FOR ENQUIRY
- "\u2406":"ACK", // SYMBOL FOR ACKNOWLEDGE
- "\u2407":"BEL", // SYMBOL FOR BELL
- "\u2408":"BS", // SYMBOL FOR BACKSPACE
- "\u2409":"HT", // SYMBOL FOR HORIZONTAL TABULATION
- "\u240A":"LF", // SYMBOL FOR LINE FEED
- "\u240B":"VT", // SYMBOL FOR VERTICAL TABULATION
- "\u240C":"FF", // SYMBOL FOR FORM FEED
- "\u240D":"CR", // SYMBOL FOR CARRIAGE RETURN
- "\u240E":"SO", // SYMBOL FOR SHIFT OUT
- "\u240F":"SI", // SYMBOL FOR SHIFT IN
- "\u2410":"DLE", // SYMBOL FOR DATA LINK ESCAPE
- "\u2411":"DC1", // SYMBOL FOR DEVICE CONTROL ONE
- "\u2412":"DC2", // SYMBOL FOR DEVICE CONTROL TWO
- "\u2413":"DC3", // SYMBOL FOR DEVICE CONTROL THREE
- "\u2414":"DC4", // SYMBOL FOR DEVICE CONTROL FOUR
- "\u2415":"NAK", // SYMBOL FOR NEGATIVE ACKNOWLEDGE
- "\u2416":"SYN", // SYMBOL FOR SYNCHRONOUS IDLE
- "\u2417":"ETB", // SYMBOL FOR END OF TRANSMISSION BLOCK
- "\u2418":"CAN", // SYMBOL FOR CANCEL
- "\u2419":"EM", // SYMBOL FOR END OF MEDIUM
- "\u241A":"SUB", // SYMBOL FOR SUBSTITUTE
- "\u241B":"ESC", // SYMBOL FOR ESCAPE
- "\u241C":"FS", // SYMBOL FOR FILE SEPARATOR
- "\u241D":"GS", // SYMBOL FOR GROUP SEPARATOR
- "\u241E":"RS", // SYMBOL FOR RECORD SEPARATOR
- "\u241F":"US", // SYMBOL FOR UNIT SEPARATOR
- "\u2420":"SP", // SYMBOL FOR SPACE
- "\u2421":"DEL", // SYMBOL FOR DELETE
- "\u2423":"{\\textvisiblespace}", // OPEN BOX
- "\u2424":"NL", // SYMBOL FOR NEWLINE
- "\u2425":"///", // SYMBOL FOR DELETE FORM TWO
- "\u2426":"?", // SYMBOL FOR SUBSTITUTE FORM TWO
- "\u2460":"(1)", // CIRCLED DIGIT ONE
- "\u2461":"(2)", // CIRCLED DIGIT TWO
- "\u2462":"(3)", // CIRCLED DIGIT THREE
- "\u2463":"(4)", // CIRCLED DIGIT FOUR
- "\u2464":"(5)", // CIRCLED DIGIT FIVE
- "\u2465":"(6)", // CIRCLED DIGIT SIX
- "\u2466":"(7)", // CIRCLED DIGIT SEVEN
- "\u2467":"(8)", // CIRCLED DIGIT EIGHT
- "\u2468":"(9)", // CIRCLED DIGIT NINE
- "\u2469":"(10)", // CIRCLED NUMBER TEN
- "\u246A":"(11)", // CIRCLED NUMBER ELEVEN
- "\u246B":"(12)", // CIRCLED NUMBER TWELVE
- "\u246C":"(13)", // CIRCLED NUMBER THIRTEEN
- "\u246D":"(14)", // CIRCLED NUMBER FOURTEEN
- "\u246E":"(15)", // CIRCLED NUMBER FIFTEEN
- "\u246F":"(16)", // CIRCLED NUMBER SIXTEEN
- "\u2470":"(17)", // CIRCLED NUMBER SEVENTEEN
- "\u2471":"(18)", // CIRCLED NUMBER EIGHTEEN
- "\u2472":"(19)", // CIRCLED NUMBER NINETEEN
- "\u2473":"(20)", // CIRCLED NUMBER TWENTY
- "\u2474":"(1)", // PARENTHESIZED DIGIT ONE
- "\u2475":"(2)", // PARENTHESIZED DIGIT TWO
- "\u2476":"(3)", // PARENTHESIZED DIGIT THREE
- "\u2477":"(4)", // PARENTHESIZED DIGIT FOUR
- "\u2478":"(5)", // PARENTHESIZED DIGIT FIVE
- "\u2479":"(6)", // PARENTHESIZED DIGIT SIX
- "\u247A":"(7)", // PARENTHESIZED DIGIT SEVEN
- "\u247B":"(8)", // PARENTHESIZED DIGIT EIGHT
- "\u247C":"(9)", // PARENTHESIZED DIGIT NINE
- "\u247D":"(10)", // PARENTHESIZED NUMBER TEN
- "\u247E":"(11)", // PARENTHESIZED NUMBER ELEVEN
- "\u247F":"(12)", // PARENTHESIZED NUMBER TWELVE
- "\u2480":"(13)", // PARENTHESIZED NUMBER THIRTEEN
- "\u2481":"(14)", // PARENTHESIZED NUMBER FOURTEEN
- "\u2482":"(15)", // PARENTHESIZED NUMBER FIFTEEN
- "\u2483":"(16)", // PARENTHESIZED NUMBER SIXTEEN
- "\u2484":"(17)", // PARENTHESIZED NUMBER SEVENTEEN
- "\u2485":"(18)", // PARENTHESIZED NUMBER EIGHTEEN
- "\u2486":"(19)", // PARENTHESIZED NUMBER NINETEEN
- "\u2487":"(20)", // PARENTHESIZED NUMBER TWENTY
- "\u2488":"1.", // DIGIT ONE FULL STOP
- "\u2489":"2.", // DIGIT TWO FULL STOP
- "\u248A":"3.", // DIGIT THREE FULL STOP
- "\u248B":"4.", // DIGIT FOUR FULL STOP
- "\u248C":"5.", // DIGIT FIVE FULL STOP
- "\u248D":"6.", // DIGIT SIX FULL STOP
- "\u248E":"7.", // DIGIT SEVEN FULL STOP
- "\u248F":"8.", // DIGIT EIGHT FULL STOP
- "\u2490":"9.", // DIGIT NINE FULL STOP
- "\u2491":"10.", // NUMBER TEN FULL STOP
- "\u2492":"11.", // NUMBER ELEVEN FULL STOP
- "\u2493":"12.", // NUMBER TWELVE FULL STOP
- "\u2494":"13.", // NUMBER THIRTEEN FULL STOP
- "\u2495":"14.", // NUMBER FOURTEEN FULL STOP
- "\u2496":"15.", // NUMBER FIFTEEN FULL STOP
- "\u2497":"16.", // NUMBER SIXTEEN FULL STOP
- "\u2498":"17.", // NUMBER SEVENTEEN FULL STOP
- "\u2499":"18.", // NUMBER EIGHTEEN FULL STOP
- "\u249A":"19.", // NUMBER NINETEEN FULL STOP
- "\u249B":"20.", // NUMBER TWENTY FULL STOP
- "\u249C":"(a)", // PARENTHESIZED LATIN SMALL LETTER A
- "\u249D":"(b)", // PARENTHESIZED LATIN SMALL LETTER B
- "\u249E":"(c)", // PARENTHESIZED LATIN SMALL LETTER C
- "\u249F":"(d)", // PARENTHESIZED LATIN SMALL LETTER D
- "\u24A0":"(e)", // PARENTHESIZED LATIN SMALL LETTER E
- "\u24A1":"(f)", // PARENTHESIZED LATIN SMALL LETTER F
- "\u24A2":"(g)", // PARENTHESIZED LATIN SMALL LETTER G
- "\u24A3":"(h)", // PARENTHESIZED LATIN SMALL LETTER H
- "\u24A4":"(i)", // PARENTHESIZED LATIN SMALL LETTER I
- "\u24A5":"(j)", // PARENTHESIZED LATIN SMALL LETTER J
- "\u24A6":"(k)", // PARENTHESIZED LATIN SMALL LETTER K
- "\u24A7":"(l)", // PARENTHESIZED LATIN SMALL LETTER L
- "\u24A8":"(m)", // PARENTHESIZED LATIN SMALL LETTER M
- "\u24A9":"(n)", // PARENTHESIZED LATIN SMALL LETTER N
- "\u24AA":"(o)", // PARENTHESIZED LATIN SMALL LETTER O
- "\u24AB":"(p)", // PARENTHESIZED LATIN SMALL LETTER P
- "\u24AC":"(q)", // PARENTHESIZED LATIN SMALL LETTER Q
- "\u24AD":"(r)", // PARENTHESIZED LATIN SMALL LETTER R
- "\u24AE":"(s)", // PARENTHESIZED LATIN SMALL LETTER S
- "\u24AF":"(t)", // PARENTHESIZED LATIN SMALL LETTER T
- "\u24B0":"(u)", // PARENTHESIZED LATIN SMALL LETTER U
- "\u24B1":"(v)", // PARENTHESIZED LATIN SMALL LETTER V
- "\u24B2":"(w)", // PARENTHESIZED LATIN SMALL LETTER W
- "\u24B3":"(x)", // PARENTHESIZED LATIN SMALL LETTER X
- "\u24B4":"(y)", // PARENTHESIZED LATIN SMALL LETTER Y
- "\u24B5":"(z)", // PARENTHESIZED LATIN SMALL LETTER Z
- "\u24B6":"(A)", // CIRCLED LATIN CAPITAL LETTER A
- "\u24B7":"(B)", // CIRCLED LATIN CAPITAL LETTER B
- "\u24B8":"(C)", // CIRCLED LATIN CAPITAL LETTER C
- "\u24B9":"(D)", // CIRCLED LATIN CAPITAL LETTER D
- "\u24BA":"(E)", // CIRCLED LATIN CAPITAL LETTER E
- "\u24BB":"(F)", // CIRCLED LATIN CAPITAL LETTER F
- "\u24BC":"(G)", // CIRCLED LATIN CAPITAL LETTER G
- "\u24BD":"(H)", // CIRCLED LATIN CAPITAL LETTER H
- "\u24BE":"(I)", // CIRCLED LATIN CAPITAL LETTER I
- "\u24BF":"(J)", // CIRCLED LATIN CAPITAL LETTER J
- "\u24C0":"(K)", // CIRCLED LATIN CAPITAL LETTER K
- "\u24C1":"(L)", // CIRCLED LATIN CAPITAL LETTER L
- "\u24C2":"(M)", // CIRCLED LATIN CAPITAL LETTER M
- "\u24C3":"(N)", // CIRCLED LATIN CAPITAL LETTER N
- "\u24C4":"(O)", // CIRCLED LATIN CAPITAL LETTER O
- "\u24C5":"(P)", // CIRCLED LATIN CAPITAL LETTER P
- "\u24C6":"(Q)", // CIRCLED LATIN CAPITAL LETTER Q
- "\u24C7":"(R)", // CIRCLED LATIN CAPITAL LETTER R
- "\u24C8":"(S)", // CIRCLED LATIN CAPITAL LETTER S
- "\u24C9":"(T)", // CIRCLED LATIN CAPITAL LETTER T
- "\u24CA":"(U)", // CIRCLED LATIN CAPITAL LETTER U
- "\u24CB":"(V)", // CIRCLED LATIN CAPITAL LETTER V
- "\u24CC":"(W)", // CIRCLED LATIN CAPITAL LETTER W
- "\u24CD":"(X)", // CIRCLED LATIN CAPITAL LETTER X
- "\u24CE":"(Y)", // CIRCLED LATIN CAPITAL LETTER Y
- "\u24CF":"(Z)", // CIRCLED LATIN CAPITAL LETTER Z
- "\u24D0":"(a)", // CIRCLED LATIN SMALL LETTER A
- "\u24D1":"(b)", // CIRCLED LATIN SMALL LETTER B
- "\u24D2":"(c)", // CIRCLED LATIN SMALL LETTER C
- "\u24D3":"(d)", // CIRCLED LATIN SMALL LETTER D
- "\u24D4":"(e)", // CIRCLED LATIN SMALL LETTER E
- "\u24D5":"(f)", // CIRCLED LATIN SMALL LETTER F
- "\u24D6":"(g)", // CIRCLED LATIN SMALL LETTER G
- "\u24D7":"(h)", // CIRCLED LATIN SMALL LETTER H
- "\u24D8":"(i)", // CIRCLED LATIN SMALL LETTER I
- "\u24D9":"(j)", // CIRCLED LATIN SMALL LETTER J
- "\u24DA":"(k)", // CIRCLED LATIN SMALL LETTER K
- "\u24DB":"(l)", // CIRCLED LATIN SMALL LETTER L
- "\u24DC":"(m)", // CIRCLED LATIN SMALL LETTER M
- "\u24DD":"(n)", // CIRCLED LATIN SMALL LETTER N
- "\u24DE":"(o)", // CIRCLED LATIN SMALL LETTER O
- "\u24DF":"(p)", // CIRCLED LATIN SMALL LETTER P
- "\u24E0":"(q)", // CIRCLED LATIN SMALL LETTER Q
- "\u24E1":"(r)", // CIRCLED LATIN SMALL LETTER R
- "\u24E2":"(s)", // CIRCLED LATIN SMALL LETTER S
- "\u24E3":"(t)", // CIRCLED LATIN SMALL LETTER T
- "\u24E4":"(u)", // CIRCLED LATIN SMALL LETTER U
- "\u24E5":"(v)", // CIRCLED LATIN SMALL LETTER V
- "\u24E6":"(w)", // CIRCLED LATIN SMALL LETTER W
- "\u24E7":"(x)", // CIRCLED LATIN SMALL LETTER X
- "\u24E8":"(y)", // CIRCLED LATIN SMALL LETTER Y
- "\u24E9":"(z)", // CIRCLED LATIN SMALL LETTER Z
- "\u24EA":"(0)", // CIRCLED DIGIT ZERO
- "\u2500":"-", // BOX DRAWINGS LIGHT HORIZONTAL
- "\u2501":"=", // BOX DRAWINGS HEAVY HORIZONTAL
- "\u2502":"|", // BOX DRAWINGS LIGHT VERTICAL
- "\u2503":"|", // BOX DRAWINGS HEAVY VERTICAL
- "\u2504":"-", // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
- "\u2505":"=", // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
- "\u2506":"|", // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
- "\u2507":"|", // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
- "\u2508":"-", // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
- "\u2509":"=", // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
- "\u250A":"|", // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
- "\u250B":"|", // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
- "\u250C":"+", // BOX DRAWINGS LIGHT DOWN AND RIGHT
- "\u250D":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
- "\u250E":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
- "\u250F":"+", // BOX DRAWINGS HEAVY DOWN AND RIGHT
- "\u2510":"+", // BOX DRAWINGS LIGHT DOWN AND LEFT
- "\u2511":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
- "\u2512":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
- "\u2513":"+", // BOX DRAWINGS HEAVY DOWN AND LEFT
- "\u2514":"+", // BOX DRAWINGS LIGHT UP AND RIGHT
- "\u2515":"+", // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
- "\u2516":"+", // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
- "\u2517":"+", // BOX DRAWINGS HEAVY UP AND RIGHT
- "\u2518":"+", // BOX DRAWINGS LIGHT UP AND LEFT
- "\u2519":"+", // BOX DRAWINGS UP LIGHT AND LEFT HEAVY
- "\u251A":"+", // BOX DRAWINGS UP HEAVY AND LEFT LIGHT
- "\u251B":"+", // BOX DRAWINGS HEAVY UP AND LEFT
- "\u251C":"+", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
- "\u251D":"+", // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
- "\u251E":"+", // BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
- "\u251F":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
- "\u2520":"+", // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
- "\u2521":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
- "\u2522":"+", // BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
- "\u2523":"+", // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
- "\u2524":"+", // BOX DRAWINGS LIGHT VERTICAL AND LEFT
- "\u2525":"+", // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
- "\u2526":"+", // BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
- "\u2527":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
- "\u2528":"+", // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
- "\u2529":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
- "\u252A":"+", // BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
- "\u252B":"+", // BOX DRAWINGS HEAVY VERTICAL AND LEFT
- "\u252C":"+", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
- "\u252D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
- "\u252E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
- "\u252F":"+", // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
- "\u2530":"+", // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
- "\u2531":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
- "\u2532":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
- "\u2533":"+", // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
- "\u2534":"+", // BOX DRAWINGS LIGHT UP AND HORIZONTAL
- "\u2535":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
- "\u2536":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
- "\u2537":"+", // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
- "\u2538":"+", // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
- "\u2539":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
- "\u253A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
- "\u253B":"+", // BOX DRAWINGS HEAVY UP AND HORIZONTAL
- "\u253C":"+", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
- "\u253D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
- "\u253E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
- "\u253F":"+", // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
- "\u2540":"+", // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
- "\u2541":"+", // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
- "\u2542":"+", // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
- "\u2543":"+", // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
- "\u2544":"+", // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
- "\u2545":"+", // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
- "\u2546":"+", // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
- "\u2547":"+", // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
- "\u2548":"+", // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
- "\u2549":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
- "\u254A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
- "\u254B":"+", // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
- "\u254C":"-", // BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
- "\u254D":"=", // BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
- "\u254E":"|", // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
- "\u254F":"|", // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
- "\u2550":"=", // BOX DRAWINGS DOUBLE HORIZONTAL
- "\u2551":"|", // BOX DRAWINGS DOUBLE VERTICAL
- "\u2552":"+", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
- "\u2553":"+", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
- "\u2554":"+", // BOX DRAWINGS DOUBLE DOWN AND RIGHT
- "\u2555":"+", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
- "\u2556":"+", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
- "\u2557":"+", // BOX DRAWINGS DOUBLE DOWN AND LEFT
- "\u2558":"+", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
- "\u2559":"+", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
- "\u255A":"+", // BOX DRAWINGS DOUBLE UP AND RIGHT
- "\u255B":"+", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
- "\u255C":"+", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
- "\u255D":"+", // BOX DRAWINGS DOUBLE UP AND LEFT
- "\u255E":"+", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
- "\u255F":"+", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
- "\u2560":"+", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
- "\u2561":"+", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
- "\u2562":"+", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
- "\u2563":"+", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
- "\u2564":"+", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
- "\u2565":"+", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
- "\u2566":"+", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
- "\u2567":"+", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
- "\u2568":"+", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
- "\u2569":"+", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
- "\u256A":"+", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
- "\u256B":"+", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
- "\u256C":"+", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
- "\u256D":"+", // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
- "\u256E":"+", // BOX DRAWINGS LIGHT ARC DOWN AND LEFT
- "\u256F":"+", // BOX DRAWINGS LIGHT ARC UP AND LEFT
- "\u2570":"+", // BOX DRAWINGS LIGHT ARC UP AND RIGHT
- "\u2571":"/", // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
- "\u2572":"\\", // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
- "\u2573":"X", // BOX DRAWINGS LIGHT DIAGONAL CROSS
- "\u257C":"-", // BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
- "\u257D":"|", // BOX DRAWINGS LIGHT UP AND HEAVY DOWN
- "\u257E":"-", // BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
- "\u257F":"|", // BOX DRAWINGS HEAVY UP AND LIGHT DOWN
- "\u25CB":"o", // WHITE CIRCLE
- "\u25E6":"{\\textopenbullet}", // WHITE BULLET
- "\u2605":"*", // BLACK STAR
- "\u2606":"*", // WHITE STAR
- "\u2612":"X", // BALLOT BOX WITH X
- "\u2613":"X", // SALTIRE
- "\u2639":":-(", // WHITE FROWNING FACE
- "\u263A":":-)", // WHITE SMILING FACE
- "\u263B":"(-:", // BLACK SMILING FACE
- "\u266D":"b", // MUSIC FLAT SIGN
- "\u266F":"$\\#$", // MUSIC SHARP SIGN
- "\u2701":"$\\%<$", // UPPER BLADE SCISSORS
- "\u2702":"$\\%<$", // BLACK SCISSORS
- "\u2703":"$\\%<$", // LOWER BLADE SCISSORS
- "\u2704":"$\\%<$", // WHITE SCISSORS
- "\u270C":"V", // VICTORY HAND
- "\u2713":"v", // CHECK MARK
- "\u2714":"V", // HEAVY CHECK MARK
- "\u2715":"x", // MULTIPLICATION X
- "\u2716":"x", // HEAVY MULTIPLICATION X
- "\u2717":"X", // BALLOT X
- "\u2718":"X", // HEAVY BALLOT X
- "\u2719":"+", // OUTLINED GREEK CROSS
- "\u271A":"+", // HEAVY GREEK CROSS
- "\u271B":"+", // OPEN CENTRE CROSS
- "\u271C":"+", // HEAVY OPEN CENTRE CROSS
- "\u271D":"+", // LATIN CROSS
- "\u271E":"+", // SHADOWED WHITE LATIN CROSS
- "\u271F":"+", // OUTLINED LATIN CROSS
- "\u2720":"+", // MALTESE CROSS
- "\u2721":"*", // STAR OF DAVID
- "\u2722":"+", // FOUR TEARDROP-SPOKED ASTERISK
- "\u2723":"+", // FOUR BALLOON-SPOKED ASTERISK
- "\u2724":"+", // HEAVY FOUR BALLOON-SPOKED ASTERISK
- "\u2725":"+", // FOUR CLUB-SPOKED ASTERISK
- "\u2726":"+", // BLACK FOUR POINTED STAR
- "\u2727":"+", // WHITE FOUR POINTED STAR
- "\u2729":"*", // STRESS OUTLINED WHITE STAR
- "\u272A":"*", // CIRCLED WHITE STAR
- "\u272B":"*", // OPEN CENTRE BLACK STAR
- "\u272C":"*", // BLACK CENTRE WHITE STAR
- "\u272D":"*", // OUTLINED BLACK STAR
- "\u272E":"*", // HEAVY OUTLINED BLACK STAR
- "\u272F":"*", // PINWHEEL STAR
- "\u2730":"*", // SHADOWED WHITE STAR
- "\u2731":"*", // HEAVY ASTERISK
- "\u2732":"*", // OPEN CENTRE ASTERISK
- "\u2733":"*", // EIGHT SPOKED ASTERISK
- "\u2734":"*", // EIGHT POINTED BLACK STAR
- "\u2735":"*", // EIGHT POINTED PINWHEEL STAR
- "\u2736":"*", // SIX POINTED BLACK STAR
- "\u2737":"*", // EIGHT POINTED RECTILINEAR BLACK STAR
- "\u2738":"*", // HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
- "\u2739":"*", // TWELVE POINTED BLACK STAR
- "\u273A":"*", // SIXTEEN POINTED ASTERISK
- "\u273B":"*", // TEARDROP-SPOKED ASTERISK
- "\u273C":"*", // OPEN CENTRE TEARDROP-SPOKED ASTERISK
- "\u273D":"*", // HEAVY TEARDROP-SPOKED ASTERISK
- "\u273E":"*", // SIX PETALLED BLACK AND WHITE FLORETTE
- "\u273F":"*", // BLACK FLORETTE
- "\u2740":"*", // WHITE FLORETTE
- "\u2741":"*", // EIGHT PETALLED OUTLINED BLACK FLORETTE
- "\u2742":"*", // CIRCLED OPEN CENTRE EIGHT POINTED STAR
- "\u2743":"*", // HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
- "\u2744":"*", // SNOWFLAKE
- "\u2745":"*", // TIGHT TRIFOLIATE SNOWFLAKE
- "\u2746":"*", // HEAVY CHEVRON SNOWFLAKE
- "\u2747":"*", // SPARKLE
- "\u2748":"*", // HEAVY SPARKLE
- "\u2749":"*", // BALLOON-SPOKED ASTERISK
- "\u274A":"*", // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
- "\u274B":"*", // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
- "\uFB00":"ff", // LATIN SMALL LIGATURE FF
- "\uFB01":"fi", // LATIN SMALL LIGATURE FI
- "\uFB02":"fl", // LATIN SMALL LIGATURE FL
- "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI
- "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL
- "\uFB05":"st", // LATIN SMALL LIGATURE LONG S T
- "\uFB06":"st", // LATIN SMALL LIGATURE ST
+ "\u00A0":"~", // NO-BREAK SPACE
+ "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK
+ "\u00A2":"{\\textcent}", // CENT SIGN
+ "\u00A3":"{\\textsterling}", // POUND SIGN
+ "\u00A5":"{\\textyen}", // YEN SIGN
+ "\u00A6":"{\\textbrokenbar}", // BROKEN BAR
+ "\u00A7":"{\\textsection}", // SECTION SIGN
+ "\u00A8":"{\\textasciidieresis}", // DIAERESIS
+ "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN
+ "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR
+ "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ "\u00AC":"{\\textlnot}", // NOT SIGN
+ "\u00AD":"-", // SOFT HYPHEN
+ "\u00AE":"{\\textregistered}", // REGISTERED SIGN
+ "\u00AF":"{\\textasciimacron}", // MACRON
+ "\u00B0":"{\\textdegree}", // DEGREE SIGN
+ "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN
+ "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO
+ "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE
+ "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT
+ "\u00B5":"{\\textmu}", // MICRO SIGN
+ "\u00B6":"{\\textparagraph}", // PILCROW SIGN
+ "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT
+ "\u00B8":"{\\c\\ }", // CEDILLA
+ "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE
+ "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR
+ "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER
+ "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF
+ "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS
+ "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK
+ "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE
+ "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH
+ "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN
+ "\U00D8":"{\\O}", // LATIN CAPITAL LETTER O WITH STROKE
+ "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN
+ "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S
+ "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE
+ "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH
+ "\u00F7":"{\\textdiv}", // DIVISION SIGN
+ "\U00F8":"{\\o}", // LATIN SMALL LETTER O WITH STROKE
+ "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN
+ "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I
+ "\u0132":"IJ", // LATIN CAPITAL LIGATURE IJ
+ "\u0133":"ij", // LATIN SMALL LIGATURE IJ
+ "\u0138":"k", // LATIN SMALL LETTER KRA
+ "\u0149":"'n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG
+ "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG
+ "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE
+ "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE
+ "\u017F":"s", // LATIN SMALL LETTER LONG S
+ "\u02B9":"'", // MODIFIER LETTER PRIME
+ "\u02BB":"'", // MODIFIER LETTER TURNED COMMA
+ "\u02BC":"'", // MODIFIER LETTER APOSTROPHE
+ "\u02BD":"'", // MODIFIER LETTER REVERSED COMMA
+ "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT
+ "\u02C8":"'", // MODIFIER LETTER VERTICAL LINE
+ "\u02C9":"-", // MODIFIER LETTER MACRON
+ "\u02CC":",", // MODIFIER LETTER LOW VERTICAL LINE
+ "\u02D0":":", // MODIFIER LETTER TRIANGULAR COLON
+ "\u02DA":"o", // RING ABOVE
+ "\u02DC":"\\~{}", // SMALL TILDE
+ "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT
+ "\u0374":"'", // GREEK NUMERAL SIGN
+ "\u0375":",", // GREEK LOWER NUMERAL SIGN
+ "\u037E":";", // GREEK QUESTION MARK
+ "\u2000":" ", // EN QUAD
+ "\u2001":" ", // EM QUAD
+ "\u2002":" ", // EN SPACE
+ "\u2003":" ", // EM SPACE
+ "\u2004":" ", // THREE-PER-EM SPACE
+ "\u2005":" ", // FOUR-PER-EM SPACE
+ "\u2006":" ", // SIX-PER-EM SPACE
+ "\u2007":" ", // FIGURE SPACE
+ "\u2008":" ", // PUNCTUATION SPACE
+ "\u2009":" ", // THIN SPACE
+ "\u2010":"-", // HYPHEN
+ "\u2011":"-", // NON-BREAKING HYPHEN
+ "\u2012":"-", // FIGURE DASH
+ "\u2013":"{\\textendash}", // EN DASH
+ "\u2014":"{\\textemdash}", // EM DASH
+ "\u2015":"{\\textemdash}", // HORIZONTAL BAR or QUOTATION DASH (not in LaTeX -- use EM DASH)
+ "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE
+ "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE
+ "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK
+ "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK
+ "`" : "\u2018", // LEFT SINGLE QUOTATION MARK
+ "'" : "\u2019", // RIGHT SINGLE QUOTATION MARK
+ "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK
+ "\u201B":"'", // SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK
+ "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK
+ "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK
+ "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+ "\u2020":"{\\textdagger}", // DAGGER
+ "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER
+ "\u2022":"{\\textbullet}", // BULLET
+ "\u2023":">", // TRIANGULAR BULLET
+ "\u2024":".", // ONE DOT LEADER
+ "\u2025":"..", // TWO DOT LEADER
+ "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS
+ "\u2027":"-", // HYPHENATION POINT
+ "\u202F":" ", // NARROW NO-BREAK SPACE
+ "\u2030":"{\\textperthousand}", // PER MILLE SIGN
+ "\u2032":"'", // PRIME
+ "\u2033":"'", // DOUBLE PRIME
+ "\u2034":"'''", // TRIPLE PRIME
+ "\u2035":"`", // REVERSED PRIME
+ "\u2036":"``", // REVERSED DOUBLE PRIME
+ "\u2037":"```", // REVERSED TRIPLE PRIME
+ "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ "\u203C":"!!", // DOUBLE EXCLAMATION MARK
+ "\u203E":"-", // OVERLINE
+ "\u2043":"-", // HYPHEN BULLET
+ "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH
+ "\u2048":"?!", // QUESTION EXCLAMATION MARK
+ "\u2049":"!?", // EXCLAMATION QUESTION MARK
+ "\u204A":"7", // TIRONIAN SIGN ET
+ "\u2070":"$^{0}$", // SUPERSCRIPT ZERO
+ "\u2074":"$^{4}$", // SUPERSCRIPT FOUR
+ "\u2075":"$^{5}$", // SUPERSCRIPT FIVE
+ "\u2076":"$^{6}$", // SUPERSCRIPT SIX
+ "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN
+ "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT
+ "\u2079":"$^{9}$", // SUPERSCRIPT NINE
+ "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN
+ "\u207B":"$^{-}$", // SUPERSCRIPT MINUS
+ "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN
+ "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS
+ "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS
+ "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N
+ "\u2080":"$_{0}$", // SUBSCRIPT ZERO
+ "\u2081":"$_{1}$", // SUBSCRIPT ONE
+ "\u2082":"$_{2}$", // SUBSCRIPT TWO
+ "\u2083":"$_{3}$", // SUBSCRIPT THREE
+ "\u2084":"$_{4}$", // SUBSCRIPT FOUR
+ "\u2085":"$_{5}$", // SUBSCRIPT FIVE
+ "\u2086":"$_{6}$", // SUBSCRIPT SIX
+ "\u2087":"$_{7}$", // SUBSCRIPT SEVEN
+ "\u2088":"$_{8}$", // SUBSCRIPT EIGHT
+ "\u2089":"$_{9}$", // SUBSCRIPT NINE
+ "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN
+ "\u208B":"$_{-}$", // SUBSCRIPT MINUS
+ "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN
+ "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS
+ "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS
+ "\u20AC":"{\\texteuro}", // EURO SIGN
+ "\u2100":"a/c", // ACCOUNT OF
+ "\u2101":"a/s", // ADDRESSED TO THE SUBJECT
+ "\u2103":"{\\textcelsius}", // DEGREE CELSIUS
+ "\u2105":"c/o", // CARE OF
+ "\u2106":"c/u", // CADA UNA
+ "\u2109":"F", // DEGREE FAHRENHEIT
+ "\u2113":"l", // SCRIPT SMALL L
+ "\u2116":"{\\textnumero}", // NUMERO SIGN
+ "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT
+ "\u2120":"{\\textservicemark}", // SERVICE MARK
+ "\u2121":"TEL", // TELEPHONE SIGN
+ "\u2122":"{\\texttrademark}", // TRADE MARK SIGN
+ "\u2126":"{\\textohm}", // OHM SIGN
+ "\u212A":"K", // KELVIN SIGN
+ "\u212B":"A", // ANGSTROM SIGN
+ "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL
+ "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD
+ "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS
+ "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH
+ "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS
+ "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS
+ "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS
+ "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH
+ "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS
+ "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH
+ "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS
+ "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS
+ "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS
+ "\u215F":" 1/", // FRACTION NUMERATOR ONE
+ "\u2160":"I", // ROMAN NUMERAL ONE
+ "\u2161":"II", // ROMAN NUMERAL TWO
+ "\u2162":"III", // ROMAN NUMERAL THREE
+ "\u2163":"IV", // ROMAN NUMERAL FOUR
+ "\u2164":"V", // ROMAN NUMERAL FIVE
+ "\u2165":"VI", // ROMAN NUMERAL SIX
+ "\u2166":"VII", // ROMAN NUMERAL SEVEN
+ "\u2167":"VIII", // ROMAN NUMERAL EIGHT
+ "\u2168":"IX", // ROMAN NUMERAL NINE
+ "\u2169":"X", // ROMAN NUMERAL TEN
+ "\u216A":"XI", // ROMAN NUMERAL ELEVEN
+ "\u216B":"XII", // ROMAN NUMERAL TWELVE
+ "\u216C":"L", // ROMAN NUMERAL FIFTY
+ "\u216D":"C", // ROMAN NUMERAL ONE HUNDRED
+ "\u216E":"D", // ROMAN NUMERAL FIVE HUNDRED
+ "\u216F":"M", // ROMAN NUMERAL ONE THOUSAND
+ "\u2170":"i", // SMALL ROMAN NUMERAL ONE
+ "\u2171":"ii", // SMALL ROMAN NUMERAL TWO
+ "\u2172":"iii", // SMALL ROMAN NUMERAL THREE
+ "\u2173":"iv", // SMALL ROMAN NUMERAL FOUR
+ "\u2174":"v", // SMALL ROMAN NUMERAL FIVE
+ "\u2175":"vi", // SMALL ROMAN NUMERAL SIX
+ "\u2176":"vii", // SMALL ROMAN NUMERAL SEVEN
+ "\u2177":"viii", // SMALL ROMAN NUMERAL EIGHT
+ "\u2178":"ix", // SMALL ROMAN NUMERAL NINE
+ "\u2179":"x", // SMALL ROMAN NUMERAL TEN
+ "\u217A":"xi", // SMALL ROMAN NUMERAL ELEVEN
+ "\u217B":"xii", // SMALL ROMAN NUMERAL TWELVE
+ "\u217C":"l", // SMALL ROMAN NUMERAL FIFTY
+ "\u217D":"c", // SMALL ROMAN NUMERAL ONE HUNDRED
+ "\u217E":"d", // SMALL ROMAN NUMERAL FIVE HUNDRED
+ "\u217F":"m", // SMALL ROMAN NUMERAL ONE THOUSAND
+ "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW
+ "\u2191":"{\\textuparrow}", // UPWARDS ARROW
+ "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW
+ "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW
+ "\u2194":"<->", // LEFT RIGHT ARROW
+ "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW
+ "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW
+ "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW
+ "\u2212":"-", // MINUS SIGN
+ "\u2215":"/", // DIVISION SLASH
+ "\u2216":"\\", // SET MINUS
+ "\u2217":"*", // ASTERISK OPERATOR
+ "\u2218":"o", // RING OPERATOR
+ "\u2219":".", // BULLET OPERATOR
+ "\u221E":"$\\infty$", // INFINITY
+ "\u2223":"|", // DIVIDES
+ "\u2225":"||", // PARALLEL TO
+ "\u2236":":", // RATIO
+ "\u223C":"\\~{}", // TILDE OPERATOR
+ "\u2260":"/=", // NOT EQUAL TO
+ "\u2261":"=", // IDENTICAL TO
+ "\u2264":"<=", // LESS-THAN OR EQUAL TO
+ "\u2265":">=", // GREATER-THAN OR EQUAL TO
+ "\u226A":"<<", // MUCH LESS-THAN
+ "\u226B":">>", // MUCH GREATER-THAN
+ "\u2295":"(+)", // CIRCLED PLUS
+ "\u2296":"(-)", // CIRCLED MINUS
+ "\u2297":"(x)", // CIRCLED TIMES
+ "\u2298":"(/)", // CIRCLED DIVISION SLASH
+ "\u22A2":"|-", // RIGHT TACK
+ "\u22A3":"-|", // LEFT TACK
+ "\u22A6":"|-", // ASSERTION
+ "\u22A7":"|=", // MODELS
+ "\u22A8":"|=", // TRUE
+ "\u22A9":"||-", // FORCES
+ "\u22C5":".", // DOT OPERATOR
+ "\u22C6":"*", // STAR OPERATOR
+ "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO
+ "\u22D8":"<<<", // VERY MUCH LESS-THAN
+ "\u22D9":">>>", // VERY MUCH GREATER-THAN
+ "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET
+ "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET
+ "\u2400":"NUL", // SYMBOL FOR NULL
+ "\u2401":"SOH", // SYMBOL FOR START OF HEADING
+ "\u2402":"STX", // SYMBOL FOR START OF TEXT
+ "\u2403":"ETX", // SYMBOL FOR END OF TEXT
+ "\u2404":"EOT", // SYMBOL FOR END OF TRANSMISSION
+ "\u2405":"ENQ", // SYMBOL FOR ENQUIRY
+ "\u2406":"ACK", // SYMBOL FOR ACKNOWLEDGE
+ "\u2407":"BEL", // SYMBOL FOR BELL
+ "\u2408":"BS", // SYMBOL FOR BACKSPACE
+ "\u2409":"HT", // SYMBOL FOR HORIZONTAL TABULATION
+ "\u240A":"LF", // SYMBOL FOR LINE FEED
+ "\u240B":"VT", // SYMBOL FOR VERTICAL TABULATION
+ "\u240C":"FF", // SYMBOL FOR FORM FEED
+ "\u240D":"CR", // SYMBOL FOR CARRIAGE RETURN
+ "\u240E":"SO", // SYMBOL FOR SHIFT OUT
+ "\u240F":"SI", // SYMBOL FOR SHIFT IN
+ "\u2410":"DLE", // SYMBOL FOR DATA LINK ESCAPE
+ "\u2411":"DC1", // SYMBOL FOR DEVICE CONTROL ONE
+ "\u2412":"DC2", // SYMBOL FOR DEVICE CONTROL TWO
+ "\u2413":"DC3", // SYMBOL FOR DEVICE CONTROL THREE
+ "\u2414":"DC4", // SYMBOL FOR DEVICE CONTROL FOUR
+ "\u2415":"NAK", // SYMBOL FOR NEGATIVE ACKNOWLEDGE
+ "\u2416":"SYN", // SYMBOL FOR SYNCHRONOUS IDLE
+ "\u2417":"ETB", // SYMBOL FOR END OF TRANSMISSION BLOCK
+ "\u2418":"CAN", // SYMBOL FOR CANCEL
+ "\u2419":"EM", // SYMBOL FOR END OF MEDIUM
+ "\u241A":"SUB", // SYMBOL FOR SUBSTITUTE
+ "\u241B":"ESC", // SYMBOL FOR ESCAPE
+ "\u241C":"FS", // SYMBOL FOR FILE SEPARATOR
+ "\u241D":"GS", // SYMBOL FOR GROUP SEPARATOR
+ "\u241E":"RS", // SYMBOL FOR RECORD SEPARATOR
+ "\u241F":"US", // SYMBOL FOR UNIT SEPARATOR
+ "\u2420":"SP", // SYMBOL FOR SPACE
+ "\u2421":"DEL", // SYMBOL FOR DELETE
+ "\u2423":"{\\textvisiblespace}", // OPEN BOX
+ "\u2424":"NL", // SYMBOL FOR NEWLINE
+ "\u2425":"///", // SYMBOL FOR DELETE FORM TWO
+ "\u2426":"?", // SYMBOL FOR SUBSTITUTE FORM TWO
+ "\u2460":"(1)", // CIRCLED DIGIT ONE
+ "\u2461":"(2)", // CIRCLED DIGIT TWO
+ "\u2462":"(3)", // CIRCLED DIGIT THREE
+ "\u2463":"(4)", // CIRCLED DIGIT FOUR
+ "\u2464":"(5)", // CIRCLED DIGIT FIVE
+ "\u2465":"(6)", // CIRCLED DIGIT SIX
+ "\u2466":"(7)", // CIRCLED DIGIT SEVEN
+ "\u2467":"(8)", // CIRCLED DIGIT EIGHT
+ "\u2468":"(9)", // CIRCLED DIGIT NINE
+ "\u2469":"(10)", // CIRCLED NUMBER TEN
+ "\u246A":"(11)", // CIRCLED NUMBER ELEVEN
+ "\u246B":"(12)", // CIRCLED NUMBER TWELVE
+ "\u246C":"(13)", // CIRCLED NUMBER THIRTEEN
+ "\u246D":"(14)", // CIRCLED NUMBER FOURTEEN
+ "\u246E":"(15)", // CIRCLED NUMBER FIFTEEN
+ "\u246F":"(16)", // CIRCLED NUMBER SIXTEEN
+ "\u2470":"(17)", // CIRCLED NUMBER SEVENTEEN
+ "\u2471":"(18)", // CIRCLED NUMBER EIGHTEEN
+ "\u2472":"(19)", // CIRCLED NUMBER NINETEEN
+ "\u2473":"(20)", // CIRCLED NUMBER TWENTY
+ "\u2474":"(1)", // PARENTHESIZED DIGIT ONE
+ "\u2475":"(2)", // PARENTHESIZED DIGIT TWO
+ "\u2476":"(3)", // PARENTHESIZED DIGIT THREE
+ "\u2477":"(4)", // PARENTHESIZED DIGIT FOUR
+ "\u2478":"(5)", // PARENTHESIZED DIGIT FIVE
+ "\u2479":"(6)", // PARENTHESIZED DIGIT SIX
+ "\u247A":"(7)", // PARENTHESIZED DIGIT SEVEN
+ "\u247B":"(8)", // PARENTHESIZED DIGIT EIGHT
+ "\u247C":"(9)", // PARENTHESIZED DIGIT NINE
+ "\u247D":"(10)", // PARENTHESIZED NUMBER TEN
+ "\u247E":"(11)", // PARENTHESIZED NUMBER ELEVEN
+ "\u247F":"(12)", // PARENTHESIZED NUMBER TWELVE
+ "\u2480":"(13)", // PARENTHESIZED NUMBER THIRTEEN
+ "\u2481":"(14)", // PARENTHESIZED NUMBER FOURTEEN
+ "\u2482":"(15)", // PARENTHESIZED NUMBER FIFTEEN
+ "\u2483":"(16)", // PARENTHESIZED NUMBER SIXTEEN
+ "\u2484":"(17)", // PARENTHESIZED NUMBER SEVENTEEN
+ "\u2485":"(18)", // PARENTHESIZED NUMBER EIGHTEEN
+ "\u2486":"(19)", // PARENTHESIZED NUMBER NINETEEN
+ "\u2487":"(20)", // PARENTHESIZED NUMBER TWENTY
+ "\u2488":"1.", // DIGIT ONE FULL STOP
+ "\u2489":"2.", // DIGIT TWO FULL STOP
+ "\u248A":"3.", // DIGIT THREE FULL STOP
+ "\u248B":"4.", // DIGIT FOUR FULL STOP
+ "\u248C":"5.", // DIGIT FIVE FULL STOP
+ "\u248D":"6.", // DIGIT SIX FULL STOP
+ "\u248E":"7.", // DIGIT SEVEN FULL STOP
+ "\u248F":"8.", // DIGIT EIGHT FULL STOP
+ "\u2490":"9.", // DIGIT NINE FULL STOP
+ "\u2491":"10.", // NUMBER TEN FULL STOP
+ "\u2492":"11.", // NUMBER ELEVEN FULL STOP
+ "\u2493":"12.", // NUMBER TWELVE FULL STOP
+ "\u2494":"13.", // NUMBER THIRTEEN FULL STOP
+ "\u2495":"14.", // NUMBER FOURTEEN FULL STOP
+ "\u2496":"15.", // NUMBER FIFTEEN FULL STOP
+ "\u2497":"16.", // NUMBER SIXTEEN FULL STOP
+ "\u2498":"17.", // NUMBER SEVENTEEN FULL STOP
+ "\u2499":"18.", // NUMBER EIGHTEEN FULL STOP
+ "\u249A":"19.", // NUMBER NINETEEN FULL STOP
+ "\u249B":"20.", // NUMBER TWENTY FULL STOP
+ "\u249C":"(a)", // PARENTHESIZED LATIN SMALL LETTER A
+ "\u249D":"(b)", // PARENTHESIZED LATIN SMALL LETTER B
+ "\u249E":"(c)", // PARENTHESIZED LATIN SMALL LETTER C
+ "\u249F":"(d)", // PARENTHESIZED LATIN SMALL LETTER D
+ "\u24A0":"(e)", // PARENTHESIZED LATIN SMALL LETTER E
+ "\u24A1":"(f)", // PARENTHESIZED LATIN SMALL LETTER F
+ "\u24A2":"(g)", // PARENTHESIZED LATIN SMALL LETTER G
+ "\u24A3":"(h)", // PARENTHESIZED LATIN SMALL LETTER H
+ "\u24A4":"(i)", // PARENTHESIZED LATIN SMALL LETTER I
+ "\u24A5":"(j)", // PARENTHESIZED LATIN SMALL LETTER J
+ "\u24A6":"(k)", // PARENTHESIZED LATIN SMALL LETTER K
+ "\u24A7":"(l)", // PARENTHESIZED LATIN SMALL LETTER L
+ "\u24A8":"(m)", // PARENTHESIZED LATIN SMALL LETTER M
+ "\u24A9":"(n)", // PARENTHESIZED LATIN SMALL LETTER N
+ "\u24AA":"(o)", // PARENTHESIZED LATIN SMALL LETTER O
+ "\u24AB":"(p)", // PARENTHESIZED LATIN SMALL LETTER P
+ "\u24AC":"(q)", // PARENTHESIZED LATIN SMALL LETTER Q
+ "\u24AD":"(r)", // PARENTHESIZED LATIN SMALL LETTER R
+ "\u24AE":"(s)", // PARENTHESIZED LATIN SMALL LETTER S
+ "\u24AF":"(t)", // PARENTHESIZED LATIN SMALL LETTER T
+ "\u24B0":"(u)", // PARENTHESIZED LATIN SMALL LETTER U
+ "\u24B1":"(v)", // PARENTHESIZED LATIN SMALL LETTER V
+ "\u24B2":"(w)", // PARENTHESIZED LATIN SMALL LETTER W
+ "\u24B3":"(x)", // PARENTHESIZED LATIN SMALL LETTER X
+ "\u24B4":"(y)", // PARENTHESIZED LATIN SMALL LETTER Y
+ "\u24B5":"(z)", // PARENTHESIZED LATIN SMALL LETTER Z
+ "\u24B6":"(A)", // CIRCLED LATIN CAPITAL LETTER A
+ "\u24B7":"(B)", // CIRCLED LATIN CAPITAL LETTER B
+ "\u24B8":"(C)", // CIRCLED LATIN CAPITAL LETTER C
+ "\u24B9":"(D)", // CIRCLED LATIN CAPITAL LETTER D
+ "\u24BA":"(E)", // CIRCLED LATIN CAPITAL LETTER E
+ "\u24BB":"(F)", // CIRCLED LATIN CAPITAL LETTER F
+ "\u24BC":"(G)", // CIRCLED LATIN CAPITAL LETTER G
+ "\u24BD":"(H)", // CIRCLED LATIN CAPITAL LETTER H
+ "\u24BE":"(I)", // CIRCLED LATIN CAPITAL LETTER I
+ "\u24BF":"(J)", // CIRCLED LATIN CAPITAL LETTER J
+ "\u24C0":"(K)", // CIRCLED LATIN CAPITAL LETTER K
+ "\u24C1":"(L)", // CIRCLED LATIN CAPITAL LETTER L
+ "\u24C2":"(M)", // CIRCLED LATIN CAPITAL LETTER M
+ "\u24C3":"(N)", // CIRCLED LATIN CAPITAL LETTER N
+ "\u24C4":"(O)", // CIRCLED LATIN CAPITAL LETTER O
+ "\u24C5":"(P)", // CIRCLED LATIN CAPITAL LETTER P
+ "\u24C6":"(Q)", // CIRCLED LATIN CAPITAL LETTER Q
+ "\u24C7":"(R)", // CIRCLED LATIN CAPITAL LETTER R
+ "\u24C8":"(S)", // CIRCLED LATIN CAPITAL LETTER S
+ "\u24C9":"(T)", // CIRCLED LATIN CAPITAL LETTER T
+ "\u24CA":"(U)", // CIRCLED LATIN CAPITAL LETTER U
+ "\u24CB":"(V)", // CIRCLED LATIN CAPITAL LETTER V
+ "\u24CC":"(W)", // CIRCLED LATIN CAPITAL LETTER W
+ "\u24CD":"(X)", // CIRCLED LATIN CAPITAL LETTER X
+ "\u24CE":"(Y)", // CIRCLED LATIN CAPITAL LETTER Y
+ "\u24CF":"(Z)", // CIRCLED LATIN CAPITAL LETTER Z
+ "\u24D0":"(a)", // CIRCLED LATIN SMALL LETTER A
+ "\u24D1":"(b)", // CIRCLED LATIN SMALL LETTER B
+ "\u24D2":"(c)", // CIRCLED LATIN SMALL LETTER C
+ "\u24D3":"(d)", // CIRCLED LATIN SMALL LETTER D
+ "\u24D4":"(e)", // CIRCLED LATIN SMALL LETTER E
+ "\u24D5":"(f)", // CIRCLED LATIN SMALL LETTER F
+ "\u24D6":"(g)", // CIRCLED LATIN SMALL LETTER G
+ "\u24D7":"(h)", // CIRCLED LATIN SMALL LETTER H
+ "\u24D8":"(i)", // CIRCLED LATIN SMALL LETTER I
+ "\u24D9":"(j)", // CIRCLED LATIN SMALL LETTER J
+ "\u24DA":"(k)", // CIRCLED LATIN SMALL LETTER K
+ "\u24DB":"(l)", // CIRCLED LATIN SMALL LETTER L
+ "\u24DC":"(m)", // CIRCLED LATIN SMALL LETTER M
+ "\u24DD":"(n)", // CIRCLED LATIN SMALL LETTER N
+ "\u24DE":"(o)", // CIRCLED LATIN SMALL LETTER O
+ "\u24DF":"(p)", // CIRCLED LATIN SMALL LETTER P
+ "\u24E0":"(q)", // CIRCLED LATIN SMALL LETTER Q
+ "\u24E1":"(r)", // CIRCLED LATIN SMALL LETTER R
+ "\u24E2":"(s)", // CIRCLED LATIN SMALL LETTER S
+ "\u24E3":"(t)", // CIRCLED LATIN SMALL LETTER T
+ "\u24E4":"(u)", // CIRCLED LATIN SMALL LETTER U
+ "\u24E5":"(v)", // CIRCLED LATIN SMALL LETTER V
+ "\u24E6":"(w)", // CIRCLED LATIN SMALL LETTER W
+ "\u24E7":"(x)", // CIRCLED LATIN SMALL LETTER X
+ "\u24E8":"(y)", // CIRCLED LATIN SMALL LETTER Y
+ "\u24E9":"(z)", // CIRCLED LATIN SMALL LETTER Z
+ "\u24EA":"(0)", // CIRCLED DIGIT ZERO
+ "\u2500":"-", // BOX DRAWINGS LIGHT HORIZONTAL
+ "\u2501":"=", // BOX DRAWINGS HEAVY HORIZONTAL
+ "\u2502":"|", // BOX DRAWINGS LIGHT VERTICAL
+ "\u2503":"|", // BOX DRAWINGS HEAVY VERTICAL
+ "\u2504":"-", // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+ "\u2505":"=", // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+ "\u2506":"|", // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+ "\u2507":"|", // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+ "\u2508":"-", // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+ "\u2509":"=", // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+ "\u250A":"|", // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+ "\u250B":"|", // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+ "\u250C":"+", // BOX DRAWINGS LIGHT DOWN AND RIGHT
+ "\u250D":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ "\u250E":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ "\u250F":"+", // BOX DRAWINGS HEAVY DOWN AND RIGHT
+ "\u2510":"+", // BOX DRAWINGS LIGHT DOWN AND LEFT
+ "\u2511":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ "\u2512":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ "\u2513":"+", // BOX DRAWINGS HEAVY DOWN AND LEFT
+ "\u2514":"+", // BOX DRAWINGS LIGHT UP AND RIGHT
+ "\u2515":"+", // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ "\u2516":"+", // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ "\u2517":"+", // BOX DRAWINGS HEAVY UP AND RIGHT
+ "\u2518":"+", // BOX DRAWINGS LIGHT UP AND LEFT
+ "\u2519":"+", // BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ "\u251A":"+", // BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ "\u251B":"+", // BOX DRAWINGS HEAVY UP AND LEFT
+ "\u251C":"+", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ "\u251D":"+", // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ "\u251E":"+", // BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ "\u251F":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ "\u2520":"+", // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ "\u2521":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ "\u2522":"+", // BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ "\u2523":"+", // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ "\u2524":"+", // BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ "\u2525":"+", // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ "\u2526":"+", // BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ "\u2527":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ "\u2528":"+", // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ "\u2529":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ "\u252A":"+", // BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ "\u252B":"+", // BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ "\u252C":"+", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ "\u252D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ "\u252E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ "\u252F":"+", // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ "\u2530":"+", // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ "\u2531":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ "\u2532":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ "\u2533":"+", // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ "\u2534":"+", // BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ "\u2535":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ "\u2536":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ "\u2537":"+", // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ "\u2538":"+", // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ "\u2539":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ "\u253A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ "\u253B":"+", // BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ "\u253C":"+", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ "\u253D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ "\u253E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ "\u253F":"+", // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ "\u2540":"+", // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ "\u2541":"+", // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ "\u2542":"+", // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ "\u2543":"+", // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ "\u2544":"+", // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ "\u2545":"+", // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ "\u2546":"+", // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ "\u2547":"+", // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ "\u2548":"+", // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ "\u2549":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ "\u254A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ "\u254B":"+", // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ "\u254C":"-", // BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+ "\u254D":"=", // BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+ "\u254E":"|", // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+ "\u254F":"|", // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+ "\u2550":"=", // BOX DRAWINGS DOUBLE HORIZONTAL
+ "\u2551":"|", // BOX DRAWINGS DOUBLE VERTICAL
+ "\u2552":"+", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ "\u2553":"+", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ "\u2554":"+", // BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ "\u2555":"+", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ "\u2556":"+", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ "\u2557":"+", // BOX DRAWINGS DOUBLE DOWN AND LEFT
+ "\u2558":"+", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ "\u2559":"+", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ "\u255A":"+", // BOX DRAWINGS DOUBLE UP AND RIGHT
+ "\u255B":"+", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ "\u255C":"+", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ "\u255D":"+", // BOX DRAWINGS DOUBLE UP AND LEFT
+ "\u255E":"+", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ "\u255F":"+", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ "\u2560":"+", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ "\u2561":"+", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ "\u2562":"+", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ "\u2563":"+", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ "\u2564":"+", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ "\u2565":"+", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ "\u2566":"+", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ "\u2567":"+", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ "\u2568":"+", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ "\u2569":"+", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ "\u256A":"+", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ "\u256B":"+", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ "\u256C":"+", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ "\u256D":"+", // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ "\u256E":"+", // BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ "\u256F":"+", // BOX DRAWINGS LIGHT ARC UP AND LEFT
+ "\u2570":"+", // BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ "\u2571":"/", // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+ "\u2572":"\\", // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ "\u2573":"X", // BOX DRAWINGS LIGHT DIAGONAL CROSS
+ "\u257C":"-", // BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+ "\u257D":"|", // BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+ "\u257E":"-", // BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+ "\u257F":"|", // BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+ "\u25CB":"o", // WHITE CIRCLE
+ "\u25E6":"{\\textopenbullet}", // WHITE BULLET
+ "\u2605":"*", // BLACK STAR
+ "\u2606":"*", // WHITE STAR
+ "\u2612":"X", // BALLOT BOX WITH X
+ "\u2613":"X", // SALTIRE
+ "\u2639":":-(", // WHITE FROWNING FACE
+ "\u263A":":-)", // WHITE SMILING FACE
+ "\u263B":"(-:", // BLACK SMILING FACE
+ "\u266D":"b", // MUSIC FLAT SIGN
+ "\u266F":"$\\#$", // MUSIC SHARP SIGN
+ "\u2701":"$\\%<$", // UPPER BLADE SCISSORS
+ "\u2702":"$\\%<$", // BLACK SCISSORS
+ "\u2703":"$\\%<$", // LOWER BLADE SCISSORS
+ "\u2704":"$\\%<$", // WHITE SCISSORS
+ "\u270C":"V", // VICTORY HAND
+ "\u2713":"v", // CHECK MARK
+ "\u2714":"V", // HEAVY CHECK MARK
+ "\u2715":"x", // MULTIPLICATION X
+ "\u2716":"x", // HEAVY MULTIPLICATION X
+ "\u2717":"X", // BALLOT X
+ "\u2718":"X", // HEAVY BALLOT X
+ "\u2719":"+", // OUTLINED GREEK CROSS
+ "\u271A":"+", // HEAVY GREEK CROSS
+ "\u271B":"+", // OPEN CENTRE CROSS
+ "\u271C":"+", // HEAVY OPEN CENTRE CROSS
+ "\u271D":"+", // LATIN CROSS
+ "\u271E":"+", // SHADOWED WHITE LATIN CROSS
+ "\u271F":"+", // OUTLINED LATIN CROSS
+ "\u2720":"+", // MALTESE CROSS
+ "\u2721":"*", // STAR OF DAVID
+ "\u2722":"+", // FOUR TEARDROP-SPOKED ASTERISK
+ "\u2723":"+", // FOUR BALLOON-SPOKED ASTERISK
+ "\u2724":"+", // HEAVY FOUR BALLOON-SPOKED ASTERISK
+ "\u2725":"+", // FOUR CLUB-SPOKED ASTERISK
+ "\u2726":"+", // BLACK FOUR POINTED STAR
+ "\u2727":"+", // WHITE FOUR POINTED STAR
+ "\u2729":"*", // STRESS OUTLINED WHITE STAR
+ "\u272A":"*", // CIRCLED WHITE STAR
+ "\u272B":"*", // OPEN CENTRE BLACK STAR
+ "\u272C":"*", // BLACK CENTRE WHITE STAR
+ "\u272D":"*", // OUTLINED BLACK STAR
+ "\u272E":"*", // HEAVY OUTLINED BLACK STAR
+ "\u272F":"*", // PINWHEEL STAR
+ "\u2730":"*", // SHADOWED WHITE STAR
+ "\u2731":"*", // HEAVY ASTERISK
+ "\u2732":"*", // OPEN CENTRE ASTERISK
+ "\u2733":"*", // EIGHT SPOKED ASTERISK
+ "\u2734":"*", // EIGHT POINTED BLACK STAR
+ "\u2735":"*", // EIGHT POINTED PINWHEEL STAR
+ "\u2736":"*", // SIX POINTED BLACK STAR
+ "\u2737":"*", // EIGHT POINTED RECTILINEAR BLACK STAR
+ "\u2738":"*", // HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+ "\u2739":"*", // TWELVE POINTED BLACK STAR
+ "\u273A":"*", // SIXTEEN POINTED ASTERISK
+ "\u273B":"*", // TEARDROP-SPOKED ASTERISK
+ "\u273C":"*", // OPEN CENTRE TEARDROP-SPOKED ASTERISK
+ "\u273D":"*", // HEAVY TEARDROP-SPOKED ASTERISK
+ "\u273E":"*", // SIX PETALLED BLACK AND WHITE FLORETTE
+ "\u273F":"*", // BLACK FLORETTE
+ "\u2740":"*", // WHITE FLORETTE
+ "\u2741":"*", // EIGHT PETALLED OUTLINED BLACK FLORETTE
+ "\u2742":"*", // CIRCLED OPEN CENTRE EIGHT POINTED STAR
+ "\u2743":"*", // HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+ "\u2744":"*", // SNOWFLAKE
+ "\u2745":"*", // TIGHT TRIFOLIATE SNOWFLAKE
+ "\u2746":"*", // HEAVY CHEVRON SNOWFLAKE
+ "\u2747":"*", // SPARKLE
+ "\u2748":"*", // HEAVY SPARKLE
+ "\u2749":"*", // BALLOON-SPOKED ASTERISK
+ "\u274A":"*", // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+ "\u274B":"*", // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+ "\uFB00":"ff", // LATIN SMALL LIGATURE FF
+ "\uFB01":"fi", // LATIN SMALL LIGATURE FI
+ "\uFB02":"fl", // LATIN SMALL LIGATURE FL
+ "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI
+ "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL
+ "\uFB05":"st", // LATIN SMALL LIGATURE LONG S T
+ "\uFB06":"st", // LATIN SMALL LIGATURE ST
/* Derived accented characters */
- "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE
- "\u00C1":"\\'{A}", // LATIN CAPITAL LETTER A WITH ACUTE
- "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
- "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE
- "\u00C4":"\\\"{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS
- "\u00C5":"\\r{A}", // LATIN CAPITAL LETTER A WITH RING ABOVE
- "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA
- "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE
- "\u00C9":"\\'{E}", // LATIN CAPITAL LETTER E WITH ACUTE
- "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
- "\u00CB":"\\\"{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS
- "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE
- "\u00CD":"\\'{I}", // LATIN CAPITAL LETTER I WITH ACUTE
- "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
- "\u00CF":"\\\"{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS
- "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE
- "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE
- "\u00D3":"\\'{O}", // LATIN CAPITAL LETTER O WITH ACUTE
- "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE
- "\u00D6":"\\\"{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS
- "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE
- "\u00DA":"\\'{U}", // LATIN CAPITAL LETTER U WITH ACUTE
- "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
- "\u00DC":"\\\"{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS
- "\u00DD":"\\'{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE
- "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE
- "\u00E1":"\\'{a}", // LATIN SMALL LETTER A WITH ACUTE
- "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX
- "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE
- "\u00E4":"\\\"{a}", // LATIN SMALL LETTER A WITH DIAERESIS
- "\u00E5":"\\r{a}", // LATIN SMALL LETTER A WITH RING ABOVE
- "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA
- "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE
- "\u00E9":"\\'{e}", // LATIN SMALL LETTER E WITH ACUTE
- "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX
- "\u00EB":"\\\"{e}", // LATIN SMALL LETTER E WITH DIAERESIS
- "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE
- "\u00ED":"\\'{i}", // LATIN SMALL LETTER I WITH ACUTE
- "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX
- "\u00EF":"\\\"{i}", // LATIN SMALL LETTER I WITH DIAERESIS
- "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE
- "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE
- "\u00F3":"\\'{o}", // LATIN SMALL LETTER O WITH ACUTE
- "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX
- "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE
- "\u00F6":"\\\"{o}", // LATIN SMALL LETTER O WITH DIAERESIS
- "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE
- "\u00FA":"\\'{u}", // LATIN SMALL LETTER U WITH ACUTE
- "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX
- "\u00FC":"\\\"{u}", // LATIN SMALL LETTER U WITH DIAERESIS
- "\u00FD":"\\'{y}", // LATIN SMALL LETTER Y WITH ACUTE
- "\u00FF":"\\\"{y}", // LATIN SMALL LETTER Y WITH DIAERESIS
- "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON
- "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON
- "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE
- "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE
- "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK
- "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK
- "\u0106":"\\'{C}", // LATIN CAPITAL LETTER C WITH ACUTE
- "\u0107":"\\'{c}", // LATIN SMALL LETTER C WITH ACUTE
- "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
- "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX
- "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE
- "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE
- "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON
- "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON
- "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON
- "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON
- "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON
- "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON
- "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE
- "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE
- "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE
- "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE
- "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK
- "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK
- "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON
- "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON
- "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
- "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX
- "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE
- "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE
- "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE
- "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE
- "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA
- "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA
- "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
- "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX
- "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE
- "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE
- "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON
- "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON
- "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE
- "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE
- "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK
- "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK
- "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE
- "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
- "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX
- "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA
- "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA
- "\u0139":"\\'{L}", // LATIN CAPITAL LETTER L WITH ACUTE
- "\u013A":"\\'{l}", // LATIN SMALL LETTER L WITH ACUTE
- "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA
- "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
- "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
- "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON
- "\u0141":"\\L{}", //LATIN CAPITAL LETTER L WITH STROKE
- "\u0142":"\\l{}", //LATIN SMALL LETTER L WITH STROKE
- "\u0143":"\\'{N}", // LATIN CAPITAL LETTER N WITH ACUTE
- "\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE
- "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
- "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA
- "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON
- "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON
- "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON
- "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON
- "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE
- "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE
- "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
- "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
- "\u0154":"\\'{R}", // LATIN CAPITAL LETTER R WITH ACUTE
- "\u0155":"\\'{r}", // LATIN SMALL LETTER R WITH ACUTE
- "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA
- "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA
- "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON
- "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON
- "\u015A":"\\'{S}", // LATIN CAPITAL LETTER S WITH ACUTE
- "\u015B":"\\'{s}", // LATIN SMALL LETTER S WITH ACUTE
- "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
- "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX
- "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA
- "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA
- "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON
- "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON
- "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA
- "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA
- "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON
- "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON
- "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE
- "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE
- "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON
- "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON
- "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE
- "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE
- "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
- "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
- "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK
- "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK
- "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
- "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX
- "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
- "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
- "\u0178":"\\\"{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS
- "\u0179":"\\'{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE
- "\u017A":"\\'{z}", // LATIN SMALL LETTER Z WITH ACUTE
- "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
- "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE
- "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON
- "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON
- "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON
- "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON
- "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON
- "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON
- "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON
- "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON
- "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON
- "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON
- "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON
- "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON
- "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON
- "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON
- "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK
- "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK
- "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON
- "\u01F4":"\\'{G}", // LATIN CAPITAL LETTER G WITH ACUTE
- "\u01F5":"\\'{g}", // LATIN SMALL LETTER G WITH ACUTE
- "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE
- "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE
- "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW
- "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW
- "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW
- "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW
- "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE
- "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE
- "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW
- "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW
- "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW
- "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW
- "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA
- "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA
- "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE
- "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE
- "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON
- "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON
- "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE
- "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE
- "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW
- "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW
- "\u1E26":"\\\"{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS
- "\u1E27":"\\\"{h}", // LATIN SMALL LETTER H WITH DIAERESIS
- "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA
- "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA
- "\u1E30":"\\'{K}", // LATIN CAPITAL LETTER K WITH ACUTE
- "\u1E31":"\\'{k}", // LATIN SMALL LETTER K WITH ACUTE
- "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW
- "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW
- "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW
- "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW
- "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW
- "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW
- "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW
- "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW
- "\u1E3E":"\\'{M}", // LATIN CAPITAL LETTER M WITH ACUTE
- "\u1E3F":"\\'{m}", // LATIN SMALL LETTER M WITH ACUTE
- "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE
- "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE
- "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW
- "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW
- "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE
- "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE
- "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW
- "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW
- "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW
- "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW
- "\u1E54":"\\'{P}", // LATIN CAPITAL LETTER P WITH ACUTE
- "\u1E55":"\\'{p}", // LATIN SMALL LETTER P WITH ACUTE
- "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE
- "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE
- "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE
- "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE
- "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW
- "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW
- "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW
- "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW
- "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE
- "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE
- "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW
- "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW
- "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE
- "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE
- "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW
- "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW
- "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW
- "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW
- "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE
- "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE
- "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW
- "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW
- "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE
- "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE
- "\u1E82":"\\'{W}", // LATIN CAPITAL LETTER W WITH ACUTE
- "\u1E83":"\\'{w}", // LATIN SMALL LETTER W WITH ACUTE
- "\u1E84":"\\\"{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS
- "\u1E85":"\\\"{w}", // LATIN SMALL LETTER W WITH DIAERESIS
- "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE
- "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE
- "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW
- "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW
- "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE
- "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE
- "\u1E8C":"\\\"{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS
- "\u1E8D":"\\\"{x}", // LATIN SMALL LETTER X WITH DIAERESIS
- "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
- "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE
- "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
- "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
- "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW
- "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW
- "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW
- "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW
- "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW
- "\u1E97":"\\\"{t}", // LATIN SMALL LETTER T WITH DIAERESIS
- "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW
- "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW
- "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW
- "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW
- "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE
- "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE
- "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW
- "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW
- "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW
- "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW
- "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW
- "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW
- "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE
- "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE
- "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
- "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
- "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
- "\u1EF9":"\\~{y}" // LATIN SMALL LETTER Y WITH TILDE
+ "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE
+ "\u00C1":"\\'{A}", // LATIN CAPITAL LETTER A WITH ACUTE
+ "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE
+ "\u00C4":"\\\"{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS
+ "\u00C5":"\\r{A}", // LATIN CAPITAL LETTER A WITH RING ABOVE
+ "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA
+ "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE
+ "\u00C9":"\\'{E}", // LATIN CAPITAL LETTER E WITH ACUTE
+ "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ "\u00CB":"\\\"{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS
+ "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE
+ "\u00CD":"\\'{I}", // LATIN CAPITAL LETTER I WITH ACUTE
+ "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ "\u00CF":"\\\"{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS
+ "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE
+ "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE
+ "\u00D3":"\\'{O}", // LATIN CAPITAL LETTER O WITH ACUTE
+ "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE
+ "\u00D6":"\\\"{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS
+ "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE
+ "\u00DA":"\\'{U}", // LATIN CAPITAL LETTER U WITH ACUTE
+ "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ "\u00DC":"\\\"{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS
+ "\u00DD":"\\'{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE
+ "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE
+ "\u00E1":"\\'{a}", // LATIN SMALL LETTER A WITH ACUTE
+ "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX
+ "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE
+ "\u00E4":"\\\"{a}", // LATIN SMALL LETTER A WITH DIAERESIS
+ "\u00E5":"\\r{a}", // LATIN SMALL LETTER A WITH RING ABOVE
+ "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA
+ "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE
+ "\u00E9":"\\'{e}", // LATIN SMALL LETTER E WITH ACUTE
+ "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX
+ "\u00EB":"\\\"{e}", // LATIN SMALL LETTER E WITH DIAERESIS
+ "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE
+ "\u00ED":"\\'{i}", // LATIN SMALL LETTER I WITH ACUTE
+ "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX
+ "\u00EF":"\\\"{i}", // LATIN SMALL LETTER I WITH DIAERESIS
+ "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE
+ "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE
+ "\u00F3":"\\'{o}", // LATIN SMALL LETTER O WITH ACUTE
+ "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX
+ "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE
+ "\u00F6":"\\\"{o}", // LATIN SMALL LETTER O WITH DIAERESIS
+ "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE
+ "\u00FA":"\\'{u}", // LATIN SMALL LETTER U WITH ACUTE
+ "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX
+ "\u00FC":"\\\"{u}", // LATIN SMALL LETTER U WITH DIAERESIS
+ "\u00FD":"\\'{y}", // LATIN SMALL LETTER Y WITH ACUTE
+ "\u00FF":"\\\"{y}", // LATIN SMALL LETTER Y WITH DIAERESIS
+ "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON
+ "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON
+ "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE
+ "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE
+ "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK
+ "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK
+ "\u0106":"\\'{C}", // LATIN CAPITAL LETTER C WITH ACUTE
+ "\u0107":"\\'{c}", // LATIN SMALL LETTER C WITH ACUTE
+ "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX
+ "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE
+ "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE
+ "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON
+ "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON
+ "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON
+ "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON
+ "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON
+ "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON
+ "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE
+ "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE
+ "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE
+ "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE
+ "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK
+ "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK
+ "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON
+ "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON
+ "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX
+ "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE
+ "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE
+ "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE
+ "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE
+ "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA
+ "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA
+ "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX
+ "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE
+ "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE
+ "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON
+ "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON
+ "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE
+ "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE
+ "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK
+ "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK
+ "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE
+ "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX
+ "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA
+ "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA
+ "\u0139":"\\'{L}", // LATIN CAPITAL LETTER L WITH ACUTE
+ "\u013A":"\\'{l}", // LATIN SMALL LETTER L WITH ACUTE
+ "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA
+ "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
+ "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
+ "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON
+ "\u0141":"\\L{}", //LATIN CAPITAL LETTER L WITH STROKE
+ "\u0142":"\\l{}", //LATIN SMALL LETTER L WITH STROKE
+ "\u0143":"\\'{N}", // LATIN CAPITAL LETTER N WITH ACUTE
+ "\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE
+ "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
+ "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA
+ "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON
+ "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON
+ "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON
+ "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON
+ "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE
+ "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE
+ "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ "\u0154":"\\'{R}", // LATIN CAPITAL LETTER R WITH ACUTE
+ "\u0155":"\\'{r}", // LATIN SMALL LETTER R WITH ACUTE
+ "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA
+ "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA
+ "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON
+ "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON
+ "\u015A":"\\'{S}", // LATIN CAPITAL LETTER S WITH ACUTE
+ "\u015B":"\\'{s}", // LATIN SMALL LETTER S WITH ACUTE
+ "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX
+ "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA
+ "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA
+ "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON
+ "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON
+ "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA
+ "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA
+ "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON
+ "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON
+ "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE
+ "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE
+ "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON
+ "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON
+ "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE
+ "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE
+ "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK
+ "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK
+ "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX
+ "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ "\u0178":"\\\"{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS
+ "\u0179":"\\'{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE
+ "\u017A":"\\'{z}", // LATIN SMALL LETTER Z WITH ACUTE
+ "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE
+ "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON
+ "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON
+ "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON
+ "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON
+ "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON
+ "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON
+ "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON
+ "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON
+ "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON
+ "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON
+ "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON
+ "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON
+ "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON
+ "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON
+ "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK
+ "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK
+ "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON
+ "\u01F4":"\\'{G}", // LATIN CAPITAL LETTER G WITH ACUTE
+ "\u01F5":"\\'{g}", // LATIN SMALL LETTER G WITH ACUTE
+ "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE
+ "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE
+ "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW
+ "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW
+ "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW
+ "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW
+ "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE
+ "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE
+ "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW
+ "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW
+ "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW
+ "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW
+ "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA
+ "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA
+ "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE
+ "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE
+ "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON
+ "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON
+ "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE
+ "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE
+ "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW
+ "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW
+ "\u1E26":"\\\"{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS
+ "\u1E27":"\\\"{h}", // LATIN SMALL LETTER H WITH DIAERESIS
+ "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA
+ "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA
+ "\u1E30":"\\'{K}", // LATIN CAPITAL LETTER K WITH ACUTE
+ "\u1E31":"\\'{k}", // LATIN SMALL LETTER K WITH ACUTE
+ "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW
+ "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW
+ "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW
+ "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW
+ "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW
+ "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW
+ "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW
+ "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW
+ "\u1E3E":"\\'{M}", // LATIN CAPITAL LETTER M WITH ACUTE
+ "\u1E3F":"\\'{m}", // LATIN SMALL LETTER M WITH ACUTE
+ "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE
+ "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE
+ "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW
+ "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW
+ "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE
+ "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE
+ "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW
+ "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW
+ "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW
+ "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW
+ "\u1E54":"\\'{P}", // LATIN CAPITAL LETTER P WITH ACUTE
+ "\u1E55":"\\'{p}", // LATIN SMALL LETTER P WITH ACUTE
+ "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE
+ "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE
+ "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE
+ "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE
+ "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW
+ "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW
+ "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW
+ "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW
+ "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE
+ "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE
+ "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW
+ "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW
+ "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE
+ "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE
+ "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW
+ "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW
+ "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW
+ "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW
+ "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE
+ "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE
+ "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW
+ "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW
+ "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE
+ "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE
+ "\u1E82":"\\'{W}", // LATIN CAPITAL LETTER W WITH ACUTE
+ "\u1E83":"\\'{w}", // LATIN SMALL LETTER W WITH ACUTE
+ "\u1E84":"\\\"{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS
+ "\u1E85":"\\\"{w}", // LATIN SMALL LETTER W WITH DIAERESIS
+ "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE
+ "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE
+ "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW
+ "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW
+ "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE
+ "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE
+ "\u1E8C":"\\\"{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS
+ "\u1E8D":"\\\"{x}", // LATIN SMALL LETTER X WITH DIAERESIS
+ "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE
+ "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
+ "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW
+ "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW
+ "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW
+ "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW
+ "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW
+ "\u1E97":"\\\"{t}", // LATIN SMALL LETTER T WITH DIAERESIS
+ "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW
+ "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW
+ "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW
+ "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW
+ "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE
+ "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE
+ "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW
+ "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW
+ "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW
+ "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW
+ "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW
+ "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW
+ "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE
+ "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE
+ "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
+ "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
+ "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
+ "\u1EF9":"\\~{y}" // LATIN SMALL LETTER Y WITH TILDE
};
/* unfortunately the mapping isn't reversible - hence this second table - sigh! */
var reversemappingTable = {
- "\\url" : "", // strip 'url'
- "\\href" : "", // strip 'href'
- "~" : "\u00A0", // NO-BREAK SPACE
- "{\\textexclamdown}" : "\u00A1", // INVERTED EXCLAMATION MARK
- "{\\textcent}" : "\u00A2", // CENT SIGN
- "{\\textsterling}" : "\u00A3", // POUND SIGN
- "{\\textyen}" : "\u00A5", // YEN SIGN
- "{\\textbrokenbar}" : "\u00A6", // BROKEN BAR
- "{\\textsection}" : "\u00A7", // SECTION SIGN
- "{\\textasciidieresis}" : "\u00A8", // DIAERESIS
- "{\\textcopyright}" : "\u00A9", // COPYRIGHT SIGN
- "{\\textordfeminine}" : "\u00AA", // FEMININE ORDINAL INDICATOR
- "{\\guillemotleft}" : "\u00AB", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- "{\\textlnot}" : "\u00AC", // NOT SIGN
- "{\\textregistered}" : "\u00AE", // REGISTERED SIGN
- "{\\textasciimacron}" : "\u00AF", // MACRON
- "{\\textdegree}" : "\u00B0", // DEGREE SIGN
- "{\\textpm}" : "\u00B1", // PLUS-MINUS SIGN
- "{\\texttwosuperior}" : "\u00B2", // SUPERSCRIPT TWO
- "{\\textthreesuperior}" : "\u00B3", // SUPERSCRIPT THREE
- "{\\textasciiacute}" : "\u00B4", // ACUTE ACCENT
- "{\\textmu}" : "\u00B5", // MICRO SIGN
- "{\\textparagraph}" : "\u00B6", // PILCROW SIGN
- "{\\textperiodcentered}" : "\u00B7", // MIDDLE DOT
- "{\\c\\ }" : "\u00B8", // CEDILLA
- "{\\textonesuperior}" : "\u00B9", // SUPERSCRIPT ONE
- "{\\textordmasculine}" : "\u00BA", // MASCULINE ORDINAL INDICATOR
- "{\\guillemotright}" : "\u00BB", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- "{\\textonequarter}" : "\u00BC", // VULGAR FRACTION ONE QUARTER
- "{\\textonehalf}" : "\u00BD", // VULGAR FRACTION ONE HALF
- "{\\textthreequarters}" : "\u00BE", // VULGAR FRACTION THREE QUARTERS
- "{\\textquestiondown}" : "\u00BF", // INVERTED QUESTION MARK
- "{\\AE}" : "\u00C6", // LATIN CAPITAL LETTER AE
- "{\\DH}" : "\u00D0", // LATIN CAPITAL LETTER ETH
- "{\\texttimes}" : "\u00D7", // MULTIPLICATION SIGN
- "{\\O}" : "\U00D8", // LATIN SMALL LETTER O WITH STROKE
- "{\\TH}" : "\u00DE", // LATIN CAPITAL LETTER THORN
- "{\\ss}" : "\u00DF", // LATIN SMALL LETTER SHARP S
- "{\\ae}" : "\u00E6", // LATIN SMALL LETTER AE
- "{\\dh}" : "\u00F0", // LATIN SMALL LETTER ETH
- "{\\textdiv}" : "\u00F7", // DIVISION SIGN
- "{\\o}" : "\U00F8", // LATIN SMALL LETTER O WITH STROKE
- "{\\th}" : "\u00FE", // LATIN SMALL LETTER THORN
- "{\\i}" : "\u0131", // LATIN SMALL LETTER DOTLESS I
- "'n" : "\u0149", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
- "{\\NG}" : "\u014A", // LATIN CAPITAL LETTER ENG
- "{\\ng}" : "\u014B", // LATIN SMALL LETTER ENG
- "{\\OE}" : "\u0152", // LATIN CAPITAL LIGATURE OE
- "{\\oe}" : "\u0153", // LATIN SMALL LIGATURE OE
- "{\\textasciicircum}" : "\u02C6", // MODIFIER LETTER CIRCUMFLEX ACCENT
+ "\\url" : "", // strip 'url'
+ "\\href" : "", // strip 'href'
+ "{\\textexclamdown}" : "\u00A1", // INVERTED EXCLAMATION MARK
+ "{\\textcent}" : "\u00A2", // CENT SIGN
+ "{\\textsterling}" : "\u00A3", // POUND SIGN
+ "{\\textyen}" : "\u00A5", // YEN SIGN
+ "{\\textbrokenbar}" : "\u00A6", // BROKEN BAR
+ "{\\textsection}" : "\u00A7", // SECTION SIGN
+ "{\\textasciidieresis}" : "\u00A8", // DIAERESIS
+ "{\\textcopyright}" : "\u00A9", // COPYRIGHT SIGN
+ "{\\textordfeminine}" : "\u00AA", // FEMININE ORDINAL INDICATOR
+ "{\\guillemotleft}" : "\u00AB", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ "{\\textlnot}" : "\u00AC", // NOT SIGN
+ "{\\textregistered}" : "\u00AE", // REGISTERED SIGN
+ "{\\textasciimacron}" : "\u00AF", // MACRON
+ "{\\textdegree}" : "\u00B0", // DEGREE SIGN
+ "{\\textpm}" : "\u00B1", // PLUS-MINUS SIGN
+ "{\\texttwosuperior}" : "\u00B2", // SUPERSCRIPT TWO
+ "{\\textthreesuperior}" : "\u00B3", // SUPERSCRIPT THREE
+ "{\\textasciiacute}" : "\u00B4", // ACUTE ACCENT
+ "{\\textmu}" : "\u00B5", // MICRO SIGN
+ "{\\textparagraph}" : "\u00B6", // PILCROW SIGN
+ "{\\textperiodcentered}" : "\u00B7", // MIDDLE DOT
+ "{\\c\\ }" : "\u00B8", // CEDILLA
+ "{\\textonesuperior}" : "\u00B9", // SUPERSCRIPT ONE
+ "{\\textordmasculine}" : "\u00BA", // MASCULINE ORDINAL INDICATOR
+ "{\\guillemotright}" : "\u00BB", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ "{\\textonequarter}" : "\u00BC", // VULGAR FRACTION ONE QUARTER
+ "{\\textonehalf}" : "\u00BD", // VULGAR FRACTION ONE HALF
+ "{\\textthreequarters}" : "\u00BE", // VULGAR FRACTION THREE QUARTERS
+ "{\\textquestiondown}" : "\u00BF", // INVERTED QUESTION MARK
+ "{\\AE}" : "\u00C6", // LATIN CAPITAL LETTER AE
+ "{\\DH}" : "\u00D0", // LATIN CAPITAL LETTER ETH
+ "{\\texttimes}" : "\u00D7", // MULTIPLICATION SIGN
+ "{\\O}" : "\U00D8", // LATIN SMALL LETTER O WITH STROKE
+ "{\\TH}" : "\u00DE", // LATIN CAPITAL LETTER THORN
+ "{\\ss}" : "\u00DF", // LATIN SMALL LETTER SHARP S
+ "{\\ae}" : "\u00E6", // LATIN SMALL LETTER AE
+ "{\\dh}" : "\u00F0", // LATIN SMALL LETTER ETH
+ "{\\textdiv}" : "\u00F7", // DIVISION SIGN
+ "{\\o}" : "\U00F8", // LATIN SMALL LETTER O WITH STROKE
+ "{\\th}" : "\u00FE", // LATIN SMALL LETTER THORN
+ "{\\i}" : "\u0131", // LATIN SMALL LETTER DOTLESS I
+ "'n" : "\u0149", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ "{\\NG}" : "\u014A", // LATIN CAPITAL LETTER ENG
+ "{\\ng}" : "\u014B", // LATIN SMALL LETTER ENG
+ "{\\OE}" : "\u0152", // LATIN CAPITAL LIGATURE OE
+ "{\\oe}" : "\u0153", // LATIN SMALL LIGATURE OE
+ "{\\textasciicircum}" : "\u02C6", // MODIFIER LETTER CIRCUMFLEX ACCENT
// "\\~{}" : "\u02DC", // SMALL TILDE
- "{\\textacutedbl}" : "\u02DD", // DOUBLE ACUTE ACCENT
- "{\\textendash}" : "\u2013", // EN DASH
- "{\\textemdash}" : "\u2014", // EM DASH
- "---" : "\u2014", // EM DASH
- "--" : "\u2013", // EN DASH
- "{\\textbardbl}" : "\u2016", // DOUBLE VERTICAL LINE
- "{\\textunderscore}" : "\u2017", // DOUBLE LOW LINE
- "{\\textquoteleft}" : "\u2018", // LEFT SINGLE QUOTATION MARK
- "{\\textquoteright}" : "\u2019", // RIGHT SINGLE QUOTATION MARK
- "{\\quotesinglbase}" : "\u201A", // SINGLE LOW-9 QUOTATION MARK
- "{\\textquotedblleft}" : "\u201C", // LEFT DOUBLE QUOTATION MARK
- "{\\textquotedblright}" : "\u201D", // RIGHT DOUBLE QUOTATION MARK
- "{\\quotedblbase}" : "\u201E", // DOUBLE LOW-9 QUOTATION MARK
+ "{\\textacutedbl}" : "\u02DD", // DOUBLE ACUTE ACCENT
+ "{\\textendash}" : "\u2013", // EN DASH
+ "{\\textemdash}" : "\u2014", // EM DASH
+ "---" : "\u2014", // EM DASH
+ "--" : "\u2013", // EN DASH
+ "{\\textbardbl}" : "\u2016", // DOUBLE VERTICAL LINE
+ "{\\textunderscore}" : "\u2017", // DOUBLE LOW LINE
+ "{\\textquoteleft}" : "\u2018", // LEFT SINGLE QUOTATION MARK
+ "{\\textquoteright}" : "\u2019", // RIGHT SINGLE QUOTATION MARK
+ "{\\quotesinglbase}" : "\u201A", // SINGLE LOW-9 QUOTATION MARK
+ "{\\textquotedblleft}" : "\u201C", // LEFT DOUBLE QUOTATION MARK
+ "{\\textquotedblright}" : "\u201D", // RIGHT DOUBLE QUOTATION MARK
+ "{\\quotedblbase}" : "\u201E", // DOUBLE LOW-9 QUOTATION MARK
// "{\\quotedblbase}" : "\u201F", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
- "{\\textdagger}" : "\u2020", // DAGGER
- "{\\textdaggerdbl}" : "\u2021", // DOUBLE DAGGER
- "{\\textbullet}" : "\u2022", // BULLET
- "{\\textellipsis}" : "\u2026", // HORIZONTAL ELLIPSIS
- "{\\textperthousand}" : "\u2030", // PER MILLE SIGN
- "'''" : "\u2034", // TRIPLE PRIME
- "''" : "\u201D", // RIGHT DOUBLE QUOTATION MARK (could be a double prime)
- "``" : "\u201C", // LEFT DOUBLE QUOTATION MARK (could be a reversed double prime)
- "```" : "\u2037", // REVERSED TRIPLE PRIME
- "{\\guilsinglleft}" : "\u2039", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- "{\\guilsinglright}" : "\u203A", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- "!!" : "\u203C", // DOUBLE EXCLAMATION MARK
- "{\\textfractionsolidus}" : "\u2044", // FRACTION SLASH
- "?!" : "\u2048", // QUESTION EXCLAMATION MARK
- "!?" : "\u2049", // EXCLAMATION QUESTION MARK
- "$^{0}$" : "\u2070", // SUPERSCRIPT ZERO
- "$^{4}$" : "\u2074", // SUPERSCRIPT FOUR
- "$^{5}$" : "\u2075", // SUPERSCRIPT FIVE
- "$^{6}$" : "\u2076", // SUPERSCRIPT SIX
- "$^{7}$" : "\u2077", // SUPERSCRIPT SEVEN
- "$^{8}$" : "\u2078", // SUPERSCRIPT EIGHT
- "$^{9}$" : "\u2079", // SUPERSCRIPT NINE
- "$^{+}$" : "\u207A", // SUPERSCRIPT PLUS SIGN
- "$^{-}$" : "\u207B", // SUPERSCRIPT MINUS
- "$^{=}$" : "\u207C", // SUPERSCRIPT EQUALS SIGN
- "$^{(}$" : "\u207D", // SUPERSCRIPT LEFT PARENTHESIS
- "$^{)}$" : "\u207E", // SUPERSCRIPT RIGHT PARENTHESIS
- "$^{n}$" : "\u207F", // SUPERSCRIPT LATIN SMALL LETTER N
- "$_{0}$" : "\u2080", // SUBSCRIPT ZERO
- "$_{1}$" : "\u2081", // SUBSCRIPT ONE
- "$_{2}$" : "\u2082", // SUBSCRIPT TWO
- "$_{3}$" : "\u2083", // SUBSCRIPT THREE
- "$_{4}$" : "\u2084", // SUBSCRIPT FOUR
- "$_{5}$" : "\u2085", // SUBSCRIPT FIVE
- "$_{6}$" : "\u2086", // SUBSCRIPT SIX
- "$_{7}$" : "\u2087", // SUBSCRIPT SEVEN
- "$_{8}$" : "\u2088", // SUBSCRIPT EIGHT
- "$_{9}$" : "\u2089", // SUBSCRIPT NINE
- "$_{+}$" : "\u208A", // SUBSCRIPT PLUS SIGN
- "$_{-}$" : "\u208B", // SUBSCRIPT MINUS
- "$_{=}$" : "\u208C", // SUBSCRIPT EQUALS SIGN
- "$_{(}$" : "\u208D", // SUBSCRIPT LEFT PARENTHESIS
- "$_{)}$" : "\u208E", // SUBSCRIPT RIGHT PARENTHESIS
- "{\\texteuro}" : "\u20AC", // EURO SIGN
- "a/c" : "\u2100", // ACCOUNT OF
- "a/s" : "\u2101", // ADDRESSED TO THE SUBJECT
- "{\\textcelsius}" : "\u2103", // DEGREE CELSIUS
- "c/o" : "\u2105", // CARE OF
- "c/u" : "\u2106", // CADA UNA
- "{\\textnumero}" : "\u2116", // NUMERO SIGN
- "{\\textcircledP}" : "\u2117", // SOUND RECORDING COPYRIGHT
- "{\\textservicemark}" : "\u2120", // SERVICE MARK
- "{TEL}" : "\u2121", // TELEPHONE SIGN
- "{\\texttrademark}" : "\u2122", // TRADE MARK SIGN
- "{\\textohm}" : "\u2126", // OHM SIGN
- "{\\textestimated}" : "\u212E", // ESTIMATED SYMBOL
- " 1/3" : "\u2153", // VULGAR FRACTION ONE THIRD
- " 2/3" : "\u2154", // VULGAR FRACTION TWO THIRDS
- " 1/5" : "\u2155", // VULGAR FRACTION ONE FIFTH
- " 2/5" : "\u2156", // VULGAR FRACTION TWO FIFTHS
- " 3/5" : "\u2157", // VULGAR FRACTION THREE FIFTHS
- " 4/5" : "\u2158", // VULGAR FRACTION FOUR FIFTHS
- " 1/6" : "\u2159", // VULGAR FRACTION ONE SIXTH
- " 5/6" : "\u215A", // VULGAR FRACTION FIVE SIXTHS
- " 1/8" : "\u215B", // VULGAR FRACTION ONE EIGHTH
- " 3/8" : "\u215C", // VULGAR FRACTION THREE EIGHTHS
- " 5/8" : "\u215D", // VULGAR FRACTION FIVE EIGHTHS
- " 7/8" : "\u215E", // VULGAR FRACTION SEVEN EIGHTHS
- " 1/" : "\u215F", // FRACTION NUMERATOR ONE
- "{\\textleftarrow}" : "\u2190", // LEFTWARDS ARROW
- "{\\textuparrow}" : "\u2191", // UPWARDS ARROW
- "{\\textrightarrow}" : "\u2192", // RIGHTWARDS ARROW
- "{\\textdownarrow}" : "\u2193", // DOWNWARDS ARROW
- "<->" : "\u2194", // LEFT RIGHT ARROW
- "<=" : "\u21D0", // LEFTWARDS DOUBLE ARROW
- "=>" : "\u21D2", // RIGHTWARDS DOUBLE ARROW
- "<=>" : "\u21D4", // LEFT RIGHT DOUBLE ARROW
- "$\\infty$" : "\u221E", // INFINITY
- "||" : "\u2225", // PARALLEL TO
- "\\~{}" : "\u223C", // TILDE OPERATOR
- "/=" : "\u2260", // NOT EQUAL TO
+ "{\\textdagger}" : "\u2020", // DAGGER
+ "{\\textdaggerdbl}" : "\u2021", // DOUBLE DAGGER
+ "{\\textbullet}" : "\u2022", // BULLET
+ "{\\textellipsis}" : "\u2026", // HORIZONTAL ELLIPSIS
+ "{\\textperthousand}" : "\u2030", // PER MILLE SIGN
+ "'''" : "\u2034", // TRIPLE PRIME
+ "''" : "\u201D", // RIGHT DOUBLE QUOTATION MARK (could be a double prime)
+ "``" : "\u201C", // LEFT DOUBLE QUOTATION MARK (could be a reversed double prime)
+ "```" : "\u2037", // REVERSED TRIPLE PRIME
+ "{\\guilsinglleft}" : "\u2039", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ "{\\guilsinglright}" : "\u203A", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ "!!" : "\u203C", // DOUBLE EXCLAMATION MARK
+ "{\\textfractionsolidus}" : "\u2044", // FRACTION SLASH
+ "?!" : "\u2048", // QUESTION EXCLAMATION MARK
+ "!?" : "\u2049", // EXCLAMATION QUESTION MARK
+ "$^{0}$" : "\u2070", // SUPERSCRIPT ZERO
+ "$^{4}$" : "\u2074", // SUPERSCRIPT FOUR
+ "$^{5}$" : "\u2075", // SUPERSCRIPT FIVE
+ "$^{6}$" : "\u2076", // SUPERSCRIPT SIX
+ "$^{7}$" : "\u2077", // SUPERSCRIPT SEVEN
+ "$^{8}$" : "\u2078", // SUPERSCRIPT EIGHT
+ "$^{9}$" : "\u2079", // SUPERSCRIPT NINE
+ "$^{+}$" : "\u207A", // SUPERSCRIPT PLUS SIGN
+ "$^{-}$" : "\u207B", // SUPERSCRIPT MINUS
+ "$^{=}$" : "\u207C", // SUPERSCRIPT EQUALS SIGN
+ "$^{(}$" : "\u207D", // SUPERSCRIPT LEFT PARENTHESIS
+ "$^{)}$" : "\u207E", // SUPERSCRIPT RIGHT PARENTHESIS
+ "$^{n}$" : "\u207F", // SUPERSCRIPT LATIN SMALL LETTER N
+ "$_{0}$" : "\u2080", // SUBSCRIPT ZERO
+ "$_{1}$" : "\u2081", // SUBSCRIPT ONE
+ "$_{2}$" : "\u2082", // SUBSCRIPT TWO
+ "$_{3}$" : "\u2083", // SUBSCRIPT THREE
+ "$_{4}$" : "\u2084", // SUBSCRIPT FOUR
+ "$_{5}$" : "\u2085", // SUBSCRIPT FIVE
+ "$_{6}$" : "\u2086", // SUBSCRIPT SIX
+ "$_{7}$" : "\u2087", // SUBSCRIPT SEVEN
+ "$_{8}$" : "\u2088", // SUBSCRIPT EIGHT
+ "$_{9}$" : "\u2089", // SUBSCRIPT NINE
+ "$_{+}$" : "\u208A", // SUBSCRIPT PLUS SIGN
+ "$_{-}$" : "\u208B", // SUBSCRIPT MINUS
+ "$_{=}$" : "\u208C", // SUBSCRIPT EQUALS SIGN
+ "$_{(}$" : "\u208D", // SUBSCRIPT LEFT PARENTHESIS
+ "$_{)}$" : "\u208E", // SUBSCRIPT RIGHT PARENTHESIS
+ "{\\texteuro}" : "\u20AC", // EURO SIGN
+ "a/c" : "\u2100", // ACCOUNT OF
+ "a/s" : "\u2101", // ADDRESSED TO THE SUBJECT
+ "{\\textcelsius}" : "\u2103", // DEGREE CELSIUS
+ "c/o" : "\u2105", // CARE OF
+ "c/u" : "\u2106", // CADA UNA
+ "{\\textnumero}" : "\u2116", // NUMERO SIGN
+ "{\\textcircledP}" : "\u2117", // SOUND RECORDING COPYRIGHT
+ "{\\textservicemark}" : "\u2120", // SERVICE MARK
+ "{TEL}" : "\u2121", // TELEPHONE SIGN
+ "{\\texttrademark}" : "\u2122", // TRADE MARK SIGN
+ "{\\textohm}" : "\u2126", // OHM SIGN
+ "{\\textestimated}" : "\u212E", // ESTIMATED SYMBOL
+ " 1/3" : "\u2153", // VULGAR FRACTION ONE THIRD
+ " 2/3" : "\u2154", // VULGAR FRACTION TWO THIRDS
+ " 1/5" : "\u2155", // VULGAR FRACTION ONE FIFTH
+ " 2/5" : "\u2156", // VULGAR FRACTION TWO FIFTHS
+ " 3/5" : "\u2157", // VULGAR FRACTION THREE FIFTHS
+ " 4/5" : "\u2158", // VULGAR FRACTION FOUR FIFTHS
+ " 1/6" : "\u2159", // VULGAR FRACTION ONE SIXTH
+ " 5/6" : "\u215A", // VULGAR FRACTION FIVE SIXTHS
+ " 1/8" : "\u215B", // VULGAR FRACTION ONE EIGHTH
+ " 3/8" : "\u215C", // VULGAR FRACTION THREE EIGHTHS
+ " 5/8" : "\u215D", // VULGAR FRACTION FIVE EIGHTHS
+ " 7/8" : "\u215E", // VULGAR FRACTION SEVEN EIGHTHS
+ " 1/" : "\u215F", // FRACTION NUMERATOR ONE
+ "{\\textleftarrow}" : "\u2190", // LEFTWARDS ARROW
+ "{\\textuparrow}" : "\u2191", // UPWARDS ARROW
+ "{\\textrightarrow}" : "\u2192", // RIGHTWARDS ARROW
+ "{\\textdownarrow}" : "\u2193", // DOWNWARDS ARROW
+ "<->" : "\u2194", // LEFT RIGHT ARROW
+ "<=" : "\u21D0", // LEFTWARDS DOUBLE ARROW
+ "=>" : "\u21D2", // RIGHTWARDS DOUBLE ARROW
+ "<=>" : "\u21D4", // LEFT RIGHT DOUBLE ARROW
+ "$\\infty$" : "\u221E", // INFINITY
+ "||" : "\u2225", // PARALLEL TO
+ "/=" : "\u2260", // NOT EQUAL TO
// "<=" : "\u2264", // LESS-THAN OR EQUAL TO
- ">=" : "\u2265", // GREATER-THAN OR EQUAL TO
- "<<" : "\u226A", // MUCH LESS-THAN
- ">>" : "\u226B", // MUCH GREATER-THAN
- "(+)" : "\u2295", // CIRCLED PLUS
- "(-)" : "\u2296", // CIRCLED MINUS
- "(x)" : "\u2297", // CIRCLED TIMES
- "(/)" : "\u2298", // CIRCLED DIVISION SLASH
- "|-" : "\u22A2", // RIGHT TACK
- "-|" : "\u22A3", // LEFT TACK
+ ">=" : "\u2265", // GREATER-THAN OR EQUAL TO
+ "<<" : "\u226A", // MUCH LESS-THAN
+ ">>" : "\u226B", // MUCH GREATER-THAN
+ "(+)" : "\u2295", // CIRCLED PLUS
+ "(-)" : "\u2296", // CIRCLED MINUS
+ "(x)" : "\u2297", // CIRCLED TIMES
+ "(/)" : "\u2298", // CIRCLED DIVISION SLASH
+ "|-" : "\u22A2", // RIGHT TACK
+ "-|" : "\u22A3", // LEFT TACK
// "|-" : "\u22A6", // ASSERTION
- "|=" : "\u22A7", // MODELS
+ "|=" : "\u22A7", // MODELS
// "|=" : "\u22A8", // TRUE
- "||-" : "\u22A9", // FORCES
- "$\\#$" : "\u22D5", // EQUAL AND PARALLEL TO
- "<<<" : "\u22D8", // VERY MUCH LESS-THAN
- ">>>" : "\u22D9", // VERY MUCH GREATER-THAN
- "{\\textlangle}" : "\u2329", // LEFT-POINTING ANGLE BRACKET
- "{\\textrangle}" : "\u232A", // RIGHT-POINTING ANGLE BRACKET
- "{\\textvisiblespace}" : "\u2423", // OPEN BOX
- "///" : "\u2425", // SYMBOL FOR DELETE FORM TWO
- "{\\textopenbullet}" : "\u25E6", // WHITE BULLET
- ":-(" : "\u2639", // WHITE FROWNING FACE
- ":-)" : "\u263A", // WHITE SMILING FACE
- "(-: " : "\u263B", // BLACK SMILING FACE
+ "||-" : "\u22A9", // FORCES
+ "$\\#$" : "\u22D5", // EQUAL AND PARALLEL TO
+ "<<<" : "\u22D8", // VERY MUCH LESS-THAN
+ ">>>" : "\u22D9", // VERY MUCH GREATER-THAN
+ "{\\textlangle}" : "\u2329", // LEFT-POINTING ANGLE BRACKET
+ "{\\textrangle}" : "\u232A", // RIGHT-POINTING ANGLE BRACKET
+ "{\\textvisiblespace}" : "\u2423", // OPEN BOX
+ "///" : "\u2425", // SYMBOL FOR DELETE FORM TWO
+ "{\\textopenbullet}" : "\u25E6", // WHITE BULLET
+ ":-(" : "\u2639", // WHITE FROWNING FACE
+ ":-)" : "\u263A", // WHITE SMILING FACE
+ "(-: " : "\u263B", // BLACK SMILING FACE
// "$\\#$" : "\u266F", // MUSIC SHARP SIGN
- "$\\%<$" : "\u2701", // UPPER BLADE SCISSORS
+ "$\\%<$" : "\u2701", // UPPER BLADE SCISSORS
/* "$\\%<$" : "\u2702", // BLACK SCISSORS
- "$\\%<$" : "\u2703", // LOWER BLADE SCISSORS
- "$\\%<$" : "\u2704", // WHITE SCISSORS */
+ "$\\%<$" : "\u2703", // LOWER BLADE SCISSORS
+ "$\\%<$" : "\u2704", // WHITE SCISSORS */
/* Derived accented characters */
- "\\`{A}" : "\u00C0", // LATIN CAPITAL LETTER A WITH GRAVE
- "\\'{A}" : "\u00C1", // LATIN CAPITAL LETTER A WITH ACUTE
- "\\^{A}" : "\u00C2", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
- "\\~{A}" : "\u00C3", // LATIN CAPITAL LETTER A WITH TILDE
- "\\\"{A}" : "\u00C4", // LATIN CAPITAL LETTER A WITH DIAERESIS
- "\\r{A}" : "\u00C5", // LATIN CAPITAL LETTER A WITH RING ABOVE
- "\\c{C}" : "\u00C7", // LATIN CAPITAL LETTER C WITH CEDILLA
- "\\`{E}" : "\u00C8", // LATIN CAPITAL LETTER E WITH GRAVE
- "\\'{E}" : "\u00C9", // LATIN CAPITAL LETTER E WITH ACUTE
- "\\^{E}" : "\u00CA", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
- "\\\"{E}" : "\u00CB", // LATIN CAPITAL LETTER E WITH DIAERESIS
- "\\`{I}" : "\u00CC", // LATIN CAPITAL LETTER I WITH GRAVE
- "\\'{I}" : "\u00CD", // LATIN CAPITAL LETTER I WITH ACUTE
- "\\^{I}" : "\u00CE", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
- "\\\"{I}" : "\u00CF", // LATIN CAPITAL LETTER I WITH DIAERESIS
- "\\~{N}" : "\u00D1", // LATIN CAPITAL LETTER N WITH TILDE
- "\\`{O}" : "\u00D2", // LATIN CAPITAL LETTER O WITH GRAVE
- "\\'{O}" : "\u00D3", // LATIN CAPITAL LETTER O WITH ACUTE
- "\\^{O}" : "\u00D4", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- "\\~{O}" : "\u00D5", // LATIN CAPITAL LETTER O WITH TILDE
- "\\\"{O}" : "\u00D6", // LATIN CAPITAL LETTER O WITH DIAERESIS
- "\\`{U}" : "\u00D9", // LATIN CAPITAL LETTER U WITH GRAVE
- "\\'{U}" : "\u00DA", // LATIN CAPITAL LETTER U WITH ACUTE
- "\\^{U}" : "\u00DB", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
- "\\\"{U}" : "\u00DC", // LATIN CAPITAL LETTER U WITH DIAERESIS
- "\\'{Y}" : "\u00DD", // LATIN CAPITAL LETTER Y WITH ACUTE
- "\\`{a}" : "\u00E0", // LATIN SMALL LETTER A WITH GRAVE
- "\\'{a}" : "\u00E1", // LATIN SMALL LETTER A WITH ACUTE
- "\\^{a}" : "\u00E2", // LATIN SMALL LETTER A WITH CIRCUMFLEX
- "\\~{a}" : "\u00E3", // LATIN SMALL LETTER A WITH TILDE
- "\\\"{a}" : "\u00E4", // LATIN SMALL LETTER A WITH DIAERESIS
- "\\r{a}" : "\u00E5", // LATIN SMALL LETTER A WITH RING ABOVE
- "\\c{c}" : "\u00E7", // LATIN SMALL LETTER C WITH CEDILLA
- "\\`{e}" : "\u00E8", // LATIN SMALL LETTER E WITH GRAVE
- "\\'{e}" : "\u00E9", // LATIN SMALL LETTER E WITH ACUTE
- "\\^{e}" : "\u00EA", // LATIN SMALL LETTER E WITH CIRCUMFLEX
- "\\\"{e}" : "\u00EB", // LATIN SMALL LETTER E WITH DIAERESIS
- "\\`{i}" : "\u00EC", // LATIN SMALL LETTER I WITH GRAVE
- "\\'{i}" : "\u00ED", // LATIN SMALL LETTER I WITH ACUTE
- "\\^{i}" : "\u00EE", // LATIN SMALL LETTER I WITH CIRCUMFLEX
- "\\\"{i}" : "\u00EF", // LATIN SMALL LETTER I WITH DIAERESIS
- "\\~{n}" : "\u00F1", // LATIN SMALL LETTER N WITH TILDE
- "\\`{o}" : "\u00F2", // LATIN SMALL LETTER O WITH GRAVE
- "\\'{o}" : "\u00F3", // LATIN SMALL LETTER O WITH ACUTE
- "\\^{o}" : "\u00F4", // LATIN SMALL LETTER O WITH CIRCUMFLEX
- "\\~{o}" : "\u00F5", // LATIN SMALL LETTER O WITH TILDE
- "\\\"{o}" : "\u00F6", // LATIN SMALL LETTER O WITH DIAERESIS
- "\\`{u}" : "\u00F9", // LATIN SMALL LETTER U WITH GRAVE
- "\\'{u}" : "\u00FA", // LATIN SMALL LETTER U WITH ACUTE
- "\\^{u}" : "\u00FB", // LATIN SMALL LETTER U WITH CIRCUMFLEX
- "\\\"{u}" : "\u00FC", // LATIN SMALL LETTER U WITH DIAERESIS
- "\\'{y}" : "\u00FD", // LATIN SMALL LETTER Y WITH ACUTE
- "\\\"{y}" : "\u00FF", // LATIN SMALL LETTER Y WITH DIAERESIS
- "\\={A}" : "\u0100", // LATIN CAPITAL LETTER A WITH MACRON
- "\\={a}" : "\u0101", // LATIN SMALL LETTER A WITH MACRON
- "\\u{A}" : "\u0102", // LATIN CAPITAL LETTER A WITH BREVE
- "\\u{a}" : "\u0103", // LATIN SMALL LETTER A WITH BREVE
- "\\k{A}" : "\u0104", // LATIN CAPITAL LETTER A WITH OGONEK
- "\\k{a}" : "\u0105", // LATIN SMALL LETTER A WITH OGONEK
- "\\'{C}" : "\u0106", // LATIN CAPITAL LETTER C WITH ACUTE
- "\\'{c}" : "\u0107", // LATIN SMALL LETTER C WITH ACUTE
- "\\^{C}" : "\u0108", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
- "\\^{c}" : "\u0109", // LATIN SMALL LETTER C WITH CIRCUMFLEX
- "\\.{C}" : "\u010A", // LATIN CAPITAL LETTER C WITH DOT ABOVE
- "\\.{c}" : "\u010B", // LATIN SMALL LETTER C WITH DOT ABOVE
- "\\v{C}" : "\u010C", // LATIN CAPITAL LETTER C WITH CARON
- "\\v{c}" : "\u010D", // LATIN SMALL LETTER C WITH CARON
- "\\v{D}" : "\u010E", // LATIN CAPITAL LETTER D WITH CARON
- "\\v{d}" : "\u010F", // LATIN SMALL LETTER D WITH CARON
- "\\={E}" : "\u0112", // LATIN CAPITAL LETTER E WITH MACRON
- "\\={e}" : "\u0113", // LATIN SMALL LETTER E WITH MACRON
- "\\u{E}" : "\u0114", // LATIN CAPITAL LETTER E WITH BREVE
- "\\u{e}" : "\u0115", // LATIN SMALL LETTER E WITH BREVE
- "\\.{E}" : "\u0116", // LATIN CAPITAL LETTER E WITH DOT ABOVE
- "\\.{e}" : "\u0117", // LATIN SMALL LETTER E WITH DOT ABOVE
- "\\k{E}" : "\u0118", // LATIN CAPITAL LETTER E WITH OGONEK
- "\\k{e}" : "\u0119", // LATIN SMALL LETTER E WITH OGONEK
- "\\v{E}" : "\u011A", // LATIN CAPITAL LETTER E WITH CARON
- "\\v{e}" : "\u011B", // LATIN SMALL LETTER E WITH CARON
- "\\^{G}" : "\u011C", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
- "\\^{g}" : "\u011D", // LATIN SMALL LETTER G WITH CIRCUMFLEX
- "\\u{G}" : "\u011E", // LATIN CAPITAL LETTER G WITH BREVE
- "\\u{g}" : "\u011F", // LATIN SMALL LETTER G WITH BREVE
- "\\.{G}" : "\u0120", // LATIN CAPITAL LETTER G WITH DOT ABOVE
- "\\.{g}" : "\u0121", // LATIN SMALL LETTER G WITH DOT ABOVE
- "\\c{G}" : "\u0122", // LATIN CAPITAL LETTER G WITH CEDILLA
- "\\c{g}" : "\u0123", // LATIN SMALL LETTER G WITH CEDILLA
- "\\^{H}" : "\u0124", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
- "\\^{h}" : "\u0125", // LATIN SMALL LETTER H WITH CIRCUMFLEX
- "\\~{I}" : "\u0128", // LATIN CAPITAL LETTER I WITH TILDE
- "\\~{i}" : "\u0129", // LATIN SMALL LETTER I WITH TILDE
- "\\={I}" : "\u012A", // LATIN CAPITAL LETTER I WITH MACRON
- "\\={i}" : "\u012B", // LATIN SMALL LETTER I WITH MACRON
- "\\u{I}" : "\u012C", // LATIN CAPITAL LETTER I WITH BREVE
- "\\u{i}" : "\u012D", // LATIN SMALL LETTER I WITH BREVE
- "\\k{I}" : "\u012E", // LATIN CAPITAL LETTER I WITH OGONEK
- "\\k{i}" : "\u012F", // LATIN SMALL LETTER I WITH OGONEK
- "\\.{I}" : "\u0130", // LATIN CAPITAL LETTER I WITH DOT ABOVE
- "\\^{J}" : "\u0134", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
- "\\^{j}" : "\u0135", // LATIN SMALL LETTER J WITH CIRCUMFLEX
- "\\c{K}" : "\u0136", // LATIN CAPITAL LETTER K WITH CEDILLA
- "\\c{k}" : "\u0137", // LATIN SMALL LETTER K WITH CEDILLA
- "\\'{L}" : "\u0139", // LATIN CAPITAL LETTER L WITH ACUTE
- "\\'{l}" : "\u013A", // LATIN SMALL LETTER L WITH ACUTE
- "\\c{L}" : "\u013B", // LATIN CAPITAL LETTER L WITH CEDILLA
- "\\c{l}" : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA
- "\\v{L}" : "\u013D", // LATIN CAPITAL LETTER L WITH CARON
- "\\v{l}" : "\u013E", // LATIN SMALL LETTER L WITH CARON
- "\\L{}" : "\u0141", //LATIN CAPITAL LETTER L WITH STROKE
- "\\l{}" : "\u0142", //LATIN SMALL LETTER L WITH STROKE
- "\\'{N}" : "\u0143", // LATIN CAPITAL LETTER N WITH ACUTE
- "\\'{n}" : "\u0144", // LATIN SMALL LETTER N WITH ACUTE
- "\\c{N}" : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA
- "\\c{n}" : "\u0146", // LATIN SMALL LETTER N WITH CEDILLA
- "\\v{N}" : "\u0147", // LATIN CAPITAL LETTER N WITH CARON
- "\\v{n}" : "\u0148", // LATIN SMALL LETTER N WITH CARON
- "\\={O}" : "\u014C", // LATIN CAPITAL LETTER O WITH MACRON
- "\\={o}" : "\u014D", // LATIN SMALL LETTER O WITH MACRON
- "\\u{O}" : "\u014E", // LATIN CAPITAL LETTER O WITH BREVE
- "\\u{o}" : "\u014F", // LATIN SMALL LETTER O WITH BREVE
- "\\H{O}" : "\u0150", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
- "\\H{o}" : "\u0151", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
- "\\'{R}" : "\u0154", // LATIN CAPITAL LETTER R WITH ACUTE
- "\\'{r}" : "\u0155", // LATIN SMALL LETTER R WITH ACUTE
- "\\c{R}" : "\u0156", // LATIN CAPITAL LETTER R WITH CEDILLA
- "\\c{r}" : "\u0157", // LATIN SMALL LETTER R WITH CEDILLA
- "\\v{R}" : "\u0158", // LATIN CAPITAL LETTER R WITH CARON
- "\\v{r}" : "\u0159", // LATIN SMALL LETTER R WITH CARON
- "\\'{S}" : "\u015A", // LATIN CAPITAL LETTER S WITH ACUTE
- "\\'{s}" : "\u015B", // LATIN SMALL LETTER S WITH ACUTE
- "\\^{S}" : "\u015C", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
- "\\^{s}" : "\u015D", // LATIN SMALL LETTER S WITH CIRCUMFLEX
- "\\c{S}" : "\u015E", // LATIN CAPITAL LETTER S WITH CEDILLA
- "\\c{s}" : "\u015F", // LATIN SMALL LETTER S WITH CEDILLA
- "\\v{S}" : "\u0160", // LATIN CAPITAL LETTER S WITH CARON
- "\\v{s}" : "\u0161", // LATIN SMALL LETTER S WITH CARON
- "\\c{T}" : "\u0162", // LATIN CAPITAL LETTER T WITH CEDILLA
- "\\c{t}" : "\u0163", // LATIN SMALL LETTER T WITH CEDILLA
- "\\v{T}" : "\u0164", // LATIN CAPITAL LETTER T WITH CARON
- "\\v{t}" : "\u0165", // LATIN SMALL LETTER T WITH CARON
- "\\~{U}" : "\u0168", // LATIN CAPITAL LETTER U WITH TILDE
- "\\~{u}" : "\u0169", // LATIN SMALL LETTER U WITH TILDE
- "\\={U}" : "\u016A", // LATIN CAPITAL LETTER U WITH MACRON
- "\\={u}" : "\u016B", // LATIN SMALL LETTER U WITH MACRON
- "\\u{U}" : "\u016C", // LATIN CAPITAL LETTER U WITH BREVE
- "\\u{u}" : "\u016D", // LATIN SMALL LETTER U WITH BREVE
- "\\H{U}" : "\u0170", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
- "\\H{u}" : "\u0171", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
- "\\k{U}" : "\u0172", // LATIN CAPITAL LETTER U WITH OGONEK
- "\\k{u}" : "\u0173", // LATIN SMALL LETTER U WITH OGONEK
- "\\^{W}" : "\u0174", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
- "\\^{w}" : "\u0175", // LATIN SMALL LETTER W WITH CIRCUMFLEX
- "\\^{Y}" : "\u0176", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
- "\\^{y}" : "\u0177", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
- "\\\"{Y}" : "\u0178", // LATIN CAPITAL LETTER Y WITH DIAERESIS
- "\\'{Z}" : "\u0179", // LATIN CAPITAL LETTER Z WITH ACUTE
- "\\'{z}" : "\u017A", // LATIN SMALL LETTER Z WITH ACUTE
- "\\.{Z}" : "\u017B", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
- "\\.{z}" : "\u017C", // LATIN SMALL LETTER Z WITH DOT ABOVE
- "\\v{Z}" : "\u017D", // LATIN CAPITAL LETTER Z WITH CARON
- "\\v{z}" : "\u017E", // LATIN SMALL LETTER Z WITH CARON
- "\\v{A}" : "\u01CD", // LATIN CAPITAL LETTER A WITH CARON
- "\\v{a}" : "\u01CE", // LATIN SMALL LETTER A WITH CARON
- "\\v{I}" : "\u01CF", // LATIN CAPITAL LETTER I WITH CARON
- "\\v{i}" : "\u01D0", // LATIN SMALL LETTER I WITH CARON
- "\\v{O}" : "\u01D1", // LATIN CAPITAL LETTER O WITH CARON
- "\\v{o}" : "\u01D2", // LATIN SMALL LETTER O WITH CARON
- "\\v{U}" : "\u01D3", // LATIN CAPITAL LETTER U WITH CARON
- "\\v{u}" : "\u01D4", // LATIN SMALL LETTER U WITH CARON
- "\\v{G}" : "\u01E6", // LATIN CAPITAL LETTER G WITH CARON
- "\\v{g}" : "\u01E7", // LATIN SMALL LETTER G WITH CARON
- "\\v{K}" : "\u01E8", // LATIN CAPITAL LETTER K WITH CARON
- "\\v{k}" : "\u01E9", // LATIN SMALL LETTER K WITH CARON
- "\\k{O}" : "\u01EA", // LATIN CAPITAL LETTER O WITH OGONEK
- "\\k{o}" : "\u01EB", // LATIN SMALL LETTER O WITH OGONEK
- "\\v{j}" : "\u01F0", // LATIN SMALL LETTER J WITH CARON
- "\\'{G}" : "\u01F4", // LATIN CAPITAL LETTER G WITH ACUTE
- "\\'{g}" : "\u01F5", // LATIN SMALL LETTER G WITH ACUTE
- "\\.{B}" : "\u1E02", // LATIN CAPITAL LETTER B WITH DOT ABOVE
- "\\.{b}" : "\u1E03", // LATIN SMALL LETTER B WITH DOT ABOVE
- "\\d{B}" : "\u1E04", // LATIN CAPITAL LETTER B WITH DOT BELOW
- "\\d{b}" : "\u1E05", // LATIN SMALL LETTER B WITH DOT BELOW
- "\\b{B}" : "\u1E06", // LATIN CAPITAL LETTER B WITH LINE BELOW
- "\\b{b}" : "\u1E07", // LATIN SMALL LETTER B WITH LINE BELOW
- "\\.{D}" : "\u1E0A", // LATIN CAPITAL LETTER D WITH DOT ABOVE
- "\\.{d}" : "\u1E0B", // LATIN SMALL LETTER D WITH DOT ABOVE
- "\\d{D}" : "\u1E0C", // LATIN CAPITAL LETTER D WITH DOT BELOW
- "\\d{d}" : "\u1E0D", // LATIN SMALL LETTER D WITH DOT BELOW
- "\\b{D}" : "\u1E0E", // LATIN CAPITAL LETTER D WITH LINE BELOW
- "\\b{d}" : "\u1E0F", // LATIN SMALL LETTER D WITH LINE BELOW
- "\\c{D}" : "\u1E10", // LATIN CAPITAL LETTER D WITH CEDILLA
- "\\c{d}" : "\u1E11", // LATIN SMALL LETTER D WITH CEDILLA
- "\\.{F}" : "\u1E1E", // LATIN CAPITAL LETTER F WITH DOT ABOVE
- "\\.{f}" : "\u1E1F", // LATIN SMALL LETTER F WITH DOT ABOVE
- "\\={G}" : "\u1E20", // LATIN CAPITAL LETTER G WITH MACRON
- "\\={g}" : "\u1E21", // LATIN SMALL LETTER G WITH MACRON
- "\\.{H}" : "\u1E22", // LATIN CAPITAL LETTER H WITH DOT ABOVE
- "\\.{h}" : "\u1E23", // LATIN SMALL LETTER H WITH DOT ABOVE
- "\\d{H}" : "\u1E24", // LATIN CAPITAL LETTER H WITH DOT BELOW
- "\\d{h}" : "\u1E25", // LATIN SMALL LETTER H WITH DOT BELOW
- "\\\"{H}" : "\u1E26", // LATIN CAPITAL LETTER H WITH DIAERESIS
- "\\\"{h}" : "\u1E27", // LATIN SMALL LETTER H WITH DIAERESIS
- "\\c{H}" : "\u1E28", // LATIN CAPITAL LETTER H WITH CEDILLA
- "\\c{h}" : "\u1E29", // LATIN SMALL LETTER H WITH CEDILLA
- "\\'{K}" : "\u1E30", // LATIN CAPITAL LETTER K WITH ACUTE
- "\\'{k}" : "\u1E31", // LATIN SMALL LETTER K WITH ACUTE
- "\\d{K}" : "\u1E32", // LATIN CAPITAL LETTER K WITH DOT BELOW
- "\\d{k}" : "\u1E33", // LATIN SMALL LETTER K WITH DOT BELOW
- "\\b{K}" : "\u1E34", // LATIN CAPITAL LETTER K WITH LINE BELOW
- "\\b{k}" : "\u1E35", // LATIN SMALL LETTER K WITH LINE BELOW
- "\\d{L}" : "\u1E36", // LATIN CAPITAL LETTER L WITH DOT BELOW
- "\\d{l}" : "\u1E37", // LATIN SMALL LETTER L WITH DOT BELOW
- "\\b{L}" : "\u1E3A", // LATIN CAPITAL LETTER L WITH LINE BELOW
- "\\b{l}" : "\u1E3B", // LATIN SMALL LETTER L WITH LINE BELOW
- "\\'{M}" : "\u1E3E", // LATIN CAPITAL LETTER M WITH ACUTE
- "\\'{m}" : "\u1E3F", // LATIN SMALL LETTER M WITH ACUTE
- "\\.{M}" : "\u1E40", // LATIN CAPITAL LETTER M WITH DOT ABOVE
- "\\.{m}" : "\u1E41", // LATIN SMALL LETTER M WITH DOT ABOVE
- "\\d{M}" : "\u1E42", // LATIN CAPITAL LETTER M WITH DOT BELOW
- "\\d{m}" : "\u1E43", // LATIN SMALL LETTER M WITH DOT BELOW
- "\\.{N}" : "\u1E44", // LATIN CAPITAL LETTER N WITH DOT ABOVE
- "\\.{n}" : "\u1E45", // LATIN SMALL LETTER N WITH DOT ABOVE
- "\\d{N}" : "\u1E46", // LATIN CAPITAL LETTER N WITH DOT BELOW
- "\\d{n}" : "\u1E47", // LATIN SMALL LETTER N WITH DOT BELOW
- "\\b{N}" : "\u1E48", // LATIN CAPITAL LETTER N WITH LINE BELOW
- "\\b{n}" : "\u1E49", // LATIN SMALL LETTER N WITH LINE BELOW
- "\\'{P}" : "\u1E54", // LATIN CAPITAL LETTER P WITH ACUTE
- "\\'{p}" : "\u1E55", // LATIN SMALL LETTER P WITH ACUTE
- "\\.{P}" : "\u1E56", // LATIN CAPITAL LETTER P WITH DOT ABOVE
- "\\.{p}" : "\u1E57", // LATIN SMALL LETTER P WITH DOT ABOVE
- "\\.{R}" : "\u1E58", // LATIN CAPITAL LETTER R WITH DOT ABOVE
- "\\.{r}" : "\u1E59", // LATIN SMALL LETTER R WITH DOT ABOVE
- "\\d{R}" : "\u1E5A", // LATIN CAPITAL LETTER R WITH DOT BELOW
- "\\d{r}" : "\u1E5B", // LATIN SMALL LETTER R WITH DOT BELOW
- "\\b{R}" : "\u1E5E", // LATIN CAPITAL LETTER R WITH LINE BELOW
- "\\b{r}" : "\u1E5F", // LATIN SMALL LETTER R WITH LINE BELOW
- "\\.{S}" : "\u1E60", // LATIN CAPITAL LETTER S WITH DOT ABOVE
- "\\.{s}" : "\u1E61", // LATIN SMALL LETTER S WITH DOT ABOVE
- "\\d{S}" : "\u1E62", // LATIN CAPITAL LETTER S WITH DOT BELOW
- "\\d{s}" : "\u1E63", // LATIN SMALL LETTER S WITH DOT BELOW
- "\\.{T}" : "\u1E6A", // LATIN CAPITAL LETTER T WITH DOT ABOVE
- "\\.{t}" : "\u1E6B", // LATIN SMALL LETTER T WITH DOT ABOVE
- "\\d{T}" : "\u1E6C", // LATIN CAPITAL LETTER T WITH DOT BELOW
- "\\d{t}" : "\u1E6D", // LATIN SMALL LETTER T WITH DOT BELOW
- "\\b{T}" : "\u1E6E", // LATIN CAPITAL LETTER T WITH LINE BELOW
- "\\b{t}" : "\u1E6F", // LATIN SMALL LETTER T WITH LINE BELOW
- "\\~{V}" : "\u1E7C", // LATIN CAPITAL LETTER V WITH TILDE
- "\\~{v}" : "\u1E7D", // LATIN SMALL LETTER V WITH TILDE
- "\\d{V}" : "\u1E7E", // LATIN CAPITAL LETTER V WITH DOT BELOW
- "\\d{v}" : "\u1E7F", // LATIN SMALL LETTER V WITH DOT BELOW
- "\\`{W}" : "\u1E80", // LATIN CAPITAL LETTER W WITH GRAVE
- "\\`{w}" : "\u1E81", // LATIN SMALL LETTER W WITH GRAVE
- "\\'{W}" : "\u1E82", // LATIN CAPITAL LETTER W WITH ACUTE
- "\\'{w}" : "\u1E83", // LATIN SMALL LETTER W WITH ACUTE
- "\\\"{W}" : "\u1E84", // LATIN CAPITAL LETTER W WITH DIAERESIS
- "\\\"{w}" : "\u1E85", // LATIN SMALL LETTER W WITH DIAERESIS
- "\\.{W}" : "\u1E86", // LATIN CAPITAL LETTER W WITH DOT ABOVE
- "\\.{w}" : "\u1E87", // LATIN SMALL LETTER W WITH DOT ABOVE
- "\\d{W}" : "\u1E88", // LATIN CAPITAL LETTER W WITH DOT BELOW
- "\\d{w}" : "\u1E89", // LATIN SMALL LETTER W WITH DOT BELOW
- "\\.{X}" : "\u1E8A", // LATIN CAPITAL LETTER X WITH DOT ABOVE
- "\\.{x}" : "\u1E8B", // LATIN SMALL LETTER X WITH DOT ABOVE
- "\\\"{X}" : "\u1E8C", // LATIN CAPITAL LETTER X WITH DIAERESIS
- "\\\"{x}" : "\u1E8D", // LATIN SMALL LETTER X WITH DIAERESIS
- "\\.{Y}" : "\u1E8E", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
- "\\.{y}" : "\u1E8F", // LATIN SMALL LETTER Y WITH DOT ABOVE
- "\\^{Z}" : "\u1E90", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
- "\\^{z}" : "\u1E91", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
- "\\d{Z}" : "\u1E92", // LATIN CAPITAL LETTER Z WITH DOT BELOW
- "\\d{z}" : "\u1E93", // LATIN SMALL LETTER Z WITH DOT BELOW
- "\\b{Z}" : "\u1E94", // LATIN CAPITAL LETTER Z WITH LINE BELOW
- "\\b{z}" : "\u1E95", // LATIN SMALL LETTER Z WITH LINE BELOW
- "\\b{h}" : "\u1E96", // LATIN SMALL LETTER H WITH LINE BELOW
- "\\\"{t}" : "\u1E97", // LATIN SMALL LETTER T WITH DIAERESIS
- "\\d{A}" : "\u1EA0", // LATIN CAPITAL LETTER A WITH DOT BELOW
- "\\d{a}" : "\u1EA1", // LATIN SMALL LETTER A WITH DOT BELOW
- "\\d{E}" : "\u1EB8", // LATIN CAPITAL LETTER E WITH DOT BELOW
- "\\d{e}" : "\u1EB9", // LATIN SMALL LETTER E WITH DOT BELOW
- "\\~{E}" : "\u1EBC", // LATIN CAPITAL LETTER E WITH TILDE
- "\\~{e}" : "\u1EBD", // LATIN SMALL LETTER E WITH TILDE
- "\\d{I}" : "\u1ECA", // LATIN CAPITAL LETTER I WITH DOT BELOW
- "\\d{i}" : "\u1ECB", // LATIN SMALL LETTER I WITH DOT BELOW
- "\\d{O}" : "\u1ECC", // LATIN CAPITAL LETTER O WITH DOT BELOW
- "\\d{o}" : "\u1ECD", // LATIN SMALL LETTER O WITH DOT BELOW
- "\\d{U}" : "\u1EE4", // LATIN CAPITAL LETTER U WITH DOT BELOW
- "\\d{u}" : "\u1EE5", // LATIN SMALL LETTER U WITH DOT BELOW
- "\\`{Y}" : "\u1EF2", // LATIN CAPITAL LETTER Y WITH GRAVE
- "\\`{y}" : "\u1EF3", // LATIN SMALL LETTER Y WITH GRAVE
- "\\d{Y}" : "\u1EF4", // LATIN CAPITAL LETTER Y WITH DOT BELOW
- "\\d{y}" : "\u1EF5", // LATIN SMALL LETTER Y WITH DOT BELOW
- "\\~{Y}" : "\u1EF8", // LATIN CAPITAL LETTER Y WITH TILDE
- "\\~{y}" : "\u1EF9" // LATIN SMALL LETTER Y WITH TILDE
+ "\\`{A}" : "\u00C0", // LATIN CAPITAL LETTER A WITH GRAVE
+ "\\'{A}" : "\u00C1", // LATIN CAPITAL LETTER A WITH ACUTE
+ "\\^{A}" : "\u00C2", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ "\\~{A}" : "\u00C3", // LATIN CAPITAL LETTER A WITH TILDE
+ "\\\"{A}" : "\u00C4", // LATIN CAPITAL LETTER A WITH DIAERESIS
+ "\\r{A}" : "\u00C5", // LATIN CAPITAL LETTER A WITH RING ABOVE
+ "\\c{C}" : "\u00C7", // LATIN CAPITAL LETTER C WITH CEDILLA
+ "\\`{E}" : "\u00C8", // LATIN CAPITAL LETTER E WITH GRAVE
+ "\\'{E}" : "\u00C9", // LATIN CAPITAL LETTER E WITH ACUTE
+ "\\^{E}" : "\u00CA", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ "\\\"{E}" : "\u00CB", // LATIN CAPITAL LETTER E WITH DIAERESIS
+ "\\`{I}" : "\u00CC", // LATIN CAPITAL LETTER I WITH GRAVE
+ "\\'{I}" : "\u00CD", // LATIN CAPITAL LETTER I WITH ACUTE
+ "\\^{I}" : "\u00CE", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ "\\\"{I}" : "\u00CF", // LATIN CAPITAL LETTER I WITH DIAERESIS
+ "\\~{N}" : "\u00D1", // LATIN CAPITAL LETTER N WITH TILDE
+ "\\`{O}" : "\u00D2", // LATIN CAPITAL LETTER O WITH GRAVE
+ "\\'{O}" : "\u00D3", // LATIN CAPITAL LETTER O WITH ACUTE
+ "\\^{O}" : "\u00D4", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ "\\~{O}" : "\u00D5", // LATIN CAPITAL LETTER O WITH TILDE
+ "\\\"{O}" : "\u00D6", // LATIN CAPITAL LETTER O WITH DIAERESIS
+ "\\`{U}" : "\u00D9", // LATIN CAPITAL LETTER U WITH GRAVE
+ "\\'{U}" : "\u00DA", // LATIN CAPITAL LETTER U WITH ACUTE
+ "\\^{U}" : "\u00DB", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ "\\\"{U}" : "\u00DC", // LATIN CAPITAL LETTER U WITH DIAERESIS
+ "\\'{Y}" : "\u00DD", // LATIN CAPITAL LETTER Y WITH ACUTE
+ "\\`{a}" : "\u00E0", // LATIN SMALL LETTER A WITH GRAVE
+ "\\'{a}" : "\u00E1", // LATIN SMALL LETTER A WITH ACUTE
+ "\\^{a}" : "\u00E2", // LATIN SMALL LETTER A WITH CIRCUMFLEX
+ "\\~{a}" : "\u00E3", // LATIN SMALL LETTER A WITH TILDE
+ "\\\"{a}" : "\u00E4", // LATIN SMALL LETTER A WITH DIAERESIS
+ "\\r{a}" : "\u00E5", // LATIN SMALL LETTER A WITH RING ABOVE
+ "\\c{c}" : "\u00E7", // LATIN SMALL LETTER C WITH CEDILLA
+ "\\`{e}" : "\u00E8", // LATIN SMALL LETTER E WITH GRAVE
+ "\\'{e}" : "\u00E9", // LATIN SMALL LETTER E WITH ACUTE
+ "\\^{e}" : "\u00EA", // LATIN SMALL LETTER E WITH CIRCUMFLEX
+ "\\\"{e}" : "\u00EB", // LATIN SMALL LETTER E WITH DIAERESIS
+ "\\`{i}" : "\u00EC", // LATIN SMALL LETTER I WITH GRAVE
+ "\\'{i}" : "\u00ED", // LATIN SMALL LETTER I WITH ACUTE
+ "\\^{i}" : "\u00EE", // LATIN SMALL LETTER I WITH CIRCUMFLEX
+ "\\\"{i}" : "\u00EF", // LATIN SMALL LETTER I WITH DIAERESIS
+ "\\~{n}" : "\u00F1", // LATIN SMALL LETTER N WITH TILDE
+ "\\`{o}" : "\u00F2", // LATIN SMALL LETTER O WITH GRAVE
+ "\\'{o}" : "\u00F3", // LATIN SMALL LETTER O WITH ACUTE
+ "\\^{o}" : "\u00F4", // LATIN SMALL LETTER O WITH CIRCUMFLEX
+ "\\~{o}" : "\u00F5", // LATIN SMALL LETTER O WITH TILDE
+ "\\\"{o}" : "\u00F6", // LATIN SMALL LETTER O WITH DIAERESIS
+ "\\`{u}" : "\u00F9", // LATIN SMALL LETTER U WITH GRAVE
+ "\\'{u}" : "\u00FA", // LATIN SMALL LETTER U WITH ACUTE
+ "\\^{u}" : "\u00FB", // LATIN SMALL LETTER U WITH CIRCUMFLEX
+ "\\\"{u}" : "\u00FC", // LATIN SMALL LETTER U WITH DIAERESIS
+ "\\'{y}" : "\u00FD", // LATIN SMALL LETTER Y WITH ACUTE
+ "\\\"{y}" : "\u00FF", // LATIN SMALL LETTER Y WITH DIAERESIS
+ "\\={A}" : "\u0100", // LATIN CAPITAL LETTER A WITH MACRON
+ "\\={a}" : "\u0101", // LATIN SMALL LETTER A WITH MACRON
+ "\\u{A}" : "\u0102", // LATIN CAPITAL LETTER A WITH BREVE
+ "\\u{a}" : "\u0103", // LATIN SMALL LETTER A WITH BREVE
+ "\\k{A}" : "\u0104", // LATIN CAPITAL LETTER A WITH OGONEK
+ "\\k{a}" : "\u0105", // LATIN SMALL LETTER A WITH OGONEK
+ "\\'{C}" : "\u0106", // LATIN CAPITAL LETTER C WITH ACUTE
+ "\\'{c}" : "\u0107", // LATIN SMALL LETTER C WITH ACUTE
+ "\\^{C}" : "\u0108", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ "\\^{c}" : "\u0109", // LATIN SMALL LETTER C WITH CIRCUMFLEX
+ "\\.{C}" : "\u010A", // LATIN CAPITAL LETTER C WITH DOT ABOVE
+ "\\.{c}" : "\u010B", // LATIN SMALL LETTER C WITH DOT ABOVE
+ "\\v{C}" : "\u010C", // LATIN CAPITAL LETTER C WITH CARON
+ "\\v{c}" : "\u010D", // LATIN SMALL LETTER C WITH CARON
+ "\\v{D}" : "\u010E", // LATIN CAPITAL LETTER D WITH CARON
+ "\\v{d}" : "\u010F", // LATIN SMALL LETTER D WITH CARON
+ "\\={E}" : "\u0112", // LATIN CAPITAL LETTER E WITH MACRON
+ "\\={e}" : "\u0113", // LATIN SMALL LETTER E WITH MACRON
+ "\\u{E}" : "\u0114", // LATIN CAPITAL LETTER E WITH BREVE
+ "\\u{e}" : "\u0115", // LATIN SMALL LETTER E WITH BREVE
+ "\\.{E}" : "\u0116", // LATIN CAPITAL LETTER E WITH DOT ABOVE
+ "\\.{e}" : "\u0117", // LATIN SMALL LETTER E WITH DOT ABOVE
+ "\\k{E}" : "\u0118", // LATIN CAPITAL LETTER E WITH OGONEK
+ "\\k{e}" : "\u0119", // LATIN SMALL LETTER E WITH OGONEK
+ "\\v{E}" : "\u011A", // LATIN CAPITAL LETTER E WITH CARON
+ "\\v{e}" : "\u011B", // LATIN SMALL LETTER E WITH CARON
+ "\\^{G}" : "\u011C", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ "\\^{g}" : "\u011D", // LATIN SMALL LETTER G WITH CIRCUMFLEX
+ "\\u{G}" : "\u011E", // LATIN CAPITAL LETTER G WITH BREVE
+ "\\u{g}" : "\u011F", // LATIN SMALL LETTER G WITH BREVE
+ "\\.{G}" : "\u0120", // LATIN CAPITAL LETTER G WITH DOT ABOVE
+ "\\.{g}" : "\u0121", // LATIN SMALL LETTER G WITH DOT ABOVE
+ "\\c{G}" : "\u0122", // LATIN CAPITAL LETTER G WITH CEDILLA
+ "\\c{g}" : "\u0123", // LATIN SMALL LETTER G WITH CEDILLA
+ "\\^{H}" : "\u0124", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ "\\^{h}" : "\u0125", // LATIN SMALL LETTER H WITH CIRCUMFLEX
+ "\\~{I}" : "\u0128", // LATIN CAPITAL LETTER I WITH TILDE
+ "\\~{i}" : "\u0129", // LATIN SMALL LETTER I WITH TILDE
+ "\\={I}" : "\u012A", // LATIN CAPITAL LETTER I WITH MACRON
+ "\\={i}" : "\u012B", // LATIN SMALL LETTER I WITH MACRON
+ "\\u{I}" : "\u012C", // LATIN CAPITAL LETTER I WITH BREVE
+ "\\u{i}" : "\u012D", // LATIN SMALL LETTER I WITH BREVE
+ "\\k{I}" : "\u012E", // LATIN CAPITAL LETTER I WITH OGONEK
+ "\\k{i}" : "\u012F", // LATIN SMALL LETTER I WITH OGONEK
+ "\\.{I}" : "\u0130", // LATIN CAPITAL LETTER I WITH DOT ABOVE
+ "\\^{J}" : "\u0134", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ "\\^{j}" : "\u0135", // LATIN SMALL LETTER J WITH CIRCUMFLEX
+ "\\c{K}" : "\u0136", // LATIN CAPITAL LETTER K WITH CEDILLA
+ "\\c{k}" : "\u0137", // LATIN SMALL LETTER K WITH CEDILLA
+ "\\'{L}" : "\u0139", // LATIN CAPITAL LETTER L WITH ACUTE
+ "\\'{l}" : "\u013A", // LATIN SMALL LETTER L WITH ACUTE
+ "\\c{L}" : "\u013B", // LATIN CAPITAL LETTER L WITH CEDILLA
+ "\\c{l}" : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA
+ "\\v{L}" : "\u013D", // LATIN CAPITAL LETTER L WITH CARON
+ "\\v{l}" : "\u013E", // LATIN SMALL LETTER L WITH CARON
+ "\\L{}" : "\u0141", //LATIN CAPITAL LETTER L WITH STROKE
+ "\\l{}" : "\u0142", //LATIN SMALL LETTER L WITH STROKE
+ "\\'{N}" : "\u0143", // LATIN CAPITAL LETTER N WITH ACUTE
+ "\\'{n}" : "\u0144", // LATIN SMALL LETTER N WITH ACUTE
+ "\\c{N}" : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA
+ "\\c{n}" : "\u0146", // LATIN SMALL LETTER N WITH CEDILLA
+ "\\v{N}" : "\u0147", // LATIN CAPITAL LETTER N WITH CARON
+ "\\v{n}" : "\u0148", // LATIN SMALL LETTER N WITH CARON
+ "\\={O}" : "\u014C", // LATIN CAPITAL LETTER O WITH MACRON
+ "\\={o}" : "\u014D", // LATIN SMALL LETTER O WITH MACRON
+ "\\u{O}" : "\u014E", // LATIN CAPITAL LETTER O WITH BREVE
+ "\\u{o}" : "\u014F", // LATIN SMALL LETTER O WITH BREVE
+ "\\H{O}" : "\u0150", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ "\\H{o}" : "\u0151", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ "\\'{R}" : "\u0154", // LATIN CAPITAL LETTER R WITH ACUTE
+ "\\'{r}" : "\u0155", // LATIN SMALL LETTER R WITH ACUTE
+ "\\c{R}" : "\u0156", // LATIN CAPITAL LETTER R WITH CEDILLA
+ "\\c{r}" : "\u0157", // LATIN SMALL LETTER R WITH CEDILLA
+ "\\v{R}" : "\u0158", // LATIN CAPITAL LETTER R WITH CARON
+ "\\v{r}" : "\u0159", // LATIN SMALL LETTER R WITH CARON
+ "\\'{S}" : "\u015A", // LATIN CAPITAL LETTER S WITH ACUTE
+ "\\'{s}" : "\u015B", // LATIN SMALL LETTER S WITH ACUTE
+ "\\^{S}" : "\u015C", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ "\\^{s}" : "\u015D", // LATIN SMALL LETTER S WITH CIRCUMFLEX
+ "\\c{S}" : "\u015E", // LATIN CAPITAL LETTER S WITH CEDILLA
+ "\\c{s}" : "\u015F", // LATIN SMALL LETTER S WITH CEDILLA
+ "\\v{S}" : "\u0160", // LATIN CAPITAL LETTER S WITH CARON
+ "\\v{s}" : "\u0161", // LATIN SMALL LETTER S WITH CARON
+ "\\c{T}" : "\u0162", // LATIN CAPITAL LETTER T WITH CEDILLA
+ "\\c{t}" : "\u0163", // LATIN SMALL LETTER T WITH CEDILLA
+ "\\v{T}" : "\u0164", // LATIN CAPITAL LETTER T WITH CARON
+ "\\v{t}" : "\u0165", // LATIN SMALL LETTER T WITH CARON
+ "\\~{U}" : "\u0168", // LATIN CAPITAL LETTER U WITH TILDE
+ "\\~{u}" : "\u0169", // LATIN SMALL LETTER U WITH TILDE
+ "\\={U}" : "\u016A", // LATIN CAPITAL LETTER U WITH MACRON
+ "\\={u}" : "\u016B", // LATIN SMALL LETTER U WITH MACRON
+ "\\u{U}" : "\u016C", // LATIN CAPITAL LETTER U WITH BREVE
+ "\\u{u}" : "\u016D", // LATIN SMALL LETTER U WITH BREVE
+ "\\H{U}" : "\u0170", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ "\\H{u}" : "\u0171", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ "\\k{U}" : "\u0172", // LATIN CAPITAL LETTER U WITH OGONEK
+ "\\k{u}" : "\u0173", // LATIN SMALL LETTER U WITH OGONEK
+ "\\^{W}" : "\u0174", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ "\\^{w}" : "\u0175", // LATIN SMALL LETTER W WITH CIRCUMFLEX
+ "\\^{Y}" : "\u0176", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ "\\^{y}" : "\u0177", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ "\\\"{Y}" : "\u0178", // LATIN CAPITAL LETTER Y WITH DIAERESIS
+ "\\'{Z}" : "\u0179", // LATIN CAPITAL LETTER Z WITH ACUTE
+ "\\'{z}" : "\u017A", // LATIN SMALL LETTER Z WITH ACUTE
+ "\\.{Z}" : "\u017B", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ "\\.{z}" : "\u017C", // LATIN SMALL LETTER Z WITH DOT ABOVE
+ "\\v{Z}" : "\u017D", // LATIN CAPITAL LETTER Z WITH CARON
+ "\\v{z}" : "\u017E", // LATIN SMALL LETTER Z WITH CARON
+ "\\v{A}" : "\u01CD", // LATIN CAPITAL LETTER A WITH CARON
+ "\\v{a}" : "\u01CE", // LATIN SMALL LETTER A WITH CARON
+ "\\v{I}" : "\u01CF", // LATIN CAPITAL LETTER I WITH CARON
+ "\\v{i}" : "\u01D0", // LATIN SMALL LETTER I WITH CARON
+ "\\v{O}" : "\u01D1", // LATIN CAPITAL LETTER O WITH CARON
+ "\\v{o}" : "\u01D2", // LATIN SMALL LETTER O WITH CARON
+ "\\v{U}" : "\u01D3", // LATIN CAPITAL LETTER U WITH CARON
+ "\\v{u}" : "\u01D4", // LATIN SMALL LETTER U WITH CARON
+ "\\v{G}" : "\u01E6", // LATIN CAPITAL LETTER G WITH CARON
+ "\\v{g}" : "\u01E7", // LATIN SMALL LETTER G WITH CARON
+ "\\v{K}" : "\u01E8", // LATIN CAPITAL LETTER K WITH CARON
+ "\\v{k}" : "\u01E9", // LATIN SMALL LETTER K WITH CARON
+ "\\k{O}" : "\u01EA", // LATIN CAPITAL LETTER O WITH OGONEK
+ "\\k{o}" : "\u01EB", // LATIN SMALL LETTER O WITH OGONEK
+ "\\v{j}" : "\u01F0", // LATIN SMALL LETTER J WITH CARON
+ "\\'{G}" : "\u01F4", // LATIN CAPITAL LETTER G WITH ACUTE
+ "\\'{g}" : "\u01F5", // LATIN SMALL LETTER G WITH ACUTE
+ "\\.{B}" : "\u1E02", // LATIN CAPITAL LETTER B WITH DOT ABOVE
+ "\\.{b}" : "\u1E03", // LATIN SMALL LETTER B WITH DOT ABOVE
+ "\\d{B}" : "\u1E04", // LATIN CAPITAL LETTER B WITH DOT BELOW
+ "\\d{b}" : "\u1E05", // LATIN SMALL LETTER B WITH DOT BELOW
+ "\\b{B}" : "\u1E06", // LATIN CAPITAL LETTER B WITH LINE BELOW
+ "\\b{b}" : "\u1E07", // LATIN SMALL LETTER B WITH LINE BELOW
+ "\\.{D}" : "\u1E0A", // LATIN CAPITAL LETTER D WITH DOT ABOVE
+ "\\.{d}" : "\u1E0B", // LATIN SMALL LETTER D WITH DOT ABOVE
+ "\\d{D}" : "\u1E0C", // LATIN CAPITAL LETTER D WITH DOT BELOW
+ "\\d{d}" : "\u1E0D", // LATIN SMALL LETTER D WITH DOT BELOW
+ "\\b{D}" : "\u1E0E", // LATIN CAPITAL LETTER D WITH LINE BELOW
+ "\\b{d}" : "\u1E0F", // LATIN SMALL LETTER D WITH LINE BELOW
+ "\\c{D}" : "\u1E10", // LATIN CAPITAL LETTER D WITH CEDILLA
+ "\\c{d}" : "\u1E11", // LATIN SMALL LETTER D WITH CEDILLA
+ "\\.{F}" : "\u1E1E", // LATIN CAPITAL LETTER F WITH DOT ABOVE
+ "\\.{f}" : "\u1E1F", // LATIN SMALL LETTER F WITH DOT ABOVE
+ "\\={G}" : "\u1E20", // LATIN CAPITAL LETTER G WITH MACRON
+ "\\={g}" : "\u1E21", // LATIN SMALL LETTER G WITH MACRON
+ "\\.{H}" : "\u1E22", // LATIN CAPITAL LETTER H WITH DOT ABOVE
+ "\\.{h}" : "\u1E23", // LATIN SMALL LETTER H WITH DOT ABOVE
+ "\\d{H}" : "\u1E24", // LATIN CAPITAL LETTER H WITH DOT BELOW
+ "\\d{h}" : "\u1E25", // LATIN SMALL LETTER H WITH DOT BELOW
+ "\\\"{H}" : "\u1E26", // LATIN CAPITAL LETTER H WITH DIAERESIS
+ "\\\"{h}" : "\u1E27", // LATIN SMALL LETTER H WITH DIAERESIS
+ "\\c{H}" : "\u1E28", // LATIN CAPITAL LETTER H WITH CEDILLA
+ "\\c{h}" : "\u1E29", // LATIN SMALL LETTER H WITH CEDILLA
+ "\\'{K}" : "\u1E30", // LATIN CAPITAL LETTER K WITH ACUTE
+ "\\'{k}" : "\u1E31", // LATIN SMALL LETTER K WITH ACUTE
+ "\\d{K}" : "\u1E32", // LATIN CAPITAL LETTER K WITH DOT BELOW
+ "\\d{k}" : "\u1E33", // LATIN SMALL LETTER K WITH DOT BELOW
+ "\\b{K}" : "\u1E34", // LATIN CAPITAL LETTER K WITH LINE BELOW
+ "\\b{k}" : "\u1E35", // LATIN SMALL LETTER K WITH LINE BELOW
+ "\\d{L}" : "\u1E36", // LATIN CAPITAL LETTER L WITH DOT BELOW
+ "\\d{l}" : "\u1E37", // LATIN SMALL LETTER L WITH DOT BELOW
+ "\\b{L}" : "\u1E3A", // LATIN CAPITAL LETTER L WITH LINE BELOW
+ "\\b{l}" : "\u1E3B", // LATIN SMALL LETTER L WITH LINE BELOW
+ "\\'{M}" : "\u1E3E", // LATIN CAPITAL LETTER M WITH ACUTE
+ "\\'{m}" : "\u1E3F", // LATIN SMALL LETTER M WITH ACUTE
+ "\\.{M}" : "\u1E40", // LATIN CAPITAL LETTER M WITH DOT ABOVE
+ "\\.{m}" : "\u1E41", // LATIN SMALL LETTER M WITH DOT ABOVE
+ "\\d{M}" : "\u1E42", // LATIN CAPITAL LETTER M WITH DOT BELOW
+ "\\d{m}" : "\u1E43", // LATIN SMALL LETTER M WITH DOT BELOW
+ "\\.{N}" : "\u1E44", // LATIN CAPITAL LETTER N WITH DOT ABOVE
+ "\\.{n}" : "\u1E45", // LATIN SMALL LETTER N WITH DOT ABOVE
+ "\\d{N}" : "\u1E46", // LATIN CAPITAL LETTER N WITH DOT BELOW
+ "\\d{n}" : "\u1E47", // LATIN SMALL LETTER N WITH DOT BELOW
+ "\\b{N}" : "\u1E48", // LATIN CAPITAL LETTER N WITH LINE BELOW
+ "\\b{n}" : "\u1E49", // LATIN SMALL LETTER N WITH LINE BELOW
+ "\\'{P}" : "\u1E54", // LATIN CAPITAL LETTER P WITH ACUTE
+ "\\'{p}" : "\u1E55", // LATIN SMALL LETTER P WITH ACUTE
+ "\\.{P}" : "\u1E56", // LATIN CAPITAL LETTER P WITH DOT ABOVE
+ "\\.{p}" : "\u1E57", // LATIN SMALL LETTER P WITH DOT ABOVE
+ "\\.{R}" : "\u1E58", // LATIN CAPITAL LETTER R WITH DOT ABOVE
+ "\\.{r}" : "\u1E59", // LATIN SMALL LETTER R WITH DOT ABOVE
+ "\\d{R}" : "\u1E5A", // LATIN CAPITAL LETTER R WITH DOT BELOW
+ "\\d{r}" : "\u1E5B", // LATIN SMALL LETTER R WITH DOT BELOW
+ "\\b{R}" : "\u1E5E", // LATIN CAPITAL LETTER R WITH LINE BELOW
+ "\\b{r}" : "\u1E5F", // LATIN SMALL LETTER R WITH LINE BELOW
+ "\\.{S}" : "\u1E60", // LATIN CAPITAL LETTER S WITH DOT ABOVE
+ "\\.{s}" : "\u1E61", // LATIN SMALL LETTER S WITH DOT ABOVE
+ "\\d{S}" : "\u1E62", // LATIN CAPITAL LETTER S WITH DOT BELOW
+ "\\d{s}" : "\u1E63", // LATIN SMALL LETTER S WITH DOT BELOW
+ "\\.{T}" : "\u1E6A", // LATIN CAPITAL LETTER T WITH DOT ABOVE
+ "\\.{t}" : "\u1E6B", // LATIN SMALL LETTER T WITH DOT ABOVE
+ "\\d{T}" : "\u1E6C", // LATIN CAPITAL LETTER T WITH DOT BELOW
+ "\\d{t}" : "\u1E6D", // LATIN SMALL LETTER T WITH DOT BELOW
+ "\\b{T}" : "\u1E6E", // LATIN CAPITAL LETTER T WITH LINE BELOW
+ "\\b{t}" : "\u1E6F", // LATIN SMALL LETTER T WITH LINE BELOW
+ "\\~{V}" : "\u1E7C", // LATIN CAPITAL LETTER V WITH TILDE
+ "\\~{v}" : "\u1E7D", // LATIN SMALL LETTER V WITH TILDE
+ "\\d{V}" : "\u1E7E", // LATIN CAPITAL LETTER V WITH DOT BELOW
+ "\\d{v}" : "\u1E7F", // LATIN SMALL LETTER V WITH DOT BELOW
+ "\\`{W}" : "\u1E80", // LATIN CAPITAL LETTER W WITH GRAVE
+ "\\`{w}" : "\u1E81", // LATIN SMALL LETTER W WITH GRAVE
+ "\\'{W}" : "\u1E82", // LATIN CAPITAL LETTER W WITH ACUTE
+ "\\'{w}" : "\u1E83", // LATIN SMALL LETTER W WITH ACUTE
+ "\\\"{W}" : "\u1E84", // LATIN CAPITAL LETTER W WITH DIAERESIS
+ "\\\"{w}" : "\u1E85", // LATIN SMALL LETTER W WITH DIAERESIS
+ "\\.{W}" : "\u1E86", // LATIN CAPITAL LETTER W WITH DOT ABOVE
+ "\\.{w}" : "\u1E87", // LATIN SMALL LETTER W WITH DOT ABOVE
+ "\\d{W}" : "\u1E88", // LATIN CAPITAL LETTER W WITH DOT BELOW
+ "\\d{w}" : "\u1E89", // LATIN SMALL LETTER W WITH DOT BELOW
+ "\\.{X}" : "\u1E8A", // LATIN CAPITAL LETTER X WITH DOT ABOVE
+ "\\.{x}" : "\u1E8B", // LATIN SMALL LETTER X WITH DOT ABOVE
+ "\\\"{X}" : "\u1E8C", // LATIN CAPITAL LETTER X WITH DIAERESIS
+ "\\\"{x}" : "\u1E8D", // LATIN SMALL LETTER X WITH DIAERESIS
+ "\\.{Y}" : "\u1E8E", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ "\\.{y}" : "\u1E8F", // LATIN SMALL LETTER Y WITH DOT ABOVE
+ "\\^{Z}" : "\u1E90", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ "\\^{z}" : "\u1E91", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
+ "\\d{Z}" : "\u1E92", // LATIN CAPITAL LETTER Z WITH DOT BELOW
+ "\\d{z}" : "\u1E93", // LATIN SMALL LETTER Z WITH DOT BELOW
+ "\\b{Z}" : "\u1E94", // LATIN CAPITAL LETTER Z WITH LINE BELOW
+ "\\b{z}" : "\u1E95", // LATIN SMALL LETTER Z WITH LINE BELOW
+ "\\b{h}" : "\u1E96", // LATIN SMALL LETTER H WITH LINE BELOW
+ "\\\"{t}" : "\u1E97", // LATIN SMALL LETTER T WITH DIAERESIS
+ "\\d{A}" : "\u1EA0", // LATIN CAPITAL LETTER A WITH DOT BELOW
+ "\\d{a}" : "\u1EA1", // LATIN SMALL LETTER A WITH DOT BELOW
+ "\\d{E}" : "\u1EB8", // LATIN CAPITAL LETTER E WITH DOT BELOW
+ "\\d{e}" : "\u1EB9", // LATIN SMALL LETTER E WITH DOT BELOW
+ "\\~{E}" : "\u1EBC", // LATIN CAPITAL LETTER E WITH TILDE
+ "\\~{e}" : "\u1EBD", // LATIN SMALL LETTER E WITH TILDE
+ "\\d{I}" : "\u1ECA", // LATIN CAPITAL LETTER I WITH DOT BELOW
+ "\\d{i}" : "\u1ECB", // LATIN SMALL LETTER I WITH DOT BELOW
+ "\\d{O}" : "\u1ECC", // LATIN CAPITAL LETTER O WITH DOT BELOW
+ "\\d{o}" : "\u1ECD", // LATIN SMALL LETTER O WITH DOT BELOW
+ "\\d{U}" : "\u1EE4", // LATIN CAPITAL LETTER U WITH DOT BELOW
+ "\\d{u}" : "\u1EE5", // LATIN SMALL LETTER U WITH DOT BELOW
+ "\\`{Y}" : "\u1EF2", // LATIN CAPITAL LETTER Y WITH GRAVE
+ "\\`{y}" : "\u1EF3", // LATIN SMALL LETTER Y WITH GRAVE
+ "\\d{Y}" : "\u1EF4", // LATIN CAPITAL LETTER Y WITH DOT BELOW
+ "\\d{y}" : "\u1EF5", // LATIN SMALL LETTER Y WITH DOT BELOW
+ "\\~{Y}" : "\u1EF8", // LATIN CAPITAL LETTER Y WITH TILDE
+ "\\~{y}" : "\u1EF9", // LATIN SMALL LETTER Y WITH TILDE
+ "\\~{}" : "\u223C", // TILDE OPERATOR
+ "~" : "\u00A0" // NO-BREAK SPACE
};
var alwaysMap = {
@@ -1565,11 +1571,20 @@ function processField(item, field, value) {
for(var i in names) {
var name = names[i];
// skip empty names
- if (Zotero.Utilities.trim(name) == '') {
+ if (name.trim() == '') {
continue;
}
- item.creators.push(Zotero.Utilities.cleanAuthor(name, field,
- (name.indexOf(",") != -1)));
+ // Names in BibTeX can have three commas
+ pieces = name.split(',');
+ var creator = {};
+ if (pieces.length > 1) {
+ creator.firstName = pieces.pop().trim();
+ creator.lastName = pieces.join(',').trim();
+ creator.creatorType = field;
+ } else {
+ creator = Zotero.Utilities.cleanAuthor(name, field, false);
+ }
+ item.creators.push(creator);
}
} else if(field == "institution" || field == "organization") {
item.backupPublisher = value;
@@ -1650,6 +1665,7 @@ function processField(item, field, value) {
var parts = attachment.split(":");
var filetitle = parts[0];
var filepath = parts[1];
+ if (filepath.trim() === '') continue; // skip empty entries
var filetype = parts[2];
if (filetitle.length == 0) {
filetitle = "Attachment";
@@ -1865,22 +1881,22 @@ function mapAccent(character) {
// escaping, but we do want to preserve the base characters
function tidyAccents(s) {
- var r=s.toLowerCase();
- r = r.replace(new RegExp("[ä]", 'g'),"ae");
- r = r.replace(new RegExp("[ö]", 'g'),"oe");
- r = r.replace(new RegExp("[ü]", 'g'),"ue");
- r = r.replace(new RegExp("[àáâãå]", 'g'),"a");
- r = r.replace(new RegExp("æ", 'g'),"ae");
- r = r.replace(new RegExp("ç", 'g'),"c");
- r = r.replace(new RegExp("[èéêë]", 'g'),"e");
- r = r.replace(new RegExp("[ìíîï]", 'g'),"i");
- r = r.replace(new RegExp("ñ", 'g'),"n");
- r = r.replace(new RegExp("[òóôõ]", 'g'),"o");
- r = r.replace(new RegExp("œ", 'g'),"oe");
- r = r.replace(new RegExp("[ùúû]", 'g'),"u");
- r = r.replace(new RegExp("[ýÿ]", 'g'),"y");
- return r;
- };
+ var r=s.toLowerCase();
+ r = r.replace(new RegExp("[ä]", 'g'),"ae");
+ r = r.replace(new RegExp("[ö]", 'g'),"oe");
+ r = r.replace(new RegExp("[ü]", 'g'),"ue");
+ r = r.replace(new RegExp("[àáâãå]", 'g'),"a");
+ r = r.replace(new RegExp("æ", 'g'),"ae");
+ r = r.replace(new RegExp("ç", 'g'),"c");
+ r = r.replace(new RegExp("[èéêë]", 'g'),"e");
+ r = r.replace(new RegExp("[ìíîï]", 'g'),"i");
+ r = r.replace(new RegExp("ñ", 'g'),"n");
+ r = r.replace(new RegExp("[òóôõ]", 'g'),"o");
+ r = r.replace(new RegExp("œ", 'g'),"oe");
+ r = r.replace(new RegExp("[ùúû]", 'g'),"u");
+ r = r.replace(new RegExp("[ýÿ]", 'g'),"y");
+ return r;
+ };
var numberRe = /^[0-9]+/;
// Below is a list of words that should not appear as part of the citation key
@@ -1892,77 +1908,77 @@ var citeKeyConversionsRe = /%([a-zA-Z])/;
var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;
var citeKeyConversions = {
- "a":function (flags, item) {
- if(item.creators && item.creators[0] && item.creators[0].lastName) {
- return item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,"");
- }
- return "";
- },
- "t":function (flags, item) {
- if (item["title"]) {
- return item["title"].toLowerCase().replace(citeKeyTitleBannedRe, "").split(/\s+/g)[0];
- }
- return "";
- },
- "y":function (flags, item) {
- if(item.date) {
- var date = Zotero.Utilities.strToDate(item.date);
- if(date.year && numberRe.test(date.year)) {
- return date.year;
- }
- }
- return "????";
- }
+ "a":function (flags, item) {
+ if(item.creators && item.creators[0] && item.creators[0].lastName) {
+ return item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,"");
+ }
+ return "";
+ },
+ "t":function (flags, item) {
+ if (item["title"]) {
+ return item["title"].toLowerCase().replace(citeKeyTitleBannedRe, "").split(/\s+/g)[0];
+ }
+ return "";
+ },
+ "y":function (flags, item) {
+ if(item.date) {
+ var date = Zotero.Utilities.strToDate(item.date);
+ if(date.year && numberRe.test(date.year)) {
+ return date.year;
+ }
+ }
+ return "????";
+ }
}
function buildCiteKey (item,citekeys) {
- var basekey = "";
- var counter = 0;
- citeKeyFormatRemaining = citeKeyFormat;
- while (citeKeyConversionsRe.test(citeKeyFormatRemaining)) {
- if (counter > 100) {
- Zotero.debug("Pathological BibTeX format: " + citeKeyFormat);
- break;
- }
- var m = citeKeyFormatRemaining.match(citeKeyConversionsRe);
- if (m.index > 0) {
- //add data before the conversion match to basekey
- basekey = basekey + citeKeyFormatRemaining.substr(0, m.index);
- }
- var flags = ""; // for now
- var f = citeKeyConversions[m[1]];
- if (typeof(f) == "function") {
- var value = f(flags, item);
- Zotero.debug("Got value " + value + " for %" + m[1]);
- //add conversion to basekey
- basekey = basekey + value;
- }
- citeKeyFormatRemaining = citeKeyFormatRemaining.substr(m.index + m.length);
- counter++;
- }
- if (citeKeyFormatRemaining.length > 0) {
- basekey = basekey + citeKeyFormatRemaining;
- }
+ var basekey = "";
+ var counter = 0;
+ citeKeyFormatRemaining = citeKeyFormat;
+ while (citeKeyConversionsRe.test(citeKeyFormatRemaining)) {
+ if (counter > 100) {
+ Zotero.debug("Pathological BibTeX format: " + citeKeyFormat);
+ break;
+ }
+ var m = citeKeyFormatRemaining.match(citeKeyConversionsRe);
+ if (m.index > 0) {
+ //add data before the conversion match to basekey
+ basekey = basekey + citeKeyFormatRemaining.substr(0, m.index);
+ }
+ var flags = ""; // for now
+ var f = citeKeyConversions[m[1]];
+ if (typeof(f) == "function") {
+ var value = f(flags, item);
+ Zotero.debug("Got value " + value + " for %" + m[1]);
+ //add conversion to basekey
+ basekey = basekey + value;
+ }
+ citeKeyFormatRemaining = citeKeyFormatRemaining.substr(m.index + m.length);
+ counter++;
+ }
+ if (citeKeyFormatRemaining.length > 0) {
+ basekey = basekey + citeKeyFormatRemaining;
+ }
- // for now, remove any characters not explicitly known to be allowed;
- // we might want to allow UTF-8 citation keys in the future, depending
- // on implementation support.
- //
- // no matter what, we want to make sure we exclude
- // " # % ' ( ) , = { } ~ and backslash
- // however, we want to keep the base characters
+ // for now, remove any characters not explicitly known to be allowed;
+ // we might want to allow UTF-8 citation keys in the future, depending
+ // on implementation support.
+ //
+ // no matter what, we want to make sure we exclude
+ // " # % ' ( ) , = { } ~ and backslash
+ // however, we want to keep the base characters
- basekey = tidyAccents(basekey);
- basekey = basekey.replace(citeKeyCleanRe, "");
- var citekey = basekey;
- var i = 0;
- while(citekeys[citekey]) {
- i++;
- citekey = basekey + "-" + i;
- }
- citekeys[citekey] = true;
- return citekey;
+ basekey = tidyAccents(basekey);
+ basekey = basekey.replace(citeKeyCleanRe, "");
+ var citekey = basekey;
+ var i = 0;
+ while(citekeys[citekey]) {
+ i++;
+ citekey = basekey + "-" + i;
+ }
+ citekeys[citekey] = true;
+ return citekey;
}
function doExport() {
@@ -2075,7 +2091,7 @@ function doExport() {
writeField("pages", item.pages.replace("-","--"));
}
- // Commented out, because we don't want a books number of pages in the BibTeX "pages" field for books.
+ // Commented out, because we don't want a books number of pages in the BibTeX "pages" field for books.
//if(item.numPages) {
// writeField("pages", item.numPages);
//}
@@ -2104,3 +2120,260 @@ function doExport() {
Zotero.write("\n}");
}
}
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "import",
+ "input": "@article{Adams2001,\u000aauthor = {Adams, Nancy K and DeSilva, Shanaka L and Self, Steven and Salas, Guido and Schubring, Steven and Permenter, Jason L and Arbesman, Kendra},\u000afile = {:Users/heatherwright/Documents/Scientific Papers/Adams\\_Huaynaputina.pdf:pdf;::},\u000ajournal = {Bulletin of Volcanology},\u000akeywords = {Vulcanian eruptions,breadcrust,plinian},\u000apages = {493--518},\u000atitle = {{The physical volcanology of the 1600 eruption of Huaynaputina, southern Peru}},\u000avolume = {62},\u000ayear = {2001}\u000a}",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Nancy K",
+ "lastName": "Adams",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Shanaka L",
+ "lastName": "DeSilva",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Steven",
+ "lastName": "Self",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Guido",
+ "lastName": "Salas",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Steven",
+ "lastName": "Schubring",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jason L",
+ "lastName": "Permenter",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Kendra",
+ "lastName": "Arbesman",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Vulcanian eruptions",
+ "breadcrust",
+ "plinian"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": "file://Users/heatherwright/Documents/Scientific Papers/Adams_Huaynaputina.pdf",
+ "mimeType": "application/pdf",
+ "title": "Attachment",
+ "downloadable": true
+ },
+ {
+ "url": "file://",
+ "title": "Attachment",
+ "downloadable": true
+ }
+ ],
+ "publicationTitle": "Bulletin of Volcanology",
+ "pages": "493–518",
+ "title": "The physical volcanology of the 1600 eruption of Huaynaputina, southern Peru",
+ "volume": "62",
+ "date": "2001"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "@Book{abramowitz+stegun,\u000a author = \"Milton {Abramowitz} and Irene A. {Stegun}\",\u000a title = \"Handbook of Mathematical Functions with\u000a Formulas, Graphs, and Mathematical Tables\",\u000a publisher = \"Dover\",\u000a year = 1964,\u000a address = \"New York\",\u000a edition = \"ninth Dover printing, tenth GPO printing\"\u000a}\u000a\u000a@Book{Torre2008,\u000a author = \"Joe Torre and Tom Verducci\",\u000a publisher = \"Doubleday\",\u000a title = \"The Yankee Years\",\u000a year = 2008,\u000a isbn = \"0385527403\"\u000a}\u000a",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Milton",
+ "lastName": "Abramowitz",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Irene A.",
+ "lastName": "Stegun",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables",
+ "publisher": "Dover",
+ "date": "1964",
+ "place": "New York",
+ "edition": "ninth Dover printing, tenth GPO printing"
+ },
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Joe",
+ "lastName": "Torre",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Tom",
+ "lastName": "Verducci",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "publisher": "Doubleday",
+ "title": "The Yankee Years",
+ "date": "2008",
+ "ISBN": "0385527403"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "@INPROCEEDINGS {author:06,\u000a title = {Some publication title},\u000a author = {First Author and Second Author},\u000a crossref = {conference:06},\u000a pages = {330—331},\u000a}\u000a@PROCEEDINGS {conference:06,\u000a editor = {First Editor and Second Editor},\u000a title = {Proceedings of the Xth Conference on XYZ},\u000a booktitle = {Proceedings of the Xth Conference on XYZ},\u000a year = {2006},\u000a month = oct,\u000a}",
+ "items": [
+ {
+ "itemType": "conferencePaper",
+ "creators": [
+ {
+ "firstName": "First",
+ "lastName": "Author",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Second",
+ "lastName": "Author",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "First",
+ "lastName": "Editor",
+ "creatorType": "editor"
+ },
+ {
+ "firstName": "Second",
+ "lastName": "Editor",
+ "creatorType": "editor"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Some publication title",
+ "date": "October 2006",
+ "proceedingsTitle": "Proceedings of the Xth Conference on XYZ",
+ "pages": "330—331"
+ },
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "First",
+ "lastName": "Editor",
+ "creatorType": "editor"
+ },
+ {
+ "firstName": "Second",
+ "lastName": "Editor",
+ "creatorType": "editor"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Proceedings of the Xth Conference on XYZ",
+ "publicationTitle": "Proceedings of the Xth Conference on XYZ",
+ "date": "October 2006"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "@Book{hicks2001,\u000a author = \"von Hicks, III, Michael\",\u000a title = \"Design of a Carbon Fiber Composite Grid Structure for the GLAST\u000a Spacecraft Using a Novel Manufacturing Technique\",\u000a publisher = \"Stanford Press\",\u000a year = 2001,\u000a address = \"Palo Alto\",\u000a edition = \"1st,\",\u000a isbn = \"0-69-697269-4\"\u000a}",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Michael",
+ "lastName": "von Hicks, III",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Design of a Carbon Fiber Composite Grid Structure for the GLAST Spacecraft Using a Novel Manufacturing Technique",
+ "publisher": "Stanford Press",
+ "date": "2001",
+ "place": "Palo Alto",
+ "edition": "1st,",
+ "ISBN": "0-69-697269-4"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "@article{Oliveira_2009, title={USGS monitoring ecological impacts}, volume={107}, number={29}, journal={Oil & Gas Journal}, author={Oliveira, A}, year={2009}, pages={29}}",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "A",
+ "lastName": "Oliveira",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "USGS monitoring ecological impacts",
+ "volume": "107",
+ "issue": "29",
+ "publicationTitle": "Oil & Gas Journal",
+ "date": "2009",
+ "pages": "29"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "@article{test-ticket1661,\u000atitle={non-braking space: ~; accented characters: {\\~n} and \\~{n}; tilde operator: \\~},\u000a} ",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "non-braking space: ; accented characters: ñ and ñ; tilde operator: ∼"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Bibliontology RDF.js b/translators/Bibliontology RDF.js
@@ -7,10 +7,11 @@
"minVersion":"2.0",
"maxVersion":"",
"priority":50,
+ "browserSupport":"gcs",
"configOptions":{"getCollections":"true", "dataMode":"rdf/xml"},
"displayOptions":{"exportNotes":true, "exportFileData":false},
"inRepository":false,
- "lastUpdated":"2011-02-22 00:39:57"
+ "lastUpdated":"2011-07-08 04:50:39"
}
var n = {
@@ -233,11 +234,19 @@ var FIELDS = {
"assignee": [ITEM, n.z+"assignee"], // TODO
"priorityNumbers": [function(item) { // TODO
var priorityNumbers = item.priorityNumbers.split(/, ?| /g);
- return [[ITEM, n.z+"priorityNumber", number, true] for each(number in priorityNumbers)];
+ var returnNumbers = [];
+ for each(var number in priorityNumbers) {
+ returnNumbers.push([ITEM, n.z+"priorityNumber", number, true]);
+ }
+ return returnNumbers;
}, function(nodes) {
var statements = Zotero.RDF.getStatementsMatching(nodes[ITEM], n.z+"priorityNumber", null);
if(!statements) return false;
- return [statement[2] for each(statement in statements)].join(", ");
+ var predicates = [];
+ for each(var statement in statements) {
+ predicates.push(statement[2]);
+ }
+ return predicates.join(", ");
}],
"references": [ITEM, n.z+"references"],
"legalStatus": [ITEM, n.bibo+"status"],
@@ -332,7 +341,9 @@ function getBlankNode(attachToNode, itemPredicate, blankNodePairs, create) {
if(!blankNode && create) {
blankNode = Zotero.RDF.newResource();
Zotero.RDF.addStatement(attachToNode, itemPredicate, blankNode, false);
- [Zotero.RDF.addStatement(blankNode, pair[0], pair[1], false) for each(pair in blankNodePairs)];
+ for each(var pair in blankNodePairs) {
+ Zotero.RDF.addStatement(blankNode, pair[0], pair[1], false);
+ }
}
return blankNode;
@@ -362,7 +373,11 @@ Type.prototype.getMatchScore = function(node) {
var nodes = {2:node};
// check item (+2 for each match, -1 for each nonmatch)
- var score = 3*[true for each(pair in this[ITEM].pairs) if(Zotero.RDF.getStatementsMatching(node, pair[0], pair[1]))].length-this[ITEM].pairs.length;
+ var score = -this[ITEM].pairs.length;
+ for each(var pair in this[ITEM].pairs) {
+ if(Zotero.RDF.getStatementsMatching(node, pair[0], pair[1])) score += 3;
+ }
+
// check subcontainer
[score, nodes[SUBCONTAINER]] = this._scoreNodeRelationship(node, this[SUBCONTAINER], score);
// check container
@@ -387,7 +402,11 @@ Type.prototype._scoreNodeRelationship = function(node, definition, score) {
var bestScore = -9999;
for each(var statement in statements) {
// +2 for each match, -1 for each nonmatch
- var testScore = 3*[true for each(pair in definition.pairs) if(Zotero.RDF.getStatementsMatching(statement[2], pair[0], pair[1]))].length-definition.pairs.length;
+ var testScore = -definition.pairs.length;
+ for each(var pair in definition.pairs) {
+ if(Zotero.RDF.getStatementsMatching(statement[2], pair[0], pair[1])) score += 3;
+ }
+
if(testScore > bestScore) {
subNode = statement[2];
bestScore = testScore;
@@ -414,17 +433,17 @@ Type.prototype.getItemSeriesNodes = function(nodes) {
// get ITEM_SERIES node
var score, subNode;
[score, subNode] = this._scoreNodeRelationship(nodes[ITEM], seriesDefinition, 0);
- Zotero.debug("got itemSeries with score "+score);
+ //Zotero.debug("got itemSeries with score "+score);
if(score >= 1) nodes[ITEM_SERIES] = subNode;
// get SUBCONTAINER_SERIES node
[score, subNode] = this._scoreNodeRelationship(nodes[SUBCONTAINER], seriesDefinition, 0);
- Zotero.debug("got subcontainerSeries with score "+score);
+ //Zotero.debug("got subcontainerSeries with score "+score);
if(score >= 1) nodes[CONTAINER_SERIES] = subNode;
// get CONTAINER_SERIES node
[score, subNode] = this._scoreNodeRelationship(nodes[CONTAINER], seriesDefinition, 0);
- Zotero.debug("got containerSeries with score "+score);
+ //Zotero.debug("got containerSeries with score "+score);
if(score >= 1) nodes[CONTAINER_SERIES] = subNode;
}
@@ -462,8 +481,9 @@ Type.prototype.addNodeRelations = function(nodes) {
}
// add type
- [Zotero.RDF.addStatement(nodes[i], pair[0], pair[1], false)
- for each(pair in this[i].pairs)];
+ for each(var pair in this[i].pairs) {
+ Zotero.RDF.addStatement(nodes[i], pair[0], pair[1], false)
+ }
// add relation to parent
for(var j = i-1; j>1; j--) {
@@ -541,7 +561,7 @@ LiteralProperty = function(field) {
this.field = field;
this.mapping = FIELDS[field];
if(!this.mapping) {
- Zotero.debug("WARNING: unrecognized field "+field+" in Bibliontology RDF; mapping to Zotero namespace");
+ //Zotero.debug("WARNING: unrecognized field "+field+" in Bibliontology RDF; mapping to Zotero namespace");
this.mapping = [ITEM, n.z+field];
}
}
@@ -560,7 +580,12 @@ LiteralProperty.prototype.mapToItem = function(newItem, nodes) {
if(!node) return false;
var statements = getStatementsByDefinition(this.mapping[1], node);
if(!statements) return false;
- newItem[this.field] = [stmt[2].toString() for each(stmt in statements)].join(", ");
+
+ var content = [];
+ for each(var stmt in statements) {
+ content.push(stmt[2].toString());
+ }
+ newItem[this.field] = content.join(",");
}
return true;
}
@@ -571,8 +596,9 @@ LiteralProperty.prototype.mapToItem = function(newItem, nodes) {
LiteralProperty.prototype.mapFromItem = function(item, nodes) {
if(typeof this.mapping[0] == "function") { // function case: triples returned
// check function case
- [Zotero.RDF.addStatement(nodes[triple[0]], triple[1], triple[2], triple[3])
- for each(triple in this.mapping[0](item))];
+ for each(var triple in this.mapping[0](item)) {
+ Zotero.RDF.addStatement(nodes[triple[0]], triple[1], triple[2], triple[3])
+ }
} else if(typeof this.mapping[1] == "string") { // string case: simple predicate
Zotero.RDF.addStatement(nodes[this.mapping[0]],
this.mapping[1], item.uniqueFields[this.field], true);
@@ -595,7 +621,7 @@ CreatorProperty = function(field) {
* Maps creator from an foaf:Agent
*/
CreatorProperty.prototype.mapToCreator = function(creatorNode, zoteroType) {
- Zotero.debug("mapping "+Zotero.RDF.getResourceURI(creatorNode)+" to a creator");
+ //Zotero.debug("mapping "+Zotero.RDF.getResourceURI(creatorNode)+" to a creator");
var lastNameStmt = Zotero.RDF.getStatementsMatching(creatorNode, n.foaf+"surname", null);
if(lastNameStmt) { // look for a person with a last name
creator = {lastName:lastNameStmt[0][2].toString()};
@@ -606,7 +632,7 @@ CreatorProperty.prototype.mapToCreator = function(creatorNode, zoteroType) {
if(nameStmt) { // an organization
creator = {lastName:nameStmt[0][2].toString(), fieldMode:1};
} else { // an unnamed entity; ignore it
- Zotero.debug("Dropping unnamed creator "+creatorNode.toString());
+ //Zotero.debug("Dropping unnamed creator "+creatorNode.toString());
return false;
}
}
@@ -661,7 +687,7 @@ CreatorProperty.prototype.mapFromCreator = function(item, creator, nodes) {
// treat other primary creators as dcterms:creators
var mapping = CREATORS["author"];
} else {
- Zotero.debug("WARNING: unrecognized creator type "+this.field+" in Bibliontology RDF; mapping to Zotero namespace");
+ //Zotero.debug("WARNING: unrecognized creator type "+this.field+" in Bibliontology RDF; mapping to Zotero namespace");
var mapping = [ITEM, AUTHOR_LIST, n.z+this.field];
}
}
@@ -829,7 +855,7 @@ function doImport() {
for each(var type in collapsedTypes[rdfType[2].uri]) {
[score, nodes] = type.getMatchScore(itemNode);
- Zotero.debug("Type "+type.zoteroType+" has score "+score);
+ //Zotero.debug("Type "+type.zoteroType+" has score "+score);
// check if this is the best we can do
if(score > bestTypeScore) {
@@ -842,11 +868,11 @@ function doImport() {
// skip if this doesn't fit any type very well
if(bestTypeScore < 1) {
- Zotero.debug("No good type mapping; best type was "+bestType.zoteroType+" with score "+bestTypeScore);
+ //Zotero.debug("No good type mapping; best type was "+bestType.zoteroType+" with score "+bestTypeScore);
continue;
}
- Zotero.debug("Got item of type "+bestType.zoteroType+" with score "+bestTypeScore);
+ //Zotero.debug("Got item of type "+bestType.zoteroType+" with score "+bestTypeScore);
nodes = bestNodes;
bestType.getItemSeriesNodes(nodes);
@@ -863,7 +889,7 @@ function doImport() {
// only handle each property once
if(propertiesHandled[property]) continue;
propertiesHandled[property] = true;
- Zotero.debug("handling "+property);
+ //Zotero.debug("handling "+property);
var propertyMappings = collapsedProperties[i][property];
if(propertyMappings) {
@@ -941,13 +967,13 @@ function doImport() {
} else {
// creator not already processed, use default for this list type
if(j == AUTHOR_LIST) {
- Zotero.debug("WARNING: creator in authorList lacks relationship to item in Bibliontology RDF; treating as primary creator");
+ //Zotero.debug("WARNING: creator in authorList lacks relationship to item in Bibliontology RDF; treating as primary creator");
var prop = new CreatorProperty("author");
} else if(j == EDITOR_LIST) {
- Zotero.debug("WARNING: creator in editorList lacks relationship to item in Bibliontology RDF; treating as editor");
+ //Zotero.debug("WARNING: creator in editorList lacks relationship to item in Bibliontology RDF; treating as editor");
var prop = new CreatorProperty("editor");
} else {
- Zotero.debug("WARNING: creator in contributorList lacks relationship to item in Bibliontology RDF; treating as contributor");
+ //Zotero.debug("WARNING: creator in contributorList lacks relationship to item in Bibliontology RDF; treating as contributor");
var prop = new CreatorProperty("contributor");
}
var creator = prop.mapToCreator(creatorNode, zoteroType);
@@ -975,7 +1001,7 @@ var usedURIs = {};
function doExport() {
// add namespaces
- [Zotero.RDF.addNamespace(i, n[i]) for(i in n)];
+ for(var i in n) Zotero.RDF.addNamespace(i, n[i]);
// compile references and create URIs
var item;
@@ -999,7 +1025,7 @@ function doExport() {
var property = new LiteralProperty(field);
property.mapFromItem(item, nodes);
}
- Zotero.debug("fields added");
+ //Zotero.debug("fields added");
// add creators
var creatorLists = [];
@@ -1008,7 +1034,7 @@ function doExport() {
var property = new CreatorProperty(creator.creatorType);
property.mapFromCreator(item, creator, nodes);
}
- Zotero.debug("creators added");
+ //Zotero.debug("creators added");
// add tags
for each(var tag in item.tags) {
@@ -1028,6 +1054,6 @@ function doExport() {
}
type.addNodeRelations(nodes);
- Zotero.debug("relations added");
+ //Zotero.debug("relations added");
}
}
\ No newline at end of file
diff --git a/translators/Bookmarks.js b/translators/Bookmarks.js
@@ -1,14 +1,15 @@
{
- "translatorID":"4e7119e0-02be-4848-86ef-79a64185aad8",
- "translatorType":3,
- "label":"Bookmarks",
- "creator":"Avram Lyon",
- "target":"html",
- "minVersion":"2.1b6",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2011-03-16 23:24:54"
+ "translatorID": "4e7119e0-02be-4848-86ef-79a64185aad8",
+ "label": "Bookmarks",
+ "creator": "Avram Lyon",
+ "target": "html",
+ "minVersion": "2.1b6",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 3,
+ "browserSupport": "gscn",
+ "lastUpdated": "2011-07-09 18:52:34"
}
/*
@@ -72,34 +73,71 @@ function doImport() {
var hits;
var item = false;
var itemIncomplete = false;
+ var collection = false;
var re = /([A-Za-z_]+)="([^"]+)"/g;
while((line = Zotero.read()) !== false) {
- if (line.indexOf("<DT>") !== -1) {
+ if (line.indexOf("<DT>") !== -1 && line.indexOf("<A") !== -1) {
if (itemIncomplete) item.complete();
itemIncomplete = true;
+ //Zotero.debug(line);
item = new Zotero.Item("webpage");
+ if (collection) collection.children.push(item);
item.title = line.match(/>([^<]*)<\/A>/)[1];
- Zotero.debug(item.title);
+ //Zotero.debug(item.title);
while(hits = re.exec(line)) {
- if (!hits) { Zotero.debug("RE no match in "+line);
+ if (!hits) {
+ Zotero.debug("RE no match in "+line);
+ continue;
}
switch (hits[1]) {
- case "HREF": item.url = hits[2]; break;
+ case "HREF": item.url = hits[2];
+ break;
case "TAGS": item.tags = hits[2].split(','); break;
+ case "ICON": break;
+ case "ICON_URI": break;
+ case "ADD_DATE":
+ item.accessDate = convertDate(hits[2]);
+ break;
default: item.extra = item.extra ? item.extra + "; "+ [hits[1], hits[2]].join("=") :
[hits[1], hits[2]].join("=");
}
}
+ if (item.url.match(/^place:/)) {
+ item = false;
+ itemIncomplete = false;
+ }
+ } else if (line.indexOf("<DT>") !== -1 && line.indexOf("<H3") !== -1) {
+ if (collection) {
+ collection.complete();
+ }
+ collection = new Zotero.Collection();
+ collection.name = Zotero.Utilities.unescapeHTML(line.match(/<H3[^>]*>([^<]*)<\/H3>/i)[1]);
+ Zotero.debug("Starting collection: "+ collection.name);
+ collection.type = "collection";
+ collection.children = new Array();
} else if (line.substr(0,4) == "<DD>") {
if (itemIncomplete) item.abstractNote = item.abstractNote ? item.abstractNote + " " + line.substr(4) : line.substr(4);
else Zotero.debug("Discarding description line without item: " + line);
} else {
- Zotero.debug("Discarding line: " + line);
+ //Zotero.debug("Discarding line: " + line);
}
}
if (item && itemIncomplete) item.complete();
+ if (collection) collection.complete();
}
+function convertDate(timestamp){
+ var d = new Date(timestamp*1000);
+ function pad(n){return n<10 ? '0'+n : n};
+ return d.getUTCFullYear()+'-'
+ + pad(d.getUTCMonth()+1)+'-'
+ + pad(d.getUTCDate())+' '
+ + pad(d.getUTCHours())+':'
+ + pad(d.getUTCMinutes())+':'
+ + pad(d.getUTCSeconds())+' UTC';
+ }
+
+
function doExport() {
var item;
@@ -124,3 +162,8 @@ function doExport() {
}
Zotero.write(footer);
}
+
+
+/** BEGIN TEST CASES **/
+var testCases = []
+/** END TEST CASES **/
diff --git a/translators/CTX.js b/translators/CTX.js
@@ -7,7 +7,7 @@
"minVersion":"2.0",
"maxVersion":"",
"priority":100,
- "configOptions":{"getCollections":"true", "dataMode":"line"},
+ "configOptions":{"dataMode":"line"},
"inRepository":false,
"lastUpdated":"2011-01-11 04:31:00"
}
diff --git a/translators/Cambridge Journals Online.js b/translators/Cambridge Journals Online.js
@@ -1,14 +1,14 @@
{
- "translatorID":"850f4c5f-71fb-4669-b7da-7fb7a95500ef",
- "translatorType":4,
- "label":"Cambridge Journals Online",
- "creator":"Sean Takats and Michael Berkowitz",
- "target":"https?://[^/]*journals.cambridge.org[^/]*//?action/(quickSearch|search|displayAbstract|displayFulltext|displayIssue)",
- "minVersion":"1.0.0b3r1",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2009-01-08 08:19:07"
+ "translatorID": "850f4c5f-71fb-4669-b7da-7fb7a95500ef",
+ "label": "Cambridge Journals Online",
+ "creator": "Sean Takats, Michael Berkowitz and Avram Lyon",
+ "target": "^https?://[^/]*journals.cambridge.org[^/]*//?action/(quickSearch|search|displayAbstract|displayFulltext|displayIssue)",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-26 01:43:28"
}
function detectWeb(doc, url) {
@@ -16,7 +16,7 @@ function detectWeb(doc, url) {
var nsResolver=namespace?function(prefix) {
return (prefix=="x")?namespace:null;
}:null;
- var xpath = '//tr[td/input[@type="checkbox"][@name="toView"]]';
+ var xpath = '//div[@class="tableofcontents-row"][div/input[@type="checkbox"][@name="toView"]]';
if ((url.indexOf("/action/displayAbstract") != -1) || (url.indexOf("action/displayFulltext") != -1)){
return "journalArticle";
} else if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
@@ -34,57 +34,150 @@ function doWeb(doc, url){
var datastring="format=RIS&emailId=&Download=Download&componentIds=";
var links = new Array();
if(detectWeb(doc, url) == "multiple"){
- var xpath = '//tr[td/input[@type="checkbox"][@name="toView"]]';
+ var xpath = '//div[@class="tableofcontents-row"][div/input[@type="checkbox"][@name="toView"]]';
var tableRows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var tableRow;
var items=new Array();
while (tableRow = tableRows.iterateNext()){
- var id = doc.evaluate('./td/input[@type="checkbox"][@name="toView"]/@value', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
- var title = doc.evaluate('./td/h3', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ var id = doc.evaluate('./div/input[@type="checkbox"][@name="toView"]/@value', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ var title = doc.evaluate('.//h3', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
items['http://' + host + '/action/displayAbstract?aid=' + id.nodeValue] = Zotero.Utilities.capitalizeTitle(title.textContent);
}
- items=Zotero.selectItems(items);
- for (var i in items) {
- links.push(i);
- }
+ Zotero.selectItems(items, function(items) {
+ for (var i in items) {
+ links.push(i);
+ }
+ Zotero.Utilities.processDocuments(links, scrape,
+ function() {Zotero.done();});
+ });
} else {
- links = [url];
+ scrape(doc);
}
- Zotero.Utilities.processDocuments(links, function(doc) {
- if (doc.evaluate('//p[@class="AbsType"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
- var abs = doc.evaluate('//p[@class="AbsType"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ Zotero.wait();
+}
+
+function scrape (doc) {
+ var namespace=doc.documentElement.namespaceURI;
+ var nsResolver=namespace?function(prefix) {
+ return (prefix=="x")?namespace:null;
+ }:null;
+
+ var host = doc.location.host;
+ var urlstring="http://" + host + "/action/exportCitation";
+ var datastring="format=RIS&emailId=&Download=Download&componentIds=";
+
+ var locURL = doc.location.href;
+ var abs;
+ if (abs = doc.evaluate('//p[@class="section-title" and contains(text(),"Abstract")]/following-sibling::p[not(@class) and text() != ""]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ abs = abs.textContent;
}
if (doc.evaluate('//p[@class="KeyWords"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var kws = doc.evaluate('//p[@class="KeyWords"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(11).split('; ');
}
var pdfpath='//div/ul/li/a[contains(text(), "PDF")]';
if (doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
- var pdflink =doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
+ var pdflink = doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
}
idRe = /aid=([0-9]+)/
- var m = idRe.exec(doc.location.href);
+ var m = idRe.exec(locURL);
var id = m[1];
- Zotero.Utilities.HTTP.doGet(urlstring + "?" + datastring+id, function(text) {
+ Zotero.Utilities.doGet(urlstring + "?" + datastring+id, function(text) {
text = text.replace(/(^|\n)?([A-Z\d]{2})\s+\-\s+(\n)?/g, "\n$2 - $3");
var translator = Zotero.loadTranslator("import");
+ // Use RIS importer
translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
translator.setString(text);
translator.setHandler("itemDone", function(obj, item) {
- item.attachments = [{url:url, title:"Cambridge Journals Snapshot", mimeType:"text/html"}]
- if (pdflink) item.attachments.push({url:pdflink, title:"Cambridge Journals PDF", mimeType:"application/pdf"});
- item.url = url;
+ item.attachments = [{url:locURL,
+ title:"Cambridge Journals Snapshot",
+ mimeType:"text/html"}];
item.title = Zotero.Utilities.capitalizeTitle(item.title);
var authors = item.creators;
item.creators = new Array();
for each (var aut in authors) {
- item.creators.push({firstName:aut.firstName, lastName:aut.lastName, creatorType:"author"});
+ // correct all-caps, if present
+ if (aut.firstName && aut.firstName.toUpperCase() == aut.firstName)
+ aut.firstName=Zotero.Utilities.capitalizeTitle(aut.firstName.toLowerCase(),true);
+ if (aut.lastName && aut.lastName.toUpperCase() == aut.lastName)
+ aut.lastName=Zotero.Utilities.capitalizeTitle(aut.lastName.toLowerCase(),true);
+ item.creators.push({firstName:aut.firstName,
+ lastName:aut.lastName,
+ creatorType:"author"});
}
- if (kws) item.tags = kws;
+ if (item.tags.length === 1) item.tags = item.tags[0].split(",");
if (abs) item.abstractNote = Zotero.Utilities.trimInternal(abs);
- item.complete();
+ if (pdflink) {
+ // Some PDFs aren't paywalled, so they don't need the 2nd request
+ item.attachments.push({
+ url: pdflink,
+ title: "Cambridge Journals PDF",
+ mimeType:"application/pdf"
+ });
+ Zotero.Utilities.doGet(pdflink, function(text) {
+ var domain = pdflink.match(/^https?:\/\/[^\/]+\//);
+ var realpdf = text.match(/<iframe src="\/(action\/displayFulltext[^"]+)"/);
+ if (realpdf && domain) {
+ // If we matched the IFRAME, the first attachment must be bad
+ for (var i in item.attachments) {
+ if (item.attachments[i].mimeType.indexOf("pdf") !== -1)
+ item.attachments[i].url = (domain[0]+realpdf[1]).replace(/&/g,"&");
+ };
+ }
+ }, function () {
+ item.complete();
+ });
+ } else {
+ item.complete();
+ }
});
translator.translate();
});
- }, function() {Zotero.done();});
- Zotero.wait();
-}
-\ No newline at end of file
+ }
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://journals.cambridge.org/action/quickSearch?quickSearchType=search_combined&inputField1=tatar&fieldStartMonth=01&fieldStartYear=1800&fieldEndMonth=12&fieldEndYear=2011&searchType=ADVANCESEARCH&searchTypeFrom=quickSearch&fieldScjrnl=All&fieldSccats=All&selectField1=%23&jnlId=AMS&issId=02&volId=45&journalSearchType=all",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://journals.cambridge.org/action/displayAbstract?fromPage=online&aid=8267699&fulltextType=RA&fileId=S0021875810001738",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Laurie A.",
+ "lastName": "Rodrigues",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ ""
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "Cambridge Journals Snapshot",
+ "mimeType": "text/html"
+ }
+ ],
+ "date": "2011",
+ "title": "“SAMO© as an Escape Clause”: Jean-Michel Basquiat's Engagement with a Commodified American Africanism",
+ "publicationTitle": "Journal of American Studies",
+ "pages": "227-243",
+ "volume": "45",
+ "issue": "02",
+ "DOI": "10.1017/S0021875810001738",
+ "abstractNote": "Heir to the racist configuration of the American art exchange and the delimiting appraisals of blackness in the American mainstream media, Jean-Michel Basquiat appeared on the late 1970s New York City street art scene – then he called himself “SAMO.” Not long thereafter, Basquiat grew into one of the most influential artists of an international movement that began around 1980, marked by a return to figurative painting. Given its rough, seemingly untrained and extreme, conceptual nature, Basquiat's high-art oeuvre might not look so sophisticated to the uninformed viewer. However, Basquiat's work reveals a powerful poetic and visual gift, “heady enough to confound academics and hip enough to capture the attention span of the hip hop nation,” as Greg Tate has remarked. As noted by Richard Marshall, Basquiat's aesthetic strength actually comes from his striving “to achieve a balance between the visual and intellectual attributes” of his artwork. Like Marshall, Tate, and others, I will connect with Basquiat's unique, self-reflexively experimental visual practices of signifying and examine anew Basquiat's active contribution to his self-alienation, as Hebdige has called it. Basquiat's aesthetic makes of his paintings economies of accumulation, building a productive play of contingency from the mainstream's constructions of race. This aesthetic move speaks to a need for escape from the perceived epistemic necessities of blackness. Through these economies of accumulation we see, as Tate has pointed out, Basquiat's “intellectual obsession” with issues such as ancestry/modernity, personhood/property and originality/origins of knowledge, driven by his tireless need to problematize mainstream media's discourses surrounding race – in other words, a commodified American Africanism.",
+ "libraryCatalog": "Cambridge Journals Online",
+ "shortTitle": "“SAMO© as an Escape Clause”"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/EBSCOhost.js b/translators/EBSCOhost.js
@@ -1,20 +1,20 @@
{
"translatorID": "d0b1914a-11f1-4dd7-8557-b32fe8a3dd47",
"label": "EBSCOhost",
- "creator": "Simon Kornblith and Michael Berkowitz",
+ "creator": "Simon Kornblith, Michael Berkowitz, Josh Geller",
"target": "^https?://[^/]+/(?:eds|bsi|ehost)/(?:results|detail|folder)",
- "minVersion": "1.0.0b3.r1",
+ "minVersion": "2.1",
"maxVersion": "",
"priority": 100,
- "inRepository": "1",
+ "inRepository": true,
"translatorType": 4,
- "lastUpdated": "2011-03-24 23:30:00"
+ "lastUpdated": "2011-08-03 01:00:36"
}
function detectWeb(doc, url) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
- if (prefix == 'x') return namespace; else return null;
+ if (prefix == 'x') { return namespace; } else { return null; }
} : null;
// The Scientific American Archive breaks this translator, disabling
try {
@@ -28,82 +28,31 @@ function detectWeb(doc, url) {
// See if this is a search results or folder results page
var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver,
- XPathResult.ANY_TYPE, null).iterateNext();
+ XPathResult.ANY_TYPE, null).iterateNext();
if(searchResult) {
return "multiple";
}
-/*
- var xpath = '//div[@class="citation-wrapping-div"]/dl[@class="citation-fields"]/dt[starts-with(text(), "Persistent link to this record")'
- +' or starts-with(text(), "Vínculo persistente a este informe")'
- +' or starts-with(text(), "Lien permanent à cette donnée")'
- +' or starts-with(text(), "Permanenter Link zu diesem Datensatz")'
- +' or starts-with(text(), "Link permanente al record")'
- +' or starts-with(text(), "Link permanente para este registro")'
- +' or starts-with(text(), "本記錄固定連結")'
- +' or starts-with(text(), "此记录的永久链接")'
- +' or starts-with(text(), "このレコードへのパーシスタント リンク")'
- +' or starts-with(text(), "레코드 링크 URL")'
- +' or starts-with(text(), "Постоянная ссылка на эту запись")'
- +' or starts-with(text(), "Bu kayda sürekli bağlantı")'
- +' or starts-with(text(), "Μόνιμος σύνδεσμος σε αυτό το αρχείο")]';
-*/
- var xpath = '//input[@id="ctl00_ctl00_Column2_Column2_topDeliveryControl_deliveryButtonControl_lnkExport"]';
+
+ var xpath = '//a[@class="permalink-link"]';
var persistentLink = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
if(persistentLink) {
return "journalArticle";
}
}
-var customViewStateMatch = /<input type="hidden" name="__CUSTOMVIEWSTATE" id="__CUSTOMVIEWSTATE" value="([^"]+)" \/>/
-var host;
-
-function fullEscape(text) {
- return escape(text).replace(/\//g, "%2F").replace(/\+/g, "%2B");
-}
-
-function generateDeliverString(nsResolver, doc){
- var hiddenInputs = doc.evaluate('//input[@type="hidden" and not(contains(@name, "folderHas")) and not(@name ="ajax")]', doc, nsResolver, XPathResult.ANY_TYPE, null);
- var hiddenInput;
- var deliverString ="";
- while(hiddenInput = hiddenInputs.iterateNext()) {
- if (hiddenInput.name !== "__EVENTTARGET" && hiddenInput.name !== "") {
- deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+encodeURIComponent(hiddenInput.value) + "&";
- }
- }
- var otherHiddenInputs = doc.evaluate('//input[@type="hidden" and contains(@name, "folderHas")]', doc, nsResolver, XPathResult.ANY_TYPE, null);
- while(hiddenInput = otherHiddenInputs.iterateNext()) {
- deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+escape(hiddenInput.value).replace(/\//g, "%2F").replace(/%20/g, "+") + "&";
- }
-
- deliverString = "__EVENTTARGET=ctl00%24ctl00%24Column2%24Column2%24topDeliveryControl%24deliveryButtonControl%24lnkExport&" + deliverString;
-
- return deliverString;
-}
-
-
/*
* given the text of the delivery page, downloads an item
*/
-function downloadFunction(text) {
- var postMatch = false;
- var form = text.match(/<form[^>]*(?:id|name)="aspnetForm"[^>]*/);
- if (form) postMatch = form[0].match(/action="([^"]+)"/);
- else postMatch = customViewStateMatch.exec(text);
- if (!postMatch) {
- Zotero.debug("Failed to find download URI in delivery page.");
- return false;
- }
- var deliveryURL = postMatch[1].replace(/&/g,"&");
- var viewstateMatch = customViewStateMatch.exec(text);
- var downloadString = "__EVENTTARGET=&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+fullEscape(viewstateMatch[1])+"&__VIEWSTATE=&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24btnSubmit=Save&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24BibFormat=1&ajax=enabled";
+function downloadFunction(text, url) {
+ var pdf = false;
+ var queryString = {};
+ url.replace(
+ new RegExp("([^?=&]+)(=([^&]*))?", "g"),
+ function($0, $1, $2, $3) { queryString[$1] = $3; }
+ );
+ pdf = "/ehost/pdfviewer/pdfviewer?sid="+queryString["sid"]+"&vid="+queryString["vid"];
-
- Zotero.Utilities.HTTP.doPost(host+"/ehost/"+deliveryURL,
- downloadString, function(text) { // get marked records as RIS
- Zotero.debug(text);
- // load translator for RIS
- if (text.match(/^AB\s\s\-/m)) text = text.replace(/^AB\s\s\-/m, "N2 -");
- if (!text.match(/^TY\s\s-/m)) text = text+"\nTY - JOUR\n";
+ if (!text.match(/^TY\s\s-/m)) { text = text+"\nTY - JOUR\n"; }
// load translator for RIS
var translator = Zotero.loadTranslator("import");
translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
@@ -113,7 +62,7 @@ function downloadFunction(text) {
item.DOI = text.match(/^L3\s+\-\s*(.*)/m)[1];
}
if (text.match(/^M3\s+-\s*(.*)/m)) {
- if (item.DOI == text.match(/^M3\s+\-\s*(.*)/m)[1]) item.DOI = "";
+ if (item.DOI == text.match(/^M3\s+\-\s*(.*)/m)[1]) { item.DOI = ""; }
}
if (text.match(/^DO\s+-\s*(.*)/m)) {
item.DOI = text.match(/^DO\s+-\s*(.*)/m)[1];
@@ -121,68 +70,202 @@ function downloadFunction(text) {
if (text.match(/^T1\s+-/m)) {
item.title = text.match(/^T1\s+-\s*(.*)/m)[1];
}
- //item.itemType = "journalArticle";
- item.url = false;
+
+ // If we have a double year, eliminate one
+ var year = item.date.match(/\d{4}/);
+ if (year && item.date.replace(year[0],"").indexOf(year[0]) !== -1) {
+ item.date = item.date.replace(year[0],"");
+ }
+
// RIS translator tries to download the link in "UR" this leads to unhappyness
item.attachments = [];
- item.complete();
+ // But keep the stable link as a link attachment
+ if(item.url) {
+ item.attachments.push({url: item.url,
+ title: "EBSCO Record",
+ mimeType: "text/html",
+ snapshot: false});
+ item.url = "";
+ }
+ item.notes = [];
+ Zotero.Utilities.doGet(pdf, function (text) {
+ //Z.debug(text);
+ var realpdf = text.match(/<embed id="pdfEmbed"[^>]*>/);
+ if(realpdf) {
+ realpdf = text.match(/<embed[^>]*src="([^"]+)"/);
+ if (realpdf) {
+ realpdf = realpdf[1];
+ item.attachments.push({url:realpdf.replace(/&/g, "&"),
+ title: "EBSCO Full Text",
+ mimeType:"application/pdf"});
+ }
+ }
+ }, function () { item.complete(); });
});
translator.translate();
Zotero.done();
- });
}
+var host;
+
function doWeb(doc, url) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
- if (prefix == 'x') return namespace; else return null;
+ if (prefix == 'x') { return namespace; } else { return null; }
} : null;
var hostRe = new RegExp("^(https?://[^/]+)/");
var hostMatch = hostRe.exec(url);
host = hostMatch[1];
-
- var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver,
- XPathResult.ANY_TYPE, null).iterateNext();
+
+ var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if(searchResult) {
+ /* Get title links and text */
var titlex = '//a[@class = "title-link color-p4"]';
var titles = doc.evaluate(titlex, doc, nsResolver, XPathResult.ANY_TYPE, null);
- var items = new Object();
- var title;
+
+ /* Get folder data for AN, DB, and tag */
+ var folderx = '//span[@class = "item add-to-folder"]/input/@value';
+ var folderData = doc.evaluate(folderx, doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var items = {};
+ var folderInfos = {};
+ var title, folderInfo;
+
+ /* load up urls, title text and records keys (DB, AN, tag) */
while (title = titles.iterateNext()) {
items[title.href] = title.textContent;
+
+ folderInfo = folderData.iterateNext();
+ folderInfos[title.href] = folderInfo.textContent;
}
- var items = Zotero.selectItems(items);
- if(!items) {
- return true;
- }
+ Zotero.selectItems(items, function (items) {
+ if(!items) {
+ return true;
+ }
- var uris = new Array();
- for(var i in items) {
- uris.push(i);
- }
-
- Zotero.Utilities.processDocuments(uris, function(newDoc){
- var postURL = newDoc.evaluate('//form[@id="aspnetForm"]/@action', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
- postURL = host+"/ehost/"+postURL.nodeValue;
- var deliverString = generateDeliverString(nsResolver, newDoc);
- Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction);
+ /* Get each citation page and pass in record key (db, tag, an) since data does not exist in an easily digestable way on this page */
+ var urls = [];
+ var infos = [];
+ var i;
+ for(i in items) {
+ urls.push(i);
+ infos.push(folderInfos[i]);
+ }
+
+ var run = function(urls, infos) {
+ var url, info;
+ if (urls.length == 0 || folderInfos.length == 0) {
+ Zotero.done();
+ return true;
+ }
+ url = urls.shift();
+ info = infos.shift();
+ Zotero.Utilities.processDocuments(url,
+ function (newDoc) { doDelivery(doc, nsResolver, info); },
+ function () {run(urls, infos);
+ });
+ };
+
+ run(urls, infos);
+
+ Zotero.wait();
});
} else {
- //This is a hack, generateDeliveryString is acting up for single pages, but it works on the plink url
- // The URL-encoding can cause issues too-- we decode it
- var link = [decodeURI(doc.evaluate("//input[@id ='pLink']/@value", doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue)];
- Zotero.Utilities.processDocuments(link, function(newDoc){
- var postURL = newDoc.evaluate('//form[@id="aspnetForm"]/@action', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
- postURL = host+"/ehost/"+postURL.nodeValue;
- var deliverString = generateDeliverString(nsResolver, newDoc);
- Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction);
- });
-
+ /* Individual record. Record key exists in attribute for add to folder link in DOM */
+ doDelivery(doc, nsResolver, null);
}
- Zotero.wait();
}
+function doDelivery(doc, nsResolver, folderData) {
+ if(folderData === null) {
+ /* Get the db, AN, and tag from ep.clientData instead */
+ var script;
+ var scripts = doc.evaluate('//script[@type="text/javascript"]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ while (script = scripts.iterateNext().textContent) {
+ if (script.indexOf("var ep") > -1) { break; }
+ script = "";
+ }
+ }
+
+ if (script === "") { return; }
+ /* We now have the script containing ep.clientData */
+
+ /* The JSON is technically invalid, since it doesn't quote the
+ attribute names-- we pull out the valid bit inside it. */
+ var clientData = script.match(/var ep\s*=\s*({[^;]*});/);
+ if (!clientData) { return false; }
+ clientData = clientData[1].match(/"currentRecord"\s*:\s*({[^}]*})/);
+ /* If this starts throwing exceptions, we should probably start try-elsing it */
+ clientData = JSON.parse(clientData[1]);
+
+ var postURL = doc.evaluate('//form[@id="aspnetForm"]/@action', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+
+ var queryString = {};
+ postURL.replace(
+ new RegExp("([^?=&]+)(=([^&]*))?", "g"),
+ function($0, $1, $2, $3) { queryString[$1] = $3; }
+ );
+
+ /* ExportFormat = 1 for RIS file */
+ postURL = host+"/ehost/delivery/ExportPanelSave/"+clientData.Db+"_"+clientData.Term+"_"+clientData.Tag+"?sid="+queryString["sid"]+"&vid="+queryString["vid"]+"&bdata="+queryString["bdata"]+"&theExportFormat=1";
+
+ Zotero.Utilities.HTTP.doGet(postURL, function (text) { downloadFunction(text, postURL); });
+}
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://search.ebscohost.com/login.aspx?direct=true&db=a9h&AN=4370815&lang=cs&site=ehost-live",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "lastName": "Warren",
+ "firstName": "Karen J.",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "RECONCILIATION",
+ "WAR -- Moral & ethical aspects",
+ "SOCIAL sciences -- Philosophy",
+ "STERBA, James",
+ "JUSTICE for Here & Now (Book)"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "EBSCO Record",
+ "mimeType": "text/html",
+ "snapshot": false
+ },
+ {
+ "url": false,
+ "title": "EBSCO Full Text",
+ "mimeType": "application/pdf"
+ }
+ ],
+ "title": "Peacemaking and Philosophy: A Critique of Justice for Hero and Now.",
+ "publicationTitle": "Journal of Social Philosophy",
+ "date": "Winter 1999",
+ "volume": "30",
+ "issue": "3",
+ "pages": "411-423",
+ "publisher": "Wiley-Blackwell",
+ "ISBN": "00472786",
+ "ISSN": "00472786",
+ "abstractNote": "This article presents a critical analysis of James Sterba's book, Justice for Here and Now. In the book, Sterba undertakes two distinct but interconnected objects--one primarily methodological and the other primarily ethical. The methodological project is to establish the necessity and desirability of adopting a peacemaking model of doing philosophy, that is, one that is committed to fair-mindedness, openness and self-criticalness in seeking to determine which philosophical views are most justified. Sterba contrasts the peacemaking model with a war-making model of doing philosophy. The ethical project involves establishing two related claims: rationality is required for morality, and it is possible and desirable to reconcile the practical perspectives of alternative positions on justice; welfare liberalism, libertarianism, socialism, feminism, multiculturalism, anthropocentric and nonanthropocentric environmental ethics, and pacifism and just war theory. There is an important and intimate connection between the methodological and ethical projects. In fact, at various places throughout the book Sterba suggests that the relationship is one of logical entailment: not only does appeal to a peacemaking model of doing philosophy establish the two main claims of the ethical project; by showing the rational grounds for reconciling alternative philosophical positions on justice, one establishes that a peacemaking model of philosophy ought to be adopted.",
+ "libraryCatalog": "EBSCOhost",
+ "shortTitle": "Peacemaking and Philosophy"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Embedded RDF.js b/translators/Embedded RDF.js
@@ -1,15 +1,15 @@
{
- "translatorID":"951c027d-74ac-47d4-a107-9c3069ab7b48",
- "translatorType":4,
- "label":"Embedded RDF",
- "creator":"Simon Kornblith",
- "target":null,
- "minVersion":"1.0.0b3.r1",
- "maxVersion":"",
- "priority":400,
- "inRepository":true,
- "detectXPath":"//meta[substring(@name, 1, 3)='dc.'] | //link[substring(@rel, 1, 7)='schema.']",
- "lastUpdated":"2011-01-11 04:31:00"
+ "translatorID": "951c027d-74ac-47d4-a107-9c3069ab7b48",
+ "label": "Embedded RDF",
+ "creator": "Simon Kornblith",
+ "target": "",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 400,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-04 00:32:05"
}
var _prefix;
@@ -69,28 +69,66 @@ function doWeb(doc, url) {
newItem.repository = false;
newItem.complete();
});
- var rdf = translator.getTranslatorObject();
- var metaTags = doc.getElementsByTagName("meta");
- var foundTitle = false; // We can use the page title if necessary
- for(var i=0; i<metaTags.length; i++) {
- var tag = metaTags[i].getAttribute("name");
- var value = metaTags[i].getAttribute("content");
- if(tag && value && tag.substr(0, prefix.length).toLowerCase() == prefix) {
- if(tag == "dc.title") {
- foundTitle = true;
+ translator.getTranslatorObject(function(rdf) {
+ var metaTags = doc.getElementsByTagName("meta");
+ var foundTitle = false; // We can use the page title if necessary
+ for(var i=0; i<metaTags.length; i++) {
+ var tag = metaTags[i].getAttribute("name");
+ var value = metaTags[i].getAttribute("content");
+ if(tag && value && tag.substr(0, prefix.length).toLowerCase() == prefix) {
+ if(tag == "dc.title") {
+ foundTitle = true;
+ }
+ rdf.Zotero.RDF.addStatement(url, _dc + tag.substr(3).toLowerCase(), value, true);
+ } else if(tag && value && (tag == "author" || tag == "author-personal")) {
+ rdf.Zotero.RDF.addStatement(url, _dc + "creator", value, true);
+ } else if(tag && value && tag == "author-corporate") {
+ rdf.Zotero.RDF.addStatement(url, _dc + "creator", value, true);
}
- rdf.Zotero.RDF.addStatement(url, _dc + tag.substr(3).toLowerCase(), value, true);
- } else if(tag && value && (tag == "author" || tag == "author-personal")) {
- rdf.Zotero.RDF.addStatement(url, _dc + "creator", value, true);
- } else if(tag && value && tag == "author-corporate") {
- rdf.Zotero.RDF.addStatement(url, _dc + "creator", value, true);
}
+
+ if (!foundTitle) {
+ rdf.Zotero.RDF.addStatement(url, _dc + "title", doc.title, true);
+ }
+ rdf.defaultUnknownType = "webpage";
+ rdf.doImport();
+ });
+}
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://dublincore.org/documents/usageguide/",
+ "items": [
+ {
+ "itemType": "webpage",
+ "creators": [
+ {
+ "lastName": "Diane Hillmann",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "document": false
+ }
+ ],
+ "itemID": "http://dublincore.org/documents/usageguide/",
+ "title": "Using Dublin Core",
+ "publisher": "Dublin Core Metadata Initiative",
+ "institution": "Dublin Core Metadata Initiative",
+ "company": "Dublin Core Metadata Initiative",
+ "label": "Dublin Core Metadata Initiative",
+ "distributor": "Dublin Core Metadata Initiative",
+ "extra": "This document is intended as an entry point for users of Dublin Core. For non-specialists, it will assist them in creating simple descriptive records for information resources (for example, electronic documents). Specialists may find the document a useful point of reference to the documentation of Dublin Core, as it changes and grows.",
+ "url": "http://dublincore.org/documents/usageguide/"
+ }
+ ]
}
-
- if (!foundTitle) {
- rdf.Zotero.RDF.addStatement(url, _dc + "title", doc.title, true);
- }
- rdf.defaultUnknownType = "webpage";
- rdf.doImport();
-}
-\ No newline at end of file
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/Encyclopedia of Chicago.js b/translators/Encyclopedia of Chicago.js
@@ -0,0 +1,164 @@
+{
+ "translatorID": "0689f3e1-f0b4-4c0c-b795-4aebdfea08e0",
+ "label": "Encyclopedia of Chicago",
+ "creator": "Brodie Austin",
+ "target": "^http://encyclopedia\\.chicagohistory\\.org/pages",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-06 00:45:32"
+}
+
+/* FW LINE 46:127318f30c1d */ function flatten(c){var b=new Array();for(var d in c){var e=c[d];if(e instanceof Array){b=b.concat(flatten(e))}else{b.push(e)}}return b}var FW={_scrapers:new Array()};FW._Base=function(){this.callHook=function(b,c,e,a){if(typeof this["hooks"]==="object"){var d=this["hooks"][b];if(typeof d==="function"){d(c,e,a)}}};this.evaluateThing=function(f,e,c){var b=typeof f;if(b==="string"){return f}else{if(b==="object"){if(f instanceof Array){var d=this.evaluateThing;var a=f.map(function(g){return d(g,e,c)});return flatten(a)}else{return f.evaluate(e,c)}}else{if(b==="function"){return f(e,c)}else{return undefined}}}}};FW.Scraper=function(a){FW._scrapers.push(new FW._Scraper(a))};FW._Scraper=function(a){for(x in a){this[x]=a[x]}this._singleFieldNames=["abstractNote","applicationNumber","archive","archiveLocation","artworkMedium","artworkSize","assignee","audioFileType","audioRecordingType","billNumber","blogTitle","bookTitle","callNumber","caseName","code","codeNumber","codePages","codeVolume","committee","company","conferenceName","country","court","date","dateDecided","dateEnacted","dictionaryTitle","distributor","docketNumber","documentNumber","DOI","edition","encyclopediaTitle","episodeNumber","extra","filingDate","firstPage","forumTitle","genre","history","institution","interviewMedium","ISBN","ISSN","issue","issueDate","issuingAuthority","journalAbbreviation","label","language","legalStatus","legislativeBody","letterType","libraryCatalog","manuscriptType","mapType","medium","meetingName","nameOfAct","network","number","numberOfVolumes","numPages","pages","patentNumber","place","postType","presentationType","priorityNumbers","proceedingsTitle","programTitle","programmingLanguage","publicLawNumber","publicationTitle","publisher","references","reportNumber","reportType","reporter","reporterVolume","rights","runningTime","scale","section","series","seriesNumber","seriesText","seriesTitle","session","shortTitle","studio","subject","system","thesisType","title","type","university","url","version","videoRecordingType","volume","websiteTitle","websiteType"];this._makeAttachments=function(q,b,f,s){if(f instanceof Array){f.forEach(function(k){this._makeAttachments(q,b,k,s)},this)}else{if(typeof f==="object"){var p=f.urls||f.url;var m=f.types||f.type;var e=f.titles||f.title;var h=this.evaluateThing(p,q,b);var o=this.evaluateThing(e,q,b);var r=this.evaluateThing(m,q,b);var l=(r instanceof Array);var n=(o instanceof Array);if(!(h instanceof Array)){h=[h]}for(var j in h){var c=h[j];var g;var d;if(l){g=r[j]}else{g=r}if(n){d=o[j]}else{d=o}s.attachments.push({url:c,title:d,type:g})}}}};this.makeItems=function(o,b,m,c,l){var q=new Zotero.Item(this.itemType);q.url=b;for(var h in this._singleFieldNames){var n=this._singleFieldNames[h];if(this[n]){var g=this.evaluateThing(this[n],o,b);if(g instanceof Array){q[n]=g[0]}else{q[n]=g}}}var r=["creators","tags"];for(var f in r){var p=r[f];var d=this.evaluateThing(this[p],o,b);if(d){for(var e in d){q[p].push(d[e])}}}this._makeAttachments(o,b,this["attachments"],q);c(q,this,o,b);l([q])}};FW._Scraper.prototype=new FW._Base;FW.MultiScraper=function(a){FW._scrapers.push(new FW._MultiScraper(a))};FW._MultiScraper=function(a){for(x in a){this[x]=a[x]}this._mkSelectItems=function(e,d){var b=new Object;for(var c in e){b[d[c]]=e[c]}return b};this._selectItems=function(d,c,e){var b=new Array();Zotero.selectItems(this._mkSelectItems(d,c),function(f){for(var g in f){b.push(g)}e(b)})};this._mkAttachments=function(g,d,f){var b=this.evaluateThing(this["attachments"],g,d);var c=new Object();if(b){for(var e in f){c[f[e]]=b[e]}}return c};this._makeChoices=function(f,p,c,d,h){if(f instanceof Array){f.forEach(function(k){this._makeTitlesUrls(k,p,c,d,h)},this)}else{if(typeof f==="object"){var m=f.urls||f.url;var e=f.titles||f.title;var n=this.evaluateThing(m,p,c);var j=this.evaluateThing(e,p,c);var l=(j instanceof Array);if(!(n instanceof Array)){n=[n]}for(var g in n){var b=n[g];var o;if(l){o=j[g]}else{o=j}h.push(b);d.push(o)}}}};this.makeItems=function(j,b,g,c,f){Zotero.debug("Entering MultiScraper.makeItems");if(this.beforeFilter){var k=this.beforeFilter(j,b);if(k!=b){this.makeItems(j,k,g,c,f);return}}var e=[];var h=[];this._makeChoices(this["choices"],j,b,e,h);var d=this._mkAttachments(j,b,h);this._selectItems(e,h,function(m){if(!m){f([])}else{var l=[];var n=this.itemTrans;Zotero.Utilities.processDocuments(m,function(q){var p=q.documentURI;var o=n;if(o===undefined){o=FW.getScraper(q,p)}if(o===undefined){}else{o.makeItems(q,p,d[p],function(r){l.push(r);c(r,o,q,p)},function(){})}},function(){f(l)})}})}};FW._MultiScraper.prototype=new FW._Base;FW.DelegateTranslator=function(a){return new FW._DelegateTranslator(a)};FW._DelegateTranslator=function(a){for(x in a){this[x]=a[x]}this._translator=Zotero.loadTranslator(this.translatorType);this._translator.setTranslator(this.translatorId);this.makeItems=function(g,d,b,f,c){Zotero.debug("Entering DelegateTranslator.makeItems");var e;Zotero.Utilities.HTTP.doGet(d,function(h){this._translator.setHandler("itemDone",function(k,j){e=j;if(b){j.attachments=b}});this._translator.setString(h);this._translator.translate();f(e)},function(){c([e])})}};FW.DelegateTranslator.prototype=new FW._Scraper;FW._StringMagic=function(){this._filters=new Array();this.addFilter=function(a){this._filters.push(a);return this};this.split=function(a){return this.addFilter(function(b){return b.split(a).filter(function(c){return(c!="")})})};this.replace=function(c,b,a){return this.addFilter(function(d){if(d.match(c)){return d.replace(c,b,a)}else{return d}})};this.prepend=function(a){return this.replace(/^/,a)};this.append=function(a){return this.replace(/$/,a)};this.remove=function(b,a){return this.replace(b,"",a)};this.trim=function(){return this.addFilter(function(a){return Zotero.Utilities.trim(a)})};this.trimInternal=function(){return this.addFilter(function(a){return Zotero.Utilities.trimInternal(a)})};this.match=function(a,b){if(!b){b=0}return this.addFilter(function(d){var c=d.match(a);if(c===undefined||c===null){return undefined}else{return c[b]}})};this.cleanAuthor=function(b,a){return this.addFilter(function(c){return Zotero.Utilities.cleanAuthor(c,b,a)})};this.key=function(a){return this.addFilter(function(b){return b[a]})};this.capitalizeTitle=function(){return this.addFilter(function(a){return Zotero.Utilities.capitalizeTitle(a)})};this.unescapeHTML=function(){return this.addFilter(function(a){return Zotero.Utilities.unescapeHTML(a)})};this.unescape=function(){return this.addFilter(function(a){return unescape(a)})};this._applyFilters=function(c,e){for(i in this._filters){c=flatten(c);c=c.filter(function(a){return((a!==undefined)&&(a!==null))});for(var d=0;d<c.length;d++){try{if((c[d]===undefined)||(c[d]===null)){continue}else{c[d]=this._filters[i](c[d],e)}}catch(b){c[d]=undefined;Zotero.debug("Caught exception "+b+"on filter: "+this._filters[i])}}c=c.filter(function(a){return((a!==undefined)&&(a!==null))})}return c}};FW.PageText=function(){return new FW._PageText()};FW._PageText=function(){this._filters=new Array();this.evaluate=function(c){var b=[c.documentElement.innerHTML];b=this._applyFilters(b,c);if(b.length==0){return false}else{return b}}};FW._PageText.prototype=new FW._StringMagic();FW.Url=function(){return new FW._Url()};FW._Url=function(){this._filters=new Array();this.evaluate=function(d,c){var b=[c];b=this._applyFilters(b,d);if(b.length==0){return false}else{return b}}};FW._Url.prototype=new FW._StringMagic();FW.Xpath=function(a){return new FW._Xpath(a)};FW._Xpath=function(a){this._xpath=a;this._filters=new Array();this.text=function(){var b=function(c){if(typeof c==="object"&&c.textContent){return c.textContent}else{return c}};this.addFilter(b);return this};this.sub=function(b){var c=function(f,e){var d=e.evaluate(b,f,null,XPathResult.ANY_TYPE,null);if(d){return d.iterateNext()}else{return undefined}};this.addFilter(c);return this};this.evaluate=function(e){var d=e.evaluate(this._xpath,e,null,XPathResult.ANY_TYPE,null);var c=new Array();var b;while(b=d.iterateNext()){c.push(b)}c=this._applyFilters(c,e);if(c.length==0){return false}else{return c}}};FW._Xpath.prototype=new FW._StringMagic();FW.detectWeb=function(e,b){for(var c in FW._scrapers){var d=FW._scrapers[c];var f=d.evaluateThing(d.itemType,e,b);if(!d.detect){return f}else{var a=d.evaluateThing(d.detect,e,b);if(a.length>0&&a[0]){return f}}}return undefined};FW.getScraper=function(b,a){var c=FW.detectWeb(b,a);return FW._scrapers.filter(function(d){return(d.evaluateThing(d.itemType,b,a)==c)&&(d.evaluateThing(d.detect,b,a))})[0]};FW.doWeb=function(c,a){Zotero.debug("Entering FW.doWeb");var b=FW.getScraper(c,a);b.makeItems(c,a,[],function(f,e,g,d){e.callHook("scraperDone",f,g,d);if(!f.title){f.title=""}f.complete()},function(){Zotero.done()});Zotero.wait();Zotero.debug("Leaving FW.doWeb")};
+
+function detectWeb(doc, url) { return FW.detectWeb(doc, url); }
+function doWeb(doc, url) { return FW.doWeb(doc, url); }
+
+/*Encyclopedia articles and tables*/
+FW.Scraper({
+ itemType : 'encyclopediaArticle',
+ detect : FW.Xpath('//td[@class="entrynavheader"]').text().match(/Entries|Features/),
+ title : FW.Xpath('//td[@class="ideEssay"]/span[@class="feature"]').text().trim(),
+ creators : FW.Xpath('//p[@class="entryauthor"]').text().match(/^ *.* *$/).split(/and/).replace(/,\s*/,"-").cleanAuthor("author"),
+ date : FW.Xpath('//div[@class="copyright"]').text().match(/\d+/),
+ encyclopediaTitle : 'Encyclopedia of Chicago',
+ place : 'Chicago',
+ publisher : 'Chicago History Museum and the Newberry Library',
+ /*attachments*/
+ attachments : [{url: FW.Url(),
+ title: 'Encyclopedia of Chicago Entry URL',
+ type: 'text/html',
+ }],
+});
+
+/*Encyclopedia essays [very similar to entries, but different detect target]*/
+FW.Scraper({
+ itemType : 'encyclopediaArticle',
+ detect : FW.Xpath('//div[@class="entryheader"]').text().match(/Essay/),
+ title : FW.Xpath('//td[@class="ideEssay"]/span[@class="feature"]').text().trim(),
+ creators : FW.Xpath('//p[@class="entryauthor"]').text().match(/^ *.* *$/).split(/and/).replace(/,\s*/,"-").cleanAuthor("author"),
+ date : FW.Xpath('//div[@class="copyright"]').text().match(/\d+/),
+ encyclopediaTitle : 'Encyclopedia of Chicago',
+ place : 'Chicago',
+ publisher : 'Chicago History Museum and the Newberry Library',
+ /*attachments*/
+ attachments : [{url: FW.Url(),
+ title: 'Encyclopedia of Chicago Entry URL',
+ type: 'text/html',
+ }],
+});
+
+/*Primary source documents*/
+FW.Scraper({
+ itemType : 'document',
+ detect : FW.Xpath('//td[@class="entrynavheader"]').text().match(/Sourc(e|es)/),
+ title : FW.Xpath('//td[@class="ideEssay"]/span[@class="feature"]').text(),
+ creators : FW.Xpath('//p[@class="entryauthor"]').text().match(/[Artist|Creator|Author|Photographer]s*\:\s+([\w\s.,-|\&|()]+)Source/,1).split(/and/).replace(/,\w*/, "-").cleanAuthor("author"),
+ date : FW.Xpath('//td[@class="ideEssay"]/span[@class="feature"]').text().match(/\d+/),
+ archive : FW.Xpath('//p[@class="entryauthor"]').text().match(/Source\:\s+([\w\s\d.,-|\&]+)\s/,1),
+ archiveLocation : FW.Xpath('//p[@class="entryauthor"]').text().match(/Source\:\s+[\w\s\d.,-|\&]+\s[(]*([\w\d\s-.,]+)/,1),
+ /*attachments*/
+ attachments : [{url: FW.Url(),
+ title: 'Encyclopedia of Chicago Document URL',
+ type: 'text/html',
+ }],
+});
+
+/*Maps created by the Encyclopedia, not historical maps which are documents*/
+FW.Scraper({
+ itemType : 'map',
+ detect : FW.Xpath('//td[@class="entrynavheader"]').text().match(/Maps|MAPS/),
+ title : FW.Xpath('//td[@class="ideEssay"]/span[@class="feature"]').text().trim(),
+ creators : FW.Xpath('//p[@class="entryauthor"]').text().match(/[Artist|Creator|Author|Photographer]s*\:\s+([\w\s.,-|\&]+)(\(|Source)/,1).split(/and/).replace(/,\w*/, "-").cleanAuthor("author"),
+ date : FW.Xpath('//div[@class="copyright"]').text().match(/\d+/).trim(),
+ archive : FW.Xpath('//p[@class="entryauthor"]').text().match(/Source\:\s+([\w\s\d.,-|\&]+)\s/,1).trim(),
+ archiveLocation : FW.Xpath('//p[@class="entryauthor"]').text().match(/Source\:\s+[\w\s\d.,-|\&]+\s[(]*([\w\d\s-.,]+)/,1).trim(),
+ /*attachments*/
+ attachments : [{url: FW.Url(),
+ title: 'Encyclopedia of Chicago Map URL',
+ type: 'text/html',
+ }],
+});
+
+/*Multi item does not seem to work due to iframes on pages,
+but I'm leaving the code here for now
+FW.MultiScraper({
+ itemType : 'multiple',
+ detect : FW.Xpath('//div[@class="entryheader"]').text().match(/Index/),
+ choices : {
+ titles : FW.Xpath('//iframe/html/body/div[@class="itemtable"]/div[@class="itemalign"]/a').text().trim(),
+ urls : FW.Xpath('//iframe/html/body/div[@class="itemtable"]/div[@class="itemalign"]/a/@href').text(),
+ }
+});*/
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://encyclopedia.chicagohistory.org/pages/457.html",
+ "items": [
+ {
+ "itemType": "encyclopediaArticle",
+ "creators": [
+ {
+ "firstName": "Robin",
+ "lastName": "Einhorn",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "Encyclopedia of Chicago Entry URL",
+ "type": "text/html"
+ }
+ ],
+ "url": "http://encyclopedia.chicagohistory.org/pages/457.html",
+ "date": "2005",
+ "encyclopediaTitle": "Encyclopedia of Chicago",
+ "place": "Chicago",
+ "publisher": "Chicago History Museum and the Newberry Library",
+ "title": "Fire Limits",
+ "libraryCatalog": "Encyclopedia of Chicago"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://encyclopedia.chicagohistory.org/pages/3716.html",
+ "items": [
+ {
+ "itemType": "map",
+ "creators": [
+ {
+ "firstName": "Ann Durkin",
+ "lastName": "Keating",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "Encyclopedia of Chicago Map URL",
+ "type": "text/html"
+ }
+ ],
+ "url": "http://encyclopedia.chicagohistory.org/pages/3716.html",
+ "archive": "Newberry Library",
+ "date": "2005",
+ "title": "Annexations and Additions to the City of Chicago",
+ "libraryCatalog": "Encyclopedia of Chicago"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/Foreign Policy.js b/translators/Foreign Policy.js
@@ -0,0 +1,144 @@
+{
+ "translatorID": "0e7ab798-bb96-4a3a-9a01-8d1d67153908",
+ "label": "Foreign Policy",
+ "creator": "Sebastian Karcher",
+ "target": "^https?://(.*)foreignpolicy\\.com",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-06-18 00:43:21"
+}
+
+/* FW LINE 46:127318f30c1d */ function flatten(c){var b=new Array();for(var d in c){var e=c[d];if(e instanceof Array){b=b.concat(flatten(e))}else{b.push(e)}}return b}var FW={_scrapers:new Array()};FW._Base=function(){this.callHook=function(b,c,e,a){if(typeof this["hooks"]==="object"){var d=this["hooks"][b];if(typeof d==="function"){d(c,e,a)}}};this.evaluateThing=function(f,e,c){var b=typeof f;if(b==="string"){return f}else{if(b==="object"){if(f instanceof Array){var d=this.evaluateThing;var a=f.map(function(g){return d(g,e,c)});return flatten(a)}else{return f.evaluate(e,c)}}else{if(b==="function"){return f(e,c)}else{return undefined}}}}};FW.Scraper=function(a){FW._scrapers.push(new FW._Scraper(a))};FW._Scraper=function(a){for(x in a){this[x]=a[x]}this._singleFieldNames=["abstractNote","applicationNumber","archive","archiveLocation","artworkMedium","artworkSize","assignee","audioFileType","audioRecordingType","billNumber","blogTitle","bookTitle","callNumber","caseName","code","codeNumber","codePages","codeVolume","committee","company","conferenceName","country","court","date","dateDecided","dateEnacted","dictionaryTitle","distributor","docketNumber","documentNumber","DOI","edition","encyclopediaTitle","episodeNumber","extra","filingDate","firstPage","forumTitle","genre","history","institution","interviewMedium","ISBN","ISSN","issue","issueDate","issuingAuthority","journalAbbreviation","label","language","legalStatus","legislativeBody","letterType","libraryCatalog","manuscriptType","mapType","medium","meetingName","nameOfAct","network","number","numberOfVolumes","numPages","pages","patentNumber","place","postType","presentationType","priorityNumbers","proceedingsTitle","programTitle","programmingLanguage","publicLawNumber","publicationTitle","publisher","references","reportNumber","reportType","reporter","reporterVolume","rights","runningTime","scale","section","series","seriesNumber","seriesText","seriesTitle","session","shortTitle","studio","subject","system","thesisType","title","type","university","url","version","videoRecordingType","volume","websiteTitle","websiteType"];this._makeAttachments=function(q,b,f,s){if(f instanceof Array){f.forEach(function(k){this._makeAttachments(q,b,k,s)},this)}else{if(typeof f==="object"){var p=f.urls||f.url;var m=f.types||f.type;var e=f.titles||f.title;var h=this.evaluateThing(p,q,b);var o=this.evaluateThing(e,q,b);var r=this.evaluateThing(m,q,b);var l=(r instanceof Array);var n=(o instanceof Array);if(!(h instanceof Array)){h=[h]}for(var j in h){var c=h[j];var g;var d;if(l){g=r[j]}else{g=r}if(n){d=o[j]}else{d=o}s.attachments.push({url:c,title:d,type:g})}}}};this.makeItems=function(o,b,m,c,l){var q=new Zotero.Item(this.itemType);q.url=b;for(var h in this._singleFieldNames){var n=this._singleFieldNames[h];if(this[n]){var g=this.evaluateThing(this[n],o,b);if(g instanceof Array){q[n]=g[0]}else{q[n]=g}}}var r=["creators","tags"];for(var f in r){var p=r[f];var d=this.evaluateThing(this[p],o,b);if(d){for(var e in d){q[p].push(d[e])}}}this._makeAttachments(o,b,this["attachments"],q);c(q,this,o,b);l([q])}};FW._Scraper.prototype=new FW._Base;FW.MultiScraper=function(a){FW._scrapers.push(new FW._MultiScraper(a))};FW._MultiScraper=function(a){for(x in a){this[x]=a[x]}this._mkSelectItems=function(e,d){var b=new Object;for(var c in e){b[d[c]]=e[c]}return b};this._selectItems=function(d,c,e){var b=new Array();Zotero.selectItems(this._mkSelectItems(d,c),function(f){for(var g in f){b.push(g)}e(b)})};this._mkAttachments=function(g,d,f){var b=this.evaluateThing(this["attachments"],g,d);var c=new Object();if(b){for(var e in f){c[f[e]]=b[e]}}return c};this._makeChoices=function(f,p,c,d,h){if(f instanceof Array){f.forEach(function(k){this._makeTitlesUrls(k,p,c,d,h)},this)}else{if(typeof f==="object"){var m=f.urls||f.url;var e=f.titles||f.title;var n=this.evaluateThing(m,p,c);var j=this.evaluateThing(e,p,c);var l=(j instanceof Array);if(!(n instanceof Array)){n=[n]}for(var g in n){var b=n[g];var o;if(l){o=j[g]}else{o=j}h.push(b);d.push(o)}}}};this.makeItems=function(j,b,g,c,f){Zotero.debug("Entering MultiScraper.makeItems");if(this.beforeFilter){var k=this.beforeFilter(j,b);if(k!=b){this.makeItems(j,k,g,c,f);return}}var e=[];var h=[];this._makeChoices(this["choices"],j,b,e,h);var d=this._mkAttachments(j,b,h);this._selectItems(e,h,function(m){if(!m){f([])}else{var l=[];var n=this.itemTrans;Zotero.Utilities.processDocuments(m,function(q){var p=q.documentURI;var o=n;if(o===undefined){o=FW.getScraper(q,p)}if(o===undefined){}else{o.makeItems(q,p,d[p],function(r){l.push(r);c(r,o,q,p)},function(){})}},function(){f(l)})}})}};FW._MultiScraper.prototype=new FW._Base;FW.DelegateTranslator=function(a){return new FW._DelegateTranslator(a)};FW._DelegateTranslator=function(a){for(x in a){this[x]=a[x]}this._translator=Zotero.loadTranslator(this.translatorType);this._translator.setTranslator(this.translatorId);this.makeItems=function(g,d,b,f,c){Zotero.debug("Entering DelegateTranslator.makeItems");var e;Zotero.Utilities.HTTP.doGet(d,function(h){this._translator.setHandler("itemDone",function(k,j){e=j;if(b){j.attachments=b}});this._translator.setString(h);this._translator.translate();f(e)},function(){c([e])})}};FW.DelegateTranslator.prototype=new FW._Scraper;FW._StringMagic=function(){this._filters=new Array();this.addFilter=function(a){this._filters.push(a);return this};this.split=function(a){return this.addFilter(function(b){return b.split(a).filter(function(c){return(c!="")})})};this.replace=function(c,b,a){return this.addFilter(function(d){if(d.match(c)){return d.replace(c,b,a)}else{return d}})};this.prepend=function(a){return this.replace(/^/,a)};this.append=function(a){return this.replace(/$/,a)};this.remove=function(b,a){return this.replace(b,"",a)};this.trim=function(){return this.addFilter(function(a){return Zotero.Utilities.trim(a)})};this.trimInternal=function(){return this.addFilter(function(a){return Zotero.Utilities.trimInternal(a)})};this.match=function(a,b){if(!b){b=0}return this.addFilter(function(d){var c=d.match(a);if(c===undefined||c===null){return undefined}else{return c[b]}})};this.cleanAuthor=function(b,a){return this.addFilter(function(c){return Zotero.Utilities.cleanAuthor(c,b,a)})};this.key=function(a){return this.addFilter(function(b){return b[a]})};this.capitalizeTitle=function(){return this.addFilter(function(a){return Zotero.Utilities.capitalizeTitle(a)})};this.unescapeHTML=function(){return this.addFilter(function(a){return Zotero.Utilities.unescapeHTML(a)})};this.unescape=function(){return this.addFilter(function(a){return unescape(a)})};this._applyFilters=function(c,e){for(i in this._filters){c=flatten(c);c=c.filter(function(a){return((a!==undefined)&&(a!==null))});for(var d=0;d<c.length;d++){try{if((c[d]===undefined)||(c[d]===null)){continue}else{c[d]=this._filters[i](c[d],e)}}catch(b){c[d]=undefined;Zotero.debug("Caught exception "+b+"on filter: "+this._filters[i])}}c=c.filter(function(a){return((a!==undefined)&&(a!==null))})}return c}};FW.PageText=function(){return new FW._PageText()};FW._PageText=function(){this._filters=new Array();this.evaluate=function(c){var b=[c.documentElement.innerHTML];b=this._applyFilters(b,c);if(b.length==0){return false}else{return b}}};FW._PageText.prototype=new FW._StringMagic();FW.Url=function(){return new FW._Url()};FW._Url=function(){this._filters=new Array();this.evaluate=function(d,c){var b=[c];b=this._applyFilters(b,d);if(b.length==0){return false}else{return b}}};FW._Url.prototype=new FW._StringMagic();FW.Xpath=function(a){return new FW._Xpath(a)};FW._Xpath=function(a){this._xpath=a;this._filters=new Array();this.text=function(){var b=function(c){if(typeof c==="object"&&c.textContent){return c.textContent}else{return c}};this.addFilter(b);return this};this.sub=function(b){var c=function(f,e){var d=e.evaluate(b,f,null,XPathResult.ANY_TYPE,null);if(d){return d.iterateNext()}else{return undefined}};this.addFilter(c);return this};this.evaluate=function(e){var d=e.evaluate(this._xpath,e,null,XPathResult.ANY_TYPE,null);var c=new Array();var b;while(b=d.iterateNext()){c.push(b)}c=this._applyFilters(c,e);if(c.length==0){return false}else{return c}}};FW._Xpath.prototype=new FW._StringMagic();FW.detectWeb=function(e,b){for(var c in FW._scrapers){var d=FW._scrapers[c];var f=d.evaluateThing(d.itemType,e,b);if(!d.detect){return f}else{var a=d.evaluateThing(d.detect,e,b);if(a.length>0&&a[0]){return f}}}return undefined};FW.getScraper=function(b,a){var c=FW.detectWeb(b,a);return FW._scrapers.filter(function(d){return(d.evaluateThing(d.itemType,b,a)==c)&&(d.evaluateThing(d.detect,b,a))})[0]};FW.doWeb=function(c,a){Zotero.debug("Entering FW.doWeb");var b=FW.getScraper(c,a);b.makeItems(c,a,[],function(f,e,g,d){e.callHook("scraperDone",f,g,d);if(!f.title){f.title=""}f.complete()},function(){Zotero.done()});Zotero.wait();Zotero.debug("Leaving FW.doWeb")};
+function detectWeb(doc, url) { return FW.detectWeb(doc, url); }
+function doWeb(doc, url) { return FW.doWeb(doc, url); }
+
+/** Articles */
+FW.Scraper({
+itemType : 'magazineArticle',
+detect : FW.Url().match(/\/articles\//),
+title : FW.Xpath('//div[@class="translateHead"]/h1').text().trim(),
+abstractNote : FW.Xpath('//div[@class="translateHead"]/h2').text().trim(),
+attachments : [{ url: FW.Url().remove(/\?page=full/).append("?page=full"),
+ title: "Foreign Policy Snapshot",
+ type: "text/html" }],
+creators : FW.Xpath('//h3/span[@id="by-line"]').text().remove(/BY /).capitalizeTitle().split(/,/).cleanAuthor("author"),
+date : FW.Xpath('//h3/span[@id="pub-date"]').text().capitalizeTitle(),
+tags : FW.Xpath('//div[@id="sub-tags"]/span[@class="fp_red"]/a').text().capitalizeTitle(),
+publicationTitle : "Foreign Policy"
+});
+
+/** Blogs */
+FW.Scraper({
+itemType : 'blogPost',
+detect : FW.Url().match(/\/posts\//),
+title : FW.Xpath('//div[@class="translateHead"]/h1').text().trim(),
+abstractNote : FW.Xpath('//div[@class="translateHead"]/h2').text().trim(),
+attachments : [{ url: FW.Url().remove(/\?page=full/).append("?page=full"),
+ title: "Foreign Policy Snapshot",
+ type: "text/html" }],
+creators : FW.Xpath('//span[@class="post_by"]/a').text().cleanAuthor("author"),
+date : FW.Xpath('//span[@class="post_date"]').text().remove(/-.*/),
+tags : FW.Xpath('//div[@class="subjects"]/a').text().capitalizeTitle(),
+publicationTitle : "Foreign Policy Blogs"
+});
+
+/** Multiple Blogs */
+/** This fails because of permission issues if any of the listed items are articles instead of blog posts */
+FW.MultiScraper({
+itemType : 'multiple',
+detect : FW.Xpath('//div[@id="blog-post-2"]'),
+choices : {
+ titles : FW.Xpath('//div[@class="translateHead"]/h1/a').text().trim(),
+ urls : FW.Xpath('//div[@class="translateHead"]/h1/a').key("href")
+}
+});
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://drezner.foreignpolicy.com/posts/2011/06/16/the_real_turn_in_republican_foreign_policy",
+ "items": [
+ {
+ "itemType": "blogPost",
+ "creators": [
+ {
+ "firstName": "Daniel W.",
+ "lastName": "Drezner",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "U.s. Foreign Policy",
+ "2012 Campaign",
+ "China",
+ "Republicans",
+ "Trade Politics",
+ "Trade Protectionism",
+ "United States"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": "http://drezner.foreignpolicy.com/posts/2011/06/16/the_real_turn_in_republican_foreign_policy?page=full",
+ "title": "Foreign Policy Snapshot",
+ "type": "text/html"
+ }
+ ],
+ "url": "http://drezner.foreignpolicy.com/posts/2011/06/16/the_real_turn_in_republican_foreign_policy",
+ "abstractNote": false,
+ "date": "Thursday, June 16, 2011 ",
+ "publicationTitle": "Foreign Policy Blogs",
+ "title": "The real turn in Republican foreign policy",
+ "libraryCatalog": "Foreign Policy",
+ "accessDate": "CURRENT_TIMESTAMP"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://www.foreignpolicy.com/articles/2011/04/25/more_than_1_billion_people_are_hungry_in_the_world",
+ "items": [
+ {
+ "itemType": "magazineArticle",
+ "creators": [
+ {
+ "firstName": "Abhijit",
+ "lastName": "Banerjee",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Esther",
+ "lastName": "Duflo",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Food/Agriculture"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": "http://www.foreignpolicy.com/articles/2011/04/25/more_than_1_billion_people_are_hungry_in_the_world?page=full",
+ "title": "Foreign Policy Snapshot",
+ "type": "text/html"
+ }
+ ],
+ "url": "http://www.foreignpolicy.com/articles/2011/04/25/more_than_1_billion_people_are_hungry_in_the_world",
+ "abstractNote": "But what if the experts are wrong?",
+ "date": "May/June 2011",
+ "publicationTitle": "Foreign Policy",
+ "title": "More Than 1 Billion People Are Hungry in the World",
+ "libraryCatalog": "Foreign Policy",
+ "accessDate": "CURRENT_TIMESTAMP"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Google Blogs.js b/translators/Google Blogs.js
@@ -0,0 +1,58 @@
+{
+ "translatorID": "58641ca2-d324-445b-a618-4e7c4631726f",
+ "label": "Google Blogs",
+ "creator": "Avram Lyon",
+ "target": "^https?://www\\.google\\.[^/]+/.*[#&]tbm=blg",
+ "minVersion": "2.1.8",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-30 03:19:03"
+}
+
+function detectWeb(doc, url) {
+ return "multiple";
+}
+
+function doWeb(doc, url) {
+ if (ZU === undefined) {
+ var ZU = {};
+ ZU.xpath = function (node, xpath, ns) {
+ var nodes = [];
+ var i;
+ var result = doc.evaluate(xpath, node, ns, XPathResult.ANY_TYPE, null);
+ while (i = result.iterateNext()) nodes.push(i);
+ if (nodes.length > 0) return nodes;
+ return null;
+ }
+ }
+
+ var list = ZU.xpath(doc, '//div[@id="search"]//ol[@id="rso"]/li/div[@class="vsc"]');
+ var i, node;
+ var items = [];
+ var names = {};
+ for (i in list) {
+ items[i] = new Zotero.Item("blogPost");
+ link = ZU.xpath(list[i], './span/h3/a')[0];
+ names[i] = link.textContent;
+ items[i].title = link.textContent;
+ items[i].url = link.href;
+ items[i].attachments.push({url:link.href,
+ title:"Blog Snapshot",
+ mimeType:"text/html"});
+ items[i].blogTitle = ZU.xpath(list[i], './/cite/a')[0].textContent;
+ node = ZU.xpath(list[i], './/div[@class="f kb"]')[0].textContent.match(/^(.*) by (.*)$/);
+ if (node) {
+ items[i].date = node[1];
+ items[i].creators.push(Zotero.Utilities.cleanAuthor(node[2], "author"));
+ }
+ }
+
+ Zotero.selectItems(names, function(names) {
+ var j;
+ for (j in names) {
+ items[j].complete();
+ }
+ });
+}
diff --git a/translators/Google Patents.js b/translators/Google Patents.js
@@ -1,14 +1,14 @@
{
- "translatorID":"d71e9b6d-2baa-44ed-acb4-13fe2fe592c0",
- "translatorType":4,
- "label":"Google Patents",
- "creator":"Adam Crymble",
- "target":"http://www\\.google.*/patents",
- "minVersion":"1.0.0b4.r5",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2010-07-09 07:46:31"
+ "translatorID": "d71e9b6d-2baa-44ed-acb4-13fe2fe592c0",
+ "label": "Google Patents",
+ "creator": "Adam Crymble",
+ "target": "^http://www\\.google.*/patents",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-16 14:00:40"
}
function detectWeb(doc, url) {
@@ -22,7 +22,6 @@ function detectWeb(doc, url) {
} else if(doc.location.href.match(/[?&]id=/)) {
return "patent";
}
-
}
//Google Patents Translator. Code by Adam Crymble
@@ -69,8 +68,8 @@ function scrape(doc, url) {
*/
//associate headings with contents.
- //extra field\
- //newItem.extra = '';
+ //extra field
+ newItem.extra = '';
for (fieldTitle in dataTags) {
Zotero.debug(fieldTitle);
@@ -96,28 +95,27 @@ function scrape(doc, url) {
newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventor"], "inventor"));
}
- if (fieldTitle == "U.S. Classification" ) {
- newItem.extra += "U.S. Classification: " + dataTags["U.S. Classification"]+"\n";
+ if (fieldTitle == "Current U.S. Classification" ) {
+ newItem.extra += "U.S. Classification: " + dataTags["Current U.S. Classification"]+"\n";
} else if (fieldTitle == "International Classification" ) {
newItem.extra += "International Classification: " + dataTags["International Classification"]+"\n";
- } else if (fieldTitle == "Filing date" ) {
- newItem.extra += "Filing Date: " + dataTags["Filing date"]+"\n";
} else if (fieldTitle == "Publication number" ) {
newItem.extra += "Publication number: " +dataTags["Publication number"]+"\n";
}
}
-
-
associateData (newItem, dataTags, "Patent number", "patentNumber");
associateData (newItem, dataTags, "Issue date", "date");
+ associateData (newItem, dataTags, "Filing date", "filingDate");
associateData (newItem, dataTags, "Assignees", "assignee");
associateData (newItem, dataTags, "Assignee", "assignee");
associateData (newItem, dataTags, "Abstract", "abstractNote");
associateData (newItem, dataTags, "Application number", "applicationNumber");
- newItem.title = doc.evaluate('//h1[@class="title"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
- newItem.url = doc.location.href;
+ var pdf = doc.evaluate('//div[@class="g-button-basic"]/span/span/a[contains(@href,"/download/)]', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
+ if (pdf) newItem.attachments.push({url:pdf.href, title:"Google Patents PDF", mimeType:"application/pdf"});
+ newItem.title = doc.evaluate('//h1[@class="gb-volume-title"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ newItem.url = doc.location.href.replace(/(^[^\?]*\?id=[a-zA-Z0-9]+).*/,"$1");
newItem.complete();
}
@@ -125,17 +123,55 @@ function scrape(doc, url) {
function doWeb(doc, url) {
var host = 'http://' + doc.location.host + "/";
- var articles = new Array();
if (detectWeb(doc, url) == "multiple") {
- var items = Zotero.Utilities.getItemArray(doc, doc, /\/patents\/about\?id=/);
- items = Zotero.selectItems(items);
- if(!items) return true;
- for (var i in items) {
- articles.push(i);
- }
+ var items = Zotero.Utilities.getItemArray(doc, doc, /\/patents(?:\/about)?\?id=/);
+ Zotero.selectItems(items, function (items) {
+ var articles = new Array();
+ for (var i in items) {
+ articles.push(i);
+ }
+ Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
+ Zotero.wait();
+ });
} else {
- articles.push(url);
+ scrape(doc);
}
- Zotero.wait();
- Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
}
+
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://www.google.com/patents/about?id=j5NSAAAAEBAJ",
+ "items": [
+ {
+ "itemType": "patent",
+ "creators": [
+ {
+ "firstName": "T.",
+ "lastName": "SHOOK",
+ "creatorType": "inventor"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "U.S. Classification: 215/273",
+ "patentNumber": "1065211",
+ "date": "Jun 17, 1913",
+ "filingDate": "Aug 3, 1912",
+ "title": "BOTTLE-STOPPER",
+ "url": "http://www.google.com/patents/about?id=j5NSAAAAEBAJ",
+ "libraryCatalog": "Google Patents"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://www.google.com/search?tbm=pts&tbo=1&hl=en&q=book&btnG=Search+Patents",
+ "items": "multiple"
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Google Scholar.js b/translators/Google Scholar.js
@@ -1,15 +1,15 @@
{
- "translatorID": "57a00950-f0d1-4b41-b6ba-44ff0fc30289",
- "label": "Google Scholar",
- "creator": "Simon Kornblith, Frank Bennett",
- "target": "^https?://scholar\\.google\\.(?:com|com?\\.[a-z]{2}|[a-z]{2}|co\\.[a-z]{2})/scholar(?:_case)*",
- "minVersion": "2.1.9",
- "maxVersion": "",
- "priority": 100,
- "inRepository": true,
- "translatorType": 4,
- "browserSupport": "gcs",
- "lastUpdated": "2011-07-02 13:33:19"
+ "translatorID": "57a00950-f0d1-4b41-b6ba-44ff0fc30289",
+ "label": "Google Scholar",
+ "creator": "Simon Kornblith, Frank Bennett",
+ "target": "^https?://scholar\\.google\\.(?:com|com?\\.[a-z]{2}|[a-z]{2}|co\\.[a-z]{2})/scholar(?:_case)*",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-04 13:18:22"
}
/*
@@ -181,6 +181,9 @@ function processFactories(factories) {
// Has BibTeX data with title, pass it through to the BibTeX translator
attachments = factory.getAttachments("Page");
bibtexTranslator.setString(res);
+ bibtexTranslator.setHandler("done", function() {
+ processFactories(factories);
+ });
bibtexTranslator.translate();
} else {
// If BibTeX is empty, this is some kind of case, if anything.
diff --git a/translators/Highwire 2.0.js b/translators/Highwire 2.0.js
@@ -3,13 +3,12 @@
"label": "Highwire 2.0",
"creator": "Matt Burton",
"target": "(content/([0-9]+/[0-9]+|current|firstcite|early)|search\\?submit=|search\\?fulltext=|cgi/collection/.+)",
- "minVersion": "2,1",
+ "minVersion": "2.1",
"maxVersion": "",
"priority": 100,
"inRepository": true,
"translatorType": 4,
- "browserSupport": "gcs",
- "lastUpdated": "2011-07-03 03:57:24"
+ "lastUpdated": "2011-07-29 01:21:09"
}
/*
@@ -24,17 +23,22 @@
4. M L Giger et al., “Pulmonary nodules: computer-aided detection in digital chest images.,” Radiographics 10, no. 1 (January 1990): 41-51.
http://radiographics.rsna.org/content/10/1/41.abstract
5. Mitch Leslie, "CLIP catches enzymes in the act," The Journal of Cell Biology 191, no. 1 (October 4, 2010): 2.
- http://jcb.rupress.org/content/191/1/2.2.short
+ http://jcb.rupress.org/content/191/1/2.2.short
*/
function detectWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
var highwiretest = false;
highwiretest = url.match(/\.pdf+html\?frame=header/);
if (!highwiretest) {
// lets hope this installations don't tweak this...
- highwiretest = doc.evaluate("//link[@href = '/shared/css/hw-global.css']", doc, null, XPathResult.ANY_TYPE, null).iterateNext();
+ highwiretest = doc.evaluate("//link[@href = '/shared/css/hw-global.css']", doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
}
if(highwiretest) {
@@ -55,8 +59,12 @@ function detectWeb(doc, url) {
}
}
-var host;
function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
if (!url) url = doc.documentElement.location;
else if (url.match(/\?frame=header/)) {
// recall all this using new url
@@ -69,8 +77,9 @@ function doWeb(doc, url) {
return true;
}
- host = 'http://' + doc.location.host + "/";
+ var host = 'http://' + doc.location.host + "/";
+ var arts = new Array();
if (detectWeb(doc, url) == "multiple") {
var items = new Object();
if (doc.title.match("Table of Contents")
@@ -87,47 +96,40 @@ function doWeb(doc, url) {
var titlex = './/span[contains(@class,"cit-title")]';
}
var linkx = './/a[1]';
- var searchres = doc.evaluate(searchx, doc, null, XPathResult.ANY_TYPE, null);
+ var searchres = doc.evaluate(searchx, doc, nsResolver, XPathResult.ANY_TYPE, null);
var next_res;
while (next_res = searchres.iterateNext()) {
- var title = doc.evaluate(titlex, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
- var link = doc.evaluate(linkx, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().href;
+ var title = doc.evaluate(titlex, next_res, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var link = doc.evaluate(linkx, next_res, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
items[link] = title;
}
- Zotero.selectItems(items, function(items) {
- if(!items) return;
-
- var arts = [];
- for (var i in items) {
- arts.push(i);
- }
- processArticles(arts);
- });
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ arts.push(i);
+ }
} else {
- processArticles([url]);
+ arts = [url];
}
-
- Zotero.wait();
-}
-
-function processArticles(arts) {
- if(arts.length == 0) {
+ var newurls = new Array();
+ for each (var i in arts) {
+ newurls.push(i);
+ }
+ if(arts.length == 0) {
Zotero.debug('no items');
return false;
}
- var newurls = arts.slice();
Zotero.Utilities.HTTP.doGet(arts, function(text) {
var id, match, newurl, pdfurl, get;
/* Here, we have to use three phrasings because they all occur, depending on
the journal.
- TODO We should rewrite this to not use regex! */
+ TODO We should rewrite this to not use regex! */
match = text.match(/=([^=]+)\">\s*Download (C|c)itation/);
if (!match || match.length < 1) {
match = text.match(/=([^=]+)\">\s*Download to citation manager/);
if (!match || match.length < 1) {
// Journal of Cell Biology
- match = text.match(/=([^=]+)\">\s*Add to Citation Manager/);
- }
+ match = text.match(/=([^=]+)\">\s*Add to Citation Manager/);
+ }
}
id = match[1];
newurl = newurls.shift();
@@ -161,173 +163,25 @@ function processArticles(arts) {
translator.translate();
});
});
+ Zotero.wait();
}
-
-
/** BEGIN TEST CASES **/
var testCases = [
{
"type": "web",
- "url": "http://jcb.rupress.org/content/191/1/2.2.short",
- "items": [
- {
- "itemType": "journalArticle",
- "creators": [
- {
- "lastName": "Leslie",
- "firstName": "Mitch",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [],
- "seeAlso": [],
- "attachments": [
- {
- "url": false,
- "title": "Snapshot",
- "mimeType": "text/html"
- },
- {
- "url": false,
- "title": "Full Text PDF",
- "mimeType": "application/pdf"
- }
- ],
- "title": "CLIP catches enzymes in the act ",
- "date": "October 04 , 2010",
- "publicationTitle": "The Journal of Cell Biology ",
- "pages": "2 ",
- "volume": "191 ",
- "issue": "1 ",
- "url": "http://jcb.rupress.org/content/191/1/2.2.short ",
- "DOI": "10.1083/jcb.1911iti2 ",
- "libraryCatalog": "Highwire 2.0"
- }
- ]
- },
- {
- "type": "web",
- "url": "http://radiographics.rsna.org/content/10/1/41.abstract",
- "items": [
- {
- "itemType": "journalArticle",
- "creators": [
- {
- "lastName": "Giger",
- "firstName": "M L",
- "creatorType": "author"
- },
- {
- "lastName": "Doi",
- "firstName": "K",
- "creatorType": "author"
- },
- {
- "lastName": "MacMahon",
- "firstName": "H",
- "creatorType": "author"
- },
- {
- "lastName": "Metz",
- "firstName": "C E",
- "creatorType": "author"
- },
- {
- "lastName": "Yin",
- "firstName": "F F",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [],
- "seeAlso": [],
- "attachments": [
- {
- "url": false,
- "title": "Snapshot",
- "mimeType": "text/html"
- },
- {
- "url": false,
- "title": "Full Text PDF",
- "mimeType": "application/pdf"
- }
- ],
- "title": "Pulmonary nodules: computer-aided detection in digital chest images. ",
- "date": "January 01 , 1990",
- "publicationTitle": "Radiographics ",
- "pages": "41 -51 ",
- "volume": "10 ",
- "issue": "1 ",
- "url": "http://radiographics.rsna.org/content/10/1/41.abstract ",
- "abstractNote": "Currently, radiologists fail to detect pulmonary nodules in up to 30% of cases with actually positive findings. Diagnoses may be missed due to camouflaging effects of anatomic background, subjective and varying decision criteria, or distractions in clinical situations. We developed a computerized method to detect locations of lung nodules in digital chest images. The method is based on a difference-image approach and feature-extraction techniques, including growth, slope, and profile tests. Computer results were used to alert 12 radiologists to possible nodule locations in 60 clinical cases. Preliminary results suggest that computer aid can improve the detection performance of radiologists. ",
- "libraryCatalog": "Highwire 2.0",
- "shortTitle": "Pulmonary nodules"
- }
- ]
- },
- {
- "type": "web",
- "url": "http://bjaesthetics.oxfordjournals.org/content/50/2/121.abstract",
+ "url": "http://rer.sagepub.com/content/52/2/201.abstract",
"items": [
{
"itemType": "journalArticle",
"creators": [
{
- "lastName": "Maes",
- "firstName": "Hans",
+ "lastName": "Hofstein",
+ "firstName": "Avi",
"creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [],
- "seeAlso": [],
- "attachments": [
- {
- "url": false,
- "title": "Snapshot",
- "mimeType": "text/html"
},
{
- "url": false,
- "title": "Full Text PDF",
- "mimeType": "application/pdf"
- }
- ],
- "title": "Intention, Interpretation, and Contemporary Visual Art ",
- "date": "April 01 , 2010",
- "publicationTitle": "The British Journal of Aesthetics ",
- "pages": "121 -138 ",
- "volume": "50 ",
- "issue": "2 ",
- "url": "http://bjaesthetics.oxfordjournals.org/content/50/2/121.abstract ",
- "abstractNote": "The role of the artist's intention in the interpretation of art has been the topic of a lively and ongoing discussion in analytic aesthetics. First, I sketch the current state of this debate, focusing especially on two competing views: actual and hypothetical intentionalism. Secondly, I discuss the search for a suitable test case, that is, a work of art that is interpreted differently by actual and hypothetical intentionalists, with only one of these interpretations being plausible. Many examples from many different art forms have been considered in this respect, but none of these test cases has proved convincing. Thirdly, I introduce two new test cases taken from contemporary visual art. I explain why these examples are better suited as test cases and how they lend support to the actual intentionalist position. ",
- "DOI": "10.1093/aesthj/ayp051 ",
- "libraryCatalog": "Highwire 2.0"
- }
- ]
- },
- {
- "type": "web",
- "url": "http://joeg.oxfordjournals.org/content/10/3/331.abstract",
- "items": [
- {
- "itemType": "journalArticle",
- "creators": [
- {
- "lastName": "Clark",
- "firstName": "Gordon L.",
- "creatorType": "author"
- },
- {
- "lastName": "Durán-Fernández",
- "firstName": "Roberto",
- "creatorType": "author"
- },
- {
- "lastName": "Strauss",
- "firstName": "Kendra",
+ "lastName": "Lunetta",
+ "firstName": "Vincent N.",
"creatorType": "author"
}
],
@@ -346,40 +200,30 @@ var testCases = [
"mimeType": "application/pdf"
}
],
- "title": "‘Being in the market’: the UK house-price bubble and the intended structure of individual pension investment portfolios ",
- "date": "May 01 , 2010",
- "publicationTitle": "Journal of Economic Geography ",
- "pages": "331 -359 ",
- "volume": "10 ",
- "issue": "3 ",
- "url": "http://joeg.oxfordjournals.org/content/10/3/331.abstract ",
- "abstractNote": "It is widely observed that being in the market gives financial traders access to knowledge and information not available to remote traders. A truism of the geography of finance, it is also a perspective that can shed light on the interaction between market location, global financial movements and personal welfare. In this article, we develop an explanation of the premium attached to being in the market, drawing upon previous contributions on the relevance of tacit knowledge and the insights provided by behavioural finance with respect to time–space myopia. To illustrate our model of four types of behaviour, mixing together various combinations of time and space conceptions of market performance, we analyse the intended retirement investment portfolios of nearly 2400 participants in a defined contribution pension plan sponsored by a London-based investment bank. Having demonstrated the empirical significance of the UK house-price bubble, respondents’ retirement investment portfolios are analysed focusing upon the relative significance of property in relation to a range of other investment instruments. It is shown that, amongst similarly located respondents, there was a range of investment strategies dependent, in part, upon respondents’ age, household status, job classification and income. These results allow us to distinguish between different types of behaviour even amongst well-placed respondents, providing evidence of the co-existence of sophisticated, naive and opportunistic investors against the base-case of time–space myopic behaviour. Implications are drawn for conceptualising a rapprochement between the insights of the behavioural revolution for economic geography (and in particular, the geography of finance) relevant for public policy. ",
- "DOI": "10.1093/jeg/lbp034 ",
+ "title": "The Role of the Laboratory in Science Teaching: Neglected Aspects of Research",
+ "date": "Summer 1982",
+ "publicationTitle": "Review of Educational Research",
+ "pages": "201 -217",
+ "volume": "52",
+ "issue": "2",
+ "url": "http://rer.sagepub.com/content/52/2/201.abstract",
+ "abstractNote": "The laboratory has been given a central and distinctive role in science education, and science educators have suggested that there are rich benefits in learning from using laboratory activities. At this time, however, some educators have begun to question seriously the effectiveness and the role of laboratory work, and the case for laboratory teaching is not as self-evident as it once seemed. This paper provides perspectives on these issues through a review of the history, goals, and research findings regarding the laboratory as a medium of instruction in introductory science teaching. The analysis of research culminates with suggestions for researchers who are working to clarify the role of the laboratory in science education.",
+ "DOI": "10.3102/00346543052002201",
"libraryCatalog": "Highwire 2.0",
- "shortTitle": "‘Being in the market’"
+ "shortTitle": "The Role of the Laboratory in Science Teaching"
}
]
},
{
"type": "web",
- "url": "http://joeg.oxfordjournals.org/content/6/5/571",
+ "url": "http://sag.sagepub.com/content/early/2010/04/23/1046878110366277.abstract",
"items": [
{
"itemType": "journalArticle",
"creators": [
{
- "lastName": "Agrawal",
- "firstName": "Ajay",
- "creatorType": "author"
- },
- {
- "lastName": "Cockburn",
- "firstName": "Iain",
- "creatorType": "author"
- },
- {
- "lastName": "McHale",
- "firstName": "John",
+ "lastName": "Owens",
+ "firstName": "Trevor",
"creatorType": "author"
}
],
@@ -398,45 +242,37 @@ var testCases = [
"mimeType": "application/pdf"
}
],
- "title": "Gone but not forgotten: knowledge flows, labor mobility, and enduring social relationships ",
- "date": "November 2006 ",
- "publicationTitle": "Journal of Economic Geography ",
- "pages": "571 -591 ",
- "volume": "6 ",
- "issue": "5 ",
- "url": "http://joeg.oxfordjournals.org/content/6/5/571.abstract ",
- "abstractNote": "We examine the role of social relationships in facilitating knowledge flows by estimating the flow premium captured by a mobile inventor's previous location. Once an inventor has moved, they are gone—but are they forgotten? We find that knowledge flows to an inventor's prior location are approximately 50% greater than if they had never lived there, suggesting that social relationships, not just physical proximity, are important for determining flow patterns. Furthermore, we find that a large portion of this social effect is mediated by institutional links; however, this is not the result of corporate knowledge management systems but rather of personal relationships formed through co-location within an institutional context that endure over time, space, and organizational boundaries. Moreover, we find the effect is nearly twice as large for knowledge flows across as compared to within fields, suggesting that co-location may substitute for communities of practice in determining flow patterns. ",
- "DOI": "10.1093/jeg/lbl016 ",
+ "title": "Modding the History of Science: Values at Play in Modder Discussions of Sid Meier’s CIVILIZATION",
+ "date": "May 27 , 2010",
+ "publicationTitle": "Simulation & Gaming",
+ "url": "http://sag.sagepub.com/content/early/2010/04/23/1046878110366277.abstract",
+ "abstractNote": "Sid Meier’s CIVILIZATION has been promoted as an educational tool, used as a platform for building educational simulations, and maligned as promoting Eurocentrism, bioimperialism, and racial superiority. This article explores the complex issues involved in interpreting a game through analysis of the ways modders (gamers who modify the game) have approached the history of science, technology, and knowledge embodied in the game. Through text analysis of modder discussion, this article explores the assumed values and tone of the community’s discourse. The study offers initial findings that CIVILIZATION modders value a variety of positive discursive practices for developing historical models. Community members value a form of historical authenticity, they prize subtlety and nuance in models for science in the game, and they communicate through civil consensus building. Game theorists, players, and scholars, as well as those interested in modeling the history, sociology, and philosophy of science, will be interested to see the ways in which CIVILIZATION III cultivates an audience of modders who spend their time reimagining how science and technology could work in the game.",
+ "DOI": "10.1177/1046878110366277",
"libraryCatalog": "Highwire 2.0",
- "shortTitle": "Gone but not forgotten"
+ "shortTitle": "Modding the History of Science"
}
]
},
{
"type": "web",
- "url": "http://www.sciencemag.org/content/332/6034/1149.11.full?rss=1",
+ "url": "http://scx.sagepub.com/content/30/2/277.abstract",
"items": [
{
"itemType": "journalArticle",
"creators": [
{
- "lastName": "Balmford",
- "firstName": "Andrew",
- "creatorType": "author"
- },
- {
- "lastName": "Kroshko",
- "firstName": "Jeanette",
+ "lastName": "Mulder",
+ "firstName": "Henk A. J.",
"creatorType": "author"
},
{
- "lastName": "Leader-Williams",
- "firstName": "Nigel",
+ "lastName": "Longnecker",
+ "firstName": "Nancy",
"creatorType": "author"
},
{
- "lastName": "Mason",
- "firstName": "Georgia",
+ "lastName": "Davis",
+ "firstName": "Lloyd S.",
"creatorType": "author"
}
],
@@ -455,22 +291,18 @@ var testCases = [
"mimeType": "application/pdf"
}
],
- "title": "Zoos and Captive Breeding ",
- "date": "June 03 , 2011",
- "publicationTitle": "Science ",
- "pages": "1149 -1150 ",
- "volume": "332 ",
- "issue": "6034 ",
- "url": "http://www.sciencemag.org/content/332/6034/1149.11.short ",
- "DOI": "10.1126/science.332.6034.1149-k ",
+ "title": "The State of Science Communication Programs at Universities Around the World",
+ "date": "December 01 , 2008",
+ "publicationTitle": "Science Communication",
+ "pages": "277 -287",
+ "volume": "30",
+ "issue": "2",
+ "url": "http://scx.sagepub.com/content/30/2/277.abstract",
+ "abstractNote": "Building on discussions at two workshops held at the recent 10th International Conference on the Public Communication of Science and Technology during June 2008 in Malmö, Sweden, this article proposes specific steps toward achieving a common understanding of the essential elements for academic programs in science communication. About 40 academics, science communication professionals, and students from at least 16 countries participated in this process.",
+ "DOI": "10.1177/1075547008324878",
"libraryCatalog": "Highwire 2.0"
}
]
- },
- {
- "type": "web",
- "url": "http://www.journalofvision.org/search?fulltext=tooth&submit=yes&x=0&y=0",
- "items": "multiple"
}
]
-/** END TEST CASES **/
-\ No newline at end of file
+/** END TEST CASES **/
diff --git a/translators/IGN.js b/translators/IGN.js
@@ -0,0 +1,68 @@
+{
+ "translatorID":"d210c5a1-73e1-41ad-a3c9-331d5a3ead48",
+ "label":"IGN",
+ "creator":"odie5533",
+ "target":"^http://[^/]*\\.ign\\.com/",
+ "minVersion":"1.0",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":"1",
+ "translatorType":4,
+ "lastUpdated":"2010-08-12 16:16:53"
+}
+
+/*
+ IGN Translator - Parses IGN articles and creates Zotero-based metadata
+ Copyright (C) 2010-2011 odie5533
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+function detectWeb(doc, url) {
+ if (url.match(/articles/)) {
+ return "webpage";
+ }
+}
+
+function scrape(doc, url) {
+ var newItem = new Zotero.Item("webpage");
+ newItem.publicationTitle = "IGN";
+ newItem.url = doc.location.href;
+ newItem.title = doc.title.replace(/ - [^-]+ at IGN/, "");
+
+ // pages
+ var pages = doc.evaluate('//div[@class="ui-page-list clear"]/ul/li[last()-1]', doc, null, XPathResult.ANY_TYPE, null);
+ if (p = pages.iterateNext())
+ newItem.pages = p.textContent;
+
+ // date
+ var dates = doc.evaluate('//h2[@class="publish-date"]/text()', doc, null, XPathResult.ANY_TYPE, null);
+ newItem.date = dates.iterateNext().textContent.replace(/^\s+|\s+$/g,'');
+
+ //authors
+ var byline = doc.evaluate('//div[@class="hdr-sub byline"]/a/text()', doc, null, XPathResult.ANY_TYPE, null);
+ var authors = byline.iterateNext().textContent.split(" and ");
+ for each(var a in authors) {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(a, "author"));
+ }
+
+ // attach html
+ newItem.attachments.push({title:"IGN Article Snapshot", document:doc});
+
+ newItem.complete();
+}
+
+function doWeb(doc, url) {
+ scrape(doc, url);
+}
diff --git a/translators/ISI Web of Knowledge.js b/translators/ISI Web of Knowledge.js
@@ -1,14 +1,14 @@
{
- "translatorID":"594ebe3c-90a0-4830-83bc-9502825a6810",
- "translatorType":4,
- "label":"ISI Web of Knowledge",
- "creator":"Michael Berkowitz",
- "target":"(WOS_GeneralSearch|product=WOS|product=CABI)",
- "minVersion":"2.0",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2010-04-01 22:50:00"
+ "translatorID": "594ebe3c-90a0-4830-83bc-9502825a6810",
+ "label": "ISI Web of Knowledge",
+ "creator": "Michael Berkowitz, Avram Lyon",
+ "target": "(WOS_GeneralSearch|product=WOS|product=CABI)",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 5,
+ "lastUpdated": "2011-08-01 16:50:59"
}
function detectWeb(doc, url) {
@@ -29,13 +29,23 @@ function doWeb(doc, url) {
while (next_title = titles.iterateNext()) {
items[next_title.href.match(/\?(.*)/)[1]] = next_title.textContent;
}
- items = Zotero.selectItems(items);
- for (var i in items) {
- ids.push(i);
- }
+ Zotero.selectItems(items, function (items) {
+ for (var i in items) {
+ ids.push(i);
+ }
+ fetchIds(ids, url);
+ });
} else {
ids.push(url.match(/\?(.*)/)[1]);
+ fetchIds(ids, url);
}
+}
+
+function fetchIds(ids, url) {
+ // Call yourself
+ var importer = Zotero.loadTranslator("import");
+ importer.setTranslator("594ebe3c-90a0-4830-83bc-9502825a6810");
+
var hostRegexp = new RegExp("^(https?://[^/]+)/");
var m = hostRegexp.exec(url);
var host = m[1];
@@ -43,74 +53,814 @@ function doWeb(doc, url) {
ids[i] = host+"/full_record.do?" + ids[i];
}
var product = url.match("product=([^\&]+)\&")[1];
- for (var i=0 ; i<ids.length; i++) {
- newDoc = Zotero.Utilities.retrieveDocument(ids[i]);
+ Zotero.Utilities.processDocuments(ids, function (newDoc) {
var url = newDoc.location.href;
var sid = newDoc.evaluate('//input[@name="selectedIds"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
var nid = newDoc.evaluate('//input[@name="SID"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
var post2 = 'product='+product+'&product_sid=' + nid + '&plugin=&product_st_thomas=http://esti.isiknowledge.com:8360/esti/xrpc&export_ref.x=0&export_ref.y=0';
var post = 'action=go&mode=quickOutput&product='+product+'&SID=' + nid + '&format=ref&fields=BibAbs&mark_id='+product+'&count_new_items_marked=0&selectedIds=' + sid + '&qo_fields=bib&endnote.x=95&endnote.y=12&save_options=default';
- Zotero.Utilities.HTTP.retrieveSource('http://apps.isiknowledge.com/OutboundService.do', post);
- var text = Zotero.Utilities.HTTP.retrieveSource('http://pcs.isiknowledge.com/uml/uml_view.cgi', post2);
- var lines = text.split("\n");
- var field = " ";
- var content = " ";
- var item = new Zotero.Item("journalArticle");
- item.url = url;
- var authors;
- var fieldRe = /^[A-Z0-9]{2}(?: |$)/;
- for each(var line in lines) {
- if(line.match(fieldRe)) {
- field = line.match(fieldRe)[0].substr(0,2);
- content = line.substr(3);
- if ((field == "AF" || field == "AU")) {
- if (!item.creators[0]) {
- var author = content.split(",");
- item.creators.push({firstName:author[1], lastName:author[0], creatorType:"author"});
- } else {
- field = "";
- }
- } else if (field == "TI") {
- item.title = content;
- } else if (field == "SO") {
- // People say ISI is bad about being all-caps; let's try this for now
- // http://forums.zotero.org/discussion/17316
- if (content.toUpperCase() == content) Zotero.Utilities.capitalizeTitle(content.toLowerCase(), true);
- item.publicationTitle = content;
- } else if (field == "SN") {
- item.ISSN = content;
- } else if (field == "PD" || field == "PY") {
- if (item.date) {
- item.date += " " + content;
- } else {
- item.date = content;
- }
- } else if (field == "VL") {
- item.volume = content;
- } else if (field == "IS") {
- item.issue = content;
- } else if (field == "BP") {
- item.pages = content;
- } else if (field == "EP") {
- item.pages += "-" + content;
- } else if (field == "AB") {
- item.abstractNote = content;
- } else if (field == "DI") {
- item.DOI = content;
- }
+ Zotero.Utilities.doPost('http://apps.isiknowledge.com/OutboundService.do', post, function (text, obj) {
+ Zotero.Utilities.doPost('http://pcs.isiknowledge.com/uml/uml_view.cgi', post2, function (text, obj) {
+ //Zotero.debug(text);
+ importer.setString(text);
+ importer.setHandler("itemDone", function (obj, item) {
+ item.attachments = [{url: url, type: "text/html", title: "ISI Web of Knowledge Record"}];
+ item.complete();
+ });
+ importer.translate();
+ });
+ });
+ }, function() {});
+ Zotero.wait();
+}
+
+function detectImport() {
+ var line;
+ var i = 0;
+ while((line = Zotero.read()) !== false) {
+ line = line.replace(/^\s+/, "");
+ if(line != "") {
+ if(line.substr(0, 4).match(/^PT [A-Z]/)) {
+ return true;
} else {
- content = Zotero.Utilities.trimInternal(line);
- if (field == "AF" || field == "AU") {
- var author = content.split(",");
- item.creators.push({firstName:author[1], lastName:author[0], creatorType:"author"});
- } else if (field == "TI") {
- item.title += " " + content;
- } else if (field == "AB") {
- item.abstractNote += " " + content;
+ if(i++ > 3) {
+ return false;
}
}
}
- item.attachments = [{url:item.url, title:"ISI Web of Knowledge Snapshot", mimeType:"text/html"}];
- item.complete();
}
}
+
+function processTag(item, field, content) {
+ var map = {
+ "J": "journalArticle",
+ "S": "bookSection", // Not sure
+ "P": "patent",
+ "B": "book"
+ };
+ if (field == "PT") {
+ item.itemType = map[content];
+ if (item.itemType === undefined) {
+ item.itemType = "journalArticle";
+ Zotero.debug("Unknown type: " + content);
+ }
+ } else if ((field == "AF" || field == "AU")) {
+ //Z.debug(content);
+ authors = content.split("\n");
+ for each (var i in authors) {
+ var author = i.split(",");
+ item.creators[0][field].push({firstName:author[1].trim(),
+ lastName:author[0].trim(),
+ creatorType:"author"});
+ }
+ } else if ((field == "BE")) {
+ //Z.debug(content);
+ authors = content.split("\n");
+ for each (var i in authors) {
+ var author = i.split(",");
+ item.creators[1].push({firstName:author[1].trim(),
+ lastName:author[0].trim(),
+ creatorType:"editor"});
+ }
+ } else if (field == "TI") {
+ item.title = content;
+ } else if (field == "JI") {
+ item.journalAbbreviation = content;
+ } else if (field == "SO") {
+ item.publicationTitle = content;
+ } else if (field == "SN") {
+ item.ISSN = content;
+ } else if (field == "BN") {
+ item.ISBN = content;
+ } else if (field == "PD" || field == "PY") {
+ if (item.date) {
+ item.date += " " + content;
+ } else {
+ item.date = content;
+ }
+ var year = item.date.match(/\d{4}/);
+ // If we have a double year, eliminate one
+ if (year && item.date.replace(year,"").indexOf(year) !== -1)
+ item.date = item.date.replace(year,"");
+ } else if (field == "VL") {
+ item.volume = content;
+ } else if (field == "IS") {
+ item.issue = content;
+ } else if (field == "UT") {
+ item.extra += content;
+ } else if (field == "BP") {
+ item.pages = content;
+ } else if (field == "EP") {
+ item.pages += "-" + content;
+ } else if (field == "AB") {
+ item.abstractNote = content;
+ } else if (field == "PI" || field == "C1") {
+ item.place = content;
+ } else if (field == "LA") {
+ item.language = content;
+ } else if (field == "PU") {
+ item.publisher = content;
+ // Patent stuff
+ } else if (field == "DG") {
+ item.issueDate = content;
+ } else if (field == "PN") {
+ item.patentNumber = content;
+ } else if (field == "AE") {
+ item.assignee = content;
+ } else if (field == "PL") { // not sure...
+ item.priorityNumber = content;
+ } else if (field == "PC") { // use for patents
+ item.country = content;
+ // A whole mess of tags
+ } else if (field == "DE" || field == "BD"
+ || field == "OR" || field == "ID"
+ || field == "MC" || field == "MQ") {
+ item.tags = item.tags.concat(content.split(";"));
+ } else if (field == "DI") {
+ item.DOI = content;
+ } else {
+ Zotero.debug("Discarding: " + field + " => "+content);
+ }
+}
+
+function completeItem(item) {
+ var i;
+ var creators = [];
+ // If we have full names, drop the short ones
+ if (item.creators[0]["AF"].length) {
+ creators = item.creators[0]["AF"];
+ } else {
+ creators = item.creators[0]["AU"];
+ }
+ // Add other creators
+ if (item.creators[1])
+ item.creators = creators.concat(item.creators[1]);
+ else
+ item.creators = creators;
+
+ // If we have a patent, change author to inventor
+ if (item.itemType == "patent") {
+ for (i in item.creators) {
+ if (item.creators[i].creatorType == "author") {
+ item.creators[i].creatorType = "inventor";
+ }
+ }
+ }
+
+ // Fix caps, trim in various places
+ for (i in item.tags) {
+ item.tags[i] = item.tags[i].trim();
+ if (item.tags[i].toUpperCase() == item.tags[i])
+ item.tags[i]=item.tags[i].toLowerCase();
+ }
+
+ var toFix = ["publisher", "publicationTitle", "place"];
+ for (i in toFix) {
+ var field = toFix[i];
+ if (item[field] && item[field].toUpperCase() == item[field])
+ item[field]=ZU.capitalizeTitle(item[field].toLowerCase(),true);
+ }
+
+ item.complete();
+}
+
+function doImport(text) {
+ var line = true;
+ var tag = data = false;
+ do { // first valid line is type
+ line = Zotero.read();
+ line = line.replace(/^\s+/, "");
+ } while(line !== false && !line.substr(0, 6).match(/^PT [A-Z]/));
+
+ var item = new Zotero.Item();
+ var i = 0;
+ item.creators = [{"AU":[], "AF":[]}, []];
+ item.extra = "";
+
+
+ var tag = "PT";
+
+ var data = line.substr(3);
+
+ var rawLine;
+ while((rawLine = Zotero.read()) !== false) { // until EOF
+ // trim leading space if this line is not part of a note
+ line = rawLine.replace(/^\s+/, "");
+ var split = line.match(/^([A-Z0-9]{2}) (?:([^\n]*))?/);
+ // Force a match for ER
+ if (line.substr(0,2) == "ER") split = ["","ER",""];
+ if(split) {
+ // if this line is a tag, take a look at the previous line to map
+ // its tag
+ if(tag) {
+ //Zotero.debug("tag: '"+tag+"'; data: '"+data+"'");
+ processTag(item, tag, data);
+ }
+
+ // then fetch the tag and data from this line
+ tag = split[1];
+ data = split[2];
+
+ if(tag == "ER") { // ER signals end of reference
+ // unset info
+ tag = data = false;
+ completeItem(item);
+ }
+ if(tag == "PT") {
+ // new item
+ item = new Zotero.Item();
+ item.creators = [{"AU":[], "AF":[]}, []];
+ item.extra = "";
+ i++;
+ }
+ } else {
+ // otherwise, assume this is data from the previous line continued
+ if(tag == "AU" || tag == "AF" || tag == "BE") {
+ //Z.debug(rawLine);
+ // preserve line endings for AU fields
+ data += rawLine.replace(/^ /,"\n");
+ } else if(tag) {
+ // otherwise, concatenate and avoid extra spaces
+ if(data[data.length-1] == " " || rawLine[0] == " ") {
+ data += rawLine;
+ } else {
+ data += " "+rawLine;
+ }
+ }
+ }
+ }
+
+ if(tag && tag != "ER") { // save any unprocessed tags
+ //Zotero.debug(tag);
+ processTag(item, tag, data);
+ completeItem(item);
+ }
+}
+
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "import",
+ "input": "FN Thomson Reuters Web of Knowledge\u000aVR 1.0\u000aPT J\u000aAU Zelle, Rintze M.\u000a Harrison, Jacob C.\u000a Pronk, Jack T.\u000a van Maris, Antonius J. A.\u000aTI Anaplerotic Role for Cytosolic Malic Enzyme in Engineered Saccharomyces\u000a cerevisiae Strains\u000aSO APPLIED AND ENVIRONMENTAL MICROBIOLOGY\u000aVL 77\u000aIS 3\u000aBP 732\u000aEP 738\u000aDI 10.1128/AEM.02132-10\u000aPD FEB 2011\u000aPY 2011\u000aAB Malic enzyme catalyzes the reversible oxidative decarboxylation of\u000a malate to pyruvate and CO(2). The Saccharomyces cerevisiae MAE1 gene\u000a encodes a mitochondrial malic enzyme whose proposed physiological roles\u000a are related to the oxidative, malate-decarboxylating reaction. Hitherto,\u000a the inability of pyruvate carboxylase-negative (Pyc(-)) S. cerevisiae\u000a strains to grow on glucose suggested that Mae1p cannot act as a\u000a pyruvate-carboxylating, anaplerotic enzyme. In this study, relocation of\u000a malic enzyme to the cytosol and creation of thermodynamically favorable\u000a conditions for pyruvate carboxylation by metabolic engineering, process\u000a design, and adaptive evolution, enabled malic enzyme to act as the sole\u000a anaplerotic enzyme in S. cerevisiae. The Escherichia coli NADH-dependent\u000a sfcA malic enzyme was expressed in a Pyc(-) S. cerevisiae background.\u000a When PDC2, a transcriptional regulator of pyruvate decarboxylase genes,\u000a was deleted to increase intracellular pyruvate levels and cells were\u000a grown under a CO(2) atmosphere to favor carboxylation, adaptive\u000a evolution yielded a strain that grew on glucose (specific growth rate,\u000a 0.06 +/- 0.01 h(-1)). Growth of the evolved strain was enabled by a\u000a single point mutation (Asp336Gly) that switched the cofactor preference\u000a of E. coli malic enzyme from NADH to NADPH. Consistently, cytosolic\u000a relocalization of the native Mae1p, which can use both NADH and NADPH,\u000a in a pyc1,2 Delta pdc2 Delta strain grown under a CO(2) atmosphere, also\u000a enabled slow-growth on glucose. Although growth rates of these strains\u000a are still low, the higher ATP efficiency of carboxylation via malic\u000a enzyme, compared to the pyruvate carboxylase pathway, may contribute to\u000a metabolic engineering of S. cerevisiae for anaerobic, high-yield\u000a C(4)-dicarboxylic acid production.\u000aTC 0\u000aZ9 0\u000aSN 0099-2240\u000aUT WOS:000286597100004\u000aER\u000a\u000aPT J\u000aAU Zelle, Rintze M.\u000a Trueheart, Josh\u000a Harrison, Jacob C.\u000a Pronk, Jack T.\u000a van Maris, Antonius J. A.\u000aTI Phosphoenolpyruvate Carboxykinase as the Sole Anaplerotic Enzyme in\u000a Saccharomyces cerevisiae\u000aSO APPLIED AND ENVIRONMENTAL MICROBIOLOGY\u000aVL 76\u000aIS 16\u000aBP 5383\u000aEP 5389\u000aDI 10.1128/AEM.01077-10\u000aPD AUG 2010\u000aPY 2010\u000aAB Pyruvate carboxylase is the sole anaplerotic enzyme in glucose-grown\u000a cultures of wild-type Saccharomyces cerevisiae. Pyruvate\u000a carboxylase-negative (Pyc(-)) S. cerevisiae strains cannot grow on\u000a glucose unless media are supplemented with C(4) compounds, such as\u000a aspartic acid. In several succinate-producing prokaryotes,\u000a phosphoenolpyruvate carboxykinase (PEPCK) fulfills this anaplerotic\u000a role. However, the S. cerevisiae PEPCK encoded by PCK1 is repressed by\u000a glucose and is considered to have a purely decarboxylating and\u000a gluconeogenic function. This study investigates whether and under which\u000a conditions PEPCK can replace the anaplerotic function of pyruvate\u000a carboxylase in S. cerevisiae. Pyc(-) S. cerevisiae strains\u000a constitutively overexpressing the PEPCK either from S. cerevisiae or\u000a from Actinobacillus succinogenes did not grow on glucose as the sole\u000a carbon source. However, evolutionary engineering yielded mutants able to\u000a grow on glucose as the sole carbon source at a maximum specific growth\u000a rate of ca. 0.14 h(-1), one-half that of the (pyruvate\u000a carboxylase-positive) reference strain grown under the same conditions.\u000a Growth was dependent on high carbon dioxide concentrations, indicating\u000a that the reaction catalyzed by PEPCK operates near thermodynamic\u000a equilibrium. Analysis and reverse engineering of two independently\u000a evolved strains showed that single point mutations in pyruvate kinase,\u000a which competes with PEPCK for phosphoenolpyruvate, were sufficient to\u000a enable the use of PEPCK as the sole anaplerotic enzyme. The PEPCK\u000a reaction produces one ATP per carboxylation event, whereas the original\u000a route through pyruvate kinase and pyruvate carboxylase is ATP neutral.\u000a This increased ATP yield may prove crucial for engineering of efficient\u000a and low-cost anaerobic production of C(4) dicarboxylic acids in S.\u000a cerevisiae.\u000aTC 1\u000aZ9 1\u000aSN 0099-2240\u000aUT WOS:000280633400006\u000aER\u000a\u000aPT J\u000aAU Zelle, Rintze M.\u000a De Hulster, Erik\u000a Kloezen, Wendy\u000a Pronk, Jack T.\u000a van Maris, Antonius J. A.\u000aTI Key Process Conditions for Production of C(4) Dicarboxylic Acids in\u000a Bioreactor Batch Cultures of an Engineered Saccharomyces cerevisiae\u000a Strain\u000aSO APPLIED AND ENVIRONMENTAL MICROBIOLOGY\u000aVL 76\u000aIS 3\u000aBP 744\u000aEP 750\u000aDI 10.1128/AEM.02396-09\u000aPD FEB 2010\u000aPY 2010\u000aAB A recent effort to improve malic acid production by Saccharomyces\u000a cerevisiae by means of metabolic engineering resulted in a strain that\u000a produced up to 59 g liter(-1) of malate at a yield of 0.42 mol (mol\u000a glucose)(-1) in calcium carbonate-buffered shake flask cultures. With\u000a shake flasks, process parameters that are important for scaling up this\u000a process cannot be controlled independently. In this study, growth and\u000a product formation by the engineered strain were studied in bioreactors\u000a in order to separately analyze the effects of pH, calcium, and carbon\u000a dioxide and oxygen availability. A near-neutral pH, which in shake\u000a flasks was achieved by adding CaCO(3), was required for efficient C(4)\u000a dicarboxylic acid production. Increased calcium concentrations, a side\u000a effect of CaCO(3) dissolution, had a small positive effect on malate\u000a formation. Carbon dioxide enrichment of the sparging gas (up to 15%\u000a [vol/vol]) improved production of both malate and succinate. At higher\u000a concentrations, succinate titers further increased, reaching 0.29 mol\u000a (mol glucose)(-1), whereas malate formation strongly decreased. Although\u000a fully aerobic conditions could be achieved, it was found that moderate\u000a oxygen limitation benefitted malate production. In conclusion, malic\u000a acid production with the engineered S. cerevisiae strain could be\u000a successfully transferred from shake flasks to 1-liter batch bioreactors\u000a by simultaneous optimization of four process parameters (pH and\u000a concentrations of CO(2), calcium, and O(2)). Under optimized conditions,\u000a a malate yield of 0.48 +/- 0.01 mol (mol glucose)(-1) was obtained in\u000a bioreactors, a 19% increase over yields in shake flask experiments.\u000aTC 2\u000aZ9 2\u000aSN 0099-2240\u000aUT WOS:000274017400015\u000aER\u000a\u000aPT J\u000aAU Abbott, Derek A.\u000a Zelle, Rintze M.\u000a Pronk, Jack T.\u000a van Maris, Antonius J. A.\u000aTI Metabolic engineering of Saccharomyces cerevisiae for production of\u000a carboxylic acids: current status and challenges\u000aSO FEMS YEAST RESEARCH\u000aVL 9\u000aIS 8\u000aBP 1123\u000aEP 1136\u000aDI 10.1111/j.1567-1364.2009.00537.x\u000aPD DEC 2009\u000aPY 2009\u000aAB To meet the demands of future generations for chemicals and energy and\u000a to reduce the environmental footprint of the chemical industry,\u000a alternatives for petrochemistry are required. Microbial conversion of\u000a renewable feedstocks has a huge potential for cleaner, sustainable\u000a industrial production of fuels and chemicals. Microbial production of\u000a organic acids is a promising approach for production of chemical\u000a building blocks that can replace their petrochemically derived\u000a equivalents. Although Saccharomyces cerevisiae does not naturally\u000a produce organic acids in large quantities, its robustness, pH tolerance,\u000a simple nutrient requirements and long history as an industrial workhorse\u000a make it an excellent candidate biocatalyst for such processes. Genetic\u000a engineering, along with evolution and selection, has been successfully\u000a used to divert carbon from ethanol, the natural endproduct of S.\u000a cerevisiae, to pyruvate. Further engineering, which included expression\u000a of heterologous enzymes and transporters, yielded strains capable of\u000a producing lactate and malate from pyruvate. Besides these metabolic\u000a engineering strategies, this review discusses the impact of transport\u000a and energetics as well as the tolerance towards these organic acids. In\u000a addition to recent progress in engineering S. cerevisiae for organic\u000a acid production, the key limitations and challenges are discussed in the\u000a context of sustainable industrial production of organic acids from\u000a renewable feedstocks.\u000aTC 11\u000aZ9 11\u000aSN 1567-1356\u000aUT WOS:000271264400001\u000aER\u000a\u000aPT J\u000aAU Zelle, Rintze M.\u000a de Hulster, Erik\u000a van Winden, WoUter A.\u000a de Waard, Pieter\u000a Dijkema, Cor\u000a Winkler, Aaron A.\u000a Geertman, Jan-Maarten A.\u000a van Dijken, Johannes P.\u000a Pronk, Jack T.\u000a van Maris, Antonius J. A.\u000aTI Malic acid production by Saccharomyces cerevisiae: Engineering of\u000a pyruvate carboxylation, oxaloacetate reduction, and malate export\u000aSO APPLIED AND ENVIRONMENTAL MICROBIOLOGY\u000aVL 74\u000aIS 9\u000aBP 2766\u000aEP 2777\u000aDI 10.1128/AEM.02591-07\u000aPD MAY 2008\u000aPY 2008\u000aAB Malic acid is a potential biomass-derivable \"building block\" for\u000a chemical synthesis. Since wild-type Saccharomyces cerevisiae strains\u000a produce only low levels of malate, metabolic engineering is required to\u000a achieve efficient malate production with this yeast. A promising pathway\u000a for malate production from glucose proceeds via carboxylation of\u000a pyruvate, followed by reduction of oxaloacetate to malate. This redox-\u000a and ATP-neutral, CO2-fixing pathway has a theoretical maximum yield of 2\u000a mol malate (mol glucose)(-1). A previously engineered glucose-tolerant,\u000a C-2-independent pyruvate decarboxylase-negative S. cerevisiae strain was\u000a used as the platform to evaluate the impact of individual and combined\u000a introduction of three genetic modifications: (i) overexpression of the\u000a native pyruvate carboxylase encoded by PYC2, (ii) high-level expression\u000a of an allele of the MDH3 gene, of which the encoded malate dehydrogenase\u000a was retargeted to the cytosol by deletion of the C-terminal peroxisomal\u000a targeting sequence, and (iii) functional expression of the\u000a Schizosaccharomyces pombe malate transporter gene SpMAE1. While single\u000a or double modifications improved malate production, the highest malate\u000a yields and titers were obtained with the simultaneous introduction of\u000a all three modifications. In glucose-grown batch cultures, the resulting\u000a engineered strain produced malate at titers of up to 59 g liter(-1) at a\u000a malate yield of 0.42 mol (mol glucose)(-1). Metabolic flux analysis\u000a showed that metabolite labeling patterns observed upon nuclear magnetic\u000a resonance analyses of cultures grown on C-13-labeled glucose were\u000a consistent with the envisaged nonoxidative, fermentative pathway for\u000a malate production. The engineered strains still produced substantial\u000a amounts of pyruvate, indicating that the pathway efficiency can be\u000a further improved.\u000aTC 15\u000aZ9 17\u000aSN 0099-2240\u000aUT WOS:000255567900024\u000aER\u000a\u000aEF",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Rintze M.",
+ "lastName": "Zelle",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jacob C.",
+ "lastName": "Harrison",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jack T.",
+ "lastName": "Pronk",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Antonius J. A.",
+ "lastName": "van Maris",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000286597100004",
+ "title": "Anaplerotic Role for Cytosolic Malic Enzyme in Engineered Saccharomyces cerevisiae Strains",
+ "publicationTitle": "Applied and Environmental Microbiology",
+ "volume": "77",
+ "issue": "3",
+ "pages": "732-738",
+ "DOI": "10.1128/AEM.02132-10",
+ "date": "FEB 2011",
+ "abstractNote": "Malic enzyme catalyzes the reversible oxidative decarboxylation of malate to pyruvate and CO(2). The Saccharomyces cerevisiae MAE1 gene encodes a mitochondrial malic enzyme whose proposed physiological roles are related to the oxidative, malate-decarboxylating reaction. Hitherto, the inability of pyruvate carboxylase-negative (Pyc(-)) S. cerevisiae strains to grow on glucose suggested that Mae1p cannot act as a pyruvate-carboxylating, anaplerotic enzyme. In this study, relocation of malic enzyme to the cytosol and creation of thermodynamically favorable conditions for pyruvate carboxylation by metabolic engineering, process design, and adaptive evolution, enabled malic enzyme to act as the sole anaplerotic enzyme in S. cerevisiae. The Escherichia coli NADH-dependent sfcA malic enzyme was expressed in a Pyc(-) S. cerevisiae background. When PDC2, a transcriptional regulator of pyruvate decarboxylase genes, was deleted to increase intracellular pyruvate levels and cells were grown under a CO(2) atmosphere to favor carboxylation, adaptive evolution yielded a strain that grew on glucose (specific growth rate, 0.06 +/- 0.01 h(-1)). Growth of the evolved strain was enabled by a single point mutation (Asp336Gly) that switched the cofactor preference of E. coli malic enzyme from NADH to NADPH. Consistently, cytosolic relocalization of the native Mae1p, which can use both NADH and NADPH, in a pyc1,2 Delta pdc2 Delta strain grown under a CO(2) atmosphere, also enabled slow-growth on glucose. Although growth rates of these strains are still low, the higher ATP efficiency of carboxylation via malic enzyme, compared to the pyruvate carboxylase pathway, may contribute to metabolic engineering of S. cerevisiae for anaerobic, high-yield C(4)-dicarboxylic acid production.",
+ "ISSN": "0099-2240"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Rintze M.",
+ "lastName": "Zelle",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Josh",
+ "lastName": "Trueheart",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jacob C.",
+ "lastName": "Harrison",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jack T.",
+ "lastName": "Pronk",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Antonius J. A.",
+ "lastName": "van Maris",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000280633400006",
+ "title": "Phosphoenolpyruvate Carboxykinase as the Sole Anaplerotic Enzyme in Saccharomyces cerevisiae",
+ "publicationTitle": "Applied and Environmental Microbiology",
+ "volume": "76",
+ "issue": "16",
+ "pages": "5383-5389",
+ "DOI": "10.1128/AEM.01077-10",
+ "date": "AUG 2010",
+ "abstractNote": "Pyruvate carboxylase is the sole anaplerotic enzyme in glucose-grown cultures of wild-type Saccharomyces cerevisiae. Pyruvate carboxylase-negative (Pyc(-)) S. cerevisiae strains cannot grow on glucose unless media are supplemented with C(4) compounds, such as aspartic acid. In several succinate-producing prokaryotes, phosphoenolpyruvate carboxykinase (PEPCK) fulfills this anaplerotic role. However, the S. cerevisiae PEPCK encoded by PCK1 is repressed by glucose and is considered to have a purely decarboxylating and gluconeogenic function. This study investigates whether and under which conditions PEPCK can replace the anaplerotic function of pyruvate carboxylase in S. cerevisiae. Pyc(-) S. cerevisiae strains constitutively overexpressing the PEPCK either from S. cerevisiae or from Actinobacillus succinogenes did not grow on glucose as the sole carbon source. However, evolutionary engineering yielded mutants able to grow on glucose as the sole carbon source at a maximum specific growth rate of ca. 0.14 h(-1), one-half that of the (pyruvate carboxylase-positive) reference strain grown under the same conditions. Growth was dependent on high carbon dioxide concentrations, indicating that the reaction catalyzed by PEPCK operates near thermodynamic equilibrium. Analysis and reverse engineering of two independently evolved strains showed that single point mutations in pyruvate kinase, which competes with PEPCK for phosphoenolpyruvate, were sufficient to enable the use of PEPCK as the sole anaplerotic enzyme. The PEPCK reaction produces one ATP per carboxylation event, whereas the original route through pyruvate kinase and pyruvate carboxylase is ATP neutral. This increased ATP yield may prove crucial for engineering of efficient and low-cost anaerobic production of C(4) dicarboxylic acids in S. cerevisiae.",
+ "ISSN": "0099-2240"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Rintze M.",
+ "lastName": "Zelle",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Erik",
+ "lastName": "De Hulster",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Wendy",
+ "lastName": "Kloezen",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jack T.",
+ "lastName": "Pronk",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Antonius J. A.",
+ "lastName": "van Maris",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000274017400015",
+ "title": "Key Process Conditions for Production of C(4) Dicarboxylic Acids in Bioreactor Batch Cultures of an Engineered Saccharomyces cerevisiae Strain",
+ "publicationTitle": "Applied and Environmental Microbiology",
+ "volume": "76",
+ "issue": "3",
+ "pages": "744-750",
+ "DOI": "10.1128/AEM.02396-09",
+ "date": "FEB 2010",
+ "abstractNote": "A recent effort to improve malic acid production by Saccharomyces cerevisiae by means of metabolic engineering resulted in a strain that produced up to 59 g liter(-1) of malate at a yield of 0.42 mol (mol glucose)(-1) in calcium carbonate-buffered shake flask cultures. With shake flasks, process parameters that are important for scaling up this process cannot be controlled independently. In this study, growth and product formation by the engineered strain were studied in bioreactors in order to separately analyze the effects of pH, calcium, and carbon dioxide and oxygen availability. A near-neutral pH, which in shake flasks was achieved by adding CaCO(3), was required for efficient C(4) dicarboxylic acid production. Increased calcium concentrations, a side effect of CaCO(3) dissolution, had a small positive effect on malate formation. Carbon dioxide enrichment of the sparging gas (up to 15% [vol/vol]) improved production of both malate and succinate. At higher concentrations, succinate titers further increased, reaching 0.29 mol (mol glucose)(-1), whereas malate formation strongly decreased. Although fully aerobic conditions could be achieved, it was found that moderate oxygen limitation benefitted malate production. In conclusion, malic acid production with the engineered S. cerevisiae strain could be successfully transferred from shake flasks to 1-liter batch bioreactors by simultaneous optimization of four process parameters (pH and concentrations of CO(2), calcium, and O(2)). Under optimized conditions, a malate yield of 0.48 +/- 0.01 mol (mol glucose)(-1) was obtained in bioreactors, a 19% increase over yields in shake flask experiments.",
+ "ISSN": "0099-2240"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Derek A.",
+ "lastName": "Abbott",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Rintze M.",
+ "lastName": "Zelle",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jack T.",
+ "lastName": "Pronk",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Antonius J. A.",
+ "lastName": "van Maris",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000271264400001",
+ "title": "Metabolic engineering of Saccharomyces cerevisiae for production of carboxylic acids: current status and challenges",
+ "publicationTitle": "Fems Yeast Research",
+ "volume": "9",
+ "issue": "8",
+ "pages": "1123-1136",
+ "DOI": "10.1111/j.1567-1364.2009.00537.x",
+ "date": "DEC 2009",
+ "abstractNote": "To meet the demands of future generations for chemicals and energy and to reduce the environmental footprint of the chemical industry, alternatives for petrochemistry are required. Microbial conversion of renewable feedstocks has a huge potential for cleaner, sustainable industrial production of fuels and chemicals. Microbial production of organic acids is a promising approach for production of chemical building blocks that can replace their petrochemically derived equivalents. Although Saccharomyces cerevisiae does not naturally produce organic acids in large quantities, its robustness, pH tolerance, simple nutrient requirements and long history as an industrial workhorse make it an excellent candidate biocatalyst for such processes. Genetic engineering, along with evolution and selection, has been successfully used to divert carbon from ethanol, the natural endproduct of S. cerevisiae, to pyruvate. Further engineering, which included expression of heterologous enzymes and transporters, yielded strains capable of producing lactate and malate from pyruvate. Besides these metabolic engineering strategies, this review discusses the impact of transport and energetics as well as the tolerance towards these organic acids. In addition to recent progress in engineering S. cerevisiae for organic acid production, the key limitations and challenges are discussed in the context of sustainable industrial production of organic acids from renewable feedstocks.",
+ "ISSN": "1567-1356"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Rintze M.",
+ "lastName": "Zelle",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Erik",
+ "lastName": "de Hulster",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "WoUter A.",
+ "lastName": "van Winden",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Pieter",
+ "lastName": "de Waard",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Cor",
+ "lastName": "Dijkema",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Aaron A.",
+ "lastName": "Winkler",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jan-Maarten A.",
+ "lastName": "Geertman",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Johannes P.",
+ "lastName": "van Dijken",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jack T.",
+ "lastName": "Pronk",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Antonius J. A.",
+ "lastName": "van Maris",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000255567900024",
+ "title": "Malic acid production by Saccharomyces cerevisiae: Engineering of pyruvate carboxylation, oxaloacetate reduction, and malate export",
+ "publicationTitle": "Applied and Environmental Microbiology",
+ "volume": "74",
+ "issue": "9",
+ "pages": "2766-2777",
+ "DOI": "10.1128/AEM.02591-07",
+ "date": "MAY 2008",
+ "abstractNote": "Malic acid is a potential biomass-derivable \"building block\" for chemical synthesis. Since wild-type Saccharomyces cerevisiae strains produce only low levels of malate, metabolic engineering is required to achieve efficient malate production with this yeast. A promising pathway for malate production from glucose proceeds via carboxylation of pyruvate, followed by reduction of oxaloacetate to malate. This redox- and ATP-neutral, CO2-fixing pathway has a theoretical maximum yield of 2 mol malate (mol glucose)(-1). A previously engineered glucose-tolerant, C-2-independent pyruvate decarboxylase-negative S. cerevisiae strain was used as the platform to evaluate the impact of individual and combined introduction of three genetic modifications: (i) overexpression of the native pyruvate carboxylase encoded by PYC2, (ii) high-level expression of an allele of the MDH3 gene, of which the encoded malate dehydrogenase was retargeted to the cytosol by deletion of the C-terminal peroxisomal targeting sequence, and (iii) functional expression of the Schizosaccharomyces pombe malate transporter gene SpMAE1. While single or double modifications improved malate production, the highest malate yields and titers were obtained with the simultaneous introduction of all three modifications. In glucose-grown batch cultures, the resulting engineered strain produced malate at titers of up to 59 g liter(-1) at a malate yield of 0.42 mol (mol glucose)(-1). Metabolic flux analysis showed that metabolite labeling patterns observed upon nuclear magnetic resonance analyses of cultures grown on C-13-labeled glucose were consistent with the envisaged nonoxidative, fermentative pathway for malate production. The engineered strains still produced substantial amounts of pyruvate, indicating that the pathway efficiency can be further improved.",
+ "ISSN": "0099-2240"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "FN Thomson Reuters Web of Knowledge\u000aVR 1.0\u000aPT J\u000aAU Smith, L. J.\u000a Schwark, W. S.\u000a Cook, D. R.\u000a Moon, P. F.\u000a Erb, H. N.\u000a Looney, A. L.\u000aTI Pharmacokinetics of intravenous mivacurium in halothane-anesthetized\u000a dogs.\u000aSO Veterinary Surgery\u000aVL 27\u000aIS 2\u000aPS 170\u000aPY 1998\u000aUT CABI:19982209000\u000aDT Abstract only\u000aLA English\u000aSN 0161-3499\u000aCC LL900Animal Toxicology, Poisoning and Pharmacology (Discontinued March\u000a 2000); LL070Pets and Companion Animals\u000aCN 151-67-7\u000aDE anaesthesia; halothane; muscle relaxants; pharmacokinetics\u000aOR dogs\u000aBD Canis; Canidae; Fissipeda; carnivores; mammals; vertebrates; Chordata;\u000a animals; small mammals; eukaryotes\u000aER\u000a\u000aEF",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "L. J.",
+ "lastName": "Smith",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "W. S.",
+ "lastName": "Schwark",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "D. R.",
+ "lastName": "Cook",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "P. F.",
+ "lastName": "Moon",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "H. N.",
+ "lastName": "Erb",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "A. L.",
+ "lastName": "Looney",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "anaesthesia",
+ "halothane",
+ "muscle relaxants",
+ "pharmacokinetics",
+ "dogs",
+ "Canis",
+ "Canidae",
+ "Fissipeda",
+ "carnivores",
+ "mammals",
+ "vertebrates",
+ "Chordata",
+ "animals",
+ "small mammals",
+ "eukaryotes"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "CABI:19982209000",
+ "title": "Pharmacokinetics of intravenous mivacurium in halothane-anesthetized dogs.",
+ "publicationTitle": "Veterinary Surgery",
+ "volume": "27",
+ "issue": "2",
+ "date": "1998",
+ "language": "English",
+ "ISSN": "0161-3499"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "FN Thomson Reuters Web of Knowledge\u000aVR 1.0\u000aPT J\u000aAU Smith, JM \u000aAF Smith, J. Mark\u000aTI Gripewater\u000aSO FIDDLEHEAD\u000aLA English \u000aDT Poetry\u000aNR 0\u000aTC 0\u000aZ9 0\u000aPU UNIV NEW BRUNSWICK\u000aPI FREDERICTON\u000aPA DEPT ENGLISH, CAMPUS HOUSE, PO BOX 4400, FREDERICTON, NB E3B 5A3, CANADA\u000aSN 0015-0630\u000aJ9 FIDDLEHEAD\u000aJI Fiddlehead\u000aPD SPR\u000aPY 2011\u000aIS 247\u000aBP 82\u000aEP 82\u000aPG 1\u000aWC Literary Reviews\u000aSC Literature\u000aGA 757VG\u000aUT WOS:000290115300030\u000aER\u000a\u000aEF",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "J. Mark",
+ "lastName": "Smith",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000290115300030",
+ "title": "Gripewater",
+ "publicationTitle": "Fiddlehead",
+ "language": "English",
+ "publisher": "Univ New Brunswick",
+ "place": "Fredericton",
+ "ISSN": "0015-0630",
+ "journalAbbreviation": "Fiddlehead",
+ "date": "SPR 2011",
+ "issue": "247",
+ "pages": "82-82"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "FN Thomson Reuters Web of Knowledge\u000aVR 1.0\u000aPT S\u000aAU McCormick, MC\u000a Litt, JS\u000a Smith, VC\u000a Zupancic, JAF\u000aAF McCormick, Marie C.\u000a Litt, Jonathan S.\u000a Smith, Vincent C.\u000a Zupancic, John A. F.\u000aBE Fielding, JE\u000a Brownson, RC\u000a Green, LW\u000aTI Prematurity: An Overview and Public Health Implications\u000aSO ANNUAL REVIEW OF PUBLIC HEALTH, VOL 32\u000aSE Annual Review of Public Health\u000aLA English\u000aDT Review\u000aDE infant mortality; childhood morbidity; prevention\u000aID LOW-BIRTH-WEIGHT; NEONATAL INTENSIVE-CARE; QUALITY-OF-LIFE; EXTREMELY\u000a PRETERM BIRTH; YOUNG-ADULTS BORN; AGE 8 YEARS; CHILDREN BORN;\u000a BRONCHOPULMONARY DYSPLASIA; LEARNING-DISABILITIES; EXTREME PREMATURITY\u000aAB The high rate of premature births in the United States remains a public\u000a health concern. These infants experience substantial morbidity and\u000a mortality in the newborn period, which translate into significant\u000a medical costs. In early childhood, survivors are characterized by a\u000a variety of health problems, including motor delay and/or cerebral palsy,\u000a lower IQs, behavior problems, and respiratory illness, especially\u000a asthma. Many experience difficulty with school work, lower\u000a health-related quality of life, and family stress. Emerging information\u000a in adolescence and young adulthood paints a more optimistic picture,\u000a with persistence of many problems but with better adaptation and more\u000a positive expectations by the young adults. Few opportunities for\u000a prevention have been identified; therefore, public health approaches to\u000a prematurity include assurance of delivery in a facility capable of\u000a managing neonatal complications, quality improvement to minimize\u000a interinstitutional variations, early developmental support for such\u000a infants, and attention to related family health issues.\u000aC1 [McCormick, MC] Harvard Univ, Dept Soc Human Dev & Hlth, Sch Publ Hlth, Boston, MA 02115 USA\u000a [McCormick, MC; Litt, JS; Smith, VC; Zupancic, JAF] Beth Israel Deaconess Med Ctr, Dept Neonatol, Boston, MA 02215 USA\u000a [Litt, JS] Childrens Hosp Boston, Div Newborn Med, Boston, MA 02115 USA\u000aRP McCormick, MC (reprint author), Harvard Univ, Dept Soc Human Dev & Hlth, Sch Publ Hlth, Boston, MA 02115 USA\u000aEM mmccormi@hsph.harvard.edu\u000a vsmith1@bidmc.harvard.edu\u000a jzupanci@bidmc.harvard.edu\u000a Jonathan.Litt@childrens.harvard.edu\u000aNR 91\u000aTC 1\u000aZ9 1\u000aPU ANNUAL REVIEWS\u000aPI PALO ALTO\u000aPA 4139 EL CAMINO WAY, PO BOX 10139, PALO ALTO, CA 94303-0897 USA\u000aSN 0163-7525\u000aBN 978-0-8243-2732-3\u000aJ9 ANNU REV PUBL HEALTH\u000aJI Annu. Rev. Public Health\u000aPY 2011\u000aVL 32\u000aBP 367\u000aEP 379\u000aDI 10.1146/annurev-publhealth-090810-182459\u000aPG 13\u000aGA BUZ33\u000aUT WOS:000290776200020\u000aER\u000a\u000aEF",
+ "items": [
+ {
+ "itemType": "bookSection",
+ "creators": [
+ {
+ "firstName": "Marie C.",
+ "lastName": "McCormick",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Jonathan S.",
+ "lastName": "Litt",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Vincent C.",
+ "lastName": "Smith",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "John A. F.",
+ "lastName": "Zupancic",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "JE",
+ "lastName": "Fielding",
+ "creatorType": "editor"
+ },
+ {
+ "firstName": "RC",
+ "lastName": "Brownson",
+ "creatorType": "editor"
+ },
+ {
+ "firstName": "LW",
+ "lastName": "Green",
+ "creatorType": "editor"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "infant mortality",
+ "childhood morbidity",
+ "prevention",
+ "low-birth-weight",
+ "neonatal intensive-care",
+ "quality-of-life",
+ "extremely preterm birth",
+ "young-adults born",
+ "age 8 years",
+ "children born",
+ "bronchopulmonary dysplasia",
+ "learning-disabilities",
+ "extreme prematurity"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "WOS:000290776200020",
+ "title": "Prematurity: An Overview and Public Health Implications",
+ "publicationTitle": "Annual Review of Public Health, Vol 32",
+ "language": "English",
+ "abstractNote": "The high rate of premature births in the United States remains a public health concern. These infants experience substantial morbidity and mortality in the newborn period, which translate into significant medical costs. In early childhood, survivors are characterized by a variety of health problems, including motor delay and/or cerebral palsy, lower IQs, behavior problems, and respiratory illness, especially asthma. Many experience difficulty with school work, lower health-related quality of life, and family stress. Emerging information in adolescence and young adulthood paints a more optimistic picture, with persistence of many problems but with better adaptation and more positive expectations by the young adults. Few opportunities for prevention have been identified; therefore, public health approaches to prematurity include assurance of delivery in a facility capable of managing neonatal complications, quality improvement to minimize interinstitutional variations, early developmental support for such infants, and attention to related family health issues.",
+ "place": "Palo Alto",
+ "publisher": "Annual Reviews",
+ "ISSN": "0163-7525",
+ "ISBN": "978-0-8243-2732-3",
+ "journalAbbreviation": "Annu. Rev. Public Health",
+ "date": "2011",
+ "volume": "32",
+ "pages": "367-379",
+ "DOI": "10.1146/annurev-publhealth-090810-182459"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "FN Thomson Reuters Web of Knowledge\u000aVR 1.0\u000aPT P\u000aUT BIOSIS:PREV201100469175\u000aDT Patent\u000aTI Indexing cell delivery catheter\u000aAU Solar, Matthew S.\u000a Parmer, Kari\u000a Smith, Philip\u000a Murdock, Frank\u000aPN US 07967789\u000aAE Medtronic Inc\u000aDG June 28, 2011\u000aPC USA\u000aPL 604-16501\u000aSO Official Gazette of the United States Patent and Trademark Office\u000a Patents\u000aPY 2011\u000aPD JUN 28 2011\u000aLA English\u000aAB An insertion device with an insertion axis includes an axial actuator\u000a with a first portion and a second portion. The first portion is moveable\u000a along the insertion axis relative to the second portion. The insertion\u000a device further includes a first tube coupled to the first portion of the\u000a axial actuator, and the first tube is movable along the insertion axis\u000a in response to movement of the first portion relative to the second\u000a portion. The device further includes a second tube having a radially\u000a biased distal end. The distal end is substantially contained within the\u000a first tube in a first state, and the second tube is rotatable with\u000a respect to the first tube. Also, the second tube is axially movable to a\u000a second state, and a portion of a distal end of the second tube is\u000a exposed from a distal end of the first tube in the second state.\u000aC1 Indialantic, FL USA\u000aSN 0098-1133\u000aMC Human Medicine (Medical Sciences); Equipment Apparatus Devices and\u000a Instrumentation\u000aCC 12502, Pathology - General\u000aMQ indexing cell delivery catheter; medical supplies\u000aER\u000a\u000aEF",
+ "items": [
+ {
+ "itemType": "patent",
+ "creators": [
+ {
+ "firstName": "Matthew S.",
+ "lastName": "Solar",
+ "creatorType": "inventor"
+ },
+ {
+ "firstName": "Kari",
+ "lastName": "Parmer",
+ "creatorType": "inventor"
+ },
+ {
+ "firstName": "Philip",
+ "lastName": "Smith",
+ "creatorType": "inventor"
+ },
+ {
+ "firstName": "Frank",
+ "lastName": "Murdock",
+ "creatorType": "inventor"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Human Medicine (Medical Sciences)",
+ "Equipment Apparatus Devices and Instrumentation",
+ "indexing cell delivery catheter",
+ "medical supplies"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "BIOSIS:PREV201100469175",
+ "title": "Indexing cell delivery catheter",
+ "patentNumber": "US 07967789",
+ "assignee": "Medtronic Inc",
+ "issueDate": "June 28, 2011",
+ "country": "USA",
+ "priorityNumber": "604-16501",
+ "publicationTitle": "Official Gazette of the United States Patent and Trademark Office Patents",
+ "date": "JUN 28 2011",
+ "language": "English",
+ "abstractNote": "An insertion device with an insertion axis includes an axial actuator with a first portion and a second portion. The first portion is moveable along the insertion axis relative to the second portion. The insertion device further includes a first tube coupled to the first portion of the axial actuator, and the first tube is movable along the insertion axis in response to movement of the first portion relative to the second portion. The device further includes a second tube having a radially biased distal end. The distal end is substantially contained within the first tube in a first state, and the second tube is rotatable with respect to the first tube. Also, the second tube is axially movable to a second state, and a portion of a distal end of the second tube is exposed from a distal end of the first tube in the second state.",
+ "place": "Indialantic, FL USA",
+ "ISSN": "0098-1133"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "FN Thomson Reuters Web of Knowledge\u000aVR 1.0\u000aPT B\u000aAU Smith, W. G.\u000aTI Ecological anthropology of households in East Madura, Indonesia.\u000aSO Ecological anthropology of households in East Madura, Indonesia\u000aPD 2011\u000aPY 2011\u000aZ9 0\u000aBN 978-90-8585933-8\u000aUT CABI:20113178956\u000aER\u000a\u000aPT J\u000aAU Smith, S. A.\u000aTI Production and characterization of polyclonal antibodies to\u000a hexanal-lysine adducts for use in an ELISA to monitor lipid oxidation in\u000a a meat model system.\u000aSO Dissertation Abstracts International, B\u000aVL 58\u000aIS 9\u000aPD 1998, thesis publ. 1997\u000aPY 1998\u000aZ9 0\u000aSN 0419-4217\u000aUT FSTA:1998-09-Sn1570\u000aER\u000a\u000aPT J\u000aAU Smith, E. H.\u000aTI The enzymic oxidation of linoleic and linolenic acid.\u000aSO Dissertation Abstracts International, B\u000aVL 49\u000aIS 4\u000aBP BRD\u000aPD 1988\u000aPY 1988\u000aZ9 0\u000aSN 0419-4217\u000aUT FSTA:1989-04-N-0004\u000aER\u000a\u000aPT J\u000aAU Smith, C. S.\u000aTI The syneresis of renneted milk gels.\u000aSO Dissertation Abstracts International. B, Sciences and Engineering\u000aVL 49\u000aIS 5\u000aBP 1459\u000aPD 1988\u000aPY 1988\u000aZ9 0\u000aSN 0419-4217\u000aUT CABI:19910448509\u000aER\u000a\u000aEF",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "W. G.",
+ "lastName": "Smith",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "CABI:20113178956",
+ "title": "Ecological anthropology of households in East Madura, Indonesia.",
+ "publicationTitle": "Ecological anthropology of households in East Madura, Indonesia",
+ "date": "2011",
+ "ISBN": "978-90-8585933-8"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "S. A.",
+ "lastName": "Smith",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "FSTA:1998-09-Sn1570",
+ "title": "Production and characterization of polyclonal antibodies to hexanal-lysine adducts for use in an ELISA to monitor lipid oxidation in a meat model system.",
+ "publicationTitle": "Dissertation Abstracts International, B",
+ "volume": "58",
+ "issue": "9",
+ "date": ", thesis publ. 1997 1998",
+ "ISSN": "0419-4217"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "E. H.",
+ "lastName": "Smith",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "FSTA:1989-04-N-0004",
+ "title": "The enzymic oxidation of linoleic and linolenic acid.",
+ "publicationTitle": "Dissertation Abstracts International, B",
+ "volume": "49",
+ "issue": "4",
+ "pages": "BRD",
+ "date": "1988",
+ "ISSN": "0419-4217"
+ },
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "C. S.",
+ "lastName": "Smith",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "extra": "CABI:19910448509",
+ "title": "The syneresis of renneted milk gels.",
+ "publicationTitle": "Dissertation Abstracts International. B, Sciences and Engineering",
+ "volume": "49",
+ "issue": "5",
+ "pages": "1459",
+ "date": "1988",
+ "ISSN": "0419-4217"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/Institute of Physics.js b/translators/Institute of Physics.js
@@ -1,45 +1,69 @@
{
- "translatorID":"9346ddef-126b-47ec-afef-8809ed1972ab",
- "translatorType":4,
- "label":"Institute of Physics",
- "creator":"Michael Berkowitz",
- "target":"^http://www.iop.org/EJ/(toc|abstract|search|article)",
- "minVersion":"1.0.0b4.r5",
- "maxVersion":"",
- "priority":99,
- "inRepository":true,
- "lastUpdated":"2008-04-28 17:50:00"
+ "translatorID": "9346ddef-126b-47ec-afef-8809ed1972ab",
+ "label": "Institute of Physics",
+ "creator": "Michael Berkowitz and Avram Lyon",
+ "target": "^http://iopscience\\.iop\\.org/[0-9-]+/.+",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 99,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-30 12:25:40"
}
function detectWeb(doc, url) {
- if ((doc.location.href.indexOf("toc") == -1) && (doc.location.href.indexOf("search") == -1)) {
+ if (url.indexOf("search") == -1) {
return "journalArticle";
} else {
return "multiple";
}
}
-function parseRIS(getURL, pdfURL) {
- var newGet = getURL.replace(/EJ\/[^/]+/, "EJ/sview").replace(/\?.*$/, '') + "?format=refmgr&submit=1";
- Zotero.Utilities.HTTP.doGet(newGet, function(text){
- // load translator for RIS
- var translator = Zotero.loadTranslator ("import");
- translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
- translator.setString(text);
- translator.setHandler("itemDone", function(obj, item) {
- item.url = getURL;
- item.attachments = [
- {url:item.url, title:"IOP Snapshot", mimeType:"text/html"}
- ];
- if (pdfURL != null) {
- item.attachments.push({url:pdfURL, title:"IOP Full Text PDF", mimeType:"application/pdf"});
- }
- item.complete();
+function fetchDOIs(DOIs) {
+ var DOI = DOIs.shift();
+ if (!DOI) {
+ Zotero.done();
+ return true;
+ }
+ var articleID = DOI.slice(DOI.indexOf('/')+1);
+ var pdfURL = "http://iopscience.iop.org/"+articleID+"/pdf/"+articleID.replace("/","_","g")+".pdf";
+ var doitranslate = Zotero.loadTranslator("search");
+ doitranslate.setTranslator("11645bd1-0420-45c1-badb-53fb41eeb753");
+ var item = {"itemType":"journalArticle", "DOI":DOI};
+ doitranslate.setSearch(item);
+ doitranslate.setHandler("itemDone", function(obj, item) {
+ item.url = "http://iopscience.iop.org/"+articleID;
+ item.attachments.push({url:pdfURL, title:"IOP Full Text PDF", mimeType:"application/pdf"});
+ item.libraryCatalog = "Intitute of Physics";
+ item.complete();
+ fetchDOIs(DOIs);
});
- translator.translate();
- Zotero.done();
- }, function() {});
- Zotero.wait();
+
+ var fallback = function() {
+ Zotero.debug("Error saving using DOI and CrossRef; trying RIS");
+ // If there is something wrong with the item
+ var postVars = "exportFormat=iopexport_ris&exportType=abs&articleId="+articleID;
+ Zotero.Utilities.HTTP.doPost("http://iopscience.iop.org/export", postVars, function(text){
+ // load translator for RIS
+ var ristranslator = Zotero.loadTranslator ("import");
+ ristranslator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ ristranslator.setString(text);
+ ristranslator.setHandler("itemDone", function(obj, item) {
+ item.url = "http://iopscience.iop.org/"+articleID;
+ item.libraryCatalog = "Intitute of Physics";
+ item.attachments.push({url:pdfURL, title:"IOP Full Text PDF", mimeType:"application/pdf"});
+ item.complete();
+ fetchDOIs(DOIs);
+ });
+ ristranslator.translate();
+ }, function() {});
+ }
+
+ doitranslate.setHandler("error", fallback);
+ try { doitranslate.translate() } catch (e) {
+ Zotero.debug("Caught exception");
+ fallback();
+ };
}
function doWeb(doc, url) {
@@ -51,26 +75,88 @@ function doWeb(doc, url) {
var arts = new Array();
if (detectWeb(doc, url) == "multiple") {
var items = new Object();
- var results = doc.evaluate('//td[*//td[*//a[contains(text(), "Abstract")]]]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var results = doc.evaluate('//div[@class="searchResCol1"]', doc, nsResolver, XPathResult.ANY_TYPE, null);
var result;
while (result = results.iterateNext()) {
- var title = doc.evaluate('.//strong', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
- var link = doc.evaluate('.//a[contains(text(), "Abstract")]', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
- var pdflink = doc.evaluate('.//a[contains(text(), "PDF")]', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ? doc.evaluate('.//a[contains(text(), "PDF")]', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href : null;
- var links = new Array(link, pdflink);
- items[links] = title;
- }
- items = Zotero.selectItems(items);
- for (var i in items) {
- arts.push(i);
+ var title = doc.evaluate('.//h4/a', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var doi = doc.evaluate('.//span[@class="doi"]/strong/a', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ items[doi] = title.trim();
}
+ Zotero.selectItems(items, function(items) {
+ if(!items) return true;
+ for (var i in items) {
+ arts.push(i);
+ }
+ fetchDOIs(arts);
+ Zotero.wait();
+ });
} else {
- var pdfurl = doc.evaluate('//a[contains(text(), "PDF")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
- var links = url + ',' + pdfurl;
- arts = [links];
+ var doi = doc.evaluate('//meta[@name="citation_doi"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().content;
+ fetchDOIs([doi]);
+ Zotero.wait();
}
- for each (var linkset in arts) {
- var urls = linkset.split(',');
- parseRIS(urls[0], urls[1]);
+}
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://iopscience.iop.org/0022-3727/34/10/311",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "creatorType": "author",
+ "firstName": "J",
+ "lastName": "Batina"
+ },
+ {
+ "creatorType": "author",
+ "firstName": "F",
+ "lastName": "Noël"
+ },
+ {
+ "creatorType": "author",
+ "firstName": "S",
+ "lastName": "Lachaud"
+ },
+ {
+ "creatorType": "author",
+ "firstName": "R",
+ "lastName": "Peyrous"
+ },
+ {
+ "creatorType": "author",
+ "firstName": "J F",
+ "lastName": "Loiseau"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "IOP Full Text PDF",
+ "mimeType": "application/pdf"
+ }
+ ],
+ "publicationTitle": "Journal of Physics D: Applied Physics",
+ "volume": "34",
+ "ISSN": "0022-3727, 1361-6463",
+ "date": "2001-05-21",
+ "pages": "1510-1524",
+ "DOI": "10.1088/0022-3727/34/10/311",
+ "url": "http://iopscience.iop.org/0022-3727/34/10/311",
+ "title": "Hydrodynamical simulation of the electric wind in a cylindrical vessel with positive point-to-plane device",
+ "libraryCatalog": "CrossRef"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://iopscience.iop.org/search?searchType=fullText&fieldedquery=fun&f=titleabs&time=all&submit=Search&navsubmit=Search",
+ "items": "multiple"
}
-}
-\ No newline at end of file
+]
+/** END TEST CASES **/
diff --git a/translators/Library Catalog (BiblioCommons).js b/translators/Library Catalog (BiblioCommons).js
@@ -0,0 +1,220 @@
+{
+ "translatorID": "5d506fe3-dbde-4424-90e8-d219c63faf72",
+ "label": "Library Catalog (BiblioCommons)",
+ "creator": "Avram Lyon",
+ "target": "^https?://[^.]+\\.bibliocommons\\.com\\/",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-19 20:37:25"
+}
+
+
+/*
+ BiblioCommons Translator
+ Copyright (C) 2011 Avram Lyon, ajlyon@gmail.com
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+function detectWeb(doc, url) {
+ if (url.match(/\/item\/(?:show|catalogue_info)/))
+ return "book";
+ if (url.match(/\/search\?t=/))
+ return "multiple";
+ return false;
+}
+
+function doWeb(doc, url) {
+ var n = doc.documentElement.namespaceURI;
+ var ns = n ? function(prefix) {
+ if (prefix == 'x') return n; else return null;
+ } : null;
+
+ // Load MARC
+ var translator = Z.loadTranslator("import");
+ translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
+
+ var domain = url.match(/https?:\/\/([^.\/]+)/)[1];
+
+ if (url.match(/\/item\/show/)) {
+ Zotero.Utilities.doGet(url.replace(/\/item\/show/,"/item/catalogue_info"),
+ function (text) {
+ translator.getTranslatorObject(function (obj) {
+ processor({
+ translator: obj,
+ text: text,
+ domain: domain
+ });
+ })
+ }, function() {Zotero.done()});
+ } else if (url.match(/\/item\/catalogue_info/)) {
+ translator.getTranslatorObject(function (obj) {
+ processor({
+ translator: obj,
+ text: doc.documentElement.innerHTML,
+ domain: domain
+ });
+ })
+ } else if (url.match(/\/search\?t=/)) {
+ var results = doc.evaluate('//div[@id="bibList"]/div/div//span[@class="title"]/a[1]', doc, ns, XPathResult.ANY_TYPE, null);
+ var items = new Array();
+ var result;
+ while(result = results.iterateNext()) {
+ var title = result.textContent;
+ var url = result.href.replace(/\/show\//,"/catalogue_info/");
+ items[url] = title;
+ }
+ Zotero.selectItems(items, function (items) {
+ var urls = [];
+ var i;
+ for (i in items) urls.push(i);
+ Zotero.Utilities.doGet(urls, function (text) {
+ translator.getTranslatorObject(function (obj) {
+ processor({
+ translator: obj,
+ text: text,
+ domain: domain
+ });
+ })
+ }, function() {Zotero.done()});
+ });
+ Zotero.wait();
+ }
+}
+
+function processor (obj) {
+ // Gets {translator: , text: }
+ // Here, we split up the table and insert little placeholders between record bits
+ var marced = obj.text.replace(/\s+/g," ")
+ .replace(/^.*<div id="marc_details">(?:\s*<[^>"]+>\s*)*/,"")
+ .replace(/<tr +class="(?:odd|even)">\s*/g,"")
+ .replace(/<td +class="marcTag"><strong>(\d+)<\/strong><\/td>\s*/g,"$1\x1F")
+ // We may be breaking the indicator here
+ .replace(/<td\s+class="marcIndicator">\s*(\d*)\s*<\/td>\s*/g,"$1\x1F")
+ .replace(/<td +class="marcTagData">(.*?)<\/td>\s*<\/tr>\s*/g,"$1\x1E")
+ .replace(/\x1F(?:[^\x1F]*)$/,"\x1F")
+ // We have some extra 0's at the start of the leader
+ .replace(/^000/,"");
+ //Z.debug(marced);
+
+ // We've used the record delimiter to delimit fields
+ var fields = marced.split("\x1E");
+
+ // The preprocess function gets the translator object, if available
+ // This is pretty vital for fancy translators like MARC
+ var marc = obj["translator"];
+ // Make a record, only one.
+ var record = new marc.record();
+ // The first piece is the MARC leader
+ record.leader = fields.shift();
+ for each (var field in fields) {
+ // Skip blanks
+ if (field.replace(/\x1F|\s/g,"") == "") continue;
+ // We're using the subfield delimiter to separate the field code,
+ // indicator, and the content.
+ var pieces = field.split("\x1F");
+ record.addField(pieces[0].trim(),
+ pieces[1].trim(),
+ // Now we insert the subfield delimiter
+ pieces[2].replace(/\$([a-z]|$)/g,"\x1F$1").trim());
+ }
+ // returns {translator: , text: false, items: [Zotero.Item[]]}
+ var item = new Zotero.Item();
+ record.translate(item);
+ item.libraryCatalog = obj.domain + " Library Catalog";
+ item.complete();
+ return true;
+}
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://bostonpl.bibliocommons.com/item/catalogue_info/2993906042_test",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "William",
+ "lastName": "Sleator",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Education",
+ "Immigrants",
+ "Conspiracies",
+ "Political corruption",
+ "Educational tests and measurements"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "ISBN": "0810993562",
+ "title": "Test",
+ "place": "New York",
+ "publisher": "Amulet Books",
+ "date": "2008",
+ "numPages": "298",
+ "callNumber": "SLEATOR W",
+ "libraryCatalog": "bostonpl Library Catalog"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://nypl.bibliocommons.com/search?t=smart&search_category=keyword&q=tatar&commit=Search&searchOpt=catalogue",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://bostonpl.bibliocommons.com/item/show/3679347042_adam_smith",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "James R",
+ "lastName": "Otteson",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Smith, Adam",
+ "Classical school of economics",
+ "Free enterprise"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "ISBN": "9780826429834",
+ "title": "Adam Smith",
+ "place": "New York",
+ "publisher": "Continuum",
+ "date": "2011",
+ "numPages": "179",
+ "series": "Major conservative and libertarian thinkers",
+ "seriesNumber": "v. 16",
+ "callNumber": "HB103.S6",
+ "libraryCatalog": "bostonpl Library Catalog"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Library Catalog (Dynix).js b/translators/Library Catalog (Dynix).js
@@ -1,14 +1,14 @@
{
- "translatorID":"774d7dc2-3474-2684-392c-f787789ec63d",
- "translatorType":4,
- "label":"Library Catalog (Dynix)",
- "creator":"Simon Kornblith and Sylvain Machefert",
- "target":"ipac\\.jsp\\?.*(?:uri=(?:link|full)=[0-9]|menu=search|term=)",
- "minVersion":"1.0.0b3.r1",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2011-06-04 22:44:38"
+ "translatorID": "774d7dc2-3474-2684-392c-f787789ec63d",
+ "label": "Library Catalog (Dynix)",
+ "creator": "Simon Kornblith and Sylvain Machefert",
+ "target": "ipac\\.jsp\\?.*(?:uri=(?:link|full)=[0-9]|menu=search|term=)",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-24 19:43:47"
}
function detectWeb(doc, url) {
@@ -40,7 +40,10 @@ function doWeb(doc, url) {
var uris = new Array();
if(detectWeb(doc,uri) == "book") {
- uris.push(uri+'&fullmarc=true');
+ if (uri.indexOf("#") !== -1)
+ uris.push(uri.replace(/#/,'&fullmarc=true#'));
+ else
+ uris.push(uri+'&fullmarc=true');
} else {
var items = Zotero.Utilities.getItemArray(doc, doc, "ipac\.jsp\?.*uri=(?:full|link)=[0-9]|^javascript:buildNewList\\('.*uri%3Dfull%3D[0-9]", "Show details");
items = Zotero.selectItems(items);
@@ -64,9 +67,15 @@ function doWeb(doc, url) {
var translator = Zotero.loadTranslator("import");
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
- var marc = translator.getTranslatorObject();
-
- Zotero.Utilities.processDocuments(uris, function(newDoc) {
+ translator.getTranslatorObject(function (marc) {
+ Zotero.Utilities.processDocuments(uris, function (newDoc) {
+ scrape(newDoc, marc);
+ }, function() { Zotero.done() }, null);
+ });
+ Zotero.wait();
+}
+
+function scrape(newDoc, marc) {
var uri = newDoc.location.href;
var namespace = newDoc.documentElement.namespaceURI;
@@ -127,7 +136,7 @@ function doWeb(doc, url) {
var newItem = new Zotero.Item();
record.translate(newItem);
- var domain = url.match(/https?:\/\/([^/]+)/);
+ var domain = uri.match(/https?:\/\/([^/]+)/);
newItem.repository = domain[1]+" Library Catalog";
// 20091210 : We try to get a permalink on the record
@@ -150,7 +159,79 @@ function doWeb(doc, url) {
}
newItem.complete();
- }, function() { Zotero.done() }, null);
-
- Zotero.wait();
-}
+ }
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://siris-libraries.si.edu/ipac20/ipac.jsp?&profile=all&source=~!silibraries&uri=full=3100001~!820431~!0#focus",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "lastName": "Pennsylvania Academy of the Fine Arts",
+ "fieldMode": true
+ },
+ {
+ "firstName": "Thomas",
+ "lastName": "Eakins",
+ "creatorType": "contributor"
+ },
+ {
+ "firstName": "Susan Macdowell",
+ "lastName": "Eakins",
+ "creatorType": "contributor"
+ },
+ {
+ "firstName": "Benjamin",
+ "lastName": "Eakins",
+ "creatorType": "contributor"
+ },
+ {
+ "firstName": "Charles",
+ "lastName": "Bregler",
+ "creatorType": "contributor"
+ },
+ {
+ "firstName": "Kathleen A",
+ "lastName": "Foster",
+ "creatorType": "contributor"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Eakins, Thomas",
+ "Eakins, Susan Macdowell",
+ "Eakins, Benjamin",
+ "Bregler, Charles",
+ "Bregler, Charles",
+ "Library",
+ "McDowell family",
+ "Manuscripts",
+ "Private collections",
+ "Pennsylvania Philadelphia"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "Original record",
+ "mimeType": "text/html",
+ "snapshot": false
+ }
+ ],
+ "ISBN": "0812282248",
+ "title": "Charles Bregler's Thomas Eakins collection",
+ "place": "Philadelphia, PA",
+ "publisher": "University of Pennsylvania Press",
+ "date": "1989",
+ "numPages": "37",
+ "callNumber": "mfc 000652",
+ "libraryCatalog": "siris-libraries.si.edu Library Catalog"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/Library Catalog (InnoPAC).js b/translators/Library Catalog (InnoPAC).js
@@ -1,14 +1,14 @@
{
- "translatorID":"4fd6b89b-2316-2dc4-fd87-61a97dd941e8",
- "label":"Library Catalog (InnoPAC)",
- "creator":"Simon Kornblith and Michael Berkowitz",
- "target":"(search~|\\/search\\?|(a|X|t|Y|w)\\?|\\?(searchtype|searchscope)|frameset&FF|record=b[0-9]+(~S[0-9])?|/search/q\\?)",
- "minVersion":"1.0.0b3.r1",
- "maxVersion":"",
- "priority":200,
- "inRepository":true,
- "translatorType":4,
- "lastUpdated":"2010-09-28 06:55:00"
+ "translatorID": "4fd6b89b-2316-2dc4-fd87-61a97dd941e8",
+ "label": "Library Catalog (InnoPAC)",
+ "creator": "Simon Kornblith and Michael Berkowitz",
+ "target": "(search~|\\/search\\?|(a|X|t|Y|w)\\?|\\?(searchtype|searchscope)|frameset&FF|record=b[0-9]+(~S[0-9])?|/search/q\\?)",
+ "minVersion": "1.0.0b3.r1",
+ "maxVersion": "",
+ "priority": 200,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-22 17:52:39"
}
function detectWeb(doc, url) {
@@ -56,7 +56,7 @@ function detectWeb(doc, url) {
}
}
// Next, look for the MARC button
- xpath = '//a[img[@src="/screens/marc_display.gif" or @src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]';
+ xpath = '//a[img[@src="/screens/marc_display.gif" or @src="/screens/ico_marc.gif" or @src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]] | //a[span/img[@src="/screens/marc_display.gif" or @src="/screens/ico_marc.gif" or @src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]';
elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if(elmt) {
return "book";
@@ -172,8 +172,8 @@ function doWeb(doc, url) {
if (m) {
newUri = uri.replace(/frameset/, "marc");
} else {
- var xpath = '//a[img[@src="/screens/marc_display.gif" or @src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]';
- newUri = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.replace(/frameset/, "marc");;
+ var xpath = '//a[img[@src="/screens/marc_display.gif" or @src="/screens/ico_marc.gif" or @src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]] | //a[span/img[@src="/screens/marc_display.gif" or @src="/screens/ico_marc.gif" or @src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]';
+ newUri = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.replace(/frameset/, "marc");
}
pageByPage(marc, [newUri]);
} else { // Search results page
@@ -186,7 +186,7 @@ function doWeb(doc, url) {
var firstURL = false;
var tableRows = doc.evaluate('//table[@class="browseScreen"]//tr[@class="browseEntry" or @class="briefCitRow" or td/input[@type="checkbox"] or td[contains(@class,"briefCitRow")]]',
- doc, nsResolver, XPathResult.ANY_TYPE, null);
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
// Go through table rows
var i = 0;
while(tableRow = tableRows.iterateNext()) {
@@ -228,3 +228,50 @@ function doWeb(doc, url) {
Zotero.wait();
}
+
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://books.luther.edu/record=b2115431~S9",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "G. W",
+ "lastName": "Kimura",
+ "creatorType": "contributor"
+ },
+ {
+ "lastName": "ebrary, Inc",
+ "fieldMode": true
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Alaska",
+ "History",
+ "Alaska",
+ "Anniversaries, etc",
+ "Alaska",
+ "Social conditions",
+ "Alaska",
+ "Economic conditions",
+ "Electronic books"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Alaska at 50 the past, present, and next fifty years of statehood",
+ "place": "Fairbanks",
+ "publisher": "University of Alaska Press",
+ "date": "2009",
+ "numPages": "285",
+ "callNumber": "F904 .A477 2009eb",
+ "libraryCatalog": "books.luther.edu Library Catalog"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Library Catalog (SIRSI).js b/translators/Library Catalog (SIRSI).js
@@ -1,14 +1,14 @@
{
- "translatorID":"add7c71c-21f3-ee14-d188-caf9da12728b",
- "translatorType":4,
- "label":"Library Catalog (SIRSI)",
- "creator":"Sean Takats & Hicham El Kasmi(Dutch Language fields)",
- "target":"/uhtbin/cgisirsi",
- "minVersion":"1.0.0b3.r1",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2011-01-11 04:31:00"
+ "translatorID": "add7c71c-21f3-ee14-d188-caf9da12728b",
+ "label": "Library Catalog (SIRSI)",
+ "creator": "Sean Takats, Hicham El Kasmi",
+ "target": "/uhtbin/(?:cgisirsi|quick_keyword)",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-25 13:01:08"
}
function detectWeb(doc, url) {
@@ -29,7 +29,7 @@ function detectWeb(doc, url) {
return "book";
}
var elmts = doc.evaluate('/html/body/form//text()', doc, nsResolver,
- XPathResult.ANY_TYPE, null);
+ XPathResult.ANY_TYPE, null);
while(elmt = elmts.iterateNext()) {
if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
Zotero.debug("SIRSI detectWeb: Viewing record");
@@ -47,7 +47,6 @@ function detectWeb(doc, url) {
Zotero.debug("SIRSI detectWeb: hitlist");
return "multiple";
}
- // var xpath = '//input[@type="checkbox"]'
}
function scrape(doc) {
@@ -102,9 +101,9 @@ function scrape(doc) {
var pubParts = value.split(" : ");
newItem.place = pubParts[0];
if (pubParts[1].match(/\d+/)) {
- newItem.date = pubParts[1].match(/\d+/)[0];
- newItem.publisher = pubParts[1].match(/(.*),/)[1];
- }
+ newItem.date = pubParts[1].match(/\d+/)[0];
+ newItem.publisher = pubParts[1].match(/(.*),/)[1];
+ }
} else if(field == "personal author" || field == "autor personal" || field == "auteur") {
if(authors.indexOf(value) == -1) {
value = value.replace(/(\(|\)|\d+|\-)/g, "");
@@ -166,10 +165,18 @@ function scrape(doc) {
if(newItem.extra) {
newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
}
-
+
var callNumber = doc.evaluate('//tr/td[1][@class="holdingslist"]/text()', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if(callNumber && callNumber.nodeValue) {
- newItem.callNumber = callNumber.nodeValue;
+ newItem.callNumber = callNumber.nodeValue.trim();
+ }
+
+ // UVA has the call number separately, in the next field
+ // http://virgo.lib.virginia.edu
+ callNumber = doc.evaluate('//tr/td[2][@class="holdingslist"]/text()', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ // The regex here is looking for something like an LOC call number
+ if(callNumber && callNumber.nodeValue.trim().match(/^[A-Z]{1,2}[0-9]+/)) {
+ newItem.callNumber += " " + callNumber.nodeValue.trim();
}
var domain = doc.location.href.match(/https?:\/\/([^/]+)/);
@@ -201,7 +208,7 @@ function doWeb(doc, url){
sirsiNew = false;
} else {
var elmts = doc.evaluate('/html/body/form//text()', doc, nsResolver,
- XPathResult.ANY_TYPE, null);
+ XPathResult.ANY_TYPE, null);
while(elmt = elmts.iterateNext()) {
if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
Zotero.debug("SIRSI doWeb: Viewing record");
diff --git a/translators/Library Catalog (Voyager).js b/translators/Library Catalog (Voyager).js
@@ -9,7 +9,7 @@
"inRepository": true,
"translatorType": 4,
"browserSupport": "gcs",
- "lastUpdated": "2011-07-01 02:14:28"
+ "lastUpdated": "2011-07-04 13:09:56"
}
function detectWeb(doc, url) {
@@ -184,78 +184,77 @@ function doWeb(doc, url) {
/** BEGIN TEST CASES **/
var testCases = [
- {
- "type": "web",
- "url": "http://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?DB=local&Search_Arg=zotero&Search_Code=GKEY^*&CNT=100&hist=1&type=quick",
- "items": [
- {
- "itemType": "book",
- "creators": [
- {
- "firstName": "Jason",
- "lastName": "Puckett",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Zotero",
- "Bibliographical citations",
- "Computer programs",
- "Citation of electronic information resources",
- "Computer programs"
- ],
- "seeAlso": [],
- "attachments": [],
- "ISBN": "9780838985892",
- "title": "Zotero: A Guide for Librarians, Researchers, and Educators",
- "place": "Chicago",
- "publisher": "Association of College and Research Libraries",
- "date": "2011",
- "callNumber": "PN171.F56 P83 2011",
- "libraryCatalog": "Library of Congress Catalog",
- "shortTitle": "Zotero"
- },
- {
- "itemType": "book",
- "creators": [
- {
- "lastName": "IAMSLIC Conference",
- "fieldMode": true
- },
- {
- "firstName": "Dorothy",
- "lastName": "Barr",
- "creatorType": "contributor"
- },
- {
- "lastName": "International Association of Aquatic and Marine Science Libraries and Information Centers",
- "fieldMode": true
- }
- ],
- "notes": [],
- "tags": [
- "Marine science libraries",
- "Marine sciences",
- "Information services",
- "Aquatic science libraries",
- "Aquatic sciences",
- "Information services",
- "Fishery libraries",
- "Fisheries",
- "Information services"
- ],
- "seeAlso": [],
- "attachments": [],
- "title": "Netting Knowledge: Two Hemispheres/One World: Proceedings of the 36th IAMSLIC Annual Conference",
- "place": "Fort Pierce, Fla",
- "publisher": "IAMSLIC",
- "date": "2011",
- "callNumber": "Z675.M35 I2 2010",
- "libraryCatalog": "Library of Congress Catalog",
- "shortTitle": "Netting Knowledge"
- }
- ]
- }
+ {
+ "type": "web",
+ "url": "http://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?DB=local&Search_Arg=zotero&Search_Code=GKEY^*&CNT=100&hist=1&type=quick",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "https://i-share.carli.illinois.edu/nby/cgi-bin/Pwebrecon.cgi?DB=local&v1=1&BBRecID=790862",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Francisco",
+ "lastName": "Xarque",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Masseta, Simon",
+ "Cuellar y Mosquera, Gabriel de",
+ "Missions",
+ "Paraguay"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Insignes missioneros de la Compañia de Jesus en la prouincia del Paraguay: estado presente de sus missiones en Tucuman, Paraguay, y Rio de la Plata, que comprehende su distrito",
+ "place": "En Pamplona",
+ "publisher": "Por Juan Micòn, Impressor",
+ "date": "1687",
+ "numPages": "24",
+ "callNumber": "F2681 .X3",
+ "libraryCatalog": "i-share.carli.illinois.edu Library Catalog",
+ "shortTitle": "Insignes missioneros de la Compañia de Jesus en la prouincia del Paraguay"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?v1=1&ti=1,1&Search%5FArg=zotero&Search%5FCode=GKEY%5E%2A&CNT=100&type=quick&PID=UiW_ZKCUShsRhZ5pIpsx_-5hND3W&SEQ=20110704130645&SID=1",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Jason",
+ "lastName": "Puckett",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Zotero",
+ "Bibliographical citations",
+ "Computer programs",
+ "Citation of electronic information resources",
+ "Computer programs"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "ISBN": "9780838985892",
+ "title": "Zotero: a guide for librarians, researchers, and educators",
+ "place": "Chicago",
+ "publisher": "Association of College and Research Libraries",
+ "date": "2011",
+ "callNumber": "PN171.F56 P83 2011",
+ "libraryCatalog": "Library of Congress Catalog",
+ "shortTitle": "Zotero"
+ }
+ ]
+ }
]
/** END TEST CASES **/
\ No newline at end of file
diff --git a/translators/MARC.js b/translators/MARC.js
@@ -1,15 +1,15 @@
{
- "translatorID":"a6ee60df-1ddc-4aae-bb25-45e0537be973",
- "translatorType":1,
- "label":"MARC",
- "creator":"Simon Kornblith, updated for unimarc by Sylvain Machefert",
- "target":"marc",
- "minVersion":"1.0.0b3.r1",
- "maxVersion":"",
- "priority":100,
- "browserSupport":"gcs",
- "inRepository":true,
- "lastUpdated":"2011-07-01 06:23:45"
+ "translatorID": "a6ee60df-1ddc-4aae-bb25-45e0537be973",
+ "label": "MARC",
+ "creator": "Simon Kornblith, Sylvain Machefert",
+ "target": "marc",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 1,
+ "browserSupport": "gcsn",
+ "lastUpdated": "2011-07-21 17:16:37"
}
function detectImport() {
@@ -171,8 +171,8 @@ record.prototype.getField = function(field) {
// add to array, replacing null characters
fields.push([this.content.substr(location[0], this.indicatorLength),
- this.content.substr(location[0]+this.indicatorLength,
- location[1]-this.indicatorLength-1).replace(/\x00/g, "")]);
+ this.content.substr(location[0]+this.indicatorLength,
+ location[1]-this.indicatorLength-1).replace(/\x00/g, "")]);
}
return fields;
@@ -195,6 +195,10 @@ record.prototype.getFieldSubfields = function(tag) { // returns a two-dimensiona
var subfieldIndex = subfields[j].substr(0, this.subfieldCodeLength-1);
if(!returnFields[i][subfieldIndex]) {
returnFields[i][subfieldIndex] = subfields[j].substr(this.subfieldCodeLength-1);
+ } else {
+ // Duplicate subfield
+ Zotero.debug("Duplicate subfield '"+tag+" "+subfieldIndex+"="+subfields[j]);
+ returnFields[i][subfieldIndex] = returnFields[i][subfieldIndex] + " " + subfields[j].substr(this.subfieldCodeLength-1);
}
}
}
@@ -240,6 +244,24 @@ record.prototype._associateDBField = function(item, fieldNo, part, fieldName, ex
}
}
+// add field to DB as note
+record.prototype._associateNotes = function(item, fieldNo, part) {
+ var field = this.getFieldSubfields(fieldNo);
+ var texts = [];
+
+ for(var i in field) {
+ for(var j=0; j<part.length; j++) {
+ var myPart = part[j];
+ if(field[i][myPart]) {
+ texts.push(clean(field[i][myPart]));
+ }
+ }
+ }
+ var text = texts.join(' ');
+ if (text.trim() != "")
+ item.notes.push({note: text});
+}
+
// add field to DB as tags
record.prototype._associateTags = function(item, fieldNo, part) {
var field = this.getFieldSubfields(fieldNo);
@@ -335,8 +357,8 @@ record.prototype.translate = function(item) {
this._associateDBField(item, "330", "a", "abstractNote");
// Extract tags
- // TODO : Ajouter les autres champs en 6xx avec les autorit�s construites.
- // n�cessite de reconstruire les autorit�s
+ // TODO : Ajouter les autres champs en 6xx avec les autorités construites.
+ // nécessite de reconstruire les autorités
this._associateTags(item, "610", "a");
// Extract scale (for maps)
@@ -427,6 +449,17 @@ record.prototype.translate = function(item) {
this._associateTags(item, "658", "ab");
// hierarchical geographic place name
this._associateTags(item, "662", "abcdfgh");
+
+ // Extract note fields
+ // http://www.loc.gov/marc/bibliographic/bd5xx.html
+ // general note
+ this._associateNotes(item, "500", "a");
+ // formatted contents (table of contents)
+ this._associateNotes(item, "505", "art");
+ // summary
+ this._associateNotes(item, "520", "ab");
+ // biographical or historical data
+ this._associateNotes(item, "545", "ab");
// Extract title
this._associateDBField(item, "245", "ab", "title");
@@ -446,9 +479,12 @@ record.prototype.translate = function(item) {
this._associateDBField(item, "260", "c", "date", pullNumber);
// Extract pages
this._associateDBField(item, "300", "a", "numPages", pullNumber);
- // Extract series
+ // Extract series and series number
+ // The current preference is 490
+ this._associateDBField(item, "490", "a", "series");
+ this._associateDBField(item, "490", "v", "seriesNumber");
+ // 440 was made obsolete as of 2008; see http://www.loc.gov/marc/bibliographic/bd4xx.html
this._associateDBField(item, "440", "a", "series");
- // Extract series number
this._associateDBField(item, "440", "v", "seriesNumber");
// Extract call number
this._associateDBField(item, "084", "ab", "callNumber");
@@ -459,6 +495,7 @@ record.prototype.translate = function(item) {
this._associateDBField(item, "050", "ab", "callNumber");
this._associateDBField(item, "090", "a", "callNumber");
this._associateDBField(item, "099", "a", "callNumber");
+ this._associateDBField(item, "852", "khim", "callNumber");
//German
if (!item.place) this._associateDBField(item, "410", "a", "place");
@@ -524,4 +561,49 @@ function doImport() {
holdOver += text;
}
}
-}
-\ No newline at end of file
+}
+
+exports.record = record;
+exports.fieldTerminator = fieldTerminator;
+exports.recordTerminator = recordTerminator;
+exports.subfieldDelimiter = subfieldDelimiter;
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "import",
+ "input": "01841cam a2200385Ma 45\u00020001000700000005001700007008004100024010001700065035002300082035001800105040003000123043001200153050001500165049001500180100003900195245028100234260005900515300006100574500019500635500014500830510003000975510002701005510004501032500002601077610004401103600004001147600004801187650004501235610004501280852005801325946003101383910001001414994001201424947001901436\u001e790862\u001e20080120004008.0\u001e880726s1687 sp bf 000 0cspa d\u001e \u001fa 03021876 \u001e \u001fa(OCoLC)ocm29051663\u001e \u001fa(NBYdb)790862\u001e \u001faMNU\u001fcMNU\u001fdOCL\u001fdDIBAM\u001fdIBV\u001e \u001fas-py---\u001e0 \u001faF2681\u001fb.X3\u001e \u001faIBVA\u001flbklr\u001e1 \u001faXarque, Francisco,\u001fdca. 1609-1691.\u001e10\u001faInsignes missioneros de la Compañia de Jesus en la prouincia del Paraguay :\u001fbestado presente de sus missiones en Tucuman, Paraguay, y Rio de la Plata, que comprehende su distrito /\u001fcpor el doct. d. Francisco Xarque, dean de la Catredral [sic] de Santa Maria de Albarrazin ...\u001e \u001faEn Pamplona :\u001fbPor Juan Micòn, Impressor,\u001fcaño 1687.\u001e \u001fa[24], 432 p., [1] folded leaf of plates :\u001fbmap ;\u001fc22 cm.\u001e \u001faBrunet and Graesse both mention a map of Paraguay; this copy has a map of Chile with title: Tabula geocraphica [sic] regni Chile / studio et labore P. Procuratoris Chilensis Societatis Jesu.\u001e \u001faIn 3 books; the first two are biographies of Jesuits, Simon Mazeta and Francisco Diaz Taño, the 3rd deals with Jesuit missions in Paraguay.\u001e4 \u001faNUC pre-1956,\u001fcNX0000604.\u001e4 \u001faSabin,\u001fc105716 (v.29).\u001e4 \u001faPalau y Dulcet (2nd ed.),\u001fc123233 (v.7).\u001e \u001faHead and tail pieces.\u001e20\u001faJesuits\u001fzParaguay\u001fvEarly works to 1800.\u001e10\u001faMasseta, Simon,\u001fdca. 1582-ca. 1656.\u001e10\u001faCuellar y Mosquera, Gabriel de,\u001fd1593-1677.\u001e 0\u001faMissions\u001fzParaguay\u001fvEarly works to 1800.\u001e20\u001faJesuits\u001fvBiography\u001fvEarly works to 1800.\u001e8 \u001fbvau,ayer\u001fkVAULT\u001fhAyer\u001fi1343\u001fi.J515\u001fiP211\u001fiX2\u001fi1687\u001ft1\u001e \u001faOCLC RECON PROJECT\u001farc3758\u001e \u001fa35535\u001e \u001fa02\u001fbIBV\u001e \u001faMARS\u001fa20071227\u001e\u001d",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Francisco",
+ "lastName": "Xarque",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [
+ {
+ "note": "Brunet and Graesse both mention a map of Paraguay; this copy has a map of Chile with title: Tabula geocraphica [sic] regni Chile / studio et labore P. Procuratoris Chilensis Societatis Jesu In 3 books; the first two are biographies of Jesuits, Simon Mazeta and Francisco Diaz Taño, the 3rd deals with Jesuit missions in Paraguay Head and tail pieces"
+ }
+ ],
+ "tags": [
+ "Masseta, Simon",
+ "Cuellar y Mosquera, Gabriel de",
+ "Missions",
+ "Paraguay"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Insignes missioneros de la Compañia de Jesus en la prouincia del Paraguay: estado presente de sus missiones en Tucuman, Paraguay, y Rio de la Plata, que comprehende su distrito",
+ "place": "En Pamplona",
+ "publisher": "Por Juan Micòn, Impressor",
+ "date": "1687",
+ "numPages": "24",
+ "callNumber": "VAULT Ayer 1343 .J515 P211 X2 1687"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/MIT Press Journals.js b/translators/MIT Press Journals.js
@@ -1,14 +1,15 @@
{
- "translatorID":"2e43f4a9-d2e2-4112-a6ef-b3528b39b4d2",
- "translatorType":4,
- "label":"MIT Press Journals",
- "creator":"Michael Berkowitz",
- "target":"http://www.mitpressjournals.org/",
- "minVersion":"1.0.0b4.r5",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2009-01-08 08:19:07"
+ "translatorID": "2e43f4a9-d2e2-4112-a6ef-b3528b39b4d2",
+ "label": "MIT Press Journals",
+ "creator": "Michael Berkowitz",
+ "target": "http://www.mitpressjournals.org/",
+ "minVersion": "1.0.0b4.r5",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "g",
+ "lastUpdated": "2011-07-13 12:10:55"
}
function detectWeb(doc, url) {
@@ -66,4 +67,57 @@ function doWeb(doc, url) {
});
}, function() {Zotero.done();});
Zotero.wait();
-}
-\ No newline at end of file
+}
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://www.mitpressjournals.org/toc/afar/43/4",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://www.mitpressjournals.org/doi/abs/10.1162/afar.2010.43.4.60",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "lastName": "Verswijver",
+ "firstName": "Gustaaf",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "African Arts Snapshot",
+ "mimeType": "text/html"
+ },
+ {
+ "url": false,
+ "title": "African Arts Full Text PDF",
+ "mimeType": "application/pdf"
+ }
+ ],
+ "title": "Removable Hair Caps of Karamoja (Uganda)",
+ "date": "2011/07/13 2010",
+ "DOI": "i: 10.1162/afar.2010.43.4.60</p>",
+ "publicationTitle": "African Arts",
+ "pages": "60-71",
+ "volume": "43",
+ "issue": "4",
+ "publisher": "MIT Press",
+ "ISBN": "0001-9933",
+ "ISSN": "0001-9933",
+ "url": "http://dx.doi.org/10.1162/afar.2010.43.4.60",
+ "libraryCatalog": "MIT Press Journals"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/MODS.js b/translators/MODS.js
@@ -1,16 +1,21 @@
{
- "translatorID":"0e2235e7-babf-413c-9acf-f27cce5f059c",
- "translatorType":3,
- "label":"MODS",
- "creator":"Simon Kornblith",
- "target":"xml",
- "minVersion":"2.1b3",
- "maxVersion":"",
- "priority":50,
- "configOptions":{"dataMode":"xml/e4x"},
- "displayOptions":{"exportNotes":true},
- "inRepository":true,
- "lastUpdated":"2011-04-04 16:00:00"
+ "translatorID": "0e2235e7-babf-413c-9acf-f27cce5f059c",
+ "label": "MODS",
+ "creator": "Simon Kornblith and Richard Karnesky",
+ "target": "xml",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 50,
+ "configOptions": {
+ "dataMode": "xml/e4x"
+ },
+ "displayOptions": {
+ "exportNotes": true
+ },
+ "inRepository": true,
+ "translatorType": 3,
+ "browserSupport": "g",
+ "lastUpdated": "2011-07-18 13:49:58"
}
function detectImport() {
@@ -39,8 +44,14 @@ function doExport() {
if(item.title) {
mods.titleInfo.title = item.title;
}
+ if(item.shortTitle) {
+ mods.titleInfo += <titleInfo type="abbreviated"><title>{item.shortTitle}</title></titleInfo>;
+ }
// XML tag typeOfResource/genre; object field type
+ //
+ // The exact marcGenre of a book section can, perhaps, be debated;
+ // But it should have 'book' as the host's genre.
var modsType, marcGenre;
if(item.itemType == "book" || item.itemType == "bookSection") {
modsType = "text";
@@ -84,8 +95,7 @@ function doExport() {
// XML tag genre; object field thesisType, type
if(item.thesisType) {
mods.genre += <genre>{item.thesisType}</genre>;
- }
- if(item.type) {
+ } else if(item.type) {
mods.genre += <genre>{item.type}</genre>;
}
@@ -96,22 +106,41 @@ function doExport() {
roleTerm = "aut";
} else if(item.creators[j].creatorType == "editor") {
roleTerm = "edt";
+ } else if(item.creators[j].creatorType == "translator") {
+ roleTerm = "trl";
} else {
roleTerm = "ctb";
}
// FIXME - currently all names are personal
- if(item.creators[j].fieldMode == 1) {
- mods.name += <name type="personal">
- <namePart>{item.creators[j].lastName}</namePart>
- <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
- </name>;
- } else {
- mods.name += <name type="personal">
- <namePart type="family">{item.creators[j].lastName}</namePart>
- <namePart type="given">{item.creators[j].firstName}</namePart>
- <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
- </name>;
+ if(item.creators[j].creatorType != "seriesEditor") {
+ if(isPartialItem && item.creators[j].creatorType == "editor"){
+ if(item.creators[j].fieldMode == 1) {
+ mods.relatedItem.name += <name type="personal">
+ <namePart>{item.creators[j].lastName}</namePart>
+ <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
+ </name>;
+ } else {
+ mods.relatedItem.name += <name type="personal">
+ <namePart type="family">{item.creators[j].lastName}</namePart>
+ <namePart type="given">{item.creators[j].firstName}</namePart>
+ <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
+ </name>;
+ }
+ } else {
+ if(item.creators[j].fieldMode == 1) {
+ mods.name += <name type="personal">
+ <namePart>{item.creators[j].lastName}</namePart>
+ <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
+ </name>;
+ } else {
+ mods.name += <name type="personal">
+ <namePart type="family">{item.creators[j].lastName}</namePart>
+ <namePart type="given">{item.creators[j].firstName}</namePart>
+ <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
+ </name>;
+ }
+ }
}
}
@@ -141,29 +170,17 @@ function doExport() {
// XML tag detail; object field volume
if(item.volume) {
- if(parseInt(item.volume) == item.volume) {
- part += <detail type="volume"><number>{item.volume}</number></detail>;
- } else {
- part += <detail type="volume"><text>{item.volume}</text></detail>;
- }
+ part += <detail type="volume"><number>{item.volume}</number></detail>;
}
// XML tag detail; object field number
if(item.issue) {
- if(parseInt(item.issue) == item.issue) {
- part += <detail type="issue"><number>{item.issue}</number></detail>;
- } else {
- part += <detail type="issue"><text>{item.issue}</text></detail>;
- }
+ part += <detail type="issue"><number>{item.issue}</number></detail>;
}
// XML tag detail; object field section
if(item.section) {
- if(parseInt(item.section) == item.section) {
- part += <detail type="section"><number>{item.section}</number></detail>;
- } else {
- part += <detail type="section"><text>{item.section}</text></detail>;
- }
+ part += <detail type="section"><number>{item.section}</number></detail>;
}
// XML tag detail; object field pages
@@ -209,9 +226,11 @@ function doExport() {
var tag = <{dateType}>{item.date}</{dateType}>;
originInfo += tag;
}
- if(item.accessDate) {
- originInfo += <dateCaptured>{item.accessDate}</dateCaptured>;
- }
+
+ if(item.numPages) {
+ mods.physicalDescription = <physicalDescription><extent unit="pages"><total>{item.numPages}</total></extent></physicalDescription>;
+ }
+
if(originInfo.length() != 1) {
if(isPartialItem) {
// For a journal article, bookSection, etc., this goes under the host
@@ -220,6 +239,40 @@ function doExport() {
mods.originInfo += <originInfo>{originInfo}</originInfo>;
}
}
+
+ // eXist Solutions points out that most types are more often
+ // monographic than not & will use this internally.
+ // Perhaps comment this out in the main distribution, though.
+ mods.originInfo.issuance = "monographic";
+
+ if(isPartialItem) {
+ // eXist Solutions points out that these types are more often
+ // continuing than not & will use this internally.
+ // Perhaps comment this out in the main distribution, though.
+ if(item.itemType == "journalArticle" || item.itemType == "magazineArticle" || item.itemType == "newspaperArticle") {
+ mods.relatedItem.originInfo.issuance = "continuing";
+ if(item.itemType == "journalArticle" || item.itemType == "magazineArticle") {
+ mods.relatedItem.genre += <genre authority="marcgt">periodical</genre>;
+ } else if (item.itemType == "newspaperArticle") {
+ mods.relatedItem.genre += <genre authority="marcgt">newspaper</genre>;
+ }
+ }
+ else if (item.itemType == "bookSection" || item.itemType == "conferencePaper" || item.itemType == "encyclopediaArticle") {
+ mods.relatedItem.originInfo.issuance = "monographic";
+ if (item.itemType == "bookSection") {
+ mods.relatedItem.genre += <genre authority="marcgt">book</genre>;
+ } else if (item.itemType == "conferencePaper") {
+ mods.relatedItem.genre += <genre authority="marcgt">conference publication</genre>;
+ if (item.conferenceName) {
+ mods.relatedItem.name += <name type="conference">
+ <namePart>{item.conferenceName}</namePart>
+ </name>;
+ }
+ } else if (item.itemType == "encyclopediaArticle") {
+ mods.relatedItem.genre += <genre authority="marcgt">encyclopedia</genre>;
+ }
+ }
+ }
// XML tag identifier; object fields ISBN, ISSN
if(isPartialItem) {
@@ -246,15 +299,19 @@ function doExport() {
if(item.callNumber) {
mods.classification = item.callNumber;
}
+
+ // XML tag location.url; object field archiveLocation
+ if(item.url) {
+ mods.location.url += item.url;
+ if(item.accessDate) {
+ mods.location.url.@dateLastAccessed = item.accessDate;
+ }
+ }
+
// XML tag location.physicalLocation; object field archiveLocation
if(item.archiveLocation) {
- mods.location.physicalLocation = item.archiveLocation;
- }
-
- // XML tag location.url; object field archiveLocation
- if(item.url) {
- mods.location.url = item.url;
+ mods.location += <location><physicalLocation>{item.archiveLocation}</physicalLocation></location>;
}
// XML tag title.titleInfo; object field journalAbbreviation
@@ -286,18 +343,34 @@ function doExport() {
for(var j in item.tags) {
mods.subject += <subject><topic>{item.tags[j].tag}</topic></subject>;
}
+
+ /** LANGUAGE **/
+
+ if(item.language) {
+ mods.language.languageTerm = <languageTerm type="text">{item.language}</languageTerm>;
+ }
+
+ /** EXTRA->NOTE **/
+ if(item.extra) {
+ mods.note += <note>{item.extra}</note>;
+ }
// XML tag relatedItem.titleInfo; object field series
if(item.seriesTitle || item.series || item.seriesNumber || item.seriesText) {
var series = <relatedItem type="series"/>;
+
+ // eXist Solutions points out that these types are more often
+ // continuing than not & will use this internally.
+ // Perhaps comment this out in the main distribution, though.
+ series.originInfo.issuance = "continuing";
if(item.series) {
series.titleInfo.title = item.series;
}
if(item.seriesTitle) {
- series.titleInfo.partTitle = item.seriesTitle;
+ series.titleInfo.title += <title>{item.seriesTitle}</title>;
}
if(item.seriesText) {
@@ -305,16 +378,36 @@ function doExport() {
}
if(item.seriesNumber) {
- series.titleInfo.partNumber = item.seriesNumber;
+ series.part.detail = <detail type="volume"><number>{item.seriesNumber}</number></detail>;
+ }
+
+ // handle series editors
+ for(var j in item.creators) {
+ var roleTerm = "";
+ if(item.creators[j].creatorType == "seriesEditor") {
+ roleTerm = "pbd";
+ if(item.creators[j].fieldMode == 1) {
+ series.name += <name type="personal">
+ <namePart>{item.creators[j].lastName}</namePart>
+ <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
+ </name>;
+ } else {
+ series.name += <name type="personal">
+ <namePart type="family">{item.creators[j].lastName}</namePart>
+ <namePart type="given">{item.creators[j].firstName}</namePart>
+ <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
+ </name>;
+ }
+ }
}
// TODO: make this work in import
- /*if(item.itemType == "bookSection") {
- // For a book section, series info must go inside host tag
+ //
+ if(isPartialItem) {
mods.relatedItem.relatedItem = series;
- } else {*/
+ } else {
mods.relatedItem += series;
- //}
+ }
}
modsCollection.mods += mods;
@@ -742,9 +835,24 @@ function doImport() {
// Language
// create an array of languages
var languages = new Array();
- // E4X filter might need to be updated to include languageTerms that are @type="code" only
- for each(var language in mods.m::language.m::languageTerm.(@type == "text")) {
- languages.push(language.text().toString());
+ for each(var language in mods.m::language) {
+ var code = false;
+ for each(var term in language.m::languageTerm) {
+ if (term.@type == "text") {
+ languages.push(term.text().toString());
+ code = false;
+ break;
+ // code authorities should be used, not ignored
+ // but we ignore them for now
+ } else if (term.@type == "code" || term.@authority) {
+ code = term.text().toString();
+ }
+ }
+ // If we have a code or text content of the node
+ // (prefer the former), then we add that
+ if (code || (code = language.text().toString())) {
+ languages.push(code);
+ }
}
// join the list separated by semicolons & add it to zotero item
newItem.language = languages.join('; ');
@@ -753,3 +861,135 @@ function doImport() {
newItem.complete();
}
}
+
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "import",
+ "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\u000a<modsCollection xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.loc.gov/mods/v3\" xsi:schemaLocation=\"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd\">\u000a<mods version=\"3.3\">\u000a <titleInfo>\u000a \u0009 \u0009<title>FranUlmer.com -- Home Page</title>\u000a \u0009</titleInfo>\u000a \u0009<titleInfo type=\"alternative\"><title>Fran Ulmer, Democratic candidate for Governor, Alaska, 2002</title>\u000a \u0009</titleInfo>\u000a \u0009<name type=\"personal\">\u000a \u0009 \u0009<namePart>Ulmer, Fran</namePart>\u000a \u0009</name>\u000a \u0009<genre>Web site</genre>\u000a \u0009<originInfo>\u000a \u0009 \u0009<dateCaptured point=\"start\" encoding=\"iso8601\">20020702 </dateCaptured>\u000a \u0009 \u0009<dateCaptured point=\"end\" encoding=\"iso8601\"> 20021203</dateCaptured>\u000a \u0009</originInfo>\u000a \u0009<language>\u000a \u0009 \u0009<languageTerm authority=\"iso639-2b\">eng</languageTerm>\u000a \u0009</language>\u000a \u0009<physicalDescription>\u000a \u0009 \u0009<internetMediaType>text/html</internetMediaType>\u000a \u0009 \u0009<internetMediaType>image/jpg</internetMediaType>\u000a \u0009</physicalDescription>\u000a \u0009<abstract>Web site promoting the candidacy of Fran Ulmer, Democratic candidate for Governor, Alaska, 2002. Includes candidate biography, issue position statements, campaign contact information, privacy policy and campaign news press releases. Site features enable visitors to sign up for campaign email list, volunteer, make campaign contributions and follow links to other internet locations. </abstract>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>Elections</topic>\u000a \u0009 \u0009<geographic>Alaska</geographic>\u000a \u0009</subject>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>Governors</topic>\u000a \u0009 \u0009<geographic>Alaska</geographic>\u000a \u0009 \u0009<topic>Election</topic>\u000a \u0009</subject>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>Democratic Party (AK)</topic>\u000a \u0009</subject>\u000a \u0009<relatedItem type=\"host\">\u000a \u0009 \u0009<titleInfo>\u000a \u0009 \u0009 \u0009<title>Election 2002 Web Archive</title>\u000a \u0009 \u0009</titleInfo>\u000a \u0009 \u0009<location>\u000a \u0009 \u0009 \u0009<url>http://www.loc.gov/minerva/collect/elec2002/</url>\u000a \u0009 \u0009</location>\u000a \u0009</relatedItem>\u000a \u0009<location>\u000a \u0009 \u0009<url displayLabel=\"Active site (if available)\">http://www.franulmer.com/</url>\u000a \u0009</location>\u000a \u0009<location>\u000a \u0009 \u0009<url displayLabel=\"Archived site\">http://wayback-cgi1.alexa.com/e2002/*/http://www.franulmer.com/</url>\u000a \u0009</location>\u000a</mods>\u000a</modsCollection>",
+ "items": [
+ {
+ "itemType": "document",
+ "creators": [
+ {
+ "firstName": "Fran",
+ "lastName": "Ulmer",
+ "creatorType": "author",
+ "fieldMode": 1
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Elections",
+ "Governors",
+ "Election",
+ "Democratic Party (AK)"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "FranUlmer.com -- Home Page",
+ "publicationTitle": "Election 2002 Web Archive",
+ "url": "http://wayback-cgi1.alexa.com/e2002/*/http://www.franulmer.com/",
+ "abstractNote": "Web site promoting the candidacy of Fran Ulmer, Democratic candidate for Governor, Alaska, 2002. Includes candidate biography, issue position statements, campaign contact information, privacy policy and campaign news press releases. Site features enable visitors to sign up for campaign email list, volunteer, make campaign contributions and follow links to other internet locations.",
+ "language": "eng"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\u000a<modsCollection xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.loc.gov/mods/v3\" xsi:schemaLocation=\"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd\">\u000a<mods version=\"3.3\">\u000a <titleInfo>\u000a \u0009 \u0009<title>At Gettysburg, or, What a Girl Saw and Heard of the Battle: A True Narrative</title>\u000a \u0009</titleInfo>\u000a \u0009<name type=\"personal\">\u000a \u0009 \u0009<namePart>Alleman, Tillie Pierce [1848-1914]</namePart>\u000a \u0009 \u0009<role>\u000a \u0009 \u0009 \u0009<roleTerm type=\"code\" authority=\"marcrelator\">aut</roleTerm>\u000a \u0009 \u0009 \u0009<roleTerm type=\"text\" authority=\"marcrelator\">Author</roleTerm>\u000a \u0009 \u0009</role>\u000a \u0009</name>\u000a \u0009<typeOfResource>text</typeOfResource>\u000a \u0009<originInfo>\u000a \u0009 \u0009<place>\u000a \u0009 \u0009 \u0009<placeTerm type=\"text\">New York</placeTerm>\u000a \u0009 \u0009</place>\u000a \u0009 \u0009<publisher>W. Lake Borland</publisher>\u000a \u0009 \u0009<dateIssued keyDate=\"yes\" encoding=\"w3cdtf\">1889</dateIssued>\u000a \u0009</originInfo>\u000a \u0009<language>\u000a \u0009 \u0009<languageTerm authority=\"iso639-2b\">eng</languageTerm>\u000a \u0009 \u0009<languageTerm type=\"text\">English</languageTerm>\u000a \u0009</language>\u000a \u0009<physicalDescription>\u000a \u0009 \u0009<internetMediaType>text/html</internetMediaType>\u000a \u0009 \u0009<digitalOrigin>reformatted digital</digitalOrigin>\u000a \u0009</physicalDescription>\u000a \u0009<subject authority=\"lcsh\">\u000a \u0009 \u0009<topic >Gettysburg, Battle of, Gettysburg, Pa., 1863</topic>\u000a \u0009</subject>\u000a \u0009<subject authority=\"lcsh\">\u000a \u0009 \u0009<topic>Gettysburg (Pa.) -- History -- Civil War, 1861-1865</topic>\u000a \u0009</subject>\u000a \u0009<subject authority=\"lcsh\">\u000a \u0009 \u0009<topic>United States -- History -- Civil War, 1861-1865 -- Campaigns</topic>\u000a \u0009</subject>\u000a \u0009<classification authority=\"lcc\">E475.53 .A42</classification>\u000a \u0009<relatedItem type=\"host\">\u000a \u0009 \u0009<titleInfo type=\"uniform\" authority=\"dlfaqcoll\">\u000a \u0009 \u0009 \u0009<title>A Celebration of Women Writers: Americana</title>\u000a \u0009 \u0009</titleInfo>\u000a \u0009</relatedItem>\u000a \u0009<location>\u000a \u0009 \u0009<url usage=\"primary display\" access=\"object in context\"> http://digital.library.upenn.edu/women/alleman/gettysburg/gettysburg.html\u000a</url>\u000a \u0009</location>\u000a \u0009<accessCondition> Personal, noncommercial use of this item is permitted in the United States of America. Please see http://digital.library.upenn.edu/women/ for other rights and restrictions that may apply to this resource.\u000a</accessCondition>\u000a<recordInfo>\u000a \u0009<recordSource>University of Pennsylvania Digital Library</recordSource>\u000a \u0009<recordOrigin> MODS auto-converted from a simple Online Books Page metadata record. For details, see http://onlinebooks.library.upenn.edu/mods.html </recordOrigin>\u000a \u0009<languageOfCataloging>\u000a \u0009 \u0009<languageTerm type=\"code\" authority=\"iso639-2b\">eng</languageTerm>\u000a \u0009</languageOfCataloging>\u000a</recordInfo>\u000a</mods>\u000a</modsCollection>",
+ "items": [
+ {
+ "itemType": "document",
+ "creators": [
+ {
+ "firstName": "Tillie Pierce [1848-1914",
+ "lastName": "Alleman",
+ "creatorType": "author",
+ "fieldMode": 1
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Gettysburg, Battle of, Gettysburg, Pa., 1863",
+ "Gettysburg (Pa.) -- History -- Civil War, 1861-1865",
+ "United States -- History -- Civil War, 1861-1865 -- Campaigns"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "At Gettysburg, or, What a Girl Saw and Heard of the Battle: A True Narrative",
+ "rights": "Personal, noncommercial use of this item is permitted in the United States of America. Please see http://digital.library.upenn.edu/women/ for other rights and restrictions that may apply to this resource.",
+ "publicationTitle": "A Celebration of Women Writers: Americana",
+ "callNumber": "E475.53 .A42",
+ "url": "http://digital.library.upenn.edu/women/alleman/gettysburg/gettysburg.html",
+ "language": "English"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\u000a<modsCollection xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.loc.gov/mods/v3\" xsi:schemaLocation=\"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd\">\u000a<mods version=\"3.3\">\u000a <titleInfo>\u000a \u0009 \u0009<title>Telescope Peak from Zabriskie Point</title>\u000a \u0009</titleInfo>\u000a \u0009<titleInfo type=\"alternative\" >\u000a \u0009 \u0009<title>Telescope PK from Zabriskie Pt.</title>\u000a \u0009</titleInfo>\u000a \u0009<name type=\"personal\">\u000a \u0009 \u0009<namePart type=\"family\">Cushman</namePart>\u000a \u0009 \u0009<namePart type=\"given\">Charles Weever</namePart>\u000a \u0009 \u0009<namePart type=\"date\">1896-1972</namePart>\u000a \u0009 \u0009<role>\u000a \u0009 \u0009 \u0009<roleTerm type=\"code\" authority=\"marcrelator\">pht</roleTerm>\u000a \u0009 \u0009 \u0009<roleTerm type=\"text\" authority=\"marcrelator\">Photographer</roleTerm>\u000a \u0009 \u0009</role>\u000a \u0009</name>\u000a \u0009<typeOfResource>still image</typeOfResource>\u000a \u0009<genre authority=\"gmgpc\">Landscape photographs</genre>\u000a \u0009<originInfo>\u000a \u0009 \u0009<dateCreated encoding=\"w3cdtf\" keyDate=\"yes\">1955-03-22</dateCreated>\u000a \u0009 \u0009<copyrightDate encoding=\"w3cdtf\">2003</copyrightDate>\u000a \u0009</originInfo>\u000a \u0009<physicalDescription>\u000a \u0009 \u0009<internetMediaType>image/jpeg</internetMediaType>\u000a \u0009 \u0009<digitalOrigin>reformatted digital</digitalOrigin>\u000a \u0009 \u0009<note> Original 35mm slide was digitized in 2003 as a TIFF image. Display versions in JPEG format in three sizes are available.</note>\u000a \u0009 \u0009<note>100 f 6.3 tl</note>\u000a \u0009</physicalDescription>\u000a \u0009<subject authority=\"lctgm\">\u000a \u0009 \u0009<topic>Mountains</topic>\u000a \u0009</subject>\u000a \u0009<subject authority=\"lctgm\">\u000a \u0009 \u0009<topic>Snow</topic>\u000a \u0009</subject>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>Telescope Peak (Inyo County, Calif.)</topic>\u000a \u0009</subject>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>Zabriskie Point (Calif.)</topic>\u000a \u0009</subject>\u000a \u0009<subject>\u000a \u0009 \u0009<hierarchicalGeographic>\u000a \u0009 \u0009 \u0009<country>United States</country>\u000a \u0009 \u0009 \u0009<state>California</state>\u000a \u0009 \u0009 \u0009<county>Inyo</county>\u000a \u0009 \u0009</hierarchicalGeographic>\u000a \u0009</subject>\u000a \u0009<relatedItem type=\"original\">\u000a \u0009 \u0009<originInfo>\u000a \u0009 \u0009 \u0009<dateCreated encoding=\"w3cdtf\" keyDate=\"yes\">1955-03-22</dateCreated>\u000a \u0009 \u0009</originInfo>\u000a \u0009 \u0009<physicalDescription>\u000a \u0009 \u0009 \u0009<form authority=\"gmd\">graphic</form>\u000a \u0009 \u0009 \u0009<extent>1 slide : col. ; 35mm</extent>\u000a \u0009 \u0009 \u0009<note>Original 35mm slide was digitized in 2003 as a TIFF image. Display versions in JPEG format in three sizes are available.</note>\u000a \u0009 \u0009</physicalDescription>\u000a \u0009 \u0009<location>\u000a \u0009 \u0009 \u0009<physicalLocation displayLabel=\"Original slide\"> Indiana University, Bloomington. University Archives P07803 </physicalLocation>\u000a \u0009 \u0009</location>\u000a \u0009</relatedItem>\u000a \u0009<relatedItem type=\"host\">\u000a \u0009 \u0009<titleInfo type=\"uniform\" authority=\"dlfaqcoll\">\u000a \u0009 \u0009 \u0009<title> Indiana University Digital Library Program: Charles W. Cushman Photograph Collection</title>\u000a \u0009 \u0009</titleInfo>\u000a \u0009</relatedItem>\u000a \u0009<identifier displayLabel=\"Cushman number\" type=\"local\">955.11</identifier>\u000a \u0009<identifier displayLabel=\"IU Archives number\" type=\"local\">P07803</identifier>\u000a \u0009<location>\u000a \u0009 \u0009<url>http://purl.dlib.indiana.edu/iudl/archives/cushman/P07803</url>\u000a \u0009 \u0009<url access=\"preview\">http://quod.lib.umich.edu/m/mods/thumbs/Indiana/oai.dlib.indiana.edu/ archives/cushman/oai_3Aoai.dlib.indiana.edu_3Aarchives_5Ccushman_5CP07803.png</url>\u000a \u0009</location>\u000a \u0009<accessCondition> Copyright and reproduction rights for all Charles W. Cushman photographs are held by Indiana University and administered by the University Archives, Indiana University, Bloomington, IN 47405</accessCondition>\u000a \u0009<recordInfo>\u000a \u0009<recordContentSource>Indiana University Digital Library Program</recordContentSource>\u000a \u0009<recordCreationDate encoding=\"w3cdtf\">2004-09-09</recordCreationDate>\u000a \u0009<recordIdentifier>archives/cushman/P07803</recordIdentifier>\u000a \u0009</recordInfo>\u000a</mods>\u000a\u000a</modsCollection>",
+ "items": [
+ {
+ "itemType": "artwork",
+ "creators": [
+ {
+ "firstName": "Charles Weever",
+ "lastName": "Cushman",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Mountains",
+ "Snow",
+ "Telescope Peak (Inyo County, Calif.)",
+ "Zabriskie Point (Calif.)"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Telescope Peak from Zabriskie Point",
+ "source": "Indiana University Digital Library Program",
+ "accessionNumber": "archives/cushman/P07803",
+ "rights": "Copyright and reproduction rights for all Charles W. Cushman photographs are held by Indiana University and administered by the University Archives, Indiana University, Bloomington, IN 47405",
+ "publicationTitle": "Indiana University Digital Library Program: Charles W. Cushman Photograph Collection",
+ "url": "http://quod.lib.umich.edu/m/mods/thumbs/Indiana/oai.dlib.indiana.edu/ archives/cushman/oai_3Aoai.dlib.indiana.edu_3Aarchives_5Ccushman_5CP07803.png"
+ }
+ ]
+ },
+ {
+ "type": "import",
+ "input": "<modsCollection xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.loc.gov/mods/v3\" xsi:schemaLocation=\"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd\">\u000a<mods version=\"3.3\">\u000a <titleInfo>\u000a \u0009 \u0009<title>Hiring and recruitment practices in academic libraries</title>\u000a \u0009</titleInfo>\u000a \u0009<name type=\"personal\">\u000a \u0009 \u0009<namePart>Raschke, Gregory K.</namePart>\u000a \u0009 \u0009<displayForm>Gregory K. Raschke</displayForm>\u000a \u0009</name>\u000a \u0009<typeOfResource>text</typeOfResource>\u000a \u0009<genre>journal article</genre>\u000a \u0009<originInfo>\u000a \u0009 \u0009<place>\u000a \u0009 \u0009 \u0009<text>Baltimore, Md.</text>\u000a \u0009 \u0009</place>\u000a \u0009 \u0009<publisher>Johns Hopkins University Press</publisher>\u000a \u0009 \u0009<dateIssued>2003</dateIssued>\u000a \u0009 \u0009<issuance>monographic</issuance>\u000a \u0009</originInfo>\u000a \u0009<language authority=\"iso639-2b\">eng</language>\u000a \u0009<physicalDescription>\u000a \u0009 \u0009<form authority=\"marcform\">print</form>\u000a \u0009 \u0009<extent>15 p.</extent>\u000a \u0009</physicalDescription>\u000a \u0009<abstract>\u000aAcademic libraries need to change their recruiting and hiring procedures to stay competitive in today's changing marketplace. By taking too long to find and to hire talented professionals in a tight labor market, academic libraries are losing out on top candidates and limiting their ability to become innovative and dynamic organizations. Traditional, deliberate, and risk-averse hiring models lead to positions remaining open for long periods, opportunities lost as top prospects find other positions, and a reduction in the overall talent level of the organization. To be more competitive and effective in their recruitment and hiring processes, academic libraries must foster manageable internal solutions, look to other professions for effective hiring techniques and models, and employ innovative concepts from modern personnel management literature. </abstract>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>College librarians</topic>\u000a \u0009 \u0009<topic>Recruiting</topic>\u000a \u0009 \u0009<geographic>United States</geographic>\u000a \u0009</subject>\u000a \u0009<subject>\u000a \u0009 \u0009<topic>College librarians</topic>\u000a \u0009 \u0009<topic>Selection and appointment</topic>\u000a \u0009 \u0009<geographic>United States</geographic>\u000a \u0009</subject>\u000a \u0009<relatedItem type=\"host\">\u000a \u0009 \u0009<titleInfo>\u000a \u0009 \u0009 \u0009<title>portal: libraries and the academy</title>\u000a \u0009 \u0009</titleInfo>\u000a \u0009 \u0009<part>\u000a \u0009 \u0009 \u0009<detail type=\"volume\">\u000a \u0009 \u0009 \u0009 \u0009<number>3</number>\u000a \u0009 \u0009 \u0009 \u0009<caption>vol.</caption>\u000a \u0009 \u0009 \u0009</detail>\u000a \u0009 \u0009 \u0009<detail type=\"number\">\u000a \u0009 \u0009 \u0009 \u0009<number>1</number>\u000a \u0009 \u0009 \u0009 \u0009<caption>no.</caption>\u000a \u0009 \u0009 \u0009</detail>\u000a \u0009 \u0009 \u0009<extent unit=\"page\">\u000a \u0009 \u0009 \u0009 \u0009<start>53</start>\u000a \u0009 \u0009 \u0009 \u0009<end>57</end>\u000a \u0009 \u0009 \u0009</extent>\u000a \u0009 \u0009 \u0009<date>Jan. 2003</date>\u000a \u0009 \u0009</part>\u000a \u0009 \u0009<identifier type=\"issn\">1531-2542</identifier>\u000a \u0009</relatedItem>\u000a</mods>\u000a\u000a</modsCollection>",
+ "items": [
+ {
+ "itemType": "document",
+ "creators": [
+ {
+ "firstName": "Gregory K",
+ "lastName": "Raschke",
+ "creatorType": "author",
+ "fieldMode": 1
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "College librarians",
+ "Recruiting",
+ "College librarians",
+ "Selection and appointment"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Hiring and recruitment practices in academic libraries",
+ "publicationTitle": "portal: libraries and the academy",
+ "ISSN": "1531-2542",
+ "volume": "3",
+ "pages": "53-57",
+ "abstractNote": "Academic libraries need to change their recruiting and hiring procedures to stay competitive in today's changing marketplace. By taking too long to find and to hire talented professionals in a tight labor market, academic libraries are losing out on top candidates and limiting their ability to become innovative and dynamic organizations. Traditional, deliberate, and risk-averse hiring models lead to positions remaining open for long periods, opportunities lost as top prospects find other positions, and a reduction in the overall talent level of the organization. To be more competitive and effective in their recruitment and hiring processes, academic libraries must foster manageable internal solutions, look to other professions for effective hiring techniques and models, and employ innovative concepts from modern personnel management literature.",
+ "language": "eng"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/NYTimes.com.js b/translators/NYTimes.com.js
@@ -1,15 +1,15 @@
{
- "translatorID": "ce7a3727-d184-407f-ac12-52837f3361ff",
- "label": "NYTimes.com",
- "creator": "Simon Kornblith",
- "target": "^https?://(?:query\\.nytimes\\.com/search/(?:alternate/)?|(?:select\\.|www\\.)?nytimes\\.com/.)",
- "minVersion": "1.0.0b3.r1",
- "maxVersion": "",
- "priority": 100,
- "browserSupport":"gcs",
- "inRepository": true,
- "translatorType": 4,
- "lastUpdated": "2011-06-19 21:21:19"
+ "translatorID": "ce7a3727-d184-407f-ac12-52837f3361ff",
+ "label": "NYTimes.com",
+ "creator": "Simon Kornblith",
+ "target": "^https?://(?:query\\.nytimes\\.com/search/(?:alternate/)?|(?:select\\.|www\\.)?nytimes\\.com/.)",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-04 01:09:00"
}
function detectWeb(doc, url) {
@@ -74,7 +74,7 @@ function scrape(doc, url) {
}
// We want to get everything on one page
newItem.attachments.push({url:url.replace(/\.html\??([^/]*)(pagewanted=[^&]*)?([^/]*)$/,".html?pagewanted=all&$1$2"), title:"New York Times Snapshot",
- mimeType:"text/html"});
+ mimeType:"text/html"});
} else {
newItem.url = doc.location.href;
var metaTagHTML = doc.getElementsByTagName("meta");
@@ -89,9 +89,9 @@ function scrape(doc, url) {
var singlePage = false;
if (!newItem.url.match(/\?pagewanted=all/)
&& (singlePage = doc.evaluate('//ul[@id="toolsList"]/li[@class="singlePage"]/a', doc, nsResolver,
- XPathResult.ANY_TYPE, null).iterateNext())) {
+ XPathResult.ANY_TYPE, null).iterateNext())) {
newItem.attachments.push({url:singlePage.href, title:"New York Times Snapshot",
- mimeType:"text/html"});
+ mimeType:"text/html"});
} else {
newItem.attachments.push({document:doc, title:"New York Times Snapshot"});
}
@@ -149,14 +149,15 @@ function doWeb(doc, url) {
if(searchResults) {
var items = Zotero.Utilities.getItemArray(doc, searchResults, '^http://(?:select\.|www\.)nytimes.com/.*\.html(\\?|$)');
- items = Zotero.selectItems(items);
- if(!items) return true;
+ Zotero.selectItems(items, function (items) {
+ if(!items) return true;
- var urls = [];
- for(var i in items) urls.push(i);
+ var urls = [];
+ for(var i in items) urls.push(i);
- Zotero.Utilities.HTTP.doGet(urls, function(text, response, url) { scrape(text, url) }, function() { Zotero.done(); }, null);
- Zotero.wait();
+ Zotero.Utilities.HTTP.doGet(urls, function(text, response, url) { scrape(text, url) }, function() { Zotero.done(); }, null);
+ Zotero.wait();
+ });
} else {
scrape(doc);
}
@@ -164,323 +165,50 @@ function doWeb(doc, url) {
/** BEGIN TEST CASES **/
var testCases = [
- {
- "type": "web",
- "url": "https://www.nytimes.com/2010/08/21/education/21harvard.html?scp=1&sq=marc%20hauser&st=cse&gwh=4B8CBC2383B24F22FED81E754DFA960B",
- "items": [
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Science and Technology",
- "Research",
- "Ethics",
- "Hauser, Marc D",
- "Harvard University"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "document": "[object]",
- "title": "New York Times Snapshot"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "https://www.nytimes.com/2010/08/21/education/21harvard.html?scp=1&sq=marc%20hauser&st=cse&gwh=4B8CBC2383B24F22FED81E754DFA960B",
- "date": "2010-08-20",
- "title": "Harvard Finds Marc Hauser Guilty of Scientific Misconduct",
- "section": "Education",
- "accessionNumber": "1248068890906",
- "libraryCatalog": "NYTimes.com",
- "accessDate": "CURRENT_TIMESTAMP"
- }
- ]
- },
- {
- "type": "web",
- "url": "http://query.nytimes.com/search/query?frow=0&n=10&srcht=a&query=marc+hauser&srchst=nyt&submit.x=18&submit.y=12&hdlquery=&bylquery=&daterange=period&mon1=01&day1=01&year1=2010&mon2=01&day2=18&year2=2011",
- "items": [
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Science and Technology",
- "Research",
- "Ethics",
- "Hauser, Marc D",
- "Harvard University"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/08/21/education/21harvard.html?pagewanted=all&scp=1&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/08/21/education/21harvard.html?scp=1&sq=marc+hauser&st=nyt",
- "date": "2010-08-20",
- "title": "Harvard Finds Marc Hauser Guilty of Scientific Misconduct",
- "section": "Education",
- "accessionNumber": "1248068890906",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Laboratories and Scientific Equipment",
- "Research",
- "Ethics",
- "Hauser, Marc D",
- "Harvard University"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/08/14/education/14harvard.html?pagewanted=all&scp=3&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/08/14/education/14harvard.html?scp=3&sq=marc+hauser&st=nyt",
- "date": "2010-08-13",
- "title": "In Inquiry at Marc Hauser’s Harvard Lab, a Raid and Then a 3-Year Wait",
- "section": "Education",
- "accessionNumber": "1247468623821",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Hauser, Marc D",
- "Harvard University",
- "Office of Research Integrity"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/08/13/education/13harvard.html?pagewanted=all&scp=4&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/08/13/education/13harvard.html?scp=4&sq=marc+hauser&st=nyt",
- "date": "2010-08-12",
- "title": "Inquiry on Harvard Lab Threatens Ripple Effect",
- "section": "Education",
- "accessionNumber": "1247468617115",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Monkeys and Apes",
- "Science and Technology",
- "Ethics",
- "Hauser, Marc D",
- "University of Virginia"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/08/28/science/28harvard.html?pagewanted=all&scp=5&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/08/28/science/28harvard.html?scp=5&sq=marc+hauser&st=nyt",
- "date": "2010-08-27",
- "title": "Marc Hauser May Have Fabricated Data at Harvard Lab",
- "section": "Science",
- "accessionNumber": "1248068931442",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Psychology and Psychologists",
- "Monkeys and Apes",
- "Science and Technology",
- "Hauser, Marc D",
- "Harvard University"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/10/26/science/26hauser.html?pagewanted=all&scp=7&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/10/26/science/26hauser.html?scp=7&sq=marc+hauser&st=nyt",
- "date": "2010-10-25",
- "title": "Harvard Case Against Marc Hauser Is Hard to Define",
- "section": "Science",
- "accessionNumber": "1248069238889",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Nicholas",
- "lastName": "Wade",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Research",
- "Colleges and Universities",
- "Ethics",
- "Hauser, Marc",
- "Harvard University"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/08/12/education/12harvard.html?pagewanted=all&scp=8&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/08/12/education/12harvard.html?scp=8&sq=marc+hauser&st=nyt",
- "date": "2010-08-11",
- "title": "Marc Hauser, Harvard Academic, Faces Inquiry",
- "section": "Education",
- "accessionNumber": "1247468609178",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "David",
- "lastName": "Brooks",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Ethics",
- "Bloom, Paul",
- "Haidt, Jonathan",
- "Phelps, Elizabeth",
- "Greene, Joshua",
- "Edge Foundation"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/07/23/opinion/23brooks.html?pagewanted=all&scp=9&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/07/23/opinion/23brooks.html?scp=9&sq=marc+hauser&st=nyt",
- "date": "2010-07-22",
- "title": "The Moral Naturalists",
- "section": "Opinion",
- "accessionNumber": "1247468494988",
- "libraryCatalog": "NYTimes.com"
- },
- {
- "itemType": "newspaperArticle",
- "creators": [
- {
- "firstName": "Claudia",
- "lastName": "Dreifus",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [
- "Dolphins and Porpoises",
- "Brain",
- "Psychology and Psychologists",
- "Whales and Whaling",
- "Science and Technology",
- "Reiss, Diana"
- ],
- "seeAlso": [],
- "attachments": [
- {
- "url": "http://www.nytimes.com/2010/09/21/science/21conversation.html?pagewanted=all&scp=10&sq=marc+hauser&st=nyt",
- "title": "New York Times Snapshot",
- "mimeType": "text/html"
- }
- ],
- "publicationTitle": "The New York Times",
- "ISSN": "0362-4331",
- "url": "http://www.nytimes.com/2010/09/21/science/21conversation.html?scp=10&sq=marc+hauser&st=nyt",
- "date": "2010-09-20",
- "title": "Studying the Big-Brained Dolphin",
- "section": "Science",
- "accessionNumber": "1248069061708",
- "libraryCatalog": "NYTimes.com"
- }
- ]
- }
+ {
+ "type": "web",
+ "url": "https://www.nytimes.com/2010/08/21/education/21harvard.html?scp=1&sq=marc%20hauser&st=cse&gwh=4B8CBC2383B24F22FED81E754DFA960B",
+ "items": [
+ {
+ "itemType": "newspaperArticle",
+ "creators": [
+ {
+ "firstName": "Nicholas",
+ "lastName": "Wade",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Science and Technology",
+ "Research",
+ "Ethics",
+ "Hauser, Marc D",
+ "Harvard University"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "document": "[object]",
+ "title": "New York Times Snapshot"
+ }
+ ],
+ "publicationTitle": "The New York Times",
+ "ISSN": "0362-4331",
+ "url": "https://www.nytimes.com/2010/08/21/education/21harvard.html?scp=1&sq=marc%20hauser&st=cse&gwh=4B8CBC2383B24F22FED81E754DFA960B",
+ "date": "2010-08-20",
+ "title": "Harvard Finds Marc Hauser Guilty of Scientific Misconduct",
+ "section": "Education",
+ "accessionNumber": "1248068890906",
+ "libraryCatalog": "NYTimes.com",
+ "accessDate": "CURRENT_TIMESTAMP"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://query.nytimes.com/search/query?frow=0&n=10&srcht=a&query=marc+hauser&srchst=nyt&submit.x=18&submit.y=12&hdlquery=&bylquery=&daterange=period&mon1=01&day1=01&year1=2010&mon2=01&day2=18&year2=2011",
+ "items": "multiple"
+ }
]
-/** END TEST CASES **/
-\ No newline at end of file
+/** END TEST CASES **/
diff --git a/translators/PLoS Journals.js b/translators/PLoS Journals.js
@@ -1,14 +1,15 @@
{
- "translatorID":"9575e804-219e-4cd6-813d-9b690cbfc0fc",
- "translatorType":4,
- "label":"PLoS Journals",
- "creator":"Michael Berkowitz And Rintze Zelle",
- "target":"^http://www\\.plos(one|ntds|compbiol|pathogens|genetics|medicine|biology)\\.org/(search|article)/",
- "minVersion":"1.0.0b4.r5",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2009-06-04 00:00:00"
+ "translatorID": "9575e804-219e-4cd6-813d-9b690cbfc0fc",
+ "label": "PLoS Journals",
+ "creator": "Michael Berkowitz And Rintze Zelle",
+ "target": "^http://www\\.plos(one|ntds|compbiol|pathogens|genetics|medicine|biology)\\.org/(search|article)/",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-03 14:59:21"
}
function detectWeb(doc, url) {
@@ -21,34 +22,39 @@ function detectWeb(doc, url) {
function getSelectedItems(doc, articleRegEx) {
- var items = new Object();
- var texts = new Array();
+ var items = {};
+ var texts = [];
var articles = doc.evaluate(articleRegEx, doc, null, XPathResult.ANY_TYPE, null);
var next_art = articles.iterateNext();
while (next_art) {
items[next_art.href] = next_art.textContent;
next_art = articles.iterateNext();
}
- items = Zotero.selectItems(items);
- for (var i in items) {
- texts.push(i);
- }
- return(texts);
+ Zotero.selectItems(items, function(items) {
+ for (var i in items) {
+ texts.push(i);
+ }
+ processTexts(texts);
+ });
}
function doWeb(doc, url) {
if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) {
var articlex = '//span[@class="article"]/a';
- var texts = getSelectedItems(doc, articlex);
+ getSelectedItems(doc, articlex);
} else if (url.indexOf("browseIssue.action") != -1) {
var articlex = '//div[@class="article"]/h3/a';
- var texts = getSelectedItems(doc, articlex);
+ getSelectedItems(doc, articlex);
} else {
- var texts = new Array(url);
+ processTexts([url]);
}
+
+ Zotero.wait();
+}
- var risLinks = new Array();
- for (var i in texts) {
+function processTexts(texts) {
+ var risLinks = [];
+ for (var i in texts) {
texts[i]=texts[i].replace(/;jsessionid[^;]+/, "");//Strip sessionID string
texts[i]=texts[i].replace(/\?.*/, "");//Strip referrer messes
var risLink = texts[i].replace("info", "getRisCitation.action?articleURI=info");
@@ -80,5 +86,187 @@ function doWeb(doc, url) {
});
translator.translate();
}, function() {Zotero.done();});
- Zotero.wait();
}
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://www.plosbiology.org/article/info%3Adoi%2F10.1371%2Fjournal.pbio.1001090",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "lastName": "Tauzin",
+ "firstName": "Sébastien ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Chaigne-Delalande",
+ "firstName": "Benjamin ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Selva",
+ "firstName": "Eric ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Khadra",
+ "firstName": "Nadine ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Daburon",
+ "firstName": "Sophie ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Contin-Bordes",
+ "firstName": "Cécile ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Blanco",
+ "firstName": "Patrick ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Le Seyec",
+ "firstName": "Jacques ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Ducret",
+ "firstName": "Thomas ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Counillon",
+ "firstName": "Laurent ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Moreau",
+ "firstName": "Jean-François ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Hofman",
+ "firstName": "Paul ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Vacher",
+ "firstName": "Pierre ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Legembre",
+ "firstName": "Patrick ",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "PLoS Full Text PDF",
+ "mimeType": "application/pdf"
+ },
+ {
+ "url": false,
+ "title": "PLoS Snapshot",
+ "mimeType": "text/html",
+ "snapshot": true
+ }
+ ],
+ "title": "The Naturally Processed CD95L Elicits a c-Yes/Calcium/PI3K-Driven Cell Migration Pathway",
+ "date": "June 21, 2011",
+ "abstractNote": "The “death receptor” CD95 (also known as Fas) plays an essential role in ensuring immune tolerance of self antigens as well as in the elimination of the body's cells that have been infected or transformed. This receptor is engaged by the membrane-bound ligand CD95L, which can be released into blood circulation after cleavage by metalloproteases. Hitherto, most of the studies on the CD95 signal have been performed with chimeric CD95Ls that mimic the membrane-bound ligand and exhibit a level of aggregation beyond that described for the metalloprotease-cleaved ligand. Multi-aggregated CD95L elicits a caspase-driven apoptotic signal. In this study, we observe that levels of soluble and naturally processed CD95L in sera of patients suffering from lupus correlate with disease severity. Strikingly, although this soluble CD95L fails to trigger cell death unlike its chimeric version, it induces a “non-canonical” Ca2+/c-yes/PI3K-dependent signaling pathway that promotes the transmigration of T-lymphocytes across the endothelial barrier. These findings shed light on an entirely new role for the soluble CD95L that may contribute to local or systemic tissue damage by enhancing the infiltration of activated T-lymphocytes. Overall, these findings underline the importance of revisiting the role of this “apoptotic cytokine” in the context of chronic inflammatory disorders.",
+ "publicationTitle": "PLoS Biol",
+ "journalAbbreviation": "PLoS Biol",
+ "volume": "9",
+ "issue": "6",
+ "pages": "e1001090",
+ "publisher": "Public Library of Science",
+ "url": "http://dx.doi.org/10.1371/journal.pbio.1001090",
+ "DOI": "10.1371/journal.pbio.1001090",
+ "libraryCatalog": "PLoS Biol"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://www.plosbiology.org/search/simpleSearch.action?from=globalSimpleSearch&filterJournals=PLoSBiology&query=amygdala&x=0&y=0",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://www.plosmedicine.org/article/info%3Adoi%2F10.1371%2Fjournal.pmed.1000098",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "lastName": "Chiasson",
+ "firstName": "T. Carter ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Manns",
+ "firstName": "Braden J. ",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Stelfox",
+ "firstName": "Henry Thomas ",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "PLoS Full Text PDF",
+ "mimeType": "application/pdf"
+ },
+ {
+ "url": false,
+ "title": "PLoS Snapshot",
+ "mimeType": "text/html",
+ "snapshot": true
+ }
+ ],
+ "title": "An Economic Evaluation of Venous Thromboembolism Prophylaxis Strategies in Critically Ill Trauma Patients at Risk of Bleeding",
+ "date": "June 23, 2009",
+ "abstractNote": "Using decision analysis, Henry Stelfox and colleagues estimate the cost-effectiveness of three venous thromboembolism prophylaxis strategies in patients with severe traumatic injuries who were also at risk for bleeding complications.",
+ "publicationTitle": "PLoS Med",
+ "journalAbbreviation": "PLoS Med",
+ "volume": "6",
+ "issue": "6",
+ "pages": "e1000098",
+ "publisher": "Public Library of Science",
+ "url": "http://dx.doi.org/10.1371/journal.pmed.1000098",
+ "DOI": "10.1371/journal.pmed.1000098",
+ "libraryCatalog": "PLoS Med"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://www.plosmedicine.org/search/simpleSearch.action?from=globalSimpleSearch&filterJournals=PLoSMedicine&query=hematoma&x=0&y=0",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://www.plosmedicine.org/article/browseIssue.action",
+ "items": "multiple"
+ }
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/ProQuest.js b/translators/ProQuest.js
@@ -1,14 +1,14 @@
{
- "translatorID": "fce388a6-a847-4777-87fb-6595e710b7e7",
- "label": "ProQuest 2",
- "creator": "Avram Lyon",
- "target": "^https?://search\\.proquest\\.com[^/]*(/pqrl|/pqdt)?/(docview|publication|publicationissue|results)",
- "minVersion": "2.0",
- "maxVersion": "",
- "priority": 100,
- "inRepository": true,
- "translatorType": 4,
- "lastUpdated": "2011-05-24 11:36:36"
+ "translatorID": "fce388a6-a847-4777-87fb-6595e710b7e7",
+ "label": "ProQuest",
+ "creator": "Avram Lyon",
+ "target": "^https?://search\\.proquest\\.com[^/]*(/pqrl|/pqdt|/hnp[a-z]*)?/(docview|publication|publicationissue|results)",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-08-02 02:41:31"
}
/*
@@ -38,9 +38,24 @@ function detectWeb(doc, url) {
var record_rows = doc.evaluate('//div[@class="display_record_indexing_row"]', doc, nsResolver, XPathResult.ANY_TYPE, null);
if (record_rows.iterateNext()) {
- return "journalArticle";
+ type = doc.evaluate('//div[@class="display_record_indexing_fieldname" and contains(text(),"Document Type")]/following-sibling::div[@class="display_record_indexing_data"]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if (type) {
+ type = type.textContent.trim();
+ type = mapToZotero(type);
+ if (type) return type;
+ }
+ // Fall back on journalArticle-- even if we couldn't guess the type
+ return "journalArticle";
+ }
+
+ if (url.indexOf("/results/") === -1) {
+ var abstract_link = doc.evaluate('//a[@class="formats_base_sprite format_abstract"]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ if (abstract_link.iterateNext()) {
+ return "journalArticle";
+ }
}
- var resultitem = doc.evaluate('//li[@class="resultItem"]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var resultitem = doc.evaluate('//li[@class="resultItem" or contains(@class, "resultItem ")]', doc, nsResolver, XPathResult.ANY_TYPE, null);
if (resultitem.iterateNext()) {
return "multiple";
}
@@ -58,7 +73,7 @@ function doWeb(doc, url) {
scrape(doc,url);
} else if (detected) {
var articles = new Array();
- var results = doc.evaluate('//li[@class="resultItem"]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var results = doc.evaluate('//li[@class="resultItem" or contains(@class, "resultItem ")]', doc, nsResolver, XPathResult.ANY_TYPE, null);
var items = new Array();
var result;
while(result = results.iterateNext()) {
@@ -67,23 +82,31 @@ function doWeb(doc, url) {
var url = link.href;
items[url] = title;
}
- items = Zotero.selectItems(items);
- if(!items) return true;
- for (var i in items) {
- articles.push(i);
- }
- Zotero.Utilities.processDocuments(articles, scrape, function () {Zotero.done();});
+ Zotero.selectItems(items, function (items) {
+ if(!items) return true;
+ for (var i in items) {
+ articles.push(i);
+ }
+ Zotero.Utilities.processDocuments(articles, scrape, function () {Zotero.done();});
+ });
Zotero.wait();
}
}
function scrape (doc) {
- var url = doc.location.href;
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
} : null;
+ var record_rows = doc.evaluate('//div[@class="display_record_indexing_row"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ var abstract_link = doc.evaluate('//a[@class="formats_base_sprite format_abstract"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if (!record_rows && abstract_link) {
+ Zotero.Utilities.processDocuments(abstract_link.href, scrape, function() {Zotero.done();});
+ return true;
+ }
+ var url = doc.location.href;
+
// ProQuest provides us with two different data sources; we can pull the RIS
// (which is nicely embedded in each page!), or we can scrape the Display Record section
// We're going to prefer the latter, since it gives us richer data.
@@ -96,7 +119,9 @@ function scrape (doc) {
item.thesisType = [];
var account_id;
while (record_row = record_rows.iterateNext()) {
- var field = doc.evaluate('./div[@class="display_record_indexing_fieldname"]', record_row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.trim();
+ var field = doc.evaluate('./div[@class="display_record_indexing_fieldname"]', record_row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()
+ if (!field) continue;
+ field = field.textContent.trim();
var value = doc.evaluate('./div[@class="display_record_indexing_data"]', record_row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.trim();
// Separate values in a single field are generally wrapped in <a> nodes; pull a list of them
var valueAResult = doc.evaluate('./div[@class="display_record_indexing_data"]/a', record_row, nsResolver, XPathResult.ANY_TYPE, null);
@@ -167,6 +192,10 @@ function scrape (doc) {
item.rights = value; break;
case "Database":
item.libraryCatalog = value; break;
+ case "Document URL":
+ item.attachments.push({url:value.replace(/\?accountid=[0-9]+$/,''),
+ title: "ProQuest Record",
+ mimeType: "text/html"}); break;
case "Language of Publication":
item.language = value; break;
case "Section":
@@ -179,15 +208,34 @@ function scrape (doc) {
}
}
- var abs = doc.evaluate('//div[@id="abstract_field"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ var abs = doc.evaluate('//div[@id="abstract_field" or @id="abstractSummary"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if (abs) {
item.abstractNote = abs.textContent
- .replace(/^.*\[\s*Show all\s*\]/,"")
- .replace(/\[\s*Show less\s*\]/,"")
+ .replace(/\[\s*[Ss]how all\s*\].*/,"")
+ .replace(/\[\s*[Ss]how less\s*\].*/,"")
.replace(/\[\s*PUBLICATION ABSTRACT\s*\]/,"")
.trim();
}
+ item.place = item.place.join(', ');
+ item.thesisType = item.thesisType.join(', ');
+
+ item.proceedingsTitle = item.publicationTitle;
+
+ // On historical newspapers, we see:
+ // Rights: Copyright New York Times Company Dec 1, 1852
+ // Date: 1852
+ // We can improve on this, so we do.
+ var fullerDate = item.rights.match(/([A-Z][a-z]{2} \d{1,2}, \d{4}$)/);
+ if (!item.date ||
+ (item.date.match(/^\d{4}$/) && fullerDate)) {
+ item.date = fullerDate[1];
+ }
+
+ if (!item.itemType && item.libraryCatalog && item.libraryCatalog.match(/Historical Newspapers/))
+ item.itemType = "newspaperArticle";
+
+ if(!item.itemType) item.itemType="journalArticle";
// Ok, now we'll pull the RIS and run it through the translator. And merge with the temporary item.
// RIS LOGIC GOES HERE
@@ -195,30 +243,28 @@ function scrape (doc) {
// Sometimes the PDF is right on this page
var realLink = doc.evaluate('//div[@id="pdffailure"]/div[@class="body"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if (realLink) {
- item.attachments.push({url:realLink.href, title:"ProQuest PDF", mimeType:"application/pdf"});
+ item.attachments.push({url:realLink.href,
+ title:"ProQuest PDF",
+ mimeType:"application/pdf"});
+ item.complete();
} else {
// The PDF link requires two requests-- we fetch the PDF full text page
var pdf = doc.evaluate('//a[@class="formats_base_sprite format_pdf"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if (pdf) {
- var pdfDoc = Zotero.Utilities.retrieveDocument(pdf.href);
- // This page gives a beautiful link directly to the PDF, right in the HTML
- realLink = pdfDoc.evaluate('//div[@id="pdffailure"]/div[@class="body"]/a', pdfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
- if (realLink) {
- item.attachments.push({url:realLink.href, title:"ProQuest PDF", mimeType:"application/pdf"});
- }
+ Zotero.Utilities.processDocuments(pdf.href, function(pdfDoc){
+ // This page gives a beautiful link directly to the PDF, right in the HTML
+ realLink = pdfDoc.evaluate('//div[@id="pdffailure"]/div[@class="body"]/a', pdfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if (realLink) {
+ item.attachments.push({url:realLink.href,
+ title:"ProQuest PDF",
+ mimeType:"application/pdf"});
+ }
+ item.complete();
+ }, function () {});
} else {
- // If no PDF, we'll save at least something. This might be fulltext, but we're not sure.
- item.attachments.push({url:url, title:"ProQuest HTML", mimeType:"text/html"});
+ item.complete();
}
}
-
- item.place = item.place.join(', ');
- item.thesisType = item.thesisType.join(', ');
-
- item.proceedingsTitle = item.publicationTitle;
-
- if(!item.itemType) item.itemType="journalArticle";
- item.complete();
}
// This map is not complete. See debug output to catch unassigned types
@@ -228,6 +274,7 @@ function mapToZotero (type) {
"Book Review-Mixed" : false, // FIX AS NECESSARY
"Reports" : "report",
"REPORT" : "report",
+ "Historical Newspapers" : "newspaperArticle",
"Newspapers" : "newspaperArticle",
//"News" : "newspaperArticle", // Otherwise Foreign Policy is treated as a newspaper http://search.proquest.com/docview/840433348
"Magazines" : "magazineArticle",
@@ -241,3 +288,61 @@ function mapToZotero (type) {
Zotero.debug("No mapping for type: "+type);
return false;
}
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://search.proquest.com/docview/213445241",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Gerald F",
+ "lastName": "Powers",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Drew",
+ "lastName": "Christiansen",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Robert T",
+ "lastName": "Hennemeyer",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Peace",
+ "Book reviews"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "ProQuest Record",
+ "mimeType": "text/html"
+ }
+ ],
+ "place": "Winnipeg",
+ "title": "Peacemaking: moral & policy challenges for a new world // Review",
+ "publicationTitle": "Peace Research",
+ "volume": "27",
+ "issue": "2",
+ "pages": "90-100",
+ "numPages": "0",
+ "date": "May 1995",
+ "publisher": "Menno Simons College",
+ "ISSN": "00084697",
+ "language": "English",
+ "rights": "Copyright Peace Research May 1995",
+ "proceedingsTitle": "Peace Research",
+ "libraryCatalog": "ProQuest",
+ "shortTitle": "Peacemaking"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Project Gutenberg.js b/translators/Project Gutenberg.js
@@ -49,7 +49,7 @@ function scrape(doc, url) {
while (i = headings.iterateNext()) {
fieldTitle = i.textContent;
dataTags[fieldTitle] = Zotero.Utilities.cleanTags(content.iterateNext().textContent.replace(/^\s*|\s*$/g, ''));
- Zotero.debug(i.textContent);
+ //Zotero.debug(i.textContent);
if (fieldTitle == "Creator") {
creatorType.push("author");
creatorField.push("Creator");
@@ -78,14 +78,14 @@ function scrape(doc, url) {
creatorType.push("contributor");
creatorField.push("Contributor");
creatorContent.push(dataTags[fieldTitle]);
- }
- if (fieldTitle == "Imprint") {
+ } else if (fieldTitle == "Imprint") {
var place = dataTags["Imprint"].split(":");
newItem.place = place[0];
- Zotero.debug(place);
- }
- if (fieldTitle == "Subject") {
- newItem.tags[i] = dataTags["Subject"];
+ //Zotero.debug(place);
+ } else if (fieldTitle == "Subject") {
+ newItem.tags.push(dataTags["Subject"]);
+ } else {
+ //Zotero.debug("Have: " + fieldTitle + "=>" + dataTags[fieldTitle]);
}
}
@@ -114,7 +114,7 @@ function scrape(doc, url) {
newItem.extra = "LoC Class " + dataTags["LoCClass"];
}
- associateData (newItem, dataTags, "Title", "title");
+ associateData (newItem, dataTags, "Title", "title");
associateData (newItem, dataTags, "Language", "language");
associateData (newItem, dataTags, "CopyrightStatus", "rights");
@@ -155,3 +155,39 @@ function doWeb(doc, url) {
scrape(doc, url);
}
}
+
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://www.gutenberg.org/ebooks/20321",
+ "items": [
+ {
+ "itemType": "book",
+ "creators": [
+ {
+ "firstName": "Bartolomé de las",
+ "lastName": "Casas",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Indians, Treatment of -- Latin America",
+ "Spain -- Colonies -- America"
+ ],
+ "seeAlso": [],
+ "attachments": [],
+ "date": "Release Date Jan 9, 2007",
+ "extra": "LoC Class F1401: Latin America local history: General",
+ "title": "A Brief Account of the Destruction of the Indies\u000aOr, a faithful NARRATIVE OF THE Horrid and Unexampled Massacres, Butcheries, and all manner of Cruelties, that Hell and Malice could invent, committed by the Popish Spanish Party on the inhabitants of West-India, TOGETHER With the Devastations of several Kingdoms in America by Fire and Sword, for the space of Forty and Two Years, from the time of its first Discovery by them.",
+ "language": "English",
+ "rights": "Public domain in the USA.",
+ "url": "http://www.gutenberg.org/ebooks/20321",
+ "libraryCatalog": "Project Gutenberg"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/RDF.js b/translators/RDF.js
@@ -4,12 +4,13 @@
"label":"RDF",
"creator":"Simon Kornblith",
"target":"rdf",
- "minVersion":"2.1b2",
+ "minVersion":"2.1.9",
"maxVersion":"",
"priority":100,
+ "browserSupport":"gcsn",
"configOptions":{"dataMode":"rdf/xml"},
"inRepository":true,
- "lastUpdated":"2011-02-03 07:00:12"
+ "lastUpdated":"2011-07-08 04:51:41"
}
function detectImport() {
@@ -299,7 +300,7 @@ function importItem(newItem, node, type) {
}
if(!newItem.itemType) {
- newItem.itemType = Export.defaultUnknownType;
+ newItem.itemType = exports.defaultUnknownType;
}
// regular author-type creators
@@ -633,10 +634,8 @@ function doImport() {
}
}
-/*
+/**
* Export doImport and defaultUnknownType to other translators
*/
-var Export = {
- "doImport":doImport,
- "defaultUnknownType":"book"
-};
-\ No newline at end of file
+exports.doImport = doImport;
+exports.defaultUnknownType = "book";
+\ No newline at end of file
diff --git a/translators/RIS.js b/translators/RIS.js
@@ -7,10 +7,10 @@
"minVersion":"2.1.3",
"maxVersion":"",
"priority":100,
- "browserSupport":"gcs",
+ "browserSupport":"gcsn",
"inRepository":true,
"displayOptions":{"exportCharset":"UTF-8", "exportNotes":true},
- "lastUpdated":"2011-06-17 20:07:40"
+ "lastUpdated":"2011-07-08 04:51:41"
}
function detectImport() {
@@ -119,7 +119,7 @@ function processTag(item, tag, value) {
if (tag != "N1" && tag != "AB" && Zotero.Utilities.unescapeHTML) {
value = Zotero.Utilities.unescapeHTML(value);
}
-
+
if(fieldMap[tag]) {
item[fieldMap[tag]] = value;
} else if(inputFieldMap[tag]) {
@@ -271,7 +271,8 @@ function processTag(item, tag, value) {
// to overlook or ignore this, so we will too on import
} else if(tag == "N2" || tag == "AB") {
// abstract
- item.abstractNote = value;
+ if (item.abstractNote) item.abstractNote += "\n" + value;
+ else item.abstractNote = value;
} else if(tag == "KW") {
// keywords/tags
@@ -416,7 +417,7 @@ function doImport(attachments) {
// if this line is a tag, take a look at the previous line to map
// its tag
if(tag) {
- Zotero.debug("tag: '"+tag+"'; data: '"+data+"'");
+ //Zotero.debug("tag: '"+tag+"'; data: '"+data+"'");
processTag(item, tag, data);
}
@@ -455,7 +456,7 @@ function doImport(attachments) {
}
if(tag && tag != "ER") { // save any unprocessed tags
- Zotero.debug(tag);
+ //Zotero.debug(tag);
processTag(item, tag, data);
completeItem(item);
}
diff --git a/translators/ReferBibIX.js b/translators/ReferBibIX.js
@@ -7,10 +7,11 @@
"minVersion":"1.0.0b4.r5",
"maxVersion":"",
"priority":100,
+ "browserSupport":"gcsn",
"configOptions":{"dataMode":"line"},
"displayOptions":{"exportCharset":"UTF-8"},
"inRepository":true,
- "lastUpdated":"2011-01-11 04:31:00"
+ "lastUpdated":"2011-07-08 04:51:41"
}
function detectImport() {
diff --git a/translators/Rice University Library Catalog.js b/translators/Rice University Library Catalog.js
@@ -0,0 +1,363 @@
+{
+ "translatorID":"23ba3be6-412d-4dde-9cc1-c4df0cc09378",
+ "label":"Rice University Library Catalog",
+ "creator":"Mang Sun",
+ "target":"^https?://[^/]*\\.rice\\.edu[^/]*/uhtbin/cgisirsi",
+ "minVersion":"2.1",
+ "maxVersion":"",
+ "priority":90,
+ "inRepository":"1",
+ "translatorType":4,
+ "lastUpdated":"2011-07-29 12:52:04"
+}
+
+/* Based on the SIRSI translator by Simon Kornblith and Michael Berkowitz,
+ and the modifications for Rutgers (IRIS) by Chad Mills.
+ */
+
+// Priority of 90 to override SIRSI
+
+function detectWeb(doc, url) {
+ if (doc.evaluate('//div[@class="columns_container"]/div[contains(@class, "left_column")]/div[@class="content_container"]/div[@class="content"]/form[@id="hitlist"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "multiple";
+ } else if (doc.evaluate('//div[@class="columns_container"]/div[contains(@class, "left_column")]/form[@name="item_view"]/div[@class="content_container item_details"]/div[@class="content"]/h3[.="Item Details"] ', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "book";
+ }
+}
+
+function scrape(doc) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var xpath = '/html/body/div[@class="columns_container"]/div[contains(@class, "left_column")]/form[@name="item_view"]/div[@class="content_container item_details"]/div[@class="content"]/ul[contains(@class, "detail_page")]/li[@id="detail_marc_record"]/dl/dt[@class="viewmarctags"]';
+
+ var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var elmt = elmts.iterateNext();
+
+ if(!elmt) {
+
+ return false;
+ }
+
+ var newItem = new Zotero.Item("book");
+ newItem.extra = "";
+ newItem.series = "";
+ var seriesItemCount = 0;
+
+
+ while(elmt) {
+ try {
+
+ //By Rice. Select all non space text nodes.
+ var node = doc.evaluate('./text()[normalize-space()]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+
+ if(node) {
+
+ if (doc.evaluate('following-sibling::dd[position()=1]/a/text()', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ {
+
+ //By Rice. Some meta data must be retrieved from the text node of anchor tags.
+ var value = Zotero.Utilities.superCleanString(doc.evaluate('following-sibling::dd[position()=1]/a/text()[normalize-space()]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
+ }
+ else
+ {
+ //while other metadata can be retrieved directly from the text node of DD tags
+ var value = Zotero.Utilities.superCleanString(doc.evaluate('following-sibling::dd[position()=1]/text()[normalize-space()]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
+ }
+
+
+ //acquire label and create super clean text by removing colon, space and etc.
+ casedField = Zotero.Utilities.superCleanString(node.nodeValue);
+ field = casedField.toLowerCase();
+
+
+ if(field == "publisher") {
+ newItem.publisher = value;
+ }else if(field == "pub date") {
+ var re = /[0-9]+/;
+ var m = re.exec(value);
+ newItem.date = m[0];
+ }else if(field == "isbn") {
+ var re = /^[0-9](?:[0-9X]+)/;
+ var m = re.exec(value);
+ newItem.ISBN = m[0];
+ }else if(field == "title") {
+ var titleParts = value.split(" / ");
+ re = /\[(.+)\]/i;
+ if (re.test(titleParts[0])) {
+ var ar = re.exec(titleParts[0]);
+ var itype = ar[1].toLowerCase();
+ if(itype== "phonodisc" || itype == "sound recording"){
+ newItem.itemType = "audioRecording";
+ }else if(itype=="videorecording"){
+ newItem.itemType = "videoRecording";
+ }else if(itype=="electronic resource"){
+ //newItem.itemType = "webPage";
+ //Rice treats eletronic resource as book
+ newItem.itemType = "book";
+ }
+ }
+ newItem.title = Zotero.Utilities.capitalizeTitle(titleParts[0]);
+
+ }else if(field == "series") {//push onto item, delimit with semicolon when needed
+ if (seriesItemCount != 0){
+ newItem.series += "; " + value;
+ }else if(seriesItemCount == 0) {
+ newItem.series = value;
+ }
+ seriesItemCount++;//bump counter
+ }else if(field == "dissertation note") {
+ newItem.itemType = "thesis";
+ var thesisParts = value.split("--");
+ var uniDate = thesisParts[1].split(", ");
+ newItem.university = uniDate[0];
+ newItem.date = uniDate[1];
+ }else if(field == "edition") {
+ newItem.edition = value;
+ }else if(field == "physical description") {
+
+ var physParts = value.split(" : ");
+ var physParts = physParts[0].split(" ; ");
+ //determine pages, split on " p."
+ var physPages = value.split(" p.");
+ //break off anything in the beginning before the numbers
+ var pageParts = physPages[0].split(" ");
+ newItem.numPages = pageParts[pageParts.length-1];
+ }else if(field == "publication info") {
+ var pubParts = value.split(" : ");
+ newItem.place = pubParts[0];
+ //drop off first part of array and recombine
+ pubParts.shift();
+ var i;
+ var publisherInfo;
+ for (i in pubParts) {
+ if (i == 0) {
+ publisherInfo = pubParts[i] + " : ";
+ } else {
+ publisherInfo = publisherInfo + pubParts[i] + " : ";
+ }
+ }//END for
+ //drop off last colon
+ publisherInfo = publisherInfo.substring(0,(publisherInfo.length - 3));
+ //break apart publication parts into Publisher and Date
+ var publisherParts = publisherInfo.split(",");
+ newItem.publisher = publisherParts[0];
+ //check that first character isn't a 'c', if so drop it
+ if (publisherParts[1].substring(1,2) == "c") {
+ newItem.date = publisherParts[1].substring(2);
+ }
+ else {
+ newItem.date = publisherParts[1];
+ }
+ }else if(field == "personal author") {
+
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
+ }else if(field == "performer") {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "performer", true));
+ }else if(field == "author"){
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
+ }else if(field == "added author") {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "contributor", true));
+ }else if(field == "conference author" || field == "corporate author") {
+
+
+
+ //The following line is included by Rice to handle corporate or conference author
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
+ }else if(field == "subject" || field == "corporate subject" || field == "geographic term") {
+ var subjects = value.split("--");
+ newItem.tags = newItem.tags.concat(subjects);
+ }else if(field == "personal subject") {
+ var subjects = value.split(", ");
+ newItem.tags = newItem.tags.push(value[0]+", "+value[1]);
+ }else if(value && field != "http") {
+ newItem.extra += casedField+": "+value+"\n";
+ }
+ }
+ } catch (e) {}
+ elmt = elmts.iterateNext();
+
+ }//END if node
+
+ if(newItem.extra) {
+ newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
+ }
+
+ var callNumber = doc.evaluate('//tr/td[1][@class="holdingslist"]/strong/text()', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+
+ if(callNumber && callNumber.nodeValue) {
+ newItem.callNumber = callNumber.nodeValue;
+ }
+
+ newItem.libraryCatalog = "Rice University Library Catalog";
+ newItem.complete();
+ //Zotero.debug('hi');
+ return true;
+ }//END try
+
+ function doWeb(doc, url){
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var sirsiNew = true; //toggle between SIRSI -2003 and SIRSI 2003+
+ //Adapted to catch the hitlist page of Rice Catalog
+ var xpath = '/html/body/div[@class="columns_container"]/div[contains(@class, "left_column")]/div[@class="content_container"]/div[@class="content"]/form[@id="hitlist"]/ul[@class="hit_list"]/li/ul[starts-with(@class, "hit_list_row")]/li[@class="hit_list_item_info"]/dl';
+
+ if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ Zotero.debug("SIRSI doWeb: searchsum");
+ sirsiNew = true;
+ }else if (doc.evaluate('//form[@name="hitlist"]/table/tbody/tr', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ Zotero.debug("SIRSI doWeb: hitlist");
+ sirsiNew = false;
+ }else if (doc.evaluate('//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ Zotero.debug("SIRSI doWeb: viewmarctags");
+ sirsiNew = true;
+ }else if (doc.evaluate('//input[@name="VOPTIONS"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ Zotero.debug("SIRSI doWeb: VOPTIONS");
+ sirsiNew = false;
+ }else {
+ var elmts = doc.evaluate('/html/body/form//text()', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ //var elmts = doc.evaluate(' ', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ while(elmt = elmts.iterateNext()) {
+ if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
+ Zotero.debug("SIRSI doWeb: Viewing record");
+ sirsiNew = false;
+ }
+ }//END while elmts
+ }//END FUNCTION doWeb
+ // Zotero.debug(xpath);
+ if (sirsiNew) { //executes Simon's SIRSI 2003+ scraper code
+
+ if(!scrape(doc)) {
+
+ var checkboxes = new Array();
+ var urls = new Array();
+ var availableItems = new Array();
+ //pull items
+ var tableRows = doc.evaluate('//ul[@class="hit_list"]/li/ul[contains(@class, "hit_list_row")][//input[@value="Details"]]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+
+ // Go through table rows
+ while(tableRow = tableRows.iterateNext()) {
+ var input = doc.evaluate('.//input[@value="Details"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+
+ //var text = doc.evaluate('.//strong', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var text = doc.evaluate('.//dd[@class="title"]/a', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ if(text) {
+ availableItems[input.name] = text;
+ }
+ }//END while
+ var items = Zotero.selectItems(availableItems);
+ if(!items) {
+ return true;
+ }
+
+ var hostRe = new RegExp("^http(?:s)?://[^/]+");
+ var m = hostRe.exec(doc.location.href);
+ Zotero.debug("href: " + doc.location.href);
+ var hitlist = doc.forms.namedItem("hitlist");
+ var baseUrl = m[0]+hitlist.getAttribute("action")+"?first_hit="+hitlist.elements.namedItem("first_hit").value+"&last_hit="+hitlist.elements.namedItem("last_hit").value;
+ var alexandria = new Array();
+ for(var i in items) {
+ alexandria.push(baseUrl+"&"+i+"=Details");
+ }
+ Zotero.Utilities.processDocuments(alexandria, function(doc) { scrape(doc) }, function() { Zotero.done() }, null);
+ Zotero.wait();
+ }//END if not scrape(doc)
+ }else{ //executes Simon's SIRSI -2003 translator code
+ Zotero.debug("Running SIRSI -2003 code");
+
+ var uri = doc.location.href;
+ var recNumbers = new Array();
+ var xpath = '//form[@name="hitlist"]/table/tbody/tr';
+ var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var elmt = elmts.iterateNext();
+ if(elmt) { // Search results page
+ var uriRegexp = /^http:\/\/[^\/]+/;
+ var m = uriRegexp.exec(uri);
+ var postAction = doc.forms.namedItem("hitlist").getAttribute("action");
+ var newUri = m[0]+postAction.substr(0, postAction.length-1)+"40";
+ var titleRe = /<br>\s*(.*[^\s])\s*<br>/i;
+ var items = new Array();
+ do {
+ var checkbox = doc.evaluate('.//input[@type="checkbox"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ // Collect title
+ var title = doc.evaluate("./td[2]", elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ if(checkbox && title) {
+ items[checkbox.name] = Zotero.Utilities.trimInternal(title);
+ }
+ } while(elmt = elmts.iterateNext());
+ items = Zotero.selectItems(items);
+ if(!items) {
+ return true;
+ }
+ for(var i in items) {
+ recNumbers.push(i);
+ }
+ } else {// Normal page
+ // this regex will fail about 1/100,000,000 tries
+ var uriRegexp = /^((.*?)\/([0-9]+?))\//;
+ var m = uriRegexp.exec(uri);
+ var newUri = m[1]+"/40"
+ var elmts = doc.evaluate('/html/body/form', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ while(elmt = elmts.iterateNext()) {
+ var initialText = doc.evaluate('.//text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if(initialText && initialText.nodeValue && Zotero.Utilities.superCleanString(initialText.nodeValue) == "Viewing record") {
+ recNumbers.push(doc.evaluate('./b[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
+ break;
+ }
+ }
+ }
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
+ var marc = translator.getTranslatorObject();
+ Zotero.Utilities.loadDocument(newUri+'?marks='+recNumbers.join(",")+'&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=', function(doc) {
+ var pre = doc.getElementsByTagName("pre");
+ var text = pre[0].textContent;
+ var documents = text.split("*** DOCUMENT BOUNDARY ***");
+ for(var j=1; j<documents.length; j++) {
+ var uri = newUri+"?marks="+recNumbers[j]+"&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=";
+ var lines = documents[j].split("\n");
+ var record = new marc.record();
+ var tag, content;
+ var ind = "";
+ for(var i=0; i<lines.length; i++) {
+ var line = lines[i];
+ if(line[0] == "." && line.substr(4,2) == ". ") {
+ if(tag) {
+ content = content.replace(/\|([a-z])/g, marc.subfieldDelimiter+"$1");
+ record.addField(tag, ind, content);
+ }
+ } else {
+ content += " "+line.substr(6);
+ continue;
+ }
+ tag = line.substr(1, 3);
+ if(tag[0] != "0" || tag[1] != "0") {
+ ind = line.substr(6, 2);
+ content = line.substr(8);
+ } else {
+ content = line.substr(7);
+ if(tag == "000") {
+ tag = undefined;
+ record.leader = "00000"+content;
+ Zotero.debug("the leader is: "+record.leader);
+ }
+ }
+ }//end FOR
+ var newItem = new Zotero.Item();
+ record.translate(newItem);
+
+ newItem.libraryCatalog = "Rice University Library ";
+ newItem.complete();
+ }//end FOR
+ Zotero.done();
+ });
+ Zotero.wait();
+ }//END while
+}//END scrape function
diff --git a/translators/ScienceDirect.js b/translators/ScienceDirect.js
@@ -1,15 +1,15 @@
{
- "translatorID": "b6d0a7a-d076-48ae-b2f0-b6de28b194e",
- "label": "ScienceDirect",
- "creator": "Michael Berkowitz",
- "target": "https?://[^/]*science-?direct\\.com[^/]*/science(\\/article)?(\\?(?:.+\\&|)ob=(?:ArticleURL|ArticleListURL|PublicationURL))?",
- "minVersion": "1.0.0b3.r1",
- "maxVersion": "",
- "priority": 100,
- "inRepository": true,
- "translatorType": 4,
- "browserSupport": "gcs",
- "lastUpdated": "2011-06-20 02:05:48"
+ "translatorID": "b6d0a7a-d076-48ae-b2f0-b6de28b194e",
+ "label": "ScienceDirect",
+ "creator": "Michael Berkowitz",
+ "target": "^https?://[^/]*science-?direct\\.com[^/]*/science(\\/article)?(\\?(?:.+\\&|)ob=(?:ArticleURL|ArticleListURL|PublicationURL))?",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-09 01:55:35"
}
function detectWeb(doc, url) {
@@ -168,7 +168,7 @@ function doWeb(doc, url) {
item.abstractNote = item.notes[0].note;
item.notes = new Array();
}
- item.DOI = item.DOI.substr(10);
+ item.DOI = item.DOI.replace(/^doi:\s+/i, '');
item.complete();
});
translator.translate();
@@ -330,54 +330,53 @@ function doWeb(doc, url) {
/** BEGIN TEST CASES **/
var testCases = [
- {
- "type": "web",
- "url": "http://www.sciencedirect.com/science/article/pii/S0896627311004430#bib5",
- "items": [
- {
- "itemType": "journalArticle",
- "creators": [
- {
- "lastName": "Schaaf",
- "firstName": "Christian P.",
- "creatorType": "author"
- },
- {
- "lastName": "Zoghbi",
- "firstName": "Huda Y.",
- "creatorType": "author"
- }
- ],
- "notes": [],
- "tags": [],
- "seeAlso": [],
- "attachments": [
- {
- "url": false,
- "title": "ScienceDirect Snapshot",
- "mimeType": "text/html"
- },
- {
- "url": false,
- "title": "ScienceDirect Full Text PDF",
- "mimeType": "application/pdf"
- }
- ],
- "title": "Solving the Autism Puzzle a Few Pieces at a Time",
- "publicationTitle": "Neuron",
- "volume": "70",
- "issue": "5",
- "pages": "806-808",
- "date": "June 9, 2011",
- "backupPublicationTitle": "",
- "ISBN": "0896-6273",
- "ISSN": "0896-6273",
- "DOI": "16/j.neuron.2011.05.025",
- "url": "http://www.sciencedirect.com/science/article/pii/S0896627311004430",
- "abstractNote": "\u000aIn this issue, a pair of studies (Levy et al. and Sanders et al.) identify several de novo copy-number variants that together account for 5%-8% of cases of simplex autism spectrum disorders. These studies suggest that several hundreds of loci are likely to contribute to the complex genetic heterogeneity of this group of disorders. An accompanying study in this issue (Gilman et al.), presents network analysis implicating these CNVs in neural processes related to synapse development, axon targeting, and neuron motility.",
- "libraryCatalog": "ScienceDirect"
- }
- ]
- }
+ {
+ "type": "web",
+ "url": "http://www.sciencedirect.com/science/article/pii/S0896627311004430#bib5",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "lastName": "Schaaf",
+ "firstName": "Christian P.",
+ "creatorType": "author"
+ },
+ {
+ "lastName": "Zoghbi",
+ "firstName": "Huda Y.",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "ScienceDirect Snapshot",
+ "mimeType": "text/html"
+ },
+ {
+ "url": false,
+ "title": "ScienceDirect Full Text PDF",
+ "mimeType": "application/pdf"
+ }
+ ],
+ "title": "Solving the Autism Puzzle a Few Pieces at a Time",
+ "publicationTitle": "Neuron",
+ "volume": "70",
+ "issue": "5",
+ "pages": "806-808",
+ "date": "June 9, 2011",
+ "ISBN": "0896-6273",
+ "ISSN": "0896-6273",
+ "DOI": "10.1016/j.neuron.2011.05.025",
+ "url": "http://www.sciencedirect.com/science/article/pii/S0896627311004430",
+ "abstractNote": "In this issue, a pair of studies (Levy et al. and Sanders et al.) identify several de novo copy-number variants that together account for 5%-8% of cases of simplex autism spectrum disorders. These studies suggest that several hundreds of loci are likely to contribute to the complex genetic heterogeneity of this group of disorders. An accompanying study in this issue (Gilman et al.), presents network analysis implicating these CNVs in neural processes related to synapse development, axon targeting, and neuron motility.",
+ "libraryCatalog": "ScienceDirect"
+ }
+ ]
+ }
]
/** END TEST CASES **/
\ No newline at end of file
diff --git a/translators/Scopus.js b/translators/Scopus.js
@@ -1,20 +1,38 @@
{
- "translatorID":"a14ac3eb-64a0-4179-970c-92ecc2fec992",
- "translatorType":4,
- "label":"Scopus",
- "creator":"Michael Berkowitz and Rintze Zelle",
- "target":"http://[^/]*www.scopus.com[^/]*",
- "minVersion":"1.0.0b4.r5",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2009-06-04 00:00:00"
+ "translatorID": "a14ac3eb-64a0-4179-970c-92ecc2fec992",
+ "label": "Scopus",
+ "creator": "Michael Berkowitz, Rintze Zelle and Avram Lyon",
+ "target": "^http://www\\.scopus\\.com[^/]*",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-27 14:06:10"
}
+/*
+ Scopus Translator
+ Copyright (C) 2008-2011 Center for History and New Media
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
function detectWeb(doc, url) {
- if (url.indexOf("/results/") != -1) {
+ if (url.indexOf("/results/") !== -1) {
return "multiple";
- } else if (url.indexOf("/record/") != -1) {
+ } else if (url.indexOf("/record/") !== -1) {
return "journalArticle";
}
}
@@ -24,7 +42,7 @@ function getEID(url) {
}
function returnURL(eid) {
- return 'http://www.scopus.com/scopus/citation/output.url?origin=recordpage&eid=' + eid + '&src=s&view=CiteAbsKeywsRefs';
+ return 'http://www.scopus.com/citation/output.url?origin=recordpage&eid=' + eid + '&src=s&view=FullDocument&outputType=export';
}
function doWeb(doc, url) {
@@ -36,24 +54,35 @@ function doWeb(doc, url) {
var articles = new Array();
if (detectWeb(doc, url) == "multiple") {
items = new Object();
- var boxes = doc.evaluate('//table/tbody/tr[@class]/td[@class="fldtextPad"][1]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var boxes = doc.evaluate('//div[@id="resultsBody"]/table/tbody/tr[@class and (not(@id) or not(contains(@id,"previewabstractrow")))]/td[@class="fldtextPad"][1]', doc, nsResolver, XPathResult.ANY_TYPE, null);
var box;
while (box = boxes.iterateNext()) {
- var title = Zotero.Utilities.trimInternal(doc.evaluate('.//span[@class="txtBoldOnly"]', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
- var link = doc.evaluate('.//a[@class="outwardLink"]', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
- items[link] = title;
- }
- items = Zotero.selectItems(items);
- for (var i in items) {
- articles.push(returnURL(getEID(i)));
+ var link = doc.evaluate('.//a', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ items[link.href] = Zotero.Utilities.trimInternal(link.textContent);
}
+ Zotero.selectItems(items, function (items) {
+ for (var i in items) {
+ articles.push(returnURL(getEID(i)));
+ }
+ scrape(articles);
+ });
} else {
articles = [returnURL(getEID(url))];
+ scrape(articles);
}
- Zotero.Utilities.processDocuments(articles, function(newDoc) {
- var eid = getEID(newDoc.location.href);
- var stateKey = newDoc.evaluate('//input[@name="stateKey"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
- var get = 'http://www.scopus.com/scopus/citation/export.url';
+ Zotero.wait();
+}
+
+function scrape(articles) {
+ var article = articles.shift();
+ Zotero.Utilities.doGet(article, function(text, obj) {
+ var stateKey = text.match(/<input[^>]*name="stateKey"[^>]*>/);
+ if (!stateKey) Zotero.debug("No stateKey");
+ else stateKey = stateKey[0].match(/value="([^"]*)"/)[1];
+ var eid = text.match(/<input[^>]*name="eid"[^>]*>/);
+ if (!eid) Zotero.debug("No eid");
+ else eid = eid[0].match(/value="([^"]*)"/)[1];
+ var get = 'http://www.scopus.com/citation/export.url';
var post = 'origin=recordpage&sid=&src=s&stateKey=' + stateKey + '&eid=' + eid + '&sort=&exportFormat=RIS&view=CiteAbsKeyws&selectedCitationInformationItemsAll=on';
var rislink = get + "?" + post;
Zotero.Utilities.HTTP.doGet(rislink, function(text) {
@@ -62,14 +91,17 @@ function doWeb(doc, url) {
translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
translator.setString(text);
translator.setHandler("itemDone", function(obj, item) {
- if (item.notes[0]['note']) {
- item.abstractNote = item.notes[0]['note'];
- item.notes = new Array();
- item.complete();
+ for (i in item.notes) {
+ if (item.notes[i]['note'].match(/Export Date:|Source:/))
+ delete item.notes[i];
}
+ delete item.url;
+ item.complete();
});
translator.translate();
+ }, function() {
+ if (articles.length > 0) scrape(articles);
+ else Zotero.done();
});
- }, function() {Zotero.done();});
- Zotero.wait();
-}
-\ No newline at end of file
+ });
+}
diff --git a/translators/Twitter.js b/translators/Twitter.js
@@ -0,0 +1,94 @@
+{
+ "translatorID": "31659710-d04e-45d0-84ba-8e3f5afc4a54",
+ "label": "Twitter",
+ "creator": "Avram Lyon",
+ "target": "^https?://twitter\\.com\\/.*\\/status\\/\\d+",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-30 13:05:30"
+}
+
+/* FW LINE 46:127318f30c1d */ function flatten(c){var b=new Array();for(var d in c){var e=c[d];if(e instanceof Array){b=b.concat(flatten(e))}else{b.push(e)}}return b}var FW={_scrapers:new Array()};FW._Base=function(){this.callHook=function(b,c,e,a){if(typeof this["hooks"]==="object"){var d=this["hooks"][b];if(typeof d==="function"){d(c,e,a)}}};this.evaluateThing=function(f,e,c){var b=typeof f;if(b==="string"){return f}else{if(b==="object"){if(f instanceof Array){var d=this.evaluateThing;var a=f.map(function(g){return d(g,e,c)});return flatten(a)}else{return f.evaluate(e,c)}}else{if(b==="function"){return f(e,c)}else{return undefined}}}}};FW.Scraper=function(a){FW._scrapers.push(new FW._Scraper(a))};FW._Scraper=function(a){for(x in a){this[x]=a[x]}this._singleFieldNames=["abstractNote","applicationNumber","archive","archiveLocation","artworkMedium","artworkSize","assignee","audioFileType","audioRecordingType","billNumber","blogTitle","bookTitle","callNumber","caseName","code","codeNumber","codePages","codeVolume","committee","company","conferenceName","country","court","date","dateDecided","dateEnacted","dictionaryTitle","distributor","docketNumber","documentNumber","DOI","edition","encyclopediaTitle","episodeNumber","extra","filingDate","firstPage","forumTitle","genre","history","institution","interviewMedium","ISBN","ISSN","issue","issueDate","issuingAuthority","journalAbbreviation","label","language","legalStatus","legislativeBody","letterType","libraryCatalog","manuscriptType","mapType","medium","meetingName","nameOfAct","network","number","numberOfVolumes","numPages","pages","patentNumber","place","postType","presentationType","priorityNumbers","proceedingsTitle","programTitle","programmingLanguage","publicLawNumber","publicationTitle","publisher","references","reportNumber","reportType","reporter","reporterVolume","rights","runningTime","scale","section","series","seriesNumber","seriesText","seriesTitle","session","shortTitle","studio","subject","system","thesisType","title","type","university","url","version","videoRecordingType","volume","websiteTitle","websiteType"];this._makeAttachments=function(q,b,f,s){if(f instanceof Array){f.forEach(function(k){this._makeAttachments(q,b,k,s)},this)}else{if(typeof f==="object"){var p=f.urls||f.url;var m=f.types||f.type;var e=f.titles||f.title;var h=this.evaluateThing(p,q,b);var o=this.evaluateThing(e,q,b);var r=this.evaluateThing(m,q,b);var l=(r instanceof Array);var n=(o instanceof Array);if(!(h instanceof Array)){h=[h]}for(var j in h){var c=h[j];var g;var d;if(l){g=r[j]}else{g=r}if(n){d=o[j]}else{d=o}s.attachments.push({url:c,title:d,type:g})}}}};this.makeItems=function(o,b,m,c,l){var q=new Zotero.Item(this.itemType);q.url=b;for(var h in this._singleFieldNames){var n=this._singleFieldNames[h];if(this[n]){var g=this.evaluateThing(this[n],o,b);if(g instanceof Array){q[n]=g[0]}else{q[n]=g}}}var r=["creators","tags"];for(var f in r){var p=r[f];var d=this.evaluateThing(this[p],o,b);if(d){for(var e in d){q[p].push(d[e])}}}this._makeAttachments(o,b,this["attachments"],q);c(q,this,o,b);l([q])}};FW._Scraper.prototype=new FW._Base;FW.MultiScraper=function(a){FW._scrapers.push(new FW._MultiScraper(a))};FW._MultiScraper=function(a){for(x in a){this[x]=a[x]}this._mkSelectItems=function(e,d){var b=new Object;for(var c in e){b[d[c]]=e[c]}return b};this._selectItems=function(d,c,e){var b=new Array();Zotero.selectItems(this._mkSelectItems(d,c),function(f){for(var g in f){b.push(g)}e(b)})};this._mkAttachments=function(g,d,f){var b=this.evaluateThing(this["attachments"],g,d);var c=new Object();if(b){for(var e in f){c[f[e]]=b[e]}}return c};this._makeChoices=function(f,p,c,d,h){if(f instanceof Array){f.forEach(function(k){this._makeTitlesUrls(k,p,c,d,h)},this)}else{if(typeof f==="object"){var m=f.urls||f.url;var e=f.titles||f.title;var n=this.evaluateThing(m,p,c);var j=this.evaluateThing(e,p,c);var l=(j instanceof Array);if(!(n instanceof Array)){n=[n]}for(var g in n){var b=n[g];var o;if(l){o=j[g]}else{o=j}h.push(b);d.push(o)}}}};this.makeItems=function(j,b,g,c,f){Zotero.debug("Entering MultiScraper.makeItems");if(this.beforeFilter){var k=this.beforeFilter(j,b);if(k!=b){this.makeItems(j,k,g,c,f);return}}var e=[];var h=[];this._makeChoices(this["choices"],j,b,e,h);var d=this._mkAttachments(j,b,h);this._selectItems(e,h,function(m){if(!m){f([])}else{var l=[];var n=this.itemTrans;Zotero.Utilities.processDocuments(m,function(q){var p=q.documentURI;var o=n;if(o===undefined){o=FW.getScraper(q,p)}if(o===undefined){}else{o.makeItems(q,p,d[p],function(r){l.push(r);c(r,o,q,p)},function(){})}},function(){f(l)})}})}};FW._MultiScraper.prototype=new FW._Base;FW.DelegateTranslator=function(a){return new FW._DelegateTranslator(a)};FW._DelegateTranslator=function(a){for(x in a){this[x]=a[x]}this._translator=Zotero.loadTranslator(this.translatorType);this._translator.setTranslator(this.translatorId);this.makeItems=function(g,d,b,f,c){Zotero.debug("Entering DelegateTranslator.makeItems");var e;Zotero.Utilities.HTTP.doGet(d,function(h){this._translator.setHandler("itemDone",function(k,j){e=j;if(b){j.attachments=b}});this._translator.setString(h);this._translator.translate();f(e)},function(){c([e])})}};FW.DelegateTranslator.prototype=new FW._Scraper;FW._StringMagic=function(){this._filters=new Array();this.addFilter=function(a){this._filters.push(a);return this};this.split=function(a){return this.addFilter(function(b){return b.split(a).filter(function(c){return(c!="")})})};this.replace=function(c,b,a){return this.addFilter(function(d){if(d.match(c)){return d.replace(c,b,a)}else{return d}})};this.prepend=function(a){return this.replace(/^/,a)};this.append=function(a){return this.replace(/$/,a)};this.remove=function(b,a){return this.replace(b,"",a)};this.trim=function(){return this.addFilter(function(a){return Zotero.Utilities.trim(a)})};this.trimInternal=function(){return this.addFilter(function(a){return Zotero.Utilities.trimInternal(a)})};this.match=function(a,b){if(!b){b=0}return this.addFilter(function(d){var c=d.match(a);if(c===undefined||c===null){return undefined}else{return c[b]}})};this.cleanAuthor=function(b,a){return this.addFilter(function(c){return Zotero.Utilities.cleanAuthor(c,b,a)})};this.key=function(a){return this.addFilter(function(b){return b[a]})};this.capitalizeTitle=function(){return this.addFilter(function(a){return Zotero.Utilities.capitalizeTitle(a)})};this.unescapeHTML=function(){return this.addFilter(function(a){return Zotero.Utilities.unescapeHTML(a)})};this.unescape=function(){return this.addFilter(function(a){return unescape(a)})};this._applyFilters=function(c,e){for(i in this._filters){c=flatten(c);c=c.filter(function(a){return((a!==undefined)&&(a!==null))});for(var d=0;d<c.length;d++){try{if((c[d]===undefined)||(c[d]===null)){continue}else{c[d]=this._filters[i](c[d],e)}}catch(b){c[d]=undefined;Zotero.debug("Caught exception "+b+"on filter: "+this._filters[i])}}c=c.filter(function(a){return((a!==undefined)&&(a!==null))})}return c}};FW.PageText=function(){return new FW._PageText()};FW._PageText=function(){this._filters=new Array();this.evaluate=function(c){var b=[c.documentElement.innerHTML];b=this._applyFilters(b,c);if(b.length==0){return false}else{return b}}};FW._PageText.prototype=new FW._StringMagic();FW.Url=function(){return new FW._Url()};FW._Url=function(){this._filters=new Array();this.evaluate=function(d,c){var b=[c];b=this._applyFilters(b,d);if(b.length==0){return false}else{return b}}};FW._Url.prototype=new FW._StringMagic();FW.Xpath=function(a){return new FW._Xpath(a)};FW._Xpath=function(a){this._xpath=a;this._filters=new Array();this.text=function(){var b=function(c){if(typeof c==="object"&&c.textContent){return c.textContent}else{return c}};this.addFilter(b);return this};this.sub=function(b){var c=function(f,e){var d=e.evaluate(b,f,null,XPathResult.ANY_TYPE,null);if(d){return d.iterateNext()}else{return undefined}};this.addFilter(c);return this};this.evaluate=function(e){var d=e.evaluate(this._xpath,e,null,XPathResult.ANY_TYPE,null);var c=new Array();var b;while(b=d.iterateNext()){c.push(b)}c=this._applyFilters(c,e);if(c.length==0){return false}else{return c}}};FW._Xpath.prototype=new FW._StringMagic();FW.detectWeb=function(e,b){for(var c in FW._scrapers){var d=FW._scrapers[c];var f=d.evaluateThing(d.itemType,e,b);if(!d.detect){return f}else{var a=d.evaluateThing(d.detect,e,b);if(a.length>0&&a[0]){return f}}}return undefined};FW.getScraper=function(b,a){var c=FW.detectWeb(b,a);return FW._scrapers.filter(function(d){return(d.evaluateThing(d.itemType,b,a)==c)&&(d.evaluateThing(d.detect,b,a))})[0]};FW.doWeb=function(c,a){Zotero.debug("Entering FW.doWeb");var b=FW.getScraper(c,a);b.makeItems(c,a,[],function(f,e,g,d){e.callHook("scraperDone",f,g,d);if(!f.title){f.title=""}f.complete()},function(){Zotero.done()});Zotero.wait();Zotero.debug("Leaving FW.doWeb")};
+
+/*
+ Twitter Translator
+ Copyright (C) 2011 Avram Lyon, ajlyon@gmail.com
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+function detectWeb(doc, url) { return FW.detectWeb(doc, url); }
+function doWeb(doc, url) { return FW.doWeb(doc, url); }
+
+FW.Scraper({
+itemType : "blogPost",
+detect : FW.Url(),
+attachments : { url : FW.Url() ,
+ title : "Tweet Snapshot" ,
+ type : "text/html" },
+blogTitle : FW.Url().match(/([^\/]+)\/status\/\d+/,1).prepend("@"),
+creators : FW.Xpath('//div[contains(@class,"permalink-tweet")]//span[@class="tweet-user-block-full-name"]')
+ .text().cleanAuthor("author"),
+// This part is fragile, since we have to iterate over the attributes
+date : FW.Xpath('//div[contains(@class,"permalink-tweet")]//a[@class="tweet-timestamp"]/span[@class="_timestamp"]/attribute::*[2]')
+ .text(),
+websiteType : "microblog",
+title : FW.Xpath('//div[contains(@class,"permalink-tweet")]//div[contains(@class,"tweet-text-large")]').text(),
+hooks : {
+ "scraperDone" : function (item, doc, url) {
+ var temp = new Date(item.date*1);
+ item.date = temp.toGMTString();
+ }
+}
+});
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://twitter.com/#!/mukhamadi/status/92477274246479872",
+ "items": [
+ {
+ "itemType": "blogPost",
+ "creators": [
+ {
+ "firstName": "Lenar",
+ "lastName": "Mukhamadi",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "Tweet Snapshot",
+ "type": "text/html"
+ }
+ ],
+ "url": "http://twitter.com/#!/mukhamadi/status/92477274246479872",
+ "blogTitle": "@mukhamadi",
+ "date": "Sun, 17 Jul 2011 06:14:34 GMT",
+ "title": "Гали Акыш вафат...Идел-Урал ялкынының соңгы учагы сүнде...",
+ "websiteType": "microblog",
+ "libraryCatalog": "Twitter"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Unqualified Dublin Core RDF.js b/translators/Unqualified Dublin Core RDF.js
@@ -7,9 +7,10 @@
"minVersion":"1.0.0b3.r1",
"maxVersion":"",
"priority":100,
+ "browserSupport":"gcsn",
"configOptions":{"dataMode":"rdf/xml"},
"inRepository":true,
- "lastUpdated":"2011-01-11 04:31:00"
+ "lastUpdated":"2011-07-08 04:51:41"
}
function doExport() {
diff --git a/translators/Wikileaks Cables.js b/translators/Wikileaks Cables.js
@@ -19,7 +19,7 @@ function doWeb(doc, url) { return FW.doWeb(doc, url); }
FW.Scraper({
itemType : 'document',
detect : "always",
- title : FW.Xpath('//table[@class="cable"]/tbody/tr[2]/td/a').text().prepend("Wikileaks Cable "),
+ title : FW.Xpath('//div[@class="pane big"]/h3').text().remove(/^Viewing cable /).prepend("Wikileaks Cable ")
attachments : [{
url: FW.Url(),
title: "Wikileaks cable snapshot",
diff --git a/translators/Wikipedia Citation Templates.js b/translators/Wikipedia Citation Templates.js
@@ -8,8 +8,9 @@
"maxVersion":"",
"priority":100,
"displayOptions":{"exportCharset":"UTF-8"},
+ "browserSupport":"gcsn",
"inRepository":true,
- "lastUpdated":"2011-01-11 04:31:00"
+ "lastUpdated":"2011-07-08 04:51:41"
}
var fieldMap = {
diff --git a/translators/Wiley Online Library.js b/translators/Wiley Online Library.js
@@ -1,14 +1,14 @@
{
- "translatorID": "fe728bc9-595a-4f03-98fc-766f1d8d0936",
- "label": "Wiley Online Library",
- "creator": "Sean Takats, Michael Berkowitz and Avram Lyon",
- "target": "https?://onlinelibrary\\.wiley\\.com[^\\/]*/(?:doi|advanced/search)",
- "minVersion": "1.0.0b4.r5",
- "maxVersion": "",
- "priority": 100,
- "inRepository": "1",
- "translatorType": 4,
- "lastUpdated": "2011-03-27 01:29:16"
+ "translatorID": "fe728bc9-595a-4f03-98fc-766f1d8d0936",
+ "label": "Wiley Online Library",
+ "creator": "Sean Takats, Michael Berkowitz and Avram Lyon",
+ "target": "^https?://onlinelibrary\\.wiley\\.com[^\\/]*/(?:doi|advanced/search)",
+ "minVersion": "1.0.0b4.r5",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-07-20 17:14:04"
}
function detectWeb(doc, url){
@@ -23,6 +23,10 @@ function detectWeb(doc, url){
}
function doWeb(doc, url){
+ // Define ZU, Z
+ if (!ZU) var ZU = Zotero.Utilities;
+ if (!Z) var Z = Zotero;
+
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
@@ -96,25 +100,25 @@ function scrape(doc,url)
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
} : null;
-
+
var newItem=new Zotero.Item("journalArticle");
- var temp;
- var xpath;
- var row;
- var rows;
+ var temp;
+ var xpath;
+ var row;
+ var rows;
- newItem.url = doc.location.href;
- var metaTags = doc.getElementsByTagName("meta");
+ newItem.url = doc.location.href;
+ var metaTags = doc.getElementsByTagName("meta");
- var pages = [false, false];
- var doi = false;
- var pdf = false;
- var html = false;
+ var pages = [false, false];
+ var doi = false;
+ var pdf = false;
+ var html = false;
for (var i = 0; i< metaTags.length; i++) {
var tag = metaTags[i].getAttribute("name");
var value = metaTags[i].getAttribute("content");
//Zotero.debug(pages + pdf + html);
- //Zotero.debug("Have meta tag: " + tag + " => " + value);
+ //Zotero.debug("Have meta tag: " + tag + " => " + value);
switch (tag) {
// PRISM
case "prism.publicationName": newItem.publicationTitle = value; break;
@@ -132,7 +136,11 @@ function scrape(doc,url)
case "citation_journal_title": if (!newItem.publicationTitle) newItem.publicationTitle = value; break;
case "citation_authors":
if (newItem.creators.length == 0) {
- for each(var author in value.split(';')) newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true));
+ for each(var author in value.split(';')) {
+ if (author.toUpperCase() == author)
+ author = ZU.capitalizeTitle(author.toLowerCase(), true);
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true));
+ }
}
break;
case "citation_title": if (!newItem.title) newItem.title = value; break;
@@ -168,10 +176,7 @@ function scrape(doc,url)
Zotero.debug("Ignoring meta tag: " + tag + " => " + value);
}
}
-
- if (pdf) newItem.attachments = [{url:pdf, title:"Wiley Full Text PDF", mimeType:"application/pdf"}];
- if (html) newItem.attachments = [{url:html, title:"Wiley Full Text HTML"}];
-
+
if (pages[0] && pages[1]) newItem.pages = pages.join('-')
else newItem.pages = pages[0] ? pages[1] : (pages[1] ? pages[1] : "");
@@ -180,7 +185,29 @@ function scrape(doc,url)
var abstractNode = doc.evaluate('//div[@id="abstract"]/div[@class="para"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if (abstractNode) newItem.abstractNote = abstractNode.textContent;
}
- newItem.complete();
+
+ // Fix things in uppercase
+ var toFix = [ "title", "shortTitle" ];
+ for each (var i in toFix) {
+ if (newItem[i] && newItem[i].toUpperCase() == newItem[i])
+ newItem[i] = Zotero.Utilities.capitalizeTitle(newItem[i].toLowerCase(), true);
+ }
+
+ // Remove final asterisk in title if present
+ newItem.title = newItem.title.replace(/\*$/,'');
+
+ if (html) newItem.attachments = [{url:html, title:"Wiley Full Text HTML"}];
+
+ if (pdf) {
+ Zotero.Utilities.doGet(pdf, function(text) {
+ pdf = text.match(/<iframe id="pdfDocument" src="([^"]*)"/);
+ if (pdf) newItem.attachments.push({url:pdf[1].replace(/&/g,"&"), title:"Wiley Full Text PDF", mimeType:"application/pdf"});
+ //<iframe id="pdfDocument" src="http://onlinelibrary.wiley.com/store/10.1111/j.1088-4963.2009.01154.x/asset/j.1088-4963.2009.01154.x.pdf?v=1&t=gqcawqo5&s=7ea8c89d203f02c212feeda25925ae663d37cc48" width="100%" height="100%">
+ newItem.complete();
+ }, function () {Zotero.done()});
+ } else {
+ newItem.complete();
+ }
}
// Implementation of ISBN and ISSN check-digit verification
@@ -318,3 +345,85 @@ idCheck = function(isbn) {
if(!valid13) {num13 = false};
return {"isbn10" : num10, "isbn13" : num13, "issn" : num8};
}
+
+
+/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://onlinelibrary.wiley.com/doi/10.1111/j.1088-4963.2009.01154.x/abstract",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "Michael",
+ "lastName": "Otsuka",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Alex",
+ "lastName": "Voorhoeve",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "Wiley Full Text PDF",
+ "mimeType": "application/pdf"
+ }
+ ],
+ "url": "http://onlinelibrary.wiley.com/doi/10.1111/j.1088-4963.2009.01154.x/abstract",
+ "DOI": "10.1111/j.1088-4963.2009.01154.x",
+ "volume": "37",
+ "issue": "2",
+ "publicationTitle": "Philosophy & Public Affairs",
+ "publisher": "Blackwell Publishing Inc",
+ "ISSN": "1088-4963",
+ "title": "Why It Matters That Some Are Worse Off Than Others: An Argument against the Priority View",
+ "language": "en",
+ "date": "2009/03/01",
+ "pages": "171-199",
+ "libraryCatalog": "Wiley Online Library",
+ "shortTitle": "Why It Matters That Some Are Worse Off Than Others"
+ }
+ ]
+ },
+ {
+ "type": "web",
+ "url": "http://onlinelibrary.wiley.com/doi/10.1111/j.1533-6077.2008.00144.x/abstract",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "David",
+ "lastName": "Copp",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "url": "http://onlinelibrary.wiley.com/doi/10.1111/j.1533-6077.2008.00144.x/abstract",
+ "DOI": "10.1111/j.1533-6077.2008.00144.x",
+ "volume": "18",
+ "issue": "1",
+ "publicationTitle": "Philosophical Issues",
+ "publisher": "Blackwell Publishing Inc",
+ "ISSN": "1758-2237",
+ "title": "Darwinian Skepticism About Moral Realism",
+ "language": "en",
+ "date": "2008/09/01",
+ "pages": "186-206",
+ "libraryCatalog": "Wiley Online Library"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
diff --git a/translators/Zotero RDF.js b/translators/Zotero RDF.js
@@ -10,9 +10,10 @@
"configOptions":{"getCollections":"true", "dataMode":"rdf/xml"},
"displayOptions":{"exportNotes":true, "exportFileData":false},
"inRepository":true,
- "lastUpdated":"2011-01-11 04:31:00"
+ "lastUpdated":"2011-07-08 04:51:41"
}
+var item;
var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
var n = {
@@ -79,15 +80,21 @@ function generateCollection(collection) {
*/
function getDisplayTitle(item) {
if(!item.title && (item.itemType == "interview" || item.itemType == "letter")) {
- var participants = [creator for each(creator in item.creators)
+ var participants = []
+ for each(var creator in item.creators) {
if (item.itemType == "letter" && creator.creatorType == "recipient" ||
- item.itemType == "interview" && creator.creatorType == "interviewer")];
+ item.itemType == "interview" && creator.creatorType == "interviewer") {
+ participants.push(creator);
+ }
+ }
var displayTitle = "["+(item.itemType == "letter" ? "Letter" : "Interview");
if(participants.length) {
//var names = [creator.firstName ? creator.firstName+" "+creator.lastName : creator.lastName
- var names = [creator.lastName
- for each(creator in participants)];
+ var names = [];
+ for each(var creator in participants) {
+ names.push(creator.lastName);
+ }
displayTitle += (item.itemType == "letter" ? " to " : " of ")+names[0];
diff --git a/translators/arXiv.org.js b/translators/arXiv.org.js
@@ -1,18 +1,20 @@
{
- "translatorID":"ecddda2e-4fc6-4aea-9f17-ef3b56d7377a",
- "translatorType":4,
- "label":"arXiv.org",
- "creator":"Sean Takats and Michael Berkowitz",
- "target":"http://(?:([^\\.]+\\.))?(?:(arxiv\\.org|xxx.lanl.gov)/(?:find/\\w|list/\\w|abs/)|eprintweb.org/S/(?:search|archive|article)(?!.*refs$)(?!.*cited$))",
- "minVersion":"1.0.0b3.r1",
- "maxVersion":"",
- "priority":100,
- "inRepository":true,
- "lastUpdated":"2011-01-11 04:31:00"
+ "translatorID": "ecddda2e-4fc6-4aea-9f17-ef3b56d7377a",
+ "label": "arXiv.org",
+ "creator": "Sean Takats and Michael Berkowitz",
+ "target": "http://(?:([^\\.]+\\.))?(?:(arxiv\\.org|xxx.lanl.gov)/(?:find/\\w|list/\\w|abs/)|eprintweb.org/S/(?:search|archive|article)(?!.*refs$)(?!.*cited$))",
+ "minVersion": "2.1.9",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "browserSupport": "gcs",
+ "lastUpdated": "2011-07-27 13:39:47"
}
function detectWeb(doc, url) {
- var searchRe = /^http:\/\/(?:([^\.]+\.))?(?:(arxiv\.org|xxx\.lanl\.gov)\/(?:find|list)|eprintweb.org\/S\/(?:archive|search$))/;
+ var searchRe = new RegExp('^http://(?:([^\.]+\.))?(?:(arxiv\.org|xxx\.lanl\.gov)/(?:find|list)|eprintweb.org/S/(?:archive|search$))');
+
if(searchRe.test(url)) {
return "multiple";
} else {
@@ -26,10 +28,11 @@ function getPDF(articleID) {
}
function doWeb(doc, url) {
- var eprintMultRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:search|archive)/;
+ // eprintweb appears to be defunct as of mid-2011. leaving relevant code here for now
+ var eprintMultRe = new RegExp('^http://(?:www\.)?eprintweb.org/S/(?:search|archive)');
var eprintMultM = eprintMultRe.exec(url);
- var eprintSingRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:article|search\/[0-9]+\/A[0-9]+)/;
+ var eprintSingRe = new RegExp('^http://(?:www\.)?eprintweb.org/S/(?:article|search/[0-9]+/A[0-9]+)');
var eprintSingM = eprintSingRe.exec(url);
if (eprintMultM) {
@@ -41,13 +44,8 @@ function doWeb(doc, url) {
var titlesXPath = '//div[@id="dlpage"]/dl/dd/div[@class="meta"]/div[@class="list-title"]';
}
- var namespace = doc.documentElement.namespaceURI;
- var nsResolver = namespace ? function(prefix) {
- if (prefix == 'x') return namespace; else return null;
- } : null;
-
- var elmts = doc.evaluate(elmtsXPath, doc, nsResolver, XPathResult.ANY_TYPE, null);
- var titles = doc.evaluate(titlesXPath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var elmts = doc.evaluate(elmtsXPath, doc, null, XPathResult.ANY_TYPE, null);
+ var titles = doc.evaluate(titlesXPath, doc, null, XPathResult.ANY_TYPE, null);
var newURIs = new Array();
var elmt = elmts.iterateNext();
@@ -59,11 +57,11 @@ function doWeb(doc, url) {
var i=0;
if (eprintMultM){
do {
- var newID = doc.evaluate('./text()', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var newID = doc.evaluate('./text()', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
newID = newID.replace(/arXiv:/, "");
newID = newID.replace(/\//g, "%2F");
newID = newID.replace(/v\d*/, ""); //remove version number
- availableItems[i] = doc.evaluate(titleNode, title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ availableItems[i] = doc.evaluate(titleNode, title, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
arXivIDs[i] = newID;
i++;
} while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext()));
@@ -74,118 +72,181 @@ function doWeb(doc, url) {
newID = newID.replace(/arXiv:/, "");
newID = newID.replace(/\//g, "%2F");
newID = newID.replace(/v\d*/, ""); //remove version number
- availableItems[i] = Zotero.Utilities.trimInternal(title.textContent.replace(/^\s*Title:\s+/, ""));
+ availableItems[i] = ZU.trimInternal(title.textContent.replace(/^\s*Title:\s+/, ""));
arXivIDs[i] = newID;
i++;
} while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext()));
}
- var items = Zotero.selectItems(availableItems);
- if(!items) {
- return true;
- }
- for(var i in items) {
- newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivIDs[i] + "&metadataPrefix=oai_dc");
-
- }
+ var items = Zotero.selectItems(availableItems, function(items) {
+ if(!items) {
+ return true;
+ }
+ for(var i in items) {
+ newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivIDs[i] + "&metadataPrefix=oai_dc");
+ }
+ Zotero.Utilities.HTTP.doGet(newURIs, parseXML, function() {Zotero.done();}, null);
+ });
}
else {
if (eprintSingM){
- var titleID = doc.evaluate('//td[@class="ti"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
- var arXivID = doc.evaluate('//table/tbody/tr[4]/td/table/tbody/tr/td[1]/table/tbody/tr[1]/td[@class="txt"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var titleID = doc.evaluate('//td[@class="ti"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var arXivID = doc.evaluate('//table/tbody/tr[4]/td/table/tbody/tr/td[1]/table/tbody/tr[1]/td[@class="txt"]/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
arXivID = arXivID.substring(0, arXivID.indexOf(" "));
arXivID = arXivID.replace(/arXiv:/, "");
arXivID = arXivID.replace(/\//g, "%2F");
} else {
- var arXivID = doc.evaluate('//title', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var arXivID = doc.evaluate('//title', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
var titleRe = /\[([^\]]*)]/;
var m = titleRe.exec(arXivID);
arXivID = m[1];
arXivID = arXivID.replace(/\//g, "%2F");
}
arXivID = arXivID.replace(/v\d*/, ""); //remove version number
- Zotero.debug("ID= "+ arXivID);
newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivID + "&metadataPrefix=oai_dc");
-
+ Zotero.Utilities.HTTP.doGet(newURIs, parseXML, function() {Zotero.done();}, null);
}
+ Zotero.wait();
+}
- Zotero.Utilities.HTTP.doGet(newURIs, function(text) {
- var newItem = new Zotero.Item("journalArticle");
- // remove header
- text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
- // fix non-compliant XML tags (colons)
- text = text.replace(/<dc:/g, "<dc_").replace(/<\/dc:/g, "</dc_");
- text = text.replace(/<oai_dc:dc/g, "<oai_dc_dc").replace(/<\/oai_dc:dc/g, "</oai_dc_dc");
- text = text.replace(/<OAI-PMH[^>]*>/, "").replace(/<\/OAI-PMH[^>]*>/, "");
- text = "<zotero>" + text + "</zotero>";
- var xml = new XML(text);
- var title;
- var citation = xml.GetRecord.record.metadata.oai_dc_dc;
- var test = xml..responseDate.text().toString();
+function parseXML(text) {
+ var newItem = new Zotero.Item("journalArticle");
+ // remove header
+ text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
+ // fix non-compliant XML tags (colons)
+ text = text.replace(/<dc:/g, "<dc_").replace(/<\/dc:/g, "</dc_");
+ text = text.replace(/<oai_dc:dc/g, "<oai_dc_dc").replace(/<\/oai_dc:dc/g, "</oai_dc_dc");
+ text = text.replace(/<OAI-PMH[^>]*>/, "").replace(/<\/OAI-PMH[^>]*>/, "");
+ text = "<zotero>" + text + "</zotero>";
+
+ var xml = (new DOMParser()).parseFromString(text, "text/xml");
- if (citation.dc_title.length()){
- title = Zotero.Utilities.trimInternal(citation.dc_title.text().toString());
- newItem.title = title;
+ newItem.title = getXPathNodeTrimmed(xml, "dc_title");
+ getCreatorNodes(xml, "dc_creator", newItem, "author");
+ newItem.date = getXPathNodeTrimmed(xml, "dc_date");
+
+ var descriptions = ZU.xpath(xml, "//GetRecord/record/metadata/oai_dc_dc/dc_description");
+ for(var j=0; j<descriptions.length; j++) {
+ var noteStr = ZU.trimInternal(descriptions[j].textContent);
+ newItem.notes.push({note:noteStr});
+ }
+
+ var subjects = ZU.xpath(xml, "//GetRecord/record/metadata/oai_dc_dc/dc_subject");
+ for(var j=0; j<subjects.length; j++) {
+ var subject = ZU.trimInternal(subjects[j].textContent);
+ newItem.tags.push(subject);
+ }
+
+ var identifiers = ZU.xpath(xml, "//GetRecord/record/metadata/oai_dc_dc/dc_identifier");
+ for(var j=0; j<identifiers.length; j++) {
+ var identifier = ZU.trimInternal(identifiers[j].textContent);
+ if (identifier.substr(0, 4) == "doi:") {
+ newItem.DOI = identifier;
}
- Zotero.debug("article title: " + title);
- var type = "";
- if(citation.dc_creator.length()) {
- var authors = citation.dc_creator;
- for(var j=0; j<authors.length(); j++) {
- Zotero.debug("author: " + authors[j]);
- newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true));
- }
+ else if (identifier.substr(0, 7) == "http://") {
+ newItem.url = identifier;
}
- if (citation.dc_date.length()) {
- var dates = citation.dc_date;
- newItem.date = Zotero.Utilities.trimInternal(dates[0].text().toString());
- }
- if (citation.dc_description.length()) {
- var descriptions = citation.dc_description;
- for (var j=0; j<descriptions.length(); j++) {
- var noteStr = Zotero.Utilities.trimInternal(descriptions[j].text().toString());
- newItem.notes.push({note:noteStr});
- }
- }
- if (citation.dc_subject.length()) {
- var subjects = citation.dc_subject;
- for (var j=0; j<subjects.length(); j++) {
- var subjectValue = Zotero.Utilities.trimInternal(subjects[j].text().toString());
- newItem.tags.push(subjectValue);
- }
- }
- if (citation.dc_identifier.length()) {
- var identifiers = citation.dc_identifier;
- for (var j=0; j<identifiers.length(); j++) {
- var identifier = Zotero.Utilities.trimInternal(identifiers[j].text().toString());
- if (identifier.substr(0, 4) == "doi:") {
- newItem.DOI = identifier;
- }
- else if (identifier.substr(0, 7) == "http://") {
- newItem.url = identifier;
- }
- else {
- newItem.extra = identifier;
- }
- }
+ else {
+ newItem.extra = identifier;
}
- var articleID = "";
- if (xml.GetRecord.record.header.identifier.length()) {
- articleID = xml.GetRecord.record.header.identifier.text().toString();
- articleID = articleID.substr(14);
- var idPrefixRegex = /^arXiv:/i;
- if (idPrefixRegex.test (articleID))
- newItem.publicationTitle = articleID;
- else
- newItem.publicationTitle = "arXiv:" + articleID;
- }
-// TODO add "arXiv.org" to bib data?
- newItem.attachments.push({url:newItem.url, title:"arXiv.org Snapshot", mimeType:"text/html"});
- newItem.attachments.push(getPDF(articleID));
- if (newItem.notes[0]['note']) {
- newItem.abstractNote = newItem.notes[0]['note'];
- newItem.notes = new Array();
- }
- newItem.complete();
- }, function() {Zotero.done();}, null);
- Zotero.wait();
+ }
+
+ var articleID = ZU.xpath(xml, "//GetRecord/record/header/identifier");
+ articleID = ZU.trimInternal(articleID[0].textContent);
+ articleID = articleID.substr(14);
+ var idPrefixRegex = new RegExp('^arXiv:', "i");
+ if (idPrefixRegex.test (articleID)) {
+ newItem.publicationTitle = articleID;
+ }
+ else {
+ newItem.publicationTitle = "arXiv:" + articleID;
+ }
+
+// TODO add "arXiv.org" to bib data?
+ newItem.attachments.push({url:newItem.url, title:"arXiv.org Snapshot", mimeType:"text/html"});
+ newItem.attachments.push(getPDF(articleID));
+ if (newItem.notes[0]['note']) {
+ newItem.abstractNote = newItem.notes[0]['note'];
+ newItem.notes = new Array();
+ }
+ newItem.complete();
}
+
+
+function getXPathNodeTrimmed(xml, name) {
+ var node = ZU.xpath(xml, "//GetRecord/record/metadata/oai_dc_dc/"+name);
+ var val = "";
+ if(node.length){
+ val = Zotero.Utilities.trimInternal(node[0].textContent);
+ }
+ return val;
+}
+
+function getCreatorNodes(xml, name, newItem, creatorType) {
+ var nodes = ZU.xpath(xml, "//GetRecord/record/metadata/oai_dc_dc/"+name);
+ for(var i=0; i<nodes.length; i++) {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(nodes[i].textContent, creatorType, true));
+ }
+}/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://arxiv.org/list/astro-ph/new",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://arxiv.org/abs/1107.4612",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "O'Dea, D.",
+ "lastName": "T",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Clark, C.",
+ "lastName": "N",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "Contaldi, C.",
+ "lastName": "R",
+ "creatorType": "author"
+ },
+ {
+ "firstName": "MacTavish, C.",
+ "lastName": "J",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [
+ "Astrophysics - Cosmology and Extragalactic Astrophysics",
+ "Astrophysics - Galaxy Astrophysics"
+ ],
+ "seeAlso": [],
+ "attachments": [
+ {
+ "url": false,
+ "title": "arXiv.org Snapshot",
+ "mimeType": "text/html"
+ },
+ {
+ "url": false,
+ "mimeType": "application/pdf",
+ "title": "1107.4612 PDF"
+ }
+ ],
+ "title": "A Model For Polarised Microwave Foreground Emission From Interstellar Dust",
+ "date": "2011-07-22",
+ "url": "http://arxiv.org/abs/1107.4612",
+ "publicationTitle": "arXiv:1107.4612",
+ "abstractNote": "The upcoming generation of cosmic microwave background (CMB) experiments face a major challenge in detecting the weak cosmic B-mode signature predicted as a product of primordial gravitational waves. To achieve the required sensitivity these experiments must have impressive control of systematic effects and detailed understanding of the foreground emission that will influence the signal. In this paper we describe a model of foreground dust intensity and polarisation. The model includes a 3D description of the Galactic magnetic field, examining both large and small scales. We also include in the model the details of the dust density, grain alignment and the intrinsic polarisation of the emission from an individual grain. We present here Stokes parameter maps at 150 GHz and provide an on-line repository for these and additional template maps at frequencies that will be targeted by upcoming experiments such as EBEX, Spider and SPTpol.",
+ "libraryCatalog": "arXiv.org"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/
+\ No newline at end of file
diff --git a/translators/deleted.txt b/translators/deleted.txt
@@ -1,4 +1,4 @@
-4 # Increment number when modifying file
+5 # Increment number when modifying file
96b9f483-c44d-5784-cdad-ce21b984 # Amazon
add7c71c-21f3-ee14-d188-caf9da12 # SIRSI 2003+
@@ -11,10 +11,11 @@ da440efe-646c-4a18-9958-abe1f7d55cde # NCSU Library (Endeca 2)
e07e9b8c-0e98-4915-bb5a-32a08cb2f365 # Open WorldCat (Search)
490909d7-7d79-4c7a-a136-77df618d4db2 # Worldcat.org
dd149efc-7f0e-43e4-b3df-b6d15e171717 # Persée
-8c1f42d5-02fa-437b-b2b2-73afc768eb07 # PNAS (replaced by HighWire 2.0)
56ea09bc-57ee-4f50-976e-cf7cb1f6c6d8 # Royal Society Publishing (replaced by HighWire 2.0)
83538f48-906f-40ef-bdb3-e94f63676307 # NAA RecordSearch (replaced by National Archives of Australia)
dbb5d4bc-3b21-47a2-9751-5dcbb65b902a # AMS Online Journals - Allenpress (replaced with DOI for now)
d2416f31-4f24-4e18-8c66-06122af5bc2c # Women in Judaism (replaced with COinS)
bc39e05b-141a-4322-85f0-a5b86edf896b # Hindawi
e78d20f7-488-4023-831-dfe39679f3f # ACM (replaced by newer version)
+3f44a651-8b6b-4591-8ca4-4bfb943a13f4 # Edutopia (replaced with nothing)
+636c8ea6-2af7-4488-8ccd-ea280e4a7a98 # Sage Journals Online (replaced by Highwire 2.0)
diff --git a/translators/eLibrary.ru.js b/translators/eLibrary.ru.js
@@ -1,14 +1,14 @@
{
- "translatorID": "587709d3-80c5-467d-9fc8-ed41c31e20cf",
- "label": "eLibrary.ru",
- "creator": "Avram Lyon",
- "target": "^http://elibrary\\.ru/",
- "minVersion": "1.0.0b4.r5",
- "maxVersion": "",
- "priority": 100,
- "inRepository": "1",
- "translatorType": 4,
- "lastUpdated": "2011-03-12 22:55:32"
+ "translatorID": "587709d3-80c5-467d-9fc8-ed41c31e20cf",
+ "label": "eLibrary.ru",
+ "creator": "Avram Lyon",
+ "target": "^http://elibrary\\.ru/",
+ "minVersion": "2.1",
+ "maxVersion": "",
+ "priority": 100,
+ "inRepository": true,
+ "translatorType": 4,
+ "lastUpdated": "2011-08-02 22:31:22"
}
/*
@@ -32,7 +32,7 @@
function detectWeb(doc, url){
if (url.match(/\/item.asp/)) {
return "journalArticle";
- } else if (url.match(/\/query_results\.asp/) || url.match(/\/contents\.asp/)){
+ } else if (url.match(/\/(query_results|contents|org_items)\.asp/)){
return "multiple";
}
}
@@ -68,17 +68,17 @@ function doWeb(doc, url){
}
function scrape (doc) {
- var n = doc.documentElement.namespaceURI;
- var ns = n ? function(prefix) {
- if (prefix == 'x') return n; else return null;
- } : null;
+ var n = doc.documentElement.namespaceURI;
+ var ns = n ? function(prefix) {
+ if (prefix == 'x') return n; else return null;
+ } : null;
var datablock = doc.evaluate('//td[@align="right" and @width="100%" and @valign="top"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext();
var tableLabels = doc.evaluate('./table/tbody/tr[1]/td[@bgcolor="#dddddd"][1]|./table//table[1]//tr[1]/td[@bgcolor="#dddddd"][1]', datablock, ns, XPathResult.ANY_TYPE, null);
var titleBlock, authorBlock, publicationBlock, metaBlock, codeBlock, keywordBlock, abstractBlock, referenceBlock;
var t = 0, label; // Table number and label
- while ((label = tableLabels.iterateNext()) !== null) {
+ while ((label = tableLabels.iterateNext()) !== null) {
t++;
label = label.textContent;
@@ -194,17 +194,17 @@ function scrape (doc) {
switch (item.itemType) {
case "обзорная статья": // Would be "review article"
case "научная статья":
- item.itemType = "journalArticle";
- break;
+ item.itemType = "journalArticle";
+ break;
case "учебное пособие":
case "монография":
- item.itemType = "book";
- break;
+ item.itemType = "book";
+ break;
case "публикация в сборнике трудов конференции":
- item.itemType = "conferencePaper";
- break;
+ item.itemType = "conferencePaper";
+ break;
default:
- Zotero.debug("Unknown type: "+item.itemType+". Using 'journalArticle'");
+ Zotero.debug("Unknown type: "+item.itemType+". Using 'journalArticle'");
item.itemType = "journalArticle";
break;
}
@@ -275,4 +275,42 @@ function mapper (from, to, block, doc) {
Zotero.debug("Unmapped field: "+name.textContent.trim());
}
return [key, value.textContent.trim()];
-}
-\ No newline at end of file
+}/** BEGIN TEST CASES **/
+var testCases = [
+ {
+ "type": "web",
+ "url": "http://elibrary.ru/org_items.asp?orgsid=3326",
+ "items": "multiple"
+ },
+ {
+ "type": "web",
+ "url": "http://elibrary.ru/item.asp?id=9541154",
+ "items": [
+ {
+ "itemType": "journalArticle",
+ "creators": [
+ {
+ "firstName": "М.В",
+ "lastName": "Свет",
+ "creatorType": "author"
+ }
+ ],
+ "notes": [],
+ "tags": [],
+ "seeAlso": [],
+ "attachments": [],
+ "title": "Иноязычные заимствования в художественной прозе на иврите в XX в",
+ "publicationTitle": "Вестник Московского университета. Серия 13: Востоковедение",
+ "publisher": "Издательство Московского государственного университета",
+ "date": "2007",
+ "ISSN": "0320-8095",
+ "extra": "Цитируемость в РИНЦ: 0",
+ "issue": "1",
+ "pages": "40-58",
+ "language": "русский",
+ "libraryCatalog": "eLibrary.ru"
+ }
+ ]
+ }
+]
+/** END TEST CASES **/