Silk.st 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. Smalltalk createPackage: 'Silk'!
  2. Domite subclass: #Silk
  3. instanceVariableNames: ''
  4. package: 'Silk'!
  5. !Silk commentStamp!
  6. I am adding convenience APIs to my subclass, `Domite`.
  7. ##Rendering
  8. - `aSilk << anObject` uses double-dispatch via `renderOnSilk:`. This allows creating widgets (no formal superclass, anything with `renderOnSilk:` is a widget), as well as incorporating blocks: `aSilk << aBlock` runs the block, passing aSilk as a parameter.
  9. ##Convenience
  10. - `aCssSelectorString asSilk` returns Silk wrapping an element at a selector.
  11. - `anObject inSilk` returns anObject rendered in a document fragment.
  12. ##Element creation
  13. These messages use DNU to dynamically create
  14. elements with any (letters-and-numbers) tag name,
  15. Next samples show this on an example of `<div>`.
  16. - `Silk DIV` is shortcut for `Silk newElement: 'div'`.
  17. - `aSilk DIV` is shortcut for `[ |tmp| tmp := Silk DIV. aSilk << tmp. tmp] value`. IOW, it not just creates the element and returns it, but also puts in on aSilk.!
  18. !Silk methodsFor: 'writing'!
  19. doesNotUnderstand: aMessage
  20. "`aSilk DIV` creates a div element and inserts it"
  21. | selector newElement |
  22. selector := aMessage selector.
  23. selector asUppercase = selector
  24. ifFalse: [ ^ super doesNotUnderstand: aMessage ].
  25. (selector includes: ':')
  26. ifTrue: [ ^ super doesNotUnderstand: aMessage ].
  27. newElement := self class newElement: selector asLowercase.
  28. self << newElement.
  29. ^ newElement
  30. !
  31. nextPut: anObject
  32. "Double-dispatches anObject via renderOnSilk: message.
  33. If a message returns nil, this fallbacks to superclass.
  34. Otherwise, it is assumed renderOnSilk: did its job."
  35. (anObject renderOnSilk: self)
  36. ifNil: [ super nextPut: anObject ]
  37. ! !
  38. !Silk class methodsFor: 'message handling'!
  39. doesNotUnderstand: aMessage
  40. "`Silk DIV` creates a div element"
  41. | selector |
  42. selector := aMessage selector.
  43. selector asUppercase = selector
  44. ifFalse: [ ^ super doesNotUnderstand: aMessage ].
  45. (selector includes: ':')
  46. ifTrue: [ ^ super doesNotUnderstand: aMessage ].
  47. ^ self newElement: selector asLowercase
  48. ! !
  49. !BlockClosure methodsFor: '*Silk'!
  50. renderOnSilk: aSilk
  51. self value: aSilk
  52. ! !
  53. !CharacterArray methodsFor: '*Silk'!
  54. asSilk
  55. ^ Silk at: self asString
  56. ! !
  57. !JSObjectProxy methodsFor: '*Silk'!
  58. inSilk
  59. ^ Silk newStream << self; yourself
  60. ! !
  61. !Object methodsFor: '*Silk'!
  62. inSilk
  63. ^ Silk newStream << self; yourself
  64. !
  65. renderOnSilk: aSilk
  66. ^ nil
  67. ! !