local utils = require 'pandoc.utils' function string.split(str, sep) sep = sep or '%s' local parts = pandoc.List() for field, s in str:gmatch("([^" .. sep .. "]*)(" .. sep .. "?)") do parts:insert(field) if s == "" then return parts end end end function pandoc.List:flatten() local result = pandoc.List() for i = 1, #self do result:extend(self[i]) end return result end function pandoc.List:flatMap(fn) return self:map(fn):flatten() end function pandoc.List:filterMap(fn) local mapped = self:map(fn) local result = pandoc.List() for i = 1, #mapped do local val = mapped[i] if val then result:insert(val) end end return result end function pandoc.List:take(n) if n >= #self then return self end local result = pandoc.List() for i = 1, n do result:insert(self[i]) end return result end function pandoc.List:skip(n) local result = pandoc.List() if n >= #self then return result end for i = n + 1, #self do result:insert(self[i]) end return result end function pandoc.List:shuffle() for i = #self, 2, -1 do local j = math.random(i) self[i], self[j] = self[j], self[i] end return self end function dump(o) if type(o) == 'table' then local s = '{ ' for k, v in pairs(o) do if type(k) ~= 'number' then k = '"' .. k .. '"' end s = s .. '[' .. k .. '] = ' .. dump(v) .. ',' end return s .. '} ' else return tostring(o) end end function prep_layout(layout) layout = utils.stringify(layout) return { id = layout, ["is_" .. layout] = true } end return { dump = dump, prep_layout = prep_layout }