-
Notifications
You must be signed in to change notification settings - Fork 1
/
parser.php
102 lines (97 loc) · 3.81 KB
/
parser.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
// This function parses the user input string, and :
// - tries to detect the version of the format "fr0.1"
// - expects a colon ":"
// - expects a separator, that will be used to identify the next parts of the string
// According to the version, it tries to match the localized symbols to the internal
// symbols known by the program.
// This allows the use of an infinite number of translations, and inside each translation,
// it allows the use of aliases for each symbol.
// Between symbols, an attention must be payed to avoid duplicates amongst aliases.
function parsed($p, $canyonStr) {
// Tidying the user-provided string
// Protection basique contre les tentatives de piratage
$canyonStr = htmlspecialchars($canyonStr);
_error_log($canyonStr);
// On supprime les espaces de début et fin
$canyonStr = trim($canyonStr);
//
// Détermination de la version de la chaîne
//
// Si la chaîne ne contient pas de marqueur d'en-tête, on lui force une valeur par défaut
if (strpos($canyonStr, ':') === false) {
// Si la chaîne est fournie sans version, on lui fournit la version par défaut
$canyonStr = $p->defaultVersion.':'.$canyonStr;
_error_log ('Missing colon. Adding default version. Now, canyonStr='.$canyonStr);
}
// On limite le découpage à deux éléments (header | tout ce qui reste)
$strs = explode(':', $canyonStr, 2);
$strVersion = trim($strs[0]);
// Si la chaîne est fournie sans version, on lui fournit la version par défaut
if (isNullOrEmptyString($strVersion)) {
$strVersion = $p->defaultVersion;
}
// If this version is not supported, we return an error
$syntaxes = getDefinedSyntaxes();
if (!array_key_exists($strVersion, $syntaxes)) {
_error_log('Syntax '.$strVersion. ' is not supported');
return -1;
}
$p->syntaxVersion = $strVersion;
// Shift by two-caracters to keep the version number
$syntaxVersionNumber = substr($strVersion, 2);
$syntaxesProperties = getDefinedSyntaxesProperties();
$syntaxLength = $syntaxesProperties[$syntaxVersionNumber]['length'];
// Once we're sure it's a supported syntax, we store all these aliases into a temp array
$syntaxSymbols = $syntaxes[$strVersion];
// The leftover is the description of the canyon
$canyonStr = trim($strs[1]);
// If there is no description at all, we return an error
if (!$canyonStr) {
_error_log('200: Error: Empty description');
return -1;
}
// Le tout premier caractère est le séparateur dynamique
$p->separator = substr($canyonStr, 0, 1);
// _error_log('210:separator=_'.$p->separator.'_');
if ($p->separator == ',') {
_error_log('210:dynamic separator is a comma, and comma is refused (conflicts with options syntax). STOP.');
return '';
}
# On enlève le tout premier séparateur
$canyonStr = substr($canyonStr, 1);
// Tableau des éléments fournis par l'utilisateur
$inStrs = explode($p->separator, $canyonStr);
// On initialise la chaîne interne, telle qu'on la traitera dans le script
$outStr = '';
// Pour chaque chaîne fournie par l'utilisateur
foreach($inStrs as $inStr) {
$inStr = trim($inStr);
$item = strtolower(substr($inStr, 0, $syntaxLength));
$value = substr($inStr, $syntaxLength);
// Removing comments between parenthesis
// and triming the whole string
$value = trim(preg_replace('/\(.*\)*/', '', $value));
// On cherche dans chaque liste de symboles si on trouve la proposition
foreach($syntaxSymbols as $key => $aliases) {
if (array_key_exists($item, $aliases)) {
$outStr = $outStr . $p->separator . $key . $value;
if($key == 'Option') {
$p->setOptions($value);
} else {
if (class_exists($key)) {
$tmpItem = new $key($value);
$tmpItem->setInStr($inStr);
array_push($p->items, $tmpItem);
}
}
break;
}
}
}
# On enlève le tout premier séparateur
$outStr = substr($outStr, 1);
//_error_log ($outStr);
return $outStr;
}
?>