49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
from contextlib import contextmanager
|
|
from typing import TextIO, Optional
|
|
|
|
|
|
class IndentManager:
|
|
"""RAII风格的缩进管理器"""
|
|
|
|
def __init__(self, file: TextIO, indent_char: str = '\t'):
|
|
self.file = file
|
|
self.indent_char = indent_char
|
|
self.indent_level = 0
|
|
|
|
def write(self, text: str = '') -> None:
|
|
"""写入带缩进的文本"""
|
|
if text:
|
|
self.file.write(self.indent_char * self.indent_level + text + '\n')
|
|
else:
|
|
self.file.write('\n')
|
|
self.file.flush()
|
|
|
|
def write_raw(self, text: str) -> None:
|
|
"""写入原始文本(无缩进)"""
|
|
self.file.write(text)
|
|
|
|
@contextmanager
|
|
def indent(self, header: Optional[str] = None, footer: Optional[str] = None):
|
|
"""缩进上下文管理器"""
|
|
if header:
|
|
self.write(header)
|
|
|
|
self.indent_level += 1
|
|
try:
|
|
yield self
|
|
finally:
|
|
self.indent_level -= 1
|
|
if footer:
|
|
self.write(footer)
|
|
|
|
@contextmanager
|
|
def block(self, header: str, footer: str = '}'):
|
|
"""代码块上下文管理器"""
|
|
self.write(header + ' {')
|
|
self.indent_level += 1
|
|
try:
|
|
yield self
|
|
finally:
|
|
self.indent_level -= 1
|
|
self.write(footer)
|