com.neolao.data.language

Gestionnaire de lexique

Classes recquises:

Constructeur

Initialisation

  • pDepth:Number La profondeur de l'indexation des lexiques

Propriétés

Visibilité Type Nom Status Description
public Boolean ready Lecture seule Indique si la recherche est prête

Méthodes

Visibilité Return Nom Param 1 Param 2 Description
public Void addXML pURL:String Ajoute un XML externe comme source de lexique
public Void init Préparation du lexique
public Array search pLexicon:Number pWord:String Préparation du lexique

Evénements

  • onReady() Lorsque la recherche est prête
  • onError() Lorsqu'il y a une erreur dans la préparation

Change log

[15/06/2005] Version 1.0

Création

[27/06/2005] Version 1.1

Ajout d'un attribut sound dans le parsage du xml

Source

import com.neolao.data.XMLManager;
import com.neolao.data.ArrayIterator;
import com.neolao.data.language.Lexicon;
import com.neolao.data.language.WordLexicon;
import com.neolao.data.language.TranslationLexicon;
/**
 * Gestionnaire de lexique
 * @author 		neolao <neo@neolao.com>
 * @version 		1.1 (27/06/2005)
 * @link		http://resources.neolao.com/flash/classes/data/language/LexiconManager
 */
dynamic class com.neolao.data.language.LexiconManager {
	public var className:String = "LexiconManager";
	public var version:String = "1.1";
 
	// ----------------------------- CONSTANTES --------------------------------
	/**
	 * Le temps de temporisation pour chaque interval
	 */
	private var INTERVAL_MS:Number = 1;
	/**
	 * Le nombre d'exécution des traitements
	 */
	private var NB_EXEC:Number = 200;
	/**
	 * Racines des cookies
	 */
	private var COOKIES_ROOT:String = "/";
 
	// ----------------------------- VARIABLES ---------------------------------
	/**
	 * La profondeur de l'indexation des lexiques
	 */
	private var _depth:Number;
	/**
	 * Liste des XML externes à charger
	 */
	private var _xmlExtList:ArrayIterator;
	/**
	 * Gestionnaire XML
	 */
	private var _xml:XMLManager;
	/**
	 * Interval
	 */
	private var _interval:Number;
	/**
	 * XMLNode courant
	 */
	private var _xmlNodeCurrent:XMLNode;
	/**
	 * Liste des Lexicon
	 */
	private var _lexiconList:ArrayIterator;
	/**
	 * Indique si la recherche est prête
	 */
	private var _ready:Boolean;
 
	// ----------------------------- EVENEMENTS --------------------------------
	/**
	 * Evénement invoqué lorsque la préparation est finie
	 */
	public var onReady:Function;
	/**
	 * Evénement invoqué lorsqu'il y a une erreur
	 */
	public var onError:Function;
 
	/*============================= CONSTRUCTEUR =============================*/
	/*========================================================================*/
	/**
	 * Initialisation
	 * @param pDepth La profondeur de l'indexation des lexiques
	 */
	public function LexiconManager(pDepth:Number){
		// Initialisation des variables
		_depth = (pDepth === undefined)?3:pDepth;
		_xmlExtList = new ArrayIterator();
		_lexiconList = new ArrayIterator();
		_ready = false;
	}
	/*======================= FIN = CONSTRUCTEUR = FIN =======================*/
	/*========================================================================*/
 
	/*=========================== METHODES PRIVEES ===========================*/
	/*========================================================================*/
	/**
	 * Vérifie dans les cookies si le Lexicon n'y est pas
	 * @param pName Le nom du cookie
	 * @param pDate La date du fichier XML à comparer avec le cookie
	 */
	private function _cookiesCheck(pFrom:String, pTo:String, pDate:String):Boolean{
		var vName:String = pFrom+"-"+pTo;
		var vLexicon:Lexicon;
		var vCookies:SharedObject = SharedObject.getLocal(vName, COOKIES_ROOT);
 
		if(vCookies.data.database != undefined){
			// La base de données FR-GB existe dans les cookies
			if(vCookies.data.date >= pDate){
				// La base de données enregistrée est à jour, on l'utilise
				// Enregistrement dans le manager
				vLexicon = new Lexicon(vCookies.data.database, pFrom, vName);
				vLexicon.date = pDate;
				_lexiconList.push(vLexicon);
				return true;
			}else{
				// Le fichier est plus récent, il faut le parser
				return false;
			}
		}else{
			return false;
		}
	}
	/**
	 * Enregistre les données d'un Lexicon dans un cookie
	 */
	private function _cookiesSave(pName:String, pDatabase:Object, pDate:String){
		var vCookies:SharedObject = SharedObject.getLocal(pName, COOKIES_ROOT);
 
		vCookies.data.database = pDatabase;
		vCookies.data.date = pDate;
		vCookies.flush();
	}
	/**
	 * Parse du XML chargé
	 */
	private function _xmlParse(){
		var vParent:Object = this["parent"];
		var vXMLFirstChild:XMLNode = this["firstChild"];
 
		if(!vParent._cookiesCheck(vXMLFirstChild.attributes.from, vXMLFirstChild.attributes.to, vXMLFirstChild.attributes.date)){
			vParent._xmlNodeCurrent = vXMLFirstChild.firstChild;
			vParent._xmlToLexicon(vXMLFirstChild.attributes.from, vXMLFirstChild.attributes.to, new Array());
		}else{
			vParent._xmlNext();
		}
	}
	/**
	 * Erreur de parsage
	 */
	private function _xmlError(){
		var vParent:Object = this["parent"];
 
		vParent.onError.apply(vParent);
	}
	/**
	 * Formatage de la liste pour que la class Lexicon la comprenne
	 * @param pFrom La langue est du lexique
	 * @param pTo La langue de traduction
	 * @param pList La liste des TranslationLexicon
	 */
	private function _xmlToLexicon(pFrom:String, pTo:String, pList:Array){
		var vWord1:WordLexicon;
		var vWord2:WordLexicon;
		var vTransTmp:TranslationLexicon;
		var vTransTmpObj:Object;
		var vWordSearch:Array;
 
		clearInterval(_interval);
 
		if(_xmlNodeCurrent === null || _xmlNodeCurrent === undefined){
			// Il n'y a plus de XMLNode
			_lexiconList.push(new Lexicon(pList, _depth, pFrom+"-"+pTo));
			_xmlNext();
		}else{
			for(var i=0; i<NB_EXEC; i++){
				if(_xmlNodeCurrent){
					vWordSearch = _xmlNodeCurrent.attributes.search.split(",");
					vWord1 = new WordLexicon(pFrom, _xmlNodeCurrent.attributes.label, vWordSearch);
					vWord2 = new WordLexicon(pTo, _xmlNodeCurrent.attributes.translation);
					vTransTmp = new TranslationLexicon(vWord1, [vWord2]);
					vTransTmpObj = vTransTmp.toObject();
					vTransTmpObj.sound = _xmlNodeCurrent.attributes.sound;
 
					pList.push(vTransTmpObj);
 
					// On passe au XMLNode suivant
					_xmlNodeCurrent = _xmlNodeCurrent.nextSibling;
				}
			}
 
			_interval = setInterval(this, "_xmlToLexicon", INTERVAL_MS, pFrom, pTo, pList);
		}
	}
	/**
	 * Traitement du prochain XML
	 */
	private function _xmlNext(){		
		// Prochain XML
 
		if(_xmlExtList.hasNext()){
			_xml = new XMLManager(String(_xmlExtList.next()), _xmlParse, _xmlError);
			_xml.parent = this;
			_xml.load();
		}else{
			// Il n'y a plus d'XML à charger
			// On vérifie si tous les Lexicon sont ready
			_checkReady();
		}
	}
	/**
	 * Vérifie si tous les Lexicon sont ready
	 */
	private function _checkReady():Boolean{
		var vOK:Number = 0;
		var vLexicon:Object;
 
		clearInterval(_interval);
 
		_lexiconList.reset();
		while(_lexiconList.hasNext()){
			vLexicon = _lexiconList.next();
 
			if(vLexicon.ready){
				_cookiesSave(vLexicon.name, vLexicon.database, vLexicon.date);
				vOK++;
			}else{
				_interval = setInterval(this, "_checkReady", INTERVAL_MS);
				return false;
			}
		}
 
		_ready = true;
		onReady.apply(this);
 
		return true;
	}
	/*===================== FIN = METHODES PRIVEES = FIN =====================*/
	/*========================================================================*/
 
	/*============================ GETTER  SETTER ============================*/
	/*========================================================================*/
	/**
	 * Indique si la recherche est prête
	 */
	public function get ready():Boolean{
		return _ready;
	}
	/*====================== FIN = GETTER  SETTER = FIN ======================*/
	/*========================================================================*/
 
	/*========================== METHODES PUBLIQUES ==========================*/
	/*========================================================================*/
	/**
	 * Ajoute un XML externe comme source de lexique
	 * @param pURL Le XML externe à ajouter
	 */
	public function addXML(pURL:String){
		_xmlExtList.push(pURL);
	}
	/**
	 * Préparation du lexique
	 */
	public function init(){
		// Chargement des XML externes
		_xmlNext();
	}
	/**
	 * Lancer une recherche
	 * @param pLexicon Le lexique dans lequel on cherche
	 * @param pWord Le mot que l'on cherche
	 * @return La liste des mots trouvés
	 */
	public function search(pLexicon:Number, pWord:String):Array{
		if(_ready){
			return _lexiconList[pLexicon].search(pWord);
		}
	}
	/*==================== FIN = METHODES PUBLIQUES = FIN ====================*/
	/*========================================================================*/
}