众所周知,各种LLM使用的markdown格式和笔记软件的存在一些区别。其中最让人头疼的就是用括号和方括号的latex环境。笔者用alfred实现了一个workflow,实现了格式规范化。
期望功能:选中给定文本后,在alfred中输入"remove" keyword,即可将该文本里面的"\ (, \ )“和”\ [,\ ]“替换为”$“和”$$". 额外附加了一个去除多个空行的功能。
细节:使用python实现格式规范化,但是用applescript调用剪贴板。中间利用文件传递信息,因为基于文本传输会有各种转义的奇奇怪怪的问题(比如说在bash里面echo会自动转义"\t"等特殊字符,但是在latex里面显然"\text"之类的东西会用到,所以必须要用printf %s )。
实现:
- 在alfred里面创建keyword块:用keyword remove唤起,设置为no argument
- 在某个固定的地方新建一个python文件“markdown_processor.py”和一个txt文件“string_storage.txt”。打开python文件,输入下面的代码:
import re
def process_string(input_str):
# 处理连续的空行
lines = input_str.split('\n')
processed_lines = []
prev_empty = False
for line in lines:
current_empty = (line.strip() == '')
if current_empty:
if not prev_empty:
processed_lines.append('')
prev_empty = True
else:
processed_lines.append(line)
prev_empty = False
# 重新组合处理后的文本
processed = '\n'.join(processed_lines)
# 处理符号替换
processed = re.sub(
r'\\([\[\]()])',
lambda m: '$$' if m.group(1) in ['[', ']'] else '$',
processed
)
return processed
if __name__ == '__main__':
location='string_storage.txt'
# 读取时保留所有特殊字符
with open(location, 'r', encoding='utf-8') as f:
data = f.read() # 保留原始内容包括\t等符号
processed_data = process_string(data)
# 写入时保持原有编码和格式
with open(location, 'w', encoding='utf-8', newline='') as f:
f.write(processed_data) # 禁止自动转换换行符
- 把这个块链接到一个applescript块,然后输入下面的applescript代码,把其中的xxx改成刚才保存python文件的路径
on run
tell application "System Events" to keystroke "c" using command down
delay 0.1
-- 获取剪贴板内容(保留原始格式)
set clipText to getClipboard()
-- 定义文件路径
set storagePath to quoted form of "xxx/string_storage.txt"
set pyScriptPath to quoted form of "xxx/markdown_processor.py"
try
-- 安全写入文件(禁用转义解释)
do shell script "printf %s " & quoted form of clipText & " > " & storagePath
-- 执行Python处理
do shell script "/usr/bin/python3 " & pyScriptPath
-- 读取处理结果
set processedText to do shell script "cat " & storagePath & " | LC_ALL=C tr -d '\r'"
-- 写回剪贴板(保留原始转义符)
set the clipboard to processedText
tell application "System Events" to keystroke "v" using command down
on error errMsg
display dialog "处理失败:" & errMsg buttons {"OK"} default button 1
end try
end run
-- 安全获取剪贴板内容的函数
on getClipboard()
try
return (the clipboard as «class utf8») as text
on error
return ""
end try
end getClipboard
然后测试一下即可。
1056

被折叠的 条评论
为什么被折叠?



