"""Дефис внутри гиперссылки: текст не должен дублироваться. Методичка МИРЭА (`_method_extract.txt`, строки 373-376): знак дефиса «-» не отделяется пробелами и используется в сложных словах (во-первых, физико-математический, кто-либо) и в интервалах (100-150 Мб). Поэтому слово не должно рваться по дефису при переносе строки — вместо обычного дефиса в текст пишется отдельный элемент `w:noBreakHyphen`, как это уже делает `Paragraph.add_run`. """ import os import unittest import docx from docx.oxml.ns import qn from md2gost import package_dir from md2gost.renderable.paragraph import Link, Paragraph from md2gost.styles import apply_mirea_styles def _texts(element) -> list[str]: return [t.text or "" for t in element.iter(qn("w:t"))] class TestLinkHyphen(unittest.TestCase): def setUp(self) -> None: self._document = docx.Document(os.path.join(package_dir(), "Template.docx")) self._document._body.clear_content() apply_mirea_styles(self._document) def _hyperlink(self, text: str): paragraph = Paragraph(self._document._body) link = Link("https://example.com", paragraph._docx_paragraph) link.add_run(text) return link.element def test_compound_word_is_split_around_no_break_hyphen(self): hyperlink = self._hyperlink("во-первых") runs = hyperlink.findall(qn("w:r")) self.assertEqual(3, len(runs)) self.assertEqual( 1, len(hyperlink.findall(f'{qn("w:r")}/{qn("w:noBreakHyphen")}')) ) self.assertEqual("вопервых", "".join(_texts(hyperlink))) for run in runs: self.assertNotIn("во-первых", "".join(_texts(run))) def test_interval_is_split_around_no_break_hyphen(self): hyperlink = self._hyperlink("100-150") self.assertEqual(["100", "150"], [t for t in _texts(hyperlink) if t]) def test_several_hyphens_produce_one_run_per_part(self): hyperlink = self._hyperlink("физико-математический-факультет") self.assertEqual(5, len(hyperlink.findall(qn("w:r")))) self.assertEqual( "физикоматематическийфакультет", "".join(_texts(hyperlink)) ) def test_text_without_hyphen_stays_one_run(self): hyperlink = self._hyperlink("пример") self.assertEqual(1, len(hyperlink.findall(qn("w:r")))) self.assertEqual("пример", "".join(_texts(hyperlink)))