BrowserNav

Este complemento proporciona a los usuarios de NVDA potentes órdenes de navegación en el modo exploración. Funciona en navegadores web, así como en cualquier otra aplicación que soporte el modo exploración de NVDA, tales como documentos de Word y clientes de correo electrónico.

Descarga

Instala mediante la tienda de complementos.

Uso en navegadores y otros programas que soportan el modo exploración

Ten en cuenta que, a partir de NVDA 2024.2, las órdenes de navegación vertical y navegación por el mismo estilo están disponibles en el núcleo de NVDA. Es preferible usar las órdenes incorporadas. No llevan ningún gesto asignado, por lo que deben asignarse desde el diálogo Gestos de entrada.

BrowserNav puede utilizarse para navegar por desplazamiento horizontal desde el borde izquierdo de la pantalla, por tamaño o por estilo de la fuente.

  • Al navegar por desplazamiento horizontal, puedes encontrar fácilmente párrafos alineados verticalmente en la página. Concretamente, puedes pulsar NVDA+alt+flechas arriba y abajo para saltar al párrafo anterior o siguiente con la misma alineación, respectivamente. Por ejemplo, esto puede ser útil al explorar árboles jerárquicos de comentarios (como los de reddit.com) para saltar por los comentarios de primer nivel y evitar aquellos con niveles más altos.
  • Al navegar por tamaño de fuente, puedes encontrar fácilmente párrafos escritos con el mismo tamaño de fuente, un tamaño mayor o menor.
  • También puedes navegar por tamaño de fuente aplicando restricción de estilo.

El rotor de BrowserNav se usa para alternar entre estas opciones. Dependiendo del ajuste de este rotor, BrowserNav indicará mediante pitidos el desplazamiento horizontal o el tamaño de fuente del elemento seleccionado. Además, BrowserNav crepitará con las órdenes de navegación rápida para indicar cuánto texto se ha saltado (esta función sólo está disponible en Google Chrome y Firefox).

BrowserNav funciona en cualquier navegador soportado por NVDA, aunque algunas funciones pueden no estar disponibles en todos los navegadores. BrowserNav también funciona en otras aplicaciones que soportan el modo exploración de NVDA, como documentos de Word y clientes de correo electrónico.

Atajos de teclado:

  • NVDA+alt+flechas arriba y abajo: salta al párrafo anterior o siguiente con el mismo desplazamiento horizontal o tamaño de fuente.
  • NVDA+alt+inicio o NVDA+alt+flecha izquierda: salta al párrafo anterior con menos desplazamiento o mayor tamaño de fuente (párrafo padre).
  • NVDA+alt+fin o NVDA+control+alt+flecha izquierda: salta al siguiente párrafo con menos desplazamiento o mayor tamaño de fuente (párrafo padre siguiente).
  • NVDA+alt+avance página o NVDA+alt+flecha derecha: salta al siguiente párrafo con más desplazamiento o menor tamaño de fuente (párrafo hijo).
  • NVDA+alt+retroceso página o NVDA+control+alt+flecha derecha: salta al párrafo anterior con más desplazamiento o menor tamaño de fuente (párrafo hijo anterior).
  • NVDA+o: cambia el rotor entre desplazamiento horizontal, tamaño de fuente o tamaño de fuente con restricción de estilo.
  • \ o Shift+\ (barra invertida): desplazarse arriba o abajo para revelar cualquier elemento de la página, puede ser útil en páginas web dinámicas para cargar todos los elementos. También puede ser útil en páginas web con desplazamiento infinito para cargar el siguiente fragmento.
  • NVDA+shift+flecha izquierda: volver a la posición anterior del cursor dentro del documento actual.
  • NVDA+e: edita algunos cuadros de edición semiaccesibles. Consulta la sección correspondiente más adelante.
  • T o shift+t: saltar a la tabla siguiente o anterior, pero situando el cursor en la primera celda. A veces NVDA pone el cursor antes de la primera celda y BrowserNav corrige este comportamiento.

Marcadores de salto rápido

Los marcadores de salto rápido de BrowserNav son una potente herramienta que permite navegar por páginas web y automatizar algunas acciones repetitivas.

Atajos de marcadores

  • NVDA+j: mostrar el menú emergente de salto rápido.
  • J o shift+j: salta al próximo marcador de salto rápido o al anterior.
  • / y control+/: alterna el modo omitir desorden para navegar por líneas (flechas arriba y abajo) y por párrafos (control+flechas arriba y abajo) respectivamente.
  • Alt+j: hace clic en todos los marcadores de clic rápido en la página actual.
  • Control+j: verbaliza todos los marcadores rápidos de verbalización en la página actual.
  • Alt+1, Alt+2, ..., Alt+0: saltar al siguiente marcador jerárquico del nivel correspondiente. El 0 corresponde al nivel 10. Alternativamente, se llama al script numérico si está definido.
  • Shift+Alt+1, shift+Alt+2, ..., Alt+0: saltar al marcador jerárquico anterior del nivel correspondiente.
  • Alt+o Shift+Alt+: salta al marcador jerárquico siguiente o anterior de cualquier nivel.

También puedes configurar atajos de teclado personalizados para la mayoría de tipos de marcadores (excepto para marcadores para evitar desorden, jerárquicos y de script numérico).

Sitios

Lo primero que se debería configurar es el sitio para el que se desean crear los marcadores. En la mayoría de casos puedes querer indicar el tipo de coincidencia para que sea del dominio, o del dominio y sus subdominios. Para ilustrar la segunda opción, puedes indicar:

  • URL: amazon.com
  • Tipo de coincidencia: dominio y subdominios
  • Esto hará que coincidan amazon.com, smile.amazon.com, y todos los demás dominios *.amazon.com.

Si necesitas un control más preciso, puedes indicar también la URL exacta o definir una expresión regular para la URL.

A causa de esta definición flexible, pueden estar activos al mismo tiempo varios sitios de salto rápido en una misma página web.

Tipos de marcadores

Una vez que hayas configurado la definición del sitio, puedes proceder a definir algunos marcadores para él.

BrowserNav soporta varios tipos de marcadores:

  • Marcadores de salto rápido: puedes saltar a ellos pulsando j o shift+j.
  • Marcadores de saltar desorden: estos marcadores se evitan automáticamente al navegar por líneas (flechas arriba y abajo) o por párrafos (control+flechas arriba o abajo). Esto permite ocultar el desorden en páginas web, tal como líneas en blanco, marcas de tiempo u otra información redundante. La información no se elimina completamente, se puede deshabilitar temporalmente el salto de desorden con las órdenes / y control+/. Por defecto, evitar desorden se salta los párrafos vacíos en todos los sitios web.
  • Marcadores de clic rápido: se pueden marcar elementos clicables, como enlaces, botones o casillas de verificación, para que sean marcadores de clic rápido. Al pulsar alt+j, se pueden pulsar todos los marcadores de clic rápido de la página actual con un solo atajo sin mover el cursor. Esto puede ser útil para pulsar un botón usado con frecuencia en un sitio web, como el botón de reproducción en YouTube o el botón Silenciar en sitios web de videoconferencias.
  • Marcadores de verbalización rápida: se puede leer este tipo de marcadores pulsando el atajo de teclado Control+J; el cursor no se moverá. Esto viene bien para comprobar elementos que cambian con frecuencia en la página. También se puede configurar un marcador de clic rápido para que se refresque automáticamente, lo que hará que BrowserNav analice la página periódicamente y lo verbalice automáticamente si el texto coincidente cambia.
  • Marcadores jerárquicos: son similares a los marcadores de salto rápido, pero tienen en cuenta el desplazamiento horizontal del marcador. Sitios como Reddit y Hacker News tienen un árbol jerárquico de comentarios, bastante difícil de recorrer eficientemente para usuarios de lectores de pantalla. En estos sitios web puedes marcar comentarios como marcadores jerárquicos y navegar entre ellos pulsando alt+dígito o alt+shift+dígito, donde dígito es un número de la fila numérica: 1, 2, 3... 0 - que sería el nivel del comentario. Por defecto, BrowserNav tiene marcadores configurados para Hacker News y reddit.com.
  • Marcadores de script: ejecutan el script proporcionado al invocarlos.
  • Script numérico: pulsa de alt+0 a alt+9 para ejecutar un script que toma un número como su entrada. Puede ser útil por ejemplo para saltar al I-ésimo marcador de la página con un único atajo de teclado.

Creación de un nuevo marcador

Una vez hayas configurado un sitio, la forma más sencilla de crear un nuevo marcador sería navegar al párrafo deseado en el documento, pulsar NVDA+j para mostrar el menú de contexto de marcadores y seleccionar Marcadores > Crear nuevo marcador para el sitio...

Se abrirá el diálogo de configuración del marcador. Ahora puedes personalizar el marcador. Puedes cambiar cómo coincide el texto (por ejemplo, coincidencia de cadena o expresión regular).

Otras opciones de este diálogo:

  • Categoría: define el tipo de marcador.
  • Nombre para mostrar: nombre opcional de este marcador para una legibilidad mejor. Simplemente da un nombre mejor para poder identificarlo en una larga lista de marcadores.
  • Mensaje hablado cuando se encuentre el marcador: mensaje opcional que se verbalizará cada vez que alcances este marcador en el documento.
  • Desplazamiento en párrafos: después de hallar una coincidencia de texto, BrowserNav desplazará el cursor tantos párrafos adelante o atrás como sea necesario. Esto puede ser útil, por ejemplo, si el texto de destino al que deseas saltar no contiene ningún texto común que pueda coincidir (p.ej. un mensaje en un foro) pero un párrafo anterior contiene una palabra coincidente (por ejemplo, votar). En este caso, puedes hacer que coincida la palabra votar y especificar desplazamiento=1, para situar el cursor en el primer párrafo del mensaje en lugar de la palabra votar.
  • Atributos: lista separada por espacios de atributos del párrafo que coinciden. La lista de atributos disponibles para el párrafo actual está disponible en el siguiente campo del formulario. La lista de atributos se rellena previamente con algunos roles comunes y normalmente no es necesario editarla.
  • Atributos disponibles en el párrafo actual: todos los atributos que se encuentran en el párrafo actual. Puedes seleccionarlos y pulsar la barra espaciadora para añadirlos a la lista de atributos coincidentes.

Opciones de sitio avanzadas

En el diálogo de configuración del sitio puedes especificar diversas opciones avanzadas:

  • Nombre para mostrar: nombre para mostrar opcional que mejore la legibilidad en la lista de sitios.
  • Modo foco: permite anular el manejo por defecto de los eventos de foco en NVDA. Ciertos sitios hacen mal uso de los eventos de foco. Para usarlos de forma más conveniente, puedes ignorarlos, o desactivar entrar automáticamente en modo foco cuando se recibe un evento de foco.
  • Modo de región viva: algunos sitios web usan mal las regiones vivas. Esta opción permite desactivar el anuncio de regiones vivas sólo en el sitio web actual.
  • Modo de pitidos de depuración: este modo se usa principalmente con propósitos de depuración. Se puede hacer que NVDA pite cuando ocurran ciertos eventos (foco, actualización de región viva o clic automático exitoso).

Scripting

A partir de BrowserNav 2.5, se pueden personalizar los marcadores con scripts en Python. El scripting se puede usar con dos propósitos:

  1. Mejorar el algoritmo de coincidencia cuando las opciones de coincidencia existentes no son suficientes. Esto se aplica a los marcadores de tipo salto rápido, clic rápido, jerarquía y evitar desorden.
  2. Ejecutar código Python arbitrario para automatizar ciertas acciones en las páginas web. Esto se puede hacer con marcadores de script o script numérico.

API de scripting

El el script se proporcionan las siguientes variables:

  • p - párrafo actual. Se trata de una instancia de la clase Paragraph, definida en paragraph.py
  • t - objeto textInfo actual.

Se recomienda trabajar con párrafos, ya que proporcionan interfaces de un nivel superior a los textInfos.

Tu script debe decidir si el párrafo actual coincide con tu regla personalizada o no. Puedes:

  • Devolver True si coincide, False en caso contrario.
  • Devolver None o no incluir ninguna instrucción return para indicar que no hay coincidencia.
  • Devolver un número entero i para indicar que el párrafo i-ésimo siguiente o anterior coincide y debe verbalizarse en lugar del párrafo actual.
  • Devolver una tupla (i: int, s:str) para indicar coincidencia con desplazamiento (mira el punto anterior) y hacer que BrowserNav verbalice el mensaje s.
  • Llama a la función match() para indicar una coincidencia. Esta función lanza internamente una excepción, por lo que la ejecución del script finalizará al llamar a match. La función se define como:

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

Se permite también importar cualquier módulo y escribir scripts de propósito general.

Puedes usar la sentencia print() para depurar tu script: la salida se imprimirá en el registro de NVDA.

Scripts de ejemplo

  1. Este script comprueba que el párrafo actual es un enlace y que el texto del encabezado anterior de nivel 5 comienza con el texto del párrafo actual:

     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. Este script no realiza una coincidencia, sólo activa el último cuadro de edición de la página:

     p.end.previous.previousEdit.activate()
    
  3. Este script busca el nombre de usuario, que puede estar uno o dos párrafos por delante, busca el comienzo del comentario analizando el tamaño de fuente, busca el final del comentario localizando el texto "Reply", y entonces hace coincidir el cuerpo entero del comentario añadiendo el usuario para que se verbalice antes del texto coincidente:

     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. Este script es un generador, lo que significa que lo que ceda se usará como tiempo de espera antes de ejecutar la siguiente línea. Este script se ejecutará en un hilo en segundo plano de forma no bloqueante.

    Este script realiza una serie de acciones:

    • Busca un botón con un nombre dado y lo pulsa.
    • Entra en el diálogo que aparece: p.home.nextEmbeddedObject.activate()
    • Obtiene el nuevo elemento con el foco dentro del diálogo: d = getFocusParagraph()
    • Busca y marca una casilla de verificación del diálogo.
    • Busca otro botón en el diálogo, window by name, y lo pulsa.

    Estos pasos se repiten 20 veces mediante la función retry. Tras una pausa de 500 ms, busca el botón "Run query" y lo pulsa.

     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. Este es un script numérico, ya que toma level como variable de entrada. Busca el level-ésimo cuadro de edición desde el principio de la página (o desde el final si el nivel es negativo) y llama a script_editJupyter en él.

     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)
    

Configuración

Las definiciones de marcadores se almacenan en la carpeta de configuración de NVDA, en el archivo browserNavRules.json. Puedes editar este archivo manualmente o compartirlo con alguien.

Se puede encontrar la carpeta de configuración de NVDA abriendo el menú Inicio y escribiendo: Explorar directorio de configuración del usuario de NVDA.

El archivo de configuración predeterminado de BrowserNav incluye marcadores de ejemplo.

Editar cuadros de edición semiaccesibles

Muchas aplicaciones web modernas, como Jupiter entre otras, usan cuadros de edición que no son accesibles. Por ejemplo, se muestran en blanco, pero puedes copiar texto de ellos o pegarlo con los atajos control+e, control+c y control+v.

BrowserNav ofrece una función experimental para editar estos cuadros de edición de manera más conveniente. Para usarla:

  1. Busca el cuadro de edición en la ventana del navegador.
  2. Pulsa NVDA+e.
  3. Aparecerá una nueva ventana con los contenidos del cuadro de edición.
  4. Edita los contenidos del cuadro de edición en esta ventana.
  5. Cuando acabes, puedes pulsar escape para cerrar la ventana de edición accesible y actualizar el cuadro de edición en la página web.
  6. Alternativamente, puedes pulsar control+intro, shift+intro o alt+intro. Esto cerrará la ventana de edición, actualizará el cuadro de edición y pasará el gesto a la aplicación web.
  7. Para cerrar la ventana de edición sin guardar los cambios, pulsa alt+f4.
  8. En cualquier momento, si se pierden los contenidos del texto previamente editado, pulsa NVDA+control+e para copiarlo al portapapeles.

Notas:

  • No cambies el estado del navegador. P. ej. no cambies de pestaña y no lleves el foco a otros elementos dentro de la pestaña mientras la ventana de edición de texto está abierta. Al hacerlo evitas que BrowserNav actualice el texto correctamente en el cuadro de edición.
  • Asegúrate de soltar los modificadores control, shift o alt rápidamente tras pulsar control+intro, shift+intro o alt+intro. Mantenerlos durante aproximadamente un segundo causará problemas.
  • Esta función es experimental en la actualidad. Espera una tasa de éxito del 90-95%.
  • Se ha probado exhaustivamente con Google Chrome y Firefox. Podría funcionar en otros navegadores, pero hay una mayor posibilidad de problemas, como la pérdida de información.

Código fuente

El código fuente está disponible en http://github.com/mltony/nvda-indent-nav.