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
if useReferenceLinks
then do refs <- get >>= return . stLinks
let refs' = if (txt, (src, tit)) `elem` refs
then refs
else (txt, (src, tit)):refs
modify $ \st -> st { stLinks = refs' }
return $ "`" <> linktext <> "`_"
else return $ "`" <> linktext <> " <" <> text src <> ">`_"
case lookup txt refs of
Just (src',tit') ->
if src == src' && tit == tit'
then return $ "`" <> linktext <> "`_"
else do -- duplicate label, use non-reference link
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
label <- registerImage alternate (source,tit) Nothing
return $ "|" <> label <> "|"

View file

@ -18,8 +18,8 @@ markdown test suite.
Headers
=======
Level 2 with an `embedded link </url>`_
---------------------------------------
Level 2 with an `embedded link </url>`__
----------------------------------------
Level 3 with *emphasis*
~~~~~~~~~~~~~~~~~~~~~~~
@ -549,7 +549,7 @@ This is *emphasized*, and so *is this*.
This is **strong**, and so **is this**.
An *`emphasized link </url>`_*.
An *`emphasized link </url>`__*.
***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?
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.
@ -690,42 +690,42 @@ Links
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
---------
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.
@ -733,21 +733,21 @@ This should [not][] be a link.
[not]: /url
Foo `bar </url/>`_.
Foo `bar </url/>`__.
Foo `biz </url/>`_.
Foo `biz </url/>`__.
With ampersands
---------------
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
---------
@ -815,7 +815,7 @@ This paragraph should not be part of the note, as it is not indented.
.. [3]
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].
.. [4]