Applescript для проверки первой буквы ввода пользователя - PullRequest
0 голосов
/ 24 сентября 2018

Мне трудно понять, с чего начать.

Я настраиваю предварительно подготовленное электронное письмо, в котором в тексте сообщения указывается местоположение файла.

То, что я пытаюсь сделать, это выяснить, какая первая буква кодового имени вводится пользователем, а результат присваивается переменной.Если первая буква в переменной A, то она будет в папке AD, если E - в EH.

Тогда в своем электронном письме я бы сказал что-то вроде:

Кодовое имя доступно: resources / images / web_images / AD / Codename.jpg

или

Эко-имя доступно: resources / images / web_images / EH / ecodename.jpg

Я могу получить пользовательский ввод и назначить переменную, но она проверяет первую букву относительно возможных местоположений, а затем назначает новое местоположение переменнойкоторый может быть использован в электронном письме.

Эта часть сценария является частью более крупного сценария.Обзор того, что он делает: он открывает PDF-файл в фотошопе, изменяет его размер и присваивает ему имя, введенное пользователем, сохраняет файл на рабочем столе и создает электронное письмо, в котором будет находиться изображение, если оно начинается с AB.будет в определенной папке, например, в другой существующей папке.Я помещу туда изображение вручную, но я хочу проверить имя ввода (кодовое имя), поэтому, когда я создаю письмо, я могу добавить местоположение автоматически.

Я считаю, что это если иное, но не уверен.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 25 сентября 2018

Я не совсем уверен, что полностью понял ваш вопрос, но, увидев подход другого ответа и ваш комментарий против него, я надеюсь, что я нахожусь в бальном парке.

Каквы заявили, что знаете, как получить пользовательский ввод и назначить его переменной, я не включил эти аспекты в свой сценарий ниже.

Вместо этого я создал фиктивное значение свойства, в котором хранится выдуманное значениеиз того, что я себе представлял, пользователь может ввести как кодовое имя.

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, и я избегаю их всякий раз, когда это необходимо, но это моя особенная черта в кодировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...