Add "Capitalize" text transform to creator context menu (#2801)

This commit is contained in:
Abe Jellinek 2022-10-11 01:28:27 -04:00 committed by GitHub
parent 9be51a5cb0
commit 568b88e342
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 15 deletions

View file

@ -72,6 +72,7 @@
</menupopup>
<menupopup id="zotero-creator-transform-menu">
<menuitem id="creator-transform-swap-names" label="&zotero.item.creatorTransform.nameSwap;"/>
<menuitem id="creator-transform-capitalize" label="&zotero.item.creatorTransform.capitalize;"/>
</menupopup>
<menupopup id="zotero-doi-menu">
<menuitem id="zotero-doi-menu-view-online" label="&zotero.item.viewOnline;"/>
@ -190,10 +191,15 @@
}
});
this._id('zotero-field-transform-menu').addEventListener('popupshowing', () => {
this._id('creator-transform-title-case').disabled = !this.canTextTransformField(document.popupNode, 'title');
this._id('creator-transform-sentence-case').disabled = !this.canTextTransformField(document.popupNode, 'sentence');
});
this._id('creator-transform-title-case').addEventListener('command',
() => this.textTransform(document.popupNode, 'title'));
() => this.textTransformField(document.popupNode, 'title'));
this._id('creator-transform-sentence-case').addEventListener('command',
() => this.textTransform(document.popupNode, 'sentence'));
() => this.textTransformField(document.popupNode, 'sentence'));
this._id('zotero-creator-transform-menu').addEventListener('popupshowing', (event) => {
var row = document.popupNode.closest('tr');
@ -212,6 +218,9 @@
this._id('creator-transform-swap-names').addEventListener('command',
event => this.swapNames(event));
this._id('creator-transform-capitalize').addEventListener('command',
event => this.capitalizeCreatorName(event));
this._notifierID = Zotero.Notifier.registerObserver(this, ['item'], 'itemBox');
}
@ -918,9 +927,11 @@
firstlast.lastChild.hidden = true;
}
if (this.editable && fieldMode == 0) {
if (this.editable) {
firstlast.oncontextmenu = (event) => {
document.popupNode = firstlast;
this._id('creator-transform-swap-names').hidden = fieldMode > 0;
this._id('creator-transform-capitalize').disabled = !this.canCapitalizeCreatorName(td.parentNode);
this._id('zotero-creator-transform-menu').openPopupAtScreen(
event.screenX + 1,
event.screenY + 1,
@ -2057,26 +2068,34 @@
}
}
/**
* TODO: work with textboxes too
*/
async textTransform(label, mode) {
var val = this._getFieldValue(label);
textTransformString(val, mode) {
switch (mode) {
case 'title':
var newVal = Zotero.Utilities.capitalizeTitle(val.toLowerCase(), true);
break;
return Zotero.Utilities.capitalizeTitle(val.toLowerCase(), true);
case 'sentence':
// capitalize the first letter, including after beginning punctuation
// capitalize after ?, ! and remove space(s) before those as well as colon analogous to capitalizeTitle function
// also deal with initial punctuation here - open quotes and Spanish beginning punctuation marks
newVal = val.toLowerCase().replace(/\s*:/, ":");
newVal = newVal.replace(/(([\?!]\s*|^)([\'\"¡¿“‘„«\s]+)?[^\s])/g, function (x) {
val = val.toLowerCase().replace(/\s*:/, ":");
val = val.replace(/(([\?!]\s*|^)([\'\"¡¿“‘„«\s]+)?[^\s])/g, function (x) {
return x.replace(/\s+/m, " ").toUpperCase();});
break;
return val;
default:
throw new Error("Invalid transform mode '" + mode + "' in ItemBox.textTransform()");
throw new Error("Invalid transform mode '" + mode + "' in ItemBox.textTransformString()");
}
}
canTextTransformField(label, mode) {
let val = this._getFieldValue(label);
return this.textTransformString(val, mode) != val;
}
/**
* TODO: work with textboxes too
*/
async textTransformField(label, mode) {
var val = this._getFieldValue(label);
var newVal = this.textTransformString(val, mode);
this._setFieldValue(label, newVal);
var fieldName = label.getAttribute('fieldname');
this._modifyField(fieldName, newVal);
@ -2163,6 +2182,30 @@
}
}
canCapitalizeCreatorName(row) {
var fields = this.getCreatorFields(row);
return fields.firstName && Zotero.Utilities.capitalizeName(fields.firstName) != fields.firstName
|| fields.lastName && Zotero.Utilities.capitalizeName(fields.lastName) != fields.lastName;
}
/**
* @return {Promise}
*/
async capitalizeCreatorName(event) {
var row = document.popupNode.closest('tr');
var typeBox = row.querySelector('.creator-type-label');
var creatorIndex = parseInt(typeBox.getAttribute('fieldname').split('-')[1]);
var fields = this.getCreatorFields(row);
fields.firstName = fields.firstName && Zotero.Utilities.capitalizeName(fields.firstName);
fields.lastName = fields.lastName && Zotero.Utilities.capitalizeName(fields.lastName);
this.modifyCreator(creatorIndex, fields);
if (this.saveOnEdit) {
// See note in transformText()
await this.blurOpenField();
await this.item.saveTx();
}
}
/**
* @return {Promise}
*/

@ -1 +1 @@
Subproject commit 4d8d7d3e92cbc3b4d62b82478e212a6f63b9a35f
Subproject commit 3143d5518d0044152bdca2b11e5ba2de92b5101f

View file

@ -114,6 +114,7 @@
<!ENTITY zotero.item.textTransform.titlecase "Title Case">
<!ENTITY zotero.item.textTransform.sentencecase "Sentence case">
<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names">
<!ENTITY zotero.item.creatorTransform.capitalize "Capitalize">
<!ENTITY zotero.item.viewOnline "View Online">
<!ENTITY zotero.item.copyAsURL "Copy as URL">
<!ENTITY zotero.item.deletePermanently "Delete Permanently…">