BrowserNav

Esse complemento oferece aos usuários do NVDA comandos de navegação avançados no modo de navegação. Ele funciona em navegadores da Web, bem como em qualquer outro aplicativo compatível com o modo de navegação NVDA, como documentos do Word e clientes de e-mail.

Download

Instale-o por meio da loja de complementos.

Uso em navegadores e outros programas que suportam o modo de navegação

Observe que, a partir do NVDA v2024.2, a navegação vertical e os comandos de navegação do mesmo estilo agora estão disponíveis no núcleo do NVDA. É preferível usar os comandos incorporados. Eles não recebem nenhum gesto padrão, portanto, os gestos devem ser atribuídos pelo usuário na caixa de diálogo Gestos de entrada.

O BrowserNav pode ser usado para navegar pelo deslocamento horizontal da borda esquerda da tela, pelo tamanho da fonte ou pelo estilo da fonte.

  • Ao navegar por deslocamento horizontal, você pode encontrar facilmente parágrafos alinhados verticalmente na página. Em particular, você pode pressionar NVDA+Alt+SetaParaBaixo ou SetaParaCima para pular para o parágrafo seguinte ou anterior que possui o mesmo deslocamento. Por exemplo, isso pode ser útil ao navegar por árvores hierárquicas de comentários (ex.: no reddit.com) para alternar entre os comentários de primeiro nível e pular todos os comentários de nível superior.
  • Ao navegar por tamanho da fonte, você pode encontrar facilmente parágrafos escritos no mesmo tamanho de fonte ou em um tamanho menor/maior.
  • Você também pode navegar pelo tamanho da fonte com a restrição do mesmo estilo de fonte.

O rotor do BrowserNav é usado para alternar entre essas opções. Dependendo da configuração desse rotor, o BrowserNav indicará com bipes o deslocamento horizontal ou o tamanho da fonte do item selecionado no momento. Além disso, o BrowserNav emitirá um sinal sonoro nos comandos do QuickNav para indicar a quantidade de texto que foi pulada (esse recurso só está disponível no Google Chrome e no Firefox).

O BrowserNav funciona em qualquer navegador compatível com o NVDA. Embora alguns recursos possam não estar disponíveis em todos os navegadores. O BrowserNav também funciona em outros aplicativos compatíveis com o modo de navegação NVDA, como documentos do Word e clientes de e-mail.

Teclas:

  • NVDA+Alt+SetaParaCima ou SetaParaBaixo: Pula para o parágrafo anterior ou seguinte com o mesmo deslocamento horizontal ou tamanho da fonte.
  • NVDA+Alt+Home ou NVDA+alt+Seta para a esquerda: Ir para o parágrafo anterior com deslocamento menor ou tamanho de fonte maior (parágrafo pai).
  • NVDA+Alt+End ou NVDA+Controle+alt+Seta para a esquerda: Ir para o próximo parágrafo com deslocamento menor ou tamanho de fonte maior (próximo parágrafo pai).NVDA+alt+SetaParaEsquerda: Pula para o parágrafo anterior com menor deslocamento ou maior tamanho da fonte.
  • NVDA+Alt+PageDown ou NVDA+Alt+Seta para a direita: Ir para o próximo parágrafo com maior deslocamento ou menor tamanho de fonte (parágrafo filho).
  • NVDA+Alt+PageUp ou NVDA+Controle+Alt+Seta para a direita: Ir para o parágrafo anterior com maior deslocamento ou menor tamanho de fonte (parágrafo filho anterior).
  • NVDA+O: Alterna a configuração do rotor entre deslocamento horizontal, tamanho da fonte, tamanho da fonte com estilo da fonte.
  • \\ ou Shift+\ (barra invertida): Rolar para cima ou para baixo para revelar cada elemento da página; pode ser útil em páginas da Web dinâmicas para carregar todos os elementos; também pode ser útil em páginas da Web de rolagem infinita para carregar a próxima parte.
  • NVDA+Shift+Seta para a esquerda: Voltar para o local anterior do cursor no documento atual.
  • NVDA+E: editar caixas de edição semiacessíveis - consulte a seção correspondente abaixo.
  • T ou Shift+T: pula para a tabela seguinte ou anterior, mas coloca o cursor na primeira célula. Às vezes, o NVDA coloca o cursor logo antes da primeira célula e o BrowserNav corrige esse comportamento.

Marcadores do QuickJump bookmarks

O BrowserNav QuickJump bookmarks é uma ferramenta avançada que permite navegar pelas páginas da Web e automatizar algumas ações repetitivas.

Pressionamento de teclas nos favoritos

  • NVDA+J: mostra o menu pop-up do quickJump.
  • J ou Shift+J: Ir para o próximo marcador ou para o marcador anterior do QuickJump.
  • / e Control+/: Alternar o modo SkipClutter para navegar por linha (setas para cima e para baixo) e por parágrafo (setas Control+Up e Control+Down), respectivamente.
  • Alt+J: clica em todos os marcadores do QuickClick na página atual.
  • Control+J: Fala todos os marcadores do QuickSpeak na página atual.
  • Alt+1, Alt+2, ..., Alt+0: pula para o próximo marcador hierárquico do nível correspondente. 0 corresponde ao nível 10; como alternativa, chama o script numérico, se definido.
  • Shift+Alt+1, Shift+Alt+2, ..., Shift+Alt+0: pula para o marcador hierárquico anterior.
  • Alt+ou Shift+Alt+: salta para o marcador hierárquico seguinte ou anterior de qualquer nível.

Você também pode configurar pressionamentos de tecla personalizados para a maioria dos tipos de marcadores (exceto para os marcadores SkipClutter, Hierarchical e Numeric Script).

Sites

A primeira coisa que você precisa configurar é o site em que deseja criar marcadores. Na maioria dos casos, você deve especificar o tipo de correspondência como correspondência de domínio ou correspondência de domínio e seus subdomínios. Para ilustrar a última opção, você pode especificar:

  • URL: amazon.com
  • Tipo de correspondência: Corresponder domínio e seus subdomínios
  • Isso corresponderá a amazon.com, smile.amazon.com e todos os outros domínios *.amazon.com.

Se precisar de um controle mais refinado, também é possível especificar o URL exato ou definir uma expressão regular para o URL.

Devido a essa definição flexível, em cada página da Web, vários sites do QuickJump podem estar ativos ao mesmo tempo.

Tipos de marcadores

Depois de configurar a definição do site, você pode prosseguir com a definição de alguns marcadores nele.

O BrowserNav suporta vários tipos de marcadores:

  • Marcadores QuickJump: você pode ir até eles pressionando J ou Shift+J.
  • Marcadores SkipClutter: Esses marcadores são ignorados automaticamente ao navegar por linha (seta para cima/para baixo) ou por parágrafo (setas Control+Seta para cima/para baixo). Isso permite ocultar a desordem nas páginas da Web, como linhas vazias, carimbos de data/hora e qualquer outra informação redundante. As informações não são removidas completamente, o SkipClutter pode ser temporariamente desativado por meio dos comandos / ou Control+/. Por padrão, o SkipClutter ignora parágrafos vazios em todos os sites.
  • Marcadores QuickClick: você pode marcar elementos clicáveis, como links, botões ou caixas de seleção, para serem marcadores QuickClick. Em seguida, ao pressionar Alt+J, você pode pressionar rapidamente todos os marcadores do QuickClick na página atual com um único toque de tecla, sem mover o cursor. Isso pode ser útil para pressionar um botão usado com frequência em um site, como o botão Reproduzir no YouTube ou o botão Mudo em sites de videoconferência.
  • Marcadores QuickSpeak: você pode ler esse tipo de marcador pressionando as teclas Control+J; o Curosr não se moverá. Isso é útil para verificar elementos da página alterados com frequência. Você também pode configurar o marcador QuickClick para ser atualizado automaticamente, ou seja, o BrowserNav examinará a página periodicamente e falará automaticamente se o texto correspondente for alterado.
  • Marcadores hierárquicos: é semelhante aos marcadores quickJump, mas leva em conta o deslocamento horizontal de um marcador. Sites como o Reddit e o Hacker News têm uma árvore hierárquica de comentários, o que era um grande desafio para os usuários de leitores de tela navegarem com eficiência. Nesses sites, você pode marcar os comentários como marcadores hierárquicos e navegar entre eles pressionando Alt+digit ou Shift+Alt+ditgit, em que digit representa a linha numérica 1,2,3,...0 - que é o nível do comentário. Por padrão, o BrowserNav tem marcadores hierárquicos configurados para o Hacker News e o reddit.com.
  • Marcadores de script: Executa apenas o script fornecido quando chamado.
  • Script numérico: pressione Alt+0 a Alt+9 para executar um script usando um número como entrada. Pode ser útil, por exemplo, para saltar para o i-ésimo marcador na página em um único pressionamento de tecla.

Criação de um novo marcador

Depois de configurar um site, a maneira mais fácil de criar um novo marcador seria navegar até o parágrafo desejado no documento, pressionar NVDA+J para exibir o menu de contexto dos marcadores e selecionar Marcadores > Criar novo marcador para o site ...

A caixa de diálogo de configuração do marcador será aberta. Agora você pode personalizar o marcador. Pode alterar a forma como o texto é correspondido (por exemplo, correspondência de cadeia ou expressão regular).

Outras opções nessa caixa de diálogo:

  • Categoria: define o tipo de marcador.
  • Nome de exibição: nome opcional desse marcador para facilitar a leitura. Isso apenas dá um nome melhor para que você possa identificar esse marcador em uma longa lista de marcadores.
  • Mensagem falada quando o marcador é encontrado: mensagem opcional a ser falada toda vez que você encontrar esse marcador no documento.
  • Deslocamento em parágrafos: depois de encontrar o texto correspondente, o BrowserNav deslocará o cursor por essa quantidade de parágrafos para frente ou para trás. Isso pode ser útil, por exemplo, se o texto de destino para o qual você deseja saltar não contiver nenhum texto comum que possa ser correspondido (por exemplo, postagem no fórum), mas um parágrafo anterior contiver uma palavra que possa ser correspondida (por exemplo, upvote). Nesse caso, você pode fazer a correspondência com a palavra upvote e especificar offset=1, para colocar o cursor no primeiro parágrafo da postagem em vez da palavra upvote.
  • Atributos: lista, separada por espaços, de atributos de parágrafo que são comparados. A lista de atributos disponíveis para o parágrafo atual está disponível no próximo campo do formulário. A lista de atributos é pré-preenchida com algumas funções comuns e, normalmente, você não precisa editá-la.
  • Atributos disponíveis no parágrafo atual: esses são todos os atributos encontrados no parágrafo atual. Você pode selecionar e pressionar Espaço para adicioná-los à lista de atributos correspondentes.

Opções avançadas do site

Na caixa de diálogo de configuração do site, você pode especificar várias opções avançadas:

  • Nome de exibição: nome de exibição opcional para melhor legibilidade na lista de sites.
  • Modo de foco: permite substituir o tratamento padrão dos eventos de foco no NVDA. Alguns sites fazem mau uso dos eventos de foco. Para usá-los de forma mais conveniente, você pode ignorar os eventos de foco ou, alternativamente, desativar a entrada automática do modo de foco quando um evento de foco é recebido.
  • Modo de região ativa: Alguns sites usam indevidamente as regiões ao vivo. Essa opção permite desativar os anúncios de região ativa somente para o site atual.
  • Modo de bipe de depuração: é útil principalmente para fins de depuração. Você pode fazer o NVDA emitir um bipe quando ocorrer determinado evento (foco, atualização de região ativa ou QuickClick bem-sucedido).

Scripting

A partir do BrowserNav v2.5, você pode personalizar seus marcadores com scripts Python. Os scripts podem ser usados para duas finalidades:

  1. Para aprimorar o algoritmo de correspondência quando as opções de correspondência existentes não forem suficientes. Isso se aplica aos marcadores QuickJump, QuickSpeak, QuickClick, hierárquico e SkipClutter.
  2. Executar código Python arbitrário para automatizar determinadas ações nas páginas da Web. Isso pode ser feito por meio de marcadores de Script ou Script numérico.

API de scripts

Em seu script, são fornecidas as seguintes variáveis:

  • p - parágrafo atual. Essa é uma instância da classe Paragraph definida em paragraph.py
  • t - objeto textInfo atual.

Recomenda-se trabalhar com parágrafos, pois eles fornecem uma interface de nível mais alto do que textInfos.

Seu script deve decidir se o parágrafo atual corresponde ou não à sua regra personalizada. Você pode:

  • Retorna True se corresponder, caso contrário, False.
  • Retorna None ou nenhuma instrução return para indicar que não há correspondência.
  • Retorna um número inteiro i para indicar que o i-ésimo parágrafo seguinte ou o i-ésimo parágrafo anterior corresponde e deve ser falado em vez do parágrafo atual.
  • Retorna a tupla (i: int, s:str) para indicar a correspondência com o deslocamento (consulte o ponto anterior) e fazer com que o BrowserNav fale a mensagem s.
  • Chame a função match() para indicar uma correspondência. Essa função gera internamente uma exceção, de modo que a execução de seu script será encerrada após a chamada da função match. A função é definida como:

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

Você também tem permissão para importar quaisquer módulos e escrever scripts de uso geral.

Você pode usar a instrução print() para depurar o script: a saída será impressa no registro do NVDA.

Exemplos de scripts

  1. Esse script verifica se o parágrafo atual é um link e se o texto do nível 5 do cabeçalho anterior começa com o texto do parágrafo atual:

     tente:
         if controlTypes.Role.LINK in p.roles and p.previousHeading5.textInfo.text.startswith(p.text):
             print(f “pp5 {p.previousHeading5.textInfo.text}”)
             return True
     exceto NotFoundError:
         return None
    
  2. Esse script não realiza uma correspondência, mas ativa a última caixa de edição na página:

     p.end.previous.previousEdit.activate()
    
  3. Esse script localiza o nome de usuário, que pode estar um ou dois parágrafos adiante; em seguida, localiza o início do comentário analisando o tamanho da fonte; depois, localiza o final do comentário procurando o texto “Responder”. Em seguida, ele corresponde a todo o corpo do comentário e adiciona o nome de usuário a ser falado antes do texto correspondente:

     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. Esse script é um gerador, o que significa que tudo o que ele produzir será usado como tempo de espera antes que a próxima linha seja executada. Esse script será executado em um thread em segundo plano de maneira não bloqueante.

    Esse script executa uma série de ações:

    • Localiza um botão com um determinado nome e o pressiona.
    • Abre a caixa de diálogo que aparece: p.home.nextEmbeddedObject.activate()
    • Obtém o novo elemento focalizado nessa caixa de diálogo: d = getFocusParagraph()
    • Localiza e marca a caixa de seleção nessa caixa de diálogo.
    • Localiza outro botão nessa janela de diálogo pelo nome e o pressiona.

    Essas etapas são repetidas 20 vezes por meio da função retry. Depois de 500 ms de pausa, ele encontra o botão “Run Query” e o pressiona.

     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)
     rendimento 500
     yield from retry(lambda: p.home.find(“Run Query”).activate(), count=10)
    
  5. Esse é um script numérico, pois usa level como variável de entrada. Ele localiza a nível-ésima caixa de edição do início da página (ou do final, se o nível for negativo) e invoca o script_editJupyter nela.

     se nível > 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)
    

Configuração

As definições dos marcadores são armazenadas no diretório de configuração do NVDA no arquivo browserNavRules.json. Você pode editar esse arquivo manualmente ou compartilhá-lo com alguém.

O diretório de configuração do NVDA pode ser encontrado abrindo o menu Iniciar e digitando: Explore o diretório de configuração do usuário do NVDA.

O BrowserNav vem com um arquivo de configuração padrão com exemplos de marcadores.

Edição de caixas de edição semiacessíveis

Muitos aplicativos modernos da Web, especialmente o Jupyter, entre outros, usam caixas de edição que não são tão acessíveis, por exemplo, elas aparecem em branco, mas é possível copiar texto dentro e fora delas usando as teclas Control+A, Control+C e Control+V.

O BrowserNav oferece um recurso experimental para editar essas caixas de edição de forma mais conveniente. Para usá-lo:

  1. Localize a caixa de edição na janela do navegador.
  2. Pressione NVDA+E.
  3. Uma nova janela será exibida com o conteúdo dessa caixa de edição.
  4. Edite o conteúdo dessa caixa de edição nessa janela.
  5. Quando terminar, pressione Escape para fechar a janela de edição acessível e atualizar a caixa de edição na página da Web.
  6. Como alternativa, você pode pressionar Control+Enter, Shift+Enter ou Alt+Enter. Isso fechará a janela de edição, atualizará a caixa de edição e passará o gesto para o aplicativo da Web.
  7. Para fechar a janela de edição sem salvar as alterações, pressione Alt+F4.
  8. A qualquer momento, se o conteúdo do texto editado anteriormente for perdido, pressione NVDA+Control+E para copiá-lo para a área de transferência.

Notas:

  • Não altere o estado do navegador, por exemplo, não altere as guias e não focalize outros elementos dentro da guia enquanto a janela de edição de texto estiver aberta. Isso impedirá que o BrowserNav atualize corretamente o texto na caixa de edição.
  • Certifique-se de soltar os modificadores Control, Shift ou Alt rapidamente após pressionar Control+Enter, Shift+Enter ou Alt+Enter. Mantê-los pressionados por mais de um segundo causará problemas.
  • Certifique-se de soltar os modificadores Control, Shift ou Alt rapidamente após pressionar Control+Enter, Shift+Enter ou Alt+Enter. Mantê-los pressionados por mais de um segundo causará problemas.
  • Ele foi testado exaustivamente com o Google Chrome e o Firefox. Ele pode funcionar em outros navegadores, mas há uma chance maior de problemas, como perda de informações.

Código fonte

O código fonte está disponível em https://github.com/mltony/nvda-browser-nav.