Source code for wikitextparser._section
from typing import Optional
from ._wikitext import SubWikiText, rc
HEADER_MATCH = rc(rb'(={1,6})([^\n]+?)\1[ \t]*(\n|\Z)').match
[docs]
class Section(SubWikiText):
__slots__ = '_header_match_cache'
[docs]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._header_match_cache = None, None
@property
def _header_match(self):
cached_match, cached_shadow = self._header_match_cache
shadow = self._shadow
if cached_shadow == shadow:
return cached_match
m = HEADER_MATCH(shadow)
self._header_match_cache = m, shadow
return m
@property
def level(self) -> int:
"""The level of this section.
getter: Return level which as an int in range(1,7) or 0 for the lead
section.
setter: Change the level.
"""
m = self._header_match
if m:
return len(m[1])
return 0
@level.setter
def level(self, value: int) -> None:
m = self._header_match
level_diff = len(m[1]) - value
if level_diff == 0:
return
if level_diff < 0:
new_equals = '=' * abs(level_diff)
self.insert(0, new_equals)
self.insert(m.end(2) + 1, new_equals)
return
del self[:level_diff]
del self[m.end(2) : m.end(2) + level_diff]
@property
def title(self) -> Optional[str]:
"""The title of this section.
getter: Return the title or None for lead sections or sections that
don't have any title.
setter: Set a new title.
deleter: Remove the title, including the equal sign and the newline
after it.
"""
m = self._header_match
if m is None:
return None
return self(m.start(2), m.end(2))
@title.setter
def title(self, value: str) -> None:
m = self._header_match
if m is None:
raise RuntimeError(
"Can't set title for a lead section. "
'Try adding it to contents.'
)
self[m.start(2) : m.end(2)] = value
@title.deleter
def title(self) -> None:
m = self._header_match
if m is None:
return
del self[m.start() : m.end()]
@property
def contents(self) -> str:
"""Contents of this section.
getter: return the contents
setter: Set contents to a new string value.
"""
m = self._header_match
if m is None:
return self(0, None)
return self(m.end(), None)
@contents.setter
def contents(self, value: str) -> None:
m = self._header_match
if m is None:
self[:] = value
return
self[m.end() :] = value