View difference between Paste ID: UNVexqKc and XsX9zTNy
SHOW: | | - or go back to the newest paste.
1
{
2
	"translatorID": "7cb70025-a888-4a29-a210-93ec52da40d4",
3
	"translatorType": 3,
4
	"label": "BibTeX-citep",
5
	"creator": "Peter O'Brien - from Simon Kornblith and Richard Karnesky",
6
	"target": "bib",
7
	"minVersion": "2.1.9",
8
	"maxVersion": null,
9
	"priority": 200,
10
	"inRepository": true,
11
	"browserSupport": "gcsv",
12
	"displayOptions": {
13
		"exportCharset": "UTF-8",
14
		"exportNotes": false,
15
		"exportFileData": false
16
	},
17
	"lastUpdated": "2012-05-31 00:43:00"
18
}
19
20
21
22
//%a = first author surname
23
//%y = year
24
//%t = first word of title
25
var citeKeyFormat = "%a_%t_%y";
26
27
28
29
var zotero2bibtexTypeMap = {
30
	"book":"book",
31
	"bookSection":"incollection",
32
	"journalArticle":"article",
33
	"magazineArticle":"article",
34
	"newspaperArticle":"article",
35
	"thesis":"phdthesis",
36
	"letter":"misc",
37
	"manuscript":"unpublished",
38
	"interview":"misc",
39
	"film":"misc",
40
	"artwork":"misc",
41
	"webpage":"misc",
42
	"conferencePaper":"inproceedings",
43
	"report":"techreport"
44
};
45
46
47
/*
48
 * three-letter month abbreviations. i assume these are the same ones that the
49
 * docs say are defined in some appendix of the LaTeX book. (i don't have the
50
 * LaTeX book.)
51
 */
52
var months = ["jan", "feb", "mar", "apr", "may", "jun",
53
			  "jul", "aug", "sep", "oct", "nov", "dec"];
54
55
/*
56
 * new mapping table based on that from Matthias Steffens,
57
 * then enhanced with some fields generated from the unicode table.
58
 */
59
60
61
62
var alwaysMap = {
63
	"|":"{\\textbar}",
64
	"<":"{\\textless}",
65
	">":"{\\textgreater}",
66
	"~":"{\\textasciitilde}",
67
	"^":"{\\textasciicircum}",
68
	"\\":"{\\textbackslash}"
69
};
70
71
var strings = {};
72
var keyRe = /[a-zA-Z0-9\-]/;
73
var keywordSplitOnSpace = true;
74
var keywordDelimRe = ',\\s*';
75
var keywordDelimReFlags = '';
76
77
function setKeywordSplitOnSpace( val ) {
78
	keywordSplitOnSpace = val;
79
}
80
81
82
83
84
85
86
87
88
89
90
function mapEscape(character) {
91
	return alwaysMap[character];
92
}
93
94
function mapAccent(character) {
95
	return (mappingTable[character] ? mappingTable[character] : "?");
96
}
97
98
// a little substitution function for BibTeX keys, where we don't want LaTeX 
99
// escaping, but we do want to preserve the base characters
100
101
function tidyAccents(s) {
102
	var r=s.toLowerCase();
103
104
	// XXX Remove conditional when we drop Zotero 2.1.x support
105
	// This is supported in Zotero 3.0 and higher
106-
	if (ZU.removeDiacritics == undefined)
106+
	if (ZU.removeDiacritics !== undefined)
107
		r = ZU.removeDiacritics(r, true);
108
	else {
109
	// We fall back on the replacement list we used previously
110
		r = r.replace(new RegExp("[ä]", 'g'),"ae");
111
		r = r.replace(new RegExp("[ö]", 'g'),"oe");
112
		r = r.replace(new RegExp("[ü]", 'g'),"ue");
113
		r = r.replace(new RegExp("[àáâãå]", 'g'),"a");
114
		r = r.replace(new RegExp("æ", 'g'),"ae");
115
		r = r.replace(new RegExp("ç", 'g'),"c");
116
		r = r.replace(new RegExp("[èéêë]", 'g'),"e");
117
		r = r.replace(new RegExp("[ìíîï]", 'g'),"i");
118
		r = r.replace(new RegExp("ñ", 'g'),"n");                            
119
		r = r.replace(new RegExp("[òóôõ]", 'g'),"o");
120
		r = r.replace(new RegExp("œ", 'g'),"oe");
121
		r = r.replace(new RegExp("[ùúû]", 'g'),"u");
122
		r = r.replace(new RegExp("[ýÿ]", 'g'),"y");
123
	}
124
125
	return r;
126
};
127
128
var numberRe = /^[0-9]+/;
129
// Below is a list of words that should not appear as part of the citation key
130
// in includes the indefinite articles of English, German, French and Spanish, as well as a small set of English prepositions whose 
131
// force is more grammatical than lexical, i.e. which are likely to strike many as 'insignificant'.
132
// The assumption is that most who want a title word in their key would prefer the first word of significance.
133
var citeKeyTitleBannedRe = /\b(a|an|the|some|from|on|in|to|of|do|with|der|die|das|ein|eine|einer|eines|einem|einen|un|une|la|le|l\'|el|las|los|al|uno|una|unos|unas|de|des|del|d\')(\s+|\b)/g;
134
var citeKeyConversionsRe = /%([a-zA-Z])/;
135
var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;
136
137
var citeKeyConversions = {
138
	"a":function (flags, item) {
139
		if(item.creators && item.creators[0] && item.creators[0].lastName) {
140
			return item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,"");
141
		}
142
		return "";
143
	},
144
	"t":function (flags, item) {
145
		if (item["title"]) {
146
			return item["title"].toLowerCase().replace(citeKeyTitleBannedRe, "").split(/\s+/g)[0];
147
		}
148
		return "";
149
	},
150
	"y":function (flags, item) {
151
		if(item.date) {
152
			var date = Zotero.Utilities.strToDate(item.date);
153
			if(date.year && numberRe.test(date.year)) {
154
				return date.year;
155
			}
156
		}
157
		return "????";
158
	}
159
}
160
161
162
function buildCiteKey (item,citekeys) {
163
	var basekey = "";
164
	var counter = 0;
165
	citeKeyFormatRemaining = citeKeyFormat;
166
	while (citeKeyConversionsRe.test(citeKeyFormatRemaining)) {
167
		if (counter > 100) {
168
			Zotero.debug("Pathological BibTeX format: " + citeKeyFormat);
169
			break;
170
		}
171
		var m = citeKeyFormatRemaining.match(citeKeyConversionsRe);
172
		if (m.index > 0) {
173
			//add data before the conversion match to basekey
174
			basekey = basekey + citeKeyFormatRemaining.substr(0, m.index);
175
		}
176
		var flags = ""; // for now
177
		var f = citeKeyConversions[m[1]];
178
		if (typeof(f) == "function") {
179
			var value = f(flags, item);
180
			Zotero.debug("Got value " + value + " for %" + m[1]);
181
			//add conversion to basekey
182
			basekey = basekey + value;
183
		}
184
		citeKeyFormatRemaining = citeKeyFormatRemaining.substr(m.index + m.length);
185
		counter++;
186
	}
187
	if (citeKeyFormatRemaining.length > 0) {
188
		basekey = basekey + citeKeyFormatRemaining;
189
	}
190
191
	// for now, remove any characters not explicitly known to be allowed;
192
	// we might want to allow UTF-8 citation keys in the future, depending
193
	// on implementation support.
194
	//
195
	// no matter what, we want to make sure we exclude
196
	// " # % ' ( ) , = { } ~ and backslash
197
	// however, we want to keep the base characters 
198
199
	basekey = tidyAccents(basekey);
200
	basekey = basekey.replace(citeKeyCleanRe, "");
201
	var citekey = basekey;
202
	var i = 0;
203
	while(citekeys[citekey]) {
204
		i++;
205
		citekey = basekey + "-" + i;
206
	}
207
	citekeys[citekey] = true;
208
	return citekey;
209
}
210
211
function doExport() {
212
	//Zotero.write("% BibTeX export generated by Zotero "+Zotero.Utilities.getVersion());
213
	// to make sure the BOM gets ignored
214
		
215
	var first = true;
216
	var citekeys = new Object();
217
	var item;
218
	while(item = Zotero.nextItem()) {
219
		// determine type
220
		var type = zotero2bibtexTypeMap[item.itemType];
221
		if (typeof(type) == "function") { type = type(item); }
222
		if(!type) type = "misc";
223
		
224
		// create a unique citation key
225
		var citekey = buildCiteKey(item, citekeys);
226
		
227
		// write citation key
228
		Zotero.write((first ? "\\citep{" : ",") + citekey);
229
		first = false;
230
		
231
	}
232
	
233
	Zotero.write("}");
234
}