Skip to content

Commit aef79fc

Browse files
committed
Text.br()
resolve #110
1 parent 4c347d1 commit aef79fc

4 files changed

Lines changed: 32 additions & 21 deletions

File tree

src/nonebot_plugin_alconna/uniseg/adapters/satori/builder.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
from pathlib import Path
22
from base64 import b64decode
3-
from typing import TYPE_CHECKING
43

54
from nonebot.adapters import Bot, Event
65
from nonebot.adapters.satori.message import Message
7-
from nonebot.adapters.satori.event import MessageEvent, ReactionEvent, InteractionCommandMessageEvent
86
from nonebot.adapters.satori.message import MessageSegment
97
from nonebot.adapters.satori.message import At as AtSegment
108
from nonebot.adapters.satori.message import File as FileSegment
@@ -16,6 +14,7 @@
1614
from nonebot.adapters.satori.message import Video as VideoSegment
1715
from nonebot.adapters.satori.message import Button as ButtonSegment
1816
from nonebot.adapters.satori.message import RenderMessage as RenderMessageSegment
17+
from nonebot.adapters.satori.event import MessageEvent, ReactionEvent, InteractionCommandMessageEvent
1918

2019
from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter
2120
from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build

src/nonebot_plugin_alconna/uniseg/adapters/satori/exporter.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from nonebot.adapters.satori.bot import Bot as SatoriBot
77
from nonebot.adapters.satori.message import Text as _Text
88
from nonebot.adapters.satori.message import STYLE_TYPE_MAP
9-
from nonebot.adapters.satori.event import NoticeEvent, MessageEvent, ReactionEvent, InteractionCommandMessageEvent
109
from nonebot.adapters.satori.message import Message, MessageSegment
1110
from nonebot.adapters.satori.models import ChannelType, MessageObject
11+
from nonebot.adapters.satori.event import NoticeEvent, MessageEvent, ReactionEvent, InteractionCommandMessageEvent
1212

1313
from nonebot_plugin_alconna.uniseg.target import Target
1414
from nonebot_plugin_alconna.uniseg.constraint import SupportScope
@@ -79,21 +79,27 @@ def get_message_id(self, event: Event) -> str:
7979
return str(event.message.id)
8080

8181
@export
82-
async def text(self, seg: Text, bot: Union[Bot, None]) -> "MessageSegment":
82+
async def text(self, seg: Text, bot: Union[Bot, None]):
8383
if not seg.styles:
8484
return MessageSegment.text(seg.text)
85-
if seg.extract_most_style() == "br":
86-
return MessageSegment.br()
87-
if seg.extract_most_style() == "link":
88-
if not getattr(seg, "_children", []):
89-
return MessageSegment.link(seg.text)
90-
return MessageSegment.link(seg.text, seg._children[0].text) # type: ignore
9185
if seg.extract_most_style() == "markdown":
9286
return _Text("text", {"text": seg.text, "styles": {(0, len(seg.text)): ["chronocat:markdown"]}})
93-
styles = seg.styles.copy()
94-
for scale, style in seg.styles.items():
95-
styles[scale] = [STYLE_TYPE_MAP.get(s, s) for s in style]
96-
return _Text("text", {"text": seg.text, "styles": styles})
87+
res = Message()
88+
for part in seg.style_split():
89+
if part.extract_most_style() == "br":
90+
res.append(MessageSegment.br())
91+
elif part.extract_most_style() == "link":
92+
if not getattr(part, "_children", []):
93+
res.append(MessageSegment.link(part.text))
94+
else:
95+
res.append(MessageSegment.link(part.text, part._children[0].text)) # type: ignore
96+
else:
97+
styles = part.styles.copy()
98+
for scale, style in part.styles.items():
99+
styles[scale] = [STYLE_TYPE_MAP.get(s, s) for s in style]
100+
res.append(_Text("text", {"text": part.text, "styles": styles}))
101+
res.__merge_text__()
102+
return res
97103

98104
@export
99105
async def at(self, seg: At, bot: Union[Bot, None]) -> "MessageSegment":
@@ -247,7 +253,9 @@ async def reaction(self, emoji: Emoji, mid: Any, bot: Bot, context: Union[Target
247253
if isinstance(context, (MessageEvent, NoticeEvent)) and context.channel:
248254
channel = mid.channel or context.channel
249255
if delete:
250-
return await bot.reaction_delete(channel_id=channel.id, message_id=_mid.id, emoji=emoji.name or emoji.id)
256+
return await bot.reaction_delete(
257+
channel_id=channel.id, message_id=_mid.id, emoji=emoji.name or emoji.id
258+
)
251259
return await bot.reaction_create(channel_id=channel.id, message_id=_mid.id, emoji=emoji.name or emoji.id)
252260

253261
def get_reply(self, mid: Any):

src/nonebot_plugin_alconna/uniseg/segment.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ class Text(Segment):
242242
text: str
243243
styles: dict[tuple[int, int], list[str]] = field(default_factory=dict)
244244

245+
@staticmethod
246+
def br():
247+
return Text("\n", {(0, 1): ["br"]})
248+
245249
def __post_init__(self):
246250
self.text = str(self.text)
247251

@@ -346,6 +350,9 @@ def __str__(self) -> str:
346350
result.append(text[right : scale[0]])
347351
right = scale[1]
348352
prefix = "".join(f"<{style}>" for style in styles[scale])
353+
if prefix == "<br>":
354+
result.append("<br/>")
355+
continue
349356
suffix = "".join(f"</{style}>" for style in reversed(styles[scale]))
350357
result.append(prefix + text[scale[0] : scale[1]] + suffix)
351358
result.append(text[right:])
@@ -368,12 +375,10 @@ def __rich__(self):
368375
right = scales[0][1]
369376
for scale in scales:
370377
if scale[0] > right:
371-
result.append("\033[0m")
372378
result.append(text[right : scale[0]])
373379
right = scale[1]
374380
prefix = ";".join(f"{STYLE_TYPE_MAP[style]}" for style in styles[scale])
375-
result.append(f"\033[{prefix}m{text[scale[0] : scale[1]]}")
376-
result.append("\033[0m")
381+
result.append(f"\033[{prefix}m{text[scale[0] : scale[1]]}\033[0m")
377382
result.append(text[right:])
378383
return "".join(result)
379384

@@ -404,8 +409,7 @@ def style_split(self):
404409
for scale in scales:
405410
if scale[0] > right:
406411
result.append(Text(text[right : scale[0]]))
407-
result.append(Text(text[scale[0] : scale[1]], {(scale[0] - left, scale[1] - left): styles[scale]}))
408-
left = scale[0]
412+
result.append(Text(text[scale[0] : scale[1]], {(0, scale[1] - scale[0]): styles[scale]}))
409413
right = scale[1]
410414
if right < len(text):
411415
result.append(Text(text[right:]))

tests/test_uniseg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def test_uniseg():
3333
Text("man").italic(0, 1),
3434
]
3535
assert text1.replace("o", "e") == Text("helle werld man").color("red", 0, -3).italic(3, -2)
36-
assert f"{text1:#}" == f"{ansi(31)}hel{ansi(31, 3)}lo world {ansi(3)}m{ansi(0)}an"
36+
assert f"{text1:#}" == f"{ansi(31)}hel{ansi(0)}{ansi(31, 3)}lo world {ansi(0)}{ansi(3)}m{ansi(0)}an"
3737
pat = select(Text)
3838
assert pat.first.validate(Text("foobar")).value() == Text("foobar")
3939
assert pat.first.validate(Video(url="foobar")(Text("foobar"))).value() == Text("foobar")

0 commit comments

Comments
 (0)