From fda7b595c96d99177fdd93de8da9030348a3f8fb Mon Sep 17 00:00:00 2001 From: Jose Antonio Marquez Date: Sun, 18 Mar 2012 12:34:29 -0700 Subject: Temp I/O functionality for M-JS components Added the ability to save montages component serialization from Ninja. Very rough, but functional. --- js/mediators/io-mediator.js | 70 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 5 deletions(-) (limited to 'js/mediators/io-mediator.js') diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index d81f4543..01879bac 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -6,10 +6,11 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot //////////////////////////////////////////////////////////////////////// // -var Montage = require("montage/core/core").Montage, - Component = require("montage/ui/component").Component, - FileIo = require("js/io/system/fileio").FileIo, - ProjectIo = require("js/io/system/projectio").ProjectIo; +var Montage = require("montage/core/core").Montage, + Component = require("montage/ui/component").Component, + FileIo = require("js/io/system/fileio").FileIo, + ProjectIo = require("js/io/system/projectio").ProjectIo, + TemplateCreator = require("node_modules/tools/template-creator").TemplateCreator; //////////////////////////////////////////////////////////////////////// // exports.IoMediator = Montage.create(Component, { @@ -369,7 +370,7 @@ exports.IoMediator = Montage.create(Component, { } } // - var json, matchingtags = [], webgltag, scripts = template.document.content.document.getElementsByTagName('script'), webgljstag, webgllibtag, webglrdgetag; + var json, matchingtags = [], webgltag, scripts = template.document.content.document.getElementsByTagName('script'), webgljstag, webgllibtag, webglrdgetag, mjstag, mjslibtag; // for (var i in scripts) { if (scripts[i].getAttribute) { @@ -385,6 +386,12 @@ exports.IoMediator = Montage.create(Component, { if (scripts[i].getAttribute('data-ninja-webgl-rdge') !== null) { webglrdgetag = scripts[i]; // TODO: Add logic to delete unneccesary tags } + if (scripts[i].getAttribute('type') !== 'text/montage-serialization') { + mjstag = scripts[i]; // TODO: Add logic to delete unneccesary tags + } + if (scripts[i].getAttribute('data-mjs-lib') !== null) { + mjslibtag = scripts[i]; // TODO: Add logic to delete unneccesary tags + } } } // @@ -451,6 +458,59 @@ function loadWebGL (e) {\n\ //Setting string in tag webgltag.innerHTML = json; } + + + + + // + var mjsCounter = 0, mjsComponents = [], temp = TemplateCreator.create(); + for (var m in template.mjs) { + mjsComponents.push(template.mjs[m]); + mjsCounter++; + } + +// console.log(mjsComponents); + + //console.log(TemplateCreator.) + + if (template.mjs && mjsCounter > 0) { + var mjsDirName, mjsVersion, + mjscode = temp.initWithHeadAndBodyElements(template.document.content.document.documentElement.head, template.document.content.document.documentElement.body, mjsComponents)._ownerSerialization; + //Copy Montage library if needed + for (var i in this.application.ninja.coreIoApi.ninjaLibrary.libs) { + //Checking for Montage library to be available + if (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name === 'Montage') { + mjsDirName = (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name+this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version).toLowerCase(); + mjsVersion = this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version; + this.application.ninja.coreIoApi.ninjaLibrary.copyLibToCloud(template.document.root, mjsDirName); + //TODO: Fix to allow no overwrite + var packjson = this.application.ninja.coreIoApi.createFile({uri: template.document.root+'package.json', contents: '{"mappings": {"montage": "'+mjsDirName+'/"}}'}); + } else { + //TODO: Error handle no available library to copy + } + } + // + if (!mjslibtag) { + mjslibtag = template.document.content.document.createElement('script'); + mjslibtag.setAttribute('type', 'text/javascript'); + mjslibtag.setAttribute('src', mjsDirName+'/montage.js'); + mjslibtag.setAttribute('data-mjs-lib', 'true'); + template.document.content.document.head.appendChild(mjslibtag); + } + // + if (!mjstag) { + mjstag = template.document.content.document.createElement('script'); + mjstag.setAttribute('type', 'text/montage-serialization'); + template.document.content.document.head.appendChild(mjstag); + } + // + mjstag.innerHTML = mjscode; + } + + + + + //Cleaning URLs from HTML var cleanHTML = template.document.content.document.documentElement.outerHTML.replace(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi, parseNinjaRootUrl.bind(this)); // -- cgit v1.2.3 From 9cb68d376870eea3db3636c30e5fa09d9f71c8cf Mon Sep 17 00:00:00 2001 From: Jose Antonio Marquez Date: Sun, 18 Mar 2012 18:07:40 -0700 Subject: Tests and clean-up --- js/mediators/io-mediator.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'js/mediators/io-mediator.js') diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index 01879bac..18a517a5 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -462,17 +462,17 @@ function loadWebGL (e) {\n\ + + + // var mjsCounter = 0, mjsComponents = [], temp = TemplateCreator.create(); + // for (var m in template.mjs) { mjsComponents.push(template.mjs[m]); mjsCounter++; } - -// console.log(mjsComponents); - - //console.log(TemplateCreator.) - + // if (template.mjs && mjsCounter > 0) { var mjsDirName, mjsVersion, mjscode = temp.initWithHeadAndBodyElements(template.document.content.document.documentElement.head, template.document.content.document.documentElement.body, mjsComponents)._ownerSerialization; @@ -483,7 +483,7 @@ function loadWebGL (e) {\n\ mjsDirName = (this.application.ninja.coreIoApi.ninjaLibrary.libs[i].name+this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version).toLowerCase(); mjsVersion = this.application.ninja.coreIoApi.ninjaLibrary.libs[i].version; this.application.ninja.coreIoApi.ninjaLibrary.copyLibToCloud(template.document.root, mjsDirName); - //TODO: Fix to allow no overwrite + //TODO: Fix to allow no overwrite and nested locations var packjson = this.application.ninja.coreIoApi.createFile({uri: template.document.root+'package.json', contents: '{"mappings": {"montage": "'+mjsDirName+'/"}}'}); } else { //TODO: Error handle no available library to copy @@ -511,6 +511,8 @@ function loadWebGL (e) {\n\ + + //Cleaning URLs from HTML var cleanHTML = template.document.content.document.documentElement.outerHTML.replace(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi, parseNinjaRootUrl.bind(this)); // -- cgit v1.2.3 From 7fbda862c62f37d4c67e4d5a619b7e3cffc309ff Mon Sep 17 00:00:00 2001 From: Jose Antonio Marquez Date: Thu, 22 Mar 2012 16:23:40 -0700 Subject: Adding Ninja URL method to io-mediator --- js/mediators/io-mediator.js | 56 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) (limited to 'js/mediators/io-mediator.js') diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index 18a517a5..cbed3a99 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -532,8 +532,6 @@ function loadWebGL (e) {\n\ getUrlfromNinjaUrl: { enumerable: false, value: function (url, fileRootUrl, fileUrl) { - //console.log("Params: ", url, fileRootUrl, fileUrl); - //console.log("Getting: " + url); // if (url.indexOf(fileRootUrl) !== -1) { url = url.replace(new RegExp(fileRootUrl.replace(/\//gi, '\\\/'), 'gi'), ''); @@ -561,13 +559,63 @@ function loadWebGL (e) {\n\ // url = (path+newURL).replace(/\/\//gi, '/'); } - //console.log("Returning: " + url); - //console.log("-----"); // return url; } }, //////////////////////////////////////////////////////////////////// + // + getDocRootUrl: { + value: function () { + return this.application.ninja.coreIoApi.rootUrl+escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1]).replace(/\/\//gi, '/')); + } + }, + //////////////////////////////////////////////////////////////////// + // + getNinjaPropUrlRedirect: { + enumerable: false, + value: function (prop/* , root */) { + //Checking for property value to not contain a full direct URL + if (!prop.match(/(\b(?:(?:https?|ftp|file|[A-Za-z]+):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$]))/gi)) { + //Checking for attributes and type of source + if (prop.indexOf('href') !== -1 || prop.indexOf('src') !== -1) { + //From HTML attribute + //if (root) { + //prop = (root+prop).replace(/"([^"]*)"/gi, this.getNinjaUrlPrepend.bind(this)); + //} else { + prop = prop.replace(/"([^"]*)"/gi, this.getNinjaUrlPrepend.bind(this)); + //} + } else if (prop.indexOf('url') !== -1) { + //From CSS property + //if (root) { + //prop = (root+prop).replace(/[^()\\""\\'']+/g, cssUrlToNinjaUrl.bind(this)); + //} else { + prop = prop.replace(/[^()\\""\\'']+/g, cssUrlToNinjaUrl.bind(this)); + //} + function cssUrlToNinjaUrl (s) { + if (s !== 'url') { + s = this.getDocRootUrl() + s; + } + return s; + } + } + } + return prop; + } + }, + //////////////////////////////////////////////////////////////////// + // + getNinjaUrlPrepend: { + enumerable: false, + value: function (url) { + if (url.indexOf('data:') !== -1) { + return url; + } else { + return '"'+this.getDocRootUrl()+url.replace(/\"/gi, '')+'"'; + } + } + }, + //////////////////////////////////////////////////////////////////// //Method to return a string from CSS rules (to be saved to a file) getCssFromRules: { enumerable: false, -- cgit v1.2.3 From 7e61ce5aba0c8465595804da21e365baf4d8c15d Mon Sep 17 00:00:00 2001 From: Jose Antonio Marquez Date: Fri, 23 Mar 2012 13:22:42 -0700 Subject: Removing m-js components I/O and fix for webGL Removed saving m-js components as new components broke I/O when present. Also made a fix for checking length of webGL array since first item now is non-user data. (That is to be removed) --- js/mediators/io-mediator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/mediators/io-mediator.js') diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index cbed3a99..1efbb8bb 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -348,7 +348,7 @@ exports.IoMediator = Montage.create(Component, { } } //Checking for webGL elements in document - if (template.webgl && template.webgl.length > 0) { + if (template.webgl && template.webgl.length > 1) {//TODO: Should be length 0, hack for a temp fix var rdgeDirName, rdgeVersion; //Copy webGL library if needed for (var i in this.application.ninja.coreIoApi.ninjaLibrary.libs) { -- cgit v1.2.3 From d5d4dcac78ebf8ba3163a8c7055d783b6397a435 Mon Sep 17 00:00:00 2001 From: John Mayhew Date: Tue, 3 Apr 2012 12:55:54 -0700 Subject: Namespaced the canvas runtime file and updated all dependencies --- js/mediators/io-mediator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/mediators/io-mediator.js') diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index 1efbb8bb..82bb31c4 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -440,7 +440,7 @@ window.addEventListener('load', loadWebGL, false);\n\ function loadWebGL (e) {\n\ window.removeEventListener('load', loadWebGL, false);\n\ //Calling method to initialize all webGL/canvas(es)\n\ - initWebGl("+rootElement+", '"+rdgeDirName+"/');\n\ + NinjaCvsRt.initWebGl(" + rootElement + ", '" + rdgeDirName + "/');\n\ }\ "; //TODO: This data should be saved to a JSON file eventually -- cgit v1.2.3 From 7433f0bfbc3a7ea44320550ed2c1d90dc5e6f170 Mon Sep 17 00:00:00 2001 From: John Mayhew Date: Tue, 3 Apr 2012 16:27:01 -0700 Subject: Removed the dependence on an "assets" directory for the RDGE runtime. Now Ninja does not need to create duplicate files when it sets up the users Ninja Projects directory for RDGE support. --- js/mediators/io-mediator.js | 1094 +++++++++++++++++++++---------------------- 1 file changed, 543 insertions(+), 551 deletions(-) (limited to 'js/mediators/io-mediator.js') diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index 82bb31c4..057a849d 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -14,427 +14,419 @@ var Montage = require("montage/core/core").Montage, //////////////////////////////////////////////////////////////////////// // exports.IoMediator = Montage.create(Component, { - //////////////////////////////////////////////////////////////////// - // - hasTemplate: { - enumerable: false, + //////////////////////////////////////////////////////////////////// + // + hasTemplate: { + enumerable: false, value: false }, - //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////// // - deserializedFromTemplate: { - enumerable: false, - value: function () { - // - } - }, - //////////////////////////////////////////////////////////////////// + deserializedFromTemplate: { + enumerable: false, + value: function () { + // + } + }, + //////////////////////////////////////////////////////////////////// // fio: { - enumerable: false, - value: FileIo + enumerable: false, + value: FileIo }, //////////////////////////////////////////////////////////////////// // pio: { - enumerable: false, - value: ProjectIo + enumerable: false, + value: ProjectIo }, //////////////////////////////////////////////////////////////////// // getAppTemplatesUrlRegEx: { - enumerable: false, - value: function () { - var regex = new RegExp(chrome.extension.getURL('js/document/templates/montage-html').replace(/\//gi, '\\\/'), 'gi'); - return regex; - } + enumerable: false, + value: function () { + var regex = new RegExp(chrome.extension.getURL('js/document/templates/montage-html').replace(/\//gi, '\\\/'), 'gi'); + return regex; + } }, - //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////// // fileNew: { - enumerable: false, - value: function (file, template, callback) { - //Loading template from template URL - var xhr = new XMLHttpRequest(), result; - xhr.open("GET", template, false); + enumerable: false, + value: function (file, template, callback) { + //Loading template from template URL + var xhr = new XMLHttpRequest(), result; + xhr.open("GET", template, false); xhr.send(); - if (xhr.readyState === 4) { - //Making call to create file, checking for return code - switch (this.fio.newFile({uri: file, contents: xhr.response})) { - case 201: - result = {status: 201, success: true, uri: file}; - break; - case 204: - result = {status: 204, success: false, uri: file}; - break; - case 400: - result = {status: 400, success: false, uri: file}; - break; - default: - result = {status: 500, success: false, uri: file}; - break; - } - } else { - result = {status: 500, success: false, uri: file}; - } - //Sending result to callback if requested for handling - if (callback) callback(result); - //Codes - // 204: File exists | 400: File exists - // 201: File succesfully created | 500: Unknown (Probably cloud API not running) - } + if (xhr.readyState === 4) { + //Making call to create file, checking for return code + switch (this.fio.newFile({ uri: file, contents: xhr.response })) { + case 201: + result = { status: 201, success: true, uri: file }; + break; + case 204: + result = { status: 204, success: false, uri: file }; + break; + case 400: + result = { status: 400, success: false, uri: file }; + break; + default: + result = { status: 500, success: false, uri: file }; + break; + } + } else { + result = { status: 500, success: false, uri: file }; + } + //Sending result to callback if requested for handling + if (callback) callback(result); + //Codes + // 204: File exists | 400: File exists + // 201: File succesfully created | 500: Unknown (Probably cloud API not running) + } }, //////////////////////////////////////////////////////////////////// // fileOpen: { - enumerable: false, - value: function (file, callback) { - //Reading file (Ninja doesn't really open a file, all in browser memory) - var read = this.fio.readFile({uri: file}), result; - //Checking for status - switch(read.status) { - case 204: - //Creating and formatting result object for callbak - result = read.file.details; - result.root = read.file.details.uri.replace(read.file.details.name, ""); - //Checking for type of content to returns - if (result.extension !== 'html' && result.extension !== 'htm') { - //Simple string - result.content = read.file.content; - } else { - //Object to be used by Ninja Template - result.content = this.parseHtmlToNinjaTemplate(read.file.content); - } - //Status of call - result.status = read.status; - //Calling back with result - if (callback) callback(result); - break; - case 404: - //File does not exists - if (callback) callback({status: read.status}); - break; - default: - //Unknown - if (callback) callback({status: 500}); - break; - } - /* - //////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////// - //Return Object Description - Object.status (Always presents for handling) - 204: File exists (Success) - 404: File does not exists (Failure) - 500: Unknown (Probably cloud API not running) + enumerable: false, + value: function (file, callback) { + //Reading file (Ninja doesn't really open a file, all in browser memory) + var read = this.fio.readFile({ uri: file }), result; + //Checking for status + switch (read.status) { + case 204: + //Creating and formatting result object for callbak + result = read.file.details; + result.root = read.file.details.uri.replace(read.file.details.name, ""); + //Checking for type of content to returns + if (result.extension !== 'html' && result.extension !== 'htm') { + //Simple string + result.content = read.file.content; + } else { + //Object to be used by Ninja Template + result.content = this.parseHtmlToNinjaTemplate(read.file.content); + } + //Status of call + result.status = read.status; + //Calling back with result + if (callback) callback(result); + break; + case 404: + //File does not exists + if (callback) callback({ status: read.status }); + break; + default: + //Unknown + if (callback) callback({ status: 500 }); + break; + } + /* + //////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////// + //Return Object Description + Object.status (Always presents for handling) + 204: File exists (Success) + 404: File does not exists (Failure) + 500: Unknown (Probably cloud API not running) - (Below only present if succesfull 204) + (Below only present if succesfull 204) - Object.content - Object.extension - Object.name - Object.uri - Object.creationDate - Object.modifiedDate - Object.readOnly - Object.size - //////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////// - */ - } + Object.content + Object.extension + Object.name + Object.uri + Object.creationDate + Object.modifiedDate + Object.readOnly + Object.size + //////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////// + */ + } }, //////////////////////////////////////////////////////////////////// // fileSave: { - enumerable: false, - value: function (file, callback) { - // - var contents, save; - // - switch (file.mode) { - case 'html': - - - //TODO: Add check for Monatage library to copy - - //Getting content from function to properly handle saving assets (as in external if flagged) - contents = this.parseNinjaTemplateToHtml(file); - break; - default: - contents = file.content; - break; - } - //Making call to save file - save = this.fio.saveFile({uri: file.document.uri, contents: contents}); + enumerable: false, + value: function (file, callback) { + // + var contents, save; + // + switch (file.mode) { + case 'html': + + + //TODO: Add check for Monatage library to copy + + //Getting content from function to properly handle saving assets (as in external if flagged) + contents = this.parseNinjaTemplateToHtml(file); + break; + default: + contents = file.content; + break; + } + //Making call to save file + save = this.fio.saveFile({ uri: file.document.uri, contents: contents }); //Checking for callback if (callback) callback(save); - } + } }, //////////////////////////////////////////////////////////////////// // fileSaveAs: { - enumerable: false, - value: function (copyTo, copyFrom, callback) { - //TODO: Implement Save As functionality - } + enumerable: false, + value: function (copyTo, copyFrom, callback) { + //TODO: Implement Save As functionality + } }, //////////////////////////////////////////////////////////////////// // fileDelete: { - enumerable: false, - value: function (file, callback) { - //TODO: Implement Delete functionality - } + enumerable: false, + value: function (file, callback) { + //TODO: Implement Delete functionality + } }, //////////////////////////////////////////////////////////////////// // parseHtmlToNinjaTemplate: { - enumerable: false, - value: function (html) { - //Creating temp object to mimic HTML - var doc = window.document.implementation.createHTMLDocument(), template; - //Setting content to temp - doc.getElementsByTagName('html')[0].innerHTML = html; - //Creating return object - return {head: doc.head.innerHTML, body: doc.body.innerHTML, document: doc}; - } + enumerable: false, + value: function (html) { + //Creating temp object to mimic HTML + var doc = window.document.implementation.createHTMLDocument(), template; + //Setting content to temp + doc.getElementsByTagName('html')[0].innerHTML = html; + //Creating return object + return { head: doc.head.innerHTML, body: doc.body.innerHTML, document: doc }; + } }, //////////////////////////////////////////////////////////////////// //TODO: Expand to allow more templates, clean up variables parseNinjaTemplateToHtml: { - enumerable: false, - value: function (template) { - var regexRootUrl, rootUrl = this.application.ninja.coreIoApi.rootUrl+escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1])); - regexRootUrl = new RegExp(rootUrl.replace(/\//gi, '\\\/'), 'gi'); - //Injecting head and body into old document - template.document.content.document.head.innerHTML = template.head.replace(regexRootUrl, ''); - template.document.content.document.body.innerHTML = template.body.replace(regexRootUrl, ''); - //Getting all CSS (style or link) tags - var styletags = template.document.content.document.getElementsByTagName('style'), + enumerable: false, + value: function (template) { + var regexRootUrl, rootUrl = this.application.ninja.coreIoApi.rootUrl + escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1])); + regexRootUrl = new RegExp(rootUrl.replace(/\//gi, '\\\/'), 'gi'); + //Injecting head and body into old document + template.document.content.document.head.innerHTML = template.head.replace(regexRootUrl, ''); + template.document.content.document.body.innerHTML = template.body.replace(regexRootUrl, ''); + //Getting all CSS (style or link) tags + var styletags = template.document.content.document.getElementsByTagName('style'), linktags = template.document.content.document.getElementsByTagName('link'), toremovetags = []; - //Getting styles tags to be removed from document - if (styletags.length) { - for (var j=0; j only | css =