Panpipe.AST.Node behaviour (Panpipe v0.3.0) View Source

Behaviour implemented by all nodes of the Panpipe AST.

The Panpipe AST is a Elixir representation of the Pandoc data structure for a format-neutral representation of documents. Each of the nodes of this AST data structure is a struct implementing the Panpipe.AST.Node behaviour and directly matches the respective Pandoc element.

Each node type implements Elixir's Enumerable protocol as a pre-order tree traversal.

Link to this section Summary

Functions

Returns if the given AST node is a block element.

Returns the type of child expected for the given AST node.

Returns if the given AST node is an inline element.

Produces the Pandoc AST data structure of the given Panpipe AST node.

Transforms the AST under the given Panpipe AST node by applying the given transformation function recursively.

Callbacks

Returns if the AST node module represents a block element.

Returns the type of child expected for a AST node.

Returns a list of the children of a node.

Returns if the AST node module represents an inline element.

Produces the Pandoc AST data structure of a Panpipe AST node.

Transforms an Panpipe AST node recursively.

Link to this section Types

Link to this section Functions

Returns if the given AST node is a block element.

Returns the type of child expected for the given AST node.

This function returns either :block or :inline.

Returns if the given AST node is an inline element.

Produces the Pandoc AST data structure of the given Panpipe AST node.

Examples

iex> %Panpipe.AST.Header{level: 1, children: [%Panpipe.AST.Str{string: "Example"}]}
...> |> Panpipe.AST.Node.to_pandoc()
%{
  "c" => [1, ["", [], []], [%{"c" => "Example", "t" => "Str"}]],
  "t" => "Header"
}

Transforms the AST under the given Panpipe AST node by applying the given transformation function recursively.

The given function will be passed all nodes in pre-order and will replace those nodes for which the transformation function fun returns a non-nil replacement value. A node can also be replaced with a sequence of new nodes by returning a list of nodes in the transformation function. If you want to remove a node, you can return an empty list or a Panpipe.AST.Null node.

The transformation will be applied recursively also on children of the replaced values. You can prohibit that by returning the replacement in a halt tuple like this: {:halt, replacement}.

Examples

Panpipe.ast!(input: "file.md")
|> Panpipe.transform(fn
   %Panpipe.AST.Header{} = header ->
     %Panpipe.AST.Header{header | level: header.level + 1}
   _ -> nil
 end)

Panpipe.ast!(input: "file.md")
|> Panpipe.transform(fn
   %Panpipe.AST.Header{} = header ->
     {:halt, %Panpipe.AST.Header{header | level: header.level + 1}}
   _ -> nil
 end)

Link to this section Callbacks

Specs

block?() :: bool()

Returns if the AST node module represents a block element.

Specs

child_type() :: atom()

Returns the type of child expected for a AST node.

This function returns either :block or :inline.

Specs

children(t()) :: [t()]

Returns a list of the children of a node.

Specs

inline?() :: bool()

Returns if the AST node module represents an inline element.

Specs

to_pandoc(t()) :: map()

Produces the Pandoc AST data structure of a Panpipe AST node.

Specs

transform(t(), (... -> any())) :: t()

Transforms an Panpipe AST node recursively.

see Panpipe.AST.Node.transform/2