tutorial example python documentation substitution restructuredtext python-sphinx

python - example - Sustituciones dentro de enlaces en reST/Sphinx



sphinx documentation example (4)

Nuevo en Sphinx v1.0:

sphinx.ext.extlinks - Marcado para acortar enlaces externos

http://sphinx.pocoo.org/ext/extlinks.html

La extensión agrega un nuevo valor de configuración:

enlaces externos

Este valor de configuración debe ser un diccionario de sitios externos, que asigne nombres de alias cortos únicos a una URL base y un prefijo. Por ejemplo, para crear un alias para los problemas mencionados anteriormente, debe agregar

extlinks = {''issue'': (''http://bitbucket.org/birkenfeld/sphinx/issue/%s'', ''issue '')}

Ahora, puede usar el nombre de alias como un nuevo rol, por ejemplo :issue:`123` . Esto luego inserta un enlace a http://bitbucket.org/birkenfeld/sphinx/issue/123 . Como puede ver, el destino dado en el rol se sustituye en la URL base en lugar de %s .

El título del enlace depende del segundo elemento de la tupla, el prefijo:

Si el prefijo es Ninguno, el título del enlace es la URL completa. Si el prefijo es la cadena vacía, el título del enlace es la URL parcial dada en el contenido del rol (123 en este caso). Si el prefijo es una cadena no vacía, la leyenda del enlace es la URL parcial, precedida por el prefijo - en el ejemplo anterior, el título del enlace sería el problema 123. También puede utilizar la sintaxis habitual de "título explícito" que admiten otros roles que generan enlaces, es decir :issue:`this issue <123>` . En este caso, el prefijo no es relevante.

Estoy usando Sphinx para documentar un servicio web que se implementará en diferentes servidores. La documentación está llena de ejemplos de URL para que el usuario haga clic y deberían funcionar. Mi problema es que el host, el puerto y la raíz de implementación variarán y la documentación tendrá que volver a generarse para cada implementación.

Intenté definir sustituciones como esta:

|base_url|/path .. |base_url| replace:: http://localhost:8080

Pero el HTML generado no es lo que quiero (no incluye "/ ruta" en el enlace generado):

<a href="http://localhost:8080">http://localhost:8080</a>/path

¿Alguien sabe cómo solucionar esto?


Ok, así es como lo hice. Primero, apilinks.py (la extensión Sphinx):

from docutils import nodes, utils def setup(app): def api_link_role(role, rawtext, text, lineno, inliner, options={}, content=[]): ref = app.config.apilinks_base + text node = nodes.reference(rawtext, utils.unescape(ref), refuri=ref, **options) return [node], [] app.add_config_value(''apilinks_base'', ''http://localhost/'', False) app.add_role(''apilink'', api_link_role)

Ahora, en conf.py , agregue ''apilinks'' a la lista de extensiones y establezca un valor apropiado para ''apilinks_base'' (de lo contrario, se establecerá el valor predeterminado en ''http://localhost/'' ). Mi archivo se ve así:

extensions = [''sphinx.ext.autodoc'', ''apilinks''] # lots of other stuff apilinks_base = ''http://host:88/base/''

Uso:

:apilink:`path`

Salida:

<a href="http://host:88/base/path">http://host:88/base/path</a>


Puedes escribir una extension Sphinx que crea un role como

:apilink:`path`

y genera el enlace a partir de eso. Nunca hice esto, así que no puedo ayudar más que dar este indicador, lo siento. Debe intentar ver cómo se implementan los distintos roles. Muchos son muy similares a lo que necesitas, creo.


Tuve un problema similar en el que necesitaba sustituir también las URL en los objetivos de imagen. Los extlinks no se expanden cuando se usan como un valor de la imagen :target: atributo. Finalmente, escribí una transformación de esfinge personalizada que vuelve a escribir las URL que comienzan con un prefijo dado, en mi caso, http://mybase/ . Aquí hay un código relevante para conf.py:

from sphinx.transforms import SphinxTransform class ReplaceMyBase(SphinxTransform): default_priority = 750 prefix = ''http://mybase/'' def apply(self): from docutils.nodes import reference, Text baseref = lambda o: ( isinstance(o, reference) and o.get(''refuri'', '''').startswith(self.prefix)) basetext = lambda o: ( isinstance(o, Text) and o.startswith(self.prefix)) base = self.config.mybase.rstrip(''/'') + ''/'' for node in self.document.traverse(baseref): target = node[''refuri''].replace(self.prefix, base, 1) node.replace_attr(''refuri'', target) for t in node.traverse(basetext): t1 = Text(t.replace(self.prefix, base, 1), t.rawsource) t.parent.replace(t, t1) return # end of class def setup(app): app.add_config_value(''mybase'', ''https://en.wikipedia.org/wiki'', ''env'') app.add_transform(ReplaceMyBase) return

Esto expande la siguiente primera fuente para apuntar a wikipedia en inglés. Cuando conf.py establece mybase="https://es.wikipedia.org/wiki" los enlaces apuntan a la wiki en español.

* inline link http://mybase/Helianthus * `link with text <http://mybase/Helianthus>`_ * `link with separate definition`_ * image link |flowerimage| .. _link with separate definition: http://mybase/Helianthus .. |flowerimage| image:: https://upload.wikimedia.org/wikipedia/commons/f/f1/Tournesol.png :target: http://mybase/Helianthus