diff --git a/__init__.js b/__init__.js index 6c975c6..80f9364 100644 --- a/__init__.js +++ b/__init__.js @@ -1,6 +1,51 @@ var $builtinmodule = function(name) { + function fill(arr, val) { + if (Array.prototype.fill) { + return Array.prototype.fill.bind(arr)(val, arguments[2], arguments[3]); + } + + // Steps 1-2. + if (arr == null) { + throw new TypeError('arr is null or not defined'); + } + + var O = Object(arr); + + // Steps 3-5. + var len = O.length >>> 0; + + // Steps 6-7. + var start = arguments[2]; + var relativeStart = start >> 0; + + // Step 8. + var k = relativeStart < 0 ? + Math.max(len + relativeStart, 0) : + Math.min(relativeStart, len); + + // Steps 9-10. + var end = arguments[3]; + var relativeEnd = end === undefined ? + len : end >> 0; + + // Step 11. + var final = relativeEnd < 0 ? + Math.max(len + relativeEnd, 0) : + Math.min(relativeEnd, len); + + // Step 12. + while (k < final) { + O[k] = value; + k++; + } + + // Step 13. + return O; + } + + var mod = {}; - + var COLORS = [ [255, 89, 149], [182, 227, 84], [254, 237, 108], [140, 237, 255], [158, 111, 254], [137, 156, 161], [248, 248, 242], [191, 70, 70], @@ -131,10 +176,14 @@ var $builtinmodule = function(name) { return ''; } + function some(val) { + return val && val !== Sk.builtin.none.none$; + } + function kwfunc(impl, kwargs) { if (kwargs && kwargs.length) { - impl.co_kwargs = true; impl.co_varnames = ['__self__'].concat(kwargs); + impl.$defaults = fill(new Array(kwargs.length), Sk.builtin.none.none$); } return new Sk.builtin.func(impl); } @@ -142,22 +191,22 @@ var $builtinmodule = function(name) { function createChartType(type, renderer) { mod[type] = Sk.misceval.buildClass(mod, function($gbl, $loc) { $loc.__init__ = kwfunc( - function(trash, self, title, width, height, range, include_x_axis, x_title, y_title, title_font_size, fill, stroke, x_labels) { + function(self, title, width, height, range, include_x_axis, x_title, y_title, title_font_size, fill, stroke, x_labels) { var options = {}; - if (title) options.title = title.v; - if (width) options.width = width.v; - if (height) options.height = height.v; - if (range) options.range = { + if (some(title)) options.title = title.v; + if (some(width)) options.width = width.v; + if (some(height)) options.height = height.v; + if (some(range)) options.range = { min: range.v[0].v, max: range.v[1].v }; - if (include_x_axis) options.include_x_axis = include_x_axis.v; - if (x_title) options.x_title = x_title.v; - if (y_title) options.y_title = y_title.v; - if (title_font_size) options.title_font_size = title_font_size.v; - if (fill) options.fill = fill.v; - if (stroke) options.stroke = stroke.v; - if (x_labels) options.x_labels = x_labels.v; + if (some(include_x_axis)) options.include_x_axis = include_x_axis.v; + if (some(x_title)) options.x_title = x_title.v; + if (some(y_title)) options.y_title = y_title.v; + if (some(title_font_size)) options.title_font_size = title_font_size.v; + if (some(fill)) options.fill = fill.v; + if (some(stroke)) options.stroke = stroke.v; + if (some(x_labels)) options.x_labels = x_labels.v; self.instance = new Chart(options); }, KWARGS diff --git a/bower.json b/bower.json index e72a3e9..3beef6f 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pygal.js", - "version": "0.0.0", + "version": "0.2.0", "homepage": "https://github.com/trinketapp/pygal.js", "authors": [ "Benjamin Wheeler " diff --git a/demo.html b/demo.html index 1c7364d..8fafcbd 100644 --- a/demo.html +++ b/demo.html @@ -1,7 +1,7 @@ - - + + @@ -16,10 +16,70 @@ mypre.innerHTML = mypre.innerHTML + text; } function builtinRead(x) { - if (Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined) - throw "File not found: '" + x + "'"; - return Sk.builtinFiles["files"][x]; -} + if (Sk.builtinFiles !== undefined && Sk.builtinFiles["files"][x] !== undefined) { + return Sk.builtinFiles["files"][x]; + } + + if (Sk.externalLibraries[x]) { + var externalLibraryInfo = Sk.externalLibraries[x]; + return Sk.misceval.promiseToSuspension( + new Promise(function(resolve, reject) { + // get the main skulpt extenstion + var request = new XMLHttpRequest(); + request.open("GET", externalLibraryInfo.path); + request.onload = function() { + if (request.status === 200) { + resolve(request.responseText); + } else { + reject("File not found: '" + x + "'"); + } + }; + + request.onerror = function() { + reject("File not found: '" + x + "'"); + } + + request.send(); + }).then(function (code) { + if (!code) { + throw new Sk.builtin.ImportError("Failed to load remote module '" + name + "'"); + } + + var promise; + + function mapUrlToPromise(path) { + return new Promise(function(resolve, reject) { + scriptElement = document.createElement("script"); + scriptElement.type = "text/javascript"; + scriptElement.src = path; + scriptElement.async = true + scriptElement.onload = function() { + resolve(true); + } + + document.body.appendChild(scriptElement); + }); + } + + if (externalLibraryInfo.loadDepsSynchronously) { + promise = (externalLibraryInfo.dependencies || []).reduce((p, url) => { + return p.then(() => mapUrlToPromise(url)); + }, Promise.resolve()); // initial + } else { + promise = Promise.all((externalLibraryInfo.dependencies || []).map(mapUrlToPromise)); + } + + return promise.then(function() { + return code; + }).catch(function() { + throw new Sk.builtin.ImportError("Failed to load dependencies required for " + name); + }); + }) + ); + } + + throw "File not found '" + x + "'"; + } // Here's everything you need to run a python program in skulpt // grab the code from your textarea @@ -43,12 +103,14 @@ }); } Sk.externalLibraries = { - pygal : { - path : '__init__.js', - dependencies : [ - 'https://cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.2/highcharts.js', - 'https://cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.2/js/highcharts-more.js' - ]} + './pygal/__init__.js' : { + path : '__init__.js', + dependencies : [ + 'https://cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.2/highcharts.js', + 'https://cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.2/js/highcharts-more.js' + ], + loadDepsSynchronously: true + } }; Sk.domOutput = function(html) { console.log(html);//-->here get the div tag with no content @@ -94,4 +156,4 @@

Try This

- \ No newline at end of file +