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
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
Feb 9, 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
Mar 19, 2019
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
2092 lines (1921 sloc)
66.4 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)
79
if($.start === null || $.start === _b_.None){$.start = 0}
80
else if($.start < 0){
81
$.start += $.self.length
82
$.start = Math.max(0, $.start)
83
}
84
if($.end === null || $.end === _b_.None){$.end = $.self.length}
85
else if($.end < 0){
86
$.end += $.self.length
87
$.end = Math.max(0, $.end)
88
}
90
if(! isinstance($.start, _b_.int) || ! isinstance($.end, _b_.int)){
91
throw _b_.TypeError.$factory("slice indices must be integers " +
92
"or None or have an __index__ method")
93
}
110
if(!(typeof other === "string")){
111
try{return getattr(other, "__radd__")(self)}
112
catch(err){
113
throw _b_.TypeError.$factory("Can't convert " +
119
str.__contains__ = function(self, item){
120
if(!(typeof item == "string")){
121
throw _b_.TypeError.$factory("'in <string>' requires " +
122
"string as left operand, not " + item.__class__)
123
}
125
if(nbcar == 0) {return true} // a string contains the empty string
126
if(self.length == 0){return nbcar == 0}
127
for(var i = 0, len = self.length; i < len; i++){
128
if(self.substr(i, nbcar) == item){return true}
137
// __dir__must be assigned explicitely because attribute resolution for
138
// builtin classes doesn't use __mro__
142
if(other === undefined){ // compare object "self" to class "str"
143
return self === str
153
if(fmt.type && fmt.type != "s"){
154
throw _b_.ValueError.$factory("Unknown format code '" + fmt.type +
162
if(fmt.sign !== undefined){
163
throw _b_.ValueError.$factory(
164
"Sign not allowed in string format specifier")
174
if(arg < 0) {pos += self.length}
175
if(pos >= 0 && pos < self.length){return self.charAt(pos)}
176
throw _b_.IndexError.$factory("string index out of range")
177
}
178
if(isinstance(arg, slice)) {
179
var s = _b_.slice.$conv_for_seq(arg, self.length),
180
start = s.start,
181
stop = s.stop,
182
step = s.step
183
var res = "",
185
if(step > 0){
186
if(stop <= start){return ""}
187
for(var i = start; i < stop; i += step){res += self.charAt(i)}
189
if(stop >= start){return ''}
190
for(var i = start; i > stop; i += step){res += self.charAt(i)}
198
var prefix = 2,
199
suffix = 3,
200
mask = (2 ** 32 - 1)
201
function fnv(p){
202
if(p.length == 0){
203
return 0
204
}
206
var x = prefix
207
x = (x ^ (p.charCodeAt(0) << 7)) & mask
208
for(var i = 0, len = p.length; i < len; i++){
209
x = ((1000003 * x) ^ p.charCodeAt(i)) & mask
210
}
211
x = (x ^ p.length) & mask
212
x = (x ^ suffix) & mask
232
var items = self.split("") // list of all characters in string
233
return $B.$iterator(items, $str_iterator)
270
// left adjusted
271
return s + get_char_array(padding - s.length, flags.pad_char)
272
}
273
}
274
282
if(val.__class__ === $B.long_int){
283
s = $B.long_int.to_base(val, 10)
284
}else{
285
s = val.toString()
287
if(s[0] === "-"){
288
return "-" + get_char_array(precision - s.length + 1, "0") + s.slice(1)
299
if(val === Infinity){
300
val = "inf"
301
}else if(val === -Infinity){
302
val = "-inf"
303
}else{
304
val = "nan"
326
var str_format = function(val, flags) {
327
// string format supports left and right padding
328
flags.pad_char = " " // even if 0 padding is defined, don't use it
334
if(val.__class__ === $B.long_int){
335
val = $B.long_int.to_base(val, 10)
336
}else{
337
val = parseInt(val)
355
var repr_format = function(val, flags) {
356
flags.pad_char = " " // even if 0 padding is defined, don't use it
357
return format_padding(repr(val), flags)
358
}
360
var ascii_format = function(val, flags) {
361
flags.pad_char = " " // even if 0 padding is defined, don't use it
362
return format_padding(ascii(val), flags)
363
}
375
flags.precision = parseInt(flags.precision, 10)
376
validate_precision(flags.precision)
377
}
378
return parseFloat(val)
379
}
382
var trailing_zeros = /(.*?)(0+)([eE].*)/,
383
leading_zeros = /\.(0*)/,
384
trailing_dot = /\.$/
386
var validate_precision = function(precision) {
387
// force precision to limits of javascript
392
var floating_point_format = function(val, upper, flags){
393
val = _float_helper(val, flags),
394
v = val.toString(),
395
v_len = v.length,
396
dot_idx = v.indexOf('.')
397
if(dot_idx < 0){dot_idx = v_len}
398
if(val < 1 && val > -1){
399
var zeros = leading_zeros.exec(v),
400
numzeros
401
if(zeros){
406
if(numzeros >= 4){
407
val = format_sign(val, flags) + format_float_precision(val, upper,
408
flags, _floating_g_exp_helper)
409
if(!flags.alternate){
422
return format_padding(format_sign(val, flags) +
423
format_float_precision(val, upper, flags,
424
function(val, precision) {
425
return val.toFixed(min(precision, v_len - dot_idx) +
426
numzeros)
427
}),
428
flags
429
)
430
}
431
432
if(dot_idx > flags.precision){
433
val = format_sign(val, flags) + format_float_precision(val, upper,
434
flags, _floating_g_exp_helper)
435
if(! flags.alternate){
447
return format_padding(format_sign(val, flags) +
448
format_float_precision(val, upper, flags,
449
function(val, precision) {
450
if(!flags.decimal_point){
451
precision = min(v_len - 1, 6)
452
}else if (precision > v_len){
453
if(! flags.alternate){
454
precision = v_len
455
}
457
if(precision < dot_idx){
458
precision = dot_idx
459
}
460
return val.toFixed(precision - dot_idx)
461
}),
462
flags
463
)
466
var _floating_g_exp_helper = function(val, precision, flags, upper){
467
if(precision){--precision}
470
var e_idx = val.lastIndexOf("e")
471
if(e_idx > val.length - 4){
472
val = val.substring(0, e_idx + 2) + "0" + val.substring(e_idx + 2)
475
return val
476
}
477
478
// fF
479
var floating_point_decimal_format = function(val, upper, flags) {
480
val = _float_helper(val, flags)
481
return format_padding(format_sign(val, flags) +
482
format_float_precision(val, upper, flags,
483
function(val, precision, flags) {
484
val = val.toFixed(precision)
485
if(precision === 0 && flags.alternate){
486
val += '.'
487
}
488
return val
489
}),
490
flags
491
)
492
}
493
494
var _floating_exp_helper = function(val, precision, flags, upper) {
495
val = val.toExponential(precision)
496
// pad exponent to two digits
509
return format_padding(format_sign(val, flags) +
510
format_float_precision(val, upper, flags, _floating_exp_helper), flags)
536
if(flags.alternate){
537
if(ret.charAt(0) === "-"){
538
if(upper){ret = "-0X" + ret.slice(1)}
539
else{ret = "-0x" + ret.slice(1)}
540
}else{
541
if(upper){ret = "0X" + ret}
542
else{ret = "0x" + ret}
552
if(val.__class__ === $B.long_int){
553
ret = $B.long_int.to_base(8)
554
}else{
555
ret = parseInt(val)
556
ret = ret.toString(8)
572
if(flags.alternate){
573
if(ret.charAt(0) === "-"){ret = "-0o" + ret.slice(1)}
574
else{ret = "0o" + ret}
579
var single_char_format = function(val, flags){
580
if(isinstance(val, str) && val.length == 1) return val
581
try{
589
var num_flag = function(c, flags){
590
if(c === "0" && ! flags.padding && ! flags.decimal_point && ! flags.left){
591
flags.pad_char = "0"
597
flags.precision = (flags.precision || "") + c
598
}
599
}
600
601
var decimal_point_flag = function(val, flags) {
603
// can only have one decimal point
604
throw new UnsupportedChar()
605
}
606
flags.decimal_point = true
607
}
608
609
var neg_flag = function(val, flags){
610
flags.pad_char = " " // overrides '0' flag
627
"s": str_format,
628
"d": num_format,
629
"i": num_format,
630
"u": num_format,
631
"o": octal_format,
632
"r": repr_format,
633
"a": ascii_format,
634
"g": function(val, flags){
635
return floating_point_format(val, false, flags)
636
},
637
"G": function(val, flags){return floating_point_format(val, true, flags)},
638
"f": function(val, flags){
639
return floating_point_decimal_format(val, false, flags)
640
},
641
"F": function(val, flags){
642
return floating_point_decimal_format(val, true, flags)
643
},
644
"e": function(val, flags){
645
return floating_point_exponential_format(val, false, flags)
646
},
647
"E": function(val, flags){
648
return floating_point_exponential_format(val, true, flags)
649
},
650
"x": function(val, flags){return signed_hex_format(val, false, flags)},
651
"X": function(val, flags){return signed_hex_format(val, true, flags)},
652
"c": single_char_format,
653
"0": function(val, flags){return num_flag("0", flags)},
654
"1": function(val, flags){return num_flag("1", flags)},
655
"2": function(val, flags){return num_flag("2", flags)},
656
"3": function(val, flags){return num_flag("3", flags)},
657
"4": function(val, flags){return num_flag("4", flags)},
658
"5": function(val, flags){return num_flag("5", flags)},
659
"6": function(val, flags){return num_flag("6", flags)},
660
"7": function(val, flags){return num_flag("7", flags)},
661
"8": function(val, flags){return num_flag("8", flags)},
662
"9": function(val, flags){return num_flag("9", flags)},
663
"-": neg_flag,
664
" ": space_flag,
665
"+": sign_flag,
666
".": decimal_point_flag,
667
"#": alternate_flag
668
}
669
670
// exception thrown when an unsupported char is encountered in legacy format
717
if(self === undefined){
718
throw _b_.TypeError.$factory(
719
"not enough arguments for format string")
746
throw _b_.ValueError.$factory(
747
"unsupported format character '" + invalid_char +
748
"' (0x" + invalid_char.charCodeAt(0).toString(16) +
749
") at index " + newpos)
750
}else if(err.name === "NotANumber"){
751
var try_char = s[newpos],
752
cls = self.__class__
753
if(!cls){
754
if(typeof(self) === "string"){
755
cls = "str"
756
}else{
762
throw _b_.TypeError.$factory("%" + try_char +
763
" format: a number is required, not " + cls)
764
}else{
796
}while(pos < length)
797
798
if(argpos !== null){
799
if(args.length > argpos){
800
throw _b_.TypeError.$factory(
801
"not enough arguments for format string")
802
}else if(args.length < argpos){
803
throw _b_.TypeError.$factory(
804
"not all arguments converted during string formatting")
806
}else if(nbph == 0){
807
throw _b_.TypeError.$factory(
808
"not all arguments converted during string formatting")
816
var $ = $B.args("__mul__", 2, {self: null, other: null},
817
["self", "other"], arguments, {}, null, null)
818
if(! isinstance($.other, _b_.int)){throw _b_.TypeError.$factory(
819
"Can't multiply sequence by non-int of type '" +
831
res = self.replace(/\\/g, "\\\\")
832
// special cases
833
res = res.replace(new RegExp("\u0007", "g"), "\\x07").
834
replace(new RegExp("\b", "g"), "\\x08").
835
replace(new RegExp("\f", "g"), "\\x0c").
836
replace(new RegExp("\n", "g"), "\\n").
837
replace(new RegExp("\r", "g"), "\\r").
838
replace(new RegExp("\t", "g"), "\\t")
839
if(res.search('"') == -1 && res.search("'") == -1){
840
return "'" + res + "'"
841
}else if(self.search('"') == -1){
842
return '"' + res + '"'
843
}
844
var qesc = new RegExp("'", "g") // to escape single quote
845
res = "'" + res.replace(qesc, "\\'") + "'"
849
str.__setitem__ = function(self, attr, value){
850
throw _b_.TypeError.$factory(
851
"'str' object does not support item assignment")
864
$comp_func += "" // source code
865
var $comps = {">": "gt", ">=": "ge", "<": "lt", "<=": "le"}
874
var $notimplemented = function(self, other){
875
throw NotImplementedError.$factory(
876
"OPERATOR not implemented for class str")
879
// Copy static methods from unicode
880
var from_unicode = [
881
"title",
882
"capitalize",
883
"casefold",
884
"islower",
885
"isupper",
886
"istitle",
887
"isspace",
888
"isalpha",
889
"isalnum",
890
"isdecimal",
891
"isdigit",
892
"isnumeric",
893
"isidentifier",
894
"isprintable",
895
"lower",
896
"swapcase",
897
"upper"
898
]
904
str.center = function(){
905
var $ = $B.args("center", 3, {self: null, width: null, fillchar: null},
906
["self", "width", "fillchar"],
907
arguments, {fillchar:" "}, null, null),
908
self = $.self
920
var $ = $B.args("count", 4, {self:null, sub:null, start:null, stop:null},
921
["self", "sub", "start", "stop"], arguments, {start:null, stop:null},
929
if($.stop !== null){_slice = _b_.slice.$factory($.start, $.stop)}
930
else{_slice = _b_.slice.$factory($.start, $.self.length)}
935
if($.sub.length == 0){
936
if($.start == $.self.length){return 1}
937
else if(substr.length == 0){return 0}
938
return substr.length + 1
940
var n = 0,
941
pos = 0
942
while(pos < substr.length){
943
pos = substr.indexOf($.sub, pos)
944
if(pos >= 0){n++; pos += $.sub.length}
945
else{break}
957
if(("a" <= char && char <= "m") || ("A" <= char && char <= "M")){
958
res += String.fromCharCode(String.charCodeAt(char) + 13)
959
}else if(("m" < char && char <= "z") ||
960
("M" < char && char <= "Z")){
961
res += String.fromCharCode(String.charCodeAt(char) - 13)
970
// Return True if the string ends with the specified suffix, otherwise
971
// return False. suffix can also be a tuple of suffixes to look for.
972
// With optional start, test beginning at that position. With optional
976
["self", "suffix", "start", "end"],
977
arguments, {start: 0, end: null}, null, null)
984
var s = $.self.substring($.start, $.end)
985
for(var i = 0, len = suffixes.length; i < len; i++){
989
if(suffix.length <= s.length &&
990
s.substr(s.length - suffix.length) == suffix){return true}
996
var $ = $B.args("expandtabs", 2, {self: null, tabsize: null},
997
["self", "tabsize"], arguments, {tabsize: 8}, null, null)
998
var s = $B.$GetInt($.tabsize),
999
col = 0,
1000
pos = 0,
1001
res = ""
1002
if(s == 1){return self.replace(/\t/g," ")}
1003
while(pos < self.length){
1011
res += car
1012
col = 0
1013
break
1014
default:
1015
res += car
1016
col++
1017
break
1018
}
1019
pos++
1020
}
1026
// Return the lowest index in the string where substring sub is found,
1027
// such that sub is contained in the slice s[start:end]. Optional
1028
// arguments start and end are interpreted as in slice notation.
1031
{self: null, sub: null, start: null, end: null},
1032
["self", "sub", "start", "end"],
1033
arguments, {start: 0, end: null}, null, null)
1037
if(!isinstance($.start, _b_.int)||!isinstance($.end, _b_.int)){
1038
throw _b_.TypeError.$factory("slice indices must be " +
1039
"integers or None or have an __index__ method")}
1040
var s = $.self.substring($.start, $.end)
1042
if($.sub.length == 0 && $.start == $.self.length){return $.self.length}
1043
if(s.length + $.sub.length == 0){return -1}
1045
var last_search = s.length - $.sub.length
1046
for(var i = 0; i <= last_search; i++){
1047
if(s.substr(i, $.sub.length) == $.sub){return $.start + i}
1058
// a.x[z]!r:...
1059
// the object has attributes :
1060
// - name : "a"
1061
// - name_ext : [".x", "[z]"]
1062
// - conv : r
1063
// - spec : rest of string after :
1071
// No : in the string : it only contains a name
1072
name = fmt_string
1073
}else{
1074
// name is before the first ":"
1075
// spec (the format specification) is after
1076
name = elts[0]
1080
var elts = name.split("!")
1081
if(elts.length > 1){
1082
name = elts[0]
1083
conv = elts[1] // conversion flag
1087
// "name' may be a subscription or attribute
1088
// Put these "extensions" in the list "name_ext"
1089
function name_repl(match){
1090
name_ext.push(match)
1092
}
1093
var name_ext_re = /\.[_a-zA-Z][_a-zA-Z0-9]*|\[[_a-zA-Z][_a-zA-Z0-9]*\]|\[[0-9]+\]/g
1094
name = name.replace(name_ext_re, name_repl)
1095
}
1102
// Parse self to detect formatting instructions
1103
// Create a list "parts" made of sections of the string :
1104
// - elements of even rank are literal text
1105
// - elements of odd rank are "format objects", built from the
1106
// format strings in self (of the form {...})
1117
text += "{"
1118
pos += 2
1119
}else if(car == "}" && self.charAt(pos + 1) == "}"){
1126
// Store current literal text
1127
parts.push(text)
1128
1129
// Search the end of the format string, ie the } closing the
1130
// opening {. Since the string can contain other pairs {} for
1131
// nested formatting, an integer nb is incremented for each { and
1132
// decremented for each } ; the end of the format string is
1133
// reached when nb == 0
1134
var end = pos + 1,
1135
nb = 1
1136
while(end < _len){
1137
if(self.charAt(end) == "{"){nb++; end++}
1138
else if(self.charAt(end) == "}"){
1139
nb--; end++
1140
if(nb == 0){
1145
var fmt_obj = $B.parse_format(fmt_string)
1146
fmt_obj.raw_name = fmt_obj.name
1147
fmt_obj.raw_spec = fmt_obj.spec
1182
return parts
1183
}
1184
1185
str.format = function(self) {
1186
var $ = $B.args("format", 1, {self: null}, ["self"],
1187
arguments, {}, "$args", "$kw")
1188
1189
var parts = $B.split_format($.self)
1190
1201
1202
if(fmt.spec !== undefined){
1203
// "spec" may contain "nested replacement fields"
1204
// In this case, evaluate them using the positional
1205
// or keyword arguments passed to format()
1206
function replace_nested(name, key){
1207
if(/\d+/.exec(key)){
1208
// If key is numeric, search in positional
1209
// arguments
1210
return _b_.tuple.__getitem__($.$args,
1211
parseInt(key))
1212
}else{
1213
// Else try in keyword arguments
1214
return _b_.dict.__getitem__($.$kw, key)
1215
}
1216
}
1217
fmt.spec = fmt.spec.replace(/\{(.*?)\}/g,
1218
replace_nested)
1219
}
1221
// Numerical reference : use positional arguments
1222
var pos = parseInt(fmt.name),
1232
// Attribute
1233
value = _b_.getattr(value, ext.substr(1))
1234
}else{
1235
// Subscription
1238
if(key.charAt(0).search(/\d/) > -1){key = parseInt(key)}
1239
value = _b_.getattr(value, "__getitem__")(key)
1243
// If the conversion flag is set, first call a function to convert
1244
// the value
1245
if(fmt.conv == "a"){value = _b_.ascii(value)}
1246
else if(fmt.conv == "r"){value = _b_.repr(value)}
1247
else if(fmt.conv == "s"){value = _b_.str.$factory(value)}
1261
throw NotImplementedError.$factory(
1262
"function format_map not implemented yet")
1282
if(! isinstance(obj2, str)){throw _b_.TypeError.$factory(
1283
"sequence item " + count + ": expected str instance, " +
1297
var $ = $B.args("ljust", 3, {self: null, width: null, fillchar:null},
1298
["self", "width", "fillchar"],
1299
arguments, {fillchar: " "}, null, null)
1306
var $ = $B.args("lstrip", 2, {self: null, chars: null}, ["self", "chars"],
1307
arguments, {chars:_b_.None}, null, null)
1308
if($.chars === _b_.None){return $.self.trimLeft()}
1309
for(var i = 0; i < $.self.length; i++){
1310
if($.chars.indexOf($.self.charAt(i)) === -1){
1311
return $.self.substring(i)
1319
var $ = $B.args("maketrans", 3, {x: null, y: null, z: null},
1320
["x", "y", "z"], arguments, {y: null, z: null}, null, null)
1325
// If there is only one argument, it must be a dictionary mapping
1326
// Unicode ordinals (integers) or characters (strings of length 1) to
1327
// Unicode ordinals, strings (of arbitrary lengths) or None. Character
1329
if(! _b_.isinstance($.x, _b_.dict)){
1330
throw _b_.TypeError.$factory(
1331
"maketrans only argument must be a dict")
1334
for(var i = 0, len = items.length; i < len; i++){
1335
var k = items[i][0],
1336
v = items[i][1]
1337
if(! _b_.isinstance(k, _b_.int)){
1338
if(_b_.isinstance(k, _b_.str) && k.length == 1){
1339
k = _b_.ord(k)
1340
}else{throw _b_.TypeError.$factory("dictionary key " + k +
1343
if(v !== _b_.None && ! _b_.isinstance(v, [_b_.int, _b_.str])){
1344
throw _b_.TypeError.$factory("dictionary value " + v +
1352
// and in the resulting dictionary, each character in x will be mapped
1353
// to the character at the same position in y
1356
}else if($.x.length !== $.y.length){
1357
throw _b_.TypeError.$factory(
1358
"maketrans arguments must be strings or same length")
1364
if(! _b_.isinstance($.z, _b_.str)){
1365
throw _b_.TypeError.$factory(
1366
"maketrans third argument must be a string")
1373
var key = _b_.ord($.x.charAt(i)),
1374
value = $.y.charAt(i)
1375
_b_.dict.$setitem(_t, key, value)
1386
var $ = $B.args("partition", 2, {self: null, sep: null}, ["self", "sep"],
1387
arguments, {}, null, null)
1392
return _b_.tuple.$factory([$.self.substring(0, i), $.sep,
1393
$.self.substring(i + $.sep.length)])
1394
}
1395
1396
function $re_escape(str){
1397
var specials = "[.*+?|()$^"
1398
for(var i = 0, len = specials.length; i < len; i++){
1399
var re = new RegExp("\\"+specials.charAt(i), "g")
1400
str = str.replace(re, "\\"+specials.charAt(i))
1401
}
1402
return str
1409
var $ = $B.args("replace", 4,
1410
{self: null, old: null, $$new: null, count: null},
1411
["self", "old", "$$new", "count"],
1412
arguments, {count: -1}, null, null),
1413
count = $.count,
1414
self = $.self,
1415
old = $.old,
1416
_new = $.$$new
1423
"' object cannot be interpreted as an integer")
1424
}else if(isinstance(count, _b_.float)){
1425
throw _b_.TypeError.$factory("integer argument expected, got float")
1426
}
1427
if(count == 0){return self}
1428
if(count.__class__ == $B.long_int){count = parseInt(count.value)}
1429
if(old == ""){
1430
if(_new == ""){return self}
1431
if(self == ""){return _new}
1432
var elts = self.split("")
1433
if(count > -1 && elts.length >= count){
1434
var rest = elts.slice(count).join("")
1435
return _new + elts.slice(0, count).join(_new) + rest
1436
}else{return _new + elts.join(_new) + _new}
1451
if(count < 0){count = res.length}
1452
while(count > 0){
1453
pos = res.indexOf(old, pos)
1454
if(pos < 0){break}
1455
res = res.substr(0, pos) + _new + res.substr(pos + old.length)
1456
pos = pos + _new.length
1457
count--
1463
// Return the highest index in the string where substring sub is found,
1464
// such that sub is contained within s[start:end]. Optional arguments
1467
{self: null, sub: null, start: null, end: null},
1468
["self", "sub", "start", "end"],
1469
arguments, {start: 0, end: null}, null, null)
1481
for(var i = $.end - sublen; i >= $.start; i--){
1482
if($.self.substr(i, sublen) == $.sub){return i}
1489
var res = str.rfind.apply(null, arguments)
1490
if(res == -1){throw _b_.ValueError.$factory("substring not found")}
1495
var $ = $B.args("rjust",3,
1496
{self: null, width: null, fillchar: null},
1497
["self", "width", "fillchar"],
1498
arguments, {fillchar: " "}, null, null)
1506
var $ = $B.args("rpartition", 2, {self: null, sep: null}, ["self", "sep"],
1507
arguments, {}, null, null)
1511
var items = str.partition(self, sep).reverse()
1512
for(var i = 0; i < items.length; i++){
1513
items[i] = items[i].split("").reverse().join("")
1519
var $ = $B.args("rsplit", 3, {self: null, sep: null, maxsplit: null},
1520
["self", "sep", "maxsplit"], arguments,
1521
{sep: _b_.None, maxsplit: -1}, null, null),
1522
sep = $.sep
1525
var rev_str = reverse($.self),
1526
rev_sep = sep === _b_.None ? sep : reverse($.sep),
1537
str.rstrip = function(self, x){
1538
var $ = $B.args("rstrip", 2, {self: null, chars: null}, ["self", "chars"],
1539
arguments, {chars: _b_.None}, null, null)
1540
if($.chars === _b_.None){return $.self.trimRight()}
1542
if($.chars.indexOf($.self.charAt(j)) == -1){
1543
return $.self.substring(0, j + 1)
1550
var $ = $B.args("split", 3, {self: null, sep: null, maxsplit: null},
1551
["self", "sep", "maxsplit"], arguments,
1552
{sep: _b_.None, maxsplit: -1}, null, null),
1553
sep = $.sep,
1554
maxsplit = $.maxsplit,
1555
self = $.self,
1556
pos = 0
1557
if(maxsplit.__class__ === $B.long_int){maxsplit = parseInt(maxsplit.value)}
1558
if(sep == ""){throw _b_.ValueError.$factory("empty separator")}
1559
if(sep === _b_.None){
1561
while(pos < self.length && self.charAt(pos).search(/\s/) > -1){pos++}
1562
if(pos === self.length - 1){return [self]}
1563
var name = ""
1565
if(self.charAt(pos).search(/\s/) == -1){
1566
if(name == ""){name = self.charAt(pos)}
1567
else{name += self.charAt(pos)}
1587
var res = [],
1588
s = "",
1589
seplen = sep.length
1590
if(maxsplit == 0){return [self]}
1591
while(pos < self.length){
1592
if(self.substr(pos, seplen) == sep){
1612
["self", "keepends"], arguments, {keepends: false}, null, null)
1613
if(! _b_.isinstance($.keepends, [_b_.bool, _b_.int])){
1614
throw _b_.TypeError.$factory("integer argument expected, got " +
1621
start = pos,
1622
pos = 0,
1623
self = $.self
1624
while(pos < self.length){
1625
if(self.substr(pos, 2) == "\r\n"){
1626
res.push(self.substring(start, pos + 2))
1627
start = pos + 2
1629
}else if(self.charAt(pos) == "\r" || self.charAt(pos) == "\n"){
1630
res.push(self.substring(start, pos + 1))
1631
start = pos + 1
1632
pos = start
1633
}else{pos++}
1634
}
1635
var rest = self.substr(start)
1636
if(rest){res.push(rest)}
1637
return res
1638
}else{
1645
// Return True if string starts with the prefix, otherwise return False.
1646
// prefix can also be a tuple of prefixes to look for. With optional
1647
// start, test string beginning at that position. With optional end,
1649
var $ = $B.args("startswith", 4,
1650
{self: null, prefix: null, start: null, end: null},
1651
["self", "prefix", "start", "end"],
1652
arguments, {start: 0, end: null}, null, null)
1659
var s = $.self.substring($.start, $.end)
1660
for(var i = 0, len = prefixes.length; i < len; i++){
1671
var $ = $B.args("strip", 2, {self: null, chars: null}, ["self", "chars"],
1672
arguments, {chars: _b_.None}, null, null)
1673
if($.chars === _b_.None){return $.self.trim()}
1674
for(var i = 0; i < $.self.length; i++){
1675
if($.chars.indexOf($.self.charAt(i)) == -1){
1676
break
1679
for(var j = $.self.length - 1; j >= i; j--){
1680
if($.chars.indexOf($.self.charAt(j)) == -1){
1681
break
1689
getitem = $B.$getattr(table, "__getitem__")
1690
for(var i = 0, len = self.length; i < len; i++){
1691
try{
1692
var repl = getitem(self.charCodeAt(i))
1693
if(repl !== _b_.None){
1694
res.push(repl)
1695
}
1696
}catch(err){
1697
res.push(self.charAt(i))
1698
}
1705
["self", "width"], arguments, {}, null, null)
1706
if($.width <= self.length){return self}
1708
case "+":
1709
case "-":
1710
return self.charAt(0) +
1711
"0".repeat($.width - self.length) + self.substr(1)
1720
case "string":
1721
return arg
1722
case "number":
1723
if(isFinite(arg)){return arg.toString()}
1729
// class or its subclasses, but the attribute __str__ of the
1730
// class metaclass (usually "type") or its subclasses (usually
1731
// "object")
1732
// The metaclass is the attribute __class__ of the class dictionary
1736
if(arg.__class__ && arg.__class__ === _b_.bytes &&
1737
encoding !== undefined){
1738
// str(bytes, encoding, errors) is equal to
1739
// bytes.decode(encoding, errors)
1740
// Arguments may be passed as keywords (cf. issue #1060)
1741
var $ = $B.args("str", 3, {arg: null, encoding: null, errors: null},
1742
["arg", "encoding", "errors"], arguments,
1743
{encoding: "utf-8", errors: "strict"}, null, null)
1744
return _b_.bytes.decode(arg, $.encoding, $.errors)
1746
var f = $B.$getattr(arg, "__str__", null)
1747
if(f === null ||
1748
// if not better than object.__str__, try __repr__
1749
(arg.__class__ && arg.__class__ !== _b_.object &&
1750
f.$infos && f.$infos.__func__ === _b_.object.__str__)){
1751
var f = $B.$getattr(arg, "__repr__")
1752
}
1757
if($B.debug > 1){console.log(err)}
1758
console.log("Warning - no method __str__ or __repr__, " +
1759
"default to toString", arg)
1760
return arg.toString()
1766
if(cls === undefined){
1767
throw _b_.TypeError.$factory("str.__new__(): not enough arguments")
1791
var args = [],
1792
pos = 0
1793
if(arguments.length > 0){
1794
var args = [arguments[0].valueOf()],
1795
pos = 1
1796
for(var i = 1, len = arguments.length; i < len; i++){
1797
args[pos++] = arguments[i]
1813
// Function to parse the 2nd argument of format()
1814
$B.parse_format_spec = function(spec){
1817
var pos = 0,
1818
aligns = "<>=^",
1819
digits = "0123456789",
1820
types = "bcdeEfFgGnosxX%",
1822
if(align_pos != -1){
1823
if(spec.charAt(1) && aligns.indexOf(spec.charAt(1)) != -1){
1824
// If the second char is also an alignment specifier, the
1825
// first char is the fill value
1826
this.fill = spec.charAt(0)
1827
this.align = spec.charAt(1)
1828
pos = 2
1829
}else{
1830
// The first character defines alignment : fill defaults to ' '
1845
if(car == "+" || car == "-" || car == " "){
1846
this.sign = car
1847
pos++
1848
car = spec.charAt(pos)
1850
if(car == "#"){this.alternate = true; pos++; car = spec.charAt(pos)}
1851
if(car == "0"){
1858
while(car && digits.indexOf(car) > -1){
1859
if(this.width === undefined){this.width = car}
1860
else{this.width += car}
1861
pos++
1862
car = spec.charAt(pos)
1865
if(this.width === undefined && car == "{"){
1866
// Width is determined by a parameter
1867
var end_param_pos = spec.substr(pos).search("}")
1868
this.width = spec.substring(pos, end_param_pos)
1869
console.log("width", "[" + this.width + "]")
1870
pos += end_param_pos + 1
1871
}
1872
if(car == ","){this.comma = true; pos++; car = spec.charAt(pos)}
1873
if(car == "."){
1874
if(digits.indexOf(spec.charAt(pos + 1)) == -1){
1875
throw _b_.ValueError.$factory(
1876
"Missing precision in format spec")
1878
this.precision = spec.charAt(pos + 1)
1879
pos += 2
1880
car = spec.charAt(pos)
1881
while(car && digits.indexOf(car) > -1){
1888
if(car && types.indexOf(car) > -1){
1889
this.type = car
1890
pos++
1891
car = spec.charAt(pos)
1892
}
1893
if(pos !== spec.length){
1898
return (this.fill === undefined ? "" : _b_.str.$factory(this.fill)) +
1899
(this.align || "") +
1900
(this.sign || "") +
1901
(this.alternate ? "#" : "") +
1902
(this.sign_aware ? "0" : "") +
1903
(this.width || "") +
1904
(this.comma ? "," : "") +
1905
(this.precision ? "." + this.precision : "") +
1906
(this.type || "")
1911
if(fmt.width && s.length < fmt.width){
1912
var fill = fmt.fill || " ",
1913
align = fmt.align || "<",
1914
missing = fmt.width - s.length
1916
case "<":
1917
return s + fill.repeat(missing)
1918
case ">":
1919
return fill.repeat(missing) + s
1920
case "=":
1921
if("+-".indexOf(s.charAt(0)) > -1){
1922
return s.charAt(0) + fill.repeat(missing) + s.substr(1)
1926
case "^":
1927
var left = parseInt(missing / 2)
1928
return fill.repeat(left) + s + fill.repeat(missing - left)
1941
$B.parse_fstring = function(string){
1942
// Parse a f-string
1943
var elts = [],
1944
pos = 0,
1968
}else{
1969
throw Error(" f-string: single '}' is not allowed")
1970
}
1971
}else{
1993
current += car
1994
i += 2
1995
}else{
1996
throw Error(" f-string: single '}' is not allowed")
1997
}
1998
}else{
1999
current += car
2000
i++
2001
}
2002
}
2004
}else{
2005
// End of expression is the } matching the opening {
2006
// There may be nested braces
2007
var i = pos,
2008
nb_braces = 1,
2030
// backslash is not allowed in expressions
2031
throw Error("f-string expression part cannot include a" +
2032
" backslash")
2039
throw Error("f-string: invalid conversion character:" +
2040
" expected 's', 'r', or 'a'")
2041
}else{
2055
if(string.substr(i, 3) == '"""'){
2056
var end = string.indexOf('"""', i + 3)
2057
if(end == -1){
2058
throw Error("f-string: unterminated string")
2059
}else{
2060
var trs = string.substring(i, end + 3)
2061
trs = trs.replace("\n", "\\n\\")
2066
var end = string.indexOf('"', i + 1)
2067
if(end == -1){
2068
throw Error("f-string: unterminated string")
2069
}else{
2070
current.expression += string.substring(i, end + 1)
2071
i = end + 1