Всё, что вы хотели знать о написании скриптов для JFW, но не знали, кого спросить

(Переработанный и дополненный вариант)
Источник:www.tiflocomp.ru
Дата публикации:2004
Twitter Facebook Vkontakte

Часть I. Начало работы со скриптами

Скрипты: краткий обзор

Предположим, вы работаете в приложении, которое выводит на нижней строке окна описание каждого пункта меню. Если для зрячего пользователя назначение текущего пункта меню будет неясным, он просто взглянет вниз, и прочитает, что написано на нижней строке. Можно, конечно, включить Jaws курсор, переместиться в нижнюю строку окна и прочитать ее, но не проще ли было бы просто нажать горячую клавишу, чтобы прочитать текст подсказки? А как насчет того, чтобы Jaws озвучивал эту информацию автоматически? И, конечно, вам захочется иметь возможность включать и выключать такое автоматическое чтение. Что ж, если для приложения, с которым вы работаете, был бы написан файл скриптов, и если бы в этом файле был скрипт, выполняющий эту работу за вас, вы могли бы иметь такой вид удобного доступа. Если никто не создал для вас такого скрипта, вы могли бы создать его сами, если бы знали, как использовать язык сценариев Jaws. Такой улучшенный доступ помог бы повысить эффективность работы с этой программой до уровня зрячего пользователя, то есть вы смогли бы работать гораздо быстрее.

Что такое файлы скриптов?

Jaws всегда находится под управлением скриптов. Как мы уже говорили, скрипт - это небольшая компьютерная программа, которая видоизменяет работу Jaws для каждой конкретной ситуации. Файлы скриптов Jaws - это наборы отдельных скриптов, которые загружаются для работы с конкретным приложением Windows. Jaws автоматически загружает эти файлы скриптов всякий раз, когда вы открываете новое приложение. Очень важно понять, что есть два типа файлов скриптов: Default (по умолчанию) и Application (для приложений). Файлы скриптов можно представить в виде стога сена, причем файл скриптов по умолчанию (default) находится в основании. Файл скриптов по умолчанию загружается при запуске Jaws и является активным во всех сессиях. Файл скриптов для приложения размещается поверх файла скриптов по умолчанию, когда приложение загружается. Jaws знает, какой файл скриптов приложения загружать, потому что главная часть имени файла скриптов для приложения (т.е. его часть без расширения) является той же, что и имя самого приложения. Таким образом, наш файл скриптов по умолчанию называется default.jss, а приложение spreadsheet.exe будет иметь файл скриптов spreadsheet.jss. Когда вы закроете активное в данный момент приложение, файл скриптов, который помогал Jaws работать с этим приложением, будет выгружен и активными станут все настройки по умолчанию, пока не будет запущено новое приложение, а вместе с ним - и новый файл скриптов.

Файл скриптов по умолчанию, который загружается, когда вы впервые запускаете Jaws, содержит сотни скриптов. Эти скрипты предоставляют Jaws всю информацию, необходимую для осуществления речевого вывода в большинстве ситуаций. Этот файл сообщает Jaws, что и когда говорить в большинстве возможных случаев (т.е. когда вы работаете с приложениями, которые ведут себя хорошо). Однако, во многих приложениях часто возникают ситуации, которые отклоняются от нормы. Также могут возникать конкретные случаи, когда чтение экрана требуется настраивать. Если такое происходит, то может возникнуть необходимость создать файл скриптов только для данного приложения. Если такой файл скриптов был создан и он находится в подкаталоге, в котором размещены все файлы конфигурации Jaws, тогда при запуске этого приложения будет загружаться и файл скриптов. Именно этот файл скриптов Jaws будет искать в первую очередь, когда вы воспользуетесь какой-либо комбинацией клавиш, или когда возникнет ситуация, которая потребует вызова событийных функций, описанных выше. Если файл скриптов приложения не содержит скрипта, соответствующего ситуации, тогда Jaws будет обращаться к файлу по умолчанию. Если в одном из этих мест скрипт будет найден, он будет выполнен, и никакой другой обработки не потребуется. Если ни там, ни там не будет найдено соответствующего скрипта, тогда Jaws передаст нажатие клавиш приложению, и эта комбинация клавиш будет выполнена таким образом, как если бы JAWS ВООБЩЕ НЕ БЫЛ ЗАГРУЖЕН. Эта иерархия является очень важной. Если конкретный скрипт, существующий в файле скриптов по умолчанию, для используемого приложения не подходит, пользователь может поместить собственную версию этого скрипта в файл скриптов приложения, и эта версия будет иметь приоритет перед той, которая находится в файле скриптов по умолчанию. Поскольку скрипты, расположенные выше в нашем стоге сена, имеют более высокий приоритет, скрипт в файле скриптов приложения будет выполняться вместо того, который имеется в файле скриптов по умолчанию, если они оба закреплены за одной и той же комбинацией клавиш, и функция в файле скриптов приложения будет вызываться, имея приоритет перед той, которая вызывается в файле скриптов по умолчанию, если обе они имеют одно и то же имя. Например, если у вас есть в файле скриптов приложения скрипт, закрепленный за клавишей Ctrl+G, а в файле скриптов по умолчанию у вас также есть скрипт, прикрепленный к Ctrl+G, то когда вы нажмете Ctrl+G, будет выполнен тот, который находится в файле скриптов приложения. Не имеет значения даже и то, что оба эти скрипта могут иметь разные имена. Определение того, какой скрипт будет выполняться, зависит от привязки к клавишам. Если вы попытаетесь назначить для вызова скрипта клавишу, которая уже используется в файле скриптов по умолчанию, пользуясь Диспетчером скриптов (Script manager), то вы получите предупреждение, и у вас будет две возможности: продолжить закрепление, или назначить своему скрипту другую клавишу. Это сделано для того, чтобы предотвратить случайное отключение скриптов в файле скриптов по умолчанию, без осознания того, что вы наделали.

Есть несколько важных соображений по поводу того, как следует называть скрипты и за какими клавишами их закреплять. Если, с одной стороны, пользователь присваивает своему скрипту имя, отличное от того, которое использовано в файле скриптов по умолчанию, тогда пользователь может закрепить скрипт в файле скриптов приложения за той же клавишей, что и в файле скриптов по умолчанию, без особых противоречивых последствий. С другой стороны, если пользователь присваивает скрипту в файле приложения то же имя, что и в файле по умолчанию, то даже нет необходимости закреплять этот скрипт приложения за определенной клавишей. В обоих случаях Jaws выполнит скрипт, имеющийся в файле скриптов приложения, и проигнорирует тот, который имеется в файле скриптов по умолчанию. Это происходит потому, что Jaws ищет и файл раскладки клавиатуры по умолчанию default.jkm, и файл раскладки клавиатуры приложения application.jkm чтобы узнать, не закреплен ли скрипт с конкретным именем за определенной клавишей. Jaws будет всегда выполнять скрипт из файла скриптов приложения, предпочитая его скрипту из файла скриптов по умолчанию, даже если закрепление за клавишей сделано в файле default.jkm. Другими словами, если в обоих файлах скриптов имеется скрипт с одним и тем же именем, а закрепление за клавишей сделано в файле скриптов по умолчанию, Jaws все равно будет знать, что ему полагается выполнить скрипт из файла скриптов приложения.

Функции

Если скрипт является функцией, и, следовательно, не привязан к клавише, тогда функция с конкретным именем в файле скриптов приложения будет работать вместо той, которая имеется в файле скриптов по умолчанию и имеет то же самое имя. Таким образом, в случае с функциями, результат определяет имя, а не клавиша. Заметьте, что речь идет об особом случае, который имеет место, если у вас есть скрипт в файле скриптов по умолчанию и скрипт в файле скриптов приложения, причем оба скрипта имеют одно и то же имя, и не привязаны к клавишам. В этом случае Jaws использует имя скрипта чтобы определить, какой из них является активным, и скрипт в файле скриптов приложения будет иметь приоритет перед скриптом с тем же именем в файле скриптов по умолчанию. Следовательно, в этом особом случае, скрипты, не связанные с клавишами, задают приоритеты тем же способом, что и функции. Если, например, скрипт запускается с помощью утверждения PerformScript, скрипт в файле скриптов приложения будет использоваться в порядке, приоритетном в отношении скрипта из файла скриптов по умолчанию. Утверждения PerformScript являются альтернативным способом запуска скриптов, но он будет описан далее в нашем руководстве.

Ранее уже было упомянуто, что если для конкретного приложения имеется файл скриптов приложения, этот файл скриптов будет автоматически загружен при запуске данного приложения. Jaws умеет это делать, поскольку главная часть имени файла скриптов приложения та же, что и имя самого приложения. Начиная с версии 3.3 в Jaws for Windows появилась возможность загружать файлы скриптов по выбору в любое время. Этот файл скриптов может иметь любое имя, и это имя необязательно должно уподобляться имени текущего приложения. Если загружается такой файл, он заменяет обычный файл скриптов приложения в стоге, если такой файл имеется. Но этот специальный файл скриптов будет, в свою очередь, автоматически заменен, если пользователь переключится на новое приложение, которое загрузит свой собственный файл скриптов. Эта новая возможность позволяет пользователю загружать самопальные файлы скриптов, чтобы справиться с необычными ситуациями в приложении, где требования очень уж отличаются от остальной части приложения. Специальный файл скриптов можно загружать вручную, с помощью горячей клавиши, или автоматически, когда на экране появляются определенные окна или объекты. Функция, используемая для загрузки специальных файлов скриптов, называется SwitchToScriptFile (ПереключитьсяНаФайлСкриптов). Ее можно вызвать вручную, или автоматически с помощью методов, описанных ниже.

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

Что такое диспетчер скриптов?

Jaws предоставляет вам все инструменты, необходимые для редактирования и создания скриптов. Эти инструменты представлены в программе, которая называется диспетчер скриптов (Script Manager). Диспетчер скриптов - это полноценный текстовый редактор. Кроме обычных режимов, имеющихся в большинстве текстовых редакторов, в нем встроены возможности, призванные помочь вам создавать скрипты, вставлять функции в ваши скрипты, выводить справочную информацию об этих функциях и скриптах, которые уже написаны, проверять на наличие ошибок, нарушающих правила корректного написания скриптов, сохранять и компилировать файлы скриптов. Кроме того, имеются три горячих клавиши, которые позволяют более эффективно просматривать скрипты в вашем файле скриптов. Функциональную клавишу F2 можно использовать для перемещения к заголовку следующего скрипта, а клавишу Shift+F2 можно использовать для перескакивания со скрипта на скрипт в обратном направлении. Комбинацию клавиш Ctrl+L можно использовать для вызова диалога, который в отдельном окне показывает алфавитный список всех скриптов в текущем файле. Это облегчает поиск конкретного скрипта в большом файле, если вы помните его имя, но не помните, в какой части файла он находится.

Диспетчер скриптов можно использовать для сохранения и компиляции ваших файлов скриптов. А что мы имеем в виду под словом "Компиляция?" Когда вы пишете скрипты для Jaws в диспетчере скриптов, вы пишете его обычным текстом. Однако, Jaws в этом виде его использовать не может, поскольку он не понимает обычный текст. Когда вы сохраняете ваш файл скриптов в диспетчере скриптов, он автоматически выполняет дополнительный шаг, который другие текстовые редакторы и обработчики текста не делают. Он создает дополнительный файл, преобразуя обычный текст в двоичный формат, который Jaws может понимать и использовать. Оригинальный (или исходный) текст сохраняется в файле с расширением .jss (Jaws script source), а скомпилированная, или двоичная версия сохраняется в файле с расширением .jsb (Jaws script binary). Вот почему так важно всегда создавать и сохранять свои файлы скриптов при помощи диспетчера скриптов. Если вы отредактируете свой файл скриптов в каком-нибудь другом текстовом редакторе, например в Блокноте (Notepad), при сохранении они не будут скомпилированы, и Jaws останется в полном неведении относительно тех изменений, которые вы сделали.

Есть три способа запустить диспетчер скриптов. Можно из любого приложения нажать комбинацию клавиш Insert+0. Можно нажать Insert+F2, чтобы вызвать диалог Jaws со списком доступных диспетчеров и других вспомогательных программ, после чего нажать букву S и клавишу Enter. Наконец, можно выбрать диспетчер скриптов из меню Utilities в окне Jaws. Когда вы запускаете диспетчер скриптов из приложения первым или вторым способом, он автоматически открывает файл сккриптов для этого приложения. Если файла не существует, диспетчер скриптов его создает. Когда вы запускаете диспетчер скриптов из меню Utilities, он никаких файлов не открывает.

Анатомия скрипта

Скрипты и функции можно разделить на три главных группы. Первая строка начинает скрипт или функцию, и может быть записана в одном из двух форматов:

Script ScriptName ()
Function FunctionName ()

Если скрипт привязан к клавише, его первая строка будет выглядеть как первая из двух вышеприведенных строк. Если это функция, и следовательно, не привязана к клавише, первая строка будет выглядеть как вторая из двух вышеприведенных строк. Иногда перед словом Function (функция) есть дополнительное слово, но это будет описано позже. В обоих случаях, вторым словом будет имя функции или скрипта. Имя может быть произвольным, но было бы очень полезно, если имя будет описывать то, что делает скрипт или функция. Если вы соединяете вместе несколько слов, начинайте каждое новое слово с большой буквы, чтобы Jaws мог произносить их как положено. Пробелы в именах скриптов не допускаются. В качестве типичных примеров имен скриптов можно привести следующие: SayNextLine, SayPriorCharacter, SayWindowTitle и NextDocumentWindow .Обратите внимание, что из такого названия очень хорошо видно, для чего эти скрипты предназначены. Наконец, в конце строки будут открывающая и закрывающая скобки. Иногда внутри этих скобок будет содержаться некоторая информация, но об этом будет сказано позже.

Далее идет тело скрипта. Оно состоит из всех инструкций, которые вы добавляете во время написания скрипта, таких как объявлений переменных, команд, утверждений контроля переполнения, вызовов функций, утверждений типа PerformScript (ВыполнитьСкрипт) и арифметических операций. По мере нашего продвижения по руководству, вы узнаете обо всех этих типах инструкций.

Наконец, последняя строка скрипта будет выглядеть примерно так, как одна из следующих двух строк:

EndScript
EndFunction

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

Наши первые скрипты

Теперь давайте напишем парочку небольших скриптов. Первый будет заставлять Jaws по нашему требованию озвучивать наше имя. Мы поместим его в файл скриптов Notepad, так чтобы мы могли немного поучиться писать скрипты, не залезая в очень важный файл скриптов по умолчанию. В точности выполните нижеприведённые шаги, и вы увидите, что писать простые скрипты не так уж трудно.

Если Jaws for Windows у вас еще не запущен, запустите его. Откройте Блокнот (Notepad), главное меню/программы/стандартные/блокнот. Запустите диспетчер скриптов, нажав Insert+0 или Insert+F2, после чего нажмите букву S и клавишу Enter.

Jaws сообщит вам, что вы находитесь в файле notepad.jss, т.е. в исходном файле скриптов для Notepad. Вы обратите внимание, что в этом файле скриптов нет. Блокноту скрипты не нужны, поэтому открытие диспетчера скриптов из Блокнота начнется с создания нового исходного файла. В меню Script выберите New Script (Новый скрипт), или воспользуйтесь горячей клавишей Ctrl+E. Появится диалог New Script (Новый скрипт), поэтому мы можем присвоить нашему скрипту имя и написать его документацию. Пока просто делайте как написано. Более подробно мы расскажем о присвоении имени и написании документации позже.

Когда появляется диалог New Script, курсор помещается в поле Script Name (Имя скрипта).

Наберите SayName.

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

Нажмите Tab, чтобы переместиться к блоку проверки Can Be Attached To Key (может быть прикреплен к клавише), и нажмите Пробел, чтобы включить его. На этом шаге диспетчеру скриптов сообщается, что мы пишем скрипт, а не функцию. Включив этот блок проверки, мы делаем возможным привязку скрипта к клавише.

Нажмите Tab, чтобы переместиться к полю Synopsis и наберите слова "Say our name".

Нажмите Tab, чтобы переместиться в поле Description (Описание) и наберите "The name of the person who wrote this script" (Имя того, кто написал этот скрипт).

Нажмите Tab, чтобы переместиться в поле Category (Категория) и наберите слово "Test".

Поле Category - это комбобокс, поэтому категорию можно выбрать, набрав ее вручную, или перемещаясь стрелками по списку чтобы найти ту, которая лучше всего подходит. Нажмите Tab, чтобы переместиться к полю Assign to (Закрепить за), и нажмите Ctrl+Shift+n чтобы прикрепить эту комбинацию клавиш к нашему скрипту.

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

Теперь мы снова оказались в главной области редактирования текста диспетчера скриптов, и у нас есть пустой скрипт, в первой строке которого написано
Script SayName ()
а в последней строке написано
EndScript .

Мы находимся между двумя этими пустыми строками. Клавишами-стрелками переместитесь к первой пустой строке после первой строки и теперь вы готовы к тому, чтобы писать тело скрипта.

Мы хотим, чтобы Jaws озвучивал строку символов, которая составляет наше имя. Мы можем это сделать, воспользовавшись одной из встроенных функций Jaws, которая называется SayString. Помните, что встроенные функции Jaws - это жестко запрограммированные функции, предназначенные для выполнения конкретных задач и они не могут модифицироваться пользователем. Это основополагающие строительные блоки, которыми мы пользуемся для создания скриптов. Эта функция предназначена для озвучивания сообщений во время выполнения скрипта. Обратите внимание, что в имени функции пробела нет.

Компьютерные функции часто называются путем слияния двух слов, описывающих то, что эта функция делает. Затем мы должны сообщить функции SayString, что мы хотим, чтобы она озвучивала. Другими словами, функция SayString сообщает Jawsу, что мы хотим, чтобы она озвучила сообщение, а затем мы должны сообщить функции те слова, которые мы хотим, чтобы она произнесла. Чтобы функция выполнила свою работу, мы должны передать ей некоторую информацию. Эта информация, которую мы передаем функции, называется параметр, и это жаргонное словечко вам также придется запомнить. В данном случае, параметром, который мы хотим передать, будет строка символов, которая составляет наше имя. Наберите программную строку в точности так, как выглядит следующая строка, за исключением того, что вместо букв xxx вы должны подставить свое имя.

SayString ("My name is XXX")

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

Script SayName()
SayString ("My name is XXX")
EndScript

Теперь мы должны сохранить и скомпилировать файл скриптов для NotePad. Нажмите Ctrl+S, и вы должны услышать сообщение "Compile complete" (Компиляцию завершил). Если этого не произошло, вернитесь обратно и вновь проделайте все шаги.

Закройте диспетчер скриптов. Вы должны вновь оказаться в Блокноте. Проверьте свою работу, нажав Ctrl+Shift+n. Ну и как? Вот он, ваш первый скрипт. Перейдите в другое приложение, и попробуйте нажать ту же комбинацию клавиш. На этот раз скрипт не работает. Это потому, что мы поместили наш скрипт в файл скриптов редактора Блокнот, и когда мы закрыли Блокнот, этот файл был выгружен из памяти. Если бы мы поместили наш скрипт в файл скриптов по умолчанию, этот скрипт работал бы в любом приложении, если только в файле скриптов для этого приложения не нашелся бы скрипт, прикрепленный к той же самой горячей клавише (или имеющий такое же имя).

Давайте теперь вернемся в блокнот и попробуем что-нибудь еще. Нажмите Insert+1 (1 на верхнем ряду, а не на цифровой клавиатуре) и Jaws скажет "Keyboard help On" (Помощь по клавишам включена). Это режим помощи, которым можно пользоваться для изучения клавиатуры,на самом деле не активизируя ни одной из клавиш. (Выйти из режима помощи по клавишам можно, нажав Insert+1 во второй раз).

Теперь нажмите свою горячую клавишу. На этот раз горячая клавиша не произносит вашего имени, она говорит, что делает горячая клавиша. Быстро нажмите комбинацию клавиш два раза, и вы услышите еще более подробную информацию относительно того, что делает горячая клавиша. Эти фрагменты информации - это поля синопсис и Описание, которые вы заполняли при создании скрипта. Теперь вы понимаете, почему так важно корректно заполнять эти поля.

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

Откройте текстовый редактор WordPad, открыв главное меню/Программы/стандартные/Текстовый редактор WordPad. Теперь откройте меню Файл, нажав Alt+F. Нажмите клавишу Стрелка вниз 7 раз, и вы услышите имя файла, который вы в последний раз открывали в WordPad. (Если вы еще ничего в этой программе не открывали, сделайте это сейчас, чтобы у вас была эта строка в меню).

А не лучше было бы, если бы мы смогли прочитать эту информацию и узнать, какой файл был открытым в последний раз, но только без этих многочисленных нажатий клавиш?

Давайте для этого напишем скрипт. Как и в предыдущем случае, в точности выполняйте все шаги, как это написано ниже.

Откройте диспетчер скриптов, нажав Insert+0, или Insert+F2, после чего нажмите букву S, а после нее клавишу Enter. Как и прежде, вы должны оказаться в пустом файле скриптов Wordpad.jss. Начните новый скрипт, выбрав New script в меню Script, или нажмите горячую клавишу Ctrl+E. Вы окажетесь в поле Имя скрипта (Script name).

Наберите LastOpenedFile (ПоследнийОткрытыйФайл) без пробелов, как было показано выше. (Прим. переводчика: русские варианты названий скриптов и функций приводятся просто для иллюстрации, и не могут быть использованы в исходных текстах скриптов).

Клавишей Tab переместитесь к блоку проверки Can Be Attached to key (может быть закреплен за клавишей) и включите его.

Клавишей Tab переместитесь к полю Synopsis и наберите "Says last opened File". (Не включайте символы кавычек, здесь они просто для того, чтобы показать, что набирать. Этот комментарий относится ко всем знакам кавычек, которые использованы просто для того, чтобы показать вам, что набирать).

Клавишей Tab перейдите в поле Description (Описание) и наберите "Says the name of the last file opened in WordPad" (Сообщает имя последнего файла, открытого в WordPad).

Перейдите в редактируемый комбобокс Category и клавишами-стрелками спускайтесь до тех пор, пока не дойдете до категории Say (сказать).

Перейдите в поле Assign to Hot Key и нажмите Ctrl+Shift+l, чтобы сделать эту клавишу горячей для данного скрипта.

Перейдите к кнопке OK и нажмите Enter.

Теперь мы снова находимся в области редактирования диспетчера скриптов, и у нас есть пустой скрипт, в первой строке которого написано Script LastOpenedFile ()", а в последней строке написано "EndScript". Мы находимся между двумя этими строками.

С помощью клавиш-стрелок поднимитесь на первую пустую строку после первой строки, и вы будете готовы к тому, чтобы писать тело скрипта.

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

Script LastFile ()
SpeechOff ()
{Alt+F}
Pause ()
NextLine ()
NextLine ()
NextLine ()
NextLine ()
NextLine ()
NextLine ()
NextLine ()
SpeechOn ()
SayLine ()
SpeechOff ()
{escape}
{escape}
Pause ()
SpeechOn ()
EndScript

Итак, разберемся, что же выполняют все эти утверждения?

Вы вероятно заметили, что когда вы нажали Alt+f в Wordpad чтобы открыть меню Файл, Jaws сообщил: "menu active, file, new, CTRL+N". Мы не хотим выслушивать всю эту болтовню во время выполнения скрипта, поэтому мы во второй строке нашего скрипта отключаем речь с помощью функции SpeechOff(). Затем строка {Alt+F} посылает в WordPad команду Alt+F, точно так же, как если бы мы ввели эту команду с клавиатуры. Как вы узнаете позже, мы всегда помещаем комбинации клавиш, которые хотим послать в приложение, между фигурными скобками (В более поздних версиях Jaws разработчики рекомендуют отказаться от этой практики и использовать функцию TypeKey () вместо фигурных скобок. - Прим. сост.). Затем дается команда сделать паузу, чтобы приложение имело возможность вывести меню, прежде чем скрипт продолжит свою работу. Это делается очень часто, когда нам нужно, чтобы приложение выполнило какое-либо действие. Без этого наш скрипт может забежать вперед приложения, и отработать прежде, чем приложение выполнит то, что мы от него хотим. Затем мы спускаемся по меню на семь пунктов с помощью семи утверждений NextLine. Таким образом мы помещаемся в пункт, где приведено имя последнего открытого файла. Прежде, чем мы сможем услышать, что там написано, мы должны снова включить речь командой SpeechOn. Далее находится утверждение SayLine, которое и озвучит нам содержание текущей строки. Теперь нам лучше снова отключить речь, чтобы не выслушивать все то, что Jaws обычно говорит при выходе из меню. Теперь два утверждения Escape выведут нас из меню. Обратите внимание, что эти утверждения должны быть помещены в фигурные скобки. Затем нам придется снова поместить паузу, чтобы меню исчезло, и наконец, мы снова включаем речь последней командой SpeechOn. Теперь нужно сохранить и скомпилировать наш скрипт нажав Ctrl+s.

Вернитесь в WordPad и нажмите свою новую горячую клавишу, Ctrl+Shift+l. Вы должны быть вознаграждены тем, что Jaws сообщит вам имя последнего открытого файла. Если вы думаете, что это здорово, подождите немного. Вы только начинаете знакомиться с тем, что можно делать с помощью этого замечательного языка скриптов. Вы больше не будете находиться в зависимости от глупого программиста, который не соблюдал правила и написал приложение, которое невозможно озвучить с легкостью. Вам больше не придется нажимать дюжины клавиш, чтобы получить с экрана фрагмент информации, который ваши зрячие друзья могут получить, просто взглянув на экран. Вам больше не надо ждать кого-нибудь, кто сконфигурирует для вас приложение. Изучение этого языка может потребовать некоторой работы, но вы будете вознаграждены умением заставить ваши приложения говорить и вести себя в большем соответствии с вашими желаниями. Хорошенько изучите весь этот материал, и вы сможете получать доступ к своим приложениям гораздо лучше и эффективнее, чем вы даже могли себе когда-либо представить.

Прежде чем окунуться в бодягу языка скриптов, необходимо еще одно слово поощрения. Иногда бывает обескураживающе видеть завершенный скрипт, как например вышеприведеннный, который работает в точности так, как ему положено. Новоявленный автор скриптов посмотрит на этот скрипт и скажет: "Ради всего святого, как они узнали, какие утверждения использовать и в каком порядке их расположить?" Необходимо понимать, что скрипты не появляются из воздуха как правильно и без единой ошибки подготовленный продукт. Автор испробовал многие конфигурации этого скрипта, прежде чем пришел к той, которая работает лучше всего, и которая показана выше. Первая версия не содержала никаких утверждений типа SpeechOn или SpeechOff, и в результате скрипт озвучивал слишком много информации. Поэтому и были добавлены эти утверждения. Но потребовалось несколько попыток, пока было найдено их наилучшее расположение. Но и после этого скрипт по-прежнему не работал как положено, пока в нужных местах не были поставлены утверждения Pause, и этот процесс потребовал дополнительных попыток и ошибок. Суть в том, что вам придется делать свои догадки и кое-что пробовать. Если ваша догадка не сработала, попробуйте что-нибудь другое. По мере приобретения опыта вы будете делать это гораздо быстрее. Но единственный способ выучить этот новый язык - путь проб и ошибок, и этим путем можно идти, только пытаясь писать свои собственные скрипты. Не бойтесь пробовать. Худшее, что может произойти - это то, что скрипт не будет делать то, что вы от него хотите, и вам придется попробовать что-нибудь другое. Вы будете совершать ошибки, но они являются частью процесса. Чем больше у вас будет опыта, тем легче и быстрее вам будет писать скрипты. Но если вы не будете пытаться писать скрипты, вы никогда не научитесь этого делать. К этому моменту вы должны получить мысленную картину, для чего нам нужны скрипты, как Jaws использует их для повышения эффективности, и как файлы скриптов по умолчанию и файлы скриптов приложений работают совместно.

Домашнее задание # 1.

А вот вам и первое домашнее задание и шанс приобрести некоторый опыт в написании скриптов. Во время написания последнего скрипта вы вероятно заметили, что меню Файл в WordPad не просто показывает последний открытый вами файл, он показывает четыре файла. Отредактируйте предыдущий скрипт таким образом, чтобы озвучивались все четыре файла, а не только первый.

Диспетчер скриптов

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

  1. меню;
  2. различные типы файлов диспетчера скриптов;
  3. утверждения Include (Включить);
  4. Диалоги Новый скрипт и Информация о скрипте;
  5. диалоги InsertFunction (вставить функцию) и PerformScript )Выполнить скрипт).
Меню
Типы файлов диспетчера скриптов

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

JSS - как уже описывалось выше, это исходный файл скрипта для Jaws, который создается пользователем для создания файлов скриптов для конкретных приложений.

JSB - это бинарный файл скриптов Jaws, который создается диспетчером при сохранении и компиляции файла типа JSS. Этот файл не должен ни непосредственно создаваться, ни редактироваться пользователем.

JSM - это файл сообщений скриптов Jaws, которые озвучиваются при выполнении функции SayString. Когда вы создаете продвинутые файлы скриптов, которые подлежат распространению по всему миру, предпочтительно использовать номера сообщений в функциях SayString, а не помещать туда реальный текст. Таким образом можно переводить сообщения на другие языки. JSM файл содержит утверждения, которые сообщают файлу скриптов что говорить по конкретному номеру сообщений. Эти номера сообщений на самом деле являются константами, которые приравниваются к сообщениям, которые вы хотите озвучить. Если вы посмотрите на структуру файла default.jsm, вы увидите, что номера сообщений задаются точно также, как и все прочие константы. Например, файл сообщений по умолчанию default.jsm содержит утверждения типа MSG1 = "End" или MSG2 = "home". Вы обратите внимание, что утверждения записаны по одному на строке, и в конце каждого утверждения стоит запятая, за исключением последнего утверждения в файле. Если скрипт в default.jss встречает строку SayString (MSG1), он скажет End, а если ему встретится строка SayString (MSG2), он скажет Home.

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

JSH - это файл заголовка скриптов Jaws, и в нем содержится другая информация, необходимая для ассоциированного с ним файла типа JSS, например задаются константы или глобальные переменные. Мы уже вкратце обсуждали константы и переменные, и поговорим о них ниже более подробно. Глобальные переменные - это такие переменные, которые могут использоваться более чем в одном скрипте. Необходимо сообщить Jaws, каково значение константы, иначе он этой информации не узнает. Аналогичным образом, что вы будете использовать определенную переменную с определенным именем, иначе Jaws не узнает, что данную конкретную строку символов следует воспринимать как переменную. Этот процесс сообщения Jaws о константах и переменных, которыми мы будем пользоваться, называется объявлением. Если у вас только несколько констант или глобальных переменных, вы можете прямо поместить их в начало JSS файла, который вы создаете. Более подробно эта процедура будет описана ниже. Регулярные, или локальные переменные, всегда объявляются внутри самого скрипта. Однако, если вы используете большое количество констант или глобальных переменных, лучше поместить их в отдельный JSH файл. Исследуйте файлы hjglobal.jsh и hjconst.jsh в качестве примеров файлов, содержащих глобальные переменные и константы.

JSD - это файл документации скриптов Jaws, и в нем содержится вся описательная информация о каждом скрипте, которую вы вводите, когда создаете новый скрипт при помощи диалога New Script. Эта информация автоматически вводится в JSD файл, когда вы создаете скрипт таким образом. При необходимости, этот файл можно редактировать вручную.

Утверждения Include

Предположим, вы решили использовать jsm и/или jsh файл в качестве части набора файла скриптов, который вы пишете для нового приложения. Поэтому вы забегаете вперед и создаете эти файлы. Ну, а дальше что? Как главный jss файл узнает, что эти файлы существуют и являются частью набора скриптов? Взгляните на первые строки файла default.jss и вы увидите примерно такие строки:

; глобальные переменные по умолчанию
Include "hjglobal.jsh"
; константы по умолчанию
Include "HJCONST.JSH"
; файл сообщений
Include "default.jsm"

Эти утверждения называются утверждениями Include, и их назначение состоит в том, чтобы сообщить jss файлу, что вся информация во включенных файлах является частью данного файла. Когда вы сохраняете jss файл и создаете jsb файл, вся информация во включенных файлах также будет скомпилирована в результирующий jsb файл. Таким образом, скрипты в jss файле узнают об определениях, содержащихся во включенных файлах. Синтаксис этих утверждений типа include необходимо соблюдать в точности как показано. Обратите внимание, что имя файла приводится вместе с расширением и заключается в двойные кавычки. Все, что записано после точки с запятой, считается комментарием, и имеет целью просто дать читателю информацию. Все, что записано в данной строке после точки с запятой, игнорируется компилятором. Эти комментарии не влияют на выполнение скрипта, но помогают разобраться в логике его работы.

Диалоги New script и Script information

Диалог New Script находится в меню Script, а диалог Script information находится в меню View, как опция Documentation. Эти два диалога являются одинаковыми, за исключением того, что диалог New script выводится при создании нового скрипта, а диалог Script Information выводится в том случае, если вы хотите просмотреть документацию к скрипту, который уже существует. Клавишами быстрого запуска для этих диалогов являются Ctrl+e и Ctrl+D соответственно. Большинство пунктов в меню диспетчера скриптов имеют горячие клавиши быстрого запуска, и пользователь может легко познакомиться с ними, изучив пункты меню.

В этих многостраничных диалогах имеется две вкладки: вкладка General (Общие) и вкладка Parameters (параметры). Каждая из этих вкладок описана ниже.

Вкладка General

Во вкладке General мы находим следующие строки ввода:

Script Name - здесь вы вводите имя вашего скрипта или функции. Было бы полезно использовать имя, описывающее то, что делает скрипт. Вы можете использовать несколько слов, соединенных вместе. Начинайте каждое слово с заглавной буквы, чтобы Jaws произносил каждое слово по отдельности. Пробелы в имени файла не допускаются.

Can Be Attached to Key (может быть прикреплен к клавише) - это блок проверки. Если вы его включаете - вы создаете скрипт, если нет - то функцию. Помните, что скрипты могут быть прикреплены к клавишам, а функции - нет.

Synopsis - в этом поле должно содержаться краткое описание того, что делает скрипт. Он используется, если вы входите в режим помощи по клавиатуре (Insert!1) или в помощь по ключевому слову (Shift+F1) в диспетчере скриптов. Доступ к полю Synopsis осуществляется путем нажатия комбинации клавиш6 которая вас интересует, после того, как вы вошли в режим помощи по клавиатуре.

Description - в этом поле должно содержаться более подробное описание того,. что делает скрипт. Это описание используется, если вы входите в режим помощи по клавиатуре (Insert+1) или в помощь по ключевому слову (Shift+F1) в диспетчере скриптов. Доступ к полю Description (Описание) осуществляется, если вы входите в режим помощи по клавиатуре и дважды быстро нажимаете интересующую вас комбинацию клавиш.

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

Assign to Hot Key (Закрепить за горячей клавишей) - это поле доступно только в том случае, если вы включили блок проверки "Can be attached to key". Нажмите комбинацию клавиш, на которую вы хотите повесить ваш скрипт. Если горячая клавиша закреплена за другим скриптом, вы услышите предупреждающее сообщение, и вам будет дана возможность продолжить определение или выбрать другую горячую клавишу.

Function Returns (функция возвращает) - этот пункт доступен только в том случае, если вы отключили блок проверки "Can be attached to key". Возможны 5 вариантов: Int (Целое число), Handle (рукоятка), Object (Объект), string (строка) и Void (пустая). Выберите один из первых четырех опций, если ваша функция предназначена для вывода одного из этих четырех типов данных в вызывающий ее скрипт. Выберите Void, если вам не нужно, чтобы ваша функция возвращала какое-либо значение. То, что вы выберете, появится в первой строке скрипта перед словом Function. Более подробное описание возвращаемых значений будет дано позже.

Return Description (описание возврата) - доступно только в том случае, если вы не включили блок проверки "Can be attached to key". В этом поле должно содержаться краткое описание того, какая информация возвращается функцией и как эту информацию имеется в виду использовать.

Вкладка Parameters

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

Existing Parameters (существующие параметры) - в этом списке будут показаны уже существующие параметры, если таковые существуют. Он также будет показывать параметры по мере их добавления. Вы можете перемещаться по списку с помощью клавиш-стрелок вверх и вниз, чтобы выбрать параметры для последующего удаления. New Parameter (новый параметр) - если вы хотите добавить параметр, наберите его имя в этом поле.

By Reference (по ссылке) - чтобы понять этот пункт, вы должны понять, что параметры используются для передачи данных из вызывающего скрипта на функцию. Обычно такая передача - это улица с односторонним движением. Эта ситуация по умолчанию известна как передача параметров "по значению". Таким образом, когда вы вызываете функцию из скрипта, текущее значение параметра, коль скоро оно существует в скрипте, будет скопировано и передано функции. Во время выполнения функции значение параметра может измениться. Поскольку обмен информацией о параметре обычно улица с односторонним движением, когда данные передаются по значению, скрипт не будет знать о том, что значение параметра изменилось. Когда функция выполнится и вернет управление скрипту, скрипт продолжит работу с первоначальным значением параметра. Включение блока проверки By reference изменит улицу с односторонним движением на улицу с двухсторонним движением. Если этот блок проверки был включен, изменения в значении параметра, происшедшие во время выполнения функции, будут известны вызывающему скрипту. Это делает возможным изменение значения параметра при выполнении функции, с тем чтобы затем скрипт мог использовать это изменившееся значение. Происходит это потому, что передача по ссылке передает функции адрес памяти, в котором находятся данные, а не значение. Если функция изменяет значение по этому адресу, вызывающий скрипт или функция,использующая значение, хранящееся в том же адресе, будет использовать изменившееся значение.

Description (описание) - это поле должно содержать очень краткое описание того, для чего предназначен параметр. Available Types - вы должны выбрать Handle, Int, Object или String в этом списке, в зависимости от типа информации, который должен передавать этот параметр. Как будет описано ниже, Handle - это рукоятка окна.

Add (Добавить) - эта кнопка будет доступна, если вы заполнили предшествующие поля. Воспользуйтесь клавишей Enter или пробел, чтобы добавить свой новый параметр к существующему списку параметров.

Remove (убрать) - эта кнопка будет доступна, если вы выделили строку в списке существующих параметров. Выбор этой кнопки с помощью клавиши Пробел или Enter удалит выделенный параметр из списка.

Диалоги Insert Function (вставить функцию) и Perform Script (выполнить скрипт)

В меню Скрипт есть два пункта, Insert Function Call (вставить вызов функции) и Insert Performscript (вставить выполнение скрипта). Они используются для вставки функций и для вызова из скрипта других скриптов. Использование двух этих инструментов описано ниже.

Insert Function Call - выводит диалог вставки функции, который является списком более чем двухсот функций, которые вы можете использовать при создании скрипта. Вы услышите заголовок Insert Function 1". Термин "function 1" означает, что вы находитесь на первом уровне этого диалога. Первое поле в этом диалоге является полем редактирования. Следующий раздел - алфавитный список всех доступных функций. Если вам посчастливится знать имя нужной вам функции, вы можете начать набирать ее имя в поле редактирования, и выделение в алфавитном списке будет автоматически перемещаться к букве, которую вы только что набрали. Вы также заметите, что читается описание новой функции, всякий раз когда выделение перемещается к другой функции. Как только вы введете достаточно букв, чтобы услышать имя функции, которую вы только что искали, просто нажмите Enter, чтобы выбрать эту функцию. Если вы точно не помните имени функции, просто наберите достаточно букв, чтобы попасть в нужную часть списка, затем переместитесь к списку, и перемещайтесь вверх и вниз по списку, пока не не найдете нужную функцию. Вы также можете набирать имена функций, прямо находясь в списке, и диспетчер скриптов будет перемещать вас к нужной функции.

Вы также услышите описания функций, когда будете перемещаться вверх и вниз по списку. Когда вы нажмете клавишу Enter, чтобы выбрать функцию, произойдет одно из двух: если эта функция не требует никаких параметров, вы вернетесь в главное окно редактора диспетчера скриптов, и вы увидите, что функция была добавлена в ваш скрипт. Однако если функция требует один или несколько параметров, появится другой диалог, содержащий поле редактирования, и вам будет предложено ввести параметры. Например, если вы выбираете функцию SayString, вы будете помещены в поле редактирования, куда вы можете ввести текст или сообщение, которое вы хотите озвучить. Это и есть параметр, которого требует функция SayString. Если функция, которую вы выбрали, требует, чтобы вы выбрали другую функцию в качестве параметра, вы можете нажать комбинацию клавиш Alt+I, после чего появится новый диалог, очень похожий на диалог Insert Function. Вы услышите заголовок "Insert Function 2". Единственная разница состоит в том, что в этом списке показаны только функции, которые диспетчер скриптов считает подходящими параметрами для данного выбора. Следовательно, в этом дополнительном списке будут показаны не все функции главного списка. Вы должны либо выбрать функцию из этого списка, либо непосредственно ввести имя функции в поле редактирования Параметров, когда оно появится в первый раз. Затем нажмите Enter. продолжайте этот процесс, пока не введете все нужные параметры. Иногда вам придется выходить даже на третий уровень, или даже выше, т.е. "Insert Function 3", "Insert Function 4", и т.д., снова нажимая Alt+E. (Этот процесс использования функций в качестве параметров для других функций, называется "Вложение", и он будет описан более подробно ниже в разделе под названием "Использование вложенных функций".)

Затем диспетчер скриптов вернет вас в главное окно редактирования, и ваша функция, вместе со всеми параметрами, будет присутствовать в скрипте. Находясь в диалоге Insert Function, вы также можете переместиться клавишей Tab к полям Description и Returns чтобы просмотреть более подробную информацию, описывающую функцию и возвращаемое ею значение, если таковая информация существует. Стоит также заметить, что список функций в этом диалоге содержит и встроенные в Jaws функции, и функции, определенные пользователем в текущем файле скриптов., Таким образом, если вы задали для скрипта новую функцию в файле скриптов, после компиляции вы увидите свою функцию в списке.

Insert PerformScript (вставить выполнение скрипта) - при выборе этой опции вы попадаете в список, содержащий все доступные скрипты, которые вы можете вызвать из скрипта, который вы пишете. Вы можете перемещаться по списку клавишами-стрелками, или начать набирать имя скрипта, чтобы перескочить к нему. Нажатие Enter на одном из имен, например, скрипта SayMyName" приведет к тому, что в вашем скрипте появится следующая строка:

PerformScript SayMyName()

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



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2019