forked from EwoudvanUijthoven/BEESM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphp_compressed.js
executable file
·785 lines (779 loc) · 46 KB
/
php_compressed.js
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
// Do not edit this file; automatically generated by build.py.
'use strict';
/*
Visual Blocks Language
Copyright 2015 Google Inc.
https://developers.google.com/blockly/
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
Blockly.PHP = new Blockly.Generator("PHP");
Blockly.PHP.addReservedWords("__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__");
Blockly.PHP.ORDER_ATOMIC = 0;
Blockly.PHP.ORDER_CLONE = 1;
Blockly.PHP.ORDER_NEW = 1;
Blockly.PHP.ORDER_MEMBER = 2.1;
Blockly.PHP.ORDER_FUNCTION_CALL = 2.2;
Blockly.PHP.ORDER_POWER = 3;
Blockly.PHP.ORDER_INCREMENT = 4;
Blockly.PHP.ORDER_DECREMENT = 4;
Blockly.PHP.ORDER_BITWISE_NOT = 4;
Blockly.PHP.ORDER_CAST = 4;
Blockly.PHP.ORDER_SUPPRESS_ERROR = 4;
Blockly.PHP.ORDER_INSTANCEOF = 5;
Blockly.PHP.ORDER_LOGICAL_NOT = 6;
Blockly.PHP.ORDER_UNARY_PLUS = 7.1;
Blockly.PHP.ORDER_UNARY_NEGATION = 7.2;
Blockly.PHP.ORDER_MULTIPLICATION = 8.1;
Blockly.PHP.ORDER_DIVISION = 8.2;
Blockly.PHP.ORDER_MODULUS = 8.3;
Blockly.PHP.ORDER_ADDITION = 9.1;
Blockly.PHP.ORDER_SUBTRACTION = 9.2;
Blockly.PHP.ORDER_STRING_CONCAT = 9.3;
Blockly.PHP.ORDER_BITWISE_SHIFT = 10;
Blockly.PHP.ORDER_RELATIONAL = 11;
Blockly.PHP.ORDER_EQUALITY = 12;
Blockly.PHP.ORDER_REFERENCE = 13;
Blockly.PHP.ORDER_BITWISE_AND = 13;
Blockly.PHP.ORDER_BITWISE_XOR = 14;
Blockly.PHP.ORDER_BITWISE_OR = 15;
Blockly.PHP.ORDER_LOGICAL_AND = 16;
Blockly.PHP.ORDER_LOGICAL_OR = 17;
Blockly.PHP.ORDER_IF_NULL = 18;
Blockly.PHP.ORDER_CONDITIONAL = 19;
Blockly.PHP.ORDER_ASSIGNMENT = 20;
Blockly.PHP.ORDER_LOGICAL_AND_WEAK = 21;
Blockly.PHP.ORDER_LOGICAL_XOR = 22;
Blockly.PHP.ORDER_LOGICAL_OR_WEAK = 23;
Blockly.PHP.ORDER_COMMA = 24;
Blockly.PHP.ORDER_NONE = 99;
Blockly.PHP.ORDER_OVERRIDES = [
[Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_FUNCTION_CALL],
[Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_MEMBER],
[Blockly.PHP.ORDER_LOGICAL_NOT, Blockly.PHP.ORDER_LOGICAL_NOT],
[Blockly.PHP.ORDER_MULTIPLICATION, Blockly.PHP.ORDER_MULTIPLICATION],
[Blockly.PHP.ORDER_ADDITION, Blockly.PHP.ORDER_ADDITION],
[Blockly.PHP.ORDER_LOGICAL_AND, Blockly.PHP.ORDER_LOGICAL_AND],
[Blockly.PHP.ORDER_LOGICAL_OR, Blockly.PHP.ORDER_LOGICAL_OR]
];
Blockly.PHP.init = function(a) {
Blockly.PHP.definitions_ = Object.create(null);
Blockly.PHP.functionNames_ = Object.create(null);
Blockly.PHP.variableDB_ ? Blockly.PHP.variableDB_.reset() : Blockly.PHP.variableDB_ = new Blockly.Names(Blockly.PHP.RESERVED_WORDS_, "$");
var b = [],
c;
a = Blockly.Variables.allVariables(a);
for (var d = 0; c = a[d]; d++) c = c.name, b[d] = Blockly.PHP.variableDB_.getName(c, Blockly.Variables.NAME_TYPE) + ";";
Blockly.PHP.definitions_.variables = b.join("\n")
};
Blockly.PHP.finish = function(a) {
var b = [],
c;
for (c in Blockly.PHP.definitions_) b.push(Blockly.PHP.definitions_[c]);
delete Blockly.PHP.definitions_;
delete Blockly.PHP.functionNames_;
Blockly.PHP.variableDB_.reset();
return b.join("\n\n") + "\n\n\n" + a
};
Blockly.PHP.scrubNakedValue = function(a) {
return a + ";\n"
};
Blockly.PHP.quote_ = function(a) {
a = a.replace(/\\/g, "\\\\").replace(/\n/g, "\\\n").replace(/'/g, "\\'");
return "'" + a + "'"
};
Blockly.PHP.scrub_ = function(a, b) {
var c = "";
if (!a.outputConnection || !a.outputConnection.targetConnection) {
var d = a.getCommentText();
(d = Blockly.utils.wrap(d, Blockly.PHP.COMMENT_WRAP - 3)) && (c += Blockly.PHP.prefixLines(d, "// ") + "\n");
for (var e = 0; e < a.inputList.length; e++) a.inputList[e].type == Blockly.INPUT_VALUE && (d = a.inputList[e].connection.targetBlock()) && (d = Blockly.PHP.allNestedComments(d)) && (c += Blockly.PHP.prefixLines(d, "// "))
}
e = a.nextConnection && a.nextConnection.targetBlock();
e = Blockly.PHP.blockToCode(e);
return c + b + e
};
Blockly.PHP.getAdjusted = function(a, b, c, d, e) {
c = c || 0;
e = e || Blockly.PHP.ORDER_NONE;
a.workspace.options.oneBasedIndex && c--;
var g = a.workspace.options.oneBasedIndex ? "1" : "0";
a = 0 < c ? Blockly.PHP.valueToCode(a, b, Blockly.PHP.ORDER_ADDITION) || g : 0 > c ? Blockly.PHP.valueToCode(a, b, Blockly.PHP.ORDER_SUBTRACTION) || g : d ? Blockly.PHP.valueToCode(a, b, Blockly.PHP.ORDER_UNARY_NEGATION) || g : Blockly.PHP.valueToCode(a, b, e) || g;
if (Blockly.isNumber(a)) a = parseFloat(a) + c, d && (a = -a);
else {
if (0 < c) {
a = a + " + " + c;
var f = Blockly.PHP.ORDER_ADDITION
} else 0 > c &&
(a = a + " - " + -c, f = Blockly.PHP.ORDER_SUBTRACTION);
d && (a = c ? "-(" + a + ")" : "-" + a, f = Blockly.PHP.ORDER_UNARY_NEGATION);
f = Math.floor(f);
e = Math.floor(e);
f && e >= f && (a = "(" + a + ")")
}
return a
};
Blockly.PHP.colour = {};
Blockly.PHP.colour_picker = function(a) {
return ["'" + a.getFieldValue("COLOUR") + "'", Blockly.PHP.ORDER_ATOMIC]
};
Blockly.PHP.colour_random = function(a) {
return [Blockly.PHP.provideFunction_("colour_random", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "() {", " return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);", "}"]) + "()", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.colour_rgb = function(a) {
var b = Blockly.PHP.valueToCode(a, "RED", Blockly.PHP.ORDER_COMMA) || 0,
c = Blockly.PHP.valueToCode(a, "GREEN", Blockly.PHP.ORDER_COMMA) || 0;
a = Blockly.PHP.valueToCode(a, "BLUE", Blockly.PHP.ORDER_COMMA) || 0;
return [Blockly.PHP.provideFunction_("colour_rgb", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($r, $g, $b) {", " $r = round(max(min($r, 100), 0) * 2.55);", " $g = round(max(min($g, 100), 0) * 2.55);", " $b = round(max(min($b, 100), 0) * 2.55);", " $hex = '#';", " $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);",
" $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);", " $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);", " return $hex;", "}"
]) + "(" + b + ", " + c + ", " + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.colour_blend = function(a) {
var b = Blockly.PHP.valueToCode(a, "COLOUR1", Blockly.PHP.ORDER_COMMA) || "'#000000'",
c = Blockly.PHP.valueToCode(a, "COLOUR2", Blockly.PHP.ORDER_COMMA) || "'#000000'";
a = Blockly.PHP.valueToCode(a, "RATIO", Blockly.PHP.ORDER_COMMA) || .5;
return [Blockly.PHP.provideFunction_("colour_blend", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($c1, $c2, $ratio) {", " $ratio = max(min($ratio, 1), 0);", " $r1 = hexdec(substr($c1, 1, 2));", " $g1 = hexdec(substr($c1, 3, 2));", " $b1 = hexdec(substr($c1, 5, 2));",
" $r2 = hexdec(substr($c2, 1, 2));", " $g2 = hexdec(substr($c2, 3, 2));", " $b2 = hexdec(substr($c2, 5, 2));", " $r = round($r1 * (1 - $ratio) + $r2 * $ratio);", " $g = round($g1 * (1 - $ratio) + $g2 * $ratio);", " $b = round($b1 * (1 - $ratio) + $b2 * $ratio);", " $hex = '#';", " $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);", " $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);", " $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);", " return $hex;", "}"
]) + "(" + b + ", " + c + ", " + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists = {};
Blockly.PHP.lists_create_empty = function(a) {
return ["array()", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_create_with = function(a) {
for (var b = Array(a.itemCount_), c = 0; c < a.itemCount_; c++) b[c] = Blockly.PHP.valueToCode(a, "ADD" + c, Blockly.PHP.ORDER_COMMA) || "null";
b = "array(" + b.join(", ") + ")";
return [b, Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_repeat = function(a) {
var b = Blockly.PHP.provideFunction_("lists_repeat", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($value, $count) {", " $array = array();", " for ($index = 0; $index < $count; $index++) {", " $array[] = $value;", " }", " return $array;", "}"]),
c = Blockly.PHP.valueToCode(a, "ITEM", Blockly.PHP.ORDER_COMMA) || "null";
a = Blockly.PHP.valueToCode(a, "NUM", Blockly.PHP.ORDER_COMMA) || "0";
return [b + "(" + c + ", " + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_length = function(a) {
var b = Blockly.PHP.provideFunction_("length", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($value) {", " if (is_string($value)) {", " return strlen($value);", " } else {", " return count($value);", " }", "}"]);
a = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "''";
return [b + "(" + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_isEmpty = function(a) {
return ["empty(" + (Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_FUNCTION_CALL) || "array()") + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_indexOf = function(a) {
var b = Blockly.PHP.valueToCode(a, "FIND", Blockly.PHP.ORDER_NONE) || "''",
c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_MEMBER) || "[]";
if (a.workspace.options.oneBasedIndex) {
var d = " 0";
var e = " + 1"
} else d = " -1", e = "";
return [("FIRST" == a.getFieldValue("END") ? Blockly.PHP.provideFunction_("indexOf", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($haystack, $needle) {", " for ($index = 0; $index < count($haystack); $index++) {", " if ($haystack[$index] == $needle) return $index" +
e + ";", " }", " return " + d + ";", "}"
]) : Blockly.PHP.provideFunction_("lastIndexOf", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($haystack, $needle) {", " $last = " + d + ";", " for ($index = 0; $index < count($haystack); $index++) {", " if ($haystack[$index] == $needle) $last = $index" + e + ";", " }", " return $last;", "}"])) + "(" + c + ", " + b + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_getIndex = function(a) {
var b = a.getFieldValue("MODE") || "GET";
switch (a.getFieldValue("WHERE") || "FROM_START") {
case "FIRST":
if ("GET" == b) {
var c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_MEMBER) || "array()";
return [c + "[0]", Blockly.PHP.ORDER_MEMBER]
}
if ("GET_REMOVE" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "array()", ["array_shift(" + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("REMOVE" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) ||
"array()", "array_shift(" + c + ");\n";
break;
case "LAST":
if ("GET" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "array()", ["end(" + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("GET_REMOVE" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "array()", ["array_pop(" + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("REMOVE" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "array()", "array_pop(" + c + ");\n";
break;
case "FROM_START":
var d = Blockly.PHP.getAdjusted(a,
"AT");
if ("GET" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_MEMBER) || "array()", [c + "[" + d + "]", Blockly.PHP.ORDER_MEMBER];
if ("GET_REMOVE" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_COMMA) || "array()", ["array_splice(" + c + ", " + d + ", 1)[0]", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("REMOVE" == b) return c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_COMMA) || "array()", "array_splice(" + c + ", " + d + ", 1);\n";
break;
case "FROM_END":
if ("GET" == b) return c = Blockly.PHP.valueToCode(a,
"VALUE", Blockly.PHP.ORDER_COMMA) || "array()", d = Blockly.PHP.getAdjusted(a, "AT", 1, !0), ["array_slice(" + c + ", " + d + ", 1)[0]", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("GET_REMOVE" == b || "REMOVE" == b) {
c = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "array()";
d = Blockly.PHP.getAdjusted(a, "AT", 1, !1, Blockly.PHP.ORDER_SUBTRACTION);
c = "array_splice(" + c + ", count(" + c + ") - " + d + ", 1)[0]";
if ("GET_REMOVE" == b) return [c, Blockly.PHP.ORDER_FUNCTION_CALL];
if ("REMOVE" == b) return c + ";\n"
}
break;
case "RANDOM":
c = Blockly.PHP.valueToCode(a,
"VALUE", Blockly.PHP.ORDER_NONE) || "array()";
if ("GET" == b) return b = Blockly.PHP.provideFunction_("lists_get_random_item", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($list) {", " return $list[rand(0,count($list)-1)];", "}"]), [b + "(" + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("GET_REMOVE" == b) return b = Blockly.PHP.provideFunction_("lists_get_remove_random_item", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "(&$list) {", " $x = rand(0,count($list)-1);", " unset($list[$x]);", " return array_values($list);",
"}"
]), [b + "(" + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL];
if ("REMOVE" == b) return b = Blockly.PHP.provideFunction_("lists_remove_random_item", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "(&$list) {", " unset($list[rand(0,count($list)-1)]);", "}"]), b + "(" + c + ");\n"
}
throw "Unhandled combination (lists_getIndex).";
};
Blockly.PHP.lists_setIndex = function(a) {
var b = a.getFieldValue("MODE") || "GET";
var c = a.getFieldValue("WHERE") || "FROM_START";
var d = Blockly.PHP.valueToCode(a, "TO", Blockly.PHP.ORDER_ASSIGNMENT) || "null";
switch (c) {
case "FIRST":
if ("SET" == b) return c = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_MEMBER) || "array()", c + "[0] = " + d + ";\n";
if ("INSERT" == b) return c = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_COMMA) || "array()", "array_unshift(" + c + ", " + d + ");\n";
break;
case "LAST":
c = Blockly.PHP.valueToCode(a,
"LIST", Blockly.PHP.ORDER_COMMA) || "array()";
if ("SET" == b) return b = Blockly.PHP.provideFunction_("lists_set_last_item", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "(&$list, $value) {", " $list[count($list) - 1] = $value;", "}"]), b + "(" + c + ", " + d + ");\n";
if ("INSERT" == b) return "array_push(" + c + ", " + d + ");\n";
break;
case "FROM_START":
var e = Blockly.PHP.getAdjusted(a, "AT");
if ("SET" == b) return c = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_MEMBER) || "array()", c + "[" + e + "] = " + d + ";\n";
if ("INSERT" == b) return c =
Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_COMMA) || "array()", "array_splice(" + c + ", " + e + ", 0, " + d + ");\n";
break;
case "FROM_END":
c = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_COMMA) || "array()";
e = Blockly.PHP.getAdjusted(a, "AT", 1);
if ("SET" == b) return b = Blockly.PHP.provideFunction_("lists_set_from_end", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "(&$list, $at, $value) {", " $list[count($list) - $at] = $value;", "}"]), b + "(" + c + ", " + e + ", " + d + ");\n";
if ("INSERT" == b) return b = Blockly.PHP.provideFunction_("lists_insert_from_end", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "(&$list, $at, $value) {", " return array_splice($list, count($list) - $at, 0, $value);", "}"]), b + "(" + c + ", " + e + ", " + d + ");\n";
break;
case "RANDOM":
c = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_REFERENCE) || "array()";
c.match(/^\$\w+$/) ? a = "" : (a = Blockly.PHP.variableDB_.getDistinctName("tmp_list", Blockly.Variables.NAME_TYPE), e = a + " = &" + c + ";\n", c = a, a = e);
e = Blockly.PHP.variableDB_.getDistinctName("tmp_x", Blockly.Variables.NAME_TYPE);
a += e + " = rand(0, count(" +
c + ")-1);\n";
if ("SET" == b) return a + (c + "[" + e + "] = " + d + ";\n");
if ("INSERT" == b) return a + ("array_splice(" + c + ", " + e + ", 0, " + d + ");\n")
}
throw "Unhandled combination (lists_setIndex).";
};
Blockly.PHP.lists_getSublist = function(a) {
var b = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_COMMA) || "array()";
var c = a.getFieldValue("WHERE1");
var d = a.getFieldValue("WHERE2");
if ("FIRST" == c && "LAST" == d) var e = b;
else if (b.match(/^\$\w+$/) || "FROM_END" != c && "FROM_START" == d) {
switch (c) {
case "FROM_START":
e = Blockly.PHP.getAdjusted(a, "AT1");
break;
case "FROM_END":
e = Blockly.PHP.getAdjusted(a, "AT1", 1, !1, Blockly.PHP.ORDER_SUBTRACTION);
e = "count(" + b + ") - " + e;
break;
case "FIRST":
e = "0";
break;
default:
throw "Unhandled option (lists_getSublist).";
}
switch (d) {
case "FROM_START":
a = Blockly.PHP.getAdjusted(a, "AT2", 0, !1, Blockly.PHP.ORDER_SUBTRACTION);
c = a + " - ";
c = Blockly.isNumber(String(e)) || String(e).match(/^\(.+\)$/) ? c + e : c + ("(" + e + ")");
c += " + 1";
break;
case "FROM_END":
a = Blockly.PHP.getAdjusted(a, "AT2", 0, !1, Blockly.PHP.ORDER_SUBTRACTION);
c = "count(" + b + ") - " + a + " - ";
c = Blockly.isNumber(String(e)) || String(e).match(/^\(.+\)$/) ? c + e : c + ("(" + e + ")");
break;
case "LAST":
c = "count(" + b + ") - ";
c = Blockly.isNumber(String(e)) || String(e).match(/^\(.+\)$/) ? c + e : c + ("(" +
e + ")");
break;
default:
throw "Unhandled option (lists_getSublist).";
}
e = "array_slice(" + b + ", " + e + ", " + c + ")"
} else e = Blockly.PHP.getAdjusted(a, "AT1"), a = Blockly.PHP.getAdjusted(a, "AT2"), e = Blockly.PHP.provideFunction_("lists_get_sublist", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($list, $where1, $at1, $where2, $at2) {", " if ($where1 == 'FROM_END') {", " $at1 = count($list) - 1 - $at1;", " } else if ($where1 == 'FIRST') {", " $at1 = 0;", " } else if ($where1 != 'FROM_START'){", " throw new Exception('Unhandled option (lists_get_sublist).');",
" }", " $length = 0;", " if ($where2 == 'FROM_START') {", " $length = $at2 - $at1 + 1;", " } else if ($where2 == 'FROM_END') {", " $length = count($list) - $at1 - $at2;", " } else if ($where2 == 'LAST') {", " $length = count($list) - $at1;", " } else {", " throw new Exception('Unhandled option (lists_get_sublist).');", " }", " return array_slice($list, $at1, $length);", "}"
]) + "(" + b + ", '" + c + "', " + e + ", '" + d + "', " + a + ")";
return [e, Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_sort = function(a) {
var b = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_COMMA) || "array()",
c = "1" === a.getFieldValue("DIRECTION") ? 1 : -1;
a = a.getFieldValue("TYPE");
return [Blockly.PHP.provideFunction_("lists_sort", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($list, $type, $direction) {", " $sortCmpFuncs = array(", ' "NUMERIC" => "strnatcasecmp",', ' "TEXT" => "strcmp",', ' "IGNORE_CASE" => "strcasecmp"', " );", " $sortCmp = $sortCmpFuncs[$type];", " $list2 = $list;", " usort($list2, $sortCmp);",
" if ($direction == -1) {", " $list2 = array_reverse($list2);", " }", " return $list2;", "}"
]) + "(" + b + ', "' + a + '", ' + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_split = function(a) {
var b = Blockly.PHP.valueToCode(a, "INPUT", Blockly.PHP.ORDER_COMMA),
c = Blockly.PHP.valueToCode(a, "DELIM", Blockly.PHP.ORDER_COMMA) || "''";
a = a.getFieldValue("MODE");
if ("SPLIT" == a) b || (b = "''"), a = "explode";
else if ("JOIN" == a) b || (b = "array()"), a = "implode";
else throw "Unknown mode: " + a;
return [a + "(" + c + ", " + b + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.lists_reverse = function(a) {
return ["array_reverse(" + (Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_COMMA) || "[]") + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.logic = {};
Blockly.PHP.controls_if = function(a) {
var b = 0,
c = "";
do {
var d = Blockly.PHP.valueToCode(a, "IF" + b, Blockly.PHP.ORDER_NONE) || "false";
var e = Blockly.PHP.statementToCode(a, "DO" + b);
c += (0 < b ? " else " : "") + "if (" + d + ") {\n" + e + "}";
++b
} while (a.getInput("IF" + b));
a.getInput("ELSE") && (e = Blockly.PHP.statementToCode(a, "ELSE"), c += " else {\n" + e + "}");
return c + "\n"
};
Blockly.PHP.controls_ifelse = Blockly.PHP.controls_if;
Blockly.PHP.logic_compare = function(a) {
var b = {
EQ: "==",
NEQ: "!=",
LT: "<",
LTE: "<=",
GT: ">",
GTE: ">="
}[a.getFieldValue("OP")],
c = "==" == b || "!=" == b ? Blockly.PHP.ORDER_EQUALITY : Blockly.PHP.ORDER_RELATIONAL,
d = Blockly.PHP.valueToCode(a, "A", c) || "0";
a = Blockly.PHP.valueToCode(a, "B", c) || "0";
return [d + " " + b + " " + a, c]
};
Blockly.PHP.logic_operation = function(a) {
var b = "AND" == a.getFieldValue("OP") ? "&&" : "||",
c = "&&" == b ? Blockly.PHP.ORDER_LOGICAL_AND : Blockly.PHP.ORDER_LOGICAL_OR,
d = Blockly.PHP.valueToCode(a, "A", c);
a = Blockly.PHP.valueToCode(a, "B", c);
if (d || a) {
var e = "&&" == b ? "true" : "false";
d || (d = e);
a || (a = e)
} else a = d = "false";
return [d + " " + b + " " + a, c]
};
Blockly.PHP.logic_negate = function(a) {
var b = Blockly.PHP.ORDER_LOGICAL_NOT;
return ["!" + (Blockly.PHP.valueToCode(a, "BOOL", b) || "true"), b]
};
Blockly.PHP.logic_boolean = function(a) {
return ["TRUE" == a.getFieldValue("BOOL") ? "true" : "false", Blockly.PHP.ORDER_ATOMIC]
};
Blockly.PHP.logic_null = function(a) {
return ["null", Blockly.PHP.ORDER_ATOMIC]
};
Blockly.PHP.logic_ternary = function(a) {
var b = Blockly.PHP.valueToCode(a, "IF", Blockly.PHP.ORDER_CONDITIONAL) || "false",
c = Blockly.PHP.valueToCode(a, "THEN", Blockly.PHP.ORDER_CONDITIONAL) || "null";
a = Blockly.PHP.valueToCode(a, "ELSE", Blockly.PHP.ORDER_CONDITIONAL) || "null";
return [b + " ? " + c + " : " + a, Blockly.PHP.ORDER_CONDITIONAL]
};
Blockly.PHP.loops = {};
Blockly.PHP.controls_repeat_ext = function(a) {
var b = a.getField("TIMES") ? String(Number(a.getFieldValue("TIMES"))) : Blockly.PHP.valueToCode(a, "TIMES", Blockly.PHP.ORDER_ASSIGNMENT) || "0";
var c = Blockly.PHP.statementToCode(a, "DO"),
c = Blockly.PHP.addLoopTrap(c, a.id),
d = "",
e = Blockly.PHP.variableDB_.getDistinctName("count", Blockly.Variables.NAME_TYPE);
a = b;
b.match(/^\w+$/) || Blockly.isNumber(b) || (a = Blockly.PHP.variableDB_.getDistinctName("repeat_end", Blockly.Variables.NAME_TYPE), d += a + " = " + b + ";\n");
return d + ("for (" +
e + " = 0; " + e + " < " + a + "; " + e + "++) {\n" + c + "}\n")
};
Blockly.PHP.controls_repeat = Blockly.PHP.controls_repeat_ext;
Blockly.PHP.controls_whileUntil = function(a) {
var b = "UNTIL" == a.getFieldValue("MODE"),
c = Blockly.PHP.valueToCode(a, "BOOL", b ? Blockly.PHP.ORDER_LOGICAL_NOT : Blockly.PHP.ORDER_NONE) || "false",
d = Blockly.PHP.statementToCode(a, "DO"),
d = Blockly.PHP.addLoopTrap(d, a.id);
b && (c = "!" + c);
return "while (" + c + ") {\n" + d + "}\n"
};
Blockly.PHP.controls_for = function(a) {
var b = Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE);
var c = Blockly.PHP.valueToCode(a, "FROM", Blockly.PHP.ORDER_ASSIGNMENT) || "0";
var d = Blockly.PHP.valueToCode(a, "TO", Blockly.PHP.ORDER_ASSIGNMENT) || "0",
e = Blockly.PHP.valueToCode(a, "BY", Blockly.PHP.ORDER_ASSIGNMENT) || "1",
g = Blockly.PHP.statementToCode(a, "DO"),
g = Blockly.PHP.addLoopTrap(g, a.id);
if (Blockly.isNumber(c) && Blockly.isNumber(d) && Blockly.isNumber(e)) {
var f = parseFloat(c) <= parseFloat(d);
a = "for (" + b + " = " + c + "; " + b + (f ? " <= " : " >= ") + d + "; " + b;
b = Math.abs(parseFloat(e));
a = (1 == b ? a + (f ? "++" : "--") : a + ((f ? " += " : " -= ") + b)) + (") {\n" + g + "}\n")
} else a = "", f = c, c.match(/^\w+$/) || Blockly.isNumber(c) || (f = Blockly.PHP.variableDB_.getDistinctName(b + "_start", Blockly.Variables.NAME_TYPE), a += f + " = " + c + ";\n"), c = d, d.match(/^\w+$/) || Blockly.isNumber(d) || (c = Blockly.PHP.variableDB_.getDistinctName(b + "_end", Blockly.Variables.NAME_TYPE), a += c + " = " + d + ";\n"), d = Blockly.PHP.variableDB_.getDistinctName(b + "_inc", Blockly.Variables.NAME_TYPE),
a += d + " = ", a = Blockly.isNumber(e) ? a + (Math.abs(e) + ";\n") : a + ("abs(" + e + ");\n"), a = a + ("if (" + f + " > " + c + ") {\n") + (Blockly.PHP.INDENT + d + " = -" + d + ";\n"), a += "}\n", a += "for (" + b + " = " + f + "; " + d + " >= 0 ? " + b + " <= " + c + " : " + b + " >= " + c + "; " + b + " += " + d + ") {\n" + g + "}\n";
return a
};
Blockly.PHP.controls_forEach = function(a) {
var b = Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE),
c = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_ASSIGNMENT) || "[]",
d = Blockly.PHP.statementToCode(a, "DO"),
d = Blockly.PHP.addLoopTrap(d, a.id);
return "" + ("foreach (" + c + " as " + b + ") {\n" + d + "}\n")
};
Blockly.PHP.controls_flow_statements = function(a) {
switch (a.getFieldValue("FLOW")) {
case "BREAK":
return "break;\n";
case "CONTINUE":
return "continue;\n"
}
throw "Unknown flow statement.";
};
Blockly.PHP.math = {};
Blockly.PHP.math_number = function(a) {
a = parseFloat(a.getFieldValue("NUM"));
Infinity == a ? a = "INF" : -Infinity == a && (a = "-INF");
return [a, Blockly.PHP.ORDER_ATOMIC]
};
Blockly.PHP.math_arithmetic = function(a) {
var b = {
ADD: [" + ", Blockly.PHP.ORDER_ADDITION],
MINUS: [" - ", Blockly.PHP.ORDER_SUBTRACTION],
MULTIPLY: [" * ", Blockly.PHP.ORDER_MULTIPLICATION],
DIVIDE: [" / ", Blockly.PHP.ORDER_DIVISION],
POWER: [" ** ", Blockly.PHP.ORDER_POWER]
}[a.getFieldValue("OP")],
c = b[0],
b = b[1],
d = Blockly.PHP.valueToCode(a, "A", b) || "0";
a = Blockly.PHP.valueToCode(a, "B", b) || "0";
return [d + c + a, b]
};
Blockly.PHP.math_single = function(a) {
var b = a.getFieldValue("OP");
if ("NEG" == b) return a = Blockly.PHP.valueToCode(a, "NUM", Blockly.PHP.ORDER_UNARY_NEGATION) || "0", "-" == a[0] && (a = " " + a), ["-" + a, Blockly.PHP.ORDER_UNARY_NEGATION];
a = "SIN" == b || "COS" == b || "TAN" == b ? Blockly.PHP.valueToCode(a, "NUM", Blockly.PHP.ORDER_DIVISION) || "0" : Blockly.PHP.valueToCode(a, "NUM", Blockly.PHP.ORDER_NONE) || "0";
switch (b) {
case "ABS":
var c = "abs(" + a + ")";
break;
case "ROOT":
c = "sqrt(" + a + ")";
break;
case "LN":
c = "log(" + a + ")";
break;
case "EXP":
c = "exp(" +
a + ")";
break;
case "POW10":
c = "pow(10," + a + ")";
break;
case "ROUND":
c = "round(" + a + ")";
break;
case "ROUNDUP":
c = "ceil(" + a + ")";
break;
case "ROUNDDOWN":
c = "floor(" + a + ")";
break;
case "SIN":
c = "sin(" + a + " / 180 * pi())";
break;
case "COS":
c = "cos(" + a + " / 180 * pi())";
break;
case "TAN":
c = "tan(" + a + " / 180 * pi())"
}
if (c) return [c, Blockly.PHP.ORDER_FUNCTION_CALL];
switch (b) {
case "LOG10":
c = "log(" + a + ") / log(10)";
break;
case "ASIN":
c = "asin(" + a + ") / pi() * 180";
break;
case "ACOS":
c = "acos(" + a + ") / pi() * 180";
break;
case "ATAN":
c = "atan(" +
a + ") / pi() * 180";
break;
default:
throw "Unknown math operator: " + b;
}
return [c, Blockly.PHP.ORDER_DIVISION]
};
Blockly.PHP.math_constant = function(a) {
return {
PI: ["M_PI", Blockly.PHP.ORDER_ATOMIC],
E: ["M_E", Blockly.PHP.ORDER_ATOMIC],
GOLDEN_RATIO: ["(1 + sqrt(5)) / 2", Blockly.PHP.ORDER_DIVISION],
SQRT2: ["M_SQRT2", Blockly.PHP.ORDER_ATOMIC],
SQRT1_2: ["M_SQRT1_2", Blockly.PHP.ORDER_ATOMIC],
INFINITY: ["INF", Blockly.PHP.ORDER_ATOMIC]
}[a.getFieldValue("CONSTANT")]
};
Blockly.PHP.math_number_property = function(a) {
var b = Blockly.PHP.valueToCode(a, "NUMBER_TO_CHECK", Blockly.PHP.ORDER_MODULUS) || "0",
c = a.getFieldValue("PROPERTY");
if ("PRIME" == c) return [Blockly.PHP.provideFunction_("math_isPrime", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($n) {", " // https://en.wikipedia.org/wiki/Primality_test#Naive_methods", " if ($n == 2 || $n == 3) {", " return true;", " }", " // False if n is NaN, negative, is 1, or not whole.", " // And false if n is divisible by 2 or 3.",
" if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) {", " return false;", " }", " // Check all the numbers of form 6k +/- 1, up to sqrt(n).", " for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {", " if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {", " return false;", " }", " }", " return true;", "}"
]) + "(" + b + ")", Blockly.JavaScript.ORDER_FUNCTION_CALL];
switch (c) {
case "EVEN":
var d = b + " % 2 == 0";
break;
case "ODD":
d = b + " % 2 == 1";
break;
case "WHOLE":
d = "is_int(" + b + ")";
break;
case "POSITIVE":
d =
b + " > 0";
break;
case "NEGATIVE":
d = b + " < 0";
break;
case "DIVISIBLE_BY":
a = Blockly.PHP.valueToCode(a, "DIVISOR", Blockly.PHP.ORDER_MODULUS) || "0", d = b + " % " + a + " == 0"
}
return [d, Blockly.PHP.ORDER_EQUALITY]
};
Blockly.PHP.math_change = function(a) {
var b = Blockly.PHP.valueToCode(a, "DELTA", Blockly.PHP.ORDER_ADDITION) || "0";
return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE) + " += " + b + ";\n"
};
Blockly.PHP.math_round = Blockly.PHP.math_single;
Blockly.PHP.math_trig = Blockly.PHP.math_single;
Blockly.PHP.math_on_list = function(a) {
var b = a.getFieldValue("OP");
switch (b) {
case "SUM":
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_FUNCTION_CALL) || "array()";
a = "array_sum(" + a + ")";
break;
case "MIN":
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_FUNCTION_CALL) || "array()";
a = "min(" + a + ")";
break;
case "MAX":
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_FUNCTION_CALL) || "array()";
a = "max(" + a + ")";
break;
case "AVERAGE":
b = Blockly.PHP.provideFunction_("math_mean", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
"($myList) {", " return array_sum($myList) / count($myList);", "}"
]);
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_NONE) || "array()";
a = b + "(" + a + ")";
break;
case "MEDIAN":
b = Blockly.PHP.provideFunction_("math_median", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($arr) {", " sort($arr,SORT_NUMERIC);", " return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ", " ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;", "}"]);
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_NONE) ||
"[]";
a = b + "(" + a + ")";
break;
case "MODE":
b = Blockly.PHP.provideFunction_("math_modes", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($values) {", " if (empty($values)) return array();", " $counts = array_count_values($values);", " arsort($counts); // Sort counts in descending order", " $modes = array_keys($counts, current($counts), true);", " return $modes;", "}"]);
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_NONE) || "[]";
a = b + "(" + a + ")";
break;
case "STD_DEV":
b = Blockly.PHP.provideFunction_("math_standard_deviation", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($numbers) {", " $n = count($numbers);", " if (!$n) return null;", " $mean = array_sum($numbers) / count($numbers);", " foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);", " return sqrt(array_sum($devs) / (count($devs) - 1));", "}"]);
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_NONE) || "[]";
a = b + "(" + a + ")";
break;
case "RANDOM":
b = Blockly.PHP.provideFunction_("math_random_list", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
"($list) {", " $x = rand(0, count($list)-1);", " return $list[$x];", "}"
]);
a = Blockly.PHP.valueToCode(a, "LIST", Blockly.PHP.ORDER_NONE) || "[]";
a = b + "(" + a + ")";
break;
default:
throw "Unknown operator: " + b;
}
return [a, Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.math_modulo = function(a) {
var b = Blockly.PHP.valueToCode(a, "DIVIDEND", Blockly.PHP.ORDER_MODULUS) || "0";
a = Blockly.PHP.valueToCode(a, "DIVISOR", Blockly.PHP.ORDER_MODULUS) || "0";
return [b + " % " + a, Blockly.PHP.ORDER_MODULUS]
};
Blockly.PHP.math_constrain = function(a) {
var b = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_COMMA) || "0",
c = Blockly.PHP.valueToCode(a, "LOW", Blockly.PHP.ORDER_COMMA) || "0";
a = Blockly.PHP.valueToCode(a, "HIGH", Blockly.PHP.ORDER_COMMA) || "Infinity";
return ["min(max(" + b + ", " + c + "), " + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.math_random_int = function(a) {
var b = Blockly.PHP.valueToCode(a, "FROM", Blockly.PHP.ORDER_COMMA) || "0";
a = Blockly.PHP.valueToCode(a, "TO", Blockly.PHP.ORDER_COMMA) || "0";
return [Blockly.PHP.provideFunction_("math_random_int", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($a, $b) {", " if ($a > $b) {", " return rand($b, $a);", " }", " return rand($a, $b);", "}"]) + "(" + b + ", " + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.math_random_float = function(a) {
return ["(float)rand()/(float)getrandmax()", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.procedures = {};
Blockly.PHP.procedures_defreturn = function(a) {
for (var b = [], c, d = a.workspace.getAllVariables() || [], e = 0; c = d[e]; e++) c = c.name, -1 == a.arguments_.indexOf(c) && b.push(Blockly.PHP.variableDB_.getName(c, Blockly.Variables.NAME_TYPE));
b = b.length ? " global " + b.join(", ") + ";\n" : "";
d = Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"), Blockly.Procedures.NAME_TYPE);
c = Blockly.PHP.statementToCode(a, "STACK");
Blockly.PHP.STATEMENT_PREFIX && (c = Blockly.PHP.prefixLines(Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g, "'" + a.id +
"'"), Blockly.PHP.INDENT) + c);
Blockly.PHP.INFINITE_LOOP_TRAP && (c = Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g, "'" + a.id + "'") + c);
var g = Blockly.PHP.valueToCode(a, "RETURN", Blockly.PHP.ORDER_NONE) || "";
g && (g = " return " + g + ";\n");
for (var f = [], e = 0; e < a.arguments_.length; e++) f[e] = Blockly.PHP.variableDB_.getName(a.arguments_[e], Blockly.Variables.NAME_TYPE);
b = "function " + d + "(" + f.join(", ") + ") {\n" + b + c + g + "}";
b = Blockly.PHP.scrub_(a, b);
Blockly.PHP.definitions_["%" + d] = b;
return null
};
Blockly.PHP.procedures_defnoreturn = Blockly.PHP.procedures_defreturn;
Blockly.PHP.procedures_callreturn = function(a) {
for (var b = Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"), Blockly.Procedures.NAME_TYPE), c = [], d = 0; d < a.arguments_.length; d++) c[d] = Blockly.PHP.valueToCode(a, "ARG" + d, Blockly.PHP.ORDER_COMMA) || "null";
return [b + "(" + c.join(", ") + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.procedures_callnoreturn = function(a) {
for (var b = Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"), Blockly.Procedures.NAME_TYPE), c = [], d = 0; d < a.arguments_.length; d++) c[d] = Blockly.PHP.valueToCode(a, "ARG" + d, Blockly.PHP.ORDER_COMMA) || "null";
return b + "(" + c.join(", ") + ");\n"
};
Blockly.PHP.procedures_ifreturn = function(a) {
var b = "if (" + (Blockly.PHP.valueToCode(a, "CONDITION", Blockly.PHP.ORDER_NONE) || "false") + ") {\n";
a.hasReturnValue_ ? (a = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "null", b += " return " + a + ";\n") : b += " return;\n";
return b + "}\n"
};
Blockly.PHP.texts = {};
Blockly.PHP.text = function(a) {
return [Blockly.PHP.quote_(a.getFieldValue("TEXT")), Blockly.PHP.ORDER_ATOMIC]
};
Blockly.PHP.text_join = function(a) {
if (0 == a.itemCount_) return ["''", Blockly.PHP.ORDER_ATOMIC];
if (1 == a.itemCount_) return [Blockly.PHP.valueToCode(a, "ADD0", Blockly.PHP.ORDER_NONE) || "''", Blockly.PHP.ORDER_FUNCTION_CALL];
if (2 == a.itemCount_) {
var b = Blockly.PHP.valueToCode(a, "ADD0", Blockly.PHP.ORDER_NONE) || "''";
a = Blockly.PHP.valueToCode(a, "ADD1", Blockly.PHP.ORDER_NONE) || "''";
return [b + " . " + a, Blockly.PHP.ORDER_ADDITION]
}
for (var b = Array(a.itemCount_), c = 0; c < a.itemCount_; c++) b[c] = Blockly.PHP.valueToCode(a, "ADD" +
c, Blockly.PHP.ORDER_COMMA) || "''";
return ["implode('', array(" + b.join(",") + "))", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_append = function(a) {
var b = Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE);
a = Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_ASSIGNMENT) || "''";
return b + " .= " + a + ";\n"
};
Blockly.PHP.text_length = function(a) {
var b = Blockly.PHP.provideFunction_("length", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($value) {", " if (is_string($value)) {", " return strlen($value);", " } else {", " return count($value);", " }", "}"]);
a = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "''";
return [b + "(" + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_isEmpty = function(a) {
return ["empty(" + (Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "''") + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_indexOf = function(a) {
var b = "FIRST" == a.getFieldValue("END") ? "strpos" : "strrpos",
c = Blockly.PHP.valueToCode(a, "FIND", Blockly.PHP.ORDER_NONE) || "''",
d = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_NONE) || "''";
if (a.workspace.options.oneBasedIndex) {
var e = " 0";
var g = " + 1"
} else e = " -1", g = "";
return [Blockly.PHP.provideFunction_("FIRST" == a.getFieldValue("END") ? "text_indexOf" : "text_lastIndexOf", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($text, $search) {", " $pos = " + b + "($text, $search);",
" return $pos === false ? " + e + " : $pos" + g + ";", "}"
]) + "(" + d + ", " + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_charAt = function(a) {
var b = a.getFieldValue("WHERE") || "FROM_START",
c = Blockly.PHP.valueToCode(a, "VALUE", "RANDOM" == b ? Blockly.PHP.ORDER_NONE : Blockly.PHP.ORDER_COMMA) || "''";
switch (b) {
case "FIRST":
return ["substr(" + c + ", 0, 1)", Blockly.PHP.ORDER_FUNCTION_CALL];
case "LAST":
return ["substr(" + c + ", -1)", Blockly.PHP.ORDER_FUNCTION_CALL];
case "FROM_START":
return a = Blockly.PHP.getAdjusted(a, "AT"), ["substr(" + c + ", " + a + ", 1)", Blockly.PHP.ORDER_FUNCTION_CALL];
case "FROM_END":
return a = Blockly.PHP.getAdjusted(a,
"AT", 1, !0), ["substr(" + c + ", " + a + ", 1)", Blockly.PHP.ORDER_FUNCTION_CALL];
case "RANDOM":
return [Blockly.PHP.provideFunction_("text_random_letter", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($text) {", " return $text[rand(0, strlen($text) - 1)];", "}"]) + "(" + c + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
}
throw "Unhandled option (text_charAt).";
};
Blockly.PHP.text_getSubstring = function(a) {
var b = Blockly.PHP.valueToCode(a, "STRING", Blockly.PHP.ORDER_FUNCTION_CALL) || "''";
var c = a.getFieldValue("WHERE1"),
d = a.getFieldValue("WHERE2");
if ("FIRST" != c || "LAST" != d) {
var e = Blockly.PHP.getAdjusted(a, "AT1");
a = Blockly.PHP.getAdjusted(a, "AT2");
b = Blockly.PHP.provideFunction_("text_get_substring", ["function " + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + "($text, $where1, $at1, $where2, $at2) {", " if ($where1 == 'FROM_END') {", " $at1 = strlen($text) - 1 - $at1;", " } else if ($where1 == 'FIRST') {",
" $at1 = 0;", " } else if ($where1 != 'FROM_START'){", " throw new Exception('Unhandled option (text_get_substring).');", " }", " $length = 0;", " if ($where2 == 'FROM_START') {", " $length = $at2 - $at1 + 1;", " } else if ($where2 == 'FROM_END') {", " $length = strlen($text) - $at1 - $at2;", " } else if ($where2 == 'LAST') {", " $length = strlen($text) - $at1;", " } else {", " throw new Exception('Unhandled option (text_get_substring).');", " }", " return substr($text, $at1, $length);",
"}"
]) + "(" + b + ", '" + c + "', " + e + ", '" + d + "', " + a + ")"
}
return [b, Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_changeCase = function(a) {
var b, c = Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_NONE) || "''";
"UPPERCASE" == a.getFieldValue("CASE") ? b = "strtoupper(" + c + ")" : "LOWERCASE" == a.getFieldValue("CASE") ? b = "strtolower(" + c + ")" : "TITLECASE" == a.getFieldValue("CASE") && (b = "ucwords(strtolower(" + c + "))");
return [b, Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_trim = function(a) {
var b = {
LEFT: "ltrim",
RIGHT: "rtrim",
BOTH: "trim"
}[a.getFieldValue("MODE")];
a = Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_NONE) || "''";
return [b + "(" + a + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_print = function(a) {
return "print(" + (Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_NONE) || "''") + ");\n"
};
Blockly.PHP.text_prompt_ext = function(a) {
var b = "readline(" + (a.getField("TEXT") ? Blockly.PHP.quote_(a.getFieldValue("TEXT")) : Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_NONE) || "''") + ")";
"NUMBER" == a.getFieldValue("TYPE") && (b = "floatval(" + b + ")");
return [b, Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_prompt = Blockly.PHP.text_prompt_ext;
Blockly.PHP.text_count = function(a) {
var b = Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_MEMBER) || "''";
a = Blockly.PHP.valueToCode(a, "SUB", Blockly.PHP.ORDER_NONE) || "''";
return ["strlen(" + a + ") === 0 ? strlen(" + b + ") + 1 : substr_count(" + b + ", " + a + ")", Blockly.PHP.ORDER_CONDITIONAL]
};
Blockly.PHP.text_replace = function(a) {
var b = Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_MEMBER) || "''",
c = Blockly.PHP.valueToCode(a, "FROM", Blockly.PHP.ORDER_NONE) || "''";
a = Blockly.PHP.valueToCode(a, "TO", Blockly.PHP.ORDER_NONE) || "''";
return ["str_replace(" + c + ", " + a + ", " + b + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.text_reverse = function(a) {
return ["strrev(" + (Blockly.PHP.valueToCode(a, "TEXT", Blockly.PHP.ORDER_MEMBER) || "''") + ")", Blockly.PHP.ORDER_FUNCTION_CALL]
};
Blockly.PHP.variables = {};
Blockly.PHP.variables_get = function(a) {
return [Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE), Blockly.PHP.ORDER_ATOMIC]
};
Blockly.PHP.variables_set = function(a) {
var b = Blockly.PHP.valueToCode(a, "VALUE", Blockly.PHP.ORDER_ASSIGNMENT) || "0";
return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE) + " = " + b + ";\n"
};