BrowserNav

Este complemento fornece aos utilizadores NVDA poderosos comandos de navegação no modo de browser. Funciona em navegadores Web, bem como em quaisquer outras aplicações que suportem o modo de navegação NVDA, tais como documentos Word e clientes de correio eletrónico.

Descarregar

Instalar através da loja de complementos.

Utilização em browsers e outros programas que suportam o modo de navegação

Tenha em atenção que, a partir do NVDA v2024.2, a navegação vertical e os comandos de navegação do mesmo estilo estão agora disponíveis no núcleo do NVDA. É preferível utilizar os comandos incorporados. Não lhes é atribuído qualquer gesto predefinido, pelo que os gestos têm de ser atribuídos pelo utilizador na caixa de diálogo Gestos de entrada.

O BrowserNav pode ser utilizado para navegar por deslocamento horizontal a partir da borda esquerda do ecrã, pelo tamanho da fonte, ou pelo estilo da fonte.

  • Ao navegar por deslocamento horizontal, pode facilmente encontrar parágrafos que estejam alinhados verticalmente na página. Em particular, pode premir NVDA+Alt+seta para baixo ou seta para cima, para saltar para o parágrafo seguinte ou anterior que tenha o mesmo deslocamento. Por exemplo, isto pode ser útil ao navegar em árvores hierárquicas de comentários (por exemplo, em reddit.com) para saltar entre comentários de primeiro nível e saltar todos os comentários de nível superior.
  • Ao navegar pelo tamanho da fonte, pode facilmente encontrar parágrafos escritos no mesmo tamanho de fonte, ou tamanho de fonte mais pequeno/maior.
  • Também se pode navegar pelo tamanho da fonte com a restrição ao mesmo estilo de fonte.

O rotor do BrowserNav é utilizado para alternar entre estas opções. Dependendo da definição deste rotor, o BrowserNav indica com sinais sonoros o deslocamento horizontal ou o tamanho do tipo de letra do item atualmente selecionado. Além disso, o BrowserNav emitirá um sinal sonoro nos comandos QuickNav para indicar a quantidade de texto que foi saltada (esta funcionalidade só está disponível no Google Chrome e no Firefox).

O BrowserNav funciona em qualquer navegador suportado pelo NVDA. Embora algumas funcionalidades possam não estar disponíveis em todos os browsers. O BrowserNav também funciona noutras aplicações que suportam o modo de navegação NVDA, tais como documentos Word e clientes de correio eletrónico.

teclas de atalho:

  • NVDA+Alt+seta para cima ou seta para baixo: Saltar para o parágrafo anterior ou seguinte com o mesmo deslocamento horizontal ou tamanho de letra.
  • NVDA+alt+seta para a esquerda: Saltar para o parágrafo anterior com menor deslocamento ou maior tamanho de letra.
  • NVDA+alt+seta para a esquerda: Saltar para o parágrafo anterior com menor deslocamento ou maior tamanho de letra.
  • NVDA+Alt+seta para direita: Saltar para o parágrafo seguinte com maior deslocamento ou tamanho de letra mais pequeno.
  • NVDA+Alt+seta para direita: Saltar para o parágrafo seguinte com maior deslocamento ou tamanho de letra mais pequeno.
  • NVDA+O: Alternar a configuração do rotor entre deslocamento horizontal, tamanho da fonte, tamanho da fonte com estilo de fonte.
  • \\ ou Shift+\ (barra invertida): Desloca-se para cima ou para baixo para revelar cada elemento da página; pode ser útil em páginas Web dinâmicas para carregar todos os elementos; também pode ser útil em páginas Web de deslocamento infinito para carregar o próximo pedaço.
  • NVDA+Shift+Seta para a esquerda: Voltar à localização anterior do cursor no documento atual.
  • NVDA+E: editar caixas de edição semi-acessíveis - ver secção correspondente abaixo.
  • T ou Shift+T: salta para a tabela seguinte ou anterior, mas coloca o cursor na primeira célula. Por vezes, o NVDA coloca o cursor imediatamente antes da primeira célula e o BrowserNav corrige este comportamento.

Marcadores do QuickJump

O BrowserNav QuickJump bookmarks é uma ferramenta poderosa que permite navegar pelas páginas Web e automatizar algumas acções repetitivas.

teclas de atalho:

  • NVDA+J: Mostra o menu pop-up quickJump.
  • Y ou Shift+Y: Saltar para o separador seguinte ou anterior.
  • / 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), respetivamente.
  • 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: salta para o marcador hierárquico seguinte do nível correspondente. 0 corresponde ao nível 10; em alternativa, chama o script numérico, se definido.
  • Shift+Alt+1, Shift+Alt+2, ..., Shift+Alt+0: saltar para o marcador hierárquico anterior.
  • P ou Shift+P: Saltar para o parágrafo seguinte ou anterior.

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

Sites

A primeira coisa que precisa de configurar é o sítio onde pretende criar marcadores. Na maioria dos casos, 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, pode especificar:

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

Se precisar de um controlo mais rigoroso, também pode especificar o URL exato ou definir uma expressão regular para o URL.

Devido a esta definição flexível, em cada página web podem estar activos vários sítios QuickJump ao mesmo tempo.

Tipos de marcadores

Uma vez configurada a definição do sítio, pode prosseguir com a definição de alguns marcadores no mesmo.

O BrowserNav suporta vários tipos de marcadores:

  • Marcadores QuickJump: pode saltar para eles premindo J ou Shift+J.
  • Marcadores SkipClutter: Estes marcadores são saltados automaticamente quando se navega por linha (seta para cima/para baixo) ou por parágrafo (Control+setas para cima/para baixo). Isto permite ocultar a desordem nas páginas Web, como linhas vazias, carimbos de data/hora e qualquer outra informação redundante. A informação não é completamente removida, o SkipClutter pode ser temporariamente desativado através dos comandos / ou Control+/. Por defeito, o SkipClutter ignora os parágrafos vazios em todos os sítios Web.
  • Marcadores QuickClick: pode marcar elementos clicáveis, como ligações, botões ou caixas de verificação, para serem marcadores QuickClick. Depois, premindo Alt+J, pode premir rapidamente todos os marcadores QuickClick na página atual com um único toque de tecla sem mover o cursor. Isto pode ser útil para premir um botão frequentemente utilizado num sítio Web, como o botão de reprodução no YouTube ou o botão Mudo em sítios Web de videoconferência.
  • Marcadores QuickSpeak: pode ler este tipo de marcadores premindo as teclas Control+J; o Curosr não se move. Isto é útil para verificar elementos frequentemente alterados da página. Também pode definir os marcadores QuickClick para serem actualizados automaticamente, ou seja, o BrowserNav irá analisar a página periodicamente e falar automaticamente se o texto correspondente mudar.
  • Marcadores hierárquicos: é semelhante aos marcadores quickJump, mas tem 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, que era bastante difícil de navegar eficazmente para os utilizadores de leitores de ecrã. Nestes sítios Web, é possível marcar os comentários como marcadores hierárquicos e depois navegar entre eles premindo Alt+dígito ou Shift+Alt+ditgit, em que dígito representa a linha numérica 1,2,3,...0 - que é o nível do comentário. Por defeito, o BrowserNav tem marcadores hierárquicos configurados para Hacker News e reddit.com.
  • Marcadores de script: Executa apenas o script fornecido quando invocado.
  • Script numérico: prima Alt+0 a Alt+9 para executar um script tendo um número como entrada. Pode ser útil, por exemplo, para saltar para o i-ésimo marcador na página com um único toque de tecla.

Criar um novo marcador

Depois de configurar um sítio, a forma mais fácil de criar um novo marcador seria navegar para o parágrafo pretendido no documento, premir NVDA+J para mostrar o menu de contexto dos marcadores e selecionar Marcadores > Criar novo marcador para o sítio ...

Abre-se a caixa de diálogo de configuração do marcador. Agora é possível personalizar o marcador. Pode alterar a forma como o texto é correspondido (por exemplo, correspondência de cadeia ou expressão regular).

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

  • Categoria: define o tipo de marcador.
  • Nome de apresentação: nome opcional deste marcador para melhor legibilidade. Isto apenas dá um nome melhor para que possa identificar este marcador numa longa lista de marcadores.
  • Mensagem falada quando o marcador é encontrado: mensagem opcional a ser falada sempre que se chega a este marcador no documento.
  • Deslocação em parágrafos: depois de encontrar o texto correspondente, o BrowserNav desloca o cursor esta quantidade de parágrafos para a frente ou para trás. Isto pode ser útil, por exemplo, se o texto de destino para o qual pretende saltar não contiver qualquer texto comum que possa ser correspondido (por exemplo, mensagem do fórum), mas um parágrafo anterior contiver uma palavra correspondida (por exemplo, voto positivo). Neste caso, pode fazer corresponder a palavra upvote e especificar offset=1, para colocar o cursor no primeiro parágrafo da mensagem 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 campo seguinte do formulário. A lista de atributos é pré-preenchida com algumas funções comuns e, normalmente, não é necessário editá-la.
  • Atributos disponíveis no parágrafo atual: estes são todos os atributos encontrados no parágrafo atual. Pode selecionar e premir Espaço para os adicionar à lista de atributos correspondentes.

Opções avançadas do sítio

Na caixa de diálogo de configuração do sítio pode especificar uma série de opções avançadas:

  • Nome de apresentação: nome de apresentação opcional para uma melhor legibilidade na lista de sítios.
  • Modo de focagem: permite substituir o tratamento predefinido dos eventos de focagem no NVDA. Alguns sítios Web utilizam incorretamente os eventos de focagem. Para os utilizar de forma mais conveniente, pode ignorar os eventos de foco ou, em alternativa, desativar a entrada automática do modo de foco quando é recebido um evento de foco.
  • Modo de região em direto: Alguns sítios Web utilizam indevidamente as regiões em direto. Esta opção permite desativar os anúncios de regiões em direto apenas para o sítio Web atual.
  • Modo de sinal sonoro de depuração: este modo é principalmente bom para fins de depuração. Pode fazer com que o NVDA emita um sinal sonoro quando ocorre um determinado evento (foco, atualização da região em direto ou QuickClick bem sucedido).

Scripting

Starting from BrowserNav v2.5 you can customize your bookmarks with Python scripting. Scripting can be used for two purposes:

  1. To enhance matching algorithm where existing match options are not enough. This applies to QuickJump, QuickSpeak, QuickClick, hierarchical and SkipClutter bookmarks.
  2. To execute arbitrary Python code in order to automate certain actions on the web pages. This can be done via Script or Numeric Script bookmarks.

API de scripting

In your script you are provided the following variables:

  • p - current paragraph. This is an instance of Paragraph class defined in paragraph.py
  • t - current textInfo object.

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

O seu script deve decidir se o parágrafo atual corresponde ou não à sua regra personalizada. Pode fazê-lo:

  • Devolve True se corresponder, caso contrário False.
  • Devolve None ou nenhuma declaração return para indicar que não há correspondência.
  • Devolve 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.
  • Devolver a tupla (i: int, s:str) para indicar a correspondência com o offset (ver ponto anterior) e fazer com que o BrowserNav fale a mensagem s.
  • Call match() function to indicate a match. This function internally raises an Exception, so that execution of your script will be terminated after calling match. The function is defined as:

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

Também é permitido importar quaisquer módulos e escrever scripts para fins gerais.

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

Exemplos de guiões

  1. This script checks that current paragraph is a link and that the text of the previous heading level 5 starts with text of current paragraph:

     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. This script doesn't perform a match, but activates the last edit box on the page:

     p.end.previous.previousEdit.activate()
    
  3. This script finds username, which can be one or two paragraphs ahead; then it finds the beginning of the comment by analyzing font size; then it finds the end of the comment by searching for "Reply" text. Then it matches the entire body of the comment and adds username to be spoken prior to matched text:

     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. This script is a generator, which means whatever it yields will be used as sleep time before the next line is executed. This script will be executed in a background thread in a non-blocking manner.

    This script performs a series of actions:

    • Finds a button with a given name and presses it.
    • Enters dialog that pops up: p.home.nextEmbeddedObject.activate()
    • Obtains newly focused element within that dialog: d = getFocusParagraph()
    • Finds and checks checkbox in that dialog.
    • Finds another button in that dialog window by name and presses it.

    These steps are repeated 20 times via retry function. Then after 500 ms pause, it finds "Run Query" button and presses it.

     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. This is a numeric script since it takes level as input variable. This finds level-th edit box from the beginning of the page (or from the end if level is negative) and invokes script_editJupyter on it.

     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)
    

Configuração

As definições dos marcadores são armazenadas no diretório de configuração do NVDA no ficheiro browserNavRules.json. Pode editar este ficheiro manualmente ou partilhá-lo com alguém.

O diretório de configuração do NVDA pode ser encontrado abrindo o menu Iniciar e escrevendo: Explorar o diretório de configuração do utilizador NVDA.

O BrowserNav é fornecido com um ficheiro de configuração predefinido com exemplos de marcadores.

Editar caixas de edição semi-acessíveis

Muitas aplicações Web modernas, nomeadamente o Jupyter, entre outras, utilizam caixas de edição que não são muito acessíveis, por exemplo, aparecem em branco, mas pode copiar texto para dentro e para fora delas utilizando as teclas Control+A, Control+C e Control+V.

O BrowserNav oferece uma funcionalidade experimental para editar essas caixas de edição de uma forma mais cómoda. Para a utilizar:

  1. Localizar a caixa de edição na janela do browser.
  2. Prima NVDA+E.
  3. Aparecerá uma nova janela com o conteúdo dessa caixa de edição.
  4. Edite o conteúdo dessa caixa de edição nesta janela.
  5. Quando tiver terminado, pode premir Escape para fechar a janela de edição acessível e atualizar a caixa de edição na página Web.
  6. Em alternativa, pode premir Control+Enter, Shift+Enter ou Alt+Enter. Isto fechará a janela de edição, actualizará a caixa de edição e passará o gesto para a aplicação Web.
  7. Para fechar a janela de edição sem guardar as alterações, prima Alt+F4.
  8. Em qualquer altura, se o conteúdo do texto editado anteriormente se perder, prima NVDA+Control+E para o copiar para a área de transferência.

Notas:

  • Não altere o estado do browser, por exemplo, não mude de separador e não foque outros elementos dentro do separador enquanto a janela de edição de texto estiver aberta. Se o fizer, impedirá o BrowserNav de atualizar corretamente o texto na caixa de edição.
  • Certifique-se de que solta rapidamente os modificadores Control, Shift ou Alt depois de premir Control+Enter, Shift+Enter ou Alt+Enter. Mantê-los premidos durante mais de um segundo pode causar problemas.
  • Esta funcionalidade é atualmente experimental. Espera-se apenas uma taxa de sucesso de cerca de 90-95% s.
  • Foi testado exaustivamente com o Google Chrome e o Firefox. Pode funcionar noutros navegadores, mas há uma maior probabilidade de problemas, como a perda de informações.

Código fonte:

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