mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-06 17:38:35 +00:00
fix(feishu): keep fenced markdown tables out of card tables
This commit is contained in:
parent
9cf2fb19c2
commit
8195181783
@ -1388,18 +1388,30 @@ class FeishuChannel(BaseChannel):
|
|||||||
|
|
||||||
def _build_card_elements(self, content: str) -> list[dict]:
|
def _build_card_elements(self, content: str) -> list[dict]:
|
||||||
"""Split content into div/markdown + table elements for Feishu card."""
|
"""Split content into div/markdown + table elements for Feishu card."""
|
||||||
|
protected = content
|
||||||
|
code_blocks: list[str] = []
|
||||||
|
for m in self._CODE_BLOCK_RE.finditer(content):
|
||||||
|
code_blocks.append(m.group(1))
|
||||||
|
protected = protected.replace(m.group(1), f"\x00CODE{len(code_blocks) - 1}\x00", 1)
|
||||||
|
|
||||||
elements, last_end = [], 0
|
elements, last_end = [], 0
|
||||||
for m in self._TABLE_RE.finditer(content):
|
for m in self._TABLE_RE.finditer(protected):
|
||||||
before = content[last_end : m.start()]
|
before = protected[last_end : m.start()]
|
||||||
if before.strip():
|
if before.strip():
|
||||||
elements.extend(self._split_headings(before))
|
elements.extend(self._split_headings(before))
|
||||||
elements.append(
|
elements.append(
|
||||||
self._parse_md_table(m.group(1)) or {"tag": "markdown", "content": m.group(1)}
|
self._parse_md_table(m.group(1)) or {"tag": "markdown", "content": m.group(1)}
|
||||||
)
|
)
|
||||||
last_end = m.end()
|
last_end = m.end()
|
||||||
remaining = content[last_end:]
|
remaining = protected[last_end:]
|
||||||
if remaining.strip():
|
if remaining.strip():
|
||||||
elements.extend(self._split_headings(remaining))
|
elements.extend(self._split_headings(remaining))
|
||||||
|
|
||||||
|
for i, cb in enumerate(code_blocks):
|
||||||
|
for el in elements:
|
||||||
|
if el.get("tag") == "markdown":
|
||||||
|
el["content"] = el["content"].replace(f"\x00CODE{i}\x00", cb)
|
||||||
|
|
||||||
return elements or [{"tag": "markdown", "content": content}]
|
return elements or [{"tag": "markdown", "content": content}]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
# Check optional Feishu dependencies before running tests
|
# Check optional Feishu dependencies before running tests
|
||||||
try:
|
try:
|
||||||
from nanobot.channels import feishu
|
from nanobot.channels.feishu.runtime import FEISHU_AVAILABLE
|
||||||
FEISHU_AVAILABLE = getattr(feishu, "FEISHU_AVAILABLE", False)
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
FEISHU_AVAILABLE = False
|
FEISHU_AVAILABLE = False
|
||||||
|
|
||||||
@ -66,3 +65,23 @@ def test_split_headings_keeps_markdown_body_and_code_blocks_intact() -> None:
|
|||||||
assert elements[1]["tag"] == "markdown"
|
assert elements[1]["tag"] == "markdown"
|
||||||
assert "Body with **bold** text." in elements[1]["content"]
|
assert "Body with **bold** text." in elements[1]["content"]
|
||||||
assert "```python\nprint('hi')\n```" in elements[1]["content"]
|
assert "```python\nprint('hi')\n```" in elements[1]["content"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_build_card_elements_keeps_fenced_markdown_tables_intact() -> None:
|
||||||
|
channel = FeishuChannel.__new__(FeishuChannel)
|
||||||
|
text = "Before\n\n```\n| a | b |\n| - | - |\n| 1 | 2 |\n```\n\nAfter"
|
||||||
|
|
||||||
|
elements = channel._build_card_elements(text)
|
||||||
|
|
||||||
|
assert all(el.get("tag") != "table" for el in elements)
|
||||||
|
joined = "\n".join(el["content"] for el in elements if el.get("tag") == "markdown")
|
||||||
|
assert "```\n| a | b |\n| - | - |\n| 1 | 2 |\n```" in joined
|
||||||
|
|
||||||
|
|
||||||
|
def test_build_card_elements_still_parses_unfenced_markdown_tables() -> None:
|
||||||
|
channel = FeishuChannel.__new__(FeishuChannel)
|
||||||
|
text = "Before\n\n| a | b |\n| - | - |\n| 1 | 2 |\n\nAfter"
|
||||||
|
|
||||||
|
elements = channel._build_card_elements(text)
|
||||||
|
|
||||||
|
assert any(el.get("tag") == "table" for el in elements)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user