LSformat : Full support format in JS and improve substr

This commit is contained in:
Benjamin Renard 2014-07-04 12:41:16 +02:00
parent 245094e078
commit bbf7087572
3 changed files with 119 additions and 28 deletions

View 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 <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 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é 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>
<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> <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>

View file

@ -39,6 +39,19 @@
*/ */
function getFData($format,$data,$meth=NULL) { function getFData($format,$data,$meth=NULL) {
$unique=false; $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]+))?(-)?(\!|\_)?(~)?[})]"; $expr="%[{(]([A-Za-z0-9]+)(\:(-?[0-9])+)?(\:(-?[0-9]+))?(-)?(\!|\_)?(~)?[})]";
if(!is_array($format)) { if(!is_array($format)) {
$format=array($format); $format=array($format);
@ -138,6 +151,16 @@ function _getFData_extractAndModify($data,$ch) {
$l=$ch[5]; $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 { else {
$s=0; $s=0;
$l=$ch[3]; $l=$ch[3];

View file

@ -43,7 +43,21 @@ function LSdebug(arguments) {
* @retval string The formatted string * @retval string The formatted string
*/ */
function getFData(format,data,meth) { 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 find=1;
var val=""; var val="";
if(($type(data)=='object') || ($type(data)=='array')) { if(($type(data)=='object') || ($type(data)=='array')) {
@ -51,20 +65,7 @@ function getFData(format,data,meth) {
while (find) { while (find) {
var ch = getMotif.exec(format); var ch = getMotif.exec(format);
if ($type(ch)) { if ($type(ch)) {
if($type(ch[4])) { val=_getFData_extractAndModify(data[ch[2]],ch);
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]];
}
format=format.replace(new RegExp('%\{'+ch[1]+'\}'),val); format=format.replace(new RegExp('%\{'+ch[1]+'\}'),val);
} }
else { else {
@ -92,19 +93,9 @@ function getFData(format,data,meth) {
return; return;
} }
if($type(ch[4])&&ch[4]!="") { val=_getFData_extractAndModify(val,ch);
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);
}
format=format.replace(new RegExp('%\{'+ch[1]+'\}'),val); format=format.replace(new RegExp('%\{'+ch[1]+'[\:0-9\!\_\~\-]*\}'),val);
} }
else { else {
find=0; 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; 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 * Delete accentuated characters in a string
* *