-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Am 14.12.2010 00:21, schrieb Václav Šmilauer: > Hello everybody, > > I am struggling with a simple thing (but I want to do it properly)... > I want to create a custom internal hyperlinking role :yref:`target`, > where target is transformed to yield name of an existing label > (target2, created either manually or automatically) somewhere else in > the document (class name or such), so in the end it will be as if > writing :ref:`target <target2>`. This target2 should be then resolved > automatically. > > So far, I do the following in conf.py: > > 1. I create a class inheriting from XRefRole, overriding process_link: > > class YXRefRole(XRefRole): > def process_link(self, env, refnode, has_explicit_title, title, > target): > # the logic here would be more complex; for now, we want to > simulate :ref:`[[target]] <prefix.target>` > return '[['+title+']]','prefix.'+target > > 2. Then I create a thin wrapper function to use that class: > > def yref_role(type,rawtext,text,lineno,inliner,options={},content=[]): > # I know this has to instantiate the class over and over, but that > is not an issue now > return YXRefRole() > ('yref',rawtext,text,lineno,inliner,options,content) > > 3. Finally, the role is registered: > > from docutils.parsers.rst import roles > roles.register_canonical_role('yref', yref_role) > > The result is that the title is really replaced (I see [[target]] in > bold in the resulting HTML), but the hyperlink is not created and I > don't see any warning about unresolvable reference... > > What is the last piece that I am missing?
You will have to tell Sphinx what role you want to replace: in yref_role, call YXRefRole()('std:ref', ...) instead of ...'yref'... You can also set these properties in process_link() and remove the indirection via another role function. My suggestion: from sphinx.roles import XRefRole class YXRefRole(XRefRole): def process_link(self, env, refnode, has_explicit_title, title, target): refnode['reftype'] = 'ref' refnode['refexplicit'] = True # to prevent that Sphinx overwrites # the title you set return '[['+title+']]','prefix.'+target def setup(app): app.add_role_to_domain('std', 'yref', YXRefRole()) cheers & HTH, Georg -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEARECAAYFAk0o8H4ACgkQN9GcIYhpnLA7kACgqPB/h8Rpdu50bq5i/sEsq3jE qaMAnjFO/FbT9i8gOonnwHTtnNFs5uLY =Y77h -----END PGP SIGNATURE----- -- You received this message because you are subscribed to the Google Groups "sphinx-dev" group. To post to this group, send email to sphinx-...@googlegroups.com. To unsubscribe from this group, send email to sphinx-dev+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sphinx-dev?hl=en.