From 2174e5cbf5f57f3714bc0832c5ba14a98fb948db Mon Sep 17 00:00:00 2001
From: henrikjust <henrikjust@f0f2a975-2e09-46c8-9428-3b39399b9f3c>
Date: Sat, 30 Oct 2010 10:35:46 +0000
Subject: [PATCH] Zotero integration + EPUB split + a few other fixes

git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@76 f0f2a975-2e09-46c8-9428-3b39399b9f3c
---
 source/distro/changelog.txt                   |   11 +
 source/distro/zotero/BibTeX-Writer2LaTeX.js   | 2098 +++++++++++++++++
 .../filter/GraphicConverterImpl1.java         |    7 +-
 .../writer2latex/api/ConverterFactory.java    |    4 +-
 .../writer2latex/latex/InlineConverter.java   |   41 +-
 source/java/writer2latex/latex/i18n/I18n.java |   20 +-
 source/java/writer2latex/util/Misc.java       |   21 +-
 source/java/writer2latex/xhtml/Converter.java |   27 +-
 source/java/writer2latex/xhtml/L10n.java      |   61 +-
 .../writer2latex/xhtml/TextConverter.java     |   44 +-
 .../writer2latex/xhtml/XhtmlDocument.java     |   25 +-
 .../export.xhp                                |   11 +-
 .../bibliography.xhp                          |   27 +-
 13 files changed, 2323 insertions(+), 74 deletions(-)
 create mode 100644 source/distro/zotero/BibTeX-Writer2LaTeX.js

diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt
index da3b553..65fb169 100644
--- a/source/distro/changelog.txt
+++ b/source/distro/changelog.txt
@@ -2,6 +2,15 @@ Changelog for Writer2LaTeX version 1.0 -> 1.2
 
 ---------- version 1.1.5 ----------
 
+[w2x] Automatic split of files in EPUB export after 150000 characters (to avoid problems with some EPUB readers
+  which has a limit on the size of the individual files) 
+
+[all] Author and date are now included in export of annotations
+
+[w2x] No longer produce <span> and <a> elements without attributes
+
+[w2l] Bugfix: WMF files are now correctly converted to EPS
+
 [all] Added Norwegian Nynorsk translation from Kevin Brubeck Unhammer
 
 [w2x] Only create reference targets for reference marks, bookmarks and sequence numbers if reference exists
@@ -12,6 +21,8 @@ Changelog for Writer2LaTeX version 1.0 -> 1.2
 
 [w2l] Bugfix: Fixed problem with lost images in some documents
 
+[w4l] New option page to define interaction with Zotero and with external BibTeX files
+
 [w2l] New option: natbib_options is used to set options for natbib.sty (used by Zotero export)
 
 [w2l] Added support for Zotero reference marks (with contributions from Kevin Brubeck Unhammer)
diff --git a/source/distro/zotero/BibTeX-Writer2LaTeX.js b/source/distro/zotero/BibTeX-Writer2LaTeX.js
new file mode 100644
index 0000000..3301e4c
--- /dev/null
+++ b/source/distro/zotero/BibTeX-Writer2LaTeX.js
@@ -0,0 +1,2098 @@
+{
+        "translatorID":"47fef559-4549-4815-b68f-bdf3b3819ac5",
+        "label":"BibTeX (Writer2LaTeX)",
+        "creator":"Simon Kornblith and Richard Karnesky - modified by Henrik Just",
+        "target":"bib",
+        "minVersion":"1.0",
+        "maxVersion":"",
+        "priority":100,
+        "inRepository":"0",
+        "translatorType":2,
+        "lastUpdated":"2010-10-06 23:16:00"
+}
+
+Zotero.configure("dataMode", "block");
+Zotero.addOption("exportCharset", "UTF-8");
+Zotero.addOption("exportFileData", false);
+
+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
+//%k = original key
+var citeKeyFormat = "%k"; //"%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
+    "`" : "\u2018", // LEFT SINGLE QUOTATION MARK
+    "'" : "\u2019", // RIGHT SINGLE QUOTATION MARK
+    "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK
+    "\u201B":"'", // SINGLE HIGH-REVERSED-9 QUOTATION MARK
+    "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK
+    "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK
+    "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK
+    "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+    "\u2020":"{\\textdagger}", // DAGGER
+    "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER
+    "\u2022":"{\\textbullet}", // BULLET
+    "\u2023":">", // TRIANGULAR BULLET
+    "\u2024":".", // ONE DOT LEADER
+    "\u2025":"..", // TWO DOT LEADER
+    "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS
+    "\u2027":"-", // HYPHENATION POINT
+    "\u202F":" ", // NARROW NO-BREAK SPACE
+    "\u2030":"{\\textperthousand}", // PER MILLE SIGN
+    "\u2032":"'", // PRIME
+    "\u2033":"'", // DOUBLE PRIME
+    "\u2034":"'''", // TRIPLE PRIME
+    "\u2035":"`", // REVERSED PRIME
+    "\u2036":"``", // REVERSED DOUBLE PRIME
+    "\u2037":"```", // REVERSED TRIPLE PRIME
+    "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+    "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+    "\u203C":"!!", // DOUBLE EXCLAMATION MARK
+    "\u203E":"-", // OVERLINE
+    "\u2043":"-", // HYPHEN BULLET
+    "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH
+    "\u2048":"?!", // QUESTION EXCLAMATION MARK
+    "\u2049":"!?", // EXCLAMATION QUESTION MARK
+    "\u204A":"7", // TIRONIAN SIGN ET
+    "\u2070":"$^{0}$", // SUPERSCRIPT ZERO
+    "\u2074":"$^{4}$", // SUPERSCRIPT FOUR
+    "\u2075":"$^{5}$", // SUPERSCRIPT FIVE
+    "\u2076":"$^{6}$", // SUPERSCRIPT SIX
+    "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN
+    "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT
+    "\u2079":"$^{9}$", // SUPERSCRIPT NINE
+    "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN
+    "\u207B":"$^{-}$", // SUPERSCRIPT MINUS
+    "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN
+    "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS
+    "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS
+    "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N
+    "\u2080":"$_{0}$", // SUBSCRIPT ZERO
+    "\u2081":"$_{1}$", // SUBSCRIPT ONE
+    "\u2082":"$_{2}$", // SUBSCRIPT TWO
+    "\u2083":"$_{3}$", // SUBSCRIPT THREE
+    "\u2084":"$_{4}$", // SUBSCRIPT FOUR
+    "\u2085":"$_{5}$", // SUBSCRIPT FIVE
+    "\u2086":"$_{6}$", // SUBSCRIPT SIX
+    "\u2087":"$_{7}$", // SUBSCRIPT SEVEN
+    "\u2088":"$_{8}$", // SUBSCRIPT EIGHT
+    "\u2089":"$_{9}$", // SUBSCRIPT NINE
+    "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN
+    "\u208B":"$_{-}$", // SUBSCRIPT MINUS
+    "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN
+    "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS
+    "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS
+    "\u20AC":"{\\texteuro}", // EURO SIGN
+    "\u2100":"a/c", // ACCOUNT OF
+    "\u2101":"a/s", // ADDRESSED TO THE SUBJECT
+    "\u2103":"{\\textcelsius}", // DEGREE CELSIUS
+    "\u2105":"c/o", // CARE OF
+    "\u2106":"c/u", // CADA UNA
+    "\u2109":"F", // DEGREE FAHRENHEIT
+    "\u2113":"l", // SCRIPT SMALL L
+    "\u2116":"{\\textnumero}", // NUMERO SIGN
+    "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT
+    "\u2120":"{\\textservicemark}", // SERVICE MARK
+    "\u2121":"TEL", // TELEPHONE SIGN
+    "\u2122":"{\\texttrademark}", // TRADE MARK SIGN
+    "\u2126":"{\\textohm}", // OHM SIGN
+    "\u212A":"K", // KELVIN SIGN
+    "\u212B":"A", // ANGSTROM SIGN
+    "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL
+    "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD
+    "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS
+    "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH
+    "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS
+    "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS
+    "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS
+    "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH
+    "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS
+    "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH
+    "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS
+    "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS
+    "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS
+    "\u215F":" 1/", // FRACTION NUMERATOR ONE
+    "\u2160":"I", // ROMAN NUMERAL ONE
+    "\u2161":"II", // ROMAN NUMERAL TWO
+    "\u2162":"III", // ROMAN NUMERAL THREE
+    "\u2163":"IV", // ROMAN NUMERAL FOUR
+    "\u2164":"V", // ROMAN NUMERAL FIVE
+    "\u2165":"VI", // ROMAN NUMERAL SIX
+    "\u2166":"VII", // ROMAN NUMERAL SEVEN
+    "\u2167":"VIII", // ROMAN NUMERAL EIGHT
+    "\u2168":"IX", // ROMAN NUMERAL NINE
+    "\u2169":"X", // ROMAN NUMERAL TEN
+    "\u216A":"XI", // ROMAN NUMERAL ELEVEN
+    "\u216B":"XII", // ROMAN NUMERAL TWELVE
+    "\u216C":"L", // ROMAN NUMERAL FIFTY
+    "\u216D":"C", // ROMAN NUMERAL ONE HUNDRED
+    "\u216E":"D", // ROMAN NUMERAL FIVE HUNDRED
+    "\u216F":"M", // ROMAN NUMERAL ONE THOUSAND
+    "\u2170":"i", // SMALL ROMAN NUMERAL ONE
+    "\u2171":"ii", // SMALL ROMAN NUMERAL TWO
+    "\u2172":"iii", // SMALL ROMAN NUMERAL THREE
+    "\u2173":"iv", // SMALL ROMAN NUMERAL FOUR
+    "\u2174":"v", // SMALL ROMAN NUMERAL FIVE
+    "\u2175":"vi", // SMALL ROMAN NUMERAL SIX
+    "\u2176":"vii", // SMALL ROMAN NUMERAL SEVEN
+    "\u2177":"viii", // SMALL ROMAN NUMERAL EIGHT
+    "\u2178":"ix", // SMALL ROMAN NUMERAL NINE
+    "\u2179":"x", // SMALL ROMAN NUMERAL TEN
+    "\u217A":"xi", // SMALL ROMAN NUMERAL ELEVEN
+    "\u217B":"xii", // SMALL ROMAN NUMERAL TWELVE
+    "\u217C":"l", // SMALL ROMAN NUMERAL FIFTY
+    "\u217D":"c", // SMALL ROMAN NUMERAL ONE HUNDRED
+    "\u217E":"d", // SMALL ROMAN NUMERAL FIVE HUNDRED
+    "\u217F":"m", // SMALL ROMAN NUMERAL ONE THOUSAND
+    "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW
+    "\u2191":"{\\textuparrow}", // UPWARDS ARROW
+    "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW
+    "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW
+    "\u2194":"<->", // LEFT RIGHT ARROW
+    "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW
+    "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW
+    "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW
+    "\u2212":"-", // MINUS SIGN
+    "\u2215":"/", // DIVISION SLASH
+    "\u2216":"\\", // SET MINUS
+    "\u2217":"*", // ASTERISK OPERATOR
+    "\u2218":"o", // RING OPERATOR
+    "\u2219":".", // BULLET OPERATOR
+    "\u221E":"$\\infty$", // INFINITY
+    "\u2223":"|", // DIVIDES
+    "\u2225":"||", // PARALLEL TO
+    "\u2236":":", // RATIO
+    "\u223C":"\\~{}", // TILDE OPERATOR
+    "\u2260":"/=", // NOT EQUAL TO
+    "\u2261":"=", // IDENTICAL TO
+    "\u2264":"<=", // LESS-THAN OR EQUAL TO
+    "\u2265":">=", // GREATER-THAN OR EQUAL TO
+    "\u226A":"<<", // MUCH LESS-THAN
+    "\u226B":">>", // MUCH GREATER-THAN
+    "\u2295":"(+)", // CIRCLED PLUS
+    "\u2296":"(-)", // CIRCLED MINUS
+    "\u2297":"(x)", // CIRCLED TIMES
+    "\u2298":"(/)", // CIRCLED DIVISION SLASH
+    "\u22A2":"|-", // RIGHT TACK
+    "\u22A3":"-|", // LEFT TACK
+    "\u22A6":"|-", // ASSERTION
+    "\u22A7":"|=", // MODELS
+    "\u22A8":"|=", // TRUE
+    "\u22A9":"||-", // FORCES
+    "\u22C5":".", // DOT OPERATOR
+    "\u22C6":"*", // STAR OPERATOR
+    "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO
+    "\u22D8":"<<<", // VERY MUCH LESS-THAN
+    "\u22D9":">>>", // VERY MUCH GREATER-THAN
+    "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET
+    "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET
+    "\u2400":"NUL", // SYMBOL FOR NULL
+    "\u2401":"SOH", // SYMBOL FOR START OF HEADING
+    "\u2402":"STX", // SYMBOL FOR START OF TEXT
+    "\u2403":"ETX", // SYMBOL FOR END OF TEXT
+    "\u2404":"EOT", // SYMBOL FOR END OF TRANSMISSION
+    "\u2405":"ENQ", // SYMBOL FOR ENQUIRY
+    "\u2406":"ACK", // SYMBOL FOR ACKNOWLEDGE
+    "\u2407":"BEL", // SYMBOL FOR BELL
+    "\u2408":"BS", // SYMBOL FOR BACKSPACE
+    "\u2409":"HT", // SYMBOL FOR HORIZONTAL TABULATION
+    "\u240A":"LF", // SYMBOL FOR LINE FEED
+    "\u240B":"VT", // SYMBOL FOR VERTICAL TABULATION
+    "\u240C":"FF", // SYMBOL FOR FORM FEED
+    "\u240D":"CR", // SYMBOL FOR CARRIAGE RETURN
+    "\u240E":"SO", // SYMBOL FOR SHIFT OUT
+    "\u240F":"SI", // SYMBOL FOR SHIFT IN
+    "\u2410":"DLE", // SYMBOL FOR DATA LINK ESCAPE
+    "\u2411":"DC1", // SYMBOL FOR DEVICE CONTROL ONE
+    "\u2412":"DC2", // SYMBOL FOR DEVICE CONTROL TWO
+    "\u2413":"DC3", // SYMBOL FOR DEVICE CONTROL THREE
+    "\u2414":"DC4", // SYMBOL FOR DEVICE CONTROL FOUR
+    "\u2415":"NAK", // SYMBOL FOR NEGATIVE ACKNOWLEDGE
+    "\u2416":"SYN", // SYMBOL FOR SYNCHRONOUS IDLE
+    "\u2417":"ETB", // SYMBOL FOR END OF TRANSMISSION BLOCK
+    "\u2418":"CAN", // SYMBOL FOR CANCEL
+    "\u2419":"EM", // SYMBOL FOR END OF MEDIUM
+    "\u241A":"SUB", // SYMBOL FOR SUBSTITUTE
+    "\u241B":"ESC", // SYMBOL FOR ESCAPE
+    "\u241C":"FS", // SYMBOL FOR FILE SEPARATOR
+    "\u241D":"GS", // SYMBOL FOR GROUP SEPARATOR
+    "\u241E":"RS", // SYMBOL FOR RECORD SEPARATOR
+    "\u241F":"US", // SYMBOL FOR UNIT SEPARATOR
+    "\u2420":"SP", // SYMBOL FOR SPACE
+    "\u2421":"DEL", // SYMBOL FOR DELETE
+    "\u2423":"{\\textvisiblespace}", // OPEN BOX
+    "\u2424":"NL", // SYMBOL FOR NEWLINE
+    "\u2425":"///", // SYMBOL FOR DELETE FORM TWO
+    "\u2426":"?", // SYMBOL FOR SUBSTITUTE FORM TWO
+    "\u2460":"(1)", // CIRCLED DIGIT ONE
+    "\u2461":"(2)", // CIRCLED DIGIT TWO
+    "\u2462":"(3)", // CIRCLED DIGIT THREE
+    "\u2463":"(4)", // CIRCLED DIGIT FOUR
+    "\u2464":"(5)", // CIRCLED DIGIT FIVE
+    "\u2465":"(6)", // CIRCLED DIGIT SIX
+    "\u2466":"(7)", // CIRCLED DIGIT SEVEN
+    "\u2467":"(8)", // CIRCLED DIGIT EIGHT
+    "\u2468":"(9)", // CIRCLED DIGIT NINE
+    "\u2469":"(10)", // CIRCLED NUMBER TEN
+    "\u246A":"(11)", // CIRCLED NUMBER ELEVEN
+    "\u246B":"(12)", // CIRCLED NUMBER TWELVE
+    "\u246C":"(13)", // CIRCLED NUMBER THIRTEEN
+    "\u246D":"(14)", // CIRCLED NUMBER FOURTEEN
+    "\u246E":"(15)", // CIRCLED NUMBER FIFTEEN
+    "\u246F":"(16)", // CIRCLED NUMBER SIXTEEN
+    "\u2470":"(17)", // CIRCLED NUMBER SEVENTEEN
+    "\u2471":"(18)", // CIRCLED NUMBER EIGHTEEN
+    "\u2472":"(19)", // CIRCLED NUMBER NINETEEN
+    "\u2473":"(20)", // CIRCLED NUMBER TWENTY
+    "\u2474":"(1)", // PARENTHESIZED DIGIT ONE
+    "\u2475":"(2)", // PARENTHESIZED DIGIT TWO
+    "\u2476":"(3)", // PARENTHESIZED DIGIT THREE
+    "\u2477":"(4)", // PARENTHESIZED DIGIT FOUR
+    "\u2478":"(5)", // PARENTHESIZED DIGIT FIVE
+    "\u2479":"(6)", // PARENTHESIZED DIGIT SIX
+    "\u247A":"(7)", // PARENTHESIZED DIGIT SEVEN
+    "\u247B":"(8)", // PARENTHESIZED DIGIT EIGHT
+    "\u247C":"(9)", // PARENTHESIZED DIGIT NINE
+    "\u247D":"(10)", // PARENTHESIZED NUMBER TEN
+    "\u247E":"(11)", // PARENTHESIZED NUMBER ELEVEN
+    "\u247F":"(12)", // PARENTHESIZED NUMBER TWELVE
+    "\u2480":"(13)", // PARENTHESIZED NUMBER THIRTEEN
+    "\u2481":"(14)", // PARENTHESIZED NUMBER FOURTEEN
+    "\u2482":"(15)", // PARENTHESIZED NUMBER FIFTEEN
+    "\u2483":"(16)", // PARENTHESIZED NUMBER SIXTEEN
+    "\u2484":"(17)", // PARENTHESIZED NUMBER SEVENTEEN
+    "\u2485":"(18)", // PARENTHESIZED NUMBER EIGHTEEN
+    "\u2486":"(19)", // PARENTHESIZED NUMBER NINETEEN
+    "\u2487":"(20)", // PARENTHESIZED NUMBER TWENTY
+    "\u2488":"1.", // DIGIT ONE FULL STOP
+    "\u2489":"2.", // DIGIT TWO FULL STOP
+    "\u248A":"3.", // DIGIT THREE FULL STOP
+    "\u248B":"4.", // DIGIT FOUR FULL STOP
+    "\u248C":"5.", // DIGIT FIVE FULL STOP
+    "\u248D":"6.", // DIGIT SIX FULL STOP
+    "\u248E":"7.", // DIGIT SEVEN FULL STOP
+    "\u248F":"8.", // DIGIT EIGHT FULL STOP
+    "\u2490":"9.", // DIGIT NINE FULL STOP
+    "\u2491":"10.", // NUMBER TEN FULL STOP
+    "\u2492":"11.", // NUMBER ELEVEN FULL STOP
+    "\u2493":"12.", // NUMBER TWELVE FULL STOP
+    "\u2494":"13.", // NUMBER THIRTEEN FULL STOP
+    "\u2495":"14.", // NUMBER FOURTEEN FULL STOP
+    "\u2496":"15.", // NUMBER FIFTEEN FULL STOP
+    "\u2497":"16.", // NUMBER SIXTEEN FULL STOP
+    "\u2498":"17.", // NUMBER SEVENTEEN FULL STOP
+    "\u2499":"18.", // NUMBER EIGHTEEN FULL STOP
+    "\u249A":"19.", // NUMBER NINETEEN FULL STOP
+    "\u249B":"20.", // NUMBER TWENTY FULL STOP
+    "\u249C":"(a)", // PARENTHESIZED LATIN SMALL LETTER A
+    "\u249D":"(b)", // PARENTHESIZED LATIN SMALL LETTER B
+    "\u249E":"(c)", // PARENTHESIZED LATIN SMALL LETTER C
+    "\u249F":"(d)", // PARENTHESIZED LATIN SMALL LETTER D
+    "\u24A0":"(e)", // PARENTHESIZED LATIN SMALL LETTER E
+    "\u24A1":"(f)", // PARENTHESIZED LATIN SMALL LETTER F
+    "\u24A2":"(g)", // PARENTHESIZED LATIN SMALL LETTER G
+    "\u24A3":"(h)", // PARENTHESIZED LATIN SMALL LETTER H
+    "\u24A4":"(i)", // PARENTHESIZED LATIN SMALL LETTER I
+    "\u24A5":"(j)", // PARENTHESIZED LATIN SMALL LETTER J
+    "\u24A6":"(k)", // PARENTHESIZED LATIN SMALL LETTER K
+    "\u24A7":"(l)", // PARENTHESIZED LATIN SMALL LETTER L
+    "\u24A8":"(m)", // PARENTHESIZED LATIN SMALL LETTER M
+    "\u24A9":"(n)", // PARENTHESIZED LATIN SMALL LETTER N
+    "\u24AA":"(o)", // PARENTHESIZED LATIN SMALL LETTER O
+    "\u24AB":"(p)", // PARENTHESIZED LATIN SMALL LETTER P
+    "\u24AC":"(q)", // PARENTHESIZED LATIN SMALL LETTER Q
+    "\u24AD":"(r)", // PARENTHESIZED LATIN SMALL LETTER R
+    "\u24AE":"(s)", // PARENTHESIZED LATIN SMALL LETTER S
+    "\u24AF":"(t)", // PARENTHESIZED LATIN SMALL LETTER T
+    "\u24B0":"(u)", // PARENTHESIZED LATIN SMALL LETTER U
+    "\u24B1":"(v)", // PARENTHESIZED LATIN SMALL LETTER V
+    "\u24B2":"(w)", // PARENTHESIZED LATIN SMALL LETTER W
+    "\u24B3":"(x)", // PARENTHESIZED LATIN SMALL LETTER X
+    "\u24B4":"(y)", // PARENTHESIZED LATIN SMALL LETTER Y
+    "\u24B5":"(z)", // PARENTHESIZED LATIN SMALL LETTER Z
+    "\u24B6":"(A)", // CIRCLED LATIN CAPITAL LETTER A
+    "\u24B7":"(B)", // CIRCLED LATIN CAPITAL LETTER B
+    "\u24B8":"(C)", // CIRCLED LATIN CAPITAL LETTER C
+    "\u24B9":"(D)", // CIRCLED LATIN CAPITAL LETTER D
+    "\u24BA":"(E)", // CIRCLED LATIN CAPITAL LETTER E
+    "\u24BB":"(F)", // CIRCLED LATIN CAPITAL LETTER F
+    "\u24BC":"(G)", // CIRCLED LATIN CAPITAL LETTER G
+    "\u24BD":"(H)", // CIRCLED LATIN CAPITAL LETTER H
+    "\u24BE":"(I)", // CIRCLED LATIN CAPITAL LETTER I
+    "\u24BF":"(J)", // CIRCLED LATIN CAPITAL LETTER J
+    "\u24C0":"(K)", // CIRCLED LATIN CAPITAL LETTER K
+    "\u24C1":"(L)", // CIRCLED LATIN CAPITAL LETTER L
+    "\u24C2":"(M)", // CIRCLED LATIN CAPITAL LETTER M
+    "\u24C3":"(N)", // CIRCLED LATIN CAPITAL LETTER N
+    "\u24C4":"(O)", // CIRCLED LATIN CAPITAL LETTER O
+    "\u24C5":"(P)", // CIRCLED LATIN CAPITAL LETTER P
+    "\u24C6":"(Q)", // CIRCLED LATIN CAPITAL LETTER Q
+    "\u24C7":"(R)", // CIRCLED LATIN CAPITAL LETTER R
+    "\u24C8":"(S)", // CIRCLED LATIN CAPITAL LETTER S
+    "\u24C9":"(T)", // CIRCLED LATIN CAPITAL LETTER T
+    "\u24CA":"(U)", // CIRCLED LATIN CAPITAL LETTER U
+    "\u24CB":"(V)", // CIRCLED LATIN CAPITAL LETTER V
+    "\u24CC":"(W)", // CIRCLED LATIN CAPITAL LETTER W
+    "\u24CD":"(X)", // CIRCLED LATIN CAPITAL LETTER X
+    "\u24CE":"(Y)", // CIRCLED LATIN CAPITAL LETTER Y
+    "\u24CF":"(Z)", // CIRCLED LATIN CAPITAL LETTER Z
+    "\u24D0":"(a)", // CIRCLED LATIN SMALL LETTER A
+    "\u24D1":"(b)", // CIRCLED LATIN SMALL LETTER B
+    "\u24D2":"(c)", // CIRCLED LATIN SMALL LETTER C
+    "\u24D3":"(d)", // CIRCLED LATIN SMALL LETTER D
+    "\u24D4":"(e)", // CIRCLED LATIN SMALL LETTER E
+    "\u24D5":"(f)", // CIRCLED LATIN SMALL LETTER F
+    "\u24D6":"(g)", // CIRCLED LATIN SMALL LETTER G
+    "\u24D7":"(h)", // CIRCLED LATIN SMALL LETTER H
+    "\u24D8":"(i)", // CIRCLED LATIN SMALL LETTER I
+    "\u24D9":"(j)", // CIRCLED LATIN SMALL LETTER J
+    "\u24DA":"(k)", // CIRCLED LATIN SMALL LETTER K
+    "\u24DB":"(l)", // CIRCLED LATIN SMALL LETTER L
+    "\u24DC":"(m)", // CIRCLED LATIN SMALL LETTER M
+    "\u24DD":"(n)", // CIRCLED LATIN SMALL LETTER N
+    "\u24DE":"(o)", // CIRCLED LATIN SMALL LETTER O
+    "\u24DF":"(p)", // CIRCLED LATIN SMALL LETTER P
+    "\u24E0":"(q)", // CIRCLED LATIN SMALL LETTER Q
+    "\u24E1":"(r)", // CIRCLED LATIN SMALL LETTER R
+    "\u24E2":"(s)", // CIRCLED LATIN SMALL LETTER S
+    "\u24E3":"(t)", // CIRCLED LATIN SMALL LETTER T
+    "\u24E4":"(u)", // CIRCLED LATIN SMALL LETTER U
+    "\u24E5":"(v)", // CIRCLED LATIN SMALL LETTER V
+    "\u24E6":"(w)", // CIRCLED LATIN SMALL LETTER W
+    "\u24E7":"(x)", // CIRCLED LATIN SMALL LETTER X
+    "\u24E8":"(y)", // CIRCLED LATIN SMALL LETTER Y
+    "\u24E9":"(z)", // CIRCLED LATIN SMALL LETTER Z
+    "\u24EA":"(0)", // CIRCLED DIGIT ZERO
+    "\u2500":"-", // BOX DRAWINGS LIGHT HORIZONTAL
+    "\u2501":"=", // BOX DRAWINGS HEAVY HORIZONTAL
+    "\u2502":"|", // BOX DRAWINGS LIGHT VERTICAL
+    "\u2503":"|", // BOX DRAWINGS HEAVY VERTICAL
+    "\u2504":"-", // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+    "\u2505":"=", // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+    "\u2506":"|", // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+    "\u2507":"|", // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+    "\u2508":"-", // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+    "\u2509":"=", // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+    "\u250A":"|", // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+    "\u250B":"|", // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+    "\u250C":"+", // BOX DRAWINGS LIGHT DOWN AND RIGHT
+    "\u250D":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+    "\u250E":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+    "\u250F":"+", // BOX DRAWINGS HEAVY DOWN AND RIGHT
+    "\u2510":"+", // BOX DRAWINGS LIGHT DOWN AND LEFT
+    "\u2511":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+    "\u2512":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+    "\u2513":"+", // BOX DRAWINGS HEAVY DOWN AND LEFT
+    "\u2514":"+", // BOX DRAWINGS LIGHT UP AND RIGHT
+    "\u2515":"+", // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+    "\u2516":"+", // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+    "\u2517":"+", // BOX DRAWINGS HEAVY UP AND RIGHT
+    "\u2518":"+", // BOX DRAWINGS LIGHT UP AND LEFT
+    "\u2519":"+", // BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+    "\u251A":"+", // BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+    "\u251B":"+", // BOX DRAWINGS HEAVY UP AND LEFT
+    "\u251C":"+", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+    "\u251D":"+", // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+    "\u251E":"+", // BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+    "\u251F":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+    "\u2520":"+", // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+    "\u2521":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+    "\u2522":"+", // BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+    "\u2523":"+", // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+    "\u2524":"+", // BOX DRAWINGS LIGHT VERTICAL AND LEFT
+    "\u2525":"+", // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+    "\u2526":"+", // BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+    "\u2527":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+    "\u2528":"+", // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+    "\u2529":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+    "\u252A":"+", // BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+    "\u252B":"+", // BOX DRAWINGS HEAVY VERTICAL AND LEFT
+    "\u252C":"+", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+    "\u252D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+    "\u252E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+    "\u252F":"+", // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+    "\u2530":"+", // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+    "\u2531":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+    "\u2532":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+    "\u2533":"+", // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+    "\u2534":"+", // BOX DRAWINGS LIGHT UP AND HORIZONTAL
+    "\u2535":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+    "\u2536":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+    "\u2537":"+", // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+    "\u2538":"+", // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+    "\u2539":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+    "\u253A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+    "\u253B":"+", // BOX DRAWINGS HEAVY UP AND HORIZONTAL
+    "\u253C":"+", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+    "\u253D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+    "\u253E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+    "\u253F":"+", // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+    "\u2540":"+", // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+    "\u2541":"+", // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+    "\u2542":"+", // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+    "\u2543":"+", // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+    "\u2544":"+", // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+    "\u2545":"+", // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+    "\u2546":"+", // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+    "\u2547":"+", // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+    "\u2548":"+", // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+    "\u2549":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+    "\u254A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+    "\u254B":"+", // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+    "\u254C":"-", // BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+    "\u254D":"=", // BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+    "\u254E":"|", // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+    "\u254F":"|", // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+    "\u2550":"=", // BOX DRAWINGS DOUBLE HORIZONTAL
+    "\u2551":"|", // BOX DRAWINGS DOUBLE VERTICAL
+    "\u2552":"+", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+    "\u2553":"+", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+    "\u2554":"+", // BOX DRAWINGS DOUBLE DOWN AND RIGHT
+    "\u2555":"+", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+    "\u2556":"+", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+    "\u2557":"+", // BOX DRAWINGS DOUBLE DOWN AND LEFT
+    "\u2558":"+", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+    "\u2559":"+", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+    "\u255A":"+", // BOX DRAWINGS DOUBLE UP AND RIGHT
+    "\u255B":"+", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+    "\u255C":"+", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+    "\u255D":"+", // BOX DRAWINGS DOUBLE UP AND LEFT
+    "\u255E":"+", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+    "\u255F":"+", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+    "\u2560":"+", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+    "\u2561":"+", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+    "\u2562":"+", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+    "\u2563":"+", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+    "\u2564":"+", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+    "\u2565":"+", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+    "\u2566":"+", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+    "\u2567":"+", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+    "\u2568":"+", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+    "\u2569":"+", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+    "\u256A":"+", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+    "\u256B":"+", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+    "\u256C":"+", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+    "\u256D":"+", // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+    "\u256E":"+", // BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+    "\u256F":"+", // BOX DRAWINGS LIGHT ARC UP AND LEFT
+    "\u2570":"+", // BOX DRAWINGS LIGHT ARC UP AND RIGHT
+    "\u2571":"/", // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+    "\u2572":"\\", // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+    "\u2573":"X", // BOX DRAWINGS LIGHT DIAGONAL CROSS
+    "\u257C":"-", // BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+    "\u257D":"|", // BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+    "\u257E":"-", // BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+    "\u257F":"|", // BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+    "\u25CB":"o", // WHITE CIRCLE
+    "\u25E6":"{\\textopenbullet}", // WHITE BULLET
+    "\u2605":"*", // BLACK STAR
+    "\u2606":"*", // WHITE STAR
+    "\u2612":"X", // BALLOT BOX WITH X
+    "\u2613":"X", // SALTIRE
+    "\u2639":":-(", // WHITE FROWNING FACE
+    "\u263A":":-)", // WHITE SMILING FACE
+    "\u263B":"(-:", // BLACK SMILING FACE
+    "\u266D":"b", // MUSIC FLAT SIGN
+    "\u266F":"$\\#$", // MUSIC SHARP SIGN
+    "\u2701":"$\\%<$", // UPPER BLADE SCISSORS
+    "\u2702":"$\\%<$", // BLACK SCISSORS
+    "\u2703":"$\\%<$", // LOWER BLADE SCISSORS
+    "\u2704":"$\\%<$", // WHITE SCISSORS
+    "\u270C":"V", // VICTORY HAND
+    "\u2713":"v", // CHECK MARK
+    "\u2714":"V", // HEAVY CHECK MARK
+    "\u2715":"x", // MULTIPLICATION X
+    "\u2716":"x", // HEAVY MULTIPLICATION X
+    "\u2717":"X", // BALLOT X
+    "\u2718":"X", // HEAVY BALLOT X
+    "\u2719":"+", // OUTLINED GREEK CROSS
+    "\u271A":"+", // HEAVY GREEK CROSS
+    "\u271B":"+", // OPEN CENTRE CROSS
+    "\u271C":"+", // HEAVY OPEN CENTRE CROSS
+    "\u271D":"+", // LATIN CROSS
+    "\u271E":"+", // SHADOWED WHITE LATIN CROSS
+    "\u271F":"+", // OUTLINED LATIN CROSS
+    "\u2720":"+", // MALTESE CROSS
+    "\u2721":"*", // STAR OF DAVID
+    "\u2722":"+", // FOUR TEARDROP-SPOKED ASTERISK
+    "\u2723":"+", // FOUR BALLOON-SPOKED ASTERISK
+    "\u2724":"+", // HEAVY FOUR BALLOON-SPOKED ASTERISK
+    "\u2725":"+", // FOUR CLUB-SPOKED ASTERISK
+    "\u2726":"+", // BLACK FOUR POINTED STAR
+    "\u2727":"+", // WHITE FOUR POINTED STAR
+    "\u2729":"*", // STRESS OUTLINED WHITE STAR
+    "\u272A":"*", // CIRCLED WHITE STAR
+    "\u272B":"*", // OPEN CENTRE BLACK STAR
+    "\u272C":"*", // BLACK CENTRE WHITE STAR
+    "\u272D":"*", // OUTLINED BLACK STAR
+    "\u272E":"*", // HEAVY OUTLINED BLACK STAR
+    "\u272F":"*", // PINWHEEL STAR
+    "\u2730":"*", // SHADOWED WHITE STAR
+    "\u2731":"*", // HEAVY ASTERISK
+    "\u2732":"*", // OPEN CENTRE ASTERISK
+    "\u2733":"*", // EIGHT SPOKED ASTERISK
+    "\u2734":"*", // EIGHT POINTED BLACK STAR
+    "\u2735":"*", // EIGHT POINTED PINWHEEL STAR
+    "\u2736":"*", // SIX POINTED BLACK STAR
+    "\u2737":"*", // EIGHT POINTED RECTILINEAR BLACK STAR
+    "\u2738":"*", // HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+    "\u2739":"*", // TWELVE POINTED BLACK STAR
+    "\u273A":"*", // SIXTEEN POINTED ASTERISK
+    "\u273B":"*", // TEARDROP-SPOKED ASTERISK
+    "\u273C":"*", // OPEN CENTRE TEARDROP-SPOKED ASTERISK
+    "\u273D":"*", // HEAVY TEARDROP-SPOKED ASTERISK
+    "\u273E":"*", // SIX PETALLED BLACK AND WHITE FLORETTE
+    "\u273F":"*", // BLACK FLORETTE
+    "\u2740":"*", // WHITE FLORETTE
+    "\u2741":"*", // EIGHT PETALLED OUTLINED BLACK FLORETTE
+    "\u2742":"*", // CIRCLED OPEN CENTRE EIGHT POINTED STAR
+    "\u2743":"*", // HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+    "\u2744":"*", // SNOWFLAKE
+    "\u2745":"*", // TIGHT TRIFOLIATE SNOWFLAKE
+    "\u2746":"*", // HEAVY CHEVRON SNOWFLAKE
+    "\u2747":"*", // SPARKLE
+    "\u2748":"*", // HEAVY SPARKLE
+    "\u2749":"*", // BALLOON-SPOKED ASTERISK
+    "\u274A":"*", // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+    "\u274B":"*", // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+    "\uFB00":"ff", // LATIN SMALL LIGATURE FF
+    "\uFB01":"fi", // LATIN SMALL LIGATURE FI
+    "\uFB02":"fl", // LATIN SMALL LIGATURE FL
+    "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI
+    "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL
+    "\uFB05":"st", // LATIN SMALL LIGATURE LONG S T
+    "\uFB06":"st", // LATIN SMALL LIGATURE ST
+/* Derived accented characters */
+    "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE
+    "\u00C1":"\\'{A}", // LATIN CAPITAL LETTER A WITH ACUTE
+    "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+    "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE
+    "\u00C4":"\\\"{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS
+    "\u00C5":"\\r{A}", // LATIN CAPITAL LETTER A WITH RING ABOVE
+    "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA
+    "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE
+    "\u00C9":"\\'{E}", // LATIN CAPITAL LETTER E WITH ACUTE
+    "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+    "\u00CB":"\\\"{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS
+    "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE
+    "\u00CD":"\\'{I}", // LATIN CAPITAL LETTER I WITH ACUTE
+    "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+    "\u00CF":"\\\"{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS
+    "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE
+    "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE
+    "\u00D3":"\\'{O}", // LATIN CAPITAL LETTER O WITH ACUTE
+    "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+    "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE
+    "\u00D6":"\\\"{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS
+    "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE
+    "\u00DA":"\\'{U}", // LATIN CAPITAL LETTER U WITH ACUTE
+    "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+    "\u00DC":"\\\"{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS
+    "\u00DD":"\\'{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE
+    "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE
+    "\u00E1":"\\'{a}", // LATIN SMALL LETTER A WITH ACUTE
+    "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX
+    "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE
+    "\u00E4":"\\\"{a}", // LATIN SMALL LETTER A WITH DIAERESIS
+    "\u00E5":"\\r{a}", // LATIN SMALL LETTER A WITH RING ABOVE
+    "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA
+    "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE
+    "\u00E9":"\\'{e}", // LATIN SMALL LETTER E WITH ACUTE
+    "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX
+    "\u00EB":"\\\"{e}", // LATIN SMALL LETTER E WITH DIAERESIS
+    "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE
+    "\u00ED":"\\'{i}", // LATIN SMALL LETTER I WITH ACUTE
+    "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX
+    "\u00EF":"\\\"{i}", // LATIN SMALL LETTER I WITH DIAERESIS
+    "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE
+    "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE
+    "\u00F3":"\\'{o}", // LATIN SMALL LETTER O WITH ACUTE
+    "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX
+    "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE
+    "\u00F6":"\\\"{o}", // LATIN SMALL LETTER O WITH DIAERESIS
+    "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE
+    "\u00FA":"\\'{u}", // LATIN SMALL LETTER U WITH ACUTE
+    "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX
+    "\u00FC":"\\\"{u}", // LATIN SMALL LETTER U WITH DIAERESIS
+    "\u00FD":"\\'{y}", // LATIN SMALL LETTER Y WITH ACUTE
+    "\u00FF":"\\\"{y}", // LATIN SMALL LETTER Y WITH DIAERESIS
+    "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON
+    "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON
+    "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE
+    "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE
+    "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK
+    "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK
+    "\u0106":"\\'{C}", // LATIN CAPITAL LETTER C WITH ACUTE
+    "\u0107":"\\'{c}", // LATIN SMALL LETTER C WITH ACUTE
+    "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+    "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX
+    "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE
+    "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE
+    "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON
+    "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON
+    "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON
+    "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON
+    "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON
+    "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON
+    "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE
+    "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE
+    "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE
+    "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE
+    "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK
+    "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK
+    "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON
+    "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON
+    "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+    "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX
+    "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE
+    "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE
+    "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE
+    "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE
+    "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA
+    "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA
+    "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+    "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX
+    "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE
+    "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE
+    "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON
+    "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON
+    "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE
+    "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE
+    "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK
+    "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK
+    "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE
+    "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+    "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX
+    "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA
+    "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA
+    "\u0139":"\\'{L}", // LATIN CAPITAL LETTER L WITH ACUTE
+    "\u013A":"\\'{l}", // LATIN SMALL LETTER L WITH ACUTE
+    "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA
+    "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
+    "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
+    "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON
+    "\u0141":"\\L{}", //LATIN CAPITAL LETTER L WITH STROKE
+    "\u0142":"\\l{}", //LATIN SMALL LETTER L WITH STROKE
+    "\u0143":"\\'{N}", // LATIN CAPITAL LETTER N WITH ACUTE
+    "\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE
+    "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
+    "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA
+    "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON
+    "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON
+    "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON
+    "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON
+    "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE
+    "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE
+    "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+    "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
+    "\u0154":"\\'{R}", // LATIN CAPITAL LETTER R WITH ACUTE
+    "\u0155":"\\'{r}", // LATIN SMALL LETTER R WITH ACUTE
+    "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA
+    "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA
+    "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON
+    "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON
+    "\u015A":"\\'{S}", // LATIN CAPITAL LETTER S WITH ACUTE
+    "\u015B":"\\'{s}", // LATIN SMALL LETTER S WITH ACUTE
+    "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+    "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX
+    "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA
+    "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA
+    "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON
+    "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON
+    "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA
+    "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA
+    "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON
+    "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON
+    "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE
+    "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE
+    "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON
+    "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON
+    "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE
+    "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE
+    "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+    "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
+    "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK
+    "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK
+    "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+    "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX
+    "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+    "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
+    "\u0178":"\\\"{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS
+    "\u0179":"\\'{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE
+    "\u017A":"\\'{z}", // LATIN SMALL LETTER Z WITH ACUTE
+    "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
+    "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE
+    "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON
+    "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON
+    "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON
+    "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON
+    "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON
+    "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON
+    "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON
+    "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON
+    "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON
+    "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON
+    "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON
+    "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON
+    "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON
+    "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON
+    "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK
+    "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK
+    "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON
+    "\u01F4":"\\'{G}", // LATIN CAPITAL LETTER G WITH ACUTE
+    "\u01F5":"\\'{g}", // LATIN SMALL LETTER G WITH ACUTE
+    "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE
+    "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE
+    "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW
+    "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW
+    "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW
+    "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW
+    "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE
+    "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE
+    "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW
+    "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW
+    "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW
+    "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW
+    "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA
+    "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA
+    "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE
+    "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE
+    "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON
+    "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON
+    "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE
+    "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE
+    "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW
+    "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW
+    "\u1E26":"\\\"{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS
+    "\u1E27":"\\\"{h}", // LATIN SMALL LETTER H WITH DIAERESIS
+    "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA
+    "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA
+    "\u1E30":"\\'{K}", // LATIN CAPITAL LETTER K WITH ACUTE
+    "\u1E31":"\\'{k}", // LATIN SMALL LETTER K WITH ACUTE
+    "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW
+    "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW
+    "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW
+    "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW
+    "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW
+    "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW
+    "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW
+    "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW
+    "\u1E3E":"\\'{M}", // LATIN CAPITAL LETTER M WITH ACUTE
+    "\u1E3F":"\\'{m}", // LATIN SMALL LETTER M WITH ACUTE
+    "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE
+    "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE
+    "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW
+    "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW
+    "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE
+    "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE
+    "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW
+    "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW
+    "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW
+    "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW
+    "\u1E54":"\\'{P}", // LATIN CAPITAL LETTER P WITH ACUTE
+    "\u1E55":"\\'{p}", // LATIN SMALL LETTER P WITH ACUTE
+    "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE
+    "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE
+    "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE
+    "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE
+    "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW
+    "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW
+    "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW
+    "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW
+    "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE
+    "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE
+    "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW
+    "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW
+    "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE
+    "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE
+    "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW
+    "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW
+    "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW
+    "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW
+    "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE
+    "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE
+    "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW
+    "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW
+    "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE
+    "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE
+    "\u1E82":"\\'{W}", // LATIN CAPITAL LETTER W WITH ACUTE
+    "\u1E83":"\\'{w}", // LATIN SMALL LETTER W WITH ACUTE
+    "\u1E84":"\\\"{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS
+    "\u1E85":"\\\"{w}", // LATIN SMALL LETTER W WITH DIAERESIS
+    "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE
+    "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE
+    "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW
+    "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW
+    "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE
+    "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE
+    "\u1E8C":"\\\"{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS
+    "\u1E8D":"\\\"{x}", // LATIN SMALL LETTER X WITH DIAERESIS
+    "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
+    "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE
+    "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+    "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
+    "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW
+    "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW
+    "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW
+    "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW
+    "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW
+    "\u1E97":"\\\"{t}", // LATIN SMALL LETTER T WITH DIAERESIS
+    "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW
+    "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW
+    "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW
+    "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW
+    "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE
+    "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE
+    "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW
+    "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW
+    "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW
+    "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW
+    "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW
+    "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW
+    "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE
+    "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE
+    "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
+    "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
+    "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
+    "\u1EF9":"\\~{y}" // LATIN SMALL LETTER Y WITH TILDE
+};
+
+/* 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
+    "\\r{A}"                          : "\u00C5", // LATIN CAPITAL LETTER A WITH RING ABOVE
+    "\\c{C}"                          : "\u00C7", // LATIN CAPITAL LETTER C WITH CEDILLA
+    "\\`{E}"                          : "\u00C8", // LATIN CAPITAL LETTER E WITH GRAVE
+    "\\'{E}"                          : "\u00C9", // LATIN CAPITAL LETTER E WITH ACUTE
+    "\\^{E}"                          : "\u00CA", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+    "\\\"{E}"                         : "\u00CB", // LATIN CAPITAL LETTER E WITH DIAERESIS
+    "\\`{I}"                          : "\u00CC", // LATIN CAPITAL LETTER I WITH GRAVE
+    "\\'{I}"                          : "\u00CD", // LATIN CAPITAL LETTER I WITH ACUTE
+    "\\^{I}"                          : "\u00CE", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+    "\\\"{I}"                         : "\u00CF", // LATIN CAPITAL LETTER I WITH DIAERESIS
+    "\\~{N}"                          : "\u00D1", // LATIN CAPITAL LETTER N WITH TILDE
+    "\\`{O}"                          : "\u00D2", // LATIN CAPITAL LETTER O WITH GRAVE
+    "\\'{O}"                          : "\u00D3", // LATIN CAPITAL LETTER O WITH ACUTE
+    "\\^{O}"                          : "\u00D4", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+    "\\~{O}"                          : "\u00D5", // LATIN CAPITAL LETTER O WITH TILDE
+    "\\\"{O}"                         : "\u00D6", // LATIN CAPITAL LETTER O WITH DIAERESIS
+    "\\`{U}"                          : "\u00D9", // LATIN CAPITAL LETTER U WITH GRAVE
+    "\\'{U}"                          : "\u00DA", // LATIN CAPITAL LETTER U WITH ACUTE
+    "\\^{U}"                          : "\u00DB", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+    "\\\"{U}"                         : "\u00DC", // LATIN CAPITAL LETTER U WITH DIAERESIS
+    "\\'{Y}"                          : "\u00DD", // LATIN CAPITAL LETTER Y WITH ACUTE
+    "\\`{a}"                          : "\u00E0", // LATIN SMALL LETTER A WITH GRAVE
+    "\\'{a}"                          : "\u00E1", // LATIN SMALL LETTER A WITH ACUTE
+    "\\^{a}"                          : "\u00E2", // LATIN SMALL LETTER A WITH CIRCUMFLEX
+    "\\~{a}"                          : "\u00E3", // LATIN SMALL LETTER A WITH TILDE
+    "\\\"{a}"                         : "\u00E4", // LATIN SMALL LETTER A WITH DIAERESIS
+    "\\r{a}"                          : "\u00E5", // LATIN SMALL LETTER A WITH RING ABOVE
+    "\\c{c}"                          : "\u00E7", // LATIN SMALL LETTER C WITH CEDILLA
+    "\\`{e}"                          : "\u00E8", // LATIN SMALL LETTER E WITH GRAVE
+    "\\'{e}"                          : "\u00E9", // LATIN SMALL LETTER E WITH ACUTE
+    "\\^{e}"                          : "\u00EA", // LATIN SMALL LETTER E WITH CIRCUMFLEX
+    "\\\"{e}"                         : "\u00EB", // LATIN SMALL LETTER E WITH DIAERESIS
+    "\\`{i}"                          : "\u00EC", // LATIN SMALL LETTER I WITH GRAVE
+    "\\'{i}"                          : "\u00ED", // LATIN SMALL LETTER I WITH ACUTE
+    "\\^{i}"                          : "\u00EE", // LATIN SMALL LETTER I WITH CIRCUMFLEX
+    "\\\"{i}"                         : "\u00EF", // LATIN SMALL LETTER I WITH DIAERESIS
+    "\\~{n}"                          : "\u00F1", // LATIN SMALL LETTER N WITH TILDE
+    "\\`{o}"                          : "\u00F2", // LATIN SMALL LETTER O WITH GRAVE
+    "\\'{o}"                          : "\u00F3", // LATIN SMALL LETTER O WITH ACUTE
+    "\\^{o}"                          : "\u00F4", // LATIN SMALL LETTER O WITH CIRCUMFLEX
+    "\\~{o}"                          : "\u00F5", // LATIN SMALL LETTER O WITH TILDE
+    "\\\"{o}"                         : "\u00F6", // LATIN SMALL LETTER O WITH DIAERESIS
+    "\\`{u}"                          : "\u00F9", // LATIN SMALL LETTER U WITH GRAVE
+    "\\'{u}"                          : "\u00FA", // LATIN SMALL LETTER U WITH ACUTE
+    "\\^{u}"                          : "\u00FB", // LATIN SMALL LETTER U WITH CIRCUMFLEX
+    "\\\"{u}"                         : "\u00FC", // LATIN SMALL LETTER U WITH DIAERESIS
+    "\\'{y}"                          : "\u00FD", // LATIN SMALL LETTER Y WITH ACUTE
+    "\\\"{y}"                         : "\u00FF", // LATIN SMALL LETTER Y WITH DIAERESIS
+    "\\={A}"                          : "\u0100", // LATIN CAPITAL LETTER A WITH MACRON
+    "\\={a}"                          : "\u0101", // LATIN SMALL LETTER A WITH MACRON
+    "\\u{A}"                          : "\u0102", // LATIN CAPITAL LETTER A WITH BREVE
+    "\\u{a}"                          : "\u0103", // LATIN SMALL LETTER A WITH BREVE
+    "\\k{A}"                          : "\u0104", // LATIN CAPITAL LETTER A WITH OGONEK
+    "\\k{a}"                          : "\u0105", // LATIN SMALL LETTER A WITH OGONEK
+    "\\'{C}"                          : "\u0106", // LATIN CAPITAL LETTER C WITH ACUTE
+    "\\'{c}"                          : "\u0107", // LATIN SMALL LETTER C WITH ACUTE
+    "\\^{C}"                          : "\u0108", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+    "\\^{c}"                          : "\u0109", // LATIN SMALL LETTER C WITH CIRCUMFLEX
+    "\\.{C}"                          : "\u010A", // LATIN CAPITAL LETTER C WITH DOT ABOVE
+    "\\.{c}"                          : "\u010B", // LATIN SMALL LETTER C WITH DOT ABOVE
+    "\\v{C}"                          : "\u010C", // LATIN CAPITAL LETTER C WITH CARON
+    "\\v{c}"                          : "\u010D", // LATIN SMALL LETTER C WITH CARON
+    "\\v{D}"                          : "\u010E", // LATIN CAPITAL LETTER D WITH CARON
+    "\\v{d}"                          : "\u010F", // LATIN SMALL LETTER D WITH CARON
+    "\\={E}"                          : "\u0112", // LATIN CAPITAL LETTER E WITH MACRON
+    "\\={e}"                          : "\u0113", // LATIN SMALL LETTER E WITH MACRON
+    "\\u{E}"                          : "\u0114", // LATIN CAPITAL LETTER E WITH BREVE
+    "\\u{e}"                          : "\u0115", // LATIN SMALL LETTER E WITH BREVE
+    "\\.{E}"                          : "\u0116", // LATIN CAPITAL LETTER E WITH DOT ABOVE
+    "\\.{e}"                          : "\u0117", // LATIN SMALL LETTER E WITH DOT ABOVE
+    "\\k{E}"                          : "\u0118", // LATIN CAPITAL LETTER E WITH OGONEK
+    "\\k{e}"                          : "\u0119", // LATIN SMALL LETTER E WITH OGONEK
+    "\\v{E}"                          : "\u011A", // LATIN CAPITAL LETTER E WITH CARON
+    "\\v{e}"                          : "\u011B", // LATIN SMALL LETTER E WITH CARON
+    "\\^{G}"                          : "\u011C", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+    "\\^{g}"                          : "\u011D", // LATIN SMALL LETTER G WITH CIRCUMFLEX
+    "\\u{G}"                          : "\u011E", // LATIN CAPITAL LETTER G WITH BREVE
+    "\\u{g}"                          : "\u011F", // LATIN SMALL LETTER G WITH BREVE
+    "\\.{G}"                          : "\u0120", // LATIN CAPITAL LETTER G WITH DOT ABOVE
+    "\\.{g}"                          : "\u0121", // LATIN SMALL LETTER G WITH DOT ABOVE
+    "\\c{G}"                          : "\u0122", // LATIN CAPITAL LETTER G WITH CEDILLA
+    "\\c{g}"                          : "\u0123", // LATIN SMALL LETTER G WITH CEDILLA
+    "\\^{H}"                          : "\u0124", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+    "\\^{h}"                          : "\u0125", // LATIN SMALL LETTER H WITH CIRCUMFLEX
+    "\\~{I}"                          : "\u0128", // LATIN CAPITAL LETTER I WITH TILDE
+    "\\~{i}"                          : "\u0129", // LATIN SMALL LETTER I WITH TILDE
+    "\\={I}"                          : "\u012A", // LATIN CAPITAL LETTER I WITH MACRON
+    "\\={i}"                          : "\u012B", // LATIN SMALL LETTER I WITH MACRON
+    "\\u{I}"                          : "\u012C", // LATIN CAPITAL LETTER I WITH BREVE
+    "\\u{i}"                          : "\u012D", // LATIN SMALL LETTER I WITH BREVE
+    "\\k{I}"                          : "\u012E", // LATIN CAPITAL LETTER I WITH OGONEK
+    "\\k{i}"                          : "\u012F", // LATIN SMALL LETTER I WITH OGONEK
+    "\\.{I}"                          : "\u0130", // LATIN CAPITAL LETTER I WITH DOT ABOVE
+    "\\^{J}"                          : "\u0134", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+    "\\^{j}"                          : "\u0135", // LATIN SMALL LETTER J WITH CIRCUMFLEX
+    "\\c{K}"                          : "\u0136", // LATIN CAPITAL LETTER K WITH CEDILLA
+    "\\c{k}"                          : "\u0137", // LATIN SMALL LETTER K WITH CEDILLA
+    "\\'{L}"                          : "\u0139", // LATIN CAPITAL LETTER L WITH ACUTE
+    "\\'{l}"                          : "\u013A", // LATIN SMALL LETTER L WITH ACUTE
+    "\\c{L}"                          : "\u013B", // LATIN CAPITAL LETTER L WITH CEDILLA
+    "\\c{l}"                          : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA
+    "\\v{L}"                          : "\u013D", // LATIN CAPITAL LETTER L WITH CARON
+    "\\v{l}"                          : "\u013E", // LATIN SMALL LETTER L WITH CARON
+    "\\L{}"                           : "\u0141", //LATIN CAPITAL LETTER L WITH STROKE
+    "\\l{}"                           : "\u0142", //LATIN SMALL LETTER L WITH STROKE
+    "\\'{N}"                          : "\u0143", // LATIN CAPITAL LETTER N WITH ACUTE
+    "\\'{n}"                          : "\u0144", // LATIN SMALL LETTER N WITH ACUTE
+    "\\c{N}"                          : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA
+    "\\c{n}"                          : "\u0146", // LATIN SMALL LETTER N WITH CEDILLA
+    "\\v{N}"                          : "\u0147", // LATIN CAPITAL LETTER N WITH CARON
+    "\\v{n}"                          : "\u0148", // LATIN SMALL LETTER N WITH CARON
+    "\\={O}"                          : "\u014C", // LATIN CAPITAL LETTER O WITH MACRON
+    "\\={o}"                          : "\u014D", // LATIN SMALL LETTER O WITH MACRON
+    "\\u{O}"                          : "\u014E", // LATIN CAPITAL LETTER O WITH BREVE
+    "\\u{o}"                          : "\u014F", // LATIN SMALL LETTER O WITH BREVE
+    "\\H{O}"                          : "\u0150", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+    "\\H{o}"                          : "\u0151", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
+    "\\'{R}"                          : "\u0154", // LATIN CAPITAL LETTER R WITH ACUTE
+    "\\'{r}"                          : "\u0155", // LATIN SMALL LETTER R WITH ACUTE
+    "\\c{R}"                          : "\u0156", // LATIN CAPITAL LETTER R WITH CEDILLA
+    "\\c{r}"                          : "\u0157", // LATIN SMALL LETTER R WITH CEDILLA
+    "\\v{R}"                          : "\u0158", // LATIN CAPITAL LETTER R WITH CARON
+    "\\v{r}"                          : "\u0159", // LATIN SMALL LETTER R WITH CARON
+    "\\'{S}"                          : "\u015A", // LATIN CAPITAL LETTER S WITH ACUTE
+    "\\'{s}"                          : "\u015B", // LATIN SMALL LETTER S WITH ACUTE
+    "\\^{S}"                          : "\u015C", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+    "\\^{s}"                          : "\u015D", // LATIN SMALL LETTER S WITH CIRCUMFLEX
+    "\\c{S}"                          : "\u015E", // LATIN CAPITAL LETTER S WITH CEDILLA
+    "\\c{s}"                          : "\u015F", // LATIN SMALL LETTER S WITH CEDILLA
+    "\\v{S}"                          : "\u0160", // LATIN CAPITAL LETTER S WITH CARON
+    "\\v{s}"                          : "\u0161", // LATIN SMALL LETTER S WITH CARON
+    "\\c{T}"                          : "\u0162", // LATIN CAPITAL LETTER T WITH CEDILLA
+    "\\c{t}"                          : "\u0163", // LATIN SMALL LETTER T WITH CEDILLA
+    "\\v{T}"                          : "\u0164", // LATIN CAPITAL LETTER T WITH CARON
+    "\\v{t}"                          : "\u0165", // LATIN SMALL LETTER T WITH CARON
+    "\\~{U}"                          : "\u0168", // LATIN CAPITAL LETTER U WITH TILDE
+    "\\~{u}"                          : "\u0169", // LATIN SMALL LETTER U WITH TILDE
+    "\\={U}"                          : "\u016A", // LATIN CAPITAL LETTER U WITH MACRON
+    "\\={u}"                          : "\u016B", // LATIN SMALL LETTER U WITH MACRON
+    "\\u{U}"                          : "\u016C", // LATIN CAPITAL LETTER U WITH BREVE
+    "\\u{u}"                          : "\u016D", // LATIN SMALL LETTER U WITH BREVE
+    "\\H{U}"                          : "\u0170", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+    "\\H{u}"                          : "\u0171", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
+    "\\k{U}"                          : "\u0172", // LATIN CAPITAL LETTER U WITH OGONEK
+    "\\k{u}"                          : "\u0173", // LATIN SMALL LETTER U WITH OGONEK
+    "\\^{W}"                          : "\u0174", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+    "\\^{w}"                          : "\u0175", // LATIN SMALL LETTER W WITH CIRCUMFLEX
+    "\\^{Y}"                          : "\u0176", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+    "\\^{y}"                          : "\u0177", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
+    "\\\"{Y}"                         : "\u0178", // LATIN CAPITAL LETTER Y WITH DIAERESIS
+    "\\'{Z}"                          : "\u0179", // LATIN CAPITAL LETTER Z WITH ACUTE
+    "\\'{z}"                          : "\u017A", // LATIN SMALL LETTER Z WITH ACUTE
+    "\\.{Z}"                          : "\u017B", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
+    "\\.{z}"                          : "\u017C", // LATIN SMALL LETTER Z WITH DOT ABOVE
+    "\\v{Z}"                          : "\u017D", // LATIN CAPITAL LETTER Z WITH CARON
+    "\\v{z}"                          : "\u017E", // LATIN SMALL LETTER Z WITH CARON
+    "\\v{A}"                          : "\u01CD", // LATIN CAPITAL LETTER A WITH CARON
+    "\\v{a}"                          : "\u01CE", // LATIN SMALL LETTER A WITH CARON
+    "\\v{I}"                          : "\u01CF", // LATIN CAPITAL LETTER I WITH CARON
+    "\\v{i}"                          : "\u01D0", // LATIN SMALL LETTER I WITH CARON
+    "\\v{O}"                          : "\u01D1", // LATIN CAPITAL LETTER O WITH CARON
+    "\\v{o}"                          : "\u01D2", // LATIN SMALL LETTER O WITH CARON
+    "\\v{U}"                          : "\u01D3", // LATIN CAPITAL LETTER U WITH CARON
+    "\\v{u}"                          : "\u01D4", // LATIN SMALL LETTER U WITH CARON
+    "\\v{G}"                          : "\u01E6", // LATIN CAPITAL LETTER G WITH CARON
+    "\\v{g}"                          : "\u01E7", // LATIN SMALL LETTER G WITH CARON
+    "\\v{K}"                          : "\u01E8", // LATIN CAPITAL LETTER K WITH CARON
+    "\\v{k}"                          : "\u01E9", // LATIN SMALL LETTER K WITH CARON
+    "\\k{O}"                          : "\u01EA", // LATIN CAPITAL LETTER O WITH OGONEK
+    "\\k{o}"                          : "\u01EB", // LATIN SMALL LETTER O WITH OGONEK
+    "\\v{j}"                          : "\u01F0", // LATIN SMALL LETTER J WITH CARON
+    "\\'{G}"                          : "\u01F4", // LATIN CAPITAL LETTER G WITH ACUTE
+    "\\'{g}"                          : "\u01F5", // LATIN SMALL LETTER G WITH ACUTE
+    "\\.{B}"                          : "\u1E02", // LATIN CAPITAL LETTER B WITH DOT ABOVE
+    "\\.{b}"                          : "\u1E03", // LATIN SMALL LETTER B WITH DOT ABOVE
+    "\\d{B}"                          : "\u1E04", // LATIN CAPITAL LETTER B WITH DOT BELOW
+    "\\d{b}"                          : "\u1E05", // LATIN SMALL LETTER B WITH DOT BELOW
+    "\\b{B}"                          : "\u1E06", // LATIN CAPITAL LETTER B WITH LINE BELOW
+    "\\b{b}"                          : "\u1E07", // LATIN SMALL LETTER B WITH LINE BELOW
+    "\\.{D}"                          : "\u1E0A", // LATIN CAPITAL LETTER D WITH DOT ABOVE
+    "\\.{d}"                          : "\u1E0B", // LATIN SMALL LETTER D WITH DOT ABOVE
+    "\\d{D}"                          : "\u1E0C", // LATIN CAPITAL LETTER D WITH DOT BELOW
+    "\\d{d}"                          : "\u1E0D", // LATIN SMALL LETTER D WITH DOT BELOW
+    "\\b{D}"                          : "\u1E0E", // LATIN CAPITAL LETTER D WITH LINE BELOW
+    "\\b{d}"                          : "\u1E0F", // LATIN SMALL LETTER D WITH LINE BELOW
+    "\\c{D}"                          : "\u1E10", // LATIN CAPITAL LETTER D WITH CEDILLA
+    "\\c{d}"                          : "\u1E11", // LATIN SMALL LETTER D WITH CEDILLA
+    "\\.{F}"                          : "\u1E1E", // LATIN CAPITAL LETTER F WITH DOT ABOVE
+    "\\.{f}"                          : "\u1E1F", // LATIN SMALL LETTER F WITH DOT ABOVE
+    "\\={G}"                          : "\u1E20", // LATIN CAPITAL LETTER G WITH MACRON
+    "\\={g}"                          : "\u1E21", // LATIN SMALL LETTER G WITH MACRON
+    "\\.{H}"                          : "\u1E22", // LATIN CAPITAL LETTER H WITH DOT ABOVE
+    "\\.{h}"                          : "\u1E23", // LATIN SMALL LETTER H WITH DOT ABOVE
+    "\\d{H}"                          : "\u1E24", // LATIN CAPITAL LETTER H WITH DOT BELOW
+    "\\d{h}"                          : "\u1E25", // LATIN SMALL LETTER H WITH DOT BELOW
+    "\\\"{H}"                         : "\u1E26", // LATIN CAPITAL LETTER H WITH DIAERESIS
+    "\\\"{h}"                         : "\u1E27", // LATIN SMALL LETTER H WITH DIAERESIS
+    "\\c{H}"                          : "\u1E28", // LATIN CAPITAL LETTER H WITH CEDILLA
+    "\\c{h}"                          : "\u1E29", // LATIN SMALL LETTER H WITH CEDILLA
+    "\\'{K}"                          : "\u1E30", // LATIN CAPITAL LETTER K WITH ACUTE
+    "\\'{k}"                          : "\u1E31", // LATIN SMALL LETTER K WITH ACUTE
+    "\\d{K}"                          : "\u1E32", // LATIN CAPITAL LETTER K WITH DOT BELOW
+    "\\d{k}"                          : "\u1E33", // LATIN SMALL LETTER K WITH DOT BELOW
+    "\\b{K}"                          : "\u1E34", // LATIN CAPITAL LETTER K WITH LINE BELOW
+    "\\b{k}"                          : "\u1E35", // LATIN SMALL LETTER K WITH LINE BELOW
+    "\\d{L}"                          : "\u1E36", // LATIN CAPITAL LETTER L WITH DOT BELOW
+    "\\d{l}"                          : "\u1E37", // LATIN SMALL LETTER L WITH DOT BELOW
+    "\\b{L}"                          : "\u1E3A", // LATIN CAPITAL LETTER L WITH LINE BELOW
+    "\\b{l}"                          : "\u1E3B", // LATIN SMALL LETTER L WITH LINE BELOW
+    "\\'{M}"                          : "\u1E3E", // LATIN CAPITAL LETTER M WITH ACUTE
+    "\\'{m}"                          : "\u1E3F", // LATIN SMALL LETTER M WITH ACUTE
+    "\\.{M}"                          : "\u1E40", // LATIN CAPITAL LETTER M WITH DOT ABOVE
+    "\\.{m}"                          : "\u1E41", // LATIN SMALL LETTER M WITH DOT ABOVE
+    "\\d{M}"                          : "\u1E42", // LATIN CAPITAL LETTER M WITH DOT BELOW
+    "\\d{m}"                          : "\u1E43", // LATIN SMALL LETTER M WITH DOT BELOW
+    "\\.{N}"                          : "\u1E44", // LATIN CAPITAL LETTER N WITH DOT ABOVE
+    "\\.{n}"                          : "\u1E45", // LATIN SMALL LETTER N WITH DOT ABOVE
+    "\\d{N}"                          : "\u1E46", // LATIN CAPITAL LETTER N WITH DOT BELOW
+    "\\d{n}"                          : "\u1E47", // LATIN SMALL LETTER N WITH DOT BELOW
+    "\\b{N}"                          : "\u1E48", // LATIN CAPITAL LETTER N WITH LINE BELOW
+    "\\b{n}"                          : "\u1E49", // LATIN SMALL LETTER N WITH LINE BELOW
+    "\\'{P}"                          : "\u1E54", // LATIN CAPITAL LETTER P WITH ACUTE
+    "\\'{p}"                          : "\u1E55", // LATIN SMALL LETTER P WITH ACUTE
+    "\\.{P}"                          : "\u1E56", // LATIN CAPITAL LETTER P WITH DOT ABOVE
+    "\\.{p}"                          : "\u1E57", // LATIN SMALL LETTER P WITH DOT ABOVE
+    "\\.{R}"                          : "\u1E58", // LATIN CAPITAL LETTER R WITH DOT ABOVE
+    "\\.{r}"                          : "\u1E59", // LATIN SMALL LETTER R WITH DOT ABOVE
+    "\\d{R}"                          : "\u1E5A", // LATIN CAPITAL LETTER R WITH DOT BELOW
+    "\\d{r}"                          : "\u1E5B", // LATIN SMALL LETTER R WITH DOT BELOW
+    "\\b{R}"                          : "\u1E5E", // LATIN CAPITAL LETTER R WITH LINE BELOW
+    "\\b{r}"                          : "\u1E5F", // LATIN SMALL LETTER R WITH LINE BELOW
+    "\\.{S}"                          : "\u1E60", // LATIN CAPITAL LETTER S WITH DOT ABOVE
+    "\\.{s}"                          : "\u1E61", // LATIN SMALL LETTER S WITH DOT ABOVE
+    "\\d{S}"                          : "\u1E62", // LATIN CAPITAL LETTER S WITH DOT BELOW
+    "\\d{s}"                          : "\u1E63", // LATIN SMALL LETTER S WITH DOT BELOW
+    "\\.{T}"                          : "\u1E6A", // LATIN CAPITAL LETTER T WITH DOT ABOVE
+    "\\.{t}"                          : "\u1E6B", // LATIN SMALL LETTER T WITH DOT ABOVE
+    "\\d{T}"                          : "\u1E6C", // LATIN CAPITAL LETTER T WITH DOT BELOW
+    "\\d{t}"                          : "\u1E6D", // LATIN SMALL LETTER T WITH DOT BELOW
+    "\\b{T}"                          : "\u1E6E", // LATIN CAPITAL LETTER T WITH LINE BELOW
+    "\\b{t}"                          : "\u1E6F", // LATIN SMALL LETTER T WITH LINE BELOW
+    "\\~{V}"                          : "\u1E7C", // LATIN CAPITAL LETTER V WITH TILDE
+    "\\~{v}"                          : "\u1E7D", // LATIN SMALL LETTER V WITH TILDE
+    "\\d{V}"                          : "\u1E7E", // LATIN CAPITAL LETTER V WITH DOT BELOW
+    "\\d{v}"                          : "\u1E7F", // LATIN SMALL LETTER V WITH DOT BELOW
+    "\\`{W}"                          : "\u1E80", // LATIN CAPITAL LETTER W WITH GRAVE
+    "\\`{w}"                          : "\u1E81", // LATIN SMALL LETTER W WITH GRAVE
+    "\\'{W}"                          : "\u1E82", // LATIN CAPITAL LETTER W WITH ACUTE
+    "\\'{w}"                          : "\u1E83", // LATIN SMALL LETTER W WITH ACUTE
+    "\\\"{W}"                         : "\u1E84", // LATIN CAPITAL LETTER W WITH DIAERESIS
+    "\\\"{w}"                         : "\u1E85", // LATIN SMALL LETTER W WITH DIAERESIS
+    "\\.{W}"                          : "\u1E86", // LATIN CAPITAL LETTER W WITH DOT ABOVE
+    "\\.{w}"                          : "\u1E87", // LATIN SMALL LETTER W WITH DOT ABOVE
+    "\\d{W}"                          : "\u1E88", // LATIN CAPITAL LETTER W WITH DOT BELOW
+    "\\d{w}"                          : "\u1E89", // LATIN SMALL LETTER W WITH DOT BELOW
+    "\\.{X}"                          : "\u1E8A", // LATIN CAPITAL LETTER X WITH DOT ABOVE
+    "\\.{x}"                          : "\u1E8B", // LATIN SMALL LETTER X WITH DOT ABOVE
+    "\\\"{X}"                         : "\u1E8C", // LATIN CAPITAL LETTER X WITH DIAERESIS
+    "\\\"{x}"                         : "\u1E8D", // LATIN SMALL LETTER X WITH DIAERESIS
+    "\\.{Y}"                          : "\u1E8E", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
+    "\\.{y}"                          : "\u1E8F", // LATIN SMALL LETTER Y WITH DOT ABOVE
+    "\\^{Z}"                          : "\u1E90", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+    "\\^{z}"                          : "\u1E91", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
+    "\\d{Z}"                          : "\u1E92", // LATIN CAPITAL LETTER Z WITH DOT BELOW
+    "\\d{z}"                          : "\u1E93", // LATIN SMALL LETTER Z WITH DOT BELOW
+    "\\b{Z}"                          : "\u1E94", // LATIN CAPITAL LETTER Z WITH LINE BELOW
+    "\\b{z}"                          : "\u1E95", // LATIN SMALL LETTER Z WITH LINE BELOW
+    "\\b{h}"                          : "\u1E96", // LATIN SMALL LETTER H WITH LINE BELOW
+    "\\\"{t}"                         : "\u1E97", // LATIN SMALL LETTER T WITH DIAERESIS
+    "\\d{A}"                          : "\u1EA0", // LATIN CAPITAL LETTER A WITH DOT BELOW
+    "\\d{a}"                          : "\u1EA1", // LATIN SMALL LETTER A WITH DOT BELOW
+    "\\d{E}"                          : "\u1EB8", // LATIN CAPITAL LETTER E WITH DOT BELOW
+    "\\d{e}"                          : "\u1EB9", // LATIN SMALL LETTER E WITH DOT BELOW
+    "\\~{E}"                          : "\u1EBC", // LATIN CAPITAL LETTER E WITH TILDE
+    "\\~{e}"                          : "\u1EBD", // LATIN SMALL LETTER E WITH TILDE
+    "\\d{I}"                          : "\u1ECA", // LATIN CAPITAL LETTER I WITH DOT BELOW
+    "\\d{i}"                          : "\u1ECB", // LATIN SMALL LETTER I WITH DOT BELOW
+    "\\d{O}"                          : "\u1ECC", // LATIN CAPITAL LETTER O WITH DOT BELOW
+    "\\d{o}"                          : "\u1ECD", // LATIN SMALL LETTER O WITH DOT BELOW
+    "\\d{U}"                          : "\u1EE4", // LATIN CAPITAL LETTER U WITH DOT BELOW
+    "\\d{u}"                          : "\u1EE5", // LATIN SMALL LETTER U WITH DOT BELOW
+    "\\`{Y}"                          : "\u1EF2", // LATIN CAPITAL LETTER Y WITH GRAVE
+    "\\`{y}"                          : "\u1EF3", // LATIN SMALL LETTER Y WITH GRAVE
+    "\\d{Y}"                          : "\u1EF4", // LATIN CAPITAL LETTER Y WITH DOT BELOW
+    "\\d{y}"                          : "\u1EF5", // LATIN SMALL LETTER Y WITH DOT BELOW
+    "\\~{Y}"                          : "\u1EF8", // LATIN CAPITAL LETTER Y WITH TILDE
+    "\\~{y}"                          : "\u1EF9" // LATIN SMALL LETTER Y WITH TILDE
+};
+
+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) {
+			// skip empty names
+			if (Zotero.Utilities.trim(name) == '') {
+				continue;
+			}
+			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") {
+		if (item.itemType == "book" || item.itemType == "thesis" || item.itemType == "manuscript") {
+			item.numPages = value;
+		}
+		else {
+			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") {
+		for each(var attachment in value.split(";")){
+			var [filetitle, filepath, filetype] = attachment.split(":");
+			if (filetitle.length == 0) {
+				filetitle = "Attachment";
+			}
+			if (filetype.match(/pdf/i)) {
+				item.attachments.push({url:"file://"+filepath, mimeType:"application/pdf", title:filetitle, downloadable:true});
+			} else {
+				item.attachments.push({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(/[{}]/g, "");
+			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 && typeof value != "number") 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") || (field == "doi") | (field == "file"))) {
+		// 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&&field != "pages") 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] : "?");
+}
+
+// a little substitution function for BibTeX keys, where we don't want LaTeX 
+// escaping, but we do want to preserve the base characters
+
+function tidyAccents(s) {
+                        var r=s.toLowerCase();
+                        r = r.replace(new RegExp("[ä]", 'g'),"ae");
+                        r = r.replace(new RegExp("[ö]", 'g'),"ae");
+                        r = r.replace(new RegExp("[ü]", 'g'),"ue");
+                        r = r.replace(new RegExp("[àáâãå]", 'g'),"a");
+                        r = r.replace(new RegExp("æ", 'g'),"ae");
+                        r = r.replace(new RegExp("ç", 'g'),"c");
+                        r = r.replace(new RegExp("[èéêë]", 'g'),"e");
+                        r = r.replace(new RegExp("[ìíîï]", 'g'),"i");
+                        r = r.replace(new RegExp("ñ", 'g'),"n");                            
+                        r = r.replace(new RegExp("[òóôõ]", 'g'),"o");
+                        r = r.replace(new RegExp("œ", 'g'),"oe");
+                        r = r.replace(new RegExp("[ùúû]", 'g'),"u");
+                        r = r.replace(new RegExp("[ýÿ]", 'g'),"y");
+                        return r;
+                };
+
+var numberRe = /^[0-9]+/;
+// Below is a list of words that should not appear as part of the citation key
+// in includes the indefinite articles of English, German, French and Spanish, as well as a small set of English prepositions whose 
+// force is more grammatical than lexical, i.e. which are likely to strike many as 'insignificant'.
+// The assumption is that most who want a title word in their key would prefer the first word of significance.
+var citeKeyTitleBannedRe = /\b(a|an|the|some|from|on|in|to|of|do|with|der|die|das|ein|eine|einer|eines|einem|einen|un|une|la|le|l\'|el|las|los|al|uno|una|unos|unas|de|des|del|d\')(\s+|\b)/g;
+var citeKeyConversionsRe = /%([a-zA-Z])/;
+var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;
+
+var citeKeyConversions = {
+    "a":function (flags, item) {
+        if(item.creators && item.creators[0] && item.creators[0].lastName) {
+            return item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,"");
+        }
+        return "";
+    },
+    "t":function (flags, item) {
+        if (item["title"]) {
+            return item["title"].toLowerCase().replace(citeKeyTitleBannedRe, "").split(/\s+/g)[0];
+        }
+        return "";
+    },
+    "y":function (flags, item) {
+        if(item.date) {
+            var date = Zotero.Utilities.strToDate(item.date);
+            if(date.year && numberRe.test(date.year)) {
+                return date.year;
+            }
+        }
+        return "????";
+    },
+    "k":function (flags, item) {
+        if (item.key) {
+			return item.key;
+		}
+        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
+    // however, we want to keep the base characters 
+
+    basekey = tidyAccents(basekey);
+    basekey = basekey.replace(citeKeyCleanRe, "");
+    var citekey = basekey;
+    var i = 0;
+    while(citekeys[citekey]) {
+        i++;
+        citekey = basekey + "-" + i;
+    }
+    citekeys[citekey] = true;
+    return citekey.toUpperCase();
+}
+
+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(typeof date.month == "number") {
+				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("-","--"));
+		}
+		
+                // Commented out, because we don't want a books number of pages in the BibTeX "pages" field for books.
+		//if(item.numPages) {
+		//	writeField("pages", item.numPages);
+		//}
+		
+		if(item.itemType == "webpage") {
+			writeField("howpublished", item.url);
+		}
+		if (item.notes) {
+			for each (var note in item.notes) {
+				writeField("annote", note["note"]);
+			}
+		}		
+		
+		if(Zotero.getOption("exportFileData")) {
+			if(item.attachments) {
+				var attachmentString = "";
+				for each(var attachment in item.attachments) {
+					attachmentString += ";" + attachment.title + ":" + attachment.path + ":" + attachment.mimeType;
+				}
+				writeField("file", attachmentString.substr(1));
+			}
+		}
+		
+		Zotero.write("\n}");
+	}
+}
diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl1.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl1.java
index 7e3ed70..a53eb35 100644
--- a/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl1.java
+++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl1.java
@@ -16,14 +16,13 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  *  MA  02111-1307  USA
  *
- *  Copyright: 2002-2009 by Henrik Just
+ *  Copyright: 2002-2010 by Henrik Just
  *
  *  All Rights Reserved.
  *  
- *  Version 1.0 (2009-03-08)
+ *  Version 1.2 (2010-10-27)
  */
 
-// 
  
 package org.openoffice.da.comp.w2lcommon.filter;
 
@@ -78,7 +77,7 @@ public class GraphicConverterImpl1 implements GraphicConverter {
         if (bCrop || bResize) { return false; }
 
         // We can convert vector formats to eps:
-        if (MIMETypes.EPS.equals(sTargetMime) && (MIMETypes.WMF.equals(sSourceMime) && MIMETypes.SVM.equals(sSourceMime))) {
+        if (MIMETypes.EPS.equals(sTargetMime) && (MIMETypes.WMF.equals(sSourceMime) || MIMETypes.SVM.equals(sSourceMime))) {
             return true;
         }
 		
diff --git a/source/java/writer2latex/api/ConverterFactory.java b/source/java/writer2latex/api/ConverterFactory.java
index e32c50d..e2590ad 100644
--- a/source/java/writer2latex/api/ConverterFactory.java
+++ b/source/java/writer2latex/api/ConverterFactory.java
@@ -20,7 +20,7 @@
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2010-10-27)
+ *  Version 1.2 (2010-10-30)
  *
  */
  
@@ -33,7 +33,7 @@ public class ConverterFactory {
 
     // Version information
     private static final String VERSION = "1.1.5";
-    private static final String DATE = "2010-10-27";
+    private static final String DATE = "2010-10-30";
 	
     /** Return the Writer2LaTeX version in the form
      *  (major version).(minor version).(patch level)<br/>
diff --git a/source/java/writer2latex/latex/InlineConverter.java b/source/java/writer2latex/latex/InlineConverter.java
index f9aafff..8300d53 100644
--- a/source/java/writer2latex/latex/InlineConverter.java
+++ b/source/java/writer2latex/latex/InlineConverter.java
@@ -20,7 +20,7 @@
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2010-10-04)
+ *  Version 1.2 (2010-10-30)
  *
  */
 
@@ -583,6 +583,8 @@ public class InlineConverter extends ConverterHelper {
         case LaTeXConfig.IGNORE: return;
         case LaTeXConfig.COMMENT:
         	// Get the unformatted text of all paragraphs and insert each paragraph as a single comment
+        	Element creator = null;
+        	Element date = null;
 			ldp.append("%").nl();
         	Node child = node.getFirstChild();
         	while (child!=null) {
@@ -591,8 +593,24 @@ public class InlineConverter extends ConverterHelper {
         			traversePlainInlineText((Element)child, ldp, oc); 
         			ldp.nl();
         		}
+        		else if (Misc.isElement(child, XMLString.DC_CREATOR)) {
+        			creator = (Element) child;
+        		}
+        		else if (Misc.isElement(child, XMLString.DC_DATE)) {
+        			date = (Element) child;
+        		}
                 child = child.getNextSibling();        		
         	}
+        	if (creator!=null) {
+        		ldp.append("%");
+        		traversePlainInlineText(creator, ldp, oc);
+        		ldp.nl();
+        	}
+        	if (date!=null) {
+        		ldp.append("%")
+        		   .append(Misc.formatDate(ofr.getTextContent(date), palette.getI18n().getDefaultLanguage(), null))
+        		   .nl();
+        	}
         	return;
         case LaTeXConfig.PDFANNOTATION:
             bHasPdfannotation = true;
@@ -608,6 +626,8 @@ public class InlineConverter extends ConverterHelper {
     	
     	// Get the unformatted text of all paragraphs, separated by spaces
         ldp.append(sCommand).append("{");
+    	Element creator = null;
+    	Element date = null;
         boolean bFirst = true;
     	Node child = node.getFirstChild();
     	while (child!=null) {
@@ -616,9 +636,24 @@ public class InlineConverter extends ConverterHelper {
     			traversePlainInlineText((Element)child, ldp, oc);
     			bFirst = false;
     		}
-            child = child.getNextSibling();
-    		
+    		else if (Misc.isElement(child, XMLString.DC_CREATOR)) {
+    			creator = (Element) child;
+    		}
+    		else if (Misc.isElement(child, XMLString.DC_DATE)) {
+    			date = (Element) child;
+    		}
+            child = child.getNextSibling();    		
     	}
+    	if (creator!=null) {
+    		if (!bFirst) ldp.append(" - ");
+    		traversePlainInlineText(creator, ldp, oc);
+    	}
+    	if (date!=null) {
+    		if (creator!=null) ldp.append(", ");
+    		else if (!bFirst) ldp.append(" ");
+    		ldp.append(Misc.formatDate(ofr.getTextContent(date), palette.getI18n().getDefaultLanguage(), null));
+    	}
+
     	ldp.append("}");
     }
 
diff --git a/source/java/writer2latex/latex/i18n/I18n.java b/source/java/writer2latex/latex/i18n/I18n.java
index 68fb2ab..2ebdd7a 100644
--- a/source/java/writer2latex/latex/i18n/I18n.java
+++ b/source/java/writer2latex/latex/i18n/I18n.java
@@ -16,11 +16,11 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  *  MA  02111-1307  USA
  *
- *  Copyright: 2002-2009 by Henrik Just
+ *  Copyright: 2002-2010 by Henrik Just
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2009-03-26) 
+ *  Version 1.2 (2010-10-30) 
  * 
  */
 
@@ -44,11 +44,11 @@ public abstract class I18n {
     // Configuration items
     protected LaTeXConfig config;
     protected ReplacementTrie stringReplace;
-    protected boolean bGreekMath; // Use math mode for greek letters
+    protected boolean bGreekMath; // Use math mode for Greek letters
     protected boolean bAlwaysUseDefaultLang; // Ignore sLang parameter to convert()
 
     // Collected data
-    protected String sDefaultLanguage; // The default iso language to use
+    protected String sDefaultLanguage; // The default ISO language to use
     protected HashSet<String> languages = new HashSet<String>(); // All languages used
 
     // **** Constructors ****
@@ -92,7 +92,7 @@ public abstract class I18n {
     public abstract void appendDeclarations(LaTeXDocumentPortion pack, LaTeXDocumentPortion decl);
 	
     /** Apply a language language
-     *  @param style the OOo style to read attributesfrom
+     *  @param style the OOo style to read attributes from
      *  @param bDecl true if declaration form is required
      *  @param bInherit true if inherited properties should be used
      *  @param ba the <code>BeforeAfter</code> to add LaTeX code to.
@@ -111,8 +111,16 @@ public abstract class I18n {
     /** Convert a string of characters into LaTeX
      *  @param s the source string
      *  @param bMathMode true if the string should be rendered in math mode
-     *  @param sLang the iso language of the string
+     *  @param sLang the ISO language of the string
      *  @return the LaTeX string
      */
     public abstract String convert(String s, boolean bMathMode, String sLang);
+    
+    /** Get the default language (either the document language or the most used language)
+     * 
+     *  @param the default language
+     */
+    public String getDefaultLanguage() {
+    	return sDefaultLanguage;
+    }
 }
diff --git a/source/java/writer2latex/util/Misc.java b/source/java/writer2latex/util/Misc.java
index d5386e7..e4b375e 100644
--- a/source/java/writer2latex/util/Misc.java
+++ b/source/java/writer2latex/util/Misc.java
@@ -20,7 +20,7 @@
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2010-10-27)
+ *  Version 1.2 (2010-10-30)
  *
  */
 
@@ -34,7 +34,12 @@ import java.io.UnsupportedEncodingException;
 import java.lang.Math;
 import java.net.URLEncoder;
 import java.net.URLDecoder;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
+import java.util.Date;
+import java.util.Locale;
 //import java.util.Hashtable;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -52,6 +57,20 @@ public class Misc{
         for (int i=0; i<n; i++) { newArray[i] = array[i]; }
         return newArray;
     }
+    
+    public static final String formatDate(String sDate, String sLanguage, String sCountry) {
+    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+   		Date date = null;
+    	try {
+			date = sdf.parse(sDate);
+		} catch (ParseException e) {
+			// If the date cannot be parsed according to the given pattern, return the original string
+			return sDate;
+		}
+		// Return using a default format for the given locale
+		Locale locale = sCountry!=null ? new Locale(sLanguage,sCountry) : new Locale(sLanguage);
+		return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, locale).format(date);   		
+    }
 	
     public static final String int2roman(int number) {
     	assert number>0; // Only works for positive numbers!
diff --git a/source/java/writer2latex/xhtml/Converter.java b/source/java/writer2latex/xhtml/Converter.java
index 22de196..bcacdf5 100644
--- a/source/java/writer2latex/xhtml/Converter.java
+++ b/source/java/writer2latex/xhtml/Converter.java
@@ -20,7 +20,7 @@
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2010-05-17)
+ *  Version 1.2 (2010-10-30)
  *
  */
 
@@ -201,12 +201,7 @@ public class Converter extends ConverterBase {
         // Set locale to document language
         StyleWithProperties style = ofr.isSpreadsheet() ? ofr.getDefaultCellStyle() : ofr.getDefaultParStyle();
         if (style!=null) {
-            String sLang = style.getProperty(XMLString.FO_LANGUAGE);
-            String sCountry = style.getProperty(XMLString.FO_COUNTRY);
-            if (sLang!=null) {
-                if (sCountry==null) { l10n.setLocale(sLang); }
-                else { l10n.setLocale(sLang+"-"+sCountry); }
-            }
+            l10n.setLocale(style.getProperty(XMLString.FO_LANGUAGE), style.getProperty(XMLString.FO_COUNTRY));
         }
 
         // Traverse the body
@@ -463,16 +458,32 @@ public class Converter extends ConverterBase {
 
     public void handleOfficeAnnotation(Node onode, Node hnode) {
         if (config.xhtmlNotes()) {
-            // Extract the text from the paragraphs, seperate paragraphs with newline
+            // Extract the text from the paragraphs, separate paragraphs with newline
         	StringBuffer buf = new StringBuffer();
+        	Element creator = null;
+        	Element date = null;
         	Node child = onode.getFirstChild();
         	while (child!=null) {
         		if (Misc.isElement(child, XMLString.TEXT_P)) {
         			if (buf.length()>0) { buf.append('\n'); }
         			buf.append(getPlainInlineText(child));
         		}
+        		else if (Misc.isElement(child, XMLString.DC_CREATOR)) {
+        			creator = (Element) child;
+        		}
+        		else if (Misc.isElement(child, XMLString.DC_DATE)) {
+        			date = (Element) child;
+        		}
         		child = child.getNextSibling();
         	}
+        	if (creator!=null) {
+    			if (buf.length()>0) { buf.append('\n'); }
+    			buf.append(getPlainInlineText(creator));        		
+        	}
+        	if (date!=null) {
+    			if (buf.length()>0) { buf.append('\n'); }
+    			buf.append(Misc.formatDate(ofr.getTextContent(date), l10n.getLocale().getLanguage(), l10n.getLocale().getCountry()));
+        	}
             Node commentNode = htmlDOM.createComment(buf.toString());
             hnode.appendChild(commentNode);
         }
diff --git a/source/java/writer2latex/xhtml/L10n.java b/source/java/writer2latex/xhtml/L10n.java
index d3f6670..df79546 100644
--- a/source/java/writer2latex/xhtml/L10n.java
+++ b/source/java/writer2latex/xhtml/L10n.java
@@ -26,6 +26,8 @@
 
 package writer2latex.xhtml;
 
+import java.util.Locale;
+
 // This class handles localized strings (used for navigation)
 public class L10n {
     public final static int UP = 0;
@@ -39,21 +41,36 @@ public class L10n {
     public final static int DIRECTORY = 8;
     public final static int DOCUMENT = 9;
 
+    private Locale locale = null;
     private String sLocale="en-US";
 	
-    public void setLocale(String sLocale) {
-        if (sLocale!=null) { this.sLocale = sLocale;}
-    }
-	
     public void setLocale(String sLanguage, String sCountry) {
         if (sLanguage!=null) {
-            if (sCountry!=null) { sLocale = sLanguage + "-" + sCountry; }
-            else  { sLocale = sLanguage; }
+            if (sCountry!=null) {
+            	locale = new Locale(sLanguage,sCountry);
+            }
+            else  {
+            	locale = new Locale(sLanguage);
+            }
         }
+        else {
+        	locale = Locale.getDefault();
+        }
+
+        if (locale.getCountry().length()>0) {
+        	sLocale = locale.getLanguage()+"-"+locale.getCountry();
+        }
+        else {
+        	sLocale = locale.getLanguage();
+        }   
+    }
+    
+    public Locale getLocale() {
+    	return locale;
     }
 	
     public String get(int nString) {
-        if (sLocale.startsWith("de")) { // german
+        if (sLocale.startsWith("de")) { // German
             switch (nString) {
                 case UP: return "Nach oben";
                 case FIRST : return "Anfang";
@@ -67,7 +84,7 @@ public class L10n {
                 case DOCUMENT: return "Dokument";
             }
         }
-        if (sLocale.startsWith("fr")) { // french
+        if (sLocale.startsWith("fr")) { // French
             switch (nString) {
             	case UP: return "Haut";
             	case FIRST : return "D\u00e9but";
@@ -81,7 +98,7 @@ public class L10n {
             	case DOCUMENT: return "Document";
             }
         }
-        if (sLocale.startsWith("es")) { // spanish
+        if (sLocale.startsWith("es")) { // Spanish
             switch (nString) {
                 case UP: return "Arriba";
                 case FIRST : return "Primero";
@@ -95,7 +112,7 @@ public class L10n {
                 case DOCUMENT: return "Documento";
             }
         }
-        if (sLocale.startsWith("it")) { // italian
+        if (sLocale.startsWith("it")) { // Italian
             switch (nString) {
             	case UP: return "Su";
             	case FIRST : return "Inizio";
@@ -109,7 +126,7 @@ public class L10n {
             	case DOCUMENT: return "Documento";     
             }
         }
-        if (sLocale.startsWith("pt")) { // (brazilian) portuguese
+        if (sLocale.startsWith("pt")) { // (Brazilian) Portuguese
             switch (nString) {
             	case UP: return "Acima";
             	case FIRST : return "Primeiro";
@@ -123,7 +140,7 @@ public class L10n {
             	case DOCUMENT: return "Documento";     
             }
         }
-        if (sLocale.startsWith("cs")) { // czech
+        if (sLocale.startsWith("cs")) { // Czech
             switch (nString) {
             	case UP: return "Nahoru";
             	case FIRST : return "Prvn\u00ed";
@@ -137,7 +154,7 @@ public class L10n {
             	case DOCUMENT: return "Dokument";     
             }
         }
-        if (sLocale.startsWith("nl")) { // dutch
+        if (sLocale.startsWith("nl")) { // Dutch
             switch (nString) {
             case UP: return "Omhoog";
             case FIRST : return "Eerste";
@@ -151,7 +168,7 @@ public class L10n {
             case DOCUMENT: return "Document";  
             }
         }
-        if (sLocale.startsWith("da")) { // danish
+        if (sLocale.startsWith("da")) { // Danish
             switch (nString) {
                 case UP: return "Op";
                 case FIRST : return "F\u00F8rste";
@@ -165,7 +182,7 @@ public class L10n {
                 case DOCUMENT: return "Dokument";
             }
         }
-        if (sLocale.startsWith("nn")) { // nynorsk
+        if (sLocale.startsWith("nn")) { // Nynorsk
             switch (nString) {
                 case UP: return "Opp";
                 case FIRST : return "F\u00f8rste";
@@ -179,7 +196,7 @@ public class L10n {
                 case DOCUMENT: return "Dokument";
             }
         }
-        if (sLocale.startsWith("pl")) { // polish
+        if (sLocale.startsWith("pl")) { // Polish
         	switch (nString) {
         		case UP: return "W g\u00f3r\u0119";
         		case FIRST : return "Pierwsza";
@@ -193,7 +210,7 @@ public class L10n {
         		case DOCUMENT: return "Dokument";
         	}
         }
-        if (sLocale.startsWith("fi")) { // finnish
+        if (sLocale.startsWith("fi")) { // Finnish
         	switch (nString) {
         		case UP: return "Yl\u00f6s";
         		case FIRST : return "Ensimm\u00e4inen";
@@ -207,7 +224,7 @@ public class L10n {
         		case DOCUMENT: return "Dokumentti";
         	}
         }
-        if (sLocale.startsWith("ru")) { // russian
+        if (sLocale.startsWith("ru")) { // Russian
             switch (nString) {
             	case UP: return "\u0412\u0432\u0435\u0440\u0445";
             	case FIRST : return "\u041f\u0435\u0440\u0432\u0430\u044f";
@@ -221,7 +238,7 @@ public class L10n {
             	case DOCUMENT: return "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442";
             }
         }
-        if (sLocale.startsWith("uk")) { // ukrainian
+        if (sLocale.startsWith("uk")) { // Ukrainian
             switch (nString) {
             	case UP: return "\u041d\u0430\u0433\u043e\u0440\u0443";
             	case FIRST : return "\u041f\u0435\u0440\u0448\u0430";
@@ -235,7 +252,7 @@ public class L10n {
             	case DOCUMENT: return "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442";
             }
         }
-        if (sLocale.startsWith("tr")) { // turkish
+        if (sLocale.startsWith("tr")) { // Turkish
             switch (nString) {
             	case UP: return "Yukar\u0131";
             	case FIRST : return "\u0130lk";
@@ -249,7 +266,7 @@ public class L10n {
             	case DOCUMENT: return "D\u00f6k\u00fcman";
             }        	
         }
-        if (sLocale.startsWith("hr")) { // croatian
+        if (sLocale.startsWith("hr")) { // Croatian
             switch (nString) {
                 case UP: return "Up";
                 case FIRST : return "Prvi";
@@ -262,7 +279,7 @@ public class L10n {
                 case DOCUMENT: return "Document";
             }
         }
-        // english - default
+        // English - default
         switch (nString) {
             case UP: return "Up";
             case FIRST : return "First";
diff --git a/source/java/writer2latex/xhtml/TextConverter.java b/source/java/writer2latex/xhtml/TextConverter.java
index 28536b2..240493e 100644
--- a/source/java/writer2latex/xhtml/TextConverter.java
+++ b/source/java/writer2latex/xhtml/TextConverter.java
@@ -20,7 +20,7 @@
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2010-07-02)
+ *  Version 1.2 (2010-10-30)
  *
  */
 
@@ -79,6 +79,10 @@ public class TextConverter extends ConverterHelper {
 
     // Data used to handle splitting over several files
     // TODO: Accessor methods for sections
+	// Some (Sony?) EPUB readers have a limit on the file size of individual files
+	// In any case very large files could be a performance problem, hence we do automatic splitting
+	// after this number of characters. TODO: Make configurable.
+	private static final int EPUB_CHARACTER_COUNT_TRESHOLD = 150000;
     int nSplit = 0;  // The outline level at which to split files (0=no split)
     int nRepeatLevels = 5; // The number of levels to repeat when splitting (0=no repeat)
     private int nLastSplitLevel = 1; // The outline level at which the last split occured
@@ -86,6 +90,7 @@ public class TextConverter extends ConverterHelper {
     boolean bAfterHeading=false; // last element was a top level heading
     protected Stack<Node> sections = new Stack<Node>(); // stack of nested sections
     Element[] currentHeading = new Element[7]; // Last headings (repeated when splitting)
+    private int nCharacterCount = 0; // The number of text characters in the current document
 
     // Counters for generated numbers
     private ListCounter outlineNumbering;
@@ -352,6 +357,8 @@ public class TextConverter extends ConverterHelper {
                     getDrawCv().handleDrawElement((Element)child,(Element)hnode,null,nFloatMode);
                 }
                 else if (nodeName.equals(XMLString.TEXT_P)) {
+                	hnode = maybeSplit(hnode);
+                	nCharacterCount+=OfficeReader.getCharacterCount(child);
                     // is there a block element, we should use?
                     XhtmlStyleMap xpar = config.getXParStyleMap();
                     String sDisplayName = ofr.getParStyles().getDisplayName(Misc.getAttribute(child,XMLString.TEXT_STYLE_NAME));
@@ -395,14 +402,16 @@ public class TextConverter extends ConverterHelper {
                 else if(nodeName.equals(XMLString.TEXT_H)) {
                     int nOutlineLevel = getOutlineLevel((Element)child);
                     Node rememberNode = hnode;
-                    hnode = maybeSplit(hnode,nOutlineLevel,bAfterHeading);
+                    hnode = maybeSplit(hnode,nOutlineLevel);
+                	nCharacterCount+=OfficeReader.getCharacterCount(child);
                     handleHeading((Element)child,hnode,rememberNode!=hnode);
                 }
                 else if (nodeName.equals(XMLString.TEXT_LIST) || // oasis
                          nodeName.equals(XMLString.TEXT_UNORDERED_LIST) || // old
                          nodeName.equals(XMLString.TEXT_ORDERED_LIST)) // old
                     {
-                    if (listIsOnlyHeadings(child)) {
+                	hnode = maybeSplit(hnode);
+                	if (listIsOnlyHeadings(child)) {
                         nDontSplitLevel--;
                         hnode = handleFakeList(child,nLevel+1,styleName,hnode);
                         nDontSplitLevel++;
@@ -412,19 +421,21 @@ public class TextConverter extends ConverterHelper {
                     }
                 }
                 else if (nodeName.equals(XMLString.TABLE_TABLE)) {
+                	hnode = maybeSplit(hnode);
                     getTableCv().handleTable(child,hnode);
                 }
                 else if (nodeName.equals(XMLString.TABLE_SUB_TABLE)) {
                     getTableCv().handleTable(child,hnode);
                 }
                 else if (nodeName.equals(XMLString.TEXT_SECTION)) {
+                	hnode = maybeSplit(hnode);
                     nDontSplitLevel--;
                     hnode = handleSection(child,hnode);
                     nDontSplitLevel++;
                 }
                 else if (nodeName.equals(XMLString.TEXT_TABLE_OF_CONTENT)) {
                     if (!ofr.getTocReader((Element)child).isByChapter()) {
-                        hnode = maybeSplit(hnode,1,bAfterHeading);
+                        hnode = maybeSplit(hnode,1);
                     }
                     handleTOC(child,hnode);
                 }
@@ -441,11 +452,11 @@ public class TextConverter extends ConverterHelper {
                     handleUserIndex(child,hnode);
                 }
                 else if (nodeName.equals(XMLString.TEXT_ALPHABETICAL_INDEX)) {
-                    hnode = maybeSplit(hnode,1,bAfterHeading);
+                    hnode = maybeSplit(hnode,1);
                     handleAlphabeticalIndex(child,hnode);
                 }
                 else if (nodeName.equals(XMLString.TEXT_BIBLIOGRAPHY)) {
-                    hnode = maybeSplit(hnode,1,bAfterHeading);
+                    hnode = maybeSplit(hnode,1);
                     handleBibliography(child,hnode);
                 }
                 else if (nodeName.equals(XMLString.OFFICE_ANNOTATION)) {
@@ -466,7 +477,21 @@ public class TextConverter extends ConverterHelper {
         return hnode;
     }
     
-    private Node maybeSplit(Node node, int nLevel, boolean bAfterHeading) {
+    private Node maybeSplit(Node node) {
+    	if (converter.isOPS() && nCharacterCount>EPUB_CHARACTER_COUNT_TRESHOLD) {
+    		return doMaybeSplit(node, 0);
+    	}
+    	return node;
+    }
+    
+    private Node maybeSplit(Node node, int nLevel) {
+    	if (converter.isOPS() && nCharacterCount>EPUB_CHARACTER_COUNT_TRESHOLD) {
+    		return doMaybeSplit(node, 0);
+    	}
+    	return doMaybeSplit(node, nLevel);
+    }
+
+    private Node doMaybeSplit(Node node, int nLevel) {
         if (nDontSplitLevel>1) { // we cannot split due to a nested structure
             return node;
         }
@@ -478,6 +503,7 @@ public class TextConverter extends ConverterHelper {
         }
         if (nSplit>=nLevel && converter.outFileHasContent()) {
             // No objections, this is a level that causes splitting
+        	nCharacterCount = 0;
             return converter.nextOutFile();
         }
         return node;
@@ -636,7 +662,7 @@ public class TextConverter extends ConverterHelper {
         boolean bIsEmpty = OfficeReader.isWhitespaceContent(onode);
         if (config.ignoreEmptyParagraphs() && bIsEmpty) { return; }
         String sStyleName = Misc.getAttribute(onode,XMLString.TEXT_STYLE_NAME);
-
+        
         Element par;
         if (ofr.isSpreadsheet()) { // attach inline text directly to parent (always a table cell)
             par = (Element) hnode;
@@ -1044,7 +1070,7 @@ public class TextConverter extends ConverterHelper {
                     nDontSplitLevel++;
                     int nOutlineLevel = getOutlineLevel((Element)onode);
                     Node rememberNode = hnode;
-                    hnode = maybeSplit(hnode,nOutlineLevel,bAfterHeading);
+                    hnode = maybeSplit(hnode,nOutlineLevel);
                     handleHeading((Element)child, hnode, rememberNode!=hnode,
                         ofr.getListStyle(sStyleName), nLevel,
                         bUnNumbered, bRestart, nStartValue);
diff --git a/source/java/writer2latex/xhtml/XhtmlDocument.java b/source/java/writer2latex/xhtml/XhtmlDocument.java
index 8ee9d66..d6177d4 100644
--- a/source/java/writer2latex/xhtml/XhtmlDocument.java
+++ b/source/java/writer2latex/xhtml/XhtmlDocument.java
@@ -20,7 +20,7 @@
  *
  *  All Rights Reserved.
  * 
- *  Version 1.2 (2010-06-19)
+ *  Version 1.2 (2010-10-27)
  *
  */
  
@@ -598,11 +598,16 @@ public class XhtmlDocument extends DOMDocument {
                 else if (node.hasChildNodes()) {
                     int nNextLevel = (nLevel<0 || blockThis((Element)node)) ? -1 : nLevel+1;
                     // Print start tag
-                    if (nLevel>=0) { writeSpaces(nLevel,osw); }
-                    osw.write("<"+node.getNodeName());
-                    writeAttributes(node,osw);
-                    osw.write(">");
-                    if (nNextLevel>=0) { osw.write("\n"); }
+                    boolean bRedundantElement = !node.hasAttributes() &&
+                    	(node.getNodeName().equals("a") || node.getNodeName().equals("span")); 
+                    if (!bRedundantElement) {
+                    	// Writer2xhtml may produce <a> and <span> without attributes, these are removed here
+                    	if (nLevel>=0) { writeSpaces(nLevel,osw); }
+                    	osw.write("<"+node.getNodeName());
+                    	writeAttributes(node,osw);
+                    	osw.write(">");
+                    	if (nNextLevel>=0) { osw.write("\n"); }
+                    }
                     // Print children
                     Node child = node.getFirstChild();
                     while (child!=null) {
@@ -610,9 +615,11 @@ public class XhtmlDocument extends DOMDocument {
                         child = child.getNextSibling();
                     }
                     // Print end tag
-                    if (nNextLevel>=0) { writeSpaces(nLevel,osw); }
-                    osw.write("</"+node.getNodeName()+">");
-                    if (nLevel>=0) { osw.write("\n"); }
+                    if (!bRedundantElement) {
+                    	if (nNextLevel>=0) { writeSpaces(nLevel,osw); }
+                    	osw.write("</"+node.getNodeName()+">");
+                    	if (nLevel>=0) { osw.write("\n"); }
+                    }
                 }
                 else { // empty element
                     if (nLevel>=0) { writeSpaces(nLevel,osw); }
diff --git a/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp b/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp
index 6d377f6..272fbd0 100644
--- a/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp
+++ b/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp
@@ -143,9 +143,15 @@
         <paragraph role="heading" level="3" xml-lang="en-US">Split document at headings</paragraph>
    		<paragraph role="paragraph" xml-lang="en-US"><ahelp hid="org.openoffice.da.writer2latex.oxt:OptionsSplit" visibility="hidden">Check this to create a new document for each heading</ahelp></paragraph>
         <paragraph role="paragraph" xml-lang="en-US">To make a long Writer document easier to read in the browser, you can use
-        this option to split the document in several small files. Writer2xhtml will add a simple navigation panel that lets you
+        this option to split the document in several small files.</paragraph>
+        <paragraph role="paragraph" xml-lang="en-US">For the XHTML export, Writer2xhtml will add a simple navigation panel that lets you
         move between pages. The navigation links will be in the same language as the document (as defined
-        under <emph>Tools – Options – Language Settings – Languages</emph>). Note that this option has no effect for headings
+        under <emph>Tools – Options – Language Settings – Languages</emph>).</paragraph>
+        <paragraph role="paragraph" xml-lang="en-US">For the EPUB export it is highly recommended that you split at headings.
+        Some EPUB readers have a limitation on the size of the individual files in the document.
+        To avoid this, Writer2xhtml will always split your document to avoid very large files. This happens even if you have set the
+        heading level to 0 here.</paragraph>
+        <paragraph role="paragraph" xml-lang="en-US">Note that this option has no effect for headings
         inside tables.</paragraph>
 
     	<bookmark xml-lang="en-US" branch="hid/org.openoffice.da.writer2xhtml.oxt:OptionsSplitLevel" id="bm_options_splitlevel"/>
@@ -161,6 +167,7 @@
         you can use this option to repeat the parent headings whenever the document is split. If you for example split at
         headings of level 3 and set this option to 2, the headings of level 1 and 2 will be repeated before the heading of level 3,
         providing precise information as to where in the document the section belongs.</paragraph>
+        <paragraph role="paragraph" xml-lang="en-US">For the EPUB export it is recommended to set this option to 0.</paragraph>
 
    		<bookmark xml-lang="en-US" branch="hid/org.openoffice.da.writer2xhtml.oxt:OptionsSaveImagesInSubdir" id="bm_options_saveimagesinsubdir"/>
 		<paragraph role="paragraph" xml-lang="en-US"><ahelp hid="org.openoffice.da.writer2latex.oxt:OptionsSaveImagesInSubdir" visibility="hidden">Check this to save images in a subdirectory relative to the exported document</ahelp></paragraph>
diff --git a/source/oxt/writer4latex/help/en/org.openoffice.da.writer4latex.oxt/bibliography.xhp b/source/oxt/writer4latex/help/en/org.openoffice.da.writer4latex.oxt/bibliography.xhp
index 9be127e..282cd92 100644
--- a/source/oxt/writer4latex/help/en/org.openoffice.da.writer4latex.oxt/bibliography.xhp
+++ b/source/oxt/writer4latex/help/en/org.openoffice.da.writer4latex.oxt/bibliography.xhp
@@ -29,11 +29,22 @@
 
 		<bookmark xml-lang="en-US" branch="hid/org.openoffice.da.writer4latex.oxt:BibliographyZoteroBibTeXDir" id="bm_zoterobibtexdir"/>
 		<paragraph role="heading" level="3" xml-lang="en-US">BibTeX folder</paragraph>
-		<paragraph role="paragraph" xml-lang="en-US">To use this feature you also have to export your Zotero bibliography databse to BibTeX.
-		(TODO).</paragraph>
-		<paragraph role="paragraph" xml-lang="en-US">Type the full path to the directory containing the exported database or click
-		<emph>Browse</emph> to find the directory in your file system.</paragraph>
-		<paragraph role="paragraph" xml-lang="en-US"><ahelp hid="org.openoffice.da.writer4latex.oxt:BibliographyZoteroBibTeXDir" visibility="hidden">Enter the path to the directory containing the BibTeX file exported from Zotero</ahelp></paragraph>
+		<paragraph role="paragraph" xml-lang="en-US">To use this feature you also have to export your Zotero bibliography database
+		to BibTeX.</paragraph>
+		<paragraph role="paragraph" xml-lang="en-US">Type the full path to the folder containing the exported database or click
+		<emph>Browse</emph> to find the folder in your file system.</paragraph>
+		<paragraph role="heading" level="4" xml-lang="en-US">Exporting your Zotero database to BibTeX</paragraph>
+		<paragraph role="paragraph" xml-lang="en-US">To use this feature you must export your Zotero database to the specified
+		folder.</paragraph>
+		<paragraph role="paragraph" xml-lang="en-US">The Writer2LaTeX distribution contains a folder named <emph>Zotero</emph>,
+		which contains a file called <emph>BibTeX-Writer2LaTeX.js</emph>. This file must be added to Zotero to provide a suitable
+		BibTeX export: In Zotero, choose <emph>Preferences</emph> - <emph>Advanced</emph> and click <emph>Show Data Directory</emph>.
+		Open the subfolder <emph>Translators</emph>, and copy <emph>BibTeX-Writer2LaTeX.js</emph> to this location.
+		Finally restart Firefox.</paragraph>
+		<paragraph role="paragraph" xml-lang="en-US">You can now export your Zotero database: In Zotero, select
+		<emph>Export Library</emph>, and choose <emph>BibTeX (Writer2LaTeX)</emph> (not <emph>BibTeX</emph>).
+		Save the file in the folder, you have defined.</paragraph>		
+		<paragraph role="paragraph" xml-lang="en-US"><ahelp hid="org.openoffice.da.writer4latex.oxt:BibliographyZoteroBibTeXDir" visibility="hidden">Enter the path to the folder containing the BibTeX file exported from Zotero</ahelp></paragraph>
 
 		<bookmark xml-lang="en-US" branch="hid/org.openoffice.da.writer4latex.oxt:BibliographyNatbibOptions" id="bm_natbiboptions"/>
 		<paragraph role="heading" level="3" xml-lang="en-US">Natbib Options</paragraph>
@@ -54,9 +65,9 @@
 
 		<bookmark xml-lang="en-US" branch="hid/org.openoffice.da.writer4latex.oxt:BibliographyExternalBibTeXDir" id="bm_externalbibtexdir"/>
 		<paragraph role="heading" level="3" xml-lang="en-US">BibTeX folder</paragraph>
-		<paragraph role="paragraph" xml-lang="en-US">Type the full path to the directory containing the BibTeX database(s) or click
-		<emph>Browse</emph> to find the directory in your file system.</paragraph>
-		<paragraph role="paragraph" xml-lang="en-US"><ahelp hid="org.openoffice.da.writer4latex.oxt:Bibliography" visibility="hidden">Enter the path to the directory containing the BibTeX files</ahelp></paragraph>
+		<paragraph role="paragraph" xml-lang="en-US">Type the full path to the folder containing the BibTeX database(s) or click
+		<emph>Browse</emph> to find the folder in your file system.</paragraph>
+		<paragraph role="paragraph" xml-lang="en-US"><ahelp hid="org.openoffice.da.writer4latex.oxt:Bibliography" visibility="hidden">Enter the path to the folder containing the BibTeX files</ahelp></paragraph>
 
 	</body>
 </helpdocument>
\ No newline at end of file