add pronouns
This commit is contained in:
parent
e370172826
commit
6ff27f9858
2 changed files with 111 additions and 0 deletions
|
|
@ -12,6 +12,7 @@
|
||||||
+ Add more exceptions: `NotFoundError()`, `BabelTowerError()`
|
+ Add more exceptions: `NotFoundError()`, `BabelTowerError()`
|
||||||
+ Add `sass` module
|
+ Add `sass` module
|
||||||
+ Add `quart` module with `negotiate()`, `add_rest()`, `add_i18n()`, `WantsContentType`
|
+ Add `quart` module with `negotiate()`, `add_rest()`, `add_i18n()`, `WantsContentType`
|
||||||
|
+ Add `dei` module: it implements a compact and standardized representation for pronouns, inspired by the one in use at PronounDB
|
||||||
|
|
||||||
## 0.4.0
|
## 0.4.0
|
||||||
|
|
||||||
|
|
|
||||||
110
src/suou/dei.py
Normal file
110
src/suou/dei.py
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
"""
|
||||||
|
Utilities for Diversity, Equity, Inclusion.
|
||||||
|
|
||||||
|
This implements a cool compact representation for pronouns, inspired by the one in use at <https://pronoundb.org/>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Copyright (c) 2025 Sakuragasaki46.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
See LICENSE for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
This software is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
BRICKS = '@abcdefghijklmnopqrstuvwxyz+?-\'/'
|
||||||
|
"""
|
||||||
|
Legend:
|
||||||
|
a through z, ' (apostrophe) and - (hyphen/dash) mean what they mean.
|
||||||
|
? is an unknown symbol or non-ASCII/non-alphabetic character.
|
||||||
|
+ is a suffix separator (like / but allows for a more compact notation).
|
||||||
|
/ is the separator.
|
||||||
|
|
||||||
|
Except for the presets (see Pronoun.PRESETS below), pronouns expand to the
|
||||||
|
given notation: e.g. ae+r is ae/aer.
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Pronoun(int):
|
||||||
|
"""
|
||||||
|
Implementation of pronouns in a compact style.
|
||||||
|
A pronoun is first normalized, then furtherly compressed by turning it
|
||||||
|
into an integer (see Pronoun.from_short()).
|
||||||
|
|
||||||
|
Subclass of int, ideal for databases. Short form is recommended in
|
||||||
|
transfer (e.g. if writing a REST).
|
||||||
|
"""
|
||||||
|
PRESETS = {
|
||||||
|
'hh': 'he/him',
|
||||||
|
'sh': 'she/her',
|
||||||
|
'tt': 'they/them',
|
||||||
|
'ii': 'it/its',
|
||||||
|
'hs': 'he/she',
|
||||||
|
'ht': 'he/they',
|
||||||
|
'hi': 'he/it',
|
||||||
|
'shh': 'she/he',
|
||||||
|
'st': 'she/they',
|
||||||
|
'si': 'she/it',
|
||||||
|
'th': 'they/he',
|
||||||
|
'ts': 'they/she',
|
||||||
|
'ti': 'they/it',
|
||||||
|
}
|
||||||
|
|
||||||
|
UNSPECIFIED = 0
|
||||||
|
|
||||||
|
## presets from PronounDB
|
||||||
|
## DO NOT TOUCH the values unless you know their exact correspondence!!
|
||||||
|
## hint: Pronoun.from_short()
|
||||||
|
HE = HE_HIM = 264
|
||||||
|
SHE = SHE_HER = 275
|
||||||
|
THEY = THEY_THEM = 660
|
||||||
|
IT = IT_ITS = 297
|
||||||
|
HE_SHE = 616
|
||||||
|
HE_THEY = 648
|
||||||
|
HE_IT = 296
|
||||||
|
SHE_HE = 8467
|
||||||
|
SHE_THEY = 657
|
||||||
|
SHE_IT = 307
|
||||||
|
THEY_HE = 276
|
||||||
|
THEY_SHE = 628
|
||||||
|
THEY_IT = 308
|
||||||
|
ANY = 26049
|
||||||
|
OTHER = 19047055
|
||||||
|
ASK = 11873
|
||||||
|
AVOID = NAME_ONLY = 4505281
|
||||||
|
|
||||||
|
def short(self) -> str:
|
||||||
|
i = self
|
||||||
|
s = ''
|
||||||
|
while i > 0:
|
||||||
|
s += BRICKS[i % 32]
|
||||||
|
i >>= 5
|
||||||
|
return s
|
||||||
|
|
||||||
|
def full(self):
|
||||||
|
s = self.short()
|
||||||
|
|
||||||
|
if s in self.PRESETS:
|
||||||
|
return self.PRESETS[s]
|
||||||
|
|
||||||
|
if '+' in s:
|
||||||
|
s1, s2 = s.rsplit('+')
|
||||||
|
s = s1 + '/' + s1 + s2
|
||||||
|
|
||||||
|
return s
|
||||||
|
__str__ = full
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_short(self, s: str) -> Pronoun:
|
||||||
|
i = 0
|
||||||
|
for j, ch in enumerate(s):
|
||||||
|
i += BRICKS.index(ch) << (5 * j)
|
||||||
|
return Pronoun(i)
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue