Source code for jasy.style.Engine
#
# Jasy - Web Tooling Framework
# Copyright 2013-2014 Sebastian Werner
#
import copy
import jasy.core.Console as Console
import jasy.style.tokenize.Tokenizer as Tokenizer
import jasy.style.parse.Parser as Parser
import jasy.style.parse.ScopeScanner as ScopeScanner
import jasy.style.clean.Unused as Unused
import jasy.style.clean.Permutate as Permutate
import jasy.style.output.Formatting as Formatting
import jasy.style.output.Optimization as Optimization
import jasy.style.process.Mixins as Mixins
import jasy.style.process.Flatter as Flatter
import jasy.style.process.Executer as Executer
import jasy.style.output.Optimization as Optimization
import jasy.style.output.Formatting as Formatting
import jasy.style.output.Compressor as Compressor
[docs]def getTokenizer(text, fileId=None):
"""
Returns a tokenizer for the given file content
"""
return Tokenizer.Tokenizer(text, fileId, 0)
[docs]def getTree(text, fileId=None):
"""
Returns a tree of nodes from the given text
"""
return Parser.parse(text, fileId)
[docs]def permutateTree(tree, permutation=None):
"""
Returns an optimized tree with permutations applied
"""
if permutation:
Permutate.patch(tree, permutation)
return tree
else:
return tree
[docs]def reduceTree(tree, profile=None):
"""
Applies all relevant modifications to the tree to allow compression to CSS
"""
Console.info("Reducing tree: %s...", tree.fileId)
Console.indent()
# PHASE 2
# Trivial cleanups
ScopeScanner.scan(tree)
Unused.cleanup(tree)
# PHASE 3
# Resolve all mixins
Mixins.processMixins(tree)
Mixins.processSelectors(tree)
ScopeScanner.scan(tree)
Unused.cleanup(tree)
# PHASE 4
# Assign selectors to mixins (support for extend)
Mixins.processExtends(tree)
# PHASE 5
# Post mixin cleanups
ScopeScanner.scan(tree)
Unused.cleanup(tree)
# PHASE 6
# Execute variable resolution and method calls
Executer.process(tree, profile)
# PHASE 7
# Flattening selectors
Flatter.process(tree)
# PHASE 8
# Post scan to remove (hopefully) all variable/mixin access
ScopeScanner.scan(tree)
Console.outdent()
return tree
[docs]def compressTree(tree, optimizationLevel=0, formattingLevel=0):
"""
Returns the compressed result from the given tree
"""
optimization = Optimization.Optimization()
formatting = Formatting.Formatting()
if formattingLevel > 0:
formatting.enable("blocks")
if formattingLevel > 1:
formatting.enable("statements")
if formattingLevel > 2:
formatting.enable("whitespace")
formatting.enable("indent")
return Compressor.Compressor(optimization, formatting).compress(tree)
[docs]def printTokens(text, fileId=None):
"""
Prints out a structured list of tokens
"""
tokenizer = getTokenizer(text, fileId)
indent = 0
while tokenizer.get() and not tokenizer.done():
tokenType = tokenizer.token.type
tokenValue = getattr(tokenizer.token, "value", None)
if tokenType == "left_curly":
indent += 1
continue
elif tokenType == "right_curly":
indent -= 1
continue
if tokenValue is not None:
Console.info("%s%s: %s" % (indent * " ", tokenType, tokenValue))
else:
Console.info("%s%s" % (indent * " ", tokenType))