Trapped-Frontend.st 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. Smalltalk current createPackage: 'Trapped-Frontend' properties: #{}!
  2. Widget subclass: #TrappedDumbView
  3. instanceVariableNames: ''
  4. package: 'Trapped-Frontend'!
  5. !TrappedDumbView commentStamp!
  6. I just read and show an actual path.!
  7. !TrappedDumbView methodsFor: 'rendering'!
  8. renderOn: html
  9. html root trapShow: #()
  10. ! !
  11. Object subclass: #TrappedModelWrapper
  12. instanceVariableNames: 'payload'
  13. package: 'Trapped-Frontend'!
  14. !TrappedModelWrapper methodsFor: 'accessing'!
  15. payload
  16. ^payload
  17. !
  18. payload: anObject
  19. payload := anObject
  20. ! !
  21. !TrappedModelWrapper methodsFor: 'action'!
  22. name
  23. ^ self class name
  24. !
  25. start
  26. Trapped current register: self name: self name
  27. ! !
  28. !TrappedModelWrapper class methodsFor: 'action'!
  29. start
  30. self new start
  31. ! !
  32. TrappedModelWrapper subclass: #TrappedPlainModel
  33. instanceVariableNames: ''
  34. package: 'Trapped-Frontend'!
  35. !TrappedPlainModel methodsFor: 'action'!
  36. read: path do: aBlock
  37. | data |
  38. data := path inject: self payload
  39. into: [ :soFar :segment | soFar at: segment ].
  40. aBlock value: data.
  41. !
  42. watch: path do: aBlock
  43. [ self read: path do: aBlock ] fork
  44. ! !
  45. !TrappedPlainModel class methodsFor: 'action'!
  46. start
  47. self new start
  48. ! !
  49. Object subclass: #TrappedSingleton
  50. instanceVariableNames: ''
  51. package: 'Trapped-Frontend'!
  52. !TrappedSingleton methodsFor: 'action'!
  53. start
  54. ^ self subclassResponsibility
  55. ! !
  56. TrappedSingleton class instanceVariableNames: 'current'!
  57. !TrappedSingleton class methodsFor: 'accessing'!
  58. current
  59. ^ current ifNil: [ current := self new ]
  60. ! !
  61. !TrappedSingleton class methodsFor: 'action'!
  62. start
  63. self current start
  64. ! !
  65. TrappedSingleton subclass: #Trapped
  66. instanceVariableNames: 'registry'
  67. package: 'Trapped-Frontend'!
  68. !Trapped methodsFor: 'accessing'!
  69. byName: aString
  70. ^ registry at: aString
  71. !
  72. register: aFly name: aString
  73. registry at: aString put: aFly
  74. ! !
  75. !Trapped methodsFor: 'action'!
  76. start
  77. '[data-trap]' asJQuery each: [ :index :elem |
  78. | trap jq viewName modelName tokens path |
  79. jq := elem asJQuery.
  80. trap := jq attr: 'data-trap'.
  81. tokens := trap tokenize: ':'.
  82. tokens size = 1 ifTrue: [ tokens := { 'TrappedDumbView' }, tokens ].
  83. viewName := tokens first.
  84. tokens := (tokens second tokenize: ' ') select: [ :each | each notEmpty ].
  85. modelName := tokens first.
  86. path := Trapped parse: tokens allButFirst.
  87. { modelName }, path trapDescend: [(Smalltalk current at: viewName) new appendToJQuery: jq].
  88. ]
  89. ! !
  90. !Trapped methodsFor: 'initialization'!
  91. initialize
  92. super initialize.
  93. registry := #{}.
  94. ! !
  95. !Trapped class methodsFor: 'accessing'!
  96. parse: anArray
  97. ^anArray collect: [ :each |
  98. | asNum |
  99. <asNum = parseInt(each)>.
  100. asNum = asNum ifTrue: [ asNum ] ifFalse: [
  101. each first = '#' ifTrue: [ each allButFirst asSymbol ] ifFalse: [ each ]]]
  102. !
  103. path
  104. ^TrappedPathStack current elements
  105. ! !
  106. TrappedSingleton subclass: #TrappedPathStack
  107. instanceVariableNames: 'elements'
  108. package: 'Trapped-Frontend'!
  109. !TrappedPathStack methodsFor: 'accessing'!
  110. elements
  111. ^elements
  112. ! !
  113. !TrappedPathStack methodsFor: 'descending'!
  114. append: anArray
  115. elements := elements, anArray
  116. !
  117. with: anArray do: aBlock
  118. | old |
  119. old := elements.
  120. [ self append: anArray.
  121. aBlock value ] ensure: [ elements := old ]
  122. ! !
  123. !TrappedPathStack methodsFor: 'initialization'!
  124. initialize
  125. elements := #().
  126. ! !
  127. !Array methodsFor: '*Trapped-Frontend'!
  128. trapDescend: aBlock
  129. TrappedPathStack current with: self do: aBlock
  130. ! !
  131. !Array methodsFor: '*Trapped-Frontend'!
  132. trapDescend: aBlock
  133. TrappedPathStack current with: self do: aBlock
  134. ! !
  135. !TagBrush methodsFor: '*Trapped-Frontend'!
  136. trap: path read: aBlock
  137. path trapDescend: [ | actual model |
  138. actual := Trapped path.
  139. model := Trapped current byName: actual first.
  140. model watch: actual allButFirst do: [ :data |
  141. aBlock value: self value: data
  142. ]
  143. ]
  144. !
  145. trapShow: path
  146. self trap: path read: [ :brush :model | brush empty; with: model ]
  147. ! !