diff --git a/doc/conf/LSformat.docbook b/doc/conf/LSformat.docbook index ca65b973..a7887994 100644 --- a/doc/conf/LSformat.docbook +++ b/doc/conf/LSformat.docbook @@ -28,7 +28,9 @@ Lorsque le paramètre B est défini, A correspond au rang du premier caractère à partir duquel la chaîne de substitution sera découpée et B le nombre maximum de caractères à extraire. Le signe de B influera comme expliqué -dans le premier cas. +dans le premier cas. Si B vaut zéro, la totalité de la longeur +de la chaîne sera retournée en tenant compte de A pour le rang +du premier caractère. Les paramètres ! ou _ permettre respectivement de forcer la mise en majuscule ou en minuscule de la valeur de substitution. diff --git a/public_html/includes/functions.php b/public_html/includes/functions.php index 44e74060..191915c5 100644 --- a/public_html/includes/functions.php +++ b/public_html/includes/functions.php @@ -39,6 +39,19 @@ */ 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]; diff --git a/public_html/includes/js/functions.js b/public_html/includes/js/functions.js index 337775bd..3ba04543 100644 --- a/public_html/includes/js/functions.js +++ b/public_html/includes/js/functions.js @@ -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 *