forked from mttu-developers/konabot
Merge pull request 'fix: support empty string literals in textfx' (#63) from pi-agent/konabot:fix/textfx-empty-string into master
Reviewed-on: mttu-developers/konabot#63
This commit is contained in:
@ -161,9 +161,9 @@ class PipelineRunner:
|
|||||||
"'": "'",
|
"'": "'",
|
||||||
}
|
}
|
||||||
|
|
||||||
def flush_word():
|
def flush_word(force: bool = False):
|
||||||
nonlocal buf
|
nonlocal buf
|
||||||
if buf:
|
if buf or force:
|
||||||
tokens.append(Token(TokenKind.WORD, buf))
|
tokens.append(Token(TokenKind.WORD, buf))
|
||||||
buf = ""
|
buf = ""
|
||||||
|
|
||||||
@ -178,6 +178,7 @@ class PipelineRunner:
|
|||||||
escape = True
|
escape = True
|
||||||
elif c == quote:
|
elif c == quote:
|
||||||
quote = None
|
quote = None
|
||||||
|
flush_word(force=True) # 引号闭合时强制 flush,即使是空字符串
|
||||||
else:
|
else:
|
||||||
buf += c
|
buf += c
|
||||||
i += 1
|
i += 1
|
||||||
@ -188,7 +189,7 @@ class PipelineRunner:
|
|||||||
i += 1
|
i += 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if c.isspace() or c in " ":
|
if c.isspace():
|
||||||
flush_word()
|
flush_word()
|
||||||
i += 1
|
i += 1
|
||||||
continue
|
continue
|
||||||
|
|||||||
@ -13,10 +13,8 @@ class THEcho(TextHandler):
|
|||||||
async def handle(
|
async def handle(
|
||||||
self, env: TextHandlerEnvironment, istream: str | None, args: list[str]
|
self, env: TextHandlerEnvironment, istream: str | None, args: list[str]
|
||||||
) -> TextHandleResult:
|
) -> TextHandleResult:
|
||||||
if len(args) == 0 and istream is None:
|
# echo 不读 stdin,只输出参数(Unix 语义)
|
||||||
return TextHandleResult(1, "请在 echo 后面添加需要输出的文本")
|
# 无参数时输出空行(与 Unix echo 行为一致)
|
||||||
if istream is not None:
|
|
||||||
return TextHandleResult(0, "\n".join([istream] + args))
|
|
||||||
return TextHandleResult(0, "\n".join(args))
|
return TextHandleResult(0, "\n".join(args))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -205,3 +205,21 @@ async def test_while_body_can_use_if(runner: PipelineRunner):
|
|||||||
assert not isinstance(parsed, str)
|
assert not isinstance(parsed, str)
|
||||||
results = await runner.run_pipeline(parsed, None, TextHandlerEnvironment(False))
|
results = await runner.run_pipeline(parsed, None, TextHandlerEnvironment(False))
|
||||||
assert results[0].code == 1
|
assert results[0].code == 1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_echo_empty_string(runner: PipelineRunner):
|
||||||
|
"""测试 echo 空字符串"""
|
||||||
|
# 双引号空字符串
|
||||||
|
parsed = runner.parse_pipeline('echo ""')
|
||||||
|
assert not isinstance(parsed, str)
|
||||||
|
results = await runner.run_pipeline(parsed, None, TextHandlerEnvironment(False))
|
||||||
|
assert results[0].code == 0
|
||||||
|
assert results[0].ostream == ''
|
||||||
|
|
||||||
|
# 单引号空字符串
|
||||||
|
parsed2 = runner.parse_pipeline("echo ''")
|
||||||
|
assert not isinstance(parsed2, str)
|
||||||
|
results2 = await runner.run_pipeline(parsed2, None, TextHandlerEnvironment(False))
|
||||||
|
assert results2[0].code == 0
|
||||||
|
assert results2[0].ostream == ''
|
||||||
|
|||||||
Reference in New Issue
Block a user