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

(Переработанный и дополненный вариант)
Источник:www.tiflocomp.ru
Дата публикации:2004
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

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

От составителей

В этом пособии представлен частично переработанный и исправленный материал, составленный с опорой на руководство по созданию скриптов, входящее в состав документации Jaws for Windows™ версии 3.5 (Freedom Scientific©). В качестве основы использован перевод руководства, выполненный Александром Кунгуровым.

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

Введение

Что такое скрипты? Давайте начнем с некоторых определений. Что такое скрипт вообще?

Когда вы работаете на компьютере , то ваши действия можно представить в виде последовательности шагов, некоторые из которых вам приходится повторять. Допустим, вы последовательно нажимаете несколько клавиш, чтобы перейти в нужную часть программы или загрузить программу, с которой вы хотите поработать. Затем, после того, как вы оказались там, куда стремились, вам возможно придется нажать еще несколько клавиш, чтобы ввести нужные данные. Например, вы работаете в текстовом редакторе и хотите ввести в верхней части письма свой обратный адрес. Это может оказаться утомительным занятием, если вам необходимо оформить 285 писем счастья. Поэтому разве не замечательно было бы набирать обратный адрес нажатием всего лишь одной единственной клавиши? Это как раз то, что можно реализовать с помощью скрипта. Скрипт (в более ранних версиях известный как макрос) - это небольшая компьютерная программа, которая объединяет несколько шагов или комбинаций клавиш в одну операцию, которую вы можете выполнить быстро и просто. Ну, по крайней мере, это один из типов скриптов. Jaws и другие компьютерные приложения все время используют скрипты, и очевидно, делают это не только для того, чтобы набирать обратный адрес. Поэтому, в общем случае, скрипты можно определить как последовательности отдельных шагов, которые можно использовать для управления различными компьютерными процессами, начиная от таких простых шагов, как ввод повторяющихся строк данных, и кончая сложными вещами, которые ваш компьютер выполняет постоянно (например, ежедневно или еженедельно) как одну из задач. Именно программированием такого рода последовательностей мы и намерены озаботиться в данном руководстве. Хотя то, что вы здесь узнаете, вы спокойно сможете использовать для написания обратных адресов, вы также научитесь контролировать Jaws таким образом, что он будет вести себя в большем соответствии с вашими желаниями.

Многое из того, что компьютер, как мы полагаем, делает по умолчанию, фактически выполняется под контролем скриптов. Мы, конечно, не считаем их скриптами, поскольку они закодированы внутри приложения. Например, когда мы пользуемся клавишами управления курсором, или вызываем в Microsoft Word диалог с помощью горячей клавиши, на самом деле мы вызываем часть программы, которая выполняет ряд операций или шагов. Согласно нашему определению, это и есть скрипт. Jaws использует много различных видов скриптов, которые сообщают ему, что делать в определенных ситуациях или когда вы нажимаете определенные клавиши. Jaws потому и стал такой чрезвычайно мощной программой, что разработчики не стали прятать эти скрипты во внутреннем коде главной программы. Если бы они поступили иначе, то Jaws был бы куда менее гибким инструментом и был бы куда менее приспособляемым к нуждам необычных приложений. Разработчики Jaws приняли сознательное решение, позволить вам писать собственные скрипты для конкретных целей и дать вам возможность просматривать и изменять отдельные скрипты по умолчанию, которые контролируют многие аспекты работы программы. Модифицированные или заново написанные скрипты группируются в файлы скриптов, которые имеют то же имя, что и приложение, для которого они созданы, но имеют другое расширение. Доступ к скриптам, которые контролируют наиболее фундаментальное поведение Jaws был обеспечен по двум веским причинам. Во-первых, каждый пользователь хочет иметь возможность настроить поведение программы так, как ему это необходимо. Во-вторых, хотя разработчики Jaws предусмотрели многие ситуации, возникающие при чтении экрана в разных приложениях, невозможно предвидеть все режимы экранного отображения, которые могут придумать многочисленные создатели программ. В вашем распоряжении находится мощный языка сценариев Jaws, тобы написать скрипт, способный обработать любую необычную ситуацию. Вам остается только научиться пользоваться этим арсеналом. Кстати, чтобы настроить Jaws, далеко не всегда следует пользоваться скриптами. Например, определенные части экрана можно заставить озвучивать, или игнорировать посредством использования фреймов (frames), которые можно создать при помощи диспетчера фреймов. Со временем, несомненно появятся дополнительные режимы, которые дадут вам возможность настраивать Jaws не обращаясь к скриптам. Но всегда будут необычные или запутанные ситуации, с которыми сможет справиться только хорошо написанный скрипт. Помните, что после того, как вы научитесь пользоваться языком сценариев Jaws, у вас в руках окажется мощный инструмент, гораздо более мощный, чем любой встроенный режим. Поэтому вы, вероятно, спрашиваете себя, в чем же разница между макросом и скриптом? В общем-то никакой. Скрипт - это макрос, и так оно и есть. Не позволяйте жаргону вас запутать. Теперь мы будем называть их скриптами.

Скрипты против функций

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

Откуда Jaws знает, что он должен прочитать новую строку текста, когда вы находитесь в текстовом редакторе и нажимаете клавишу "Стрелка вниз"? Он узнает об этом, поскольку в главном файле скриптов Jaws, который называется файл скриптов по умолчанию , есть скрипт, который "связан" с клавишей "Стрелка вниз" и этот скрипт сообщает Jaws, что следует переместить курсор на строку вниз и прочитать ее. Этот конкретный скрипт носит название SayNextLine и активизируется, когда вы нажимаете клавишу "Стрелка вниз". Этот скрипт довольно сложен, потому что он должен проанализировать, где вы находитесь, и что вы собираетесь сделать, когда нажимаете "Стрелку вниз". Он проверит тип активного окна и если это окно, предназначенное для ввода текста (например, в текстовом редакторе), то переместит курсор на одну строку вниз и прочитает ее. В исходном тексте этого скрипта можно отыскать строку SayLine () , которая выполняется после того, как курсор перемещается на следующую строку. Это строка скрипта, которая содержит вызов функции чтения текущей строки текста. В том же файле скриптов находится похожий скрипт, который называется SayPriorLine (ЧитатьПредыдущуюСтроку), который выполняется , когда вы нажимаете клавишу "Стрелка вверх". Этот скрипт тоже вызывает функцию SayLine .

Когда вы нажимаете клавиши "Стрелка влево" и "Стрелка вправо", то выполняются два других скрипта: SayNextCharacter (ЧитатьСледующийСимвол) и SayPriorCharacter (ЧитатьПредыдущийСимвол). Эти скрипты вызывают функцию SayCharacter, чтобы озвучить новый символ после того, как курсор переместиться на него. На самом деле, есть множество скриптов, предназначенных для того, чтобы выполнять определенные действия при нажатии конкретной клавиши (именно такой смысл подразумевается под словосочетаниями "прикреплен к клавише", "связан с клавишей", "ассоциирован с клавишей" и т.п.). Такие скрипты анализируют текущую ситуацию и пытаются выполнить действие, соответствующее этой ситуации. Если ситуация очень необычная и не была предусмотрена разработчиками Jaws, то вы можете сделать некоторые модификации, чтобы команды выполнялись как положено.

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

Почему это так сделано?

Для описанного выше подхода есть два очень веских основания. Во-первых, некоторые функции отрабатывают выполняются автоматически, когда происходят определенные события. Это так называемые событийные функции . Следовательно, нет необходимости закреплять эти функции за определенными клавишами, поскольку их активизирует не клавиша.

Во-вторых, нередко код скрипта (т.е. последовательность команд, которую содержит скрипт) применим ко многим ситуациям, и может быть использован снова и снова. Вместо того, чтобы переписывать этот код в каждом скрипте, где он необходим, он может быть оформлен в виде отдельной функции, которую в случае необходимости может использовать , или "вызвать", любой скрипт. Таким образом, функции подразделяются на две категории, на те, которые срабатывают автоматически, когда происходят определенные события, и на те, которые вызыват" из другого скрипта или функции. Как уже было сказано, первый тип называется событийными функциями или функциями событий. Например, функция NewTextEvent вызывается, когда на экране появляется новый текст, а функция BottomEdgeEvent вызывается, когда курсор достигает нижней строки окна. Без функции NewTextEvent Jaws не смог бы автоматически озвучивать информацию, появляющуюся на экране. без функции BottomEdgeEvent системный курсор никогда бы не подавал звуковой сигнал, и не выдавал бы предупреждение, когда Jaws курсор достигал бы нижней строки окна.

p>

Второй тип функций (напомним, что они не вызываются автоматически событиями) не имеет специального названия , и поэтому мы будем называть их функциями. Эти функции действуют только в том случае, когда их вызывают другие скрипты или функции. Для этого в код скрипта или функции, в том месте, где должна быть вызвана такая функция, записывается имя вызываемой функции. Если вы именно так и делаете, то, когда скрипт доходит до строки, на которой написано имя вызываемой функции, он обращается к ней.Это и есть "вызов" функции. Например, функция NewTextEvent, упомянутая выше, имеет строку, в которой написано SayNonHighlightedText (). Если функция NewTextEvent проанализировала новый текст, написанный на экране, и решила, что он будет должным образом обработан функцией SayNonHighlightedText , она передаст управление этой функции, вызвав её и позволив ей озвучивать текст для вас. С другой стороны, если функция NewTextEvent решает, что информация на экране является выделенным текстом, то она вызовет другую функцию, которая называется SayHighlightedText, и даст возможность этой функции озвучивать текст.

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

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

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

Константы и переменные

Нам придется ввести еще два понятия, прежде чем мы на деле займемся написанием скриптов. Это "Переменная" и "Константа". Переменная - это область памяти компьютера, куда можно записывать различные значения и читать их оттуда. Само слово "перменная" указывает на то, что значения могут изменяться. Чтобы обратиться к этой области памяти, каждую переменную наделяют именем. Очевидно, что для предотвращения ошибок переменные не должны иметь одинаковые имена. Имя переменной - это слово из одной или нескольких букв латинского алфавита.

Значение переменной часто неизвестно заранее, и во время выполнения скрипта оно может меняться несколько раз. Когда значение переменной меняется, то говорят, что переменной присвоено новое значение. После того как переменной будет присвоено очередное значение, переменная хранит это значение до тех пор, пока ей не будет присвоено новое значение (старое значение при этом утрачивается). Например, в утверждении "Пусть X = 1" X - это имя переменной (иногда для краткости говорят не "имя переменной", а просто "переменная") , и мы присваиваем переменной под этим именем значение 1. X будет иметь значение 1 до тех пор, пока мы не изменим его на нечто другое, или пока скрипт не сделает это за нас. Кстати, это есть вид утверждения (команды) скрипта, которое мы используем, чтобы вручную присвоить значение переменной. При создании конкретного скрипта мы можем поместить в него набор утверждений, которые будут выполнены, если X = 1, ноне будут выполняться, если X имеет другое значение.

Продолжим наш пример. Значение, хранящееся в переменной X, может представлять тип окна, в котором мы сейчас находимся, скажем, Кнопка (Button), поле редактирования (Edit field), или список (List box). Для каждого типа окна X будет иметь различное значение, а нашему скрипту может потребоваться выполнить различные операции в зависимости от того, в каком окне мы сейчас находимся, и, следовательно, от того, какое значение было присвоено переменной X. Если бы наш скрипт имел возможность заглянуть в операционную систему Windows и определить тип окна, в котором мы сейчас находимся, скрипт мог бы присвоить X соответствующее значение, после чего скрипт мог бы продолжить выполнение, приняв решение относительно того, какой из вариантов действий выбрать. Выбор этот основывался бы на значении (т.е. типе окна), хранящемся в переменной. К счастью, Jaws имеет возможность заглянуть в операционную систему Windows (точнее, Windows предоставляет такую возможность - прим. сост.), и принять соответствующее решение. Такие решения, основанные на типе окна, составляют львиную долю тех операций, которые выполняет Jaws. В следующий раз, при запуске того же самого скрипта, мы можем оказаться в другом типе окна, и, следовательно, в переменной будет храниться другое значение. Поэтому скрипт может совершить уже другое действие, соответствующее данному типу окна. Еще раз повторим, что скриптам часто приходится принимать решения, и значение, хранящееся в переменной, это один из способов решить, что делать дальше.

Константы - это совершенно другое дело, поскольку, как явствует из их названия, они в процессе выполнения скрипта не изменяют своего значения. Если константе присвоено значение, оно остается постоянным. Это может показаться просто пустой тратой времени, но на самом деле это очень удобно. Константы - это способ использования легко запоминающихся имен для хранения труднозапоминаемых строк символов или чисел. Предположим, например, что ваш товарищ Никодим имеет членский билет ВОС с 589-43-3894. И предположим, что нам нужно работать с номерами членских билетов еще десяти человек. Мы можем просто задать константу, присвоив ей имя NikodimVOSNum, а затем присвоить этой константе номер Никодимовского членского билета , воспользовавшись выражением присваивания (инициализации константы):

NikodimVOSNum=589433894

С другими лицами и номерами их билетов можно проделать нечто аналогичное. Затем, когда нам понадобится напечатать номер членского билета, всё, что нам нужно будет сделать, это отправить на печать константы номеров билетов для каждого из десяти человек. (Весьма надуманный пример, так как не очень понятно, почему для той же цели не подходят переменные с аналогичными именами. Поэтому необходимо пояснить, что особенностью номера членского билета является то, что он, скорее всего, не изменится очень долгое время и уже в силу этого попадает под понятие константы. Типы окон, упомянутые выше, тоже имеют как бы номера членских билетов, по которым Windows их различает, то есть это тоже константы. - Прим. сост.)

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

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



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