/[james]/factorcss/FactorCSS.hs
ViewVC logotype

Contents of /factorcss/FactorCSS.hs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (show annotations) (download) (as text)
Mon Dec 27 19:11:07 2004 UTC (20 years ago) by james
File MIME type: text/x-haskell
File size: 3398 byte(s)
Process parse tree to factor stylesheet.

1 -- Factor a CSS stylesheet
2
3 import List
4 import Tokeniser
5 import Parser
6 import CSS
7
8 main = do
9 s <- getContents
10 -- print (alexScanTokens s)
11 -- (print . process . parser . alexScanTokens) s
12 (putStr . unlines . show_stylesheet . process .
13 parser . alexScanTokens) s
14
15 -- Process a Stylesheet.
16 process :: Stylesheet -> Stylesheet
17 process (Stylesheet charset imports stmts) =
18 Stylesheet charset imports (process_stmts stmts)
19
20 -- Process a list of Statements.
21 process_stmts :: [Statement] -> [Statement]
22 process_stmts stmts = (factor . filter is_ruleset) stmts ++
23 (map process_media . filter is_media) stmts ++
24 filter is_page stmts
25
26 -- Process a Media Statement.
27 process_media :: Statement -> Statement
28 process_media (Media media stmts) = Media media (factor stmts)
29
30 -- Factor a list of Ruleset Statements.
31 factor :: [Statement] -> [Statement]
32 factor = map implode_sel . groupBy eq_sel .
33 sortBy cmp_sel .
34 map implode_decl . groupBy eq_decl .
35 sortBy cmp_decl . sortBy cmp_sel .
36 concat . map explode
37
38 -- Explode a Ruleset Statement into an equivalent list of Ruleset Statements
39 -- with one Selector and one Declaration per Ruleset.
40 --
41 -- For example (in CSS syntax),
42 -- explode "h1, em { color: red; background-color: blue }" =
43 -- "h1 { color: red }
44 -- h1 { background-color: blue }
45 -- em { color: red }
46 -- em { background-color: blue }"
47 --
48 -- [length (explode (Ruleset sels decls)) == length sels * length decls]
49 explode :: Statement -> [Statement]
50 explode (Ruleset sels decls) =
51 concat (map (\s -> map (\d -> Ruleset [s] [d]) decls) sels)
52
53 -- Compare two Ruleset Statements by the Selectors in each.
54 cmp_sel :: Statement -> Statement -> Ordering
55 cmp_sel (Ruleset sels0 decls0) (Ruleset sels1 decls1)
56 | a < b = LT
57 | a == b = EQ
58 | a > b = GT
59 where a = show_selectors sels0
60 b = show_selectors sels1
61
62 -- Compare two Ruleset Statements by the first Declaration in each.
63 cmp_decl :: Statement -> Statement -> Ordering
64 cmp_decl (Ruleset sels0 (decl0:decls0)) (Ruleset sels1 (decl1:decls1))
65 | a < b = LT
66 | a == b = EQ
67 | a > b = GT
68 where a = show_declaration decl0
69 b = show_declaration decl1
70
71 -- Compare two Ruleset Statements for equality by the Selectors in each.
72 eq_sel :: Statement -> Statement -> Bool
73 eq_sel z = (== EQ) . cmp_sel z
74
75 -- Compare two Ruleset Statements for equality by the first declaration in each.
76 eq_decl :: Statement -> Statement -> Bool
77 eq_decl z = (== EQ) . cmp_decl z
78
79 -- Implode a list of Ruleset Statements with equal lists of Selectors to a
80 -- single equivalent Ruleset Statement.
81 --
82 -- For example,
83 -- implode_sel "h1, em { color: red }
84 -- h1, em { background-color: blue }" =
85 -- "h1, em { color: red; background-color: blue }"
86 implode_sel :: [Statement] -> Statement
87 implode_sel ((Ruleset sels decls):stmts) =
88 Ruleset sels (concat (decls:(map declarations stmts)))
89 where declarations :: Statement -> [Declaration]
90 declarations (Ruleset s d) = d
91
92 -- Implode a list of Ruleset Statements with equal lists of Declarations to a
93 -- single equivalent Ruleset Statement.
94 --
95 -- For example,
96 -- implode_decl "h1 { color: red }
97 -- em { color: red }" =
98 -- "h1, em { color: red }"
99 implode_decl :: [Statement] -> Statement
100 implode_decl ((Ruleset sels decls):stmts) =
101 Ruleset (concat (sels:(map selectors stmts))) decls
102 where selectors :: Statement -> [Selector]
103 selectors (Ruleset s d) = s

  ViewVC Help
Powered by ViewVC 1.1.26