Change Transform text so that sentence case capitalizes after :, ?, ! This is in line with English usage and this function is principally useful for English titles.

also deal with punctuation at the beginning of title

Also fix capitalizeTitle to work with quotation marks and Spanish beginning punctuation. Also adds ? and ! as punctuation after which it always capitalizes

switch sentence case conversion to a regex; I'm leaving capitalizeTitle as the substring routine, it's the same length and probably slightly more efficient.
This commit is contained in:
adam3smith 2013-10-24 20:41:01 -06:00
parent 49ecb8ecac
commit 953c94c7fe
2 changed files with 12 additions and 3 deletions

View File

@ -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()");

View File

@ -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];
}
}