2011-08-12 24 views
6

En RST, usamos algunos espacios en blanco delante de un bloque para decir que se trata de un bloque de código. Debido a que Python también usa espacios en blanco para sangrar un bloque de código, me gustaría que mi bloque de código RST preserve esos espacios en blanco si estuviera escribiendo el código de Python. ¿Cómo puedo hacer eso?Cómo forzar el espacio en blanco en el bloque de código en reStructuredText

Digamos que tenemos una clase:

class Test(object): 

y queremos escribir un método llamado __init__ que es un miembro de esta clase. Este método pertenece a otro bloque de código pero queremos tener alguna pista visual para que los lectores sepan que este segundo bloque es una continuación del anterior. Por el momento, yo uso # para marcar la línea vertical guía de un bloque de código como este:

def __init__(self): 
     pass 
# 

Sin la #, def __init__(self) saldría impreso en el mismo nivel de sangrado que class Test(object). Tiene que haber una manera más elegante.

+0

¿Puede indicar lo que no funciona? tal vez estoy siendo estúpido, pero he escrito primeros documentos como este http://code.google.com/p/pytyp/source/browse/pytyp.rst#685 con código python y no necesito hacer nada especial . –

+0

Andrew, agregué más aclaraciones. –

+0

pero eso no es verdad. por ejemplo, http://code.google.com/p/pytyp/source/browse/pytyp.rst#750 funciona bien (el documento está en http://acooke.org/pytyp.pdf y esa clase está en p7) . tal vez todavía estoy malentendido. ¿Por qué llamas al final del código el comienzo de un bloque de código? –

Respuesta

0

Ah ... Me he encontrado con esto antes;). El # truco es generalmente lo que uso, ¡ay! Si lees la especificación, parece que siempre quitará el guion delantero. [1]

También es posible usar una sintaxis alternativa:

:: 

>  def foo(x): 
>   pass 

Con el principal ">" que preserve espacio inicial.

[1]: http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#indented-literal-blocks

EDITAR

Sólo excavado a través del código docutils (esto me ha estado molestando mucho también) y puede confirmar que siempre se tira a cabo el guión común, sin hacer preguntas . Sería fácil modificarlo para cambiar este comportamiento, pero eso haría que el texto reestructurado resultante no sea estándar.

+2

El ">" inicial también se conserva en el texto. No solo necesita un personaje extra por línea, sino que también puede confundir a los lectores. –

+0

@Nam Sí, lo siento, no sé una mejor manera. Podrías hacer tu propia directiva que elimine el dulce "#", pero eso puede ser más trabajo de lo que vale. – Owen

+0

Voy a aceptar su respuesta, no obstante;). Gracias. –

0

También puede probar Line Blocks que se parecen a esto:

|  def foo(x): 
|   pass 

pesar de que no son específicos de ejemplos de código.

0

es necesario definir su propia directiva (es cierto que la .. code:: Directiva norma engulle espacios, pero se puede hacer su propia directiva que no lo hace):

import re 
from docutils.parsers.rst import directives 

INDENTATION_RE = re.compile("^ *") 

def measure_indentation(line): 
    return INDENTATION_RE.match(line).end() 

class MyCodeBlock(directives.body.CodeBlock): 
    EXPECTED_INDENTATION = 3 

    def run(self): 
     block_lines = self.block_text.splitlines() 
     block_header_len = self.content_offset - self.lineno + 1 
     block_indentation = measure_indentation(self.block_text) 
     code_indentation = block_indentation + MyCodeBlock.EXPECTED_INDENTATION 
     self.content = [ln[code_indentation:] for ln in block_lines[block_header_len:]] 
     return super(MyCodeBlock, self).run() 

directives.register_directive("my-code", MyCodeBlock) 

Se podría, por supuesto sobrescribir el .. code:: Directiva norma con esto, también.

Cuestiones relacionadas