37
Migrating CSS to Preprocessors by Introducing Mixins Davood Mazinanian Nikolaos Tsantalis ASE’16

Migrating cascading style sheets to preprocessors

Embed Size (px)

Citation preview

Page 1: Migrating cascading style sheets to preprocessors

Migrating CSS to Preprocessors

by Introducing MixinsDavood Mazinanian Nikolaos Tsantalis

ASE’16

Page 2: Migrating cascading style sheets to preprocessors

What is CSS?

2 / 37

Page 3: Migrating cascading style sheets to preprocessors

3 / 37

Page 4: Migrating cascading style sheets to preprocessors

4 / 37

Page 5: Migrating cascading style sheets to preprocessors

CSS is a Style Sheet language

Defines how documents are presented

5 / 37

Page 6: Migrating cascading style sheets to preprocessors

Simple syntax…

<html> … <p>My cool paragraph</p> …</html>

Target document (e.g., HTML)

CSS

6 / 37

Page 7: Migrating cascading style sheets to preprocessors

… yet inadequate!

Missing traditional code reuse constructs

e.g., functions and {variables}

7 / 37

Page 8: Migrating cascading style sheets to preprocessors

Duplication is pervasive!

[Mazinanian et al. 2014]

8 / 37

Page 9: Migrating cascading style sheets to preprocessors

CSS preprocessors

Add the missing features to CSS!

9 / 37

Page 10: Migrating cascading style sheets to preprocessors

Mixins = functions!.s1 { text-align: center; .mixin1(8pt; Tahoma; 100px);}

.s2 { float: left; .mixin1(10pt; Arial; 70px);}

.s3 { float: right; font: 9pt Tahoma}

.mixin1(@fontS; @fontN; @colW) { font: @fontS @fontN; -moz-columns: @colW 3; columns: @colW 3;}

.s1 { text-align: center; font: 8pt Tahoma; -moz-columns: 100px 3; columns: 100px 3}

.s2 { float: left; font: 10pt Arial; -moz-columns: 70px 3; columns: 70px 3;}

.s3 { float: right; font: 9pt Tahoma}

Preprocessor code CSS code

Transpile

10 / 37

Page 11: Migrating cascading style sheets to preprocessors

Can we do the reverse?!

11 / 37

Page 12: Migrating cascading style sheets to preprocessors

Extracting Mixins.s1 { text-align: center; font: 8pt Tahoma; -moz-columns: 100px 3; columns: 100px 3}

.s2 { float: left; font: 10pt Arial; -moz-columns: 70px 3; columns: 70px 3;}

.s3 { float: right; font: 9pt Tahoma}

.s1 { text-align: center; .m1(8pt; Tahoma; 100px);}

.s2 { float: left; .m1(10pt; Arial; 70px);}

.s3 { float: right; font: 9pt Tahoma}

.m1(@fontS; @fontN; @colW) { font: @fontS @fontN; -moz-columns: @colW 3; columns: @colW 3;}

Preprocessor codeCSS code

Extract Mixin

12 / 37

Page 13: Migrating cascading style sheets to preprocessors

Why should we do the reverse?!

13 / 37

Page 14: Migrating cascading style sheets to preprocessors

Why?1. A core for Migration• For the people who still like ‘Vanila’

2. Preprocessors are under-utilized•More opportunities than what is actually used

14 / 37

Page 15: Migrating cascading style sheets to preprocessors

How?1) Group duplicated declarations2) Detect differences3) Extract the mixin• Make mixin calls!

15 / 37

Page 16: Migrating cascading style sheets to preprocessors

1) Grouping declarations.s1 { text-align: center; font: 8pt Tahoma; -moz-columns: 100px 3; columns: 100px 3}

.s2 { float: left; font: 10pt Arial; -moz-columns: 70px 3; columns: 70px 3;}

.s3 { float: right; font: 9pt Tahoma}• Brute force ⟹ combinatorial explosion

16 / 37

Page 17: Migrating cascading style sheets to preprocessors

1) Grouping declarations.s1 { text-align: center; font: 8pt Tahoma; -moz-columns: 100px 3; columns: 100px 3}

.s2 { float: left; font: 10pt Arial; -moz-columns: 70px 3; columns: 70px 3;}

.s3 { float: right; font: 9pt Tahoma}• Using frequent itemset mining!

17 / 37

Page 18: Migrating cascading style sheets to preprocessors

1) Grouping declarations

Frequent Itemsets:

Set of items bought together (in a store)

in at least s transactions (|s| ⩾ 2)

18 / 37

Page 19: Migrating cascading style sheets to preprocessors

1) Grouping declarations

Frequent Declarations:

Set of declarations appearing togetherIn more than s selectors (|s| ⩾ 2)

19 / 37

Page 20: Migrating cascading style sheets to preprocessors

1) Grouping declarations.s1 { text-align: center; font: 8pt Tahoma; -moz-columns: 100px 3; columns: 100px 3}

.s2 { float: left; font: 10pt Arial; -moz-columns: 70px 3; columns: 70px 3;}

.s3 { float: right; font: 9pt Tahoma}• Application of the FP-Growth algorithm

20 / 37

Page 21: Migrating cascading style sheets to preprocessors

2) Detecting differences in values

.s1 { float: left; will-change: transform; border: #f00 1px solid;}

.s2 { color: red; border: dotted red thin;}

.mixin(@v1; @v2; @v3) { border: @v1 @v2 @v3;}

.s1 { float: left; will-change: transform; .mixin(#f00; 1px; solid);}.s2 { color: red; .mixin(dotted; red; thin);}

3 differe

nces =

3 paramete

rs

21 / 37

Page 22: Migrating cascading style sheets to preprocessors

2) Detecting differences in values

.s1 { float: left; will-change: transform; border: #f00 1px solid;}

.s2 { color: red; border: dotted red thin;}

.mixin(@style) { border: #f00 1px @style;}

.s1 { float: left; will-change: transform; .mixin(solid);}.s2 { color: red; .mixin(dotted);}

1 differe

nce = 1 para

meter

22 / 37

Page 23: Migrating cascading style sheets to preprocessors

2) Detecting differences in values

.s1 { float: left; will-change: transform; border: #f00 1px solid;}

.s2 { color: red; border: dotted red thin;}

Detecting Individual Style Properties

ISP: border-style

ISP: border-style

23 / 37

Page 24: Migrating cascading style sheets to preprocessors

Extract mixin!1) Add the grouped declarations to the

mixin2) Parameterize declarations• Each difference = 1 parameter

3) Make mixin calls and put them in selectors…• where?!

24 / 37

Page 25: Migrating cascading style sheets to preprocessors

Are these transformations safe?

25 / 37

Page 26: Migrating cascading style sheets to preprocessors

What can go wrong?Expected output

Transpile

Extract Mixin

Resulting output

26 / 37

Page 27: Migrating cascading style sheets to preprocessors

Preserving Presentation

• Mixin call position: A CSP!

.a { ... border: solid 3px red; border-bottom: none; padding: 1px; ...}

pos(.mixin()) < pos(border-bottom)

• Precondition:• Preserve all order dependencies [Mazinanian et al.

2014]

27 / 37

Page 28: Migrating cascading style sheets to preprocessors

Evaluation• Dataset:• 21 Websites from [SANER’16] dataset• 8 CSS Libraries

28 / 37

Page 29: Migrating cascading style sheets to preprocessors

Evaluation• RQ1: Is the presentation preserved?

Preprocessor CodeCSS Before (C)

Extract Mixin Transpile

CSS After (C’)

Test the presentation preservation conditions

29 / 37

Page 30: Migrating cascading style sheets to preprocessors

RQ1: Preserving Presentation• The main condition:• Select the same elements,• Same ISPs should get equivalent styles

<html> … <></> … <></> … <></> … <></> <></> … <></> <></> …</html>

Before

ISP1: border-left-color Value: green

<html> … <></> … <></> … <></> … <></> <></> … <></> <></> …</html>

After

ISP1: border-left-color Value: #0f0

30 / 37

Page 31: Migrating cascading style sheets to preprocessors

RQ1 Results• RQ1: All tests were eventually passed!• 9555 opportunities were tested• Bugs related to implementation• Bugs related to assigning correct ISPs

31 / 37

Page 32: Migrating cascading style sheets to preprocessors

Evaluation• RQ2: Can we detect all manually-

developed mixins?

CSSPreprocessor(Manually developed)

Transpile Extract Mixin

Preprocessor(Automatically Generated)

Compare mixins

32 / 37

Page 33: Migrating cascading style sheets to preprocessors

RQ2 Results• Almost 98% recall• 189 / 193 manually developed mixins• 2 advanced features (in 4 mixins) that we do

not support

33 / 37

Page 34: Migrating cascading style sheets to preprocessors

Libraries are better coded!

34 / 37

Page 35: Migrating cascading style sheets to preprocessors

Limitations• High number of opportunities• Filter out based on box plot outliers

35 / 37

Page 36: Migrating cascading style sheets to preprocessors

Conclusions and Future Work• An approach for extracting mixins• Safe to apply• High recall

• Filters can reduce the number of opportunities, while keeping recall high• Yet we need a ranking mechanism

• Conducting a user study is crucial

36 / 37

Page 37: Migrating cascading style sheets to preprocessors

Let’s collaborate!• Check my tool out!

/dmazinaniandmazinanian.me

37 / 37