From dd5b8ea1d5c71462cd2bcf40353a9d0b5632969e Mon Sep 17 00:00:00 2001 From: Patrick Date: Sun, 29 Jan 2023 10:05:48 +0900 Subject: [PATCH] Implementation as class --- .gitignore | 1 + README.md | 3 ++ __pycache__/soundchanger.cpython-310.pyc | Bin 0 -> 1368 bytes soundchanger.py | 32 ++++++++++++++++++ .../test_apply.cpython-310-pytest-7.1.2.pyc | Bin 0 -> 2625 bytes tests/test_apply.py | 24 +++++++++++++ 6 files changed, 60 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 __pycache__/soundchanger.cpython-310.pyc create mode 100644 soundchanger.py create mode 100644 tests/__pycache__/test_apply.cpython-310-pytest-7.1.2.pyc create mode 100644 tests/test_apply.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b0f8a61 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.pytest* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f018368 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# SoundChanger + +Applies sound changes to words. \ No newline at end of file diff --git a/__pycache__/soundchanger.cpython-310.pyc b/__pycache__/soundchanger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7e1baea42cb5816694800f0b61270cddee3a2f0 GIT binary patch literal 1368 zcmZuwPfrs;6rVRU+b*RD;Xsg!6)&tY)H6ZAU_!j~!oj3!CQE0bOUky+ZZX#OBz_9g zq&@mY{01gwuAcY`J*e-^wxpo5nfKn#pWplUoA%ODiQ#zj{YPUY82d#(^8?q|0nT&- zg=QLBtj>;@=2~1aExzzNXgFqpyup1|Yml5D9DfdQrq5AC3{SH<*H9NZLS1U9y(?Dt zbU_zU7qqVzP#1LxQ5S9Duo)(2QSW7`g5!0PW?_=WVHTy8u##pbPR=SO>X;~vk}S;P zc2a4d(pI~h=t{#~-gb8z6v}LnO{pE?Odp`=vk~jV7yy$*$50EvdY#auQNXQCqt>Y{ zM=RYgEdv>JwI-?JD;qtRGh?_QVZmdoIilxa(;Sy zw$}h$pAE8$I9-67X!O}RyTNr) z4he&*Ag35jXXhB_WdDO9Z!ys4Erz7V&t_1r8G0CIkpy+k!e=JX%@PUXlvze$OGsIhr61$0Y5geCxh2oraT3V9FCLvMs+=%Zswla< z*DFJ0B{=sEeOLj>C9LAN&evcK)^Tot|GQV7lFCu{PVb0yl!)uy4jLI7;oHRu5s!#Z z$Ro!mN&iEtv4E6$hi2ewtBjXPAO4Do*w1!ni!Y1KGq?9cwb74Za0wGKDk~YLA5gkJ?D;|u%TCAs4m3mlmhmd1Yi2X7v&YVg8@IDo%-K(>+j}) N>=83k0`l3a_zQbBEOr0@ literal 0 HcmV?d00001 diff --git a/soundchanger.py b/soundchanger.py new file mode 100644 index 0000000..add1d02 --- /dev/null +++ b/soundchanger.py @@ -0,0 +1,32 @@ +import re + + +class Change: + """ + Instantiates a string representation of a sound change. + """ + + def __init__(self, change): + self.parse(change) + + def __repr__(self): + return f"{self.b}>{self.a}/{self.f}_{self.t}" + + def parse(self, change): + if '/' in change: + _change, _env = change.split('/') + else: + _change = change + _env = '_' + self.b, self.a = _change.split('>') + self.f, self.t = _env.split('_') + + if self.f.startswith("{") and self.f.endswith("}"): + self.f = self.f[1:-1].split(',') + self.f = f"[{''.join(self.f)}]" + if self.t.startswith("{") and self.t.endswith("}"): + self.t = self.t[1:-1].split(',') + self.t = f"[{''.join(self.t)}]" + + def sub(self, string): + return re.sub(f"(?<={self.f}){self.b}(?={self.t})", f"{self.a}", f"#{string}#").strip('#') diff --git a/tests/__pycache__/test_apply.cpython-310-pytest-7.1.2.pyc b/tests/__pycache__/test_apply.cpython-310-pytest-7.1.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21b4975ded9e218413ab556982c4c812dc991bf8 GIT binary patch literal 2625 zcmd^By>A>v6rb7eTc2Y>L?8u{B@^R~tUI5{2a#|Th!CQ&gwnZLjc@ki#rvh1y(DMv z7Wq*AiWE5|MXsTs5A-bF$-cn>)~V zxXV50eNOL_pz|y2L$(8|oO^pLdk_uLKYlzgu-$_u_b4GHocN5^q$1zansTEyDq0yZ zVsf*#DzmcojoPkk`AuoOf^#c-M7fRQBV%fDr?g(#Q}U3=YcTIrWJ*OJEElbe!aUk^ zN_B6{dvo4fQ_9_!_GMB#+~b|fi7D7_>A~tw3l+tP$Xh9vNF(GkWm#)wN=BGm!q_ z+*saPMr-qU2#opAMj(4~yzAF%xZrvq1HWG0YL?#)q@u%_t;}Mwfv|~i9pNUz?V}|o zWh6?y`CtIctzt45C~Kb;5Ys*zv6(NBk;;Talz+FFl#wh$Ce+1n$dV)!Q6YwTS}+l* zE=-5J<2WhfOe!bIVTDv5gmNz*CtNQLA0+uMOTvt$k?Mq!jUwDZUHDuF66e{MLgYeS z3P-s}Ss6x;iv+HwgqfKqkg93{k7)uQw4G1d&W*P7Y1_Hg#M$gW*f`~F&WN}QXB_qV zdwCl53s&~Oip&1}e4Oz{K0s%<0jV)$MUhN;#YC;@YmsqUBvCljItw4gCA>JiLiR8g zd6q_5X`##<0FQo0zo+73FwfTGWw`nOj2`{-tH*ivSU59#{Qei&ddeO&)tI*T>rt2H{|^t<4n zP3(^}v9VGm(c^Z8ZZlhJf') + assert c.sub('pana') == 'fana' + assert c.sub('kapa') == 'kafa' + +def test_simple_change_with_environment(): + c = Change('p>f/#_a') + assert c.sub('pana') == 'fana' + assert c.sub('pune') == 'pune' + assert c.sub('kapa') == 'kapa' + +def test_complex_change_with_environment(): + c = Change('p>f/{#,a}_{a,u}') + assert c.sub('pana') == 'fana' + assert c.sub('pune') == 'fune' + assert c.sub('kapa') == 'kafa' + +# def test_simple_change_with_category(): +# c = Change('w>h/V_V') +# assert c.sub('kawa') == 'kaha' +# assert c.sub('tuwo') == 'tuho' \ No newline at end of file