123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634 |
- (function() {
- var $, Builder, CustomElementPrototype, Events, Grim, JQueryEventAdd, SelfClosingTags, Tags, View, docEl, exports, idCounter, jQuery, matches, matchesSelector, registerElement, _,
- __hasProp = {}.hasOwnProperty,
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
- __slice = [].slice;
- if (typeof require === 'function') {
- _ = require('underscore-plus');
- $ = jQuery = require('jquery');
- Grim = require('grim');
- } else {
- _ = window._, jQuery = window.jQuery;
- $ = jQuery;
- }
- Tags = 'a abbr address article aside audio b bdi bdo blockquote body button canvas\
- caption cite code colgroup datalist dd del details dfn dialog div dl dt em\
- fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header html i\
- iframe ins kbd label legend li main map mark menu meter nav noscript object\
- ol optgroup option output p pre progress q rp rt ruby s samp script section\
- select small span strong style sub summary sup table tbody td textarea tfoot\
- th thead time title tr u ul var video area base br col command embed hr img\
- input keygen link meta param source track wbr'.split(/\s+/);
- SelfClosingTags = {};
- 'area base br col command embed hr img input keygen link meta param\
- source track wbr'.split(/\s+/).forEach(function(tag) {
- return SelfClosingTags[tag] = true;
- });
- Events = 'blur change click dblclick error focus input keydown\
- keypress keyup load mousedown mousemove mouseout mouseover\
- mouseup resize scroll select submit unload'.split(/\s+/);
- docEl = document.documentElement;
- matches = docEl.matchesSelector || docEl.mozMatchesSelector || docEl.webkitMatchesSelector || docEl.oMatchesSelector || docEl.msMatchesSelector;
- matchesSelector = matches ? (function(elem, selector) {
- return matches.call(elem[0], selector);
- }) : (function(elem, selector) {
- return elem.is(selector);
- });
- idCounter = 0;
- CustomElementPrototype = Object.create(HTMLElement.prototype);
- CustomElementPrototype.attachedCallback = function() {
- return typeof this.attached === "function" ? this.attached() : void 0;
- };
- CustomElementPrototype.detachedCallback = function() {
- return typeof this.detached === "function" ? this.detached() : void 0;
- };
- if (window.__spacePenCustomElements == null) {
- window.__spacePenCustomElements = {};
- }
- registerElement = function(tagName) {
- var customTagName, _base;
- customTagName = "space-pen-" + tagName;
- if ((_base = window.__spacePenCustomElements)[customTagName] == null) {
- _base[customTagName] = typeof document.registerElement === "function" ? document.registerElement(customTagName, {
- prototype: Object.create(CustomElementPrototype),
- "extends": tagName
- }) : void 0;
- }
- return customTagName;
- };
- View = (function(_super) {
- __extends(View, _super);
- View.builderStack = null;
- Tags.forEach(function(tagName) {
- return View[tagName] = function() {
- var args, _ref;
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
- return (_ref = this.currentBuilder).tag.apply(_ref, [tagName].concat(__slice.call(args)));
- };
- });
- View.subview = function(name, view) {
- return this.currentBuilder.subview(name, view);
- };
- View.text = function(string) {
- return this.currentBuilder.text(string);
- };
- View.tag = function() {
- var args, tagName, _ref;
- tagName = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- return (_ref = this.currentBuilder).tag.apply(_ref, [tagName].concat(__slice.call(args)));
- };
- View.raw = function(string) {
- return this.currentBuilder.raw(string);
- };
- View.pushBuilder = function() {
- var builder;
- builder = new Builder;
- if (this.builderStack == null) {
- this.builderStack = [];
- }
- this.builderStack.push(builder);
- return this.currentBuilder = builder;
- };
- View.popBuilder = function() {
- this.currentBuilder = this.builderStack[this.builderStack.length - 2];
- return this.builderStack.pop();
- };
- View.buildHtml = function(fn) {
- var html, postProcessingSteps, _ref;
- this.pushBuilder();
- fn.call(this);
- return _ref = this.popBuilder().buildHtml(), html = _ref[0], postProcessingSteps = _ref[1], _ref;
- };
- View.render = function(fn) {
- var div, fragment, html, postProcessingSteps, step, _i, _len, _ref;
- _ref = this.buildHtml(fn), html = _ref[0], postProcessingSteps = _ref[1];
- div = document.createElement('div');
- div.innerHTML = html;
- fragment = $(div.childNodes);
- for (_i = 0, _len = postProcessingSteps.length; _i < _len; _i++) {
- step = postProcessingSteps[_i];
- step(fragment);
- }
- return fragment;
- };
- View.prototype.element = null;
- function View() {
- var args, element, html, postProcessingSteps, step, treeWalker, _i, _len, _ref,
- _this = this;
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
- if (typeof this.afterAttach === 'function') {
- throw new Error("The ::afterAttach hook has been replaced by ::attached. See https://github.com/atom/space-pen#attacheddetached-hooks for details.");
- }
- if (typeof this.beforeRemove === 'function') {
- throw new Error("The ::beforeRemove hook has been replaced by ::detached. See https://github.com/atom/space-pen#attacheddetached-hooks for details.");
- }
- if (this.element != null) {
- jQuery.fn.init.call(this, this.element);
- } else {
- _ref = this.constructor.buildHtml(function() {
- return this.content.apply(this, args);
- }), html = _ref[0], postProcessingSteps = _ref[1];
- jQuery.fn.init.call(this, html);
- if (this.length !== 1) {
- throw new Error("View markup must have a single root element");
- }
- this.element = this[0];
- this.element.attached = function() {
- return typeof _this.attached === "function" ? _this.attached() : void 0;
- };
- this.element.detached = function() {
- return typeof _this.detached === "function" ? _this.detached() : void 0;
- };
- }
- this.wireOutlets(this);
- this.bindEventHandlers(this);
- this.element.spacePenView = this;
- treeWalker = document.createTreeWalker(this.element, NodeFilter.SHOW_ELEMENT);
- while (element = treeWalker.nextNode()) {
- element.spacePenView = this;
- }
- if (postProcessingSteps != null) {
- for (_i = 0, _len = postProcessingSteps.length; _i < _len; _i++) {
- step = postProcessingSteps[_i];
- step(this);
- }
- }
- if (typeof this.initialize === "function") {
- this.initialize.apply(this, args);
- }
- }
- View.prototype.buildHtml = function(params) {
- var html, postProcessingSteps, _ref;
- this.constructor.builder = new Builder;
- this.constructor.content(params);
- _ref = this.constructor.builder.buildHtml(), html = _ref[0], postProcessingSteps = _ref[1];
- this.constructor.builder = null;
- return postProcessingSteps;
- };
- View.prototype.wireOutlets = function(view) {
- var element, outlet, _i, _len, _ref;
- _ref = view[0].querySelectorAll('[outlet]');
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- element = _ref[_i];
- outlet = element.getAttribute('outlet');
- view[outlet] = $(element);
- element.removeAttribute('outlet');
- }
- return void 0;
- };
- View.prototype.bindEventHandlers = function(view) {
- var element, eventName, methodName, selector, _fn, _i, _j, _len, _len1, _ref;
- for (_i = 0, _len = Events.length; _i < _len; _i++) {
- eventName = Events[_i];
- selector = "[" + eventName + "]";
- _ref = view[0].querySelectorAll(selector);
- _fn = function(element) {
- var methodName;
- methodName = element.getAttribute(eventName);
- element = $(element);
- return element.on(eventName, function(event) {
- return view[methodName](event, element);
- });
- };
- for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
- element = _ref[_j];
- _fn(element);
- }
- if (matchesSelector(view, selector)) {
- methodName = view[0].getAttribute(eventName);
- (function(methodName) {
- return view.on(eventName, function(event) {
- return view[methodName](event, view);
- });
- })(methodName);
- }
- }
- return void 0;
- };
- View.prototype.pushStack = function(elems) {
- var ret;
- ret = jQuery.merge(jQuery(), elems);
- ret.prevObject = this;
- ret.context = this.context;
- return ret;
- };
- View.prototype.end = function() {
- var _ref;
- return (_ref = this.prevObject) != null ? _ref : jQuery(null);
- };
- View.prototype.preempt = function(eventName, handler) {
- return View.__super__.preempt.call(this, eventName, handler);
- };
- return View;
- })(jQuery);
- Builder = (function() {
- function Builder() {
- this.document = [];
- this.postProcessingSteps = [];
- }
- Builder.prototype.buildHtml = function() {
- return [this.document.join(''), this.postProcessingSteps];
- };
- Builder.prototype.tag = function() {
- var args, name, options;
- name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- options = this.extractOptions(args);
- this.openTag(name, options.attributes);
- if (SelfClosingTags.hasOwnProperty(name)) {
- if ((options.text != null) || (options.content != null)) {
- throw new Error("Self-closing tag " + name + " cannot have text or content");
- }
- } else {
- if (typeof options.content === "function") {
- options.content();
- }
- if (options.text) {
- this.text(options.text);
- }
- return this.closeTag(name);
- }
- };
- Builder.prototype.openTag = function(name, attributes) {
- var attributeName, attributePairs, attributesString, value;
- if (this.document.length === 0) {
- if (attributes == null) {
- attributes = {};
- }
- if (attributes.is == null) {
- attributes.is = registerElement(name);
- }
- }
- attributePairs = (function() {
- var _results;
- _results = [];
- for (attributeName in attributes) {
- value = attributes[attributeName];
- _results.push("" + attributeName + "=\"" + value + "\"");
- }
- return _results;
- })();
- attributesString = attributePairs.length ? " " + attributePairs.join(" ") : "";
- return this.document.push("<" + name + attributesString + ">");
- };
- Builder.prototype.closeTag = function(name) {
- return this.document.push("</" + name + ">");
- };
- Builder.prototype.text = function(string) {
- var escapedString;
- escapedString = string.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''').replace(/</g, '<').replace(/>/g, '>');
- return this.document.push(escapedString);
- };
- Builder.prototype.raw = function(string) {
- return this.document.push(string);
- };
- Builder.prototype.subview = function(outletName, subview) {
- var subviewId;
- subviewId = "subview-" + (++idCounter);
- this.tag('div', {
- id: subviewId
- });
- return this.postProcessingSteps.push(function(view) {
- view[outletName] = subview;
- subview.parentView = view;
- return view.find("div#" + subviewId).replaceWith(subview);
- });
- };
- Builder.prototype.extractOptions = function(args) {
- var arg, options, _i, _len;
- options = {};
- for (_i = 0, _len = args.length; _i < _len; _i++) {
- arg = args[_i];
- switch (typeof arg) {
- case 'function':
- options.content = arg;
- break;
- case 'string':
- case 'number':
- options.text = arg.toString();
- break;
- default:
- options.attributes = arg;
- }
- }
- return options;
- };
- return Builder;
- })();
- $.fn.view = function() {
- var element, viewConstructorName;
- if (element = this[0]) {
- if ((element.__spacePenView != null) && !element.__allowViewAccess) {
- viewConstructorName = element.__spacePenView.constructor.name;
- if (Grim != null) {
- Grim.deprecate("Accessing `" + viewConstructorName + "` via `$::view()` is deprecated. Use the raw DOM node or underlying model object instead.");
- }
- }
- return element.spacePenView;
- }
- };
- $.fn.views = function() {
- return this.toArray().map(function(elt) {
- var $elt, _ref;
- $elt = $(elt);
- return (_ref = $elt.view()) != null ? _ref : $elt;
- });
- };
- $.fn.containingView = function() {
- var element, view;
- element = this[0];
- while (element != null) {
- if (view = element.spacePenView) {
- return view;
- }
- element = element.parentNode;
- }
- };
- $.fn.scrollBottom = function(newValue) {
- if (newValue != null) {
- return this.scrollTop(newValue - this.height());
- } else {
- return this.scrollTop() + this.height();
- }
- };
- $.fn.scrollDown = function() {
- return this.scrollTop(this.scrollTop() + $(window).height() / 20);
- };
- $.fn.scrollUp = function() {
- return this.scrollTop(this.scrollTop() - $(window).height() / 20);
- };
- $.fn.scrollToTop = function() {
- return this.scrollTop(0);
- };
- $.fn.scrollToBottom = function() {
- return this.scrollTop(this.prop('scrollHeight'));
- };
- $.fn.scrollRight = function(newValue) {
- if (newValue != null) {
- return this.scrollLeft(newValue - this.width());
- } else {
- return this.scrollLeft() + this.width();
- }
- };
- $.fn.pageUp = function() {
- return this.scrollTop(this.scrollTop() - this.height());
- };
- $.fn.pageDown = function() {
- return this.scrollTop(this.scrollTop() + this.height());
- };
- $.fn.isOnDom = function() {
- return this.closest(document.body).length === 1;
- };
- $.fn.isVisible = function() {
- return !this.isHidden();
- };
- $.fn.isHidden = function() {
- var style;
- style = this[0].style;
- if (style.display === 'none' || !this.isOnDom()) {
- return true;
- } else if (style.display) {
- return false;
- } else {
- return getComputedStyle(this[0]).display === 'none';
- }
- };
- $.fn.isDisabled = function() {
- return !!this.attr('disabled');
- };
- $.fn.enable = function() {
- return this.removeAttr('disabled');
- };
- $.fn.disable = function() {
- return this.attr('disabled', 'disabled');
- };
- $.fn.insertAt = function(index, element) {
- var target;
- target = this.children(":eq(" + index + ")");
- if (target.length) {
- return $(element).insertBefore(target);
- } else {
- return this.append(element);
- }
- };
- $.fn.removeAt = function(index) {
- return this.children(":eq(" + index + ")").remove();
- };
- $.fn.indexOf = function(child) {
- return this.children().toArray().indexOf($(child)[0]);
- };
- $.fn.containsElement = function(element) {
- return (element[0].compareDocumentPosition(this[0]) & 8) === 8;
- };
- $.fn.preempt = function(eventName, handler) {
- var eventNameWithoutNamespace, handlers, wrappedHandler, _ref,
- _this = this;
- wrappedHandler = function() {
- var args, e;
- e = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- if (handler.apply(null, [e].concat(__slice.call(args))) === false) {
- return e.stopImmediatePropagation();
- }
- };
- this.on(eventName, wrappedHandler);
- eventNameWithoutNamespace = eventName.split('.')[0];
- handlers = (_ref = this.handlers()[eventNameWithoutNamespace]) != null ? _ref : [];
- handlers.unshift(handlers.pop());
- return {
- off: function() {
- return _this.off(eventName, wrappedHandler);
- }
- };
- };
- $.fn.handlers = function(eventName) {
- var handlers, _ref, _ref1;
- handlers = this.length ? (_ref = $._data(this[0], 'events')) != null ? _ref : {} : {};
- if (arguments.length === 1) {
- handlers = (_ref1 = handlers[eventName]) != null ? _ref1 : [];
- }
- return handlers;
- };
- $.fn.hasParent = function() {
- return this.parent()[0] != null;
- };
- $.fn.hasFocus = function() {
- return this.is(':focus') || this.is(':has(:focus)');
- };
- $.fn.flashError = function() {
- var removeErrorClass,
- _this = this;
- this.addClass('error');
- removeErrorClass = function() {
- return _this.removeClass('error');
- };
- return window.setTimeout(removeErrorClass, 300);
- };
- $.fn.trueHeight = function() {
- return this[0].getBoundingClientRect().height;
- };
- $.fn.trueWidth = function() {
- return this[0].getBoundingClientRect().width;
- };
- $.fn.iconSize = function(size) {
- return this.width(size).height(size).css('font-size', size);
- };
- $.fn.intValue = function() {
- return parseInt(this.text());
- };
- $.Event.prototype.abortKeyBinding = function() {};
- $.Event.prototype.currentTargetView = function() {
- return $(this.currentTarget).containingView();
- };
- $.Event.prototype.targetView = function() {
- return $(this.target).containingView();
- };
- View.prototype.subscribe = function() {
- var message, _ref;
- message = "The `::subscribe` method is no longer available on SpacePen views.\n\n";
- if (arguments.length === 1) {
- message += "To store multiple subscription objects for later disposal, add them to a\n`CompositeDisposable` instance (https://atom.io/docs/api/v0.150.0/CompositeDisposable)\nand call `.dispose()` on it explicitly in this view's `::detached` hook.";
- } else {
- if ((_ref = arguments[0]) != null ? _ref.jquery : void 0) {
- message += "To subscribe to events on a jQuery object, use the traditional `::on` and\n`::off methods`.";
- } else {
- message += "To subscribe to events on an Atom object, use an explicit event-subscription\nmethod (starting with ::onDid* or ::onWill*).\n\nTo collect multiple subscription objects for later disposal, add them to a\n`CompositeDisposable` instance:\nhttps://atom.io/docs/api/v0.150.0/CompositeDisposable\n\nCall `.dispose()` on your `CompositeDisposable` in this view's `::detached` hook.";
- }
- }
- throw new Error(message);
- };
- View.prototype.subscribeToCommand = function() {
- throw new Error("The `::subscribeToCommand` method is no longer available on SpacePen views.\"\n\nPlease subscribe to commands via `atom.commands.add`:\nhttps://atom.io/docs/api/latest/CommandRegistry#instance-add\n\nCollect the returned subscription objects in a CompositeDisposable:\nhttps://atom.io/docs/api/latest/CompositeDisposable\n\nCall `.dispose()` on your `CompositeDisposable` in this view's `::detached` hook.");
- };
- $.fn.command = function(eventName, handler) {
- throw new Error("The `::command` method is no longer available on SpacePen views.\"\n\nPlease subscribe to commands via `atom.commands.add`:\nhttps://atom.io/docs/api/latest/CommandRegistry#instance-add\n\nCollect the returned subscription objects in a CompositeDisposable:\nhttps://atom.io/docs/api/latest/CompositeDisposable\n\nCall `.dispose()` on your `CompositeDisposable` in this view's `::detached` hook.");
- };
- JQueryEventAdd = jQuery.event.add;
- jQuery.event.add = function(elem, types, handler, data, selector) {
- if (/\:/.test(types)) {
- if (Grim != null) {
- Grim.deprecate("Are you trying to listen for the '" + types + "' Atom command with `jQuery::on`?\n`jQuery::trigger` can no longer be used to listen for Atom commands. Please\nuse `atom.commands.add` instead. See the docs at\nhttps://atom.io/docs/api/latest/CommandRegistry#instance-add for details.");
- }
- }
- return JQueryEventAdd.call(this, elem, types, handler, data, selector);
- };
- if ($.fn.originalTrigger == null) {
- $.fn.originalTrigger = $.fn.trigger;
- $.fn.trigger = function(eventName, data) {
- if (typeof eventName === 'string' && /\:/.test(eventName) && (eventName !== 'cursor:moved' && eventName !== 'selection:changed' && eventName !== 'editor:display-updated')) {
- if (Grim != null) {
- Grim.deprecate("Are you trying to dispatch the '" + eventName + "' Atom command with `jQuery::trigger`?\n`jQuery::trigger` can no longer emit Atom commands as it will not correctly route\nthe command to its handlers. Please use `atom.commands.dispatch` instead.\nSee the docs at https://atom.io/docs/api/latest/CommandRegistry#instance-dispatch\nfor details.");
- }
- }
- return this.originalTrigger(eventName, data);
- };
- }
- $.fn.setTooltip = function() {
- throw new Error("setTooltip is no longer available. Please use `atom.tooltips.add` instead.\nSee the docs at https://atom.io/docs/api/latest/TooltipManager#instance-add");
- };
- $.fn.destroyTooltip = $.fn.hideTooltip = function() {
- throw new Error("destroyTooltip is no longer available. Please dispose the object returned\nfrom `atom.tooltips.add` instead.\nSee the docs at https://atom.io/docs/api/latest/TooltipManager#instance-add");
- };
- exports = exports != null ? exports : this;
- exports.View = View;
- exports.jQuery = jQuery;
- exports.$ = $;
- exports.$$ = function(fn) {
- return View.render.call(View, fn);
- };
- exports.$$$ = function(fn) {
- return View.buildHtml.call(View, fn)[0];
- };
- }).call(this);
|