BrowserNav
Cette extension fournit aux utilisateurs de NVDA des commandes de navigation puissantes en mode navigation. Il fonctionne dans les navigateurs Web, ainsi que toutes les autres applications qui prennent en charge le mode navigation de NVDA, telles que les documents Word et les clients de messagerie.
Télécharger
Veuillez l'installer via l'add-on store.
Utilisation dans les navigateurs et autres programmes qui prennent en charge le mode navigation
Veuillez noter qu'à partir de NVDA v2024.2, la navigation verticale et les commandes de navigation du même style sont désormais disponibles dans le noyau NVDA. Il est préférable d'utiliser les commandes intégrées. Aucun geste par défaut ne leur est attribué, les gestes doivent donc être attribués par l'utilisateur dans le dialogue Gestes de commandes.
BrowserNav peut être utilisé pour naviguer par position horizontale en partant de la gauche de l'écran, par taille de police ou par style de police.
- Quand vous naviguez par position horizontale, vous pouvez facilement trouver les paraphes qui sont alignés verticalement sur la page. En particulier, vous pouvez presser NVDA+Alt+FlècheBas ou FlècheHaut pour sauter au paragraphe suivant ou précédent ayant la même position. Par exemple, ceci peut être utile quand on explore des arborescences hiérarchiques de commentaires (ex : sur reddit.com) pour sauter entre les commentaires de premier niveau et ignorer tous les commentaires de plus haut niveau.
- Quand vous naviguez par taille de police, vous pouvez facilement trouver les paragraphes écrits dans la même taille de police, ou des tailles plus petites ou plus grandes.
- Vous pouvez aussi naviguer par même taille de police avec la contrainte de même style de police.
Le rotor de BrowserNav est utilisé pour basculer entre ces options. Selon le réglage de ce rotor, BrowserNav indiquera avec des bip soit la position horizontale ou la taille de la police de l'élément actuellement sélectionné. De plus, BrowserNav craquera sur les commandes de navigation rapide pour indiquer la quantité de texte qui a été ignorée (cette fonctionnalité n'est disponible que dans Google Chrome et Firefox).
BrowserNav fonctionne dans n'importe quel navigateur pris en charge par NVDA. Bien que certaines fonctionnalités ne soient pas disponibles dans tous les navigateurs. BrowserNav fonctionne également dans d'autres applications qui prennent en charge le mode navigation de NVDA, telles que les documents Word et les clients de messagerie.
Touches de commandes :
- NVDA+Alt+FlècheHaut ou FlècheBas : Saute au paragraphe précédent ou suivant avec la même position horizontale ou la même taille de police.
- NVDA+Alt+Début ou NVDA+alt+Flèche gauche : Saute au paragraphe précédent avec une position horizontale plus petite ou une taille de police plus grande (paragraphe parent).
- NVDA+Alt+Fin ou NVDA+Contrôle+alt+Flèche gauche : Saute au paragraphe suivant avec une position horizontale plus petite ou une taille de police plus grande (paragraphe parent suivant).
- NVDA+Alt+Page suivante ou NVDA+Alt+Flèche droite : Saute au paragraphe suivant avec une position horizontale plus grande ou une taille de police plus petite (paragraphe enfant).
- NVDA+Alt+Page précédente ou NVDA+Contrôle+Alt+Flèche droite : Saute au paragraphe précédent avec une position horizontale plus grande ou une taille de police plus petite (paragraphe enfant précédent).
- NVDA+O : Bascule les paramètres du rotor entre position horizontale, taille de police, taille de police avec style de police.
- \ ou Maj+\ (barre oblique inversée) : Défilement vers le haut ou vers le bas pour révéler chaque élément de la page; Peut être utile dans les pages Web dynamiques pour charger tous les éléments; Peut également être utile dans le défilement illimité des pages Web pour charger le morceau suivant.
- NVDA+Maj+Flèche gauche : Revenir à l'emplacement précédent du curseur dans le document actuel.
- NVDA+E : Éditer les zones d'édition semi-accessibles - voir la section correspondante ci-dessous.
- T ou Maj+T : Saute vers le tableau suivant ou précédent, mais place le curseur dans la première cellule. Parfois, NVDA met le curseur juste avant la première cellule et BrowserNav corrige ce comportement.
Signets QuickJump
Les signets QuickJump de BrowserNav sont un outil puissant qui permet de naviguer dans les pages Web et d'automatiser certaines actions répétitives.
Touches de commandes pour le signet
- NVDA+J : Afficher le menu contextuel QuickJump.
- J ou Maj+J : Saute vers le signet QuickJump suivant ou précédent.
- / et Contrôle+/ : Bascule le mode SkipClutter pour naviguer par ligne (Flèches haut et bas) et par paragraphe Contrôle+Flèches haut et bas) en conséquence.
- ALT+J : Clique sur tous les signets QuickClick sur la page actuelle.
- Ctrl+J : Annonce tous les signets QuickSpeak sur la page actuelle.
- ALT+1, ALT+2, ..., ALT+0 : Saute au signet hiérarchique suivant du niveau correspondant. 0 correspond au niveau 10. Vous pouvez également appeler un script numérique s'il est défini.
- Maj+Alt+1, Maj+Alt+2, ..., Maj+Alt+0 : Saute au signet hiérarchique précédent.
- Alt+
ou Maj+Alt+
: Saute au signet hiérarchique suivant ou précédent peu importe le niveau.
Vous pouvez également configurer des touches de commandes personnalisées pour la plupart des types de signets (à l'exception des signets SkipClutter, Hierarchical et Numeric Script).
Sites
La première chose que vous devez configurer est le site où vous souhaitez créer des signets. Dans la plupart des cas, vous voudriez spécifier le type de correspondance pour avoir un domaine de correspondance ou un domaine de correspondance et ses sous-domaines. Pour illustrer cette dernière option, vous pouvez spécifier :
- URL : amazon.com
- Type de correspondance : Correspond au domaine et ses sous-domaines
- Cela correspondra à amazon.com, smile.amazon.com et tous les autres domaines *.amazon.com.
Si vous avez besoin d'un contrôle plus fin, vous pouvez également spécifier une URL exacte ou définir une expression régulière pour l'URL.
En raison de cette définition flexible, sur chaque page Web donnée, plusieurs sites QuickJump peuvent être actifs en même temps.
Types de signets
Une fois que vous avez configuré la définition du site, vous pouvez procéder pour définir des signets sur lui.
BrowserNav prend actuellement en charge plusieurs types de signets :
- Signets QuickJump : Vous pouvez les sauter en appuyant sur J ou Maj+J.
- Signets SkipClutter : Ces signets sont sautés automatiquement lors de la navigation par ligne (Flèche haut / bas) ou par paragraphe (Contrôle+Flèches haut / bas). Cela permet de masquer l'encombrement sur les pages Web, telles que les lignes vides, les horodatages et toute autre information redondante. Les informations ne sont pas complètement supprimées, SkipClutter peut être temporairement désactivé via les commandes / ou Contrôle+/. Par défaut, SkipClutter saute les paragraphes vides sur tous les sites Web.
- Signets QuickClick : Vous pouvez marquer des éléments cliquables, tels que des liens, des boutons ou des cases à cocher pour avoir des signets QuickClick. Ensuite, en appuyant sur Alt+J, vous pouvez rapidement appuyer sur tous les signets QuickClick sur la page actuelle avec une seule touche sans déplacer le curseur. Cela peut être utile pour appuyer sur un bouton fréquemment utilisé sur un site Web, tel que le bouton de lecture sur YouTube ou le bouton MUTE sur les sites Web de conférence vidéo.
- Signets QuickSpeak : Vous pouvez lire ce type de signets en appuyant sur les touches de commandes Ctrl+J ; le curseur ne bouge pas. Ceci est pratique pour vérifier les éléments fréquemment modifiés de la page. Vous pouvez également définir le signet quickClick pour qu'il soit automatiquement actualisé, c'est-à-dire que BrowserNav analysera la page de manière périodique et annoncera automatiquement si le texte correspondant change.
- Signets Hiérarchiques : Ceci est similaire aux signets QuickJump, mais cela prend en compte la position horizontale d'un signet. Des sites comme Reddit et Hacker News ont une arborescence hiérarchique de commentaires, ce qui était assez difficile de naviguer efficacement pour les utilisateurs des lecteurs d'écran. Sur ces sites Web, vous pouvez marquer les commentaires comme un signet Hiérarchique, puis vous pouvez naviguer entre eux en appuyant sur Alt+Chiffre ou Maj+Alt+Chiffre, où le chiffre signifie le numéro de ligne 1,2,3,...0 - c'est-à-dire le niveau du commentaire. Par défaut, BrowserNav a des signets Hiérarchiques configurés pour Hacker News et reddit.com.
- Signets script : Exécutez simplement le script fourni lorsqu'il est invoqué.
- Script numérique : Appuyez sur Alt+0 à Alt+9 pour exécuter le script en
prenant un nombre comme entrée. Peut être pratique, par exemple, pour
sauter au
i
-ième signet de la page par une seule touche de commande.
Création d'un nouveau signet
Une fois que vous avez configuré un site, le moyen le plus simple de créer un nouveau signet serait de naviguer vers le paragraphe souhaité dans le document, appuyez sur NVDA+J pour afficher le menu contextuel des signets et sélectionner Signets > Créer un nouveau signet pour le site...
Le dialogue de configuration de signet s'ouvrira. Vous pouvez désormais personnaliser le signet. Vous pouvez modifier la façon dont le texte est correspondu (par exemple, correspondance à la chaîne ou expression régulière).
Autres options dans ce dialogue :
- Catégorie : Définir le type de signet.
- Nom de l'affichage : Nom facultatif de ce signet pour une meilleure lisibilité. Cela donne juste un meilleur nom afin que vous puissiez identifier ce signet dans une longue liste de signets.
- Message parlé lorsque le signet est trouvé : Message facultatif pour parler chaque fois que vous appuyez sur ce signet dans le document.
- Position horizontale dans les paragraphes : Après avoir trouvé le texte correspondant, BrowserNav déplacera ensuite le curseur par les nombreux paragraphes en avant ou en arrière. Cela peut être utile par exemple si le texte cible auquel vous souhaitez ignorer ne contient aucun texte commun qui peut être correspondu (par exemple, forum post), mais un paragraphe précédent qui contient un mot correspondant (par exemple upvote). Dans ce cas, vous pouvez faire correspondre le mot upvote et spécifier la position horizontale = 1, pour placer le curseur sur le premier paragraphe du message au lieu du mot upvote.
- Attributs : Liste séparée par l'espace d'attributs de paragraphe qui sont correspondu. La liste des attributs disponibles pour le paragraphe actuel est disponible dans le champ suivant. La liste des attributs est présentée avec certains rôles courants et vous n'avez généralement pas besoin de le modifier.
- Attributs disponibles dans le paragraphe actuel : Ce sont tous les attributs trouvés dans le paragraphe actuel. Vous pouvez sélectionner et appuyer sur espace pour les ajouter à la liste des attributs correspondants.
Options avancées du site
Dans le dialogue de configuration du site, vous pouvez spécifier un certain nombre d'options avancées :
- Nom de l'affichage : Nom d'affichage facultatif pour une meilleure lisibilité dans la liste des sites.
- Mode formulaire : Cela permet de remplacer la gestion par défaut des événements du focus dans NVDA. Certains sites Web abusant des événements du focus. Afin de les utiliser plus facilement, vous pouvez soit ignorer les événements du focus, soit désactiver également la saisie automatique du mode formulaire lorsqu'un événement du focus est reçu.
- Mode région live : Certains sites Web utilisent des régions live. Cette option permet de désactiver les annonces de région live uniquement pour le site Web actuel.
- Mode débogage par bips : C'est surtout bon à des fins de débogage. Vous pouvez faire émettre des bips par NVDA lorsque certains événements (focus, mise à jour de la région live ou QuickClick réussi) se sont produits.
Script
À partir de BrowserNav v2.5, vous pouvez personnaliser vos signets avec des scripts Python. Les scripts peuvent être utilisés à deux fins :
- Améliorer l'algorithme de correspondance lorsque les options de correspondance existantes ne suffisent pas. Cela s'applique aux signets QuickJump, QuickSpeak, QuickClick, hiérarchiques et SkipClutter.
- Exécuter du code Python arbitraire afin d'automatiser certaines actions sur les pages Web. Cela peut être fait via les signets Script ou Numeric Script.
Script API
Dans votre script, vous disposez des variables suivantes :
p
- current paragraph. Il s'agit d'une instance de la classeParagraph
définie dans paragraph.pyt
- currenttextInfo
object.
Il est recommandé de travailler avec des paragraphes, car ils fournissent
une interface de niveau supérieur à celle de textInfo
.
Votre script doit décider si le paragraphe actuel correspond ou non à votre règle personnalisée. Vous pouvez soit :
- Renvoie
True
si cela correspond, sinonFalse
. - Renvoie
None
ou aucune instructionreturn
pour indiquer qu'il n'y a aucune correspondance. - Renvoie un nombre entier
i
pour indiquer que lei
-ème paragraphe suivant ou lei
-ème paragraphe précédent correspond et doit être annoncé à la place du paragraphe actuel. - Return tuple
(i: int, s:str)
pour indiquer la correspondance avec le décalage (voir le point précédent) et demandez à BrowserNav d'annoncer le messages
. Appelle la fonction
match()
pour indiquer une correspondance. Cette fonction lève en interne une exception, de sorte que l'exécution de votre script prendra fin après l'appel de la correspondance. La fonction est définie comme :def match(offset: int | TextInfo | Paragraph = None, message: str = None) -> None:
Vous êtes également autorisé à importer des modules et à écrire des scripts à usage général.
Vous pouvez utiliser l'instruction print()
pour déboguer votre script : la
sortie sera imprimée dans le journal NVDA.
Exemples de scripts
Ce script vérifie que le paragraphe courant est un lien et que le texte du titre précédent de niveau 5 commence par le texte du paragraphe courant :
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
Ce script n'effectue pas de correspondance, mais active la dernière zone d'édition de la page :
p.end.previous.previousEdit.activate()
Ce script trouve le nom d'utilisateur, qui peut être avancé d'un ou deux paragraphes ; puis il retrouve le début du commentaire en analysant la taille de la police ; puis il trouve la fin du commentaire en recherchant le texte "Reply". Ensuite, il fait correspondre tout le corps du commentaire et ajoute le nom d'utilisateur à annoncer avant le texte correspondant :
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)
Ce script est un générateur, ce qui signifie que tout ce qu'il produit sera utilisé comme temps de veille avant l'exécution de la ligne suivante. Ce script sera exécuté dans un thread d'arrière-plan dans une manière non bloquante.
Ce script effectue une série d'actions :
- Trouve un bouton avec un nom donné et appuie sur lui.
- Entre dans la fenêtre de dialogue qui apparaît :
p.home.nextEmbeddedObject.activate()
- Obtient un élément nouvellement focalisé dans ce dialogue :
d = getFocusParagraph()
- Trouve et vérifie la case à cocher dans ce dialogue.
- Trouve un autre bouton dans cette fenêtre de dialogue par son nom et appuie sur lui.
Ces étapes sont répétées 20 fois via la fonction
retry
. Puis, après une pause de 500 ms, il trouve le bouton "Run Query" et appuie sur lui.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)
Il s'agit d'un script numérique puisqu'il prend
level
comme variable d'entrée. Ceci trouve la zone d'éditionlevel
à partir du début de la page (ou de la fin si le niveau est négatif) et invoquescript_editJupyter
sur lui.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)
Configuration
Les définitions de signets sont stockées dans le répertoire de configuration
NVDA dans le fichier browserNavRules.json
. Vous pouvez modifier ce fichier
manuellement ou le partager avec quelqu'un.
Le répertoire de configuration NVDA peut être trouvé en ouvrant le menu Démarrer et taper: Explorer le répertoire de configuration utilisateur de NVDA.
BrowserNav est livré avec un fichier de configuration par défaut avec des exemples de signets.
Éditer les zones d'édition semi-accessibles
De nombreuses applications Web modernes, notamment Jupyter, entre autres, utilisent des zones d'édition, qui ne sont pas si accessibles, par exemple Ils semblent vides, mais vous pouvez copier du texte à l'intérieur et à l'extérieur en utilisant les combinaison de touches Contrôle+A, Contrôle+C et Contrôle+V.
BrowserNav propose une fonctionnalité expérimentale pour éditer ces zones d'édition de manière plus pratique. Afin de l'utiliser :
- Trouvez la zone d'édition dans la fenêtre du navigateur.
- Appuyez sur NVDA+E.
- Une nouvelle fenêtre apparaîtra avec le contenu de cette zone d'édition.
- Éditer le contenu de cette zone d'édition dans cette fenêtre.
- Une fois que vous avez terminé, vous pouvez appuyer sur Échap pour fermer la fenêtre d'édition accessible et mettre à jour la zone d'édition sur la page Web.
- Alternativement, vous pouvez appuyer sur Contrôle+Entrée, Maj+Entrée ou Alt+Entrée. Cela fermera la fenêtre d'édition, mettra à jour la zone d'édition et passera le geste sur l'application Web.
- Afin de fermer la fenêtre d'édition sans enregistrer les modifications, appuyez sur Alt+F4.
- À tout moment, si le contenu du texte édité précédemment est perdu, appuyez sur NVDA+Contrôle+E pour le copier dans le presse-papiers.
Remarques :
- Ne changez pas l'état du navigateur, par ex. Ne changez pas les onglets et ne placez pas le focus sur d'autres éléments dans l'onglet pendant que la fenêtre d'édition du texte est ouverte. Cela empêchera à BrowserNav de mettre à jour correctement le texte dans la zone d'édition.
- Assurez-vous de libérer rapidement les touches modificatrices Contrôle, Maj ou Alt en appuyant sur Contrpôle+Entrée, Maj+Entrée ou Alt+Entrée. Les tenir pendant plus d'une seconde causera des problèmes.
- Cette fonctionnalité est actuellement expérimentale. Veuillez vous attendre à un taux de réussite d'environ 90 à 95%.
- Il a été complètement testé avec Google Chrome et Firefox. Cela pourrait fonctionner dans d'autres navigateurs, mais il y a de plus grands chances d'avoir des problèmes, tels que la perte d'information.
Code source
Le code source est disponible sur http://github.com/mltony/nvda-indent-nav.