%PDF- %PDF-
| Direktori : /home/riacommer/public_html/admin/vendor/messenger/docs/welcome/lib/executr/build/js/ |
| Current File : /home/riacommer/public_html/admin/vendor/messenger/docs/welcome/lib/executr/build/js/executr.js |
(function() {
var Editor, converters, getCodeElement, insertOutput, normalizeType, runners;
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
runners = {
'javascript': function(opts, code) {
return eval(code);
}
};
converters = {
'coffeescript:javascript': function(opts, code) {
var csOptions;
csOptions = $.extend({}, opts.coffeeOptions, {
bare: true
});
return CoffeeScript.compile(code, csOptions);
},
'javascript:coffeescript': function(opts, code) {
var out;
if (Js2coffee) {
return out = Js2coffee.build(code);
} else {
console.error("Can't convert javascript to coffeescript");
return code;
}
}
};
normalizeType = function(codeType) {
switch (codeType.toLowerCase()) {
case 'js':
case 'javascript':
case 'text/javascript':
case 'application/javascript':
return 'javascript';
case 'cs':
case 'coffee':
case 'coffeescript':
case 'text/coffeescript':
case 'application/coffeescript':
return 'coffeescript';
default:
return console.error("Code type " + codeType + " not understood.");
}
};
Editor = (function() {
function Editor(args) {
this.el = args.el;
this.opts = args.opts;
this.codeCache = {};
this.$el = $(this.el);
this.buildEditor();
this.addRunButton();
this.addListeners();
}
Editor.prototype.getValue = function() {
return this.editor.getValue();
};
Editor.prototype.addListeners = function() {
return this.$el.on('executrSwitchType', __bind(function(e, type) {
return this.switchType(type);
}, this));
};
Editor.prototype.addRunButton = function() {
this.$runButton = $('<button>');
this.$runButton.addClass('executr-run-button');
this.$runButton.text(this.opts.buttonText);
this.$editorCont.append(this.$runButton);
this.$runButton.css({
top: "" + (this.$editorCont.height() / 2 - this.$runButton.height() / 2) + "px"
});
if (this.$editorCont.height() < parseInt(this.$runButton.css('font-size'), 10) + 4) {
this.$runButton.css('font-size', "" + (this.$editorCont.height() - 4) + "px");
}
return this.$runButton.click(__bind(function() {
return this.execute();
}, this));
};
Editor.prototype.buildEditor = function() {
var code, mirrorOpts, type, _ref, _ref2;
this.$editorCont = $('<div>');
this.$editorCont.addClass('executr-code-editor');
this.$editorCont.css({
height: "" + (this.$el.height() + 10) + "px",
width: "" + (this.$el.width()) + "px"
});
this.$editorCont.insertBefore(this.$el);
this.$el.detach();
if (typeof this.opts.type === 'function') {
type = this.opts.type(this.$el, this);
} else {
type = (_ref = (_ref2 = this.opts.type) != null ? _ref2 : this.$el.attr('data-type')) != null ? _ref : this.opts.defaultType;
}
type = normalizeType(type);
code = this.$el.text();
mirrorOpts = {
value: code,
mode: type
};
this.codeCache[type] = code;
this.editor = CodeMirror(this.$editorCont[0], $.extend(mirrorOpts, this.opts.codeMirrorOptions));
return this.editor.on('change', __bind(function(doc, changeObj) {
if ((changeObj != null ? changeObj.origin : void 0) && !(changeObj.origin instanceof Object)) {
return this.codeCache = {};
}
}, this));
};
Editor.prototype.getType = function() {
return this.editor.getMode().name;
};
Editor.prototype.switchType = function(type) {
var code, converter, currentType, scrollInfo;
type = normalizeType(type);
currentType = this.getType();
if (type === currentType) {
return;
}
if (this.codeCache[type]) {
code = this.codeCache[type];
} else {
converter = converters["" + currentType + ":" + type];
if (converter == null) {
console.error("Can't convert " + currentType + " to " + type);
return;
}
code = converter(this.opts, this.editor.getValue());
this.codeCache[type] = code;
}
this.editor.setOption('mode', type);
this.editor.setValue(code);
this.editor.refresh();
scrollInfo = this.editor.getScrollInfo();
return this.$editorCont.css({
height: "" + scrollInfo.height + "px"
});
};
Editor.prototype.run = function(type, opts, code) {
var from, func, key, runner, to, _ref;
runner = runners[type];
if (runner == null) {
for (key in converters) {
func = converters[key];
_ref = key.split(':'), from = _ref[0], to = _ref[1];
if (type === from && runners[to]) {
runner = runners[to];
code = func(opts, code);
}
}
}
if (!(runner != null)) {
console.error("Couldn't find a way to run " + type + " block");
return;
}
return runner(opts, code);
};
Editor.prototype.execute = function() {
var code, codeType, output;
code = this.getValue();
codeType = this.getType();
this.$el.trigger('executrBeforeExecute', [code, codeType, this.opts]);
if (this.opts.setUp != null) {
this.opts.setUp(codeType, this.opts);
}
output = this.run(codeType, this.opts, code);
if (this.opts.tearDown != null) {
this.opts.tearDown(output, codeType, this.opts);
}
this.$el.trigger('executrAfterExecute', [output, code, codeType, this.opts]);
return insertOutput(this.opts, output);
};
return Editor;
})();
getCodeElement = function(e, opts) {
var $code, $target;
$target = $(e.target);
$code = $target.parents(opts.codeSelector);
if (!$code.length && $target.is(opts.codeSelector)) {
$code = $target;
}
return $code;
};
insertOutput = function(opts, output) {
if (opts.outputTo) {
if (opts.appendOutput) {
return $(opts.outputTo).append($('<div>').text(output));
} else {
return $(opts.outputTo).text(output);
}
}
};
$.fn.executr = function(opts) {
var codeSelectors, defaults;
defaults = {
codeSelector: 'code[executable]',
outputTo: false,
appendOutput: true,
defaultType: 'coffee',
buttonText: "RUN"
};
opts = $.extend({}, defaults, opts);
if (this.is(opts.codeSelector)) {
opts.codeSelector = null;
}
codeSelectors = this.find(opts.codeSelector);
codeSelectors.each(function(i, el) {
return new Editor({
el: el,
opts: opts
});
});
return $('.executr-switch').click(function() {
var $this, codeType;
$this = $(this);
$this.addClass('selected').siblings().removeClass('selected');
codeType = $this.attr('data-code-type');
return codeSelectors.trigger('executrSwitchType', codeType);
});
};
}).call(this);