Trapped-Frontend.st 3.3 KB

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