BrowserNav
Este complemento proporciona aos usuarios do NVDA potentes ordes de navegación no modo exploración. Funciona en navegadores web, así coma en calquera outra aplicación que soporte o modo exploración do NVDA, como documentos de Word e clientes de correo electrónico.
Descarga
Please install via add-on store.
Uso en navegadores e outros programas que soportan o 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 pode usarse para navegar por desprazamento horizontal dende a marxen esquerda da pantalla, por tamano ou por estilo da fonte.
- Ao navegar por desprazamento horizontal, podes atopar sinxelamente parágrafos aliñados verticalmente na páxina. Concretamente, podes pulsar NVDA+alt+frechas arriba e abaixo para saltar ao parágrafo anterior ou seguinte coa mesma aliñación, respectivamente. Por exemplo, esto pode ser útil ao explorar árbores xerárquicas de comentarios (como as de reddit.com) para saltar polos comentarios de primeiro nivel e evitar aqueles con niveis máis altos.
- Ao navegar por tamano de fonte, podes atopar sinxelamente parágrafos escrebidos co mesmo tamano de fonte, un tamano maior ou menor.
- Tamén podes navegar por tamaño de fonte aplicando restricción de estilo.
O rotor de BrowserNav úsase para alternar entre estas opcións. Dependendo do axuste deste rotor, BrowserNav indicará mediante pitidos o desprazamento horizontal ou o tamaño de fonte do elemento selecionado. Ademáis, BrowserNav crepitará coas ordes de navegación rápida para indicar cánto texto se saltou (esta función só está dispoñible en Google Chrome e Firefox).
BrowserNav funciona en calquera navegador soportado polo NVDA, aíndaque algunhas funcións poden non estar dispoñibles en todos os navegadores. BrowserNav tamén funciona noutras aplicacións que soportan o modo exploración de NVDA, como documentos de Word e clientes de correo electrónico.
Atallos de teclado:
- NVDA+alt+frchas arriba e abaixo: salta ao parágrafo anterior ou seguinte co mesmo desprazamento horizontal ou tamaño de fonte.
- NVDA+alt+inicio ou NVDA+alt+frecha esquerda: salta ao parágrafo anterior con menos desprazamento ou maior tamaño de fonte (parágrafo pai).
- NVDA+alt+fin ou NVDA+control+alt+frecha esquerda: salta ao seguinte parágrafo con menos desprazamento ou maior tamaño de fonte (parágrafo pai seguinte).
- NVDA+alt+avance páxina ou NVDA+alt+frecha dereita: salta ao seguinte parágrafo con máis desprazamento ou menor tamaño de fonte (parágrafo fillo).
- NVDA+alt+retroceso páxina ou NVDA+control+alt+frecha dereita: salta ao parágrafo anterior con máis desprazamento ou menor tamaño de fonte (parágrafo fillo anterior).
- NVDA+o: cambia o rotor entre desprazamento horizontal, tamaño de fonte ou tamaño de fonte con restricción de estilo.
- \ ou Shift+\ (barra invertida): desprazarse arriba ou abaixo para amosar calquera elemento da páxina, pode seren útil en páxinas web dinámicas para cargar todos os elementos. Tamén pode seren útil en páxinas web con desprazamento infinito para cargar o seguinte fragmento.
- NVDA+shift+frecha esquerda: voltar á posición anterior do cursor dentro do documento actual.
- NVDA+e: edita algunas caixas de edición semiaccesibles. Consulta a seción correspondente máis adiante.
- T ou shift+t: saltar á táboa seguinte ou anterior, pero situando o cursor na primeira celda. Ás veces o NVDA pon o cursor antes da primeira celda e BrowserNav arranxa este comportamento.
QuickJump Bookmarks
BrowserNav QuickJump bookmarks is a powerful tool that allows to navigate around web pages and automate some repetitive actions.
Atallos de marcadores
- NVDA+j: amosar o menú emerxente de salto rápido.
- J ou shift+j: salta ao próximo marcador de salto rápido ou ao anterior.
- / e control+/: alterna o modo omitir desorden para navegar por liñas (frechas arriba e abaixo) e por parágrafos (control+frechas arriba e abaixo) 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 ao marcador xerárquico anterior do nivel correspondente.
- Alt+
ou Shift+Alt+
: salta ao marcador xerárquico seguinte ou anterior de calquera nivel.
You can also configure custom keystrokes for most bookmark types (except for SkipClutter, Hierarchical and Numeric Script bookmarks).
Sitios
O primeiro que se debería configurar é o sitio para o que se desexan crear os marcadores. Na maioría de casos podes querer indicar o tipo de coincidencia para que sexa do dominio, ou do dominio e os seus subdominios. Para ilustrar a segunda opción, podes indicar:
- URL: amazon.com
- Tipo de coincidencia: dominio e subdominios
- Esto fará que coincidan amazon.com, smile.amazon.com e todos os demáis dominios *.amazon.com.
Se necesitas un control máis preciso, podes indicar tamén a URL exacta ou definir unha expresión regular para a URL.
A causa desta definición flexible, poden estar activos ao mesmo tempo varios sitios de salto rápido nunha mesma páxina web.
Tipos de marcadores
Unha vez que configuraras a definición do sitio, podes proceder a definir algúns marcadores para el.
BrowserNav supports several types of bookmarks:
- Marcadores de salto rápido: podes saltar a eles premendo j ou shift+j.
- Marcadores de saltar desorden: estos marcadores evítanse automáticamente ao navegar por liñas (frechas arriba e abaixo) ou por parágrafos (control+frechas arriba ou abaixo). Esto permite agochar o desorden en páxinas web, coma liñas en branco, marcas de tempo ou outra información redundante. A información non se elimina compretamente, pódese deshabilitar temporalmente o salto de desorden coas ordes / e control+/. Por defecto, evitar desorden sáltase os parágrafos valdeiros en todos os 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 dun novo marcador
Unha vez configuraras un sitio, o xeito máis doado de crear un novo marcador sería navegar ao parágrafo desexado no documento, premer NVDA+j para amosar o menú de contexto de marcadores e selecionar Marcadores > Crear novo marcador para o sitio...
Abrirase o diálogo de configuración do marcador. Agora podes persoalizar o marcador. Podes cambiar cómo coincide o texto (por exemplo, coincidencia de cadea ou expresión regular).
Outras opciones deste diálogo:
- Categoría: define o tipo de marcador.
- Nome para amosar: nome opcional deste marcador para unha lexibilidade mellor. Só da un nome mellor para poder identificalo nunha longa listaxe de marcadores.
- Mensaje falado cando se atope o marcador: mensaxe opcional que se falará cada vez que alcances este marcador no documento.
- Desprazamento en parágrafos: despois de hachar unha coincidencia de texto, BrowserNav desprazará o cursor tantos parágrafos adiante ou atrás como sexa necesario. Esto pode ser útil, por exemplo, se o texto de destino ao que desexas saltar non contén ningún texto común que poda coincidir (p.ex. unha mensaxe nun foro) pero un parágrafo anterior contén unha palabra coincidente (por exemplo, votar). neste caso, podes facer que coincida a palabra votar e especificar desprazamento=1, para situar o cursor no primeiro parágrafo da mensaxe a cambio da palabra votar.
- Atributos: listaxe separada por espazos de atributos do parágrafo que coinciden. A listaxe de atributos dispoñibles para o parágrafo actual está dispoñible no seguinte campo do formulario. A listaxe de atributos rechéase previamente con algúns roles comúns e normalmente non é necesario editala.
- Atributos dispoñibles no parágrafo actual: todos os atributos que se atopan no parágrafo actual. Podes selecionalos e premer a barra espaciadora para engadilos á listaxe de atributos coincidentes.
Opcións de sitio avanzadas
No diálogo de configuración do sitio podes especificar diversas opcións avanzadas:
- Nome para amosar: nome para amosar opcional que mellore a lexibilidade na listaxe de sitios.
- Modo foco: permite anular o manexo por defecto dos eventos de foco no NVDA. Certos sitios fan mal uso dos eventos de foco. Para usalos de xeito máis convinnte, podes ignoralos, ou desactivar entrar automáticamente en modo foco cando se recibe un evento de foco.
- Modo de rexión viva: algúns sitios web usan mal as rexións vivas. Esta opción permite desactivar o anunciado de rexións vivas só no 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:
- To enhance matching algorithm where existing match options are not enough. This applies to QuickJump, QuickSpeak, QuickClick, hierarchical and SkipClutter bookmarks.
- 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 ofParagraph
class defined in paragraph.pyt
- currenttextInfo
object.
It is recommended to work with paragraphs, since they provide higher level
interface then textInfo
s.
Your script must decide whether current paragraph matches your custom rule or not. You can either:
- Return
True
if it matches, otherwiseFalse
. - Return
None
or noreturn
statement to indicate no match. - Return an integer number
i
to indicate thati
-th following ori
-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 messages
. 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
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
This script doesn't perform a match, but activates the last edit box on the page:
p.end.previous.previousEdit.activate()
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)
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)
This is a numeric script since it takes
level
as input variable. This findslevel
-th edit box from the beginning of the page (or from the end if level is negative) and invokesscript_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
As definicións de marcadores almacénanse no cartafol de configuración do
NVDA, no arquivo browserNavRules.json
. Podes editar este arquivo
manualmente ou compartilo con alguén.
Pódese atopar o cartafol de configuración do NVDA abrindo o menú Inicio e escrebindo: Explorar directorio de configuración do usuario de NVDA.
O arquivo de configuración predeterminado de BrowserNav inclúe marcadores de exemplo.
Editar caixas de edición semiaccesibles
Moitas aplicacións web modernas, coma Jupiter entre outras, usan caixas de edición que non son accesibles. Por exemplo, amósanse en branco, pero podes copiar texto de elas ou pegalo cos atallos control+e, control+c e control+v.
BrowserNav ofrece unha función experimental para editar estas caixas de edición de xeito máis convinnte. Para usala:
- Procura a Caixa de edición na xanela do navegador.
- Preme NVDA+e.
- Aparecerá unha nova xanela cos contidos da Caixa de edición.
- Edita os contidos da Caixa de edición nesta xanela.
- Cando remates, podes premer escape para pechar a xanela de edición acesible e actualizar a caixa de edición na páxina web.
- Alternativamente, podes premer control+intro, shift+intro ou alt+intro. Esto pechará a xanela de edición, actualizará a Caixa de edición e pasará o xesto á aplicación web.
- Para pechar a xanela de edición sen gardar os cambios, preme alt+f4.
- En calquera intre, se se perden os contidos do texto previamente editado, preme NVDA+control+e para copialo ao portapapeis.
Notas:
- Non cambies o estado do navegador. P. ex. non cambies de pestana e non leves o foco a outros elementos dentro da pestana mentres a xanela de edición de texto está aberta. Ao facelo evitas que BrowserNav actualice o texto correctamente na Caixa de edición.
- Asegúrate de soltar os modificadores control, shift ou alt rápidamente tras premer control+intro, shift+intro ou alt+intro. mantelos durante aproximadamente un segundo causará problemas.
- Esta función é experimental na actualidade. Espera unha tasa de éxito do 90-95%.
- Probouse exhaustivamente con Google Chrome e Firefox. Podería funcionar noutros navegadores, pero hai unha maior posibilidade de problemas, como a pérdida de información.
Source code
Source code is available at http://github.com/mltony/nvda-indent-nav.