RST writer: Fixes bug with links with duplicate text.

We now (a) use anonymous links for links with inline URLs, and
(b) use an inline link instead of a reference link if the
reference link would require a label that has already been
used for a different link.

Closes #511.
This commit is contained in:
John MacFarlane 2013-01-13 23:00:05 -08:00
parent f191aa4a98
commit 45895b561f
2 changed files with 38 additions and 34 deletions

View file

@ -367,12 +367,16 @@ inlineToRST (Link txt (src, tit)) = do
linktext <- inlineListToRST $ normalizeSpaces txt linktext <- inlineListToRST $ normalizeSpaces txt
if useReferenceLinks if useReferenceLinks
then do refs <- get >>= return . stLinks then do refs <- get >>= return . stLinks
let refs' = if (txt, (src, tit)) `elem` refs case lookup txt refs of
then refs Just (src',tit') ->
else (txt, (src, tit)):refs if src == src' && tit == tit'
modify $ \st -> st { stLinks = refs' } then return $ "`" <> linktext <> "`_"
return $ "`" <> linktext <> "`_" else do -- duplicate label, use non-reference link
else return $ "`" <> linktext <> " <" <> text src <> ">`_" return $ "`" <> linktext <> " <" <> text src <> ">`__"
Nothing -> do
modify $ \st -> st { stLinks = (txt,(src,tit)):refs }
return $ "`" <> linktext <> "`_"
else return $ "`" <> linktext <> " <" <> text src <> ">`__"
inlineToRST (Image alternate (source, tit)) = do inlineToRST (Image alternate (source, tit)) = do
label <- registerImage alternate (source,tit) Nothing label <- registerImage alternate (source,tit) Nothing
return $ "|" <> label <> "|" return $ "|" <> label <> "|"

View file

@ -18,8 +18,8 @@ markdown test suite.
Headers Headers
======= =======
Level 2 with an `embedded link </url>`_ Level 2 with an `embedded link </url>`__
--------------------------------------- ----------------------------------------
Level 3 with *emphasis* Level 3 with *emphasis*
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@ -549,7 +549,7 @@ This is *emphasized*, and so *is this*.
This is **strong**, and so **is this**. This is **strong**, and so **is this**.
An *`emphasized link </url>`_*. An *`emphasized link </url>`__*.
***This is strong and em.*** ***This is strong and em.***
@ -584,7 +584,7 @@ Smart quotes, ellipses, dashes
He said, “I want to go.”’ Were you alive in the 70s? He said, “I want to go.”’ Were you alive in the 70s?
Here is some quoted ``code`` and a “`quoted Here is some quoted ``code`` and a “`quoted
link <http://example.com/?foo=1&bar=2>`_”. link <http://example.com/?foo=1&bar=2>`__”.
Some dashes: one—two — three—four — five. Some dashes: one—two — three—four — five.
@ -690,42 +690,42 @@ Links
Explicit Explicit
-------- --------
Just a `URL </url/>`_. Just a `URL </url/>`__.
`URL and title </url/>`_. `URL and title </url/>`__.
`URL and title </url/>`_. `URL and title </url/>`__.
`URL and title </url/>`_. `URL and title </url/>`__.
`URL and title </url/>`_ `URL and title </url/>`__
`URL and title </url/>`_ `URL and title </url/>`__
`with\_underscore </url/with_underscore>`_ `with\_underscore </url/with_underscore>`__
`Email link <mailto:nobody@nowhere.net>`_ `Email link <mailto:nobody@nowhere.net>`__
`Empty <>`_. `Empty <>`__.
Reference Reference
--------- ---------
Foo `bar </url/>`_. Foo `bar </url/>`__.
Foo `bar </url/>`_. Foo `bar </url/>`__.
Foo `bar </url/>`_. Foo `bar </url/>`__.
With `embedded [brackets] </url/>`_. With `embedded [brackets] </url/>`__.
`b </url/>`_ by itself should be a link. `b </url/>`__ by itself should be a link.
Indented `once </url>`_. Indented `once </url>`__.
Indented `twice </url>`_. Indented `twice </url>`__.
Indented `thrice </url>`_. Indented `thrice </url>`__.
This should [not][] be a link. This should [not][] be a link.
@ -733,21 +733,21 @@ This should [not][] be a link.
[not]: /url [not]: /url
Foo `bar </url/>`_. Foo `bar </url/>`__.
Foo `biz </url/>`_. Foo `biz </url/>`__.
With ampersands With ampersands
--------------- ---------------
Heres a `link with an ampersand in the Heres a `link with an ampersand in the
URL <http://example.com/?foo=1&bar=2>`_. URL <http://example.com/?foo=1&bar=2>`__.
Heres a link with an amersand in the link text: `AT&T <http://att.com/>`_. Heres a link with an amersand in the link text: `AT&T <http://att.com/>`__.
Heres an `inline link </script?foo=1&bar=2>`_. Heres an `inline link </script?foo=1&bar=2>`__.
Heres an `inline link in pointy braces </script?foo=1&bar=2>`_. Heres an `inline link in pointy braces </script?foo=1&bar=2>`__.
Autolinks Autolinks
--------- ---------
@ -815,7 +815,7 @@ This paragraph should not be part of the note, as it is not indented.
.. [3] .. [3]
This is *easier* to type. Inline notes may contain This is *easier* to type. Inline notes may contain
`links <http://google.com>`_ and ``]`` verbatim characters, as well as `links <http://google.com>`__ and ``]`` verbatim characters, as well as
[bracketed text]. [bracketed text].
.. [4] .. [4]