====== Basic - algoritme per trachar los tèrms espandits e/o communs ====== L'algoritme foncciona sus la partida clienta, es a dire lo navigador de l'usatgièr. Cada pic dins un ''camp dialectal'' (Lengadocian, Gascon, Provençal e Lemosin, Auvernhat, Vivaro-Alpenc) las donadas son cambiadas, lo boton « Aplicar » s'enlusís per far mòstra que los camps non cambiadisses ''espandit'' e ''commun'' devon èsser mes a jorn. Al picar del boton e se las reglas son realizadas, los camps son apasturats e lo boton torna a son estat normal.\\ Cada còp possible son normalizadas las entradas dins los ''camps dialectals'' al nivèl de la ponctuacion. L'empliment dels camps ''commun'' e ''espandit'' es sonque indicatiu e temporari, devenon permanent quand la ficha es **enregistrada**. ===== Demòra de far ===== FIXME PAS DE BESONH Trachar la nocion de ''/'' coma separator per dos tèrmes eqüivalents.\\ FIXME FACH Ordonar los tèrmes espandits segon lor emplec demest los dialèctes.\\ FIXME La cumulacion dels tèrmes sufixats al/au nos cal tanben trachar èl/èu/èth, ...\\ FIXME FACH Enebir l'afichatge dels camps mièjornal e septentrional se lo tèrme es espandit o commun.\\ FIXME integrar los lexícs Vivaro-alpenc e Provençau\\ FIXME integrar la seconda partida dels lexíc Lemosin\\ FIXME FACH La possibilitat de desvarolhar los camps non cambiadisses (es a dire enebir l'algoritme) se pòt concebre quand lo camp ''manual'' es botat, alara los automatismes del formulari son enebits e l'autor en darrièra fin pòt pelfinar lo trabalh. L'enregistrament es totjorn possible.\\ FIXME Un messatge per avisar que la ficha es estada modificada. ===== Definicions ===== ;''camp dialectal'' : un camp de sasida dins lo formulari que corespond a cada dialècte occitan. ;''term'' (tèrme) : un lexèm que corespond al tèrm francés. Se lo lexèm ven amb lo masculin e lo femenin son separats amb une virgula '',''. Mai d'un tèrme se pòdon trapar dins un sol camp dialectal, lor separator es un punt-virgula '';''. ;''weight'' (pes) : cada occuréncia d'un tèrme dins un camp lexical apond un pes qu'es una poténcia de 2. Çò qu'es mai simple de manejar lo tèrme amb una aritmetica de bits (//bitwise//). ===== Reglas ===== Un tèrme es ''commun'' se es present dins cada camp dialectal. Son pes es 63.\\ Un tèrme es ''espandit'' se existís dins las doas zònas ''miejornala'' e ''septentrionala'' e qu'es pas ''commun''.\\ Per una entrada, i pòt avure al encòp de tèrmes ''espandits'' e ''communs''. ===== Exemple ===== {{:user:domenge:javascript:algo_aporloc_basic_v2.png|}}\\ ===== Per comptar los bits a 1 dins lo pes (Bit Counter) ===== Per ordonar los tèrms espandits segon lor emplec demest los dialèctes, avèm de comptar lo nombre de dialèctes que lo tèrme i es dedins. Cada dialècte a una plaça per son bit. 32 per lo vivarés-alpenc, 16 l'auvernhat, 8 lo lemosin, 4 lo provençal, 2 lo gascon, 1 lo lengadocian.\\ Un masq es creat amb la valor 32, puèi lo masq es aplicat al pes amb un operator binari & (and) e se torna 1 (//TRUE//) los dos bit son a 1, lo comptador es incrementat (a 32 lo dialècte vivavo-alpenc es evaluat). Puèi lo masque es mudat cap a drecha d'una plaça, ansin la valor del masque passa de 32, 16, 8, 4, 2, 1, 0 per agachar cada bit del pes. Quand lo masque es agotat, la bocla s'acaba, e se torna la resulta.\\ var MASK_MAX = 0x20; // 32 // Entry.bitCount() this.bitCount = function(){ var mask = MASK_MAX; var valret = 0; while (mask > 0){ if (this.weight & mask){valret++;}//if mask>>>= 1; } // while return valret; }//bitCount ===== L'algoritme entièr ===== /* * WEIGHTS */ var LENG = 1; var GASC = 2; var PROV = 4; var LEM = 8; var AUV = 16; var ALP = 32; var ALLDIALECTS = 63; var MASK_MAX = 0x20; // 32 /** * Entry */ function Entry(aString){ this.aString = aString; this.weight = 0; this.equals = function(aEntry){ return (aEntry.aString === this.aString); } // equals this.addDialect = function(aDialect){return(aEntry.aString == this.aString);} this.toString = function(){return this.aString;} /** * definition : * to be commonly used the weight MUST be at its maximum */ this.isCommunlyUsed = function(){ return (this.weight == ALLDIALECTS); } // isCommunlyUsed /** * definition : * used in all southern dialects */ this.isSouthern = function(){ return (this.weight & LENG && this.weight & GASC && this.weight & PROV); } // isSouthern /** * definition : * used in all northern dialects */ this.isNorthern = function(){ return (this.weight & LEM && this.weight & AUV && this.weight & ALP); } // isNorthern /** * definition : * to be widely used, a term MUST NOT be used in all dialects but at least in the south and the north part of Occitania */ this.isWidelyUsed = function(){ return (this.weight != ALLDIALECTS && (this.weight & LENG || this.weight & GASC || this.weight & PROV) && (this.weight & LEM || this.weight & AUV || this.weight & ALP)); } // isWidelyUsed this.setWeight = function(dialectWeight){ this.weight |= dialectWeight; // console.log( 'string : ' + this.aString + ', w : ' + this.weight + ', dialectWeight : ' + dialectWeight); } // setWeight this.bitCount = function(){ var mask = MASK_MAX; var valret = 0; while (mask > 0){ if (this.weight & mask){valret ++;} // if mask>>>= 1; } // while // console.log(this.aString +' : ' + valret + ' : ' + mask); return valret; } // bitCount } // Entry /** * Singles * * this object is a singleton that maintain a list of unique terms. The data model is set with two arrays : * - an array of string * - an array of Entry objects * the two lists grow alongside and they are used as a replacement for hash table. * The use of the first is necessary by the need of the method indexOf */ function Singles(){ this.occurences = []; this.terms = []; /** * populateOccurences */ this.tokenizeAndAddEntry = function(dialectWeight, data){ if (typeof data !== 'undefined' && data.length > 0){ // clean the string data = data.replace(/\s*,\s*/g,','); data = data.replace(/\s*;\s*/g,";"); data = data.replace(/\s*$/g,''); var arr = data.split(";"); for (i=0; i < arr.length; i++){ var entry = new Entry(arr[i]); this.addEntry(entry,dialectWeight); } } } // tokenizeAndAddEntry /** * populateOccurences */ this.populateOccurences = function(){ this.tokenizeAndAddEntry(LENG,'bla, bla ; bli, bli ; ble, ble'); this.tokenizeAndAddEntry(GASC,'bli, bli ; blo, blo ; bla, bla ; ble,ble'); this.tokenizeAndAddEntry(PROV,'bla, bla ; bli, bli'); this.tokenizeAndAddEntry(LEM,'bla, bla ; blu'); this.tokenizeAndAddEntry(AUV,'bla, bla ; blu'); this.tokenizeAndAddEntry(ALP,'bli, bli ; bla, bla; ble, ble'); } // populateOccurences /** * addEntry */ this.addEntry = function(aEntry, dialectWeight){ var ind = this.terms.indexOf(aEntry.aString); if (ind === -1){ aEntry.setWeight(dialectWeight); this.occurences.push(aEntry); this.terms.push(aEntry.aString); } else{ this.occurences[ind].setWeight(dialectWeight); } } // addEntry /** * getEntriesCommunlyUsed */ this.getEntriesCommunlyUsed = function(){ var arr = []; for (i= 0 ; i < this.occurences.length;i++){ if (this.occurences[i].isCommunlyUsed()){ arr.push(this.occurences[i]); } // if } // for return arr; } // getEntriesCommunlyUsed /** * getEntriesWidelyUsed */ this.getEntriesWidelyUsed = function(){ var arr = []; for (i= 0 ; i < this.occurences.length;i++){ if (this.occurences[i].isWidelyUsed()){ arr.push(this.occurences[i]); } // if } // for // the sort function uses our customized one arr.sort(function(a,b){ return b.bitCount() - a.bitCount();}); return arr; } // getEntriesWidelyUsed /** * getEntriesMeridional */ this.getEntriesSouthern = function(){ var arr = []; for (i= 0 ; i < this.occurences.length;i++){ if (this.occurences[i].isSouthern()){ arr.push(this.occurences[i]); } // if } // for return arr; } // getEntriesSouthern /** * getEntriesNorthern */ this.getEntriesNorthern = function(){ var arr = []; for (i= 0 ; i < this.occurences.length;i++){ if (this.occurences[i].isNorthern()){ arr.push(this.occurences[i]); } // if } // for return arr; } // getEntriesNorthern /** * check */ this.check = function(){ for (i= 0 ; i < this.occurences.length;i++){ console.log("occurence : " + this.occurences[i].toString() + " weight : " + this.occurences[i].weight); } // for var arr = this.getEntriesCommunlyUsed(); var s = ""; for (i= 0 ; i < arr.length;i++){ s += arr[i].toString() + ' ; '; } // for s = s.replace(/\s;\s$/,''); console.log("communlyUsed : " + s); arr = this.getEntriesWidelyUsed(); s = ''; for (i= 0 ; i < arr.length;i++){ s += arr[i].toString() + ' ; '; } // for s = s.replace(/\s;\s$/,''); console.log("widelyUsed : " + s); } // check /************************************************* * * R E F R E S H * The most important function * ************************************************/ this.refresh = function(){ aSingles.reset(); aSingles.tokenizeAndAddEntry(LENG,document.getElementById("leng").value); aSingles.tokenizeAndAddEntry(GASC,document.getElementById("gasc").value); aSingles.tokenizeAndAddEntry(PROV,document.getElementById("prov").value); aSingles.tokenizeAndAddEntry(LEM,document.getElementById("lemosin").value); aSingles.tokenizeAndAddEntry(AUV,document.getElementById("auvernhat").value); aSingles.tokenizeAndAddEntry(ALP,document.getElementById("vivalpenc").value); // Entries communly used var arr = this.getEntriesCommunlyUsed(); var s = ""; for (i= 0 ; i < arr.length;i++){ s += arr[i].toString() + ' ; '; } // for s = s.replace(/\s;\s$/,''); s = s.replace(/\s;\s$/,''); document.getElementById("commun").value = s; // console.log("commun : " + s); // Entries widely used arr = this.getEntriesWidelyUsed(); s = ''; for (i= 0 ; i < arr.length;i++){ s += arr[i].toString() + ' ; '; } // for s = s.replace(/\s;\s$/,''); s = s.replace(/\s;\s$/,''); // console.log("widelyUsed : " + s); document.getElementById("espandit").value = s; // Southern entries arr = this.getEntriesSouthern(); s = ''; for (i= 0 ; i < arr.length;i++){ if (! arr[i].isWidelyUsed() && !arr[i].isCommunlyUsed()){ s += arr[i].toString() + ' ; '; } } // for s = s.replace(/\s;\s$/,''); s = s.replace(/\s;\s$/,''); // console.log("southern : " + s); document.getElementById("southern").value = s; // Northern entries arr = this.getEntriesNorthern(); s = ''; for (i= 0 ; i < arr.length;i++){ if (! arr[i].isWidelyUsed() && ! arr[i].isCommunlyUsed()){ s += arr[i].toString() + ' ; '; } } // for s = s.replace(/\s;\s$/,''); s = s.replace(/\s;\s$/,''); // console.log("northern : " + s); document.getElementById("northern").value = s; // turns the button in its normal state document.getElementById("applyButton").classList.remove('btn-warning'); } // refresh /** * reset */ this.reset = function(){ this.occurences = []; this.terms = []; }// reset } // Singles /** * THE OBJECT */ var aSingles = {}; function postwith (to,p) { var myForm = document.createElement("form"); myForm.method="post" ; myForm.action = to ; for (var k in p) { var myInput = document.createElement("input") ; myInput.setAttribute("name", k) ; myInput.setAttribute("value", p[k]); myForm.appendChild(myInput) ; } document.body.appendChild(myForm) ; myForm.submit() ; document.body.removeChild(myForm) ; }// postwith function setApplyButtonState(){ var isCompleted = document.getElementById("completedCheckbox").checked; var applyButton = document.getElementById("applyButton"); if (isCompleted){ applyButton.disabled = true; applyButton.classList.remove('btn-warning'); }else{ applyButton.disabled = false; applyButton.classList.add('btn-warning'); } } // setApplyButtonStyle function definitionAsSeen(){ var glossterm =document.getElementById("glossterm").value; var categorie =document.getElementById("categorie").value; var commun =document.getElementById("commun").value; var espandit =document.getElementById("espandit").value; var southern =document.getElementById("southern").value; var northern =document.getElementById("northern").value; var leng =document.getElementById("leng").value; var gasc =document.getElementById("gasc").value; var prov =document.getElementById("prov").value; var lemosin =document.getElementById("lemosin").value; var auvernhat =document.getElementById("auvernhat").value; var vivalpenc =document.getElementById("vivalpenc").value; var glosstermFmt ='glosstermFmt'; var categorieFmt ='categorieFmt'; var communFmt =''; var espanditFmt =''; var southernFmt =''; var northernFmt =''; var lengFmt =''; var gascFmt =''; var provFmt =''; var lemosinFmt =''; var auvernhatFmt =''; var vivalpencFmt =''; if (glossterm != ''){glosstermFmt ='[fr] ' + glossterm + '';} if (categorie != ''){ categorieFmt ='[catg] ' + categorie + '';} if (commun != ''){communFmt ='[com] ' + commun + '';} if (espandit != ''){espanditFmt ='[esp] ' + espandit + '';} if (southern != ''){southernFmt ='[miej] ' + southern + '';} if (northern != ''){ northernFmt ='[sept] ' + northern + '';} if (leng != ''){lengFmt ='[leng] ' + leng + '';} if (gasc != ''){gascFmt ='[gasc] ' + gasc + '';} if (prov != ''){ provFmt ='[prov] ' + prov + '';} if (lemosin != ''){lemosinFmt ='[lem] ' + lemosin + '';} if (auvernhat != '') {auvernhatFmt ='[auv] ' + auvernhat + '';} if (vivalpenc != '') {vivalpencFmt ='[alp] ' + vivalpenc + '';} var x = glosstermFmt + " (" + categorieFmt + ") : "+ communFmt + "," + espanditFmt + "," + southernFmt + "," + lengFmt + "," + gascFmt + "," + provFmt + "," + northernFmt + "," + lemosinFmt + "," + auvernhatFmt + "," + vivalpencFmt + "."; // some formatting and clean up x = x.replace(/,,/g,','); x = x.replace(/,,/g,','); x = x.replace(/,,/g,','); x = x.replace(/: ,/g,': '); x = x.replace(/,\./g,'.'); x = x.replace(/,/g,', '); return x; } // definitionAsSeen if (Drupal.jsEnabled){ $(window).load( function(){ aSingles = new Singles(); aSingles.refresh(); setApplyButtonState(); } ); $(document).ready(function(){ //event $("#applyButton").click( function(){ aSingles.refresh(); $("#definition_seen").html(definitionAsSeen()); } // function ); // event $("#acception").keyup(function () { $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#commun").keyup(function () { $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#espandit").keyup(function () { $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#southern").keyup(function () { $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#leng").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#gasc").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#prov").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#northern").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#auvernhat").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#lemosin").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#vivalpenc").keyup(function () { setApplyButtonState(); $("#definition_seen").html(definitionAsSeen()); }).keyup(); $("#completedCheckbox").change(function () { var isCompleted = document.getElementById("completedCheckbox").checked; var applyButton = document.getElementById("applyButton"); var communInput = document.getElementById("commun"); var espanditInput = document.getElementById("espandit"); var southernInput = document.getElementById("southern"); var northernInput = document.getElementById("northern"); if (isCompleted){ applyButton.disabled = true; applyButton.classList.remove('btn-warning'); communInput.readOnly = false; espanditInput.readOnly = false; southernInput.readOnly = false; northernInput.readOnly = false; }else{ applyButton.disabled = false; communInput.readOnly = true; espanditInput.readOnly = true; southernInput.readOnly = true; northernInput.readOnly = true; } }); }); // document ready }; // if Js