Skip to content

Commit

Permalink
Merge branch 'jp_pronunciation' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
jzohrab committed Nov 29, 2023
2 parents d57954a + 3cc91f3 commit 614c76e
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 12 deletions.
1 change: 1 addition & 0 deletions lute/models/setting.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ def load():
"backup_dir": app_config.default_user_backup_path,
"backup_count": 5,
"mecab_path": None,
"japanese_reading": "katakana",
"current_theme": "-",
"custom_styles": "/* Custom css to modify Lute's appearance. */",
"show_highlights": True,
Expand Down
12 changes: 11 additions & 1 deletion lute/parse/mecab_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
import re
from typing import List
from natto import MeCab
import jaconv
from lute.parse.base import ParsedToken, AbstractParser
from lute.models.setting import UserSetting


class JapaneseParser(AbstractParser):
Expand Down Expand Up @@ -136,4 +138,12 @@ def get_reading(self, text: str):
ret = "".join(readings).strip()
if ret in ("", text):
return None
return ret

jp_reading_setting = UserSetting.get_value("japanese_reading")
if jp_reading_setting == "katakana":
return ret
if jp_reading_setting == "hiragana":
return jaconv.kata2hira(ret)
if jp_reading_setting == "alphabet":
return jaconv.kata2alphabet(ret)
raise RuntimeError(f"Bad reading type {jp_reading_setting}")
6 changes: 6 additions & 0 deletions lute/settings/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ class UserSettingsForm(FlaskForm):
show_highlights = BooleanField("Highlight terms by status")

mecab_path = StringField("MECAB_PATH environment variable")
reading_choices = [
("katakana", "Katakana"),
("hiragana", "Hiragana"),
("alphabet", "Romaji"),
]
japanese_reading = SelectField("Pronunciation characters", choices=reading_choices)

def validate_backup_dir(self, field):
"Field must be set if enabled."
Expand Down
26 changes: 15 additions & 11 deletions lute/templates/settings/form.html
Original file line number Diff line number Diff line change
Expand Up @@ -85,21 +85,11 @@ <h2>Appearance</h2>

<tr>
<td>
<h2>MeCab (Japanese only)</h2>
<h2>Japanese</h2>
</td>
<td />
</tr>

<tr>
<td>
<button onclick="test_mecab_setup(); return false;">
Test my MeCab configuration
</button>
</td>
<td>
<div id="parse_result"></div>
</td>
</tr>
<tr>
<td>
{{ form.mecab_path.label }}
Expand Down Expand Up @@ -127,6 +117,20 @@ <h2>MeCab (Japanese only)</h2>
</td>
<td>{{ form.mecab_path(class="form-control") }}</td>
</tr>
<tr>
<td>
</td>
<td>
<button onclick="test_mecab_setup(); return false;">
Test my MeCab configuration
</button>
<div style="margin-top: 5px" id="parse_result"></div>
</td>
</tr>
<tr>
<td>{{ form.japanese_reading.label }}</td>
<td>{{ form.japanese_reading }}</td>
</tr>

</table>

Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ dependencies = [
"Flask-SQLAlchemy>=3.1.1,<4",
"Flask-WTF>=1.2.1,<2",
"natto-py>=1.0.1,<2",
"jaconv>=0.3.4,<1",
"platformdirs>=3.10.0,<4",
"requests>=2.31.0,<3",
"beautifulsoup4>=4.12.2,<5",
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ iniconfig==2.0.0
invoke==2.2.0
isort==5.12.0
itsdangerous==2.1.2
jaconv==0.3.4
Jinja2==3.1.2
lazy-object-proxy==1.9.0
Mako==1.2.4
Expand Down
16 changes: 16 additions & 0 deletions tests/unit/parse/test_JapaneseParser.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from lute.parse.mecab_parser import JapaneseParser
from lute.models.term import Term
from lute.models.setting import UserSetting
from lute.db import db
from lute.parse.base import ParsedToken


Expand Down Expand Up @@ -74,3 +76,17 @@ def test_readings():

for c in cases:
assert p.get_reading(c[0]) == c[1], c[0]


def test_reading_setting(app_context):
"Return reading matching user setting."
cases = {
"katakana": "ツヨイ",
"hiragana": "つよい",
"alphabet": "tsuyoi",
}
p = JapaneseParser()
for k, v in cases.items():
UserSetting.set_value("japanese_reading", k)
db.session.commit()
assert p.get_reading("強い") == v, k

0 comments on commit 614c76e

Please sign in to comment.