Presentation is loading. Please wait.

Presentation is loading. Please wait.

Migrating CSS to Preprocessors by Introducing Mixins

Similar presentations


Presentation on theme: "Migrating CSS to Preprocessors by Introducing Mixins"— Presentation transcript:

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

2 What is CSS?

3

4

5 CSS is a Style Sheet language
Defines how documents are presented

6 Simple syntax… Target document (e.g., HTML) CSS <html> …
<p>My cool paragraph</p> </html> CSS

7 Missing traditional code reuse constructs
… yet inadequate! Missing traditional code reuse constructs e.g., functions and {variables}

8 Duplication is pervasive!
[Mazinanian et al. 2014]

9 Add the missing features to CSS!
CSS preprocessors Add the missing features to CSS! DRY: using Extend or Mixin constructs Developers prefer Mixins! [SANER’16]

10 Mixins = functions! Preprocessor code CSS code Transpile .s1 {
text-align: center; .mixin1(8pt; Tahoma; 100px); } .s2 { float: left; .mixin1(10pt; Arial; 70px); .s3 { float: right; font: 9pt Tahoma { @fontN; 3; 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 Transpile

11 Can we do the reverse?!

12 Extracting Mixins CSS code Preprocessor code Extract Mixin .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 { @fontN; 3; 3; Extract Mixin

13 Why should we do the reverse?!

14 Why? A core for Migration Preprocessors are under-utilized
For the people who still like ‘Vanila’ Preprocessors are under-utilized More opportunities than what is actually used

15 How? 1) Group duplicated declarations 2) Detect differences
3) Extract the mixin Make mixin calls!

16 1) Grouping declarations
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

17 1) Grouping declarations
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!

18 1) Grouping declarations
Frequent Itemsets: Set of items bought together (in a store) in at least s transactions (|s| ⩾ 2)

19 1) Grouping declarations
Frequent Declarations: Set of declarations appearing together In more than s selectors (|s| ⩾ 2)

20 1) Grouping declarations
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

21 2) Detecting differences in values
{ } .s1 { float: left; will-change: transform; .mixin(#f00; 1px; solid); .s2 { color: red; .mixin(dotted; red; thin); .s1 { float: left; will-change: transform; border: #f00 1px solid; } .s2 { color: red; border: dotted red thin; 3 differences = 3 parameters

22 2) Detecting differences in values
{ border: #f00 } .s1 { float: left; will-change: transform; .mixin(solid); .s2 { color: red; .mixin(dotted); .s1 { float: left; will-change: transform; border: #f00 1px solid; } .s2 { color: red; border: dotted red thin; 1 difference = 1 parameter

23 2) Detecting differences in values
float: left; will-change: transform; border: #f00 1px solid; } .s2 { color: red; border: dotted red thin; ISP: border-style Detecting Individual Style Properties ISP: border-style

24 Extract mixin! Add the grouped declarations to the mixin
Parameterize declarations Each difference = 1 parameter Make mixin calls and put them in selectors… where?!

25 Are these transformations safe?

26 What can go wrong? Expected output Extract Mixin Resulting Transpile

27 Preserving Presentation
Precondition: Preserve all order dependencies [Mazinanian et al. 2014] .a { ... border: solid 3px red; border-bottom: none; padding: 1px; } Mixin call position: A CSP! pos(.mixin()) < pos(border-bottom) Variables: .mixin(), border-bottom Values’ domain: 1, 2

28 Evaluation Dataset: 21 Websites from [SANER’16] dataset 8 CSS Libraries For every pair of matching style rules (S, S’) defined in C and C’, respectively, style-map(S) == style-map(S’). style-map(S) : what styles are assigned to an individual style property

29 Evaluation RQ1: Is the presentation preserved?
CSS Before (C) Preprocessor Code CSS After (C’) Extract Mixin Transpile For every pair of matching style rules (S, S’) defined in C and C’, respectively, style-map(S) == style-map(S’). style-map(S) : what styles are assigned to an individual style property Test the presentation preservation conditions

30 RQ1: Preserving Presentation
The main condition: Select the same elements, Same ISPs should get equivalent styles <html> <></> </html> Before <html> <></> </html> ISP1: border-left-color Value: green ISP1: border-left-color Value: #0f0 After

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

32 Evaluation RQ2: Can we detect all manually-developed mixins?
Preprocessor (Manually developed) Preprocessor (Automatically Generated) CSS Transpile Extract Mixin Compare mixins

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

34 Libraries are better coded!

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

36 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

37 Let’s collaborate! Check my tool out! /dmazinanian dmazinanian.me

38

39 What we don’t support String interpolation

40 Preserving Presentation
Precondition II: The ordering of the style declarations inside a mixin should preserve their original order dependencies in the style rules from which they are extracted The “template” ensures that The only possibility: conflicting dependencies

41 2) Detecting differences in values
@mbottom) { 5px; } .s1 { ... .mixin(3px; 3px); .s2 { .mixin(2px; 1px); .s1 { ... margin-left: 5px; margin-right: 5px; margin-top: 3px; margin-bottom: 3px; } .s2 { margin: 2px 5px 1px; Shorthand Declaration

42 References [FSE’14] Davood Mazinanian, Nikolaos Tsantalis, and Ali Mesbah, "Discovering Refactoring Opportunities in Cascading Style Sheets," 22nd ACM SIGSOFT International Symposium on the Foundations of Software Engineering (FSE'2014), pp , 2014 [SANER’16] Davood Mazinanian, and Nikolaos Tsantalis, "An Empirical Study on the Use of CSS Preprocessors," 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER'2016), pp , 2016.


Download ppt "Migrating CSS to Preprocessors by Introducing Mixins"

Similar presentations


Ads by Google