Zé CSS Selectors - A JQuery "kind of" library for querying and manipulating DOM in node.js


Keywords
css, html, selector, selectors, jquery
License
MPL-2.0-no-copyleft-exception
Install
npm install zcsel@0.1.5

Documentation

zcsel: Zé CSS Selectors - A JQuery "kind of" CSS Selector engine

zcsel is a CSS Selector engine and a DOM manipulation tool belt for Node.JS. It is based on htmlparser and supports the most useful JQuery/CSS3 selectors. This is not committed to any of the CSS[23] and JQuery specifications but.. it pretends to be as near as possible to the available specifications.

The supported selectors are:

  • * - All Selector: Selects all elements;
  • tagName - Tag Selector: Selects all elements with the given tag name;
  • #id - ID Selector: Selects a single element with the given id attribute;
  • .class - Class Selector: Selects all elements with the given class;
  • ancestor descendant - Descendant Selector: Selects all elements that are descendants of a given ancestor;
  • selector1, selector2, selector3 - Multiple Selector: Selects the combined results of all the specified selectors;
  • parent > child - Child Selector: Selects all direct child elements specified by “child” of elements specified by “parent”;
  • prev + next - Next Adjacent Selector: Selects all next elements matching “next” that are immediately preceded by a sibling “prev”;
  • prev ++ next - Next Adjacent Selector Plus (invented by Zé): Selects all the next elements matching “next” that are immediately preceded by a sibling “prev” or by other matching element;
  • prev ~ siblings: Next Siblings Selector - Selects all sibling elements that follow after the “prev” element, have the same parent, and match the filtering “siblings” selector;
  • :first-child: First Child Selector - Selects all elements that are the first child of their parent;
  • :first-of-type: First Child of Type Selector - Selects all elements that are the first among siblings of the same element name;
  • :last-child: Last Child Selector - Selects all elements that are the last child of their parent;
  • :last-of-type: Last Child of Type Selector - Selects all elements that are the last among siblings of the same element name;
  • :nth-child(N): Child N Selector - Selects all elements that are the nth-child N of their parent;
  • :nth-of-type(N): Child N of Type Selector - Selects all elements that are the nth-child N of their parent;
  • :nth-last-child(N): Last Child N Selector - Selects all elements that are the nth-child of their parent, counting from the last element to the first;
  • :nth-last-of-type(N): Last Child N of Type Selector - Selects all elements that are the nth-child of their parent, counting from the last element to the first;
  • :only-child: Only Child Selector - Selects all elements that are the only child of their parent;
  • :only-of-type: Only Child of Type Selector - Selects all elements that have no siblings with the same element name;
  • :eq(N): Index N Selector - Select the element at index n within the matched set;
  • :contains("text") or :contains(/basic-regex/): - Selects the elements containing the specified text or on their inner text or matching the provided regular expression;
  • :first: Last Element Selector - Selects the first matched element;
  • :last: Last Element Selector - Selects the last matched element;
  • [attr]: Attribute Selector - Selects elements that have the specified attribute, regardless of its value;
  • [attr="value"]: Attribute Equals Selector - Selects elements that have the specified attribute with a value exactly equal to a certain value;
  • [attr!="value"]: Attribute Not Equal Selector - Select elements that either don’t have the specified attribute, or do have the specified attribute but not with a certain value;
  • [attr|="value"]: Attribute Contains Prefix Selector - Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-);
  • [attr*="value"]: Attribute Contains Selector - Selects elements that have the specified attribute with a value containing the a given substring;
  • [attr~="value"]: Attribute Contains Word Selector - Selects elements that have the specified attribute with a value containing a given word, delimited by spaces;
  • [attr^="value"]: Attribute Starts With Selector - Selects elements that have the specified attribute with a value beginning exactly with a given string;
  • [attr$="value"]: Attribute Ends With Selector - Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive;
  • :empty: Empty Selector - Select all elements that have no children (including text nodes);
  • :root: Root Selector - Selects the element that is the root of the document;
  • !: Subject determiner - Determines what elements of the selection will be returned.

The next selectors to be implemented are:

  • :odd: Odd Elements Selector - Selects odd elements, zero-indexed. See also even;
  • :even: Even Elements Selector - Selects even elements, zero-indexed. See also odd;
  • :lt: Less Than Selector - Select all elements at an index less than index within the matched set;
  • :gt: Greater Than Selector - Select all elements at an index greater than index within the matched set;
  • :parent: Parent Selector - Select all elements that have at least one child node (either an element or text);
  • :text: Text Selector - Selects all elements of type text;
  • :submit: Submit Input Selector - Selects all elements of type submit;
  • :reset: Reset Input Selector - Selects all elements of type reset;
  • :radio: Radio Input Selector - Selects all elements of type radio;
  • :password: Password Input Selector - Selects all elements of type password;
  • :file: File Input Selector - Selects all elements of type file;
  • :button: Button Input Selector - Selects all elements of type button;
  • :checkbox: Checkbox Input Selector - Selects all elements of type checkbox;
  • :input: Input Selector - Selects all input, textarea, select and button elements;
  • :header: Headings Selector - Selects all elements that are headers, like h1, h2, h3 and so on;
  • :image: Image Selector - Selects all elements of type image;

The supported methods are:

  • tag([tagName]): Return the element's tag name or change it;
  • attr(attrName[,newValue]): Return the attribute attrName value or change it;
  • removeAttr(attrName): Remove the attribute named attrName; If attrName is omited, all the attributes are removed;
  • each(): Iterates on the matched elements;
  • find(): Find descendent nodes;
  • prev(): Return the previous node;
  • next(): Return the next node;
  • parent(): Return the parent node;
  • text([noChilds]): Return the node's text. When noChilds optional argument is true, it's only returned the text of the current node, not child's text;
  • code(): Same as text() but doesn't decode entities;
  • html(): Return the merged HTML of the elements;
  • outerhtml(): Return the merged outer HTML of the elements;
  • val(): The same as attr("value");
  • append(node1,node2,...): Add the specified nodes to the end of the matching elements;
  • remove(): Removes the matching elements from their parent elements;
  • empty(): Removes all the child nodes from the matching elements;
  • replaceWith(node1,node2,...): Replace each one of the matching elements with the specified nodes;
  • hasClass(class): Determine whether any of the matched elements are assigned the given class;

Parsing HTML:

The $ variable [result of zcsel.initDom()] can be also used to parse HTML, converting it on DOM element instances. Example:

var titles = $("<h1>Something</h1><h2>Here</h2>");

And then, can be used with DOM manipulation functions. Example:

$("div.title").replaceWith(titles);

Installing

npm install zcsel

Using it

Make some code like this:

var
    htmlparser = require('htmlparser'),
    zcsel      = require('zcsel'),
    pHandler,
    parser;

pHandler = new htmlparser.DefaultHandler(function(err,dom){
    if ( err ) {
    	console.log("Error parsing HTML: ",err);
    	process.exit(-1);
    }

    // Zé stuff
    var $ = zcsel.initDom(dom);
    console.log($("div").html());
});
parser = new htmlparser.Parser(pHandler);
return parser.parseComplete('<html><head></head><body><div>...</div></body></html>');

Dependences

zcsel depends of htmlparser or htmlparser2 and he.