UNPKG

sku-pg

Version:

Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!

214 lines (179 loc) 5.73 kB
/** * @constructor * @param {Sk.builtin.str} name * @param {Sk.builtin.str} mode * @param {Object} buffering */ Sk.builtin.file = function (name, mode, buffering) { var i; var elem; if (!(this instanceof Sk.builtin.file)) { return new Sk.builtin.file(name, mode, buffering); } this.mode = mode; this.name = Sk.ffi.remapToJs(name); this.closed = false; if (this.name === "/dev/stdout") { this.data$ = Sk.builtin.none.none$; this.fileno = 1; } else if (this.name === "/dev/stdin") { this.fileno = 0; } else if (this.name === "/dev/stderr") { this.fileno = 2; } else { if (Sk.inBrowser) { // todo: Maybe provide a replaceable function for non-import files this.fileno = 10; elem = document.getElementById(name.v); if (elem == null) { throw new Sk.builtin.IOError("[Errno 2] No such file or directory: '" + name.v + "'"); } else { if (elem.nodeName.toLowerCase() == "textarea") { this.data$ = elem.value; } else { this.data$ = elem.textContent; } } } else { this.fileno = 11; this.data$ = Sk.read(name.v); } this.lineList = this.data$.split("\n"); this.lineList = this.lineList.slice(0, -1); for (i in this.lineList) { this.lineList[i] = this.lineList[i] + "\n"; } this.currentLine = 0; } this.pos$ = 0; this.__class__ = Sk.builtin.file; return this; }; Sk.abstr.setUpInheritance("file", Sk.builtin.file, Sk.builtin.object); Sk.builtin.file.prototype["$r"] = function () { return new Sk.builtin.str("<" + (this.closed ? "closed" : "open") + "file '" + this.name + "', mode '" + this.mode + "'>"); }; Sk.builtin.file.prototype.tp$iter = function () { var allLines = this.lineList; var ret = { tp$iter : function () { return ret; }, $obj : this, $index : 0, $lines : allLines, tp$iternext: function () { if (ret.$index >= ret.$lines.length) { return undefined; } return new Sk.builtin.str(ret.$lines[ret.$index++]); } }; return ret; }; Sk.builtin.file.prototype["close"] = new Sk.builtin.func(function (self) { self.closed = true; }); Sk.builtin.file.prototype["flush"] = new Sk.builtin.func(function (self) { }); Sk.builtin.file.prototype["fileno"] = new Sk.builtin.func(function (self) { return this.fileno; }); // > 0, not 1/2/3 Sk.builtin.file.prototype["isatty"] = new Sk.builtin.func(function (self) { return false; }); Sk.builtin.file.prototype["read"] = new Sk.builtin.func(function (self, size) { var ret; var len; if (self.closed) { throw new Sk.builtin.ValueError("I/O operation on closed file"); } len = self.data$.length; if (size === undefined) { size = len; } ret = new Sk.builtin.str(self.data$.substr(self.pos$, size)); self.pos$ += size; if (self.pos$ >= len) { self.pos$ = len; } return ret; }); Sk.builtin.file.$readline = function (self, size, prompt) { if (self.fileno === 0) { var x, resolution, susp; var lprompt = Sk.ffi.remapToJs(prompt); lprompt = lprompt ? lprompt : ""; x = Sk.inputfun(lprompt); if (x instanceof Promise) { susp = new Sk.misceval.Suspension(); susp.resume = function() { return new Sk.builtin.str(resolution); }; susp.data = { type: "Sk.promise", promise: x.then(function(value) { resolution = value; return value; }, function(err) { resolution = ""; return err; }) }; return susp; } else { return new Sk.builtin.str(x); } } else { var line = ""; if (self.currentLine < self.lineList.length) { line = self.lineList[self.currentLine]; self.currentLine++; } return new Sk.builtin.str(line); } }; Sk.builtin.file.prototype["readline"] = new Sk.builtin.func(function (self, size) { return Sk.builtin.file.$readline(self, size, undefined); }); Sk.builtin.file.prototype["readlines"] = new Sk.builtin.func(function (self, sizehint) { if (self.fileno === 0) { return new Sk.builtin.NotImplementedError("readlines ins't implemented because the web doesn't support Ctrl+D"); } var i; var arr = []; for (i = self.currentLine; i < self.lineList.length; i++) { arr.push(new Sk.builtin.str(self.lineList[i])); } return new Sk.builtin.list(arr); }); Sk.builtin.file.prototype["seek"] = new Sk.builtin.func(function (self, offset, whence) { if (whence === undefined) { whence = 1; } if (whence == 1) { self.pos$ = offset; } else { self.pos$ = self.data$ + offset; } }); Sk.builtin.file.prototype["tell"] = new Sk.builtin.func(function (self) { return self.pos$; }); Sk.builtin.file.prototype["truncate"] = new Sk.builtin.func(function (self, size) { goog.asserts.fail(); }); Sk.builtin.file.prototype["write"] = new Sk.builtin.func(function (self, str) { if (self.fileno === 1) { Sk.output(Sk.ffi.remapToJs(str)); } else { goog.asserts.fail(); } }); goog.exportSymbol("Sk.builtin.file", Sk.builtin.file);