@textlint/ast-traverse
TypeScript icon, indicating that this package has built-in type declarations

15.2.1 • Public • Published

@textlint/ast-traverse

@textlint/ast-traverse provide traversal functions for TxtAST.

This traverse function is a fork of estraverse for @textlint/markdown-to-ast.

This library is a part of textlint/textlint.

Installation

npm install @textlint/ast-traverse

Usage

var parse = require("@textlint/markdown-to-ast").parse,
    Syntax = require("@textlint/markdown-to-ast").Syntax;
var traverse = require("@textlint/ast-traverse").traverse,
    VisitorOption = require("@textlint/ast-traverse").VisitorOption;
var AST = parse("# Header\nHello*world*");
traverse(AST, {
    enter(node) {
        console.log("enter", node.type);
        if (node.type === Syntax.Strong) {
            return VisitorOption.Skip;
        }
    },
    leave(node) {
        console.log("leave", node.type);
    }
});

Traversal rule is the same with Estraverse.

Example

Markdown:

Hello *world*

AST:

{
    "start_line": 1,
    "start_column": 1,
    "end_line": 0,
    "children": [
        {
            "start_line": 1,
            "start_column": 1,
            "end_line": 0,
            "inline_content": [
                {
                    "c": "Hello",
                    "raw": "Hello",
                    "loc": {
                        "start": {
                            "line": 1,
                            "column": 0
                        },
                        "end": {
                            "line": 1,
                            "column": 5
                        }
                    },
                    "range": [
                        0,
                        5
                    ],
                    "type": "Str"
                },
                {
                    "c": " ",
                    "raw": " ",
                    "loc": {
                        "start": {
                            "line": 1,
                            "column": 5
                        },
                        "end": {
                            "line": 1,
                            "column": 6
                        }
                    },
                    "range": [
                        5,
                        6
                    ],
                    "type": "Str"
                },
                {
                    "c": [
                        {
                            "c": "world",
                            "raw": "world",
                            "loc": {
                                "start": {
                                    "line": 1,
                                    "column": 0
                                },
                                "end": {
                                    "line": 1,
                                    "column": 5
                                }
                            },
                            "range": [
                                0,
                                5
                            ],
                            "type": "Str"
                        }
                    ],
                    "raw": "*world*",
                    "loc": {
                        "start": {
                            "line": 1,
                            "column": 6
                        },
                        "end": {
                            "line": 1,
                            "column": 13
                        }
                    },
                    "range": [
                        6,
                        13
                    ],
                    "type": "Emphasis"
                }
            ],
            "children": [],
            "raw": "Hello *world*",
            "loc": {
                "start": {
                    "line": 1,
                    "column": 0
                },
                "end": {
                    "line": 1,
                    "column": 13
                }
            },
            "range": [
                0,
                13
            ],
            "type": "Paragraph"
        }
    ],
    "raw": "Hello *world*",
    "loc": {
        "start": {
            "line": 1,
            "column": 0
        },
        "end": {
            "line": 1,
            "column": 13
        }
    },
    "range": [
        0,
        13
    ],
    "type": "Document"
}

Traversal all from Root(Document node):

[enter, Syntax.Document],
// # Header
[enter, Syntax.Header],
[enter, Syntax.Str],
[leave, Syntax.Str],
[leave, Syntax.Header],
// => Paragraph
[enter, Syntax.Paragraph],
[enter, Syntax.Str],
[leave, Syntax.Str],
// *world*
[enter, Syntax.Emphasis],
[enter, Syntax.Str],
[leave, Syntax.Str],
[leave, Syntax.Emphasis],
// <= Paragraph
[leave, Syntax.Paragraph],
// End
[leave, Syntax.Document]

NOTE

You want to set property on Node.

Bad example:

var TraverseController = require("@textlint/ast-traverse").Controller;
var controller = new TraverseController();
controller.traverse(ast, {
    enter: function (node, parent) {
        node.parent = parent;// it cause a circular reference!
        // do something
        something(node);
    }
});

node.parent = parent; cause a circular reference!

Correct example:

var TraverseController = require("@textlint/ast-traverse").Controller;
var controller = new TraverseController();
controller.traverse(ast, {
    enter: function (node, parent) {
        // set property as non-enumerable value
        Object.defineProperty(node, "parent", {
            value: parent
        });
        // do something
        something(node);
    }
});

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

MIT

and

Includes Estraverse

Copyright (C) 2012-2013 Yusuke Suzuki
https://github.com/estools/estraverse/blob/master/LICENSE.BSD

Versions

Current Tags

VersionDownloads (Last 7 Days)Tag
2.1.0-alpha.0f2fd6f90canary
13.4.2-next.00next
12.0.0-beta.30beta
15.2.115,255latest

Version History

VersionDownloads (Last 7 Days)Published
15.2.115,255
15.2.03,605
15.1.1760
15.1.0831
15.0.1104
15.0.019
14.8.49,740
14.8.30
14.8.159
14.8.0573
14.7.23,811
14.7.1390
14.7.00
14.6.0605
14.5.0355
14.4.28,805
14.4.10
14.4.0775
14.3.0655
14.2.1680
14.2.0891
14.1.00
14.0.5159
14.0.41,105
14.0.3270
14.0.225
14.0.128
14.0.0132
13.4.2-next.00
13.4.127,373
13.4.014
13.3.32,592
13.3.2822
13.3.15
13.3.07
13.2.0131
13.1.40
13.1.30
13.1.20
13.1.141
13.1.049
13.0.56
13.0.40
13.0.30
13.0.24
13.0.10
13.0.05
12.6.16,689
12.6.00
12.5.20
12.5.03
12.3.01
12.2.3161
12.2.2651
12.2.1571
12.2.00
12.1.13,159
12.1.0933
12.0.289
12.0.0469
12.0.0-beta.30
12.0.0-beta.20
12.0.0-beta.10
12.0.0-beta.00
2.3.53,029
2.3.49
2.3.30
2.3.254
2.3.11
2.3.00
2.2.610
2.2.5374
2.2.40
2.2.30
2.2.20
2.2.10
2.2.00
2.1.757
2.1.6685
2.1.526
2.1.40
2.1.3123
2.1.2268
2.1.10
2.1.00
2.0.925
2.1.0-alpha.0f2fd6f90
2.1.0-alpha.bbfc8f6d0
2.0.88
2.0.70
2.0.60
2.0.50
2.0.40
2.0.30

Package Sidebar

Install

npm i @textlint/ast-traverse

Weekly Downloads

98,076

Version

15.2.1

License

MIT

Unpacked Size

26.4 kB

Total Files

8

Last publish

Collaborators

  • azu
  • textlint-user