Dialogue working
This commit is contained in:
parent
3fcde613a8
commit
e23e8f3b10
2 changed files with 32 additions and 5 deletions
|
|
@ -235,10 +235,11 @@ class TestManualFontAndWrap(unittest.TestCase):
|
||||||
max_line_len=80,
|
max_line_len=80,
|
||||||
)
|
)
|
||||||
changed = ws.wrap_overflow_manual_in_scope(path, doc, hit, 36, font=14)
|
changed = ws.wrap_overflow_manual_in_scope(path, doc, hit, 36, font=14)
|
||||||
self.assertEqual(changed, 1)
|
# Both 噂 entries get body font (short "OK" included); other category skipped.
|
||||||
|
self.assertEqual(changed, 2)
|
||||||
saved = json.loads(path.read_text(encoding="utf-8"))
|
saved = json.loads(path.read_text(encoding="utf-8"))
|
||||||
self.assertIn(r"\f[14]", saved["names"][0]["text"])
|
self.assertIn(r"\f[14]", saved["names"][0]["text"])
|
||||||
self.assertEqual(saved["names"][1]["text"], "OK")
|
self.assertEqual(saved["names"][1]["text"], r"\f[14]OK")
|
||||||
self.assertEqual(saved["names"][2]["text"], "x" * 80)
|
self.assertEqual(saved["names"][2]["text"], "x" * 80)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -482,6 +483,28 @@ class TestNameplateWrap(unittest.TestCase):
|
||||||
)
|
)
|
||||||
self.assertLessEqual(body_lines, 2)
|
self.assertLessEqual(body_lines, 2)
|
||||||
|
|
||||||
|
def test_manual_group_applies_font_to_short_spoken_lines(self):
|
||||||
|
"""Group wrap with body font must not skip short lines that already fit."""
|
||||||
|
short = "Celria\nJust now...... what did you say?"
|
||||||
|
line = {
|
||||||
|
"text": short,
|
||||||
|
"speaker": "セルリア",
|
||||||
|
"speaker_src": "literal_line1_lowconf",
|
||||||
|
}
|
||||||
|
self.assertTrue(ws._apply_manual_to_line_dict(line, 70, font=21))
|
||||||
|
self.assertEqual(
|
||||||
|
line["text"],
|
||||||
|
"Celria\n\\f[21]Just now...... what did you say?",
|
||||||
|
)
|
||||||
|
# Font 0 / None: still skip short plain lines (width-only group wrap).
|
||||||
|
line2 = {
|
||||||
|
"text": short,
|
||||||
|
"speaker": "セルリア",
|
||||||
|
"speaker_src": "literal_line1_lowconf",
|
||||||
|
}
|
||||||
|
self.assertFalse(ws._apply_manual_to_line_dict(line2, 70, font=None))
|
||||||
|
self.assertEqual(line2["text"], short)
|
||||||
|
|
||||||
def test_dialogue_geometry_roundtrip(self):
|
def test_dialogue_geometry_roundtrip(self):
|
||||||
with tempfile.TemporaryDirectory() as tmp:
|
with tempfile.TemporaryDirectory() as tmp:
|
||||||
work = Path(tmp)
|
work = Path(tmp)
|
||||||
|
|
|
||||||
|
|
@ -1075,8 +1075,9 @@ def apply_manual_font_and_wrap(
|
||||||
are collapsed and rebuilt so Manual Wrap matches what the preview shows.
|
are collapsed and rebuilt so Manual Wrap matches what the preview shows.
|
||||||
Nameplate lines (``Celria\\n…``) stay on their own first line.
|
Nameplate lines (``Celria\\n…``) stay on their own first line.
|
||||||
|
|
||||||
When *only_overflow_or_fonts* is True (group wrap), skip short plain lines
|
When *only_overflow_or_fonts* is True, skip short plain lines that already
|
||||||
that already match the target layout and have no ``\\f[N]``.
|
match the target layout and have no ``\\f[N]``. Manual group wrap passes
|
||||||
|
False whenever a body font is set so short spoken lines still get ``\\f``.
|
||||||
|
|
||||||
Returns ``(new_text, changed)``.
|
Returns ``(new_text, changed)``.
|
||||||
"""
|
"""
|
||||||
|
|
@ -1195,11 +1196,14 @@ def _apply_manual_to_line_dict(
|
||||||
text = line.get("text")
|
text = line.get("text")
|
||||||
if not isinstance(text, str) or not text.strip():
|
if not isinstance(text, str) or not text.strip():
|
||||||
return False
|
return False
|
||||||
|
# Font set: apply to every line in the group (short spoken lines included).
|
||||||
|
# Font 0 / None: only reflow lines that overflow or already have \\f[N].
|
||||||
|
only_overflow = font is None or int(font) <= 0
|
||||||
new_text, changed = apply_manual_font_and_wrap(
|
new_text, changed = apply_manual_font_and_wrap(
|
||||||
text,
|
text,
|
||||||
width,
|
width,
|
||||||
font=font,
|
font=font,
|
||||||
only_overflow_or_fonts=True,
|
only_overflow_or_fonts=only_overflow,
|
||||||
speaker_src=str(line.get("speaker_src") or ""),
|
speaker_src=str(line.get("speaker_src") or ""),
|
||||||
speaker=str(line.get("speaker") or ""),
|
speaker=str(line.get("speaker") or ""),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue