Walk and transform a Pug AST
npm install pug-walk
var walk = ;
walk(ast, before, after, options)
Traverse and optionally transform a Pug AST.
ast is not cloned, so any changes done to it will be done directly on the AST provided.
after are functions with the signature
before is called when a node is first seen, while
after is called after the children of the node (if any) have already been traversed.
replace parameter is a function that can be used to replace the node in the AST. It takes either an object or an array as its only parameter. If an object is specified, the current node is replaced by the parameter in the AST. If an array is specified and the ancestor of the current node allows such an operation, the node is replaced by all of the nodes in the specified array. This way, you can remove and add new nodes adjacent to the current node. Whether the parent node allows array operation is indicated by the property
replace.arrayAllowed, which is set to true when the parent is a Block and when the parent is a Include and the node is an IncludeFilter.
false, the children of this node will not be traversed and left unchanged (unless
replace has been called). Otherwise, the returned value of
before is ignored. The returned value of
after is always ignored. If
replace() is called in
before() with an array, and
before() does not return
false, the nodes in the array are still descended.
options can contain the following properties:
includeDependencies(boolean): Walk the AST of a loaded dependent file (i.e., includes and extends). Defaults to
parents(array): Nodes that are ancestors to the current
ast. This option is used mainly internally, and users usually do not have to specify it. Defaults to
var lex = ;var parse = ;// Changing content of all Text nodes// ==================================var source = '.my-class foo';var dest = '.my-class bar';var ast = ;ast =;assert;// Convert all simple <strong> elements to text// ============================================var source = 'p abc #[strong NO]\nstrong on its own line';var dest = 'p abc #[| NO]\n| on its own line';var ast = ;ast =;assert;// Flatten blocks// ==============var ast =type: 'Block'nodes:type: 'Text' val: 'a'type: 'Block'nodes:type: 'Text' val: 'b'type: 'Block'nodes: type: 'Text' val: 'c'type: 'Text' val: 'd'type: 'Text' val: 'e';var dest =type: 'Block'nodes:type: 'Text' val: 'a'type: 'Text' val: 'b'type: 'Text' val: 'c'type: 'Text' val: 'd'type: 'Text' val: 'e';// We need to use `after` handler instead of `before`// handler because we want to flatten the innermost// blocks first before proceeding onto outer blocks.ast =;assert;