# Changelog

`pandoc-lua-marshal` uses [PVP Versioning][].

## 0.3.0

Released 2024-12-07.

  * Add method `normalize` to Pandoc objects.
    This returns a normalized document by merging adjacent spaces in inlines
    and by modifying tables.

  * Push Captions as userdata, move code to separate module.

  * Add tests for RawInline and its properties

  * Allow treatment of custom elements as singleton lists.

  * Remove `pandoc` prefix on table components (jgm/pandoc#8574).

## 0.2.9

Released 2024-10-01.

-   Update list module, thereby introducing a new method `iter`;
    the function returns an iterator that steps through list
    values on each call.

-   Added support for `__toinline` and `__toblock` metamethods. If
    the metamethods are available on a Lua object and return an
    appropriate value, then that returned value will be used
    during unmarshalling.

## 0.2.8

Released 2024-09-21.

-   Update list module, thereby introducing a new method `at` and
    an extended constructor for List types.

## 0.2.7.1

Released 2024-07-02.

-   Relaxed the upper bound of tasty-quickcheck, used in tests.
    Now allows version 0.11.

-   Update documentation on constructors; the descriptions now
    match those in the pandoc docs.

## 0.2.7

Released 2024-05-06.

-   Let the behavior of `content` attributes on BulletList and
    OrderedList elements match that of the constructor by treating
    a list of Block elements as a list of single-block items. The
    following assertion now holds true:

    ``` lua
    local content = {pandoc.Plain "one", pandoc.Plain "two"}
    local bl = pandoc.BulletList{}
    bl.content = content
    assert(bl == pandoc.BulletList(content))
    ```

## 0.2.6

Released 2024-03-29.

-   Fixed a bug that caused problems with empty Block lists in
    the `content` attributes of *Div*, *Figure*, and *BlockQuote*
    elements.

## 0.2.5

Released 2024-03-04.

-   The `clone` method on *Blocks* and *Inlines* elements now
    creates deep copies of the lists.

## 0.2.4

Released 2024-01-19.

-   Relaxed upper bound for aeson, allowing aeson-2.2.\*.

## 0.2.3

Released 2024-01-19.

-   Relaxed upper bound for text, containers, and bytestring,
    allowing text-2.1, containers-0.7, and bytestring-0.12.

## 0.2.2

Released 2023-03-15.

-   Add `__tostring` metamethods to *Blocks* and *Inlines*.

## 0.2.1.1

Released 2023-03-13.

-   The version constraints for hslua packages have been relaxed;
    other changes in hslua 2.3.\* do not affect this package.

## 0.2.1

Released 2023-02-11.

-   All userdata types have been given a `__tojson` metamethod.
    The methods return the default JSON representations of AST
    objects.

## 0.2.0

Released 2023-01-18.

-   Depend on pandoc-types 1.23: the `Null` Block constructor has
    been removed, and a `Figure` constructor has been added.

-   Support for Lua 5.3 has been dropped; the package now requires
    hslua 2.2 or later.

-   The implementation for `List` has been moved to the separate
    `hslua-list` module. This module no longer contains C code.

## 0.1.7

Released 2022-07-16.

-   Allow Blocks to be passed as Caption value. The resulting
    caption has the Blocks as its long version and no short
    version.

-   Add `clone` method to Pandoc elements.

## 0.1.6.1

Released 2022-06-10.

-   Provide better error messages when fuzzy retrieval of Inlines
    or Blocks fails.

-   Relax upper bound for text, allow text-2.0.

## 0.1.6

Released 2022-06-03.

-   Fix `applyFully`: the function always traversed the document
    type-wise, never topdown.

-   Avoid shadowing of a function name that was added in
    hslua-2.2.

-   Support concatenating of Pandoc values with the `..` operator.

## 0.1.5.1

Released 2022-02-19.

-   Relax upper bound for lua and hslua.

## 0.1.5

Released 2022-02-17.

-   Allow any type of callable object as argument to List
    functions `filter`, `map`, and `find_if`. These previously
    required the argument to be of type `function`, which was too
    restrictive.

-   Inline: the type of Image captions is now `Inlines` instead
    of `List`.

## 0.1.4

Released 2022-01-29.

-   Export AttributeList type and marshaling functions from
    `Text.Pandoc.Marshal.Attr`, namely `typeAttributeList`,
    `peekAttributeList`, and `pushAttributeList`.

-   Update to hslua 2.1, making use of the new utility functions.

## 0.1.3.1

Released 2022-01-14.

-   Fixed a bug in `List.include` that was causing the Lua stack
    to overflow when the function was applied to long lists.

## 0.1.3

Released 2021-12-23.

### Lua changes

-   The traversal order of filters can now be selected by setting
    the key `traverse` to either `'topdown'` or `'typewise'`; the
    default remains `'typewise'`.

    Topdown traversals can be cut short by returning `false` as a
    second value from the filter function. No child-element of
    the returned element is processed in that case.

-   All types can be compared. Previously, comparing values of
    different types would lead to errors in a number of cases.

-   Lists now have an `__eq` metamethod. List equality is checked
    by comparing both lists element-wise. Two lists are equal if
    they have the same type and have equal elements.

-   If start indices in `List:find` and `List:find_if` are
    negative the start index is relative to the list length.

-   TableFoot, TableHead, and Row values are marshaled as
    userdata objects.

### Haskell code

-   Text.Pandoc.Lua.Marshal.Filter exports the new type
    `WalkingOrder`. The type `Filter` now contains the the
    traversal specifier as a field.

-   New modules for TableFoot, TableHead, and Row, defining the
    usual marshaling methods and constructor functions for these
    types.

## 0.1.2

Released 2021-12-10.

-   Restored backward compatible retrieval of Rows. Cells can be
    either a userdata value or a table.

## 0.1.1

Released 2021-12-10.

### Behavior of Lua objects

-   Lists of Inline values and lists of Block values are now
    pushed with their own metatables (named "Inlines" and
    "Blocks").

-   The types `Block`, `Blocks`, `Inline`, `Inlines`, and
    `Pandoc` now all have a method `walk` that applies a filter
    to the document subtree.

-   Changed behavior for *Cell* values: these are now pushed as
    userdata; the old table-based structure is still accepted
    when retrieving a Cell from the stack.

### Haskell code

-   Module Text.Pandoc.Lua.Marshal.Cell exports the constructor
    function `mkCell`, the type definition `typeCell` and the
    fuzzy peeker `peekCellFuzzy`.

-   Added a new module `Text.Pandoc.Lua.Marshal.Filter` that
    handles Lua filters.

-   Added functions for filtering:

    -   Module Text.Pandoc.Lua.Marshal.Block:
        -   `walkBlockSplicing`: walk an AST element, applying a
            filter on each Block and splicing the result back
            into the list.
        -   `walkBlocks`: walk an AST element, modifying lists of
            Block elements by applying the `Blocks` filter
            function.
    -   Module Text.Pandoc.Lua.Marshal.Inline:
        -   `walkInlineSplicing`: walk an AST element, applying a
            filter on each Inline and splicing the result back
            into the list.
        -   `walkInlines`: walk an AST element, modifying lists
            of Inline elements by applying the `Inlines` filter
            function.

    -   Module Text.Pandoc.Lua.Marshal.Pandoc:
        -   `applyFully`: fully apply a filter on a Pandoc
            document.

-   New internal modules:

    -   Text.Pandoc.Lua.SpliceList: defines a helper type used to
        walk a list of elements in a way that replaces the
        element by splicing the function result back into the
        list.

        The module is a slight rewrite of pandoc’s
        `SingletonsList`.

    -   Text.Pandoc.Lua.Walk: handles walking of the document
        tree while modifying elements via filter functions. This
        is a re-implementation of large parts of pandoc’s
        T.P.Lua.Filter module.

    -   Text.Pandoc.Lua.Marshal.Shared: provides helper functions
        used in multiple Lua type definitions.

## 0.1.0.1

Released 2021-11-28.

-   Added test-simpletable.lua to the list of extra-source-files.

## 0.1.0

Released 2021-11-28.

-   Released into the wild. May it live long and prosper.

  [PVP Versioning]: https://pvp.haskell.org
