1
0

Canvas-Snippet.st 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. Smalltalk current createPackage: 'Canvas-Snippet' properties: #{}!
  2. Object subclass: #HtmlSnippet
  3. instanceVariableNames: 'snippets'
  4. package: 'Canvas-Snippet'!
  5. !HtmlSnippet methodsFor: 'accessing'!
  6. addSnippet: anAssociation
  7. (snippets ifNil: [ snippets := #{} ]) add: anAssociation
  8. !
  9. addSnippets: aCollection
  10. aCollection associationsDo: [ :each | self addSnippet: each ]
  11. !
  12. at: aString
  13. ^ snippets at: aString
  14. !
  15. at: aString ifAbsent: aBlock
  16. ^ snippets at: aString ifAbsent: aBlock
  17. ! !
  18. HtmlSnippet class instanceVariableNames: 'current'!
  19. !HtmlSnippet class methodsFor: 'action'!
  20. digFromJQuery: aJQuery
  21. "Finds and takes out all snippets out of aJQuery"
  22. | result |
  23. result := #{}.
  24. '[data-snippet]' asJQuery toArray do: [ :each |
  25. | jq name |
  26. jq := each asJQuery.
  27. name := jq attr: 'data-snippet'.
  28. name = '*' ifFalse: [
  29. ('^\*' asRegexp test: name) ifTrue: [ name := name allButFirst. jq attr: 'data-snippet' put: '*' ]
  30. ifFalse: [ jq removeAttr: 'data-snippet' ].
  31. result at: name put: (jq detach get: 0) ]].
  32. ^result
  33. ! !
  34. !HtmlSnippet class methodsFor: 'instance creation'!
  35. current
  36. ^ current ifNil: [
  37. current := self new addSnippets: (self digFromJQuery: document asJQuery); yourself ]
  38. ! !
  39. !CharacterArray methodsFor: '*Canvas-Snippet'!
  40. asSnippet
  41. ^ HtmlSnippet current at: self asString
  42. ! !
  43. !HTMLCanvas methodsFor: '*Canvas-Snippet'!
  44. doesNotUnderstand: aMessage
  45. | snippet |
  46. aMessage arguments isEmpty ifFalse: [ ^super doesNotUnderstand: aMessage ].
  47. snippet := HtmlSnippet current at: aMessage selector ifAbsent: [ ^super doesNotUnderstand: aMessage ].
  48. ^ self snip: snippet
  49. !
  50. snip: anElement
  51. "Adds clone of anElement, finds [data-snippet=""*""] subelement
  52. and returns TagBrush as if that subelement was just added.
  53. Use with asSnippet -- (html snip: #mySnip asSnippet) with: [...]"
  54. | clone caret |
  55. clone := anElement asJQuery clone.
  56. self with: (TagBrush fromJQuery: clone canvas: self).
  57. caret := clone find: '[data-snippet="*"]'.
  58. caret toArray isEmpty ifTrue: [ caret := clone ].
  59. ^TagBrush fromJQuery: (caret removeAttr: 'data-snippet') canvas: self
  60. ! !