BrowserNav (Навигация по обзору)

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

Загрузка

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

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

Обратите внимание, что начиная с NVDA v2024.2, команды вертикальной навигации и навигации по элементам с одинаковым стилем теперь доступны в ядре NVDA. Предпочтительнее использовать встроенные команды. Для них не назначено никаких жестов по умолчанию, поэтому жесты должны быть назначены пользователем в диалоге «Жесты ввода».

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

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

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

Клавиши:

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

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

Клавиши для работы с закладками

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

Сайты

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

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

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

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

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

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

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

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

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

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

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

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

Скриптинг

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

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

API скриптов

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

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

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

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

Вы можете использовать оператор 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. Этот скрипт находит имя пользователя, которое может быть на один или два абзаца вперед; затем он находит начало комментария, анализируя размер шрифта; затем он находит конец комментария, ища текст «Reply». Затем он сопоставляет все тело комментария и добавляет имя пользователя, которое будет озвучено перед сопоставленным текстом:
    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. Этот скрипт является генератором, что означает, что то, что он выдает, будет использоваться как время ожидания перед выполнением следующей строки. Этот скрипт будет выполняться в фоновом потоке неблокирующим образом. Этот скрипт выполняет серию действий:
    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, чтобы скопировать его в буфер обмена.

Примечания:

Исходный код

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

Перевод