Applescript检查用户输入的首字母

时间:2018-09-24 17:48:43

标签: applescript

我很难知道从哪里开始。

我正在设置一个预制的电子邮件,它将用文件的位置填充消息内容文本。

我想做的是找出用户输入的代号的第一个字母是什么,并将结果分配给变量。如果变量中的第一个字母为A,则它将位于文件夹A-D中;如果变量为E,则它将位于E-H中。

然后在我的电子邮件中,我会说:

代号可用: 资源/图片/web_images/A-D/Codename.jpg

Ecodename可用: 资源/图片/web_images/E-H/ecodename.jpg

我可以获取用户输入并分配变量,但是它会根据可能的位置检查第一个字母,然后将新位置分配给可以在电子邮件中使用的变量。

脚本的此部分是较大脚本的一部分。概述:它会在photoshop中打开一个pdf文件,调整其大小并将其命名为用户输入代码,然后将该文件保存到桌面,并在其中以图像开头的位置(如果以AB开头)生成一封电子邮件。将位于特定文件夹中,例如EG在其他现有文件夹中。我将手动在此处放置图片,但我想检查输入名称(代号),因此在构建电子邮件时,可以自动附加位置。

我相信这是一个假设,但不确定。 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定自己是否已完全理解您的问题,但是看到其他答案的方法以及您对此的评论,我希望我能在球场上。

正如您所说的,您知道如何获取用户输入并将其分配给变量,我没有在下面的脚本中包含这些方面。

相反,我创建了一个虚拟属性值,该值存储了我想象用户可能会输入的代号的组合值。

property userInput : "GXTrZy"

您可以删除此行,并将脚本中出现的userInput替换为您用来存储实际用户输入的变量的名称。

property userInput : "Dinosaur" -- A dummy value to take the place of user input
-------------------------------------------------------------------------------------
property resourcePath : "resources/images/web_images"
property resourceFolders : ["A-B", "C-F", "G-I", "J-O", "P-S", "T-Z"]
-------------------------------------------------------------------------------------
property alphabet : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-------------------------------------------------------------------------------------
(*

    Your code to obtain user input
    and assign it to a variable, etc.

    I have put a dummy placeholder codename
    in the property value 'userInput' at
    the top of this script.

*)

set alpha to the first character of the userInput --> "D"
if alpha is not in the alphabet then return
set x to (alpha's id) mod 32 -- Alpha's ordinal position in the alphabet

set || to words of (resourceFolders as text) as text --> "ABCFGIJOPSTZ"
set the text item delimiters to {"/"} & ||'s items
--> {"/", "A", "B", "C", "F", "G", "I", "J", "O", "P", "S", "T", "Z"}

set |ₓ| to text 1 thru x of the alphabet --> "ABCD"
set |₋| to text items of ("+" & |ₓ|) as text --> "+///D"

set i to 0.49 + (offset of alpha in ||) / 2 as integer --> 0
set j to the (number of words in |₋|) * ((|₋| contains alpha) as integer) --> 2

set n to i + j --> Index of folder item in resourceFolders list = 2

set resourceFolder to item n of resourceFolders --> "C-F"

set filepath to the {resourcePath, resourceFolder, [userInput, ".jpg"]} as text
set msg to ["The codename you input : ", userInput, linefeed, ¬
    "The file for that codename is available at : ", filepath] as text

(*

    The rest of your code will follow
    below.  You can use the message stored
    in the variable 'msg' to append to 
    your email. 

*)

与您的问题相关的特殊兴趣所在的地方是这里:

set alpha to the first character of the userInput --> "D"

它获取代号的首字母并将其存储在变量alpha中。随后的代码行用于标识容纳代号资源文件的正确文件夹。

某些代码行之后的注释以---->开头,根据示例,我已经使用后者来在脚本执行的每个阶段打印出结果我提供的用户输入。因此,正在处理的字母为"G",显示的结果与此字母有关,但是对于使用不同首字母的不同样本输入,结果将有所不同。

运行此脚本后,最终输出是存储在变量msg中的消息字符串,其中包含以下文本:

"The codename you input : Dinosaur
The file for that codename is available at : resources/images/web_images/C-F/Dinosaur.jpg"

更新:2018-09-26-一种迭代方法

这是使用repeat循环遍历每个可能的资源文件夹名称并测试代号字母是否介于文件夹名称字母之间的另一种方法:

property userInput : "Dinosaur" -- A dummy value to take the place of user input
-------------------------------------------------------------------------------------
property resourceFolders : ["A-B", "C-F", "G-I", "J-O", "P-S", "T-Z"]
-------------------------------------------------------------------------------------
set alpha to the first character of the userInput --> "D"

set ASCIIindices to the id of (words in (resourceFolders as text) as text)
set alphaIndex to ((alpha's id) mod 32) + 64 -- Case independent

repeat with i from 2 to the length of ASCIIindices by 2
    if item i of ASCIIindices ≥ the alphaIndex then exit repeat
end repeat

set resourceFolder to item (i / 2) of the resourceFolders --> "C-F"

代码较短,实际上,它是解决此类问题的更明显的方法。但是,我倾向于在解决方案之前先概括问题,而这正是我上面数学上更注重解决方案的来源。

第一个解决方案的理论优势在于其执行速度仅受AppleScript内置功能(如offset)和文本操作功能的速度限制,即,实际上AppleScript代码将永远不会减慢速度。不管字母多长都可以处理。

同时,迭代方法是O(n)算法,使用较长的字母会变得更慢,因为它的速度限制因素是repeat循环,需要无限长的时间和无限的时间字母。

但是,由于我们没有一个无限的字母,所以这确实是有争议的,因此您可以选择使用更简短,更易于遵循的方法。我个人不喜欢repeat循环,并在必要时避免循环,但这绝对是我在编码中的特质。