From 448fb359e390c92eea8fe118f80a4c72c87451b1 Mon Sep 17 00:00:00 2001
From: Jesse Rosenthal <jrosenthal@jhu.edu>
Date: Mon, 10 Dec 2018 17:25:25 -0500
Subject: Docx: handle level overrides.

There can be overrides for the definitions of certain levels in
numbering definitions. This implements that behavior.

Closes: #5134
---
 src/Text/Pandoc/Readers/Docx/Parse.hs | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

(limited to 'src/Text/Pandoc/Readers/Docx')

diff --git a/src/Text/Pandoc/Readers/Docx/Parse.hs b/src/Text/Pandoc/Readers/Docx/Parse.hs
index f122224b2..127d93615 100644
--- a/src/Text/Pandoc/Readers/Docx/Parse.hs
+++ b/src/Text/Pandoc/Readers/Docx/Parse.hs
@@ -192,14 +192,14 @@ data Numbering = Numbering NameSpaces [Numb] [AbstractNumb]
 data Numb = Numb String String [LevelOverride]
             deriving Show
 
--- ilvl, startOverride, lvl
-data LevelOverride = LevelOverride String (Maybe String) (Maybe Level)
+--                                 ilvl    startOverride   lvl
+data LevelOverride = LevelOverride String (Maybe Integer) (Maybe Level)
   deriving Show
 
 data AbstractNumb = AbstractNumb String [Level]
                     deriving Show
 
--- (ilvl, format, string, start)
+--                 ilvl   format string  start
 data Level = Level String String String (Maybe Integer)
   deriving Show
 
@@ -509,9 +509,19 @@ filePathIsMedia fp =
 
 lookupLevel :: String -> String -> Numbering -> Maybe Level
 lookupLevel numId ilvl (Numbering _ numbs absNumbs) = do
-  absNumId <- lookup numId $ map (\(Numb nid absnumid _) -> (nid, absnumid)) numbs
-  lvls <- lookup absNumId $ map (\(AbstractNumb aid ls) -> (aid, ls)) absNumbs
-  lookup ilvl $ map (\l@(Level i _ _ _) -> (i, l)) lvls
+  (absNumId, ovrrides) <- lookup numId $
+                          map (\(Numb nid absnumid ovrRides) -> (nid, (absnumid, ovrRides))) numbs
+  lvls <- lookup absNumId $
+    map (\(AbstractNumb aid ls) -> (aid, ls)) absNumbs
+  -- this can be a maybe, so we do a let
+  let lvlOverride = lookup ilvl $
+                    map (\lo@(LevelOverride ilvl' _ _) -> (ilvl', lo)) ovrrides
+  case lvlOverride of
+    Just (LevelOverride _ _ (Just lvl')) -> Just lvl'
+    Just (LevelOverride _ (Just strt) _) ->
+      lookup ilvl $ map (\(Level i fmt s _) -> (i, (Level i fmt s (Just strt)))) lvls
+    _ ->
+      lookup ilvl $ map (\l@(Level i _ _ _) -> (i, l)) lvls
 
 loElemToLevelOverride :: NameSpaces -> Element -> Maybe LevelOverride
 loElemToLevelOverride ns element
@@ -519,6 +529,7 @@ loElemToLevelOverride ns element
       ilvl <- findAttrByName ns "w" "ilvl" element
       let startOverride = findChildByName ns "w" "startOverride" element
                           >>= findAttrByName ns "w" "val"
+                          >>= (\s -> listToMaybe (map fst (reads s :: [(Integer, String)])))
           lvl = findChildByName ns "w" "lvl" element
                 >>= levelElemToLevel ns
       return $ LevelOverride ilvl startOverride lvl
-- 
cgit v1.2.3