define(["amber/boot", "require", "amber/core/Kernel-Collections", "amber/core/Kernel-Objects", "amber/web/Web"], function($boot,requirejs){"use strict"; var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals; var $pkg = $core.addPackage("Web-Snippets"); $pkg.innerEval = function (expr) { return eval(expr); }; $pkg.imports = ["amber/core/Platform-DOM", "amber/jquery/Wrappers-JQuery"]; //>>excludeStart("imports", pragmas.excludeImports); $pkg.isReady = new Promise(function (resolve, reject) { requirejs(["amber/core/Platform-DOM", "amber/jquery/Wrappers-JQuery"], function () {resolve();}, reject); }); //>>excludeEnd("imports"); $pkg.transport = {"type":"amd","amdNamespace":"amber/web"}; $core.addClass("HTMLSnippet", $globals.Object, ["snippets"], "Web-Snippets"); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.HTMLSnippet.comment="My sole instance is the registry of html snippets.\x0a`HTMLSnippet current` is the public singleton instance.\x0a\x0aOn startup, it scans the document for any html elements\x0awith `'data-snippet=\x22foo\x22'` attribute and takes them off the document,\x0aremembering them in the store under the specified name.\x0aIt also install method #foo into HTMLCanvas dynamically.\x0a\x0aEvery html snippet should mark a 'caret', a place where contents\x0acan be inserted, by 'data-snippet=\x22*\x22' (a special name for caret).\x0aFor example:\x0a\x0a`
  • `\x0a\x0adefines a list element with a link inside; the link itself is marked as a caret.\x0a\x0aYou can later issue\x0a\x0a`html menuelement href: '/foo'; with: 'A foo'`\x0a\x0ato insert the whole snippet and directly manipulate the caret, so it renders:\x0a\x0a`
  • A foo
  • `\x0a\x0aFor a self-careting tags (not very useful, but you do not need to fill class etc.\x0ayou can use\x0a\x0a`
    `\x0a\x0aand in code later do:\x0a\x0a`html bar with: [ xxx ]`\x0a\x0ato render\x0a\x0a`
    ...added by xxx...
    `"; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "initializeFromJQuery:", protocol: "initialization", fn: function (aJQuery){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._snippetsFromJQuery_(aJQuery))._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._installSnippetFromJQuery_($recv(each)._asJQuery()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initializeFromJQuery:",{aJQuery:aJQuery},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aJQuery"], source: "initializeFromJQuery: aJQuery\x0a\x09\x22Finds and takes out all snippets out of aJQuery.\x0a\x09Installs it into self.\x22\x0a\x09\x0a\x09(self snippetsFromJQuery: aJQuery) do: [ :each |\x0a\x09\x09self installSnippetFromJQuery: each asJQuery ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["do:", "snippetsFromJQuery:", "installSnippetFromJQuery:", "asJQuery"] }), $globals.HTMLSnippet); $core.addMethod( $core.method({ selector: "installSnippetFromJQuery:", protocol: "snippet installation", fn: function (element){ var self=this,$self=this; var name; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2; name=$recv(element)._attr_("data-snippet"); $1=$recv(name).__eq("*"); if(!$core.assert($1)){ $2=$recv("^\x5c*"._asRegexp())._test_(name); if($core.assert($2)){ name=$recv(name)._allButFirst(); $recv(element)._attr_put_("data-snippet","*"); } else { $recv(element)._removeAttr_("data-snippet"); } $self._snippetAt_install_(name,$recv($recv(element)._detach())._get_((0))); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"installSnippetFromJQuery:",{element:element,name:name},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["element"], source: "installSnippetFromJQuery: element\x0a\x09| name |\x0a\x09name := element attr: 'data-snippet'.\x0a\x09name = '*' ifFalse: [\x0a\x09\x09('^\x5c*' asRegexp test: name)\x0a\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09name := name allButFirst.\x0a\x09\x09\x09\x09element attr: 'data-snippet' put: '*' ]\x0a\x09\x09\x09ifFalse: [\x0a\x09\x09\x09\x09element removeAttr: 'data-snippet' ].\x0a\x09\x09self snippetAt: name install: (element detach get: 0) ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["attr:", "ifFalse:", "=", "ifTrue:ifFalse:", "test:", "asRegexp", "allButFirst", "attr:put:", "removeAttr:", "snippetAt:install:", "get:", "detach"] }), $globals.HTMLSnippet); $core.addMethod( $core.method({ selector: "snippetAt:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._snippets())._at_(aString); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"snippetAt:",{aString:aString},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "snippetAt: aString\x0a\x09^ self snippets at: aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:", "snippets"] }), $globals.HTMLSnippet); $core.addMethod( $core.method({ selector: "snippetAt:compile:", protocol: "method generation", fn: function (aString,anElement){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($recv($globals.ClassBuilder)._new())._installMethod_forClass_protocol_($recv($recv((function(htmlReceiver){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(htmlReceiver)._snippet_(anElement); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({htmlReceiver:htmlReceiver},$ctx1,1)}); //>>excludeEnd("ctx"); }))._currySelf())._asCompiledMethod_(aString),$globals.HTMLCanvas,"**snippets"); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"snippetAt:compile:",{aString:aString,anElement:anElement},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "anElement"], source: "snippetAt: aString compile: anElement\x0a\x09\x22Method generation for the snippet.\x0a\x09The selector is aString, the method block uses anElement\x22\x0a\x09\x0a\x09ClassBuilder new\x0a\x09\x09installMethod: ([ :htmlReceiver | htmlReceiver snippet: anElement ]\x0a\x09\x09\x09currySelf asCompiledMethod: aString)\x0a\x09\x09forClass: HTMLCanvas\x0a\x09\x09protocol: '**snippets'", referencedClasses: ["ClassBuilder", "HTMLCanvas"], //>>excludeEnd("ide"); messageSends: ["installMethod:forClass:protocol:", "new", "asCompiledMethod:", "currySelf", "snippet:"] }), $globals.HTMLSnippet); $core.addMethod( $core.method({ selector: "snippetAt:install:", protocol: "snippet installation", fn: function (aString,anElement){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._snippets())._at_put_(aString,anElement); $self._snippetAt_compile_(aString,anElement); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"snippetAt:install:",{aString:aString,anElement:anElement},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString", "anElement"], source: "snippetAt: aString install: anElement\x0a\x09self snippets at: aString put: anElement.\x0a\x09self snippetAt: aString compile: anElement", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["at:put:", "snippets", "snippetAt:compile:"] }), $globals.HTMLSnippet); $core.addMethod( $core.method({ selector: "snippets", protocol: "accessing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@snippets"]; if(($receiver = $1) == null || $receiver.a$nil){ $self["@snippets"]=$globals.HashedCollection._newFromPairs_([]); return $self["@snippets"]; } else { return $1; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"snippets",{},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "snippets\x0a\x09^ snippets ifNil: [ snippets := #{} ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:"] }), $globals.HTMLSnippet); $core.addMethod( $core.method({ selector: "snippetsFromJQuery:", protocol: "private", fn: function (aJQuery){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($recv(aJQuery)._find_("[data-snippet]"))._toArray(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"snippetsFromJQuery:",{aJQuery:aJQuery},$globals.HTMLSnippet)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aJQuery"], source: "snippetsFromJQuery: aJQuery\x0a\x09^ (aJQuery find: '[data-snippet]') toArray", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["toArray", "find:"] }), $globals.HTMLSnippet); $globals.HTMLSnippet.a$cls.iVarNames = ["current"]; $core.addMethod( $core.method({ selector: "current", protocol: "instance creation", fn: function (){ var self=this,$self=this; return $self["@current"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "current\x0a\x09^ current", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.HTMLSnippet.a$cls); $core.addMethod( $core.method({ selector: "ensureCurrent", protocol: "initialization", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$receiver; $1=$self["@current"]; if(($receiver = $1) == null || $receiver.a$nil){ $2=( //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = true, //>>excludeEnd("ctx"); ($globals.HTMLSnippet.a$cls.superclass||$boot.nilAsClass).fn.prototype._new.apply($self, [])); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = false; //>>excludeEnd("ctx");; $recv($2)._initializeFromJQuery_($recv(document)._asJQuery()); $self["@current"]=$recv($2)._yourself(); $self["@current"]; } else { $1; } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"ensureCurrent",{},$globals.HTMLSnippet.a$cls)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "ensureCurrent\x0a\x09current ifNil: [\x0a\x09\x09current := super new\x0a\x09\x09\x09initializeFromJQuery: document asJQuery;\x0a\x09\x09\x09yourself ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:", "initializeFromJQuery:", "new", "asJQuery", "yourself"] }), $globals.HTMLSnippet.a$cls); $core.addMethod( $core.method({ selector: "initialize", protocol: "initialization", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; ( //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = true, //>>excludeEnd("ctx"); ($globals.HTMLSnippet.a$cls.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, [])); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = false; //>>excludeEnd("ctx");; $1=$recv($globals.PlatformDom)._isFeasible(); if($core.assert($1)){ $self._ensureCurrent(); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.HTMLSnippet.a$cls)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "initialize\x0a\x09super initialize.\x0a\x09PlatformDom isFeasible ifTrue: [\x0a\x09\x09self ensureCurrent ]", referencedClasses: ["PlatformDom"], //>>excludeEnd("ide"); messageSends: ["initialize", "ifTrue:", "isFeasible", "ensureCurrent"] }), $globals.HTMLSnippet.a$cls); $core.addMethod( $core.method({ selector: "new", protocol: "instance creation", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._shouldNotImplement(); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"new",{},$globals.HTMLSnippet.a$cls)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "new\x0a\x09self shouldNotImplement", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["shouldNotImplement"] }), $globals.HTMLSnippet.a$cls); $core.addMethod( $core.method({ selector: "snippet:", protocol: "*Web-Snippets", fn: function (anElement){ var self=this,$self=this; var clone,caret; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; clone=$recv($recv(anElement)._asJQuery())._clone(); $1=$recv($globals.TagBrush)._fromJQuery_canvas_(clone,self); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["fromJQuery:canvas:"]=1; //>>excludeEnd("ctx"); $self._with_($1); caret=$recv(clone)._find_("[data-snippet=\x22*\x22]"); $recv($recv(caret)._toArray())._ifEmpty_((function(){ caret=clone; return caret; })); return $recv($globals.TagBrush)._fromJQuery_canvas_($recv(caret)._removeAttr_("data-snippet"),self); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"snippet:",{anElement:anElement,clone:clone,caret:caret},$globals.HTMLCanvas)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anElement"], source: "snippet: anElement\x0a\x09\x22Adds clone of anElement, finds [data-snippet=\x22\x22*\x22\x22] subelement\x0a\x09and returns TagBrush as if that subelement was just added.\x0a\x09\x0a\x09Rarely needed to use directly, use `html foo` dynamically installed method\x0a\x09for a snippet named foo.\x22\x0a\x09\x0a\x09| clone caret |\x0a\x09\x0a\x09clone := anElement asJQuery clone.\x0a\x09self with: (TagBrush fromJQuery: clone canvas: self).\x0a\x09caret := clone find: '[data-snippet=\x22*\x22]'.\x0a\x09caret toArray ifEmpty: [ caret := clone ].\x0a\x09^ TagBrush fromJQuery: (caret removeAttr: 'data-snippet') canvas: self", referencedClasses: ["TagBrush"], //>>excludeEnd("ide"); messageSends: ["clone", "asJQuery", "with:", "fromJQuery:canvas:", "find:", "ifEmpty:", "toArray", "removeAttr:"] }), $globals.HTMLCanvas); $core.addMethod( $core.method({ selector: "asSnippet", protocol: "*Web-Snippets", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($recv($globals.HTMLSnippet)._current())._snippetAt_($self._asString()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"asSnippet",{},$globals.String)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "asSnippet\x0a\x09^ HTMLSnippet current snippetAt: self asString", referencedClasses: ["HTMLSnippet"], //>>excludeEnd("ide"); messageSends: ["snippetAt:", "current", "asString"] }), $globals.String); });