diff options
author | kanzure <kanzure@gmail.com> | 2009-07-24 23:26:56 -0500 |
---|---|---|
committer | kanzure <kanzure@gmail.com> | 2009-07-24 23:26:56 -0500 |
commit | 6ca4d6a103e188ca5fb3f27419ae97210b61ee34 (patch) | |
tree | b2efd7ee7d21fa4f98ed272c9902825b19660cc6 | |
parent | 17f7da9f0728dcd6701c7897dd04b194ab315d7b (diff) | |
download | pyscholar-6ca4d6a103e188ca5fb3f27419ae97210b61ee34.tar.gz pyscholar-6ca4d6a103e188ca5fb3f27419ae97210b61ee34.zip |
threw in some zotero files to convert
-rw-r--r-- | zotero-import/BibTeX.js | 2031 | ||||
-rw-r--r-- | zotero-import/Blackwell Synergy.js | 91 | ||||
-rw-r--r-- | zotero-import/CiteSeer.js | 111 | ||||
-rw-r--r-- | zotero-import/DOI.js | 103 | ||||
-rw-r--r-- | zotero-import/Google Books.js | 174 | ||||
-rw-r--r-- | zotero-import/Google Patents.js | 170 | ||||
-rw-r--r-- | zotero-import/Google Scholar.js | 119 | ||||
-rw-r--r-- | zotero-import/IEEE Xplore.js | 128 | ||||
-rw-r--r-- | zotero-import/ISI Web of Knowledge.js | 114 | ||||
-rw-r--r-- | zotero-import/IngentaConnect.js | 71 | ||||
-rw-r--r-- | zotero-import/Nature.js | 107 | ||||
-rw-r--r-- | zotero-import/PLoS Biology and Medicine.js | 87 | ||||
-rw-r--r-- | zotero-import/PLoS Journals.js | 83 | ||||
-rw-r--r-- | zotero-import/Project Gutenberg.js | 175 | ||||
-rw-r--r-- | zotero-import/PubMed Central.js | 92 | ||||
-rw-r--r-- | zotero-import/RSC Publishing.js | 438 | ||||
-rw-r--r-- | zotero-import/ScienceDirect.js | 310 | ||||
-rw-r--r-- | zotero-import/SpringerLink.js | 105 | ||||
-rw-r--r-- | zotero-import/Wiley InterScience.js | 125 |
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 |