Table des matières

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


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	='<span class="fr">[fr] ' + glossterm + '</span>';}
    if (categorie != ''){ categorieFmt ='<span class="categorie">[catg] ' + categorie + '</span>';}
    if (commun != ''){communFmt ='<span class="commun">[com] ' + commun + '</span>';}
    if (espandit != ''){espanditFmt ='<span class="espandit">[esp] ' + espandit + '</span>';}
    if (southern != ''){southernFmt ='<span class="southern">[miej] ' + southern + '</span>';}
    if (northern != ''){ northernFmt ='<span class="northern">[sept] ' + northern + '</span>';}
    if (leng != ''){lengFmt ='<span class="leng">[leng] ' + leng + '</span>';}
    if (gasc != ''){gascFmt ='<span class="gasc">[gasc] ' + gasc + '</span>';}
    if (prov != ''){ provFmt ='<span class="prov">[prov] ' + prov + '</span>';}
    if (lemosin != ''){lemosinFmt ='<span class="lem">[lem] ' + lemosin + '</span>';}
    if (auvernhat != '') {auvernhatFmt ='<span class="auv">[auv] ' + auvernhat + '</span>';}
    if (vivalpenc != '') {vivalpencFmt ='<span class="alp">[alp] ' + vivalpenc + '</span>';}

    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