Shared.hierarchicalize: improve handling of div and section structure.
Previously Divs were opaque to hierarchicalize, so headings inside divs didn't get into the table of contents, for example (#3057). Now hierarchicalize treats Divs as sections when appropriate. For example, these structures both yield a section and a subsection: ``` html <div> <h1>one</h1> <div> <h2>two</h2> </div> </div> ``` ``` html <div> <h1>one</h1> <div> <h1>two</h1> </div> </div> ``` Note that ``` html <h1>one</h1> <div> <h2>two</h2> </div> <h1>three</h1> ``` gets parsed as the structure one two three which may not always be desirable. Closes #3057.
This commit is contained in:
parent
0534258780
commit
345b33762e
2 changed files with 69 additions and 4 deletions
|
@ -523,10 +523,21 @@ hierarchicalizeWithIds (Header level attr@(_,classes,_) title':xs) = do
|
||||||
sectionContents' <- hierarchicalizeWithIds sectionContents
|
sectionContents' <- hierarchicalizeWithIds sectionContents
|
||||||
rest' <- hierarchicalizeWithIds rest
|
rest' <- hierarchicalizeWithIds rest
|
||||||
return $ Sec level newnum attr title' sectionContents' : rest'
|
return $ Sec level newnum attr title' sectionContents' : rest'
|
||||||
hierarchicalizeWithIds (Div ("refs",classes',kvs')
|
hierarchicalizeWithIds (Div attr@(_,classes',_)
|
||||||
(Header level (ident,classes,kvs) title' : xs):ys) =
|
(Header level (_,classes,_) title' : xs):ys)
|
||||||
hierarchicalizeWithIds (Header level (ident,"references":classes,kvs)
|
| not ("columns" `elem` classes')
|
||||||
title' : Div ("refs",classes',kvs') xs : ys)
|
, not ("column" `elem` classes') = do
|
||||||
|
lastnum <- S.get
|
||||||
|
let lastnum' = take level lastnum
|
||||||
|
let newnum = case length lastnum' of
|
||||||
|
x | "unnumbered" `elem` classes -> []
|
||||||
|
| x >= level -> init lastnum' ++ [last lastnum' + 1]
|
||||||
|
| otherwise -> lastnum ++
|
||||||
|
replicate (level - length lastnum - 1) 0 ++ [1]
|
||||||
|
unless (null newnum) $ S.put newnum
|
||||||
|
sectionContents' <- hierarchicalizeWithIds xs
|
||||||
|
rest' <- hierarchicalizeWithIds ys
|
||||||
|
return $ Sec level newnum attr title' sectionContents' : rest'
|
||||||
hierarchicalizeWithIds (x:rest) = do
|
hierarchicalizeWithIds (x:rest) = do
|
||||||
rest' <- hierarchicalizeWithIds rest
|
rest' <- hierarchicalizeWithIds rest
|
||||||
return $ Blk x : rest'
|
return $ Blk x : rest'
|
||||||
|
|
54
test/command/3057.md
Normal file
54
test/command/3057.md
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
```
|
||||||
|
% pandoc -f markdown -t docbook
|
||||||
|
<div>
|
||||||
|
# one
|
||||||
|
<div>
|
||||||
|
## two
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
^D
|
||||||
|
<section>
|
||||||
|
<title>one</title>
|
||||||
|
<section>
|
||||||
|
<title>two</title>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
% pandoc -f markdown -t docbook
|
||||||
|
<div>
|
||||||
|
# one
|
||||||
|
<div>
|
||||||
|
# two
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
^D
|
||||||
|
<section>
|
||||||
|
<title>one</title>
|
||||||
|
<section>
|
||||||
|
<title>two</title>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
% pandoc -f markdown -t docbook
|
||||||
|
# one
|
||||||
|
<div>
|
||||||
|
# two
|
||||||
|
</div>
|
||||||
|
^D
|
||||||
|
<section xml:id="one">
|
||||||
|
<title>one</title>
|
||||||
|
<section>
|
||||||
|
<title>two</title>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
```
|
Loading…
Reference in a new issue