summaryrefslogtreecommitdiffstats
path: root/theme-compiler
diff options
context:
space:
mode:
Diffstat (limited to 'theme-compiler')
-rw-r--r--theme-compiler/ivy.xml2
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java147
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java24
-rw-r--r--[-rwxr-xr-x]theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java15174
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj52
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java200
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java20
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java44
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java7
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java90
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java22
-rw-r--r--theme-compiler/tests/resources/css/compass-import.css49
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/100-test_optional_extend_does_not_warn_when_extension_fails.css (renamed from theme-compiler/tests/resources/sasslang/css/100-test_optional_extend_does_not_warn_when_extension_fails.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css (renamed from theme-compiler/tests/resources/sasslang/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/36-test_extend_self_loop.css (renamed from theme-compiler/tests/resources/sasslang/css/36-test_extend_self_loop.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/37-test_extend_warns_when_extendee_doesnt_exist.css (renamed from theme-compiler/tests/resources/sasslang/css/37-test_extend_warns_when_extendee_doesnt_exist.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/38-test_extend_warns_when_extension_fails.css (renamed from theme-compiler/tests/resources/sasslang/css/38-test_extend_warns_when_extension_fails.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/57-test_long_extendee_requires_all_selectors.css (renamed from theme-compiler/tests/resources/sasslang/css/57-test_long_extendee_requires_all_selectors.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/60-test_long_extender_aborts_unification.css (renamed from theme-compiler/tests/resources/sasslang/css/60-test_long_extender_aborts_unification.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/71-test_nested_extender_aborts_unification.css (renamed from theme-compiler/tests/resources/sasslang/css/71-test_nested_extender_aborts_unification.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css (renamed from theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css (renamed from theme-compiler/tests/resources/sasslang/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss (renamed from theme-compiler/tests/resources/sasslang/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss (renamed from theme-compiler/tests/resources/sasslang/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/36-test_extend_self_loop.scss (renamed from theme-compiler/tests/resources/sasslang/scss/36-test_extend_self_loop.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss (renamed from theme-compiler/tests/resources/sasslang/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/38-test_extend_warns_when_extension_fails.scss (renamed from theme-compiler/tests/resources/sasslang/scss/38-test_extend_warns_when_extension_fails.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/57-test_long_extendee_requires_all_selectors.scss (renamed from theme-compiler/tests/resources/sasslang/scss/57-test_long_extendee_requires_all_selectors.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/60-test_long_extender_aborts_unification.scss (renamed from theme-compiler/tests/resources/sasslang/scss/60-test_long_extender_aborts_unification.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/71-test_nested_extender_aborts_unification.scss (renamed from theme-compiler/tests/resources/sasslang/scss/71-test_nested_extender_aborts_unification.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss (renamed from theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss (renamed from theme-compiler/tests/resources/sasslang/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss)0
-rw-r--r--theme-compiler/tests/resources/scss/compass-test/compass-import.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/_compass.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss6
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss5
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss6
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/license-readme.txt26
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss93
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss88
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scssbin0 -> 174 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scssbin0 -> 175 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scssbin0 -> 175 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scssbin0 -> 180 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scssbin0 -> 180 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss40
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss42
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss42
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss45
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss45
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss25
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss12
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss11
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss29
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss44
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scssbin0 -> 131 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss26
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss11
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss15
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss12
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss12
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss14
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss20
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss26
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss15
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss29
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss31
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss35
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss2
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java18
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java44
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java80
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java236
762 files changed, 12784 insertions, 7476 deletions
diff --git a/theme-compiler/ivy.xml b/theme-compiler/ivy.xml
index 7b99b2cdaa..0f84966508 100644
--- a/theme-compiler/ivy.xml
+++ b/theme-compiler/ivy.xml
@@ -42,6 +42,8 @@
<!-- Testing libs -->
<dependency org="junit" name="junit" rev="4.11"
conf="ide,test -> default" />
+ <dependency org="org.jsoup" name="jsoup" rev="1.6.3"
+ conf="ide,test -> default" />
<!-- Internally used, for now -->
<dependency org="com.carrotsearch" name="smartsprites"
diff --git a/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java b/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
index dbb3e571dc..ed6b98f5ac 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
@@ -19,10 +19,10 @@ package com.vaadin.sass.internal;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
@@ -35,8 +35,9 @@ import com.vaadin.sass.internal.handler.SCSSErrorHandler;
import com.vaadin.sass.internal.parser.ParseException;
import com.vaadin.sass.internal.parser.Parser;
import com.vaadin.sass.internal.parser.SCSSParseException;
+import com.vaadin.sass.internal.resolver.ClassloaderResolver;
+import com.vaadin.sass.internal.resolver.FilesystemResolver;
import com.vaadin.sass.internal.resolver.ScssStylesheetResolver;
-import com.vaadin.sass.internal.resolver.VaadinResolver;
import com.vaadin.sass.internal.tree.BlockNode;
import com.vaadin.sass.internal.tree.MixinDefNode;
import com.vaadin.sass.internal.tree.Node;
@@ -59,10 +60,12 @@ public class ScssStylesheet extends Node {
private static HashMap<Node, Node> lastNodeAdded = new HashMap<Node, Node>();
- private String fileName;
+ private File file;
private String charset;
+ private List<ScssStylesheetResolver> resolvers = new ArrayList<ScssStylesheetResolver>();
+
/**
* Read in a file SCSS and parse it into a ScssStylesheet
*
@@ -90,18 +93,48 @@ public class ScssStylesheet extends Node {
}
/**
- * Main entry point for the SASS compiler. Takes in a file and encoding then
- * builds up a ScssStylesheet tree out of it. Calling compile() on it will
- * transform SASS into CSS. Calling toString() will print out the SCSS/CSS.
+ * Main entry point for the SASS compiler. Takes in a file and an optional
+ * parent style sheet, then builds up a ScssStylesheet tree out of it.
+ * Calling compile() on it will transform SASS into CSS. Calling toString()
+ * will print out the SCSS/CSS.
*
* @param identifier
* The file path. If null then null is returned.
- * @param encoding
+ * @param parentStylesheet
+ * Style sheet from which to inherit resolvers and encoding. May
+ * be null.
* @return
* @throws CSSException
* @throws IOException
*/
- public static ScssStylesheet get(String identifier, String encoding)
+ public static ScssStylesheet get(String identifier,
+ ScssStylesheet parentStylesheet) throws CSSException, IOException {
+ return get(identifier, parentStylesheet, new SCSSDocumentHandlerImpl(),
+ new SCSSErrorHandler());
+ }
+
+ /**
+ * Main entry point for the SASS compiler. Takes in a file, an optional
+ * parent stylesheet, and document and error handlers. Then builds up a
+ * ScssStylesheet tree out of it. Calling compile() on it will transform
+ * SASS into CSS. Calling toString() will print out the SCSS/CSS.
+ *
+ * @param identifier
+ * The file path. If null then null is returned.
+ * @param parentStylesheet
+ * Style sheet from which to inherit resolvers and encoding. May
+ * be null.
+ * @param documentHandler
+ * Instance of document handler. May not be null.
+ * @param errorHandler
+ * Instance of error handler. May not be null.
+ * @return
+ * @throws CSSException
+ * @throws IOException
+ */
+ public static ScssStylesheet get(String identifier,
+ ScssStylesheet parentStylesheet,
+ SCSSDocumentHandler documentHandler, SCSSErrorHandler errorHandler)
throws CSSException, IOException {
/*
* The encoding to be used is passed through "encoding" parameter. the
@@ -120,18 +153,27 @@ public class ScssStylesheet extends Node {
File file = new File(identifier);
file = file.getCanonicalFile();
- SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
- ScssStylesheet stylesheet = handler.getStyleSheet();
-
- InputSource source = stylesheet.resolveStylesheet(identifier);
+ ScssStylesheet stylesheet = documentHandler.getStyleSheet();
+ if (parentStylesheet == null) {
+ // Use default resolvers
+ stylesheet.addResolver(new FilesystemResolver());
+ stylesheet.addResolver(new ClassloaderResolver());
+ } else {
+ // Use parent resolvers
+ stylesheet.setResolvers(parentStylesheet.getResolvers());
+ }
+ InputSource source = stylesheet.resolveStylesheet(identifier,
+ parentStylesheet);
if (source == null) {
return null;
}
- source.setEncoding(encoding);
+ if (parentStylesheet != null) {
+ source.setEncoding(parentStylesheet.getCharset());
+ }
Parser parser = new Parser();
- parser.setErrorHandler(new SCSSErrorHandler());
- parser.setDocumentHandler(handler);
+ parser.setErrorHandler(errorHandler);
+ parser.setDocumentHandler(documentHandler);
try {
parser.parseStyleSheet(source);
@@ -145,24 +187,13 @@ public class ScssStylesheet extends Node {
return stylesheet;
}
- private static ScssStylesheetResolver[] resolvers = null;
-
- public static void setStylesheetResolvers(
- ScssStylesheetResolver... styleSheetResolvers) {
- resolvers = Arrays.copyOf(styleSheetResolvers,
- styleSheetResolvers.length);
- }
-
- public InputSource resolveStylesheet(String identifier) {
- if (resolvers == null) {
- setStylesheetResolvers(new VaadinResolver());
- }
-
- for (ScssStylesheetResolver resolver : resolvers) {
- InputSource source = resolver.resolve(identifier);
+ public InputSource resolveStylesheet(String identifier,
+ ScssStylesheet parentStylesheet) {
+ for (ScssStylesheetResolver resolver : getResolvers()) {
+ InputSource source = resolver.resolve(parentStylesheet, identifier);
if (source != null) {
File f = new File(source.getURI());
- setFileName(f.getParent());
+ setFile(f);
return source;
}
}
@@ -171,6 +202,38 @@ public class ScssStylesheet extends Node {
}
/**
+ * Retrieves a list of resolvers to use when resolving imports
+ *
+ * @since 7.2
+ * @return the resolvers used to resolving imports
+ */
+ public List<ScssStylesheetResolver> getResolvers() {
+ return Collections.unmodifiableList(resolvers);
+ }
+
+ /**
+ * Sets the list of resolvers to use when resolving imports
+ *
+ * @since 7.2
+ * @param resolvers
+ * the resolvers to set
+ */
+ public void setResolvers(List<ScssStylesheetResolver> resolvers) {
+ this.resolvers = new ArrayList<ScssStylesheetResolver>(resolvers);
+ }
+
+ /**
+ * Adds the given resolver to the resolver list
+ *
+ * @since 7.2
+ * @param resolver
+ * The resolver to add
+ */
+ public void addResolver(ScssStylesheetResolver resolver) {
+ resolvers.add(resolver);
+ }
+
+ /**
* Applies all the visitors and compiles SCSS into Css.
*
* @throws Exception
@@ -355,12 +418,28 @@ public class ScssStylesheet extends Node {
return mixinDefs.get(name);
}
- public void setFileName(String fileName) {
- this.fileName = fileName;
+ public void setFile(File file) {
+ this.file = file;
}
+ /**
+ * Returns the directory containing this style sheet
+ *
+ * @since 7.2
+ * @return The directory containing this style sheet
+ */
+ public String getDirectory() {
+ return file.getParent();
+ }
+
+ /**
+ * Returns the full file name for this style sheet
+ *
+ * @since 7.2
+ * @return The full file name for this style sheet
+ */
public String getFileName() {
- return fileName;
+ return file.getPath();
}
public static HashMap<Node, Node> getLastNodeAdded() {
diff --git a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java
index 2e51c686d4..0d48da34e4 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java
@@ -15,34 +15,46 @@
*/
package com.vaadin.sass.internal.handler;
+import java.io.PrintStream;
+
import org.w3c.css.sac.CSSException;
import org.w3c.css.sac.CSSParseException;
import org.w3c.css.sac.ErrorHandler;
public class SCSSErrorHandler implements ErrorHandler {
+ private PrintStream errorStream;
+
+ public SCSSErrorHandler(PrintStream errorStream) {
+ this.errorStream = errorStream;
+ }
+
+ public SCSSErrorHandler() {
+ this(System.out);
+ }
+
@Override
public void error(CSSParseException arg0) throws CSSException {
- System.out.println("Error when parsing file \n" + arg0.getURI()
+ errorStream.println("Error when parsing file \n" + arg0.getURI()
+ " on line " + arg0.getLineNumber() + ", column "
+ arg0.getColumnNumber());
- System.out.println(arg0.getMessage() + "\n");
+ errorStream.println(arg0.getMessage() + "\n");
}
@Override
public void fatalError(CSSParseException arg0) throws CSSException {
- System.out.println("FATAL Error when parsing file \n" + arg0.getURI()
+ errorStream.println("FATAL Error when parsing file \n" + arg0.getURI()
+ " on line " + arg0.getLineNumber() + ", column "
+ arg0.getColumnNumber());
- System.out.println(arg0.getMessage() + "\n");
+ errorStream.println(arg0.getMessage() + "\n");
}
@Override
public void warning(CSSParseException arg0) throws CSSException {
- System.out.println("Warning when parsing file \n" + arg0.getURI()
+ errorStream.println("Warning when parsing file \n" + arg0.getURI()
+ " on line " + arg0.getLineNumber() + ", column "
+ arg0.getColumnNumber());
- System.out.println(arg0.getMessage() + "\n");
+ errorStream.println(arg0.getMessage() + "\n");
}
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
index 679e696aa3..53d1ee78ca 100755..100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
@@ -16,39 +16,38 @@
/* Generated By:JavaCC: Do not edit this line. Parser.java */
package com.vaadin.sass.internal.parser;
-import java.io.*;
-import java.net.*;
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
import java.util.ArrayList;
import java.util.Locale;
-import java.util.Map;
import java.util.UUID;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
import org.w3c.css.sac.ConditionFactory;
-import org.w3c.css.sac.Condition;
-import org.w3c.css.sac.SelectorFactory;
-import org.w3c.css.sac.SelectorList;
-import org.w3c.css.sac.Selector;
-import org.w3c.css.sac.SimpleSelector;
import org.w3c.css.sac.DocumentHandler;
-import org.w3c.css.sac.InputSource;
import org.w3c.css.sac.ErrorHandler;
-import org.w3c.css.sac.CSSException;
-import org.w3c.css.sac.CSSParseException;
-import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.InputSource;
import org.w3c.css.sac.LexicalUnit;
-
-import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
-
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
import org.w3c.flute.util.Encoding;
-import com.vaadin.sass.internal.handler.*;
-
-import com.vaadin.sass.internal.tree.*;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.internal.tree.Node;
+import com.vaadin.sass.internal.tree.VariableNode;
/**
* A CSS2 parser
- *
+ *
* @author Philippe Le H�garet
* @version $Revision: 1.15 $
*/
@@ -79,27 +78,32 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* @@TODO
- * @exception CSSException Not yet implemented
+ * @exception CSSException
+ * Not yet implemented
*/
+ @Override
public void setLocale(Locale locale) throws CSSException {
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
}
- public InputSource getInputSource(){
+ public InputSource getInputSource() {
return source;
}
/**
* Set the document handler for this parser
*/
+ @Override
public void setDocumentHandler(DocumentHandler handler) {
- this.documentHandler = (SCSSDocumentHandlerImpl) handler;
+ documentHandler = (SCSSDocumentHandlerImpl) handler;
}
+ @Override
public void setSelectorFactory(SelectorFactory selectorFactory) {
this.selectorFactory = selectorFactory;
}
+ @Override
public void setConditionFactory(ConditionFactory conditionFactory) {
this.conditionFactory = conditionFactory;
}
@@ -107,19 +111,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* Set the error handler for this parser
*/
+ @Override
public void setErrorHandler(ErrorHandler error) {
- this.errorHandler = error;
+ errorHandler = error;
}
/**
* Main parse methods
- *
- * @param source the source of the style sheet.
- * @exception IOException the source can't be parsed.
- * @exception CSSException the source is not CSS valid.
+ *
+ * @param source
+ * the source of the style sheet.
+ * @exception IOException
+ * the source can't be parsed.
+ * @exception CSSException
+ * the source is not CSS valid.
*/
- public void parseStyleSheet(InputSource source)
- throws CSSException, IOException {
+ @Override
+ public void parseStyleSheet(InputSource source) throws CSSException,
+ IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
if (selectorFactory == null) {
@@ -134,26 +143,34 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* Convenient method for URIs.
- *
- * @param systemId the fully resolved URI of the style sheet.
- * @exception IOException the source can't be parsed.
- * @exception CSSException the source is not CSS valid.
+ *
+ * @param systemId
+ * the fully resolved URI of the style sheet.
+ * @exception IOException
+ * the source can't be parsed.
+ * @exception CSSException
+ * the source is not CSS valid.
*/
- public void parseStyleSheet(String systemId)
- throws CSSException, IOException {
+ @Override
+ public void parseStyleSheet(String systemId) throws CSSException,
+ IOException {
parseStyleSheet(new InputSource(systemId));
}
/**
- * This method parses only one rule (style rule or at-rule, except @charset).
- *
- * @param source the source of the rule.
- * @exception IOException the source can't be parsed.
- * @exception CSSException the source is not CSS valid.
+ * This method parses only one rule (style rule or at-rule, except
+ * @charset).
+ *
+ * @param source
+ * the source of the rule.
+ * @exception IOException
+ * the source can't be parsed.
+ * @exception CSSException
+ * the source is not CSS valid.
*/
// TODO required by original parser but not used by Vaadin?
- public void parseRule(InputSource source)
- throws CSSException, IOException {
+ @Override
+ public void parseRule(InputSource source) throws CSSException, IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
@@ -169,13 +186,17 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* This method parses a style declaration (including the surrounding curly
* braces).
- *
- * @param source the source of the style declaration.
- * @exception IOException the source can't be parsed.
- * @exception CSSException the source is not CSS valid.
+ *
+ * @param source
+ * the source of the style declaration.
+ * @exception IOException
+ * the source can't be parsed.
+ * @exception CSSException
+ * the source is not CSS valid.
*/
- public void parseStyleDeclaration(InputSource source)
- throws CSSException, IOException {
+ @Override
+ public void parseStyleDeclaration(InputSource source) throws CSSException,
+ IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
@@ -190,8 +211,10 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* This methods returns "http://www.w3.org/TR/REC-CSS2".
+ *
* @return the string "http://www.w3.org/TR/REC-CSS2".
*/
+ @Override
public String getParserVersion() {
return "http://www.w3.org/TR/REC-CSS2";
}
@@ -199,8 +222,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* Parse methods used by DOM Level 2 implementation.
*/
- public void parseImportRule(InputSource source)
- throws CSSException, IOException {
+ public void parseImportRule(InputSource source) throws CSSException,
+ IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
@@ -213,8 +236,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
_parseImportRule();
}
- public void parseMediaRule(InputSource source)
- throws CSSException, IOException {
+ public void parseMediaRule(InputSource source) throws CSSException,
+ IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
@@ -227,14 +250,16 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
_parseMediaRule();
}
- public SelectorList parseSelectors(InputSource source)
- throws CSSException, IOException {
+ @Override
+ public SelectorList parseSelectors(InputSource source) throws CSSException,
+ IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
return null;
}
+ @Override
public LexicalUnit parsePropertyValue(InputSource source)
throws CSSException, IOException {
this.source = source;
@@ -243,8 +268,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return expr();
}
- public boolean parsePriority(InputSource source)
- throws CSSException, IOException {
+ @Override
+ public boolean parsePriority(InputSource source) throws CSSException,
+ IOException {
this.source = source;
ReInit(getCharStreamWithLurk(source));
@@ -252,7 +278,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
/**
- * Convert the source into a Reader. Used only by DOM Level 2 parser methods.
+ * Convert the source into a Reader. Used only by DOM Level 2 parser
+ * methods.
*/
private Reader getReader(InputSource source) throws IOException {
if (source.getCharacterStream() != null) {
@@ -264,7 +291,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return new InputStreamReader(source.getByteStream(), "ASCII");
} else {
return new InputStreamReader(source.getByteStream(),
- source.getEncoding());
+ source.getEncoding());
}
} else {
// systemId
@@ -274,11 +301,10 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
/**
- * Convert the source into a CharStream with encoding informations.
- * The encoding can be found in the InputSource or in the CSS document.
- * Since this method marks the reader and make a reset after looking for
- * the charset declaration, you'll find the charset declaration into the
- * stream.
+ * Convert the source into a CharStream with encoding informations. The
+ * encoding can be found in the InputSource or in the CSS document. Since
+ * this method marks the reader and make a reset after looking for the
+ * charset declaration, you'll find the charset declaration into the stream.
*/
private CharStream getCharStreamWithLurk(InputSource source)
throws CSSException, IOException {
@@ -298,7 +324,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
}
- //use UTF-8 as the default encoding.
+ // use UTF-8 as the default encoding.
String encoding = source.getEncoding();
InputStream input = source.getByteStream();
if (!input.markSupported()) {
@@ -308,7 +334,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
// Mark either the original stream or the wrapped stream
input.mark(100);
- if(encoding == null){
+ if (encoding == null) {
encoding = "ASCII";
char c = ' ';
@@ -317,14 +343,15 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
if (c == '@') {
// hum, is it a charset ?
- int size = 100;
+ int size = 100;
byte[] buf = new byte[size];
input.read(buf, 0, 7);
String keyword = new String(buf, 0, 7);
if (keyword.equals("charset")) {
// Yes, this is the charset declaration !
- // here I don't use the right declaration : white space are ' '.
+ // here I don't use the right declaration : white space are
+ // ' '.
while ((c = (char) input.read()) == ' ') {
// find the first quote
}
@@ -351,15 +378,17 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
if (c != ';') {
// no semi colon at the end ?
throw new CSSException("invalid charset declaration: "
- + "missing semi colon");
+ + "missing semi colon");
}
encoding = new String(buf, 0, i);
if (source.getEncoding() != null) {
// compare the two encoding informations.
- // For example, I don't accept to have ASCII and after UTF-8.
+ // For example, I don't accept to have ASCII and after
+ // UTF-8.
// Is it really good ? That is the question.
if (!encoding.equals(source.getEncoding())) {
- throw new CSSException("invalid encoding information.");
+ throw new CSSException(
+ "invalid encoding information.");
}
}
} // else no charset declaration available
@@ -369,7 +398,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
source.setEncoding(encoding);
// set the real reader of this source.
source.setCharacterStream(new InputStreamReader(source.getByteStream(),
- Encoding.getJavaEncoding(encoding)));
+ Encoding.getJavaEncoding(encoding)));
// reset the stream (leave the charset declaration in the stream).
input.reset();
@@ -377,6 +406,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private LocatorImpl currentLocator;
+
private Locator getLocator() {
if (currentLocator == null) {
currentLocator = new LocatorImpl(this);
@@ -384,6 +414,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
return currentLocator.reInit(this);
}
+
private LocatorImpl getLocator(Token save) {
if (currentLocator == null) {
currentLocator = new LocatorImpl(this, save);
@@ -400,8 +431,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
if (pe.specialConstructor) {
StringBuffer errorM = new StringBuffer();
if (pe.currentToken != null) {
- errorM.append("encountered \u005c"")
- .append(pe.currentToken.next);
+ errorM.append("encountered \u005c"").append(
+ pe.currentToken.next);
}
errorM.append('"');
if (pe.expectedTokenSequences.length != 0) {
@@ -417,10 +448,10 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
errorHandler.error(new CSSParseException(errorM.toString(),
- l, e));
+ l, e));
} else {
- errorHandler.error(new CSSParseException(e.getMessage(),
- l, e));
+ errorHandler.error(new CSSParseException(e.getMessage(), l,
+ e));
}
} else if (e == null) {
errorHandler.error(new CSSParseException("error", l, null));
@@ -431,5421 +462,5406 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private void reportWarningSkipText(Locator l, String text) {
- if (errorHandler != null && text != null) {
+ if (errorHandler != null && text != null) {
errorHandler.warning(new CSSParseException("Skipping: " + text, l));
}
}
-/*
- * The grammar of CSS2
- */
+ /*
+ * The grammar of CSS2
+ */
-/**
- * The main entry for the parser.
- *
- * @exception ParseException exception during the parse
- */
- final public void parserUnit() throws ParseException {
- try {
- documentHandler.startDocument(source);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case CHARSET_SYM:
- charset();
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- label_1:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- case CDO:
- case CDC:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[1] = jj_gen;
- break label_1;
+ /**
+ * The main entry for the parser.
+ *
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void parserUnit() throws ParseException {
+ try {
+ documentHandler.startDocument(source);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case CHARSET_SYM:
+ charset();
+ break;
+ default:
+ jj_la1[0] = jj_gen;
+ ;
+ }
+ label_1: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ case CDO:
+ case CDC:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[1] = jj_gen;
+ break label_1;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ jj_consume_token(S);
+ comments();
+ break;
+ case CDO:
+ case CDC:
+ case ATKEYWORD:
+ ignoreStatement();
+ break;
+ default:
+ jj_la1[2] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ label_2: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IMPORT_SYM:
+ ;
+ break;
+ default:
+ jj_la1[3] = jj_gen;
+ break label_2;
+ }
+ importDeclaration();
+ label_3: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case CDO:
+ case CDC:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[4] = jj_gen;
+ break label_3;
+ }
+ ignoreStatement();
+ label_4: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[5] = jj_gen;
+ break label_4;
+ }
+ jj_consume_token(S);
+ }
+ }
+ }
+ afterImportDeclaration();
+ jj_consume_token(0);
+ } finally {
+ documentHandler.endDocument(source);
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- jj_consume_token(S);
- comments();
- break;
- case CDO:
- case CDC:
- case ATKEYWORD:
- ignoreStatement();
- break;
- default:
- jj_la1[2] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- label_2:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IMPORT_SYM:
- ;
- break;
- default:
- jj_la1[3] = jj_gen;
- break label_2;
+ }
+
+ final public void charset() throws ParseException {
+ Token n;
+ try {
+ jj_consume_token(CHARSET_SYM);
+ label_5: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[6] = jj_gen;
+ break label_5;
+ }
+ jj_consume_token(S);
+ }
+ n = jj_consume_token(STRING);
+ label_6: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[7] = jj_gen;
+ break label_6;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(SEMICOLON);
+ } catch (ParseException e) {
+ reportError(getLocator(e.currentToken.next), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+
+ } catch (Exception e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+
}
- importDeclaration();
- label_3:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case CDO:
- case CDC:
- case ATKEYWORD:
+ }
+
+ final public void afterImportDeclaration() throws ParseException {
+ String ret;
+ Locator l;
+ label_7: while (true) {
;
- break;
- default:
- jj_la1[4] = jj_gen;
- break label_3;
- }
- ignoreStatement();
- label_4:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case DEBUG_SYM:
+ case WARN_SYM:
+ debuggingDirective();
+ break;
+ case MIXIN_SYM:
+ mixinDirective();
+ break;
+ case EACH_SYM:
+ case IF_SYM:
+ controlDirective();
+ break;
+ case INCLUDE_SYM:
+ includeDirective();
+ break;
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case IDENT:
+ case HASH:
+ styleRule();
+ break;
+ case MEDIA_SYM:
+ media();
+ break;
+ case PAGE_SYM:
+ page();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ case KEY_FRAME_SYM:
+ keyframes();
+ break;
default:
- jj_la1[5] = jj_gen;
- break label_4;
+ jj_la1[8] = jj_gen;
+ if (jj_2_1(2147483647)) {
+ variable();
+ } else {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case VARIABLE:
+ listModifyDirective();
+ break;
+ default:
+ jj_la1[9] = jj_gen;
+ l = getLocator();
+ ret = skipStatement();
+ if ((ret == null) || (ret.length() == 0)) {
+ {
+ if (true) {
+ return;
+ }
+ }
+ }
+ if (ret.charAt(0) == '@') {
+ documentHandler.unrecognizedRule(ret);
+ } else {
+ reportWarningSkipText(l, ret);
+ }
+ }
+ }
}
- jj_consume_token(S);
- }
- }
- }
- afterImportDeclaration();
- jj_consume_token(0);
- } finally {
- documentHandler.endDocument(source);
- }
- }
-
- final public void charset() throws ParseException {
- Token n;
- try {
- jj_consume_token(CHARSET_SYM);
- label_5:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[6] = jj_gen;
- break label_5;
- }
- jj_consume_token(S);
- }
- n = jj_consume_token(STRING);
- label_6:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[7] = jj_gen;
- break label_6;
- }
- jj_consume_token(S);
- }
- jj_consume_token(SEMICOLON);
- } catch (ParseException e) {
- reportError(getLocator(e.currentToken.next), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
-
- } catch (Exception e) {
- reportError(getLocator(), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
-
- }
- }
-
- final public void afterImportDeclaration() throws ParseException {
- String ret;
- Locator l;
- label_7:
- while (true) {
- ;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DEBUG_SYM:
- case WARN_SYM:
- debuggingDirective();
- break;
- case MIXIN_SYM:
- mixinDirective();
- break;
- case EACH_SYM:
- case IF_SYM:
- controlDirective();
- break;
- case INCLUDE_SYM:
- includeDirective();
- break;
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case IDENT:
- case HASH:
- styleRule();
- break;
- case MEDIA_SYM:
- media();
- break;
- case PAGE_SYM:
- page();
- break;
- case FONT_FACE_SYM:
- fontFace();
- break;
- case KEY_FRAME_SYM:
- keyframes();
- break;
- default:
- jj_la1[8] = jj_gen;
- if (jj_2_1(2147483647)) {
- variable();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case VARIABLE:
- listModifyDirective();
- break;
- default:
- jj_la1[9] = jj_gen;
- l = getLocator();
- ret = skipStatement();
- if ((ret == null) || (ret.length() == 0)) {
- {if (true) return;}
- }
- if (ret.charAt(0) == '@') {
- documentHandler.unrecognizedRule(ret);
- } else {
- reportWarningSkipText(l, ret);
- }
- }
- }
- }
- label_8:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ label_8: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case CDO:
+ case CDC:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[10] = jj_gen;
+ break label_8;
+ }
+ ignoreStatement();
+ label_9: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[11] = jj_gen;
+ break label_9;
+ }
+ jj_consume_token(S);
+ }
+ }
+ }
+ }
+
+ final public void ignoreStatement() throws ParseException {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case CDO:
+ jj_consume_token(CDO);
+ break;
case CDC:
+ jj_consume_token(CDC);
+ break;
case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[10] = jj_gen;
- break label_8;
- }
- ignoreStatement();
- label_9:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
+ atRuleDeclaration();
break;
- default:
- jj_la1[11] = jj_gen;
- break label_9;
- }
- jj_consume_token(S);
- }
- }
- }
- }
-
- final public void ignoreStatement() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case CDO:
- jj_consume_token(CDO);
- break;
- case CDC:
- jj_consume_token(CDC);
- break;
- case ATKEYWORD:
- atRuleDeclaration();
- break;
- default:
- jj_la1[12] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
-
-/**
- * The import statement
- *
- * @exception ParseException exception during the parse
- */
- final public void importDeclaration() throws ParseException {
- Token n;
- String uri;
- MediaListImpl ml = new MediaListImpl();
- boolean isURL = false;
- try {
- jj_consume_token(IMPORT_SYM);
- label_10:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[13] = jj_gen;
- break label_10;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case STRING:
- n = jj_consume_token(STRING);
- uri = convertStringIndex(n.image, 1,
- n.image.length() -1);
- break;
- case URL:
- n = jj_consume_token(URL);
- isURL=true;
- uri = n.image.substring(4, n.image.length()-1).trim();
- if ((uri.charAt(0) == '"')
- || (uri.charAt(0) == '\u005c'')) {
- uri = uri.substring(1, uri.length()-1);
- }
- break;
- default:
- jj_la1[14] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_11:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[15] = jj_gen;
- break label_11;
- }
- jj_consume_token(S);
- }
- mediaStatement(ml);
- jj_consume_token(SEMICOLON);
- label_12:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
default:
- jj_la1[16] = jj_gen;
- break label_12;
+ jj_la1[12] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- jj_consume_token(S);
- }
- if (ml.getLength() == 0) {
- // see section 6.3 of the CSS2 recommandation.
- ml.addItem("all");
- }
- documentHandler.importStyle(uri, ml, isURL);
- } catch (ParseException e) {
- reportError(getLocator(), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
+ }
+
+ /**
+ * The import statement
+ *
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void importDeclaration() throws ParseException {
+ Token n;
+ String uri;
+ MediaListImpl ml = new MediaListImpl();
+ boolean isURL = false;
+ try {
+ jj_consume_token(IMPORT_SYM);
+ label_10: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[13] = jj_gen;
+ break label_10;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case STRING:
+ n = jj_consume_token(STRING);
+ uri = convertStringIndex(n.image, 1, n.image.length() - 1);
+ break;
+ case URL:
+ n = jj_consume_token(URL);
+ isURL = true;
+ uri = n.image.substring(4, n.image.length() - 1).trim();
+ if ((uri.charAt(0) == '"') || (uri.charAt(0) == '\u005c'')) {
+ uri = uri.substring(1, uri.length() - 1);
+ }
+ break;
+ default:
+ jj_la1[14] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ label_11: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[15] = jj_gen;
+ break label_11;
+ }
+ jj_consume_token(S);
+ }
+ mediaStatement(ml);
+ jj_consume_token(SEMICOLON);
+ label_12: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[16] = jj_gen;
+ break label_12;
+ }
+ jj_consume_token(S);
+ }
+ if (ml.getLength() == 0) {
+ // see section 6.3 of the CSS2 recommandation.
+ ml.addItem("all");
+ }
+ documentHandler.importStyle(uri, ml, isURL);
+ } catch (ParseException e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+ }
}
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public void keyframes() throws ParseException {
- Token n;
- boolean start = false;
- String keyframeName = null;
- String animationname = "";
- try {
- n = jj_consume_token(KEY_FRAME_SYM);
- label_13:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[17] = jj_gen;
- break label_13;
- }
- jj_consume_token(S);
- }
- keyframeName = n.image;
- label_14:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- n = jj_consume_token(IDENT);
- animationname += n.image;
- break;
- case INTERPOLATION:
- n = jj_consume_token(INTERPOLATION);
- animationname += n.image;
- break;
- default:
- jj_la1[18] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void keyframes() throws ParseException {
+ Token n;
+ boolean start = false;
+ String keyframeName = null;
+ String animationname = "";
+ try {
+ n = jj_consume_token(KEY_FRAME_SYM);
+ label_13: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[17] = jj_gen;
+ break label_13;
+ }
+ jj_consume_token(S);
+ }
+ keyframeName = n.image;
+ label_14: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ n = jj_consume_token(IDENT);
+ animationname += n.image;
+ break;
+ case INTERPOLATION:
+ n = jj_consume_token(INTERPOLATION);
+ animationname += n.image;
+ break;
+ default:
+ jj_la1[18] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ ;
+ break;
+ default:
+ jj_la1[19] = jj_gen;
+ break label_14;
+ }
+ }
+ label_15: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[20] = jj_gen;
+ break label_15;
+ }
+ jj_consume_token(S);
+ }
+ start = true;
+ documentHandler.startKeyFrames(keyframeName, animationname);
+ jj_consume_token(LBRACE);
+ label_16: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[21] = jj_gen;
+ break label_16;
+ }
+ jj_consume_token(S);
+ }
+ label_17: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case TO:
+ case FROM:
+ case CONTENT_SYM:
+ case PERCENTAGE:
+ ;
+ break;
+ default:
+ jj_la1[22] = jj_gen;
+ break label_17;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case TO:
+ case FROM:
+ case PERCENTAGE:
+ keyframeSelector();
+ break;
+ case CONTENT_SYM:
+ contentDirective();
+ break;
+ default:
+ jj_la1[23] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_18: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[24] = jj_gen;
+ break label_18;
+ }
+ jj_consume_token(S);
+ }
+ } catch (ParseException e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ } finally {
+ if (start) {
+ documentHandler.endKeyFrames();
+ }
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- ;
- break;
- default:
- jj_la1[19] = jj_gen;
- break label_14;
+ }
+
+ final public void keyframeSelector() throws ParseException {
+ Token n;
+ String selector = "";
+ boolean start = false;
+ try {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case FROM:
+ n = jj_consume_token(FROM);
+ break;
+ case TO:
+ n = jj_consume_token(TO);
+ break;
+ case PERCENTAGE:
+ n = jj_consume_token(PERCENTAGE);
+ break;
+ default:
+ jj_la1[25] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ selector += n.image;
+ label_19: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[26] = jj_gen;
+ break label_19;
+ }
+ jj_consume_token(S);
+ }
+ label_20: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ ;
+ break;
+ default:
+ jj_la1[27] = jj_gen;
+ break label_20;
+ }
+ jj_consume_token(COMMA);
+ label_21: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[28] = jj_gen;
+ break label_21;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case FROM:
+ n = jj_consume_token(FROM);
+ break;
+ case TO:
+ n = jj_consume_token(TO);
+ break;
+ case PERCENTAGE:
+ n = jj_consume_token(PERCENTAGE);
+ break;
+ default:
+ jj_la1[29] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ selector += (", " + n.image);
+ label_22: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[30] = jj_gen;
+ break label_22;
+ }
+ jj_consume_token(S);
+ }
+ }
+ jj_consume_token(LBRACE);
+ label_23: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[31] = jj_gen;
+ break label_23;
+ }
+ jj_consume_token(S);
+ }
+ start = true;
+ documentHandler.startKeyframeSelector(selector);
+ label_24: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case MICROSOFT_RULE:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[32] = jj_gen;
+ break label_24;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case MICROSOFT_RULE:
+ microsoftExtension();
+ break;
+ default:
+ jj_la1[33] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_25: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[34] = jj_gen;
+ break label_25;
+ }
+ jj_consume_token(S);
+ }
+ } catch (ThrowedParseException e) {
+ if (errorHandler != null) {
+ LocatorImpl li = new LocatorImpl(this,
+ e.e.currentToken.next.beginLine,
+ e.e.currentToken.next.beginColumn - 1);
+ reportError(li, e.e);
+ }
+ } catch (ParseException e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+
+ } catch (TokenMgrError e) {
+ reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+ if (start) {
+ documentHandler.endKeyframeSelector();
+ }
}
- }
- label_15:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[20] = jj_gen;
- break label_15;
- }
- jj_consume_token(S);
- }
- start = true; documentHandler.startKeyFrames(keyframeName, animationname);
- jj_consume_token(LBRACE);
- label_16:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[21] = jj_gen;
- break label_16;
- }
- jj_consume_token(S);
- }
- label_17:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case TO:
- case FROM:
- case CONTENT_SYM:
- case PERCENTAGE:
- ;
- break;
- default:
- jj_la1[22] = jj_gen;
- break label_17;
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ /* see http://www.w3.org/TR/css3-mediaqueries/ */
+ final public void media() throws ParseException {
+ boolean start = false;
+ String ret;
+ MediaListImpl ml = new MediaListImpl();
+ try {
+ jj_consume_token(MEDIA_SYM);
+ label_26: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[35] = jj_gen;
+ break label_26;
+ }
+ jj_consume_token(S);
+ }
+ mediaStatement(ml);
+ start = true;
+ documentHandler.startMedia(ml);
+ jj_consume_token(LBRACE);
+ label_27: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[36] = jj_gen;
+ break label_27;
+ }
+ jj_consume_token(S);
+ }
+ label_28: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case CDO:
+ case LBRACE:
+ case DASHMATCH:
+ case INCLUDES:
+ case PLUS:
+ case MINUS:
+ case COMMA:
+ case SEMICOLON:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case NONASCII:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case URL:
+ case PERCENTAGE:
+ case HASH:
+ case IMPORT_SYM:
+ case MEDIA_SYM:
+ case CHARSET_SYM:
+ case PAGE_SYM:
+ case FONT_FACE_SYM:
+ case ATKEYWORD:
+ case IMPORTANT_SYM:
+ case UNICODERANGE:
+ case FUNCTION:
+ case UNKNOWN:
+ ;
+ break;
+ default:
+ jj_la1[37] = jj_gen;
+ break label_28;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case DEBUG_SYM:
+ case WARN_SYM:
+ debuggingDirective();
+ break;
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case IDENT:
+ case HASH:
+ styleRule();
+ break;
+ case CDO:
+ case LBRACE:
+ case DASHMATCH:
+ case INCLUDES:
+ case MINUS:
+ case COMMA:
+ case SEMICOLON:
+ case NONASCII:
+ case STRING:
+ case NUMBER:
+ case URL:
+ case PERCENTAGE:
+ case IMPORT_SYM:
+ case MEDIA_SYM:
+ case CHARSET_SYM:
+ case PAGE_SYM:
+ case FONT_FACE_SYM:
+ case ATKEYWORD:
+ case IMPORTANT_SYM:
+ case UNICODERANGE:
+ case FUNCTION:
+ case UNKNOWN:
+ skipUnknownRule();
+ break;
+ default:
+ jj_la1[38] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_29: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[39] = jj_gen;
+ break label_29;
+ }
+ jj_consume_token(S);
+ }
+ } catch (ParseException e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+
+ } finally {
+ if (start) {
+ documentHandler.endMedia(ml);
+ }
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case TO:
- case FROM:
- case PERCENTAGE:
- keyframeSelector();
- break;
- case CONTENT_SYM:
- contentDirective();
- break;
- default:
- jj_la1[23] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_18:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[24] = jj_gen;
- break label_18;
- }
- jj_consume_token(S);
- }
- } catch (ParseException e) {
- reportError(getLocator(), e);
- skipStatement();
- } finally {
- if (start) {
- documentHandler.endKeyFrames();
- }
- }
- }
-
- final public void keyframeSelector() throws ParseException {
- Token n;
- String selector = "";
- boolean start = false;
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case FROM:
- n = jj_consume_token(FROM);
- break;
- case TO:
- n = jj_consume_token(TO);
- break;
- case PERCENTAGE:
- n = jj_consume_token(PERCENTAGE);
- break;
- default:
- jj_la1[25] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- selector += n.image;
- label_19:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[26] = jj_gen;
- break label_19;
- }
- jj_consume_token(S);
- }
- label_20:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- ;
- break;
- default:
- jj_la1[27] = jj_gen;
- break label_20;
+ }
+
+ final public void mediaStatement(MediaListImpl ml) throws ParseException {
+ Token t;
+ t = getToken(1);
+ // loop over comma separated parts, add each to ml
+ while ((t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
+ StringBuffer s = new StringBuffer();
+ s.append(getToken(0).image);
+ while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF)
+ && (t.kind != SEMICOLON)) {
+ s.append(t.image);
+ getNextToken();
+ t = getToken(1);
+ }
+ if (t.kind == COMMA) {
+ // skip the comma and the token before it that is still the
+ // active token
+ getNextToken();
+ getNextToken();
+ t = getToken(1);
+ }
+ String str = s.toString().trim();
+ if (str.length() > 0) {
+ ml.addItem(str);
+ }
}
- jj_consume_token(COMMA);
- label_21:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[28] = jj_gen;
- break label_21;
- }
- jj_consume_token(S);
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String medium() throws ParseException {
+ Token n;
+ n = jj_consume_token(IDENT);
+ {
+ if (true) {
+ return convertIdent(n.image);
+ }
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case FROM:
- n = jj_consume_token(FROM);
- break;
- case TO:
- n = jj_consume_token(TO);
- break;
- case PERCENTAGE:
- n = jj_consume_token(PERCENTAGE);
- break;
- default:
- jj_la1[29] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
+ throw new Error("Missing return statement in function");
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void page() throws ParseException {
+ boolean start = false;
+ Token n = null;
+ String page = null;
+ String pseudo = null;
+ try {
+ jj_consume_token(PAGE_SYM);
+ label_30: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[40] = jj_gen;
+ break label_30;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ n = jj_consume_token(IDENT);
+ label_31: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[41] = jj_gen;
+ break label_31;
+ }
+ jj_consume_token(S);
+ }
+ break;
+ default:
+ jj_la1[42] = jj_gen;
+ ;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COLON:
+ pseudo = pseudo_page();
+ break;
+ default:
+ jj_la1[43] = jj_gen;
+ ;
+ }
+ if (n != null) {
+ page = convertIdent(n.image);
+ }
+ jj_consume_token(LBRACE);
+ label_32: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[44] = jj_gen;
+ break label_32;
+ }
+ jj_consume_token(S);
+ }
+ start = true;
+ documentHandler.startPage(page, pseudo);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[45] = jj_gen;
+ ;
+ }
+ label_33: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[46] = jj_gen;
+ break label_33;
+ }
+ jj_consume_token(SEMICOLON);
+ label_34: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[47] = jj_gen;
+ break label_34;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[48] = jj_gen;
+ ;
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_35: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[49] = jj_gen;
+ break label_35;
+ }
+ jj_consume_token(S);
+ }
+ } catch (ParseException e) {
+ if (errorHandler != null) {
+ LocatorImpl li = new LocatorImpl(this,
+ e.currentToken.next.beginLine,
+ e.currentToken.next.beginColumn - 1);
+ reportError(li, e);
+ skipStatement();
+ // reportWarningSkipText(li, skipStatement());
+ } else {
+ skipStatement();
+ }
+ } finally {
+ if (start) {
+ documentHandler.endPage(page, pseudo);
+ }
}
- selector += (", " + n.image);
- label_22:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[30] = jj_gen;
- break label_22;
- }
- jj_consume_token(S);
- }
- }
- jj_consume_token(LBRACE);
- label_23:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[31] = jj_gen;
- break label_23;
- }
- jj_consume_token(S);
- }
- start = true;
- documentHandler.startKeyframeSelector(selector);
- label_24:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case MICROSOFT_RULE:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[32] = jj_gen;
- break label_24;
+ }
+
+ final public String pseudo_page() throws ParseException {
+ Token n;
+ jj_consume_token(COLON);
+ n = jj_consume_token(IDENT);
+ label_36: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[50] = jj_gen;
+ break label_36;
+ }
+ jj_consume_token(S);
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ifContentStatement();
- break;
- case MICROSOFT_RULE:
- microsoftExtension();
- break;
- default:
- jj_la1[33] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_25:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[34] = jj_gen;
- break label_25;
+ {
+ if (true) {
+ return convertIdent(n.image);
+ }
}
- jj_consume_token(S);
- }
- } catch (ThrowedParseException e) {
- if (errorHandler != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.e.currentToken.next.beginLine,
- e.e.currentToken.next.beginColumn-1);
- reportError(li, e.e);
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void fontFace() throws ParseException {
+ boolean start = false;
+ try {
+ jj_consume_token(FONT_FACE_SYM);
+ label_37: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[51] = jj_gen;
+ break label_37;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(LBRACE);
+ label_38: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[52] = jj_gen;
+ break label_38;
+ }
+ jj_consume_token(S);
+ }
+ start = true;
+ documentHandler.startFontFace();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[53] = jj_gen;
+ ;
+ }
+ label_39: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[54] = jj_gen;
+ break label_39;
+ }
+ jj_consume_token(SEMICOLON);
+ label_40: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[55] = jj_gen;
+ break label_40;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[56] = jj_gen;
+ ;
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_41: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[57] = jj_gen;
+ break label_41;
+ }
+ jj_consume_token(S);
+ }
+ } catch (ParseException e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+
+ } finally {
+ if (start) {
+ documentHandler.endFontFace();
+ }
}
- } catch (ParseException e) {
- reportError(getLocator(), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
+ }
- } catch (TokenMgrError e) {
- reportWarningSkipText(getLocator(), skipStatement());
- } finally {
- if (start) {
- documentHandler.endKeyframeSelector();
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void atRuleDeclaration() throws ParseException {
+ Token n;
+ String ret;
+ n = jj_consume_token(ATKEYWORD);
+ ret = skipStatement();
+ if ((ret != null) && (ret.charAt(0) == '@')) {
+ documentHandler.unrecognizedRule(ret);
+ } else {
+ reportWarningSkipText(getLocator(), ret);
}
}
- }
-/**
- * @exception ParseException exception during the parse
- */
-/* see http://www.w3.org/TR/css3-mediaqueries/ */
- final public void media() throws ParseException {
- boolean start = false;
- String ret;
- MediaListImpl ml = new MediaListImpl();
- try {
- jj_consume_token(MEDIA_SYM);
- label_26:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[35] = jj_gen;
- break label_26;
- }
- jj_consume_token(S);
- }
- mediaStatement(ml);
- start = true; documentHandler.startMedia(ml);
- jj_consume_token(LBRACE);
- label_27:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[36] = jj_gen;
- break label_27;
- }
- jj_consume_token(S);
- }
- label_28:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ final public void skipUnknownRule() throws ParseException {
+ Token n;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case ATKEYWORD:
+ n = jj_consume_token(ATKEYWORD);
+ break;
case CDO:
- case LBRACE:
+ n = jj_consume_token(CDO);
+ break;
+ case CHARSET_SYM:
+ n = jj_consume_token(CHARSET_SYM);
+ break;
+ case COMMA:
+ n = jj_consume_token(COMMA);
+ break;
case DASHMATCH:
+ n = jj_consume_token(DASHMATCH);
+ break;
+ case FONT_FACE_SYM:
+ n = jj_consume_token(FONT_FACE_SYM);
+ break;
+ case FUNCTION:
+ n = jj_consume_token(FUNCTION);
+ break;
+ case IMPORTANT_SYM:
+ n = jj_consume_token(IMPORTANT_SYM);
+ break;
+ case IMPORT_SYM:
+ n = jj_consume_token(IMPORT_SYM);
+ break;
case INCLUDES:
- case PLUS:
- case MINUS:
- case COMMA:
- case SEMICOLON:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
+ n = jj_consume_token(INCLUDES);
+ break;
+ case LBRACE:
+ n = jj_consume_token(LBRACE);
+ break;
+ case MEDIA_SYM:
+ n = jj_consume_token(MEDIA_SYM);
+ break;
case NONASCII:
- case DEBUG_SYM:
- case WARN_SYM:
- case STRING:
- case IDENT:
+ n = jj_consume_token(NONASCII);
+ break;
case NUMBER:
- case URL:
- case PERCENTAGE:
- case HASH:
- case IMPORT_SYM:
- case MEDIA_SYM:
- case CHARSET_SYM:
+ n = jj_consume_token(NUMBER);
+ break;
case PAGE_SYM:
- case FONT_FACE_SYM:
- case ATKEYWORD:
- case IMPORTANT_SYM:
+ n = jj_consume_token(PAGE_SYM);
+ break;
+ case PERCENTAGE:
+ n = jj_consume_token(PERCENTAGE);
+ break;
+ case STRING:
+ n = jj_consume_token(STRING);
+ break;
case UNICODERANGE:
- case FUNCTION:
+ n = jj_consume_token(UNICODERANGE);
+ break;
+ case URL:
+ n = jj_consume_token(URL);
+ break;
+ case SEMICOLON:
+ n = jj_consume_token(SEMICOLON);
+ break;
+ case MINUS:
+ n = jj_consume_token(MINUS);
+ break;
case UNKNOWN:
- ;
- break;
+ n = jj_consume_token(UNKNOWN);
+ break;
default:
- jj_la1[37] = jj_gen;
- break label_28;
+ jj_la1[58] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DEBUG_SYM:
- case WARN_SYM:
- debuggingDirective();
- break;
+ String ret;
+ Locator loc = getLocator();
+ ret = skipStatement();
+ if ((ret != null) && (n.image.charAt(0) == '@')) {
+ documentHandler.unrecognizedRule(ret);
+ } else {
+ reportWarningSkipText(loc, ret);
+ }
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public char combinator() throws ParseException {
+ char connector = ' ';
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case PLUS:
case PRECEDES:
case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case IDENT:
- case HASH:
- styleRule();
- break;
- case CDO:
- case LBRACE:
- case DASHMATCH:
- case INCLUDES:
- case MINUS:
- case COMMA:
- case SEMICOLON:
- case NONASCII:
- case STRING:
- case NUMBER:
- case URL:
- case PERCENTAGE:
- case IMPORT_SYM:
- case MEDIA_SYM:
- case CHARSET_SYM:
- case PAGE_SYM:
- case FONT_FACE_SYM:
- case ATKEYWORD:
- case IMPORTANT_SYM:
- case UNICODERANGE:
- case FUNCTION:
- case UNKNOWN:
- skipUnknownRule();
- break;
- default:
- jj_la1[38] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_29:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ connector = combinatorChar();
+ break;
case S:
- ;
- break;
+ jj_consume_token(S);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ connector = combinatorChar();
+ break;
+ default:
+ jj_la1[59] = jj_gen;
+ ;
+ }
+ break;
default:
- jj_la1[39] = jj_gen;
- break label_29;
- }
- jj_consume_token(S);
- }
- } catch (ParseException e) {
- reportError(getLocator(), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
-
- } finally {
- if (start) {
- documentHandler.endMedia(ml);
- }
- }
- }
-
- final public void mediaStatement(MediaListImpl ml) throws ParseException {
- Token t;
- t = getToken(1);
- // loop over comma separated parts, add each to ml
- while ((t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
- StringBuffer s = new StringBuffer();
- s.append(getToken(0).image);
- while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
- s.append(t.image);
- getNextToken();
- t = getToken(1);
- }
- if (t.kind == COMMA) {
- // skip the comma and the token before it that is still the active token
- getNextToken();
- getNextToken();
- t = getToken(1);
+ jj_la1[60] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- String str = s.toString().trim();
- if (str.length() > 0) {
- ml.addItem(str);
+ {
+ if (true) {
+ return connector;
+ }
}
- }
- }
-
-/**
- * @exception ParseException exception during the parse
- */
- final public String medium() throws ParseException {
- Token n;
- n = jj_consume_token(IDENT);
- {if (true) return convertIdent(n.image);}
- throw new Error("Missing return statement in function");
- }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public void page() throws ParseException {
- boolean start = false;
- Token n = null;
- String page = null;
- String pseudo = null;
- try {
- jj_consume_token(PAGE_SYM);
- label_30:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[40] = jj_gen;
- break label_30;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- n = jj_consume_token(IDENT);
- label_31:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
+ /** to refactor combinator and reuse in selector(). */
+ final public char combinatorChar() throws ParseException {
+ Token t;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ t = jj_consume_token(PLUS);
+ break;
+ case PRECEDES:
+ t = jj_consume_token(PRECEDES);
+ break;
+ case SIBLING:
+ t = jj_consume_token(SIBLING);
break;
- default:
- jj_la1[41] = jj_gen;
- break label_31;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[42] = jj_gen;
- ;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COLON:
- pseudo = pseudo_page();
- break;
- default:
- jj_la1[43] = jj_gen;
- ;
- }
- if (n != null) {
- page = convertIdent(n.image);
- }
- jj_consume_token(LBRACE);
- label_32:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[44] = jj_gen;
- break label_32;
- }
- jj_consume_token(S);
- }
- start = true;
- documentHandler.startPage(page, pseudo);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[45] = jj_gen;
- ;
- }
- label_33:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
default:
- jj_la1[46] = jj_gen;
- break label_33;
+ jj_la1[61] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- jj_consume_token(SEMICOLON);
- label_34:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[47] = jj_gen;
- break label_34;
- }
- jj_consume_token(S);
+ label_42: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[62] = jj_gen;
+ break label_42;
+ }
+ jj_consume_token(S);
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[48] = jj_gen;
- ;
- }
- }
- jj_consume_token(RBRACE);
- label_35:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[49] = jj_gen;
- break label_35;
- }
- jj_consume_token(S);
- }
- } catch (ParseException e) {
- if (errorHandler != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.currentToken.next.beginLine,
- e.currentToken.next.beginColumn-1);
- reportError(li, e);
- skipStatement();
- // reportWarningSkipText(li, skipStatement());
- } else {
- skipStatement();
- }
- } finally {
- if (start) {
- documentHandler.endPage(page, pseudo);
- }
- }
- }
-
- final public String pseudo_page() throws ParseException {
- Token n;
- jj_consume_token(COLON);
- n = jj_consume_token(IDENT);
- label_36:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[50] = jj_gen;
- break label_36;
- }
- jj_consume_token(S);
- }
- {if (true) return convertIdent(n.image);}
- throw new Error("Missing return statement in function");
- }
-
- final public void fontFace() throws ParseException {
- boolean start = false;
- try {
- jj_consume_token(FONT_FACE_SYM);
- label_37:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[51] = jj_gen;
- break label_37;
- }
- jj_consume_token(S);
- }
- jj_consume_token(LBRACE);
- label_38:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[52] = jj_gen;
- break label_38;
- }
- jj_consume_token(S);
- }
- start = true; documentHandler.startFontFace();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[53] = jj_gen;
- ;
- }
- label_39:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[54] = jj_gen;
- break label_39;
+ {
+ if (true) {
+ return t.image.charAt(0);
+ }
}
- jj_consume_token(SEMICOLON);
- label_40:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[55] = jj_gen;
- break label_40;
- }
- jj_consume_token(S);
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void microsoftExtension() throws ParseException {
+ Token n;
+ String name = "";
+ String value = "";
+ // This is not really taking the syntax of filter rules into account
+ n = jj_consume_token(MICROSOFT_RULE);
+ label_43: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[63] = jj_gen;
+ break label_43;
+ }
+ jj_consume_token(S);
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[56] = jj_gen;
- ;
- }
- }
- jj_consume_token(RBRACE);
- label_41:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[57] = jj_gen;
- break label_41;
+ name = n.image;
+ jj_consume_token(COLON);
+ label_44: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ n = jj_consume_token(IDENT);
+ value += n.image;
+ break;
+ case NUMBER:
+ n = jj_consume_token(NUMBER);
+ value += n.image;
+ break;
+ case STRING:
+ n = jj_consume_token(STRING);
+ value += n.image;
+ break;
+ case COMMA:
+ n = jj_consume_token(COMMA);
+ value += n.image;
+ break;
+ case INTERPOLATION:
+ n = jj_consume_token(INTERPOLATION);
+ value += n.image;
+ break;
+ case COLON:
+ n = jj_consume_token(COLON);
+ value += n.image;
+ break;
+ case FUNCTION:
+ n = jj_consume_token(FUNCTION);
+ value += n.image;
+ break;
+ case RPARAN:
+ n = jj_consume_token(RPARAN);
+ value += n.image;
+ break;
+ case EQ:
+ n = jj_consume_token(EQ);
+ value += n.image;
+ break;
+ case DOT:
+ n = jj_consume_token(DOT);
+ value += n.image;
+ break;
+ case S:
+ n = jj_consume_token(S);
+ if (value.lastIndexOf(' ') != value.length() - 1) {
+ value += n.image;
+ }
+ break;
+ default:
+ jj_la1[64] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ case EQ:
+ case COMMA:
+ case DOT:
+ case RPARAN:
+ case COLON:
+ case INTERPOLATION:
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case FUNCTION:
+ ;
+ break;
+ default:
+ jj_la1[65] = jj_gen;
+ break label_44;
+ }
+ }
+ jj_consume_token(SEMICOLON);
+ label_45: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[66] = jj_gen;
+ break label_45;
+ }
+ jj_consume_token(S);
}
- jj_consume_token(S);
- }
- } catch (ParseException e) {
- reportError(getLocator(), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
+ documentHandler.microsoftDirective(name, value);
+ }
- } finally {
- if (start) {
- documentHandler.endFontFace();
- }
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String property() throws ParseException {
+ Token t;
+ String s = "";
+ label_46: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ t = jj_consume_token(IDENT);
+ s += t.image;
+ break;
+ case INTERPOLATION:
+ t = jj_consume_token(INTERPOLATION);
+ s += t.image;
+ break;
+ default:
+ jj_la1[67] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ ;
+ break;
+ default:
+ jj_la1[68] = jj_gen;
+ break label_46;
+ }
+ }
+ label_47: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[69] = jj_gen;
+ break label_47;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return s;
+ }
+ }
+ throw new Error("Missing return statement in function");
}
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public void atRuleDeclaration() throws ParseException {
- Token n;
- String ret;
- n = jj_consume_token(ATKEYWORD);
- ret=skipStatement();
- if ((ret != null) && (ret.charAt(0) == '@')) {
- documentHandler.unrecognizedRule(ret);
- } else {
- reportWarningSkipText(getLocator(), ret);
+ final public String variableName() throws ParseException {
+ Token n;
+ n = jj_consume_token(VARIABLE);
+ label_48: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[70] = jj_gen;
+ break label_48;
+ }
+ jj_consume_token(S);
}
- }
-
- final public void skipUnknownRule() throws ParseException {
- Token n;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case ATKEYWORD:
- n = jj_consume_token(ATKEYWORD);
- break;
- case CDO:
- n = jj_consume_token(CDO);
- break;
- case CHARSET_SYM:
- n = jj_consume_token(CHARSET_SYM);
- break;
- case COMMA:
- n = jj_consume_token(COMMA);
- break;
- case DASHMATCH:
- n = jj_consume_token(DASHMATCH);
- break;
- case FONT_FACE_SYM:
- n = jj_consume_token(FONT_FACE_SYM);
- break;
- case FUNCTION:
- n = jj_consume_token(FUNCTION);
- break;
- case IMPORTANT_SYM:
- n = jj_consume_token(IMPORTANT_SYM);
- break;
- case IMPORT_SYM:
- n = jj_consume_token(IMPORT_SYM);
- break;
- case INCLUDES:
- n = jj_consume_token(INCLUDES);
- break;
- case LBRACE:
- n = jj_consume_token(LBRACE);
- break;
- case MEDIA_SYM:
- n = jj_consume_token(MEDIA_SYM);
- break;
- case NONASCII:
- n = jj_consume_token(NONASCII);
- break;
- case NUMBER:
- n = jj_consume_token(NUMBER);
- break;
- case PAGE_SYM:
- n = jj_consume_token(PAGE_SYM);
- break;
- case PERCENTAGE:
- n = jj_consume_token(PERCENTAGE);
- break;
- case STRING:
- n = jj_consume_token(STRING);
- break;
- case UNICODERANGE:
- n = jj_consume_token(UNICODERANGE);
- break;
- case URL:
- n = jj_consume_token(URL);
- break;
- case SEMICOLON:
- n = jj_consume_token(SEMICOLON);
- break;
- case MINUS:
- n = jj_consume_token(MINUS);
- break;
- case UNKNOWN:
- n = jj_consume_token(UNKNOWN);
- break;
- default:
- jj_la1[58] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- String ret;
- Locator loc = getLocator();
- ret=skipStatement();
- if ((ret != null) && (n.image.charAt(0) == '@')) {
- documentHandler.unrecognizedRule(ret);
- } else {
- reportWarningSkipText(loc, ret);
- }
- }
+ {
+ if (true) {
+ return convertIdent(n.image.substring(1));
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public char combinator() throws ParseException {
-char connector = ' ';
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- connector = combinatorChar();
- break;
- case S:
- jj_consume_token(S);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- connector = combinatorChar();
- break;
- default:
- jj_la1[59] = jj_gen;
- ;
- }
- break;
- default:
- jj_la1[60] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return connector;}
- throw new Error("Missing return statement in function");
- }
-
-/**to refactor combinator and reuse in selector().*/
- final public char combinatorChar() throws ParseException {
- Token t;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- t = jj_consume_token(PLUS);
- break;
- case PRECEDES:
- t = jj_consume_token(PRECEDES);
- break;
- case SIBLING:
- t = jj_consume_token(SIBLING);
- break;
- default:
- jj_la1[61] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_42:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[62] = jj_gen;
- break label_42;
- }
- jj_consume_token(S);
- }
- {if (true) return t.image.charAt(0);}
- throw new Error("Missing return statement in function");
- }
-
- final public void microsoftExtension() throws ParseException {
- Token n;
- String name = "";
- String value = "";
- // This is not really taking the syntax of filter rules into account
- n = jj_consume_token(MICROSOFT_RULE);
- label_43:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[63] = jj_gen;
- break label_43;
- }
- jj_consume_token(S);
- }
- name = n.image;
- jj_consume_token(COLON);
- label_44:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- n = jj_consume_token(IDENT);
- value += n.image;
- break;
- case NUMBER:
- n = jj_consume_token(NUMBER);
- value += n.image;
- break;
- case STRING:
- n = jj_consume_token(STRING);
- value += n.image;
- break;
- case COMMA:
- n = jj_consume_token(COMMA);
- value += n.image;
- break;
- case INTERPOLATION:
- n = jj_consume_token(INTERPOLATION);
- value += n.image;
- break;
- case COLON:
- n = jj_consume_token(COLON);
- value += n.image;
- break;
- case FUNCTION:
+ final public String functionName() throws ParseException {
+ Token n;
n = jj_consume_token(FUNCTION);
- value += n.image;
- break;
- case RPARAN:
- n = jj_consume_token(RPARAN);
- value += n.image;
- break;
- case EQ:
- n = jj_consume_token(EQ);
- value += n.image;
- break;
- case DOT:
- n = jj_consume_token(DOT);
- value += n.image;
- break;
- case S:
- n = jj_consume_token(S);
- if(value.lastIndexOf(' ') != value.length()-1)
- { value += n.image; }
- break;
- default:
- jj_la1[64] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- case EQ:
- case COMMA:
- case DOT:
- case RPARAN:
- case COLON:
- case INTERPOLATION:
- case STRING:
- case IDENT:
- case NUMBER:
- case FUNCTION:
- ;
- break;
- default:
- jj_la1[65] = jj_gen;
- break label_44;
- }
- }
- jj_consume_token(SEMICOLON);
- label_45:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[66] = jj_gen;
- break label_45;
- }
- jj_consume_token(S);
- }
- documentHandler.microsoftDirective(name, value);
- }
+ label_49: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[71] = jj_gen;
+ break label_49;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return convertIdent(n.image.substring(0, n.image.length() - 1));
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public String property() throws ParseException {
- Token t;String s = "";
- label_46:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- t = jj_consume_token(IDENT);
- s += t.image;
- break;
- case INTERPOLATION:
- t = jj_consume_token(INTERPOLATION);
- s += t.image;
- break;
- default:
- jj_la1[67] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- ;
- break;
- default:
- jj_la1[68] = jj_gen;
- break label_46;
- }
- }
- label_47:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[69] = jj_gen;
- break label_47;
- }
- jj_consume_token(S);
- }
- {if (true) return s;}
- throw new Error("Missing return statement in function");
- }
-
- final public String variableName() throws ParseException {
- Token n;
- n = jj_consume_token(VARIABLE);
- label_48:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[70] = jj_gen;
- break label_48;
- }
- jj_consume_token(S);
- }
- {if (true) return convertIdent(n.image.substring(1));}
- throw new Error("Missing return statement in function");
- }
-
- final public String functionName() throws ParseException {
- Token n;
- n = jj_consume_token(FUNCTION);
- label_49:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[71] = jj_gen;
- break label_49;
- }
- jj_consume_token(S);
- }
- {if (true) return convertIdent(n.image.substring(0, n.image.length()-1));}
- throw new Error("Missing return statement in function");
- }
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void styleRule() throws ParseException {
+ boolean start = false;
+ ArrayList<String> l = null;
+ Token save;
+ Locator loc;
+ try {
+ l = selectorList();
+ save = token;
+ jj_consume_token(LBRACE);
+ label_50: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[72] = jj_gen;
+ break label_50;
+ }
+ jj_consume_token(S);
+ }
+ start = true;
+ documentHandler.startSelector(l);
+ label_51: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case MICROSOFT_RULE:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case IMPORT_SYM:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[73] = jj_gen;
+ break label_51;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case MICROSOFT_RULE:
+ microsoftExtension();
+ break;
+ case IMPORT_SYM:
+ importDeclaration();
+ break;
+ default:
+ jj_la1[74] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_52: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[75] = jj_gen;
+ break label_52;
+ }
+ jj_consume_token(S);
+ }
+ } catch (ThrowedParseException e) {
+ if (errorHandler != null) {
+ LocatorImpl li = new LocatorImpl(this,
+ e.e.currentToken.next.beginLine,
+ e.e.currentToken.next.beginColumn - 1);
+ reportError(li, e.e);
+ }
+ } catch (ParseException e) {
+ reportError(getLocator(), e);
+ skipStatement();
+ // reportWarningSkipText(getLocator(), skipStatement());
+
+ } catch (TokenMgrError e) {
+ reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+ if (start) {
+ documentHandler.endSelector();
+ }
+ }
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public void styleRule() throws ParseException {
- boolean start = false;
- ArrayList<String> l = null;
- Token save;
- Locator loc;
- try {
- l = selectorList();
- save = token;
- jj_consume_token(LBRACE);
- label_50:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[72] = jj_gen;
- break label_50;
- }
- jj_consume_token(S);
- }
- start = true;
- documentHandler.startSelector(l);
- label_51:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case MICROSOFT_RULE:
- case IDENT:
- case VARIABLE:
- case HASH:
- case IMPORT_SYM:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[73] = jj_gen;
- break label_51;
+ final public ArrayList<String> selectorList() throws ParseException {
+ ArrayList<String> selectors = new ArrayList<String>();
+ String selector;
+ selector = selector();
+ label_53: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ ;
+ break;
+ default:
+ jj_la1[76] = jj_gen;
+ break label_53;
+ }
+ jj_consume_token(COMMA);
+ label_54: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[77] = jj_gen;
+ break label_54;
+ }
+ jj_consume_token(S);
+ }
+ selectors.add(selector);
+ selector = selector();
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ifContentStatement();
- break;
- case MICROSOFT_RULE:
- microsoftExtension();
- break;
- case IMPORT_SYM:
- importDeclaration();
- break;
- default:
- jj_la1[74] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_52:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[75] = jj_gen;
- break label_52;
- }
- jj_consume_token(S);
- }
- } catch (ThrowedParseException e) {
- if (errorHandler != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.e.currentToken.next.beginLine,
- e.e.currentToken.next.beginColumn-1);
- reportError(li, e.e);
- }
- } catch (ParseException e) {
- reportError(getLocator(), e);
- skipStatement();
- // reportWarningSkipText(getLocator(), skipStatement());
-
- } catch (TokenMgrError e) {
- reportWarningSkipText(getLocator(), skipStatement());
- } finally {
- if (start) {
- documentHandler.endSelector();
- }
- }
- }
-
- final public ArrayList<String> selectorList() throws ParseException {
- ArrayList<String> selectors = new ArrayList<String>();
- String selector;
- selector = selector();
- label_53:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- ;
- break;
- default:
- jj_la1[76] = jj_gen;
- break label_53;
- }
- jj_consume_token(COMMA);
- label_54:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[77] = jj_gen;
- break label_54;
+ selectors.add(selector);
+ {
+ if (true) {
+ return selectors;
+ }
}
- jj_consume_token(S);
- }
- selectors.add(selector);
- selector = selector();
+ throw new Error("Missing return statement in function");
}
- selectors.add(selector);
- {if (true) return selectors;}
- throw new Error("Missing return statement in function");
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public String selector() throws ParseException {
- String selector = null;
- char comb;
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case IDENT:
- case HASH:
- selector = simple_selector(null, ' ');
- break;
- case PLUS:
- case PRECEDES:
- case SIBLING:
- comb = combinatorChar();
- selector = simple_selector(selector, comb);
- break;
- default:
- jj_la1[78] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_55:
- while (true) {
- if (jj_2_2(2)) {
- ;
- } else {
- break label_55;
- }
- comb = combinator();
- selector = simple_selector(selector, comb);
- }
- label_56:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[79] = jj_gen;
- break label_56;
- }
- jj_consume_token(S);
- }
- {if (true) return selector;}
- } catch (ParseException e) {
- /*
- Token t = getToken(1);
- StringBuffer s = new StringBuffer();
- s.append(getToken(0).image);
- while ((t.kind != COMMA) && (t.kind != SEMICOLON)
- && (t.kind != LBRACE) && (t.kind != EOF)) {
- s.append(t.image);
- getNextToken();
- t = getToken(1);
- }
- reportWarningSkipText(getLocator(), s.toString());
+ /**
+ * @exception ParseException
+ * exception during the parse
*/
- Token t = getToken(1);
- while ((t.kind != COMMA) && (t.kind != SEMICOLON)
- && (t.kind != LBRACE) && (t.kind != EOF)) {
- getNextToken();
- t = getToken(1);
- }
+ final public String selector() throws ParseException {
+ String selector = null;
+ char comb;
+ try {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case IDENT:
+ case HASH:
+ selector = simple_selector(null, ' ');
+ break;
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ comb = combinatorChar();
+ selector = simple_selector(selector, comb);
+ break;
+ default:
+ jj_la1[78] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ label_55: while (true) {
+ if (jj_2_2(2)) {
+ ;
+ } else {
+ break label_55;
+ }
+ comb = combinator();
+ selector = simple_selector(selector, comb);
+ }
+ label_56: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[79] = jj_gen;
+ break label_56;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return selector;
+ }
+ }
+ } catch (ParseException e) {
+ /*
+ * Token t = getToken(1); StringBuffer s = new StringBuffer();
+ * s.append(getToken(0).image); while ((t.kind != COMMA) && (t.kind
+ * != SEMICOLON) && (t.kind != LBRACE) && (t.kind != EOF)) {
+ * s.append(t.image); getNextToken(); t = getToken(1); }
+ * reportWarningSkipText(getLocator(), s.toString());
+ */
+ Token t = getToken(1);
+ while ((t.kind != COMMA) && (t.kind != SEMICOLON)
+ && (t.kind != LBRACE) && (t.kind != EOF)) {
+ getNextToken();
+ t = getToken(1);
+ }
- {if (true) throw new ThrowedParseException(e);}
+ {
+ if (true) {
+ throw new ThrowedParseException(e);
+ }
+ }
+ }
+ throw new Error("Missing return statement in function");
}
- throw new Error("Missing return statement in function");
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public String simple_selector(String selector, char comb) throws ParseException {
- String simple_current = null;
- String cond = null;
-
- pseudoElt = null;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case ANY:
- case PARENT:
- case INTERPOLATION:
- case IDENT:
- simple_current = element_name();
- label_57:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String simple_selector(String selector, char comb)
+ throws ParseException {
+ String simple_current = null;
+ String cond = null;
+
+ pseudoElt = null;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case ANY:
+ case PARENT:
+ case INTERPOLATION:
+ case IDENT:
+ simple_current = element_name();
+ label_57: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case LBRACKET:
+ case DOT:
+ case COLON:
+ case HASH:
+ ;
+ break;
+ default:
+ jj_la1[80] = jj_gen;
+ break label_57;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case HASH:
+ cond = hash(cond);
+ break;
+ case DOT:
+ cond = _class(cond);
+ break;
+ case LBRACKET:
+ cond = attrib(cond);
+ break;
+ case COLON:
+ cond = pseudo(cond);
+ break;
+ default:
+ jj_la1[81] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ break;
case LBRACKET:
case DOT:
case COLON:
case HASH:
- ;
- break;
+ label_58: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case HASH:
+ cond = hash(cond);
+ break;
+ case DOT:
+ cond = _class(cond);
+ break;
+ case LBRACKET:
+ cond = attrib(cond);
+ break;
+ case COLON:
+ cond = pseudo(cond);
+ break;
+ default:
+ jj_la1[82] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case LBRACKET:
+ case DOT:
+ case COLON:
+ case HASH:
+ ;
+ break;
+ default:
+ jj_la1[83] = jj_gen;
+ break label_58;
+ }
+ }
+ break;
default:
- jj_la1[80] = jj_gen;
- break label_57;
+ jj_la1[84] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case HASH:
- cond = hash(cond);
- break;
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[81] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
- case HASH:
- cond = hash(cond);
- label_58:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- ;
- break;
- default:
- jj_la1[82] = jj_gen;
- break label_58;
+ if (simple_current == null) {
+ simple_current = "";
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[83] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
- case DOT:
- cond = _class(cond);
- label_59:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- case HASH:
- ;
- break;
- default:
- jj_la1[84] = jj_gen;
- break label_59;
+ if (cond != null) {
+ simple_current = simple_current + cond;
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case HASH:
- cond = hash(cond);
- break;
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[85] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
- case COLON:
- cond = pseudo(cond);
- label_60:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- case HASH:
- ;
- break;
- default:
- jj_la1[86] = jj_gen;
- break label_60;
+ StringBuilder builder = new StringBuilder();
+ switch (comb) {
+ case ' ':
+ if (selector != null) {
+ builder.append(selector).append(" ");
+ }
+ break;
+ case '+':
+ case '>':
+ case '~':
+ if (selector != null) {
+ builder.append(selector).append(" ");
+ }
+ builder.append(comb).append(" ");
+ break;
+ default: {
+ if (true) {
+ throw new ParseException("invalid state. send a bug report");
+ }
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case HASH:
- cond = hash(cond);
- break;
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[87] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
- case LBRACKET:
- cond = attrib(cond);
- label_61:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- case HASH:
- ;
- break;
- default:
- jj_la1[88] = jj_gen;
- break label_61;
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case HASH:
- cond = hash(cond);
- break;
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[89] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
- default:
- jj_la1[90] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- if (simple_current == null) {
- simple_current = "";
- }
- if (cond != null) {
- simple_current = simple_current + cond;
- }
- StringBuilder builder = new StringBuilder();
- switch (comb) {
- case ' ':
- if(selector!=null){
- builder.append(selector).append(" ");
- }
- break;
- case '+':
- case '>':
- case '~':
- if(selector!=null){
- builder.append(selector).append(" ");
- }
- builder.append(comb).append(" ");
- break;
- default:
- {if (true) throw new ParseException("invalid state. send a bug report");}
- }
- builder.append(simple_current);
- selector = builder.toString();
+ builder.append(simple_current);
+ selector = builder.toString();
- if (pseudoElt != null) {
- selector = selector + pseudoElt;
+ if (pseudoElt != null) {
+ selector = selector + pseudoElt;
+ }
+ {
+ if (true) {
+ return selector;
}
- {if (true) return selector;}
- throw new Error("Missing return statement in function");
- }
-
-/**
- * @exception ParseException exception during the parse
- */
- final public String _class(String pred) throws ParseException {
- Token t;
-String s = ".";
- jj_consume_token(DOT);
- label_62:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- t = jj_consume_token(IDENT);
- s += t.image;
- break;
- case INTERPOLATION:
- t = jj_consume_token(INTERPOLATION);
- s += t.image;
- break;
- default:
- jj_la1[91] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- ;
- break;
- default:
- jj_la1[92] = jj_gen;
- break label_62;
- }
- }
- if (pred == null) {
- {if (true) return s;}
- } else {
- {if (true) return pred + s;}
- }
- throw new Error("Missing return statement in function");
- }
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public String element_name() throws ParseException {
- Token t; String s = "";
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- label_63:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- t = jj_consume_token(IDENT);
- s += t.image;
- break;
- case INTERPOLATION:
- t = jj_consume_token(INTERPOLATION);
- s += t.image;
- break;
- default:
- jj_la1[93] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String _class(String pred) throws ParseException {
+ Token t;
+ String s = ".";
+ jj_consume_token(DOT);
+ label_59: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ t = jj_consume_token(IDENT);
+ s += t.image;
+ break;
+ case INTERPOLATION:
+ t = jj_consume_token(INTERPOLATION);
+ s += t.image;
+ break;
+ default:
+ jj_la1[85] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ ;
+ break;
+ default:
+ jj_la1[86] = jj_gen;
+ break label_59;
+ }
+ }
+ if (pred == null) {
+ {
+ if (true) {
+ return s;
+ }
+ }
+ } else {
+ {
+ if (true) {
+ return pred + s;
+ }
+ }
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ throw new Error("Missing return statement in function");
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String element_name() throws ParseException {
+ Token t;
+ String s = "";
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case INTERPOLATION:
case IDENT:
- ;
- break;
+ label_60: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ t = jj_consume_token(IDENT);
+ s += t.image;
+ break;
+ case INTERPOLATION:
+ t = jj_consume_token(INTERPOLATION);
+ s += t.image;
+ break;
+ default:
+ jj_la1[87] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ ;
+ break;
+ default:
+ jj_la1[88] = jj_gen;
+ break label_60;
+ }
+ }
+ {
+ if (true) {
+ return s;
+ }
+ }
+ break;
+ case ANY:
+ jj_consume_token(ANY);
+ {
+ if (true) {
+ return "*";
+ }
+ }
+ break;
+ case PARENT:
+ jj_consume_token(PARENT);
+ {
+ if (true) {
+ return "&";
+ }
+ }
+ break;
default:
- jj_la1[94] = jj_gen;
- break label_63;
- }
- }
- {if (true) return s;}
- break;
- case ANY:
- jj_consume_token(ANY);
- {if (true) return "*";}
- break;
- case PARENT:
- jj_consume_token(PARENT);
- {if (true) return "&";}
- break;
- default:
- jj_la1[95] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- throw new Error("Missing return statement in function");
- }
+ jj_la1[89] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public String attrib(String pred) throws ParseException {
- int cases = 0;
- Token att = null;
- Token val = null;
- String attValue = null;
- jj_consume_token(LBRACKET);
- label_64:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[96] = jj_gen;
- break label_64;
- }
- jj_consume_token(S);
- }
- att = jj_consume_token(IDENT);
- label_65:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[97] = jj_gen;
- break label_65;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DASHMATCH:
- case CARETMATCH:
- case DOLLARMATCH:
- case STARMATCH:
- case INCLUDES:
- case EQ:
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case EQ:
- jj_consume_token(EQ);
- cases = 1;
- break;
- case INCLUDES:
- jj_consume_token(INCLUDES);
- cases = 2;
- break;
- case DASHMATCH:
- jj_consume_token(DASHMATCH);
- cases = 3;
- break;
- case CARETMATCH:
- jj_consume_token(CARETMATCH);
- cases = 4;
- break;
- case DOLLARMATCH:
- jj_consume_token(DOLLARMATCH);
- cases = 5;
- break;
- case STARMATCH:
- jj_consume_token(STARMATCH);
- cases = 6;
- break;
- default:
- jj_la1[98] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_66:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String attrib(String pred) throws ParseException {
+ int cases = 0;
+ Token att = null;
+ Token val = null;
+ String attValue = null;
+ jj_consume_token(LBRACKET);
+ label_61: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[90] = jj_gen;
+ break label_61;
+ }
+ jj_consume_token(S);
+ }
+ att = jj_consume_token(IDENT);
+ label_62: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[91] = jj_gen;
+ break label_62;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case DASHMATCH:
+ case CARETMATCH:
+ case DOLLARMATCH:
+ case STARMATCH:
+ case INCLUDES:
+ case EQ:
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case EQ:
+ jj_consume_token(EQ);
+ cases = 1;
+ break;
+ case INCLUDES:
+ jj_consume_token(INCLUDES);
+ cases = 2;
+ break;
+ case DASHMATCH:
+ jj_consume_token(DASHMATCH);
+ cases = 3;
+ break;
+ case CARETMATCH:
+ jj_consume_token(CARETMATCH);
+ cases = 4;
+ break;
+ case DOLLARMATCH:
+ jj_consume_token(DOLLARMATCH);
+ cases = 5;
+ break;
+ case STARMATCH:
+ jj_consume_token(STARMATCH);
+ cases = 6;
+ break;
+ default:
+ jj_la1[92] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ label_63: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[93] = jj_gen;
+ break label_63;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ val = jj_consume_token(IDENT);
+ attValue = val.image;
+ break;
+ case STRING:
+ val = jj_consume_token(STRING);
+ attValue = val.image;
+ break;
+ default:
+ jj_la1[94] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ label_64: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[95] = jj_gen;
+ break label_64;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[99] = jj_gen;
- break label_66;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- val = jj_consume_token(IDENT);
- attValue = val.image;
- break;
- case STRING:
- val = jj_consume_token(STRING);
- attValue = val.image;
- break;
- default:
- jj_la1[100] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_67:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[96] = jj_gen;
+ ;
+ }
+ jj_consume_token(RBRACKET);
+ String name = convertIdent(att.image);
+ String c;
+ switch (cases) {
+ case 0:
+ c = name;
+ break;
+ case 1:
+ c = name + "=" + attValue;
+ break;
+ case 2:
+ c = name + "~=" + attValue;
+ break;
+ case 3:
+ c = name + "|=" + attValue;
+ break;
+ case 4:
+ c = name + "^=" + attValue;
+ break;
+ case 5:
+ c = name + "$=" + attValue;
+ break;
+ case 6:
+ c = name + "*=" + attValue;
+ break;
default:
- jj_la1[101] = jj_gen;
- break label_67;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[102] = jj_gen;
- ;
- }
- jj_consume_token(RBRACKET);
- String name = convertIdent(att.image);
- String c;
- switch (cases) {
- case 0:
- c = name;
- break;
- case 1:
- c = name + "=" + attValue;
- break;
- case 2:
- c = name + "~=" + attValue;
- break;
- case 3:
- c = name + "|=" +attValue;
- break;
- case 4:
- c = name + "^=" +attValue;
- break;
- case 5:
- c = name + "$=" +attValue;
- break;
- case 6:
- c = name + "*=" +attValue;
- break;
- default:
- // never reached.
- c = null;
- }
- c = "[" + c + "]";
- if (pred == null) {
- {if (true) return c;}
- } else {
- {if (true) return pred + c;}
- }
- throw new Error("Missing return statement in function");
- }
+ // never reached.
+ c = null;
+ }
+ c = "[" + c + "]";
+ if (pred == null) {
+ {
+ if (true) {
+ return c;
+ }
+ }
+ } else {
+ {
+ if (true) {
+ return pred + c;
+ }
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public String pseudo(String pred) throws ParseException {
- Token n;
-Token param;
-String d;
-boolean isPseudoElement = false;
- jj_consume_token(COLON);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COLON:
- jj_consume_token(COLON);
- isPseudoElement=true;
- break;
- default:
- jj_la1[103] = jj_gen;
- ;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- n = jj_consume_token(IDENT);
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String pseudo(String pred) throws ParseException {
+ Token n;
+ Token param;
+ String d;
+ boolean isPseudoElement = false;
+ jj_consume_token(COLON);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COLON:
+ jj_consume_token(COLON);
+ isPseudoElement = true;
+ break;
+ default:
+ jj_la1[97] = jj_gen;
+ ;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ n = jj_consume_token(IDENT);
String s = ":" + convertIdent(n.image);
if (isPseudoElement) {
if (pseudoElt != null) {
- {if (true) throw new CSSParseException("duplicate pseudo element definition "
- + s, getLocator());}
+ {
+ if (true) {
+ throw new CSSParseException(
+ "duplicate pseudo element definition " + s,
+ getLocator());
+ }
+ }
} else {
- pseudoElt = ":"+s;
- {if (true) return pred;}
+ pseudoElt = ":" + s;
+ {
+ if (true) {
+ return pred;
+ }
+ }
}
} else {
String c = s;
if (pred == null) {
- {if (true) return c;}
+ {
+ if (true) {
+ return c;
+ }
+ }
} else {
- {if (true) return pred + c;}
+ {
+ if (true) {
+ return pred + c;
+ }
+ }
}
}
- break;
- case FUNCTION:
- n = jj_consume_token(FUNCTION);
- label_68:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ break;
+ case FUNCTION:
+ n = jj_consume_token(FUNCTION);
+ label_65: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[98] = jj_gen;
+ break label_65;
+ }
+ jj_consume_token(S);
+ }
+ d = skipStatementUntilMatchingRightParan();
+ jj_consume_token(RPARAN);
+ // accept anything between function and a right parenthesis
+ String f = convertIdent(n.image);
+ String colons = isPseudoElement ? "::" : ":";
+ String pseudofn = colons + f + d + ")";
+ if (pred == null) {
+ {
+ if (true) {
+ return pseudofn;
+ }
+ }
+ } else {
+ {
+ if (true) {
+ return pred + pseudofn;
+ }
+ }
+ }
+ break;
default:
- jj_la1[104] = jj_gen;
- break label_68;
- }
- jj_consume_token(S);
- }
- d = skipStatementUntilRightParan();
- jj_consume_token(RPARAN);
- // accept anything between function and a right parenthesis
- String f = convertIdent(n.image);
- String colons = isPseudoElement ? "::" : ":";
- String pseudofn = colons + f + d + ")";
- if (pred == null) {
- {if (true) return pseudofn;}
- } else {
- {if (true) return pred + pseudofn;}
- }
- break;
- default:
- jj_la1[105] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- throw new Error("Missing return statement in function");
- }
+ jj_la1[99] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public String hash(String pred) throws ParseException {
- Token n;
- n = jj_consume_token(HASH);
- String d = n.image;
- if (pred == null) {
- {if (true) return d;}
- } else {
- {if (true) return pred + d;}
- }
- throw new Error("Missing return statement in function");
- }
-
- final public void variable() throws ParseException {
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String hash(String pred) throws ParseException {
+ Token n;
+ n = jj_consume_token(HASH);
+ String d = n.image;
+ if (pred == null) {
+ {
+ if (true) {
+ return d;
+ }
+ }
+ } else {
+ {
+ if (true) {
+ return pred + d;
+ }
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void variable() throws ParseException {
String name;
LexicalUnitImpl exp = null;
boolean guarded = false;
String raw;
- try {
- name = variableName();
- jj_consume_token(COLON);
- label_69:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[106] = jj_gen;
- break label_69;
- }
- jj_consume_token(S);
- }
- exp = expr();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case GUARDED_SYM:
- guarded = guarded();
- break;
- default:
- jj_la1[107] = jj_gen;
- ;
- }
- label_70:
- while (true) {
- jj_consume_token(SEMICOLON);
- label_71:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[108] = jj_gen;
- break label_71;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[109] = jj_gen;
- break label_70;
- }
- }
- documentHandler.variable(name, exp, guarded);
- } catch (JumpException e) {
+ try {
+ name = variableName();
+ jj_consume_token(COLON);
+ label_66: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[100] = jj_gen;
+ break label_66;
+ }
+ jj_consume_token(S);
+ }
+ exp = expr();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case GUARDED_SYM:
+ guarded = guarded();
+ break;
+ default:
+ jj_la1[101] = jj_gen;
+ ;
+ }
+ label_67: while (true) {
+ jj_consume_token(SEMICOLON);
+ label_68: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[102] = jj_gen;
+ break label_68;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[103] = jj_gen;
+ break label_67;
+ }
+ }
+ documentHandler.variable(name, exp, guarded);
+ } catch (JumpException e) {
skipAfterExpression();
- } catch (NumberFormatException e) {
+ } catch (NumberFormatException e) {
if (errorHandler != null) {
errorHandler.error(new CSSParseException("Invalid number "
- + e.getMessage(),
- getLocator(),
- e));
+ + e.getMessage(), getLocator(), e));
}
reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (ParseException e) {
+ } catch (ParseException e) {
if (errorHandler != null) {
if (e.currentToken != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.currentToken.next.beginLine,
- e.currentToken.next.beginColumn-1);
- reportError(li, e);
+ LocatorImpl li = new LocatorImpl(this,
+ e.currentToken.next.beginLine,
+ e.currentToken.next.beginColumn - 1);
+ reportError(li, e);
} else {
- reportError(getLocator(), e);
- }
+ reportError(getLocator(), e);
+ }
skipAfterExpression();
} else {
skipAfterExpression();
}
+ }
}
- }
-
- final public void controlDirective() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IF_SYM:
- ifDirective();
- break;
- case EACH_SYM:
- eachDirective();
- break;
- default:
- jj_la1[110] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
-
- final public void ifContentStatement() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case CONTENT_SYM:
- contentDirective();
- break;
- case INCLUDE_SYM:
- includeDirective();
- break;
- case MEDIA_SYM:
- media();
- break;
- case EXTEND_SYM:
- extendDirective();
- break;
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case DEBUG_SYM:
- case WARN_SYM:
- case IDENT:
- case HASH:
- styleRuleOrDeclarationOrNestedProperties();
- break;
- case KEY_FRAME_SYM:
- keyframes();
- break;
- default:
- jj_la1[111] = jj_gen;
- if (jj_2_3(2147483647)) {
- variable();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case VARIABLE:
- listModifyDirective();
- break;
- case EACH_SYM:
+
+ final public void controlDirective() throws ParseException {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case IF_SYM:
- controlDirective();
- break;
- case ATKEYWORD:
- atRuleDeclaration();
- break;
+ ifDirective();
+ break;
+ case EACH_SYM:
+ eachDirective();
+ break;
default:
- jj_la1[112] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- }
- }
-
- final public void ifDirective() throws ParseException {
- Token n = null;
- String s = null;
- String evaluator = "";
- jj_consume_token(IF_SYM);
- label_72:
- while (true) {
- s = booleanExpressionToken();
- evaluator += s;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- case EQ:
- case PLUS:
- case MINUS:
- case PRECEDES:
- case SUCCEEDS:
- case DIV:
- case ANY:
- case LPARAN:
- case RPARAN:
- case COMPARE:
- case OR:
- case AND:
- case NOT_EQ:
- case IDENT:
- case NUMBER:
- case VARIABLE:
- case CONTAINS:
- ;
- break;
- default:
- jj_la1[113] = jj_gen;
- break label_72;
- }
- }
- jj_consume_token(LBRACE);
- label_73:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[114] = jj_gen;
- break label_73;
- }
- jj_consume_token(S);
- }
- documentHandler.startIfElseDirective();
- documentHandler.ifDirective(evaluator);
- label_74:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case FONT_FACE_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[115] = jj_gen;
- break label_74;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ifContentStatement();
- break;
- case FONT_FACE_SYM:
- fontFace();
- break;
- default:
- jj_la1[116] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_75:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[117] = jj_gen;
- break label_75;
- }
- jj_consume_token(S);
- }
- label_76:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case ELSE_SYM:
- ;
- break;
- default:
- jj_la1[118] = jj_gen;
- break label_76;
- }
- elseDirective();
- }
- documentHandler.endIfElseDirective();
- }
-
- final public void elseDirective() throws ParseException {
- String evaluator = "";
- Token n = null;
- String s = null;
- jj_consume_token(ELSE_SYM);
- label_77:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[119] = jj_gen;
- break label_77;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IF:
- jj_consume_token(IF);
- label_78:
- while (true) {
- s = booleanExpressionToken();
- evaluator += s;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- case EQ:
+ jj_la1[104] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void ifContentStatement() throws ParseException {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case CONTENT_SYM:
+ contentDirective();
+ break;
+ case INCLUDE_SYM:
+ includeDirective();
+ break;
+ case MEDIA_SYM:
+ media();
+ break;
+ case EXTEND_SYM:
+ extendDirective();
+ break;
case PLUS:
- case MINUS:
case PRECEDES:
- case SUCCEEDS:
- case DIV:
+ case SIBLING:
+ case LBRACKET:
case ANY:
- case LPARAN:
- case RPARAN:
- case COMPARE:
- case OR:
- case AND:
- case NOT_EQ:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case DEBUG_SYM:
+ case WARN_SYM:
case IDENT:
- case NUMBER:
- case VARIABLE:
- case CONTAINS:
- ;
- break;
- default:
- jj_la1[120] = jj_gen;
- break label_78;
- }
- }
- break;
- default:
- jj_la1[121] = jj_gen;
- ;
- }
- jj_consume_token(LBRACE);
- label_79:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[122] = jj_gen;
- break label_79;
- }
- jj_consume_token(S);
- }
- if(!evaluator.trim().equals("")){ documentHandler.ifDirective(evaluator); }
- else{ documentHandler.elseDirective(); }
- label_80:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case FONT_FACE_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[123] = jj_gen;
- break label_80;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ifContentStatement();
- break;
- case FONT_FACE_SYM:
- fontFace();
- break;
- default:
- jj_la1[124] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_81:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[125] = jj_gen;
- break label_81;
- }
- jj_consume_token(S);
- }
- }
-
- final public String booleanExpressionToken() throws ParseException {
- Token n = null;
- String s = null;
- if (jj_2_4(2147483647)) {
- s = containsDirective();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case VARIABLE:
- n = jj_consume_token(VARIABLE);
- break;
- case IDENT:
- n = jj_consume_token(IDENT);
- break;
- case NUMBER:
- n = jj_consume_token(NUMBER);
- break;
- case LPARAN:
- n = jj_consume_token(LPARAN);
- break;
- case RPARAN:
- n = jj_consume_token(RPARAN);
- break;
- case PLUS:
- n = jj_consume_token(PLUS);
- break;
- case MINUS:
- n = jj_consume_token(MINUS);
- break;
- case DIV:
- n = jj_consume_token(DIV);
- break;
- case ANY:
- n = jj_consume_token(ANY);
- break;
- case COMPARE:
- n = jj_consume_token(COMPARE);
- break;
- case EQ:
- n = jj_consume_token(EQ);
- break;
- case PRECEDES:
- n = jj_consume_token(PRECEDES);
- break;
- case SUCCEEDS:
- n = jj_consume_token(SUCCEEDS);
- break;
- case OR:
- n = jj_consume_token(OR);
- break;
- case AND:
- n = jj_consume_token(AND);
- break;
- case S:
- n = jj_consume_token(S);
- break;
- case NOT_EQ:
- n = jj_consume_token(NOT_EQ);
- break;
- default:
- jj_la1[126] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- if(n!=null){{if (true) return n.image;}}
- else{{if (true) return s;}}
- throw new Error("Missing return statement in function");
- }
-
- final public void eachDirective() throws ParseException {
- Token var;
- ArrayList<String> list = null;
- String listVariable = null;
- jj_consume_token(EACH_SYM);
- label_82:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[127] = jj_gen;
- break label_82;
- }
- jj_consume_token(S);
- }
- var = jj_consume_token(VARIABLE);
- label_83:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[128] = jj_gen;
- break label_83;
- }
- jj_consume_token(S);
- }
- jj_consume_token(EACH_IN);
- label_84:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[129] = jj_gen;
- break label_84;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- list = stringList();
- documentHandler.startEachDirective(var.image, list);
- break;
- case VARIABLE:
- listVariable = variableName();
- documentHandler.startEachDirective(var.image, listVariable);
- break;
- default:
- jj_la1[130] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- jj_consume_token(LBRACE);
- label_85:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[131] = jj_gen;
- break label_85;
- }
- jj_consume_token(S);
- }
- label_86:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[132] = jj_gen;
- break label_86;
- }
- ifContentStatement();
- }
- jj_consume_token(RBRACE);
- label_87:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[133] = jj_gen;
- break label_87;
- }
- jj_consume_token(S);
- }
- documentHandler.endEachDirective();
- }
-
- final public ArrayList<String > stringList() throws ParseException {
- ArrayList<String > strings = new ArrayList<String >();
- Token input;
- input = jj_consume_token(IDENT);
- label_88:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[134] = jj_gen;
- break label_88;
- }
- jj_consume_token(S);
- }
- strings.add(input.image);
- label_89:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- ;
- break;
- default:
- jj_la1[135] = jj_gen;
- break label_89;
- }
- jj_consume_token(COMMA);
- label_90:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[136] = jj_gen;
- break label_90;
- }
- jj_consume_token(S);
- }
- input = jj_consume_token(IDENT);
- strings.add(input.image);
- label_91:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[137] = jj_gen;
- break label_91;
- }
- jj_consume_token(S);
- }
- }
- {if (true) return strings;}
- throw new Error("Missing return statement in function");
- }
-
- final public void mixinDirective() throws ParseException {
- String name;
- ArrayList<VariableNode> args = null;
- String body;
- jj_consume_token(MIXIN_SYM);
- label_92:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[138] = jj_gen;
- break label_92;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- name = property();
- break;
- case FUNCTION:
- name = functionName();
- args = arglist();
- jj_consume_token(RPARAN);
- label_93:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ case HASH:
+ styleRuleOrDeclarationOrNestedProperties();
+ break;
+ case KEY_FRAME_SYM:
+ keyframes();
+ break;
default:
- jj_la1[139] = jj_gen;
- break label_93;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[140] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- jj_consume_token(LBRACE);
- label_94:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[141] = jj_gen;
- break label_94;
- }
- jj_consume_token(S);
- }
- documentHandler.startMixinDirective(name, args);
- label_95:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case PAGE_SYM:
- case FONT_FACE_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ;
- break;
- default:
- jj_la1[142] = jj_gen;
- break label_95;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case INCLUDE_SYM:
- case DEBUG_SYM:
- case WARN_SYM:
- case EACH_SYM:
- case IF_SYM:
- case EXTEND_SYM:
- case CONTENT_SYM:
- case IDENT:
- case VARIABLE:
- case HASH:
- case MEDIA_SYM:
- case KEY_FRAME_SYM:
- case ATKEYWORD:
- ifContentStatement();
- break;
- case FONT_FACE_SYM:
- fontFace();
- break;
- case PAGE_SYM:
- page();
- break;
- default:
- jj_la1[143] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_96:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[144] = jj_gen;
- break label_96;
- }
- jj_consume_token(S);
- }
- documentHandler.endMixinDirective(name, args);
- }
-
- final public ArrayList<VariableNode> arglist() throws ParseException {
- ArrayList<VariableNode> args = new ArrayList<VariableNode>();
- VariableNode arg;
- boolean hasNonOptionalArgument = false;
- arg = mixinArg();
- label_97:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- ;
- break;
- default:
- jj_la1[145] = jj_gen;
- break label_97;
- }
- jj_consume_token(COMMA);
- label_98:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[105] = jj_gen;
+ if (jj_2_3(2147483647)) {
+ variable();
+ } else {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case VARIABLE:
+ listModifyDirective();
+ break;
+ case EACH_SYM:
+ case IF_SYM:
+ controlDirective();
+ break;
+ case ATKEYWORD:
+ atRuleDeclaration();
+ break;
+ default:
+ jj_la1[106] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ }
+ }
+
+ final public void ifDirective() throws ParseException {
+ Token n = null;
+ String s = null;
+ String evaluator = "";
+ jj_consume_token(IF_SYM);
+ label_69: while (true) {
+ s = booleanExpressionToken();
+ evaluator += s;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ case EQ:
+ case PLUS:
+ case MINUS:
+ case PRECEDES:
+ case SUCCEEDS:
+ case DIV:
+ case ANY:
+ case LPARAN:
+ case RPARAN:
+ case COMPARE:
+ case OR:
+ case AND:
+ case NOT_EQ:
+ case IDENT:
+ case NUMBER:
+ case VARIABLE:
+ case CONTAINS:
+ ;
+ break;
+ default:
+ jj_la1[107] = jj_gen;
+ break label_69;
+ }
+ }
+ jj_consume_token(LBRACE);
+ label_70: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[108] = jj_gen;
+ break label_70;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.startIfElseDirective();
+ documentHandler.ifDirective(evaluator);
+ label_71: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case FONT_FACE_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[109] = jj_gen;
+ break label_71;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ default:
+ jj_la1[110] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_72: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[111] = jj_gen;
+ break label_72;
+ }
+ jj_consume_token(S);
+ }
+ label_73: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case ELSE_SYM:
+ ;
+ break;
+ default:
+ jj_la1[112] = jj_gen;
+ break label_73;
+ }
+ elseDirective();
+ }
+ documentHandler.endIfElseDirective();
+ }
+
+ final public void elseDirective() throws ParseException {
+ String evaluator = "";
+ Token n = null;
+ String s = null;
+ jj_consume_token(ELSE_SYM);
+ label_74: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[113] = jj_gen;
+ break label_74;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IF:
+ jj_consume_token(IF);
+ label_75: while (true) {
+ s = booleanExpressionToken();
+ evaluator += s;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ case EQ:
+ case PLUS:
+ case MINUS:
+ case PRECEDES:
+ case SUCCEEDS:
+ case DIV:
+ case ANY:
+ case LPARAN:
+ case RPARAN:
+ case COMPARE:
+ case OR:
+ case AND:
+ case NOT_EQ:
+ case IDENT:
+ case NUMBER:
+ case VARIABLE:
+ case CONTAINS:
+ ;
+ break;
+ default:
+ jj_la1[114] = jj_gen;
+ break label_75;
+ }
+ }
+ break;
default:
- jj_la1[146] = jj_gen;
- break label_98;
+ jj_la1[115] = jj_gen;
+ ;
+ }
+ jj_consume_token(LBRACE);
+ label_76: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[116] = jj_gen;
+ break label_76;
+ }
+ jj_consume_token(S);
+ }
+ if (!evaluator.trim().equals("")) {
+ documentHandler.ifDirective(evaluator);
+ } else {
+ documentHandler.elseDirective();
+ }
+ label_77: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case FONT_FACE_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[117] = jj_gen;
+ break label_77;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ default:
+ jj_la1[118] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_78: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[119] = jj_gen;
+ break label_78;
+ }
+ jj_consume_token(S);
}
- jj_consume_token(S);
- }
- hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg);
- arg = mixinArg();
}
- hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg);
- {if (true) return args;}
- throw new Error("Missing return statement in function");
- }
- boolean checkMixinForNonOptionalArguments(VariableNode arg, boolean hasNonOptionalArguments) throws ParseException {
- boolean currentArgHasArguments = arg.getExpr() != null && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE && arg.getExpr().getNextLexicalUnit() != null;
+ final public String booleanExpressionToken() throws ParseException {
+ Token n = null;
+ String s = null;
+ if (jj_2_4(2147483647)) {
+ s = containsDirective();
+ } else {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case VARIABLE:
+ n = jj_consume_token(VARIABLE);
+ break;
+ case IDENT:
+ n = jj_consume_token(IDENT);
+ break;
+ case NUMBER:
+ n = jj_consume_token(NUMBER);
+ break;
+ case LPARAN:
+ n = jj_consume_token(LPARAN);
+ break;
+ case RPARAN:
+ n = jj_consume_token(RPARAN);
+ break;
+ case PLUS:
+ n = jj_consume_token(PLUS);
+ break;
+ case MINUS:
+ n = jj_consume_token(MINUS);
+ break;
+ case DIV:
+ n = jj_consume_token(DIV);
+ break;
+ case ANY:
+ n = jj_consume_token(ANY);
+ break;
+ case COMPARE:
+ n = jj_consume_token(COMPARE);
+ break;
+ case EQ:
+ n = jj_consume_token(EQ);
+ break;
+ case PRECEDES:
+ n = jj_consume_token(PRECEDES);
+ break;
+ case SUCCEEDS:
+ n = jj_consume_token(SUCCEEDS);
+ break;
+ case OR:
+ n = jj_consume_token(OR);
+ break;
+ case AND:
+ n = jj_consume_token(AND);
+ break;
+ case S:
+ n = jj_consume_token(S);
+ break;
+ case NOT_EQ:
+ n = jj_consume_token(NOT_EQ);
+ break;
+ default:
+ jj_la1[120] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ if (n != null) {
+ {
+ if (true) {
+ return n.image;
+ }
+ }
+ } else {
+ {
+ if (true) {
+ return s;
+ }
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
- if(currentArgHasArguments)
+ final public void eachDirective() throws ParseException {
+ Token var;
+ ArrayList<String> list = null;
+ String listVariable = null;
+ jj_consume_token(EACH_SYM);
+ label_79: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[121] = jj_gen;
+ break label_79;
+ }
+ jj_consume_token(S);
+ }
+ var = jj_consume_token(VARIABLE);
+ label_80: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[122] = jj_gen;
+ break label_80;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(EACH_IN);
+ label_81: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[123] = jj_gen;
+ break label_81;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ list = stringList();
+ documentHandler.startEachDirective(var.image, list);
+ break;
+ case VARIABLE:
+ listVariable = variableName();
+ documentHandler.startEachDirective(var.image, listVariable);
+ break;
+ default:
+ jj_la1[124] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ jj_consume_token(LBRACE);
+ label_82: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[125] = jj_gen;
+ break label_82;
+ }
+ jj_consume_token(S);
+ }
+ label_83: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[126] = jj_gen;
+ break label_83;
+ }
+ ifContentStatement();
+ }
+ jj_consume_token(RBRACE);
+ label_84: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[127] = jj_gen;
+ break label_84;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.endEachDirective();
+ }
+
+ final public ArrayList<String> stringList() throws ParseException {
+ ArrayList<String> strings = new ArrayList<String>();
+ Token input;
+ input = jj_consume_token(IDENT);
+ label_85: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[128] = jj_gen;
+ break label_85;
+ }
+ jj_consume_token(S);
+ }
+ strings.add(input.image);
+ label_86: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ ;
+ break;
+ default:
+ jj_la1[129] = jj_gen;
+ break label_86;
+ }
+ jj_consume_token(COMMA);
+ label_87: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[130] = jj_gen;
+ break label_87;
+ }
+ jj_consume_token(S);
+ }
+ input = jj_consume_token(IDENT);
+ strings.add(input.image);
+ label_88: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[131] = jj_gen;
+ break label_88;
+ }
+ jj_consume_token(S);
+ }
+ }
{
- if(hasNonOptionalArguments)
- {
- throw new ParseException("Sass Error: Required argument $"+ arg.getName() +" must come before any optional arguments.");
+ if (true) {
+ return strings;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void mixinDirective() throws ParseException {
+ String name;
+ ArrayList<VariableNode> args = null;
+ String body;
+ jj_consume_token(MIXIN_SYM);
+ label_89: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[132] = jj_gen;
+ break label_89;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ name = property();
+ break;
+ case FUNCTION:
+ name = functionName();
+ args = arglist();
+ jj_consume_token(RPARAN);
+ label_90: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[133] = jj_gen;
+ break label_90;
}
- return hasNonOptionalArguments;
- }else
+ jj_consume_token(S);
+ }
+ break;
+ default:
+ jj_la1[134] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ jj_consume_token(LBRACE);
+ label_91: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[135] = jj_gen;
+ break label_91;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.startMixinDirective(name, args);
+ label_92: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case PAGE_SYM:
+ case FONT_FACE_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ;
+ break;
+ default:
+ jj_la1[136] = jj_gen;
+ break label_92;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ case PAGE_SYM:
+ page();
+ break;
+ default:
+ jj_la1[137] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_93: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[138] = jj_gen;
+ break label_93;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.endMixinDirective(name, args);
+ }
+
+ final public ArrayList<VariableNode> arglist() throws ParseException {
+ ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+ VariableNode arg;
+ boolean hasNonOptionalArgument = false;
+ arg = mixinArg();
+ label_94: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ ;
+ break;
+ default:
+ jj_la1[139] = jj_gen;
+ break label_94;
+ }
+ jj_consume_token(COMMA);
+ label_95: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[140] = jj_gen;
+ break label_95;
+ }
+ jj_consume_token(S);
+ }
+ hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg,
+ hasNonOptionalArgument);
+ args.add(arg);
+ arg = mixinArg();
+ }
+ hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg,
+ hasNonOptionalArgument);
+ args.add(arg);
{
- return true;
- }
- }
-
- final public VariableNode mixinArg() throws ParseException {
- String name;
- Token variable = null;
- LexicalUnitImpl first = null;
- LexicalUnitImpl prev = null;
- LexicalUnitImpl next = null;
- name = variableName();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COLON:
- case VARIABLE:
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COLON:
- jj_consume_token(COLON);
- label_99:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
+ if (true) {
+ return args;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ boolean checkMixinForNonOptionalArguments(VariableNode arg,
+ boolean hasNonOptionalArguments) throws ParseException {
+ boolean currentArgHasArguments = arg.getExpr() != null
+ && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE
+ && arg.getExpr().getNextLexicalUnit() != null;
+
+ if (currentArgHasArguments) {
+ if (hasNonOptionalArguments) {
+ throw new ParseException("Sass Error: Required argument $"
+ + arg.getName()
+ + " must come before any optional arguments.");
+ }
+ return hasNonOptionalArguments;
+ } else {
+ return true;
+ }
+ }
+
+ final public VariableNode mixinArg() throws ParseException {
+ String name;
+ Token variable = null;
+ LexicalUnitImpl first = null;
+ LexicalUnitImpl prev = null;
+ LexicalUnitImpl next = null;
+ name = variableName();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COLON:
+ case VARIABLE:
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COLON:
+ jj_consume_token(COLON);
+ label_96: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[141] = jj_gen;
+ break label_96;
+ }
+ jj_consume_token(S);
+ }
+ first = nonVariableTerm(null);
+ prev = first;
+ label_97: while (true) {
+ if (jj_2_5(3)) {
+ ;
+ } else {
+ break label_97;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ jj_consume_token(COMMA);
+ label_98: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[142] = jj_gen;
+ break label_98;
+ }
+ jj_consume_token(S);
+ }
+ break;
+ default:
+ jj_la1[143] = jj_gen;
+ ;
+ }
+ prev = nonVariableTerm(prev);
+ }
+ break;
+ case VARIABLE:
+ variable = jj_consume_token(VARIABLE);
+ first = LexicalUnitImpl.createVariable(token.beginLine,
+ token.beginColumn, prev, variable.image);
+ break;
+ default:
+ jj_la1[144] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
break;
- default:
- jj_la1[147] = jj_gen;
- break label_99;
- }
- jj_consume_token(S);
+ default:
+ jj_la1[145] = jj_gen;
+ ;
}
- first = nonVariableTerm(null);
+ VariableNode arg = new VariableNode(name, first, false);
+ {
+ if (true) {
+ return arg;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public ArrayList<LexicalUnitImpl> argValuelist()
+ throws ParseException {
+ ArrayList<LexicalUnitImpl> args = new ArrayList<LexicalUnitImpl>();
+ LexicalUnitImpl first = null;
+ LexicalUnitImpl next = null;
+ LexicalUnitImpl prev = null;
+ first = term(null);
+ args.add(first);
prev = first;
- label_100:
- while (true) {
- if (jj_2_5(3)) {
- ;
- } else {
- break label_100;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- jj_consume_token(COMMA);
- label_101:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
+ label_99: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ case DOT:
+ case COLON:
+ case TO:
+ case THROUGH:
+ case FROM:
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case URL:
+ case VARIABLE:
+ case PERCENTAGE:
+ case PT:
+ case MM:
+ case CM:
+ case PC:
+ case IN:
+ case PX:
+ case EMS:
+ case LEM:
+ case REM:
+ case EXS:
+ case DEG:
+ case RAD:
+ case GRAD:
+ case MS:
+ case SECOND:
+ case HZ:
+ case KHZ:
+ case DIMEN:
+ case HASH:
+ case UNICODERANGE:
+ case FUNCTION:
;
break;
- default:
+ default:
+ jj_la1[146] = jj_gen;
+ break label_99;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COLON:
+ jj_consume_token(COLON);
+ label_100: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[147] = jj_gen;
+ break label_100;
+ }
+ jj_consume_token(S);
+ }
+ break;
+ default:
jj_la1[148] = jj_gen;
+ ;
+ }
+ next = term(prev);
+ prev.setNextLexicalUnit(next);
+ prev = next;
+ }
+ label_101: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ ;
+ break;
+ default:
+ jj_la1[149] = jj_gen;
break label_101;
- }
- jj_consume_token(S);
}
- break;
- default:
- jj_la1[149] = jj_gen;
- ;
- }
- prev = nonVariableTerm(prev);
- }
- break;
- case VARIABLE:
- variable = jj_consume_token(VARIABLE);
- first = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
- prev, variable.image);
- break;
- default:
- jj_la1[150] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- break;
- default:
- jj_la1[151] = jj_gen;
- ;
+ jj_consume_token(COMMA);
+ label_102: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[150] = jj_gen;
+ break label_102;
+ }
+ jj_consume_token(S);
+ }
+ first = term(null);
+ args.add(first);
+ prev = first;
+ label_103: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ case DOT:
+ case COLON:
+ case TO:
+ case THROUGH:
+ case FROM:
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case URL:
+ case VARIABLE:
+ case PERCENTAGE:
+ case PT:
+ case MM:
+ case CM:
+ case PC:
+ case IN:
+ case PX:
+ case EMS:
+ case LEM:
+ case REM:
+ case EXS:
+ case DEG:
+ case RAD:
+ case GRAD:
+ case MS:
+ case SECOND:
+ case HZ:
+ case KHZ:
+ case DIMEN:
+ case HASH:
+ case UNICODERANGE:
+ case FUNCTION:
+ ;
+ break;
+ default:
+ jj_la1[151] = jj_gen;
+ break label_103;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COLON:
+ jj_consume_token(COLON);
+ label_104: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[152] = jj_gen;
+ break label_104;
+ }
+ jj_consume_token(S);
+ }
+ break;
+ default:
+ jj_la1[153] = jj_gen;
+ ;
+ }
+ next = term(prev);
+ prev.setNextLexicalUnit(next);
+ prev = next;
+ }
+ }
+ {
+ if (true) {
+ return args;
+ }
+ }
+ throw new Error("Missing return statement in function");
}
- VariableNode arg = new VariableNode(name, first, false);
- {if (true) return arg;}
- throw new Error("Missing return statement in function");
- }
-
- final public ArrayList<LexicalUnitImpl> argValuelist() throws ParseException {
- ArrayList<LexicalUnitImpl> args = new ArrayList<LexicalUnitImpl>();
- LexicalUnitImpl first = null;
- LexicalUnitImpl next = null;
- LexicalUnitImpl prev = null;
- first = term(null);
- args.add(first); prev = first;
- label_102:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- case DOT:
- case COLON:
- case TO:
- case THROUGH:
- case FROM:
- case STRING:
- case IDENT:
- case NUMBER:
- case URL:
- case VARIABLE:
- case PERCENTAGE:
- case PT:
- case MM:
- case CM:
- case PC:
- case IN:
- case PX:
- case EMS:
- case LEM:
- case REM:
- case EXS:
- case DEG:
- case RAD:
- case GRAD:
- case MS:
- case SECOND:
- case HZ:
- case KHZ:
- case DIMEN:
- case HASH:
- case UNICODERANGE:
- case FUNCTION:
- ;
- break;
- default:
- jj_la1[152] = jj_gen;
- break label_102;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COLON:
- jj_consume_token(COLON);
- label_103:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[153] = jj_gen;
- break label_103;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[154] = jj_gen;
- ;
- }
- next = term(prev);
- prev.setNextLexicalUnit(next); prev = next;
- }
- label_104:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- ;
- break;
- default:
- jj_la1[155] = jj_gen;
- break label_104;
- }
- jj_consume_token(COMMA);
- label_105:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[156] = jj_gen;
- break label_105;
- }
- jj_consume_token(S);
- }
- first = term(null);
- args.add(first); prev = first;
- label_106:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- case DOT:
- case COLON:
- case TO:
- case THROUGH:
- case FROM:
- case STRING:
+
+ final public void includeDirective() throws ParseException {
+ String name;
+ ArrayList<LexicalUnitImpl> args = null;
+ jj_consume_token(INCLUDE_SYM);
+ label_105: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[154] = jj_gen;
+ break label_105;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
case IDENT:
- case NUMBER:
- case URL:
+ name = property();
+ break;
case VARIABLE:
- case PERCENTAGE:
- case PT:
- case MM:
- case CM:
- case PC:
- case IN:
- case PX:
- case EMS:
- case LEM:
- case REM:
- case EXS:
- case DEG:
- case RAD:
- case GRAD:
- case MS:
- case SECOND:
- case HZ:
- case KHZ:
- case DIMEN:
- case HASH:
- case UNICODERANGE:
+ name = variableName();
+ name = "$" + name;
+ break;
case FUNCTION:
- ;
- break;
+ name = functionName();
+ args = argValuelist();
+ jj_consume_token(RPARAN);
+ label_106: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[155] = jj_gen;
+ break label_106;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[157] = jj_gen;
- break label_106;
+ jj_la1[156] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COLON:
- jj_consume_token(COLON);
- label_107:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ label_107: while (true) {
+ jj_consume_token(SEMICOLON);
+ label_108: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[157] = jj_gen;
+ break label_108;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[158] = jj_gen;
+ break label_107;
+ }
+ }
+ documentHandler.includeDirective(name, args);
+ break;
+ case LBRACE:
+ jj_consume_token(LBRACE);
+ label_109: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[159] = jj_gen;
+ break label_109;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.startIncludeContentBlock(name, args);
+ label_110: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case TO:
+ case FROM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case IDENT:
+ case PERCENTAGE:
+ case HASH:
+ ;
+ break;
+ default:
+ jj_la1[160] = jj_gen;
+ break label_110;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case IDENT:
+ case HASH:
+ styleRuleOrDeclarationOrNestedProperties();
+ break;
+ case TO:
+ case FROM:
+ case PERCENTAGE:
+ keyframeSelector();
+ break;
+ default:
+ jj_la1[161] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_111: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[162] = jj_gen;
+ break label_111;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.endIncludeContentBlock();
+ break;
+ default:
+ jj_la1[163] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public String interpolation() throws ParseException {
+ Token n;
+ n = jj_consume_token(INTERPOLATION);
+ {
+ if (true) {
+ return n.image;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void listModifyDirective() throws ParseException {
+ String list = null;
+ String remove = null;
+ String separator = null;
+ String variable = null;
+ Token n = null;
+ Token type = null;
+ // refactor, remove those 3 LOOKAHEAD(5).
+ n = jj_consume_token(VARIABLE);
+ variable = n.image;
+ label_112: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
- ;
- break;
+ ;
+ break;
+ default:
+ jj_la1[164] = jj_gen;
+ break label_112;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(COLON);
+ label_113: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
default:
- jj_la1[158] = jj_gen;
- break label_107;
+ jj_la1[165] = jj_gen;
+ break label_113;
}
jj_consume_token(S);
- }
- break;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case APPEND:
+ type = jj_consume_token(APPEND);
+ break;
+ case REMOVE:
+ type = jj_consume_token(REMOVE);
+ break;
+ case CONTAINS:
+ type = jj_consume_token(CONTAINS);
+ break;
default:
- jj_la1[159] = jj_gen;
- ;
- }
- next = term(prev);
- prev.setNextLexicalUnit(next); prev = next;
- }
- }
- {if (true) return args;}
- throw new Error("Missing return statement in function");
- }
-
- final public void includeDirective() throws ParseException {
- String name;
- ArrayList<LexicalUnitImpl> args=null;
- jj_consume_token(INCLUDE_SYM);
- label_108:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[160] = jj_gen;
- break label_108;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- name = property();
- break;
- case VARIABLE:
- name = variableName();
- name = "$"+name;
- break;
- case FUNCTION:
- name = functionName();
- args = argValuelist();
- jj_consume_token(RPARAN);
- label_109:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[166] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ label_114: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[167] = jj_gen;
+ break label_114;
+ }
+ jj_consume_token(S);
+ }
+ list = listModifyDirectiveArgs(0);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case RPARAN:
+ jj_consume_token(RPARAN);
+ break;
default:
- jj_la1[161] = jj_gen;
- break label_109;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[162] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- label_110:
- while (true) {
- jj_consume_token(SEMICOLON);
- label_111:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
+ jj_la1[168] = jj_gen;
;
- break;
- default:
- jj_la1[163] = jj_gen;
- break label_111;
- }
- jj_consume_token(S);
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[164] = jj_gen;
- break label_110;
+ jj_consume_token(COMMA);
+ label_115: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[169] = jj_gen;
+ break label_115;
+ }
+ jj_consume_token(S);
}
- }
- documentHandler.includeDirective(name, args);
- break;
- case LBRACE:
- jj_consume_token(LBRACE);
- label_112:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[165] = jj_gen;
- break label_112;
- }
- jj_consume_token(S);
- }
- documentHandler.startIncludeContentBlock(name, args);
- label_113:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case TO:
- case FROM:
- case DEBUG_SYM:
- case WARN_SYM:
- case IDENT:
- case PERCENTAGE:
- case HASH:
- ;
- break;
+ remove = listModifyDirectiveArgs(1);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ jj_consume_token(COMMA);
+ label_116: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[170] = jj_gen;
+ break label_116;
+ }
+ jj_consume_token(S);
+ }
+ n = jj_consume_token(IDENT);
+ separator = n.image;
+ label_117: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[171] = jj_gen;
+ break label_117;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[166] = jj_gen;
- break label_113;
+ jj_la1[172] = jj_gen;
+ ;
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case DEBUG_SYM:
- case WARN_SYM:
- case IDENT:
- case HASH:
- styleRuleOrDeclarationOrNestedProperties();
- break;
- case TO:
- case FROM:
- case PERCENTAGE:
- keyframeSelector();
- break;
- default:
- jj_la1[167] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- jj_consume_token(RBRACE);
- label_114:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[168] = jj_gen;
- break label_114;
- }
- jj_consume_token(S);
- }
- documentHandler.endIncludeContentBlock();
- break;
- default:
- jj_la1[169] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
-
- final public String interpolation() throws ParseException {
- Token n;
- n = jj_consume_token(INTERPOLATION);
- {if (true) return n.image;}
- throw new Error("Missing return statement in function");
- }
-
- final public void listModifyDirective() throws ParseException {
- String list = null;
- String remove = null;
- String separator = null;
- String variable = null;
- Token n = null;
- Token type = null;
- //refactor, remove those 3 LOOKAHEAD(5).
- n = jj_consume_token(VARIABLE);
- variable = n.image;
- label_115:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[170] = jj_gen;
- break label_115;
- }
- jj_consume_token(S);
- }
- jj_consume_token(COLON);
- label_116:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[171] = jj_gen;
- break label_116;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case APPEND:
- type = jj_consume_token(APPEND);
- break;
- case REMOVE:
- type = jj_consume_token(REMOVE);
- break;
- case CONTAINS:
- type = jj_consume_token(CONTAINS);
- break;
- default:
- jj_la1[172] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_117:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[173] = jj_gen;
- break label_117;
- }
- jj_consume_token(S);
- }
- list = listModifyDirectiveArgs(0);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case RPARAN:
- jj_consume_token(RPARAN);
- break;
- default:
- jj_la1[174] = jj_gen;
- ;
- }
- jj_consume_token(COMMA);
- label_118:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[175] = jj_gen;
- break label_118;
- }
- jj_consume_token(S);
- }
- remove = listModifyDirectiveArgs(1);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- jj_consume_token(COMMA);
- label_119:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[176] = jj_gen;
- break label_119;
- }
- jj_consume_token(S);
- }
- n = jj_consume_token(IDENT);
- separator = n.image;
- label_120:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_consume_token(RPARAN);
+ switch (type.kind) {
+ case APPEND:
+ documentHandler.appendDirective(variable, list, remove, separator);
+ break;
+ case REMOVE:
+ documentHandler.removeDirective(variable, list, remove, separator);
+ break;
+ case CONTAINS:
+ if (variable == null) {
+ variable = "$var_" + UUID.randomUUID();
+ }
+ documentHandler
+ .containsDirective(variable, list, remove, separator);
+ break;
default:
- jj_la1[177] = jj_gen;
- break label_120;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[178] = jj_gen;
- ;
- }
- jj_consume_token(RPARAN);
- switch (type.kind) {
- case APPEND:
- documentHandler.appendDirective(variable,list,remove,separator);
- break;
- case REMOVE:
- documentHandler.removeDirective(variable,list,remove,separator);
- break;
- case CONTAINS:
- if(variable == null){
- variable = "$var_"+UUID.randomUUID();
- }
- documentHandler.containsDirective(variable,list,remove,separator);
- break;
- default:
- break;
- }
- label_121:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[179] = jj_gen;
- break label_121;
- }
- jj_consume_token(S);
- }
- jj_consume_token(SEMICOLON);
- label_122:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[180] = jj_gen;
- break label_122;
- }
- jj_consume_token(S);
- }
- }
+ break;
+ }
+ label_118: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[173] = jj_gen;
+ break label_118;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(SEMICOLON);
+ label_119: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[174] = jj_gen;
+ break label_119;
+ }
+ jj_consume_token(S);
+ }
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public void appendDirective() throws ParseException {
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void appendDirective() throws ParseException {
String list = null;
String remove = null;
String separator = null;
String variable = null;
Token n = null;
- n = jj_consume_token(VARIABLE);
- variable = n.image;
- label_123:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[181] = jj_gen;
- break label_123;
- }
- jj_consume_token(S);
- }
- jj_consume_token(COLON);
- label_124:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[182] = jj_gen;
- break label_124;
- }
- jj_consume_token(S);
- }
- jj_consume_token(APPEND);
- label_125:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[183] = jj_gen;
- break label_125;
- }
- jj_consume_token(S);
- }
- list = listModifyDirectiveArgs(0);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case RPARAN:
- jj_consume_token(RPARAN);
- break;
- default:
- jj_la1[184] = jj_gen;
- ;
- }
- jj_consume_token(COMMA);
- label_126:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[185] = jj_gen;
- break label_126;
- }
- jj_consume_token(S);
- }
- remove = listModifyDirectiveArgs(1);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- jj_consume_token(COMMA);
- label_127:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ n = jj_consume_token(VARIABLE);
+ variable = n.image;
+ label_120: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[175] = jj_gen;
+ break label_120;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(COLON);
+ label_121: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[176] = jj_gen;
+ break label_121;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(APPEND);
+ label_122: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[177] = jj_gen;
+ break label_122;
+ }
+ jj_consume_token(S);
+ }
+ list = listModifyDirectiveArgs(0);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case RPARAN:
+ jj_consume_token(RPARAN);
+ break;
default:
- jj_la1[186] = jj_gen;
- break label_127;
- }
- jj_consume_token(S);
- }
- n = jj_consume_token(IDENT);
- separator = n.image;
- label_128:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[178] = jj_gen;
+ ;
+ }
+ jj_consume_token(COMMA);
+ label_123: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[179] = jj_gen;
+ break label_123;
+ }
+ jj_consume_token(S);
+ }
+ remove = listModifyDirectiveArgs(1);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ jj_consume_token(COMMA);
+ label_124: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[180] = jj_gen;
+ break label_124;
+ }
+ jj_consume_token(S);
+ }
+ n = jj_consume_token(IDENT);
+ separator = n.image;
+ label_125: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[181] = jj_gen;
+ break label_125;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[187] = jj_gen;
- break label_128;
+ jj_la1[182] = jj_gen;
+ ;
}
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[188] = jj_gen;
- ;
+ jj_consume_token(RPARAN);
+ documentHandler.appendDirective(variable, list, remove, separator);
}
- jj_consume_token(RPARAN);
- documentHandler.appendDirective(variable,list,remove,separator);
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public void removeDirective() throws ParseException {
- String list = null;
- String remove = null;
- String separator = null;
- String variable = null;
- Token n = null;
- n = jj_consume_token(VARIABLE);
- variable = n.image;
- label_129:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[189] = jj_gen;
- break label_129;
- }
- jj_consume_token(S);
- }
- jj_consume_token(COLON);
- label_130:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[190] = jj_gen;
- break label_130;
- }
- jj_consume_token(S);
- }
- jj_consume_token(REMOVE);
- label_131:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[191] = jj_gen;
- break label_131;
- }
- jj_consume_token(S);
- }
- list = listModifyDirectiveArgs(0);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case RPARAN:
- jj_consume_token(RPARAN);
- break;
- default:
- jj_la1[192] = jj_gen;
- ;
- }
- jj_consume_token(COMMA);
- label_132:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[193] = jj_gen;
- break label_132;
- }
- jj_consume_token(S);
- }
- remove = listModifyDirectiveArgs(1);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- jj_consume_token(COMMA);
- label_133:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void removeDirective() throws ParseException {
+ String list = null;
+ String remove = null;
+ String separator = null;
+ String variable = null;
+ Token n = null;
+ n = jj_consume_token(VARIABLE);
+ variable = n.image;
+ label_126: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[183] = jj_gen;
+ break label_126;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(COLON);
+ label_127: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[184] = jj_gen;
+ break label_127;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(REMOVE);
+ label_128: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[185] = jj_gen;
+ break label_128;
+ }
+ jj_consume_token(S);
+ }
+ list = listModifyDirectiveArgs(0);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case RPARAN:
+ jj_consume_token(RPARAN);
+ break;
default:
- jj_la1[194] = jj_gen;
- break label_133;
- }
- jj_consume_token(S);
- }
- n = jj_consume_token(IDENT);
- separator = n.image;
- label_134:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[186] = jj_gen;
+ ;
+ }
+ jj_consume_token(COMMA);
+ label_129: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[187] = jj_gen;
+ break label_129;
+ }
+ jj_consume_token(S);
+ }
+ remove = listModifyDirectiveArgs(1);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ jj_consume_token(COMMA);
+ label_130: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[188] = jj_gen;
+ break label_130;
+ }
+ jj_consume_token(S);
+ }
+ n = jj_consume_token(IDENT);
+ separator = n.image;
+ label_131: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[189] = jj_gen;
+ break label_131;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[195] = jj_gen;
- break label_134;
+ jj_la1[190] = jj_gen;
+ ;
}
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[196] = jj_gen;
- ;
+ jj_consume_token(RPARAN);
+ documentHandler.removeDirective(variable, list, remove, separator);
}
- jj_consume_token(RPARAN);
- documentHandler.removeDirective(variable,list,remove,separator);
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public String containsDirective() throws ParseException {
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public String containsDirective() throws ParseException {
String list = null;
String remove = null;
String separator = null;
String variable = null;
Token n = null;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case VARIABLE:
- n = jj_consume_token(VARIABLE);
- variable = n.image;
- label_135:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[197] = jj_gen;
- break label_135;
- }
- jj_consume_token(S);
- }
- jj_consume_token(COLON);
- label_136:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case VARIABLE:
+ n = jj_consume_token(VARIABLE);
+ variable = n.image;
+ label_132: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[191] = jj_gen;
+ break label_132;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(COLON);
+ label_133: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[192] = jj_gen;
+ break label_133;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[198] = jj_gen;
- break label_136;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[199] = jj_gen;
- ;
- }
- jj_consume_token(CONTAINS);
- label_137:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[200] = jj_gen;
- break label_137;
- }
- jj_consume_token(S);
- }
- list = listModifyDirectiveArgs(0);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case RPARAN:
- jj_consume_token(RPARAN);
- break;
- default:
- jj_la1[201] = jj_gen;
- ;
- }
- jj_consume_token(COMMA);
- label_138:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[202] = jj_gen;
- break label_138;
- }
- jj_consume_token(S);
- }
- remove = listModifyDirectiveArgs(1);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- jj_consume_token(COMMA);
- label_139:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[193] = jj_gen;
+ ;
+ }
+ jj_consume_token(CONTAINS);
+ label_134: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[194] = jj_gen;
+ break label_134;
+ }
+ jj_consume_token(S);
+ }
+ list = listModifyDirectiveArgs(0);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case RPARAN:
+ jj_consume_token(RPARAN);
+ break;
default:
- jj_la1[203] = jj_gen;
- break label_139;
- }
- jj_consume_token(S);
- }
- n = jj_consume_token(IDENT);
- separator = n.image;
- label_140:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
+ jj_la1[195] = jj_gen;
+ ;
+ }
+ jj_consume_token(COMMA);
+ label_135: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[196] = jj_gen;
+ break label_135;
+ }
+ jj_consume_token(S);
+ }
+ remove = listModifyDirectiveArgs(1);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ jj_consume_token(COMMA);
+ label_136: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[197] = jj_gen;
+ break label_136;
+ }
+ jj_consume_token(S);
+ }
+ n = jj_consume_token(IDENT);
+ separator = n.image;
+ label_137: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[198] = jj_gen;
+ break label_137;
+ }
+ jj_consume_token(S);
+ }
+ break;
default:
- jj_la1[204] = jj_gen;
- break label_140;
- }
- jj_consume_token(S);
- }
- break;
- default:
- jj_la1[205] = jj_gen;
- ;
- }
- jj_consume_token(RPARAN);
- /*
- *if it is not in the form like "$contains : contains($items, .v-button);"
- *for example in @if, like "@if (contains(a b c, b))", then create a temp
- *variable for contains(a b c, b);
- */
- if(variable == null){
- variable = "$var_"+UUID.randomUUID();
- }
- documentHandler.containsDirective(variable,list,remove,separator);
- {if (true) return variable;}
- throw new Error("Missing return statement in function");
- }
-
- String listModifyDirectiveArgs(int nest) throws ParseException {
+ jj_la1[199] = jj_gen;
+ ;
+ }
+ jj_consume_token(RPARAN);
+ /*
+ * if it is not in the form like
+ * "$contains : contains($items, .v-button);"for example in @if, like
+ * "@if (contains(a b c, b))", then create a tempvariable for contains(a
+ * b c, b);
+ */
+ if (variable == null) {
+ variable = "$var_" + UUID.randomUUID();
+ }
+ documentHandler.containsDirective(variable, list, remove, separator);
+ {
+ if (true) {
+ return variable;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ String listModifyDirectiveArgs(int nest) throws ParseException {
String list = "";
int nesting = nest;
Token t = null;
- while(true)
- {
- t = getToken(1);
- String s = t.image;
- if(t.kind == VARIABLE||t.kind == IDENT)
- {
- list += s;
- }else if(s.toLowerCase().equals("auto")||s.toLowerCase().equals("space")||s.toLowerCase().equals("comma"))
- {
- int i = 2;
- Token temp = getToken(i);
- boolean isLast = true;
- while(temp.kind != SEMICOLON)
- {
- if(temp.kind != RPARAN || temp.kind != S)
- {
- isLast = false;
- }
- i++;
- temp = getToken(i);
- }
+ while (true) {
+ t = getToken(1);
+ String s = t.image;
+ if (t.kind == VARIABLE || t.kind == IDENT) {
+ list += s;
+ } else if (s.toLowerCase().equals("auto")
+ || s.toLowerCase().equals("space")
+ || s.toLowerCase().equals("comma")) {
+ int i = 2;
+ Token temp = getToken(i);
+ boolean isLast = true;
+ while (temp.kind != SEMICOLON) {
+ if (temp.kind != RPARAN || temp.kind != S) {
+ isLast = false;
+ }
+ i++;
+ temp = getToken(i);
+ }
- if(isLast)
- {
- return list;
- }
+ if (isLast) {
+ return list;
+ }
+ } else if (t.kind == STRING) {
+ list += s.substring(1, s.length()).substring(0, s.length() - 2);
+
+ } else if (t.kind == LPARAN) {
+ nesting++;
+ if (nesting > nest + 1) {
+ throw new CSSParseException(
+ "Only one ( ) pair per parameter allowed",
+ getLocator());
+ }
+ } else if (t.kind == RPARAN) {
+ nesting--;
+ if (nesting == 0) {
+ return list;
+ }
+ } else if (t.kind == COMMA) {
+ if (nesting == nest) {
+ return list;
+ } else {
+ list += ",";
}
- else if(t.kind == STRING)
- {
- list += s.substring(1,s.length()).substring(0,s.length()-2);
- }else if(t.kind == LPARAN)
- {
- nesting++;
- if(nesting > nest+1)
- {
- throw new CSSParseException("Only one ( ) pair per parameter allowed", getLocator());
- }
- }else if(t.kind == RPARAN)
- {
- nesting--;
- if(nesting == 0)
- {
- return list;
- }
- } else if(t.kind == COMMA)
- {
- if(nesting == nest)
- {
- return list;
- }else
- {
- list += ",";
- }
+ } else if (t.kind == S) {
+ list += " ";
+ } else if (t.kind == LBRACE) {
+ throw new CSSParseException("Invalid token,'{' found",
+ getLocator());
+ }
- }else if(t.kind == S)
- {
- list += " ";
- } else if(t.kind == LBRACE)
- {
- throw new CSSParseException("Invalid token,'{' found", getLocator());
- }
+ getNextToken();
+ }
+ }
- getNextToken();
+ final public Node returnDirective() throws ParseException {
+ String raw;
+ raw = skipStatement();
+ {
+ if (true) {
+ return null;
+ }
}
- }
-
- final public Node returnDirective() throws ParseException {
- String raw;
- raw = skipStatement();
- {if (true) return null;}
- throw new Error("Missing return statement in function");
- }
-
- final public void debuggingDirective() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DEBUG_SYM:
- debugDirective();
- break;
- case WARN_SYM:
- warnDirective();
- break;
- default:
- jj_la1[206] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
-
- final public void debugDirective() throws ParseException {
- jj_consume_token(DEBUG_SYM);
- String content = skipStatementUntilSemiColon();
- // TODO should evaluate the content expression, call documentHandler.debugDirective() etc.
- System.out.println(content);
- label_141:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[207] = jj_gen;
- break label_141;
- }
- jj_consume_token(S);
- }
- }
-
- final public void warnDirective() throws ParseException {
- jj_consume_token(WARN_SYM);
- String content = skipStatementUntilSemiColon();
- // TODO should evaluate the content expression, call documentHandler.warnDirective() etc.
- System.err.println(content);
- label_142:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[208] = jj_gen;
- break label_142;
- }
- jj_consume_token(S);
- }
- }
-
- final public Node forDirective() throws ParseException {
- String var;
- String from;
- String to;
- boolean exclusive;
- String body;
- Token tok;
- var = variableName();
- int[] toThrough = {TO, THROUGH};
- from = skipStatementUntil(toThrough);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case TO:
- tok = jj_consume_token(TO);
- exclusive = true;
- break;
- case THROUGH:
- tok = jj_consume_token(THROUGH);
- exclusive = false;
- break;
- default:
- jj_la1[209] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- to = skipStatementUntilLeftBrace();
- label_143:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[210] = jj_gen;
- break label_143;
- }
- jj_consume_token(S);
- }
- body = skipStatement();
- {if (true) return documentHandler.forDirective(var, from, to, exclusive, body);}
- throw new Error("Missing return statement in function");
- }
-
- final public Node whileDirective() throws ParseException {
- String condition;
- String body;
- condition = skipStatementUntilLeftBrace();
- body = skipStatement();
- {if (true) return documentHandler.whileDirective(condition, body);}
- throw new Error("Missing return statement in function");
- }
-
- final public void extendDirective() throws ParseException {
- ArrayList<String> list;
- jj_consume_token(EXTEND_SYM);
- label_144:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[211] = jj_gen;
- break label_144;
- }
- jj_consume_token(S);
- }
- list = selectorList();
- label_145:
- while (true) {
- jj_consume_token(SEMICOLON);
- label_146:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[212] = jj_gen;
- break label_146;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[213] = jj_gen;
- break label_145;
- }
- }
- documentHandler.extendDirective(list);
- }
-
- final public void contentDirective() throws ParseException {
- jj_consume_token(CONTENT_SYM);
- label_147:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[214] = jj_gen;
- break label_147;
- }
- jj_consume_token(S);
- }
- label_148:
- while (true) {
- jj_consume_token(SEMICOLON);
- label_149:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[215] = jj_gen;
- break label_149;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[216] = jj_gen;
- break label_148;
- }
- }
- documentHandler.contentDirective();
- }
-
- Node importDirective() throws ParseException {
- return null;
- }
-
- Node charsetDirective() throws ParseException {
- return null;
- }
-
- Node mozDocumentDirective() throws ParseException {
- return null;
- }
-
- Node supportsDirective() throws ParseException {
- return null;
- }
-
- final public void nestedProperties() throws ParseException {
- String name;
-LexicalUnit exp;
- name = property();
- jj_consume_token(COLON);
- label_150:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[217] = jj_gen;
- break label_150;
- }
- jj_consume_token(S);
- }
- jj_consume_token(LBRACE);
- label_151:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[218] = jj_gen;
- break label_151;
- }
- jj_consume_token(S);
- }
- documentHandler.startNestedProperties(name);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[219] = jj_gen;
- ;
- }
- label_152:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[220] = jj_gen;
- break label_152;
- }
- jj_consume_token(SEMICOLON);
- label_153:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[221] = jj_gen;
- break label_153;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[222] = jj_gen;
- ;
- }
- }
- jj_consume_token(RBRACE);
- documentHandler.endNestedProperties(name);
- label_154:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[223] = jj_gen;
- break label_154;
- }
- jj_consume_token(S);
- }
- }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public void styleRuleOrDeclarationOrNestedProperties() throws ParseException {
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DEBUG_SYM:
- case WARN_SYM:
- debuggingDirective();
- break;
- default:
- jj_la1[224] = jj_gen;
- if (jj_2_6(2147483647)) {
- styleRule();
- } else if (jj_2_7(3)) {
- declarationOrNestedProperties();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case IDENT:
- case HASH:
- styleRule();
+ final public void debuggingDirective() throws ParseException {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case DEBUG_SYM:
+ debugDirective();
+ break;
+ case WARN_SYM:
+ warnDirective();
break;
- default:
- jj_la1[225] = jj_gen;
+ default:
+ jj_la1[200] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
- }
- }
- }
- } catch (JumpException e) {
- skipAfterExpression();
- // reportWarningSkipText(getLocator(), skipAfterExpression());
-
- } catch (ParseException e) {
- if (errorHandler != null) {
- if (e.currentToken != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.currentToken.next.beginLine,
- e.currentToken.next.beginColumn-1);
- reportError(li, e);
- } else {
- reportError(getLocator(), e);
- }
- skipAfterExpression();
- /*
- LocatorImpl loc = (LocatorImpl) getLocator();
- loc.column--;
- reportWarningSkipText(loc, skipAfterExpression());
- */
- } else {
- skipAfterExpression();
- }
+ }
}
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public void declarationOrNestedProperties() throws ParseException {
- boolean important = false;
- String name;
- LexicalUnitImpl exp;
- Token save;
- String comment = null;
- try {
- name = property();
- save = token;
- jj_consume_token(COLON);
- label_155:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[226] = jj_gen;
- break label_155;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- case DOT:
- case TO:
- case THROUGH:
- case FROM:
- case STRING:
- case IDENT:
- case NUMBER:
- case URL:
- case VARIABLE:
- case PERCENTAGE:
- case PT:
- case MM:
- case CM:
- case PC:
- case IN:
- case PX:
- case EMS:
- case LEM:
- case REM:
- case EXS:
- case DEG:
- case RAD:
- case GRAD:
- case MS:
- case SECOND:
- case HZ:
- case KHZ:
- case DIMEN:
- case HASH:
- case UNICODERANGE:
- case FUNCTION:
- exp = expr();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IMPORTANT_SYM:
- important = prio();
- break;
- default:
- jj_la1[227] = jj_gen;
- ;
- }
- Token next = getToken(1);
- if(next.kind == SEMICOLON || next.kind == RBRACE){
- while(next.kind == SEMICOLON){
- skipStatement();
- next = getToken(1);
- }
- //only add special token kept for sprites '/**'
- if(token.specialToken!=null && token.specialToken!=null && token.specialToken.image.startsWith("/**")){
- documentHandler.property(name, exp, important, token.specialToken.image);
- }else{
- documentHandler.property(name, exp, important, null);
- }
- }
- break;
- case LBRACE:
- jj_consume_token(LBRACE);
- label_156:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
+ final public void debugDirective() throws ParseException {
+ jj_consume_token(DEBUG_SYM);
+ String content = skipStatementUntilSemiColon();
+ // TODO should evaluate the content expression, call
+ // documentHandler.debugDirective() etc.
+ System.out.println(content);
+ label_138: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[201] = jj_gen;
+ break label_138;
+ }
+ jj_consume_token(S);
+ }
+ }
+
+ final public void warnDirective() throws ParseException {
+ jj_consume_token(WARN_SYM);
+ String content = skipStatementUntilSemiColon();
+ // TODO should evaluate the content expression, call
+ // documentHandler.warnDirective() etc.
+ System.err.println(content);
+ label_139: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[202] = jj_gen;
+ break label_139;
+ }
+ jj_consume_token(S);
+ }
+ }
+
+ final public Node forDirective() throws ParseException {
+ String var;
+ String from;
+ String to;
+ boolean exclusive;
+ String body;
+ Token tok;
+ var = variableName();
+ int[] toThrough = { TO, THROUGH };
+ from = skipStatementUntil(toThrough);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case TO:
+ tok = jj_consume_token(TO);
+ exclusive = true;
+ break;
+ case THROUGH:
+ tok = jj_consume_token(THROUGH);
+ exclusive = false;
break;
- default:
- jj_la1[228] = jj_gen;
- break label_156;
- }
- jj_consume_token(S);
- }
- documentHandler.startNestedProperties(name);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
default:
- jj_la1[229] = jj_gen;
- ;
+ jj_la1[203] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- label_157:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[230] = jj_gen;
- break label_157;
- }
- jj_consume_token(SEMICOLON);
- label_158:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ to = skipStatementUntilLeftBrace();
+ label_140: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[204] = jj_gen;
+ break label_140;
+ }
+ jj_consume_token(S);
+ }
+ body = skipStatement();
+ {
+ if (true) {
+ return documentHandler.forDirective(var, from, to, exclusive,
+ body);
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public Node whileDirective() throws ParseException {
+ String condition;
+ String body;
+ condition = skipStatementUntilLeftBrace();
+ body = skipStatement();
+ {
+ if (true) {
+ return documentHandler.whileDirective(condition, body);
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void extendDirective() throws ParseException {
+ ArrayList<String> list;
+ jj_consume_token(EXTEND_SYM);
+ label_141: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[205] = jj_gen;
+ break label_141;
+ }
+ jj_consume_token(S);
+ }
+ list = selectorList();
+ label_142: while (true) {
+ jj_consume_token(SEMICOLON);
+ label_143: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[206] = jj_gen;
+ break label_143;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[207] = jj_gen;
+ break label_142;
+ }
+ }
+ documentHandler.extendDirective(list);
+ }
+
+ final public void contentDirective() throws ParseException {
+ jj_consume_token(CONTENT_SYM);
+ label_144: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[208] = jj_gen;
+ break label_144;
+ }
+ jj_consume_token(S);
+ }
+ label_145: while (true) {
+ jj_consume_token(SEMICOLON);
+ label_146: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[209] = jj_gen;
+ break label_146;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[210] = jj_gen;
+ break label_145;
+ }
+ }
+ documentHandler.contentDirective();
+ }
+
+ Node importDirective() throws ParseException {
+ return null;
+ }
+
+ Node charsetDirective() throws ParseException {
+ return null;
+ }
+
+ Node mozDocumentDirective() throws ParseException {
+ return null;
+ }
+
+ Node supportsDirective() throws ParseException {
+ return null;
+ }
+
+ final public void nestedProperties() throws ParseException {
+ String name;
+ LexicalUnit exp;
+ name = property();
+ jj_consume_token(COLON);
+ label_147: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[211] = jj_gen;
+ break label_147;
+ }
+ jj_consume_token(S);
+ }
+ jj_consume_token(LBRACE);
+ label_148: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
- ;
- break;
+ ;
+ break;
default:
- jj_la1[231] = jj_gen;
- break label_158;
+ jj_la1[212] = jj_gen;
+ break label_148;
}
jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
+ }
+ documentHandler.startNestedProperties(name);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
declaration();
break;
- default:
- jj_la1[232] = jj_gen;
+ default:
+ jj_la1[213] = jj_gen;
;
- }
+ }
+ label_149: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[214] = jj_gen;
+ break label_149;
+ }
+ jj_consume_token(SEMICOLON);
+ label_150: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[215] = jj_gen;
+ break label_150;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[216] = jj_gen;
+ ;
+ }
}
jj_consume_token(RBRACE);
- label_159:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[233] = jj_gen;
- break label_159;
- }
- jj_consume_token(S);
- }
- documentHandler.endNestedProperties(name);
- break;
- default:
- jj_la1[234] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- } catch (JumpException e) {
- skipAfterExpression();
- // reportWarningSkipText(getLocator(), skipAfterExpression());
-
- } catch (NumberFormatException e) {
- if (errorHandler != null) {
- errorHandler.error(new CSSParseException("Invalid number "
- + e.getMessage(),
- getLocator(),
- e));
- }
- reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (ParseException e) {
- if (errorHandler != null) {
- if (e.currentToken != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.currentToken.next.beginLine,
- e.currentToken.next.beginColumn-1);
- reportError(li, e);
- } else {
- reportError(getLocator(), e);
- }
- skipAfterExpression();
- /*
- LocatorImpl loc = (LocatorImpl) getLocator();
- loc.column--;
- reportWarningSkipText(loc, skipAfterExpression());
- */
- } else {
- skipAfterExpression();
- }
+ documentHandler.endNestedProperties(name);
+ label_151: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[217] = jj_gen;
+ break label_151;
+ }
+ jj_consume_token(S);
+ }
}
- }
-/**
- * @exception ParseException exception during the parse
- */
- final public void declaration() throws ParseException {
- boolean important = false;
- String name;
- LexicalUnit exp;
- Token save;
- try {
- name = property();
- save = token;
- jj_consume_token(COLON);
- label_160:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[235] = jj_gen;
- break label_160;
- }
- jj_consume_token(S);
- }
- exp = expr();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IMPORTANT_SYM:
- important = prio();
- break;
- default:
- jj_la1[236] = jj_gen;
- ;
- }
- documentHandler.property(name, exp, important);
- } catch (JumpException e) {
- skipAfterExpression();
- // reportWarningSkipText(getLocator(), skipAfterExpression());
-
- } catch (NumberFormatException e) {
- if (errorHandler != null) {
- errorHandler.error(new CSSParseException("Invalid number "
- + e.getMessage(),
- getLocator(),
- e));
- }
- reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (ParseException e) {
- if (errorHandler != null) {
- if (e.currentToken != null) {
- LocatorImpl li = new LocatorImpl(this,
- e.currentToken.next.beginLine,
- e.currentToken.next.beginColumn-1);
- reportError(li, e);
- } else {
- reportError(getLocator(), e);
- }
- skipAfterExpression();
- /*
- LocatorImpl loc = (LocatorImpl) getLocator();
- loc.column--;
- reportWarningSkipText(loc, skipAfterExpression());
- */
- } else {
- skipAfterExpression();
- }
- }
- }
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void styleRuleOrDeclarationOrNestedProperties()
+ throws ParseException {
+ try {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case DEBUG_SYM:
+ case WARN_SYM:
+ debuggingDirective();
+ break;
+ default:
+ jj_la1[218] = jj_gen;
+ if (jj_2_6(2147483647)) {
+ styleRule();
+ } else if (jj_2_7(3)) {
+ declarationOrNestedProperties();
+ } else {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case IDENT:
+ case HASH:
+ styleRule();
+ break;
+ default:
+ jj_la1[219] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ }
+ } catch (JumpException e) {
+ skipAfterExpression();
+ // reportWarningSkipText(getLocator(), skipAfterExpression());
-/**
- * @exception ParseException exception during the parse
- */
- final public boolean prio() throws ParseException {
- jj_consume_token(IMPORTANT_SYM);
- label_161:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[237] = jj_gen;
- break label_161;
- }
- jj_consume_token(S);
- }
- {if (true) return true;}
- throw new Error("Missing return statement in function");
- }
-
- final public boolean guarded() throws ParseException {
- jj_consume_token(GUARDED_SYM);
- label_162:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[238] = jj_gen;
- break label_162;
- }
- jj_consume_token(S);
- }
- {if (true) return true;}
- throw new Error("Missing return statement in function");
- }
+ } catch (ParseException e) {
+ if (errorHandler != null) {
+ if (e.currentToken != null) {
+ LocatorImpl li = new LocatorImpl(this,
+ e.currentToken.next.beginLine,
+ e.currentToken.next.beginColumn - 1);
+ reportError(li, e);
+ } else {
+ reportError(getLocator(), e);
+ }
+ skipAfterExpression();
+ /*
+ * LocatorImpl loc = (LocatorImpl) getLocator(); loc.column--;
+ * reportWarningSkipText(loc, skipAfterExpression());
+ */
+ } else {
+ skipAfterExpression();
+ }
+ }
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public LexicalUnitImpl operator(LexicalUnitImpl prev) throws ParseException {
- Token n;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case COMMA:
- /* (comments copied from basic_arithmetics.scss)
- *supports:
- * 1. standard arithmetic operations (+, -, *, /, %)
- * 2. / is treated as css operator, unless one of its operands is variable or there is another binary arithmetic operator
- *limits:
- * 1. cannot mix arithmetic and css operations, e.g. "margin: 1px + 3px 2px" will fail
- * 2. space between add and minus operator and their following operand is mandatory. e.g. "1 + 2" is valid, "1+2" is not
- * 3. parenthesis is not supported now.
- */
- n = jj_consume_token(COMMA);
- label_163:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[239] = jj_gen;
- break label_163;
- }
- jj_consume_token(S);
- }
- {if (true) return LexicalUnitImpl.createComma(n.beginLine,
- n.beginColumn,
- prev);}
- break;
- case DIV:
- n = jj_consume_token(DIV);
- label_164:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[240] = jj_gen;
- break label_164;
- }
- jj_consume_token(S);
- }
- {if (true) return LexicalUnitImpl.createSlash(n.beginLine,
- n.beginColumn,
- prev);}
- break;
- case ANY:
- n = jj_consume_token(ANY);
- label_165:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[241] = jj_gen;
- break label_165;
- }
- jj_consume_token(S);
- }
- {if (true) return LexicalUnitImpl.createMultiply(n.beginLine,
- n.beginColumn,
- prev);}
- break;
- case MOD:
- n = jj_consume_token(MOD);
- label_166:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[242] = jj_gen;
- break label_166;
- }
- jj_consume_token(S);
- }
- {if (true) return LexicalUnitImpl.createModulo(n.beginLine,
- n.beginColumn,
- prev);}
- break;
- case PLUS:
- n = jj_consume_token(PLUS);
- label_167:
- while (true) {
- jj_consume_token(S);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[243] = jj_gen;
- break label_167;
- }
- }
- {if (true) return LexicalUnitImpl.createAdd(n.beginLine,
- n.beginColumn,
- prev);}
- break;
- case MINUS:
- n = jj_consume_token(MINUS);
- label_168:
- while (true) {
- jj_consume_token(S);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[244] = jj_gen;
- break label_168;
- }
- }
- {if (true) return LexicalUnitImpl.createMinus(n.beginLine,
- n.beginColumn,
- prev);}
- break;
- default:
- jj_la1[245] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- throw new Error("Missing return statement in function");
- }
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void declarationOrNestedProperties() throws ParseException {
+ boolean important = false;
+ String name;
+ LexicalUnitImpl exp;
+ Token save;
+ String comment = null;
+ try {
+ name = property();
+ save = token;
+ jj_consume_token(COLON);
+ label_152: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[220] = jj_gen;
+ break label_152;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ case DOT:
+ case TO:
+ case THROUGH:
+ case FROM:
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case URL:
+ case VARIABLE:
+ case PERCENTAGE:
+ case PT:
+ case MM:
+ case CM:
+ case PC:
+ case IN:
+ case PX:
+ case EMS:
+ case LEM:
+ case REM:
+ case EXS:
+ case DEG:
+ case RAD:
+ case GRAD:
+ case MS:
+ case SECOND:
+ case HZ:
+ case KHZ:
+ case DIMEN:
+ case HASH:
+ case UNICODERANGE:
+ case FUNCTION:
+ exp = expr();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IMPORTANT_SYM:
+ important = prio();
+ break;
+ default:
+ jj_la1[221] = jj_gen;
+ ;
+ }
+ Token next = getToken(1);
+ if (next.kind == SEMICOLON || next.kind == RBRACE) {
+ while (next.kind == SEMICOLON) {
+ skipStatement();
+ next = getToken(1);
+ }
+ // only add special token kept for sprites '/**'
+ if (token.specialToken != null
+ && token.specialToken != null
+ && token.specialToken.image.startsWith("/**")) {
+ documentHandler.property(name, exp, important,
+ token.specialToken.image);
+ } else {
+ documentHandler.property(name, exp, important, null);
+ }
+ }
+ break;
+ case LBRACE:
+ jj_consume_token(LBRACE);
+ label_153: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[222] = jj_gen;
+ break label_153;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.startNestedProperties(name);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[223] = jj_gen;
+ ;
+ }
+ label_154: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[224] = jj_gen;
+ break label_154;
+ }
+ jj_consume_token(SEMICOLON);
+ label_155: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[225] = jj_gen;
+ break label_155;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[226] = jj_gen;
+ ;
+ }
+ }
+ jj_consume_token(RBRACE);
+ label_156: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[227] = jj_gen;
+ break label_156;
+ }
+ jj_consume_token(S);
+ }
+ documentHandler.endNestedProperties(name);
+ break;
+ default:
+ jj_la1[228] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (JumpException e) {
+ skipAfterExpression();
+ // reportWarningSkipText(getLocator(), skipAfterExpression());
-/**
- * @exception ParseException exception during the parse
- */
- final public LexicalUnitImpl expr() throws ParseException {
- LexicalUnitImpl first, res;
- char op;
- first = term(null);
- res = first;
- label_169:
- while (true) {
- if (jj_2_8(2)) {
- ;
- } else {
- break label_169;
- }
- if (jj_2_9(2)) {
- res = operator(res);
- } else {
- ;
- }
- res = term(res);
- }
- {if (true) return first;}
- throw new Error("Missing return statement in function");
- }
+ } catch (NumberFormatException e) {
+ if (errorHandler != null) {
+ errorHandler.error(new CSSParseException("Invalid number "
+ + e.getMessage(), getLocator(), e));
+ }
+ reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (ParseException e) {
+ if (errorHandler != null) {
+ if (e.currentToken != null) {
+ LocatorImpl li = new LocatorImpl(this,
+ e.currentToken.next.beginLine,
+ e.currentToken.next.beginColumn - 1);
+ reportError(li, e);
+ } else {
+ reportError(getLocator(), e);
+ }
+ skipAfterExpression();
+ /*
+ * LocatorImpl loc = (LocatorImpl) getLocator(); loc.column--;
+ * reportWarningSkipText(loc, skipAfterExpression());
+ */
+ } else {
+ skipAfterExpression();
+ }
+ }
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public char unaryOperator() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case MINUS:
- jj_consume_token(MINUS);
- {if (true) return '-';}
- break;
- case PLUS:
- jj_consume_token(PLUS);
- {if (true) return '+';}
- break;
- default:
- jj_la1[246] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- throw new Error("Missing return statement in function");
- }
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public void declaration() throws ParseException {
+ boolean important = false;
+ String name;
+ LexicalUnit exp;
+ Token save;
+ try {
+ name = property();
+ save = token;
+ jj_consume_token(COLON);
+ label_157: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[229] = jj_gen;
+ break label_157;
+ }
+ jj_consume_token(S);
+ }
+ exp = expr();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IMPORTANT_SYM:
+ important = prio();
+ break;
+ default:
+ jj_la1[230] = jj_gen;
+ ;
+ }
+ documentHandler.property(name, exp, important);
+ } catch (JumpException e) {
+ skipAfterExpression();
+ // reportWarningSkipText(getLocator(), skipAfterExpression());
-/**
- * @exception ParseException exception during the parse
- */
- final public LexicalUnitImpl term(LexicalUnitImpl prev) throws ParseException {
- LexicalUnitImpl result = null;
- Token n = null;
- char op = ' ';
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- case DOT:
- case TO:
- case THROUGH:
- case FROM:
- case STRING:
- case IDENT:
- case NUMBER:
- case URL:
- case PERCENTAGE:
- case PT:
- case MM:
- case CM:
- case PC:
- case IN:
- case PX:
- case EMS:
- case LEM:
- case REM:
- case EXS:
- case DEG:
- case RAD:
- case GRAD:
- case MS:
- case SECOND:
- case HZ:
- case KHZ:
- case DIMEN:
- case HASH:
- case UNICODERANGE:
- case FUNCTION:
- result = nonVariableTerm(prev);
- break;
- case VARIABLE:
- result = variableTerm(prev);
- break;
- default:
- jj_la1[247] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return result;}
- throw new Error("Missing return statement in function");
- }
-
- final public LexicalUnitImpl variableTerm(LexicalUnitImpl prev) throws ParseException {
- LexicalUnitImpl result = null;
- String varName = "";
- varName = variableName();
- result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
- prev, varName); {if (true) return result;}
- throw new Error("Missing return statement in function");
- }
-
- final public LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev) throws ParseException {
-LexicalUnitImpl result = null;
- Token n = null;
- char op = ' ';
- String varName;
- String s = "";
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- case NUMBER:
- case PERCENTAGE:
- case PT:
- case MM:
- case CM:
- case PC:
- case IN:
- case PX:
- case EMS:
- case LEM:
- case REM:
- case EXS:
- case DEG:
- case RAD:
- case GRAD:
- case MS:
- case SECOND:
- case HZ:
- case KHZ:
- case DIMEN:
- case FUNCTION:
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- op = unaryOperator();
- break;
- default:
- jj_la1[248] = jj_gen;
- ;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case NUMBER:
- n = jj_consume_token(NUMBER);
- result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
- prev, number(op, n, 0));
- break;
- case PERCENTAGE:
- n = jj_consume_token(PERCENTAGE);
- result = LexicalUnitImpl.createPercentage(n.beginLine, n.beginColumn,
- prev, number(op, n, 1));
- break;
- case PT:
- n = jj_consume_token(PT);
- result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case CM:
- n = jj_consume_token(CM);
- result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case MM:
- n = jj_consume_token(MM);
- result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case PC:
- n = jj_consume_token(PC);
- result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case IN:
- n = jj_consume_token(IN);
- result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case PX:
- n = jj_consume_token(PX);
- result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case EMS:
- n = jj_consume_token(EMS);
- result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case LEM:
- n = jj_consume_token(LEM);
- result = LexicalUnitImpl.createLEM(n.beginLine, n.beginColumn,
- prev, number(op, n, 3));
- break;
- case REM:
- n = jj_consume_token(REM);
- result = LexicalUnitImpl.createREM(n.beginLine, n.beginColumn,
- prev, number(op, n, 3));
- break;
- case EXS:
- n = jj_consume_token(EXS);
- result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case DEG:
- n = jj_consume_token(DEG);
- result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
- prev, number(op, n, 3));
- break;
- case RAD:
- n = jj_consume_token(RAD);
- result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
- prev, number(op, n, 3));
- break;
- case GRAD:
- n = jj_consume_token(GRAD);
- result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
- prev, number(op, n, 3));
- break;
- case SECOND:
- n = jj_consume_token(SECOND);
- result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
- prev, number(op, n, 1));
- break;
- case MS:
- n = jj_consume_token(MS);
- result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case HZ:
- n = jj_consume_token(HZ);
- result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
- prev, number(op, n, 2));
- break;
- case KHZ:
- n = jj_consume_token(KHZ);
- result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
- prev, number(op, n, 3));
- break;
- case DIMEN:
- n = jj_consume_token(DIMEN);
- s = n.image;
- int i = 0;
- while (i < s.length()
- && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
- i++;
+ } catch (NumberFormatException e) {
+ if (errorHandler != null) {
+ errorHandler.error(new CSSParseException("Invalid number "
+ + e.getMessage(), getLocator(), e));
}
+ reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (ParseException e) {
+ if (errorHandler != null) {
+ if (e.currentToken != null) {
+ LocatorImpl li = new LocatorImpl(this,
+ e.currentToken.next.beginLine,
+ e.currentToken.next.beginColumn - 1);
+ reportError(li, e);
+ } else {
+ reportError(getLocator(), e);
+ }
+ skipAfterExpression();
+ /*
+ * LocatorImpl loc = (LocatorImpl) getLocator(); loc.column--;
+ * reportWarningSkipText(loc, skipAfterExpression());
+ */
+ } else {
+ skipAfterExpression();
+ }
+ }
+ }
- result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev,
- number(op,n,s.length()-i),
- s.substring(i));
- break;
- case FUNCTION:
- result = function(op, prev);
- break;
- default:
- jj_la1[249] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- break;
- case DOT:
- case TO:
- case THROUGH:
- case FROM:
- case STRING:
- case IDENT:
- case URL:
- case HASH:
- case UNICODERANGE:
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case STRING:
- n = jj_consume_token(STRING);
- result =
- LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
- convertStringIndex(n.image, 1,
- n.image.length() -1));
- break;
- case DOT:
- case TO:
- case THROUGH:
- case FROM:
- case IDENT:
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOT:
- jj_consume_token(DOT);
- s+=".";
- break;
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public boolean prio() throws ParseException {
+ jj_consume_token(IMPORTANT_SYM);
+ label_158: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[231] = jj_gen;
+ break label_158;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return true;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public boolean guarded() throws ParseException {
+ jj_consume_token(GUARDED_SYM);
+ label_159: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[232] = jj_gen;
+ break label_159;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return true;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public LexicalUnitImpl operator(LexicalUnitImpl prev)
+ throws ParseException {
+ Token n;
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case COMMA:
+ /*
+ * (comments copied from basic_arithmetics.scss)supports: 1.
+ * standard arithmetic operations (+, -, *, /, %) 2. / is treated as
+ * css operator, unless one of its operands is variable or there is
+ * another binary arithmetic operatorlimits: 1. cannot mix
+ * arithmetic and css operations, e.g. "margin: 1px + 3px 2px" will
+ * fail 2. space between add and minus operator and their following
+ * operand is mandatory. e.g. "1 + 2" is valid, "1+2" is not 3.
+ * parenthesis is not supported now.
+ */
+ n = jj_consume_token(COMMA);
+ label_160: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[233] = jj_gen;
+ break label_160;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createComma(n.beginLine,
+ n.beginColumn, prev);
+ }
+ }
+ break;
+ case DIV:
+ n = jj_consume_token(DIV);
+ label_161: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[234] = jj_gen;
+ break label_161;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createSlash(n.beginLine,
+ n.beginColumn, prev);
+ }
+ }
+ break;
+ case ANY:
+ n = jj_consume_token(ANY);
+ label_162: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[235] = jj_gen;
+ break label_162;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createMultiply(n.beginLine,
+ n.beginColumn, prev);
+ }
+ }
+ break;
+ case MOD:
+ n = jj_consume_token(MOD);
+ label_163: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[236] = jj_gen;
+ break label_163;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createModulo(n.beginLine,
+ n.beginColumn, prev);
+ }
+ }
+ break;
+ case PLUS:
+ n = jj_consume_token(PLUS);
+ label_164: while (true) {
+ jj_consume_token(S);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[237] = jj_gen;
+ break label_164;
+ }
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createAdd(n.beginLine,
+ n.beginColumn, prev);
+ }
+ }
+ break;
+ case MINUS:
+ n = jj_consume_token(MINUS);
+ label_165: while (true) {
+ jj_consume_token(S);
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[238] = jj_gen;
+ break label_165;
+ }
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createMinus(n.beginLine,
+ n.beginColumn, prev);
+ }
+ }
+ break;
default:
- jj_la1[250] = jj_gen;
- ;
+ jj_la1[239] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IDENT:
- n = jj_consume_token(IDENT);
- break;
+ throw new Error("Missing return statement in function");
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public LexicalUnitImpl expr() throws ParseException {
+ LexicalUnitImpl first, res;
+ char op;
+ first = term(null);
+ res = first;
+ label_166: while (true) {
+ if (jj_2_8(2)) {
+ ;
+ } else {
+ break label_166;
+ }
+ if (jj_2_9(2)) {
+ res = operator(res);
+ } else {
+ ;
+ }
+ res = term(res);
+ }
+ {
+ if (true) {
+ return first;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public char unaryOperator() throws ParseException {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case MINUS:
+ jj_consume_token(MINUS);
+ {
+ if (true) {
+ return '-';
+ }
+ }
+ break;
+ case PLUS:
+ jj_consume_token(PLUS);
+ {
+ if (true) {
+ return '+';
+ }
+ }
+ break;
+ default:
+ jj_la1[240] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public LexicalUnitImpl term(LexicalUnitImpl prev)
+ throws ParseException {
+ LexicalUnitImpl result = null;
+ Token n = null;
+ char op = ' ';
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ case DOT:
case TO:
- n = jj_consume_token(TO);
- break;
case THROUGH:
- n = jj_consume_token(THROUGH);
- break;
case FROM:
- n = jj_consume_token(FROM);
- break;
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case URL:
+ case PERCENTAGE:
+ case PT:
+ case MM:
+ case CM:
+ case PC:
+ case IN:
+ case PX:
+ case EMS:
+ case LEM:
+ case REM:
+ case EXS:
+ case DEG:
+ case RAD:
+ case GRAD:
+ case MS:
+ case SECOND:
+ case HZ:
+ case KHZ:
+ case DIMEN:
+ case HASH:
+ case UNICODERANGE:
+ case FUNCTION:
+ result = nonVariableTerm(prev);
+ break;
+ case VARIABLE:
+ result = variableTerm(prev);
+ break;
default:
- jj_la1[251] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- s += convertIdent(n.image);
- if ("inherit".equals(s)) {
- result = LexicalUnitImpl.createInherit(n.beginLine, n.beginColumn,
- prev);
- } else {
- result = LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
- prev, convertIdent(n.image));
- }
-
- /* /
- Auto correction code used in the CSS Validator but must not
- be used by a conformant CSS2 parser.
- * Common error :
- * H1 {
- * color : black
- * background : white
- * }
- *
- Token t = getToken(1);
- Token semicolon = new Token();
- semicolon.kind = SEMICOLON;
- semicolon.image = ";";
- if (t.kind == COLON) {
- // @@SEEME. (generate a warning?)
- // @@SEEME if expression is a single ident,
- generate an error ?
- rejectToken(semicolon);
-
- result = prev;
- }
- / */
-
- break;
- case HASH:
- result = hexcolor(prev);
- break;
- case URL:
- result = url(prev);
- break;
- case UNICODERANGE:
- result = unicode(prev);
- break;
- default:
- jj_la1[252] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- break;
- default:
- jj_la1[253] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_170:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[254] = jj_gen;
- break label_170;
- }
- jj_consume_token(S);
- }
- {if (true) return result;}
- throw new Error("Missing return statement in function");
- }
+ jj_la1[241] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ {
+ if (true) {
+ return result;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * Handle all CSS2 functions.
- * @exception ParseException exception during the parse
- */
- final public LexicalUnitImpl function(char operator, LexicalUnitImpl prev) throws ParseException {
- Token n;
- LexicalUnit params = null;
- n = jj_consume_token(FUNCTION);
- label_171:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[255] = jj_gen;
- break label_171;
- }
- jj_consume_token(S);
+ final public LexicalUnitImpl variableTerm(LexicalUnitImpl prev)
+ throws ParseException {
+ LexicalUnitImpl result = null;
+ String varName = "";
+ varName = variableName();
+ result = LexicalUnitImpl.createVariable(token.beginLine,
+ token.beginColumn, prev, varName);
+ {
+ if (true) {
+ return result;
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev)
+ throws ParseException {
+ LexicalUnitImpl result = null;
+ Token n = null;
+ char op = ' ';
+ String varName;
+ String s = "";
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ case NUMBER:
+ case PERCENTAGE:
+ case PT:
+ case MM:
+ case CM:
+ case PC:
+ case IN:
+ case PX:
+ case EMS:
+ case LEM:
+ case REM:
+ case EXS:
+ case DEG:
+ case RAD:
+ case GRAD:
+ case MS:
+ case SECOND:
+ case HZ:
+ case KHZ:
+ case DIMEN:
+ case FUNCTION:
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ op = unaryOperator();
+ break;
+ default:
+ jj_la1[242] = jj_gen;
+ ;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case NUMBER:
+ n = jj_consume_token(NUMBER);
+ result = LexicalUnitImpl.createNumber(n.beginLine,
+ n.beginColumn, prev, number(op, n, 0));
+ break;
+ case PERCENTAGE:
+ n = jj_consume_token(PERCENTAGE);
+ result = LexicalUnitImpl.createPercentage(n.beginLine,
+ n.beginColumn, prev, number(op, n, 1));
+ break;
+ case PT:
+ n = jj_consume_token(PT);
+ result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case CM:
+ n = jj_consume_token(CM);
+ result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case MM:
+ n = jj_consume_token(MM);
+ result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case PC:
+ n = jj_consume_token(PC);
+ result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case IN:
+ n = jj_consume_token(IN);
+ result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case PX:
+ n = jj_consume_token(PX);
+ result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case EMS:
+ n = jj_consume_token(EMS);
+ result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case LEM:
+ n = jj_consume_token(LEM);
+ result = LexicalUnitImpl.createLEM(n.beginLine, n.beginColumn,
+ prev, number(op, n, 3));
+ break;
+ case REM:
+ n = jj_consume_token(REM);
+ result = LexicalUnitImpl.createREM(n.beginLine, n.beginColumn,
+ prev, number(op, n, 3));
+ break;
+ case EXS:
+ n = jj_consume_token(EXS);
+ result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case DEG:
+ n = jj_consume_token(DEG);
+ result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
+ prev, number(op, n, 3));
+ break;
+ case RAD:
+ n = jj_consume_token(RAD);
+ result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
+ prev, number(op, n, 3));
+ break;
+ case GRAD:
+ n = jj_consume_token(GRAD);
+ result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
+ prev, number(op, n, 3));
+ break;
+ case SECOND:
+ n = jj_consume_token(SECOND);
+ result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
+ prev, number(op, n, 1));
+ break;
+ case MS:
+ n = jj_consume_token(MS);
+ result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case HZ:
+ n = jj_consume_token(HZ);
+ result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
+ prev, number(op, n, 2));
+ break;
+ case KHZ:
+ n = jj_consume_token(KHZ);
+ result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
+ prev, number(op, n, 3));
+ break;
+ case DIMEN:
+ n = jj_consume_token(DIMEN);
+ s = n.image;
+ int i = 0;
+ while (i < s.length()
+ && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
+ i++;
+ }
+
+ result = LexicalUnitImpl.createDimen(n.beginLine,
+ n.beginColumn, prev, number(op, n, s.length() - i),
+ s.substring(i));
+ break;
+ case FUNCTION:
+ result = function(op, prev);
+ break;
+ default:
+ jj_la1[243] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ break;
+ case DOT:
+ case TO:
+ case THROUGH:
+ case FROM:
+ case STRING:
+ case IDENT:
+ case URL:
+ case HASH:
+ case UNICODERANGE:
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case STRING:
+ n = jj_consume_token(STRING);
+ result = LexicalUnitImpl.createString(n.beginLine,
+ n.beginColumn, prev,
+ convertStringIndex(n.image, 1, n.image.length() - 1));
+ break;
+ case DOT:
+ case TO:
+ case THROUGH:
+ case FROM:
+ case IDENT:
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case DOT:
+ jj_consume_token(DOT);
+ s += ".";
+ break;
+ default:
+ jj_la1[244] = jj_gen;
+ ;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IDENT:
+ n = jj_consume_token(IDENT);
+ break;
+ case TO:
+ n = jj_consume_token(TO);
+ break;
+ case THROUGH:
+ n = jj_consume_token(THROUGH);
+ break;
+ case FROM:
+ n = jj_consume_token(FROM);
+ break;
+ default:
+ jj_la1[245] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ s += convertIdent(n.image);
+ if ("inherit".equals(s)) {
+ result = LexicalUnitImpl.createInherit(n.beginLine,
+ n.beginColumn, prev);
+ } else {
+ result = LexicalUnitImpl.createIdent(n.beginLine,
+ n.beginColumn, prev, convertIdent(n.image));
+ }
+
+ /*
+ * / Auto correction code used in the CSS Validator but must not
+ * be used by a conformant CSS2 parser. Common error : H1 {
+ * color : black background : white }
+ *
+ * Token t = getToken(1); Token semicolon = new Token();
+ * semicolon.kind = SEMICOLON; semicolon.image = ";"; if (t.kind
+ * == COLON) { // @@SEEME. (generate a warning?) // @@SEEME if
+ * expression is a single ident, generate an error ?
+ * rejectToken(semicolon);
+ *
+ * result = prev; } /
+ */
+
+ break;
+ case HASH:
+ result = hexcolor(prev);
+ break;
+ case URL:
+ result = url(prev);
+ break;
+ case UNICODERANGE:
+ result = unicode(prev);
+ break;
+ default:
+ jj_la1[246] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ break;
+ default:
+ jj_la1[247] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ label_167: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[248] = jj_gen;
+ break label_167;
+ }
+ jj_consume_token(S);
+ }
+ {
+ if (true) {
+ return result;
+ }
+ }
+ throw new Error("Missing return statement in function");
}
+
+ /**
+ * Handle all CSS2 functions.
+ *
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public LexicalUnitImpl function(char operator, LexicalUnitImpl prev)
+ throws ParseException {
+ Token n;
+ LexicalUnit params = null;
+ n = jj_consume_token(FUNCTION);
+ label_168: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[249] = jj_gen;
+ break label_168;
+ }
+ jj_consume_token(S);
+ }
String fname = convertIdent(n.image);
- if("alpha(".equals(fname)){
+ if ("alpha(".equals(fname)) {
String body = skipStatementUntilSemiColon();
- {if (true) return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
- null, "alpha("+body);}
- }else if("expression(".equals(fname)){
+ {
+ if (true) {
+ return LexicalUnitImpl.createIdent(n.beginLine,
+ n.beginColumn, null, "alpha(" + body);
+ }
+ }
+ } else if ("expression(".equals(fname)) {
String body = skipStatementUntilSemiColon();
- {if (true) return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
- null, "expression("+body);}
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PLUS:
- case MINUS:
- case DOT:
- case TO:
- case THROUGH:
- case FROM:
- case STRING:
- case IDENT:
- case NUMBER:
- case URL:
- case VARIABLE:
- case PERCENTAGE:
- case PT:
- case MM:
- case CM:
- case PC:
- case IN:
- case PX:
- case EMS:
- case LEM:
- case REM:
- case EXS:
- case DEG:
- case RAD:
- case GRAD:
- case MS:
- case SECOND:
- case HZ:
- case KHZ:
- case DIMEN:
- case HASH:
- case UNICODERANGE:
- case FUNCTION:
- params = expr();
- break;
- default:
- jj_la1[256] = jj_gen;
- ;
- }
- jj_consume_token(RPARAN);
+ {
+ if (true) {
+ return LexicalUnitImpl.createIdent(n.beginLine,
+ n.beginColumn, null, "expression(" + body);
+ }
+ }
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case MINUS:
+ case DOT:
+ case TO:
+ case THROUGH:
+ case FROM:
+ case STRING:
+ case IDENT:
+ case NUMBER:
+ case URL:
+ case VARIABLE:
+ case PERCENTAGE:
+ case PT:
+ case MM:
+ case CM:
+ case PC:
+ case IN:
+ case PX:
+ case EMS:
+ case LEM:
+ case REM:
+ case EXS:
+ case DEG:
+ case RAD:
+ case GRAD:
+ case MS:
+ case SECOND:
+ case HZ:
+ case KHZ:
+ case DIMEN:
+ case HASH:
+ case UNICODERANGE:
+ case FUNCTION:
+ params = expr();
+ break;
+ default:
+ jj_la1[250] = jj_gen;
+ ;
+ }
+ jj_consume_token(RPARAN);
if (operator != ' ') {
- {if (true) throw new CSSParseException("invalid operator before a function.",
- getLocator());}
+ {
+ if (true) {
+ throw new CSSParseException(
+ "invalid operator before a function.", getLocator());
+ }
+ }
}
String f = convertIdent(n.image);
LexicalUnitImpl l = (LexicalUnitImpl) params;
@@ -5855,32 +5871,38 @@ LexicalUnitImpl result = null;
int i = 0;
while (loop && l != null && i < 5) {
switch (i) {
- case 0:
- case 2:
- case 4:
- if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
+ case 0:
+ case 2:
+ case 4:
+ if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
&& (l.getLexicalUnitType() != LexicalUnit.SAC_PERCENTAGE)) {
- loop = false;
- }
- break;
- case 1:
- case 3:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
- loop = false;
- }
- break;
- default:
- {if (true) throw new ParseException("implementation error");}
+ loop = false;
+ }
+ break;
+ case 1:
+ case 3:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+ loop = false;
+ }
+ break;
+ default: {
+ if (true) {
+ throw new ParseException("implementation error");
+ }
+ }
}
if (loop) {
- l = (LexicalUnitImpl) l.getNextLexicalUnit();
- i ++;
+ l = l.getNextLexicalUnit();
+ i++;
}
}
if ((i == 5) && loop && (l == null)) {
- {if (true) return LexicalUnitImpl.createRGBColor(n.beginLine,
- n.beginColumn,
- prev, params);}
+ {
+ if (true) {
+ return LexicalUnitImpl.createRGBColor(n.beginLine,
+ n.beginColumn, prev, params);
+ }
+ }
} else {
if (errorHandler != null) {
String errorText;
@@ -5888,54 +5910,63 @@ LexicalUnitImpl result = null;
if (i < 5) {
if (params == null) {
loc = new LocatorImpl(this, n.beginLine,
- n.beginColumn-1);
+ n.beginColumn - 1);
errorText = "not enough parameters.";
} else if (l == null) {
loc = new LocatorImpl(this, n.beginLine,
- n.beginColumn-1);
+ n.beginColumn - 1);
errorText = "not enough parameters: "
- + params.toString();
+ + params.toString();
} else {
loc = new LocatorImpl(this, l.getLineNumber(),
- l.getColumnNumber());
- errorText = "invalid parameter: "
- + l.toString();
+ l.getColumnNumber());
+ errorText = "invalid parameter: " + l.toString();
}
} else {
loc = new LocatorImpl(this, l.getLineNumber(),
- l.getColumnNumber());
- errorText = "too many parameters: "
- + l.toString();
+ l.getColumnNumber());
+ errorText = "too many parameters: " + l.toString();
}
errorHandler.error(new CSSParseException(errorText, loc));
}
- {if (true) throw new JumpException();}
+ {
+ if (true) {
+ throw new JumpException();
+ }
+ }
}
} else if ("counter".equals(f)) {
int i = 0;
while (loop && l != null && i < 3) {
switch (i) {
- case 0:
- case 2:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
- loop = false;
- }
- break;
- case 1:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
- loop = false;
- }
- break;
- default:
- {if (true) throw new ParseException("implementation error");}
+ case 0:
+ case 2:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+ loop = false;
+ }
+ break;
+ case 1:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+ loop = false;
+ }
+ break;
+ default: {
+ if (true) {
+ throw new ParseException("implementation error");
+ }
}
- l = (LexicalUnitImpl) l.getNextLexicalUnit();
- i ++;
+ }
+ l = l.getNextLexicalUnit();
+ i++;
}
if (((i == 1) || (i == 3)) && loop && (l == null)) {
- {if (true) return LexicalUnitImpl.createCounter(n.beginLine, n.beginColumn,
- prev, params);}
+ {
+ if (true) {
+ return LexicalUnitImpl.createCounter(n.beginLine,
+ n.beginColumn, prev, params);
+ }
+ }
}
} else if ("counters(".equals(f)) {
@@ -5943,2049 +5974,2650 @@ LexicalUnitImpl result = null;
int i = 0;
while (loop && l != null && i < 5) {
switch (i) {
- case 0:
- case 4:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
- loop = false;
- }
- break;
- case 2:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
- loop = false;
- }
- break;
- case 1:
- case 3:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
- loop = false;
- }
- break;
- default:
- {if (true) throw new ParseException("implementation error");}
+ case 0:
+ case 4:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+ loop = false;
+ }
+ break;
+ case 2:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
+ loop = false;
+ }
+ break;
+ case 1:
+ case 3:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+ loop = false;
+ }
+ break;
+ default: {
+ if (true) {
+ throw new ParseException("implementation error");
+ }
+ }
}
- l = (LexicalUnitImpl) l.getNextLexicalUnit();
- i ++;
+ l = l.getNextLexicalUnit();
+ i++;
}
if (((i == 3) || (i == 5)) && loop && (l == null)) {
- {if (true) return LexicalUnitImpl.createCounters(n.beginLine, n.beginColumn,
- prev, params);}
+ {
+ if (true) {
+ return LexicalUnitImpl.createCounters(n.beginLine,
+ n.beginColumn, prev, params);
+ }
+ }
}
} else if ("attr(".equals(f)) {
- if ((l != null)
- && (l.getNextLexicalUnit() == null)
- && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
- {if (true) return LexicalUnitImpl.createAttr(l.getLineNumber(),
- l.getColumnNumber(),
- prev, l.getStringValue());}
+ if ((l != null) && (l.getNextLexicalUnit() == null)
+ && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
+ {
+ if (true) {
+ return LexicalUnitImpl.createAttr(l.getLineNumber(),
+ l.getColumnNumber(), prev, l.getStringValue());
+ }
+ }
}
} else if ("rect(".equals(f)) {
int i = 0;
while (loop && l != null && i < 7) {
switch (i) {
- case 0:
- case 2:
- case 4:
- case 6:
- switch (l.getLexicalUnitType()) {
- case LexicalUnit.SAC_INTEGER:
- if (l.getIntegerValue() != 0) {
- loop = false;
- }
- break;
- case LexicalUnit.SAC_IDENT:
- if (!l.getStringValue().equals("auto")) {
- loop = false;
- }
- break;
- case LexicalUnit.SAC_EM:
- case LexicalUnit.SAC_EX:
- case LexicalUnit.SAC_PIXEL:
- case LexicalUnit.SAC_CENTIMETER:
- case LexicalUnit.SAC_MILLIMETER:
- case LexicalUnit.SAC_INCH:
- case LexicalUnit.SAC_POINT:
- case LexicalUnit.SAC_PICA:
- // nothing
- break;
- default:
+ case 0:
+ case 2:
+ case 4:
+ case 6:
+ switch (l.getLexicalUnitType()) {
+ case LexicalUnit.SAC_INTEGER:
+ if (l.getIntegerValue() != 0) {
loop = false;
}
break;
- case 1:
- case 3:
- case 5:
- if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+ case LexicalUnit.SAC_IDENT:
+ if (!l.getStringValue().equals("auto")) {
loop = false;
}
break;
+ case LexicalUnit.SAC_EM:
+ case LexicalUnit.SAC_EX:
+ case LexicalUnit.SAC_PIXEL:
+ case LexicalUnit.SAC_CENTIMETER:
+ case LexicalUnit.SAC_MILLIMETER:
+ case LexicalUnit.SAC_INCH:
+ case LexicalUnit.SAC_POINT:
+ case LexicalUnit.SAC_PICA:
+ // nothing
+ break;
default:
- {if (true) throw new ParseException("implementation error");}
+ loop = false;
+ }
+ break;
+ case 1:
+ case 3:
+ case 5:
+ if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+ loop = false;
+ }
+ break;
+ default: {
+ if (true) {
+ throw new ParseException("implementation error");
+ }
}
- l = (LexicalUnitImpl) l.getNextLexicalUnit();
- i ++;
+ }
+ l = l.getNextLexicalUnit();
+ i++;
}
if ((i == 7) && loop && (l == null)) {
- {if (true) return LexicalUnitImpl.createRect(n.beginLine, n.beginColumn,
- prev, params);}
- }
- }
- {if (true) return LexicalUnitImpl.createFunction(n.beginLine, n.beginColumn, prev,
- f.substring(0,
- f.length() -1),
- params);}
- throw new Error("Missing return statement in function");
- }
-
- final public LexicalUnitImpl unicode(LexicalUnitImpl prev) throws ParseException {
- Token n;
- n = jj_consume_token(UNICODERANGE);
- LexicalUnitImpl params = null;
- String s = n.image.substring(2);
- int index = s.indexOf('-');
- if (index == -1) {
- params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
- params, Integer.parseInt(s, 16));
- } else {
- String s1 = s.substring(0, index);
- String s2 = s.substring(index);
-
- params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
- params, Integer.parseInt(s1, 16));
- params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
- params, Integer.parseInt(s2, 16));
- }
-
- {if (true) return LexicalUnitImpl.createUnicodeRange(n.beginLine, n.beginColumn,
- prev, params);}
- throw new Error("Missing return statement in function");
- }
-
- final public LexicalUnitImpl url(LexicalUnitImpl prev) throws ParseException {
- Token n;
- n = jj_consume_token(URL);
- String urlname = n.image.substring(4, n.image.length()-1).trim();
- {if (true) return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn, prev, urlname);}
- throw new Error("Missing return statement in function");
- }
+ {
+ if (true) {
+ return LexicalUnitImpl.createRect(n.beginLine,
+ n.beginColumn, prev, params);
+ }
+ }
+ }
+ }
+ {
+ if (true) {
+ return LexicalUnitImpl.createFunction(n.beginLine,
+ n.beginColumn, prev, f.substring(0, f.length() - 1),
+ params);
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
-/**
- * @exception ParseException exception during the parse
- */
- final public LexicalUnitImpl hexcolor(LexicalUnitImpl prev) throws ParseException {
- Token n;
- n = jj_consume_token(HASH);
- int r;
- LexicalUnitImpl first, params = null;
- String s = n.image.substring(1);
-
- if(s.length()!=3 && s.length()!=6) {
- first = null;
- {if (true) throw new CSSParseException("invalid hexadecimal notation for RGB: " + s,
- getLocator());}
- }
- {if (true) return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
- prev, n.image);}
- throw new Error("Missing return statement in function");
- }
-
- float number(char operator, Token n, int lengthUnit) throws ParseException {
- String image = n.image;
- float f = 0;
-
- if (lengthUnit != 0) {
- image = image.substring(0, image.length() - lengthUnit);
- }
- f = Float.valueOf(image).floatValue();
- return (operator == '-')? -f: f;
- }
-
- String skipStatementUntilSemiColon() throws ParseException {
- int[] semicolon = {SEMICOLON};
- return skipStatementUntil(semicolon);
- }
-
- String skipStatementUntilLeftBrace() throws ParseException {
- int[] lBrace = {LBRACE};
- return skipStatementUntil(lBrace);
- }
-
- String skipStatementUntilRightParan() throws ParseException {
- int[] rParan = {RPARAN};
- return skipStatementUntil(rParan);
- }
-
- String skipStatementUntil(int[] symbols) throws ParseException {
- StringBuffer s = new StringBuffer();
- boolean stop = false;
- Token tok;
- while(!stop){
- tok = getToken(1);
- if(tok.kind == EOF) {
- return null;
- }
- for(int sym : symbols){
- if(tok.kind == sym){
- stop = true;
- break;
- }
- }
- if(!stop){
- if (tok.image != null) {
- s.append(tok.image);
+ final public LexicalUnitImpl unicode(LexicalUnitImpl prev)
+ throws ParseException {
+ Token n;
+ n = jj_consume_token(UNICODERANGE);
+ LexicalUnitImpl params = null;
+ String s = n.image.substring(2);
+ int index = s.indexOf('-');
+ if (index == -1) {
+ params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+ params, Integer.parseInt(s, 16));
+ } else {
+ String s1 = s.substring(0, index);
+ String s2 = s.substring(index);
+
+ params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+ params, Integer.parseInt(s1, 16));
+ params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+ params, Integer.parseInt(s2, 16));
+ }
+
+ {
+ if (true) {
+ return LexicalUnitImpl.createUnicodeRange(n.beginLine,
+ n.beginColumn, prev, params);
}
- getNextToken();
}
+ throw new Error("Missing return statement in function");
}
- return s.toString().trim();
- }
- String skipStatement() throws ParseException {
- StringBuffer s = new StringBuffer();
- Token tok = getToken(0);
- if (tok.image != null) {
- s.append(tok.image);
+ final public LexicalUnitImpl url(LexicalUnitImpl prev)
+ throws ParseException {
+ Token n;
+ n = jj_consume_token(URL);
+ String urlname = n.image.substring(4, n.image.length() - 1).trim();
+ {
+ if (true) {
+ return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn,
+ prev, urlname);
+ }
+ }
+ throw new Error("Missing return statement in function");
}
- while (true) {
- tok = getToken(1);
- if (tok.kind == EOF) {
- return null;
+
+ /**
+ * @exception ParseException
+ * exception during the parse
+ */
+ final public LexicalUnitImpl hexcolor(LexicalUnitImpl prev)
+ throws ParseException {
+ Token n;
+ n = jj_consume_token(HASH);
+ int r;
+ LexicalUnitImpl first, params = null;
+ String s = n.image.substring(1);
+
+ if (s.length() != 3 && s.length() != 6) {
+ first = null;
+ {
+ if (true) {
+ throw new CSSParseException(
+ "invalid hexadecimal notation for RGB: " + s,
+ getLocator());
+ }
+ }
}
- s.append(tok.image);
- if (tok.kind == LBRACE) {
- getNextToken();
- s.append(skip_to_matching_brace());
- getNextToken();
+ {
+ if (true) {
+ return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+ prev, n.image);
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ float number(char operator, Token n, int lengthUnit) throws ParseException {
+ String image = n.image;
+ float f = 0;
+
+ if (lengthUnit != 0) {
+ image = image.substring(0, image.length() - lengthUnit);
+ }
+ f = Float.valueOf(image).floatValue();
+ return (operator == '-') ? -f : f;
+ }
+
+ String skipStatementUntilSemiColon() throws ParseException {
+ int[] semicolon = { SEMICOLON };
+ return skipStatementUntil(semicolon);
+ }
+
+ String skipStatementUntilLeftBrace() throws ParseException {
+ int[] lBrace = { LBRACE };
+ return skipStatementUntil(lBrace);
+ }
+
+ String skipStatementUntilMatchingRightParan() throws ParseException {
+ int[] leftTokens = { LPARAN, FUNCTION }; // a FUNCTION also contains "("
+ int[] rightTokens = { RPARAN };
+ StringBuffer s = new StringBuffer();
+ int difference = 1;
+ Token tok;
+ while (difference != 0) {
tok = getToken(1);
- break;
- } else if (tok.kind == RBRACE) {
- getNextToken();
+ if (tok.kind == EOF) {
+ return null;
+ }
+ for (int sym : leftTokens) {
+ if (tok.kind == sym) {
+ difference++;
+ }
+ }
+ for (int sym : rightTokens) {
+ if (tok.kind == sym) {
+ difference--;
+ }
+ }
+ if (difference != 0) {
+ if (tok.image != null) {
+ s.append(tok.image);
+ }
+ getNextToken();
+ }
+ }
+ return s.toString().trim();
+ }
+
+ String skipStatementUntil(int[] symbols) throws ParseException {
+ StringBuffer s = new StringBuffer();
+ boolean stop = false;
+ Token tok;
+ while (!stop) {
tok = getToken(1);
- break;
- } else if (tok.kind == SEMICOLON) {
+ if (tok.kind == EOF) {
+ return null;
+ }
+ for (int sym : symbols) {
+ if (tok.kind == sym) {
+ stop = true;
+ break;
+ }
+ }
+ if (!stop) {
+ if (tok.image != null) {
+ s.append(tok.image);
+ }
+ getNextToken();
+ }
+ }
+ return s.toString().trim();
+ }
+
+ String skipStatement() throws ParseException {
+ StringBuffer s = new StringBuffer();
+ Token tok = getToken(0);
+ if (tok.image != null) {
+ s.append(tok.image);
+ }
+ while (true) {
+ tok = getToken(1);
+ if (tok.kind == EOF) {
+ return null;
+ }
+ s.append(tok.image);
+ if (tok.kind == LBRACE) {
+ getNextToken();
+ s.append(skip_to_matching_brace());
+ getNextToken();
+ tok = getToken(1);
+ break;
+ } else if (tok.kind == RBRACE) {
+ getNextToken();
+ tok = getToken(1);
+ break;
+ } else if (tok.kind == SEMICOLON) {
+ getNextToken();
+ tok = getToken(1);
+ break;
+ }
getNextToken();
+ }
+
+ // skip white space
+ while (true) {
+ if (tok.kind != S) {
+ break;
+ }
+ tok = getNextToken();
tok = getToken(1);
- break;
}
- getNextToken();
+
+ return s.toString().trim();
+ }
+
+ String skip_to_matching_brace() throws ParseException {
+ StringBuffer s = new StringBuffer();
+ Token tok;
+ int nesting = 1;
+ while (true) {
+ tok = getToken(1);
+ if (tok.kind == EOF) {
+ break;
+ }
+ s.append(tok.image);
+ if (tok.kind == LBRACE) {
+ nesting++;
+ } else if (tok.kind == RBRACE) {
+ nesting--;
+ if (nesting == 0) {
+ break;
+ }
+ }
+ getNextToken();
+ }
+ return s.toString();
+ }
+
+ String convertStringIndex(String s, int start, int len)
+ throws ParseException {
+ StringBuffer buf = new StringBuffer(len);
+ int index = start;
+
+ while (index < len) {
+ char c = s.charAt(index);
+ if (c == '\u005c\u005c') {
+ if (++index < len) {
+ c = s.charAt(index);
+ switch (c) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case 'a':
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'e':
+ case 'f':
+ case 'A':
+ case 'B':
+ case 'C':
+ case 'D':
+ case 'E':
+ case 'F':
+ buf.append('\u005c\u005c');
+ while (index < len) {
+ buf.append(s.charAt(index++));
+ }
+ break;
+ case '\u005cn':
+ case '\u005cf':
+ break;
+ case '\u005cr':
+ if (index + 1 < len) {
+ if (s.charAt(index + 1) == '\u005cn') {
+ index++;
+ }
+ }
+ break;
+ default:
+ buf.append(c);
+ }
+ } else {
+ throw new CSSParseException("invalid string " + s,
+ getLocator());
+ }
+ } else {
+ buf.append(c);
+ }
+ index++;
+ }
+
+ return buf.toString();
+ }
+
+ String convertIdent(String s) throws ParseException {
+ return convertStringIndex(s, 0, s.length());
+ }
+
+ String convertString(String s) throws ParseException {
+ return convertStringIndex(s, 0, s.length());
+ }
+
+ void comments() throws ParseException {
+ /*
+ * keeps only the multiple line comments, single line comments are
+ * skipped
+ */
+ if (token.specialToken != null && token.specialToken.image != null
+ && token.specialToken.image.startsWith("/*")) {
+ Token tmp_t = token.specialToken;
+ while (tmp_t.specialToken != null) {
+ tmp_t = tmp_t.specialToken;
+ }
+ while (tmp_t != null) {
+ documentHandler.comment(tmp_t.image);
+ tmp_t = tmp_t.next;
+ }
+ }
+ }
+
+ void rejectToken(Token t) throws ParseException {
+ Token fakeToken = new Token();
+ t.next = token;
+ fakeToken.next = t;
+ token = fakeToken;
+ }
+
+ String skipAfterExpression() throws ParseException {
+ Token t = getToken(1);
+ StringBuffer s = new StringBuffer();
+ s.append(getToken(0).image);
+
+ while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
+ s.append(t.image);
+ getNextToken();
+ t = getToken(1);
+ }
+
+ return s.toString();
}
- // skip white space
- while (true) {
- if (tok.kind != S) {
+ /**
+ * The following functions are useful for a DOM CSS implementation only and
+ * are not part of the general CSS2 parser.
+ */
+ // TODO required by original parser but not used by Vaadin?
+ final public void _parseRule() throws ParseException {
+ String ret = null;
+ label_169: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[251] = jj_gen;
+ break label_169;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case IMPORT_SYM:
+ importDeclaration();
break;
+ case DEBUG_SYM:
+ case WARN_SYM:
+ debuggingDirective();
+ break;
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case IDENT:
+ case HASH:
+ styleRule();
+ break;
+ case MEDIA_SYM:
+ media();
+ break;
+ case PAGE_SYM:
+ page();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ default:
+ jj_la1[252] = jj_gen;
+ ret = skipStatement();
+ if ((ret == null) || (ret.length() == 0)) {
+ {
+ if (true) {
+ return;
+ }
+ }
+ }
+ if (ret.charAt(0) == '@') {
+ documentHandler.unrecognizedRule(ret);
+ } else {
+ {
+ if (true) {
+ throw new CSSParseException("unrecognize rule: " + ret,
+ getLocator());
+ }
+ }
+ }
+ }
+ }
+
+ final public void _parseImportRule() throws ParseException {
+ label_170: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[253] = jj_gen;
+ break label_170;
+ }
+ jj_consume_token(S);
}
- tok = getNextToken();
- tok = getToken(1);
+ importDeclaration();
}
- return s.toString().trim();
- }
+ final public void _parseMediaRule() throws ParseException {
+ label_171: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[254] = jj_gen;
+ break label_171;
+ }
+ jj_consume_token(S);
+ }
+ media();
+ }
- String skip_to_matching_brace() throws ParseException {
- StringBuffer s = new StringBuffer();
- Token tok;
- int nesting = 1;
- while (true) {
- tok = getToken(1);
- if (tok.kind == EOF) {
+ final public void _parseDeclarationBlock() throws ParseException {
+ label_172: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[255] = jj_gen;
+ break label_172;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
break;
+ default:
+ jj_la1[256] = jj_gen;
+ ;
}
- s.append(tok.image);
- if (tok.kind == LBRACE) {
- nesting++;
- } else if (tok.kind == RBRACE) {
- nesting--;
- if (nesting == 0) {
- break;
- }
- }
- getNextToken();
- }
- return s.toString();
- }
-
- String convertStringIndex(String s, int start, int len) throws ParseException {
- StringBuffer buf = new StringBuffer(len);
- int index = start;
-
- while (index < len) {
- char c = s.charAt(index);
- if (c == '\u005c\u005c') {
- if (++index < len) {
- c = s.charAt(index);
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- buf.append('\u005c\u005c');
- while (index < len) {
- buf.append(s.charAt(index++));
- }
+ label_173: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case SEMICOLON:
+ ;
+ break;
+ default:
+ jj_la1[257] = jj_gen;
+ break label_173;
+ }
+ jj_consume_token(SEMICOLON);
+ label_174: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
break;
- case '\u005cn':
- case '\u005cf':
+ default:
+ jj_la1[258] = jj_gen;
+ break label_174;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case INTERPOLATION:
+ case IDENT:
+ declaration();
+ break;
+ default:
+ jj_la1[259] = jj_gen;
+ ;
+ }
+ }
+ }
+
+ final public ArrayList<String> _parseSelectors() throws ParseException {
+ ArrayList<String> p = null;
+ try {
+ label_175: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
break;
- case '\u005cr':
- if (index + 1 < len) {
- if (s.charAt(index + 1) == '\u005cn') {
- index ++;
+ default:
+ jj_la1[260] = jj_gen;
+ break label_175;
+ }
+ jj_consume_token(S);
+ }
+ p = selectorList();
+ {
+ if (true) {
+ return p;
+ }
+ }
+ } catch (ThrowedParseException e) {
+ {
+ if (true) {
+ throw (ParseException) e.e.fillInStackTrace();
+ }
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ private boolean jj_2_1(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_1();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(0, xla);
+ }
+ }
+
+ private boolean jj_2_2(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_2();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(1, xla);
+ }
+ }
+
+ private boolean jj_2_3(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_3();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(2, xla);
+ }
+ }
+
+ private boolean jj_2_4(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_4();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(3, xla);
+ }
+ }
+
+ private boolean jj_2_5(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_5();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(4, xla);
+ }
+ }
+
+ private boolean jj_2_6(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_6();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(5, xla);
+ }
+ }
+
+ private boolean jj_2_7(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_7();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(6, xla);
+ }
+ }
+
+ private boolean jj_2_8(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_8();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(7, xla);
+ }
+ }
+
+ private boolean jj_2_9(int xla) {
+ jj_la = xla;
+ jj_lastpos = jj_scanpos = token;
+ try {
+ return !jj_3_9();
+ } catch (LookaheadSuccess ls) {
+ return true;
+ } finally {
+ jj_save(8, xla);
+ }
+ }
+
+ private boolean jj_3R_209() {
+ if (jj_scan_token(MINUS)) {
+ return true;
+ }
+ Token xsp;
+ if (jj_scan_token(1)) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_188() {
+ if (jj_3R_210()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_208() {
+ if (jj_scan_token(PLUS)) {
+ return true;
+ }
+ Token xsp;
+ if (jj_scan_token(1)) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_207() {
+ if (jj_scan_token(MOD)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_206() {
+ if (jj_scan_token(ANY)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_205() {
+ if (jj_scan_token(DIV)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_204() {
+ if (jj_scan_token(COMMA)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_185() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_204()) {
+ jj_scanpos = xsp;
+ if (jj_3R_205()) {
+ jj_scanpos = xsp;
+ if (jj_3R_206()) {
+ jj_scanpos = xsp;
+ if (jj_3R_207()) {
+ jj_scanpos = xsp;
+ if (jj_3R_208()) {
+ jj_scanpos = xsp;
+ if (jj_3R_209()) {
+ return true;
+ }
}
}
- break;
- default:
- buf.append(c);
}
- } else {
- throw new CSSParseException("invalid string " + s, getLocator());
}
- } else {
- buf.append(c);
}
- index++;
+ return false;
}
- return buf.toString();
- }
+ private boolean jj_3R_212() {
+ if (jj_3R_211()) {
+ return true;
+ }
+ return false;
+ }
- String convertIdent(String s) throws ParseException {
- return convertStringIndex(s, 0, s.length());
- }
+ private boolean jj_3R_211() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(18)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(22)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(23)) {
+ return true;
+ }
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
- String convertString(String s) throws ParseException {
- return convertStringIndex(s, 0, s.length());
- }
+ private boolean jj_3R_191() {
+ if (jj_scan_token(S)) {
+ return true;
+ }
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_212()) {
+ jj_scanpos = xsp;
+ }
+ return false;
+ }
- void comments() throws ParseException {
- /*keeps only the multiple line comments, single line comments are skipped*/
- if (token.specialToken != null && token.specialToken.image!=null && token.specialToken.image.startsWith("/*")){
- Token tmp_t = token.specialToken;
- while (tmp_t.specialToken != null) tmp_t = tmp_t.specialToken;
- while (tmp_t != null) {
- documentHandler.comment(tmp_t.image);
- tmp_t = tmp_t.next;
+ private boolean jj_3R_210() {
+ if (jj_scan_token(GUARDED_SYM)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
}
+ return false;
}
- }
- void rejectToken(Token t) throws ParseException {
- Token fakeToken = new Token();
- t.next = token;
- fakeToken.next = t;
- token = fakeToken;
- }
+ private boolean jj_3R_176() {
+ if (jj_3R_186()) {
+ return true;
+ }
+ if (jj_scan_token(COLON)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ if (jj_3R_187()) {
+ return true;
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_188()) {
+ jj_scanpos = xsp;
+ }
+ if (jj_3R_189()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_189()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
- String skipAfterExpression() throws ParseException {
- Token t = getToken(1);
- StringBuffer s = new StringBuffer();
- s.append(getToken(0).image);
+ private boolean jj_3R_190() {
+ if (jj_3R_211()) {
+ return true;
+ }
+ return false;
+ }
- while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
- s.append(t.image);
- getNextToken();
- t = getToken(1);
+ private boolean jj_3R_177() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_190()) {
+ jj_scanpos = xsp;
+ if (jj_3R_191()) {
+ return true;
+ }
+ }
+ return false;
}
- return s.toString();
- }
+ private boolean jj_3R_194() {
+ if (jj_scan_token(VARIABLE)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ if (jj_scan_token(COLON)) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
-/**
- * The following functions are useful for a DOM CSS implementation only and are
- * not part of the general CSS2 parser.
- */
-// TODO required by original parser but not used by Vaadin?
- final public void _parseRule() throws ParseException {
- String ret = null;
- label_172:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[257] = jj_gen;
- break label_172;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case IMPORT_SYM:
- importDeclaration();
- break;
- case DEBUG_SYM:
- case WARN_SYM:
- debuggingDirective();
- break;
- case PLUS:
- case PRECEDES:
- case SIBLING:
- case LBRACKET:
- case ANY:
- case PARENT:
- case DOT:
- case COLON:
- case INTERPOLATION:
- case IDENT:
- case HASH:
- styleRule();
- break;
- case MEDIA_SYM:
- media();
- break;
- case PAGE_SYM:
- page();
- break;
- case FONT_FACE_SYM:
- fontFace();
- break;
- default:
- jj_la1[258] = jj_gen;
- ret = skipStatement();
- if ((ret == null) || (ret.length() == 0)) {
- {if (true) return;}
+ private boolean jj_3R_179() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_194()) {
+ jj_scanpos = xsp;
+ }
+ if (jj_scan_token(CONTAINS)) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ if (true) {
+ jj_la = 0;
+ jj_scanpos = jj_lastpos;
+ return false;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_262() {
+ if (jj_scan_token(HASH)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_279() {
+ if (jj_scan_token(IDENT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_280() {
+ if (jj_scan_token(FUNCTION)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ if (true) {
+ jj_la = 0;
+ jj_scanpos = jj_lastpos;
+ return false;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_278() {
+ if (jj_scan_token(COLON)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_265() {
+ if (jj_scan_token(COLON)) {
+ return true;
+ }
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_278()) {
+ jj_scanpos = xsp;
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_279()) {
+ jj_scanpos = xsp;
+ if (jj_3R_280()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3_7() {
+ if (jj_3R_183()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_201() {
+ if (jj_scan_token(LBRACE)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_290() {
+ if (jj_scan_token(STRING)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_288() {
+ if (jj_scan_token(STARMATCH)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_287() {
+ if (jj_scan_token(DOLLARMATCH)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_289() {
+ if (jj_scan_token(IDENT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_286() {
+ if (jj_scan_token(CARETMATCH)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_285() {
+ if (jj_scan_token(DASHMATCH)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_284() {
+ if (jj_scan_token(INCLUDES)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_270() {
+ if (jj_scan_token(INTERPOLATION)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_283() {
+ if (jj_scan_token(EQ)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_200() {
+ if (jj_3R_187()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_277() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_283()) {
+ jj_scanpos = xsp;
+ if (jj_3R_284()) {
+ jj_scanpos = xsp;
+ if (jj_3R_285()) {
+ jj_scanpos = xsp;
+ if (jj_3R_286()) {
+ jj_scanpos = xsp;
+ if (jj_3R_287()) {
+ jj_scanpos = xsp;
+ if (jj_3R_288()) {
+ return true;
+ }
+ }
}
- if (ret.charAt(0) == '@') {
- documentHandler.unrecognizedRule(ret);
- } else {
- {if (true) throw new CSSParseException("unrecognize rule: " + ret,
- getLocator());}
+ }
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_289()) {
+ jj_scanpos = xsp;
+ if (jj_3R_290()) {
+ return true;
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3_6() {
+ if (jj_3R_182()) {
+ return true;
+ }
+ if (jj_scan_token(LBRACE)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_264() {
+ if (jj_scan_token(LBRACKET)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ if (jj_scan_token(IDENT)) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_277()) {
+ jj_scanpos = xsp;
+ }
+ if (jj_scan_token(RBRACKET)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_183() {
+ if (jj_3R_199()) {
+ return true;
+ }
+ if (jj_scan_token(COLON)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_200()) {
+ jj_scanpos = xsp;
+ if (jj_3R_201()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_282() {
+ if (jj_scan_token(INTERPOLATION)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_268() {
+ if (jj_3R_187()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_248() {
+ if (jj_scan_token(PARENT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_247() {
+ if (jj_scan_token(ANY)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_261() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_269()) {
+ jj_scanpos = xsp;
+ if (jj_3R_270()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_269() {
+ if (jj_scan_token(IDENT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_213() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_246()) {
+ jj_scanpos = xsp;
+ if (jj_3R_247()) {
+ jj_scanpos = xsp;
+ if (jj_3R_248()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_246() {
+ Token xsp;
+ if (jj_3R_261()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_261()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_254() {
+ if (jj_scan_token(FUNCTION)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_268()) {
+ jj_scanpos = xsp;
+ }
+ if (jj_scan_token(RPARAN)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_180() {
+ if (jj_scan_token(COMMA)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_241() {
+ if (jj_3R_258()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_276() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_281()) {
+ jj_scanpos = xsp;
+ if (jj_3R_282()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_281() {
+ if (jj_scan_token(IDENT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_240() {
+ if (jj_3R_257()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_239() {
+ if (jj_3R_256()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_5() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_180()) {
+ jj_scanpos = xsp;
+ }
+ if (jj_3R_181()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_263() {
+ if (jj_scan_token(DOT)) {
+ return true;
+ }
+ Token xsp;
+ if (jj_3R_276()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_276()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_252() {
+ if (jj_3R_265()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_275() {
+ if (jj_3R_265()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_273() {
+ if (jj_3R_263()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_250() {
+ if (jj_3R_263()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_251() {
+ if (jj_3R_264()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_274() {
+ if (jj_3R_264()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_255() {
+ if (jj_scan_token(DOT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_271() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_272()) {
+ jj_scanpos = xsp;
+ if (jj_3R_273()) {
+ jj_scanpos = xsp;
+ if (jj_3R_274()) {
+ jj_scanpos = xsp;
+ if (jj_3R_275()) {
+ return true;
}
+ }
+ }
+ }
+ return false;
}
- }
-
- final public void _parseImportRule() throws ParseException {
- label_173:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[259] = jj_gen;
- break label_173;
- }
- jj_consume_token(S);
- }
- importDeclaration();
- }
-
- final public void _parseMediaRule() throws ParseException {
- label_174:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[260] = jj_gen;
- break label_174;
- }
- jj_consume_token(S);
- }
- media();
- }
-
- final public void _parseDeclarationBlock() throws ParseException {
- label_175:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[261] = jj_gen;
- break label_175;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[262] = jj_gen;
- ;
- }
- label_176:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case SEMICOLON:
- ;
- break;
- default:
- jj_la1[263] = jj_gen;
- break label_176;
- }
- jj_consume_token(SEMICOLON);
- label_177:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[264] = jj_gen;
- break label_177;
- }
- jj_consume_token(S);
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case INTERPOLATION:
- case IDENT:
- declaration();
- break;
- default:
- jj_la1[265] = jj_gen;
- ;
- }
- }
- }
-
- final public ArrayList<String> _parseSelectors() throws ParseException {
- ArrayList<String> p = null;
- try {
- label_178:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case S:
- ;
- break;
- default:
- jj_la1[266] = jj_gen;
- break label_178;
- }
- jj_consume_token(S);
- }
- p = selectorList();
- {if (true) return p;}
- } catch (ThrowedParseException e) {
- {if (true) throw (ParseException) e.e.fillInStackTrace();}
- }
- throw new Error("Missing return statement in function");
- }
-
- private boolean jj_2_1(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_1(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(0, xla); }
- }
-
- private boolean jj_2_2(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_2(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(1, xla); }
- }
-
- private boolean jj_2_3(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_3(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(2, xla); }
- }
-
- private boolean jj_2_4(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_4(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(3, xla); }
- }
-
- private boolean jj_2_5(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_5(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(4, xla); }
- }
-
- private boolean jj_2_6(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_6(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(5, xla); }
- }
-
- private boolean jj_2_7(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_7(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(6, xla); }
- }
-
- private boolean jj_2_8(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_8(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(7, xla); }
- }
-
- private boolean jj_2_9(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_9(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(8, xla); }
- }
-
- private boolean jj_3R_213() {
- if (jj_scan_token(MOD)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_212() {
- if (jj_scan_token(ANY)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_211() {
- if (jj_scan_token(DIV)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_210() {
- if (jj_scan_token(COMMA)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_188() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_210()) {
- jj_scanpos = xsp;
- if (jj_3R_211()) {
- jj_scanpos = xsp;
- if (jj_3R_212()) {
- jj_scanpos = xsp;
- if (jj_3R_213()) {
- jj_scanpos = xsp;
- if (jj_3R_214()) {
- jj_scanpos = xsp;
- if (jj_3R_215()) return true;
- }
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_218() {
- if (jj_3R_217()) return true;
- return false;
- }
-
- private boolean jj_3R_216() {
- if (jj_scan_token(GUARDED_SYM)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_217() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(18)) {
- jj_scanpos = xsp;
- if (jj_scan_token(22)) {
- jj_scanpos = xsp;
- if (jj_scan_token(23)) return true;
- }
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_179() {
- if (jj_3R_189()) return true;
- if (jj_scan_token(COLON)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- if (jj_3R_190()) return true;
- xsp = jj_scanpos;
- if (jj_3R_191()) jj_scanpos = xsp;
- if (jj_3R_192()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_192()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_194() {
- if (jj_scan_token(S)) return true;
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_218()) jj_scanpos = xsp;
- return false;
- }
-
- private boolean jj_3R_193() {
- if (jj_3R_217()) return true;
- return false;
- }
-
- private boolean jj_3R_180() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_193()) {
- jj_scanpos = xsp;
- if (jj_3R_194()) return true;
- }
- return false;
- }
-
- private boolean jj_3R_200() {
- if (jj_scan_token(VARIABLE)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(COLON)) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_182() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_200()) jj_scanpos = xsp;
- if (jj_scan_token(CONTAINS)) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
- return false;
- }
-
- private boolean jj_3R_220() {
- if (jj_scan_token(HASH)) return true;
- return false;
- }
-
- private boolean jj_3R_290() {
- if (jj_scan_token(IDENT)) return true;
- return false;
- }
-
- private boolean jj_3R_291() {
- if (jj_scan_token(FUNCTION)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
- return false;
- }
-
- private boolean jj_3R_289() {
- if (jj_scan_token(COLON)) return true;
- return false;
- }
-
- private boolean jj_3R_222() {
- if (jj_scan_token(COLON)) return true;
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_289()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_290()) {
- jj_scanpos = xsp;
- if (jj_3R_291()) return true;
- }
- return false;
- }
-
- private boolean jj_3_7() {
- if (jj_3R_186()) return true;
- return false;
- }
-
- private boolean jj_3R_207() {
- if (jj_scan_token(LBRACE)) return true;
- return false;
- }
-
- private boolean jj_3R_310() {
- if (jj_scan_token(STRING)) return true;
- return false;
- }
-
- private boolean jj_3R_308() {
- if (jj_scan_token(STARMATCH)) return true;
- return false;
- }
-
- private boolean jj_3R_309() {
- if (jj_scan_token(IDENT)) return true;
- return false;
- }
-
- private boolean jj_3R_307() {
- if (jj_scan_token(DOLLARMATCH)) return true;
- return false;
- }
-
- private boolean jj_3R_306() {
- if (jj_scan_token(CARETMATCH)) return true;
- return false;
- }
-
- private boolean jj_3R_305() {
- if (jj_scan_token(DASHMATCH)) return true;
- return false;
- }
-
- private boolean jj_3R_304() {
- if (jj_scan_token(INCLUDES)) return true;
- return false;
- }
-
- private boolean jj_3R_271() {
- if (jj_scan_token(INTERPOLATION)) return true;
- return false;
- }
-
- private boolean jj_3R_303() {
- if (jj_scan_token(EQ)) return true;
- return false;
- }
-
- private boolean jj_3R_206() {
- if (jj_3R_190()) return true;
- return false;
- }
-
- private boolean jj_3R_296() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_303()) {
- jj_scanpos = xsp;
- if (jj_3R_304()) {
- jj_scanpos = xsp;
- if (jj_3R_305()) {
- jj_scanpos = xsp;
- if (jj_3R_306()) {
- jj_scanpos = xsp;
- if (jj_3R_307()) {
- jj_scanpos = xsp;
- if (jj_3R_308()) return true;
- }
- }
- }
- }
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- xsp = jj_scanpos;
- if (jj_3R_309()) {
- jj_scanpos = xsp;
- if (jj_3R_310()) return true;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3_6() {
- if (jj_3R_185()) return true;
- if (jj_scan_token(LBRACE)) return true;
- return false;
- }
-
- private boolean jj_3R_223() {
- if (jj_scan_token(LBRACKET)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(IDENT)) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- xsp = jj_scanpos;
- if (jj_3R_296()) jj_scanpos = xsp;
- if (jj_scan_token(RBRACKET)) return true;
- return false;
- }
-
- private boolean jj_3R_186() {
- if (jj_3R_205()) return true;
- if (jj_scan_token(COLON)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- xsp = jj_scanpos;
- if (jj_3R_206()) {
- jj_scanpos = xsp;
- if (jj_3R_207()) return true;
- }
- return false;
- }
-
- private boolean jj_3R_302() {
- if (jj_scan_token(INTERPOLATION)) return true;
- return false;
- }
-
- private boolean jj_3R_269() {
- if (jj_3R_190()) return true;
- return false;
- }
-
- private boolean jj_3R_257() {
- if (jj_scan_token(PARENT)) return true;
- return false;
- }
-
- private boolean jj_3R_256() {
- if (jj_scan_token(ANY)) return true;
- return false;
- }
-
- private boolean jj_3R_266() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_270()) {
- jj_scanpos = xsp;
- if (jj_3R_271()) return true;
- }
- return false;
- }
-
- private boolean jj_3R_270() {
- if (jj_scan_token(IDENT)) return true;
- return false;
- }
-
- private boolean jj_3R_219() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_255()) {
- jj_scanpos = xsp;
- if (jj_3R_256()) {
- jj_scanpos = xsp;
- if (jj_3R_257()) return true;
- }
- }
- return false;
- }
-
- private boolean jj_3R_255() {
- Token xsp;
- if (jj_3R_266()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_266()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_259() {
- if (jj_scan_token(FUNCTION)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- xsp = jj_scanpos;
- if (jj_3R_269()) jj_scanpos = xsp;
- if (jj_scan_token(RPARAN)) return true;
- return false;
- }
-
- private boolean jj_3R_183() {
- if (jj_scan_token(COMMA)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_250() {
- if (jj_3R_263()) return true;
- return false;
- }
-
- private boolean jj_3R_301() {
- if (jj_scan_token(IDENT)) return true;
- return false;
- }
-
- private boolean jj_3R_284() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_301()) {
- jj_scanpos = xsp;
- if (jj_3R_302()) return true;
- }
- return false;
- }
-
- private boolean jj_3R_249() {
- if (jj_3R_262()) return true;
- return false;
- }
-
- private boolean jj_3R_248() {
- if (jj_3R_261()) return true;
- return false;
- }
-
- private boolean jj_3R_300() {
- if (jj_3R_222()) return true;
- return false;
- }
-
- private boolean jj_3_5() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_183()) jj_scanpos = xsp;
- if (jj_3R_184()) return true;
- return false;
- }
-
- private boolean jj_3R_221() {
- if (jj_scan_token(DOT)) return true;
- Token xsp;
- if (jj_3R_284()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_284()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_298() {
- if (jj_3R_221()) return true;
- return false;
- }
-
- private boolean jj_3R_293() {
- if (jj_3R_221()) return true;
- return false;
- }
-
- private boolean jj_3R_295() {
- if (jj_3R_222()) return true;
- return false;
- }
-
- private boolean jj_3R_283() {
- if (jj_3R_222()) return true;
- return false;
- }
-
- private boolean jj_3R_286() {
- if (jj_3R_221()) return true;
- return false;
- }
-
- private boolean jj_3R_288() {
- if (jj_3R_222()) return true;
- return false;
- }
-
- private boolean jj_3R_299() {
- if (jj_3R_223()) return true;
- return false;
- }
-
- private boolean jj_3R_276() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_297()) {
- jj_scanpos = xsp;
- if (jj_3R_298()) {
- jj_scanpos = xsp;
- if (jj_3R_299()) {
- jj_scanpos = xsp;
- if (jj_3R_300()) return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_297() {
- if (jj_3R_220()) return true;
- return false;
- }
-
- private boolean jj_3R_275() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_292()) {
- jj_scanpos = xsp;
- if (jj_3R_293()) {
- jj_scanpos = xsp;
- if (jj_3R_294()) {
- jj_scanpos = xsp;
- if (jj_3R_295()) return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_292() {
- if (jj_3R_220()) return true;
- return false;
- }
-
- private boolean jj_3R_280() {
- if (jj_3R_222()) return true;
- return false;
- }
-
- private boolean jj_3R_274() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_285()) {
- jj_scanpos = xsp;
- if (jj_3R_286()) {
- jj_scanpos = xsp;
- if (jj_3R_287()) {
- jj_scanpos = xsp;
- if (jj_3R_288()) return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_285() {
- if (jj_3R_220()) return true;
- return false;
- }
-
- private boolean jj_3R_294() {
- if (jj_3R_223()) return true;
- return false;
- }
-
- private boolean jj_3R_282() {
- if (jj_3R_223()) return true;
- return false;
- }
-
- private boolean jj_3R_287() {
- if (jj_3R_223()) return true;
- return false;
- }
-
- private boolean jj_3R_273() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_281()) {
- jj_scanpos = xsp;
- if (jj_3R_282()) {
- jj_scanpos = xsp;
- if (jj_3R_283()) return true;
- }
- }
- return false;
- }
-
- private boolean jj_3R_278() {
- if (jj_3R_221()) return true;
- return false;
- }
-
- private boolean jj_3R_281() {
- if (jj_3R_221()) return true;
- return false;
- }
-
- private boolean jj_3R_260() {
- if (jj_scan_token(DOT)) return true;
- return false;
- }
-
- private boolean jj_3R_247() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_260()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(72)) {
- jj_scanpos = xsp;
- if (jj_scan_token(49)) {
- jj_scanpos = xsp;
- if (jj_scan_token(50)) {
- jj_scanpos = xsp;
- if (jj_scan_token(52)) return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_246() {
- if (jj_scan_token(STRING)) return true;
- return false;
- }
-
- private boolean jj_3R_245() {
- if (jj_3R_259()) return true;
- return false;
- }
-
- private boolean jj_3R_199() {
- if (jj_3R_223()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_276()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_202() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_246()) {
- jj_scanpos = xsp;
- if (jj_3R_247()) {
- jj_scanpos = xsp;
- if (jj_3R_248()) {
- jj_scanpos = xsp;
- if (jj_3R_249()) {
- jj_scanpos = xsp;
- if (jj_3R_250()) return true;
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_198() {
- if (jj_3R_222()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_275()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_279() {
- if (jj_3R_223()) return true;
- return false;
- }
-
- private boolean jj_3R_197() {
- if (jj_3R_221()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_274()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_196() {
- if (jj_3R_220()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_273()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_272() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_277()) {
- jj_scanpos = xsp;
- if (jj_3R_278()) {
- jj_scanpos = xsp;
- if (jj_3R_279()) {
- jj_scanpos = xsp;
- if (jj_3R_280()) return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_277() {
- if (jj_3R_220()) return true;
- return false;
- }
-
- private boolean jj_3R_195() {
- if (jj_3R_219()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_272()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_244() {
- if (jj_scan_token(DIMEN)) return true;
- return false;
- }
-
- private boolean jj_3R_181() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_195()) {
- jj_scanpos = xsp;
- if (jj_3R_196()) {
- jj_scanpos = xsp;
- if (jj_3R_197()) {
- jj_scanpos = xsp;
- if (jj_3R_198()) {
- jj_scanpos = xsp;
- if (jj_3R_199()) return true;
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_243() {
- if (jj_scan_token(KHZ)) return true;
- return false;
- }
-
- private boolean jj_3R_252() {
- if (jj_3R_217()) return true;
- if (jj_3R_181()) return true;
- return false;
- }
-
- private boolean jj_3R_242() {
- if (jj_scan_token(HZ)) return true;
- return false;
- }
-
- private boolean jj_3R_241() {
- if (jj_scan_token(MS)) return true;
- return false;
- }
-
- private boolean jj_3R_240() {
- if (jj_scan_token(SECOND)) return true;
- return false;
- }
-
- private boolean jj_3R_239() {
- if (jj_scan_token(GRAD)) return true;
- return false;
- }
-
- private boolean jj_3R_238() {
- if (jj_scan_token(RAD)) return true;
- return false;
- }
-
- private boolean jj_3R_237() {
- if (jj_scan_token(DEG)) return true;
- return false;
- }
-
- private boolean jj_3R_236() {
- if (jj_scan_token(EXS)) return true;
- return false;
- }
-
- private boolean jj_3R_235() {
- if (jj_scan_token(REM)) return true;
- return false;
- }
-
- private boolean jj_3R_234() {
- if (jj_scan_token(LEM)) return true;
- return false;
- }
-
- private boolean jj_3R_233() {
- if (jj_scan_token(EMS)) return true;
- return false;
- }
-
- private boolean jj_3_2() {
- if (jj_3R_180()) return true;
- if (jj_3R_181()) return true;
- return false;
- }
-
- private boolean jj_3R_232() {
- if (jj_scan_token(PX)) return true;
- return false;
- }
-
- private boolean jj_3R_231() {
- if (jj_scan_token(IN)) return true;
- return false;
- }
-
- private boolean jj_3R_204() {
- if (jj_scan_token(COMMA)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- if (jj_3R_203()) return true;
- return false;
- }
-
- private boolean jj_3R_251() {
- if (jj_3R_181()) return true;
- return false;
- }
-
- private boolean jj_3R_230() {
- if (jj_scan_token(PC)) return true;
- return false;
- }
-
- private boolean jj_3R_229() {
- if (jj_scan_token(MM)) return true;
- return false;
- }
-
- private boolean jj_3R_203() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_251()) {
- jj_scanpos = xsp;
- if (jj_3R_252()) return true;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_2()) { jj_scanpos = xsp; break; }
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_228() {
- if (jj_scan_token(CM)) return true;
- return false;
- }
-
- private boolean jj_3R_227() {
- if (jj_scan_token(PT)) return true;
- return false;
- }
-
- private boolean jj_3R_226() {
- if (jj_scan_token(PERCENTAGE)) return true;
- return false;
- }
-
- private boolean jj_3R_209() {
- if (jj_3R_254()) return true;
- return false;
- }
-
- private boolean jj_3R_225() {
- if (jj_scan_token(NUMBER)) return true;
- return false;
- }
-
- private boolean jj_3R_224() {
- if (jj_3R_258()) return true;
- return false;
- }
-
- private boolean jj_3R_201() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_224()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_225()) {
- jj_scanpos = xsp;
- if (jj_3R_226()) {
- jj_scanpos = xsp;
- if (jj_3R_227()) {
- jj_scanpos = xsp;
- if (jj_3R_228()) {
- jj_scanpos = xsp;
- if (jj_3R_229()) {
- jj_scanpos = xsp;
- if (jj_3R_230()) {
- jj_scanpos = xsp;
- if (jj_3R_231()) {
- jj_scanpos = xsp;
- if (jj_3R_232()) {
- jj_scanpos = xsp;
- if (jj_3R_233()) {
- jj_scanpos = xsp;
- if (jj_3R_234()) {
- jj_scanpos = xsp;
- if (jj_3R_235()) {
- jj_scanpos = xsp;
- if (jj_3R_236()) {
- jj_scanpos = xsp;
- if (jj_3R_237()) {
- jj_scanpos = xsp;
- if (jj_3R_238()) {
- jj_scanpos = xsp;
- if (jj_3R_239()) {
- jj_scanpos = xsp;
- if (jj_3R_240()) {
- jj_scanpos = xsp;
- if (jj_3R_241()) {
- jj_scanpos = xsp;
- if (jj_3R_242()) {
- jj_scanpos = xsp;
- if (jj_3R_243()) {
- jj_scanpos = xsp;
- if (jj_3R_244()) {
- jj_scanpos = xsp;
- if (jj_3R_245()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3_1() {
- if (jj_3R_179()) return true;
- return false;
- }
-
- private boolean jj_3R_185() {
- if (jj_3R_203()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_204()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_184() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_201()) {
- jj_scanpos = xsp;
- if (jj_3R_202()) return true;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_261() {
- if (jj_scan_token(HASH)) return true;
- return false;
- }
-
- private boolean jj_3_4() {
- if (jj_3R_182()) return true;
- return false;
- }
-
- private boolean jj_3R_254() {
- if (jj_3R_189()) return true;
- return false;
- }
-
- private boolean jj_3R_262() {
- if (jj_scan_token(URL)) return true;
- return false;
- }
- private boolean jj_3R_208() {
- if (jj_3R_184()) return true;
- return false;
- }
+ private boolean jj_3R_272() {
+ if (jj_3R_262()) {
+ return true;
+ }
+ return false;
+ }
- private boolean jj_3R_187() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_208()) {
- jj_scanpos = xsp;
- if (jj_3R_209()) return true;
+ private boolean jj_3R_238() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_255()) {
+ jj_scanpos = xsp;
+ }
+ xsp = jj_scanpos;
+ if (jj_scan_token(72)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(49)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(50)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(52)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
}
- return false;
- }
- private boolean jj_3_9() {
- if (jj_3R_188()) return true;
- return false;
- }
+ private boolean jj_3R_237() {
+ if (jj_scan_token(STRING)) {
+ return true;
+ }
+ return false;
+ }
- private boolean jj_3R_265() {
- if (jj_scan_token(INTERPOLATION)) return true;
- return false;
- }
+ private boolean jj_3R_214() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_249()) {
+ jj_scanpos = xsp;
+ if (jj_3R_250()) {
+ jj_scanpos = xsp;
+ if (jj_3R_251()) {
+ jj_scanpos = xsp;
+ if (jj_3R_252()) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
- private boolean jj_3_3() {
- if (jj_3R_179()) return true;
- return false;
- }
+ private boolean jj_3R_249() {
+ if (jj_3R_262()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_236() {
+ if (jj_3R_254()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_196() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_237()) {
+ jj_scanpos = xsp;
+ if (jj_3R_238()) {
+ jj_scanpos = xsp;
+ if (jj_3R_239()) {
+ jj_scanpos = xsp;
+ if (jj_3R_240()) {
+ jj_scanpos = xsp;
+ if (jj_3R_241()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_193() {
+ Token xsp;
+ if (jj_3R_214()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_214()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_192() {
+ if (jj_3R_213()) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_271()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_178() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_192()) {
+ jj_scanpos = xsp;
+ if (jj_3R_193()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_243() {
+ if (jj_3R_211()) {
+ return true;
+ }
+ if (jj_3R_178()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_235() {
+ if (jj_scan_token(DIMEN)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_234() {
+ if (jj_scan_token(KHZ)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_233() {
+ if (jj_scan_token(HZ)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_232() {
+ if (jj_scan_token(MS)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_231() {
+ if (jj_scan_token(SECOND)) {
+ return true;
+ }
+ return false;
+ }
- private boolean jj_3R_268() {
- if (jj_scan_token(PLUS)) return true;
- return false;
- }
+ private boolean jj_3R_230() {
+ if (jj_scan_token(GRAD)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_229() {
+ if (jj_scan_token(RAD)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_228() {
+ if (jj_scan_token(DEG)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_227() {
+ if (jj_scan_token(EXS)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_226() {
+ if (jj_scan_token(REM)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_2() {
+ if (jj_3R_177()) {
+ return true;
+ }
+ if (jj_3R_178()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_225() {
+ if (jj_scan_token(LEM)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_224() {
+ if (jj_scan_token(EMS)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_198() {
+ if (jj_scan_token(COMMA)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ if (jj_3R_197()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_242() {
+ if (jj_3R_178()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_223() {
+ if (jj_scan_token(PX)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_222() {
+ if (jj_scan_token(IN)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_197() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_242()) {
+ jj_scanpos = xsp;
+ if (jj_3R_243()) {
+ return true;
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3_2()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_221() {
+ if (jj_scan_token(PC)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_220() {
+ if (jj_scan_token(MM)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_219() {
+ if (jj_scan_token(CM)) {
+ return true;
+ }
+ return false;
+ }
- private boolean jj_3R_258() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_267()) {
- jj_scanpos = xsp;
- if (jj_3R_268()) return true;
- }
- return false;
- }
-
- private boolean jj_3R_267() {
- if (jj_scan_token(MINUS)) return true;
- return false;
- }
-
- private boolean jj_3R_263() {
- if (jj_scan_token(UNICODERANGE)) return true;
- return false;
- }
-
- private boolean jj_3_8() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3_9()) jj_scanpos = xsp;
- if (jj_3R_187()) return true;
- return false;
- }
-
- private boolean jj_3R_192() {
- if (jj_scan_token(SEMICOLON)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_190() {
- if (jj_3R_187()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_8()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_189() {
- if (jj_scan_token(VARIABLE)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_253() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_264()) {
- jj_scanpos = xsp;
- if (jj_3R_265()) return true;
- }
- return false;
- }
-
- private boolean jj_3R_264() {
- if (jj_scan_token(IDENT)) return true;
- return false;
- }
-
- private boolean jj_3R_205() {
- Token xsp;
- if (jj_3R_253()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_253()) { jj_scanpos = xsp; break; }
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_215() {
- if (jj_scan_token(MINUS)) return true;
- Token xsp;
- if (jj_scan_token(1)) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- private boolean jj_3R_191() {
- if (jj_3R_216()) return true;
- return false;
- }
-
- private boolean jj_3R_214() {
- if (jj_scan_token(PLUS)) return true;
- Token xsp;
- if (jj_scan_token(1)) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- /** Generated Token Manager. */
- public ParserTokenManager token_source;
- /** Current token. */
- public Token token;
- /** Next token. */
- public Token jj_nt;
- private int jj_ntk;
- private Token jj_scanpos, jj_lastpos;
- private int jj_la;
- private int jj_gen;
- final private int[] jj_la1 = new int[267];
- static private int[] jj_la1_0;
- static private int[] jj_la1_1;
- static private int[] jj_la1_2;
- static private int[] jj_la1_3;
- static {
- jj_la1_init_0();
- jj_la1_init_1();
- jj_la1_init_2();
- jj_la1_init_3();
- }
- private static void jj_la1_init_0() {
- jj_la1_0 = new int[] {0x0,0x302,0x302,0x0,0x300,0x2,0x2,0x2,0xd4c40000,0x0,0x300,0x2,0x300,0x2,0x0,0x2,0x2,0x2,0x0,0x0,0x2,0x2,0x0,0x0,0x2,0x0,0x2,0x100000,0x2,0x0,0x2,0x2,0xd4c40000,0xd4c40000,0x2,0x2,0x2,0xd4fd1500,0xd4fd1500,0x2,0x2,0x2,0x0,0x0,0x2,0x0,0x200000,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x200000,0x2,0x0,0x2,0x391500,0xc40000,0xc40002,0xc40000,0x2,0x2,0x80120002,0x80120002,0x2,0x0,0x0,0x2,0x2,0x2,0x2,0xd4c40000,0xd4c40000,0x2,0x100000,0x2,0xd4c40000,0x2,0x84000000,0x84000000,0x84000000,0x84000000,0x84000000,0x84000000,0x84000000,0x84000000,0x84000000,0x84000000,0xd4000000,0x0,0x0,0x0,0x0,0x50000000,0x2,0x2,0x3f000,0x2,0x0,0x2,0x3f000,0x0,0x2,0x0,0x2,0x0,0x2,0x200000,0x0,0xd4c40000,0x0,0x134e0002,0x2,0xd4c40000,0xd4c40000,0x2,0x0,0x2,0x134e0002,0x0,0x2,0xd4c40000,0xd4c40000,0x2,0x134e0002,0x2,0x2,0x2,0x0,0x2,0xd4c40000,0x2,0x2,0x100000,0x2,0x2,0x2,0x2,0x0,0x2,0xd4c40000,0xd4c40000,0x2,0x100000,0x2,0x2,0x2,0x100000,0x0,0x0,0x800c0000,0x2,0x0,0x100000,0x2,0x800c0000,0x2,0x0,0x2,0x2,0x0,0x2,0x200000,0x2,0xd4c40000,0xd4c40000,0x2,0x200400,0x2,0x2,0x0,0x2,0x0,0x2,0x2,0x2,0x100000,0x2,0x2,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x100000,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x100000,0x2,0x2,0x0,0x2,0x0,0x2,0x2,0x2,0x100000,0x0,0x2,0x2,0x0,0x2,0x2,0x2,0x200000,0x2,0x2,0x200000,0x2,0x2,0x0,0x200000,0x2,0x0,0x2,0x0,0xd4c40000,0x2,0x0,0x2,0x0,0x200000,0x2,0x0,0x2,0x800c0400,0x2,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x321c0000,0xc0000,0x800c0000,0xc0000,0x0,0x80000000,0x0,0x80000000,0x800c0000,0x2,0x2,0x800c0000,0x2,0xd4c40000,0x2,0x2,0x2,0x0,0x200000,0x2,0x0,0x2,};
- }
- private static void jj_la1_init_1() {
- jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x566000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x80,0x0,0x0,0x120000,0x120000,0x0,0x120000,0x0,0x0,0x0,0x120000,0x0,0x0,0x564000c0,0x564000c0,0x0,0x0,0x0,0x60001c0,0x60001c0,0x0,0x0,0x0,0x0,0x40,0x0,0x80,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x80,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0xc2,0xc2,0x0,0x80,0x80,0x0,0x0,0x0,0x0,0x564000c0,0x564000c0,0x0,0x0,0x0,0xc0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x50000000,0x64000c0,0x50000000,0x3f,0x0,0x564000c0,0x564000c0,0x0,0x80000000,0x0,0x3f,0x0,0x0,0x564000c0,0x564000c0,0x0,0x3f,0x0,0x0,0x0,0x0,0x0,0x564000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x564000c0,0x564000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x40,0x160040,0x0,0x40,0x0,0x0,0x160040,0x0,0x40,0x0,0x0,0x80,0x0,0x0,0x0,0x61200c0,0x61200c0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x6000000,0x0,0x0,0x60000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x80,0x0,0x6000000,0xc0,0x0,0x0,0x0,0x80,0x0,0x0,0x80,0x0,0x160000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x160000,0x0,0x0,0x0,0x160000,0x160000,0x160000,0x0,0x0,0x160000,0x0,0x60000c0,0x0,0x0,0x0,0x80,0x0,0x0,0x80,0x0,};
- }
- private static void jj_la1_init_2() {
- jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x1000,0x0,0x0,0x0,0x0,0x880,0x0,0x0,0x0,0x100,0x100,0x0,0x0,0x2008,0x2008,0x0,0x2000,0x0,0x0,0x0,0x2000,0x0,0x0,0x1119,0x1119,0x0,0x0,0x0,0x2b80,0x2b80,0x0,0x0,0x0,0x100,0x0,0x0,0x100,0x0,0x0,0x100,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x100,0x0,0x2a80,0x0,0x0,0x0,0x0,0x0,0x380,0x380,0x0,0x100,0x100,0x0,0x0,0x0,0x0,0x1119,0x1119,0x0,0x0,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x100,0x100,0x100,0x100,0x100,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x100,0x0,0x40,0x0,0x0,0x0,0x109,0x1000,0x1300,0x0,0x1109,0x1109,0x0,0x0,0x0,0x1300,0x20,0x0,0x1109,0x1109,0x0,0x1300,0x0,0x0,0x0,0x1100,0x0,0x1109,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x1109,0x1109,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x1000,0xfffffb80,0x0,0x0,0x0,0x0,0xfffffb80,0x0,0x0,0x0,0x0,0x1100,0x0,0x0,0x0,0x2100,0x2100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x100,0x0,0x0,0x100,0x0,0x0,0x0,0x100,0x0,0x0,0x100,0x0,0xfffffb80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfffffb80,0x0,0xffffe200,0x0,0x100,0x980,0xffffeb80,0x0,0x0,0xfffffb80,0x0,0x100,0x0,0x0,0x0,0x100,0x0,0x0,0x100,0x0,};
- }
- private static void jj_la1_init_3() {
- jj_la1_3 = new int[] {0x8,0x80,0x80,0x2,0x80,0x0,0x0,0x0,0x75,0x0,0x80,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc5,0xc5,0x0,0x0,0x0,0xc401bf,0xc401bf,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc401be,0x0,0x0,0x0,0x0,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc7,0xc7,0x0,0x0,0x0,0x1,0x0,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x0,0x0,0x0,0x0,0x45,0x80,0x200000,0x0,0xe5,0xe5,0x0,0x0,0x0,0x200000,0x0,0x0,0xe5,0xe5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0xf5,0xf5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x440001,0x0,0x0,0x0,0x0,0x440001,0x0,0x0,0x0,0x0,0x400000,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x380000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x440001,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x440001,0x0,0x400000,0x0,0x0,0x40001,0x440001,0x0,0x0,0x440001,0x0,0x37,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
- }
- final private JJCalls[] jj_2_rtns = new JJCalls[9];
- private boolean jj_rescan = false;
- private int jj_gc = 0;
-
- /** Constructor with user supplied CharStream. */
- public Parser(CharStream stream) {
- token_source = new ParserTokenManager(stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 267; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- /** Reinitialise. */
- public void ReInit(CharStream stream) {
- token_source.ReInit(stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 267; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- /** Constructor with generated Token Manager. */
- public Parser(ParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 267; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- /** Reinitialise. */
- public void ReInit(ParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 267; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- if (++jj_gc > 100) {
- jj_gc = 0;
+ private boolean jj_3R_218() {
+ if (jj_scan_token(PT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_217() {
+ if (jj_scan_token(PERCENTAGE)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_203() {
+ if (jj_3R_245()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_1() {
+ if (jj_3R_176()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_182() {
+ if (jj_3R_197()) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_198()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_216() {
+ if (jj_scan_token(NUMBER)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_215() {
+ if (jj_3R_253()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_195() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_215()) {
+ jj_scanpos = xsp;
+ }
+ xsp = jj_scanpos;
+ if (jj_3R_216()) {
+ jj_scanpos = xsp;
+ if (jj_3R_217()) {
+ jj_scanpos = xsp;
+ if (jj_3R_218()) {
+ jj_scanpos = xsp;
+ if (jj_3R_219()) {
+ jj_scanpos = xsp;
+ if (jj_3R_220()) {
+ jj_scanpos = xsp;
+ if (jj_3R_221()) {
+ jj_scanpos = xsp;
+ if (jj_3R_222()) {
+ jj_scanpos = xsp;
+ if (jj_3R_223()) {
+ jj_scanpos = xsp;
+ if (jj_3R_224()) {
+ jj_scanpos = xsp;
+ if (jj_3R_225()) {
+ jj_scanpos = xsp;
+ if (jj_3R_226()) {
+ jj_scanpos = xsp;
+ if (jj_3R_227()) {
+ jj_scanpos = xsp;
+ if (jj_3R_228()) {
+ jj_scanpos = xsp;
+ if (jj_3R_229()) {
+ jj_scanpos = xsp;
+ if (jj_3R_230()) {
+ jj_scanpos = xsp;
+ if (jj_3R_231()) {
+ jj_scanpos = xsp;
+ if (jj_3R_232()) {
+ jj_scanpos = xsp;
+ if (jj_3R_233()) {
+ jj_scanpos = xsp;
+ if (jj_3R_234()) {
+ jj_scanpos = xsp;
+ if (jj_3R_235()) {
+ jj_scanpos = xsp;
+ if (jj_3R_236()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_181() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_195()) {
+ jj_scanpos = xsp;
+ if (jj_3R_196()) {
+ return true;
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_256() {
+ if (jj_scan_token(HASH)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_4() {
+ if (jj_3R_179()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_245() {
+ if (jj_3R_186()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_257() {
+ if (jj_scan_token(URL)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_202() {
+ if (jj_3R_181()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_260() {
+ if (jj_scan_token(INTERPOLATION)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_184() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_202()) {
+ jj_scanpos = xsp;
+ if (jj_3R_203()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3_9() {
+ if (jj_3R_185()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_3() {
+ if (jj_3R_176()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_267() {
+ if (jj_scan_token(PLUS)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_253() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_266()) {
+ jj_scanpos = xsp;
+ if (jj_3R_267()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_266() {
+ if (jj_scan_token(MINUS)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_258() {
+ if (jj_scan_token(UNICODERANGE)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_8() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3_9()) {
+ jj_scanpos = xsp;
+ }
+ if (jj_3R_184()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_186() {
+ if (jj_scan_token(VARIABLE)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_189() {
+ if (jj_scan_token(SEMICOLON)) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_187() {
+ if (jj_3R_184()) {
+ return true;
+ }
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3_8()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_244() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_259()) {
+ jj_scanpos = xsp;
+ if (jj_3R_260()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_259() {
+ if (jj_scan_token(IDENT)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_199() {
+ Token xsp;
+ if (jj_3R_244()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_244()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ /** Generated Token Manager. */
+ public ParserTokenManager token_source;
+ /** Current token. */
+ public Token token;
+ /** Next token. */
+ public Token jj_nt;
+ private int jj_ntk;
+ private Token jj_scanpos, jj_lastpos;
+ private int jj_la;
+ private int jj_gen;
+ final private int[] jj_la1 = new int[261];
+ static private int[] jj_la1_0;
+ static private int[] jj_la1_1;
+ static private int[] jj_la1_2;
+ static private int[] jj_la1_3;
+ static {
+ jj_la1_init_0();
+ jj_la1_init_1();
+ jj_la1_init_2();
+ jj_la1_init_3();
+ }
+
+ private static void jj_la1_init_0() {
+ jj_la1_0 = new int[] { 0x0, 0x302, 0x302, 0x0, 0x300, 0x2, 0x2, 0x2,
+ 0xd4c40000, 0x0, 0x300, 0x2, 0x300, 0x2, 0x0, 0x2, 0x2, 0x2,
+ 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x2, 0x100000, 0x2,
+ 0x0, 0x2, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x2, 0x2,
+ 0xd4fd1500, 0xd4fd1500, 0x2, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0,
+ 0x200000, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x200000, 0x2,
+ 0x0, 0x2, 0x391500, 0xc40000, 0xc40002, 0xc40000, 0x2, 0x2,
+ 0x80120002, 0x80120002, 0x2, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2,
+ 0xd4c40000, 0xd4c40000, 0x2, 0x100000, 0x2, 0xd4c40000, 0x2,
+ 0x84000000, 0x84000000, 0x84000000, 0x84000000, 0xd4000000,
+ 0x0, 0x0, 0x0, 0x0, 0x50000000, 0x2, 0x2, 0x3f000, 0x2, 0x0,
+ 0x2, 0x3f000, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x200000, 0x0,
+ 0xd4c40000, 0x0, 0x134e0002, 0x2, 0xd4c40000, 0xd4c40000, 0x2,
+ 0x0, 0x2, 0x134e0002, 0x0, 0x2, 0xd4c40000, 0xd4c40000, 0x2,
+ 0x134e0002, 0x2, 0x2, 0x2, 0x0, 0x2, 0xd4c40000, 0x2, 0x2,
+ 0x100000, 0x2, 0x2, 0x2, 0x2, 0x0, 0x2, 0xd4c40000, 0xd4c40000,
+ 0x2, 0x100000, 0x2, 0x2, 0x2, 0x100000, 0x0, 0x0, 0x800c0000,
+ 0x2, 0x0, 0x100000, 0x2, 0x800c0000, 0x2, 0x0, 0x2, 0x2, 0x0,
+ 0x2, 0x200000, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x200400, 0x2,
+ 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2,
+ 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2, 0x0,
+ 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2,
+ 0x2, 0x100000, 0x0, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x200000,
+ 0x2, 0x2, 0x200000, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2,
+ 0x0, 0xd4c40000, 0x2, 0x0, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2,
+ 0x800c0400, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
+ 0x321c0000, 0xc0000, 0x800c0000, 0xc0000, 0x0, 0x80000000, 0x0,
+ 0x80000000, 0x800c0000, 0x2, 0x2, 0x800c0000, 0x2, 0xd4c40000,
+ 0x2, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2, };
+ }
+
+ private static void jj_la1_init_1() {
+ jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x566000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,
+ 0x80, 0x0, 0x0, 0x120000, 0x120000, 0x0, 0x120000, 0x0, 0x0,
+ 0x0, 0x120000, 0x0, 0x0, 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0,
+ 0x60001c0, 0x60001c0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x80, 0x0,
+ 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0,
+ 0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0xc2, 0x0, 0x80, 0x80,
+ 0x0, 0x0, 0x0, 0x0, 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0,
+ 0xc0, 0x0, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x50000000, 0x64000c0, 0x50000000, 0x3f,
+ 0x0, 0x564000c0, 0x564000c0, 0x0, 0x80000000, 0x0, 0x3f, 0x0,
+ 0x0, 0x564000c0, 0x564000c0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0,
+ 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40,
+ 0x40, 0x160040, 0x0, 0x40, 0x0, 0x0, 0x160040, 0x0, 0x40, 0x0,
+ 0x0, 0x80, 0x0, 0x0, 0x0, 0x61200c0, 0x61200c0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0,
+ 0x6000000, 0x0, 0x0, 0x60000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x6000000, 0xc0, 0x0,
+ 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x160000, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x160000, 0x0,
+ 0x0, 0x0, 0x160000, 0x160000, 0x160000, 0x0, 0x0, 0x160000,
+ 0x0, 0x60000c0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, };
+ }
+
+ private static void jj_la1_init_2() {
+ jj_la1_2 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100,
+ 0x1000, 0x0, 0x0, 0x0, 0x0, 0x880, 0x0, 0x0, 0x0, 0x100, 0x100,
+ 0x0, 0x0, 0x2008, 0x2008, 0x0, 0x2000, 0x0, 0x0, 0x0, 0x2000,
+ 0x0, 0x0, 0x1119, 0x1119, 0x0, 0x0, 0x0, 0x2b80, 0x2b80, 0x0,
+ 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0,
+ 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x2a80, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x380, 0x380, 0x0, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0,
+ 0x1119, 0x1119, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0,
+ 0x180, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x40, 0x0, 0x0, 0x0,
+ 0x109, 0x1000, 0x1300, 0x0, 0x1109, 0x1109, 0x0, 0x0, 0x0,
+ 0x1300, 0x20, 0x0, 0x1109, 0x1109, 0x0, 0x1300, 0x0, 0x0, 0x0,
+ 0x1100, 0x0, 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100,
+ 0x0, 0x1109, 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000,
+ 0x1000, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0x0,
+ 0x0, 0x0, 0x1100, 0x0, 0x0, 0x0, 0x2100, 0x2100, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x100,
+ 0x0, 0x0, 0x100, 0x0, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0xffffe200, 0x0,
+ 0x100, 0x980, 0xffffeb80, 0x0, 0x0, 0xfffffb80, 0x0, 0x100,
+ 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, };
+ }
+
+ private static void jj_la1_init_3() {
+ jj_la1_3 = new int[] { 0x8, 0x80, 0x80, 0x2, 0x80, 0x0, 0x0, 0x0, 0x75,
+ 0x0, 0x80, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5,
+ 0xc5, 0x0, 0x0, 0x0, 0xc401bf, 0xc401bf, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0xc401be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000,
+ 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, 0xc7, 0x0,
+ 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x80, 0x200000, 0x0,
+ 0xe5, 0xe5, 0x0, 0x0, 0x0, 0x200000, 0x0, 0x0, 0xe5, 0xe5, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x400000, 0x0, 0xf5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x440001, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0,
+ 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0,
+ 0x0, 0x0, 0x380000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x100, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x100, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x400000,
+ 0x0, 0x0, 0x40001, 0x440001, 0x0, 0x0, 0x440001, 0x0, 0x37,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
+ }
+
+ final private JJCalls[] jj_2_rtns = new JJCalls[9];
+ private boolean jj_rescan = false;
+ private int jj_gc = 0;
+
+ /** Constructor with user supplied CharStream. */
+ public Parser(CharStream stream) {
+ token_source = new ParserTokenManager(stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 261; i++) {
+ jj_la1[i] = -1;
+ }
+ for (int i = 0; i < jj_2_rtns.length; i++) {
+ jj_2_rtns[i] = new JJCalls();
+ }
+ }
+
+ /** Reinitialise. */
+ public void ReInit(CharStream stream) {
+ token_source.ReInit(stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 261; i++) {
+ jj_la1[i] = -1;
+ }
+ for (int i = 0; i < jj_2_rtns.length; i++) {
+ jj_2_rtns[i] = new JJCalls();
+ }
+ }
+
+ /** Constructor with generated Token Manager. */
+ public Parser(ParserTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 261; i++) {
+ jj_la1[i] = -1;
+ }
+ for (int i = 0; i < jj_2_rtns.length; i++) {
+ jj_2_rtns[i] = new JJCalls();
+ }
+ }
+
+ /** Reinitialise. */
+ public void ReInit(ParserTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 261; i++) {
+ jj_la1[i] = -1;
+ }
for (int i = 0; i < jj_2_rtns.length; i++) {
- JJCalls c = jj_2_rtns[i];
- while (c != null) {
- if (c.gen < jj_gen) c.first = null;
- c = c.next;
- }
- }
- }
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- static private final class LookaheadSuccess extends java.lang.Error { }
- final private LookaheadSuccess jj_ls = new LookaheadSuccess();
- private boolean jj_scan_token(int kind) {
- if (jj_scanpos == jj_lastpos) {
- jj_la--;
- if (jj_scanpos.next == null) {
- jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
- } else {
- jj_lastpos = jj_scanpos = jj_scanpos.next;
- }
- } else {
- jj_scanpos = jj_scanpos.next;
- }
- if (jj_rescan) {
- int i = 0; Token tok = token;
- while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
- if (tok != null) jj_add_error_token(kind, i);
- }
- if (jj_scanpos.kind != kind) return true;
- if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
- return false;
- }
-
-
-/** Get the next Token. */
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
-/** Get the specific Token. */
- final public Token getToken(int index) {
- Token t = token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
- private int[] jj_expentry;
- private int jj_kind = -1;
- private int[] jj_lasttokens = new int[100];
- private int jj_endpos;
-
- private void jj_add_error_token(int kind, int pos) {
- if (pos >= 100) return;
- if (pos == jj_endpos + 1) {
- jj_lasttokens[jj_endpos++] = kind;
- } else if (jj_endpos != 0) {
- jj_expentry = new int[jj_endpos];
- for (int i = 0; i < jj_endpos; i++) {
- jj_expentry[i] = jj_lasttokens[i];
- }
- jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
- int[] oldentry = (int[])(it.next());
- if (oldentry.length == jj_expentry.length) {
- for (int i = 0; i < jj_expentry.length; i++) {
- if (oldentry[i] != jj_expentry[i]) {
- continue jj_entries_loop;
- }
- }
- jj_expentries.add(jj_expentry);
- break jj_entries_loop;
- }
- }
- if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
- }
- }
-
- /** Generate ParseException. */
- public ParseException generateParseException() {
- jj_expentries.clear();
- boolean[] la1tokens = new boolean[120];
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 267; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1<<j)) != 0) {
- la1tokens[j] = true;
- }
- if ((jj_la1_1[i] & (1<<j)) != 0) {
- la1tokens[32+j] = true;
- }
- if ((jj_la1_2[i] & (1<<j)) != 0) {
- la1tokens[64+j] = true;
- }
- if ((jj_la1_3[i] & (1<<j)) != 0) {
- la1tokens[96+j] = true;
- }
- }
- }
- }
- for (int i = 0; i < 120; i++) {
- if (la1tokens[i]) {
- jj_expentry = new int[1];
- jj_expentry[0] = i;
- jj_expentries.add(jj_expentry);
- }
- }
- jj_endpos = 0;
- jj_rescan_token();
- jj_add_error_token(0, 0);
- int[][] exptokseq = new int[jj_expentries.size()][];
- for (int i = 0; i < jj_expentries.size(); i++) {
- exptokseq[i] = jj_expentries.get(i);
- }
- return new ParseException(token, exptokseq, tokenImage);
- }
-
- /** Enable tracing. */
- final public void enable_tracing() {
- }
-
- /** Disable tracing. */
- final public void disable_tracing() {
- }
-
- private void jj_rescan_token() {
- jj_rescan = true;
- for (int i = 0; i < 9; i++) {
- try {
- JJCalls p = jj_2_rtns[i];
- do {
- if (p.gen > jj_gen) {
- jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
- switch (i) {
- case 0: jj_3_1(); break;
- case 1: jj_3_2(); break;
- case 2: jj_3_3(); break;
- case 3: jj_3_4(); break;
- case 4: jj_3_5(); break;
- case 5: jj_3_6(); break;
- case 6: jj_3_7(); break;
- case 7: jj_3_8(); break;
- case 8: jj_3_9(); break;
- }
- }
- p = p.next;
- } while (p != null);
- } catch(LookaheadSuccess ls) { }
- }
- jj_rescan = false;
- }
-
- private void jj_save(int index, int xla) {
- JJCalls p = jj_2_rtns[index];
- while (p.gen > jj_gen) {
- if (p.next == null) { p = p.next = new JJCalls(); break; }
- p = p.next;
- }
- p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
- }
-
- static final class JJCalls {
- int gen;
- Token first;
- int arg;
- JJCalls next;
- }
+ jj_2_rtns[i] = new JJCalls();
+ }
+ }
+
+ private Token jj_consume_token(int kind) throws ParseException {
+ Token oldToken;
+ if ((oldToken = token).next != null) {
+ token = token.next;
+ } else {
+ token = token.next = token_source.getNextToken();
+ }
+ jj_ntk = -1;
+ if (token.kind == kind) {
+ jj_gen++;
+ if (++jj_gc > 100) {
+ jj_gc = 0;
+ for (int i = 0; i < jj_2_rtns.length; i++) {
+ JJCalls c = jj_2_rtns[i];
+ while (c != null) {
+ if (c.gen < jj_gen) {
+ c.first = null;
+ }
+ c = c.next;
+ }
+ }
+ }
+ return token;
+ }
+ token = oldToken;
+ jj_kind = kind;
+ throw generateParseException();
+ }
+
+ static private final class LookaheadSuccess extends java.lang.Error {
+ }
+
+ final private LookaheadSuccess jj_ls = new LookaheadSuccess();
+
+ private boolean jj_scan_token(int kind) {
+ if (jj_scanpos == jj_lastpos) {
+ jj_la--;
+ if (jj_scanpos.next == null) {
+ jj_lastpos = jj_scanpos = jj_scanpos.next = token_source
+ .getNextToken();
+ } else {
+ jj_lastpos = jj_scanpos = jj_scanpos.next;
+ }
+ } else {
+ jj_scanpos = jj_scanpos.next;
+ }
+ if (jj_rescan) {
+ int i = 0;
+ Token tok = token;
+ while (tok != null && tok != jj_scanpos) {
+ i++;
+ tok = tok.next;
+ }
+ if (tok != null) {
+ jj_add_error_token(kind, i);
+ }
+ }
+ if (jj_scanpos.kind != kind) {
+ return true;
+ }
+ if (jj_la == 0 && jj_scanpos == jj_lastpos) {
+ throw jj_ls;
+ }
+ return false;
+ }
+
+ /** Get the next Token. */
+ final public Token getNextToken() {
+ if (token.next != null) {
+ token = token.next;
+ } else {
+ token = token.next = token_source.getNextToken();
+ }
+ jj_ntk = -1;
+ jj_gen++;
+ return token;
+ }
+
+ /** Get the specific Token. */
+ final public Token getToken(int index) {
+ Token t = token;
+ for (int i = 0; i < index; i++) {
+ if (t.next != null) {
+ t = t.next;
+ } else {
+ t = t.next = token_source.getNextToken();
+ }
+ }
+ return t;
+ }
+
+ private int jj_ntk() {
+ if ((jj_nt = token.next) == null) {
+ return (jj_ntk = (token.next = token_source.getNextToken()).kind);
+ } else {
+ return (jj_ntk = jj_nt.kind);
+ }
+ }
+
+ private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+ private int[] jj_expentry;
+ private int jj_kind = -1;
+ private int[] jj_lasttokens = new int[100];
+ private int jj_endpos;
+
+ private void jj_add_error_token(int kind, int pos) {
+ if (pos >= 100) {
+ return;
+ }
+ if (pos == jj_endpos + 1) {
+ jj_lasttokens[jj_endpos++] = kind;
+ } else if (jj_endpos != 0) {
+ jj_expentry = new int[jj_endpos];
+ for (int i = 0; i < jj_endpos; i++) {
+ jj_expentry[i] = jj_lasttokens[i];
+ }
+ jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries
+ .iterator(); it.hasNext();) {
+ int[] oldentry = (int[]) (it.next());
+ if (oldentry.length == jj_expentry.length) {
+ for (int i = 0; i < jj_expentry.length; i++) {
+ if (oldentry[i] != jj_expentry[i]) {
+ continue jj_entries_loop;
+ }
+ }
+ jj_expentries.add(jj_expentry);
+ break jj_entries_loop;
+ }
+ }
+ if (pos != 0) {
+ jj_lasttokens[(jj_endpos = pos) - 1] = kind;
+ }
+ }
+ }
+
+ /** Generate ParseException. */
+ public ParseException generateParseException() {
+ jj_expentries.clear();
+ boolean[] la1tokens = new boolean[120];
+ if (jj_kind >= 0) {
+ la1tokens[jj_kind] = true;
+ jj_kind = -1;
+ }
+ for (int i = 0; i < 261; i++) {
+ if (jj_la1[i] == jj_gen) {
+ for (int j = 0; j < 32; j++) {
+ if ((jj_la1_0[i] & (1 << j)) != 0) {
+ la1tokens[j] = true;
+ }
+ if ((jj_la1_1[i] & (1 << j)) != 0) {
+ la1tokens[32 + j] = true;
+ }
+ if ((jj_la1_2[i] & (1 << j)) != 0) {
+ la1tokens[64 + j] = true;
+ }
+ if ((jj_la1_3[i] & (1 << j)) != 0) {
+ la1tokens[96 + j] = true;
+ }
+ }
+ }
+ }
+ for (int i = 0; i < 120; i++) {
+ if (la1tokens[i]) {
+ jj_expentry = new int[1];
+ jj_expentry[0] = i;
+ jj_expentries.add(jj_expentry);
+ }
+ }
+ jj_endpos = 0;
+ jj_rescan_token();
+ jj_add_error_token(0, 0);
+ int[][] exptokseq = new int[jj_expentries.size()][];
+ for (int i = 0; i < jj_expentries.size(); i++) {
+ exptokseq[i] = jj_expentries.get(i);
+ }
+ return new ParseException(token, exptokseq, tokenImage);
+ }
+
+ /** Enable tracing. */
+ final public void enable_tracing() {
+ }
+
+ /** Disable tracing. */
+ final public void disable_tracing() {
+ }
+
+ private void jj_rescan_token() {
+ jj_rescan = true;
+ for (int i = 0; i < 9; i++) {
+ try {
+ JJCalls p = jj_2_rtns[i];
+ do {
+ if (p.gen > jj_gen) {
+ jj_la = p.arg;
+ jj_lastpos = jj_scanpos = p.first;
+ switch (i) {
+ case 0:
+ jj_3_1();
+ break;
+ case 1:
+ jj_3_2();
+ break;
+ case 2:
+ jj_3_3();
+ break;
+ case 3:
+ jj_3_4();
+ break;
+ case 4:
+ jj_3_5();
+ break;
+ case 5:
+ jj_3_6();
+ break;
+ case 6:
+ jj_3_7();
+ break;
+ case 7:
+ jj_3_8();
+ break;
+ case 8:
+ jj_3_9();
+ break;
+ }
+ }
+ p = p.next;
+ } while (p != null);
+ } catch (LookaheadSuccess ls) {
+ }
+ }
+ jj_rescan = false;
+ }
+
+ private void jj_save(int index, int xla) {
+ JJCalls p = jj_2_rtns[index];
+ while (p.gen > jj_gen) {
+ if (p.next == null) {
+ p = p.next = new JJCalls();
+ break;
+ }
+ p = p.next;
+ }
+ p.gen = jj_gen + xla - jj_la;
+ p.first = token;
+ p.arg = xla;
+ }
+
+ static final class JJCalls {
+ int gen;
+ Token first;
+ int arg;
+ JJCalls next;
+ }
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
index d6861a8652..5fb7f2315f 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
@@ -1272,18 +1272,12 @@ String simple_selector(String selector, char comb) :
pseudoElt = null;
}
{
- ( simple_current=element_name()
- ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=hash(cond) ( cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=_class(cond) ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=pseudo(cond) ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=attrib(cond) ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- )
+ ( (simple_current=element_name()
+ ( cond=hash(cond) | cond=_class(cond)
+ | cond=attrib(cond) | cond=pseudo(cond) )* )
+ | ( cond = hash(cond) | cond=_class(cond)
+ | cond=attrib(cond) | cond=pseudo(cond) )+
+ )
{
if (simple_current == null) {
simple_current = "";
@@ -1445,7 +1439,7 @@ boolean isPseudoElement = false;
}
}
}
- | ( n=<FUNCTION> ( <S> )* d=skipStatementUntilRightParan() <RPARAN>
+ | ( n=<FUNCTION> ( <S> )* d=skipStatementUntilMatchingRightParan() <RPARAN>
{
// accept anything between function and a right parenthesis
String f = convertIdent(n.image);
@@ -2738,9 +2732,35 @@ String skipStatementUntilLeftBrace(){
}
JAVACODE
-String skipStatementUntilRightParan(){
- int[] rParan = {RPARAN};
- return skipStatementUntil(rParan);
+String skipStatementUntilMatchingRightParan(){
+ int[] leftTokens = {LPARAN, FUNCTION}; // a FUNCTION also contains "("
+ int[] rightTokens = {RPARAN};
+ StringBuffer s = new StringBuffer();
+ int difference = 1;
+ Token tok;
+ while(difference != 0){
+ tok = getToken(1);
+ if(tok.kind == EOF) {
+ return null;
+ }
+ for(int sym : leftTokens){
+ if(tok.kind == sym){
+ difference++;
+ }
+ }
+ for(int sym : rightTokens){
+ if(tok.kind == sym){
+ difference--;
+ }
+ }
+ if(difference != 0){
+ if (tok.image != null) {
+ s.append(tok.image);
+ }
+ getNextToken();
+ }
+ }
+ return s.toString().trim();
}
JAVACODE
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java
new file mode 100644
index 0000000000..5de1f95264
--- /dev/null
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.sass.internal.resolver;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+import org.w3c.css.sac.InputSource;
+
+import com.vaadin.sass.internal.ScssStylesheet;
+
+/**
+ * Base class for resolvers. Implements functionality for locating paths which
+ * an import can be relative to and helpers for extracting path information from
+ * the identifier.
+ *
+ * @since 7.2
+ * @author Vaadin Ltd
+ */
+public abstract class AbstractResolver implements ScssStylesheetResolver,
+ Serializable {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.vaadin.sass.internal.resolver.ScssStylesheetResolver#resolve(java
+ * .lang.String)
+ */
+ @Override
+ public InputSource resolve(ScssStylesheet parentStylesheet,
+ String identifier) {
+ // Remove a possible ".scss" suffix
+ identifier = identifier.replaceFirst(".scss$", "");
+
+ List<String> potentialParentPaths = getPotentialParentPaths(
+ parentStylesheet, identifier);
+
+ // remove path from identifier as it has already been added to the
+ // parent path
+ if (identifier.contains("/")) {
+ identifier = identifier.substring(identifier.lastIndexOf("/") + 1);
+ }
+
+ for (String path : potentialParentPaths) {
+ InputSource source = normalizeAndResolve(path + "/" + identifier);
+
+ if (source != null) {
+ return source;
+ }
+
+ // Try to find partial import (_identifier.scss)
+ source = normalizeAndResolve(path + "/_" + identifier);
+
+ if (source != null) {
+ return source;
+ }
+
+ }
+
+ return normalizeAndResolve(identifier);
+ }
+
+ /**
+ * Retrieves the parent paths which should be used while resolving relative
+ * identifiers. By default uses the parent stylesheet location and a
+ * possible absolute path in the identifier.
+ *
+ * @param parentStylesheet
+ * The parent stylesheet or null if there is no parent
+ * @param identifier
+ * The identifier to be resolved
+ * @return a list of paths in which to look for the relative import
+ */
+ protected List<String> getPotentialParentPaths(
+ ScssStylesheet parentStylesheet, String identifier) {
+ List<String> potentialParents = new ArrayList<String>();
+ if (parentStylesheet != null) {
+ potentialParents.add(extractFullPath(
+ parentStylesheet.getDirectory(), identifier));
+ }
+
+ // Identifier can be a full path so extract the path part also as a
+ // potential parent
+ if (identifier.contains("/")) {
+ potentialParents.add(extractFullPath("", identifier));
+ }
+
+ return potentialParents;
+
+ }
+
+ /**
+ * Extracts the full path from the path combined with the identifier
+ *
+ * @param path
+ * The base path
+ * @param identifier
+ * The identifier which may contain a path part, separated by "/"
+ * from the real identifier
+ * @return a normalized version of the path where identifier does not
+ * contain any directory information
+ */
+ protected String extractFullPath(String path, String identifier) {
+ int lastSlashPosition = identifier.lastIndexOf("/");
+ if (lastSlashPosition == -1) {
+ return path;
+ }
+ String identifierPath = identifier.substring(0, lastSlashPosition);
+ if ("".equals(path)) {
+ return identifierPath;
+ } else {
+ return path + "/" + identifierPath;
+ }
+ }
+
+ /**
+ * Resolves the normalized version of the given identifier
+ *
+ * @param identifier
+ * The identifier to resolve
+ * @return An input source if the resolver found one or null otherwise
+ */
+ protected InputSource normalizeAndResolve(String identifier) {
+ String normalized = normalize(identifier);
+ return resolveNormalized(normalized);
+ }
+
+ /**
+ * Resolves the identifier after it has been normalized using
+ * {@link #normalize(String)}.
+ *
+ * @param identifier
+ * The normalized identifier
+ * @return an InputSource if the resolver found a source or null otherwise
+ */
+ protected abstract InputSource resolveNormalized(String identifier);
+
+ /**
+ * Normalizes "." and ".." from the path string where parent path segments
+ * can be removed. Preserve leading "..". Also ensure / is used instead of \
+ * in all places.
+ *
+ * @param path
+ * A relative or absolute file path
+ * @return The normalized path
+ */
+ protected String normalize(String path) {
+
+ // Ensure only "/" is used, also in Windows
+ path = path.replace(File.separatorChar, '/');
+
+ // Split into segments
+ String[] segments = path.split("/");
+ Stack<String> result = new Stack<String>();
+
+ // Replace '.' and '..' segments
+ for (int i = 0; i < segments.length; i++) {
+ if (segments[i].equals(".")) {
+ // Segments marked '.' are ignored
+
+ } else if (segments[i].equals("..") && !result.isEmpty()
+ && !result.lastElement().equals("..")) {
+ // If segment is ".." then remove the previous iff the previous
+ // element is not a ".." and the result stack is not empty
+ result.pop();
+ } else {
+ // Other segments are just added to the stack
+ result.push(segments[i]);
+ }
+ }
+
+ // Reconstruct path
+ StringBuilder pathBuilder = new StringBuilder();
+ for (int i = 0; i < result.size(); i++) {
+ if (i > 0) {
+ pathBuilder.append("/");
+ }
+ pathBuilder.append(result.get(i));
+ }
+ return pathBuilder.toString();
+ }
+
+}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java
index 8711a0a3e9..755073bc4c 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java
@@ -15,31 +15,19 @@
*/
package com.vaadin.sass.internal.resolver;
-import java.io.File;
import java.io.InputStream;
import org.w3c.css.sac.InputSource;
-public class ClassloaderResolver implements ScssStylesheetResolver {
+public class ClassloaderResolver extends AbstractResolver {
@Override
- public InputSource resolve(String identifier) {
- // identifier should not have .scss, fileName should
- String ext = ".scss";
- if (identifier.endsWith(".css")) {
- ext = ".css";
- }
+ public InputSource resolveNormalized(String identifier) {
String fileName = identifier;
- if (identifier.endsWith(ext)) {
- identifier = identifier.substring(0,
- identifier.length() - ext.length());
- } else {
- fileName = fileName + ext;
+ if (!fileName.endsWith(".css")) {
+ fileName += ".scss";
}
- // Ensure only "/" is used, also in Windows
- fileName = fileName.replace(File.separatorChar, '/');
-
// Filename should be a relative path starting with VAADIN/...
int vaadinIdx = fileName.lastIndexOf("VAADIN/");
if (vaadinIdx > -1) {
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java
index 9bb1969ab1..786d0875da 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java
@@ -18,24 +18,46 @@ package com.vaadin.sass.internal.resolver;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
+import java.util.List;
import org.w3c.css.sac.InputSource;
-public class FilesystemResolver implements ScssStylesheetResolver {
+import com.vaadin.sass.internal.ScssStylesheet;
+public class FilesystemResolver extends AbstractResolver {
+
+ private String[] customPaths = null;
+
+ public FilesystemResolver(String... customPaths) {
+ this.customPaths = customPaths;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.vaadin.sass.internal.resolver.AbstractResolver#getPotentialPaths(
+ * com.vaadin.sass.internal.ScssStylesheet, java.lang.String)
+ */
@Override
- public InputSource resolve(String identifier) {
- // identifier should not have .scss, fileName should
- String ext = ".scss";
- if (identifier.endsWith(".css")) {
- ext = ".css";
+ protected List<String> getPotentialParentPaths(
+ ScssStylesheet parentStyleSheet, String identifier) {
+ List<String> potentialPaths = super.getPotentialParentPaths(
+ parentStyleSheet, identifier);
+ if (customPaths != null) {
+ for (String path : customPaths) {
+ potentialPaths.add(extractFullPath(path, identifier));
+ }
}
+
+ return potentialPaths;
+ }
+
+ @Override
+ public InputSource resolveNormalized(String identifier) {
String fileName = identifier;
- if (identifier.endsWith(ext)) {
- identifier = identifier.substring(0,
- identifier.length() - ext.length());
- } else {
- fileName = fileName + ext;
+ if (!fileName.endsWith(".css")) {
+ fileName += ".scss";
}
try {
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java
index 45f10836a3..64b3d10d88 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java
@@ -17,6 +17,8 @@ package com.vaadin.sass.internal.resolver;
import org.w3c.css.sac.InputSource;
+import com.vaadin.sass.internal.ScssStylesheet;
+
public interface ScssStylesheetResolver {
/**
* Called with the "identifier" of a stylesheet that the resolver should try
@@ -26,9 +28,12 @@ public interface ScssStylesheetResolver {
* stylesheet was found, e.g "runo.scss" might result in a URI like
* "VAADIN/themes/runo/runo.scss".
*
+ * @param parentStylesheet
+ * The parent style sheet
* @param identifier
* used fo find stylesheet
* @return InputSource for stylesheet (with URI set) or null if not found
*/
- public InputSource resolve(String identifier);
+ public InputSource resolve(ScssStylesheet parentStylesheet,
+ String identifier);
} \ No newline at end of file
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java
deleted file mode 100644
index fec16a54c8..0000000000
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2000-2013 Vaadin Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.vaadin.sass.internal.resolver;
-
-import java.io.File;
-import java.util.Stack;
-
-import org.w3c.css.sac.InputSource;
-
-public class VaadinResolver implements ScssStylesheetResolver {
-
- @Override
- public InputSource resolve(String identifier) {
-
- // Remove extra "." and ".."
- identifier = normalize(identifier);
-
- InputSource source = null;
-
- // Can we find the scss from the file system?
- ScssStylesheetResolver resolver = new FilesystemResolver();
- source = resolver.resolve(identifier);
-
- if (source == null) {
- // How about the classpath?
- resolver = new ClassloaderResolver();
- source = resolver.resolve(identifier);
- }
-
- return source;
- }
-
- /**
- * Normalizes "." and ".." from the path string where parent path segments
- * can be removed. Preserve leading "..".
- *
- * @param path
- * A relative or absolute file path
- * @return The normalized path
- */
- private static String normalize(String path) {
-
- // Ensure only "/" is used, also in Windows
- path = path.replace(File.separatorChar, '/');
-
- // Split into segments
- String[] segments = path.split("/");
- Stack<String> result = new Stack<String>();
-
- // Replace '.' and '..' segments
- for (int i = 0; i < segments.length; i++) {
- if (segments[i].equals(".")) {
- // Segments marked '.' are ignored
-
- } else if (segments[i].equals("..") && !result.isEmpty()
- && !result.lastElement().equals("..")) {
- // If segment is ".." then remove the previous iff the previous
- // element is not a ".." and the result stack is not empty
- result.pop();
- } else {
- // Other segments are just added to the stack
- result.push(segments[i]);
- }
- }
-
- // Reconstruct path
- StringBuilder pathBuilder = new StringBuilder();
- for (int i = 0; i < result.size(); i++) {
- if (i > 0) {
- pathBuilder.append("/");
- }
- pathBuilder.append(result.get(i));
- }
- return pathBuilder.toString();
- }
-
-}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java b/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java
index cb9896967a..e52767bb5a 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java
@@ -16,7 +16,6 @@
package com.vaadin.sass.internal.visitor;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
@@ -57,25 +56,14 @@ public class ImportNodeHandler {
ImportNode importNode = (ImportNode) n;
if (!importNode.isPureCssImport()) {
try {
- StringBuilder filePathBuilder = new StringBuilder(
- styleSheet.getFileName());
- filePathBuilder.append(File.separatorChar).append(
- importNode.getUri());
- if (!filePathBuilder.toString().endsWith(".scss")) {
- filePathBuilder.append(".scss");
- }
-
// set parent's charset to imported node.
ScssStylesheet imported = ScssStylesheet.get(
- filePathBuilder.toString(),
- styleSheet.getCharset());
- if (imported == null) {
- imported = ScssStylesheet.get(importNode.getUri());
- }
+ importNode.getUri(), styleSheet);
if (imported == null) {
- throw new FileNotFoundException(importNode.getUri()
- + " (parent: "
- + ScssStylesheet.get().getFileName() + ")");
+ throw new FileNotFoundException("Import '"
+ + importNode.getUri() + "' in '"
+ + styleSheet.getFileName()
+ + "' could not be found");
}
traverse(imported);
diff --git a/theme-compiler/tests/resources/css/compass-import.css b/theme-compiler/tests/resources/css/compass-import.css
new file mode 100644
index 0000000000..e3d4b5fcca
--- /dev/null
+++ b/theme-compiler/tests/resources/css/compass-import.css
@@ -0,0 +1,49 @@
+.content-navigation {
+ border-color: #3bbfce;
+ color: #0000ff;
+}
+
+.border {
+ padding: 8px;
+ margin: 8px;
+ border-color: #3bbfce;
+}
+
+.body {
+ background-image: url(compass/folder-test2/bg.png);
+ background: transparent url(compass/folder-test2/img/loading-indicator.gif);
+ background-image: url(http://abc/bg.png);
+ background-image: url(/abc/bg.png);
+}
+
+.base {
+ color: red;
+}
+
+.text {
+ font-weight: bold;
+}
+
+.footer {
+ border: 2px solid black;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+}
+
+.banner {
+ border: 1px solid black;
+ font-color: red;
+}
+
+.interpolation-test {
+ font-size: 14px;
+}
+
+.header {
+ width: 100%;
+}
+
+.badError {
+ border-width: 3px;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/sasslang/css/100-test_optional_extend_does_not_warn_when_extension_fails.css b/theme-compiler/tests/resources/sasslangbroken/css/100-test_optional_extend_does_not_warn_when_extension_fails.css
index 29116d880b..29116d880b 100644
--- a/theme-compiler/tests/resources/sasslang/css/100-test_optional_extend_does_not_warn_when_extension_fails.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/100-test_optional_extend_does_not_warn_when_extension_fails.css
diff --git a/theme-compiler/tests/resources/sasslang/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css b/theme-compiler/tests/resources/sasslangbroken/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css
index 77b7586abb..77b7586abb 100644
--- a/theme-compiler/tests/resources/sasslang/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css
diff --git a/theme-compiler/tests/resources/sasslang/css/36-test_extend_self_loop.css b/theme-compiler/tests/resources/sasslangbroken/css/36-test_extend_self_loop.css
index 234d524066..234d524066 100644
--- a/theme-compiler/tests/resources/sasslang/css/36-test_extend_self_loop.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/36-test_extend_self_loop.css
diff --git a/theme-compiler/tests/resources/sasslang/css/37-test_extend_warns_when_extendee_doesnt_exist.css b/theme-compiler/tests/resources/sasslangbroken/css/37-test_extend_warns_when_extendee_doesnt_exist.css
index 8b13789179..8b13789179 100644
--- a/theme-compiler/tests/resources/sasslang/css/37-test_extend_warns_when_extendee_doesnt_exist.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/37-test_extend_warns_when_extendee_doesnt_exist.css
diff --git a/theme-compiler/tests/resources/sasslang/css/38-test_extend_warns_when_extension_fails.css b/theme-compiler/tests/resources/sasslangbroken/css/38-test_extend_warns_when_extension_fails.css
index 29116d880b..29116d880b 100644
--- a/theme-compiler/tests/resources/sasslang/css/38-test_extend_warns_when_extension_fails.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/38-test_extend_warns_when_extension_fails.css
diff --git a/theme-compiler/tests/resources/sasslang/css/57-test_long_extendee_requires_all_selectors.css b/theme-compiler/tests/resources/sasslangbroken/css/57-test_long_extendee_requires_all_selectors.css
index 234d524066..234d524066 100644
--- a/theme-compiler/tests/resources/sasslang/css/57-test_long_extendee_requires_all_selectors.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/57-test_long_extendee_requires_all_selectors.css
diff --git a/theme-compiler/tests/resources/sasslang/css/60-test_long_extender_aborts_unification.css b/theme-compiler/tests/resources/sasslangbroken/css/60-test_long_extender_aborts_unification.css
index 18bc24e7cd..18bc24e7cd 100644
--- a/theme-compiler/tests/resources/sasslang/css/60-test_long_extender_aborts_unification.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/60-test_long_extender_aborts_unification.css
diff --git a/theme-compiler/tests/resources/sasslang/css/71-test_nested_extender_aborts_unification.css b/theme-compiler/tests/resources/sasslangbroken/css/71-test_nested_extender_aborts_unification.css
index 2337e9af40..2337e9af40 100644
--- a/theme-compiler/tests/resources/sasslang/css/71-test_nested_extender_aborts_unification.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/71-test_nested_extender_aborts_unification.css
diff --git a/theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css b/theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css
index 09b4ccac27..09b4ccac27 100644
--- a/theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css
diff --git a/theme-compiler/tests/resources/sasslang/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css b/theme-compiler/tests/resources/sasslangbroken/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css
index 8b13789179..8b13789179 100644
--- a/theme-compiler/tests/resources/sasslang/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css
diff --git a/theme-compiler/tests/resources/sasslang/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss b/theme-compiler/tests/resources/sasslangbroken/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss
index 6d707236f2..6d707236f2 100644
--- a/theme-compiler/tests/resources/sasslang/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss b/theme-compiler/tests/resources/sasslangbroken/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss
index 713644b221..713644b221 100644
--- a/theme-compiler/tests/resources/sasslang/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/36-test_extend_self_loop.scss b/theme-compiler/tests/resources/sasslangbroken/scss/36-test_extend_self_loop.scss
index ac40f00573..ac40f00573 100644
--- a/theme-compiler/tests/resources/sasslang/scss/36-test_extend_self_loop.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/36-test_extend_self_loop.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss b/theme-compiler/tests/resources/sasslangbroken/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss
index cd54108c97..cd54108c97 100644
--- a/theme-compiler/tests/resources/sasslang/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/38-test_extend_warns_when_extension_fails.scss b/theme-compiler/tests/resources/sasslangbroken/scss/38-test_extend_warns_when_extension_fails.scss
index 8381c7279a..8381c7279a 100644
--- a/theme-compiler/tests/resources/sasslang/scss/38-test_extend_warns_when_extension_fails.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/38-test_extend_warns_when_extension_fails.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/57-test_long_extendee_requires_all_selectors.scss b/theme-compiler/tests/resources/sasslangbroken/scss/57-test_long_extendee_requires_all_selectors.scss
index 011d26a83e..011d26a83e 100644
--- a/theme-compiler/tests/resources/sasslang/scss/57-test_long_extendee_requires_all_selectors.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/57-test_long_extendee_requires_all_selectors.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/60-test_long_extender_aborts_unification.scss b/theme-compiler/tests/resources/sasslangbroken/scss/60-test_long_extender_aborts_unification.scss
index 5238f3f93e..5238f3f93e 100644
--- a/theme-compiler/tests/resources/sasslang/scss/60-test_long_extender_aborts_unification.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/60-test_long_extender_aborts_unification.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/71-test_nested_extender_aborts_unification.scss b/theme-compiler/tests/resources/sasslangbroken/scss/71-test_nested_extender_aborts_unification.scss
index bcbb6e181d..bcbb6e181d 100644
--- a/theme-compiler/tests/resources/sasslang/scss/71-test_nested_extender_aborts_unification.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/71-test_nested_extender_aborts_unification.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss b/theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss
index 73f6254f21..73f6254f21 100644
--- a/theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss b/theme-compiler/tests/resources/sasslangbroken/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss
index 551764036f..551764036f 100644
--- a/theme-compiler/tests/resources/sasslang/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss
diff --git a/theme-compiler/tests/resources/scss/compass-test/compass-import.scss b/theme-compiler/tests/resources/scss/compass-test/compass-import.scss
new file mode 100644
index 0000000000..36d041b33c
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test/compass-import.scss
@@ -0,0 +1,4 @@
+@import "compass";
+.badError {
+ border-width: 3px;
+}
diff --git a/theme-compiler/tests/resources/scss/compass-test2/_compass.scss b/theme-compiler/tests/resources/scss/compass-test2/_compass.scss
new file mode 100644
index 0000000000..9b741c0f03
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/_compass.scss
@@ -0,0 +1,3 @@
+@import "compass/utilities";
+@import "compass/typography";
+@import "compass/css3";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss b/theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss
new file mode 100644
index 0000000000..36d041b33c
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss
@@ -0,0 +1,4 @@
+@import "compass";
+.badError {
+ border-width: 3px;
+}
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss
new file mode 100644
index 0000000000..42163ba193
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss
@@ -0,0 +1,3 @@
+@import "css3/border-radius";
+@import "css3/inline-block";
+@import "css3/opacity";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss
new file mode 100644
index 0000000000..a65c1ff292
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss
@@ -0,0 +1,3 @@
+@import "typography/links";
+@import "typography/lists";
+@import "typography/text";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss
new file mode 100644
index 0000000000..644ad3368b
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss
@@ -0,0 +1,3 @@
+@import "utilities/color";
+@import "utilities/general";
+@import "utilities/sprites";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss
new file mode 100644
index 0000000000..752003104b
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss
@@ -0,0 +1,4 @@
+.banner {
+ border: 1px solid black;
+ font-color: red;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss
new file mode 100644
index 0000000000..3fefab83b2
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss
@@ -0,0 +1,3 @@
+.interpolation-test {
+ font-size: 14px;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss
new file mode 100644
index 0000000000..f6bf34fe24
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss
@@ -0,0 +1,3 @@
+.header {
+ width: 100%;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss
new file mode 100644
index 0000000000..bc7318558e
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss
@@ -0,0 +1,3 @@
+.base {
+ color: red;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss
new file mode 100644
index 0000000000..af174b7095
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss
@@ -0,0 +1,3 @@
+.text {
+ font-weight: bold;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss
new file mode 100644
index 0000000000..8239527f7b
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss
@@ -0,0 +1,6 @@
+.footer {
+ border: 2px solid black;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss
new file mode 100644
index 0000000000..ea1b7a55f0
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss
@@ -0,0 +1,4 @@
+.content-navigation {
+ border-color: #3bbfce;
+ color: #0000ff;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss
new file mode 100644
index 0000000000..0c58c6433d
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss
@@ -0,0 +1,5 @@
+.border {
+ padding: 8px;
+ margin: 8px;
+ border-color: #3bbfce;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss
new file mode 100644
index 0000000000..28960f89fc
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss
@@ -0,0 +1,6 @@
+.body {
+ background-image: url(../folder-test2/bg.png);
+ background: transparent url(../folder-test2/img/loading-indicator.gif);
+ background-image: url(http://abc/bg.png);
+ background-image: url(/abc/bg.png);
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/license-readme.txt b/theme-compiler/tests/resources/scss/compass-test2/license-readme.txt
new file mode 100644
index 0000000000..90ba808179
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/license-readme.txt
@@ -0,0 +1,26 @@
+The design here is to use the stylesheets located at:
+https://github com/chriseppstein/compass/tree/stable/frameworks/compass/stylesheets
+
+and update the VAADIN code to be able to read them in such that an existing JRuby implementation can be replaced with VAADIN without any changes to one's *.scss and *.css files.
+
+The current short snippets of SCSS that are included here only for testing Compass compatibility might not qualify as significant or substantial parts, but in any case Compass is being mentioned for related tests pointing to the original implementation. These small portions of Compass are copied and modified for the testing of compatibility only.
+
+The license for Compass mentioned here:
+https://github.com/chriseppstein/compass/blob/stable/LICENSE.markdown
+
+is as follows:
+
+
+
+
+Copyright (c) 2009 Christopher M. Eppstein
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. No attribution is required by products that make use of this software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization.
+
+Contributors to this project agree to grant all rights to the copyright holder of the primary product. Attribution is maintained in the source control history of the product.
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss
new file mode 100644
index 0000000000..2f1e55e87e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+
+html { margin:10px; border:20px solid black; padding:30px; }
+body { height:10000px; margin:0; }
+div { position:absolute; width:100px; height:100px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss
new file mode 100644
index 0000000000..7b5eace311
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { top:0; background:yellow; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss
new file mode 100644
index 0000000000..c94661f654
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { right:0; background:orange; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss
new file mode 100644
index 0000000000..893b95ca14
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { bottom:0; background:brown; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss
new file mode 100644
index 0000000000..71d199866c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { left:0; background:pink; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss
new file mode 100644
index 0000000000..457f6a2d2f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004a.htm */
+.style { position:absolute; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss
new file mode 100644
index 0000000000..8990089fb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004b.htm */
+.style { position:fixed; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss
new file mode 100644
index 0000000000..1bad688abe
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004c.htm */
+.style { position:absolute; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; display:table; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss
new file mode 100644
index 0000000000..8f8b50e4c7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004d.htm */
+.style { position:fixed; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; display:table }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss
new file mode 100644
index 0000000000..0c460b5c3f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004e.htm */
+.style { display:table }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss
new file mode 100644
index 0000000000..29c22194fd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004e.htm */
+.style { position:absolute; left:100px; top:100px; width:100px; height:100px; border:10px solid black; background:yellow; margin:0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss
new file mode 100644
index 0000000000..33f39b6ab6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004f.htm */
+.style { display:table }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss
new file mode 100644
index 0000000000..c458e5dc33
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004f.htm */
+.style { position:fixed; left:100px; top:100px; width:100px; height:100px; border:10px solid black; background:yellow; margin:0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss
new file mode 100644
index 0000000000..a724d1b918
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005a.htm */
+.style { position:absolute; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss
new file mode 100644
index 0000000000..d9b1214a4b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005b.htm */
+.style { position:absolute; width:100px; height:100px; display:table; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss
new file mode 100644
index 0000000000..e6e7f6b90b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005c.htm */
+.style { position:fixed; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss
new file mode 100644
index 0000000000..1bc05d796a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005d.htm */
+.style { position:fixed; width:100px; height:100px; display:table; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss
new file mode 100644
index 0000000000..9080cba258
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-007.htm */
+.style { position:relative; top:100px; left:100px; height:100px; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss
new file mode 100644
index 0000000000..40f293c03b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-007.htm */
+.style { position:absolute; margin:0; bottom:0; height:30px; border:10px solid orange; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss
new file mode 100644
index 0000000000..ac865fb846
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009a.htm */
+.style { width:50%; height:50%; margin:50px; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss
new file mode 100644
index 0000000000..0b108fff62
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009b.htm */
+.style { position:absolute; left:50px; top:50px; width:50%; height:50%; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss
new file mode 100644
index 0000000000..f5bda4dc9f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009e.htm */
+.style { position:absolute; width:50%; height:50%; top:50px; left:50px; margin:0; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss
new file mode 100644
index 0000000000..788e50c119
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009f.htm */
+.style { position:relative; height:50%; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss
new file mode 100644
index 0000000000..e1c3142ad8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009f.htm */
+.style { position:absolute; width:50%; top:50px; left:50px; height:100%; margin:0; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss
new file mode 100644
index 0000000000..69f5c2fa6a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss
@@ -0,0 +1,93 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-non-replaced-width-margin-000.htm */
+
+
+div { height: 1px; direction: ltr; }
+
+/*
+ * Every case here has three divs nested inside of each other. The
+ * innermost div (absolutely positioned) is the testcase (and has
+ * color). The middle div's content edge establishes the containing
+ * block it would have if it were statically positioned. The outermost
+ * div is actually its containing block.
+ *
+ * the abs pos containing block runs from 50px to 700px from the left edge
+ * the static pos containing block runs from 150px to 650px from the left edge
+ */
+
+/* totals for html and body: 21px on the left, 34px on the right */
+html, body { border: transparent medium solid; }
+html { margin: 0 3px 0 2px; padding: 0 4px 0 3px; border-width: 0 3px 0 8px; }
+body { margin: 0 6px 0 3px; padding: 0 7px 0 1px; border-width: 0 11px 0 4px; }
+
+body > div {
+ position: relative;
+
+ top: 0;
+ left: 4px;
+
+ margin-left: 16px;
+ border-left: 9px solid transparent;
+ /* sum of above items (29px), plus 21px above, is 50px */
+ padding-left: 40px;
+
+ width: 595px;
+
+ padding-right: 15px;
+ /* sum of above items (650px), plus 50px above, is 700px */
+
+ border-right: 27px solid transparent;
+ margin-right: 13px;
+}
+
+body > div > div {
+ /* padding-left above: 40px */
+ margin-left: 7px;
+ border-left: 29px solid transparent;
+ padding-left: 24px;
+ /* sum of above items (100px), plus 50px above, is 150px */
+
+ /* padding-right above: 15px */
+ padding-right: 14px;
+ border-right: 3px solid transparent;
+ margin-right: 18px;
+ /* sum of above items (50px), subtracted from 700px, is 650px */
+}
+
+body > div > div > div {
+ background: navy;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+
+ /* specify everything; we'll put the autos as overrides below */
+ left: 3px;
+ margin-left: 17px;
+ border-left: 6px solid transparent;
+ padding-left: 1px;
+ padding-right: 9px;
+ border-right: 8px solid transparent;
+ margin-right: 19px;
+ right: 8px;
+}
+
+/* and give it 72px of intrinsic width for the case where it has width:auto */
+body > div > div > div > div {
+ width: 72px;
+}
+
+/* now we want to test all 128 combinations of presence of the following */
+
+body > div.adir { direction: rtl; }
+body > div.sdir > div { direction: rtl; }
+body > div.edir > div > div { direction: rtl; }
+body > div.ol > div > div { left: auto; }
+body > div.or > div > div { right: auto; }
+body > div.ml > div > div { margin-left: auto; }
+body > div.mr > div > div { margin-right: auto; }
+
+/* combined with each of these three */
+body > div.narrowwidth > div > div { width: 153px; }
+body > div.autowidth > div > div { width: auto; }
+body > div.widewidth > div > div { width: 660px; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss
new file mode 100644
index 0000000000..99f2a308f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss
@@ -0,0 +1,88 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-replaced-width-margin-000.htm */
+
+
+div { height: 1px; direction: ltr; }
+
+/*
+ * Every case here has two divs and an image nested inside of each other. The
+ * innermost div (absolutely positioned) is the testcase (and has
+ * color). The middle div's content edge establishes the containing
+ * block it would have if it were statically positioned. The outermost
+ * div is actually its containing block.
+ *
+ * the abs pos containing block runs from 50px to 700px from the left edge
+ * the static pos containing block runs from 150px to 650px from the left edge
+ */
+
+/* totals for html and body: 21px on the left, 34px on the right */
+html, body { border: transparent medium solid; }
+html { margin: 0 3px 0 2px; padding: 0 4px 0 3px; border-width: 0 3px 0 8px; }
+body { margin: 0 6px 0 3px; padding: 0 7px 0 1px; border-width: 0 11px 0 4px; }
+
+body > div {
+ position: relative;
+
+ top: 0;
+ left: 4px;
+
+ margin-left: 16px;
+ border-left: 9px solid transparent;
+ /* sum of above items (29px), plus 21px above, is 50px */
+ padding-left: 40px;
+
+ width: 595px;
+
+ padding-right: 15px;
+ /* sum of above items (650px), plus 50px above, is 700px */
+
+ border-right: 27px solid transparent;
+ margin-right: 13px;
+}
+
+body > div > div {
+ /* padding-left above: 40px */
+ margin-left: 7px;
+ border-left: 29px solid transparent;
+ padding-left: 24px;
+ /* sum of above items (100px), plus 50px above, is 150px */
+
+ /* padding-right above: 15px */
+ padding-right: 14px;
+ border-right: 3px solid transparent;
+ margin-right: 18px;
+ /* sum of above items (50px), subtracted from 700px, is 650px */
+}
+
+body > div > div > img {
+ background: navy;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+
+ /* specify everything; we'll put the autos as overrides below */
+ left: 3px;
+ margin-left: 17px;
+ border-left: 6px solid transparent;
+ padding-left: 1px;
+ padding-right: 9px;
+ border-right: 8px solid transparent;
+ margin-right: 19px;
+ right: 8px;
+}
+
+/* now we want to test all 128 combinations of presence of the following */
+
+body > div.adir { direction: rtl; }
+body > div.sdir > div { direction: rtl; }
+body > div.edir > div > img { direction: rtl; }
+body > div.ol > div > img { left: auto; }
+body > div.or > div > img { right: auto; }
+body > div.ml > div > img { margin-left: auto; }
+body > div.mr > div > img { margin-right: auto; }
+
+/* combined with each of these three (as appropriate for narrow/wide images) */
+body > div.narrowwidth > div > img { width: 153px; height: 1px; }
+body > div.autowidth > div > img { width: auto; }
+body > div.widewidth > div > img { width: 660px; height: 1px; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss
new file mode 100644
index 0000000000..3c30052779
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/anonymous-boxes-001.htm */
+
+ #parent { height: 200px; position: relative; }
+ #child { float: left; height: 50%; width: 100px; background: green; position: relative }
+ #background { position: absolute; top: 0; left: 0; width: 100px; height: 100px; background: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss
new file mode 100644
index 0000000000..3a4f2c68a2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-quotes-001.htm */
+
+ body { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scss
new file mode 100644
index 0000000000..f9ff59ef63
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss
new file mode 100644
index 0000000000..e81cd566d8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-space-001.htm */
+
+ body { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scss
new file mode 100644
index 0000000000..89cf375ace
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss
new file mode 100644
index 0000000000..f37bd48b03
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-space-002.htm */
+
+ body { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scss
new file mode 100644
index 0000000000..4ca1f3465a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss
new file mode 100644
index 0000000000..82b8dcb50a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-be-001.htm */
+
+ body { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scss
new file mode 100644
index 0000000000..3bf9f5f6b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss
new file mode 100644
index 0000000000..92ca00bc53
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-le-001.htm */
+
+ body { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scss
new file mode 100644
index 0000000000..483b8494dd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss
new file mode 100644
index 0000000000..ed10b1ea02
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss
@@ -0,0 +1,40 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-001.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ /* 100 x 120 bgpaint area */
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-none.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-none.svg);
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss
new file mode 100644
index 0000000000..849421d055
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss
@@ -0,0 +1,42 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-002.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width.svg);
+ }
+ .control {
+ width: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss
new file mode 100644
index 0000000000..baac57662f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss
@@ -0,0 +1,42 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-003.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-height.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-height.svg);
+ }
+ .control {
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss
new file mode 100644
index 0000000000..22a6983830
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss
@@ -0,0 +1,45 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-004.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-ratio-portrait.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-ratio-portrait.svg);
+ }
+ .cover .control {
+ width: 66px;
+ }
+ .limit .control {
+ width: 67px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss
new file mode 100644
index 0000000000..cc0e002964
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss
@@ -0,0 +1,45 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-005.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-ratio-landscape.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-ratio-landscape.svg);
+ }
+ .cover .control {
+ height: 53px;
+ }
+ .limit .control {
+ height: 54px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss
new file mode 100644
index 0000000000..fda8699018
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-006.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width-pc-height-pc.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width-pc-height-pc.svg);
+ }
+ .control {
+ width: 32px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss
new file mode 100644
index 0000000000..09b38ffacb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-007.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width-ratio.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width-ratio.svg);
+ }
+ .control {
+ width: 40px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss
new file mode 100644
index 0000000000..f54ce9a61a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-008.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-height-ratio.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-height-ratio.svg);
+ }
+ .control {
+ width: 40px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss
new file mode 100644
index 0000000000..6b9b2d6456
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-009.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width-height.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width-height.svg);
+ }
+ .control {
+ width: 40px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss
new file mode 100644
index 0000000000..5a3d20fd24
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss
@@ -0,0 +1,25 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-display-types-001.htm */
+
+div { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"}
+
+div:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+div:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+.block:before, .block:after { display:block; }
+.inline:before, .inline:after { display:inline; }
+.inline-block:before, .inline-block:after { display:inline-block; }
+.table:before, .table:after { display:table; }
+.inline-table:before, .inline-table:after { display:inline-table; }
+.table-row-group:before, .table-row-group:after { display:table-row-group; }
+.table-row:before, .table-row:after { display:table-row; }
+.table-cell:before, .table-cell:after { display:table-cell; }
+.table-caption:before, .table-caption:after { display:table-caption; }
+
+div { border:1px solid green; margin:5px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss
new file mode 100644
index 0000000000..b2b28a5c97
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss
@@ -0,0 +1,12 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-dynamic-attr-001.htm */
+
+body {
+ font-family:sans-serif;
+}
+body:before {
+ content:attr(my-attr);
+}
+body:after {
+ content:attr(my-attr-2);
+}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss
new file mode 100644
index 0000000000..4a1861941e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss
@@ -0,0 +1,11 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-dynamic-restyle-001.htm */
+
+body:before {
+ content:"Before";
+ border:inherit;
+}
+.cl:after {
+ display:block;
+ content:"After";
+}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss
new file mode 100644
index 0000000000..324cae53d2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss
@@ -0,0 +1,29 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-floated-001.htm */
+
+div { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"; }
+
+div:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+div:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+.beforeleft:before {
+ float:left;
+}
+.beforeright:before {
+ float:right;
+}
+.afterleft:after {
+ float:left;
+}
+.afterright:after {
+ float:right;
+}
+
+div { border:1px solid green; margin:5px; }
+div { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss
new file mode 100644
index 0000000000..c419306c2a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-images-001.htm */
+
+div:before {
+ content:url(missing-image.png);
+}
+div { border:1px solid green; margin:5px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss
new file mode 100644
index 0000000000..a5b7d7b26b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-positioned-001.htm */
+
+div { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"; }
+
+.gen:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+.gen:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+.abs:before {
+ position:absolute;
+ left:0;
+}
+.abs:after {
+ position:absolute;
+ right:0;
+}
+
+.rel:before {
+ position:relative;
+ top:-10px;
+}
+.rel:after {
+ position:relative;
+ top:10px;
+}
+
+div { border:1px solid green; margin:5px; height:100px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss
new file mode 100644
index 0000000000..33ee1ef76b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-positioned-001.htm */
+.style { position:relative; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss
new file mode 100644
index 0000000000..f199f3ae10
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss
@@ -0,0 +1,44 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-table-parts-001.htm */
+
+table, div.gen { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"; }
+
+.gen:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+.gen:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+table { border:1px solid blue; }
+td { border:1px solid cyan; }
+td { border-spacing:0; padding:0; }
+
+tr.gen:before, tr.gen:after { display:table-cell; }
+tbody.gen:before, tbody.gen:after { display:table-row; }
+table.gen:before, table.gen:after { display:table-row-group; }
+table.col:before, table.gen.col:after { display:table-column-group; }
+/* note reordering here! */
+table.headfoot:after { display:table-header-group; }
+table.headfoot:before { display:table-footer-group; }
+
+.cell { display:table-cell; }
+.row { display:table-row; }
+.rowgroup { display:table-row-group; }
+.table { display:table; }
+div.gencell:before, div.gencell:after { display:table-cell; }
+div.genrow:before, div.genrow:after { display:table-row; }
+div.genblock:before, div.genblock:after { display:block; }
+div.geninline:before, div.geninline:after { display:inline; }
+
+div { border:1px solid green; margin:5px; }
+
+.varyheight:before { height:100px; background:yellow; }
+.varyheight > div { height:80px; background:orange; }
+.varyheight:after { height:60px; background:brown; }
+
+.varywidth:before { background:yellow; }
+.varywidth > div { background:orange; }
+.varywidth:after { background:brown; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss
new file mode 100644
index 0000000000..652b7fb64f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-table-parts-001.htm */
+.style { border:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss
new file mode 100644
index 0000000000..a4bd9b3f27
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-table-whitespace-001.htm */
+
+.gen0:before {
+ padding:1px;
+}
+.gen1:before {
+ content: " ";
+}
+.gen2:before {
+ content: attr(missing);
+}
+.gen3:before {
+ content: url(missing-image.png);
+}
+
+div { border:1px solid green; margin:5px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss
new file mode 100644
index 0000000000..f2d73053d4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-append-001.htm */
+
+
+ body > span { outline: 1px dotted black; }
+ body > span > span { display: block; width: 10em; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss
new file mode 100644
index 0000000000..15821f265e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-append-002.htm */
+
+ #outermost { border: 2px solid; }
+ #outer { border: 4px solid yellow; }
+ #inner { border: 6px sold green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss
new file mode 100644
index 0000000000..92b70020f2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-append-002.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss
new file mode 100644
index 0000000000..c59fe1cefd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-001.htm */
+.style { direction: ltr }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss
new file mode 100644
index 0000000000..24f75e5c03
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-001.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-right: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss
new file mode 100644
index 0000000000..578cdb672b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss
new file mode 100644
index 0000000000..ebd82de172
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-002.htm */
+.style { direction: rtl }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss
new file mode 100644
index 0000000000..800d89067f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-002.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-right: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss
new file mode 100644
index 0000000000..47d968fb36
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-002.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss
new file mode 100644
index 0000000000..bec0ff7a45
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-003.htm */
+.style { direction: ltr }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss
new file mode 100644
index 0000000000..d55949134e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-003.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-left: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss
new file mode 100644
index 0000000000..972cbf30eb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-003.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss
new file mode 100644
index 0000000000..6259effef6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-004.htm */
+.style { direction: rtl }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss
new file mode 100644
index 0000000000..85f7e37a8c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-004.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-left: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss
new file mode 100644
index 0000000000..e4dfb13524
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-004.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss
new file mode 100644
index 0000000000..081e58affc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-float-between-001.htm */
+.style { position: relative; left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss
new file mode 100644
index 0000000000..99babd326f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-float-between-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss
new file mode 100644
index 0000000000..8f5a27f693
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-float-between-001.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss
new file mode 100644
index 0000000000..4482654240
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss
new file mode 100644
index 0000000000..d0b1193abc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss
new file mode 100644
index 0000000000..a820d992bc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001c.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss
new file mode 100644
index 0000000000..dc7c044309
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001d.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss
new file mode 100644
index 0000000000..4ee59b7c3c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001e.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss
new file mode 100644
index 0000000000..544fddaee6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001f.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss
new file mode 100644
index 0000000000..5bbfb01512
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001g.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss
new file mode 100644
index 0000000000..d03bbf51a7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001h.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss
new file mode 100644
index 0000000000..d48cc6477c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001i.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss
new file mode 100644
index 0000000000..8662fec547
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001j.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss
new file mode 100644
index 0000000000..ed1c00b772
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001k.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss
new file mode 100644
index 0000000000..7e792b2f0b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001l.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss
new file mode 100644
index 0000000000..76a2977e4f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss
new file mode 100644
index 0000000000..1c468dc942
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss
new file mode 100644
index 0000000000..17517332ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002c.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss
new file mode 100644
index 0000000000..697822ae0a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002d.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss
new file mode 100644
index 0000000000..20d8d46d16
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002e.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss
new file mode 100644
index 0000000000..b0680028e7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002f.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss
new file mode 100644
index 0000000000..67bc7ebadc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002g.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss
new file mode 100644
index 0000000000..5c7c0a767d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002h.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss
new file mode 100644
index 0000000000..810b088676
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002i.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss
new file mode 100644
index 0000000000..71760d321c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-003.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss
new file mode 100644
index 0000000000..7d18b5f0bb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-004.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss
new file mode 100644
index 0000000000..5fae99411f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-006.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss
new file mode 100644
index 0000000000..3e59471379
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-007.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss
new file mode 100644
index 0000000000..840e4c41ac
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-008a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss
new file mode 100644
index 0000000000..b1e3f46489
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-008b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss
new file mode 100644
index 0000000000..9ccc845aa6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-008c.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss
new file mode 100644
index 0000000000..134414535f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-009.htm */
+
+ body > span { border: 3px solid blue }
+ body > span > span { border: 3px solid cyan }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss
new file mode 100644
index 0000000000..62431c82a3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-010.htm */
+
+ body > span { border: 3px solid blue }
+ body > span > span { border: 3px solid cyan }
+ body > span > span:after { content: "Ten" }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss
new file mode 100644
index 0000000000..2844241d70
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-011.htm */
+
+ body > span { border: 3px solid blue }
+ body > span > span { border: 3px solid cyan }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss
new file mode 100644
index 0000000000..105753b69f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-012.htm */
+
+ #i { display: inline; border: 2px solid; }
+ #i:after { display: block; content: "Three"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss
new file mode 100644
index 0000000000..dd0da56c7d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-013.htm */
+
+ #i { border: 2px solid; }
+ #i:before { display: block; content: "One"; }
+ #i:after { content: "Three"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss
new file mode 100644
index 0000000000..fce9f7e44a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-013.htm */
+.style { display: none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss
new file mode 100644
index 0000000000..0d1f7f3a3e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-014.htm */
+
+ #i { border: 2px solid; }
+ #i:before { display: block; content: "One"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss
new file mode 100644
index 0000000000..4fb8ca38ec
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-014.htm */
+.style { display: none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss
new file mode 100644
index 0000000000..064cb0734c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-015.htm */
+
+ #i { display: inline; border: 2px solid; }
+ #i:after { display: block; content: "Three"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss
new file mode 100644
index 0000000000..27a0dd79bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-016a.htm */
+
+ #i { border: 2px solid; }
+ #i:after { display: block; content: "Two"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss
new file mode 100644
index 0000000000..e2ddc868f4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-016a.htm */
+.style { display: none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss
new file mode 100644
index 0000000000..7b53f1212b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-016b.htm */
+
+ #i { border: 2px solid; }
+ #i:after { display: block; content: "Two"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss
new file mode 100644
index 0000000000..fb90ff7fde
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-017.htm */
+.style { width: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss
new file mode 100644
index 0000000000..7efbd77d83
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-017.htm */
+.style { border: 2px solid blue; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss
new file mode 100644
index 0000000000..95aac0261c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-017.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss
new file mode 100644
index 0000000000..d683f3fa54
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001a.htm */
+.style { direction: ltr; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss
new file mode 100644
index 0000000000..aae6310bf0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001a.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss
new file mode 100644
index 0000000000..4a040231ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001b.htm */
+.style { direction: ltr; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss
new file mode 100644
index 0000000000..5f99cd4c5c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001b.htm */
+.style { direction: rtl }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss
new file mode 100644
index 0000000000..bede015e4e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001b.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss
new file mode 100644
index 0000000000..7c7cbd0808
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002a.htm */
+.style { direction: rtl; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss
new file mode 100644
index 0000000000..305b8ac11a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002a.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss
new file mode 100644
index 0000000000..7b8252e044
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002b.htm */
+.style { direction: rtl; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss
new file mode 100644
index 0000000000..11e90f792e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002b.htm */
+.style { direction: ltr }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss
new file mode 100644
index 0000000000..3416f8de01
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002b.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss
new file mode 100644
index 0000000000..e78538e895
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-nested-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss
new file mode 100644
index 0000000000..9367c041d0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-nested-002.htm */
+.style { border: 5px solid blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss
new file mode 100644
index 0000000000..fee6eb9e60
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-nested-002.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss
new file mode 100644
index 0000000000..efb841d5dc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-percents-001.htm */
+.style { height: 200px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss
new file mode 100644
index 0000000000..57e6d10c49
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-percents-001.htm */
+.style { display: block; height: 50%; border: 10px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss
new file mode 100644
index 0000000000..ebe1d5373b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-001.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss
new file mode 100644
index 0000000000..ca9c6e7a45
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-002.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss
new file mode 100644
index 0000000000..dc223e8297
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-003.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss
new file mode 100644
index 0000000000..ed1891d7f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-004.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss
new file mode 100644
index 0000000000..c3f1c4fcc0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-005.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss
new file mode 100644
index 0000000000..2f4d5643be
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-006.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss
new file mode 100644
index 0000000000..a0fdf69e23
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-whitespace-001a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss
new file mode 100644
index 0000000000..4c860c2a7e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-whitespace-001b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss
new file mode 100644
index 0000000000..898d753e68
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-001.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss
new file mode 100644
index 0000000000..7a2f6b66db
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss
new file mode 100644
index 0000000000..bfd8fdb6e5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-001.htm */
+.style { border-style:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss
new file mode 100644
index 0000000000..e0dbae8b77
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss
new file mode 100644
index 0000000000..a5f32321c6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss
new file mode 100644
index 0000000000..49b52904b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-002.htm */
+.style { border-width:11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss
new file mode 100644
index 0000000000..8b018c1980
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-003.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss
new file mode 100644
index 0000000000..c4dc834384
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss
new file mode 100644
index 0000000000..1f0a0f3c56
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-004.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss
new file mode 100644
index 0000000000..14810d15b6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-004.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss
new file mode 100644
index 0000000000..15f89578e1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-004.htm */
+.style { border-style:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss
new file mode 100644
index 0000000000..5117efb468
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-005.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss
new file mode 100644
index 0000000000..2e248a0aaa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-005.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss
new file mode 100644
index 0000000000..15ba20a79f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-005.htm */
+.style { border-style:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss
new file mode 100644
index 0000000000..d6af94204f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss
new file mode 100644
index 0000000000..1d942d6b38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss
new file mode 100644
index 0000000000..27a43b6bd8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss
new file mode 100644
index 0000000000..ae15dde154
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss
new file mode 100644
index 0000000000..8ee152dc38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss
new file mode 100644
index 0000000000..c6318a3584
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-002.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss
new file mode 100644
index 0000000000..0d7f407a9d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss
new file mode 100644
index 0000000000..e58b8bb8df
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss
new file mode 100644
index 0000000000..cadad9538f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss
new file mode 100644
index 0000000000..ba42b5052f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss
new file mode 100644
index 0000000000..262d6bbedd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss
new file mode 100644
index 0000000000..d32773435c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss
new file mode 100644
index 0000000000..4ca986a899
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss
new file mode 100644
index 0000000000..caf207660d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss
new file mode 100644
index 0000000000..f7228f354e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-002.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss
new file mode 100644
index 0000000000..d5b7eae31a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss
new file mode 100644
index 0000000000..4b42a2998c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss
new file mode 100644
index 0000000000..a967891706
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss
new file mode 100644
index 0000000000..070b886636
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss
new file mode 100644
index 0000000000..0aec943a6c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss
new file mode 100644
index 0000000000..1c23b85d86
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss
new file mode 100644
index 0000000000..7bfdeac373
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss
new file mode 100644
index 0000000000..f50de68330
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss
new file mode 100644
index 0000000000..62bb238c7a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-002.htm */
+.style { border:solid green 2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss
new file mode 100644
index 0000000000..a18235986c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss
new file mode 100644
index 0000000000..16f289c84f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss
new file mode 100644
index 0000000000..0cef689399
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss
new file mode 100644
index 0000000000..aa87c0c1d3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss
new file mode 100644
index 0000000000..9d26fe3df3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss
new file mode 100644
index 0000000000..7195bcef72
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss
new file mode 100644
index 0000000000..be951ef050
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss
new file mode 100644
index 0000000000..8fde9220db
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss
new file mode 100644
index 0000000000..86f188e449
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-002.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss
new file mode 100644
index 0000000000..7a94d7c74b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss
new file mode 100644
index 0000000000..2c43199f38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss
new file mode 100644
index 0000000000..08d7e668d6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss
new file mode 100644
index 0000000000..98f04c7a57
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss
new file mode 100644
index 0000000000..7a7cf28388
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-001.htm */
+.style { border-collapse:collapse; border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss
new file mode 100644
index 0000000000..d5453532b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss
new file mode 100644
index 0000000000..da3a1b0a1b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-002.htm */
+.style { border-collapse:collapse; border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss
new file mode 100644
index 0000000000..aff4d99c71
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss
new file mode 100644
index 0000000000..fd48bad69d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-003.htm */
+.style { border-collapse:collapse; border:none green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss
new file mode 100644
index 0000000000..10da13d64d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-001.htm */
+
+td {width: 100px; text-align:center}
+div {position:absolute; border:green 4px solid}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss
new file mode 100644
index 0000000000..c87fcbc76a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-001.htm */
+.style { border-collapse:collapse; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss
new file mode 100644
index 0000000000..340f309e2e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-001.htm */
+.style { border:solid 4px orange; height:30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss
new file mode 100644
index 0000000000..d33ffa4284
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-002.htm */
+
+td {width: 100px; text-align:center}
+caption {border:solid 4px green}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss
new file mode 100644
index 0000000000..88535218ab
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-002.htm */
+.style { border-collapse:collapse; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss
new file mode 100644
index 0000000000..ee3eb8c007
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-002.htm */
+.style { border:solid 4px orange; height:30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss
new file mode 100644
index 0000000000..b09d86f8f7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/charset-attr-001.htm */
+
+ body { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scss
new file mode 100644
index 0000000000..bfaba9dc01
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss
new file mode 100644
index 0000000000..f0a8248396
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-1.html */
+li,p { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss
new file mode 100644
index 0000000000..d0d1a14d60
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-10.html */
+p { background-color : red }
+p[title$="bar"] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss
new file mode 100644
index 0000000000..ca558792b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-11.html */
+p { background-color : red }
+p[title*="bar"] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss
new file mode 100644
index 0000000000..344a9e8e46
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-13.html */
+li { background-color : red }
+.t1 { background-color : lime }
+li.t2 { background-color : lime }
+.t3 { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss
new file mode 100644
index 0000000000..faf4d3c7cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14.html */
+p { background-color : red ; border : thick solid red ; padding : 1em }
+p.t1 { background-color : lime }
+p.t2 { border : thick solid green }
+
+div { background: green; color: white; }
+div.teST { background: red; color: yellow; }
+div.te { background: red; color: yellow; }
+div.st { background: red; color: yellow; }
+div.te.st { background: red; color: yellow; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss
new file mode 100644
index 0000000000..c669785ac7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-144.html */
+div :not(:enabled):not(:disabled) { background: lime; }
+p { background : red;}
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss
new file mode 100644
index 0000000000..a41bb1ed85
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-148.html */
+
+ p { background: lime; }
+ p:empty { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss
new file mode 100644
index 0000000000..23eba2f553
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-149.html */
+
+ address:empty { background: lime; }
+ address { background: red; margin: 0; height: 1em; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss
new file mode 100644
index 0000000000..ae6c5ca1c7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-149b.html */
+
+ address:empty { background: lime; }
+ address { background: red; margin: 0; height: 1em; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss
new file mode 100644
index 0000000000..5851edc2e3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14b.html */
+
+p { background: green; color: white; }
+.t1.fail { background: red; color: yellow; }
+.fail.t1 { background: red; color: yellow; }
+.t2.fail { background: red; color: yellow; }
+.fail.t2 { background: red; color: yellow; }
+/* Note: This is a valid test even per CSS1, since in CSS1 those rules
+ are invalid and should be dropped. */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss
new file mode 100644
index 0000000000..d32fec8496
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14c.html */
+
+p { background: red; color: yellow; }
+p.t1.t2 { background: green; color: white; }
+div { background: green; color: white; }
+div.t1 { background: red; color: yellow; }
+address { background: red; color: yellow; }
+address.t5.t5 { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss
new file mode 100644
index 0000000000..3432db6913
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14d.html */
+
+p { background: green; color: white; }
+.t1:not(.t2) { background: red; color: yellow; }
+:not(.t2).t1 { background: red; color: yellow; }
+.t2:not(.t1) { background: red; color: yellow; }
+:not(.t1).t2 { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss
new file mode 100644
index 0000000000..979edeed91
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14e.html */
+
+p { background: green; color: white; }
+p:not(.t1):not(.t2) { background: red; color: yellow; }
+div { background: red; color: yellow; }
+div:not(.t1) { background: green; color: white; }
+address { background: green; color: white; }
+address:not(.t5):not(.t5) { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss
new file mode 100644
index 0000000000..ff1d3a2d9b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15.html */
+li { background-color : red }
+#t1 { background-color : lime }
+li#t2 { background-color : lime }
+li#t3 { background-color : lime }
+#t4 { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss
new file mode 100644
index 0000000000..bb9cc2cb7c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-150.html */
+
+ address:empty { background: lime; }
+ address { background: red; margin: 0; height: 1em; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss
new file mode 100644
index 0000000000..ec229bdd33
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-151.html */
+
+ address { background: lime; margin: 0; height: 1em; }
+ address:empty { background: red; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss
new file mode 100644
index 0000000000..bf765f8b5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-152.html */
+
+ address { background: lime; margin: 0; height: 1em; }
+ address:empty { background: red; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss
new file mode 100644
index 0000000000..1f073c35b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155.html */
+
+ p { background: lime; }
+ .5cm { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss
new file mode 100644
index 0000000000..9ce3a19428
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155a.html */
+
+ p { background: lime; }
+ .\5cm { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss
new file mode 100644
index 0000000000..83340f5351
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155b.html */
+
+ p { background: lime; }
+ .two\ words { background: red; }
+
+ /* the "." and "~=" forms match on a space separated list of words.
+ In such a list, a word containing a space can never match, since it
+ would by definition be two words. */
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss
new file mode 100644
index 0000000000..516c8de4e0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155c.html */
+
+ p { background: lime; }
+ .one.word { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss
new file mode 100644
index 0000000000..6930469379
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155d.html */
+
+ .one\.word { background: lime; }
+ p { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss
new file mode 100644
index 0000000000..058b6b4290
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-156.html */
+
+ p { background: lime; }
+ foo & address, p { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss
new file mode 100644
index 0000000000..033b8f59a9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-156b.html */
+
+ foo & address, p { background: red; }
+ p { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss
new file mode 100644
index 0000000000..62d2a7ceb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-156c.html */
+
+ foo & address, p { background: red ! important; }
+ p { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss
new file mode 100644
index 0000000000..6f85988756
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-159.html */
+
+ ::selection { background: lime; }
+ :selection { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss
new file mode 100644
index 0000000000..b2fb3ac6ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15b.html */
+
+p { background: green; color: white; }
+#test#fail { background: red; color: yellow; }
+#fail#test { background: red; color: yellow; }
+#fail { background: red; color: yellow; }
+div { background: red; color: yellow; }
+#pass#pass { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss
new file mode 100644
index 0000000000..7b909a1ac1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-16.html */
+p.test a { background-color : red }
+p.test *:link { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss
new file mode 100644
index 0000000000..45c7c74e02
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-160.html */
+
+ p { background: lime; }
+ p:subject { background: red; } /* this is not valid CSS, and if UAs
+ implemented the experimental :subject pseudo-class they should have
+ used the :-vnd-ident syntax. */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss
new file mode 100644
index 0000000000..c10cdd2dfd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss
@@ -0,0 +1,26 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-161.html */
+
+ p { background: lime; }
+ p * { background: lime; }
+ p > * { background: lime; }
+ p + * { background: lime; }
+ p ~ * { background: lime; }
+
+ /* let's try some pseudos that are not valid CSS but are likely to
+ be implemented as extensions in some UAs. These should not be
+ recognised, as UAs implementing such extensions should use the
+ :-vnd-ident syntax. */
+
+ :canvas { background: red; }
+ :viewport { background: red; }
+ :window { background: red; }
+ :menu { background: red; }
+ :table { background: red; }
+ :select { background: red; }
+ ::canvas { background: red; }
+ ::viewport { background: red; }
+ ::window { background: red; }
+ ::menu { background: red; }
+ ::table { background: red; }
+ ::select { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss
new file mode 100644
index 0000000000..de27d9ffd2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-166.html */
+
+ p:first-letter { background-color: red; }
+ p::first-letter { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss
new file mode 100644
index 0000000000..ed465fe93b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-166a.html */
+
+ p::first-letter { background-color: red; }
+ p:first-letter { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss
new file mode 100644
index 0000000000..5aad6a87bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-167.html */
+
+ p:first-line { background-color: red; }
+ p::first-line { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss
new file mode 100644
index 0000000000..109defc654
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-167a.html */
+
+ p::first-line { background-color: red; }
+ p:first-line { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss
new file mode 100644
index 0000000000..81f5c1e9b1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-168.html */
+
+ span:before { background-color: red; content: 'FAILED'; }
+ span::before { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss
new file mode 100644
index 0000000000..0898dd7d8c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-168a.html */
+
+ span::before { background-color: red; content: 'FAILED'; }
+ span:before { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss
new file mode 100644
index 0000000000..69ddf7fccc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-169.html */
+
+ span:after { background-color: red; content: 'FAILED'; }
+ span::after { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss
new file mode 100644
index 0000000000..efb74238ec
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-169a.html */
+
+ span::after { background-color: red; content: 'FAILED'; }
+ span:after { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss
new file mode 100644
index 0000000000..2b881ad09d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-17.html */
+p.test a { background-color : red }
+p.test *:visited { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss
new file mode 100644
index 0000000000..e33d2f5b12
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170.html */
+
+ span { color: red; }
+ span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss
new file mode 100644
index 0000000000..7d09cee5ee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170a.html */
+
+ .span { color: red; }
+ .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss
new file mode 100644
index 0000000000..9144c18516
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170b.html */
+
+ .span { color: red; }
+ .span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss
new file mode 100644
index 0000000000..adcf326e76
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170c.html */
+
+ p.span { color: red; }
+ p:not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span) { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss
new file mode 100644
index 0000000000..1ace26ae1f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170d.html */
+
+ p { color: red; }
+ p:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss
new file mode 100644
index 0000000000..eb61d12ff2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-175a.html */
+
+ p { color: green; }
+ .13 { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss
new file mode 100644
index 0000000000..91066d4671
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-175b.html */
+
+ p { color: green; }
+ .\13 { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss
new file mode 100644
index 0000000000..d7555e9fa0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-175c.html */
+
+ p { color: red; }
+ .\31 \33 { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss
new file mode 100644
index 0000000000..474be8d9e8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss
@@ -0,0 +1,11 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-176.html */
+
+p { background: red; color: yellow; }
+p:not(#other).class:not(.fail).test#id#id { background: green; color: white; }
+div { background: green; color: white; }
+div:not(#theid).class:not(.fail).test#theid#theid { background: red; color: yellow; }
+div:not(#other).notclass:not(.fail).test#theid#theid { background: red; color: yellow; }
+div:not(#other).class:not(.test).test#theid#theid { background: red; color: yellow; }
+div:not(#other).class:not(.fail).nottest#theid#theid { background: red; color: yellow; }
+div:not(#other).class:not(.fail).nottest#theid#other { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss
new file mode 100644
index 0000000000..29359bcba2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-177a.html */
+
+ p:selection { color: yellow; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss
new file mode 100644
index 0000000000..64f2c84901
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-177b.html */
+
+ div { color: green; }
+ p::first-child { color: yellow; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss
new file mode 100644
index 0000000000..92b765dff4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-178.html */
+
+ div { color: green; }
+ p:not(:first-line) { color: yellow; background: red; }
+ p:not(:after) { color: yellow; background: red; content: ' THIS TEST HAS FAILED! '; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss
new file mode 100644
index 0000000000..ce5e3a8630
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-179.html */
+
+ p { color: green; }
+ span:first-line { background: red; color: yellow; font-size: 4em; }
+ span::first-line { background: red; color: yellow; font-size: 4em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss
new file mode 100644
index 0000000000..660e7508dc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-179a.html */
+
+ p { color: green; }
+ p:first-line { background: red; color: yellow; font-size: 4em; }
+ p::first-line { background: red; color: yellow; font-size: 4em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss
new file mode 100644
index 0000000000..33067afba0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18.html */
+p:hover { background-color : lime }
+a:hover { background-color : lime }
+
+tr:hover { background-color : green }
+td:hover { background-color : lime }
+
+table { border-spacing: 5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss
new file mode 100644
index 0000000000..a7a641bcb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-180a.html */
+
+ p { color: green; }
+ p:first-letter { background: red; color: yellow; font-size: 4em; }
+ p::first-letter { background: red; color: yellow; font-size: 4em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss
new file mode 100644
index 0000000000..24dbd1031d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss
@@ -0,0 +1,15 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-181.html */
+
+ .cs { color: green; }
+ .cs P { background: red; color: yellow; }
+ .cs .a { background: red; color: yellow; }
+ .cs .span1 span { background: red; color: yellow; }
+ .cs .span2 { color: red; }
+ .cs .span2 SPAN { color: green; }
+ .cs .span2 span { background: red; color: yellow; }
+ .ci { color: red; }
+ .ci P { background: green; color: white; }
+ .ci .a { background: green; color: white; }
+ .ci .span1 span { background: green; color: white; }
+ .ci .span2 SPAN { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss
new file mode 100644
index 0000000000..7d5c5fd2d4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184a.html */
+
+p { color: lime; }
+p[class$=""] { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss
new file mode 100644
index 0000000000..f0e5f98b15
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184b.html */
+
+p { color: lime; }
+p[class^=""] { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss
new file mode 100644
index 0000000000..892f85f7f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184c.html */
+
+p { color: lime; }
+p[class*=""] { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss
new file mode 100644
index 0000000000..ad721d0131
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184d.html */
+
+p { color: red; }
+p:not([class$=""]) { color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss
new file mode 100644
index 0000000000..b1ae45984c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184e.html */
+
+p { color: red; }
+p:not([class^=""]) { color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss
new file mode 100644
index 0000000000..8d461ff6d6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184f.html */
+
+p { color: red; }
+p:not([class*=""]) { color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss
new file mode 100644
index 0000000000..ccd04a2cef
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss
@@ -0,0 +1,12 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18a.html */
+
+p { color: navy; }
+
+.a a:hover { background: green; color: white; }
+
+.b a:hover { background: red; color: yellow; }
+.b a:link { background: green; color: white; }
+
+.c :link { background: green; color: white; }
+.c :visited:hover { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss
new file mode 100644
index 0000000000..87405f66f8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18b.html */
+div:hover > p:first-child { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss
new file mode 100644
index 0000000000..519cbce0ee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18c.html */
+
+:link, :visited { color: navy; text-decoration: none; }
+:link:hover span { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss
new file mode 100644
index 0000000000..8b13ef8766
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-19.html */
+a:active { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss
new file mode 100644
index 0000000000..c5ddec6c1d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-19b.html */
+button:active { background: green; color: white; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss
new file mode 100644
index 0000000000..ae64542b1c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-2.html */
+address { background-color: lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss
new file mode 100644
index 0000000000..5a2ef60ca9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-20.html */
+a:focus { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss
new file mode 100644
index 0000000000..c391cb4d6f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-21.html */
+p:target { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss
new file mode 100644
index 0000000000..ef7b904578
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-21b.html */
+p { background-color: lime; }
+p:target { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss
new file mode 100644
index 0000000000..842e11db74
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-21c.html */
+:root { background-color: green; }
+:target { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss
new file mode 100644
index 0000000000..62a0370b78
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-22.html */
+ul > li { background-color : red }
+li:lang(en-GB) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss
new file mode 100644
index 0000000000..4415be07a9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-23.html */
+button { background-color : red }
+input { background-color : red }
+button:enabled { background-color : lime }
+input:enabled { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss
new file mode 100644
index 0000000000..40f518adc3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-24.html */
+button { background-color : red }
+input { background-color : red }
+button:disabled { background-color : lime }
+input:disabled { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss
new file mode 100644
index 0000000000..a9d194c71e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-25.html */
+input, span { background-color : red }
+input:checked, input:checked + span { background-color : lime}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss
new file mode 100644
index 0000000000..6451254f09
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-27.html */
+html { background-color : red }
+*:root { background-color: lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss
new file mode 100644
index 0000000000..4482386911
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-27a.html */
+
+:root:first-child { background-color: red; }
+:root:last-child { background-color: red; }
+:root:only-child { background-color: red; }
+:root:nth-child(1) { background-color: red; }
+:root:nth-child(n) { background-color: red; }
+:root:nth-last-child(1) { background-color: red; }
+:root:nth-last-child(n) { background-color: red; }
+:root:first-of-type { background-color: red; }
+:root:last-of-type { background-color: red; }
+:root:only-of-type { background-color: red; }
+:root:nth-of-type(1) { background-color: red; }
+:root:nth-of-type(n) { background-color: red; }
+:root:nth-last-of-type(1) { background-color: red; }
+:root:nth-last-of-type(n) { background-color: red; }
+p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss
new file mode 100644
index 0000000000..a21c7dbf6d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-27b.html */
+* html { background-color: red; }
+* :root { background-color: red; }
+p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss
new file mode 100644
index 0000000000..3546bfc898
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-28.html */
+.red { background-color : red }
+ul > li:nth-child(odd) { background-color : lime }
+ol > li:nth-child(even) { background-color : lime }
+table.t1 tr:nth-child(-n+4) { background-color : lime }
+table.t2 td:nth-child(3n+1) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss
new file mode 100644
index 0000000000..a91ad30283
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-28b.html */
+.green { background-color : lime ! important }
+ul > li:nth-child(odd) { background-color : red }
+ol > li:nth-child(even) { background-color : red }
+table.t1 tr:nth-child(-n+4) { background-color : red }
+table.t2 td:nth-child(3n+1) { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss
new file mode 100644
index 0000000000..0860aa4956
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-29.html */
+.red { background-color : red }
+ul > li:nth-last-child(odd) { background-color : green }
+ol > li:nth-last-child(even) { background-color : green }
+table.t1 tr:nth-last-child(-n+4) { background-color : green }
+table.t2 td:nth-last-child(3n+1) { background-color : green }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss
new file mode 100644
index 0000000000..eb55cc8de4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-29b.html */
+.green { background-color : lime ! important }
+ul > li:nth-last-child(odd) { background-color : red }
+ol > li:nth-last-child(even) { background-color : red }
+table.t1 tr:nth-last-child(-n+4) { background-color : red }
+table.t2 td:nth-last-child(3n+1) { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss
new file mode 100644
index 0000000000..46d21fae2a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-30.html */
+.red { background-color : red }
+p:nth-of-type(3) { background-color : lime }
+dl > :nth-of-type(3n+1) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss
new file mode 100644
index 0000000000..de45ba5eb1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-31.html */
+.red { background-color : red }
+p:nth-last-of-type(3) { background-color : lime }
+dl > :nth-last-of-type(3n+1) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss
new file mode 100644
index 0000000000..5fbf5c2b5e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-32.html */
+.red { background-color : red }
+.t1 td:first-child { background-color : lime }
+p > *:first-child { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss
new file mode 100644
index 0000000000..507ac1b3cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-33.html */
+.red { background-color : red }
+.t1 td:last-child { background-color : lime }
+p > *:last-child { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss
new file mode 100644
index 0000000000..697d635940
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-34.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:first-of-type { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss
new file mode 100644
index 0000000000..0fee4326d0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-35.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:last-of-type { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss
new file mode 100644
index 0000000000..5190600df7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-36.html */
+.red { background-color : red }
+p:only-child { background-color : lime }
+div.testText > div > p { margin-left : 1em }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss
new file mode 100644
index 0000000000..37d2a23b4c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-37.html */
+.red { background-color : red }
+.t1 :only-of-type { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss
new file mode 100644
index 0000000000..9a039639b1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-38.html */
+p:first-line { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss
new file mode 100644
index 0000000000..5243f7505a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39.html */
+p:first-letter { font-size : xx-large ; background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss
new file mode 100644
index 0000000000..af6c66bd8a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39a.html */
+p:first-letter { color: lime; font-size: xx-large; }
+p:before { color: red; content: 'T'; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss
new file mode 100644
index 0000000000..38ff4ba000
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39b.html */
+p::first-letter { font-size : xx-large ; background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss
new file mode 100644
index 0000000000..f49d085ddb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39c.html */
+p::first-letter { color: lime; font-size: xx-large; }
+ p::before { color: red; content: 'T'; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss
new file mode 100644
index 0000000000..a53bb65f46
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-3a.html */
+* { color : lime }
+ul, p { color : red }
+*.t1 { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss
new file mode 100644
index 0000000000..232286f470
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-4.html */
+#foo { background-color : lime }
+p { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss
new file mode 100644
index 0000000000..12049ebc09
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-41.html */
+p::before { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss
new file mode 100644
index 0000000000..9092fb307f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-41a.html */
+p:before { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss
new file mode 100644
index 0000000000..2c7b3c5930
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-42.html */
+p::after { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss
new file mode 100644
index 0000000000..319f9620b6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-42a.html */
+p:after { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss
new file mode 100644
index 0000000000..6bac1431f1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43.html */
+.white { background-color: transparent ! important; }
+.red { background-color: red; }
+div.t1 p { background-color: lime; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss
new file mode 100644
index 0000000000..57d2e390f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43b.html */
+.white { background-color: transparent ! important; }
+.green { background-color: lime; }
+div.t1 p { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss
new file mode 100644
index 0000000000..909bbca20e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44.html */
+.white { background-color: transparent ! important; }
+.red { background-color: red; }
+div > p.test { background-color: lime; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss
new file mode 100644
index 0000000000..b26c14087f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44b.html */
+.white { background-color: transparent ! important; }
+.green { background-color: lime; }
+div > p.test { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss
new file mode 100644
index 0000000000..9279385479
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44c.html */
+
+ .fail > div { background: red; color: yellow; }
+ .control { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss
new file mode 100644
index 0000000000..a8ed5ed793
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44d.html */
+
+ #fail > div { background: red; }
+ p { background: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss
new file mode 100644
index 0000000000..3de4e06318
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-45.html */
+.red { background-color : red }
+div.stub > p + p { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss
new file mode 100644
index 0000000000..02ddbde845
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-45b.html */
+.green { background-color: lime; }
+.white { background-color: transparent ! important; }
+div.stub > p + p { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss
new file mode 100644
index 0000000000..6ed552f04e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-45c.html */
+
+ .fail + div { background: red; }
+ .control { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss
new file mode 100644
index 0000000000..be3866cefe
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-46.html */
+.red { background-color : red }
+div.stub > p ~ p { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss
new file mode 100644
index 0000000000..4de9c09290
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-46b.html */
+.green { background-color : lime ! important }
+div.stub > p ~ p { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss
new file mode 100644
index 0000000000..acf0689798
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-5.html */
+p { background-color : red }
+p[title] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss
new file mode 100644
index 0000000000..4be84ca7f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-54.html */
+div.stub > * { color : red }
+div.stub *:not([title^="si on"]) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss
new file mode 100644
index 0000000000..eb3a0e6341
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-55.html */
+div.stub > * { color : red }
+div.stub *:not([title$="tait"]) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss
new file mode 100644
index 0000000000..e9a01bdad8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-56.html */
+div.stub > * { color : red }
+div.stub *:not([title*=" on"]) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss
new file mode 100644
index 0000000000..8c8d5d061c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-59.html */
+div.stub > * { color : red }
+div.stub *:not(.foo) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss
new file mode 100644
index 0000000000..514e4c3a8c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-6.html */
+address { background-color : red }
+address[title="foo"] { background-color : lime }
+span[title="a"] { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss
new file mode 100644
index 0000000000..726b9f378b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-60.html */
+div.stub > * { color : red }
+div.stub *:not(#foo) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss
new file mode 100644
index 0000000000..2b346351b6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-61.html */
+div.stub > * { background-color : red }
+div.stub *:not(:link) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss
new file mode 100644
index 0000000000..4181d2eec7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-62.html */
+div.stub > * { background-color : red }
+div.stub *:not(:visited) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss
new file mode 100644
index 0000000000..24d4e99c5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-63.html */
+div.stub * { color: lime; text-decoration: none; }
+div.stub > * > *:not(:hover) { color: black }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss
new file mode 100644
index 0000000000..480b30d221
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-64.html */
+div.stub * { color : lime }
+div.stub > * > *:not(:active) { color : black }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss
new file mode 100644
index 0000000000..30615dc8ef
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-65.html */
+a:not(:focus) { background-color: transparent; }
+a { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss
new file mode 100644
index 0000000000..6532029b34
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-66.html */
+p { background-color: navy; color: white; }
+p:not(:target) { background-color: white; color: black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss
new file mode 100644
index 0000000000..6323784598
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-66b.html */
+p { background-color: red; }
+p:not(:target) { background-color: lime; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss
new file mode 100644
index 0000000000..4e177b1149
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-67.html */
+div.stub * { background-color : red }
+div.stub *:not(:lang(fr)) { background-color : green }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss
new file mode 100644
index 0000000000..b6f16cb7a8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-68.html */
+button { background-color : red }
+input { background-color : red }
+button:not(:enabled) { background-color : lime }
+input:not(:enabled) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss
new file mode 100644
index 0000000000..9f407b8406
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-69.html */
+button { background-color : red }
+input { background-color : red }
+button:not(:disabled) { background-color : lime }
+input:not(:disabled) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss
new file mode 100644
index 0000000000..8f1a711e3e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-7.html */
+p { background-color : red }
+p[class~="b"] { background-color : lime }
+address { background-color : red }
+address[title~="foo"] { background-color : lime }
+span[class~="b"] { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss
new file mode 100644
index 0000000000..23ec933cc2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-70.html */
+input, span { background-color : red }
+input:not(:checked), input:not(:checked) + span { background-color : lime}
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss
new file mode 100644
index 0000000000..ee7aae040e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-72.html */
+p:not(:root) { background-color: lime; }
+div * { background-color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss
new file mode 100644
index 0000000000..2e52ad5595
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-72b.html */
+html:not(:root), test:not(:root) { background-color: red; }
+p { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss
new file mode 100644
index 0000000000..43036386f6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-77.html */
+.red { background-color : red }
+.t1 td:not(:first-child) { background-color : lime }
+p > *:not(:first-child) { background-color : lime }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss
new file mode 100644
index 0000000000..fd95f40ed5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-77b.html */
+.green { background-color : lime ! important }
+.t1 td:not(:first-child) { background-color : red }
+p > *:not(:first-child) { background-color : red }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss
new file mode 100644
index 0000000000..4d99f1ceca
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-78.html */
+.red { background-color : red }
+.t1 td:not(:last-child) { background-color : lime }
+p > *:not(:last-child) { background-color : lime }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss
new file mode 100644
index 0000000000..8e3c173b9c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-78b.html */
+.green { background-color : lime ! important }
+.t1 td:not(:last-child) { background-color : red }
+p > *:not(:last-child) { background-color : red }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss
new file mode 100644
index 0000000000..1d1ff21830
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-79.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:not(:first-of-type) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss
new file mode 100644
index 0000000000..8043e647d2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-7b.html */
+
+p { background: lime; }
+[title~="hello world"] { background: red; }
+/* Section 6.3.1: Represents the att attribute whose value is a
+space-separated list of words, one of which is exactly "val". If this
+selector is used, the words in the value must not contain spaces
+(since they are separated by spaces). */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss
new file mode 100644
index 0000000000..8afa5ca99d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-8.html */
+p { background-color : red }
+p[lang|="en"] { background-color : lime }
+address { background-color : red }
+address[lang="fi"] { background-color : lime }
+span[lang|="fr"] { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss
new file mode 100644
index 0000000000..697846a18f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-80.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:not(:last-of-type) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss
new file mode 100644
index 0000000000..7b6f700901
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-81.html */
+.red { background-color : red }
+p:not(:only-child) { background-color : lime }
+div.testText > div > p { margin-left : 1em }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss
new file mode 100644
index 0000000000..af6a6cb054
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-81b.html */
+.green { background-color : lime ! important }
+p:not(:only-child) { background-color : lime }
+div.testText > div > p { margin-left : 1em }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss
new file mode 100644
index 0000000000..5869d3161a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-82.html */
+.red { background-color : red }
+.t1 *:not(:only-of-type) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss
new file mode 100644
index 0000000000..c9e4c2cc94
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-82b.html */
+.green { background-color : lime ! important }
+.t1 *:not(:only-of-type) { background-color : red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss
new file mode 100644
index 0000000000..7022b8c830
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-86.html */
+p { color: red; }
+blockquote > div p { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss
new file mode 100644
index 0000000000..275d4274ca
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-87.html */
+p { color: red; }
+blockquote + div ~ p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss
new file mode 100644
index 0000000000..1776b027f7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-87b.html */
+p { color: green ! important; }
+blockquote + div ~ p { color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss
new file mode 100644
index 0000000000..57814ed7c0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-88.html */
+p { color: red; }
+blockquote + div p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss
new file mode 100644
index 0000000000..2d0e34e3c8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-88b.html */
+p { color: green ! important; }
+blockquote + div p { color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss
new file mode 100644
index 0000000000..d6c797e143
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-89.html */
+p { color: red; }
+blockquote div > p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss
new file mode 100644
index 0000000000..cba3eded20
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-9.html */
+p { background-color : red }
+p[title^="foo"] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss
new file mode 100644
index 0000000000..32175261e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-90.html */
+p { color: red; }
+blockquote ~ div + p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss
new file mode 100644
index 0000000000..afcdbafe4d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-90b.html */
+p { color: green ! important; }
+blockquote ~ div + p { color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss
new file mode 100644
index 0000000000..b669874e11
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d1.html */
+
+ #test { background: red; display: block; padding: 1em; }
+ #test:not(:empty) { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss
new file mode 100644
index 0000000000..0ac92bcd18
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d1b.html */
+
+ #test1 { background: red; display: block; padding: 1em; margin: 1em; }
+ #test1:empty { background: lime; }
+ #test2 { background: lime; display: block; padding: 1em; margin: 1em; }
+ #test2:empty { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss
new file mode 100644
index 0000000000..c3f0544bb5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d2.html */
+
+ #test { background: red; display: block; padding: 1em; }
+ #stub ~ div div + div > div { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss
new file mode 100644
index 0000000000..dbf2bdda74
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d4.html */
+
+ #two:first-child { background: red; }
+ #three:last-child { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss
new file mode 100644
index 0000000000..7e94325735
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-001.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss
new file mode 100644
index 0000000000..3e68199d28
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-dynamic-001.htm */
+
+ span:before { content: open-quote; }
+ span:after { content: close-quote; }
+ span { quotes: '"' '"'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss
new file mode 100644
index 0000000000..30c5445777
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-dynamic-003a.htm */
+
+ div#x:first-letter { color: blue; float: left; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss
new file mode 100644
index 0000000000..37e3dee7fd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-dynamic-003b.htm */
+
+ div#x:first-letter { color: blue; float: none }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss
new file mode 100644
index 0000000000..4aea22c740
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-inherit-001.htm */
+
+div { float: left; overflow: scroll; font-size: 50px; width: 3em; line-height: 10px }
+div:first-letter { float: inherit; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss
new file mode 100644
index 0000000000..9bc48c3a71
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-inherit-001.htm */
+.style { font-size: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss
new file mode 100644
index 0000000000..7d79ae49d8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-001.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss
new file mode 100644
index 0000000000..8ab9328de6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-002.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss
new file mode 100644
index 0000000000..2c2b8a906f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-003.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss
new file mode 100644
index 0000000000..b568b4430b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-004.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss
new file mode 100644
index 0000000000..d5f9376161
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-005.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss
new file mode 100644
index 0000000000..fc0089ccde
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-006.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss
new file mode 100644
index 0000000000..5fbf16bc9d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-007.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss
new file mode 100644
index 0000000000..ba956560c8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-001.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss
new file mode 100644
index 0000000000..a5f95536b7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-002.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+ span:before { content: open-quote; }
+ span:after { content: close-quote; }
+ span { quotes: '"' '"'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss
new file mode 100644
index 0000000000..849c55abf5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-003.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+ span:before { content: open-quote "This "; }
+ span:after { content: close-quote; }
+ span { quotes: '"' '"'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss
new file mode 100644
index 0000000000..96706e1f1e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-004.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss
new file mode 100644
index 0000000000..15214106ba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-005.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss
new file mode 100644
index 0000000000..970e5b70b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-006.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+ span:before { content: "\"This "; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss
new file mode 100644
index 0000000000..74973ac9a1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-001.htm */
+
+ body { color: red }
+ body:first-line { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss
new file mode 100644
index 0000000000..5cec148572
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-001.htm */
+
+ div { color: green }
+ div:first-line { color: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss
new file mode 100644
index 0000000000..59ddfc8476
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-001.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss
new file mode 100644
index 0000000000..89f8cbdeda
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-002.htm */
+
+ div { color: red }
+ div:first-line { color: green }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss
new file mode 100644
index 0000000000..716528bfc2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-002.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss
new file mode 100644
index 0000000000..8b793f90aa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-003.htm */
+
+ div { color: green }
+ div:first-line { color: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss
new file mode 100644
index 0000000000..1da72d9761
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-003.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss
new file mode 100644
index 0000000000..cade4a2861
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-004.htm */
+
+ div { color: green }
+ div:first-line { color: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss
new file mode 100644
index 0000000000..c5e5fe5468
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-inherit-001.htm */
+
+
+.a:first-line { }
+.a { overflow: scroll; }
+.b, .c { overflow: inherit; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss
new file mode 100644
index 0000000000..ea1027fc24
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-inherit-002.htm */
+
+ div { background: green; }
+ div:first-line { background-color: red; }
+ span.one { background: inherit; }
+ span.two { background-color: inherit; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss
new file mode 100644
index 0000000000..f498981952
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-inherit-003.htm */
+
+ div, p { background: green; }
+ div:first-line, p:first-line { background-color: red; }
+ span.one { background: inherit; }
+ span.two { background-color: inherit; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss
new file mode 100644
index 0000000000..9358f2916e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001a.htm */
+
+.left { float:left; }
+.right { float:right; }
+.left, .right { width:50px; height:50px; background:yellow; }
+p { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss
new file mode 100644
index 0000000000..d803b8ffd2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001a.htm */
+.style { width:400px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss
new file mode 100644
index 0000000000..0a22209fb1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001a.htm */
+.style { text-align:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss
new file mode 100644
index 0000000000..80fe2ff996
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001b.htm */
+
+.left { float:left; }
+.right { float:right; }
+.left, .right { width:50px; height:50px; background:yellow; }
+p { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss
new file mode 100644
index 0000000000..3992160e83
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001b.htm */
+.style { width:400px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss
new file mode 100644
index 0000000000..f19a8d2088
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001b.htm */
+.style { text-align:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss
new file mode 100644
index 0000000000..19d1d26dc5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001c.htm */
+
+.left { float:left; }
+.right { float:right; }
+.left, .right { width:50px; height:50px; background:yellow; }
+p { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss
new file mode 100644
index 0000000000..c3143dca78
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001c.htm */
+.style { width:400px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss
new file mode 100644
index 0000000000..e52a60f4ed
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001c.htm */
+.style { text-align:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss
new file mode 100644
index 0000000000..4141a2ba00
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { width:100px; font-size:5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss
new file mode 100644
index 0000000000..aecdad0621
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { background:blue; width:100px; height:100px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss
new file mode 100644
index 0000000000..2e7fc3e31e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { background:yellow; width:30px; height:30px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss
new file mode 100644
index 0000000000..bacc9de7c9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { background:yellow; width:30px; height:30px; float:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss
new file mode 100644
index 0000000000..a1f23b9119
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-004.htm */
+.style { width:200px; font-size:5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss
new file mode 100644
index 0000000000..be86a0b01e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-004.htm */
+.style { background:green; width:100px; height:100px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss
new file mode 100644
index 0000000000..b9c4341835
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-004.htm */
+.style { background:blue; width:100px; height:100px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss
new file mode 100644
index 0000000000..1f12c6fb78
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss
new file mode 100644
index 0000000000..155ae9bb17
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { float: right; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss
new file mode 100644
index 0000000000..03921ad64e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { margin-right: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss
new file mode 100644
index 0000000000..82327074bf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { float: left; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss
new file mode 100644
index 0000000000..b0659ed170
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss
new file mode 100644
index 0000000000..51d4aae421
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { float: right; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss
new file mode 100644
index 0000000000..b64d557e23
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { margin-right: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss
new file mode 100644
index 0000000000..667087faba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { float: left; width: 475px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss
new file mode 100644
index 0000000000..bb6604d005
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss
new file mode 100644
index 0000000000..7ee24227e9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { float: left; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss
new file mode 100644
index 0000000000..1d11bdf6dc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { margin-left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss
new file mode 100644
index 0000000000..2ce67f6358
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { float: right; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss
new file mode 100644
index 0000000000..02936f2d05
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss
new file mode 100644
index 0000000000..62e70dc857
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { float: left; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss
new file mode 100644
index 0000000000..33158539ba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { margin-left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss
new file mode 100644
index 0000000000..b657772275
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { float: right; width: 475px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss
new file mode 100644
index 0000000000..a0b07a7d20
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss
new file mode 100644
index 0000000000..282d40f7de
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { float: left; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss
new file mode 100644
index 0000000000..ab40480544
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { margin-left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss
new file mode 100644
index 0000000000..3d1bced7d2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { float: left; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss
new file mode 100644
index 0000000000..808f90847a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss
new file mode 100644
index 0000000000..2591c3de52
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { float: right; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss
new file mode 100644
index 0000000000..2ca9103b55
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { margin-right: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss
new file mode 100644
index 0000000000..a051758341
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { float: right; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss
new file mode 100644
index 0000000000..55dbbeebaa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+
+
+ table { margin: 0; border-spacing: 0; }
+ td, th { padding: 0; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss
new file mode 100644
index 0000000000..59d553acc3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss
new file mode 100644
index 0000000000..941f9b0c43
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:right; background:blue; width: 100px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss
new file mode 100644
index 0000000000..231f1d76cf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:left; background:blue; width: 100px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss
new file mode 100644
index 0000000000..5304225969
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { overflow: hidden; background: yellow }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss
new file mode 100644
index 0000000000..0ffa20c60c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:left; background:silver; width: 100px; height: 6px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss
new file mode 100644
index 0000000000..3af0c41084
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { background: yellow }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss
new file mode 100644
index 0000000000..70e5ab27a3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { width: 150px; height: 10px; background: purple }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss
new file mode 100644
index 0000000000..4f0231e636
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:right; background:silver; width: 100px; height: 6px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss
new file mode 100644
index 0000000000..87b04d41d4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+
+
+ body { font-size: 10px; }
+
+ table { margin: 0; border-spacing: 0; }
+ td, th { padding: 0; vertical-align: top; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss
new file mode 100644
index 0000000000..4ed6811ec4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss
new file mode 100644
index 0000000000..04ba12051e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { float:left; background:blue; width: 200px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss
new file mode 100644
index 0000000000..59ff5a258e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { background: yellow }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss
new file mode 100644
index 0000000000..1f9328855c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { float:right; background:blue; width: 200px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss
new file mode 100644
index 0000000000..53a68a0469
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { overflow:hidden; background: yellow; width: 50%; height: 20px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss
new file mode 100644
index 0000000000..ca6d5ed844
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss
@@ -0,0 +1,12 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+
+
+ body { font-size: 16px; }
+
+ table { margin: 0; border-spacing: 0; }
+ caption, td, th { padding: 0; vertical-align: top; text-align: left; }
+
+ table table caption { background: yellow; }
+ table table { background: purple; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss
new file mode 100644
index 0000000000..beba9cf330
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss
new file mode 100644
index 0000000000..49c74a97d9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:110px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss
new file mode 100644
index 0000000000..deee635381
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:105px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss
new file mode 100644
index 0000000000..fdb260729a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:100px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss
new file mode 100644
index 0000000000..4522f57cb8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:95px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss
new file mode 100644
index 0000000000..a274d6ee7f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: bottom; height:30px; width: 192px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss
new file mode 100644
index 0000000000..b49fd302a9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:90px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss
new file mode 100644
index 0000000000..2a29f56c3f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:85px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss
new file mode 100644
index 0000000000..e8f11cc823
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:80px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss
new file mode 100644
index 0000000000..231f28519c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:75px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss
new file mode 100644
index 0000000000..a4f78671cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:70px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss
new file mode 100644
index 0000000000..9e9e29d19c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:65px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss
new file mode 100644
index 0000000000..501590ad5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:150px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss
new file mode 100644
index 0000000000..126280a6fe
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:60px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss
new file mode 100644
index 0000000000..a7228173da
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:55px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss
new file mode 100644
index 0000000000..0cc681c041
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:50px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss
new file mode 100644
index 0000000000..f2c07e7838
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:45px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss
new file mode 100644
index 0000000000..b8e2c5796e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:40px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss
new file mode 100644
index 0000000000..ce05ee6888
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:35px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss
new file mode 100644
index 0000000000..d5ab773c5f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:30px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss
new file mode 100644
index 0000000000..3385f4ea30
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:25px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss
new file mode 100644
index 0000000000..6022a36c29
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:20px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss
new file mode 100644
index 0000000000..a352e1fa56
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:15px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss
new file mode 100644
index 0000000000..29eb47aa2f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:145px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss
new file mode 100644
index 0000000000..5bacfae2f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:10px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss
new file mode 100644
index 0000000000..0a8445e2b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:5px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss
new file mode 100644
index 0000000000..ba50d0bd65
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: top; height:30px; width: 100px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss
new file mode 100644
index 0000000000..2dc59a3264
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { height: 30px; width: 230px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss
new file mode 100644
index 0000000000..97ec1f9113
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:140px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss
new file mode 100644
index 0000000000..0778fc55c9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:135px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss
new file mode 100644
index 0000000000..eee0117225
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:130px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss
new file mode 100644
index 0000000000..7c9e6eda76
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: top; height:30px; width: 190px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss
new file mode 100644
index 0000000000..bb41e0cbaf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { height: 30px; width: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss
new file mode 100644
index 0000000000..764745abb1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:125px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss
new file mode 100644
index 0000000000..ae65d3d2e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:120px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss
new file mode 100644
index 0000000000..c86cc30a7c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:115px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss
new file mode 100644
index 0000000000..9cd7749821
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: bottom; height:30px; width: 100px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss
new file mode 100644
index 0000000000..eabd2b81b7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { height: 30px; width: 227px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss
new file mode 100644
index 0000000000..fe79ead93b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+
+
+ table { margin: 0; border-spacing: 0; }
+ td, th { padding: 0; vertical-align: top; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss
new file mode 100644
index 0000000000..da32416752
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss
new file mode 100644
index 0000000000..dc37b6963d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss
new file mode 100644
index 0000000000..c2fed6240b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss
new file mode 100644
index 0000000000..a656c57cf1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 10px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss
new file mode 100644
index 0000000000..bcd2f016b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { float: left; height: 10px; width: 150px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss
new file mode 100644
index 0000000000..64956d2143
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: -5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss
new file mode 100644
index 0000000000..9796be893b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: -5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss
new file mode 100644
index 0000000000..7842444780
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 10px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss
new file mode 100644
index 0000000000..d2e20e04cc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss
new file mode 100644
index 0000000000..74db9f2d40
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss
new file mode 100644
index 0000000000..b50e1429ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 6px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss
new file mode 100644
index 0000000000..f09ed11cee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: -1px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss
new file mode 100644
index 0000000000..8dcb8d161c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: -4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss
new file mode 100644
index 0000000000..3a4a85219f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss
new file mode 100644
index 0000000000..bfdf7db3b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 0px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss
new file mode 100644
index 0000000000..6f0581a068
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 0px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss
new file mode 100644
index 0000000000..186f24937b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: -4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss
new file mode 100644
index 0000000000..489890f8bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: -1px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss
new file mode 100644
index 0000000000..0ee68c91ce
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss
new file mode 100644
index 0000000000..5c131b1a4d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 6px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss
new file mode 100644
index 0000000000..c7fdc4f3ba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-outside-001.htm */
+
+#wrap {width:600px; border:1px solid;}
+.a {background:lime; color:#fff; width:80%;}
+.b {float:right; width:18%; background: cyan; color: #000; height:10em;}
+textarea {width: 100%; height:10em;}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss
new file mode 100644
index 0000000000..f780444dc2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001l.htm */
+
+
+body { width: 400px; border: medium solid; }
+div { float: left; clear: left; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; margin-right: auto; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss
new file mode 100644
index 0000000000..a695061dc6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001l.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss
new file mode 100644
index 0000000000..94b3728f3d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001l.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss
new file mode 100644
index 0000000000..c665929221
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001r.htm */
+
+
+body { width: 400px; border: medium solid; }
+div { float: right; clear: right; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; margin-left: auto; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss
new file mode 100644
index 0000000000..2775ef585f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001r.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss
new file mode 100644
index 0000000000..3c9ab6d376
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001r.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss
new file mode 100644
index 0000000000..48cf6ec53a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss
new file mode 100644
index 0000000000..10ffd0fc80
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002l.htm */
+.style { float: left; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss
new file mode 100644
index 0000000000..3a572e8b03
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002l.htm */
+.style { float: right; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss
new file mode 100644
index 0000000000..fe457370c1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss
new file mode 100644
index 0000000000..4e2081dba9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002r.htm */
+.style { float: right; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss
new file mode 100644
index 0000000000..1055fac5ff
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002r.htm */
+.style { float: left; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss
new file mode 100644
index 0000000000..ef1a96a2bf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss
new file mode 100644
index 0000000000..1c57064ba3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003l.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss
new file mode 100644
index 0000000000..2e90f18734
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003l.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss
new file mode 100644
index 0000000000..d2971cb795
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss
new file mode 100644
index 0000000000..f6306c31aa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003r.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss
new file mode 100644
index 0000000000..3b63ad756d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003r.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss
new file mode 100644
index 0000000000..6119b6895a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001l.htm */
+
+
+body { width: 400px; border: medium solid; text-align: left; }
+div { float: left; clear: left; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss
new file mode 100644
index 0000000000..60abfaa89f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001l.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss
new file mode 100644
index 0000000000..bb8f7d8585
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001l.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss
new file mode 100644
index 0000000000..3c674d4165
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001r.htm */
+
+
+body { width: 400px; border: medium solid; text-align: right; }
+div { float: right; clear: right; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss
new file mode 100644
index 0000000000..254cceff5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001r.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss
new file mode 100644
index 0000000000..f9da61827d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001r.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss
new file mode 100644
index 0000000000..d391fc5bb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss
new file mode 100644
index 0000000000..b8b4e306b2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002l.htm */
+.style { float: left; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss
new file mode 100644
index 0000000000..4fe3554d42
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002l.htm */
+.style { float: right; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss
new file mode 100644
index 0000000000..278a0b20d1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss
new file mode 100644
index 0000000000..24fc0000cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002r.htm */
+.style { float: right; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss
new file mode 100644
index 0000000000..5aba32ba55
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002r.htm */
+.style { float: left; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss
new file mode 100644
index 0000000000..5af166b155
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss
new file mode 100644
index 0000000000..ae6e0a84ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003l.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss
new file mode 100644
index 0000000000..f6a110f660
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003l.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss
new file mode 100644
index 0000000000..573684a70a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss
new file mode 100644
index 0000000000..ed8f4d939a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003r.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss
new file mode 100644
index 0000000000..3156752c2e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003r.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss
new file mode 100644
index 0000000000..4cb8f644c2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { width: 500px; height: 500px; float: left; font-size: 12px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss
new file mode 100644
index 0000000000..c1ed4bbe00
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { float: left; width: 10px; height: 30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss
new file mode 100644
index 0000000000..b3891027db
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { float: left; clear: left; width: 100px; height: 1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss
new file mode 100644
index 0000000000..92c36c2b4b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: blue; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss
new file mode 100644
index 0000000000..7a4a377d29
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: purple; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss
new file mode 100644
index 0000000000..30b08ae999
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: fuchsia }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss
new file mode 100644
index 0000000000..c718bdcd07
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { width: 500px; height: 500px; float: left; font-size: 12px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss
new file mode 100644
index 0000000000..fa43435f50
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { float: left; width: 10px; height: 30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss
new file mode 100644
index 0000000000..302c91ab56
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { float: left; clear: left; width: 100px; height: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss
new file mode 100644
index 0000000000..d90881ad6d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: blue; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss
new file mode 100644
index 0000000000..1f403a2ed2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: purple; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss
new file mode 100644
index 0000000000..901a27fe9d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: fuchsia }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss
new file mode 100644
index 0000000000..f70698a920
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-001.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest FamilyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss
new file mode 100644
index 0000000000..f1cfd976b2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-002.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: csstest familyname, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss
new file mode 100644
index 0000000000..55ae604a48
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-003.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: cssTest familyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss
new file mode 100644
index 0000000000..b95f2e94bf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-004.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: "CSSTest FamilyName", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss
new file mode 100644
index 0000000000..3a5f916cce
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-005.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: 'CSSTest FamilyName', CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss
new file mode 100644
index 0000000000..312f9c8948
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-006.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest FamilyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss
new file mode 100644
index 0000000000..d6f61aa0da
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-007.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: "CSSTest FamilyName", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss
new file mode 100644
index 0000000000..b0f025d6f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-008.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: 'CSSTest FamilyName', CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss
new file mode 100644
index 0000000000..f6ed3eea3d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-009.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest \000046amilyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss
new file mode 100644
index 0000000000..ff9c919acd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-012.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: "CSSTest Family\Name", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss
new file mode 100644
index 0000000000..04100a1326
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-013.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest FamilyName Bold, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss
new file mode 100644
index 0000000000..d98252d89d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-014.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTestFamilyNameBold, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss
new file mode 100644
index 0000000000..11566bc342
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-016.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest Weights 400;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss
new file mode 100644
index 0000000000..ea2b2110b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-017.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ body { font-family: CSSTest Fallback; }
+ p, div {
+ font-family: CSSTest Unknown;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss
new file mode 100644
index 0000000000..81e90cee9c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-018.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ body { font-family: CSSTest Fallback; }
+ p, div {
+ font-family: "CSSTest Unknown";
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss
new file mode 100644
index 0000000000..ad32f6351b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-019.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div#test { font-family: CSSTest Fallback; }
+ p {
+ font-family: CSSTest Unknown;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss
new file mode 100644
index 0000000000..0d66b81154
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-020.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div#test { font-family: CSSTest Fallback; }
+ p {
+ font-family: "CSSTest Unknown";
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss
new file mode 100644
index 0000000000..592d994b47
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-021.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ body { font-family: "CSSTest FamilyName"; }
+ div { font-family: "CSSTest Unknown"; }
+ p {
+ font-family: "CSSTest" Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss
new file mode 100644
index 0000000000..dc737140a8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss
@@ -0,0 +1,14 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-022.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div { font-family: "CSSTest Unknown"; }
+ p {
+ }
+ p#test1 {
+ font-family: x-large CSSTest Fallback;
+ }
+ p#test4 {
+ font-family: caption CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss
new file mode 100644
index 0000000000..4c4dc9c7f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss
@@ -0,0 +1,20 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-023.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div.test { font-family: CSSTest Fallback; }
+ p {
+ }
+ p#test1a {
+ font-family: "small-caps 1in CSSTest FamilyName Funky", CSSTest Fallback;
+ }
+ p#test2 {
+ font-family: x-large CSSTest FamilyName Funky, CSSTest Fallback;
+ }
+ p#test2a {
+ font-family: "x-large CSSTest FamilyName Funky", CSSTest Fallback;
+ }
+ p#test3a {
+ font-family: "12px CSSTest FamilyName Funky", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss
new file mode 100644
index 0000000000..79ac477f2c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss
@@ -0,0 +1,26 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-024.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div.test { font-family: CSSTest Fallback; }
+ p {
+ }
+ p#test1 {
+ font-family: caption, CSSTest Fallback;
+ }
+ p#test2 {
+ font-family: icon, CSSTest Fallback;
+ }
+ p#test3 {
+ font-family: menu, CSSTest Fallback;
+ }
+ p#test4 {
+ font-family: message-box, CSSTest Fallback;
+ }
+ p#test5 {
+ font-family: small-caption, CSSTest Fallback;
+ }
+ p#test6 {
+ font-family: status-bar, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss
new file mode 100644
index 0000000000..e1334dbe2f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-weight-bolder-001.htm */
+
+ span#verify { font-family: CSSTest Verify; font-weight: normal; }
+ div { margin-bottom: 1em; }
+ body { margin: 50px; }
+ table {
+ border-collapse: collapse;
+ }
+ th {
+ font-weight: normal;
+ text-align: left;
+ padding-right: 1em;
+ }
+ span { font-weight: bolder; }
+ thead th { text-align: center; padding-bottom: 1em; }
+ td { width: 5em; text-align: center; }
+ td.f1 { font-family: CSSTest Weights Full; }
+ td.f2 { font-family: CSSTest Weights W1479; }
+ td.f3 { font-family: CSSTest Weights W15; }
+ td.f4 { font-family: CSSTest Weights W24; }
+ td.f5 { font-family: CSSTest Weights W2569; }
+ td.f6 { font-family: CSSTest Weights W258; }
+ td.f7 { font-family: CSSTest Weights W3589; }
+ td.f8 { font-family: CSSTest Weights W47; }
+ th.f1 { display: table-cell; }
+ th.f2 { display: table-cell; }
+ th.f3 { display: table-cell; }
+ th.f4 { display: table-cell; }
+ th.f5 { display: table-cell; }
+ th.f6 { display: table-cell; }
+ th.f7 { display: table-cell; }
+ th.f8 { display: table-cell; }
+
+ tr.w1 td { font-weight: 100; }
+ tr.w2 td { font-weight: 200; }
+ tr.w3 td { font-weight: 300; }
+ tr.w4 td { font-weight: 400; }
+ tr.w5 td { font-weight: 500; }
+ tr.w6 td { font-weight: 600; }
+ tr.w7 td { font-weight: 700; }
+ tr.w8 td { font-weight: 800; }
+ tr.w9 td { font-weight: 900; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss
new file mode 100644
index 0000000000..1840142b38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-weight-lighter-001.htm */
+
+ span#verify { font-family: CSSTest Verify; font-weight: normal; }
+ div { margin-bottom: 1em; }
+ body { margin: 50px; }
+ table {
+ border-collapse: collapse;
+ }
+ th {
+ font-weight: normal;
+ text-align: left;
+ padding-right: 1em;
+ }
+ span { font-weight: lighter; }
+ thead th { text-align: center; padding-bottom: 1em; }
+ td { width: 5em; text-align: center; }
+ td.f1 { font-family: CSSTest Weights Full; }
+ td.f2 { font-family: CSSTest Weights W1479; }
+ td.f3 { font-family: CSSTest Weights W15; }
+ td.f4 { font-family: CSSTest Weights W24; }
+ td.f5 { font-family: CSSTest Weights W2569; }
+ td.f6 { font-family: CSSTest Weights W258; }
+ td.f7 { font-family: CSSTest Weights W3589; }
+ td.f8 { font-family: CSSTest Weights W47; }
+ th.f1 { display: table-cell; }
+ th.f2 { display: table-cell; }
+ th.f3 { display: table-cell; }
+ th.f4 { display: table-cell; }
+ th.f5 { display: table-cell; }
+ th.f6 { display: table-cell; }
+ th.f7 { display: table-cell; }
+ th.f8 { display: table-cell; }
+
+ tr.w1 td { font-weight: 100; }
+ tr.w2 td { font-weight: 200; }
+ tr.w3 td { font-weight: 300; }
+ tr.w4 td { font-weight: 400; }
+ tr.w5 td { font-weight: 500; }
+ tr.w6 td { font-weight: 600; }
+ tr.w7 td { font-weight: 700; }
+ tr.w8 td { font-weight: 800; }
+ tr.w9 td { font-weight: 900; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss
new file mode 100644
index 0000000000..29a665ee9a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-weight-normal-001.htm */
+
+ span#verify { font-family: CSSTest Verify; font-weight: normal; }
+ div { margin-bottom: 1em; }
+ body { margin: 50px; }
+ table {
+ border-collapse: collapse;
+ }
+ th {
+ font-weight: normal;
+ text-align: left;
+ padding-right: 1em;
+ }
+ span { }
+ thead th { text-align: center; padding-bottom: 1em; }
+ td { width: 5em; text-align: center; }
+ td.f1 { font-family: CSSTest Weights Full; }
+ td.f2 { font-family: CSSTest Weights W1479; }
+ td.f3 { font-family: CSSTest Weights W15; }
+ td.f4 { font-family: CSSTest Weights W24; }
+ td.f5 { font-family: CSSTest Weights W2569; }
+ td.f6 { font-family: CSSTest Weights W258; }
+ td.f7 { font-family: CSSTest Weights W3589; }
+ td.f8 { font-family: CSSTest Weights W47; }
+ th.f1 { display: table-cell; }
+ th.f2 { display: table-cell; }
+ th.f3 { display: table-cell; }
+ th.f4 { display: table-cell; }
+ th.f5 { display: table-cell; }
+ th.f6 { display: table-cell; }
+ th.f7 { display: table-cell; }
+ th.f8 { display: table-cell; }
+
+ tr.w1 td { font-weight: 100; }
+ tr.w2 td { font-weight: 200; }
+ tr.w3 td { font-weight: 300; }
+ tr.w4 td { font-weight: 400; }
+ tr.w5 td { font-weight: 500; }
+ tr.w6 td { font-weight: 600; }
+ tr.w7 td { font-weight: 700; }
+ tr.w8 td { font-weight: 800; }
+ tr.w9 td { font-weight: 900; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss
new file mode 100644
index 0000000000..9ddf923d46
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-000.htm */
+
+span { display: inline-block; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss
new file mode 100644
index 0000000000..595b0fef80
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-height-001.htm */
+
+div { display: inline-block; width: 10em; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss
new file mode 100644
index 0000000000..2876e73ab5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-height-002.htm */
+
+div { display: inline-block; height: 5em; width:10em; vertical-align: baseline; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss
new file mode 100644
index 0000000000..5d2446d71f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-valign-001.htm */
+
+span { display: inline-block; }
+span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss
new file mode 100644
index 0000000000..f262046c2b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-valign-002.htm */
+
+body { background: white; color: black; }
+span { display: inline-block; margin: 3px 0; border: 4px solid white; border-width: 4px 0; padding: 9px 0; }
+span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss
new file mode 100644
index 0000000000..18c2f89059
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-001a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss
new file mode 100644
index 0000000000..438331f06c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-001b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; width: 10em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss
new file mode 100644
index 0000000000..851a3e0556
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-002a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss
new file mode 100644
index 0000000000..652628c616
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-002b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; width: 20em; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss
new file mode 100644
index 0000000000..b04dd45c9a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-001.htm */
+
+div { width: 2em; height: 1em; }
+span { display:inline-block; vertical-align: top; width: 2em; height: 1em; background: green; }
+div#after { margin-top:-1em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss
new file mode 100644
index 0000000000..f888f84439
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-002.htm */
+
+div { width: 2em; height: 1em; }
+span { display:inline-block; vertical-align: top; width: 2em; height: 1em; }
+span span { display: block; background: green; }
+div#after { margin-top: -1em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss
new file mode 100644
index 0000000000..902c10615b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-003.htm */
+
+div { height: 1em; }
+div#test span { display:inline-block; vertical-align: top; height: 1em; background: red; color: red; }
+div#after { margin-top:-1em; }
+div#after span { display: inline; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss
new file mode 100644
index 0000000000..2a326680b7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-004.htm */
+
+div#test span { display:inline-block; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss
new file mode 100644
index 0000000000..7831203024
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-005.htm */
+
+div#test > span { display:inline-block; vertical-align: top; }
+div#test > span > span { display: block; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before > span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss
new file mode 100644
index 0000000000..bbb79e3952
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-002a.htm */
+
+span { display: inline-table; }
+span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss
new file mode 100644
index 0000000000..085e0301ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-002b.htm */
+
+span > span { display: table-cell; }
+span > span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss
new file mode 100644
index 0000000000..ced4d93ae8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-003.htm */
+
+span { display: inline-table; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss
new file mode 100644
index 0000000000..76cf9d68e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-height-001.htm */
+
+div { display: inline-table; width: 10em; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss
new file mode 100644
index 0000000000..ee38aae8ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-height-002.htm */
+
+div { display: inline-table; height: 5em; vertical-align: baseline; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss
new file mode 100644
index 0000000000..73e683bbcd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss
@@ -0,0 +1,15 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-valign-001.htm */
+
+span#table { display: inline-table; }
+span#rowgroup { display: table-row-group; }
+span#row { display: table-row; }
+span#cell { display: table-cell; }
+span#table, span#rowgroup, span#row, span#cell {
+ border: 4px solid white;
+ margin: 3px 0;
+ border-width: 4px 0;
+ padding: 9px 0;
+ border-spacing: 0 5px;
+}
+span#block { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss
new file mode 100644
index 0000000000..78e2c1ecab
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-001a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss
new file mode 100644
index 0000000000..3a7ba0f225
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-001b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; width: 10em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss
new file mode 100644
index 0000000000..686714f14a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-002a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss
new file mode 100644
index 0000000000..c363def1ac
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-002b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; width: 20em; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss
new file mode 100644
index 0000000000..79c11c95e5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-001.htm */
+
+div { width: 2em; height: 2em; }
+span { display:inline-table; vertical-align: top; width: 2em; height: 2em; background: green; }
+div#after { margin-top:-2em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss
new file mode 100644
index 0000000000..6e208ec410
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-002.htm */
+
+div { width: 2em; height: 2em; }
+span { display:inline-table; vertical-align: top; width: 2em; height: 2em; }
+span span { display: block; background: green; }
+div#after { margin-top: -2em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss
new file mode 100644
index 0000000000..8722af2fb2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-003.htm */
+
+div { height: 1em; }
+div#test > span { display:inline-table; vertical-align: top; height: 1em; background: red; color: red; }
+div#after { margin-top:-1em; }
+div#after > span { display: inline; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss
new file mode 100644
index 0000000000..344d56ff21
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-004.htm */
+
+div#test > span { display:inline-table; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before > span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss
new file mode 100644
index 0000000000..de883783f6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-005.htm */
+
+div#test > span { display:inline-table; vertical-align: top; }
+div#test > span > span { display: block; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before > span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss b/theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss
new file mode 100644
index 0000000000..7e8809a736
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss
@@ -0,0 +1,29 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/quotes-035.htm */
+
+
+ .party1 * { display: inline; }
+ .party1 .a { quotes: "Isn" "'"
+ "t" "FAIL!"
+ "FAIL!" " i"; }
+ .party1 .b { quotes: "" "FAIL!!"
+ " wonderful" "!!!"
+ " to " " work"
+ "see " " [FAIL to]"
+ "C" "quotes"
+ "S" " "; }
+ .party1 .c { quotes: none; }
+ .party1 .d { quotes: "FAIL!" "FAIL!"
+ "FAIL!" "FAIL!"
+ "" ""; }
+ .test { margin-left: 2em; }
+ .test .no-open:before { content: no-open-quote; }
+ .test .open:before { content: open-quote; }
+ .test .triple-open:before { content: open-quote open-quote open-quote; }
+ .test .no-close:after { content: no-close-quote; }
+ .test .triple-no-close:after { content: no-close-quote no-close-quote no-close-quote; }
+ .test .close:after { content: close-quote; }
+ .test .triple-close:after { content: close-quote close-quote close-quote; }
+ .test .no-close-open:before { content: no-close-quote open-quote; }
+
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss
new file mode 100644
index 0000000000..e4e3d17658
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss
@@ -0,0 +1,31 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/quotes-035a.htm */
+
+
+ .party1 * { display: inline; }
+ .party1 .a { quotes: "Isn" "'"
+ "t" "FAIL!"
+ "FAIL!" " i"; }
+ .party1 .b { quotes: "" "FAIL!!"
+ " wonderful" "!!!"
+ " to " " work"
+ "see " " [FAIL to]"
+ "C" "quotes"
+ "S" " "
+ "S" " "; }
+ .party1 .c { quotes: none; }
+ .party1 .d { quotes: "FAIL!" "FAIL!"
+ "FAIL!" "FAIL!"
+ "" ""
+ "" ""; }
+ .test { margin-left: 2em; }
+ .test .no-open:before { content: no-open-quote; }
+ .test .open:before { content: open-quote; }
+ .test .triple-open:before { content: open-quote open-quote open-quote; }
+ .test .no-close:after { content: no-close-quote; }
+ .test .triple-no-close:after { content: no-close-quote no-close-quote no-close-quote; }
+ .test .close:after { content: close-quote; }
+ .test .triple-close:after { content: close-quote close-quote close-quote; }
+ .test .no-close-open:before { content: no-close-quote open-quote; }
+
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss b/theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss
new file mode 100644
index 0000000000..2d2927c254
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss
@@ -0,0 +1,35 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/quotes-036.htm */
+
+
+ .party1 * { display: inline; }
+ .party1 .a { quotes: "Isn" "'"
+ "t" "FAIL!"
+ "FAIL!" " i"; }
+ .party1 .b { quotes: "" "FAIL!!"
+ " wonderful" "!!!"
+ " to " " work"
+ "see " " [FAIL to]"
+ "C" "quotes"
+ "S" " "; }
+ .party1 .c { quotes: none; }
+ .party1 .d { quotes: "FAIL!" "FAIL!"
+ "FAIL!" "FAIL!"
+ "" ""; }
+ .test { margin-left: 2em; }
+ .test .no-open:before { content: no-open-quote; }
+ .test .open:before { content: open-quote; }
+ .test .triple-open:before { content: open-quote open-quote open-quote; }
+ .test .no-close:after { content: no-close-quote; }
+ .test .triple-no-close:after { content: no-close-quote no-close-quote no-close-quote; }
+ .test .close:after { content: close-quote; }
+ .test .triple-close:after { content: close-quote close-quote close-quote; }
+ .test .no-close-open:before { content: no-close-quote open-quote; }
+
+ /* hr br */
+ .test hr, .test br { display: inline; margin: 0; padding: 0;
+ height: auto; width: auto; border: none; color: inherit;
+ background: transparent; }
+ .test br:before { content: "" }
+ .test br:after { content: "" }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss b/theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss
new file mode 100644
index 0000000000..6ee83f95d6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/support/ref-green-box-100x100.htm */
+
+ div {
+ width: 100px;
+ height: 100px;
+ background: green;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss
new file mode 100644
index 0000000000..c03a4049a6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-cell-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color td.t { background-color: aqua; }
+
+ table.imagetl td.t, table.imagebr td.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl td.t { background-position: top left; /* default */ }
+ table.imagebr td.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss
new file mode 100644
index 0000000000..d0ce72d0e0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-colgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color colgroup.t { background-color: aqua; }
+
+ table.imagetl colgroup.t, table.imagebr colgroup.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl colgroup.t { background-position: top left; /* default */ }
+ table.imagebr colgroup.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss
new file mode 100644
index 0000000000..c3d2bd0503
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-column-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color col.t { background-color: aqua; }
+
+ table.imagetl col.t, table.imagebr col.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl col.t { background-position: top left; /* default */ }
+ table.imagebr col.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss
new file mode 100644
index 0000000000..1a7049fba8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-row-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tr.t { background-color: aqua; }
+
+ table.imagetl tr.t, table.imagebr tr.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tr.t { background-position: top left; /* default */ }
+ table.imagebr tr.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss
new file mode 100644
index 0000000000..69c10cca9f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-rowgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tbody.t { background-color: aqua; }
+
+ table.imagetl tbody.t, table.imagebr tbody.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tbody.t { background-position: top left; /* default */ }
+ table.imagebr tbody.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss
new file mode 100644
index 0000000000..b6a8f27ab2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-table-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color { background-color: aqua; }
+
+ table.imagetl, table.imagebr {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl { background-position: top left; /* default */ }
+ table.imagebr { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss
new file mode 100644
index 0000000000..02289c80e2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-cell-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color td.t { background-color: aqua; }
+
+ table.imagetl td.t, table.imagebr td.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl td.t { background-position: top left; /* default */ }
+ table.imagebr td.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss
new file mode 100644
index 0000000000..dae2af72ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-colgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color colgroup.t { background-color: aqua; }
+
+ table.imagetl colgroup.t, table.imagebr colgroup.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl colgroup.t { background-position: top left; /* default */ }
+ table.imagebr colgroup.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss
new file mode 100644
index 0000000000..8289f3a4bb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-column-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color col.t { background-color: aqua; }
+
+ table.imagetl col.t, table.imagebr col.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl col.t { background-position: top left; /* default */ }
+ table.imagebr col.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss
new file mode 100644
index 0000000000..f2ec27e38b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-row-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tr.t { background-color: aqua; }
+
+ table.imagetl tr.t, table.imagebr tr.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tr.t { background-position: top left; /* default */ }
+ table.imagebr tr.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss
new file mode 100644
index 0000000000..cb5b8f79a6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-rowgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tbody.t { background-color: aqua; }
+
+ table.imagetl tbody.t, table.imagebr tbody.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tbody.t { background-position: top left; /* default */ }
+ table.imagebr tbody.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss
new file mode 100644
index 0000000000..6d1eabb6a8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-table-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color { background-color: aqua; }
+
+ table.imagetl, table.imagebr {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl { background-position: top left; /* default */ }
+ table.imagebr { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss
new file mode 100644
index 0000000000..bc5733aedd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-in-inline-001.htm */
+.style { display: table-row }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss
new file mode 100644
index 0000000000..a4d01762bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-in-inline-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss
new file mode 100644
index 0000000000..fe13eb4cbb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-in-inline-001.htm */
+.style { display: table-cell }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss
new file mode 100644
index 0000000000..15d24294d1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss
new file mode 100644
index 0000000000..c93d980b57
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss
new file mode 100644
index 0000000000..8c98e302cc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+.style { padding-top: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss
new file mode 100644
index 0000000000..90b0e303b2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss
new file mode 100644
index 0000000000..9e8fc17d73
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+
+
+td { vertical-align: baseline; padding-top: 0; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss
new file mode 100644
index 0000000000..c8a265b2e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss
new file mode 100644
index 0000000000..84c4a43819
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+.style { padding-top: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss
new file mode 100644
index 0000000000..b212fc065f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss
new file mode 100644
index 0000000000..b623b103e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss
new file mode 100644
index 0000000000..646c3603f7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss
new file mode 100644
index 0000000000..c461bdba34
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss
new file mode 100644
index 0000000000..3b0a262d34
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 12px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss
new file mode 100644
index 0000000000..055905d9d7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 3px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss
new file mode 100644
index 0000000000..3563cde096
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss
new file mode 100644
index 0000000000..eac995c41d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 12px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss
new file mode 100644
index 0000000000..b2745143e2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 3px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss
new file mode 100644
index 0000000000..15214ad16a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss
new file mode 100644
index 0000000000..4b93164a1b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss
new file mode 100644
index 0000000000..49e4923cc8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss
new file mode 100644
index 0000000000..7896c6342c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 0; height: 80px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss
new file mode 100644
index 0000000000..e000d2e340
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss
new file mode 100644
index 0000000000..0a30e0d376
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 12px; height: 120px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss
new file mode 100644
index 0000000000..c4152587ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 3px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss
new file mode 100644
index 0000000000..ec44e94e6d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 40px; height: 160px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss
new file mode 100644
index 0000000000..3a3990256c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss
new file mode 100644
index 0000000000..3f56772677
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss
new file mode 100644
index 0000000000..4b20736354
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 0; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss
new file mode 100644
index 0000000000..9f71b57dd9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 40px; height: 80px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss
new file mode 100644
index 0000000000..dd8cd111f5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 12px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss
new file mode 100644
index 0000000000..90ef71d106
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 3px; height: 120px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss
new file mode 100644
index 0000000000..6d33486f7c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 40px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss
new file mode 100644
index 0000000000..0bec2dee1a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 0; height: 160px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss
new file mode 100644
index 0000000000..6c11f1b90f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss
new file mode 100644
index 0000000000..4863e1df5b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 0; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss
new file mode 100644
index 0000000000..d32301afb9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 40px; height: 80px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss
new file mode 100644
index 0000000000..b25a964d73
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 12px; height: 160px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss
new file mode 100644
index 0000000000..98808066f1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 3px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss
new file mode 100644
index 0000000000..8a366d4df2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 40px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss
new file mode 100644
index 0000000000..01e37d208c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-113.htm */
+
+p { text-indent: 100px }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss
new file mode 100644
index 0000000000..ec19eb2816
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-114.htm */
+
+p { text-indent: 0px }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss
new file mode 100644
index 0000000000..569f033276
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-115.htm */
+
+p { text-indent: 100px }
+span { background: yellow }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss
new file mode 100644
index 0000000000..6ed93593e9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+
+
+body { font-size: 12px; width: 1px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss
new file mode 100644
index 0000000000..c71814945e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { text-indent: 3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss
new file mode 100644
index 0000000000..d43af6804b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { width: 6em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss
new file mode 100644
index 0000000000..aecf9b104d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { text-indent: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss
new file mode 100644
index 0000000000..4d3f04cdf4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss
new file mode 100644
index 0000000000..11f2a1b4c7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { width: 2em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss
new file mode 100644
index 0000000000..7dcafd1001
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+
+
+body { font-size: 12px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss
new file mode 100644
index 0000000000..fb9ad27680
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { text-indent: 3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss
new file mode 100644
index 0000000000..9783ca14ac
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { width: 6em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss
new file mode 100644
index 0000000000..dc20dd4b85
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { text-indent: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss
new file mode 100644
index 0000000000..41cee98d11
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss
new file mode 100644
index 0000000000..49161e2910
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { width: 2em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss
new file mode 100644
index 0000000000..98f79df5fd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+
+
+body { font-size: 12px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss
new file mode 100644
index 0000000000..ef4f538864
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss
new file mode 100644
index 0000000000..29d824d66e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss
new file mode 100644
index 0000000000..ce29a677f1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 4em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss
new file mode 100644
index 0000000000..d9169cf13e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { text-indent: -3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss
new file mode 100644
index 0000000000..575d7393f2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { text-indent: -3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss
new file mode 100644
index 0000000000..44021e266f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss
new file mode 100644
index 0000000000..0b02a652f9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 5em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss
new file mode 100644
index 0000000000..4fcfac5be6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+
+
+body { font-size: 12px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss
new file mode 100644
index 0000000000..a8cd2367c3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { text-indent: -3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss
new file mode 100644
index 0000000000..549eca8142
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss
new file mode 100644
index 0000000000..d97bdc5805
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 4em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss
new file mode 100644
index 0000000000..645265fcee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss
new file mode 100644
index 0000000000..a43261231e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { text-indent: -3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss
new file mode 100644
index 0000000000..60d30f9cdb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 5em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss
new file mode 100644
index 0000000000..2204bedfe4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-percent-001.htm */
+
+div { width: 500px; }
+p { width: 300px; text-indent: 10%; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss
new file mode 100644
index 0000000000..fc5dab0d52
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-wrap-001.htm */
+
+p { text-indent: 100px }
+span { background: yellow }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss
new file mode 100644
index 0000000000..515fa762c3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-001.htm */
+.style { letter-spacing:2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss
new file mode 100644
index 0000000000..69ff275066
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-001.htm */
+.style { text-transform:capitalize }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss
new file mode 100644
index 0000000000..4d744e17b1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-002.htm */
+.style { letter-spacing:2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss
new file mode 100644
index 0000000000..c6bb7e4bef
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-002.htm */
+.style { text-transform:capitalize }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss
new file mode 100644
index 0000000000..0ba48a86c0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { letter-spacing:2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss
new file mode 100644
index 0000000000..e1cb8d6745
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { text-transform:capitalize }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss
new file mode 100644
index 0000000000..a0d1d9a606
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { text-transform:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss
new file mode 100644
index 0000000000..438a1e4be2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { white-space:nowrap }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss
new file mode 100644
index 0000000000..fe6e97e39f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-lowercase-001.htm */
+.style { text-transform:lowercase }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss
new file mode 100644
index 0000000000..7dc1c293cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-uppercase-001.htm */
+.style { text-transform:uppercase }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss
new file mode 100644
index 0000000000..c18eff8824
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-uppercase-002.htm */
+.style { text-transform:uppercase }
diff --git a/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java b/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java
index 59b49888c2..0183142747 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java
@@ -40,16 +40,26 @@ import java.lang.reflect.Method;
import org.junit.Assert;
import org.junit.Test;
-import com.vaadin.sass.internal.resolver.VaadinResolver;
+import com.vaadin.sass.internal.resolver.AbstractResolver;
+import com.vaadin.sass.internal.resolver.ClassloaderResolver;
+import com.vaadin.sass.internal.resolver.FilesystemResolver;
public class VaadinResolverTest {
@Test
- public void testPathNormalization() throws Exception {
+ public void testFilesystemResolverPathNormalization() throws Exception {
+ testPathNormalization(new FilesystemResolver());
+ }
+
+ @Test
+ public void testClassloaderResolverPathNormalization() throws Exception {
+ testPathNormalization(new ClassloaderResolver());
+ }
- VaadinResolver resolver = new VaadinResolver();
+ public void testPathNormalization(AbstractResolver resolver)
+ throws Exception {
- Method normalizeMethod = VaadinResolver.class.getDeclaredMethod(
+ Method normalizeMethod = AbstractResolver.class.getDeclaredMethod(
"normalize", String.class);
normalizeMethod.setAccessible(true);
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java
index 21edde0c17..6a5f8db73d 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java
@@ -28,8 +28,13 @@ import java.util.List;
import org.apache.commons.io.IOUtils;
import org.junit.Assert;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
import com.vaadin.sass.internal.ScssStylesheet;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandler;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.internal.handler.SCSSErrorHandler;
import com.vaadin.sass.testcases.scss.SassTestRunner.FactoryTest;
public abstract class AbstractDirectoryScanningSassTests {
@@ -78,19 +83,38 @@ public abstract class AbstractDirectoryScanningSassTests {
@FactoryTest
public void compareScssWithCss(String scssResourceName) throws Exception {
- String referenceCss;
File scssFile = getSassLangResourceFile(scssResourceName);
- File cssFile = getCssFile(scssFile);
- referenceCss = IOUtils.toString(new FileInputStream(cssFile));
- ScssStylesheet scssStylesheet = ScssStylesheet.get(scssFile
- .getCanonicalPath());
+
+ SCSSDocumentHandler documentHandler = new SCSSDocumentHandlerImpl();
+ SCSSErrorHandler errorHandler = new SCSSErrorHandler() {
+ @Override
+ public void error(CSSParseException arg0) throws CSSException {
+ super.error(arg0);
+ Assert.fail(arg0.getMessage());
+ }
+
+ @Override
+ public void fatalError(CSSParseException arg0) throws CSSException {
+ super.error(arg0);
+ Assert.fail(arg0.getMessage());
+ }
+ };
+
+ ScssStylesheet scssStylesheet = ScssStylesheet.get(
+ scssFile.getCanonicalPath(), null, documentHandler,
+ errorHandler);
scssStylesheet.compile();
String parsedCss = scssStylesheet.toString();
- String normalizedReference = normalize(referenceCss);
- String normalizedParsed = normalize(parsedCss);
- Assert.assertEquals("Original CSS and parsed CSS do not match for "
- + scssResourceName, normalizedReference, normalizedParsed);
+ if (getCssFile(scssFile) != null) {
+ String referenceCss = IOUtils.toString(new FileInputStream(
+ getCssFile(scssFile)));
+ String normalizedReference = normalize(referenceCss);
+ String normalizedParsed = normalize(parsedCss);
+
+ Assert.assertEquals("Original CSS and parsed CSS do not match for "
+ + scssResourceName, normalizedReference, normalizedParsed);
+ }
}
private String normalize(String css) {
@@ -120,7 +144,7 @@ public abstract class AbstractDirectoryScanningSassTests {
return new File(res.toURI());
}
- private File getCssFile(File scssFile) throws IOException {
+ protected File getCssFile(File scssFile) throws IOException {
return new File(scssFile.getCanonicalPath().replace("scss", "css"));
}
}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java
new file mode 100644
index 0000000000..1e3eb09f0c
--- /dev/null
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.sass.testcases.scss;
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.AbstractTestBase;
+import com.vaadin.sass.internal.ScssStylesheet;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandler;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.internal.parser.Parser;
+import com.vaadin.sass.internal.resolver.FilesystemResolver;
+import com.vaadin.sass.internal.tree.ImportNode;
+
+public class CompassImports extends AbstractTestBase {
+
+ String scssOtherDirectory = "/scss/compass-test/compass-import.scss";
+ String scssSameDirectory = "/scss/compass-test2/compass-import2.scss";
+ String css = "/css/compass-import.css";
+
+ String compassPath = "/scss/compass-test2";
+
+ @Test
+ public void testParser() throws CSSException, IOException {
+ Parser parser = new Parser();
+ SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+ parser.setDocumentHandler(handler);
+ parser.parseStyleSheet(getClass().getResource(scssOtherDirectory)
+ .getPath());
+ ScssStylesheet root = handler.getStyleSheet();
+ ImportNode importVariableNode = (ImportNode) root.getChildren().get(0);
+ Assert.assertEquals("compass", importVariableNode.getUri());
+ Assert.assertFalse(importVariableNode.isPureCssImport());
+ }
+
+ @Test
+ public void testCompiler() throws Exception {
+ testCompiler(scssSameDirectory, css, null);
+ }
+
+ @Test
+ public void testCompilerWithCustomPath() throws Exception {
+ File rootPath = new File(getClass().getResource(compassPath).toURI());
+
+ testCompiler(scssOtherDirectory, css, rootPath.getPath());
+ }
+
+ public void testCompiler(String scss, String css, String additionalPath)
+ throws Exception {
+ comparisonCss = getFileContent(css);
+ ScssStylesheet sheet = getStyleSheet(scss);
+ Assert.assertNotNull(sheet);
+ sheet.addResolver(new FilesystemResolver(additionalPath));
+
+ sheet.compile();
+ parsedScss = sheet.toString();
+ Assert.assertEquals("Original CSS and parsed CSS do not match",
+ comparisonCss, parsedScss);
+ }
+}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java
new file mode 100644
index 0000000000..8dbc6345d6
--- /dev/null
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.sass.testcases.scss;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.junit.runner.RunWith;
+
+import com.vaadin.sass.testcases.scss.SassTestRunner.TestFactory;
+
+@RunWith(SassTestRunner.class)
+public class W3ConformanceTests extends AbstractDirectoryScanningSassTests {
+
+ @Override
+ protected URL getResourceURL(String path) {
+ return getResourceURLInternal(path);
+ }
+
+ private static URL getResourceURLInternal(String path) {
+ return AutomaticSassTests.class.getResource("/w3ctests" + path);
+ }
+
+ @TestFactory
+ public static Collection<String> getScssResourceNames()
+ throws URISyntaxException, IOException {
+ return getScssResourceNames(getResourceURLInternal(""));
+ }
+
+ @Override
+ protected File getCssFile(File scssFile) throws IOException {
+ /*
+ * We should really compare the result of unparse(parse(css)) to css,
+ * but the comparator routine is currently too primitive.
+ */
+ // return scssFile;
+
+ // no comparison step, just parse, in this test
+ return null;
+ }
+
+ /*
+ * Download W3C conformance tests for CSS 2.1 and CSS 3 (selectors),
+ * extracts all CSS (style tags, inline styles, and linked stylesheets),
+ * then tries to parse them. Since each CSS is valid SCSS, the parser should
+ * accept them. As these are browser tests, some are intentionally
+ * malformed, and must be excluded from the test suite.
+ */
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 1) {
+ System.err.println("Target directory not provided");
+ return;
+ }
+ File targetDir = new File(args[0]);
+ for (URI url : CSS21()) {
+ extractCSS(url, targetDir);
+ }
+ for (URI url : CSS3Selectors()) {
+ extractCSS(url, targetDir);
+ }
+
+ }
+
+ public static Collection<URI> CSS21() throws Exception {
+ /*
+ * Tests explicitly excluded are listed below---case by case motivation
+ * required!
+ */
+ final String[] excludelist = new String[] {
+ // Unsupported character encoding UTF-16
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-be-002.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-be-003.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-le-002.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-le-003.htm",
+
+ // Font family name contains (Asian?) cryptoglyphs
+ "http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-010.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-011.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-015.htm",
+
+ // Contains syntactically illegal CSS
+ "http://test.csswg.org/suites/css2.1/20110323/html4/uri-013.htm",
+
+ // Missing semicolon on line 29
+ "http://test.csswg.org/suites/css2.1/20110323/html4/z-index-020.htm", };
+
+ // Note: W3C test reference files also not included!
+ return scrapeIndexForTests(
+ "http://test.csswg.org/suites/css2.1/20110323/html4/reftest-toc.html",
+ ".*[0-9][0-9][0-9][a-z]?\\.htm", Integer.MAX_VALUE,
+ new LinkedHashSet<URI>() {
+ {
+ for (String s : excludelist) {
+ add(new URI(s));
+ }
+ }
+ });
+ }
+
+ public static Collection<URI> CSS3Selectors() throws Exception {
+ /*
+ * Tests explicitly excluded are listed below---case by case motivation
+ * required!
+ */
+ final String[] excludelist = new String[] {
+
+ // Probable bug/limitation (filed as #12834)
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-73.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-73b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-74.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-74b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-75.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-75b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-76.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-76b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-83.html",
+
+ // Invalid CSS, although sass-lang compiler accepts (see #12835)
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-154.html",
+
+ // Invalid CSS? sass-lang compiler fails
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-157.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-158.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-183.html", };
+
+ return scrapeIndexForTests(
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/",
+ "css3-.*\\.html", Integer.MAX_VALUE, new LinkedHashSet<URI>() {
+ {
+ for (String s : excludelist) {
+ add(new URI(s));
+ }
+ }
+ });
+ }
+
+ /*
+ * Loads up to maxTest tests, excluding any URL in excludeUrls.
+ */
+ protected static Collection<URI> scrapeIndexForTests(String url,
+ String regexp, int maxTests, Collection<URI> excludeUrls)
+ throws Exception {
+
+ URI baseUrl = new URI(url);
+ Document doc = Jsoup.connect(url).timeout(10000).get();
+ Elements elems = doc.select(String.format("a[href~=%s]", regexp));
+ LinkedHashSet<URI> tests = new LinkedHashSet<URI>();
+ for (Element e : elems) {
+ URI testUrl = new URI(e.attr("href"));
+ if (!testUrl.isAbsolute()) {
+ testUrl = baseUrl.resolve(testUrl);
+ }
+ if (tests.size() < maxTests) {
+ if (!excludeUrls.contains(testUrl)) {
+ tests.add(testUrl);
+ }
+ } else {
+ break;
+ }
+ }
+
+ return tests;
+ }
+
+ public static void extractCSS(final URI url, File targetdir)
+ throws Exception {
+ /*
+ * For each test URL: 1) extract <style> tag contents 2) extract from
+ * <link rel="stylesheet"> files 3) extract inline style attributes from
+ * all elements and wrap the result in .style {}
+ */
+
+ Document doc = Jsoup.connect(url.toString()).timeout(20000).get();
+
+ List<String> tests = new ArrayList<String>();
+
+ for (Element e : doc.select("style[type=text/css]")) {
+ tests.add(e.data());
+ }
+
+ for (Element e : doc
+ .select("link[rel=stylesheet][href][type=text/css]")) {
+ URI cssUri = new URI(e.attr("href"));
+ if (!cssUri.isAbsolute()) {
+ cssUri = url.resolve(cssUri);
+ }
+ String encoding = doc.outputSettings().charset().name();
+ tests.add(IOUtils.toString(cssUri, encoding));
+ }
+
+ for (Element e : doc.select("*[style]")) {
+ tests.add(String.format(".style { %s }", e.attr("style")));
+ }
+
+ for (final String test : tests) {
+ targetdir.mkdirs();
+ String logfile = String.format("%s.%d.scss",
+ FilenameUtils.getBaseName(url.toString()),
+ tests.indexOf(test));
+ PrintStream dataLogger = new PrintStream(new File(targetdir,
+ logfile));
+
+ dataLogger.println("/* Source: " + url + " */");
+ dataLogger.println(test);
+
+ }
+ }
+}