summaryrefslogtreecommitdiff
path: root/wikipedia/utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'wikipedia/utils.js')
-rw-r--r--wikipedia/utils.js191
1 files changed, 191 insertions, 0 deletions
diff --git a/wikipedia/utils.js b/wikipedia/utils.js
new file mode 100644
index 0000000..bdc2b3c
--- /dev/null
+++ b/wikipedia/utils.js
@@ -0,0 +1,191 @@
+const Gio = imports.gi.Gio;
+const Clutter = imports.gi.Clutter;
+const Cogl = imports.gi.Cogl;
+const GdkPixbuf = imports.gi.GdkPixbuf;
+
+const set_default = function(obj, key, val) {
+ // Similar to python's dict.setdefault(key, val)
+ if(obj[key] === undefined)
+ obj[key] = val;
+}
+
+const default_param = function(variable, defaultValue) {
+ // Emulate python's default parameter values
+ if(variable === undefined)
+ return defaultValue;
+ else
+ return variable;
+}
+
+const range = function(a, b, step) {
+ // Emulate python's range function
+ var A = [];
+ if(typeof a == 'number'){
+ if(typeof b == 'undefined'){
+ b = a - 1;
+ a = 0;
+ }
+ A[0] = a;
+ step = step || 1;
+ while(a + step < b){
+ A[A.length] = a += step;
+ }
+ }
+ return A;
+}
+
+/*
+ * ...Taken from utils.js from the eos-weather branch...
+ */
+function load_file_from_resource(filename) {
+ // Return the text stored in the file at filename
+ var file = Gio.file_new_for_uri(filename);
+ var fstream = file.read(null);
+ var dstream = new Gio.DataInputStream({
+ base_stream: fstream
+ });
+ var data = dstream.read_until("", null);
+ fstream.close(null);
+ return data[0];
+}
+
+function write_contents_to_file(filename, content){
+ let file = Gio.file_new_for_path(filename);
+ file.replace_contents(content, null, false, 0, null);
+}
+
+/*
+ * ...Taken from utils.js from the eos-weather branch...
+ */
+function load_file(filename) {
+ // Return the text stored in the file at filename
+ var file = Gio.file_new_for_path(filename);
+ var fstream = file.read(null);
+ var dstream = new Gio.DataInputStream({
+ base_stream: fstream
+ });
+ var data = dstream.read_until("", null);
+ fstream.close(null);
+ return data[0];
+}
+
+/*
+ * Compares two lists *a* and *b* to see if they contain
+ * the same contents, ignoring order. Contents are defined
+ * to be equal via JSON representation, unless they are
+ * primitives, then String() casting is used.
+ *
+ * If passed non-list objects, this method has undefined
+ * behavior. Algorithm is not exceptionally optimized and has
+ * O(n^2) performance.
+ *
+ * Method treats elements that are logically equivalent but
+ * not type-equivalent to be the same. Thus the string of
+ * "3" is considered to equal the integer 3 in these comparisons.
+ *
+ * Returns true if a and b contain the same elements in
+ * any order.
+ */
+const set_equals = function (a, b) {
+ if (typeof a != "object" || typeof b != "object") {
+ return false;
+ }
+ if (a.length != b.length) {
+ // Optimization
+ return false;
+ }
+ let matched_of_a = 0;
+ for (let i = 0; i < a.length; i++) {
+ let i_string = typeof a[i] == "object" ? JSON.stringify (a[i]) : String(a[i]);
+ for (let j = 0; j < b.length; j++) {
+ let j_string = typeof b[j] == "object" ? JSON.stringify (b[j]) : String(b[j]);
+ if (j_string == i_string) {
+ matched_of_a++;
+ }
+ }
+ }
+ let matched_of_b = 0;
+ for (let i = 0; i < b.length; i++) {
+ let i_string = typeof b[i] == "object" ? JSON.stringify (b[i]) : String(b[i]);
+ for (let j = 0; j < a.length; j++) {
+ let j_string = typeof a[j] == "object" ? JSON.stringify (a[j]) : String(a[j]);
+ if (j_string == i_string) {
+ matched_of_b++;
+ }
+ }
+ }
+ if (matched_of_a == a.length &&
+ matched_of_b == matched_of_a)
+ {
+ return true;
+ }
+ return false;
+};
+
+/*
+ * Checks to see if an array *arr* contains on element *obj*. If
+ * *same_type* is provided (and is true), the objects must
+ * actually be the same type as well to be considered part of the
+ * array.
+ *
+ * Somehow reminds the user of a pirate.
+ */
+const array_contains = function (arr, obj, same_type) {
+ if (same_type == true) {
+ for (let i = 0; i < arr.length; i++) {
+ if (arr[i] === obj) {
+ return true;
+ }
+ }
+ } else {
+ for (let i = 0; i < arr.length; i++) {
+ if (arr[i] == obj) {
+ return true;
+ }
+ }
+ }
+ return false;
+};
+
+// Convenience function to parse a clutter color from a string
+function parse_clutter_color(color_string) {
+ let [res, color] = Clutter.Color.from_string(color_string);
+ return color;
+}
+
+// Convenience function to load a gresource image into a Clutter.Image
+function load_clutter_image_from_resource(resource_path) {
+ let pixbuf = GdkPixbuf.Pixbuf.new_from_resource(resource_path);
+ let image = new Clutter.Image();
+ if (pixbuf != null) {
+ image.set_data(pixbuf.get_pixels(),
+ pixbuf.get_has_alpha()
+ ? Cogl.PixelFormat.RGBA_8888
+ : Cogl.PixelFormat.RGB_888,
+ pixbuf.get_width(),
+ pixbuf.get_height(),
+ pixbuf.get_rowstride());
+ }
+ return image;
+}
+
+// Private function to format a clutter actors allocation and print it
+function _clutter_allocation_printer(actor, box, flag) {
+ print("Allocation for", actor);
+ print(" Xs:", box.x1, box.x2);
+ print(" Ys:", box.y1, box.y2);
+}
+
+// Call this function on a clutter actor to have it log it's allocation to
+// console
+function print_clutter_actor_allocation(actor) {
+ actor.connect('allocation-changed', _clutter_allocation_printer);
+}
+
+// Convenience function to convert a resource URI to a resource path, for
+// APIs that expect a path rather than an URI
+function resourceUriToPath(uri) {
+ if(uri.startsWith('resource://'))
+ return uri.slice('resource://'.length);
+ throw new Error('Resource URI did not start with "resource://"');
+}