local base = require("packages.base")

local package = pl.class(base)
package._name = "inputfilter"

function package:transformContent (content, transformFunction, extraArgs)
   local newContent = {}
   for k, v in SU.sortedpairs(content) do
      if type(k) == "number" then
         if type(v) == "string" then
            local transformed = transformFunction(v, content, extraArgs)
            if type(transformed) == "table" then
               for i = 1, #transformed do
                  newContent[#newContent + 1] = transformed[i]
               end
            else
               newContent[#newContent + 1] = transformed
            end
         else
            newContent[#newContent + 1] = self:transformContent(v, transformFunction, extraArgs)
         end
      else
         newContent[k] = v
      end
   end
   return newContent
end

function package:createCommand (pos, col, lno, command, options, content)
   local position = { lno = lno, col = col, pos = pos }
   return SU.ast.createCommand(command, options, content, position)
end

function package:_init ()
   base._init(self)
   self:deprecatedExport("createCommand", self.createCommand)
   self:deprecatedExport("transformContent", self.transformContent)
end

package.documentation = [[
\begin{document}
The \autodoc:package{inputfilter} package provides ways for class authors to transform the input of a SILE document after it is parsed but before it is processed.
It does this by allowing you to rewrite the abstract syntax tree representing the document.

Loading \autodoc:package{inputfilter} into your class with \code{class:loadPackage("inputfilter")} provides you with two new Lua functions: \code{transformContent} and \code{createCommand}.
\code{transformContent} takes a content tree and applies a transformation function to the text within it.
See \href{https://sile-typesetter.org/examples/inputfilter.sil} for a simple example, and \href{https://sile-typesetter.org/examples/chordmode.sil} for a more complete one.
\end{document}
]]

return package
