Web-Snippets.js 17 KB

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