2011-08-12 18 views
6

Trong RST, chúng tôi sử dụng một số khoảng trắng ở phía trước khối để nói đây là khối mã. Bởi vì Python cũng sử dụng khoảng trắng để thụt lề một khối mã, tôi muốn khối mã RST của tôi để bảo toàn các khoảng trắng đó nếu tôi đang viết mã Python. Làm thế nào tôi có thể làm điều đó?Cách buộc khoảng trống trong khối mã trong reStructuredText

Hãy nói rằng chúng tôi có một lớp:

class Test(object): 

Và chúng tôi muốn viết một phương pháp gọi là __init__ đó là một thành viên của lớp này. Phương pháp này thuộc về một khối mã khác nhưng chúng tôi muốn có một số đầu mối trực quan để người đọc biết rằng khối thứ hai này là sự tiếp nối của khối trước đó. Tại thời điểm này, tôi sử dụng # để đánh dấu đường thẳng đứng hướng dẫn của một khối mã như thế này:

def __init__(self): 
     pass 
# 

Nếu không có sự #, def __init__(self) sẽ được in ở cấp thụt đầu dòng giống như class Test(object). Phải có cách thanh lịch hơn.

+0

bạn có thể chỉ ra những gì không hoạt động không? có lẽ tôi là ngu ngốc, nhưng tôi đã viết tài liệu đầu tiên như thế này http://code.google.com/p/pytyp/source/browse/pytyp.rst#685 với mã python và không cần phải làm bất cứ điều gì đặc biệt . –

+0

Andrew, tôi đã làm rõ thêm. –

+0

nhưng điều đó không đúng. ví dụ http://code.google.com/p/pytyp/source/browse/pytyp.rst#750 hoạt động tốt (tài liệu có tại http://acooke.org/pytyp.pdf và lớp đó là trên p7) . có lẽ tôi vẫn còn hiểu lầm. tại sao bạn gọi kết thúc mã là sự khởi đầu của một khối mã? –

Trả lời

0

Ah ... Tôi đã thực hiện điều này trước đây;). Bí quyết # thường là những gì tôi sử dụng, than ôi. Nếu bạn đọc các spec nó có vẻ như nó sẽ luôn luôn lấy đi indent hàng đầu. [1]

Bạn cũng có thể sử dụng một cú pháp thay thế:

:: 

>  def foo(x): 
>   pass 

Với hàng đầu ">" rằng sẽ giữ gìn không gian hàng đầu.

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

EDIT

Chỉ cần đào thông qua các mã docutils (điều này đã được bugging tôi rất nhiều quá) và có thể khẳng định rằng nó sẽ luôn luôn loại bỏ thụt lề thông thường, không có câu hỏi . Nó sẽ dễ dàng sửa đổi để thay đổi hành vi này nhưng điều đó sẽ làm cho văn bản được cấu trúc lại kết quả không chuẩn.

+2

">" hàng đầu cũng được giữ nguyên trong văn bản. Không chỉ cần thêm một ký tự trên mỗi dòng, nhưng nó cũng có thể gây nhầm lẫn cho người đọc. –

+0

@Nam Yeah, xin lỗi tôi không biết cách nào tốt hơn. Bạn có thể làm cho chỉ thị của riêng bạn mà loại bỏ các fudge "#", nhưng đó có thể là công việc nhiều hơn điều này là giá trị. – Owen

+0

Tôi sẽ chấp nhận câu trả lời của bạn dù sao;). Cảm ơn. –

0

Bạn cũng có thể thử Line Blocks mà trông như thế này:

|  def foo(x): 
|   pass 

mặc dù họ không cụ thể cho ví dụ mã.

0

Bạn cần phải xác định chỉ thị riêng của bạn (đó là sự thật rằng các tiêu chuẩn .. code:: chỉ gobbles không gian nhưng bạn có thể làm giấy ủy quyền của riêng bạn mà không làm):

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) 

Bạn có thể tất nhiên ghi đè lên các tiêu chuẩn .. code:: chỉ thị với điều này, quá.