如何编写 Automator/Applescript Service for "Selected Text" Manipulation 从工作 Python "text from file" Manipulation 代码转换而来
How to write the Automator/Applescript Service for "Selected Text" Manipulation converted from working Python "text from file" Manipulation code
所以我有一个 python 脚本,它从文本文件中获取文本,并且可以 "tabulate"(放入类似 table 的形式)该文件中的行,写入最终格式化文本到另一个文本文件;
i=0
k=4 #determains columns of "tabular" form
f1 = open("lines-grouped.txt", 'wb')
with open("lines-to-group.txt", 'r') as multilines_filea:
multilines = multilines_filea.readlines()
for line in multilines:
line = line.strip()
if i == k-1:
i=0
f1.writelines([bytes(line + '\r\n','UTF-8')])
else:
f1.writelines([bytes(line + ' | ','UTF-8')])
i=i+1
multilines_filea.close()
f1.close()
这里有一个主要的限制,我认为 Automator 服务可以解决,那就是无论我想要制表的文本段,都需要保存在我的 "lines-to-group.txt" 文件中。
理想情况下,我希望它尽可能简单;
on run(input, parameters)
-- My Python Logic to manipulate "input"
return input
end run
其中输入是任何应用程序中的 selected 文本。然后当我 运行 进入以下问题时(我在将 tables 从富文本格式复制到 Evernote 时发现);
Name
Age
Position
Salary
John Doe
21
Test Analyst
,000
Joe Dirt
30
Janitor
,000
Jane Doe
55
Executive
0,000
我可以 select 当前 note/file 中的所有内容,只需 运行 Automator 服务即可获得;
Name | Age | Position | Salary
John Doe | 21 | Test Analyst | ,000
Joe Dirt | 30 | Janitor | ,000
Jane Doe | 55 | Executive | 0,000
这就是我的 python 代码现在给我的内容,但我必须将我想要格式化的内容放入另一个文件,然后 运行 脚本然后从我的输出文件复制格式化文本,然后太乏味了。
所以真正的问题是;如何让 applescript 以我的 python 脚本读取和处理其输入的方式处理我的 "input"?
您可以这样做。首先制作一个Python脚本的内联,像这样(这里的前两行只是测试输入):
s = 'Name\nAge\nPosition\nSalary\nJohn Doe\n21\nTest Analyst\n,000' #partial list
k = '4'
print '\n'.join([' | '.join(s.split('\n')[i:i+int(k)]) for i in range(0,len(s.split('\n')),int(k))])
然后您可以 运行 Python 代码作为 AppleScript 中的 shell 脚本。您使用 Python sys
库传入输入值,将 s 和 k 替换为 sys.argv[1]
和 sys.argv[2]
。所以你放在 Automator/AppleScript 中的最终代码看起来像这样:
on run {input, parameters}
set numberOfColumns to 4
repeat with selectedText in input
set pythonScript to "import sys; print '\n'.join([' | '.join(sys.argv[1].split('\n')[i:i+int(sys.argv[2])]) for i in range(0,len(sys.argv[1].split('\n')),int(sys.argv[2]))])"
set result to do shell script "python -c " & quoted form of pythonScript & space & quoted form of selectedText & space & numberOfColumns
end repeat
end run
设置服务在任何应用程序中接收选定的'text',勾选输出替换选定的文本,然后它应该工作,即,如果您在启用编辑的应用程序中使用它。
玩得开心!
大部分最终答案来自 turningtested,但他们最初的 \n
对我没有任何帮助(可能对其他人,我不知道,\r
做了同样的事情),所以我制作了一个清晰可辨的分隔符 |><|
然后将 result
更改为 preresult
并添加;
set AppleScript's text item delimiters to {"|><|"}
set result to every text item of preresult
脚本完全按照我的需要运行,将所选文本制成 numberOfColumns
列 (item | item | item | ... \newline)。
on run {input, parameters}
set numberOfColumns to 3 -- Column Number May add UI to input on demand
repeat with selectedText in input
set pythonScript to "import sys; print '|><|'.join([' | '.join(sys.argv[1].split('\n')[i:i+int(sys.argv[2])]) for i in range(0,len(sys.argv[1].split('\n')),int(sys.argv[2]))])"
set preresult to do shell script "python -c" & quoted form of pythonScript & space & quoted form of selectedText & space & numberOfColumns
end repeat
set AppleScript's text item delimiters to {"|><|"}
set result to every text item of preresult
end run
所以我有一个 python 脚本,它从文本文件中获取文本,并且可以 "tabulate"(放入类似 table 的形式)该文件中的行,写入最终格式化文本到另一个文本文件;
i=0
k=4 #determains columns of "tabular" form
f1 = open("lines-grouped.txt", 'wb')
with open("lines-to-group.txt", 'r') as multilines_filea:
multilines = multilines_filea.readlines()
for line in multilines:
line = line.strip()
if i == k-1:
i=0
f1.writelines([bytes(line + '\r\n','UTF-8')])
else:
f1.writelines([bytes(line + ' | ','UTF-8')])
i=i+1
multilines_filea.close()
f1.close()
这里有一个主要的限制,我认为 Automator 服务可以解决,那就是无论我想要制表的文本段,都需要保存在我的 "lines-to-group.txt" 文件中。
理想情况下,我希望它尽可能简单;
on run(input, parameters)
-- My Python Logic to manipulate "input"
return input
end run
其中输入是任何应用程序中的 selected 文本。然后当我 运行 进入以下问题时(我在将 tables 从富文本格式复制到 Evernote 时发现);
Name
Age
Position
Salary
John Doe
21
Test Analyst
,000
Joe Dirt
30
Janitor
,000
Jane Doe
55
Executive
0,000
我可以 select 当前 note/file 中的所有内容,只需 运行 Automator 服务即可获得;
Name | Age | Position | Salary
John Doe | 21 | Test Analyst | ,000
Joe Dirt | 30 | Janitor | ,000
Jane Doe | 55 | Executive | 0,000
这就是我的 python 代码现在给我的内容,但我必须将我想要格式化的内容放入另一个文件,然后 运行 脚本然后从我的输出文件复制格式化文本,然后太乏味了。
所以真正的问题是;如何让 applescript 以我的 python 脚本读取和处理其输入的方式处理我的 "input"?
您可以这样做。首先制作一个Python脚本的内联,像这样(这里的前两行只是测试输入):
s = 'Name\nAge\nPosition\nSalary\nJohn Doe\n21\nTest Analyst\n,000' #partial list
k = '4'
print '\n'.join([' | '.join(s.split('\n')[i:i+int(k)]) for i in range(0,len(s.split('\n')),int(k))])
然后您可以 运行 Python 代码作为 AppleScript 中的 shell 脚本。您使用 Python sys
库传入输入值,将 s 和 k 替换为 sys.argv[1]
和 sys.argv[2]
。所以你放在 Automator/AppleScript 中的最终代码看起来像这样:
on run {input, parameters}
set numberOfColumns to 4
repeat with selectedText in input
set pythonScript to "import sys; print '\n'.join([' | '.join(sys.argv[1].split('\n')[i:i+int(sys.argv[2])]) for i in range(0,len(sys.argv[1].split('\n')),int(sys.argv[2]))])"
set result to do shell script "python -c " & quoted form of pythonScript & space & quoted form of selectedText & space & numberOfColumns
end repeat
end run
设置服务在任何应用程序中接收选定的'text',勾选输出替换选定的文本,然后它应该工作,即,如果您在启用编辑的应用程序中使用它。 玩得开心!
大部分最终答案来自 turningtested,但他们最初的 \n
对我没有任何帮助(可能对其他人,我不知道,\r
做了同样的事情),所以我制作了一个清晰可辨的分隔符 |><|
然后将 result
更改为 preresult
并添加;
set AppleScript's text item delimiters to {"|><|"}
set result to every text item of preresult
脚本完全按照我的需要运行,将所选文本制成 numberOfColumns
列 (item | item | item | ... \newline)。
on run {input, parameters}
set numberOfColumns to 3 -- Column Number May add UI to input on demand
repeat with selectedText in input
set pythonScript to "import sys; print '|><|'.join([' | '.join(sys.argv[1].split('\n')[i:i+int(sys.argv[2])]) for i in range(0,len(sys.argv[1].split('\n')),int(sys.argv[2]))])"
set preresult to do shell script "python -c" & quoted form of pythonScript & space & quoted form of selectedText & space & numberOfColumns
end repeat
set AppleScript's text item delimiters to {"|><|"}
set result to every text item of preresult
end run