Merge pull request 'Вики: колонка управления строками таблиц Eva не попадает в копию (#95)' (#96) from feat/95-wiki-table-controls into main

This commit is contained in:
aep 2026-10-24 10:02:42 +03:00
commit bb54d0a2a4
3 changed files with 70 additions and 0 deletions

View File

@ -103,9 +103,18 @@ def _strip_private(soup) -> None:
el[key] = _PRIVATE.sub("", value) el[key] = _PRIVATE.sub("", value)
def _strip_editor_ui(soup) -> None:
"""Колонка управления строками таблицы редактора Eva (TinyMCE: номер строки, «+», точка) сохраняется в HTML
страницы блоком `table-row-controls` и давала абзацы «№», «1», «2»… перед таблицей (#95). Блок убирается целиком;
прочие `mceNonEditable` остаются: у карточек вложений тот же класс, в них ссылки на файлы."""
for el in soup.select(".table-row-controls"):
el.decompose()
def to_markdown(html: str, attachments: list[dict] | None, links: list[dict] | None) -> tuple[str, list[dict]]: def to_markdown(html: str, attachments: list[dict] | None, links: list[dict] | None) -> tuple[str, list[dict]]:
"""HTML страницы → (Markdown, вложения страницы [{url, name}]).""" """HTML страницы → (Markdown, вложения страницы [{url, name}])."""
soup = BeautifulSoup(html, "html.parser") soup = BeautifulSoup(html, "html.parser")
_strip_editor_ui(soup)
_strip_private(soup) _strip_private(soup)
conv = _Converter(attachments or [], links or [], heading_style="ATX", autolinks=False) conv = _Converter(attachments or [], links or [], heading_style="ATX", autolinks=False)
md = conv.convert_soup(soup).strip() + "\n" md = conv.convert_soup(soup).strip() + "\n"

View File

@ -0,0 +1,38 @@
<h2>Замечания к модели</h2>
<div class="mceNonEditable app-tinymce-card-preview app-tinymce-is-preview" contenteditable="false">
<a href="/files/obj/CmfDocument/CmfDocument%3Aa08/CmfDocument%3A3f2a9c1e-0b7d-4e8a-9c21-5d6e7f8a9b0c/model.dbml?version=1">model.dbml</a>
<div class="app-tinymce-preview-actions"><div><svg class="preview-action download-preview" viewBox="0 0 24 24"><path d="M1,1"></path></svg></div></div>
</div>
<div class="tableView-content-wrap macros-panel wikimarkdown" data-macros="wikitables">
<div class="table-wrapper cmf-scrollbar">
<table>
<thead><tr><th><p>№</p></th><th><p>Замечание</p></th><th><p>Решение</p></th></tr></thead>
<tbody>
<tr><td><p>1</p></td><td><p>Первое замечание</p></td><td><p>Первое решение</p></td></tr>
<tr><td><p>2</p></td><td><p>Второе замечание</p></td><td><p>Второе решение</p></td></tr>
<tr><td><p>2-бис</p></td><td><p>Дополнение</p></td><td><p>Принято</p></td></tr>
</tbody>
</table>
</div>
<div class="table-row-controls mceNonEditable" contenteditable="false">
<div class="table-controller-remove-container mceNonEditable"><svg viewBox="0 0 24 24"><path d="M1,1"></path></svg></div>
<div class="table-controller-container sticky-container mceNonEditable" style="height: 40px;">
<div class="table-controller mceNonEditable"></div>
<div class="table-controller-number-container mceNonEditable">№</div>
</div>
<div class="table-controller-container mceNonEditable" style="height: 40px;">
<div class="table-controller mceNonEditable"></div>
<div class="table-controller-dot-container mceNonEditable"><svg class="table-controller-plus" viewBox="0 0 24 24"><path d="M1,1"></path></svg><svg class="table-controller-dot" viewBox="0 0 5 5"></svg></div>
<div class="table-controller-number-container mceNonEditable">1</div>
</div>
<div class="table-controller-container mceNonEditable" style="height: 40px;">
<div class="table-controller mceNonEditable"></div>
<div class="table-controller-number-container mceNonEditable">2</div>
</div>
<div class="table-controller-container mceNonEditable" style="height: 40px;">
<div class="table-controller mceNonEditable"></div>
<div class="table-controller-number-container mceNonEditable">3</div>
</div>
</div>
</div>
<p>Текст после таблицы.</p>

View File

@ -87,6 +87,29 @@ def test_fill_ids():
assert convert.fill_ids("[x](attachment:@1)", [7, 9]) == "[x](attachment:9)" assert convert.fill_ids("[x](attachment:@1)", [7, 9]) == "[x](attachment:9)"
# Колонка управления строками таблицы редактора Eva (TinyMCE, `table-row-controls`) попадает в HTML страницы и
# раньше давала абзацы «№», «1», «2»… перед таблицей (#95)
CARD_REF = "/files/obj/CmfDocument/CmfDocument%3Aa08/CmfDocument%3A3f2a9c1e-0b7d-4e8a-9c21-5d6e7f8a9b0c/model.dbml?version=1"
def test_table_row_controls_removed():
md, _ = convert.to_markdown(_html("page_table_controls.html"), [], [])
lines = [line.strip() for line in md.splitlines() if line.strip()]
assert not [line for line in lines if re.fullmatch(r"№|\d{1,3}", line)], lines
assert "| № | Замечание | Решение |" in lines
assert "| 2-бис | Дополнение | Принято |" in lines
assert "Текст после таблицы." in lines
def test_card_preview_kept_with_controls():
md, atts = convert.to_markdown(
_html("page_table_controls.html"),
[{"ref": CARD_REF, "url": "https://eva.example.test" + CARD_REF, "name": "model.dbml"}],
[],
)
assert "[📎 model.dbml](attachment:@0)" in md and len(atts) == 1
# --- fix round 1 (review Task 6: I1, I2, I3, M3, M4) --- # --- fix round 1 (review Task 6: I1, I2, I3, M3, M4) ---
def test_unsafe_schemes_dropped_from_links(): def test_unsafe_schemes_dropped_from_links():