Web.st 16 KB

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