convert.to_markdown: вложения по ref (картинка и миниатюра+файл — одна ссылка), ссылки на страницы DOC-… → page:<код>, static/ удаляются, сырого HTML нет. convert.fill_ids подставляет id вложений вместо attachment:@<n>. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
88 lines
3.4 KiB
Python
88 lines
3.4 KiB
Python
"""Перевод HTML Eva в Markdown (wiki-module, spec wiki «Markdown-копия вики», design 10)."""
|
|
import re
|
|
from pathlib import Path
|
|
|
|
from jira_hub.modules.wiki import convert
|
|
|
|
FIX = Path(__file__).parent / "fixtures" / "wiki"
|
|
FILE_URL = "https://eva.example.test/files/obj/CmfDocument/CmfDocument%3Aa08/CmfDocument%3A3f2a9c1e-0b7d-4e8a-9c21-5d6e7f8a9b0c/model.xlsx?version=1"
|
|
IMG_REF = "/files/obj/CmfDocument/CmfDocument%3Aa08/CmfDocument%3A3f2a9c1e-0b7d-4e8a-9c21-5d6e7f8a9b0c/image2026-7-27_14-20-6.png?version=1"
|
|
THUMB_REF = "/files/obj/CmfDocument/CmfDocument%3Aa08/CmfDocument%3A3f2a9c1e-0b7d-4e8a-9c21-5d6e7f8a9b0c/model.xlsx.meta/thumbnail.jpg?version=1"
|
|
FILE_REF = "/files/obj/CmfDocument/CmfDocument%3Aa08/CmfDocument%3A3f2a9c1e-0b7d-4e8a-9c21-5d6e7f8a9b0c/model.xlsx?version=1"
|
|
|
|
|
|
def _html(name):
|
|
return (FIX / name).read_text(encoding="utf-8")
|
|
|
|
|
|
def test_image_becomes_attachment():
|
|
md, atts = convert.to_markdown(
|
|
_html("page_image.html"),
|
|
[{"ref": IMG_REF, "url": "https://eva.example.test" + IMG_REF, "name": "image2026-7-27_14-20-6.png"}],
|
|
[],
|
|
)
|
|
assert "[📎 image2026-7-27_14-20-6.png](attachment:@0)" in md.splitlines()
|
|
assert atts == [{"url": "https://eva.example.test" + IMG_REF, "name": "image2026-7-27_14-20-6.png"}]
|
|
|
|
|
|
def test_thumbnail_and_file_one_link():
|
|
md, atts = convert.to_markdown(
|
|
_html("page_file.html"),
|
|
[
|
|
{"ref": THUMB_REF, "url": FILE_URL, "name": "model.xlsx"},
|
|
{"ref": FILE_REF, "url": FILE_URL, "name": "model.xlsx"},
|
|
],
|
|
[],
|
|
)
|
|
assert [a["name"] for a in atts] == ["model.xlsx"] and len(atts) == 1
|
|
assert md.count("](attachment:@0)") == 1
|
|
assert "[📎 model.xlsx](attachment:@0)" in md
|
|
assert "attach-file" not in md
|
|
|
|
|
|
def test_page_link():
|
|
md, _ = convert.to_markdown(
|
|
_html("page_links.html"),
|
|
[],
|
|
[{"ref": "project/Document/DOC-019834", "code": "DOC-019834"}],
|
|
)
|
|
assert "[Модель данных](page:DOC-019834)" in md
|
|
|
|
|
|
def test_external_link_kept():
|
|
md, _ = convert.to_markdown(_html("page_links.html"), [], [])
|
|
assert "(https://example.org)" in md
|
|
|
|
|
|
def test_no_raw_html():
|
|
for name in ("page_image.html", "page_file.html", "page_links.html"):
|
|
md, _ = convert.to_markdown(
|
|
_html(name),
|
|
[{"ref": IMG_REF, "url": "https://eva.example.test" + IMG_REF, "name": "image.png"},
|
|
{"ref": THUMB_REF, "url": FILE_URL, "name": "model.xlsx"},
|
|
{"ref": FILE_REF, "url": FILE_URL, "name": "model.xlsx"}],
|
|
[{"ref": "project/Document/DOC-019834", "code": "DOC-019834"}],
|
|
)
|
|
assert re.search(r"<[a-zA-Z/]", md) is None, name
|
|
|
|
|
|
def test_table_kept():
|
|
md, _ = convert.to_markdown(_html("page_links.html"), [], [])
|
|
table_lines = [line for line in md.splitlines() if "|" in line]
|
|
assert table_lines and any("---" in line for line in table_lines)
|
|
|
|
|
|
def test_headings_atx():
|
|
md, _ = convert.to_markdown(_html("page_links.html"), [], [])
|
|
assert "# Требования" in md.splitlines()
|
|
|
|
|
|
def test_static_links_removed():
|
|
html = '<p>Текст <img src="/static/x.png" alt=""> и <a href="static/y.html">ссылка</a></p>'
|
|
md, atts = convert.to_markdown(html, [], [])
|
|
assert "static" not in md and atts == []
|
|
|
|
|
|
def test_fill_ids():
|
|
assert convert.fill_ids("[x](attachment:@1)", [7, 9]) == "[x](attachment:9)"
|