git.iko.soy/typeable/pandoc
on master help sign in
Improved makeSections so we don't get doubled attributes.

Closes #5986.

commit20cf4e47b069f76839b4223cbfecbf96875aadb4 authorJohn MacFarlane <jgm@berkeley.edu> dateTue 17 Dec 2019, 11:09 (7 years ago) parent11bab77
4 files changed+23−18
src/Text/Pandoc/Shared.hs+17−13 src/Text/Pandoc/Writers/HTML.hs+2−1 test/command/5986.md+1−1 test/command/section-divs.md+3−3
src/Text/Pandoc/Shared.hs+17−13
@@ -582,25 +582,20 @@ makeSections numbering mbBaseLevel bs =
582582 let attr = ("",classes,kvs')
583583 return $
584584 Div divattr (Header level' attr title' : sectionContents') : rest'
585− go (Div (dident,dclasses,dkvs)
586− (Header level (ident,classes,kvs) title':ys) : xs)
585+ go (Div divattr@(dident,dclasses,_) (Header level hattr title':ys) : xs)
587586 | all (\case
588587 Header level' _ _ -> level' > level
589588 _ -> True) ys
590589 , "column" `notElem` dclasses
591590 , "columns" `notElem` dclasses = do
592− inner <- go (Header level (ident,classes,kvs) title':ys)
593− let inner' =
594− case inner of
595− (Div (dident',dclasses',dkvs') zs@(Header{}:zs') : ws)
596− | T.null dident ->
597− Div (dident',dclasses' ++ dclasses,dkvs' ++ dkvs) zs : ws
598− | otherwise -> -- keep id on header so we don't lose anchor
599− Div (dident,dclasses ++ dclasses',dkvs ++ dkvs')
600− (Header level (dident',classes,kvs) title':zs') : ws
601− _ -> inner -- shouldn't happen
591+ inner <- go (Header level hattr title':ys)
602592 rest <- go xs
603− return $ inner' ++ rest
593+ return $
594+ case inner of
595+ [Div divattr'@(dident',_,_) zs]
596+ | T.null dident || T.null dident' || dident == dident'
597+ -> Div (combineAttr divattr' divattr) zs : rest
598+ _ -> Div divattr inner : rest
604599 go (Div attr xs : rest) = do
605600 xs' <- go xs
606601 rest' <- go rest
@@ -608,6 +603,14 @@ makeSections numbering mbBaseLevel bs =
608603 go (x:xs) = (x :) <$> go xs
609604 go [] = return []
610605
606+ combineAttr :: Attr -> Attr -> Attr
607+ combineAttr (id1, classes1, kvs1) (id2, classes2, kvs2) =
608+ (if T.null id1 then id2 else id1,
609+ ordNub (classes1 ++ classes2),
610+ foldr (\(k,v) kvs -> case lookup k kvs of
611+ Nothing -> (k,v):kvs
612+ Just _ -> kvs) mempty (kvs1 ++ kvs2))
613+
611614headerLtEq :: Int -> Block -> Bool
612615headerLtEq level (Header l _ _) = l <= level
613616headerLtEq level (Div _ (b:_)) = headerLtEq level b
@@ -642,6 +645,7 @@ headerShift n (Pandoc meta (Header m _ ils : bs))
642645 , m + n == 0 = headerShift n $
643646 B.setTitle (B.fromList ils) $ Pandoc meta bs
644647headerShift n (Pandoc meta bs) = Pandoc meta (walk shift bs)
648+
645649 where
646650 shift :: Block -> Block
647651 shift (Header level attr inner)
src/Text/Pandoc/Writers/HTML.hs+2−1
@@ -663,7 +663,8 @@ blockToHtml opts (Div (ident, "section":dclasses, dkvs)
663663 (z:zs) -> ([],z ++ concatMap inDiv zs)
664664 titleContents <- blockListToHtml opts titleBlocks
665665 innerContents <- blockListToHtml opts innerSecs
666− let classes' = ["title-slide" | titleSlide] ++ ["slide" | slide] ++
666+ let classes' = ordNub $
667+ ["title-slide" | titleSlide] ++ ["slide" | slide] ++
667668 ["section" | (slide || writerSectionDivs opts) &&
668669 not html5 ] ++
669670 ["level" <> tshow level | slide || writerSectionDivs opts ]
test/command/5986.md+1−1
@@ -10,7 +10,7 @@
1010</ol>
1111</nav>
1212<p><span id="ch001.xhtml"></span></p>
13−<section id="ch001.xhtml#hi" class="level1 section" data-number="1">
13+<section id="ch001.xhtml#hi" class="level1" data-number="1">
1414<h1 data-number="1"><span class="header-section-number">1</span> Hi</h1>
1515</section>
1616```
test/command/section-divs.md+3−3
@@ -13,13 +13,13 @@ Ok
1313==
1414:::
1515^D
16−<section id="hi" class="level1 section">
16+<section id="hi" class="level1">
1717<h1>Hi</h1>
18−<section id="there" class="level2 section">
18+<section id="there" class="level2">
1919<h2>there</h2>
2020</section>
2121</section>
22−<section id="ok" class="level1 section">
22+<section id="ok" class="level1">
2323<h1>Ok</h1>
2424</section>
2525```