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

Please install via add-on store.

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

Please note, that starting with NVDA v2024.2, vertical navigation and same style navigation commands are now available in NVDA core. It is preferred to use builtin commands. They are not assigned any default gesture, so gestures must be assigned by the user in Input gestures dialog.

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.

QuickJump Bookmarks

BrowserNav QuickJump bookmarks is a powerful tool that allows to navigate around web pages and automate some repetitive actions.

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: click all QuickClick bookmarks on the current page.
  • Control+J: Speak all QuickSpeak bookmarks on the current page.
  • Alt+1, Alt+2, ..., Alt+0: jump to next hierarchical bookmark of corresponding level. 0 corresponds to level 10.; alternatively, call numerical script if defined.
  • 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.

You can also configure custom keystrokes for most bookmark types (except for SkipClutter, Hierarchical and Numeric Script bookmarks).

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 supports several types of bookmarks:

  • 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.
  • QuickClick bookmarks: you can mark clickable elements, such as links, buttons or checkboxes to be QuickClick bookmarks. Then by pressing Alt+J you can quickly press all QuickClick bookmarks on current page with a single keystroke without moving the cursor. This can come in handy to press a frequently used button on a website, such as play button on YouTube or Mute button on video-conferencing websites.
  • QuickSpeak bookmarks: you can read this type of bookmarks by pressing Control+J keystroke; Curosr won't move. This is handy to check frequently changed elements of the page. You can also set quickClick bookmark to be autorefreshable, that is BrowserNav will scan the page preiodically and would auto-speak if matched text changes.
  • Hierarchical bookmarks: this is similar to quickJump bookmarks, but this takes into account horizontal offset of a bookmark. Sites like Reddit and Hacker News have a hierarchical tree of comments, that was pretty challenging to efficiently navigate for screenreader users. On these websites you can mark comments as a hierarchical bookmark and then you can navigate between them By pressing Alt+digit or Shift+Alt+ditgit, where digit stands for number row 1,2,3,...0 - that is the level of the comment. By default BrowserNav has hierarchical bookmarks configured for Hacker News and reddit.com.
  • Script bookmarks: Just execute provided script when invoked.
  • Numeric script: press Alt+0 through Alt+9 to execute script taking a number as its input. Can be handy for example to jump to i-th bookmark on the page in a single keystroke.

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.
  • Debug beep mode: this is mostly good for debugging purposes. You can make NVDA beep when certain event (focus, live region update or successful QuickClick) happened.

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.

Scripting API

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.

It is recommended to work with paragraphs, since they provide higher level interface then textInfos.

Your script must decide whether current paragraph matches your custom rule or not. You can either:

  • Return True if it matches, otherwise False.
  • Return None or no return statement to indicate no match.
  • Return an integer number i to indicate that i-th following or i-th preceding paragraph matches and must be spoken instead of current paragraph.
  • Return tuple (i: int, s:str) to indicate match with offset (see previous point) and have BrowserNav speak message 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:

You are also allowed to import any modules and write general purpose scripts.

You can use print() statement to debug your script: the output will be printed to NVDA log.

Example scripts

  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)

    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.

Source code

Source code is available at http://github.com/mltony/nvda-indent-nav.