@@ -33,7 +33,7 @@ import Control.Applicative ((<|>))
3333import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
3434import Text.Pandoc.Definition (Pandoc, Meta, Block, Inline)
3535import Text.Pandoc.Lua.StackInstances ()
36−import Text.Pandoc.Lua.Util (addFunction)
36+import Text.Pandoc.Lua.Util (OrNil (OrNil), addFunction)
3737
3838import qualified Data.Digest.Pure.SHA as SHA
3939import qualified Data.ByteString.Lazy as BSL
@@ -44,9 +44,10 @@ import qualified Text.Pandoc.Shared as Shared
4444pushModule :: Lua NumResults
4545pushModule = do
4646 Lua.newtable
47− addFunction "to_roman_numeral" toRomanNumeral
47+ addFunction "normalize_date" normalizeDate
4848 addFunction "sha1" sha1
4949 addFunction "stringify" stringify
50+ addFunction "to_roman_numeral" toRomanNumeral
5051 return 1
5152
5253-- | Calculate the hash of the given contents.
@@ -85,3 +86,10 @@ instance FromLuaStack AstElement where
8586-- | Convert a number < 4000 to uppercase roman numeral.
8687toRomanNumeral :: LuaInteger -> Lua String
8788toRomanNumeral = return . Shared.toRomanNumeral . fromIntegral
89+
90+-- | Parse a date and convert (if possible) to "YYYY-MM-DD" format. We
91+-- limit years to the range 1601-9999 (ISO 8601 accepts greater than
92+-- or equal to 1583, but MS Word only accepts dates starting 1601).
93+-- Returns nil instead of a string if the conversion failed.
94+normalizeDate :: String -> Lua (OrNil String)
95+normalizeDate = return . OrNil . Shared.normalizeDate