Détail du package

gonzales-pe

tonyganch12.2mMIT4.3.0

Gonzales Preprocessor Edition (fast CSS parser)

readme

Gonzales PE @dev

NPM version Build Status AppVeyor Build Status

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:

  1. parse css string and get a parse tree in return;
  2. modify tree nodes;
  3. remove tree nodes;
  4. add new nodes to the tree;
  5. 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 = require('gonzales-pe');
let parseTree = gonzales.parse(css);

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.parse(css);
let node = gonzales.createNode({ type: 'animal', content: 'panda' });
parseTree.content.push(node);

gonzales.parse(css[, options])

Description

Parses a css string.

Parameters
{string} css A string to parse.
{Object=} options Optional. Additional options:
  • {string} syntax — any of the following: css, less, sass, scss. Default one is css.
  • {string} context — root node's type. For a list of available values see "Node types". Default one is stylesheet.
  • {number} tabSize — size of a tab character in spaces. Default one is 1.
Returns
{Object} Parse tree.
Examples
let css = 'a {color: tomato}';
let parseTree = gonzales.parse(css);
let less = 'a {$color: tomato}';
let parseTree = gonzales.parse(less, {syntax: 'less'});
let less = '$color: tomato';
let parseTree = gonzales.parse(less, {syntax: 'less', rule: 'declaration'});

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.contains('space')) {
  doSomething();
}

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:
  • {Object} — a child node;
  • {number} — index of the child node in node list;
  • {Object} — parent node (equals to parseTree).
Examples
parseTree.eachFor(function(childNode) {
  doSomething(childNode);
});
// Remove all child spaces.
parseTree.eachFor('space', function(spaceNode, i) {
  parseTree.removeChild(i);
});

parseTree.end

Returns
{Object} End position of the node. Contains following info:
  • {number} line — last symbol's line number (1-based index);
  • {number} column — last symbol's column number (1-based index).

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.first();
node.content = 'panda';
let node = parseTree.first('multilineComment');
node.content = '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:
  • {Object} — a child node;
  • {number} — index of the child node in node list;
  • {Object} — parent node (equals to parseTree).
Examples
parseTree.forEach(function(childNode) {
  doSomething();
});
parseTree.forEach('space', function(spaceNode) {
  doSomething();
});

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.get(2);
doSomething(node);

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.createNode({type: 'animal', content: 'panda'});
parseTree.insert(2, node);

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.is('space')) {
  node.content = '';
}

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.last();
node.content = 'panda';
let node = parseTree.last('multilineComment');
node.content = '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.
##### Examples js // Swap nodes. var node = parseTree.removeChild(1); parseTree.insert(0, node); ### parseTree.start ##### Returns
{Object} Start position of the node. Contains following info:
  • {number} line — first symbol's line number (1-based index);
  • {number} column — first symbol's column number (1-based index).

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.toString();

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:
  • {Object} — a node to which we apply callback;
  • {number} — node's index number inside its parent;
  • {Object} — a node's parent;
  • {number} — node's nesting level relative to its parent.
Examples
parseTree.traverse(function(node, index, parent) {
  if (node.is('multilineComment')) {
    parent.removeChild(index);
  } else if (node.is('space')) {
    node.content = ' ';
  }
});

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:
  • {Object} — a node to which we apply callback;
  • {number} — node's index number inside its parent;
  • {Object} — a node's parent.
Examples
// Remove all comments.
parseTree.traverseByType('multilineComment', function(node, index, parent) {
  parent.removeChild(index);
});

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:
  • {Object} — a node to which we apply callback;
  • {number} — node's index number inside its parent;
  • {Object} — a node's parent.
Examples
// Remove all comments and spaces.
let types = ['multilineComment', 'space'];
parseTree.traverseByTypes(types, function(node, index, parent) {
  parent.removeChild(index);
});

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.

changelog

Changelog

Legend:

:japanese_ogre: — be afraid of this change because it breaks the way things worked before.
:star: — some new thing has been added.
:green_apple: — some bad thing has been fixed.

30.03.2020, version 4.3.0

:star: Added support for interpolation of custom properties in Sass. :green_apple: Updated minimist version to 1.2.5. :green_apple: Updated playground link to https.

22.03.2019, version 4.2.4

:star: Renamed prepublish script to prepublishOnly.
:star: Updated link to playground.
:green_apple: Fixed badges.
:green_apple: Fixed content guard in node.contains().

28.09.2017, version 4.2.3

:green_apple: Fixed parsing of empty url() in Sass and SCSS.

30.08.2017, version 4.2.2

:green_apple: Fixed parsing of /deep/ in CSS, LESS, Sass and SCSS.

29.08.2017, version 4.2.1

:green_apple: Fixed parsing of pseudo-element in CSS, LESS, Sass and SCSS.

29.08.2017, version 4.2.0

:star: Add support for custom property syntax in CSS, Sass and SCSS.
:star: Add support for deep combinator syntax in CSS, LESS, Sass and SCSS.
:star: Add support for alternative descendant >> syntax in CSS, LESS, Sass and SCSS.
:star: Add support for ::slotted() syntax in CSS, LESS, Sass and SCSS.
:green_apple: Fixed parsing of non-lowercase keyframes at-rule in CSS, LESS, Sass and SCSS.
:green_apple: Fixed parsing of multiline selectors within keyframes in Sass.
:green_apple: Fixed parsing of !important within maps in Sass and SCSS.
:green_apple: Fixed parsing of ... following a function in Sass and SCSS.

23.08.2017, version 4.1.1

:star: Unified codebase style across syntaxes.
:green_apple: Fixed parsing of URLs in Sass and SCSS.
:green_apple: Fixed parsing of placeholders in Sass and SCSS.
:green_apple: Fixed parsing of interpolated values within type selectors in Sass and SCSS.
:green_apple: Fixed parsing of spacing within pseudo class arguments in all syntaxes.
:green_apple: Fixed parsing of parent selectors within parentheses in Sass and SCSS.
:star: Abstracted attribute tests for CSS, LESS, Sass and SCSS.
:green_apple: Fixed parsing of pseudo classes within keyframes in Sass and SCSS.
:green_apple: Fixed parsing of dimensions in LESS.

20.11.2016, version 4.0.3

:green_apple: Fixed parsing of interpolations inside URI nodes in SCSS and Sass.

18.11.2016, version 4.0.2

:green_apple: Fixed parsing of trailing newlines.

18.11.2016, version 4.0.1

:japanese_ogre: Removed postinstall script.

17.11.2016, version 4.0.0

:japanese_ogre: Dropped support for Node < 4.
:japanese_ogre: Brought back postinstall script that should allow installing from GitHub.
:japanese_ogre: Made multiline comments in Sass consistent with other syntaxes by removing closing */ from node's content.
:japanese_ogre: Implemented new node type, universalSelector, which represents *. See docs for more details. :green_apple: Fixed parsing of comments in Sass.
:green_apple: Fixed parsing of keyframes inside includes in Sass.
:green_apple: Fixed parsing of flags in arguments in Sass and SCSS.
:green_apple: Fixed parsing of multiple declarations within arguments in SCSS and Sass.
:green_apple: Improved parsing of interpolations in SCSS and Sass.
:green_apple: Adjust parsing priority of declarations & atrule in Less.

22.10.2016, version 3.4.7

:green_apple: Included forgotten test for #226.
:green_apple: Fixed issue when !important was not parsed as function argument.

22.10.2016, version 3.4.6

:green_apple: Changed parsing of ident nodes which fixed issue with asterisks being parsed as idents instead of operators.
:green_apple: Fixed capitalisation in Changelog.

20.10.2016, version 3.4.5

:green_apple: Change parser to strip DOS newlines from comments.
:star: Add links to README.md.

12.08.2016, version 3.4.4

:green_apple: Fixed parsing of numbers following interpolation in class selectors in Sass and SCSS.

08.08.2016, version 3.4.3

:green_apple: Fixed parsing of unicode ranges.

04.08.2016, version 3.4.2

:green_apple: Disable Google Closure Compiler due to some errors in parsing.

27.07.2016, version 3.4.1

:star: Added publich script.
:green_apple: Fixed post-refactor error in Node#last method.

27.07.2016, version 3.4.0

:star: Added unicode-range and urange node types in CSS, Less, Sass and SCSS.
:green_apple: Fixed parsing of trailing interpolation in compound selector in Sass and SCSS.
:green_apple: Fix parsing of hyphens after interpolation with parentSelectors in Sass and SCSS.
:green_apple: Added ESLint and moved linters to a separate script.
:green_apple: Fixed incorrect dimension wrap of unicode-ranges in CSS, Sass and SCSS.
:green_apple: Fixed parsing of hyphens in interpolated idents in Sass and SCSS.
:green_apple: Added compilation of JS using Google Closure.

01.07.2016, version 3.3.6

:green_apple: Fixed parsing of nth selector without numbers before n.

21.06.2016, version 3.3.5

:green_apple: Fixed issue with content at-rule and keyframes in Sass and SCSS.
:green_apple: Fixed namespace attribute selector in CSS, Sass and SCSS.
:green_apple: Fixed issue with modulo operator in values in Sass.
:green_apple: Fixed usage of @content with keyframes in Sass and SCSS.
:green_apple: Fixed namespace attribute selector issue in CSS, Sass and SCSS.
:green_apple: Fixed parsing of interpolations in pseudo-classes in Sass and SCSS.
:green_apple: Fixed interpolated percentage keyframe selector issue in Sass and SCSS.
:green_apple: Updated Travis config to not include environment variables.

18.05.2016, version 3.3.4

:green_apple: Fixed mistake from @3.3.2 version when parent selector was "correctly" parsed as property instead of value.

18.05.2016, version 3.3.3

:green_apple: Fixed prepublish script to build lib.

18.05.2016, version 3.3.2

:star: Added AppVeyor badge.
:green_apple: Fixed build file to glue multiple syntaxes into one file.
:green_apple: Fixed parsing of functions inside urls in Sass.
:green_apple: Fixed parsing of mulitple keyframe selectors in CSS, Sass and SCSS.
:green_apple: Fixed parsing of parent selector as property in Sass and SCSS.
:green_apple: Fixed parsing of parent selector inside interpolations in Sass and SCSS.

29.04.2016, version 3.3.1

:star: Added config for AppVeyor to run automated tests on Windows.
:green_apple: Fix installation for Windows.

28.04.2016, version 3.3.0

:star: Added browser support. build.sh now build a script that can be used in browsers.

28.04.2016, version 3.2.7

:green_apple: Fixed typos and example in documentation.
:green_apple: Fixed parsing of functions inside urls in SCSS.
:green_apple: Fixed parsing of selectors starting with combinators in Sass, SCSS and Less.
:green_apple: Fixed incorrect CRLF line numbers.
:green_apple: Fixed parsing of extends that sometimes were incorrectly parsed as atrules.

07.02.2016, version 3.2.6

:green_apple: Fixed the issue with installation of the package with npm@3.

07.02.2016, version 3.2.5

:green_apple: Fixed parsing of nested multiline selectors group.

07.02.2016, version 3.2.4

:star: Added support for !global in Sass.

07.02.2016, version 3.2.3

:star: Modified npm test to remove .DS_Store files before running tests.
:star: Updated Travis config to use Node@5.0.
:star: Updated Travis config to include compiler info.
:star: Made it possible to build files if module is installed from github.
:green_apple: Fixed parsing of interpolation content in Sass and SCSS.
:green_apple: Fixed parsing of interpolation as part of parent selector extension in Sass and SCSS.
:green_apple: Fixed issue with keyframeSelector in includes in SCSS.

17.01.2016, version 3.2.2

:green_apple: Made ParsingError#message property writeable.

19.10.2015, version 3.2.1

Parsing rules

:green_apple: Fixed the issue when selectors inside extends were not wrapped in selector nodes in Sass and SCSS.
:green_apple: Fixed parsing of multiple selectors in extends in Sass and SCSS.

19.10.2015, version 3.2.0

Node types

:star: Added new node type: parentSelectorExtension.

Parsing rules

:green_apple: Fixed parsing of parent selectors with extensions, like &__element or &--modifier.

19.10.2015, version 3.1.1

Parsing rules

:green_apple: Fixed parsing of selectors starting or ending with a combinator in Less, Sass and SCSS.

18.10.2015, version 3.1.0

CLI

:green_apple: Fixed passing a --context argument.
:green_apple: Fixed printing of a simplified tree.

Node types

:star: Added new node type: keyframesSelector.

Parsing rules

:green_apple: Fixed parsing of keyframes in all syntaxes.

18.10.2015, version 3.0.3

Parsing rules

:green_apple: Fixed parsing of spaces inside interpolations in Sass and SCSS.

18.10.2015, version 3.0.2

Parsing rules

:green_apple: Fixed the issue when operators were parsed as idents inside parentheses in Sass and SCSS.

18.10.2015, version 3.0.1

Parsing rules

:green_apple: Fixed parsing of parent selectors in SCSS and Less.
:green_apple: Fixed parsing of placeholders inside selectors in SCSS.

18.10.2015, version 3.0.0

CLI

:japanese_ogre: Made cli process stdin only if - argument is passed.
:star: Added help message.

API

:japanese_ogre: Renamed parseTree.remove to parseTree.removeChild().
:japanese_ogre: Unwraped callback parameters for traverse... methods.
:japanese_ogre: Made first(), last() and get() methods return null if no child nodes were found.
:japanese_ogre: Made node.length return a number of child nodes.
:japanese_ogre: Renamed rule to context.
:star: Made parseTree.removeChild() return a removed node.
:star: Added traverseBy... methods to all nodes, not only root ones.
:star: Added support for specifying a tab size in spaces.

Parsing rules

:green_apple: Fixed parsing of single-line comments after url token.
:green_apple: Fixed parsing of interpolations inside id selectors in Less.
:green_apple: Fixed parsing of selectors according to spec.
:green_apple: Fixed parsing of placeholders as selectors in SCSS.

Misc

:star: Added Travis badge to Readme page.
:star: Added init script to build sources.
:star: Added commit message template.

05.10.2015, version 3.0.0-beta

CLI

:star: Added --simple flag for printing a simplified tree structure.
:green_apple: CLI now prints parse tree to stdout.

API

:japanese_ogre: Parse tree is now represented as objects, not arrays.
:japanese_ogre: Renamed gonzales.srcToAST() to gonzales.parse(). See Readme.
:japanese_ogre: Renamed gonzales.astToSrc() to parseTree.toString(). See Readme.
:japanese_ogre: Renamed gonzales.astToString() to parseTree.toJson(). See Readme.
:star: Added information about column number to nodes.
:star: Added information about end position to nodes.
:green_apple: Made empty strings to be parsed as empty nodes.

Node types

:japanese_ogre: In Sass renamed interpolatedVariable to interpolation.
:japanese_ogre: Separated include and extend nodes.
:japanese_ogre: Replaced filter with declaration.
:japanese_ogre: Replaced braces with brackets and parentheses.
:japanese_ogre: Replaced atrulers with block.
:japanese_ogre: Renamed nthSelector to pseudoClass.
:japanese_ogre: Renamed atrules, atruler and atruleb to atrule.
:japanese_ogre: Renamed functionBody to arguments.
:japanese_ogre: Renamed functionExpression to expression.
:japanese_ogre: Renamed attrib to attributeSelector.
:japanese_ogre: Renamed attrselector to attributeMatch.
:japanese_ogre: Renamed commentSL to singlelineComment.
:japanese_ogre: Renamed commentML to multilineComment.
:japanese_ogre: Renamed declDelim to declarationDelimiter.
:japanese_ogre: Renamed delim to delimiter.
:japanese_ogre: Renamed propertyDelim to propertyDelimiter.
:japanese_ogre: Renamed pseudoc to pseudoClass.
:japanese_ogre: Renamed pseudoe to pseudoElement.
:japanese_ogre: Renamed s to space.
:japanese_ogre: Renamed shash to color.
:japanese_ogre: Renamed vhash to id.
:japanese_ogre: Removed atrulerq, unary and unknown.
:star: Added attributeFlags.
:star: Added attributeName.
:star: Added attributeValue.
:star: Added conditionalStatement.
:star: Added namePrefix.
:star: Added namespacePrefix.
:star: Added namespaceSeparator.
:star: Added typeSelector.

Parsing rules

:japanese_ogre: Spaces that separate two nodes are now put between those nodes in parse tree.
:star: Added support for extend nodes in Less.
:star: Added support for equality and inequality signs in Sass and SCSS.
:star: Added support for /deep/ combinator.
:star: Added support for !optional and !global in Sass and SCSS.
:green_apple: Fixed parsing of interpolations in Sass and SCSS.
:green_apple: Fixed parsing of arguments in Sass, SCSS and Less.
:green_apple: Fixed parsing of declaration delimiters in Sass.
:green_apple: Fixed the issue when pseudo-classes were parsed like declarations.
:green_apple: Fixed parsing of selectors on multiple lines in Sass.
:green_apple: Fixed parsing of percent sign as operator in SCSS.
:green_apple: Fixed parsing of pseudo-elements as selectors in Sass.

Misc

:star: Added Babel to build source files.
:star: Used mocha for tests.
:star: Added helper scripts.
:star: Added Travis config.
:rocket: Improved tests structure.
:rocket: Separated log and test scripts.
:rocket: Improved error messages.
:rocket: Removed benchmark tests.
:rocket: Moved source files from lib to src directory.
:rocket: Made package availbale for install from GitHub.

29.12.2013, version 2.0.2

  • Sass includes can have both arguments list and content block, i.e. @include nani() { color: tomato } is valid syntax.

18.11.2013, version 2.0.1

  • Bring back lost whitespaces and comments

11.11.2013, version 2.0.0

  • Support preprocessors: Sass (both SCSS and indented syntax), LESS.
  • New node types:
    • arguments (less and sass only)
    • commentML
    • commentSL (less and sass only)
    • condition (sass only)
    • default (sass only)
    • escapedString (less only)
    • include (less and sass only)
    • loop (sass only)
    • mixin (less and sass only)
    • parentselector (less and sass only)
    • placeholder (sass only)
    • propertyDelim
    • variable (less and sass only)
    • varialeList (less and sass only)
  • Rename methods:
    • srcToCSSP -> cssToAST
    • csspToSrc -> astToCSS
    • csspToTree -> astToTree
  • Pass all arguments as one object:
    • gonzales.cssToAST({css: a, syntax: b, rule: c, needInfo: d})
    • gonzales.astToCSS({ast: ast, syntax: syntax})
  • Remove built files from VCS
  • Move test command from make to npm
  • Build files before running tests
  • Divide tests into groups according to syntax
  • Add script to test one specific css string
  • Add token's index number to info object

11.02.2013, version 1.0.7

25.11.2012, version 1.0.6

28.10.2012, version 1.0.5

11.10.2012, version 1.0.4

10.10.2012, version 1.0.3

08.10.2012, version 1.0.2

08.10.2012, version 1.0.1

03.10.2012, version 1.0.0

  • First revision.