/** * configurator.js * * Marlin Configuration Utility * - Web form for entering configuration options * - A reprap calculator to calculate movement values * - Uses HTML5 to generate downloadables in Javascript * - Reads and parses standard configuration files from local folders * * Supporting functions * - Parser to read Marlin Configuration.h and Configuration_adv.h files * - Utilities to replace values in configuration files */ "use strict"; $(function(){ /** * Github API useful GET paths. (Start with "https://api.github.com/repos/:owner/:repo/") * * contributors Get a list of contributors * tags Get a list of tags * contents/[path]?ref=branch/tag/commit Get the contents of a file */ // GitHub // Warning! Limited to 60 requests per hour! var config = { type: 'github', host: 'https://api.github.com', owner: 'MarlinFirmware', repo: 'Marlin', ref: 'Development', path: 'Marlin/configurator/config' }; /**/ /* // Remote var config = { type: 'remote', host: 'http://www.thinkyhead.com', path: '_marlin/config' }; /**/ /* // Local var config = { type: 'local', path: 'config' }; /**/ function github_command(conf, command, path) { var req = conf.host+'/repos/'+conf.owner+'/'+conf.repo+'/'+command; if (path) req += '/' + path; return req; } function config_path(item) { var path = '', ref = ''; switch(config.type) { case 'github': path = github_command(config, 'contents', config.path); if (config.ref !== undefined) ref = '?ref=' + config.ref; break; case 'remote': path = config.host + '/' + config.path + '/'; break; case 'local': path = config.path + '/'; break; } return path + '/' + item + ref; } // Extend builtins String.prototype.lpad = function(len, chr) { if (chr === undefined) { chr = ' '; } var s = this+'', need = len - s.length; if (need > 0) { s = new Array(need+1).join(chr) + s; } return s; }; String.prototype.prePad = function(len, chr) { return len ? this.lpad(len, chr) : this; }; String.prototype.zeroPad = function(len) { return this.prePad(len, '0'); }; String.prototype.toHTML = function() { return jQuery('
').text(this).html(); }; String.prototype.regEsc = function() { return this.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"); } String.prototype.lineCount = function(ind) { var len = (ind === undefined ? this : this.substr(0,ind*1)).split(/\r?\n|\r/).length; return len > 0 ? len - 1 : 0; }; String.prototype.line = function(num) { var arr = this.split(/\r?\n|\r/); return num < arr.length ? arr[1*num] : ''; }; String.prototype.replaceLine = function(num,txt) { var arr = this.split(/\r?\n|\r/); if (num < arr.length) { arr[num] = txt; return arr.join('\n'); } else return this; } String.prototype.toLabel = function() { return this.replace(/[\[\]]/g, '').replace(/_/g, ' ').toTitleCase(); } String.prototype.toTitleCase = function() { return this.replace(/([A-Z])(\w+)/gi, function(m,p1,p2) { return p1.toUpperCase() + p2.toLowerCase(); }); } Number.prototype.limit = function(m1, m2) { if (m2 == null) return this > m1 ? m1 : this; return this < m1 ? m1 : this > m2 ? m2 : this; }; Date.prototype.fileStamp = function(filename) { var fs = this.getFullYear() + ((this.getMonth()+1)+'').zeroPad(2) + (this.getDate()+'').zeroPad(2) + (this.getHours()+'').zeroPad(2) + (this.getMinutes()+'').zeroPad(2) + (this.getSeconds()+'').zeroPad(2); if (filename !== undefined) return filename.replace(/^(.+)(\.\w+)$/g, '$1-['+fs+']$2'); return fs; } /** * selectField.addOptions takes an array or keyed object */ $.fn.extend({ addOptions: function(arrObj) { return this.each(function() { var sel = $(this); var isArr = Object.prototype.toString.call(arrObj) == "[object Array]"; $.each(arrObj, function(k, v) { sel.append( $('