Revised to capitalize the account titles when initializing the base accounts instead of when displaying the account titles, so that the titles of the user-added accounts are not capitalized incorrectly.
This commit is contained in:
59
src/accounting/utils/title_case.py
Normal file
59
src/accounting/utils/title_case.py
Normal file
@ -0,0 +1,59 @@
|
||||
# The Mia! Accounting Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/7/29
|
||||
|
||||
# Copyright (c) 2023 imacat.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
"""The title case capitalization for the base account titles.
|
||||
This follows the APA style title case capitalization. See
|
||||
https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case .
|
||||
|
||||
This module should not import any other module from the application.
|
||||
|
||||
"""
|
||||
import re
|
||||
|
||||
CONJUNCTIONS: set[str] = {"and", "as", "but", "for", "if", "nor", "or", "so",
|
||||
"yet"}
|
||||
"""Short conjunctions."""
|
||||
ARTICLES: set[str] = {"a", "an", "the"}
|
||||
"""Articles."""
|
||||
PREPOSITIONS: set[str] = {"as", "at", "by", "for", "in", "of", "on", "per",
|
||||
"to", "up", "via"}
|
||||
"""Short prepositions."""
|
||||
MINOR_WORDS: set[str] \
|
||||
= CONJUNCTIONS.copy().union(ARTICLES).union(PREPOSITIONS)
|
||||
"""Minor words that should be in lowercase."""
|
||||
# Excludes "by" as in "1223 by-products"
|
||||
MINOR_WORDS.remove("by")
|
||||
|
||||
|
||||
def title_case(s: str) -> str:
|
||||
"""Capitalize a title string for the base account titles. Do not use it
|
||||
in other places. This excludes "by" as in "1223 by-products".
|
||||
|
||||
:param s: The title string.
|
||||
:return: The capitalized title string.
|
||||
"""
|
||||
return re.sub(r"\w+", __cap_word, s)
|
||||
|
||||
|
||||
def __cap_word(m: re.Match) -> str:
|
||||
"""Capitalize a matched title word.
|
||||
|
||||
:param m: The matched title word.
|
||||
:return: The capitalized title word.
|
||||
"""
|
||||
if m.group(0).lower() in MINOR_WORDS:
|
||||
return m.group(0)
|
||||
return m.group(0).title()
|
Reference in New Issue
Block a user