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

Я пытаюсь выполнить простой сценарий в качестве служебного действия в 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 ]

4 голосов
/ 15 апреля 2014

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

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
1 голос
/ 20 марта 2013

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

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 переведет что угодно в что угодно , так что вы можете добавить любые символы, с которыми вы можете столкнуться, и то, что вы хотите, чтобы они перевели. Приходит на ум переводчик «говорящий по-литовски».

1 голос
/ 21 февраля 2012

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

0 голосов
/ 03 мая 2015

@ Matt Strange:

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

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

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

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