Implemented Ext_header_identifiers, Ext_implicit_header_references.

Now by default pandoc will act as if link references have been defined
for all headers.  So, you can do this:

    # My header

    Link to [My header].
    Another link to [it][My header].

Closes #691.
This commit is contained in:
John MacFarlane 2013-01-03 20:32:15 -08:00
parent 56ff5e1845
commit c435e9cda7
5 changed files with 197 additions and 145 deletions

26
README
View file

@ -858,7 +858,7 @@ wrapping). Consider, for example:
### Header identifiers in HTML, LaTeX, and ConTeXt ### ### Header identifiers in HTML, LaTeX, and ConTeXt ###
**Extension** **Extension: `header_identifiers`**
Each header element in pandoc's HTML and ConTeXt output is given a Each header element in pandoc's HTML and ConTeXt output is given a
unique identifier. This identifier is based on the text of the header. unique identifier. This identifier is based on the text of the header.
@ -906,6 +906,30 @@ and the identifier will be attached to the enclosing `<div>`
sections to be manipulated using javascript or treated differently in sections to be manipulated using javascript or treated differently in
CSS. CSS.
**Extension: `implicit_header_references`**
Pandoc behaves as if reference links have been defined for each header.
So, instead of
[header identifiers](#header-identifiers-in-html)
you can simply write
[header identifiers]
or
[header identifiers][]
or
[the section on header identifiers][header identifiers]
If there are multiple headers with identical text, the corresponding
reference will link to the first one only, and you will need to use explicit
links to link to the others, as described above.
Unlike regular reference links, these references are case-sensitive.
Block quotations Block quotations
---------------- ----------------

View file

@ -89,6 +89,8 @@ data Extension =
| Ext_hard_line_breaks -- ^ All newlines become hard line breaks | Ext_hard_line_breaks -- ^ All newlines become hard line breaks
| Ext_literate_haskell -- ^ Enable literate Haskell conventions | Ext_literate_haskell -- ^ Enable literate Haskell conventions
| Ext_abbreviations -- ^ PHP markdown extra abbreviation definitions | Ext_abbreviations -- ^ PHP markdown extra abbreviation definitions
| Ext_header_identifiers -- ^ Automatic identifiers for headers
| Ext_implicit_header_references -- ^ Implicit reference links for headers
deriving (Show, Read, Enum, Eq, Ord, Bounded) deriving (Show, Read, Enum, Eq, Ord, Bounded)
pandocExtensions :: Set Extension pandocExtensions :: Set Extension
@ -125,6 +127,8 @@ pandocExtensions = Set.fromList
, Ext_strikeout , Ext_strikeout
, Ext_superscript , Ext_superscript
, Ext_subscript , Ext_subscript
, Ext_header_identifiers
, Ext_implicit_header_references
] ]
strictExtensions :: Set Extension strictExtensions :: Set Extension

View file

@ -721,6 +721,7 @@ data ParserState = ParserState
stateAuthors :: [[Inline]], -- ^ Authors of document stateAuthors :: [[Inline]], -- ^ Authors of document
stateDate :: [Inline], -- ^ Date of document stateDate :: [Inline], -- ^ Date of document
stateHeaderTable :: [HeaderType], -- ^ Ordered list of header types used stateHeaderTable :: [HeaderType], -- ^ Ordered list of header types used
stateHeaders :: [[Inline]], -- ^ List of headers (used for implicit ref links)
stateNextExample :: Int, -- ^ Number of next example stateNextExample :: Int, -- ^ Number of next example
stateExamples :: M.Map String Int, -- ^ Map from example labels to numbers stateExamples :: M.Map String Int, -- ^ Map from example labels to numbers
stateHasChapters :: Bool, -- ^ True if \chapter encountered stateHasChapters :: Bool, -- ^ True if \chapter encountered
@ -747,6 +748,7 @@ defaultParserState =
stateAuthors = [], stateAuthors = [],
stateDate = [], stateDate = [],
stateHeaderTable = [], stateHeaderTable = [],
stateHeaders = [],
stateNextExample = 1, stateNextExample = 1,
stateExamples = M.empty, stateExamples = M.empty,
stateHasChapters = False, stateHasChapters = False,

File diff suppressed because it is too large Load diff

View file

@ -281,7 +281,9 @@ elementToHtml slideLevel opts (Sec level num id' title' elements) = do
then filter isSec elements then filter isSec elements
else elements else elements
let header'' = if (writerSectionDivs opts || let header'' = if (writerSectionDivs opts ||
writerSlideVariant opts == S5Slides || slide) writerSlideVariant opts == S5Slides ||
slide ||
not (isEnabled Ext_header_identifiers opts))
then header' then header'
else header' ! prefixedId opts id' else header' ! prefixedId opts id'
let inNl x = mconcat $ nl opts : intersperse (nl opts) x ++ [nl opts] let inNl x = mconcat $ nl opts : intersperse (nl opts) x ++ [nl opts]