diff --git a/chrome/content/zotero/bindings/itembox.xml b/chrome/content/zotero/bindings/itembox.xml index f82050e1f..fdd9a1841 100644 --- a/chrome/content/zotero/bindings/itembox.xml +++ b/chrome/content/zotero/bindings/itembox.xml @@ -1947,7 +1947,12 @@ var newVal = Zotero.Utilities.capitalizeTitle(val.toLowerCase(), true); break; case 'sentence': - var newVal = val.length ? val[0].toUpperCase()+val.substr(1).toLowerCase() : val; + // capitalize the first letter, including after beginning punctuation + // capitalize after :, ?, ! and remove space(s) before those analogous to capitalizeTitle function + // also deal with initial punctuation here - open quotes and Spanish beginning quotation marks + newVal = val.toLowerCase(); + newVal = newVal.replace(/(([:\?!]\s*|^)([\'\"¡¿“‘„«\s]+)?[^\s])/g, function (x) { + return x.replace(/\s+/m, " ").toUpperCase();}); break; default: throw ("Invalid transform mode '" + mode + "' in zoteroitembox.textTransform()"); diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js index fc4ca851c..6e0b66bc7 100644 --- a/chrome/content/zotero/xpcom/utilities.js +++ b/chrome/content/zotero/xpcom/utilities.js @@ -757,13 +757,17 @@ Zotero.Utilities = { // not first or last word && i != 0 && i != lastWordIndex // does not follow a colon - && (previousWordIndex == -1 || words[previousWordIndex][words[previousWordIndex].length-1] != ":") + && (previousWordIndex == -1 || words[previousWordIndex][words[previousWordIndex].length-1].search(/[:\?!]/)==-1) ) { words[i] = lowerCaseVariant; } else { // this is not a skip word or comes after a colon; // we must capitalize - words[i] = upperCaseVariant.substr(0, 1) + lowerCaseVariant.substr(1); + // handle punctuation in the beginning, including multiple, as in "¿Qué pasa?" + var punct = words[i].match(/^[\'\"¡¿“‘„«\s]+/); + punct = punct ? punct[0].length+1 : 1; + words[i] = words[i].length ? words[i].substr(0, punct).toUpperCase() + + words[i].substr(punct).toLowerCase() : words[i]; } }