Fix proper case conversion logic for single and smart single quotes

Changed all instances of TITLECASE to PROPERCASE for consistency.

Close #13584
This commit is contained in:
cynthplusplus 2023-04-24 12:27:11 -04:00 committed by Don Ho
parent 391f4281ef
commit 9b7dff6fa9
3 changed files with 23 additions and 13 deletions

View File

@ -1880,11 +1880,11 @@ void Notepad_plus::command(int id)
break; break;
case IDM_EDIT_PROPERCASE_FORCE: case IDM_EDIT_PROPERCASE_FORCE:
_pEditView->convertSelectedTextToNewerCase(TITLECASE_FORCE); _pEditView->convertSelectedTextToNewerCase(PROPERCASE_FORCE);
break; break;
case IDM_EDIT_PROPERCASE_BLEND: case IDM_EDIT_PROPERCASE_BLEND:
_pEditView->convertSelectedTextToNewerCase(TITLECASE_BLEND); _pEditView->convertSelectedTextToNewerCase(PROPERCASE_BLEND);
break; break;
case IDM_EDIT_SENTENCECASE_FORCE: case IDM_EDIT_SENTENCECASE_FORCE:

View File

@ -182,6 +182,12 @@ int getNbDigits(int aNum, int base)
return nbChiffre; return nbChiffre;
} }
bool isCharSingleQuote(__inout wchar_t const c)
{
if (c == L'\'' || c == L'\u2019' || c == L'\u2018') return true;
else return false;
}
void ScintillaEditView::init(HINSTANCE hInst, HWND hPere) void ScintillaEditView::init(HINSTANCE hInst, HWND hPere)
{ {
if (!_SciInit) if (!_SciInit)
@ -3167,24 +3173,28 @@ void ScintillaEditView::changeCase(__inout wchar_t * const strWToConvert, const
} }
break; break;
} //case LOWERCASE } //case LOWERCASE
case TITLECASE_FORCE: case PROPERCASE_FORCE:
case TITLECASE_BLEND: case PROPERCASE_BLEND:
{ {
for (int i = 0; i < nbChars; ++i) for (int i = 0; i < nbChars; ++i)
{ {
if (::IsCharAlphaW(strWToConvert[i])) if (::IsCharAlphaW(strWToConvert[i]))
{ {
if ((i < 1) ? true : !::IsCharAlphaNumericW(strWToConvert[i - 1])) // Exception for single quote and smart single quote
strWToConvert[i] = (WCHAR)(UINT_PTR)::CharUpperW(reinterpret_cast<LPWSTR>(strWToConvert[i])); if ((i < 2) ? false :
else if (caseToConvert == TITLECASE_FORCE) (isCharSingleQuote(strWToConvert[i - 1]) && ::IsCharAlphaNumericW(strWToConvert[i - 2])))
{
if (caseToConvert == PROPERCASE_FORCE)
strWToConvert[i] = (WCHAR)(UINT_PTR)::CharLowerW(reinterpret_cast<LPWSTR>(strWToConvert[i])); strWToConvert[i] = (WCHAR)(UINT_PTR)::CharLowerW(reinterpret_cast<LPWSTR>(strWToConvert[i]));
//An exception }
if ((i < 2) ? false : (strWToConvert[i - 1] == L'\'' && ::IsCharAlphaW(strWToConvert[i - 2]))) else if ((i < 1) ? true : !::IsCharAlphaNumericW(strWToConvert[i - 1]))
strWToConvert[i] = (WCHAR)(UINT_PTR)::CharUpperW(reinterpret_cast<LPWSTR>(strWToConvert[i]));
else if (caseToConvert == PROPERCASE_FORCE)
strWToConvert[i] = (WCHAR)(UINT_PTR)::CharLowerW(reinterpret_cast<LPWSTR>(strWToConvert[i])); strWToConvert[i] = (WCHAR)(UINT_PTR)::CharLowerW(reinterpret_cast<LPWSTR>(strWToConvert[i]));
} }
} }
break; break;
} //case TITLECASE } //case PROPERCASE
case SENTENCECASE_FORCE: case SENTENCECASE_FORCE:
case SENTENCECASE_BLEND: case SENTENCECASE_BLEND:
{ {

View File

@ -97,8 +97,8 @@ enum TextCase : UCHAR
{ {
UPPERCASE, UPPERCASE,
LOWERCASE, LOWERCASE,
TITLECASE_FORCE, PROPERCASE_FORCE,
TITLECASE_BLEND, PROPERCASE_BLEND,
SENTENCECASE_FORCE, SENTENCECASE_FORCE,
SENTENCECASE_BLEND, SENTENCECASE_BLEND,
INVERTCASE, INVERTCASE,