diff --git a/src/Toplo-Tests/ToSelectorCSSLikePrinterTest.class.st b/src/Toplo-Tests/ToSelectorCSSLikePrinterTest.class.st deleted file mode 100644 index 1c0d8d915..000000000 --- a/src/Toplo-Tests/ToSelectorCSSLikePrinterTest.class.st +++ /dev/null @@ -1,188 +0,0 @@ -Class { - #name : 'ToSelectorCSSLikePrinterTest', - #superclass : 'TestCase', - #instVars : [ - 'printer' - ], - #category : 'Toplo-Tests-Core-Selectors', - #package : 'Toplo-Tests', - #tag : 'Core-Selectors' -} - -{ #category : 'running' } -ToSelectorCSSLikePrinterTest >> setUp [ - - - super setUp. - printer := ToSelectorCSSLikePrinter new -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> test1 [ - - | selector | - selector := (ToStampSelector new addStamp: #'button-label') - withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) - atDepth: 1. - selector accept: printer. - self assert: printer contents equals: '(stamp:#''button-label'' parent:((stamp:#button + stamp:#danger) depth:1))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> test2 [ - - | selector | - selector := ((ToStampSelector new addStamp: #'button-label') - withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) - atDepth: 1) - - ((ToStampSelector new addStamp: #'button-label') - withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) - atDepth: 1). - selector accept: printer. - self - assert: printer contents - equals: - '((stamp:#''button-label'' parent:((stamp:#button + stamp:#danger) depth:1)) - (stamp:#''button-label'' parent:((stamp:#button + stamp:#danger) depth:1)))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitActionSelector [ - - | selector | - selector := [ :e | e isKindOf: ToButton ] asActionSelector. - selector accept: printer. - self assert: printer contents equals: 'action:[ :e | e isKindOf: ToButton ]' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitAndSelector [ - - | selector | - selector := (#'labeled-icon' asStampSelector) + (ToImage asTypeSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'' + type:ToImage)' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitChildSelector [ - - | selector | - selector := (#button asStampSelector) withChild: (ToImage asTypeSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#button child:(type:ToImage))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitChildSelectorWithDepth [ - - | selector | - selector := (#button asStampSelector) withChild: (ToImage asTypeSelector) atDepth: 2. - selector accept: printer. - self assert: printer contents equals: '(stamp:#button child:(type:ToImage depth:2))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitIdSelector [ - - | selector | - selector := #'button-label' asIdSelector. - selector accept: printer. - self assert: printer contents equals: '#button-label' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitMinusSelector [ - - | selector | - selector := (#'labeled-icon' asStampSelector) - (ToImage asTypeSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'' - type:ToImage)' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitNotSelector [ - - | selector | - selector := (#'labeled-icon' asStampSelector) not. - selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'') not' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitOrSelector [ - - | selector | - selector := (#'labeled-icon' asStampSelector) or: (ToImage asTypeSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'' or: type:ToImage)' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitParentSelector [ - - | selector | - selector := (#button asStampSelector) withParent: (ToPane asTypeSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#button parent:(type:ToPane))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitParentSelectorWithDepth [ - - | selector | - selector := (#button asStampSelector) withParent: (ToPane asTypeSelector) atDepth: 2. - selector accept: printer. - self assert: printer contents equals: '(stamp:#button parent:(type:ToPane depth:2))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitSiblingSelector [ - - | selector | - selector := (#icon asStampSelector) withSibling: (#label asStampSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#icon sibling:(stamp:#label))' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitStyleStampSelector [ - - | selector | - selector := #'labeled-icon' asStampSelector. - selector accept: printer. - self assert: printer contents equals: '.labeled-icon' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitStyleStampSelectorWith2Stamps [ - - | selector | - selector := #(#'button' 'primary') asStampSelector. - selector accept: printer. - self assert: printer contents equals: '.button, .primary'. - printer reset. - selector := #(#'button-one' 'primary') asStampSelector. - selector accept: printer. - self assert: printer contents equals: '.button-one, .primary' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitTypeSelector [ - - | selector | - selector := ToButton asTypeSelector. - selector accept: printer. - self assert: printer contents equals: 'type:ToButton' -] - -{ #category : 'tests' } -ToSelectorCSSLikePrinterTest >> testVisitUniversalSelector [ - - | selector | - selector := ToUniversalSelector new. - selector accept: printer. - self assert: printer contents equals: '*' -] diff --git a/src/Toplo-Tests/ToSelectorInterpreterTest.class.st b/src/Toplo-Tests/ToSelectorInterpreterTest.class.st index 5f7eea0a1..ce41f0cf5 100644 --- a/src/Toplo-Tests/ToSelectorInterpreterTest.class.st +++ b/src/Toplo-Tests/ToSelectorInterpreterTest.class.st @@ -9,8 +9,8 @@ Class { #tag : 'Core-Selectors' } -{ #category : 'tests - action selector' } -ToSelectorInterpreterTest >> testActionSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitActionSelector [ | selector e engine | e := ToElement new. @@ -22,8 +22,78 @@ ToSelectorInterpreterTest >> testActionSelector [ ] -{ #category : 'tests - child selector' } -ToSelectorInterpreterTest >> testChildMixedWithParentSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitAndSelector [ + " a rule with an And operator " + + | selector e engine | + selector := (ToStampSelector new addAllStamps: #( #button )) + && (ToStampSelector new addAllStamps: #( #danger )). + + e := ToElement new addStamp: #button. + engine := ToSelectorInterpreter new. + engine check: selector on: e. + self assert: engine result not. + e addStamp: #danger. + " ko since no child " + engine check: selector on: e. + self assert: engine result. + + selector := selector not. + engine check: selector on: e. + self assert: engine result not +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitAndSelectorWithParentSelector [ + " a rule with an And operator " + + | selector e engine child | + selector := (ToStampSelector new addStamp: #'button-label') + withParent: (ToStampSelector new addStamp: #button) + && (ToStampSelector new addStamp: #danger) + atDepth: 1. + + e := ToElement new addStamp: #button. + engine := ToSelectorInterpreter new. + engine check: selector on: e. + self assert: engine result not. + e addStamp: #danger. + " ko since no child " + engine check: selector on: e. + self assert: engine result not. + e addChild: (child := ToElement new addStamp: #'button-label'). + " ko since no child " + engine check: selector on: e. + self assert: engine result not. + + engine check: selector on: child. + self assert: engine result +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitChildSelector [ + " selector: an element with a parent of type Object " + + | selector e engine parent | + selector := ToUniversalSelector new withChild: + (ToTypeSelector new type: Object). + e := ToElement new. + parent := ToElement new. + parent addChild: e. + self assert: e parent identicalTo: parent. + engine := ToSelectorInterpreter new. + " the result is false since the selector is exact by default " + engine check: selector on: parent. + self assert: engine result not. + " now allow isKindOf: " + selector right exact: false. + engine check: selector on: parent. + self assert: engine result +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitChildSelectorMixedWithParentSelector [ | button innerElement icon label engine innerElementSelector buttonSelector | buttonSelector := #button asStampSelector @@ -54,29 +124,8 @@ ToSelectorInterpreterTest >> testChildMixedWithParentSelector [ self assert: engine result ] -{ #category : 'tests - child selector' } -ToSelectorInterpreterTest >> testChildSelector [ - " selector: an element with a parent of type Object " - - | selector e engine parent | - selector := ToUniversalSelector new withChild: - (ToTypeSelector new type: Object). - e := ToElement new. - parent := ToElement new. - parent addChild: e. - self assert: e parent identicalTo: parent. - engine := ToSelectorInterpreter new. - " the result is false since the selector is exact by default " - engine check: selector on: parent. - self assert: engine result not. - " now allow isKindOf: " - selector right exact: false. - engine check: selector on: parent. - self assert: engine result -] - -{ #category : 'tests - child selector' } -ToSelectorInterpreterTest >> testChildSelectorWithDepth [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitChildSelectorWithDepth [ | childSelectorAnyDepth childSelectorDepth1 childSelectorDepth2 sub subsub parent engine | childSelectorAnyDepth := ToUniversalSelector new withChild: @@ -122,8 +171,8 @@ ToSelectorInterpreterTest >> testChildSelectorWithDepth [ self assert: engine result not ] -{ #category : 'tests - child selector' } -ToSelectorInterpreterTest >> testChildSelectorWithTwoChildrenDepth1 [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitChildSelectorWithTwoChildrenDepth1 [ | button icon label engine buttonSelector | buttonSelector := (ToStampSelector new addStamp: #button) withChild: @@ -145,8 +194,8 @@ ToSelectorInterpreterTest >> testChildSelectorWithTwoChildrenDepth1 [ self assert: engine result ] -{ #category : 'tests - child selector' } -ToSelectorInterpreterTest >> testChildSelectorWithTwoChildrenWithTwoChildSelectorsDepth2 [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitChildSelectorWithTwoChildrenWithTwoChildSelectorsDepth2 [ | button innerElement icon label engine buttonSelector | buttonSelector := ((ToStampSelector new addStamp: #button) @@ -186,101 +235,107 @@ ToSelectorInterpreterTest >> testChildSelectorWithTwoChildrenWithTwoChildSelecto self assert: engine result not ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testClassSelectorWithElementWithoutClass0 [ - - " element with no class, selector without class " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitIdSelector [ | selector e engine | - selector := ToStampSelector new. + selector := ToIdSelector new id: #'my-id'. e := ToElement new. engine := ToSelectorInterpreter new. + " the result is false since the selector is exact by default " engine check: selector on: e. - self assert: engine result -] - -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testClassSelectorWithElementWithoutClass1 [ - - " element with a class, selector without class " - - | selector e engine | - selector := ToStampSelector new. - e := ToElement new addStamp: #a. - engine := ToSelectorInterpreter new. + self assert: engine result not. + e id: #'my-id'. engine check: selector on: e. - self assert: engine result + self assert: engine result ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testClassSelectorWithElementWithoutClass2 [ - - " element with a class, selector with the same class " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitNotSelector [ | selector e engine | - selector := ToStampSelector new addStamp: #a. - e := ToElement new addStamp: #a. + selector := ToIdSelector new id: #'my-id'. + selector := ToNotSelector new left: selector. + e := ToElement new. engine := ToSelectorInterpreter new. + " the result is false since the selector is exact by default " engine check: selector on: e. - self assert: engine result + self assert: engine result. + e id: #'my-id'. + engine check: selector on: e. + self deny: engine result ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testClassSelectorWithElementWithoutClass3 [ - - " element with a class, selector with the a different class " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitNotSelector2 [ | selector e engine | - selector := ToStampSelector new addStamp: #b. - e := ToElement new addStamp: #a. engine := ToSelectorInterpreter new. + selector := ToTypeSelector new type: ToElement. + e := ToElement new. + engine check: selector on: e. + self assert: engine result. + + selector := (ToTypeSelector new type: ToElement) not. engine check: selector on: e. - self assert: engine result not. - selector := ToStampSelector new addStamp: #b. - e := ToElement new addStamp: #a. self assert: engine result not. ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testClassSelectorWithElementWithoutClass4 [ - " element with multiple classes " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitOrSelector [ + " a rule with an And operator " | selector e engine | - selector := ToStampSelector new addStamp: #a. - e := ToElement new addStamp: #a. + selector := (ToStampSelector new addStamp: #button) + || + (ToStampSelector new addAllStamps: + #( #button #horizontal )). + + e := ToElement new addStamp: #button. engine := ToSelectorInterpreter new. engine check: selector on: e. self assert: engine result. - e addStamp: #c. - self assert: engine result. + e addStamp: #horizontal. engine check: selector on: e. self assert: engine result. - e addStamp: #b. + e removeAllStamps. + e addAllStamps: { #blob }. engine check: selector on: e. - self assert: engine result + self assert: engine result not ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testNotSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitOrSelectorWithParentSelector [ + " a rule with an Or operator with a child selector " - | selector e engine | + | selector e engine child | + selector := (ToStampSelector new addStamp: #'inner-element') + withParent: + (ToStampSelector new addAllStamps: + #( #button #horizontal #justified )) + || + (ToStampSelector new addAllStamps: + #( #button #justified )) + atDepth: 1. + + e := ToElement new addStamp: #button. engine := ToSelectorInterpreter new. - selector := ToTypeSelector new type: ToElement. - e := ToElement new. - engine check: selector on: e. - self assert: engine result. - - selector := (ToTypeSelector new type: ToElement) not. engine check: selector on: e. self assert: engine result not. + e addChild: (child := ToElement new addStamp: #'inner-element'). + engine check: selector on: child. + self assert: engine result not. + e addStamp: #justified. + engine check: selector on: child. + self assert: engine result ] -{ #category : 'tests - parent selector' } -ToSelectorInterpreterTest >> testParentSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitParentSelector [ " selector: an element with a parent of type Object " | selector e engine parent | @@ -300,8 +355,36 @@ ToSelectorInterpreterTest >> testParentSelector [ self assert: engine result ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testParentSelectorWithElementWithNoParent [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitParentSelectorWithDepth [ + + | engine parent directParentSelector1 directParentSelector2 parentParentSelector sub subsub | + directParentSelector1 := ToUniversalSelector new withParent: + (ToTypeSelector new type: ToElement). + directParentSelector2 := ToUniversalSelector new + withParent: + (ToTypeSelector new type: ToElement) + atDepth: 1. + parentParentSelector := ToUniversalSelector new + withParent: + (ToTypeSelector new type: ToElement) + atDepth: 2. + sub := ToElement new. + subsub := ToElement new. + parent := ToElement new. + parent addChild: subsub. + subsub addChild: sub. + self assert: subsub parent identicalTo: parent. + engine := ToSelectorInterpreter new. + engine check: directParentSelector1 on: subsub. + self assert: engine result. + engine check: directParentSelector2 on: subsub. + self assert: engine result. + engine check: parentParentSelector on: subsub +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitParentSelectorWithElementWithNoParent [ | selector e engine | selector := ToParentSelector new right: (ToTypeSelector new type: Object). @@ -311,8 +394,8 @@ ToSelectorInterpreterTest >> testParentSelectorWithElementWithNoParent [ self assert: engine result not ] -{ #category : 'tests - parent selector' } -ToSelectorInterpreterTest >> testParentSelectorWithoutLeft [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitParentSelectorWithoutLeft [ " selector: an element with a parent of type Object " | selector e engine parent | @@ -332,30 +415,8 @@ ToSelectorInterpreterTest >> testParentSelectorWithoutLeft [ ] -{ #category : 'tests - and selector' } -ToSelectorInterpreterTest >> testRuleWithAndSelector [ - " a rule with an And operator " - - | selector e engine | - selector := (ToStampSelector new addAllStamps: #( #button )) - + (ToStampSelector new addAllStamps: #( #danger )). - - e := ToElement new addStamp: #button. - engine := ToSelectorInterpreter new. - engine check: selector on: e. - self assert: engine result not. - e addStamp: #danger. - " ko since no child " - engine check: selector on: e. - self assert: engine result. - - selector := selector not. - engine check: selector on: e. - self assert: engine result not -] - -{ #category : 'tests - sibling selector' } -ToSelectorInterpreterTest >> testRuleWithAndSiblingSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitSiblingSelector [ " a rule with an And operator " | selector engine parent child sibling | @@ -372,9 +433,8 @@ ToSelectorInterpreterTest >> testRuleWithAndSiblingSelector [ self assert: engine result ] -{ #category : 'tests - sibling selector' } -ToSelectorInterpreterTest >> testRuleWithAndSiblingSelector2 [ - " a rule with an And operator " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitSiblingSelector2 [ | selector engine parent child sibling | selector := ((ToStampSelector new addStamp: #child) withParent: @@ -396,9 +456,8 @@ ToSelectorInterpreterTest >> testRuleWithAndSiblingSelector2 [ self assert: engine result ] -{ #category : 'tests - sibling selector' } -ToSelectorInterpreterTest >> testRuleWithAndSiblingSelector3 [ - " a rule with an And operator " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitSiblingSelector3 [ | selector engine parent child sibling | selector := ((ToStampSelector new addStamp: #child) withParent: @@ -420,9 +479,8 @@ ToSelectorInterpreterTest >> testRuleWithAndSiblingSelector3 [ self assert: engine result ] -{ #category : 'tests - sibling selector' } -ToSelectorInterpreterTest >> testRuleWithAndTwoSiblingSelector [ - " a rule with an And operator " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitSiblingSelectorTwoSiblingSelectors [ | selector engine parent child sibling1 sibling2 | selector := (((ToStampSelector new addStamp: #child) withParent: @@ -445,8 +503,8 @@ ToSelectorInterpreterTest >> testRuleWithAndTwoSiblingSelector [ self assert: engine result ] -{ #category : 'tests - sibling selector' } -ToSelectorInterpreterTest >> testRuleWithAndTwoSiblingSelector2 [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitSiblingSelectorTwoSiblingSelectors2 [ " a rule with an And operator " | selector engine parent child sibling1 sibling2 | @@ -471,8 +529,8 @@ ToSelectorInterpreterTest >> testRuleWithAndTwoSiblingSelector2 [ self assert: engine result ] -{ #category : 'tests - sibling selector' } -ToSelectorInterpreterTest >> testRuleWithAndTwoSiblingSelector3 [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitSiblingSelectorTwoSiblingSelectors3 [ " a rule with an And operator " | selector engine parent inner child sibling1 sibling2 | @@ -500,82 +558,97 @@ ToSelectorInterpreterTest >> testRuleWithAndTwoSiblingSelector3 [ self assert: engine result ] -{ #category : 'tests - and selector' } -ToSelectorInterpreterTest >> testRuleWithAndWithParentSelector [ - " a rule with an And operator " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitStyleStampSelector [ - | selector e engine child | - selector := (ToStampSelector new addStamp: #'button-label') - withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) - atDepth: 1. + " element with no class, selector without class " - e := ToElement new addStamp: #button. + | selector e engine | + selector := ToStampSelector new. + e := ToElement new. engine := ToSelectorInterpreter new. engine check: selector on: e. - self assert: engine result not. - e addStamp: #danger. - " ko since no child " - engine check: selector on: e. - self assert: engine result not. - e addChild: (child := ToElement new addStamp: #'button-label'). - " ko since no child " - engine check: selector on: e. - self assert: engine result not. - - engine check: selector on: child. - self assert: engine result + self assert: engine result ] -{ #category : 'tests - or selector' } -ToSelectorInterpreterTest >> testRuleWithOrSelector [ - " a rule with an And operator " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitStyleStampSelectorWithElementWithoutClass0 [ - | selector e engine | - selector := (ToStampSelector new addStamp: #button) - or: (ToStampSelector new addAllStamps: #( #button #horizontal )). + " element with no class, selector without class " - e := ToElement new addStamp: #button. + | selector e engine | + selector := ToStampSelector new. + e := ToElement new. engine := ToSelectorInterpreter new. engine check: selector on: e. - self assert: engine result. - e addStamp: #horizontal. + self assert: engine result +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitStyleStampSelectorWithElementWithoutClass1 [ + + " element with a class, selector without class " + + | selector e engine | + selector := ToStampSelector new. + e := ToElement new addStamp: #a. + engine := ToSelectorInterpreter new. engine check: selector on: e. - self assert: engine result. - e removeAllStamps. - e addAllStamps: { #blob }. + self assert: engine result +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitStyleStampSelectorWithElementWithoutClass2 [ + + " element with a class, selector with the same class " + + | selector e engine | + selector := ToStampSelector new addStamp: #a. + e := ToElement new addStamp: #a. + engine := ToSelectorInterpreter new. engine check: selector on: e. - self assert: engine result not + self assert: engine result ] -{ #category : 'tests - or selector' } -ToSelectorInterpreterTest >> testRuleWithOrWithParentSelector [ - " a rule with an Or operator with a child selector " +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitStyleStampSelectorWithElementWithoutClass3 [ - | selector e engine child | - selector := (ToStampSelector new addStamp: #'inner-element') - withParent: ((ToStampSelector new addAllStamps: - #( #button #horizontal #justified )) or: - (ToStampSelector new addAllStamps: - #( #button #justified ))) - atDepth: 1. + " element with a class, selector with the a different class " - e := ToElement new addStamp: #button. + | selector e engine | + selector := ToStampSelector new addStamp: #b. + e := ToElement new addStamp: #a. engine := ToSelectorInterpreter new. engine check: selector on: e. self assert: engine result not. - - e addChild: (child := ToElement new addStamp: #'inner-element'). - engine check: selector on: child. + selector := ToStampSelector new addStamp: #b. + e := ToElement new addStamp: #a. self assert: engine result not. - e addStamp: #justified. - engine check: selector on: child. + +] + +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitStyleStampSelectorWithElementWithoutClass4 [ + " element with multiple classes " + + | selector e engine | + selector := ToStampSelector new addStamp: #a. + e := ToElement new addStamp: #a. + engine := ToSelectorInterpreter new. + engine check: selector on: e. + self assert: engine result. + e addStamp: #c. + self assert: engine result. + engine check: selector on: e. + self assert: engine result. + e addStamp: #b. + engine check: selector on: e. self assert: engine result ] -{ #category : 'tests - type selector' } -ToSelectorInterpreterTest >> testTypeSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitTypeSelector [ | selector e engine | selector := ToTypeSelector new type: ToElement. @@ -585,8 +658,8 @@ ToSelectorInterpreterTest >> testTypeSelector [ self assert: engine result. ] -{ #category : 'tests - type selector' } -ToSelectorInterpreterTest >> testTypeSelectorAndChildSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitTypeSelectorAndChildSelector [ | selector e engine | selector := (ToTypeSelector new type: ToLabeledIcon) withChild: @@ -598,8 +671,8 @@ ToSelectorInterpreterTest >> testTypeSelectorAndChildSelector [ self assert: engine result ] -{ #category : 'tests - type selector' } -ToSelectorInterpreterTest >> testTypeSelectorAndParentSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitTypeSelectorAndParentSelector [ | selector e engine | e := ToLabeledIcon new. @@ -621,8 +694,8 @@ ToSelectorInterpreterTest >> testTypeSelectorAndParentSelector [ self assert: engine result ] -{ #category : 'tests - type selector' } -ToSelectorInterpreterTest >> testTypeSelectorExact [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitTypeSelectorExact [ | selector engine | selector := ToTypeSelector new type: ToElement. @@ -645,8 +718,8 @@ ToSelectorInterpreterTest >> testTypeSelectorExact [ self assert: engine result. ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testUniversalSelector [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitUniversalSelector [ | selector e engine | selector := ToUniversalSelector new. @@ -656,8 +729,8 @@ ToSelectorInterpreterTest >> testUniversalSelector [ self assert: engine result ] -{ #category : 'tests - with single selector' } -ToSelectorInterpreterTest >> testUniversalSelectorWithParent [ +{ #category : 'tests' } +ToSelectorInterpreterTest >> testVisitUniversalSelectorWithParent [ | selector button engine chilLevel3 | selector := ToUniversalSelector new @@ -673,31 +746,3 @@ ToSelectorInterpreterTest >> testUniversalSelectorWithParent [ engine check: selector on: chilLevel3. self assert: engine result ] - -{ #category : 'tests - parent selector' } -ToSelectorInterpreterTest >> testparentSelectorWithDepth [ - - | engine parent directParentSelector1 directParentSelector2 parentParentSelector sub subsub | - directParentSelector1 := ToUniversalSelector new withParent: - (ToTypeSelector new type: ToElement). - directParentSelector2 := ToUniversalSelector new - withParent: - (ToTypeSelector new type: ToElement) - atDepth: 1. - parentParentSelector := ToUniversalSelector new - withParent: - (ToTypeSelector new type: ToElement) - atDepth: 2. - sub := ToElement new. - subsub := ToElement new. - parent := ToElement new. - parent addChild: subsub. - subsub addChild: sub. - self assert: subsub parent identicalTo: parent. - engine := ToSelectorInterpreter new. - engine check: directParentSelector1 on: subsub. - self assert: engine result. - engine check: directParentSelector2 on: subsub. - self assert: engine result. - engine check: parentParentSelector on: subsub -] diff --git a/src/Toplo-Tests/ToSelectorPrinterTest.class.st b/src/Toplo-Tests/ToSelectorPrinterTest.class.st index a5388bd6d..e17eea8fa 100644 --- a/src/Toplo-Tests/ToSelectorPrinterTest.class.st +++ b/src/Toplo-Tests/ToSelectorPrinterTest.class.st @@ -25,11 +25,14 @@ ToSelectorPrinterTest >> test1 [ | selector | selector := (ToStampSelector new addStamp: #'button-label') - withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) - atDepth: 1. + withParent: (ToStampSelector new addStamp: #button) + && (ToStampSelector new addStamp: #danger) + atDepth: 1. selector accept: printer. - self assert: printer contents equals: '(stamp:#''button-label'' parent:((stamp:#button + stamp:#danger) depth:1))' + self + assert: printer contents + equals: + '(stamp:#''button-label'' parent:((stamp:#button && stamp:#danger) depth:1))' ] { #category : 'tests' } @@ -38,17 +41,29 @@ ToSelectorPrinterTest >> test2 [ | selector | selector := ((ToStampSelector new addStamp: #'button-label') withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) + && (ToStampSelector new addStamp: #danger) atDepth: 1) - - ((ToStampSelector new addStamp: #'button-label') + && ((ToStampSelector new addStamp: #'button-label') withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) - atDepth: 1). + && (ToStampSelector new addStamp: #danger) + atDepth: 1) not. selector accept: printer. self assert: printer contents equals: - '((stamp:#''button-label'' parent:((stamp:#button + stamp:#danger) depth:1)) - (stamp:#''button-label'' parent:((stamp:#button + stamp:#danger) depth:1)))' + '((stamp:#''button-label'' parent:((stamp:#button && stamp:#danger) depth:1)) && not((stamp:#''button-label'' parent:((stamp:#button && stamp:#danger) depth:1))))' +] + +{ #category : 'tests' } +ToSelectorPrinterTest >> testAndNot [ + + | selector | + selector := #'labeled-icon' asStampSelector + && ToImage asTypeSelector not. + selector accept: printer. + self + assert: printer contents + equals: '(stamp:#''labeled-icon'' && not(type:ToImage))' ] { #category : 'tests' } @@ -64,9 +79,11 @@ ToSelectorPrinterTest >> testVisitActionSelector [ ToSelectorPrinterTest >> testVisitAndSelector [ | selector | - selector := (#'labeled-icon' asStampSelector) + (ToImage asTypeSelector). + selector := #'labeled-icon' asStampSelector && ToImage asTypeSelector. selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'' + type:ToImage)' + self + assert: printer contents + equals: '(stamp:#''labeled-icon'' && type:ToImage)' ] { #category : 'tests' } @@ -96,31 +113,24 @@ ToSelectorPrinterTest >> testVisitIdSelector [ self assert: printer contents equals: 'id:#''button-label''' ] -{ #category : 'tests' } -ToSelectorPrinterTest >> testVisitMinusSelector [ - - | selector | - selector := (#'labeled-icon' asStampSelector) - (ToImage asTypeSelector). - selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'' - type:ToImage)' -] - { #category : 'tests' } ToSelectorPrinterTest >> testVisitNotSelector [ | selector | selector := (#'labeled-icon' asStampSelector) not. selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'') not' + self assert: printer contents equals: 'not(stamp:#''labeled-icon'')' ] { #category : 'tests' } ToSelectorPrinterTest >> testVisitOrSelector [ | selector | - selector := (#'labeled-icon' asStampSelector) or: (ToImage asTypeSelector). + selector := #'labeled-icon' asStampSelector || ToImage asTypeSelector. selector accept: printer. - self assert: printer contents equals: '(stamp:#''labeled-icon'' or: type:ToImage)' + self + assert: printer contents + equals: '(stamp:#''labeled-icon'' || type:ToImage)' ] { #category : 'tests' } diff --git a/src/Toplo-Tests/ToStyleRuleTest.class.st b/src/Toplo-Tests/ToStyleRuleTest.class.st index 28556575c..b2475e84f 100644 --- a/src/Toplo-Tests/ToStyleRuleTest.class.st +++ b/src/Toplo-Tests/ToStyleRuleTest.class.st @@ -66,7 +66,7 @@ ToStyleRuleTest >> testCanBeAppliedToWithRuleWithAndWithParentSelector [ rule := ToStyleRule new selector: ((ToStampSelector new addStamp: #'button-label') withParent: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) + && (ToStampSelector new addStamp: #danger) atDepth: 1). e := ToElement new addStamp: #button. self deny: (rule canBeAppliedTo: e). @@ -288,8 +288,8 @@ ToStyleRuleTest >> testCanBeAppliedToWithRuleWithUniversalSelector2 [ " a rule with a universal selector among others accept any element " | rule e | - rule := ToStyleRule new - selector: ((ToIdSelector new id: #a) or: ToUniversalSelector new). + rule := ToStyleRule new selector: + (ToIdSelector new id: #a) || ToUniversalSelector new. e := ToElement new. self assert: (rule canBeAppliedTo: e) ] diff --git a/src/Toplo-Tests/ToStyleScriptTest.class.st b/src/Toplo-Tests/ToStyleScriptTest.class.st index 9924296cb..5379cf2ae 100644 --- a/src/Toplo-Tests/ToStyleScriptTest.class.st +++ b/src/Toplo-Tests/ToStyleScriptTest.class.st @@ -153,7 +153,7 @@ ToStyleScriptTest >> testSelectStyleWithAndSelector [ styleScript := ToStyleScript new. styleScript select: (ToStampSelector new addStamp: #button) - + (ToStampSelector new addStamp: #danger) + && (ToStampSelector new addStamp: #danger) style: [ :sr | ]. self assert: styleScript styleRules size equals: 1. rule := styleScript styleRules first. diff --git a/src/Toplo-Tests/ToStyleSheetBazarTest.class.st b/src/Toplo-Tests/ToStyleSheetBazarTest.class.st index 0498b5c9f..bc6faff33 100644 --- a/src/Toplo-Tests/ToStyleSheetBazarTest.class.st +++ b/src/Toplo-Tests/ToStyleSheetBazarTest.class.st @@ -230,15 +230,16 @@ ToStyleSheetBazarTest >> testButtonSkinWithInterspace [ layoutProp := ToFeatureProperty name: #layout. styleSheet := ToStyleSheet new - inherits: false; - yourself. - + inherits: false; + yourself. + script := ToStyleScript new. - script select: ((ToStampSelector new addStamp: #button) or: - (ToStampSelector new addAllStamps: #( #button #horizontal ))) - style: [ :sr | - sr write: layoutProp with: BlLinearLayout horizontal. - sr write: interspaceProp with: 10 ]. + script + select: (ToStampSelector new addStamp: #button) + || (ToStampSelector new addAllStamps: #( #button #horizontal )) + style: [ :sr | + sr write: layoutProp with: BlLinearLayout horizontal. + sr write: interspaceProp with: 10 ]. styleSheet addAllStyleRules: script styleRules. elem := ToElement new. diff --git a/src/Toplo-Theme-Bee/ToBeeStyleSheet.class.st b/src/Toplo-Theme-Bee/ToBeeStyleSheet.class.st index 6bd933d29..796b2229c 100644 --- a/src/Toplo-Theme-Bee/ToBeeStyleSheet.class.st +++ b/src/Toplo-Theme-Bee/ToBeeStyleSheet.class.st @@ -1823,7 +1823,7 @@ ToBeeStyleSheet >> primaryButtonScript: aStyleScript [ "Button background and border" aStyleScript - select: self buttonSelector + #primary asStampSelector + select: self buttonSelector && #primary asStampSelector style: [ :sr | "Background" sr when: ToInstallLookEvent diff --git a/src/Toplo-Theme-Examples/ToThemeExamples.class.st b/src/Toplo-Theme-Examples/ToThemeExamples.class.st index 43445809d..48923dec0 100644 --- a/src/Toplo-Theme-Examples/ToThemeExamples.class.st +++ b/src/Toplo-Theme-Examples/ToThemeExamples.class.st @@ -29,13 +29,14 @@ ToThemeExamples class >> createThemeMenuBar: aSpace [ "Inspect menu" inspectMenu addItem: (ToMenuItem new label: (ToLabel text: 'Inspect Space'); tooltipText: 'Inspect the BlSpace'; whenClickedDo: [ self inspectSpace: aSpace ]). inspectMenu addItem: (ToMenuItem new label: (ToLabel text: 'Inspect Theme'); tooltipText: 'Inspect the current theme'; whenClickedDo: [ self inspectSpaceToTheme: aSpace ]). - inspectMenu addItem: (ToMenuItem new label: (ToLabel text: 'Style Sheet source'); tooltipText: 'Show the current style sheet source code'; whenClickedDo: [ self displaySpaceStyleSheet: aSpace ]). + inspectMenu addItem: (ToMenuItem new label: (ToLabel text: 'CSS like Style Sheet'); tooltipText: 'Show the current style sheet source code'; whenClickedDo: [ self displaySpaceCSSLikeStyleSheet: aSpace ]). + inspectMenu addItem: (ToMenuItem new label: (ToLabel text: 'Style Sheet'); tooltipText: 'Show the current style sheet source code'; whenClickedDo: [ self displaySpaceStyleSheet: aSpace ]). ^ bar ] { #category : 'private - actions' } -ToThemeExamples class >> displaySpaceStyleSheet: aSpace [ +ToThemeExamples class >> displaySpaceCSSLikeStyleSheet: aSpace [ | presenter stream printer | aSpace ifNil: [ ^ self ]. @@ -66,6 +67,38 @@ ToThemeExamples class >> displaySpaceStyleSheet: aSpace [ presenter withWindowDo: [ :w | w title: 'Toplo Style Sheet details' ] ] +{ #category : 'private - actions' } +ToThemeExamples class >> displaySpaceStyleSheet: aSpace [ + + | presenter stream printer | + aSpace ifNil: [ ^ self ]. + aSpace toTheme ifNil: [ ^ self ]. + + "Display Theme styleSheet in a text presenter" + presenter := SpTextPresenter new. + stream := ReadWriteStream on: String new. + + "Build the style sheet detail" + aSpace root skinManager styleSheet + ifNil: [ + stream nextPutAll: 'This theme is not based on style sheets.' ] + ifNotNil: [ :sheet | + stream + nextPutAll: 'CSS Like style sheet with '; + nextPutAll: sheet rawStyleRules size asString; + nextPutAll: ' rule(s)'; + cr; + nextPutAll: '###'; + cr. + printer := ToStyleSheetPrinter new. + printer printStyleSheet: sheet on: stream ]. + + "Open the presenter" + presenter text: stream contents. + presenter open. + presenter withWindowDo: [ :w | w title: 'Toplo Style Sheet details' ] +] + { #category : 'private - get' } ToThemeExamples class >> elementSandBoxFor: aSpace [ diff --git a/src/Toplo/ToElementSelector.class.st b/src/Toplo/ToElementSelector.class.st index 38ec48a60..05fd1afa7 100644 --- a/src/Toplo/ToElementSelector.class.st +++ b/src/Toplo/ToElementSelector.class.st @@ -7,7 +7,7 @@ Class { } { #category : 'logical operator' } -ToElementSelector >> + aStyleSelector [ +ToElementSelector >> && aStyleSelector [ ^ ToAndSelector new left: self; @@ -15,12 +15,30 @@ ToElementSelector >> + aStyleSelector [ yourself ] +{ #category : 'logical operator' } +ToElementSelector >> + aStyleSelector [ + + self + deprecated: 'Please use && instead.' + transformWith: + '`@receiver + `@statements1' + -> '`@receiver && `@statements1'. + + ^ self && aStyleSelector +] + { #category : 'logical operator' } ToElementSelector >> - aStyleSelector [ - ^ ToMinusSelector new + + self + deprecated: 'Please use && not instead.' + transformWith: + '`@receiver - `@selector' + -> '`@receiver && ((`@selector) not)'. + ^ ToAndSelector new left: self; - right: aStyleSelector; + right: (aStyleSelector) not; yourself ] @@ -34,11 +52,11 @@ ToElementSelector >> accept: aVisitor [ ToElementSelector >> and: aStyleSelector [ self - deprecated: 'Please use + instead.' + deprecated: 'Please use && instead.' transformWith: '`@receiver and: `@statements1' - -> '`@receiver + `@statements1'. - ^ self + aStyleSelector + -> '`@receiver && `@statements1'. + ^ self && aStyleSelector ] { #category : 'converting' } @@ -98,10 +116,12 @@ ToElementSelector >> not [ { #category : 'logical operator' } ToElementSelector >> or: aStyleSelector [ - ^ ToOrSelector new - left: self; - right: aStyleSelector; - yourself + self + deprecated: 'Please use || instead.' + transformWith: + '`@receiver or: `@statements1' + -> '`@receiver || `@statements1'. + ^ self || aStyleSelector ] { #category : 'logical operator' } @@ -183,3 +203,12 @@ ToElementSelector >> withSibling: aSelector [ right: aSelector; yourself ] + +{ #category : 'logical operator' } +ToElementSelector >> || aStyleSelector [ + + ^ ToOrSelector new + left: self; + right: aStyleSelector; + yourself +] diff --git a/src/Toplo/ToMinusSelector.class.st b/src/Toplo/ToMinusSelector.class.st index 494ece991..4ea3a62ce 100644 --- a/src/Toplo/ToMinusSelector.class.st +++ b/src/Toplo/ToMinusSelector.class.st @@ -5,9 +5,3 @@ Class { #package : 'Toplo', #tag : 'Core-Selectors' } - -{ #category : 'visiting' } -ToMinusSelector >> accept: aVisitor [ - - aVisitor visitMinusSelector: self -] diff --git a/src/Toplo/ToSelectorCSSLikePrinter.class.st b/src/Toplo/ToSelectorCSSLikePrinter.class.st deleted file mode 100644 index 4fe7aee23..000000000 --- a/src/Toplo/ToSelectorCSSLikePrinter.class.st +++ /dev/null @@ -1,156 +0,0 @@ -Class { - #name : 'ToSelectorCSSLikePrinter', - #superclass : 'ToElementSelectorVisitor', - #instVars : [ - 'stream' - ], - #category : 'Toplo-Core-Selectors', - #package : 'Toplo', - #tag : 'Core-Selectors' -} - -{ #category : 'accessing' } -ToSelectorCSSLikePrinter >> contents [ - - ^ stream contents -] - -{ #category : 'initialization' } -ToSelectorCSSLikePrinter >> initialize [ - - super initialize. - stream := String new writeStream -] - -{ #category : 'private' } -ToSelectorCSSLikePrinter >> nextPut: aString [ - - stream nextPutAll: aString -] - -{ #category : 'initialization' } -ToSelectorCSSLikePrinter >> reset [ - - stream reset - - -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitActionSelector: aSelector [ - - self nextPut: 'action:'. - self nextPut: aSelector action printString -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitAndSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' + '. - aSelector right accept: self. - self nextPut: ')'. -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitChildSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' child:('. - - aSelector depth ifNil: [ aSelector right accept: self ] ifNotNil: [ - aSelector right accept: self. - self nextPut: ' depth:'. - self nextPut: aSelector depth printString ]. - self nextPut: ')'. - self nextPut: ')' - -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitIdSelector: aSelector [ - - self nextPut: '#'. - self nextPut: aSelector id asString -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitMinusSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' - '. - aSelector right accept: self. - self nextPut: ')'. -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitNotSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ') not'. -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitOrSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' or: '. - aSelector right accept: self. - self nextPut: ')'. -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitParentSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' parent:('. - - aSelector depth ifNil: [ aSelector right accept: self ] ifNotNil: [ - aSelector right accept: self. - self nextPut: ' depth:'. - self nextPut: aSelector depth printString ]. - self nextPut: ')'. - self nextPut: ')' - -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitSiblingSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' sibling:('. - aSelector right accept: self. - self nextPut: ')'. - self nextPut: ')' - -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitStyleStampSelector: aSelector [ - - aSelector allStamps - do: [ :stp | - self nextPut: '.'. - self nextPut: stp asString ] - separatedBy: [ self nextPut: ', ' ] -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitTypeSelector: aSelector [ - - self nextPut: 'type:'. - self nextPut: aSelector type name -] - -{ #category : 'visiting' } -ToSelectorCSSLikePrinter >> visitUniversalSelector: aSelector [ - - self nextPut: '*' -] diff --git a/src/Toplo/ToSelectorInterpreter.class.st b/src/Toplo/ToSelectorInterpreter.class.st index 6a4f1acff..6b27cc807 100644 --- a/src/Toplo/ToSelectorInterpreter.class.st +++ b/src/Toplo/ToSelectorInterpreter.class.st @@ -17,7 +17,7 @@ ToSelectorInterpreter >> check: aSelector on: anElement [ targetStack := Stack new. self push: anElement. result := true. - aSelector value accept: self. + aSelector accept: self. ^ result ] @@ -103,16 +103,6 @@ ToSelectorInterpreter >> visitIdSelector: aSelector [ result := aSelector id = self top id ] -{ #category : 'visiting' } -ToSelectorInterpreter >> visitMinusSelector: aSelector [ - - aSelector left accept: self. - result ifFalse: [ ^ self ]. - aSelector right accept: self. - result := result not. - -] - { #category : 'visiting' } ToSelectorInterpreter >> visitNotSelector: aSelector [ diff --git a/src/Toplo/ToSelectorPrinter.class.st b/src/Toplo/ToSelectorPrinter.class.st index 4c90c786d..287c40faa 100644 --- a/src/Toplo/ToSelectorPrinter.class.st +++ b/src/Toplo/ToSelectorPrinter.class.st @@ -2,7 +2,8 @@ Class { #name : 'ToSelectorPrinter', #superclass : 'ToElementSelectorVisitor', #instVars : [ - 'stream' + 'stream', + 'indentLevel' ], #category : 'Toplo-Core-Selectors', #package : 'Toplo', @@ -15,11 +16,30 @@ ToSelectorPrinter >> contents [ ^ stream contents ] +{ #category : 'printing utility' } +ToSelectorPrinter >> indent [ + + self indentLevel timesRepeat: [ self nextPut: ' ' ]. +] + +{ #category : 'accessing' } +ToSelectorPrinter >> indentLevel [ + + ^ indentLevel +] + +{ #category : 'accessing' } +ToSelectorPrinter >> indentLevel: anObject [ + + indentLevel := anObject +] + { #category : 'initialization' } ToSelectorPrinter >> initialize [ super initialize. - stream := String new writeStream + stream := String new writeStream. + indentLevel := 0 ] { #category : 'private' } @@ -36,6 +56,12 @@ ToSelectorPrinter >> reset [ ] +{ #category : 'accessing' } +ToSelectorPrinter >> stream: aStream [ + + stream := aStream +] + { #category : 'visiting' } ToSelectorPrinter >> visitActionSelector: aSelector [ @@ -48,7 +74,7 @@ ToSelectorPrinter >> visitAndSelector: aSelector [ self nextPut: '('. aSelector left accept: self. - self nextPut: ' + '. + self nextPut: ' && '. aSelector right accept: self. self nextPut: ')'. ] @@ -76,22 +102,12 @@ ToSelectorPrinter >> visitIdSelector: aSelector [ self nextPut: aSelector id printString ] -{ #category : 'visiting' } -ToSelectorPrinter >> visitMinusSelector: aSelector [ - - self nextPut: '('. - aSelector left accept: self. - self nextPut: ' - '. - aSelector right accept: self. - self nextPut: ')'. -] - { #category : 'visiting' } ToSelectorPrinter >> visitNotSelector: aSelector [ - self nextPut: '('. + self nextPut: 'not('. aSelector left accept: self. - self nextPut: ') not'. + self nextPut: ')'. ] { #category : 'visiting' } @@ -99,7 +115,7 @@ ToSelectorPrinter >> visitOrSelector: aSelector [ self nextPut: '('. aSelector left accept: self. - self nextPut: ' or: '. + self nextPut: ' || '. aSelector right accept: self. self nextPut: ')'. ] diff --git a/src/Toplo/ToStyleSheetCSSLikePrinter.class.st b/src/Toplo/ToStyleSheetCSSLikePrinter.class.st index cc04a6d97..392141fd0 100644 --- a/src/Toplo/ToStyleSheetCSSLikePrinter.class.st +++ b/src/Toplo/ToStyleSheetCSSLikePrinter.class.st @@ -31,15 +31,6 @@ ToStyleSheetCSSLikePrinter class >> toElement: aToElement [ ^ self new toElement: aToElement ] -{ #category : 'converting' } -ToStyleSheetCSSLikePrinter >> asCSSLikeString [ - - | stream | - stream := ReadWriteStream on: String new. - self printStyleSheetCSSLikeOn: stream. - ^ stream contents -] - { #category : 'private' } ToStyleSheetCSSLikePrinter >> getSelectorCSS: aToElementSelector hangSelector: aSelector [ "https://www.w3schools.com/cssref/css_selectors.php" @@ -146,11 +137,11 @@ ToStyleSheetCSSLikePrinter >> printOn: aStream [ self toElement ifNil: [ self styleSheet ifNil: [ - ^ aStream nextPutAll: 'an empty StyleSheet printer' ]. + ^ aStream nextPutAll: 'an empty StyleSheet ccs like printer' ]. aStream nextPutAll: 'a Stylesheet printer on '. self styleSheet printOn: aStream ] ifNotNil: [ :e | - aStream nextPutAll: 'a Stylesheet printer on '. + aStream nextPutAll: 'a Stylesheet css like printer on '. self toElement printOn: aStream ] ] diff --git a/src/Toplo/ToStyleSheetPrinter.class.st b/src/Toplo/ToStyleSheetPrinter.class.st new file mode 100644 index 000000000..2896e6b56 --- /dev/null +++ b/src/Toplo/ToStyleSheetPrinter.class.st @@ -0,0 +1,87 @@ +Class { + #name : 'ToStyleSheetPrinter', + #superclass : 'Object', + #instVars : [ + 'selectorPrinter', + 'indentLevel' + ], + #category : 'Toplo-Core-StyleSheet', + #package : 'Toplo', + #tag : 'Core-StyleSheet' +} + +{ #category : 'accessing' } +ToStyleSheetPrinter class >> styleRules: aStyleRuleList [ + "Initialize the printer with a style rules list to print" + + ^ self new styleSheet: (ToStyleSheet new addAllStyleRules: aStyleRuleList) +] + +{ #category : 'accessing' } +ToStyleSheetPrinter class >> styleSheet: aToStyleSheet [ + "Initialize the printer with a style sheet to print" + + ^ self new styleSheet: aToStyleSheet +] + +{ #category : 'accessing' } +ToStyleSheetPrinter class >> toElement: aToElement [ + "Initialize the printer with a ToElement" + + ^ self new toElement: aToElement +] + +{ #category : 'printing' } +ToStyleSheetPrinter >> crIndentOn: aStream [ + + aStream cr. + indentLevel timesRepeat: [ aStream nextPutAll: ' ' ] +] + +{ #category : 'initialization' } +ToStyleSheetPrinter >> initialize [ + + super initialize. + indentLevel := 0. + selectorPrinter := ToSelectorPrinter new. + +] + +{ #category : 'printing' } +ToStyleSheetPrinter >> printStyleRule: aStyleRule on: aStream [ + "print selector" + + selectorPrinter reset. + selectorPrinter indent. + aStyleRule selector accept: selectorPrinter. + aStream nextPutAll: selectorPrinter contents. + + "print begin of body" + self crIndentOn: aStream. + aStream nextPutAll: '{'. + + "print body" + aStyleRule propertyWriters do: [ :w | + self crIndentOn: aStream. + w printOn: aStream ]. + + "print end of body" + self crIndentOn: aStream. + aStream + nextPutAll: '}'; + cr. + + indentLevel := indentLevel + 1. + selectorPrinter indentLevel: indentLevel. + "print sub rules" + aStyleRule styleRules do: [ :rule | + self printStyleRule: rule on: aStream ]. + indentLevel := indentLevel - 1 +] + +{ #category : 'printing' } +ToStyleSheetPrinter >> printStyleSheet: aStyleSheet on: aStream [ + + aStyleSheet styleRules do: [ :rule | + self printStyleRule: rule on: aStream ] +] diff --git a/src/Toplo/ToStyleSheetTheme.class.st b/src/Toplo/ToStyleSheetTheme.class.st index 81e4af215..70ea6ba24 100644 --- a/src/Toplo/ToStyleSheetTheme.class.st +++ b/src/Toplo/ToStyleSheetTheme.class.st @@ -6,7 +6,7 @@ Class { #tag : 'Core-Theme' } -{ #category : 'styling' } +{ #category : 'css like printing' } ToStyleSheetTheme >> applicableRulesFor: anElement [ " return applicable rules for an element "