Closes #1514, Patch for Improved BibTex Import/Export: shorttitle, bookSection->incollection, character mapping, translator, seriesNumber, space-delimited keywords, note/annote/comment/review <-> notes/extra, file import

Closes #1180, Support more schemes for PDF URIs in BibTeX Import

Thanks for the patch.
This commit is contained in:
Dan Stillman 2009-07-04 02:47:53 +00:00
parent 46b3b857fa
commit f8bbf32d85

View file

@ -2,7 +2,7 @@
"translatorID":"9cb70025-a888-4a29-a210-93ec52da40d4", "translatorID":"9cb70025-a888-4a29-a210-93ec52da40d4",
"translatorType":3, "translatorType":3,
"label":"BibTeX", "label":"BibTeX",
"creator":"Simon Kornblith", "creator":"Simon Kornblith and Richard Karnesky",
"target":"bib", "target":"bib",
"minVersion":"1.0.0b4.r1", "minVersion":"1.0.0b4.r1",
"maxVersion":"", "maxVersion":"",
@ -62,7 +62,6 @@ var fieldMap = {
address:"place", address:"place",
chapter:"section", chapter:"section",
edition:"edition", edition:"edition",
// number:"issue",
type:"type", type:"type",
series:"series", series:"series",
title:"title", title:"title",
@ -72,6 +71,7 @@ var fieldMap = {
issn:"ISSN", issn:"ISSN",
lccn:"callNumber", lccn:"callNumber",
location:"archiveLocation", location:"archiveLocation",
shorttitle:"shortTitle",
url:"url", url:"url",
doi:"DOI", doi:"DOI",
"abstract":"abstractNote" "abstract":"abstractNote"
@ -86,16 +86,7 @@ var inputFieldMap = {
var zotero2bibtexTypeMap = { var zotero2bibtexTypeMap = {
"book":"book", "book":"book",
"bookSection": function (item) { "bookSection":"incollection",
var hasAuthor = false;
var hasEditor = false;
for each(var creator in item.creators) {
if (creator.creatorType == "editor") { hasEditor = true; }
if (creator.creatorType == "author") { hasAuthor = true; }
}
if (hasAuthor && hasEditor) { return "incollection"; }
return "inbook";
},
"journalArticle":"article", "journalArticle":"article",
"magazineArticle":"article", "magazineArticle":"article",
"newspaperArticle":"article", "newspaperArticle":"article",
@ -121,7 +112,6 @@ var bibtex2zoteroTypeMap = {
"conference":"conferencePaper", "conference":"conferencePaper",
"techreport":"report", "techreport":"report",
"booklet":"book", "booklet":"book",
"incollection":"bookSection",
"manual":"book", "manual":"book",
"mastersthesis":"thesis", "mastersthesis":"thesis",
"misc":"book", "misc":"book",
@ -134,7 +124,7 @@ var bibtex2zoteroTypeMap = {
* LaTeX book.) * LaTeX book.)
*/ */
var months = ["jan", "feb", "mar", "apr", "may", "jun", 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, * new mapping table based on that from Matthias Steffens,
@ -873,6 +863,8 @@ var mappingTable = {
"\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
"\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
"\u013E":"\\v{l}", // LATIN SMALL 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 "\u0143":"\\'{N}", // LATIN CAPITAL LETTER N WITH ACUTE
"\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE "\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE
"\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
@ -1054,8 +1046,7 @@ var mappingTable = {
"\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
"\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
"\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
"\u1EF9":"\\~{y}", // LATIN SMALL LETTER Y WITH TILDE "\u1EF9":"\\~{y}" // LATIN SMALL LETTER Y WITH TILDE
}; };
/* unfortunately the mapping isn't reversible - hence this second table - sigh! */ /* unfortunately the mapping isn't reversible - hence this second table - sigh! */
@ -1108,7 +1099,7 @@ var reversemappingTable = {
"{\\OE}" : "\u0152", // LATIN CAPITAL LIGATURE OE "{\\OE}" : "\u0152", // LATIN CAPITAL LIGATURE OE
"{\\oe}" : "\u0153", // LATIN SMALL LIGATURE OE "{\\oe}" : "\u0153", // LATIN SMALL LIGATURE OE
"{\\textasciicircum}" : "\u02C6", // MODIFIER LETTER CIRCUMFLEX ACCENT "{\\textasciicircum}" : "\u02C6", // MODIFIER LETTER CIRCUMFLEX ACCENT
"\\~{}" : "\u02DC", // SMALL TILDE // "\\~{}" : "\u02DC", // SMALL TILDE
"{\\textacutedbl}" : "\u02DD", // DOUBLE ACUTE ACCENT "{\\textacutedbl}" : "\u02DD", // DOUBLE ACUTE ACCENT
"{\\textendash}" : "\u2013", // EN DASH "{\\textendash}" : "\u2013", // EN DASH
"{\\textemdash}" : "\u2014", // EM DASH "{\\textemdash}" : "\u2014", // EM DASH
@ -1122,7 +1113,7 @@ var reversemappingTable = {
"{\\textquotedblleft}" : "\u201C", // LEFT DOUBLE QUOTATION MARK "{\\textquotedblleft}" : "\u201C", // LEFT DOUBLE QUOTATION MARK
"{\\textquotedblright}" : "\u201D", // RIGHT DOUBLE QUOTATION MARK "{\\textquotedblright}" : "\u201D", // RIGHT DOUBLE QUOTATION MARK
"{\\quotedblbase}" : "\u201E", // DOUBLE LOW-9 QUOTATION MARK "{\\quotedblbase}" : "\u201E", // DOUBLE LOW-9 QUOTATION MARK
"{\\quotedblbase}" : "\u201F", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK // "{\\quotedblbase}" : "\u201F", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
"{\\textdagger}" : "\u2020", // DAGGER "{\\textdagger}" : "\u2020", // DAGGER
"{\\textdaggerdbl}" : "\u2021", // DOUBLE DAGGER "{\\textdaggerdbl}" : "\u2021", // DOUBLE DAGGER
"{\\textbullet}" : "\u2022", // BULLET "{\\textbullet}" : "\u2022", // BULLET
@ -1204,7 +1195,7 @@ var reversemappingTable = {
"||" : "\u2225", // PARALLEL TO "||" : "\u2225", // PARALLEL TO
"\\~{}" : "\u223C", // TILDE OPERATOR "\\~{}" : "\u223C", // TILDE OPERATOR
"/=" : "\u2260", // NOT EQUAL TO "/=" : "\u2260", // NOT EQUAL TO
"<=" : "\u2264", // LESS-THAN OR EQUAL TO // "<=" : "\u2264", // LESS-THAN OR EQUAL TO
">=" : "\u2265", // GREATER-THAN OR EQUAL TO ">=" : "\u2265", // GREATER-THAN OR EQUAL TO
"<<" : "\u226A", // MUCH LESS-THAN "<<" : "\u226A", // MUCH LESS-THAN
">>" : "\u226B", // MUCH GREATER-THAN ">>" : "\u226B", // MUCH GREATER-THAN
@ -1214,9 +1205,9 @@ var reversemappingTable = {
"(/)" : "\u2298", // CIRCLED DIVISION SLASH "(/)" : "\u2298", // CIRCLED DIVISION SLASH
"|-" : "\u22A2", // RIGHT TACK "|-" : "\u22A2", // RIGHT TACK
"-|" : "\u22A3", // LEFT TACK "-|" : "\u22A3", // LEFT TACK
"|-" : "\u22A6", // ASSERTION // "|-" : "\u22A6", // ASSERTION
"|=" : "\u22A7", // MODELS "|=" : "\u22A7", // MODELS
"|=" : "\u22A8", // TRUE // "|=" : "\u22A8", // TRUE
"||-" : "\u22A9", // FORCES "||-" : "\u22A9", // FORCES
"$\\#$" : "\u22D5", // EQUAL AND PARALLEL TO "$\\#$" : "\u22D5", // EQUAL AND PARALLEL TO
"<<<" : "\u22D8", // VERY MUCH LESS-THAN "<<<" : "\u22D8", // VERY MUCH LESS-THAN
@ -1229,11 +1220,11 @@ var reversemappingTable = {
":-(" : "\u2639", // WHITE FROWNING FACE ":-(" : "\u2639", // WHITE FROWNING FACE
":-)" : "\u263A", // WHITE SMILING FACE ":-)" : "\u263A", // WHITE SMILING FACE
"(-: " : "\u263B", // BLACK SMILING FACE "(-: " : "\u263B", // BLACK SMILING FACE
"$\\#$" : "\u266F", // MUSIC SHARP SIGN // "$\\#$" : "\u266F", // MUSIC SHARP SIGN
"$\\%<$" : "\u2701", // UPPER BLADE SCISSORS "$\\%<$" : "\u2701", // UPPER BLADE SCISSORS
"$\\%<$" : "\u2702", // BLACK SCISSORS /* "$\\%<$" : "\u2702", // BLACK SCISSORS
"$\\%<$" : "\u2703", // LOWER BLADE SCISSORS "$\\%<$" : "\u2703", // LOWER BLADE SCISSORS
"$\\%<$" : "\u2704", // WHITE SCISSORS "$\\%<$" : "\u2704", // WHITE SCISSORS */
/* Derived accented characters */ /* Derived accented characters */
"\\`{A}" : "\u00C0", // LATIN CAPITAL LETTER A WITH GRAVE "\\`{A}" : "\u00C0", // LATIN CAPITAL LETTER A WITH GRAVE
"\\'{A}" : "\u00C1", // LATIN CAPITAL LETTER A WITH ACUTE "\\'{A}" : "\u00C1", // LATIN CAPITAL LETTER A WITH ACUTE
@ -1341,6 +1332,8 @@ var reversemappingTable = {
"\\c{l}" : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA "\\c{l}" : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA
"\\v{L}" : "\u013D", // LATIN CAPITAL LETTER L WITH CARON "\\v{L}" : "\u013D", // LATIN CAPITAL LETTER L WITH CARON
"\\v{l}" : "\u013E", // LATIN SMALL 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}" : "\u0143", // LATIN CAPITAL LETTER N WITH ACUTE
"\\'{n}" : "\u0144", // LATIN SMALL LETTER N WITH ACUTE "\\'{n}" : "\u0144", // LATIN SMALL LETTER N WITH ACUTE
"\\c{N}" : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA "\\c{N}" : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA
@ -1522,7 +1515,7 @@ var reversemappingTable = {
"\\d{Y}" : "\u1EF4", // LATIN CAPITAL LETTER Y WITH DOT BELOW "\\d{Y}" : "\u1EF4", // LATIN CAPITAL LETTER Y WITH DOT BELOW
"\\d{y}" : "\u1EF5", // LATIN SMALL LETTER Y WITH DOT BELOW "\\d{y}" : "\u1EF5", // LATIN SMALL LETTER Y WITH DOT BELOW
"\\~{Y}" : "\u1EF8", // LATIN CAPITAL LETTER Y WITH TILDE "\\~{Y}" : "\u1EF8", // LATIN CAPITAL LETTER Y WITH TILDE
"\\~{y}" : "\u1EF9", // LATIN SMALL LETTER Y WITH TILDE "\\~{y}" : "\u1EF9" // LATIN SMALL LETTER Y WITH TILDE
}; };
var alwaysMap = { var alwaysMap = {
@ -1534,7 +1527,7 @@ var alwaysMap = {
"\\":"{\\textbackslash}" "\\":"{\\textbackslash}"
}; };
var strings = new Object(); var strings = {};
var keyRe = /[a-zA-Z0-9\-]/; var keyRe = /[a-zA-Z0-9\-]/;
function processField(item, field, value) { function processField(item, field, value) {
@ -1544,8 +1537,7 @@ function processField(item, field, value) {
item[inputFieldMap[field]] = value; item[inputFieldMap[field]] = value;
} else if(field == "journal") { } else if(field == "journal") {
if(item.publicationTitle) { if(item.publicationTitle) {
// we already had an fjournal item.journalAbbreviation = value;
item.journalAbbreviation = value
} else { } else {
item.publicationTitle = value; item.publicationTitle = value;
} }
@ -1555,8 +1547,8 @@ function processField(item, field, value) {
item.journalAbbreviation = value; item.journalAbbreviation = value;
} }
item.publicationTitle = value; item.publicationTitle = value;
} else if(field == "author" || field == "editor") { } else if(field == "author" || field == "editor" || field == "translator") {
// parse authors/editors // parse authors/editors/translators
var names = value.split(/ and /i); // now case insensitive var names = value.split(/ and /i); // now case insensitive
for each(var name in names) { for each(var name in names) {
item.creators.push(Zotero.Utilities.cleanAuthor(name, field, item.creators.push(Zotero.Utilities.cleanAuthor(name, field,
@ -1567,6 +1559,8 @@ function processField(item, field, value) {
} else if(field == "number"){ // fix for techreport } else if(field == "number"){ // fix for techreport
if (item.itemType == "report") { if (item.itemType == "report") {
item.reportNumber = value; item.reportNumber = value;
} else if (item.itemType == "book" || item.itemType == "bookSection") {
item.seriesNumber = value;
} else { } else {
item.issue = value; item.issue = value;
} }
@ -1599,7 +1593,7 @@ function processField(item, field, value) {
} }
} else if(field == "pages") { } else if(field == "pages") {
item.pages = value.replace(/--/g, "-"); item.pages = value.replace(/--/g, "-");
} else if(field == "note" || field == "annote") { } else if(field == "note") {
item.extra += "\n"+value; item.extra += "\n"+value;
} else if(field == "howpublished") { } else if(field == "howpublished") {
if(value.length >= 7) { if(value.length >= 7) {
@ -1617,11 +1611,27 @@ function processField(item, field, value) {
} else { } else {
item.tags = value.split(/, ?/g); item.tags = value.split(/, ?/g);
} }
} else if (field == "comment") { } else if (field == "comment" || field == "annote" || field == "review") {
item.notes.push({note:value}); item.notes.push({note:value});
} else if(field == "pdf") { // new code to handle PDF import. absolute file path should be specified in bibtex } else if (field == "pdf") {
item.attachments = [{url:"file://"+value, mimeType:"application/pdf"}]; if (/:\/\//.test(value)) { // a full uri is given
} item.attachments = [{url:value, mimeType:"application/pdf", downloadable:true}];
} else { // if no uri is given, assume that it is an absolute path to the PDF
item.attachments = [{url:"file://"+value, mimeType:"application/pdf"}];
}
} else if (field == "sentelink") { // the reference manager 'Sente' has a unique file scheme in exported BibTeX
item.attachments = [{url:value.split(",")[0], mimeType:"application/pdf", downloadable:true}];
} else if (field == "file") {
var [filetitle, filepath, filetype] = value.split(":");
if (filetitle.length == 0) {
filetitle = "Attachment";
}
if (filetype.match(/pdf/i)) {
item.attachments = [{url:"file://"+filepath, mimeType:"application/pdf", title:filetitle, downloadable:true}];
} else {
item.attachments = [{url:"file://"+filepath, title:filetitle, downloadable:true}];
}
}
} }
function getFieldValue(read) { function getFieldValue(read) {
@ -1690,7 +1700,7 @@ function getFieldValue(read) {
if(value[0] == "\\" && "#$%&~_^\\{}".indexOf(value[1]) != -1) { if(value[0] == "\\" && "#$%&~_^\\{}".indexOf(value[1]) != -1) {
value = value.substr(1); value = value.substr(1);
} }
if(value[value.length-1] == "\\" && "#$%&~_^\\{}".indexOf(value[value.length-2]) != -1) { if(value[value.length-1] == "\\" && "#$%&~_^\\{}".indexOf(value[value.length-2]) != -1) {
value = value.substr(0, value.length-1); value = value.substr(0, value.length-1);
} }
value = value.replace(/\\\\/g, "\\"); value = value.replace(/\\\\/g, "\\");
@ -1927,8 +1937,8 @@ function doExport() {
} }
} }
if(item.reportNumber || item.issue) { if(item.reportNumber || item.issue || item.seriesNumber) {
writeField("number", item.reportNumber || item.issue); writeField("number", item.reportNumber || item.issue || item.seriesNumber);
} }
if(item.publicationTitle) { if(item.publicationTitle) {
@ -1953,6 +1963,7 @@ function doExport() {
// split creators into subcategories // split creators into subcategories
var author = ""; var author = "";
var editor = ""; var editor = "";
var translator = "";
for each(var creator in item.creators) { for each(var creator in item.creators) {
var creatorString = creator.lastName; var creatorString = creator.lastName;
@ -1962,6 +1973,8 @@ function doExport() {
if (creator.creatorType == "editor") { if (creator.creatorType == "editor") {
editor += " and "+creatorString; editor += " and "+creatorString;
} else if (creator.creatorType == "translator") {
translator += " and "+creatorString;
} else { } else {
author += " and "+creatorString; author += " and "+creatorString;
} }
@ -1973,6 +1986,9 @@ function doExport() {
if(editor) { if(editor) {
writeField("editor", editor.substr(5)); writeField("editor", editor.substr(5));
} }
if(translator) {
writeField("translator", translator.substr(5));
}
} }
if(item.date) { if(item.date) {
@ -1993,9 +2009,9 @@ function doExport() {
if(item.tags && item.tags.length) { if(item.tags && item.tags.length) {
var tagString = ""; var tagString = "";
for each(var tag in item.tags) { for each(var tag in item.tags) {
tagString += ","+tag.tag; tagString += ", "+tag.tag;
} }
writeField("keywords", tagString.substr(1)); writeField("keywords", tagString.substr(2));
} }
if(item.pages) { if(item.pages) {
@ -2007,7 +2023,7 @@ function doExport() {
} }
if (item.notes) { if (item.notes) {
for each (var note in item.notes) { for each (var note in item.notes) {
writeField("comment", note["note"]); writeField("annote", note["note"]);
} }
} }
Zotero.write("\n}"); Zotero.write("\n}");