Canvas-Snippet.st 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. | snippet |
  8. (snippets ifNil: [ snippets := #{} ]) add: anAssociation.
  9. snippet := anAssociation value.
  10. ClassBuilder new
  11. installMethod: ([ :htmlReceiver | htmlReceiver snip: snippet ] currySelf asCompiledMethod: anAssociation key)
  12. forClass: HTMLCanvas
  13. category: '**snippets'
  14. !
  15. addSnippets: aCollection
  16. aCollection associationsDo: [ :each | self addSnippet: each ]
  17. !
  18. at: aString
  19. ^ snippets at: aString
  20. !
  21. at: aString ifAbsent: aBlock
  22. ^ snippets at: aString ifAbsent: aBlock
  23. ! !
  24. HtmlSnippet class instanceVariableNames: 'current'!
  25. !HtmlSnippet class methodsFor: 'action'!
  26. digFromJQuery: aJQuery
  27. "Finds and takes out all snippets out of aJQuery"
  28. | result |
  29. result := #{}.
  30. '[data-snippet]' asJQuery toArray do: [ :each |
  31. | jq name |
  32. jq := each asJQuery.
  33. name := jq attr: 'data-snippet'.
  34. name = '*' ifFalse: [
  35. ('^\*' asRegexp test: name) ifTrue: [ name := name allButFirst. jq attr: 'data-snippet' put: '*' ]
  36. ifFalse: [ jq removeAttr: 'data-snippet' ].
  37. result at: name put: (jq detach get: 0) ]].
  38. ^result
  39. ! !
  40. !HtmlSnippet class methodsFor: 'instance creation'!
  41. current
  42. ^ current ifNil: [
  43. current := self new addSnippets: (self digFromJQuery: document asJQuery); yourself ]
  44. ! !
  45. !CharacterArray methodsFor: '*Canvas-Snippet'!
  46. asSnippet
  47. ^ HtmlSnippet current at: self asString
  48. ! !
  49. !HTMLCanvas methodsFor: '*Canvas-Snippet'!
  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. ! !