v0.5.3
Example document / build (push) Has been cancelled
Python application / build (push) Has been cancelled

- Мелкие исправления увеличивающие работу конвертера
This commit is contained in:
Igor20264
2026-09-10 10:50:15 +03:00
parent 510f7e7adf
commit e6b58efeb3
95 changed files with 7165 additions and 8771 deletions
+67
View File
@@ -0,0 +1,67 @@
"""Дефис внутри гиперссылки: текст не должен дублироваться.
Методичка МИРЭА (`_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)))