Skip to content

Commit

Permalink
Compile media queries after evaluation
Browse files Browse the repository at this point in the history
Making media query joining and searching faster
  • Loading branch information
curvedmark committed Mar 2, 2013
1 parent dc10dcb commit 810cb55
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 25 deletions.
12 changes: 6 additions & 6 deletions lib/extender/mediaFilter.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
/**
* Media Filter
*
* Find media nodes existing before the passed extend node
* and matching the passed media query list node.
* Find medias matching the passed media queries
*/
'use strict'

Expand All @@ -16,8 +15,8 @@ MediaFilter.stop = {}

MediaFilter.prototype = new Visitor()

MediaFilter.prototype.filter = function(ast, mediaQueryListNode, options) {
this.mediaQueryListNode = mediaQueryListNode
MediaFilter.prototype.filter = function(ast, mediaQueries, options) {
this.mediaQueries = mediaQueries
this.mediaNodes = []

try {
Expand All @@ -39,14 +38,15 @@ MediaFilter.prototype.visitNode = _.noop

MediaFilter.prototype.visitMedia = function(mediaNode) {
var mediaQueryListNode = mediaNode.children[0]
var mediaQueries = mediaQueryListNode.children
var ruleListNode = mediaNode.children[1]

if (mediaQueryListNode === this.mediaQueryListNode) {
if (mediaQueries === this.mediaQueries) {
this.mediaNodes.push(mediaNode)
throw MediaFilter.stop
}

if (Node.equal(mediaQueryListNode, this.mediaQueryListNode))
if (Node.equal(mediaQueries, this.mediaQueries))
this.mediaNodes.push(mediaNode)
else
this.visit(ruleListNode)
Expand Down
5 changes: 2 additions & 3 deletions lib/extender/node/extend.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ Extender.prototype.visitExtend = function(extendNode) {
insideVoid: !!this.parentVoid
}

var parentMediaQueryList = this.parentMediaQueryList
if (parentMediaQueryList) {
var mediaNodes = new MediaFilter().filter(nodes, parentMediaQueryList, options)
if (this.parentMediaQueries) {
var mediaNodes = new MediaFilter().filter(nodes, this.parentMediaQueries, options)
nodes = []
mediaNodes.forEach(function(mediaNode) {
nodes = nodes.concat(mediaNode.children)
Expand Down
6 changes: 3 additions & 3 deletions lib/extender/node/media.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ var Extender = require('../extender')
Extender.prototype.visitMedia = function(mediaNode) {
var mediaQueryListNode = this.visit(mediaNode.children[0])

var parentMediaQueryList = this.parentMediaQueryList
this.parentMediaQueryList = mediaQueryListNode
var parentMediaQueries = this.parentMediaQueries
this.parentMediaQueries = mediaQueryListNode.children

this.visit(mediaNode.children[1])

this.parentMediaQueryList = parentMediaQueryList
this.parentMediaQueries = parentMediaQueries
}
8 changes: 6 additions & 2 deletions lib/extender/node/mediaQuery.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
'use strict'

var compiler = require('../../compiler')

var Extender = require('../extender')

Extender.prototype.visitMediaQuery = function(mediaQueryNode) {
if (this.parentMediaQuery)
mediaQueryNode.children = this.parentMediaQuery.children.concat(mediaQueryNode.children)
var mediaQuery = compiler.compile(mediaQueryNode)
var parentMediaQuery = this.parentMediaQuery
if (parentMediaQuery) parentMediaQuery += ' and '
return parentMediaQuery + mediaQuery
}
18 changes: 7 additions & 11 deletions lib/extender/node/mediaQueryList.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,20 @@ var Node = require('../../node')
var Extender = require('../extender')

Extender.prototype.visitMediaQueryList = function(mediaQueryListNode) {
var parentMediaQueryList = this.parentMediaQueryList
if (this.parentMediaQueries) {
var parentMediaQueries = []

if (parentMediaQueryList) {
var length = parentMediaQueryList.children.length
var children = []

parentMediaQueryList.children.forEach(function(parentMediaQuery, i) {
this.parentMediaQueries.forEach(function(parentMediaQuery) {
this.parentMediaQuery = parentMediaQuery

var mediaQueryListClone = i === length - 1 ? mediaQueryListNode : Node.clone(mediaQueryListNode)
mediaQueryListClone.children.forEach(function(selectorNode) {
children.push(this.visit(selectorNode))
mediaQueryListNode.children.forEach(function(mediaQueryNode) {
parentMediaQueries.push(this.visit(mediaQueryNode))
}, this)
}, this)

mediaQueryListNode.children = children
mediaQueryListNode.children = parentMediaQueries
} else {
this.parentMediaQuery = null
this.parentMediaQuery = ''
this.visit(mediaQueryListNode.children)
}
}

0 comments on commit 810cb55

Please sign in to comment.