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: jgm#5134
  • Loading branch information
jkr committed Dec 10, 2018
1 parent 13be2a8 commit fb2cd9d
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions src/Text/Pandoc/Readers/Docx/Parse.hs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ data Numb = Numb String String [LevelOverride]
deriving Show

-- ilvl, startOverride, lvl
data LevelOverride = LevelOverride String (Maybe String) (Maybe Level)
data LevelOverride = LevelOverride String (Maybe Integer) (Maybe Level)
deriving Show

data AbstractNumb = AbstractNumb String [Level]
Expand Down Expand Up @@ -509,16 +509,28 @@ 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) _) ->
-- (ilvl, format, string, start)
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 fb2cd9d

Please sign in to comment.