Canvas.st 15 KB

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