Скрипт для преобразования символов нижнего регистра в верхний регистр работает по-разному в качестве действия службы

Я пытаюсь простой сценарий в качестве служебного действия в Automator, который выполняет эту функцию:

Получает выделенный текст в любом приложении и заменяет выделенный текст текстом, содержащим заглавные буквы

Поэтому я использовал этот скрипт:

on run {input, parameters}

set upperCaseString to ""
repeat with i in input
    if (ASCII number i) > 96 and (ASCII number i) < 123 then
        set upperCaseString to upperCaseString & (ASCII character ((ASCII number i) - 32))
    else
        set upperCaseString to upperCaseString & (ASCII character (ASCII number i))
    end if
end repeat

return upperCaseString
end run

Но я нашел эту проблему:

Он возвращал первую букву ввода как заглавную букву, например. input - нижний регистр текста, output - L, тогда как ожидаемый результат был - LOWERCASETEXT.

Чтобы проверить проблему, я добавил эту строку кода в цикле повтора:

display dialog i

и обнаружил, что он отображает полный текст вместо одного символа за раз, т.е. вместо отображения l.. o.. w.. в тексте в нижнем регистре он отображает текст в нижнем регистре сразу.

Может кто-нибудь предложить мне, почему это вызывает меня как служебное действие, в то время как оно нормально работает в Apple Script Editor?

4 ответа

Решение

Вы получите тот же результат в редакторе AppleScript, если для входной переменной задан список. Входной параметр действия Automator также является списком, поэтому сравнение не дает того, что вы думаете. Обратите внимание, что текстовые идентификаторы имеют устаревшие символьные команды ASCII и числовые команды ASCII - см. Примечания к выпуску AppleScript 10.5.

Это работает для многих языков:

on toUpper(s)
tell AppleScript to return do shell script "shopt -u xpg_echo; export LANG='" & user locale of (system info) & ".UTF-8'; echo " & quoted form of s & " | tr [:lower:] [:upper:]"
end toUpper

on toLower(s)
tell AppleScript to return do shell script "shopt -u xpg_echo; export LANG='" & user locale of (system info) & ".UTF-8'; echo " & quoted form of s & " | tr [:upper:] [:lower:]"
end toLower

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

return upperCaseString as text

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

Другой (более быстрый) способ - использовать команду Unix tr (translate) через do shell script:

set upperCaseString to ¬
  (do shell script ("echo " & input & " | tr a-z A-Z;"))

Этого достаточно для английского языка, но вы также можете добавить диакритический перевод, например

set upperCaseString to ¬
  (do shell script ("echo " & input & " | tr a-zäáà A-ZÄÁÀ;"))

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

@Matt Strange:

Вы также можете попробовать:

set upperCaseString to ¬
  do shell script "echo " & input & " | tr [:lower:] [:upper:]"

Если вы запустите 'man tr' в 'OS X 10.10', вы можете увидеть, что следует использовать классы символов [:lower:] и [:upper:] вместо явных диапазонов символов, таких как 'az' или 'A-Z', так как они могут не давать правильных результатов, как объяснено там, на странице руководства.

Другие вопросы по тегам