HCE Project PHP language client API bindings  1.5.1
Hierarchical Cluster Engine PHP Client Interface API
 All Classes Namespaces Files Functions Variables Pages
hce_cli_api.inc.php
Go to the documentation of this file.
1 <?php
16 defined('HCE_CLI_READ_FROM_FILE_STATEMENT') or define('HCE_CLI_READ_FROM_FILE_STATEMENT', 'READ_FROM_FILE:');
17 
18 
19 function cli_parse_arguments($argv) {
20  $_ARG = array();
21  foreach ($argv as $arg) {
22  if (preg_match('/--([^=]+)=(.*)/',$arg,$reg)) {
23  $_ARG[$reg[1]] = $reg[2];
24  } elseif(preg_match('/-([a-zA-Z0-9])/',$arg,$reg)) {
25  $_ARG[$reg[1]] = 'true';
26  }
27  }
28 
29  return $_ARG;
30 }
31 
32 function cli_prettyPrintJson( $json, $left_ident="\t" ){
33  $result = '';
34  $level = 0;
35  $prev_char = '';
36  $in_quotes = false;
37  $ends_line_level = NULL;
38  $json_length = strlen( $json );
39 
40  for( $i = 0; $i < $json_length; $i++ ) {
41  $char = $json[$i];
42  $new_line_level = NULL;
43  $post = "";
44  if( $ends_line_level !== NULL ) {
45  $new_line_level = $ends_line_level;
46  $ends_line_level = NULL;
47  }
48  if( $char === '"' && $prev_char != '\\' ) {
49  $in_quotes = !$in_quotes;
50  } else if( ! $in_quotes ) {
51  switch( $char ) {
52  case '}': case ']':
53  $level--;
54  $ends_line_level = NULL;
55  $new_line_level = $level;
56  break;
57 
58  case '{': case '[':
59  $level++;
60  case ',':
61  $ends_line_level = $level;
62  break;
63 
64  case ':':
65  $post = " ";
66  break;
67 
68  case " ": case "\t": case "\n": case "\r":
69  $char = "";
70  $ends_line_level = $new_line_level;
71  $new_line_level = NULL;
72  break;
73  }
74  }
75  if( $new_line_level !== NULL ) {
76  $result .= PHP_EOL.str_repeat( $left_ident, $new_line_level );
77  }
78  $result .= $char.$post;
79  $prev_char = $char;
80  }
81 
82  return $result;
83 }
84 
85 function cli_getScreenSize(){
86  $ret=array('width'=>0, 'height'=>0);
87 
88  preg_match_all("/rows.([0-9]+);.columns.([0-9]+);/", strtolower(exec('stty -a | grep columns')), $output);
89 
90  if(sizeof($output) == 3) {
91  $ret['width'] = $output[1][0];
92  $ret['height'] = $output[2][0];
93  }
94 
95  return $ret;
96 }
97 
98 function cli_getASCIITreeFromArray($array, $params=null) {
99  $res='';
100 
101  if($params==null){
102  $params=array();
103  }
104 
105  if(!isset($params['whitespace_char'])){
106  //Space fill separator string
107  $params['whitespace_char']=' ';
108  }
109  if(!isset($params['interrow_ident'])){
110  //Inter row ident lines number
111  $params['interrow_ident']=0;
112  }
113  if(!isset($params['hline_char'])){
114  //Inter row ident lines number
115  $params['hline_char']='_';
116  }
117  if(!isset($params['vline_char'])){
118  //Inter row ident lines number
119  $params['vline_char']='|';
120  }
121  if(!isset($params['max_width'])){
122  //Max width in characters
123  $params['max_width']=80;
124  }
125  if(!isset($params['item_hident'])){
126  //Max width in characters
127  $params['item_hident']=1;
128  }
129 
130  //Get max number of items on one level
131  $getMaxItems = function($arr) use(&$getMaxItems){
132  $n=0;
133 
134  foreach($arr as $val){
135  if(is_array($val)){
136  $n+=$getMaxItems($val);
137  }else{
138  $n++;
139  }
140  }
141 
142  return $n;
143  };
144 
145  $maxItemsOnOneLevel=$getMaxItems($array);
146 
147  //Get total width of titles items in characters on all levels
148  $getTotalWidth = function($arr) use(&$getTotalWidth){
149  $n=0;
150 
151  foreach($arr as $key=>$val){
152  if(is_array($val)){
153  $n+=$getTotalWidth($val);
154  }else{
155  $n+=strlen($key);
156  }
157  }
158 
159  return $n;
160  };
161 
162  $totalWidth=$getTotalWidth($array);
163 
164  //Get max length of string array
165  $getMaxLength = function($arr){
166  if(!empty($arr)){
167  $lengths=array_map('strlen', $arr);
168  }else{
169  $lengths=0;
170  }
171 
172  return max($lengths);
173  };
174 
175  //Space per item
176  $params['max_space_per_item']=floor(($params['max_width']-$totalWidth)/($maxItemsOnOneLevel<1 ? 1 : $maxItemsOnOneLevel))-$params['item_hident'];
177  $params['max_space_per_item']=($params['max_space_per_item']<1) ? 1: $params['max_space_per_item'];
178 
179  //Get max title width
180  $getMaxTitleWidth = function($arr) use(&$getMaxTitleWidth){
181  static $maxWidth=0;
182 
183  foreach($arr as $key=>$val){
184  $lines=explode(PHP_EOL, $key);
185  foreach($lines as $line){
186  if(strlen($line)>$maxWidth){
187  $maxWidth=strlen($line);
188  }
189  }
190 
191  if(is_array($val)){
192  $getMaxTitleWidth($val);
193  }
194  }
195 
196  return $maxWidth;
197  };
198 
199  //Get max title lines
200  $getMaxTitleLines = function($arr) use(&$getMaxTitleLines){
201  static $maxLines=0;
202 
203  foreach($arr as $key=>$val){
204  $lines=substr_count($key, PHP_EOL)+1;
205  if($lines>$maxLines){
206  $maxLines=$lines;
207  }
208 
209  if(is_array($val)){
210  $getMaxTitleLines($val);
211  }
212  }
213 
214  return $maxLines;
215  };
216 
217  //Fix title lines number and width
218  $fixTitleLinesWidth = function($arr, $titleLines, $titleWidth) use(&$fixTitleLinesWidth){
219  $ret=array();
220 
221  if(is_array($arr)){
222  foreach($arr as $key=>$val){
223  $lines=explode(PHP_EOL, $key);
224  //Fix lines lenght
225  foreach($lines as $lineKey=>$line){
226  if(strlen($line)<$titleWidth){
227  $diff=$titleWidth-strlen($line);
228  $lines[$lineKey]=str_repeat(' ', ceil($diff/2)).$line.str_repeat(' ', floor($diff/2));
229  }
230  }
231  //Fix lines number
232  for($i=0; $i<$titleLines-count($lines); $i++){
233  $lines[]=str_repeat(' ', $titleWidth);
234  }
235  //Pack lines
236  $ret[implode(PHP_EOL, $lines)]=$fixTitleLinesWidth($val, $titleLines, $titleWidth);
237  }
238  }else{
239  $ret=$arr;
240  }
241 
242  return $ret;
243  };
244 
245  //Generate text stream
246  $getTreeChartArray = function($arr, $params, $offset=0) use(&$getTreeChartArray, &$getMaxLength){
247  static $level=0;
248 
249  $level++;
250 
251  $ret=array();
252 
253  if($level==1){
254  $first=true;
255  }else{
256  $first=false;
257  }
258 
259  $i=0;
260  $lastNodeStrLen=0;
261  $ret1=array();
262  $titles=array();
263  $vlines=str_repeat($params['whitespace_char'], $offset);
264  $hlines=str_repeat($params['whitespace_char'], $offset);
265  $vlines2=str_repeat($params['whitespace_char'], $offset);
266 
267  foreach($arr as $key=>$val){
268  $lines=explode(PHP_EOL, $key);
269 
270  if(count($titles)==0){
271  //Init titles lines array
272  foreach($lines as $line){
273  $titles[]=str_repeat($params['whitespace_char'], $offset);
274  }
275  }
276 
277  $lastNodeStrLen=count($ret1)>0 ? $getMaxLength($ret1) : strlen($titles[0]);
278  if(is_array($val)){
279  $ret1=array_merge($ret1, $getTreeChartArray($val, $params, $lastNodeStrLen));
280  }
281  if($i==0){
282  $offset1=0;
283  }else{
284  $offset1=($lastNodeStrLen-strlen($titles[0]))>0 ? ($lastNodeStrLen-strlen($titles[0])) : $params['max_space_per_item'];
285  }
286 
287  for($j=0; $j<count($lines); $j++){
288  $titles[$j].=str_repeat($params['whitespace_char'], $offset1).$lines[$j];
289  }
290 
291  if($val!==null){
292  $vline_char=$params['vline_char'];
293  }else{
294  $vline_char=$params['whitespace_char'];
295  }
296  $chars=$offset1+((strlen($lines[0])/2)-1);
297  if($chars<0){
298  $chars=0;
299  }
300  $vlines.=str_repeat($params['whitespace_char'], $chars).$vline_char.str_repeat($params['whitespace_char'], ((strlen($lines[0])/2)));
301 
302  if(!$first){
303  if(count($arr)>1){
304  $vlines2.=str_repeat($params['whitespace_char'], $offset1+((strlen($lines[0])/2)-1)).$params['vline_char'].str_repeat($params['whitespace_char'], ((strlen($lines[0])/2)));
305 
306  if($i==0){
307  $hlines.=str_repeat($params['whitespace_char'], $offset1+(strlen($lines[0])/2)).str_repeat($params['hline_char'], strlen($lines[0])/2);
308  }else{
309  $hlines.=str_repeat($params['hline_char'], strlen($vlines2)-strlen($hlines)-(strlen($lines[0])/2));
310  }
311  $hlines=substr($hlines, 0, strlen($hlines)-1);
312  }else{
313  //$hlines=$vlines;
314  }
315  }
316 
317  $i++;
318  }
319 
320  $ret[]=$hlines;
321  $ret[]=$vlines2;
322  foreach($titles as $titles_key=>$titles_value){
323  $titles[$titles_key]=rtrim($titles_value);
324  }
325  $ret[]=implode(PHP_EOL, $titles);
326  $ret[]=$vlines;
327  $ret=array_merge($ret, $ret1);
328 
329  return $ret;
330  };
331 
332  $maxTitleWidth=$getMaxTitleWidth($array);
333  if($maxTitleWidth%2>0){
334  $maxTitleWidth++;
335  }
336 
337  $maxTitleLines=$getMaxTitleLines($array);
338 
339  $array=$fixTitleLinesWidth($array, $maxTitleLines, $maxTitleWidth);
340 
341  $res=$getTreeChartArray($array, $params);
342 
343  //Trim lines
344  for($i=0; $i<count($res); $i++){
345  $res[$i]=rtrim($res[$i]);
346  }
347 
348  //Add vlines for down nodes
349  for($i=0; $i<count($res)-1; $i++){
350  $p=0;
351  while(($p=strpos($res[$i], $params['vline_char'], $p))!==false){
352  if(strlen($res[$i+1])<$p){
353  $res[$i+1].=str_repeat($params['whitespace_char'], $p-strlen($res[$i+1])).$params['vline_char'];
354  }
355  $p++;
356  }
357  }
358 
359  //Remove duplicated lines
360  do{
361  $new_res=array();
362  $duplicates=0;
363  for($i=0; $i<count($res)-1; $i++){
364  if($res[$i]!=$res[$i+1]){
365  $new_res[]=$res[$i];
366  }else{
367  $duplicates++;
368  }
369  }
370  $new_res[]=$res[$i];
371  $res=$new_res;
372  }while($duplicates>0);
373 
374  return implode(PHP_EOL, $new_res);
375 }
376 
377 
378 function file_get_contents_json($input, $statement=HCE_CLI_READ_FROM_FILE_STATEMENT, $error_message='File not found:'){
379  $content=$input;
380  $statement_len=strlen($statement);
381 
382  if(is_string($input)){
383  if(strlen($input)>$statement_len && substr($input, 0, $statement_len)==$statement){
384  $file_name=substr($input, $statement_len);
385  if(file_exists($file_name)){
386  $content=file_get_contents($file_name);
387  $content=@json_decode($content, true);
388  $content=file_get_contents_json($content);
389  }else{
390  if(strlen($error_message)>0){
391  $content=$error_message.$file_name;
392  }
393  }
394  }
395  }elseif(is_array($input)){
396  foreach($input as $key=>$val){
397  $input[$key]=file_get_contents_json($val);
398  }
399  $content=$input;
400  }
401 
402  return $content;
403 }
404 
405 ?>