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

Migrating cascading style sheets to preprocessors

Feb 18, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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