module Parsing.ParseFootnotes where

import Data.Maybe
import Text.Parsec
import qualified Data.Map.Strict as M

import AST
import Parsing.State
import Parsing.TextUtils
import Parsing.ParseBlock

footnoteDef :: Parser FootnoteDef
footnoteDef = do
    many $ char '\n'
    identifier <- betweenWithErrors' "~[" "]" "footnote definition" $ many1 $ escapableNoneOf "[]"
    state <- getState
    let maybeIndex = M.lookup identifier $ footnoteIndices state
    index <- if isNothing maybeIndex
        then fail $ "unreferenced footnote identifier: " ++ identifier
        else return $ fromJust maybeIndex
    many1 $ oneOf " \t"
    modifyState (\s -> s {prevCharIsNewline=False})
    content <- many1 $ try block
    return $ FootnoteDef index content

footnoteDefs :: Parser FootnoteDefs
footnoteDefs = fmap FootnoteDefs $ many1 footnoteDef