define("domite/DOMite", ["amber/boot", "amber_core/Kernel-Objects"], function($boot){ var $core=$boot.api,nil=$boot.nil,$recv=$boot.asReceiver,$globals=$boot.globals; $core.addPackage('DOMite'); $core.packages["DOMite"].innerEval = function (expr) { return eval(expr); }; $core.packages["DOMite"].transport = {"type":"amd","amdNamespace":"domite"}; $core.addClass('Domite', $globals.Object, ['element', 'reference'], 'DOMite'); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.Domite.comment="I am (hopefully thin) wrapper around the notion of \x22cursor in a page\x22.\x0aI represent a DOM node _and_ a point where\x0ato insert new content into it.\x0a\x0aSo I play both the role of a container that inserts\x0aas well as the role of an element being inserted.\x0a\x0aCreation API:\x0a\x0a - `Domite new` creates an insertion point at the bottom of ``.\x0a - `Domite open` is unique way to create pieces of content. It creates an instance \x22floating in thin air\x22 (wrapper around DOM DocumentFragment) that can be filled with any contents and then inserted in a page.\x0a - `Domite fromElement: aDomElement` wraps an element and set the cursor to its end.\x0a\x0aManipulation API:\x0a\x0a - `aDomite insertDomite:` and `aDomite insertString:` insert either a Domite or a text content at the insertion point.\x0a - `aDomite clearHere` deletes contents of the wrapped element.\x0a\x0aCursor moving API:\x0a\x0aTake this sample HTML, where `[n]` are just markers, not real content:\x0a\x0a```\x0a\x0a

header

\x0a [4]

[2]Hello[1]world[3]

[5]\x0a footer\x0a\x0a```\x0a\x0aIf `d` is a `Domite` representing `[1]`, then:\x0a\x0a - `d seekHereStart` would move `d` to be at `[2]`,\x0a - `d seekHereEnd` would move `d` to be at `[3]`,\x0a - `d seekBeforeHere` would move `d` to be at `[4]`, and\x0a - `d seekAfterHere` would move `d` to be at `[5]`.\x0a\x0aIt is not presumed one would use `seekXxx`\x0ato actually move around in a single instance.\x0aIt is envisioned this API will be used mostly\x0ain combination with `copy`, like\x0a`afterMe := self copy seekAfterHere`."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "canSeekOutOfHere", protocol: 'testing', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv($recv(self._element())._parentNode())._notNil(); return $1; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"canSeekOutOfHere",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "canSeekOutOfHere\x0a\x09^ self element parentNode notNil", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["notNil", "parentNode", "element"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "clearHere", protocol: 'deletion', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var element = self['@element'], child; while (child = element.firstChild) element.removeChild(child); self['@reference'] = null;; return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"clearHere",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "clearHere\x0a<\x0a\x09var element = self['@element'], child;\x0a\x09while (child = element.firstChild) element.removeChild(child);\x0a\x09self['@reference'] = null;\x0a>", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.Domite); $core.addMethod( $core.method({ selector: "element", protocol: 'accessing', fn: function (){ var self=this; var $1; $1=self["@element"]; return $1; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "element\x0a\x09^ element", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.Domite); $core.addMethod( $core.method({ selector: "element:", protocol: 'accessing', fn: function (anObject){ var self=this; self["@element"]=anObject; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anObject"], source: "element: anObject\x0a\x09element := anObject", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.Domite); $core.addMethod( $core.method({ selector: "initialize", protocol: 'initialization', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); ( //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = true, //>>excludeEnd("ctx"); $globals.Domite.superclass.fn.prototype._initialize.apply($recv(self), [])); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = false; //>>excludeEnd("ctx");; self["@element"]=$recv(document)._body(); self["@reference"]=nil._asJSON(); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "initialize\x0a\x09super initialize.\x0a\x09element := document body.\x0a\x09reference := nil asJSON", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["initialize", "body", "asJSON"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "insertDomite:", protocol: 'insertion', fn: function (aDomite){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); self._insertElement_($recv(aDomite)._element()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"insertDomite:",{aDomite:aDomite},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aDomite"], source: "insertDomite: aDomite\x0a\x09self insertElement: aDomite element", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["insertElement:", "element"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "insertElement:", protocol: 'insertion', fn: function (aDomElement){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv(self._element())._insertBefore_reference_(aDomElement,self._reference()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"insertElement:",{aDomElement:aDomElement},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aDomElement"], source: "insertElement: aDomElement\x0a\x09self element\x0a\x09\x09insertBefore: aDomElement\x0a\x09\x09reference: self reference", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["insertBefore:reference:", "element", "reference"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "insertString:", protocol: 'insertion', fn: function (aString){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); self._insertElement_($recv(document)._createTextNode_($recv(aString)._asString())); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"insertString:",{aString:aString},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "insertString: aString\x0a\x09self insertElement: (\x0a\x09\x09document createTextNode: aString asString )", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["insertElement:", "createTextNode:", "asString"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "reference", protocol: 'accessing', fn: function (){ var self=this; var $1; $1=self["@reference"]; return $1; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "reference\x0a\x09^ reference", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.Domite); $core.addMethod( $core.method({ selector: "reference:", protocol: 'accessing', fn: function (anObject){ var self=this; self["@reference"]=anObject; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anObject"], source: "reference: anObject\x0a\x09reference := anObject", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.Domite); $core.addMethod( $core.method({ selector: "seekAfterHere", protocol: 'navigation', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $2,$1,$3; $2=self._element(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["element"]=1; //>>excludeEnd("ctx"); $1=$recv($2)._nextSibling(); self._reference_($1); $3=self._element_($recv(self._element())._parentNode()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"seekAfterHere",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "seekAfterHere\x0a\x09self\x0a\x09\x09reference: self element nextSibling;\x0a\x09\x09element: self element parentNode", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["reference:", "nextSibling", "element", "element:", "parentNode"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "seekBeforeHere", protocol: 'navigation', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2; $1=self._element(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["element"]=1; //>>excludeEnd("ctx"); self._reference_($1); $2=self._element_($recv(self._element())._parentNode()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"seekBeforeHere",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "seekBeforeHere\x0a\x09self\x0a\x09\x09reference: self element;\x0a\x09\x09element: self element parentNode", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["reference:", "element", "element:", "parentNode"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "seekHereEnd", protocol: 'navigation', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); self._reference_(nil._asJSON()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"seekHereEnd",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "seekHereEnd\x0a\x09self reference: nil asJSON \x22null\x22", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["reference:", "asJSON"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "seekHereStart", protocol: 'navigation', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); self._reference_($recv(self._element())._firstChild()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"seekHereStart",{},$globals.Domite)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "seekHereStart\x0a\x09self reference: self element firstChild", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["reference:", "firstChild", "element"] }), $globals.Domite); $core.addMethod( $core.method({ selector: "fromElement:", protocol: 'instance creation', fn: function (aDomElement){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $2,$3,$1; $2=self._new(); $recv($2)._element_(aDomElement); $3=$recv($2)._yourself(); $1=$3; return $1; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"fromElement:",{aDomElement:aDomElement},$globals.Domite.klass)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aDomElement"], source: "fromElement: aDomElement\x0a\x09^ self new\x0a\x09\x09element: aDomElement;\x0a\x09\x09yourself", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["element:", "new", "yourself"] }), $globals.Domite.klass); $core.addMethod( $core.method({ selector: "fromElement:cursorBefore:", protocol: 'instance creation', fn: function (aDomElement,anotherDomElement){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $2,$3,$1; $2=self._new(); $recv($2)._element_(aDomElement); $recv($2)._referenceElement_(anotherDomElement); $3=$recv($2)._yourself(); $1=$3; return $1; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"fromElement:cursorBefore:",{aDomElement:aDomElement,anotherDomElement:anotherDomElement},$globals.Domite.klass)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aDomElement", "anotherDomElement"], source: "fromElement: aDomElement cursorBefore: anotherDomElement\x0a\x09^ self new\x0a\x09\x09element: aDomElement;\x0a\x09\x09referenceElement: anotherDomElement;\x0a\x09\x09yourself", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["element:", "new", "referenceElement:", "yourself"] }), $globals.Domite.klass); $core.addMethod( $core.method({ selector: "newElement:", protocol: 'instance creation', fn: function (aString){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=self._fromElement_($recv(document)._createElement_(aString)); return $1; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"newElement:",{aString:aString},$globals.Domite.klass)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "newElement: aString\x0a\x09^ self fromElement: (document createElement: aString)", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["fromElement:", "createElement:"] }), $globals.Domite.klass); $core.addMethod( $core.method({ selector: "open", protocol: 'instance creation', fn: function (){ var self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=self._fromElement_($recv(document)._createDocumentFragment()); return $1; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"open",{},$globals.Domite.klass)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "open\x0a\x09^ self fromElement: document createDocumentFragment", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["fromElement:", "createDocumentFragment"] }), $globals.Domite.klass); });