Smalltalk current createPackage: 'Canvas-Snippet' properties: #{}! Object subclass: #HtmlSnippet instanceVariableNames: 'snippets' package: 'Canvas-Snippet'! !HtmlSnippet methodsFor: 'accessing'! addSnippet: anAssociation | snippet | (snippets ifNil: [ snippets := #{} ]) add: anAssociation. snippet := anAssociation value. ClassBuilder new installMethod: ([ :htmlReceiver | htmlReceiver snip: snippet ] currySelf asCompiledMethod: anAssociation key) forClass: HTMLCanvas category: '**snippets' ! addSnippets: aCollection aCollection associationsDo: [ :each | self addSnippet: each ] ! at: aString ^ snippets at: aString ! at: aString ifAbsent: aBlock ^ snippets at: aString ifAbsent: aBlock ! ! HtmlSnippet class instanceVariableNames: 'current'! !HtmlSnippet class methodsFor: 'action'! digFromJQuery: aJQuery "Finds and takes out all snippets out of aJQuery" | result | result := #{}. '[data-snippet]' asJQuery toArray do: [ :each | | jq name | jq := each asJQuery. name := jq attr: 'data-snippet'. name = '*' ifFalse: [ ('^\*' asRegexp test: name) ifTrue: [ name := name allButFirst. jq attr: 'data-snippet' put: '*' ] ifFalse: [ jq removeAttr: 'data-snippet' ]. result at: name put: (jq detach get: 0) ]]. ^result ! ! !HtmlSnippet class methodsFor: 'instance creation'! current ^ current ifNil: [ current := self new addSnippets: (self digFromJQuery: document asJQuery); yourself ] ! ! !CharacterArray methodsFor: '*Canvas-Snippet'! asSnippet ^ HtmlSnippet current at: self asString ! ! !HTMLCanvas methodsFor: '*Canvas-Snippet'! snip: anElement "Adds clone of anElement, finds [data-snippet=""*""] subelement and returns TagBrush as if that subelement was just added. Use with asSnippet -- (html snip: #mySnip asSnippet) with: [...]" | clone caret | clone := anElement asJQuery clone. self with: (TagBrush fromJQuery: clone canvas: self). caret := clone find: '[data-snippet="*"]'. caret toArray isEmpty ifTrue: [ caret := clone ]. ^TagBrush fromJQuery: (caret removeAttr: 'data-snippet') canvas: self ! !