2.0.0 • Published 4 years ago

sahtml-query v2.0.0

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

sahtml-query

Fast and low memory query API for HTML (node.js).

Does not build DOM (Document Object Model).

Installation

yarn add sahtml-query

Usage

var parse = require('sahtml-query').parse;

var resultHref = null;
var resultText = '';
parse(
    '<!doctype><html lang="en"><body><a id="hello" href="http://example.com">Hello <span>World</span></a></body></html>',
    (document) => {
        document.onElement('#hello', (link) => {
            resultHref = link.element.attrs.href;
            link.onElement('span', (span) => {
                span.onText(({text}) => resultText += text);
            });
        });
    }
);

console.log(resultHref); // http://example.com
console.log(resultText); // World

API

/**
 * Parses the specified HTML fragment and creates context in order to query
 * the contents of the HTML fragment.
 */
export function parse(html: string, parseCallback: ParseCallback);

export type ParseCallback = (context: DocumentContext) => void;

/**
 * Context which is passed to the callbacks of both `parse`
 * and `onElement` methods.
 */
export interface DocumentContext {
    /**
     * Matches subelement of the specified context.
     */
    onElement(cssSelector: string, callback: OnElementCallback);

    /**
     * Matches every text fragment of the specified context.
     */
    onText(callback: OnTextCallback);

    /**
     * This callback will be executed after leaving the context.
     */
    after(callback: () => void);
}

export interface ElementContext extends DocumentContext {
    /**
     * HTML element information.
     */
    element: SAElement;

    /**
     * Checks if the current element matches the specified selector.
     */
    matches(selector: string): boolean;
}

export interface TextContext extends DocumentContext {
    /**
     * HTML text.
     */
    text: string;

    /**
     * Checks if the current element matches the specified selector.
     */
    matches(selector: string): boolean;
}

export type OnElementCallback = (context: ElementContext) => void;
export type OnTextCallback = (context: TextContext) => void;

/**
 * HTML element.
 */
export interface SAElement {
    /** HTML element tag name, always lower case */
    tagName: string;
    /** HTML element attributes */
    attrs: {[key: string]: string};
    /** Is true when HTML element auto closes, i.e. <img /> */
    autoEnd: boolean;
}