Gonzales PE @dev
Gonzales PE is a CSS parser which plays nicely with preprocessors.
Currently those are supported: SCSS, Sass, LESS.
Try out Gonzales PE online: Gonzales PE Playground.
Install
(1) To install command-line tool globally:
npm install -g git://github.com/tonyganch/gonzales-pe.git#dev
(2) To install parser as a project dependency:
npm install --save git://github.com/tonyganch/gonzales-pe.git#dev
(3) If for some reason you want to build files yourself:
# Clone the repo. git clone git@github.com:tonyganch/gonzales-pe.git# Go to dev branch. git checkout dev# Install project dependencies. npm install# Install git hooks and build files. npm run init
API
Basically there are a few things you can do:
- parse css string and get a parse tree in return;
- modify tree nodes;
- remove tree nodes;
- add new nodes to the tree;
- convert modified tree back to a string.
The different type of tree nodes can be found in docs/node-types.md.
In examples below I assume that gonzales
is a parser module and parseTree
is some parsed css:
let gonzales = ;let parseTree = gonzales;
gonzales.createNode(options)
Description
Creates a new node. Useful when you need to add something to a tree.
Parameters
{Object} | options | Options to pass to a `Node` constructor. |
Returns
{Object} | A new node. |
Examples
let css = 'a {color: tomato}';let parseTree = gonzales;let node = gonzales;parseTreecontent;
gonzales.parse(css[, options])
Description
Parses a css string.
Parameters
{string} | css | A string to parse. |
{Object=} | options | Optional. Additional options:
|
Returns
{Object} | Parse tree. |
Examples
let css = 'a {color: tomato}';let parseTree = gonzales;
let less = 'a {$color: tomato}';let parseTree = gonzales;
let less = '$color: tomato';let parseTree = gonzales;
parseTree.contains(type)
Description
Checks whether there is a child node of given type.
Parameters
{string} | type | Node type we're looking for. For a list of available values see "Node types". |
Returns
{boolean} |
true if a tree contains a child node of a given type,
false otherwise.
|
Examples
if parseTree ;
parseTree.content
Returns
{string|Array} | Node's content (child nodes or a string). |
parseTree.eachFor([type, ]callback)
Description
Calls a function for every child node in tree. If type
parameter is passed,
calls a function only for child nodes of a given type. The main difference from
parseTree.forEach()
is that this method loops through node list from the end
to beginning.
Parameters
{string=} | type | Optional. A node type by which to filter child nodes before applying a callback function. For a list of available values see "Node types". |
{Function} | callback |
Function to call for every child node. Accepts following parameters:
|
Examples
parseTree;
// Remove all child spaces.parseTree;
parseTree.end
Returns
{Object} |
End position of the node. Contains following info:
|
parseTree.first([type])
Description
Gets the first child node. If type
parameter is passed, gets the first child
node of a given type. If no node has been found, returns null
.
Parameters
{string=} | type | Optional. Node type to look for. For a list of available values see "Node types". |
Returns
{?Object} | A node. |
Examples
let node = parseTree;nodecontent = 'panda';
let node = parseTree;nodecontent = 'panda';
parseTree.forEach([type, ]callback)
Description
Calls a function for every child node in tree. If type
parameter is passed,
calls a function only for child nodes of a given type. The main difference from
parseTree.eachFor()
is that this method loops through node list from the
beginnig to end.
Parameters
{string=} | type | Optional. A node type by which to filter child nodes before applying a callback function. For a list of available values see "Node types". |
{Function} | callback |
Function to call for every child node. Accepts following parameters:
|
Examples
parseTree;
parseTree;
parseTree.get(index)
Description
Gets nth child of the parseTree
. If no node has been found, returns null
.
Parameters
{number} | index | Index number of node which we're looking for. |
Returns
{?Object} | A node. |
Examples
var node = parseTree;;
parseTree.insert(index, node)
Description
Inserts a node to a given position in parseTree
.
Parameters
{number} | index | Index of position where to insert the node. |
{Object} | node | A node to insert. |
Examples
let node = gonzales;parseTree;
parseTree.is(type)
Description
Checks whether the node is of given type.
Parameters
{string} | type |
A node type against which to check type of parseTree .
For a list of available values see
"Node types".
|
Returns
{boolean} |
true if types are equal, false otherwise.
|
Examples
if node nodecontent = '';
parseTree.last(type)
Gets the last child node. If type
parameter is passed, gets the last child
node of a given type. If no node has been found, returns null
.
Parameters
{string=} | type | Optional. Node type to look for. For a list of available values see "Node types". |
Returns
{?Object} | A node. |
Examples
let node = parseTree;nodecontent = 'panda';
let node = parseTree;nodecontent = 'panda';
parseTree.length
Returns
{number} | Number of child nodes. |
parseTree.removeChild(index)
Description
Removes a child node at a given position.
Parameters
{number} | index | Index of a child node we need to remove. |
Returns
{Object} | Removed node. |
// Swap nodes.var node = parseTree;parseTree;
parseTree.start
Returns
{Object} |
Start position of the node. Contains following info:
|
parseTree.syntax
Returns
{string} | Syntax of original parsed string. |
parseTree.toJson()
Description
Converts parse tree to JSON. Useful for printing.
Returns
{Object} | Parse tree in JSON |
parseTree.toString()
Description
Converts parse tree back to string according to original syntax.
Returns
{string} | A compiled string. |
Examples
let css = parseTree;
parseTree.traverse(callback)
Description
Calls the function for every node in a tree including parseTree
itself.
Parameters
{Function} | callback |
Function to apply to every node. Accepts following parameters:
|
Examples
parseTree;
parseTree.traverseByType(type, callback)
Description
This method should be called for a root node, because calling it for a child
will be more time consuming.
Calls the function for every node of a given type. This means not just child
nodes, but grandchilds and so on.
Parameters
{string} | type | Node type. For a list of available values please see "Node types". |
{Function} | callback |
Function to apply to every node of a given type.
Accepts following parameters:
|
Examples
// Remove all comments.parseTree;
parseTree.traverseByTypes(types, callback)
Description
This method should be called for a root node, because calling it for a child
will be more time consuming.
Calls the function for every node of given types. This means not just child
nodes, but grandchilds and so on.
Parameters
{Array.string} | types | List of node types. For a list of available values please see "Node types". |
{Function} | callback |
Function to apply to every node of given types.
Accepts following parameters:
|
Examples
// Remove all comments and spaces.let types = 'multilineComment' 'space';parseTree;
parseTree.type
Returns
{string} | Node type. For a list of available values see "Node types". |
Test
To run tests:
npm test
This command will build library files from sources and run tests on all files in syntax directories.
Every test has 3 files: source stylesheet, expected parse tree and expected string compiled back from parse tree to css.
If some tests fail, you can find information in test logs:
log/test.log
contains all information from stdout;log/expected.txt
contains only expected text;log/result.txt
contains only result text.
The last two are made for your convenience: you can use any diff app to see the defference between them.
If you want to test one specific string or get a general idea of how Gonzales
works, you can use test/ast.js
file.
Simply change the first two strings (css
and syntax
vars) and run:
node test/single-test.js
Report
If you find a bug or want to add a feature, welcome to Issues.
If you are shy but have a question, feel free to drop me a line.