Files
mirage/tools/indent_manager.py

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)