BrowserNav

Это дополнение предоставляет пользователям NVDA мощные навигационные команды в режиме обзора. Оно работает в веб-браузерах, а также в любых других приложениях, поддерживающих режим обзора NVDA, таких как документы Word и почтовые клиенты.

Загрузить

Пожалуйста, установите его через магазин дополнений.

Использование в браузерах и других программах, поддерживающих режим обзора

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

BrowserNav можно использовать для навигации по горизонтальному смещению от левого края экрана, по размеру шрифта или по стилю шрифта.

  • При навигации по горизонтальному смещению вы можете легко найти абзацы, выровненные на странице по вертикали. В частности, вы можете нажать клавиши NVDA+Alt+Стрелка вниз или вверх, чтобы перейти к следующему или предыдущему абзацу с таким же смещением. Например, это может быть полезно при просмотре иерархических деревьев комментариев (например, на странице reddit.com) для перехода между комментариями первого уровня и пропуска всех комментариев более высокого уровня.
  • При навигации по размеру шрифта вы можете легко найти абзацы, написанные тем же размером шрифта или меньшим/большим размером.
  • Вы также можете ориентироваться по размеру шрифта с ограничением того же стиля шрифта.

Для переключения между этими параметрами используется ротор BrowserNav. В зависимости от настройки этого ротора BrowserNav будет сигнализировать звуковыми сигналами о смещении по горизонтали или размере шрифта выбранного в данный момент элемента. Кроме того, BrowserNav будет потрескивать при выполнении команд QuickNav, чтобы указать, какой объем текста был пропущен (эта функция доступна только в Google Chrome и Firefox).

BrowserNav работает в любом браузере, поддерживаемом NVDA. Хотя некоторые функции могут быть доступны не во всех браузерах. BrowserNav также работает в других приложениях, поддерживающих режим обзора NVDA, таких как документы Word и почтовые клиенты.

Комбинации клавиш:

  • NVDA+Alt+Стрелка вверх или Стрелка вниз: Переходить к предыдущему или следующему абзацу с тем же смещением по горизонтали или размером шрифта.
  • NVDA+Alt+Home или NVDA+alt+Стрелка влево: Перейти к предыдущему абзацу с меньшим смещением или большим размером шрифта (родительский абзац).
  • NVDA+Alt+End или NVDA+Control+alt+Стрелка влево: Перейти к следующему абзацу с меньшим смещением или большим размером шрифта (следующий родительский абзац).
  • NVDA+Alt+PageDown или NVDA+Alt+Стрелка вправо: Перейти к следующему абзацу с большим смещением или меньшим размером шрифта (дочерний абзац).
  • NVDA+Alt+PageUp или NVDA+Control+Alt+Стрелка вправо: Перейти к предыдущему абзацу с большим смещением или меньшим размером шрифта (предыдущий дочерний абзац).
  • NVDA+O: Переключать настройки ротора между смещением по горизонтали, размером шрифта, размером шрифта и стилем шрифта.
  • \ или Shift+\ (обратная косая черта): Прокрутить вверх или вниз, чтобы увидеть каждый элемент страницы; может быть полезна на динамических веб-страницах для загрузки всех элементов; также может быть полезна на веб-страницах с бесконечной прокруткой для загрузки следующего фрагмента.
  • NVDA+Shift+Стрелка влево: Вернуться к предыдущему расположению курсора в текущем документе.
  • NVDA+E: редактировать полу-доступные поля редактирования - смотрите соответствующий раздел ниже.
  • T или Shift+T: перейти к следующей или предыдущей таблице, но поместить курсор в первую ячейку. Иногда NVDA помещает курсор непосредственно перед первой ячейкой, и BrowserNav исправляет это поведение.

Закладки быстрого перехода

BrowserNav quickJump bookmarks - это мощный инструмент, который позволяет перемещаться по веб-страницам и автоматизировать некоторые повторяющиеся действия.

Комбинации клавиш для закладок

  • NVDA+J: Показать всплывающее меню быстрого перехода.
  • J или Shift+J: Перейти к следующей или предыдущей закладке быстрого перехода.
  • / и Control+/: Переключать режим прокрутки для навигации по строке (стрелки вверх и вниз) и по абзацу (Control+стрелка вверх и Control+стрелка вниз) соответственно.
  • Alt+J: щёлкнуть по всем закладкам быстрого щелчка на текущей странице.
  • Control+J: Произнести все закладки быстрого произношения на текущей странице.
  • Alt+1, Alt+2, ..., Alt+0: перейти к следующей иерархической закладке соответствующего уровня. 0 соответствует уровню 10; в качестве альтернативы, вызвать числовой скрипт, если он задан.
  • Shift+Alt+1, Shift+Alt+2, ..., Shift+Alt+0: перейти к предыдущей иерархической закладке.
  • Alt+или Shift+Alt+: перейти к следующей или предыдущей иерархической закладке любого уровня.

Вы также можете настроить пользовательские нажатия клавиш для большинства типов закладок (за исключением закладок пропуска, иерархических и числовых скриптов).

Сайты

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

  • URL: amazon.com
  • Тип совпадения: Соответствующий домен и его поддомены
  • Это будет соответствовать доменам amazon.com, smile.amazon.com и всем остальным доменам *.amazon.com.

Если вам нужен более точный контроль, вы также можете указать точный URL-адрес или задать регулярное выражение для URL-адреса.

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

Типы закладок

После того как вы настроили определение сайта, вы можете перейти к определению некоторых его закладок.

BrowserNav поддерживает несколько типов закладок:

  • Закладки быстрого перехода: вы можете переходить к ним, нажимая J или Shift+J.
  • Закладки пропуска: эти закладки автоматически пропускаются при навигации по строке (стрелки вверх/вниз) или по абзацу (Control+стрелка вверх/вниз). Это позволяет скрыть беспорядок на веб-страницах, такой как пустые строки, временные метки и любую другую избыточную информацию. Информация удаляется не полностью, SkipClutter можно временно отключить с помощью команд / или Control+/. По умолчанию SkipClutter пропускает пустые абзацы на всех веб-сайтах.
  • Закладки быстрого нажатия: вы можете пометить элементы, на которые можно перейти, такие как ссылки, кнопки или флажки, как закладки быстрого нажатия. Затем, нажав Alt+J, вы сможете быстро нажать все закладки быстрого нажатия на текущей странице одним нажатием клавиши, не перемещая курсор. Это может пригодиться для нажатия часто используемых кнопок на веб-сайте, таких как кнопка воспроизведения на YouTube или кнопка отключения звука на веб-сайтах видеоконференций.
  • Закладки быстрого произношения: вы можете просмотреть закладки этого типа, нажав клавиши Control+J; Курсор не будет перемещаться. Это удобно для проверки часто изменяемых элементов страницы. Вы также можете настроить закладку QuickClick на автоматическое обновление, то есть BrowserNav будет периодически сканировать страницу и автоматически проговаривать изменения в соответствующем тексте.
  • Иерархические закладки: это похоже на закладки быстрого перехода, но здесь учитывается смещение закладки по горизонтали. Такие сайты, как Reddit и Hacker News, имеют иерархическое дерево комментариев, что было довольно сложно для пользователей программы чтения с экрана. На этих веб-сайтах вы можете помечать комментарии как иерархическую закладку, а затем перемещаться между ними, нажимая Alt+цифра или Shift+Alt+цифра, где цифра означает номер строки 1,2,3,...0 - это уровень комментария. По умолчанию BrowserNav имеет иерархические закладки, настроенные для Hacker News и reddit.com.
  • Закладки скрипта: просто выполняют предоставленный скрипт при вызове.
  • Цифровой скрипт: нажмите Alt+0 - Alt+9, чтобы запустить скрипт, вводящий число в качестве входных данных. Может быть удобно, например, для перехода к i-ой закладке на странице одним нажатием клавиши.

Создание новой закладки

После настройки сайта самый простой способ создать новую закладку - перейти к нужному абзацу в документе, нажать NVDA+J, чтобы отобразить контекстное меню закладок, и выбрать Закладки > Создать новую закладку для сайта ...

Откроется диалог настройки закладки. Теперь вы можете настроить закладку. Вы можете изменить способ сопоставления текста (например, сопоставление строк или регулярных выражений).

Другие параметры этого диалога:

  • Категория: определяет тип закладки.
  • Отображаемое имя: необязательное название этой закладки для удобства чтения. Это просто даёт более точное название, чтобы вы могли идентифицировать эту закладку в длинном списке закладок.
  • Речевое сообщение при обнаружении закладки: необязательное сообщение, которое будет произноситься каждый раз, когда вы нажимаете на эту закладку в документе.
  • Смещение в абзацах: после обнаружения совпадающего текста BrowserNav переместит курсор на это количество абзацев вперед или назад. Это может быть полезно, например, если целевой текст, к которому вы хотите перейти, не содержит какого-либо общего текста, который можно сопоставить (например, сообщение на форуме), но предыдущий абзац содержит подходящее слово (например, upvote). В этом случае вы можете сопоставить слово upvote и указать offset=1, чтобы поместить курсор на первый абзац публикации вместо слова upvote.
  • Атрибуты: разделенный пробелами список атрибутов абзаца, которые сопоставляются. Список доступных атрибутов для текущего абзаца доступен в следующем поле формы. Список атрибутов предварительно заполнен некоторыми общими ролями, и, как правило, вам не нужно его редактировать.
  • Доступные атрибуты в текущем абзаце: это все атрибуты, найденные в текущем абзаце. Вы можете выбрать и нажать пробел, чтобы добавить их в список подходящих атрибутов.

Расширенные параметры сайта

В диалоге настройки сайта вы можете указать ряд дополнительных параметров:

  • Отображаемое имя: необязательное отображаемое имя для лучшей читаемости в списке сайтов.
  • Режим редактирования: это позволяет переопределить обработку событий фокусировки в NVDA по умолчанию. Некоторые веб-сайты неправильно используют события фокусировки. Чтобы использовать их более удобно, вы можете либо игнорировать события фокусировки, либо, в качестве альтернативы, отключить автоматический переход в режим редактирования при получении события фокусировки.
  • Режим живых областей: некоторые веб-сайты неправильно используют жывые области. Эта опция позволяет отключить живые области только для текущего веб-сайта.
  • Режим отладочного звукового сигнала: в основном он полезен для отладки. Вы можете заставить NVDA подавать звуковой сигнал при возникновении определённого события (фокус, обновление текущей области или успешный быстрый щелчок).

Скриптование

Начиная с BrowserNav версии 2.5, вы можете настраивать свои закладки с помощью скриптов на Python. Скрипты можно использовать для двух целей:

  1. Для улучшения алгоритма сопоставления, когда существующих параметров сопоставления недостаточно. Это относится к закладкам quickJump, QuickSpeak, QuickClick, иерархическим закладкам и закладкам SkipClutter.
  2. Для выполнения произвольного кода на Python с целью автоматизации определенных действий на веб-страницах. Это можно сделать с помощью скрипта или цифровых закладок скрипта.

Скриптовый API

Для вашего скрипта предоставляются следующие переменные:

  • p - текущий абзац. Это экземпляр класса Paragraph, определённого в paragraph.py
  • t - текущий объект textInfo.

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

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

  • Возвратить True, если оно совпадает, в противном случае False.
  • Возвратить значение None или не return, указывающее на отсутствие совпадения.
  • Возвратить целое число i, указывающее на то, что i-й следующий или i-й предыдущий абзац совпадает и должен произноситься вместо текущего абзаца.
  • Возвратить tuple (i: int, s:str), чтобы указать совпадение со смещением (см. предыдущий пункт), и запросить BrowserNav передать сообщение s.
  • Вызвать функцию match(), чтобы указать на совпадение. Эта функция внутренне генерирует исключение, так что выполнение вашего скрипта будет завершено после вызова match. Функция определяется как:

      def match(offset: int | TextInfo | Paragraph = None, message: str = None) -> None:
    

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

Вы можете использовать функцию print() для отладки вашего скрипта: выходные данные будут выведены в журнал NVDA.

Примеры скриптов

  1. Этот скрипт проверяет, что текущий абзац является ссылкой и что текст предыдущего заголовка уровня 5 начинается с текста текущего абзаца:

     try:
         if controlTypes.Role.LINK in p.roles and p.previousHeading5.textInfo.text.startswith(p.text):
             print(f"pp5 {p.previousHeading5.textInfo.text}")
             return True
     except NotFoundError:
         return None
    
  2. Этот скрипт не выполняет сопоставление, но активирует последнее поле редактирования на странице:

     p.end.previous.previousEdit.activate()
    
  3. Этот скрипт находит имя пользователя, которое может быть на один или два абзаца впереди; затем он находит начало комментария, анализируя размер шрифта; затем он находит конец комментария, ища текст "Ответить". Затем он сопоставляется со всем текстом комментария и добавляет имя пользователя, которое будет произнесено перед соответствующим текстом:

     user = p.next
     if user.text == "downvote":
         user = user.next
     try:
         username = user.text.split()[0]
     except IndexError:
         username = '?'
     pp = p
     begin = None
     for i in range(5):
         fs = pp.attributes.get(ParagraphAttribute.FONT_SIZE, [])
         #print(f"i={i} fs={fs}")
         if '9_pt' in fs:
             begin = pp
             break
         pp = pp.next
     else:
         return
     end = begin
     while end.text != 'reply':
         end = end.next
     match(textInfoRange(begin, end), username)
    
  4. Этот скрипт является генератором, что означает, что всё, что он выдаёт, будет использовано в качестве времени ожидания перед выполнением следующей строки. Этот скрипт будет выполняться в фоновом потоке неблокирующим способом.

    Этот скрипт выполняет ряд действий:

    • Находит кнопку с заданным названием и нажимает на неё.
    • Открывает диалог, в котором появляется сообщение: p.home.nextEmbeddedObject.activate()
    • Получает новый элемент в фокусе этого диалога: d = getFocusParagraph()
    • Находит и устанавливает флажок в этом диалоге.
    • Находит другую кнопку в этом диалоге по названию и нажимает её.

    Эти шаги повторяются 20 раз с помощью функции retry. Затем, после паузы в 500 мс, программа находит кнопку "Run Query" и нажимает её.

     def waitForDialogAndClickCheckbox():
         try:
             p.home.find("Link Last Used").activate()
             p.home.nextEmbeddedObject.activate()
         except NotFoundError:
             pass
         d = getFocusParagraph()
         c = d.home.nextCheckBox
         if controlTypes.State.CHECKED not in c.obj.states:
             c.activate() 
         d.home.find("Link QCPR Project").activate()
    
     yield from retry(waitForDialogAndClickCheckbox, count=20)
     yield 500
     yield from retry(lambda: p.home.find("Run Query").activate(), count=10)
    
  5. Это числовой скрипт, поскольку он принимает level в качестве входной переменной. Он находит level-е поле редактирования в начале страницы (или в конце, если level отрицательный) и вызывает для него script_editJupyter.

     if level > 0:
         p = p.home
         for i in range(level):
             p = Paragraph(p.nextEdit.textInfo)
     elif level <= 0:
         level = 1-level
         p = p.end.previous
         tones.beep(500, 50)
         for i in range(level):
             p = Paragraph(p.previousEdit.textInfo)
         else:
             tones.beep(500, 50)
     p.textInfo.obj.currentFocusableNVDAObject = p.textInfo.focusableNVDAObjectAtStart
     p.textInfo.obj.script_editJupyter(None)
    

Конфигурация

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

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

BrowserNav поставляется с конфигурационным файлом по умолчанию с примерами закладок.

Редактирование полудоступных полей редактирования

Многие современные веб-приложения, в частности Jupyter, используют поля редактирования, которые не так доступны, например, они кажутся пустыми, но вы можете копировать текст в них и из них обратно, используя клавиши Control+A, Control+ C и Control+V.

BrowserNav предлагает экспериментальную функцию для более удобного редактирования этих полей редактирования. Для её использования:

  1. Найдите поле редактирования в окне браузера.
  2. Нажмите NVDA+E.
  3. Появится новое окно с содержимым этого поля редактирования.
  4. Отредактируйте содержимое этого поля редактирования в этом окне.
  5. Как только вы закончите, вы можете нажать клавишу Escape, чтобы закрыть доступное окно редактирования и обновить поле редактирования на веб-странице.
  6. В качестве альтернативы вы можете нажать Control+Enter, Shift+Enter или Alt+Enter. Это закроет окно редактирования, обновит поле редактирования и передаст жест веб-приложению.
  7. Чтобы закрыть окно редактирования без сохранения изменений, нажмите Alt+F4.
  8. В любой момент, если содержимое ранее отредактированного текста будет утеряно, нажмите NVDA+Control+E, чтобы скопировать его в буфер обмена.

Примечания:

  • Не изменяйте состояние браузера, например, не переключайте вкладки и не изменяйте фокус на другие элементы в пределах вкладки, пока открыто окно редактирования текста. В противном случае BrowserNav не сможет правильно обновить текст в окне редактирования.
  • Не забудьте быстро отпускать клавиши Control, Shift или Alt после нажатия клавиш Control+Enter, Shift+Enter или Alt+Enter. Удержание их более секунды может привести к возникновению проблем.
  • В настоящее время эта функция является экспериментальной. Пожалуйста, рассчитывайте на успех только в 90-95% случаев.
  • Она была хорошо протестирована в Google Chrome и Firefox. Она может работать и в других браузерах, но вероятность возникновения проблем, таких как потеря информации, выше.

Исходный код

Исходный код доступен по адресу http://github.com/mltony/nvda-indent-nav.