4 # Author: David Goodger <goodger@python.org>
5 # Copyright: This module has been placed in the public domain.
8 Tests for docutils.transforms.references.Hyperlinks.
11 from __init__
import DocutilsTestSupport
12 from docutils
.transforms
.references
import PropagateTargets
, \
13 AnonymousHyperlinks
, IndirectHyperlinks
, ExternalTargets
, \
14 InternalTargets
, DanglingReferences
16 from docutils
.parsers
.rst
import Parser
21 s
= DocutilsTestSupport
.TransformTestSuite(parser
)
22 s
.generateTests(totest
)
27 # Exhaustive listing of hyperlink variations: every combination of
28 # target/reference, direct/indirect, internal/external, and named/anonymous,
30 totest
['exhaustive_hyperlinks'] = ((PropagateTargets
, AnonymousHyperlinks
,
32 ExternalTargets
, InternalTargets
,
33 DanglingReferences
), [
37 .. _direct: http://direct
40 <document source="test data">
42 <reference name="direct" refuri="http://direct">
45 <target ids="direct" names="direct" refuri="http://direct">
50 .. _indirect: xtarget_
51 .. _xtarget: http://indirect
54 <document source="test data">
56 <reference name="indirect" refuri="http://indirect">
59 <target ids="indirect" names="indirect" refuri="http://indirect">
60 <target ids="xtarget" names="xtarget" refuri="http://indirect">
68 <document source="test data">
69 <target refid="direct">
70 <paragraph ids="direct" names="direct">
71 <reference name="direct" refid="direct">
80 .. _indirect2: ztarget_
81 .. _indirect: indirect2_
84 <document source="test data">
85 <target refid="ztarget">
86 <paragraph ids="ztarget" names="ztarget">
87 <reference name="indirect" refid="ztarget">
90 <target ids="indirect2" names="indirect2" refid="ztarget">
91 <target ids="indirect" names="indirect" refid="ztarget">
99 .. _indirect: implicit_
102 <document source="test data">
103 <section ids="implicit" names="implicit">
107 <reference name="indirect" refid="implicit">
110 <target ids="indirect" names="indirect" refid="implicit">
116 `multiply-indirect`_ internal
118 .. _multiply-indirect: indirect_
119 .. _indirect: implicit_
122 <document source="test data">
123 <section ids="implicit" names="implicit">
127 <reference name="multiply-indirect" refid="implicit">
130 <target ids="multiply-indirect" names="multiply-indirect" refid="implicit">
131 <target ids="indirect" names="indirect" refid="implicit">
134 circular_ indirect reference
136 .. _circular: indirect_
137 .. _indirect: circular_
140 <document source="test data">
142 <problematic ids="id2" refid="id1">
145 <target ids="circular" names="circular" refid="circular">
146 <problematic ids="id3 indirect" names="indirect" refid="id1">
147 .. _indirect: circular_
148 <system_message backrefs="id2 id3" ids="id1" level="3" line="3" source="test data" type="ERROR">
150 Indirect hyperlink target "circular" (id="circular") refers to target "indirect", forming a circular reference.
156 Duplicate implicit targets.
163 .. _indirect: implicit_
165 Direct internal reference: Implicit_
168 <document source="test data">
169 <section dupnames="implicit" ids="implicit">
173 Duplicate implicit targets.
174 <section dupnames="implicit" ids="id1">
177 <system_message backrefs="id1" level="1" line="7" source="test data" type="INFO">
179 Duplicate implicit target name: "implicit".
181 <problematic ids="id3" refid="id2">
184 <target ids="indirect" names="indirect" refname="implicit">
186 Direct internal reference:
187 <problematic ids="id5" refid="id4">
189 <system_message backrefs="id3" ids="id2" level="3" line="11" source="test data" type="ERROR">
191 Indirect hyperlink target "indirect" (id="indirect") refers to target "implicit", which is a duplicate, and cannot be used as a unique reference.
192 <system_message backrefs="id5" ids="id4" level="3" line="13" source="test data" type="ERROR">
194 Duplicate target name, cannot be used as a unique reference: "implicit".
202 <document source="test data">
204 <reference anonymous="1" name="direct external" refuri="http://direct">
206 <target anonymous="1" ids="id1" refuri="http://direct">
209 `indirect external`__
212 .. _xtarget: http://indirect
215 <document source="test data">
217 <reference anonymous="1" name="indirect external" refuri="http://indirect">
219 <target anonymous="1" ids="id1" refuri="http://indirect">
220 <target ids="xtarget" names="xtarget" refuri="http://indirect">
228 <document source="test data">
229 <target anonymous="1" refid="id1">
230 <paragraph ids="id1">
231 <reference anonymous="1" name="direct internal" refid="id1">
237 `indirect internal`__
242 <document source="test data">
243 <target refid="ztarget">
244 <paragraph ids="ztarget" names="ztarget">
245 <reference anonymous="1" name="indirect internal" refid="ztarget">
247 <target anonymous="1" ids="id1" refid="ztarget">
258 `indirect internal`__
263 <document source="test data">
264 <target dupnames="ztarget" refid="ztarget">
265 <paragraph ids="ztarget">
267 <system_message backrefs="id1" level="2" line="5" source="test data" type="WARNING">
269 Duplicate explicit target name: "ztarget".
270 <target dupnames="ztarget" refid="id1">
271 <paragraph ids="id1">
274 <problematic ids="id4" refid="id3">
275 `indirect internal`__
276 <target anonymous="1" ids="id2" refname="ztarget">
277 <system_message backrefs="id4" ids="id3" level="3" line="11" source="test data" type="ERROR">
279 Indirect hyperlink target (id="id2") refers to target "ztarget", which is a duplicate, and cannot be used as a unique reference.
282 The next anonymous hyperlink reference is parsed (and discarded) at
283 some point, but nonetheless anonymous hyperlink references and targets
284 match in this snippet.
286 .. |invalid| replace:: anonymous__
293 <document source="test data">
295 The next anonymous hyperlink reference is parsed (and discarded) at
296 some point, but nonetheless anonymous hyperlink references and targets
297 match in this snippet.
298 <system_message level="3" line="5" source="test data" type="ERROR">
300 Substitution definition contains illegal element:
301 <literal_block xml:space="preserve">
302 <reference anonymous="1" name="anonymous">
304 <literal_block xml:space="preserve">
305 .. |invalid| replace:: anonymous__
307 <reference anonymous="1" name="hyperlink" refuri="URL">
309 <target anonymous="1" ids="id1" refuri="URL">
312 An `embedded uri <http://direct>`_.
314 Another reference to the same `embedded URI`_.
317 <document source="test data">
320 <reference name="embedded uri" refuri="http://direct">
322 <target ids="embedded-uri" names="embedded\ uri" refuri="http://direct">
325 Another reference to the same \n\
326 <reference name="embedded URI" refuri="http://direct">
331 An `anonymous embedded uri <http://direct>`__.
334 <document source="test data">
337 <reference name="anonymous embedded uri" refuri="http://direct">
338 anonymous embedded uri
342 An `embedded alias <alias_>`_.
344 Another reference to the same `embedded alias`_.
349 <document source="test data">
352 <reference name="embedded alias" refuri="ham.py">
354 <target names="embedded\ alias" refuri="ham.py">
357 Another reference to the same \n\
358 <reference name="embedded alias" refuri="ham.py">
361 <target ids="alias" names="alias" refuri="ham.py">
364 An `anonymous embedded alias <redirect_>`__.
366 .. _redirect: spam.py
369 <document source="test data">
372 <reference name="anonymous embedded alias" refuri="spam.py">
373 anonymous embedded alias
375 <target ids="redirect" names="redirect" refuri="spam.py">
377 # TODO: suppress the INFO message?
379 An `embedded alias <alias_>`_ with unknown reference.
382 <document source="test data">
385 <problematic ids="id3" refid="id2">
386 `embedded alias <alias_>`_
387 <target names="embedded\ alias" refname="alias">
388 with unknown reference.
389 <system_message ids="id1" level="3" line="1" source="test data" type="ERROR">
391 Indirect hyperlink target "embedded alias" refers to target "alias", which does not exist.
392 <system_message backrefs="id3" ids="id2" level="3" line="1" source="test data" type="ERROR">
394 Unknown target name: "alias".
395 <system_message level="1" line="1" source="test data" type="INFO">
397 Hyperlink target "embedded alias" is not referenced.\
402 .. [1] Footnote; target_
405 <document source="test data">
406 <target ids="target" names="target">
407 <footnote ids="id1" names="1">
412 <reference name="target" refid="target">
418 .. [cit] Citation; target_
421 <document source="test data">
422 <target ids="target" names="target">
423 <citation ids="cit" names="cit">
428 <reference name="target" refid="target">
433 totest
['hyperlinks'] = ((PropagateTargets
, AnonymousHyperlinks
,
434 IndirectHyperlinks
, ExternalTargets
,
435 InternalTargets
, DanglingReferences
), [
437 .. _internal hyperlink:
439 This paragraph referenced.
441 By this `internal hyperlink`_ reference.
444 <document source="test data">
445 <target refid="internal-hyperlink">
446 <paragraph ids="internal-hyperlink" names="internal\ hyperlink">
447 This paragraph referenced.
450 <reference name="internal hyperlink" refid="internal-hyperlink">
456 .. _internal hyperlink:
458 This paragraph referenced.
460 By this `internal hyperlink`_ reference
461 as well as by this chained_ reference.
463 The results of the transform are not visible at the XML level.
466 <document source="test data">
467 <target refid="chained">
468 <target refid="internal-hyperlink">
469 <paragraph ids="internal-hyperlink chained" names="internal\ hyperlink chained">
470 This paragraph referenced.
473 <reference name="internal hyperlink" refid="internal-hyperlink">
476 as well as by this \n\
477 <reference name="chained" refid="chained">
481 The results of the transform are not visible at the XML level.
487 Anonymous__ and chained_ both refer to the same URI.
490 <document source="test data">
491 <target refid="chained">
492 <target anonymous="1" ids="id1 chained" names="chained" refuri="http://anonymous">
494 <reference anonymous="1" name="Anonymous" refuri="http://anonymous">
497 <reference name="chained" refuri="http://anonymous">
499 both refer to the same URI.
508 <document source="test data">
511 <paragraph ids="b a" names="b a">
513 <system_message level="1" line="1" source="test data" type="INFO">
515 Hyperlink target "a" is not referenced.
516 <system_message level="1" line="2" source="test data" type="INFO">
518 Hyperlink target "b" is not referenced.
527 <document source="test data">
530 <paragraph ids="b a" names="b a">
531 <reference name="a" refid="a">
533 <system_message level="1" line="2" source="test data" type="INFO">
535 Hyperlink target "b" is not referenced.
544 <document source="test data">
547 <paragraph ids="b a" names="b a">
548 <reference name="b" refid="b">
550 <system_message level="1" line="1" source="test data" type="INFO">
552 Hyperlink target "a" is not referenced.
561 <document source="test data">
564 <paragraph ids="b a" names="b a">
565 <reference name="a" refid="a">
567 <reference name="b" refid="b">
571 .. _external hyperlink: http://uri
573 `External hyperlink`_ reference.
576 <document source="test data">
577 <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri">
579 <reference name="External hyperlink" refuri="http://uri">
584 .. _external hyperlink: http://uri
585 .. _indirect target: `external hyperlink`_
588 <document source="test data">
589 <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri">
590 <target ids="indirect-target" names="indirect\ target" refuri="http://uri">
591 <system_message level="1" line="2" source="test data" type="INFO">
593 Hyperlink target "indirect target" is not referenced.
597 .. _external hyperlink: http://uri
599 `External hyperlink`_ reference
600 and a chained_ reference too.
603 <document source="test data">
604 <target refid="chained">
605 <target ids="external-hyperlink chained" names="external\ hyperlink chained" refuri="http://uri">
607 <reference name="External hyperlink" refuri="http://uri">
611 <reference name="chained" refuri="http://uri">
616 .. _external hyperlink: http://uri
617 .. _indirect hyperlink: `external hyperlink`_
619 `Indirect hyperlink`_ reference.
622 <document source="test data">
623 <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri">
624 <target ids="indirect-hyperlink" names="indirect\ hyperlink" refuri="http://uri">
626 <reference name="Indirect hyperlink" refuri="http://uri">
631 .. _external hyperlink: http://uri
633 .. _indirect hyperlink: `external hyperlink`_
635 Chained_ `indirect hyperlink`_ reference.
638 <document source="test data">
639 <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri">
640 <target refuri="http://uri">
641 <target ids="indirect-hyperlink chained" names="indirect\ hyperlink chained" refuri="http://uri">
643 <reference name="Chained" refuri="http://uri">
646 <reference name="indirect hyperlink" refuri="http://uri">
654 .. _external: http://indirect.external
658 `Full syntax anonymous external hyperlink reference`__,
659 `chained anonymous external reference`__,
660 `simplified syntax anonymous external hyperlink reference`__,
661 `indirect anonymous hyperlink reference`__,
662 `internal anonymous hyperlink reference`__.
665 <document source="test data">
666 <target anonymous="1" ids="id1" refuri="http://full">
667 <target anonymous="1" refid="id2">
668 <target anonymous="1" ids="id3 id2" refuri="http://simplified">
669 <target ids="external" names="external" refuri="http://indirect.external">
670 <target anonymous="1" ids="id4" refuri="http://indirect.external">
671 <target anonymous="1" refid="id5">
672 <paragraph ids="id5">
673 <reference anonymous="1" name="Full syntax anonymous external hyperlink reference" refuri="http://full">
674 Full syntax anonymous external hyperlink reference
676 <reference anonymous="1" name="chained anonymous external reference" refuri="http://simplified">
677 chained anonymous external reference
679 <reference anonymous="1" name="simplified syntax anonymous external hyperlink reference" refuri="http://simplified">
680 simplified syntax anonymous external hyperlink reference
682 <reference anonymous="1" name="indirect anonymous hyperlink reference" refuri="http://indirect.external">
683 indirect anonymous hyperlink reference
685 <reference anonymous="1" name="internal anonymous hyperlink reference" refid="id5">
686 internal anonymous hyperlink reference
690 Duplicate external target_'s (different URIs):
697 <document source="test data">
699 Duplicate external \n\
700 <problematic ids="id3" refid="id2">
703 <target dupnames="target" ids="target" refuri="first">
704 <system_message backrefs="id1" level="2" line="5" source="test data" type="WARNING">
706 Duplicate explicit target name: "target".
707 <target dupnames="target" ids="id1" refuri="second">
708 <system_message backrefs="id3" ids="id2" level="3" line="1" source="test data" type="ERROR">
710 Duplicate target name, cannot be used as a unique reference: "target".
713 Duplicate external targets (different URIs) without reference:
720 <document source="test data">
722 Duplicate external targets (different URIs) without reference:
723 <target dupnames="target" ids="target" refuri="first">
724 <system_message backrefs="id1" level="2" line="5" source="test data" type="WARNING">
726 Duplicate explicit target name: "target".
727 <target dupnames="target" ids="id1" refuri="second">
730 Several__ anonymous__ hyperlinks__, but not enough targets.
732 __ http://example.org
735 <document source="test data">
737 <problematic ids="id3" refid="id2">
740 <problematic ids="id4" refid="id2">
743 <problematic ids="id5" refid="id2">
745 , but not enough targets.
746 <target anonymous="1" ids="id1" refuri="http://example.org">
747 <system_message backrefs="id3 id4 id5" ids="id2" level="3" source="test data" type="ERROR">
749 Anonymous hyperlink mismatch: 3 references but 1 targets.
750 See "backrefs" attribute for IDs.
753 .. _external: http://uri
754 .. _indirect: external_
757 .. image:: picture.png
760 .. image:: picture.png
763 .. image:: picture.png
767 <document source="test data">
768 <target ids="external" names="external" refuri="http://uri">
769 <target ids="indirect" names="indirect" refuri="http://uri">
770 <target refid="internal">
771 <reference ids="internal" name="external" names="internal" refuri="http://uri">
772 <image uri="picture.png">
773 <reference name="indirect" refuri="http://uri">
774 <image uri="picture.png">
775 <reference name="internal" refid="internal">
776 <image uri="picture.png">
779 .. contents:: Table of Contents
780 .. _indirect reference to the table of contents: `table of contents`_
785 Testing an `indirect reference to the table of contents`_.
788 <document source="test data">
789 <topic classes="contents" ids="table-of-contents" names="table\ of\ contents">
795 <reference ids="id1" refid="section">
797 <target ids="indirect-reference-to-the-table-of-contents" names="indirect\ reference\ to\ the\ table\ of\ contents" refid="table-of-contents">
798 <section ids="section" names="section">
803 <reference name="indirect reference to the table of contents" refid="table-of-contents">
804 indirect reference to the table of contents
813 Let's reference it (`explicit target`_) to avoid an irrelevant error.
816 <document source="test data">
817 <target refid="explicit-target">
818 <section ids="title explicit-target" names="title explicit\ target">
823 <reference name="explicit target" refid="explicit-target">
825 ) to avoid an irrelevant error.
828 target1_ should refer to target2_, not the Title.
837 <document source="test data">
839 <reference name="target1" refuri="URI">
842 <reference name="target2" refuri="URI">
845 <target refid="target1">
846 <target ids="target2 target1" names="target2 target1" refuri="URI">
847 <section ids="title" names="title">
855 <document source="test data">
858 <problematic ids="id2" refid="id1">
861 <system_message backrefs="id2" ids="id1" level="3" line="1" source="test data" type="ERROR">
863 Unknown target name: "reference".
866 Duplicate manual footnote labels, with reference ([1]_):
873 <document source="test data">
875 Duplicate manual footnote labels, with reference (
876 <problematic ids="id5 id1" refid="id4">
879 <footnote dupnames="1" ids="id2">
884 <footnote dupnames="1" ids="id3">
887 <system_message backrefs="id3" level="2" line="5" source="test data" type="WARNING">
889 Duplicate explicit target name: "1".
892 <system_message backrefs="id5" ids="id4" level="3" line="1" source="test data" type="ERROR">
894 Duplicate target name, cannot be used as a unique reference: "1".
899 if __name__
== '__main__':
901 unittest
.main(defaultTest
='suite')