2011-08-12 16 views
6

W RST używamy kilku spacji przed blokiem, aby powiedzieć, że jest to blok kodu. Ponieważ Python używa również białych znaków do wcięcia bloku kodu, chciałbym, aby mój blok kodu RST zachował te białe znaki, gdybym pisał kod Pythona. Jak mogę to zrobić?Jak wymusić białe znaki w bloku kodu w zmienionym tekście

Powiedzmy, że mamy klasę:

class Test(object): 

Chcemy napisać metodę zwaną __init__ który jest członkiem tej klasy. Ta metoda należy do innego bloku kodu, ale chcemy mieć jakąś wizualną wskazówkę, aby czytelnicy wiedzieli, że ten drugi blok jest kontynuacją poprzedniej. W tej chwili używam # zaznaczyć pionową linię prowadzącą bloku kodu:

def __init__(self): 
     pass 
# 

bez #, def __init__(self) będą wydrukowane na tym samym poziomie wcięcia jako class Test(object). Musi być bardziej elegancki sposób.

+0

czy możesz wskazać, co nie działa? może jestem głupi, ale napisałem pierwszy dokument, taki jak ten http://code.google.com/p/pytyp/source/browse/pytyp.rst#685 z kodem Pythona, i nie trzeba robić nic specjalnego . –

+0

Andrew, dodałem więcej wyjaśnień. –

+0

ale to nie jest prawda. na przykład http://code.google.com/p/pytyp/source/browse/pytyp.rst#750 działa dobrze (dokument znajduje się na http://acooke.org/pytyp.pdf, a klasa jest na p7) . może nadal nie rozumiem. dlaczego nazywasz koniec kodu początkiem bloku kodu? –

Odpowiedz

0

Ah ... Wcześniej już do tego doszło;). # Sztuczka jest zwykle tym, czego używam, niestety. Jeśli czytasz specyfikację, brzmi to tak, jakby zawsze zabierało to pierwsze wcięcie. [1]

Można również użyć alternatywną składnię:

:: 

>  def foo(x): 
>   pass 

z czołowymi ">", który będzie zachować wiodącą miejsca.

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

EDIT

Wystarczy wykopane przez kod docutils (zostało to podsłuch mi wiele zbyt) i może potwierdzić, że zawsze będzie rozebrać się wcięcie wspólny, bez zbędnych pytań . Byłoby łatwo zmodyfikować, aby zmienić to zachowanie, ale spowodowałoby to, że wynikowy tekst restrukturyzacji byłby niestandardowy.

+2

Główny tekst ">" jest również zachowywany w tekście. Nie tylko wymaga dodatkowego znaku na linię, ale może również mylić czytelników. –

+0

@Nam Tak, przepraszam, nie znam lepszego sposobu. Możesz stworzyć własną dyrektywę, która usunie krówkę "#", ale to może być więcej pracy, niż to jest warte. – Owen

+0

Mimo wszystko przyjmuję twoją odpowiedź;). Dzięki. –

0

Możesz także spróbować Line Blocks które wyglądać tak:

|  def foo(x): 
|   pass 

chociaż nie są one specyficzne przykłady kodu.

0

Trzeba zdefiniować własną dyrektywy (to prawda, że ​​średnia dyrektywa .. code:: gobbles przestrzenie ale można zrobić własną dyrektywę, która nie robi):

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) 

Można oczywiście nadpisywania standardowego dyrektywę .. code:: z tym też.

Powiązane problemy