Skip to content

Commit

Permalink
Docx: handle level overrides.
Browse files Browse the repository at this point in the history
There can be overrides for the definitions of certain levels in
numbering definitions. This implements that behavior.

Closes: #5134
  • Loading branch information
jkr committed Dec 11, 2018
1 parent 2cb9a78 commit 448fb35
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/Text/Pandoc/Readers/Docx/Parse.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -509,16 +509,27 @@ 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
| isElem ns "w" "lvlOverride" element = do
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
Expand Down

0 comments on commit 448fb35

Please sign in to comment.