LSformat : Full support format in JS and improve substr
authorBenjamin Renard <brenard@easter-eggs.com>
Fri, 4 Jul 2014 10:41:16 +0000 (12:41 +0200)
committerBenjamin Renard <brenard@easter-eggs.com>
Tue, 30 Sep 2014 11:54:52 +0000 (13:54 +0200)
doc/conf/LSformat.docbook
public_html/includes/functions.php
public_html/includes/js/functions.js

index ca65b97..a788799 100644 (file)
@@ -28,7 +28,9 @@ Lorsque le paramètre <varname>B</varname> est défini,
 <varname>A</varname> correspond au rang du premier caractère à partir duquel la
 chaîne de substitution sera découpée et <varname>B</varname> le nombre maximum
 de caractères à extraire. Le signe de <varname>B</varname> influera comme expliqué
-dans le premier cas.
+dans le premier cas. Si <varname>B</varname> vaut zéro, la totalité de la longeur
+de la chaîne sera retournée en tenant compte de <varname>A</varname> pour le rang
+du premier caractère.
 </para>
 <para>Les paramètres <emphasis>!</emphasis> ou <emphasis>_</emphasis> permettre respectivement de forcer la mise en majuscule ou en minuscule de la valeur de substitution.</para>
 
index 44e7406..191915c 100644 (file)
  */
 function getFData($format,$data,$meth=NULL) {
   $unique=false;
+  /*
+   * Format : %{[key name][:A][:B][! ou _][~]}
+   *
+   * Extracted fields
+   * - 1 : key name
+   * - 2 : :A
+   * - 3 : A
+   * - 4 : :B
+   * - 5 : B
+   * - 6 : "-"
+   * - 7 : ! or _
+   * - 8 : ~
+   */
   $expr="%[{(]([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9]+))?(-)?(\!|\_)?(~)?[})]";
   if(!is_array($format)) {
     $format=array($format);
@@ -138,6 +151,16 @@ function _getFData_extractAndModify($data,$ch) {
         $l=$ch[5];
       }
     }
+    else if ($ch[5]==0) {
+      if ($ch[3]<0) {
+        $s=strlen((string)$data)-(-1*$ch[3]);
+        $l=strlen((string)$data);
+      }
+      else {
+        $s=$ch[3];
+       $l=strlen((string)$data);
+      }
+    }
     else {
       $s=0;
       $l=$ch[3];
index 337775b..3ba0454 100644 (file)
@@ -43,7 +43,21 @@ function LSdebug(arguments) {
  * @retval string The formatted string
  */
 function getFData(format,data,meth) {
-  var getMotif =  new RegExp('%\{(([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9])+)?)\}');
+  /*
+   * Format : %{[key name][:A][:B][! ou _][~]}
+   *
+   * Extracted fields
+   * - 1 : full string in %{}
+   * - 2 : key name
+   * - 3 : :A
+   * - 4 : A
+   * - 5 : :B
+   * - 6 : B
+   * - 7 : "-"
+   * - 8 : ! or _
+   * - 9 : ~
+   */
+  var getMotif =  new RegExp('%\{(([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9])+)?)(-)?(\!|\_)?(~)?\}');
   var find=1;  
   var val="";
   if(($type(data)=='object') || ($type(data)=='array')) {
@@ -51,20 +65,7 @@ function getFData(format,data,meth) {
       while (find) {
         var ch = getMotif.exec(format);
         if ($type(ch)) {
-          if($type(ch[4])) {
-            if ($type(ch[6])) {
-              var s=ch[4];
-              var l=ch[6];
-            }
-            else {
-              var s=0;
-              var l=ch[4];
-            }
-            var val=data[ch[2]].substr(s,l);
-          }
-          else {
-            val=data[ch[2]];
-          }
+          val=_getFData_extractAndModify(data[ch[2]],ch);
           format=format.replace(new RegExp('%\{'+ch[1]+'\}'),val);
         }
         else {
@@ -92,19 +93,9 @@ function getFData(format,data,meth) {
             return;
           }
           
-          if($type(ch[4])&&ch[4]!="") {
-            if ($type(ch[6])&&ch[6]!="") {
-              var s=ch[4];
-              var l=ch[6];
-            }
-            else {
-              var s=0;
-              var l=ch[4];
-            }
-            val=val.substr(s,l);
-          }
+          val=_getFData_extractAndModify(val,ch);
           
-          format=format.replace(new RegExp('%\{'+ch[1]+'\}'),val);
+          format=format.replace(new RegExp('%\{'+ch[1]+'[\:0-9\!\_\~\-]*\}'),val);
         }
         else {
           find=0;
@@ -112,9 +103,84 @@ function getFData(format,data,meth) {
       }
     }
   }
+  else if(($type(data)=='string')) {
+    while (find) {
+      var ch = getMotif.exec(format);
+      if ($type(ch)) {
+        val=_getFData_extractAndModify(data,ch)
+        format=format.replace(new RegExp('%\{'+ch[1]+'[\:0-9\!\_\~\-]*\}'),val);
+      }
+      else {
+        find=0;
+      }
+    }
+  }
   return format;
 }
 
+function _getFData_extractAndModify(data,ch) {
+  console.log(ch);
+  var val=data;
+  // If A
+  if($type(ch[4])) {
+    ch[4]=parseInt(ch[4]);
+    var s=0;
+    var l=data.length;
+    if ($type(ch[6])) {
+      ch[6]=parseInt(ch[6]);
+      // With A and B
+      if (ch[6]==0) {
+        // If B == 0
+        ch[6]=data.length;
+      }
+      if (ch[4]>0) {
+        // A > 0
+        s=ch[4];
+        l=ch[6];
+      }
+      else {
+        // A < 0
+        s=data.length+ch[4];
+        if (ch[6]<0) {
+          // B < 0
+          l=data.length-s+ch[6];
+        }
+        else {
+          // B > 0
+          l=ch[6];
+        }
+      }
+    }
+    else {
+      // Only A
+      if (ch[4]>0) {
+        // A > 0
+        s=0;
+        l=ch[4];
+      }
+      else {
+        // A < 0
+        s=data.length+ch[4];
+        l=data.length;
+      }
+    }
+    console.log("s = " + s + " / l = " + l);
+    val=data.substr(s,l);
+  }
+  // Upper or Lower case
+  if (ch[8]=='!') {
+    val=val.toUpperCase();
+  }
+  else if (ch[8]=='_') {
+    val=val.toLowerCase();
+  }
+  // Strip accents
+  if (ch[9]=='~') {
+    val=replaceAccents(val);
+  }
+  return val;
+}
+
 /**
 * Delete accentuated characters in a string
 *