Web-Snippets.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. define(["amber/boot"
  2. //>>excludeStart("imports", pragmas.excludeImports);
  3. , "amber/jquery/Wrappers-JQuery", "amber_core/Platform-DOM"
  4. //>>excludeEnd("imports");
  5. , "amber/web/Web", "amber_core/Kernel-Collections", "amber_core/Kernel-Objects"], function($boot
  6. //>>excludeStart("imports", pragmas.excludeImports);
  7. //>>excludeEnd("imports");
  8. ){"use strict";
  9. if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
  10. var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
  11. $core.addPackage("Web-Snippets");
  12. ($core.packageDescriptors||$core.packages)["Web-Snippets"].innerEval = function (expr) { return eval(expr); };
  13. ($core.packageDescriptors||$core.packages)["Web-Snippets"].imports = ["amber/jquery/Wrappers-JQuery", "amber_core/Platform-DOM"];
  14. ($core.packageDescriptors||$core.packages)["Web-Snippets"].transport = {"type":"amd","amdNamespace":"amber/web"};
  15. $core.addClass("HTMLSnippet", $globals.Object, ["snippets"], "Web-Snippets");
  16. //>>excludeStart("ide", pragmas.excludeIdeData);
  17. $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`<li data-snippet='menuelement' class='...'><a data-snippet='*'></a></li>`\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`<li class='...'><a href='/foo'>A foo</a></li>`\x0a\x0aFor a self-careting tags (not very useful, but you do not need to fill class etc.\x0ayou can use\x0a\x0a`<div class='lots of classes' attr1='one' attr2='two' data-snippet='*bar'></div>`\x0a\x0aand in code later do:\x0a\x0a`html bar with: [ xxx ]`\x0a\x0ato render\x0a\x0a`<div class='lots of classes' attr1='one' attr2='two'>...added by xxx...</div>`";
  18. //>>excludeEnd("ide");
  19. $core.addMethod(
  20. $core.method({
  21. selector: "initializeFromJQuery:",
  22. protocol: "initialization",
  23. fn: function (aJQuery){
  24. var self=this,$self=this;
  25. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  26. return $core.withContext(function($ctx1) {
  27. //>>excludeEnd("ctx");
  28. $recv($self._snippetsFromJQuery_(aJQuery))._do_((function(each){
  29. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  30. return $core.withContext(function($ctx2) {
  31. //>>excludeEnd("ctx");
  32. return $self._installSnippetFromJQuery_($recv(each)._asJQuery());
  33. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  34. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  35. //>>excludeEnd("ctx");
  36. }));
  37. return self;
  38. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  39. }, function($ctx1) {$ctx1.fill(self,"initializeFromJQuery:",{aJQuery:aJQuery},$globals.HTMLSnippet)});
  40. //>>excludeEnd("ctx");
  41. },
  42. //>>excludeStart("ide", pragmas.excludeIdeData);
  43. args: ["aJQuery"],
  44. 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 ]",
  45. referencedClasses: [],
  46. //>>excludeEnd("ide");
  47. messageSends: ["do:", "snippetsFromJQuery:", "installSnippetFromJQuery:", "asJQuery"]
  48. }),
  49. $globals.HTMLSnippet);
  50. $core.addMethod(
  51. $core.method({
  52. selector: "installSnippetFromJQuery:",
  53. protocol: "snippet installation",
  54. fn: function (element){
  55. var self=this,$self=this;
  56. var name;
  57. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  58. return $core.withContext(function($ctx1) {
  59. //>>excludeEnd("ctx");
  60. var $1,$2;
  61. name=$recv(element)._attr_("data-snippet");
  62. $1=$recv(name).__eq("*");
  63. if(!$core.assert($1)){
  64. $2=$recv("^\x5c*"._asRegexp())._test_(name);
  65. if($core.assert($2)){
  66. name=$recv(name)._allButFirst();
  67. $recv(element)._attr_put_("data-snippet","*");
  68. } else {
  69. $recv(element)._removeAttr_("data-snippet");
  70. }
  71. $self._snippetAt_install_(name,$recv($recv(element)._detach())._get_((0)));
  72. }
  73. return self;
  74. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  75. }, function($ctx1) {$ctx1.fill(self,"installSnippetFromJQuery:",{element:element,name:name},$globals.HTMLSnippet)});
  76. //>>excludeEnd("ctx");
  77. },
  78. //>>excludeStart("ide", pragmas.excludeIdeData);
  79. args: ["element"],
  80. 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) ]",
  81. referencedClasses: [],
  82. //>>excludeEnd("ide");
  83. messageSends: ["attr:", "ifFalse:", "=", "ifTrue:ifFalse:", "test:", "asRegexp", "allButFirst", "attr:put:", "removeAttr:", "snippetAt:install:", "get:", "detach"]
  84. }),
  85. $globals.HTMLSnippet);
  86. $core.addMethod(
  87. $core.method({
  88. selector: "snippetAt:",
  89. protocol: "accessing",
  90. fn: function (aString){
  91. var self=this,$self=this;
  92. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  93. return $core.withContext(function($ctx1) {
  94. //>>excludeEnd("ctx");
  95. return $recv($self._snippets())._at_(aString);
  96. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  97. }, function($ctx1) {$ctx1.fill(self,"snippetAt:",{aString:aString},$globals.HTMLSnippet)});
  98. //>>excludeEnd("ctx");
  99. },
  100. //>>excludeStart("ide", pragmas.excludeIdeData);
  101. args: ["aString"],
  102. source: "snippetAt: aString\x0a\x09^ self snippets at: aString",
  103. referencedClasses: [],
  104. //>>excludeEnd("ide");
  105. messageSends: ["at:", "snippets"]
  106. }),
  107. $globals.HTMLSnippet);
  108. $core.addMethod(
  109. $core.method({
  110. selector: "snippetAt:compile:",
  111. protocol: "method generation",
  112. fn: function (aString,anElement){
  113. var self=this,$self=this;
  114. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  115. return $core.withContext(function($ctx1) {
  116. //>>excludeEnd("ctx");
  117. $recv($recv($globals.ClassBuilder)._new())._installMethod_forClass_protocol_($recv($recv((function(htmlReceiver){
  118. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  119. return $core.withContext(function($ctx2) {
  120. //>>excludeEnd("ctx");
  121. return $recv(htmlReceiver)._snippet_(anElement);
  122. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  123. }, function($ctx2) {$ctx2.fillBlock({htmlReceiver:htmlReceiver},$ctx1,1)});
  124. //>>excludeEnd("ctx");
  125. }))._currySelf())._asCompiledMethod_(aString),$globals.HTMLCanvas,"**snippets");
  126. return self;
  127. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  128. }, function($ctx1) {$ctx1.fill(self,"snippetAt:compile:",{aString:aString,anElement:anElement},$globals.HTMLSnippet)});
  129. //>>excludeEnd("ctx");
  130. },
  131. //>>excludeStart("ide", pragmas.excludeIdeData);
  132. args: ["aString", "anElement"],
  133. 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'",
  134. referencedClasses: ["ClassBuilder", "HTMLCanvas"],
  135. //>>excludeEnd("ide");
  136. messageSends: ["installMethod:forClass:protocol:", "new", "asCompiledMethod:", "currySelf", "snippet:"]
  137. }),
  138. $globals.HTMLSnippet);
  139. $core.addMethod(
  140. $core.method({
  141. selector: "snippetAt:install:",
  142. protocol: "snippet installation",
  143. fn: function (aString,anElement){
  144. var self=this,$self=this;
  145. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  146. return $core.withContext(function($ctx1) {
  147. //>>excludeEnd("ctx");
  148. $recv($self._snippets())._at_put_(aString,anElement);
  149. $self._snippetAt_compile_(aString,anElement);
  150. return self;
  151. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  152. }, function($ctx1) {$ctx1.fill(self,"snippetAt:install:",{aString:aString,anElement:anElement},$globals.HTMLSnippet)});
  153. //>>excludeEnd("ctx");
  154. },
  155. //>>excludeStart("ide", pragmas.excludeIdeData);
  156. args: ["aString", "anElement"],
  157. source: "snippetAt: aString install: anElement\x0a\x09self snippets at: aString put: anElement.\x0a\x09self snippetAt: aString compile: anElement",
  158. referencedClasses: [],
  159. //>>excludeEnd("ide");
  160. messageSends: ["at:put:", "snippets", "snippetAt:compile:"]
  161. }),
  162. $globals.HTMLSnippet);
  163. $core.addMethod(
  164. $core.method({
  165. selector: "snippets",
  166. protocol: "accessing",
  167. fn: function (){
  168. var self=this,$self=this;
  169. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  170. return $core.withContext(function($ctx1) {
  171. //>>excludeEnd("ctx");
  172. var $1,$receiver;
  173. $1=$self["@snippets"];
  174. if(($receiver = $1) == null || $receiver.a$nil){
  175. $self["@snippets"]=$globals.HashedCollection._newFromPairs_([]);
  176. return $self["@snippets"];
  177. } else {
  178. return $1;
  179. }
  180. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  181. }, function($ctx1) {$ctx1.fill(self,"snippets",{},$globals.HTMLSnippet)});
  182. //>>excludeEnd("ctx");
  183. },
  184. //>>excludeStart("ide", pragmas.excludeIdeData);
  185. args: [],
  186. source: "snippets\x0a\x09^ snippets ifNil: [ snippets := #{} ]",
  187. referencedClasses: [],
  188. //>>excludeEnd("ide");
  189. messageSends: ["ifNil:"]
  190. }),
  191. $globals.HTMLSnippet);
  192. $core.addMethod(
  193. $core.method({
  194. selector: "snippetsFromJQuery:",
  195. protocol: "private",
  196. fn: function (aJQuery){
  197. var self=this,$self=this;
  198. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  199. return $core.withContext(function($ctx1) {
  200. //>>excludeEnd("ctx");
  201. return $recv($recv(aJQuery)._find_("[data-snippet]"))._toArray();
  202. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  203. }, function($ctx1) {$ctx1.fill(self,"snippetsFromJQuery:",{aJQuery:aJQuery},$globals.HTMLSnippet)});
  204. //>>excludeEnd("ctx");
  205. },
  206. //>>excludeStart("ide", pragmas.excludeIdeData);
  207. args: ["aJQuery"],
  208. source: "snippetsFromJQuery: aJQuery\x0a\x09^ (aJQuery find: '[data-snippet]') toArray",
  209. referencedClasses: [],
  210. //>>excludeEnd("ide");
  211. messageSends: ["toArray", "find:"]
  212. }),
  213. $globals.HTMLSnippet);
  214. $globals.HTMLSnippet.a$cls.iVarNames = ["current"];
  215. $core.addMethod(
  216. $core.method({
  217. selector: "current",
  218. protocol: "instance creation",
  219. fn: function (){
  220. var self=this,$self=this;
  221. return $self["@current"];
  222. },
  223. //>>excludeStart("ide", pragmas.excludeIdeData);
  224. args: [],
  225. source: "current\x0a\x09^ current",
  226. referencedClasses: [],
  227. //>>excludeEnd("ide");
  228. messageSends: []
  229. }),
  230. $globals.HTMLSnippet.a$cls);
  231. $core.addMethod(
  232. $core.method({
  233. selector: "ensureCurrent",
  234. protocol: "initialization",
  235. fn: function (){
  236. var self=this,$self=this;
  237. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  238. return $core.withContext(function($ctx1) {
  239. //>>excludeEnd("ctx");
  240. var $1,$2,$receiver;
  241. $1=$self["@current"];
  242. if(($receiver = $1) == null || $receiver.a$nil){
  243. $2=(
  244. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  245. $ctx1.supercall = true,
  246. //>>excludeEnd("ctx");
  247. ($globals.HTMLSnippet.a$cls.superclass||$boot.nilAsClass).fn.prototype._new.apply($self, []));
  248. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  249. $ctx1.supercall = false;
  250. //>>excludeEnd("ctx");;
  251. $recv($2)._initializeFromJQuery_($recv(document)._asJQuery());
  252. $self["@current"]=$recv($2)._yourself();
  253. $self["@current"];
  254. } else {
  255. $1;
  256. }
  257. return self;
  258. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  259. }, function($ctx1) {$ctx1.fill(self,"ensureCurrent",{},$globals.HTMLSnippet.a$cls)});
  260. //>>excludeEnd("ctx");
  261. },
  262. //>>excludeStart("ide", pragmas.excludeIdeData);
  263. args: [],
  264. source: "ensureCurrent\x0a\x09current ifNil: [\x0a\x09\x09current := super new\x0a\x09\x09\x09initializeFromJQuery: document asJQuery;\x0a\x09\x09\x09yourself ]",
  265. referencedClasses: [],
  266. //>>excludeEnd("ide");
  267. messageSends: ["ifNil:", "initializeFromJQuery:", "new", "asJQuery", "yourself"]
  268. }),
  269. $globals.HTMLSnippet.a$cls);
  270. $core.addMethod(
  271. $core.method({
  272. selector: "initialize",
  273. protocol: "initialization",
  274. fn: function (){
  275. var self=this,$self=this;
  276. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  277. return $core.withContext(function($ctx1) {
  278. //>>excludeEnd("ctx");
  279. var $1;
  280. (
  281. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  282. $ctx1.supercall = true,
  283. //>>excludeEnd("ctx");
  284. ($globals.HTMLSnippet.a$cls.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
  285. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  286. $ctx1.supercall = false;
  287. //>>excludeEnd("ctx");;
  288. $1=$recv($globals.PlatformDom)._isFeasible();
  289. if($core.assert($1)){
  290. $self._ensureCurrent();
  291. }
  292. return self;
  293. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  294. }, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.HTMLSnippet.a$cls)});
  295. //>>excludeEnd("ctx");
  296. },
  297. //>>excludeStart("ide", pragmas.excludeIdeData);
  298. args: [],
  299. source: "initialize\x0a\x09super initialize.\x0a\x09PlatformDom isFeasible ifTrue: [\x0a\x09\x09self ensureCurrent ]",
  300. referencedClasses: ["PlatformDom"],
  301. //>>excludeEnd("ide");
  302. messageSends: ["initialize", "ifTrue:", "isFeasible", "ensureCurrent"]
  303. }),
  304. $globals.HTMLSnippet.a$cls);
  305. $core.addMethod(
  306. $core.method({
  307. selector: "new",
  308. protocol: "instance creation",
  309. fn: function (){
  310. var self=this,$self=this;
  311. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  312. return $core.withContext(function($ctx1) {
  313. //>>excludeEnd("ctx");
  314. $self._shouldNotImplement();
  315. return self;
  316. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  317. }, function($ctx1) {$ctx1.fill(self,"new",{},$globals.HTMLSnippet.a$cls)});
  318. //>>excludeEnd("ctx");
  319. },
  320. //>>excludeStart("ide", pragmas.excludeIdeData);
  321. args: [],
  322. source: "new\x0a\x09self shouldNotImplement",
  323. referencedClasses: [],
  324. //>>excludeEnd("ide");
  325. messageSends: ["shouldNotImplement"]
  326. }),
  327. $globals.HTMLSnippet.a$cls);
  328. $core.addMethod(
  329. $core.method({
  330. selector: "snippet:",
  331. protocol: "*Web-Snippets",
  332. fn: function (anElement){
  333. var self=this,$self=this;
  334. var clone,caret;
  335. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  336. return $core.withContext(function($ctx1) {
  337. //>>excludeEnd("ctx");
  338. var $1;
  339. clone=$recv($recv(anElement)._asJQuery())._clone();
  340. $1=$recv($globals.TagBrush)._fromJQuery_canvas_(clone,self);
  341. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  342. $ctx1.sendIdx["fromJQuery:canvas:"]=1;
  343. //>>excludeEnd("ctx");
  344. $self._with_($1);
  345. caret=$recv(clone)._find_("[data-snippet=\x22*\x22]");
  346. $recv($recv(caret)._toArray())._ifEmpty_((function(){
  347. caret=clone;
  348. return caret;
  349. }));
  350. return $recv($globals.TagBrush)._fromJQuery_canvas_($recv(caret)._removeAttr_("data-snippet"),self);
  351. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  352. }, function($ctx1) {$ctx1.fill(self,"snippet:",{anElement:anElement,clone:clone,caret:caret},$globals.HTMLCanvas)});
  353. //>>excludeEnd("ctx");
  354. },
  355. //>>excludeStart("ide", pragmas.excludeIdeData);
  356. args: ["anElement"],
  357. 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",
  358. referencedClasses: ["TagBrush"],
  359. //>>excludeEnd("ide");
  360. messageSends: ["clone", "asJQuery", "with:", "fromJQuery:canvas:", "find:", "ifEmpty:", "toArray", "removeAttr:"]
  361. }),
  362. $globals.HTMLCanvas);
  363. $core.addMethod(
  364. $core.method({
  365. selector: "asSnippet",
  366. protocol: "*Web-Snippets",
  367. fn: function (){
  368. var self=this,$self=this;
  369. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  370. return $core.withContext(function($ctx1) {
  371. //>>excludeEnd("ctx");
  372. return $recv($recv($globals.HTMLSnippet)._current())._snippetAt_($self._asString());
  373. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  374. }, function($ctx1) {$ctx1.fill(self,"asSnippet",{},$globals.String)});
  375. //>>excludeEnd("ctx");
  376. },
  377. //>>excludeStart("ide", pragmas.excludeIdeData);
  378. args: [],
  379. source: "asSnippet\x0a\x09^ HTMLSnippet current snippetAt: self asString",
  380. referencedClasses: ["HTMLSnippet"],
  381. //>>excludeEnd("ide");
  382. messageSends: ["snippetAt:", "current", "asString"]
  383. }),
  384. $globals.String);
  385. });