English

Retour

Cogain
Réseau d'excellence européen sur la communication par le regard
Page personnelle Alexandre Alapetite 2003 - 2006

À propos

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ø.


Travaux personnels

Juin 2005 : Accessibilité des documents Web : vue d'ensemble des concepts et standards requis

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.


Juillet 2005 : Démo de Dasher wiki instantané

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).

Vidéo de la démo de Dasher wiki instantané (Avi 3.15Mo : XviD / MP3)
[Dasher Wiki]

Branchement sur Dasher

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.
Microsoft Spy++ sur Dasher pour trouver le nom des branchements
[Microsoft Spy++ sur Dasher]

Wiki à RTF

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;
  }
 }
}

Conclusion

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.


January 2005: Navigateur Web Web multimodal

Suite du projet de Navigateur Multimodal.

Navigateur Web Firefox avec une extension faite exprès pour la reconnaissance vocale,
un script GreaseMonkey, et interaction par le regard facilitée par un thème graphique approprié :
Navigateur Firefox 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) +')'));
	}
}
)()

https://alexandre.alapetite.fr

Retour