Canvas.st 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044
  1. Smalltalk current createPackage: 'Canvas' properties: #{}!
  2. Object subclass: #HTMLCanvas
  3. instanceVariableNames: 'root'
  4. package: 'Canvas'!
  5. !HTMLCanvas methodsFor: 'accessing'!
  6. root
  7. ^root
  8. !
  9. root: aTagBrush
  10. root := aTagBrush
  11. !
  12. snippet: anElement
  13. "Adds clone of anElement, finds [data-snippet=""*""] subelement
  14. and returns TagBrush as if that subelement was just added.
  15. Rarely needed to use directly, use `html foo` dynamically installed method
  16. for a snippet named foo."
  17. | clone caret |
  18. clone := anElement asJQuery clone.
  19. self with: (TagBrush fromJQuery: clone canvas: self).
  20. caret := clone find: '[data-snippet="*"]'.
  21. caret toArray isEmpty ifTrue: [ caret := clone ].
  22. ^TagBrush fromJQuery: (caret removeAttr: 'data-snippet') canvas: self
  23. ! !
  24. !HTMLCanvas methodsFor: 'adding'!
  25. with: anObject
  26. ^self root with: anObject
  27. ! !
  28. !HTMLCanvas methodsFor: 'initialization'!
  29. initialize
  30. super initialize.
  31. root ifNil: [root := TagBrush fromString: 'div' canvas: self]
  32. !
  33. initializeFromJQuery: aJQuery
  34. root := TagBrush fromJQuery: aJQuery canvas: self
  35. ! !
  36. !HTMLCanvas methodsFor: 'tags'!
  37. a
  38. ^self tag: 'a'
  39. !
  40. abbr
  41. ^self tag: 'abbr'
  42. !
  43. address
  44. ^self tag: 'address'
  45. !
  46. area
  47. ^self tag: 'area'
  48. !
  49. article
  50. ^self tag: 'article'
  51. !
  52. aside
  53. ^self tag: 'aside'
  54. !
  55. audio
  56. ^self tag: 'audio'
  57. !
  58. base
  59. ^self tag: 'base'
  60. !
  61. blockquote
  62. ^self tag: 'blockquote'
  63. !
  64. body
  65. ^self tag: 'body'
  66. !
  67. br
  68. ^self tag: 'br'
  69. !
  70. button
  71. ^self tag: 'button'
  72. !
  73. canvas
  74. ^self tag: 'canvas'
  75. !
  76. caption
  77. ^self tag: 'caption'
  78. !
  79. cite
  80. ^self tag: 'cite'
  81. !
  82. code
  83. ^self tag: 'code'
  84. !
  85. col
  86. ^self tag: 'col'
  87. !
  88. colgroup
  89. ^self tag: 'colgroup'
  90. !
  91. command
  92. ^self tag: 'command'
  93. !
  94. datalist
  95. ^self tag: 'datalist'
  96. !
  97. dd
  98. ^self tag: 'dd'
  99. !
  100. del
  101. ^self tag: 'del'
  102. !
  103. details
  104. ^self tag: 'details'
  105. !
  106. div
  107. ^self tag: 'div'
  108. !
  109. div: aBlock
  110. ^self div with: aBlock
  111. !
  112. dl
  113. ^self tag: 'dl'
  114. !
  115. dt
  116. ^self tag: 'dt'
  117. !
  118. em
  119. ^self tag: 'em'
  120. !
  121. embed
  122. ^self tag: 'embed'
  123. !
  124. fieldset
  125. ^self tag: 'fieldset'
  126. !
  127. figcaption
  128. ^self tag: 'figcaption'
  129. !
  130. figure
  131. ^self tag: 'figure'
  132. !
  133. footer
  134. ^self tag: 'footer'
  135. !
  136. form
  137. ^self tag: 'form'
  138. !
  139. h1
  140. ^self tag: 'h1'
  141. !
  142. h1: anObject
  143. ^self h1 with: anObject
  144. !
  145. h2
  146. ^self tag: 'h2'
  147. !
  148. h2: anObject
  149. ^ self h2 with: anObject
  150. !
  151. h3
  152. ^self tag: 'h3'
  153. !
  154. h3: anObject
  155. ^self h3 with: anObject
  156. !
  157. h4
  158. ^self tag: 'h4'
  159. !
  160. h4: anObject
  161. ^self h4 with: anObject
  162. !
  163. h5
  164. ^self tag: 'h5'
  165. !
  166. h5: anObject
  167. ^self h5 with: anObject
  168. !
  169. h6
  170. ^self tag: 'h6'
  171. !
  172. h6: anObject
  173. ^self h6 with: anObject
  174. !
  175. head
  176. ^self tag: 'head'
  177. !
  178. header
  179. ^self tag: 'header'
  180. !
  181. hgroup
  182. ^self tag: 'hgroup'
  183. !
  184. hr
  185. ^self tag: 'hr'
  186. !
  187. html
  188. ^self tag: 'html'
  189. !
  190. iframe
  191. ^self tag: 'iframe'
  192. !
  193. iframe: aString
  194. ^self iframe src: aString
  195. !
  196. img
  197. ^self tag: 'img'
  198. !
  199. img: aString
  200. ^self img src: aString
  201. !
  202. input
  203. ^self tag: 'input'
  204. !
  205. label
  206. ^self tag: 'label'
  207. !
  208. legend
  209. ^self tag: 'legend'
  210. !
  211. li
  212. ^self tag: 'li'
  213. !
  214. li: anObject
  215. ^self li with: anObject
  216. !
  217. link
  218. ^self tag: 'link'
  219. !
  220. map
  221. ^self tag: 'map'
  222. !
  223. mark
  224. ^self tag: 'mark'
  225. !
  226. menu
  227. ^self tag: 'menu'
  228. !
  229. meta
  230. ^self tag: 'meta'
  231. !
  232. nav
  233. ^self tag: 'nav'
  234. !
  235. newTag: aString
  236. ^TagBrush fromString: aString canvas: self
  237. !
  238. noscript
  239. ^self tag: 'noscript'
  240. !
  241. object
  242. ^self tag: 'object'
  243. !
  244. ol
  245. ^self tag: 'ol'
  246. !
  247. ol: anObject
  248. ^self ol with: anObject
  249. !
  250. optgroup
  251. ^self tag: 'optgroup'
  252. !
  253. option
  254. ^self tag: 'option'
  255. !
  256. output
  257. ^self tag: 'output'
  258. !
  259. p
  260. ^self tag: 'p'
  261. !
  262. p: anObject
  263. ^self p with: anObject
  264. !
  265. param
  266. ^self tag: 'param'
  267. !
  268. pre
  269. ^self tag: 'pre'
  270. !
  271. progress
  272. ^self tag: 'progress'
  273. !
  274. script
  275. ^self tag: 'script'
  276. !
  277. section
  278. ^self tag: 'section'
  279. !
  280. select
  281. ^self tag: 'select'
  282. !
  283. small
  284. ^self tag: 'small'
  285. !
  286. source
  287. ^self tag: 'source'
  288. !
  289. span
  290. ^self tag: 'span'
  291. !
  292. span: anObject
  293. ^self span with: anObject
  294. !
  295. strong
  296. ^self tag: 'strong'
  297. !
  298. strong: anObject
  299. ^self strong with: anObject
  300. !
  301. style
  302. ^ root addBrush: (StyleTag canvas: self)
  303. !
  304. style: aString
  305. ^ self style with: aString; yourself
  306. !
  307. sub
  308. ^self tag: 'sub'
  309. !
  310. summary
  311. ^self tag: 'summary'
  312. !
  313. sup
  314. ^self tag: 'sup'
  315. !
  316. table
  317. ^self tag: 'table'
  318. !
  319. tag: aString
  320. ^root addBrush: (self newTag: aString)
  321. !
  322. tbody
  323. ^self tag: 'tbody'
  324. !
  325. td
  326. ^self tag: 'td'
  327. !
  328. textarea
  329. ^self tag: 'textarea'
  330. !
  331. tfoot
  332. ^self tag: 'tfoot'
  333. !
  334. th
  335. ^self tag: 'th'
  336. !
  337. thead
  338. ^self tag: 'thead'
  339. !
  340. time
  341. ^self tag: 'time'
  342. !
  343. title
  344. ^self tag: 'title'
  345. !
  346. tr
  347. ^self tag: 'tr'
  348. !
  349. ul
  350. ^self tag: 'ul'
  351. !
  352. ul: anObject
  353. ^self ul with: anObject
  354. !
  355. video
  356. ^self tag: 'video'
  357. ! !
  358. !HTMLCanvas class methodsFor: 'instance creation'!
  359. browserVersion
  360. ^(jQuery at: #browser) version
  361. !
  362. isMSIE
  363. ^((jQuery at: #browser) at: #msie) notNil
  364. !
  365. isMozilla
  366. ^((jQuery at: #browser) at: #mozilla) notNil
  367. !
  368. isOpera
  369. ^((jQuery at: #browser) at: #opera) notNil
  370. !
  371. isWebkit
  372. ^((jQuery at: #browser) at: #webkit) notNil
  373. !
  374. onJQuery: aJQuery
  375. ^self basicNew
  376. initializeFromJQuery: aJQuery;
  377. initialize;
  378. yourself
  379. ! !
  380. Object subclass: #HtmlSnippet
  381. instanceVariableNames: 'snippets'
  382. package: 'Canvas'!
  383. !HtmlSnippet commentStamp!
  384. HtmlSnippet instance is the registry of html snippets.
  385. HtmlSnippet current is the public singleton instance.
  386. At the beginning, it scans the document for any html elements
  387. with 'data-snippet="foo"' attribute and takes them off the document,
  388. remembering them in the store under the specified name.
  389. It also install method #foo into HTMLCanvas dynamically.
  390. Every html snippet should mark a 'caret', a place where contents
  391. can be inserted, by 'data-snippet="*"' (a special name for caret).
  392. For example:
  393. <li data-snippet='menuelement' class='...'><a data-snippet='*'></a></li>
  394. defines a list element with a link inside; the link itself is marked as a caret.
  395. You can later issue
  396. html menuelement href: '/foo'; with: 'A foo'
  397. to insert the whole snippet and directly manipulate the caret, so it renders:
  398. <li class='...'><a href='/foo'>A foo</a></li>
  399. For a self-careting tags (not very useful, but you do not need to fill class etc.
  400. you can use
  401. <div class='lots of classes' attr1='one' attr2='two' data-snippet='*bar'></div>
  402. and in code later do:
  403. html bar with: [ xxx ]
  404. to render
  405. <div class='lots of classes' attr1='one' attr2='two'>...added by xxx...</div>!
  406. !HtmlSnippet methodsFor: 'accessing'!
  407. addSnippet: anAssociation
  408. self snippets add: anAssociation
  409. !
  410. snippetAt: aString
  411. ^ snippets at: aString
  412. !
  413. snippetAt: aString ifAbsent: aBlock
  414. ^ snippets at: aString ifAbsent: aBlock
  415. !
  416. snippets
  417. ^snippets ifNil: [ snippets := #{} ]
  418. !
  419. snippetsFromJQuery: aJQuery
  420. ^ (aJQuery find: '[data-snippet]') toArray
  421. ! !
  422. !HtmlSnippet methodsFor: 'initialization'!
  423. initializeFromJQuery: aJQuery
  424. "Finds and takes out all snippets out of aJQuery.
  425. Installs it into self."
  426. (self snippetsFromJQuery: aJQuery) do: [ :each |
  427. self installSnippetFromJQuery: each asJQuery ]
  428. ! !
  429. !HtmlSnippet methodsFor: 'method generation'!
  430. compileSnippet: anAssociation
  431. "Method generation the the snippet.
  432. The selector is the key of anAssociation, the method block being the value of anAssociation"
  433. ClassBuilder new
  434. installMethod: ([ :htmlReceiver | htmlReceiver snippet: anAssociation value ]
  435. currySelf asCompiledMethod: anAssociation key)
  436. forClass: HTMLCanvas
  437. category: '**snippets'
  438. ! !
  439. !HtmlSnippet methodsFor: 'snippet installation'!
  440. installSnippet: anAssociation
  441. self
  442. addSnippet: anAssociation;
  443. compileSnippet: anAssociation
  444. !
  445. installSnippetFromJQuery: element
  446. | name |
  447. name := element attr: 'data-snippet'.
  448. name = '*' ifFalse: [
  449. ('^\*' asRegexp test: name)
  450. ifTrue: [
  451. name := name allButFirst.
  452. element attr: 'data-snippet' put: '*' ]
  453. ifFalse: [
  454. element removeAttr: 'data-snippet' ].
  455. self installSnippet: name -> (element detach get: 0) ]
  456. ! !
  457. HtmlSnippet class instanceVariableNames: 'current'!
  458. !HtmlSnippet class methodsFor: 'initialization'!
  459. ensureCurrent
  460. current ifNil: [
  461. current := super new
  462. initializeFromJQuery: document asJQuery;
  463. yourself ]
  464. !
  465. initialize
  466. self ensureCurrent
  467. ! !
  468. !HtmlSnippet class methodsFor: 'instance creation'!
  469. current
  470. ^ current
  471. !
  472. new
  473. self shouldNotImplement
  474. ! !
  475. Object subclass: #TagBrush
  476. instanceVariableNames: 'canvas element'
  477. package: 'Canvas'!
  478. !TagBrush methodsFor: 'accessing'!
  479. element
  480. ^element
  481. ! !
  482. !TagBrush methodsFor: 'adding'!
  483. addBrush: aTagBrush
  484. self appendChild: aTagBrush element.
  485. ^aTagBrush
  486. !
  487. append: anObject
  488. anObject appendToBrush: self
  489. !
  490. appendBlock: aBlock
  491. | root |
  492. root := canvas root.
  493. canvas root: self.
  494. aBlock value: canvas.
  495. canvas root: root
  496. !
  497. appendChild: anElement
  498. "In IE7 and IE8 appendChild fails on several node types. So we need to check"
  499. <var element=self['@element'];
  500. if (null == element.canHaveChildren || element.canHaveChildren) {
  501. element.appendChild(anElement);
  502. } else {
  503. element.text = String(element.text) + anElement.innerHTML;
  504. } >
  505. !
  506. appendString: aString
  507. self appendChild: (self createTextNodeFor: aString)
  508. !
  509. appendToBrush: aTagBrush
  510. aTagBrush addBrush: self
  511. !
  512. contents: anObject
  513. self
  514. empty;
  515. append: anObject
  516. !
  517. empty
  518. self asJQuery empty
  519. !
  520. with: anObject
  521. self append: anObject
  522. ! !
  523. !TagBrush methodsFor: 'attributes'!
  524. accesskey: aString
  525. self at: 'accesskey' put: aString
  526. !
  527. action: aString
  528. self at: 'action' put: aString
  529. !
  530. align: aString
  531. self at: 'align' put: aString
  532. !
  533. alt: aString
  534. self at: 'alt' put: aString
  535. !
  536. at: aString put: aValue
  537. <self['@element'].setAttribute(aString, aValue)>
  538. !
  539. class: aString
  540. <self['@element'].className = aString>
  541. !
  542. cols: aString
  543. self at: 'cols' put: aString
  544. !
  545. contenteditable: aString
  546. self at: 'contenteditable' put: aString
  547. !
  548. contextmenu: aString
  549. self at: 'contextmenu' put: aString
  550. !
  551. draggable: aString
  552. self at: 'draggable' put: aString
  553. !
  554. for: aString
  555. self at: 'for' put: aString
  556. !
  557. height: aString
  558. self at: 'height' put: aString
  559. !
  560. hidden
  561. self at: 'hidden' put: 'hidden'
  562. !
  563. href: aString
  564. self at: 'href' put: aString
  565. !
  566. id: aString
  567. self at: 'id' put: aString
  568. !
  569. media: aString
  570. self at: 'media' put: aString
  571. !
  572. method: aString
  573. self at: 'method' put: aString
  574. !
  575. name: aString
  576. self at: 'name' put: aString
  577. !
  578. placeholder: aString
  579. self at: 'placeholder' put: aString
  580. !
  581. rel: aString
  582. self at: 'rel' put: aString
  583. !
  584. removeAt: aString
  585. <self['@element'].removeAttribute(aString)>
  586. !
  587. rows: aString
  588. self at: 'rows' put: aString
  589. !
  590. src: aString
  591. self at: 'src' put: aString
  592. !
  593. style: aString
  594. self at: 'style' put: aString
  595. !
  596. tabindex: aNumber
  597. self at: 'tabindex' put: aNumber
  598. !
  599. target: aString
  600. self at: 'target' put: aString
  601. !
  602. title: aString
  603. self at: 'title' put: aString
  604. !
  605. type: aString
  606. self at: 'type' put: aString
  607. !
  608. valign: aString
  609. self at: 'valign' put: aString
  610. !
  611. value: aString
  612. self at: 'value' put: aString
  613. !
  614. width: aString
  615. self at: 'width' put: aString
  616. ! !
  617. !TagBrush methodsFor: 'converting'!
  618. asJQuery
  619. ^window jQuery: self element
  620. ! !
  621. !TagBrush methodsFor: 'events'!
  622. onBlur: aBlock
  623. self asJQuery bind: 'blur' do: aBlock
  624. !
  625. onChange: aBlock
  626. self asJQuery bind: 'change' do: aBlock
  627. !
  628. onClick: aBlock
  629. self asJQuery bind: 'click' do: aBlock
  630. !
  631. onDblClick: aBlock
  632. self asJQuery bind: 'dblclick' do: aBlock
  633. !
  634. onFocus: aBlock
  635. self asJQuery bind: 'focus' do: aBlock
  636. !
  637. onFocusIn: aBlock
  638. self asJQuery bind: 'focusin' do: aBlock
  639. !
  640. onFocusOut: aBlock
  641. self asJQuery bind: 'focusout' do: aBlock
  642. !
  643. onHover: aBlock
  644. self asJQuery bind: 'hover' do: aBlock
  645. !
  646. onKeyDown: aBlock
  647. self asJQuery bind: 'keydown' do: aBlock
  648. !
  649. onKeyPress: aBlock
  650. self asJQuery bind: 'keypress' do: aBlock
  651. !
  652. onKeyUp: aBlock
  653. self asJQuery bind: 'keyup' do: aBlock
  654. !
  655. onMouseDown: aBlock
  656. self asJQuery bind: 'mousedown' do: aBlock
  657. !
  658. onMouseEnter: aBlock
  659. self asJQuery bind: 'mouseenter' do: aBlock
  660. !
  661. onMouseLeave: aBlock
  662. self asJQuery bind: 'mouseleave' do: aBlock
  663. !
  664. onMouseMove: aBlock
  665. self asJQuery bind: 'mousemove' do: aBlock
  666. !
  667. onMouseOut: aBlock
  668. self asJQuery bind: 'mouseout' do: aBlock
  669. !
  670. onMouseOver: aBlock
  671. self asJQuery bind: 'mouseover' do: aBlock
  672. !
  673. onMouseUp: aBlock
  674. self asJQuery bind: 'mouseup' do: aBlock
  675. !
  676. onSelect: aBlock
  677. self asJQuery bind: 'select' do: aBlock
  678. !
  679. onSubmit: aBlock
  680. self asJQuery bind: 'submit' do: aBlock
  681. !
  682. onUnload: aBlock
  683. self asJQuery bind: 'unload' do: aBlock
  684. ! !
  685. !TagBrush methodsFor: 'initialization'!
  686. initializeFromJQuery: aJQuery canvas: aCanvas
  687. element := aJQuery get: 0.
  688. canvas := aCanvas
  689. !
  690. initializeFromString: aString canvas: aCanvas
  691. element := self createElementFor: aString.
  692. canvas := aCanvas
  693. ! !
  694. !TagBrush methodsFor: 'private'!
  695. createElementFor: aString
  696. <return document.createElement(String(aString))>
  697. !
  698. createTextNodeFor: aString
  699. <return document.createTextNode(String(aString))>
  700. ! !
  701. !TagBrush class methodsFor: 'instance creation'!
  702. fromJQuery: aJQuery canvas: aCanvas
  703. ^self new
  704. initializeFromJQuery: aJQuery canvas: aCanvas;
  705. yourself
  706. !
  707. fromString: aString canvas: aCanvas
  708. ^self new
  709. initializeFromString: aString canvas: aCanvas;
  710. yourself
  711. ! !
  712. TagBrush subclass: #StyleTag
  713. instanceVariableNames: 'canvas element'
  714. package: 'Canvas'!
  715. !StyleTag commentStamp!
  716. I'm a <style> tag use to inline CSS or load a stylesheet.
  717. For inlining handle IE compatibility problems.!
  718. !StyleTag methodsFor: 'adding'!
  719. with: aString
  720. HTMLCanvas isMSIE
  721. ifTrue: [self element styleSheet cssText: aString ]
  722. ifFalse: [super with: aString ].
  723. ! !
  724. !StyleTag class methodsFor: 'instance creation'!
  725. canvas: aCanvas
  726. ^self new
  727. initializeFromString: 'style' canvas: aCanvas;
  728. yourself
  729. ! !
  730. Object subclass: #Widget
  731. instanceVariableNames: ''
  732. package: 'Canvas'!
  733. !Widget methodsFor: 'adding'!
  734. appendToBrush: aTagBrush
  735. self appendToJQuery: aTagBrush asJQuery
  736. !
  737. appendToJQuery: aJQuery
  738. self renderOn: (HTMLCanvas onJQuery: aJQuery)
  739. ! !
  740. !Widget methodsFor: 'rendering'!
  741. renderOn: html
  742. self
  743. ! !
  744. !Object methodsFor: '*Canvas'!
  745. appendToBrush: aTagBrush
  746. aTagBrush append: self asString
  747. !
  748. appendToJQuery: aJQuery
  749. aJQuery append: self asString
  750. ! !
  751. !BlockClosure methodsFor: '*Canvas'!
  752. appendToBrush: aTagBrush
  753. aTagBrush appendBlock: self
  754. !
  755. appendToJQuery: aJQuery
  756. self value: (HTMLCanvas onJQuery: aJQuery)
  757. ! !
  758. !CharacterArray methodsFor: '*Canvas'!
  759. asSnippet
  760. ^ HtmlSnippet current snippetAt: self asString
  761. ! !
  762. !String methodsFor: '*Canvas'!
  763. appendToBrush: aTagBrush
  764. aTagBrush appendString: self
  765. !
  766. appendToJQuery: aJQuery
  767. aJQuery append: self
  768. !
  769. asJQuery
  770. <return jQuery(String(self))>
  771. ! !
  772. !JSObjectProxy methodsFor: '*Canvas'!
  773. asJQuery
  774. <return jQuery(self['@jsObject'])>
  775. ! !