Permalink
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Dec 20, 2018
Dec 20, 2018
Dec 20, 2018
Mar 19, 2018
Jan 14, 2015
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Jan 14, 2015
Mar 19, 2018
Jan 14, 2015
Jan 14, 2015
Jan 14, 2015
Mar 19, 2018
Jan 14, 2015
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Jan 14, 2015
Mar 19, 2018
Jan 14, 2015
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Jan 14, 2015
Jan 14, 2015
Mar 19, 2018
Mar 19, 2018
Jan 14, 2015
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Feb 9, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Aug 31, 2017
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Aug 31, 2017
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Nov 12, 2018
Nov 12, 2018
Nov 12, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Aug 31, 2017
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Jan 6, 2016
Mar 19, 2018
Mar 19, 2018
Dec 10, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Aug 31, 2017
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Aug 31, 2017
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Nov 14, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Jul 28, 2018
Nov 2, 2018
Nov 2, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Nov 12, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Mar 19, 2018
Jun 29, 2017
Jun 29, 2017
Jun 29, 2017
Jun 29, 2017
Jul 10, 2017
Jul 10, 2017
Mar 19, 2018
Mar 19, 2018
Newer
100644
2084 lines (1913 sloc)
66.1 KB
7
// Polyfill for older browsers
8
// The code does not use a regex to make it a bit faster.
9
// Implementation taken from a comment by Timo on the blog:
10
// http://blog.stevenlevithan.com/archives/faster-trim-javascript
11
String.prototype.trim = function () {
12
var c
13
for(var i = 0; i < this.length; i++){
14
c = this.charCodeAt(i)
15
if([32, 10, 13, 9, 12, 11, 160, 5760, 6158, 8192, 8193, 8194,
16
8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8232,
17
8233, 8239, 8287, 12288, 65279].indexOf(c) > -1){
18
continue
19
}else{break}
20
}
21
for(var j = this.length - 1; j >= i; j--){
22
c = this.charCodeAt(j)
24
8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8232,
25
8233, 8239, 8287, 12288, 65279].indexOf(c) > -1){
26
continue
27
}else{break}
28
}
29
return this.substring(i, j + 1);
30
}
33
// Convenience method for browsers which do not have a native trimLeft
34
// (which is a nonstandard extension in Firefox and Chrome)
35
String.prototype.trimLeft = function () {
36
var c
37
for(var i = 0; i < this.length; i++){
38
c = this.charCodeAt(i)
40
8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8232,
41
8233, 8239, 8287, 12288, 65279].indexOf(c) > -1){
42
continue
43
}else{break}
44
}
45
return this.substring(i)
49
String.prototype.trimRight = function () {
50
// Convenience method for browsers which do not have a native trimRight
51
// (which is a nonstandard extension in Firefox and Chrome)
52
var c
53
for(var j = this.length - 1; j >= 0; j--){
54
c = this.charCodeAt(j)
55
if([32, 10, 13, 9, 12, 11, 160, 5760, 6158, 8192, 8193, 8194,
56
8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8232,
57
8233, 8239, 8287, 12288, 65279].indexOf(c) > -1){
58
continue
59
}else{break}
60
}
61
return this.substring(0, j + 1)
76
if($.start === null || $.start === _b_.None){$.start = 0}
77
else if($.start < 0){
78
$.start += $.self.length
79
$.start = Math.max(0, $.start)
80
}
81
if($.end === null || $.end === _b_.None){$.end = $.self.length}
82
else if($.end < 0){
83
$.end += $.self.length
84
$.end = Math.max(0, $.end)
85
}
87
if(! isinstance($.start, _b_.int) || ! isinstance($.end, _b_.int)){
88
throw _b_.TypeError.$factory("slice indices must be integers " +
89
"or None or have an __index__ method")
90
}
107
if(!(typeof other === "string")){
108
try{return getattr(other, "__radd__")(self)}
109
catch(err){
110
throw _b_.TypeError.$factory("Can't convert " +
116
str.__contains__ = function(self, item){
117
if(!(typeof item == "string")){
118
throw _b_.TypeError.$factory("'in <string>' requires " +
119
"string as left operand, not " + item.__class__)
120
}
122
if(nbcar == 0) {return true} // a string contains the empty string
123
if(self.length == 0){return nbcar == 0}
124
for(var i = 0, len = self.length; i < len; i++){
125
if(self.substr(i, nbcar) == item){return true}
134
// __dir__must be assigned explicitely because attribute resolution for
135
// builtin classes doesn't use __mro__
139
if(other === undefined){ // compare object "self" to class "str"
140
return self === str
150
if(fmt.type && fmt.type != "s"){
151
throw _b_.ValueError.$factory("Unknown format code '" + fmt.type +
159
if(fmt.sign !== undefined){
160
throw _b_.ValueError.$factory(
161
"Sign not allowed in string format specifier")
171
if(arg < 0) {pos += self.length}
172
if(pos >= 0 && pos < self.length){return self.charAt(pos)}
173
throw _b_.IndexError.$factory("string index out of range")
174
}
175
if(isinstance(arg, slice)) {
176
var s = _b_.slice.$conv_for_seq(arg, self.length),
177
start = s.start,
178
stop = s.stop,
179
step = s.step
180
var res = "",
182
if(step > 0){
183
if(stop <= start){return ""}
184
for(var i = start; i < stop; i += step){res += self.charAt(i)}
186
if(stop >= start){return ''}
187
for(var i = start; i > stop; i += step){res += self.charAt(i)}
195
var prefix = 2,
196
suffix = 3,
197
mask = (2 ** 32 - 1)
198
function fnv(p){
199
if(p.length == 0){
200
return 0
201
}
203
var x = prefix
204
x = (x ^ (p.charCodeAt(0) << 7)) & mask
205
for(var i = 0, len = p.length; i < len; i++){
206
x = ((1000003 * x) ^ p.charCodeAt(i)) & mask
207
}
208
x = (x ^ p.length) & mask
209
x = (x ^ suffix) & mask
211
if(x == -1){
212
x = -2
213
}
214
return x
215
}
216
217
str.__hash__ = function(self) {
218
return fnv(self)
229
var items = self.split("") // list of all characters in string
230
return $B.$iterator(items, $str_iterator)
267
// left adjusted
268
return s + get_char_array(padding - s.length, flags.pad_char)
269
}
270
}
271
279
if(val.__class__ === $B.long_int){
280
s = $B.long_int.to_base(val, 10)
281
}else{
282
s = val.toString()
284
if(s[0] === "-"){
285
return "-" + get_char_array(precision - s.length + 1, "0") + s.slice(1)
296
if(val === Infinity){
297
val = "inf"
298
}else if(val === -Infinity){
299
val = "-inf"
300
}else{
301
val = "nan"
323
var str_format = function(val, flags) {
324
// string format supports left and right padding
325
flags.pad_char = " " // even if 0 padding is defined, don't use it
331
if(val.__class__ === $B.long_int){
332
val = $B.long_int.to_base(val, 10)
333
}else{
334
val = parseInt(val)
352
var repr_format = function(val, flags) {
353
flags.pad_char = " " // even if 0 padding is defined, don't use it
354
return format_padding(repr(val), flags)
355
}
357
var ascii_format = function(val, flags) {
358
flags.pad_char = " " // even if 0 padding is defined, don't use it
359
return format_padding(ascii(val), flags)
360
}
372
flags.precision = parseInt(flags.precision, 10)
373
validate_precision(flags.precision)
374
}
375
return parseFloat(val)
376
}
379
var trailing_zeros = /(.*?)(0+)([eE].*)/,
380
leading_zeros = /\.(0*)/,
381
trailing_dot = /\.$/
383
var validate_precision = function(precision) {
384
// force precision to limits of javascript
389
var floating_point_format = function(val, upper, flags){
390
val = _float_helper(val, flags),
391
v = val.toString(),
392
v_len = v.length,
393
dot_idx = v.indexOf('.')
394
if(dot_idx < 0){dot_idx = v_len}
395
if(val < 1 && val > -1){
396
var zeros = leading_zeros.exec(v),
397
numzeros
398
if(zeros){
403
if(numzeros >= 4){
404
val = format_sign(val, flags) + format_float_precision(val, upper,
405
flags, _floating_g_exp_helper)
406
if(!flags.alternate){
419
return format_padding(format_sign(val, flags) +
420
format_float_precision(val, upper, flags,
421
function(val, precision) {
422
return val.toFixed(min(precision, v_len - dot_idx) +
423
numzeros)
424
}),
425
flags
426
)
427
}
428
429
if(dot_idx > flags.precision){
430
val = format_sign(val, flags) + format_float_precision(val, upper,
431
flags, _floating_g_exp_helper)
432
if(! flags.alternate){
444
return format_padding(format_sign(val, flags) +
445
format_float_precision(val, upper, flags,
446
function(val, precision) {
447
if(!flags.decimal_point){
448
precision = min(v_len - 1, 6)
449
}else if (precision > v_len){
450
if(! flags.alternate){
451
precision = v_len
452
}
454
if(precision < dot_idx){
455
precision = dot_idx
456
}
457
return val.toFixed(precision - dot_idx)
458
}),
459
flags
460
)
463
var _floating_g_exp_helper = function(val, precision, flags, upper){
464
if(precision){--precision}
467
var e_idx = val.lastIndexOf("e")
468
if(e_idx > val.length - 4){
469
val = val.substring(0, e_idx + 2) + "0" + val.substring(e_idx + 2)
472
return val
473
}
474
475
// fF
476
var floating_point_decimal_format = function(val, upper, flags) {
477
val = _float_helper(val, flags)
478
return format_padding(format_sign(val, flags) +
479
format_float_precision(val, upper, flags,
480
function(val, precision, flags) {
481
val = val.toFixed(precision)
482
if(precision === 0 && flags.alternate){
483
val += '.'
484
}
485
return val
486
}),
487
flags
488
)
489
}
490
491
var _floating_exp_helper = function(val, precision, flags, upper) {
492
val = val.toExponential(precision)
493
// pad exponent to two digits
506
return format_padding(format_sign(val, flags) +
507
format_float_precision(val, upper, flags, _floating_exp_helper), flags)
533
if(flags.alternate){
534
if(ret.charAt(0) === "-"){
535
if(upper){ret = "-0X" + ret.slice(1)}
536
else{ret = "-0x" + ret.slice(1)}
537
}else{
538
if(upper){ret = "0X" + ret}
539
else{ret = "0x" + ret}
549
if(val.__class__ === $B.long_int){
550
ret = $B.long_int.to_base(8)
551
}else{
552
ret = parseInt(val)
553
ret = ret.toString(8)
569
if(flags.alternate){
570
if(ret.charAt(0) === "-"){ret = "-0o" + ret.slice(1)}
571
else{ret = "0o" + ret}
576
var single_char_format = function(val, flags){
577
if(isinstance(val, str) && val.length == 1) return val
578
try{
586
var num_flag = function(c, flags){
587
if(c === "0" && ! flags.padding && ! flags.decimal_point && ! flags.left){
588
flags.pad_char = "0"
594
flags.precision = (flags.precision || "") + c
595
}
596
}
597
598
var decimal_point_flag = function(val, flags) {
600
// can only have one decimal point
601
throw new UnsupportedChar()
602
}
603
flags.decimal_point = true
604
}
605
606
var neg_flag = function(val, flags){
607
flags.pad_char = " " // overrides '0' flag
624
"s": str_format,
625
"d": num_format,
626
"i": num_format,
627
"u": num_format,
628
"o": octal_format,
629
"r": repr_format,
630
"a": ascii_format,
631
"g": function(val, flags){
632
return floating_point_format(val, false, flags)
633
},
634
"G": function(val, flags){return floating_point_format(val, true, flags)},
635
"f": function(val, flags){
636
return floating_point_decimal_format(val, false, flags)
637
},
638
"F": function(val, flags){
639
return floating_point_decimal_format(val, true, flags)
640
},
641
"e": function(val, flags){
642
return floating_point_exponential_format(val, false, flags)
643
},
644
"E": function(val, flags){
645
return floating_point_exponential_format(val, true, flags)
646
},
647
"x": function(val, flags){return signed_hex_format(val, false, flags)},
648
"X": function(val, flags){return signed_hex_format(val, true, flags)},
649
"c": single_char_format,
650
"0": function(val, flags){return num_flag("0", flags)},
651
"1": function(val, flags){return num_flag("1", flags)},
652
"2": function(val, flags){return num_flag("2", flags)},
653
"3": function(val, flags){return num_flag("3", flags)},
654
"4": function(val, flags){return num_flag("4", flags)},
655
"5": function(val, flags){return num_flag("5", flags)},
656
"6": function(val, flags){return num_flag("6", flags)},
657
"7": function(val, flags){return num_flag("7", flags)},
658
"8": function(val, flags){return num_flag("8", flags)},
659
"9": function(val, flags){return num_flag("9", flags)},
660
"-": neg_flag,
661
" ": space_flag,
662
"+": sign_flag,
663
".": decimal_point_flag,
664
"#": alternate_flag
665
}
666
667
// exception thrown when an unsupported char is encountered in legacy format
714
if(self === undefined){
715
throw _b_.TypeError.$factory(
716
"not enough arguments for format string")
743
throw _b_.ValueError.$factory(
744
"unsupported format character '" + invalid_char +
745
"' (0x" + invalid_char.charCodeAt(0).toString(16) +
746
") at index " + newpos)
747
}else if(err.name === "NotANumber"){
748
var try_char = s[newpos],
749
cls = self.__class__
750
if(!cls){
751
if(typeof(self) === "string"){
752
cls = "str"
753
}else{
759
throw _b_.TypeError.$factory("%" + try_char +
760
" format: a number is required, not " + cls)
761
}else{
793
}while(pos < length)
794
795
if(argpos !== null){
796
if(args.length > argpos){
797
throw _b_.TypeError.$factory(
798
"not enough arguments for format string")
799
}else if(args.length < argpos){
800
throw _b_.TypeError.$factory(
801
"not all arguments converted during string formatting")
803
}else if(nbph == 0){
804
throw _b_.TypeError.$factory(
805
"not all arguments converted during string formatting")
813
var $ = $B.args("__mul__", 2, {self: null, other: null},
814
["self", "other"], arguments, {}, null, null)
815
if(! isinstance($.other, _b_.int)){throw _b_.TypeError.$factory(
816
"Can't multiply sequence by non-int of type '" +
817
$B.get_class($.other).__name__ + "'")}
818
var $res = ""
819
for(var i = 0; i< $.other; i++){$res += $.self.valueOf()}
828
res = self.replace(/\\/g, "\\\\")
829
// special cases
830
res = res.replace(new RegExp("\u0007", "g"), "\\x07").
831
replace(new RegExp("\b", "g"), "\\x08").
832
replace(new RegExp("\f", "g"), "\\x0c").
833
replace(new RegExp("\n", "g"), "\\n").
834
replace(new RegExp("\r", "g"), "\\r").
835
replace(new RegExp("\t", "g"), "\\t")
836
if(res.search('"') == -1 && res.search("'") == -1){
837
return "'" + res + "'"
838
}else if(self.search('"') == -1){
839
return '"' + res + '"'
840
}
841
var qesc = new RegExp("'", "g") // to escape single quote
842
res = "'" + res.replace(qesc, "\\'") + "'"
846
str.__setitem__ = function(self, attr, value){
847
throw _b_.TypeError.$factory(
848
"'str' object does not support item assignment")
858
if(typeof other !== "string"){throw _b_.TypeError.$factory(
859
"unorderable types: 'str' > " + $B.get_class(other).__name__ + "()")}
862
$comp_func += "" // source code
863
var $comps = {">": "gt", ">=": "ge", "<": "lt", "<=": "le"}
872
var $notimplemented = function(self, other){
873
throw NotImplementedError.$factory(
874
"OPERATOR not implemented for class str")
877
// Copy static methods from unicode
878
var from_unicode = [
879
"title",
880
"capitalize",
881
"casefold",
882
"islower",
883
"isupper",
884
"istitle",
885
"isspace",
886
"isalpha",
887
"isalnum",
888
"isdecimal",
889
"isdigit",
890
"isnumeric",
891
"isidentifier",
892
"isprintable",
893
"lower",
894
"swapcase",
895
"upper"
896
]
902
str.center = function(){
903
var $ = $B.args("center", 3, {self: null, width: null, fillchar: null},
904
["self", "width", "fillchar"],
905
arguments, {fillchar:" "}, null, null),
906
self = $.self
918
var $ = $B.args("count", 4, {self:null, sub:null, start:null, stop:null},
919
["self", "sub", "start", "stop"], arguments, {start:null, stop:null},
921
if(!(typeof $.sub == "string")){throw _b_.TypeError.$factory(
922
"Can't convert '" + $B.get_class($.sub).__name__ +
923
"' object to str implicitly")}
927
if($.stop !== null){_slice = _b_.slice.$factory($.start, $.stop)}
928
else{_slice = _b_.slice.$factory($.start, $.self.length)}
933
if($.sub.length == 0){
934
if($.start == $.self.length){return 1}
935
else if(substr.length == 0){return 0}
936
return substr.length + 1
938
var n = 0,
939
pos = 0
940
while(pos < substr.length){
941
pos = substr.indexOf($.sub, pos)
942
if(pos >= 0){n++; pos += $.sub.length}
943
else{break}
955
if(("a" <= char && char <= "m") || ("A" <= char && char <= "M")){
956
res += String.fromCharCode(String.charCodeAt(char) + 13)
957
}else if(("m" < char && char <= "z") ||
958
("M" < char && char <= "Z")){
959
res += String.fromCharCode(String.charCodeAt(char) - 13)
968
// Return True if the string ends with the specified suffix, otherwise
969
// return False. suffix can also be a tuple of suffixes to look for.
970
// With optional start, test beginning at that position. With optional
974
["self", "suffix", "start", "end"],
975
arguments, {start: 0, end: null}, null, null)
982
var s = $.self.substring($.start, $.end)
983
for(var i = 0, len = suffixes.length; i < len; i++){
987
if(suffix.length <= s.length &&
988
s.substr(s.length - suffix.length) == suffix){return true}
994
var $ = $B.args("expandtabs", 2, {self: null, tabsize: null},
995
["self", "tabsize"], arguments, {tabsize: 8}, null, null)
996
var s = $B.$GetInt($.tabsize),
997
col = 0,
998
pos = 0,
999
res = ""
1000
if(s == 1){return self.replace(/\t/g," ")}
1001
while(pos < self.length){
1009
res += car
1010
col = 0
1011
break
1012
default:
1013
res += car
1014
col++
1015
break
1016
}
1017
pos++
1018
}
1024
// Return the lowest index in the string where substring sub is found,
1025
// such that sub is contained in the slice s[start:end]. Optional
1026
// arguments start and end are interpreted as in slice notation.
1029
{self: null, sub: null, start: null, end: null},
1030
["self", "sub", "start", "end"],
1031
arguments, {start: 0, end: null}, null, null)
1035
if(!isinstance($.start, _b_.int)||!isinstance($.end, _b_.int)){
1036
throw _b_.TypeError.$factory("slice indices must be " +
1037
"integers or None or have an __index__ method")}
1038
var s = $.self.substring($.start, $.end)
1040
if($.sub.length == 0 && $.start == $.self.length){return $.self.length}
1041
if(s.length + $.sub.length == 0){return -1}
1043
var last_search = s.length - $.sub.length
1044
for(var i = 0; i <= last_search; i++){
1045
if(s.substr(i, $.sub.length) == $.sub){return $.start + i}
1056
// a.x[z]!r:...
1057
// the object has attributes :
1058
// - name : "a"
1059
// - name_ext : [".x", "[z]"]
1060
// - conv : r
1061
// - spec : rest of string after :
1069
// No : in the string : it only contains a name
1070
name = fmt_string
1071
}else{
1072
// name is before the first ":"
1073
// spec (the format specification) is after
1074
name = elts[0]
1078
var elts = name.split("!")
1079
if(elts.length > 1){
1080
name = elts[0]
1081
conv = elts[1] // conversion flag
1085
// "name' may be a subscription or attribute
1086
// Put these "extensions" in the list "name_ext"
1087
function name_repl(match){
1088
name_ext.push(match)
1090
}
1091
var name_ext_re = /\.[_a-zA-Z][_a-zA-Z0-9]*|\[[_a-zA-Z][_a-zA-Z0-9]*\]|\[[0-9]+\]/g
1092
name = name.replace(name_ext_re, name_repl)
1093
}
1100
// Parse self to detect formatting instructions
1101
// Create a list "parts" made of sections of the string :
1102
// - elements of even rank are literal text
1103
// - elements of odd rank are "format objects", built from the
1104
// format strings in self (of the form {...})
1115
text += "{"
1116
pos += 2
1117
}else if(car == "}" && self.charAt(pos + 1) == "}"){
1124
// Store current literal text
1125
parts.push(text)
1126
1127
// Search the end of the format string, ie the } closing the
1128
// opening {. Since the string can contain other pairs {} for
1129
// nested formatting, an integer nb is incremented for each { and
1130
// decremented for each } ; the end of the format string is
1131
// reached when nb == 0
1132
var end = pos + 1,
1133
nb = 1
1134
while(end < _len){
1135
if(self.charAt(end) == "{"){nb++; end++}
1136
else if(self.charAt(end) == "}"){
1137
nb--; end++
1138
if(nb == 0){
1143
var fmt_obj = $B.parse_format(fmt_string)
1144
fmt_obj.raw_name = fmt_obj.name
1145
fmt_obj.raw_spec = fmt_obj.spec
1180
return parts
1181
}
1182
1183
str.format = function(self) {
1184
var $ = $B.args("format", 1, {self: null}, ["self"],
1185
arguments, {}, "$args", "$kw")
1186
1187
var parts = $B.split_format($.self)
1188
1199
1200
if(fmt.spec !== undefined){
1201
// "spec" may contain "nested replacement fields"
1202
// In this case, evaluate them using the positional
1203
// or keyword arguments passed to format()
1204
function replace_nested(name, key){
1205
if(/\d+/.exec(key)){
1206
// If key is numeric, search in positional
1207
// arguments
1208
return _b_.tuple.__getitem__($.$args,
1209
parseInt(key))
1210
}else{
1211
// Else try in keyword arguments
1212
return _b_.dict.__getitem__($.$kw, key)
1213
}
1214
}
1215
fmt.spec = fmt.spec.replace(/\{(.*?)\}/g,
1216
replace_nested)
1217
}
1219
// Numerical reference : use positional arguments
1220
var pos = parseInt(fmt.name),
1230
// Attribute
1231
value = _b_.getattr(value, ext.substr(1))
1232
}else{
1233
// Subscription
1236
if(key.charAt(0).search(/\d/) > -1){key = parseInt(key)}
1237
value = _b_.getattr(value, "__getitem__")(key)
1241
// If the conversion flag is set, first call a function to convert
1242
// the value
1243
if(fmt.conv == "a"){value = _b_.ascii(value)}
1244
else if(fmt.conv == "r"){value = _b_.repr(value)}
1245
else if(fmt.conv == "s"){value = _b_.str.$factory(value)}
1259
throw NotImplementedError.$factory(
1260
"function format_map not implemented yet")
1280
if(! isinstance(obj2, str)){throw _b_.TypeError.$factory(
1281
"sequence item " + count + ": expected str instance, " +
1282
$B.get_class(obj2).__name__ + " found")}
1295
var $ = $B.args("ljust", 3, {self: null, width: null, fillchar:null},
1296
["self", "width", "fillchar"],
1297
arguments, {fillchar: " "}, null, null)
1304
var $ = $B.args("lstrip", 2, {self: null, chars: null}, ["self", "chars"],
1305
arguments, {chars:_b_.None}, null, null)
1306
if($.chars === _b_.None){return $.self.trimLeft()}
1307
for(var i = 0; i < $.self.length; i++){
1308
if($.chars.indexOf($.self.charAt(i)) === -1){
1309
return $.self.substring(i)
1317
var $ = $B.args("maketrans", 3, {x: null, y: null, z: null},
1318
["x", "y", "z"], arguments, {y: null, z: null}, null, null)
1323
// If there is only one argument, it must be a dictionary mapping
1324
// Unicode ordinals (integers) or characters (strings of length 1) to
1325
// Unicode ordinals, strings (of arbitrary lengths) or None. Character
1327
if(! _b_.isinstance($.x, _b_.dict)){
1328
throw _b_.TypeError.$factory(
1329
"maketrans only argument must be a dict")
1332
for(var i = 0, len = items.length; i < len; i++){
1333
var k = items[i][0],
1334
v = items[i][1]
1335
if(! _b_.isinstance(k, _b_.int)){
1336
if(_b_.isinstance(k, _b_.str) && k.length == 1){
1337
k = _b_.ord(k)
1338
}else{throw _b_.TypeError.$factory("dictionary key " + k +
1341
if(v !== _b_.None && ! _b_.isinstance(v, [_b_.int, _b_.str])){
1342
throw _b_.TypeError.$factory("dictionary value " + v +
1350
// and in the resulting dictionary, each character in x will be mapped
1351
// to the character at the same position in y
1354
}else if($.x.length !== $.y.length){
1355
throw _b_.TypeError.$factory(
1356
"maketrans arguments must be strings or same length")
1362
if(! _b_.isinstance($.z, _b_.str)){
1363
throw _b_.TypeError.$factory(
1364
"maketrans third argument must be a string")
1371
var key = _b_.ord($.x.charAt(i)),
1372
value = $.y.charAt(i)
1373
_b_.dict.$setitem(_t, key, value)
1384
var $ = $B.args("partition", 2, {self: null, sep: null}, ["self", "sep"],
1385
arguments, {}, null, null)
1390
return _b_.tuple.$factory([$.self.substring(0, i), $.sep,
1391
$.self.substring(i + $.sep.length)])
1392
}
1393
1394
function $re_escape(str){
1395
var specials = "[.*+?|()$^"
1396
for(var i = 0, len = specials.length; i < len; i++){
1397
var re = new RegExp("\\"+specials.charAt(i), "g")
1398
str = str.replace(re, "\\"+specials.charAt(i))
1399
}
1400
return str
1407
var $ = $B.args("replace", 4,
1408
{self: null, old: null, $$new: null, count: null},
1409
["self", "old", "$$new", "count"],
1410
arguments, {count: -1}, null, null),
1411
count = $.count,
1412
self = $.self,
1413
old = $.old,
1414
_new = $.$$new
1421
"' object cannot be interpreted as an integer")
1422
}else if(isinstance(count, _b_.float)){
1423
throw _b_.TypeError.$factory("integer argument expected, got float")
1424
}
1425
if(count == 0){return self}
1426
if(count.__class__ == $B.long_int){count = parseInt(count.value)}
1427
if(old == ""){
1428
if(_new == ""){return self}
1429
if(self == ""){return _new}
1430
var elts = self.split("")
1431
if(count > -1 && elts.length >= count){
1432
var rest = elts.slice(count).join("")
1433
return _new + elts.slice(0, count).join(_new) + rest
1434
}else{return _new + elts.join(_new) + _new}
1449
if(count < 0){count = res.length}
1450
while(count > 0){
1451
pos = res.indexOf(old, pos)
1452
if(pos < 0){break}
1453
res = res.substr(0, pos) + _new + res.substr(pos + old.length)
1454
pos = pos + _new.length
1455
count--
1461
// Return the highest index in the string where substring sub is found,
1462
// such that sub is contained within s[start:end]. Optional arguments
1465
{self: null, sub: null, start: null, end: null},
1466
["self", "sub", "start", "end"],
1467
arguments, {start: 0, end: null}, null, null)
1479
for(var i = $.end - sublen; i >= $.start; i--){
1480
if($.self.substr(i, sublen) == $.sub){return i}
1487
var res = str.rfind.apply(null, arguments)
1488
if(res == -1){throw _b_.ValueError.$factory("substring not found")}
1493
var $ = $B.args("rjust",3,
1494
{self: null, width: null, fillchar: null},
1495
["self", "width", "fillchar"],
1496
arguments, {fillchar: " "}, null, null)
1504
var $ = $B.args("rpartition", 2, {self: null, sep: null}, ["self", "sep"],
1505
arguments, {}, null, null)
1509
var items = str.partition(self, sep).reverse()
1510
for(var i = 0; i < items.length; i++){
1511
items[i] = items[i].split("").reverse().join("")
1517
var $ = $B.args("rsplit", 3, {self: null, sep: null, maxsplit: null},
1518
["self", "sep", "maxsplit"], arguments,
1519
{sep: _b_.None, maxsplit: -1}, null, null),
1520
sep = $.sep
1523
var rev_str = reverse($.self),
1524
rev_sep = sep === _b_.None ? sep : reverse($.sep),
1535
str.rstrip = function(self, x){
1536
var $ = $B.args("rstrip", 2, {self: null, chars: null}, ["self", "chars"],
1537
arguments, {chars: _b_.None}, null, null)
1538
if($.chars === _b_.None){return $.self.trimRight()}
1540
if($.chars.indexOf($.self.charAt(j)) == -1){
1541
return $.self.substring(0, j + 1)
1548
var $ = $B.args("split", 3, {self: null, sep: null, maxsplit: null},
1549
["self", "sep", "maxsplit"], arguments,
1550
{sep: _b_.None, maxsplit: -1}, null, null),
1551
sep = $.sep,
1552
maxsplit = $.maxsplit,
1553
self = $.self,
1554
pos = 0
1555
if(maxsplit.__class__ === $B.long_int){maxsplit = parseInt(maxsplit.value)}
1556
if(sep == ""){throw _b_.ValueError.$factory("empty separator")}
1557
if(sep === _b_.None){
1559
while(pos < self.length && self.charAt(pos).search(/\s/) > -1){pos++}
1560
if(pos === self.length - 1){return [self]}
1561
var name = ""
1563
if(self.charAt(pos).search(/\s/) == -1){
1564
if(name == ""){name = self.charAt(pos)}
1565
else{name += self.charAt(pos)}
1585
var res = [],
1586
s = "",
1587
seplen = sep.length
1588
if(maxsplit == 0){return [self]}
1589
while(pos < self.length){
1590
if(self.substr(pos, seplen) == sep){
1610
["self", "keepends"], arguments, {keepends: false}, null, null)
1611
if(! _b_.isinstance($.keepends, [_b_.bool, _b_.int])){
1612
throw _b_.TypeError.$factory("integer argument expected, got " +
1619
start = pos,
1620
pos = 0,
1621
self = $.self
1622
while(pos < self.length){
1623
if(self.substr(pos, 2) == "\r\n"){
1624
res.push(self.substring(start, pos + 2))
1625
start = pos + 2
1627
}else if(self.charAt(pos) == "\r" || self.charAt(pos) == "\n"){
1628
res.push(self.substring(start, pos + 1))
1629
start = pos + 1
1630
pos = start
1631
}else{pos++}
1632
}
1633
var rest = self.substr(start)
1634
if(rest){res.push(rest)}
1635
return res
1636
}else{
1643
// Return True if string starts with the prefix, otherwise return False.
1644
// prefix can also be a tuple of prefixes to look for. With optional
1645
// start, test string beginning at that position. With optional end,
1647
var $ = $B.args("startswith", 4,
1648
{self: null, prefix: null, start: null, end: null},
1649
["self", "prefix", "start", "end"],
1650
arguments, {start: 0, end: null}, null, null)
1657
var s = $.self.substring($.start, $.end)
1658
for(var i = 0, len = prefixes.length; i < len; i++){
1669
var $ = $B.args("strip", 2, {self: null, chars: null}, ["self", "chars"],
1670
arguments, {chars: _b_.None}, null, null)
1671
if($.chars === _b_.None){return $.self.trim()}
1672
for(var i = 0; i < $.self.length; i++){
1673
if($.chars.indexOf($.self.charAt(i)) == -1){
1674
break
1677
for(var j = $.self.length - 1; j >= i; j--){
1678
if($.chars.indexOf($.self.charAt(j)) == -1){
1679
break
1687
getitem = $B.$getattr(table, "__getitem__")
1688
for(var i = 0, len = self.length; i < len; i++){
1689
try{
1690
var repl = getitem(self.charCodeAt(i))
1691
if(repl !== _b_.None){
1692
res.push(repl)
1693
}
1694
}catch(err){
1695
res.push(self.charAt(i))
1696
}
1703
["self", "width"], arguments, {}, null, null)
1704
if($.width <= self.length){return self}
1706
case "+":
1707
case "-":
1708
return self.charAt(0) +
1709
"0".repeat($.width - self.length) + self.substr(1)
1718
case "string":
1719
return arg
1720
case "number":
1721
if(isFinite(arg)){return arg.toString()}
1727
// class or its subclasses, but the attribute __str__ of the
1728
// class metaclass (usually "type") or its subclasses (usually
1729
// "object")
1730
// The metaclass is the attribute __class__ of the class dictionary
1734
if(arg.__class__ && arg.__class__ === _b_.bytes &&
1735
encoding !== undefined){
1736
// str(bytes, encoding, errors) is equal to
1737
// bytes.decode(encoding, errors)
1738
return _b_.bytes.decode(arg, encoding || "utf-8",
1739
errors || "strict")
1740
}
1741
var f = $B.$getattr(arg, "__str__", null)
1742
if(f === null ||
1743
// if not better than object.__str__, try __repr__
1744
(arg.__class__ && arg.__class__ !== _b_.object &&
1745
f.$infos && f.$infos.__func__ === _b_.object.__str__)){
1746
var f = $B.$getattr(arg, "__repr__")
1747
}
1752
if($B.debug > 1){console.log(err)}
1753
console.log("Warning - no method __str__ or __repr__, " +
1754
"default to toString", arg)
1755
return arg.toString()
1761
if(cls === undefined){
1762
throw _b_.TypeError.$factory("str.__new__(): not enough arguments")
1783
var args = [],
1784
pos = 0
1785
if(arguments.length > 0){
1786
var args = [arguments[0].valueOf()],
1787
pos = 1
1788
for(var i = 1, len = arguments.length; i < len; i++){
1789
args[pos++] = arguments[i]
1805
// Function to parse the 2nd argument of format()
1806
$B.parse_format_spec = function(spec){
1809
var pos = 0,
1810
aligns = "<>=^",
1811
digits = "0123456789",
1812
types = "bcdeEfFgGnosxX%",
1814
if(align_pos != -1){
1815
if(spec.charAt(1) && aligns.indexOf(spec.charAt(1)) != -1){
1816
// If the second char is also an alignment specifier, the
1817
// first char is the fill value
1818
this.fill = spec.charAt(0)
1819
this.align = spec.charAt(1)
1820
pos = 2
1821
}else{
1822
// The first character defines alignment : fill defaults to ' '
1837
if(car == "+" || car == "-" || car == " "){
1838
this.sign = car
1839
pos++
1840
car = spec.charAt(pos)
1842
if(car == "#"){this.alternate = true; pos++; car = spec.charAt(pos)}
1843
if(car == "0"){
1850
while(car && digits.indexOf(car) > -1){
1851
if(this.width === undefined){this.width = car}
1852
else{this.width += car}
1853
pos++
1854
car = spec.charAt(pos)
1857
if(this.width === undefined && car == "{"){
1858
// Width is determined by a parameter
1859
var end_param_pos = spec.substr(pos).search("}")
1860
this.width = spec.substring(pos, end_param_pos)
1861
console.log("width", "[" + this.width + "]")
1862
pos += end_param_pos + 1
1863
}
1864
if(car == ","){this.comma = true; pos++; car = spec.charAt(pos)}
1865
if(car == "."){
1866
if(digits.indexOf(spec.charAt(pos + 1)) == -1){
1867
throw _b_.ValueError.$factory(
1868
"Missing precision in format spec")
1870
this.precision = spec.charAt(pos + 1)
1871
pos += 2
1872
car = spec.charAt(pos)
1873
while(car && digits.indexOf(car) > -1){
1880
if(car && types.indexOf(car) > -1){
1881
this.type = car
1882
pos++
1883
car = spec.charAt(pos)
1884
}
1885
if(pos !== spec.length){
1890
return (this.fill === undefined ? "" : _b_.str.$factory(this.fill)) +
1891
(this.align || "") +
1892
(this.sign || "") +
1893
(this.alternate ? "#" : "") +
1894
(this.sign_aware ? "0" : "") +
1895
(this.width || "") +
1896
(this.comma ? "," : "") +
1897
(this.precision ? "." + this.precision : "") +
1898
(this.type || "")
1903
if(fmt.width && s.length < fmt.width){
1904
var fill = fmt.fill || " ",
1905
align = fmt.align || "<",
1906
missing = fmt.width - s.length
1908
case "<":
1909
return s + fill.repeat(missing)
1910
case ">":
1911
return fill.repeat(missing) + s
1912
case "=":
1913
if("+-".indexOf(s.charAt(0)) > -1){
1914
return s.charAt(0) + fill.repeat(missing) + s.substr(1)
1918
case "^":
1919
var left = parseInt(missing / 2)
1920
return fill.repeat(left) + s + fill.repeat(missing - left)
1933
$B.parse_fstring = function(string){
1934
// Parse a f-string
1935
var elts = [],
1936
pos = 0,
1960
}else{
1961
throw Error(" f-string: single '}' is not allowed")
1962
}
1963
}else{
1985
current += car
1986
i += 2
1987
}else{
1988
throw Error(" f-string: single '}' is not allowed")
1989
}
1990
}else{
1991
current += car
1992
i++
1993
}
1994
}
1996
}else{
1997
// End of expression is the } matching the opening {
1998
// There may be nested braces
1999
var i = pos,
2000
nb_braces = 1,
2022
// backslash is not allowed in expressions
2023
throw Error("f-string expression part cannot include a" +
2024
" backslash")
2031
throw Error("f-string: invalid conversion character:" +
2032
" expected 's', 'r', or 'a'")
2033
}else{
2047
if(string.substr(i, 3) == '"""'){
2048
var end = string.indexOf('"""', i + 3)
2049
if(end == -1){
2050
throw Error("f-string: unterminated string")
2051
}else{
2052
var trs = string.substring(i, end + 3)
2053
trs = trs.replace("\n", "\\n\\")
2058
var end = string.indexOf('"', i + 1)
2059
if(end == -1){
2060
throw Error("f-string: unterminated string")
2061
}else{
2062
current.expression += string.substring(i, end + 1)
2063
i = end + 1