summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkanzure <kanzure@gmail.com>2009-07-24 23:26:56 -0500
committerkanzure <kanzure@gmail.com>2009-07-24 23:26:56 -0500
commit6ca4d6a103e188ca5fb3f27419ae97210b61ee34 (patch)
treeb2efd7ee7d21fa4f98ed272c9902825b19660cc6
parent17f7da9f0728dcd6701c7897dd04b194ab315d7b (diff)
downloadpyscholar-6ca4d6a103e188ca5fb3f27419ae97210b61ee34.tar.gz
pyscholar-6ca4d6a103e188ca5fb3f27419ae97210b61ee34.zip
threw in some zotero files to convert
-rw-r--r--zotero-import/BibTeX.js2031
-rw-r--r--zotero-import/Blackwell Synergy.js91
-rw-r--r--zotero-import/CiteSeer.js111
-rw-r--r--zotero-import/DOI.js103
-rw-r--r--zotero-import/Google Books.js174
-rw-r--r--zotero-import/Google Patents.js170
-rw-r--r--zotero-import/Google Scholar.js119
-rw-r--r--zotero-import/IEEE Xplore.js128
-rw-r--r--zotero-import/ISI Web of Knowledge.js114
-rw-r--r--zotero-import/IngentaConnect.js71
-rw-r--r--zotero-import/Nature.js107
-rw-r--r--zotero-import/PLoS Biology and Medicine.js87
-rw-r--r--zotero-import/PLoS Journals.js83
-rw-r--r--zotero-import/Project Gutenberg.js175
-rw-r--r--zotero-import/PubMed Central.js92
-rw-r--r--zotero-import/RSC Publishing.js438
-rw-r--r--zotero-import/ScienceDirect.js310
-rw-r--r--zotero-import/SpringerLink.js105
-rw-r--r--zotero-import/Wiley InterScience.js125
19 files changed, 4634 insertions, 0 deletions
diff --git a/zotero-import/BibTeX.js b/zotero-import/BibTeX.js
new file mode 100644
index 0000000..6141766
--- /dev/null
+++ b/zotero-import/BibTeX.js
@@ -0,0 +1,2031 @@
+{
+ "translatorID":"9cb70025-a888-4a29-a210-93ec52da40d4",
+ "translatorType":3,
+ "label":"BibTeX",
+ "creator":"Simon Kornblith and Richard Karnesky",
+ "target":"bib",
+ "minVersion":"1.0.0b4.r1",
+ "maxVersion":"",
+ "priority":200,
+ "inRepository":true,
+ "lastUpdated":"2009-07-04 05:00:00"
+}
+
+Zotero.configure("dataMode", "block");
+Zotero.addOption("exportCharset", "UTF-8");
+
+function detectImport() {
+ var maxChars = 1048576; // 1MB
+
+ var inComment = false;
+ var block = "";
+ var buffer = "";
+ var chr = "";
+ var charsRead = 0;
+
+ var re = /^\s*@[a-zA-Z]+[\(\{]/;
+ while((buffer = Zotero.read(4096)) && charsRead < maxChars) {
+ Zotero.debug("Scanning " + buffer.length + " characters for BibTeX");
+ charsRead += buffer.length;
+ for (var i=0; i<buffer.length; i++) {
+ chr = buffer[i];
+
+ if (inComment && chr != "\r" && chr != "\n") {
+ continue;
+ }
+ inComment = false;
+
+ if(chr == "%") {
+ // read until next newline
+ block = "";
+ inComment = true;
+ } else if((chr == "\n" || chr == "\r") && block) {
+ // check if this is a BibTeX entry
+ if(re.test(block)) {
+ return true;
+ }
+
+ block = "";
+ } else if(" \n\r\t".indexOf(chr) == -1) {
+ block += chr;
+ }
+ }
+ }
+}
+
+//%a = first author surname
+//%y = year
+//%t = first word of title
+var citeKeyFormat = "%a_%t_%y";
+
+var fieldMap = {
+ address:"place",
+ chapter:"section",
+ edition:"edition",
+ type:"type",
+ series:"series",
+ title:"title",
+ volume:"volume",
+ copyright:"rights",
+ isbn:"ISBN",
+ issn:"ISSN",
+ lccn:"callNumber",
+ location:"archiveLocation",
+ shorttitle:"shortTitle",
+ url:"url",
+ doi:"DOI",
+ "abstract":"abstractNote"
+};
+
+var inputFieldMap = {
+ booktitle :"publicationTitle",
+ school:"publisher",
+ institution:"publisher",
+ publisher:"publisher"
+};
+
+var zotero2bibtexTypeMap = {
+ "book":"book",
+ "bookSection":"incollection",
+ "journalArticle":"article",
+ "magazineArticle":"article",
+ "newspaperArticle":"article",
+ "thesis":"phdthesis",
+ "letter":"misc",
+ "manuscript":"unpublished",
+ "interview":"misc",
+ "film":"misc",
+ "artwork":"misc",
+ "webpage":"misc",
+ "conferencePaper":"inproceedings",
+ "report":"techreport"
+};
+
+var bibtex2zoteroTypeMap = {
+ "book":"book", // or booklet, proceedings
+ "inbook":"bookSection",
+ "incollection":"bookSection",
+ "article":"journalArticle", // or magazineArticle or newspaperArticle
+ "phdthesis":"thesis",
+ "unpublished":"manuscript",
+ "inproceedings":"conferencePaper", // check for conference also
+ "conference":"conferencePaper",
+ "techreport":"report",
+ "booklet":"book",
+ "manual":"book",
+ "mastersthesis":"thesis",
+ "misc":"book",
+ "proceedings":"book"
+};
+
+/*
+ * three-letter month abbreviations. i assume these are the same ones that the
+ * docs say are defined in some appendix of the LaTeX book. (i don't have the
+ * LaTeX book.)
+ */
+var months = ["jan", "feb", "mar", "apr", "may", "jun",
+ "jul", "aug", "sep", "oct", "nov", "dec"];
+
+/*
+ * new mapping table based on that from Matthias Steffens,
+ * then enhanced with some fields generated from the unicode table.
+ */
+
+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
+ "\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
+ "\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
+ "\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
+ "\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
+ "\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
+ "{\\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
+ "{\\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
+// "{\\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
+// "<=" : "\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
+// "|-" : "\u22A6", // ASSERTION
+ "|=" : "\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
+// "$\\#$" : "\u266F", // MUSIC SHARP SIGN
+ "$\\%<$" : "\u2701", // UPPER BLADE SCISSORS
+/* "$\\%<$" : "\u2702", // BLACK 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
+ "\\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
+ "\\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
+};
+
+var alwaysMap = {
+ "|":"{\\textbar}",
+ "<":"{\\textless}",
+ ">":"{\\textgreater}",
+ "~":"{\\textasciitilde}",
+ "^":"{\\textasciicircum}",
+ "\\":"{\\textbackslash}"
+};
+
+var strings = {};
+var keyRe = /[a-zA-Z0-9\-]/;
+
+function processField(item, field, value) {
+ if(fieldMap[field]) {
+ item[fieldMap[field]] = value;
+ } else if(inputFieldMap[field]) {
+ item[inputFieldMap[field]] = value;
+ } else if(field == "journal") {
+ if(item.publicationTitle) {
+ item.journalAbbreviation = value;
+ } else {
+ item.publicationTitle = value;
+ }
+ } else if(field == "fjournal") {
+ if(item.publicationTitle) {
+ // move publicationTitle to abbreviation
+ item.journalAbbreviation = value;
+ }
+ item.publicationTitle = value;
+ } else if(field == "author" || field == "editor" || field == "translator") {
+ // parse authors/editors/translators
+ var names = value.split(/ and /i); // now case insensitive
+ for each(var name in names) {
+ item.creators.push(Zotero.Utilities.cleanAuthor(name, field,
+ (name.indexOf(",") != -1)));
+ }
+ } else if(field == "institution" || field == "organization") {
+ item.backupPublisher = value;
+ } else if(field == "number"){ // fix for techreport
+ if (item.itemType == "report") {
+ item.reportNumber = value;
+ } else if (item.itemType == "book" || item.itemType == "bookSection") {
+ item.seriesNumber = value;
+ } else {
+ item.issue = value;
+ }
+ } else if(field == "month") {
+ var monthIndex = months.indexOf(value.toLowerCase());
+ if(monthIndex != -1) {
+ value = Zotero.Utilities.formatDate({month:monthIndex});
+ } else {
+ value += " ";
+ }
+
+ if(item.date) {
+ if(value.indexOf(item.date) != -1) {
+ // value contains year and more
+ item.date = value;
+ } else {
+ item.date = value+item.date;
+ }
+ } else {
+ item.date = value;
+ }
+ } else if(field == "year") {
+ if(item.date) {
+ if(item.date.indexOf(value) == -1) {
+ // date does not already contain year
+ item.date += value;
+ }
+ } else {
+ item.date = value;
+ }
+ } else if(field == "pages") {
+ item.pages = value.replace(/--/g, "-");
+ } else if(field == "note") {
+ item.extra += "\n"+value;
+ } else if(field == "howpublished") {
+ if(value.length >= 7) {
+ var str = value.substr(0, 7);
+ if(str == "http://" || str == "https:/" || str == "mailto:") {
+ item.url = value;
+ } else {
+ item.extra += "\nPublished: "+value;
+ }
+ }
+ } else if(field == "keywords") {
+ if(value.indexOf(",") == -1) {
+ // keywords/tags
+ item.tags = value.split(" ");
+ } else {
+ item.tags = value.split(/, ?/g);
+ }
+ } else if (field == "comment" || field == "annote" || field == "review") {
+ item.notes.push({note:value});
+ } else if (field == "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) {
+ var value = "";
+ // now, we have the first character of the field
+ if(read == "{") {
+ // character is a brace
+ var openBraces = 1;
+ while(read = Zotero.read(1)) {
+ if(read == "{" && value[value.length-1] != "\\") {
+ openBraces++;
+ value += "{";
+ } else if(read == "}" && value[value.length-1] != "\\") {
+ openBraces--;
+ if(openBraces == 0) {
+ break;
+ } else {
+ value += "}";
+ }
+ } else {
+ value += read;
+ }
+ }
+ } else if(read == '"') {
+ var openBraces = 0;
+ while(read = Zotero.read(1)) {
+ if(read == "{" && value[value.length-1] != "\\") {
+ openBraces++;
+ value += "{";
+ } else if(read == "}" && value[value.length-1] != "\\") {
+ openBraces--;
+ value += "}";
+ } else if(read == '"' && openBraces == 0) {
+ break;
+ } else {
+ value += read;
+ }
+ }
+ }
+
+ if(value.length > 1) {
+ // replace accented characters (yucky slow)
+ value = value.replace(/{(\\[`"'^~=a-z])([A-Za-z])}/g, "$1{$2}");
+ for (var mapped in reversemappingTable) { // really really slow!
+ var unicode = reversemappingTable[mapped];
+ if (value.indexOf(mapped) != -1) {
+ Zotero.debug("Replace " + mapped + " in " + value + " with " + unicode);
+ value = value.replace(mapped, unicode, "g");
+ }
+ mapped = mapped.replace(/[{}]/, "");
+ if (value.indexOf(mapped) != -1) {
+ Zotero.debug("Replace(2) " + mapped + " in " + value + " with " + unicode);
+ value = value.replace(mapped, unicode, "g");
+ }
+ }
+
+ // kill braces
+ value = value.replace(/([^\\])[{}]+/g, "$1");
+ if(value[0] == "{") {
+ value = value.substr(1);
+ }
+
+ // chop off backslashes
+ value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2");
+ value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2");
+ if(value[0] == "\\" && "#$%&~_^\\{}".indexOf(value[1]) != -1) {
+ value = value.substr(1);
+ }
+ if(value[value.length-1] == "\\" && "#$%&~_^\\{}".indexOf(value[value.length-2]) != -1) {
+ value = value.substr(0, value.length-1);
+ }
+ value = value.replace(/\\\\/g, "\\");
+ value = value.replace(/\s+/g, " ");
+ }
+
+ return value;
+}
+
+function beginRecord(type, closeChar) {
+ type = Zotero.Utilities.cleanString(type.toLowerCase());
+ if(type != "string") {
+ var zoteroType = bibtex2zoteroTypeMap[type];
+ if (!zoteroType) {
+ Zotero.debug("discarded item from BibTeX; type was "+type);
+ }
+ var item = new Zotero.Item(zoteroType);
+
+ item.extra = "";
+ }
+
+ var field = "";
+
+ // by setting dontRead to true, we can skip a read on the next iteration
+ // of this loop. this is useful after we read past the end of a string.
+ var dontRead = false;
+
+ while(dontRead || (read = Zotero.read(1))) {
+ dontRead = false;
+
+ if(read == "=") { // equals begin a field
+ // read whitespace
+ var read = Zotero.read(1);
+ while(" \n\r\t".indexOf(read) != -1) {
+ read = Zotero.read(1);
+ }
+
+ if(keyRe.test(read)) {
+ // read numeric data here, since we might get an end bracket
+ // that we should care about
+ value = "";
+ value += read;
+
+ // character is a number
+ while((read = Zotero.read(1)) && keyRe.test(read)) {
+ value += read;
+ }
+
+ // don't read the next char; instead, process the character
+ // we already read past the end of the string
+ dontRead = true;
+
+ // see if there's a defined string
+ if(strings[value]) value = strings[value];
+ } else {
+ var value = getFieldValue(read);
+ }
+
+ if(item) {
+ processField(item, field.toLowerCase(), value);
+ } else if(type == "string") {
+ strings[field] = value;
+ }
+ field = "";
+ } else if(read == ",") { // commas reset
+ field = "";
+ } else if(read == closeChar) {
+ if(item) {
+ if(item.extra) item.extra = item.extra.substr(1); // chop \n
+ item.complete();
+ }
+ return;
+ } else if(" \n\r\t".indexOf(read) == -1) { // skip whitespace
+ field += read;
+ }
+ }
+}
+
+function doImport() {
+ var read = "", text = "", recordCloseElement = false;
+ var type = false;
+
+ while(read = Zotero.read(1)) {
+ if(read == "@") {
+ type = "";
+ } else if(type !== false) {
+ if(type == "comment") {
+ type = false;
+ } else if(read == "{") { // possible open character
+ beginRecord(type, "}");
+ type = false;
+ } else if(read == "(") { // possible open character
+ beginRecord(type, ")");
+ type = false;
+ } else {
+ type += read;
+ }
+ }
+ }
+}
+
+// some fields are, in fact, macros. If that is the case then we should not put the
+// data in the braces as it will cause the macros to not expand properly
+function writeField(field, value, isMacro) {
+ if(!value) return;
+ value = value + ""; // convert integers to strings
+ Zotero.write(",\n\t"+field+" = ");
+ if(!isMacro) Zotero.write("{");
+ // url field is preserved, for use with \href and \url
+ // Other fields (DOI?) may need similar treatment
+ if(field != "url") {
+ // I hope these are all the escape characters!
+ value = value.replace(/[|\<\>\~\^\\]/g, mapEscape).replace(/([\#\$\%\&\_])/g, "\\$1");
+ // Case of words with uppercase characters in non-initial positions is preserved with braces.
+ if(!isMacro) value = value.replace(/([^\s]+[A-Z][^\s]*)/g, "{$1}");
+ }
+ if (Zotero.getOption("exportCharset") != "UTF-8") {
+ value = value.replace(/[\u0080-\uFFFF]/g, mapAccent);
+ }
+ Zotero.write(value);
+ if(!isMacro) Zotero.write("}");
+}
+
+function mapEscape(character) {
+ return alwaysMap[character];
+}
+
+function mapAccent(character) {
+ return (mappingTable[character] ? mappingTable[character] : "?");
+}
+
+var numberRe = /^[0-9]+/;
+// this is a list of words that should not appear as part of the citation key
+var citeKeyTitleBannedRe = /(\s+|\b)(a|an|from|does|how|it\'s|its|on|some|the|this|why)(\s+|\b)/g;
+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(" ")[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;
+ }
+
+ // 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
+
+ basekey = basekey.replace(citeKeyCleanRe, "");
+ var citekey = basekey;
+ var i = 0;
+ while(citekeys[citekey]) {
+ i++;
+ citekey = basekey + "-" + i;
+ }
+ citekeys[citekey] = true;
+ return citekey;
+}
+
+function doExport() {
+ //Zotero.write("% BibTeX export generated by Zotero "+Zotero.Utilities.getVersion());
+ // to make sure the BOM gets ignored
+ Zotero.write("\n");
+
+ var first = true;
+ var citekeys = new Object();
+ var item;
+ while(item = Zotero.nextItem()) {
+ // determine type
+ var type = zotero2bibtexTypeMap[item.itemType];
+ if (typeof(type) == "function") { type = type(item); }
+ if(!type) type = "misc";
+
+ // create a unique citation key
+ var citekey = buildCiteKey(item, citekeys);
+
+ // write citation key
+ Zotero.write((first ? "" : ",\n\n") + "@"+type+"{"+citekey);
+ first = false;
+
+ for(var field in fieldMap) {
+ if(item[fieldMap[field]]) {
+ writeField(field, item[fieldMap[field]]);
+ }
+ }
+
+ if(item.reportNumber || item.issue || item.seriesNumber) {
+ writeField("number", item.reportNumber || item.issue || item.seriesNumber);
+ }
+
+ if(item.publicationTitle) {
+ if(item.itemType == "bookSection" || item.itemType == "conferencePaper") {
+ writeField("booktitle", item.publicationTitle);
+ } else {
+ writeField("journal", item.publicationTitle);
+ }
+ }
+
+ if(item.publisher) {
+ if(item.itemType == "thesis") {
+ writeField("school", item.publisher);
+ } else if(item.itemType =="report") {
+ writeField("institution", item.publisher);
+ } else {
+ writeField("publisher", item.publisher);
+ }
+ }
+
+ if(item.creators && item.creators.length) {
+ // split creators into subcategories
+ var author = "";
+ var editor = "";
+ var translator = "";
+ for each(var creator in item.creators) {
+ var creatorString = creator.lastName;
+
+ if (creator.firstName) {
+ creatorString = creator.firstName + " " + creator.lastName;
+ }
+
+ if (creator.creatorType == "editor") {
+ editor += " and "+creatorString;
+ } else if (creator.creatorType == "translator") {
+ translator += " and "+creatorString;
+ } else {
+ author += " and "+creatorString;
+ }
+ }
+
+ if(author) {
+ writeField("author", author.substr(5));
+ }
+ if(editor) {
+ writeField("editor", editor.substr(5));
+ }
+ if(translator) {
+ writeField("translator", translator.substr(5));
+ }
+ }
+
+ if(item.date) {
+ var date = Zotero.Utilities.strToDate(item.date);
+ // need to use non-localized abbreviation
+ if(date.month) {
+ writeField("month", months[date.month], true);
+ }
+ if(date.year) {
+ writeField("year", date.year);
+ }
+ }
+
+ if(item.extra) {
+ writeField("note", item.extra);
+ }
+
+ if(item.tags && item.tags.length) {
+ var tagString = "";
+ for each(var tag in item.tags) {
+ tagString += ", "+tag.tag;
+ }
+ writeField("keywords", tagString.substr(2));
+ }
+
+ if(item.pages) {
+ writeField("pages", item.pages.replace("-","--"));
+ }
+
+ if(item.itemType == "webpage") {
+ writeField("howpublished", item.url);
+ }
+ if (item.notes) {
+ for each (var note in item.notes) {
+ writeField("annote", note["note"]);
+ }
+ }
+ Zotero.write("\n}");
+ }
+}
diff --git a/zotero-import/Blackwell Synergy.js b/zotero-import/Blackwell Synergy.js
new file mode 100644
index 0000000..d839817
--- /dev/null
+++ b/zotero-import/Blackwell Synergy.js
@@ -0,0 +1,91 @@
+{
+ "translatorID":"cb48083-4d9-4ed-ac95-2e93dceea0ec",
+ "translatorType":4,
+ "label":"Blackwell Synergy",
+ "creator":"Michael Berkowitz",
+ "target":"https?://www\\.blackwell-synergy\\.com[^/]*/(?:action/doSearch|doi/|links/doi/)",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2008-04-28 17:50:00"
+}
+
+function detectWeb(doc, url) {
+ if(url.indexOf("doSearch") != -1) {
+ return "multiple";
+ } else {
+ return "journalArticle";
+ }
+}
+
+function titleCase(str) {
+ var skipWords = ["but", "or", "yet", "so", "for", "and", "nor", "a", "an", "the", "at", "by", "from", "in", "into", "of", "on", "to", "with", "up", "down", "as"];
+ var words = str.toLowerCase().split(/\s+/);
+ var newstr = "";
+ for each (var word in words) {
+ if (skipWords.indexOf(word.replace(/[^a-zA-Z]+/, "")) != -1) {
+ newstr += " " + word;
+ } else if (word.indexOf("-") != -1) {
+ newword = word.split("-");
+ newstr += " " + newword[0][0].toUpperCase() + newword[0].substr(1) + "-" + newword[1][0].toUpperCase() + newword[1].substr(1);
+ } else {
+ newstr += " " + word[0].toUpperCase() + word.substr(1);
+ }
+ }
+ return Zotero.Utilities.trimInternal(newstr);
+}
+
+function doWeb(doc, url) {
+ var host = doc.location.host;
+ var articles = new Array();
+ if (detectWeb(doc, url) == "multiple") {
+ var items = new Object();
+ var rows = doc.evaluate('//div[@class="toc_item"]', doc, null, XPathResult.ANY_TYPE, null);
+ var row;
+ while (row = rows.iterateNext()) {
+ var title = Zotero.Utilities.trimInternal(doc.evaluate('.//label', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
+ var id = doc.evaluate('.//input[@name="doi"]', row, null, XPathResult.ANY_TYPE, null).iterateNext().value;
+ items[id] = title;
+ }
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ articles.push(i);
+ }
+ } else {
+ articles = [decodeURIComponent(url).match(/doi\/(abs\/)?([^\?]+)(\?|$)/)[2]];
+ }
+
+ var post = "";
+ for each (var doi in articles) {
+ post += "doi=" + encodeURIComponent(doi) + "&"
+ }
+ post += "include=abs&format=refman&submit=Download+references";
+ Zotero.Utilities.HTTP.doPost('http://www.blackwell-synergy.com/action/downloadCitation', post, function(text) {
+ text = text.replace(/(Y1\s+\-\s+)(\d{4}\/\d{2}).*\n/, "$1$2\n");
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ translator.setString(text);
+ translator.setHandler("itemDone", function(obj, item) {
+ item.DOI = Zotero.Utilities.trimInternal(item.notes[0]['note'].substr(4));
+ item.notes = new Array();
+ item.attachments = [
+ {url:item.url, title:"Blackwell Synergy Snapshot", mimeType:"text/html"},
+ {url:item.url.replace(/\/\/[^/]*/, "//" + host).replace("/doi/abs", "/doi/pdf"), title:"Blackwell Synergy Full Text PDF", mimeType:"application/pdf"}
+ ];
+ // use fulltext if possible
+ var oldCreators = item.creators;
+ item.creators = []
+ for each (var author in oldCreators) {
+ if (author["lastName"] != "") {
+ item.creators.push({firstName:titleCase(author.firstName), lastName:titleCase(author.lastName), creatorType:"author"});
+ }
+ }
+ item.title = titleCase(item.title);
+ item.complete();
+ });
+ translator.translate();
+
+ Zotero.done();
+ });
+} \ No newline at end of file
diff --git a/zotero-import/CiteSeer.js b/zotero-import/CiteSeer.js
new file mode 100644
index 0000000..9fca79c
--- /dev/null
+++ b/zotero-import/CiteSeer.js
@@ -0,0 +1,111 @@
+{
+ "translatorID":"fa396dd4-7d04-4f99-95e1-93d6f355441d",
+ "translatorType":4,
+ "label":"CiteSeer",
+ "creator":"Simon Kornblith",
+ "target":"^http://(?:citeseer\\.ist\\.psu\\.edu/|citeseer\\.csail\\.mit\\.edu/|citeseer\\.ifi\\.unizh\\.ch/|citeseer\\.comp\\.nus\\.edu\\.sg/)",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2008-02-06 21:00:00"
+}
+
+function detectWeb(doc, url) {
+ var searchRe = /http:\/\/[^\/]+\/ci?s/;
+ if(searchRe.test(url)) {
+ return "multiple";
+ } else {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ if(doc.evaluate('/html/body/span[@class="m"]/pre', doc, nsResolver,
+ XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "journalArticle";
+ }
+ }
+}
+
+function scrape(doc) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ // figure out what attachments to add
+ var attachments = new Array();
+ var results = doc.evaluate('/html/body/span[@class="m"]/table[@class="h"]/tbody/tr/td[4]/center/font/a',
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var elmt;
+
+ var acceptableTypes = ["PDF", "PS", "PS.gz"];
+ var mimeTypes = ["application/pdf", "application/postscript", "application/gzip"];
+ var resultsArray = [];
+ while (elmt = results.iterateNext()) {
+ resultsArray.push(elmt);
+ }
+ resultsArray = resultsArray.filter(function (element, index, array) {
+ return (acceptableTypes.indexOf(element.textContent.toString()) != -1);
+ });
+ resultsArray = resultsArray.sort(function (a,b) {
+ return (acceptableTypes.indexOf(a.textContent.toString()) -
+ acceptableTypes.indexOf(b.textContent.toString()));
+ });
+ if (resultsArray.length > 0) {
+ var elmt = resultsArray[0];
+ var kind = elmt.textContent.toString();
+ var index = acceptableTypes.indexOf(kind);
+ var attachment = {url:elmt.href, mimeType:mimeTypes[index],
+ title:"CiteSeer Full Text "+kind};
+ attachments.push(attachment);
+ }
+
+ var bibtex = doc.evaluate('/html/body/span[@class="m"]/pre/text()', doc, nsResolver,
+ XPathResult.ANY_TYPE, null).iterateNext();
+ if(bibtex) {
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
+ translator.setString(bibtex.nodeValue.toString());
+ translator.setHandler("itemDone", function(obj, item) {
+ if(item.url) { // add http to url
+ item.url = "http://"+item.url;
+ }
+ item.attachments = attachments;
+
+ item.complete();
+ });
+ translator.translate();
+ } else {
+ throw "No BibTeX found!";
+ }
+}
+
+function doWeb(doc, url) {
+ var searchRe = /http:\/\/([^\/]+)\/ci?s/;
+ var m = searchRe.exec(doc.location.href);
+ if(m) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var items = Zotero.Utilities.getItemArray(doc, doc, "^http://"+m[1]+"/[^/]+.html");
+ items = Zotero.selectItems(items);
+
+ if(!items) {
+ return true;
+ }
+
+ var urls = new Array();
+ for(var i in items) {
+ urls.push(i);
+ }
+
+ Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
+ Zotero.wait();
+ } else {
+ scrape(doc);
+ }
+} \ No newline at end of file
diff --git a/zotero-import/DOI.js b/zotero-import/DOI.js
new file mode 100644
index 0000000..de73210
--- /dev/null
+++ b/zotero-import/DOI.js
@@ -0,0 +1,103 @@
+{
+ "translatorID":"c159dcfe-8a53-4301-a499-30f6549c340d",
+ "translatorType":4,
+ "label":"DOI",
+ "creator":"Simon Kornblith",
+ "target":null,
+ "minVersion":"1.0.10",
+ "maxVersion":"",
+ "priority":300,
+ "inRepository":true,
+ "lastUpdated":"2009-04-07 15:48:00"
+}
+
+var items = {};
+var selectArray = {};
+
+// builds a list of DOIs
+function getDOIs(doc) {
+ const DOIre = /\b(10\.[\w.]+\/[^\/\s]+)\.?\b/igm;
+ const DOIXPath = "//text()[contains(., '10.')]";
+
+ DOIre.lastMatch = 0;
+ var DOIs = [];
+
+ var node, m;
+ var results = doc.evaluate(DOIXPath, doc, null, XPathResult.ANY_TYPE, null);
+ while(node = results.iterateNext()) {
+ while(m = DOIre.exec(node.nodeValue)) {
+ var DOI = m[1];
+ if(DOI.substr(-1) == ")" && DOI.indexOf("(") == -1) {
+ DOI = DOI.substr(0, DOI.length-1);
+ }
+ // only add new DOIs
+ if(DOIs.indexOf(DOI) == -1) {
+ DOIs.push(DOI);
+ }
+ }
+ }
+
+ return DOIs;
+}
+
+function detectWeb(doc, url) {
+ const blacklistRe = /^https?:\/\/[^/]*google\.com/i;
+
+ if(!blacklistRe.test(url)) {
+ var DOIs = getDOIs(doc);
+ if(DOIs.length) {
+ return DOIs.length == 1 ? "journalArticle" : "multiple";
+ }
+ }
+ return false;
+}
+
+function retrieveNextDOI(DOIs, doc) {
+ if(DOIs.length) {
+ // retrieve DOI
+ var DOI = DOIs.shift();
+ var translate = Zotero.loadTranslator("search");
+ translate.setTranslator("11645bd1-0420-45c1-badb-53fb41eeb753");
+ var item = {"itemType":"journalArticle", "DOI":DOI};
+ translate.setSearch(item);
+ // don't save when item is done
+ translate.setHandler("itemDone", function(translate, item) {
+ item.repository = "CrossRef";
+ items[DOI] = item;
+ selectArray[DOI] = item.title;
+ });
+ translate.setHandler("done", function(translate) {
+ retrieveNextDOI(DOIs, doc);
+ });
+ translate.translate();
+ } else {
+ // all DOIs retrieved now
+ // check to see if there is more than one DOI
+ var numDOIs = 0;
+ for(var DOI in selectArray) {
+ numDOIs++;
+ if(numDOIs == 2) break;
+ }
+ if(numDOIs == 0) {
+ throw "DOI Translator: could not find DOI";
+ } else if(numDOIs == 1) {
+ // do we want to add URL of the page?
+ items[DOI].url = doc.location.href;
+ items[DOI].attachments = [{document:doc}];
+ items[DOI].complete();
+ } else {
+ selectArray = Zotero.selectItems(selectArray);
+ for(var DOI in selectArray) {
+ items[DOI].complete();
+ }
+ }
+ Zotero.done();
+ }
+}
+
+function doWeb(doc, url) {
+ var DOIs = getDOIs(doc);
+ // retrieve full items asynchronously
+ Zotero.wait();
+ retrieveNextDOI(DOIs, doc);
+} \ No newline at end of file
diff --git a/zotero-import/Google Books.js b/zotero-import/Google Books.js
new file mode 100644
index 0000000..6fa894b
--- /dev/null
+++ b/zotero-import/Google Books.js
@@ -0,0 +1,174 @@
+{
+ "translatorID":"3e684d82-73a3-9a34-095f-19b112d88bbf",
+ "translatorType":4,
+ "label":"Google Books",
+ "creator":"Simon Kornblith, Michael Berkowitz and Rintze Zelle",
+ "target":"^http://(books|www)\\.google\\.[a-z]+(\\.[a-z]+)?/books\\?(.*id=.*|.*q=.*)",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-06-04 01:10:00"
+}
+
+
+function detectWeb(doc, url) {
+ var re = new RegExp('^http://(books|www)\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)', 'i');
+ if(re.test(doc.location.href)) {
+ return "book";
+ } else {
+ return "multiple";
+ }
+}
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ // get local domain suffix
+ var psRe = new RegExp("https?://(books|www)\.google\.([^/]+)/");
+ var psMatch = psRe.exec(url);
+ var suffix = psMatch[2];
+ var prefix = psMatch[1];
+ var uri = doc.location.href;
+ var newUris = new Array();
+
+ var re = new RegExp('^http://(?:books|www)\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)', 'i');
+ var m = re.exec(uri);
+ if(m) {
+ newUris.push("http://books.google.com/books/feeds/volumes/"+m[2]);
+ } else {
+ var items = getItemArrayGB(doc, doc, 'http://'+prefix+'\\.google\\.' + suffix + '/books\\?id=([^&]+)', '^(?:All matching pages|About this Book|Table of Contents|Index)');
+ // Drop " - Page" thing
+ for(var i in items) {
+ items[i] = items[i].replace(/- Page [0-9]+\s*$/, "");
+ }
+ items = Zotero.selectItems(items);
+
+ if(!items) {
+ return true;
+ }
+
+ for(var i in items) {
+ var m = re.exec(i);
+ newUris.push("http://books.google.com/books/feeds/volumes/"+m[2]);
+ }
+ }
+
+ var itemUrlBase = "http://"+prefix+".google."+suffix+"/books?id=";
+
+ Zotero.Utilities.HTTP.doGet(newUris, function(text) {
+ // Remove xml parse instruction and doctype
+ text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
+
+ var xml = new XML(text);
+
+ default xml namespace = "http://purl.org/dc/terms"; with ({});
+
+ var newItem = new Zotero.Item("book");
+
+ var authors = xml.creator;
+ for (var i in authors) {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i].toString(), "author"));
+ }
+
+ newItem.date = xml.date.toString();
+
+ var pages = xml.format.toString();
+ var pagesRe = new RegExp(/(\d+)( pages)/);
+ var pagesMatch = pagesRe.exec(pages);
+ if (pagesMatch!=null) {
+ newItem.pages = pagesMatch[1];
+ } else {
+ newItem.pages = pages;
+ }
+
+ var ISBN;
+ var identifiers = xml.identifier;
+ var identifiersRe = new RegExp(/(ISBN:)(\w+)/);
+ for (var i in identifiers) {
+ var identifierMatch = identifiersRe.exec(identifiers[i].toString());
+ if (identifierMatch!=null && !ISBN) {
+ ISBN = identifierMatch[2];
+ } else if (identifierMatch!=null){
+ ISBN = ISBN + ", " + identifierMatch[2];
+ }
+ }
+ newItem.ISBN = ISBN;
+
+ newItem.publisher = xml.publisher[0].toString();
+
+ newItem.title = xml.title[0].toString();
+
+ var url = itemUrlBase + xml.identifier[0];
+ newItem.attachments = [{title:"Google Books Link", snapshot:false, mimeType:"text/html", url:url}];
+
+ newItem.complete();
+ }, function() { Zotero.done(); }, null);
+ Zotero.wait();
+}
+
+/**
+ * Grabs items based on URLs
+ *
+ * @param {Document} doc DOM document object
+ * @param {Element|Element[]} inHere DOM element(s) to process
+ * @param {RegExp} [urlRe] Regexp of URLs to add to list
+ * @param {RegExp} [urlRe] Regexp of URLs to reject
+ * @return {Object} Associative array of link => textContent pairs, suitable for passing to
+ * Zotero.selectItems from within a translator
+ */
+function getItemArrayGB (doc, inHere, urlRe, rejectRe) {
+ var availableItems = new Object(); // Technically, associative arrays are objects
+
+ // Require link to match this
+ if(urlRe) {
+ if(urlRe.exec) {
+ var urlRegexp = urlRe;
+ } else {
+ var urlRegexp = new RegExp();
+ urlRegexp.compile(urlRe, "i");
+ }
+ }
+ // Do not allow text to match this
+ if(rejectRe) {
+ if(rejectRe.exec) {
+ var rejectRegexp = rejectRe;
+ } else {
+ var rejectRegexp = new RegExp();
+ rejectRegexp.compile(rejectRe, "i");
+ }
+ }
+
+ if(!inHere.length) {
+ inHere = new Array(inHere);
+ }
+
+ for(var j=0; j<inHere.length; j++) {
+ var links = inHere[j].getElementsByTagName("a");
+ for(var i=0; i<links.length; i++) {
+ if(!urlRe || urlRegexp.test(links[i].href)) {
+ var text = links[i].textContent;
+ //Rintze Zelle: the three lines below are for compatibility with Google Books cover view
+ if(!text) {
+ var text = links[i].firstChild.alt;
+ }
+ if(text) {
+ text = Zotero.Utilities.trimInternal(text);
+ if(!rejectRe || !rejectRegexp.test(text)) {
+ if(availableItems[links[i].href]) {
+ if(text != availableItems[links[i].href]) {
+ availableItems[links[i].href] += " "+text;
+ }
+ } else {
+ availableItems[links[i].href] = text;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return availableItems;
+} \ No newline at end of file
diff --git a/zotero-import/Google Patents.js b/zotero-import/Google Patents.js
new file mode 100644
index 0000000..12dffd5
--- /dev/null
+++ b/zotero-import/Google Patents.js
@@ -0,0 +1,170 @@
+{
+ "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":"2008-08-04 07:10:00"
+}
+
+function detectWeb(doc, url) {
+
+ if (doc.location.href.match("Search")) {
+ return "multiple";
+ } else if (doc.location.href.match("id")) {
+ return "patent";
+ }
+
+}
+
+//Google Patents Translator. Code by Adam Crymble
+
+function associateData (newItem, dataTags, field, zoteroField) {
+ if (dataTags[field]) {
+ newItem[zoteroField] = dataTags[field];
+ }
+}
+
+function scrape(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var dataTags = new Object();
+ var headings = new Array();
+ var newItem = new Zotero.Item("patent");
+
+ //checks format type
+ if (doc.location.href.match("printsec")) {
+
+ var contents = doc.evaluate('//table[@id="summarytable"]/tbody/tr[1]/td', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var xPathHeadings = doc.evaluate('//b', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var xPathCount = doc.evaluate('count (//b)', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ if (doc.evaluate('//span[@class="addmd"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+
+ var author = doc.evaluate('//span[@class="addmd"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "inventor"));
+ }
+
+ } else {
+
+ var xPathHeadings = doc.evaluate('//div[@class="patent_bibdata"]/p/b', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var xPathCount = doc.evaluate('count (//div[@class="patent_bibdata"]/p/b)', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+
+ var xPathContents = doc.evaluate('//div[@class="patent_bibdata"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var contentsCount = doc.evaluate('count (//div[@class="patent_bibdata"]/p)', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var contents;
+ for (i = 0; i < contentsCount.numberValue; i++) {
+ contents = (contents + xPathContents.iterateNext().textContent + " ");
+ }
+
+ if (doc.evaluate('//td[3]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ newItem.abstractNote = (doc.evaluate('//td[3]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Abstract", ''));
+ }
+
+ }
+
+ for (var i =0; i < xPathCount.numberValue; i++) {
+
+ headings.push(xPathHeadings.iterateNext().textContent);
+ contents = contents.replace(headings[i], "xxx");
+ }
+
+
+ var splitContent = new Array();
+ splitContent = contents.split(/xxx/);
+
+ //associate headings with contents.
+ for (var i = 0; i < headings.length; i++) {
+ fieldTitle = headings[i].replace(/\s+|\W*/g, '');
+
+ if (fieldTitle == "USClassification" | fieldTitle == "InternationalClassification" | fieldTitle == "Abstract") {
+ dataTags[fieldTitle] = splitContent[i+1];
+ } else {
+ dataTags[fieldTitle] = splitContent[i+1].replace(": ", '');
+ }
+
+ if (dataTags[fieldTitle].match("About this patent")) {
+ dataTags[fieldTitle] = dataTags[fieldTitle].replace("About this patent", '');
+ }
+
+ //author(s)
+ if (fieldTitle == "Inventors") {
+ var authors = dataTags[fieldTitle].split(", ");
+ for (var j = 0; j < authors.length; j++) {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "inventor"));
+ }
+ } else if (fieldTitle == "Inventor") {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventor"], "inventor"));
+ }
+ }
+
+ //extra field
+ if (dataTags["USClassification"] && dataTags["InternationalClassification"]) {
+ Zotero.debug(doc.title);
+ newItem.extra = ("U.S. Classification: " + dataTags["USClassification"] + "; International Classification: " + dataTags["InternationalClassification"]);
+ } else if (dataTags["USClassification"] ) {
+ newItem.extra = ("U.S. Classification: " + dataTags["USClassification"]);
+ } else if (dataTags["InternationalClassification"]) {
+ newItem.extra = ("International Classification: " + dataTags["InternationalClassification"]);
+ }
+
+ associateData (newItem, dataTags, "Patentnumber", "patentNumber");
+ associateData (newItem, dataTags, "Issuedate", "date");
+ associateData (newItem, dataTags, "Assignees", "assignee");
+ associateData (newItem, dataTags, "Assignee", "assignee");
+ associateData (newItem, dataTags, "Abstract", "abstractNote");
+ associateData (newItem, dataTags, "Applicationnumber", "applicationNumber");
+
+ newItem.title = doc.evaluate('//h2[@class="title"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ newItem.url = doc.location.href;
+
+ newItem.complete();
+}
+
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var articles = new Array();
+
+ if (detectWeb(doc, url) == "multiple") {
+ var items = new Object();
+
+ var xPathFirstTitle = doc.evaluate('//div[@id="results_container"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var firstTitle = xPathFirstTitle.iterateNext();
+
+ var titles = doc.evaluate('//p/a', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ items[firstTitle.href] = firstTitle.textContent;
+
+ var next_title;
+ while (next_title = titles.iterateNext()) {
+ if (next_title.textContent.match("RSS feed")) {
+
+ } else {
+ items[next_title.href] = next_title.textContent;
+ }
+ }
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ articles.push(i);
+ }
+ } else {
+ articles = [url];
+ }
+ Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
+ Zotero.wait();
+}
diff --git a/zotero-import/Google Scholar.js b/zotero-import/Google Scholar.js
new file mode 100644
index 0000000..b959ec5
--- /dev/null
+++ b/zotero-import/Google Scholar.js
@@ -0,0 +1,119 @@
+{
+ "translatorID":"57a00950-f0d1-4b41-b6ba-44ff0fc30289",
+ "translatorType":4,
+ "label":"Google Scholar",
+ "creator":"Simon Kornblith",
+ "target":"http://scholar\\.google\\.(?:com|com?\\.[a-z]{2}|[a-z]{2})/scholar",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-07-22 08:05:00"
+}
+
+function detectWeb(doc, url) {
+ return "multiple";
+}
+
+var haveEndNoteLinks;
+
+function scrape(doc) {
+ var nsResolver = doc.createNSResolver(doc.documentElement);
+
+ var items = new Array();
+ var itemGrabLinks = new Array();
+ var itemGrabLink;
+ var links = new Array();
+ var types = new Array();
+
+ var itemTypes = new Array();
+ var attachments = new Array();
+
+ var titles = doc.evaluate('//h3[@class="r"]', doc, nsResolver,
+ XPathResult.ANY_TYPE, null);
+ // changing .enw to .bib
+ var elmts = doc.evaluate('//a[contains(@href, ".bib")]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var title;
+ var i = 0;
+ while(title = titles.iterateNext()) {
+ itemGrabLinks[i] = elmts.iterateNext().href;
+ items[i] = title.textContent;
+ var link = doc.evaluate('.//a',
+ title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if (link){
+ links[i] = link.href;
+ }
+ i++;
+ }
+
+ if (!items.length) {
+ if(Zotero.done) Zotero.done(true);
+ return;
+ }
+ items = Zotero.selectItems(items);
+
+ if(!items) {
+ if(Zotero.done) Zotero.done(true);
+ return true;
+ }
+
+ var urls = new Array();
+ for(var i in items) {
+ // get url
+ urls.push(itemGrabLinks[i]);
+ if(links[i]) {
+ attachments.push([{title:"Google Scholar Linked Page", type:"text/html",
+ url:links[i]}]);
+ } else {
+ attachments.push([]);
+ }
+ }
+
+ var translator = Zotero.loadTranslator("import");
+ // changing this to bibtex per note below
+ translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
+ translator.setHandler("itemDone", function(obj, item) {
+ item.attachments = attachments.shift();
+ item.complete();
+ });
+ Zotero.Utilities.HTTP.doGet(urls, function(text) {
+ translator.setString(text);
+ translator.translate();
+ }, function() { Zotero.done() });
+}
+
+function doWeb(doc, url) {
+ var nsResolver = doc.createNSResolver(doc.documentElement);
+
+ //SR:Will use preference setting url instead of cookie to get EndNote links (works with ezproxy, doesn't overwrite other prefs)
+ //doc.cookie = "GSP=ID=deadbeefdeadbeef:IN=ebe89f7e83a8fe75+7e6cc990821af63:CF=3; domain=.scholar.google.com";
+
+ // determine if we need to reload the page
+
+ // first check for EndNote links
+ // changing to BibTeX since Google is dropping characters in enw and ris output
+
+ haveEndNoteLinks = doc.evaluate('//a[contains(@href, ".bib")]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if(!haveEndNoteLinks) {
+ // SR:Commenting out this bit as code for retrieving citations from "Related" links is unreliable and unnecessary
+ //// next check if there are docs with no related articles
+ //if(doc.evaluate(''//p[@class="g"][not(descendant-or-self::text() = "Related Articles")]'',
+ // doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+
+ // SR:Set preferences to show import links in English and do page reload
+ // (bit of a hack as it overwrites user prefs for language and import link type)
+ url = url.replace (/hl\=[^&]*&?/, "");
+ // changing scisf from 3 to 4 to move from .enw to .bib
+ url = url.replace("scholar?", "scholar_setprefs?hl=en&scis=yes&scisf=4&submit=Save+Preferences&");
+ haveEndNoteLinks = true;
+ Zotero.Utilities.loadDocument(url, scrape);
+ Zotero.wait();
+ return;
+ //}
+ }
+
+ scrape(doc, url);
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/IEEE Xplore.js b/zotero-import/IEEE Xplore.js
new file mode 100644
index 0000000..fa30f28
--- /dev/null
+++ b/zotero-import/IEEE Xplore.js
@@ -0,0 +1,128 @@
+{
+ "translatorID":"92d4ed84-8d0-4d3c-941f-d4b9124cfbb",
+ "translatorType":4,
+ "label":"IEEE Xplore",
+ "creator":"Simon Kornblith and Michael Berkowitz",
+ "target":"https?://[^/]*ieeexplore.ieee.org[^/]*/(?:[^\\?]+\\?(?:|.*&)arnumber=[0-9]+|search/(?:searchresult.jsp|selected.jsp))",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-05-05 07:15:00"
+}
+
+function detectWeb(doc, url) {
+ var articleRe = /[?&]ar(N|n)umber=([0-9]+)/;
+ var m = articleRe.exec(url);
+
+ if(m) {
+ return "journalArticle";
+ } else {
+ return "multiple";
+ }
+
+ return false;
+}
+
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var articleRe = /[?&]ar(N|n)umber=([0-9]+)/;
+ var m = articleRe.exec(url);
+
+ if(detectWeb(doc, url) == "multiple") {
+ // search page
+ var items = new Array();
+
+ var tableRows = doc.evaluate('//table[tbody/tr/td/div/strong]', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var tableRow;
+ while(tableRow = tableRows.iterateNext()) {
+ var link = doc.evaluate('.//a[@class="bodyCopy"]', tableRow, nsResolver, XPathResult.ANY_TYPE,
+ null).iterateNext().href;
+
+ var title = "";
+ var strongs = tableRow.getElementsByTagName("strong");
+ for each(var strong in strongs) {
+ if(strong.textContent) {
+ title += strong.textContent+" ";
+ }
+ }
+
+ items[link] = Zotero.Utilities.cleanString(title);
+ }
+
+ items = Zotero.selectItems(items);
+ if(!items) return true;
+
+ var urls = new Array();
+ for(var url in items) {
+ urls.push(url);
+ }
+ } else {
+ var urls = [url];
+ }
+ var arnumber = "";
+ for each(var url in urls) {
+ var m = articleRe.exec(url);
+ arnumber = "%3Carnumber%3E"+m[2]+"%3C%2Farnumber%3E";
+ var post = "dlSelect=cite_abs&fileFormate=ris&arnumber="+arnumber+"&x=5&y=10";
+ var isRe = /[?&]isnumber=([0-9]+)/;
+ var puRe = /[?&]punumber=([0-9]+)/;
+ Zotero.Utilities.HTTP.doPost("http://ieeexplore.ieee.org/xpls/citationAct", post, 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) {
+ var url = urls.shift();
+ var is = isRe.exec(url);
+ var pu = puRe.exec(url);
+ var arnumber = articleRe.exec(url);
+ if(item.notes[0] && item.notes[0].note) {
+ item.abstractNote = item.notes[0].note;
+ item.notes = new Array();
+ }
+ var dupes = new Array();
+ for (var i = 0 ; i < item.creators.length - 1 ; i++) {
+ if (item.creators[i].lastName + item.creators[i].firstName == item.creators[i+1].lastName + item.creators[i].firstName) {
+ dupes.push(i + 1);
+ }
+ }
+
+ for (var i in dupes) {
+ delete item.creators[dupes[i]];
+ }
+ var dupes = [];
+ for (var i = 0 ; i < item.creators.length ; i++) {
+ if (item.creators[i]) {
+ dupes.push(item.creators[i]);
+ }
+ }
+ item.creators = dupes;
+ var newurls = [url];
+ Zotero.Utilities.processDocuments(newurls, function(newDoc) {
+ var xpath = '//p[@class="bodyCopyBlackLargeSpaced"]';
+ var textElmt = newDoc.evaluate(xpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext();
+ if (textElmt) {
+ var m = textElmt.textContent.match(/Identifier:\s+([^\n]*)\n/);
+ if (m){
+ item.DOI = m[1];
+ }
+ }
+ var pdfpath = '//td[2][@class="bodyCopyBlackLarge"]/a[@class="bodyCopy"][substring(text(), 1, 3) = "PDF"]';
+ var pdfurlElmt = newDoc.evaluate(pdfpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext();
+ if (pdfurlElmt) {
+ pdfurlElmt.href = pdfurlElmt.href.replace("/stamp.jsp", "PDF/getPDF.jsp");
+ item.attachments = [{url:pdfurlElmt.href, title:"IEEE Xplore Full Text PDF", mimeType:"application/pdf"}];
+ }
+ item.complete();
+ }, function() {Zotero.done();});
+ });
+ translator.translate();
+ });
+ }
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/ISI Web of Knowledge.js b/zotero-import/ISI Web of Knowledge.js
new file mode 100644
index 0000000..eb48749
--- /dev/null
+++ b/zotero-import/ISI Web of Knowledge.js
@@ -0,0 +1,114 @@
+{
+ "translatorID":"594ebe3c-90a0-4830-83bc-9502825a6810",
+ "translatorType":4,
+ "label":"ISI Web of Knowledge",
+ "creator":"Michael Berkowitz",
+ "target":"(WOS_GeneralSearch|product=WOS)",
+ "minVersion":"1.0.0b4.r5",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-02-25 07:10:00"
+}
+
+function detectWeb(doc, url) {
+ if (doc.title.indexOf("Web of Science Results") != -1) {
+ return "multiple";
+ } else if (url.indexOf("full_record.do") != -1) {
+ return "journalArticle";
+ }
+}
+
+function doWeb(doc, url) {
+ var ids = new Array();
+ if (detectWeb(doc, url) == "multiple") {
+ var items = new Object;
+ var xpath = '//a[@class="smallV110"]';
+ var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
+ var next_title;
+ 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);
+ }
+ } else {
+ ids.push(url.match(/\?(.*)/)[1]);
+ }
+ var hostRegexp = new RegExp("^(https?://[^/]+)/");
+ var m = hostRegexp.exec(url);
+ var host = m[1];
+ for (var i in ids) {
+ ids[i] = host+"/full_record.do?" + 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=WOS&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=WOS&SID=' + nid + '&format=ref&fields=BibAbs&mark_id=WOS&count_new_items_marked=0&selectedIds=' + sid + '&qo_fields=bib&endnote.x=95&endnote.y=12&save_options=default';
+ Zotero.Utilities.HTTP.doPost('http://apps.isiknowledge.com/OutboundService.do', post, function() {
+ Zotero.Utilities.HTTP.doPost('http://pcs.isiknowledge.com/uml/uml_view.cgi', post2, function(text) {
+ 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") {
+ 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;
+ }
+ } 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;
+ }
+ }
+ }
+ item.attachments = [{url:item.url, title:"ISI Web of Knowledge Snapshot", mimeType:"text/html"}];
+ item.complete();
+ });
+ });
+ }, function() {Zotero.done();});
+} \ No newline at end of file
diff --git a/zotero-import/IngentaConnect.js b/zotero-import/IngentaConnect.js
new file mode 100644
index 0000000..deacdc5
--- /dev/null
+++ b/zotero-import/IngentaConnect.js
@@ -0,0 +1,71 @@
+{
+ "translatorID":"9e306d5d-193f-44ae-9dd6-ace63bf47689",
+ "translatorType":4,
+ "label":"IngentaConnect",
+ "creator":"Michael Berkowitz",
+ "target":"http://(www.)?ingentaconnect.com",
+ "minVersion":"1.0.0b3r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-01-08 08:19:07"
+}
+
+function detectWeb(doc, url) {
+ if (url.indexOf("article?") != -1 || url.indexOf("article;") != -1 || url.indexOf("/art") != -1) {
+ return "journalArticle";
+ } else if (url.indexOf("search?") !=-1 || url.indexOf("search;") != -1) {
+ return "multiple";
+ }
+}
+
+function doWeb(doc, url) {
+ var articles = new Array();
+ if (detectWeb(doc, url) == "multiple") {
+ var items = new Object();
+ var artlink = '//div//p/strong/a';
+ var links = doc.evaluate(artlink, doc, null, XPathResult.ANY_TYPE, null);
+ var next_link;
+ while (next_link = links.iterateNext()) {
+ items[next_link.href] = next_link.textContent;
+ }
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ articles.push(i);
+ }
+ } else {
+ articles = [url];
+ }
+ Zotero.debug(articles);
+ Zotero.Utilities.processDocuments(articles, function(newDoc) {
+ var risurl = newDoc.evaluate('//div[@id="export-formats"]/ul/li/a[@title="EndNote Export"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
+ if (newDoc.evaluate('//div[@id="abstract"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) var abs = Zotero.Utilities.trimInternal(newDoc.evaluate('//div[@id="abstract"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10);
+ if (newDoc.evaluate('//div[@id="info"]/p[1]/a', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var keywords = newDoc.evaluate('//div[@id="info"]/p[1]/a', newDoc, null, XPathResult.ANY_TYPE, null);
+ var key;
+ var keys = new Array();
+ while (key = keywords.iterateNext()) {
+ keys.push(Zotero.Utilities.capitalizeTitle(key.textContent));
+ }
+ }
+ Zotero.Utilities.HTTP.doGet(risurl, function(text) {
+ text = text.replace(/(PY\s+\-\s+)\/+/, "$1");
+ text = text.replace(/ER\s\s\-/, "") + "\nER - ";
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ translator.setString(text);
+ translator.setHandler("itemDone", function(obj, item) {
+ if (abs) item.abstractNote = abs;
+ item.attachments = [{url:item.url, title:"IngentaConnect Snapshot", mimeType:"text/html"}];
+ if (keys) item.tags = keys;
+ if (item.DOI) {
+ if (item.DOI.match(/doi/)) {
+ item.DOI = item.DOI.substr(4);
+ }
+ }
+ item.complete();
+ });
+ translator.translate();
+ });
+ }, function() {Zotero.done();});
+} \ No newline at end of file
diff --git a/zotero-import/Nature.js b/zotero-import/Nature.js
new file mode 100644
index 0000000..f748f5a
--- /dev/null
+++ b/zotero-import/Nature.js
@@ -0,0 +1,107 @@
+{
+ "translatorID":"6614a99-479a-4524-8e30-686e4d66663e",
+ "translatorType":4,
+ "label":"Nature",
+ "creator":"Simon Kornblith",
+ "target":"https?://www\\.nature\\.com[^/]*/(?:[^/]+/journal/v[^/]+/n[^/]+/(?:(?:full|abs)/.+\\.html|index.html)|search/executeSearch)",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2008-03-26 03:00:00"
+}
+
+function detectWeb(doc, url) {
+ var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+\.)html/;
+
+ if (articleRe.test(url)) {
+ if (doc.evaluate('//a[contains(@href, ".ris")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "journalArticle";
+ } else { return false; }
+ } else {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var tableRows = doc.evaluate('//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var fulltextLinks = doc.evaluate('//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ if(tableRows.iterateNext() && fulltextLinks.iterateNext()) {
+ return "multiple";
+ }
+ }
+
+ return false;
+}
+
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+)\.html/;
+ var m = articleRe.exec(url);
+
+ if(!m) {
+ // search page
+ var items = new Array();
+
+ var tableRows = doc.evaluate('//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var fulltextLinks = doc.evaluate('//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]',
+ doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var tableRow, fulltextLink;
+ while((tableRow = tableRows.iterateNext()) && (fulltextLink = fulltextLinks.iterateNext())) {
+ items[fulltextLink.href] = Zotero.Utilities.cleanString(tableRow.textContent);
+ }
+
+ items = Zotero.selectItems(items);
+ if(!items) return true;
+
+ var urls = new Array();
+ for(var url in items) {
+ urls.push(url);
+ }
+ } else {
+ var urls = [url];
+ }
+
+ var RIS = new Array();
+ var regexps = new Array();
+
+ for each(var item in urls) {
+ var m = articleRe.exec(item);
+ if(m[3][m[3].length-2] == "_") {
+ m[3] = m[3].substr(0, m[3].length-2);
+ }
+ RIS.push(m[1]+"ris"+m[3]+".ris");
+ regexps.push(m);
+ }
+
+ Zotero.Utilities.HTTP.doGet(RIS, function(text) {
+ var url = urls.shift();
+ // 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) {
+ var m = regexps.shift();
+ item.attachments = [
+ {url:m[0], title:"Nature Snapshot", mimeType:"text/html"},
+ {url:m[1]+"pdf"+m[3]+".pdf", title:"Nature Full Text PDF", mimeType:"application/pdf"}
+ ]
+
+ item.notes = new Array();
+ if (item.date) item.date = item.date.replace("print ", "");
+
+ item.complete();
+ });
+ translator.translate();
+ }, function() { Zotero.done(); });
+
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/PLoS Biology and Medicine.js b/zotero-import/PLoS Biology and Medicine.js
new file mode 100644
index 0000000..10ff6bd
--- /dev/null
+++ b/zotero-import/PLoS Biology and Medicine.js
@@ -0,0 +1,87 @@
+{
+ "translatorID":"bdae838b-3a58-461f-9e8a-142ed9de61dc",
+ "translatorType":4,
+ "label":"PLoS Biology and Medicine",
+ "creator":"Michael Berkowitz",
+ "target":"http://[^.]+\\.plosjournals\\.org/",
+ "minVersion":"1.0.0b4.r5",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-01-08 08:19:07"
+}
+
+function detectWeb(doc, url) {
+ if (doc.evaluate('//div[@class="search"][@id="browseResults"]/ul/li/span/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
+ doc.evaluate('//div[@id="toclist"]/dl/dt/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "multiple";
+ } else if (url.indexOf("get-document") != -1) {
+ return "journalArticle";
+ }
+}
+
+function unescape(text) {
+ var specialreg=new RegExp("&#[^;]+;");
+ var specials=specialreg.exec(text);
+ while(specials) {
+ text=text.replace(specials[0], String.fromCharCode(parseInt(specials[0].substring(2, specials[0].length-1), 10)));
+ specials=specialreg.exec(text);
+ }
+ return text;
+}
+
+function doWeb(doc, url) {
+ var URLs = new Array();
+ var items = new Object();
+ if (detectWeb(doc, url) == "multiple") {
+ if (doc.evaluate('//div[@class="search"][@id="browseResults"]/ul/li/span/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var xpath = '//div[@class="search"][@id="browseResults"]/ul/li/span/a';
+ } else if (doc.evaluate('//div[@id="toclist"]/dl/dt/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var xpath = '//div[@id="toclist"]/dl/dt/a';
+ }
+ var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
+ var next_article = articles.iterateNext();
+ while (next_article) {
+ items[next_article.href] = Zotero.Utilities.cleanString(next_article.textContent);
+ next_article = articles.iterateNext();
+ }
+ items = Zotero.selectItems(items);
+
+ if (!items) {
+ return true;
+ }
+
+ for (var i in items) {
+ URLs.push(i);
+ }
+ } else {
+ URLs.push(url);
+ }
+
+
+ Zotero.Utilities.processDocuments(URLs, function(doc, url) {
+ var bits = doc.location.href.match(/(^.*\?request=).*(doi=.*$)/);
+ var RISurl = bits[1] + 'download-citation&t=refman&' + bits[2];
+ Zotero.Utilities.HTTP.doGet(RISurl, function(text) {
+ var trans=Zotero.loadTranslator("import");
+ trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ trans.setString(text);
+ trans.setHandler("itemDone", function(obj, newItem) {
+ var urlstring= bits[1]+ 'get-pdf&' +bits[2].replace("doi=", "file=").replace("/", "_").replace("%2F", "_") + '-S.pdf';
+ newItem.attachments.push({url:urlstring, title:newItem.title, mimeType:"application/pdf"});
+
+ var urlRE = /http:\/\/dx.doi.org\/(.*)$/;
+ if (newItem.url) {
+ newItem.DOI = newItem.url.match(urlRE)[1].replace("%2F", "/");
+ }
+
+ newItem.complete();
+ });
+ trans.translate();
+ Zotero.done();
+ });
+ Zotero.wait();
+ }, function() {Zotero.done();});
+
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/PLoS Journals.js b/zotero-import/PLoS Journals.js
new file mode 100644
index 0000000..2f1d68d
--- /dev/null
+++ b/zotero-import/PLoS Journals.js
@@ -0,0 +1,83 @@
+{
+ "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"
+}
+
+function detectWeb(doc, url) {
+ if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1 || url.indexOf("browseIssue.action") != -1) {
+ return "multiple";
+ } else if (url.indexOf("article/info") != -1) {
+ return "journalArticle";
+ }
+}
+
+
+function getSelectedItems(doc, articleRegEx) {
+ var items = new Object();
+ var texts = new Array();
+ 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);
+}
+
+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);
+ } else if (url.indexOf("browseIssue.action") != -1) {
+ var articlex = '//div[@class="article"]/h3/a';
+ var texts = getSelectedItems(doc, articlex);
+ } else {
+ var texts = new Array(url);
+ }
+
+ var risLinks = new Array();
+ for (var i in texts) {
+ texts[i]=texts[i].replace(/;jsessionid[^;]+/, "");//Strip sessionID string
+ var risLink = texts[i].replace("info", "getRisCitation.action?articleURI=info");
+ risLinks.push(risLink);
+ }
+
+ Zotero.Utilities.HTTP.doGet(risLinks, function(text) {
+ var risLink = texts.shift();
+ var pdfURL = risLink.replace("info", "fetchObjectAttachment.action?uri=info") + '&representation=PDF';
+ var doi = risLink.match(/doi(\/|%2F)(.*)$/)[2];
+ text = text.replace(text.match(/(ER[^\n]*)([^\0]*)/)[2],"");//Remove stray M3-tag at the end of the RIS record
+ text = text.replace("%2F","/");//Replace %2F characters by forward slashes in url
+ doi = doi.replace("%2F","/");//Replace %2F characters by forward slashes in doi
+
+ // grab the UR link for a snapshot then blow it away
+ var snapshot = text.match(/UR\s+\-\s+(.*)/)[1];
+ text = text.replace(/UR\s+\-(.*)/, "");
+
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ translator.setString(text);
+ translator.setHandler("itemDone", function(obj, item) {
+ item.url = snapshot;
+ item.attachments.push({url:pdfURL, title:"PLoS Full Text PDF", mimeType:"application/pdf"});
+ item.attachments.push({url:snapshot, title:"PLoS Snapshot", mimeType:"text/html", snapshot:true});
+ item.DOI = doi;
+ item.repository = item.publicationTitle;
+ item.complete();
+ });
+ translator.translate();
+ }, function() {Zotero.done();});
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/Project Gutenberg.js b/zotero-import/Project Gutenberg.js
new file mode 100644
index 0000000..c682901
--- /dev/null
+++ b/zotero-import/Project Gutenberg.js
@@ -0,0 +1,175 @@
+{
+ "translatorID":"d770e7d2-106c-4396-8c32-b35cdc46376c",
+ "translatorType":4,
+ "label":"Project Gutenberg",
+ "creator":"Adam Crymble",
+ "target":"http://www.gutenberg.org",
+ "minVersion":"1.0.0b4.r5",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-07-07 00:15:00"
+}
+
+function detectWeb(doc, url) {
+ if (doc.location.href.match("etext")||doc.location.href.match("ebooks")) {
+ return "book";
+ } else if (doc.location.href.match("catalog")) {
+ return "multiple";
+ }
+}
+
+//Project Gutenberg translator. Code by Adam Crymble.
+
+function associateData (newItem, dataTags, field, zoteroField) {
+ if (dataTags[field]) {
+ newItem[zoteroField] = dataTags[field];
+ }
+}
+
+function scrape(doc, url) {
+
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var dataTags = new Object();
+ var odd = "yes";
+ var creatorType = new Array();
+ var creatorField = new Array();
+ var creatorContent = new Array();
+
+ var newItem = new Zotero.Item("book");
+
+ var headingsEven = doc.evaluate('//tr[@class="oddrow"]/th', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var headingsEvenCount = doc.evaluate('count(//tr[@class="oddrow"]/th)', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var headingsOdd = doc.evaluate('//tr[@class="evenrow"]/th', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var headingsOddCount = doc.evaluate('count(//tr[@class="evenrow"]/th)', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var content = doc.evaluate('//div[@class="pgdbdata"]/table/tbody//td', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ for (var i = 0; i < headingsEvenCount.numberValue + headingsOddCount.numberValue; i++) {
+ if (odd == "yes") {
+ fieldTitle = headingsOdd.iterateNext().textContent.replace(/\s+/g, '');
+ odd = "no";
+ } else {
+ fieldTitle = headingsEven.iterateNext().textContent.replace(/\s+/g, '');
+ odd = "yes";
+ }
+ dataTags[fieldTitle] = Zotero.Utilities.cleanTags(content.iterateNext().textContent.replace(/^\s*|\s*$/g, ''));
+
+ if (fieldTitle == "Creator") {
+
+ creatorType.push("author");
+ creatorField.push("Creator");
+ creatorContent.push(dataTags[fieldTitle]);
+
+ } else if (fieldTitle == "Illustrator") {
+
+ creatorType.push("illustrator");
+ creatorField.push("Illustrator");
+ creatorContent.push(dataTags[fieldTitle]);
+
+ }else if (fieldTitle == "Translator") {
+
+ creatorType.push("translator");
+ creatorField.push("Translator");
+ creatorContent.push(dataTags[fieldTitle]);
+
+ } else if (fieldTitle == "Editor") {
+
+ creatorType.push("editor");
+ creatorField.push("Editor");
+ creatorContent.push(dataTags[fieldTitle]);
+
+ } else if (fieldTitle == "Commentator") {
+
+ creatorType.push("commentator");
+ creatorField.push("Commentator");
+ creatorContent.push(dataTags[fieldTitle]);
+
+ } else if (fieldTitle == "Contributor") {
+
+ creatorType.push("contributor");
+ creatorField.push("Contributor");
+ creatorContent.push(dataTags[fieldTitle]);
+ }
+ if (fieldTitle == "Imprint") {
+ var place = dataTags["Imprint"].split(":");
+ newItem.place = place[0];
+ Zotero.debug(place);
+ }
+
+ if (fieldTitle == "Subject") {
+ newItem.tags[i] = dataTags["Subject"];
+ }
+ }
+
+ for (var i = 0; i < creatorType.length; i++) {
+ if (creatorContent[i].match(", ")) {
+
+ var author = creatorContent[i].split(", ");
+ var author = author[1] + " " + author[0];
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(author, creatorType[i]));
+ } else {
+
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(creatorContent[i], creatorType[i]));
+ }
+ }
+
+
+ if (dataTags["EText-No."]) {
+ newItem.callNumber = "EText-No. " + dataTags["EText-No."];
+ }
+
+ if (dataTags["ReleaseDate"]) {
+ newItem.date = "Release Date " + dataTags["ReleaseDate"];
+ }
+
+ if (dataTags["LoCClass"]) {
+ newItem.extra = "LoC Class " + dataTags["LoCClass"];
+ }
+
+ associateData (newItem, dataTags, "Title", "title");
+ associateData (newItem, dataTags, "Language", "language");
+ associateData (newItem, dataTags, "CopyrightStatus", "rights");
+
+ newItem.url = doc.location.href;
+
+ newItem.complete();
+}
+
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var articles = new Array();
+
+ if (detectWeb(doc, url) == "multiple") {
+ var items = new Object();
+
+ var allLinks = doc.evaluate('//td/a', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var xPathCount = doc.evaluate('count(//td/a)', doc, nsResolver, XPathResult.ANY_TYPE, null);
+
+ var next_title;
+ for (var i = 0; i < xPathCount.numberValue; i++) {
+ next_title = allLinks.iterateNext();
+ if (next_title.href.match("etext")) {
+ items[next_title.href] = next_title.textContent;
+ }
+ }
+
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ articles.push(i);
+ }
+ } else {
+ articles = [url];
+ }
+ Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/PubMed Central.js b/zotero-import/PubMed Central.js
new file mode 100644
index 0000000..9c75fe9
--- /dev/null
+++ b/zotero-import/PubMed Central.js
@@ -0,0 +1,92 @@
+{
+ "translatorID":"27ee5b2c-2a5a-4afc-a0aa-d386642d4eed",
+ "translatorType":4,
+ "label":"PubMed Central",
+ "creator":"Michael Berkowitz",
+ "target":"http://[^/]*.nih.gov/",
+ "minVersion":"1.0.0b4.r5",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2008-08-06 17:00:00"
+}
+
+function detectWeb(doc, url) {
+ if (doc.evaluate('//table[@id="ResultPanel"]//td[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "multiple";
+ } else if (url.indexOf("articlerender") != -1) {
+ return "journalArticle";
+ }
+}
+
+function doWeb(doc, url) {
+ var tagMap = {journal_title:"publicationTitle",
+ title:"title",
+ date:"date",
+ issue:"issue",
+ volume:"volume",
+ doi:"DOI",
+ fulltext_html_url:"url"
+ }
+ var URIs = new Array();
+ var items = new Object();
+ if (doc.title.indexOf("PMC Results") != -1) {
+ var titlex = '//div[@class="toc-entry"]/div/div[@class="toc-title"]';
+ var linkx = '//div[@class="toc-entry"]/div/a[@class="toc-link"][1]';
+
+ var titles = doc.evaluate(titlex, doc, null, XPathResult.ANY_TYPE, null);
+ var next_title = titles.iterateNext();
+ var links = doc.evaluate(linkx, doc, null, XPathResult.ANY_TYPE, null);
+ var next_link = links.iterateNext();
+ while (next_title && next_link) {
+ items[next_link.href] = next_title.textContent;
+ next_title = titles.iterateNext();
+ next_link = links.iterateNext();
+ }
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ URIs.push(i);
+ }
+ } else {
+ URIs.push(url);
+ }
+ for each (var link in URIs) {
+ Zotero.Utilities.HTTP.doGet(link, function(text) {
+ var tags = new Object();
+ var meta = text.match(/<meta[^>]*>/gi);
+ for (var i in meta) {
+ var item = meta[i].match(/=\"([^"]*)\"/g);
+ if (item[0].substring(2, 10) == 'citation') {
+ tags[item[0].substring(11, item[0].length - 1)] = item[1].substring(2, item[1].length - 1);
+ }
+ }
+ var newItem = new Zotero.Item("journalArticle");
+ for (var tag in tagMap) {
+ newItem[tagMap[tag]] = Zotero.Utilities.unescapeHTML(tags[tag]);
+ }
+ for (var i in meta) {
+ if (meta[i].match(/DC.Contributor/)) {
+ newItem.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.unescapeHTML(meta[i].match(/content=\"([^"]*)\">/)[1]), "author"));
+ }
+ }
+ newItem.attachments.push({url:tags["fulltext_html_url"], title:"PubMed Central Snapshot", mimeType:"text/html"});
+ if (tags["pdf_url"]) {
+ newItem.attachments.push({url:tags["pdf_url"], title:"PubMed Central Full Text PDF", mimeType:"application/pdf"});
+ }
+ newItem.url = tags["fulltext_html_url"];
+ if (!newItem.url) newItem.url = tags["abstract_html_url"];
+ newItem.extra = text.match(/PMC\d+/)[0];
+ newItem.journalAbbreviation = text.match(/span class=\"citation-abbreviation\">([^<]+)</)[1];
+ newItem.pages = text.match(/span class=\"citation-flpages\">([^<]+)</)[1].replace(/[\.:\s]/g, "");
+
+ if (text.match(/Abstract<\/div>([^<]+)</)) {
+ var abstract = text.match(/Abstract<\/div>([^<]+)</)[1];
+ } else if (text.match(/\"section-content\"><!\-\-article\-meta\-\->([^<]+)/)) {
+ var abstract = text.match(/\"section-content\"><!\-\-article\-meta\-\->([^<]+)/)[1];
+ }
+ if (abstract) newItem.abstractNote = abstract;
+ newItem.complete();
+ });
+ }
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/RSC Publishing.js b/zotero-import/RSC Publishing.js
new file mode 100644
index 0000000..2a86ff7
--- /dev/null
+++ b/zotero-import/RSC Publishing.js
@@ -0,0 +1,438 @@
+{
+ "translatorID":"1c34744d-690f-4cac-b31b-b7f0c90ac14d",
+ "translatorType":4,
+ "label":"RSC Publishing",
+ "creator":"Ramesh Srigiriraju",
+ "target":"http://(:?www\\.|google\\.)?rsc\\.org/",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2007-12-21 16:00:00"
+}
+
+function detectWeb(doc, url) {
+ var namespace=doc.documentElement.namespaceURI;
+ var nsResolver=namespace?function(prefix) {
+ return (prefix=="x")?namespace:null;
+ }:null;
+ var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
+ if(journalreg.test(url)) {
+ var browspath='//div/p/a[text()="Use advanced search"]';
+ if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "multiple";
+ var searchpath='//a[text()="Back to Search Form"]';
+ if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "multiple";
+ var singpath='//ul/li/a[text()="HTML Article" or text()="PDF"]';
+ if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "journalArticle";
+ }
+ var magpath='//div/h3[text()="Link to journal article"]';
+ if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "magazineArticle";
+ var magbrows='//div/h4[@class="newstitle"]/a';
+ if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "multiple";
+ var magsearch='//p[@class="more"]/strong/a[text()="Search RSC journals"]';
+ if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "multiple";
+ var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
+ if(bookreg.test(url)) {
+ var pagepath='//title/text()';
+ var page=doc.evaluate(pagepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
+ ||(page=="Book Series"))
+ return "multiple";
+ var chappath='//dt/img[@alt="Chapter"]';
+ var singpath='//h3[text()="Table of Contents"]';
+ if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "bookSection";
+ else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "book";
+ }
+ var searchpath='//div/p[@class="title"][text()="Search Results"]';
+ if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ return "multiple";
+}
+
+function doChap(newItem, chaptext) {
+ var chapdata=chaptext.split("<br>");
+ for(var pos=chapdata.length-2; pos>=0; pos--) {
+ chapdata[pos]=Zotero.Utilities.cleanTags(chapdata[pos]);
+ if(chapdata[pos].indexOf("Editors")!=-1) {
+ var editors=chapdata[pos].split(",");
+ for(var i=0; i<=editors.length-1; i++) {
+ editors[i]=Zotero.Utilities.cleanString(editors[i]);
+ var names=editors[i].split(" ");
+ var creators=new Array();
+ if(i==0)
+ creators.firstName=names[1];
+ else
+ creators.firstName=names[0];
+ creators.lastName=names[names.length-1];
+ creators.creatorType="editor";
+ newItem.creators.push(creators);
+ }
+ }
+ if(chapdata[pos].indexOf("Authors")!=-1) {
+ var authors=chapdata[pos].split(",");
+ for(var i=0; i<=authors.length-1; i++) {
+ authors[i]=Zotero.Utilities.cleanString(authors[i]);
+ var names=authors[i].split(" ");
+ var creators=new Array();
+ if(i==0)
+ creators.firstName=names[1];
+ else
+ creators.firstName=names[0];
+ creators.lastName=names[names.length-1];
+ creators.creatorType="editor";
+ newItem.creators.push(creators);
+ }
+ }
+ if(chapdata[pos].indexOf("DOI")!=-1)
+ newItem.itemID=chapdata[pos].substring(chapdata[pos].indexOf("1"));
+ if(chapdata[pos].indexOf("Book")!=-1)
+ newItem.bookTitle=chapdata[pos].substring(chapdata[pos].indexOf(" ")+1);
+ }
+}
+function doBook(newItem, bookdata) {
+ var fields=bookdata.split("<br>");
+ for(var pos=fields.length-2; pos>=0; pos--) {
+ fields[pos]=Zotero.Utilities.cleanTags(fields[pos]);
+ if(fields[pos].indexOf("Volume")!=-1) {
+ var i=fields[pos].lastIndexOf(";");
+ var vol;
+ if(i!=-1)
+ vol=fields[pos].substring(i+1);
+ else
+ vol=fields[pos].substring(fields[pos].lastIndexOf(" "));
+ newItem.volume=Zotero.Utilities.cleanString(vol);
+ }
+ if(fields[pos].indexOf("Edition")!=-1) {
+ var i=fields[pos].lastIndexOf(";");
+ if(i!=-1)
+ ed=fields[pos].substring(i+1);
+ else
+ ed=fields[pos].substring(fields[pos].lastIndexOf(" "));
+ newItem.edition=Zotero.Utilities.cleanString(ed);
+ }
+ if(fields[pos].indexOf("Copyright")!=-1) {
+ var i=fields[pos].lastIndexOf(";");
+ var date;
+ if(i!=-1)
+ date=fields[pos].substring(i+1);
+ else
+ date=fields[pos].substring(fields[pos].indexOf(":")+2);
+ newItem.date=Zotero.Utilities.cleanString(date);
+ }
+ if(fields[pos].indexOf("ISBN")!=-1&&fields[pos].indexOf("print")!=-1) {
+ var i=fields[pos].lastIndexOf(";");
+ var isbn;
+ if(i!=-1)
+ isbn=fields[pos].substring(i+1);
+ else
+ isbn=fields[pos].substring(fields[pos].indexOf(":")+2);
+ newItem.ISBN=Zotero.Utilities.cleanString(isbn);
+ }
+ if(fields[pos].indexOf("Author")!=-1||fields[pos].indexOf("Editor")!=-1) {
+ var authors=fields[pos].split(",");
+ for(var i=0; i<=authors.length-1; i++) {
+ authors[i]=Zotero.Utilities.cleanString(authors[i]);
+ var names=authors[i].split(" ");
+ var creators=new Array();
+ creators.firstName=names[0];
+ creators.lastName=names[names.length-2];
+ if(names[names.length-1]=="(Editor)")
+ creators.creatorType="editor";
+ if(names[names.length-1]=="(Author)")
+ creators.creatorType="author";
+ newItem.creators.push(creators);
+ }
+ }
+ if(fields[pos].indexOf("DOI:")!=-1)
+ newItem.itemID=fields[pos].substring(fields[pos].indexOf("1"));
+ }
+}
+function doWeb(doc, url) {
+ var namespace=doc.documentElement.namespaceURI;
+ var nsResolver=namespace?function(prefix) {
+ return (prefix=="x")?namespace:null;
+ }:null;
+ var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
+ if(journalreg.test(url)) {
+ var browspath='//div/p/a[text()="Use advanced search"]';
+ if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var doipath='//p[strong/text()="DOI:"]/a/text()';
+ var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var titlpath='//p/strong/a';
+ var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var items=new Array();
+ var doi;
+ while(doi=dois.iterateNext())
+ items[doi.nodeValue]=Zotero.Utilities.cleanString(titles.iterateNext().textContent);
+ items=Zotero.selectItems(items);
+ var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
+ for(var codes in items) {
+ var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
+ string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
+ Zotero.Utilities.HTTP.doGet(string, function(text) {
+ var trans=Zotero.loadTranslator("import");
+ trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
+ text = text.replace("Y1 - ", "Y1 - ");
+ trans.setString(text);
+ trans.translate();
+ Zotero.done();
+ });
+ }
+ }
+ var searchpath='//a[text()="Back to Search Form"]';
+ if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var doipath='//p[strong/text()="DOI:"]/a/text()';
+ var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var titlpath='//form/div/h5';
+ var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var title;
+ var items=new Array();
+ while(title=titles.iterateNext())
+ items[dois.iterateNext().nodeValue]=title.textContent;
+ items=Zotero.selectItems(items);
+ var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
+ for(var codes in items) {
+ var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
+ string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
+ Zotero.Utilities.HTTP.doGet(string, function(text) {
+ var trans=Zotero.loadTranslator("import");
+ trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
+ text = text.replace("Y1 - ", "Y1 - ");
+ trans.setString(text);
+ trans.translate();
+ Zotero.done();
+ });
+ }
+ }
+ var singpath='//ul/li/a[text()="HTML Article" or text()="PDF"]';
+ if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var doipath='//div/p[strong/text()="DOI:"]';
+ var text=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ var doi=text.substring(text.indexOf("/")+1);
+ var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="+doi;
+ string+="&type=refman";
+ Zotero.Utilities.HTTP.doGet(string, function(text) {
+ var trans=Zotero.loadTranslator("import");
+ trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
+ text = text.replace("Y1 - ", "Y1 - ");
+ trans.setString(text);
+ trans.setHandler("itemDone", function(obj, newItem) {
+ var url2=newItem.url;
+ var stringy;
+ var archpath='//div[h3/text()="Journals archive purchaser access"]';
+ if(doc.evaluate(archpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var stringy="http://www.rsc.org/ejarchive/";
+ stringy+=url2.substring(url2.lastIndexOf("/")+1)+".pdf";
+ newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
+ }
+ else {
+ var stringy="http://www.rsc.org/delivery/_ArticleLinking/DisplayArticleForFree.cfm?doi=";
+ stringy+=url2.substring(url2.lastIndexOf("/")+1);
+ newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
+ }
+ newItem.complete();
+ });
+ trans.translate();
+ Zotero.done();
+ });
+ }
+ }
+ var magpath='//div/h3[text()="Link to journal article"]';
+ if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var newItem=new Zotero.Item("magazineArticle");
+ var titlpath='//div/h2/div[@class="header"]/text()';
+ newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ var authpath='//em/text()';
+ var auth=doc.evaluate(authpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ var authors=auth.split(",");
+ if(newItem.title.indexOf("Interview")==-1)
+ for(var i=0; i<=authors.length-1; i++) {
+ authors[i]=Zotero.Utilities.cleanString(authors[i]);
+ var names=authors[i].split(" ");
+ var creator=new Array();
+ creator.firstName=names[0];
+ creator.lastName=names[names.length-1];
+ newItem.creators.push(creator);
+ }
+ var textpath='//div[@id="content"]//text()';
+ var text=doc.evaluate(textpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var temp;
+ while(temp=text.iterateNext())
+ if(temp.nodeValue==newItem.title) {
+ newItem.date=text.iterateNext().nodeValue;
+ break;
+ }
+ var datapath= '//div[@id="breadcrumbs"]/ul/li/a/text()';
+ var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var prev;
+ while(temp=data.iterateNext()) {
+ if(temp.nodeValue.indexOf("Chemi")!=-1)
+ newItem.publication=temp.nodeValue;
+ prev=temp;
+ }
+ newItem.issue=prev.nodeValue;
+ newItem.complete();
+ }
+ var magbrows='//div/h4[@class="newstitle"]/a';
+ if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var titlpath='//h4[@class="newstitle"]/a';
+ var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var title;
+ var items=new Array();
+ while(title=titles.iterateNext())
+ items[title.href]=title.textContent;
+ items=Zotero.selectItems(items);
+ for(var linx in items) {
+ var newItem=new Zotero.Item("magazineArticle");
+ newItem.url=linx;
+ newItem.title=items[linx];
+ var datepath='//div[h4/a/text()="'+items[linx]+'"]/h4[@class="datetext"]/text()';
+ newItem.date=doc.evaluate(datepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ var datapath= '//div[@id="breadcrumbs"]/ul/li/a/text()';
+ var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var prev;
+ var temp;
+ while(temp=data.iterateNext()) {
+ if(temp.nodeValue.indexOf("Chemi")!=-1)
+ newItem.publication=temp.nodeValue;
+ prev=temp;
+ }
+ if(prev.nodeValue!=newItem.publication)
+ newItem.issue=prev.nodeValue;
+ newItem.complete();
+ }
+ }
+ var magsearch='//p[@class="more"]/strong/a[text()="Search RSC journals"]';
+ if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var titlpath='//div/p/a';
+ var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ titlpath='//blockquote/p/a[span/@class="l"]';
+ var titles2=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null)
+ var title;
+ var items=new Array();
+ while(title=titles.iterateNext())
+ items[title.href]=title.textContent;
+ while(title=titles2.iterateNext())
+ items[title.href]=title.textContent;
+ items=Zotero.selectItems(items);
+ for(var linx in items) {
+ var newItem=new Zotero.Item("magazineArticle");
+ newItem.url=linx;
+ newItem.title=items[linx];
+ newItem.complete();
+ }
+ }
+ var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
+ if(bookreg.test(url)) {
+ var browspath='//title/text()';
+ var page=doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
+ ||(page=="Book Series")) {
+ var doipath='//dd/p/a/text()';
+ var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var items=new Array();
+ var title;
+ while(title=dois.iterateNext()) {
+ var doi=dois.iterateNext().nodeValue;
+ items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
+ }
+ items=Zotero.selectItems(items);
+ for(var codes in items) {
+ var newItem=new Zotero.Item("book");
+ newItem.itemID=codes;
+ newItem.title=items[codes];
+ var itempath='//dd/p[contains(a[2]/text(), "'+codes+'")]';
+ var itempath2='//dd/p[contains(a/text(), "'+codes+'")]';
+ var data;
+ if(data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ data=data.innerHTML;
+ else if(data=doc.evaluate(itempath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
+ data=data.innerHTML;
+ doBook(newItem, data);
+ newItem.complete();
+ }
+ }
+ var chappath='//dt/img[@alt="Chapter"]';
+ var singpath='//h3[text()="Table of Contents"]';
+ if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var newItem=new Zotero.Item("bookSection");
+ var titlpath='//span/h3/text()';
+ var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ newItem.title=titles.iterateNext().nodeValue;
+ newItem.bookTitle=titles.iterateNext().nodeValue;
+ var datapath='//dd/p';
+ var entries=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var chaptext=entries.iterateNext().innerHTML;
+ doChap(newItem, chaptext);
+ var bookdata=entries.iterateNext().innerHTML;
+ doBook(newItem, bookdata);
+ var linkpath='//td[1][@class="td1"]/a[1]';
+ var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var pdflink;
+ while(pdflink=linx.iterateNext())
+ newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
+ newItem.complete();
+ }
+ else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var newItem=new Zotero.Item("book");
+ var itempath='//dd/p';
+ var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
+ doBook(newItem, data);
+ var titlpath='//div/h2/text()';
+ newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ var linkpath='//td[1][@class="td1"]/a[1]';
+ var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var pdflink;
+ while(pdflink=linx.iterateNext())
+ newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
+ newItem.complete();
+ }
+ }
+ var searchpath='//div/p[@class="title"][text()="Search Results"]';
+ if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var doipath='//dd/p/a/text()';
+ var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var title;
+ var items=new Array();
+ while(title=dois.iterateNext()) {
+ var doi=dois.iterateNext().nodeValue;
+ items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
+ }
+ items=Zotero.selectItems(items);
+ for(var codes in items) {
+ var itempath='//dd/p[contains(a/text(), "'+codes+'")]';
+ var newpath='//dd[contains(p[2]/a/text(), "'+codes+'")]/p[1]/strong/text()';
+ var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
+ if(data.indexOf("Book:")!=-1) {
+ var newItem=new Zotero.Item("bookSection");
+ newItem.itemID=codes;
+ newItem.title=items[codes];
+ doChap(newItem, data);
+ newItem.complete();
+ }
+ else {
+ var newItem=new Zotero.Item("book");
+ var newdata=doc.evaluate(newpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
+ if(newdata.indexOf("Volume")!=-1)
+ newItem.volume=newdata.substring(newdata.lastIndexOf(" ")+1);
+ else
+ newItem.series=newdata;
+ newItem.itemID=codes;
+ newItem.title=items[codes];
+ doBook(newItem, data);
+ newItem.complete();
+ }
+ }
+ }
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/ScienceDirect.js b/zotero-import/ScienceDirect.js
new file mode 100644
index 0000000..f975b86
--- /dev/null
+++ b/zotero-import/ScienceDirect.js
@@ -0,0 +1,310 @@
+{
+ "translatorID":"b6d0a7a-d076-48ae-b2f0-b6de28b194e",
+ "translatorType":4,
+ "label":"ScienceDirect",
+ "creator":"Michael Berkowitz",
+ "target":"https?://[^/]*science-?direct\\.com[^/]*/science(\\/article)?(\\?(?:.+\\&|)ob=(?:ArticleURL|ArticleListURL|PublicationURL))?",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":null,
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-07-17 05:30:00"
+}
+
+function detectWeb(doc, url) {
+ if ((url.indexOf("_ob=DownloadURL") != -1) || doc.title == "ScienceDirect Login") {
+ return false;
+ }
+ if((!url.match("pdf") && url.indexOf("_ob=ArticleURL") == -1 && url.indexOf("/article/") == -1) || url.indexOf("/journal/") != -1) {
+ return "multiple";
+ } else if (!url.match("pdf")) {
+ return "journalArticle";
+ }
+}
+
+
+
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ if (doc.evaluate('//*[contains(@src, "exportarticle_a.gif")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ var articles = new Array();
+ if(detectWeb(doc, url) == "multiple") {
+ //search page
+ var items = new Object();
+ var xpath;
+ if (url.indexOf("_ob=PublicationURL") != -1) {
+ // not sure if this case still arises. may need to be fixed at some point
+ xpath = '//table[@class="resultRow"]/tbody/tr/td[2]/a';
+ } else {
+ xpath = '//div[@class="font3"][@id="bodyMainResults"]/table/tbody/tr/td[2]/a';
+ }
+ var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var next_row;
+ while (next_row = rows.iterateNext()) {
+ var title = next_row.textContent;
+ var link = next_row.href;
+ if (!title.match(/PDF \(/) && !title.match(/Related Articles/)) items[link] = title;
+ }
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ articles.push(i);
+ }
+
+ var sets = [];
+ for each (article in articles) {
+ sets.push({article:article});
+ }
+
+ } else {
+ articles = [url];
+ var sets =[{currentdoc:doc}];
+ }
+ if(articles.length == 0) {
+ Zotero.debug('no items');
+ return;
+ }
+
+
+ var scrape = function(newDoc, set) {
+ var PDF;
+ var tempPDF = newDoc.evaluate('//a[@class="noul" and div/div[contains(text(), "PDF")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if (!tempPDF) { // PDF xpath failed, lets try another
+ tempPDF = newDoc.evaluate('//a[@class="noul" and contains(text(), "PDF")]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ if (!tempPDF) { // second PDF xpath failed set PDF to null to avoid item.attachments
+ PDF = null;
+ } else {
+ PDF = tempPDF.href; // second xpath succeeded, use that link
+ }
+ } else {
+ PDF = tempPDF.href; // first xpath succeeded, use that link
+ }
+ var url = newDoc.location.href;
+ var get = newDoc.evaluate('//a[img[contains(@src, "exportarticle_a.gif")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
+ // if the PDF is available make it an attachment otherwise only use snapshot.
+ var attachments;
+ if (PDF) {
+ attachments = [
+ {url:url, title:"ScienceDirect Snapshot", mimeType:"text/html"},
+ {url:PDF, title:"ScienceDirect Full Text PDF", mimeType:"application/pdf"} // Sometimes PDF is null...I hope that is ok
+ ];
+ } else {
+ attachments = [
+ {url:url, title:"ScienceDirect Snapshot", mimeType:"text/html"}
+ ];
+ }
+ // This does not work, not sure why.
+ //var doi = newDoc.evaluate('//a[contains(text(), "doi")]/text()', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
+ //Zotero.debug(doi);
+ //doi = doi.textContent.substr(4);
+ // pass these values to the next function
+ //set.doi = doi;
+ set.url = url;
+ set.get = get;
+ set.attachments = attachments;
+ return set;
+
+ };
+
+ var first = function(set, next) {
+ var article = set.article;
+ Zotero.Utilities.processDocuments(article, function(doc){
+ set = scrape(doc, set);
+ next();
+ });
+ };
+
+ var second = function(set, next) {
+ var url = set.url;
+ var get = set.get;
+
+ Zotero.Utilities.HTTP.doGet(get, function(text) {
+ var md5 = text.match(/<input type=hidden name=md5 value=([^>]+)>/)[1];
+ var acct = text.match(/<input type=hidden name=_acct value=([^>]+)>/)[1];
+ var userid = text.match(/<input type=hidden name=_userid value=([^>]+)>/)[1];
+ var uoikey = text.match(/<input type=hidden name=_uoikey value=([^>]+)>/)[1];
+ if (text.match(/<input type=hidden name=_ArticleListID value=([^>]+)>/)) {
+ var alid = text.match(/<input type=hidden name=_ArticleListID value=([^>]+)>/)[1];
+ }
+ if (alid) {
+ var docID = "_ArticleListID=" + alid + "&_uoikey=" + uoikey;
+ } else {
+ var docID = "_uoikey=" + uoikey;
+ }
+ var post = "_ob=DownloadURL&_method=finish&_acct=" + acct + "&_userid=" + userid + "&_docType=FLA&" + docID + "&md5=" + md5 + "&count=1&JAVASCRIPT_ON=Y&format=cite-abs&citation-type=RIS&Export=Export&x=26&y=17";
+ var baseurl = url.match(/https?:\/\/[^/]+\//)[0];
+
+ set.post = post;
+ set.baseurl = baseurl;
+
+ next();
+ });
+
+
+ };
+
+ var third = function(set, next) {
+ var baseurl = set.baseurl;
+ var post = set.post;
+ var attachments = set.attachments;
+
+
+ Zotero.Utilities.HTTP.doPost(baseurl + 'science', post, function(text) {
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ translator.setString(text);
+ translator.setHandler("itemDone", function(obj, item) {
+ item.attachments = attachments;
+
+ if(item.notes[0]) {
+ item.abstractNote = item.notes[0].note;
+ item.notes = new Array();
+ }
+ item.DOI = item.DOI.substr(10);
+ item.complete();
+ });
+ translator.translate();
+
+ next();
+ }, false, 'windows-1252');
+
+
+ };
+
+
+ if(detectWeb(doc, url) == "journalArticle") {
+ Zotero.debug("Single");
+ var set = scrape(doc, {});
+ second(set, function(){
+ third(set, function(){
+ Zotero.done();
+ });
+ });
+
+ } else {
+ var callbacks = [first, second, third];
+ Zotero.Utilities.processAsync(sets, callbacks, function() {Zotero.done()});
+ }
+
+ } else {
+ var sets = [];
+ var articles = new Array();
+ if (detectWeb(doc, url) == "multiple") {
+ var items = new Object();
+ if (url.indexOf("_ob=PublicationURL") != -1) {
+ xpath = '//table[@class="resultRow"]/tbody/tr/td[2]/a';
+ // not sure whether this case still exists
+ } else {
+ xpath = '//div[@class="font3"][@id="bodyMainResults"]/table/tbody/tr/td[2]/a';
+ }
+ var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var next_row;
+ while (next_row = rows.iterateNext()) {
+ var title = next_row.textContent;
+ var link = next_row.href;
+ if (!title.match(/PDF \(/) && !title.match(/Related Articles/)) items[link] = title;
+ }
+ items = Zotero.selectItems(items);
+ for (var i in items) {
+ articles.push(i);
+ }
+
+ } else {
+ articles = [url];
+ }
+ if(articles.length == 0) {
+ Zotero.debug('no items');
+ return;
+ }
+
+ for each (article in articles) {
+ sets.push({article:article});
+ }
+
+ var unauthScrape = function(doc2) {
+ var item = new Zotero.Item("journalArticle");
+ item.repository = "ScienceDirect";
+ item.url = doc2.location.href;
+ var title = doc2.title.match(/^[^-]+\-([^:]+):(.*)$/);
+ item.title = Zotero.Utilities.trimInternal(title[2]);
+ item.publicationTitle = Zotero.Utilities.trimInternal(title[1]);
+ voliss = doc2.evaluate('//div[@class="pageText"][@id="sdBody"]/table/tbody/tr/td[1]', doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ if (voliss.match(/Volume\s+\d+/)) item.volume = voliss.match(/Volume\s+(\d+)/)[1];
+ if (voliss.match(/Issues?\s+[^,]+/)) item.issue = voliss.match(/Issues?\s+([^,]+)/)[1];
+ if (voliss.match(/(J|F|M|A|S|O|N|D)\w+\s+\d{4}/)) item.date = voliss.match(/(J|F|M|A|S|O|N|D)\w+\s+\d{4}/)[0];
+ if (voliss.match(/Pages?\s+[^,^\s]+/)) item.pages = voliss.match(/Pages?\s+([^,^\s]+)/)[1];
+ var abspath = '//div[@class="articleHeaderInner"][@id="articleHeader"]/div[@class="articleText"]/p';
+ var absx = doc2.evaluate(abspath, doc2, nsResolver, XPathResult.ANY_TYPE, null);
+ var ab;
+ item.abstractNote = "";
+ while (ab = absx.iterateNext()) {
+ item.abstractNote += Zotero.Utilities.trimInternal(ab.textContent) + " ";
+ }
+ if (item.abstractNote.substr(0, 7) == "Summary") {
+ item.abstractNote = item.abstractNote.substr(9);
+ }
+ var tagpath = '//div[@class="articleText"]/p[strong[starts-with(text(), "Keywords:")]]';
+ if (doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ if (doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(":")[1]) {
+ var tags = doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(":")[1].split(";");
+ for (var i in tags) {
+ item.tags.push(Zotero.Utilities.trimInternal(tags[i]));
+ }
+ }
+ }
+ item.attachments.push({url:doc2.location.href, title:"ScienceDirect Snapshot", mimeType:"text/html"});
+
+ return item;
+ };
+
+ var first = function(set, next) {
+
+ var article = set.article;
+
+ Zotero.Utilities.processDocuments(article, function(doc2) {
+
+ set.item = unauthScrape(doc2);
+
+ next();
+ });
+
+ };
+
+ var second = function(set, next) {
+ var item = set.item;
+
+ Zotero.Utilities.HTTP.doGet(item.url, function(text) {
+ item.DOI = text.match(/>doi:([^<]*)/)[1];
+
+ try {
+ var aus = text.match(/<strong>\s+<p>.*<\/strong>/)[0].replace(/<sup>/g, "$").replace(/<\/sup>/g, "$");
+ aus = aus.replace(/\$[^$]*\$/g, "");
+ aus = aus.replace(/<a[^>]*>/g, "$").replace(/<\/a[^>]*>/g, "$");
+ aus = aus.replace(/\$[^$]*\$/g, "");
+ aus = Zotero.Utilities.cleanTags(aus);
+ aus = aus.split(/(,|and)/);
+ for (var a in aus) {
+ if (aus[a] != "," && aus[a] != "and" && aus[a].match(/\w+/)) {
+ item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.unescapeHTML(Zotero.Utilities.trimInternal(aus[a]), "author")));
+ }
+ }
+ } catch(e) {
+ Zotero.debug("No Authors listed.");
+ }
+ item.complete();
+ next();
+ });
+ };
+ var callbacks = [first, second];
+ if(detectWeb(doc, url) == "journalArticle") {
+ second({item:unauthScrape(doc)}, function() {Zotero.done()});
+ } else {
+ Zotero.Utilities.processAsync(sets, callbacks, function() {Zotero.done()});
+ }
+
+ }
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/SpringerLink.js b/zotero-import/SpringerLink.js
new file mode 100644
index 0000000..f49afcc
--- /dev/null
+++ b/zotero-import/SpringerLink.js
@@ -0,0 +1,105 @@
+{
+ "translatorID":"f8765470-5ace-4a31-b4bd-4327b960ccd",
+ "translatorType":4,
+ "label":"SpringerLink",
+ "creator":"Simon Kornblith and Michael Berkowitz",
+ "target":"https?://(www\\.)*springerlink\\.com|springerlink.metapress.com[^/]*/content/",
+ "minVersion":"1.0.0b3.r1",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2008-04-12 18:40:00"
+}
+
+function detectWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ if((doc.title == "SpringerLink - All Search Results") || (doc.title == "SpringerLink - Journal Issue")) {
+ return "multiple";
+ } else if(doc.title == "SpringerLink - Book Chapter") {
+ return "bookSection";
+ } else if (doc.title == "SpringerLink - Book") {
+ return "book";
+ } else if (doc.title == "SpringerLink - Journal Article") {
+ return "journalArticle";
+ } else if(doc.evaluate('//a[text() = "RIS"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "journalArticle";
+ }
+}
+
+function doWeb(doc, url) {
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var m = url.match(/https?:\/\/[^\/]+/);
+ var host = m[0];
+
+ if(detectWeb(doc, url) == "multiple") {
+ var items = new Object();
+ if (doc.title == "SpringerLink - Journal Issue") {
+ var items = Zotero.Utilities.getItemArray(doc, doc.getElementsByTagName("table")[8], '/content/[^/]+/\\?p=[^&]+&pi=');
+ } else {
+ var results = doc.evaluate('//div[@class="listItemName"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var result;
+ while (result = results.iterateNext()) {
+ items[result.href] = Zotero.Utilities.trimInternal(result.textContent);
+ }
+ }
+ items = Zotero.selectItems(items);
+ if(!items) return true;
+
+ var urls = new Array();
+ for(var url in items) {
+ urls.push(url);
+ }
+ } else {
+ var urls = [url];
+ }
+
+ var RIS = new Array();
+
+ for each(var item in urls) {
+ var m = item.match(/\/content\/([^/]+)/);
+ RIS.push(host+"/export.mpx?code="+m[1]+"&mode=ris");
+ }
+ Zotero.Utilities.HTTP.doGet(RIS, function(text) {
+ // load translator for RIS
+ text = text.replace("CHAPTER", "CHAP");
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
+ translator.setString(text);
+ translator.setHandler("itemDone", function(obj, item) {
+ var url = urls.shift();
+ var m = url.match(/https?:\/\/[^\/]+\/content\/[^\/]+\/?/);
+ item.attachments = [
+ {url:url, title:"SpringerLink Snapshot", mimeType:"text/html"},
+ {url:m[0]+"fulltext.pdf", title:"SpringerLink Full Text PDF", mimeType:"application/pdf"}
+ ];
+
+ var oldCreators = item.creators;
+ item.creators = new Array();
+ for each (var creator in oldCreators) {
+ if (creator['lastName'] + creator['firstName'] != "") {
+ var fName = creator['firstName'] ? creator['firstName'] : "";
+ item.creators.push({firstName:Zotero.Utilities.trimInternal(fName), lastName:creator['lastName'], creatorType:"author"});
+ }
+ }
+
+ // fix incorrect chapters
+ if(item.publicationTitle && item.itemType == "book") item.title = item.publicationTitle;
+
+ // fix "V" in volume
+ if(item.volume) {
+ item.volume = item.volume.replace("V", "");
+ }
+ item.complete();
+ });
+ translator.translate();
+ }, function() { Zotero.done() });
+ Zotero.wait();
+} \ No newline at end of file
diff --git a/zotero-import/Wiley InterScience.js b/zotero-import/Wiley InterScience.js
new file mode 100644
index 0000000..923f2a3
--- /dev/null
+++ b/zotero-import/Wiley InterScience.js
@@ -0,0 +1,125 @@
+{
+ "translatorID":"fe728bc9-595a-4f03-98fc-766f1d8d0936",
+ "translatorType":4,
+ "label":"Wiley InterScience",
+ "creator":"Sean Takats and Michael Berkowitz",
+ "target":"https?:\\/\\/(?:www3\\.|www\\.)?interscience\\.wiley\\.com[^\\/]*\\/(?:search\\/|(cgi-bin|journal)\\/[0-9]+\\/abstract|journal)",
+ "minVersion":"1.0.0b4.r5",
+ "maxVersion":"",
+ "priority":100,
+ "inRepository":true,
+ "lastUpdated":"2009-05-05 15:45:00"
+}
+
+function detectWeb(doc, url){
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+
+ var xpath = '//input[@name="ID"][@type="checkbox"]';
+ if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ return "multiple";
+ }
+ if (url.match(/journal\/\d+\/(issue|home)$/)) {
+ return "multiple";
+ }
+ var m = url.match(/https?:\/\/[^\/]*\/(cgi-bin|journal)(\/(abstract|summary))?\/[0-9]+\/abstract/);
+ if (m){
+ return "journalArticle";
+ }
+}
+
+function doWeb(doc, url){
+ var namespace = doc.documentElement.namespaceURI;
+ var nsResolver = namespace ? function(prefix) {
+ if (prefix == 'x') return namespace; else return null;
+ } : null;
+ var host = 'http://' + doc.location.host + "/";
+ Zotero.debug(host);
+ var m = url.match(/https?:\/\/[^\/]*\/(journal|cgi-bin\/summary)\/([0-9]+)\/(abstract)?/);
+ var ids = new Array();
+ if(detectWeb(doc, url) == "multiple") { //search
+ var id;
+ var title;
+ var availableItems = new Array();
+ var xpath = '//tr[td/input[@name="ID"][@type="checkbox"]]';
+ if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
+ elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var elmt = elmts.iterateNext();
+ do {
+ title = doc.evaluate('./td/strong', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
+ id = doc.evaluate('./td/input[@name="ID"][@type="checkbox"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
+ availableItems[id] = title;
+ } while (elmt = elmts.iterateNext())
+ } else {
+ var xpath = '//div[@id="contentCell"]/div[*/a]';
+ var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
+ var elmt = elmts.iterateNext();
+ do {
+ title = Zotero.Utilities.trimInternal(doc.evaluate('.//strong', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
+ id = doc.evaluate('.//a[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.match(/\/([\d]+)\/abstract/)[1];
+ availableItems[id] = title;
+ } while (elmt = elmts.iterateNext())
+ }
+ var items = Zotero.selectItems(availableItems);
+ if(!items) {
+ return true;
+ }
+ for(var id in items) {
+ ids.push(id);
+ }
+
+ } else if (m){ //single article
+ ids.push(m[2]);
+ }
+
+
+ var sets = [];
+ for each (id in ids) {
+ var uri = host + 'tools/citex';
+ var poststring = "clienttype=1&subtype=1&mode=1&version=1&id=" + id;
+ sets.push({ id: id, uri: uri, poststring: poststring });
+ }
+
+ var setupCallback = function (set, next) {
+ Zotero.Utilities.HTTP.doPost(set.uri, set.poststring, function () {
+ next();
+ });
+ }
+
+ var processCallback = function (set, next) {
+ var id = set.id;
+ var uri = host+"tools/CitEx";
+ var poststring = "mode=2&format=3&type=2&file=3&exportCitation.x=16&exportCitation.y=10&exportCitation=submit";
+ Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
+ var m = text.match(/%A\s(.*)/); //following lines fix Wiley's incorrect %A tag (should be separate tags for each author)
+ if (m){
+ var newauthors ="";
+ var authors = m[1].split(",")
+ for each (var author in authors){
+ if (author != ""){
+ newauthors = newauthors + "%A "+Zotero.Utilities.unescapeHTML(Zotero.Utilities.trimInternal(author))+"\n";
+ }
+ }
+ text = text.replace(/%A\s.*\n/, newauthors);
+ }
+ var translator = Zotero.loadTranslator("import");
+ translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); //EndNote/Refer/BibIX
+ translator.setString(text);
+ translator.setHandler("itemDone", function(obj, item) {
+ var pdfurl = host + "cgi-bin/fulltext?ID=" + id + "&PLACEBO=IE.pdf&mode=pdf";
+ item.attachments.push({url:pdfurl, title:"Wiley Interscience PDF", mimeType:"application/pdf"});
+ item.DOI = item.url.match(/\.org\/(.*)$/)[1];
+ item.complete();
+ });
+ translator.translate();
+
+ next();
+ });
+ }
+
+ var callbacks = [setupCallback, processCallback];
+ Zotero.Utilities.processAsync(sets, callbacks, function () { Zotero.done(); });
+ Zotero.wait();
+} \ No newline at end of file