commit 231a276b0626b3e8c373c4b8d652c63f684205b4
parent 53d2aa43d6ac8d19452ce0d7ebfb34b00f5ee693
Author: Dan Stillman <dstillman@zotero.org>
Date: Wed, 4 Jan 2017 23:40:25 -0500
Merge pull request #1144
Preserve format tags and entities in bibliography editor
Closes #1144
Diffstat:
2 files changed, 51 insertions(+), 24 deletions(-)
diff --git a/chrome/content/zotero/bindings/styled-textbox.xml b/chrome/content/zotero/bindings/styled-textbox.xml
@@ -51,19 +51,26 @@
this._onInitCallbacks = [];
this._iframe = document.getAnonymousElementByAttribute(this, "anonid", "rt-view");
+ // Atomic units, HTML -> RTF (cleanup)
+ //[/<\/p>(?!\s*$)/g, "\\par{}"],
+ //[/ /g, " "],
+ //[/\u00A0/g, " "],
this._htmlRTFmap = [
- // Atomic units, HTML -> RTF (cleanup)
[/<br \/>/g, "\x0B"],
+ [/<span class=\"tab\"> <\/span>/g, "\\tab{}"],
+ [/‘/g, "‘"],
+ [/’/g, "’"],
+ [/“/g, "“"],
+ [/”/g, "”"],
+ [/ /g, "\u00A0"],
[/"(\w)/g, "“$1"],
[/([\w,.?!])"/g, "$1”"],
[/<p>/g, ""],
- //[/<\/p>(?!\s*$)/g, "\\par{}"],
- [/<\/?div[^>]*>/g, ""],
- [/[\x7F-\uFFFF]/g, function(aChar) { return "\\uc0\\u"+aChar.charCodeAt(0).toString()+"{}"}]
+ [/<\/?div[^>]*>/g, ""]
];
+ // Atomic units, RTF -> HTML (cleanup)
this._rtfHTMLmap = [
- // Atomic units, RTF -> HTML (cleanup)
[/\\uc0\{?\\u([0-9]+)\}?(?:{}| )?/g, function(wholeStr, aCode) { return String.fromCharCode(aCode) }],
[/\\tab(?:\{\}| )/g, '<span class="tab"> </span>'],
[/(?:\\par{}|\\\r?\n)/g, "</p><p>"]
@@ -77,7 +84,7 @@
var _rexData = [
[
[
- ["<span style=\"font-variant:small-caps;\">"],
+ ["<span +style=\"font-variant: *small-caps;\">"],
["{\\scaps ", "{\\scaps{}"]
],
[
@@ -87,7 +94,7 @@
],
[
[
- ["<span style=\"text-decoration:underline;\">"],
+ ["<span +style=\"text-decoration: *underline;\">"],
["{\\ul{}", "{\\ul "]
],
[
@@ -157,7 +164,7 @@
],
[
[
- ["<span style=\"font-variant:normal;\">"],
+ ["<span +style=\"font-variant: *normal;\">"],
["{\\scaps0{}", "{\\scaps0 "]
],
[
@@ -167,7 +174,7 @@
],
[
[
- ["<span style=\"font-style:normal;\">"],
+ ["<span +style=\"font-style: *normal;\">"],
["{\\i0{}", "{\\i0 "]
],
[
@@ -177,7 +184,7 @@
],
[
[
- ["<span style=\"font-weight:normal;\">"],
+ ["<span +style=\"font-weight: *normal;\">"],
["{\\b0{}", "{\\b0 "]
],
[
@@ -197,6 +204,16 @@
}
}
+ function normalizeRegExpString(str) {
+ if (!str) return str;
+ return str.replace(/\s+/g, " ")
+ .replace(/(?:[\+]|\s[\*])/g, "")
+ .replace(/[\']/g, '\"')
+ .replace(/:\s/g, ":");
+ }
+
+ this.normalizeRegExpString = normalizeRegExpString;
+
function composeRex(rexes, noGlobal) {
var lst = [];
for (var rex in rexes) {
@@ -240,13 +257,15 @@
function openTagRemapMaker(segment) {
var ret = {};
for (var i=0,ilen=_rexData.length; i < ilen; i++) {
- var master = _rexData[i][0][segment][0];
+ var primaryVal = normalizeRegExpString(_rexData[i][0][segment][0]);
for (var j=0,jlen=_rexData[i][0][segment].length; j < jlen; j++) {
- ret[_rexData[i][0][segment][j]] = master;
+ var key = normalizeRegExpString(_rexData[i][0][segment][j]);
+ ret[key] = primaryVal;
}
}
return ret;
}
+
this.rtfHTMLopenTagRemap = openTagRemapMaker(1);
this.htmlRTFopenTagRemap = openTagRemapMaker(0);
@@ -255,11 +274,11 @@
var ret = {};
var rexes = {};
for (var i=0,ilen=_rexData.length; i < ilen; i++) {
- var master = _rexData[i][0][segment][0];
+ var primaryVal = _rexData[i][0][segment][0];
for (var j=0,jlen=_rexData[i][1][segment].length; j < jlen; j++) {
rexes[_rexData[i][1][segment][j]] = true;
}
- ret[master] = composeRex(rexes);
+ ret[primaryVal] = composeRex(rexes);
}
return ret;
}
@@ -274,14 +293,15 @@
}
var ret = {};
for (var i=0,ilen=_rexData.length; i < ilen; i++) {
- var master = _rexData[i][0][segment][0];
- ret[master] = {
- open: _rexData[i][0][antisegment][0],
+ var primaryVal = normalizeRegExpString(_rexData[i][0][segment][0]);
+ ret[primaryVal] = {
+ open: normalizeRegExpString(_rexData[i][0][antisegment][0]),
close: _rexData[i][1][antisegment][0]
}
}
return ret;
}
+
this.rtfHTMLtagRegistry = tagRegistryMaker(1);
this.htmlRTFtagRegistry = tagRegistryMaker(0);
@@ -304,7 +324,7 @@
this.getOpenTag = function(mode, str) {
var m = str.match(this[mode + "openSniffRex"]);
if (m) {
- m = this[mode + "openTagRemap"][m[0]];
+ m = this[mode + "openTagRemap"][this.normalizeRegExpString(m[0])];
}
return m;
}
@@ -339,14 +359,13 @@
}
this.htmlToRTF = function(txt) {
- // Catch this one before is clobbered by unescape
- txt = txt.replace(/<span class=\"tab\"> <\/span>/g, "\\tab{}");
- txt = Zotero.Utilities.unescapeHTML(txt);
+ txt = this.convert("htmlRTF", txt);
for (var i=0,ilen=this._htmlRTFmap.length; i < ilen; i++) {
var entry = this._htmlRTFmap[i];
txt = txt.replace(entry[0], entry[1]);
}
- txt = this.convert("htmlRTF", txt);
+ txt = Zotero.Utilities.unescapeHTML(txt);
+ txt = txt.replace(/[\x7F-\uFFFF]/g, function(aChar) { return "\\uc0\\u"+aChar.charCodeAt(0).toString()+"{}"});
return txt.trim();
}
diff --git a/chrome/content/zotero/integration/addCitationDialog.js b/chrome/content/zotero/integration/addCitationDialog.js
@@ -41,6 +41,7 @@ var Zotero_Citation_Dialog = new function () {
var _previewShown = false;
var _suppressNextTreeSelect = false;
var _suppressNextListSelect = false;
+ var _customHTML = false;
var _locatorIndexArray = {};
var _locatorNameArray = {};
var _autoRegeneratePref;
@@ -556,6 +557,9 @@ var Zotero_Citation_Dialog = new function () {
if(_previewShown) {
document.documentElement.getButton("extra2").label = Zotero.getString("citation.hideEditor");
+ if (!text && _customHTML) {
+ text = _customHTML;
+ }
if(text) {
io.preview().then(function(preview) {
_originalHTML = preview;
@@ -565,6 +569,11 @@ var Zotero_Citation_Dialog = new function () {
_updatePreview();
}
} else {
+ if (editor.initialized) {
+ if (editor.value) {
+ _customHTML = editor.value;
+ }
+ }
document.documentElement.getButton("extra2").label = Zotero.getString("citation.showEditor");
}
}
@@ -795,4 +804,4 @@ var Zotero_Citation_Dialog = new function () {
function _clearCitationList() {
while(_citationList.firstChild) _citationList.removeChild(_citationList.firstChild);
}
-}
-\ No newline at end of file
+}