--- spelling-recurse.lua
--- Copyright 2012, 2013 Stephan Hennig
--
-- This work may be distributed and/or modified under the conditions of
-- the LaTeX Project Public License, either version 1.3 of this license
-- or (at your option) any later version. The latest version of this
-- license is in http://www.latex-project.org/lppl.txt
-- and version 1.3 or later is part of all distributions of LaTeX
-- version 2005/12/01 or later.
--
-- See file README for more information.
--
--- Helper module for recursing into a node list.
-- This module provides means to recurse into a node list, calling
-- user-provided call-back functions upon certain events.
--
-- @author Stephan Hennig
-- @copyright 2012, 2013 Stephan Hennig
-- @release version 0.41
--
-- @trick Prevent LuaDoc from looking past here for module description.
--[[ Trick LuaDoc into entering 'module' mode without using that command.
module(...)
--]]
-- Module table.
local M = {}
-- Function short-cuts.
local traverse = node.traverse
-- Short-cuts for constants.
local HLIST = node.id('hlist')
local VLIST = node.id('vlist')
--- Scan a node list and call call-back functions upon certain events.
-- This function scans a node list. Upon certain events, user-defined
-- call-back functions are called. Call-back functions have to be
-- provided in a table. Call-back functions and corresponding events
-- are:
--
--
--
-- - `vlist_pre_recurse`
- A vlist is about to be recursed
-- into. Argument is the vlist node.
--
-- - `vlist_post_recurse`
- Recursing into a vlist has been
-- finished. Argument is the vlist node.
--
-- - `hlist_pre_recurse`
- An hlist is about to be recursed
-- into. Argument is the hlist node.
--
-- - `hlist_post_recurse`
- Recursing into a hlist has been
-- finished. Argument is the hlist node.
--
-- - `visit`
- A node of type other that `vlist` and `hlist`
-- has been found. Arguments are the head node of the current node
-- (head node of the current branch) and the current node.
--
--
--
-- If a call-back entry in the table is `nil`, the corresponding event
-- is ignored.
--
-- @param head Node list.
-- @param cb Table of call-back functions.
local function recurse_node_list(head, cb)
-- Make call-back functions local identifiers.
local cb_vlist_pre_recurse = cb.vlist_pre_recurse
local cb_vlist_post_recurse = cb.vlist_post_recurse
local cb_hlist_pre_recurse = cb.hlist_pre_recurse
local cb_hlist_post_recurse = cb.hlist_post_recurse
local cb_visit_node = cb.visit_node
-- Iterate over nodes in current branch.
for n in traverse(head) do
local nid = n.id
-- Test for vlist node.
if nid == VLIST then
-- Announce vlist pre-traversal.
if cb_vlist_pre_recurse then cb_vlist_pre_recurse(n) end
-- Recurse into 'vlist'.
recurse_node_list(n.head, cb)
-- Announce vlist post-traversal.
if cb_vlist_post_recurse then cb_vlist_post_recurse(n) end
-- Test for hlist node.
elseif nid == HLIST then
-- Announce hlist pre-traversal.
if cb_hlist_pre_recurse then cb_hlist_pre_recurse(n) end
-- Recurse into 'hlist'.
recurse_node_list(n.head, cb)
-- Announce hlist post-traversal.
if cb_hlist_post_recurse then cb_hlist_post_recurse(n) end
-- Other nodes.
else
-- Visit node.
if cb_visit_node then cb_visit_node(head, n) end
end
end
end
M.recurse_node_list = recurse_node_list
-- Return module table.
return M