Le Réseau d'excellence Cogain est un projet européen sur la communication par le regard, surtout destiné aux personnes handicapées.
Il fait partie du programme IST du sixième programme-cadre de Cordis. Référence [IST-2003-511598 (NoE)
], de septembre 2004 à août 2009.
Je participe à ce projet en parallèle avec ma thèse de PhD au laboratoire national Risø.
J'ai contribué au délivrable D6.1 "Rapport sur l'état de l'art de la méthodologie d'évaluation" (PDF 243Ko) ; en particulier, j'ai écrit l'appendice A sur l'accessibilité Web.
La version complète de cet appendice a été publiée en octobre 2006 : "Accessibilité des documents Web : vue d'ensemble des concepts et standards requis" Risø-R-1576(EN) ISBN 87-550-3546-9.
Dasher est une interface de saisie de texte révolutionnaire, utilisant une métaphore de type navigation. L'équipe de Dasher, du groupe inférence de l'université de Cambridge, participe à Cogain.
Grâce à la flexibilité de Dasher, j'ai pu développer un prototype montrant que Dasher peut être utilisé pour saisir du texte formaté, en utilisant une syntaxe wiki convertie instantanément au format RTF qui peut ensuite être imprimé ou utilisé dans la plupart des logiciels de traitement de texte (voir le résultat en RTF).
Ce prototype utilise l'API hook de Microsoft Windows pour extraire le texte entré par l'utilisateur dans Dasher. Ce branchement est écrit en Borland Delphi. Voici un extrait modifié en un mini programme Pascal pour illustrer ce branchement :
DasherHook.pas program DasherHook; uses Windows, Messages; function HookDasher(): hwnd; var dasher:hwnd; begin dasher := FindWindow(PChar('Dasher'), nil); Result := FindWindowEx(dasher, 0, 'Edit', nil); end; function WmGetText(handle: hwnd): string; var wmTextLength: Integer; text: string; begin wmTextLength := SendMessage(handle, WM_GETTEXTLENGTH, 0, 0); Inc(wmTextLength); SetLength(text, wmTextLength); SendMessage(handle, WM_GETTEXT, wmTextLength, Longint(@text[1])); Result := text; end; var dasherEdit: hwnd; text: string; begin dasherEdit := HookDasher(); text := WmGetText(dasherEdit); Write(text); end.
Le texte en syntaxe wiki est transféré à un programme en C#.NET via un port réseau. La syntaxe wiki est transformée en RTF avec des expressions régulières basiques. Voici un exemple modifié, pour illustrer ce processus :
LiveWiki.cs using System; using System.Text.RegularExpressions; using System.Windows.Forms; namespace CogainLiveWiki { public class LiveWiki { ///<summary>Liste des expressions régulières et leur remplacement</summary> private RegexReplace[] regexTable; private RichTextBox richTextBoxWiki; public LiveWiki() { this.regexTable = new RegexReplace[] { //\n new RegexReplace(@"$", @"\par", RegexOptions.Multiline), //=xxx= new RegexReplace(@"^=([^=\n]+)=[ ]*\\par$", @"{\fs44 ${1}\par}", RegexOptions.Multiline), //==xxx== new RegexReplace(@"^==([^=\n]+)==[ ]*\\par$", @"{\fs36 ${1}\par}", RegexOptions.Multiline), //===xxx=== new RegexReplace(@"^===([^=\n]+)===[ ]*\\par$", @"{\fs28 ${1}\par}", RegexOptions.Multiline), //*xxx new RegexReplace(@"^\*(.+?\\par)$", @"\pard{\*\pn\pnlvlblt\pnf1{\pntxtb\'B7}}{\pntext\f1\'B7}${1}\pard", RegexOptions.Multiline), // '''xxx''' new RegexReplace(@"(?<=[ \n])'''(.+?)'''(?=[ ,.\n]|\\par)", @"{\b ${1}}"), // ''xxx'' new RegexReplace(@"(?<=[ \n])''([^'].+?)''(?=[ ,.\n]|\\par)", @"{\i ${1}}") }; } public void DisplayWiki(string wiki) { richTextBoxWiki.Rtf = Wiki2RTF(wiki); } private string Wiki2RTF(string wiki) { wiki = "\n" + regexTable[0].regexPattern.Replace(wiki, regexTable[0].stringReplacement); for (int i = 1; i < regexTable.Length; i++) wiki = regexTable[i].regexPattern.Replace(wiki, regexTable[i].stringReplacement); return @"{\rtf1\ansi\ansicpg1252\fs20" + wiki + "}\n"; } } internal struct RegexReplace { internal Regex regexPattern; internal string stringReplacement; internal RegexReplace(string pattern, string replacement) { this.regexPattern = new Regex(pattern); this.stringReplacement = replacement; } internal RegexReplace(string pattern, string replacement, RegexOptions options) { this.regexPattern = new Regex(pattern, options); this.stringReplacement = replacement; } } }
Cette démo illustre la possibilité d'utiliser Dasher pour entrer plus que du langage naturel, et une possibilité simple de produire des documents texte formatés. À ce point du projet Cogain, il y a un besoin d'établir un protocole commun pour brancher des systèmes d'entrée de texte alternatifs tels Dasher à d'autres programmes.
Suite du projet de Navigateur Multimodal.
cogain-link-numbers.user.js // ==UserScript== // @name COGAIN link numbers // @namespace http://www.cogain.org // @description Ajoute un numéro après chaque lien // @include * // ==/UserScript== // Script Greasemonkey http://greasemonkey.mozdev.org // Fait par Alexandre Alapetite [https://alexandre.alapetite.fr] // pour le projet européen COGAIN (function() { var alllinks, thislink; alllinks = document.evaluate('//a[@href]', document,null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0; i < alllinks.snapshotLength; i++) { thislink = alllinks.snapshotItem(i); thislink.appendChild(document.createTextNode(' ('+ (i + 1) +')')); } } )()