tags: TagLine constructor now supports multiline taglines and multiple spaces
This commit is contained in:
+11
-9
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
Module implementing tag related functions and classes.
|
||||
"""
|
||||
from typing import Type, TypeVar, Optional
|
||||
from typing import Type, TypeVar, Optional, Final
|
||||
|
||||
TagInst = TypeVar('TagInst', bound='Tag')
|
||||
TagLineInst = TypeVar('TagLineInst', bound='TagLine')
|
||||
@@ -16,9 +16,9 @@ class Tag(str):
|
||||
A single tag. A string that can contain anything but the default separator (' ').
|
||||
"""
|
||||
# default separator
|
||||
default_separator = ' '
|
||||
default_separator: Final[str] = ' '
|
||||
# alternative separators (e. g. for backwards compatibility)
|
||||
alternative_separators = [',']
|
||||
alternative_separators: Final[list[str]] = [',']
|
||||
|
||||
def __new__(cls: Type[TagInst], string: str) -> TagInst:
|
||||
"""
|
||||
@@ -93,19 +93,21 @@ def match_tags(tags: set[Tag], tags_or: Optional[set[Tag]], tags_and: Optional[s
|
||||
|
||||
class TagLine(str):
|
||||
"""
|
||||
A line of tags. It starts with a prefix ('TAGS:'), followed by a list of tags,
|
||||
separated by the defaut separator (' '). Any operations on a TagLine will sort
|
||||
the tags.
|
||||
A line of tags in a '.txt' file. It starts with a prefix ('TAGS:'), followed by
|
||||
a list of tags, separated by the defaut separator (' '). Any operations on a
|
||||
TagLine will sort the tags.
|
||||
"""
|
||||
# the prefix
|
||||
prefix = 'TAGS:'
|
||||
prefix: Final[str] = 'TAGS:'
|
||||
|
||||
def __new__(cls: Type[TagLineInst], string: str) -> TagLineInst:
|
||||
"""
|
||||
Make sure the tagline string starts with the prefix.
|
||||
Make sure the tagline string starts with the prefix. Also replace newlines
|
||||
and multiple spaces with ' ', in order to support multiline TagLines.
|
||||
"""
|
||||
if not string.startswith(cls.prefix):
|
||||
raise TagError(f"TagLine '{string}' is missing prefix '{cls.prefix}'")
|
||||
string = ' '.join(string.split())
|
||||
instance = super().__new__(cls, string)
|
||||
return instance
|
||||
|
||||
@@ -114,7 +116,7 @@ class TagLine(str):
|
||||
"""
|
||||
Create a new TagLine from a set of tags.
|
||||
"""
|
||||
return cls(' '.join([TagLine.prefix] + sorted([t for t in tags])))
|
||||
return cls(' '.join([cls.prefix] + sorted([t for t in tags])))
|
||||
|
||||
def tags(self) -> set[Tag]:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user