如何编写 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 库传入输入值,将 sk 替换为 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