Add writing operation to parser
This commit is contained in:
parent
396f8d405a
commit
c263d8b469
|
@ -23,6 +23,9 @@ class TabOptions:
|
||||||
def __init__(self, **kwargs) -> None:
|
def __init__(self, **kwargs) -> None:
|
||||||
self.options: dict = OrderedDict(**kwargs)
|
self.options: dict = OrderedDict(**kwargs)
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return self.options
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def priority(self) -> int:
|
def priority(self) -> int:
|
||||||
"""Priority determines tab order."""
|
"""Priority determines tab order."""
|
||||||
|
@ -68,6 +71,9 @@ class TagOptions:
|
||||||
# Hide the tag from unauthenticated viewers
|
# Hide the tag from unauthenticated viewers
|
||||||
self.private: bool = kwargs.get('private', False)
|
self.private: bool = kwargs.get('private', False)
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return self.options
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hyperlink(self) -> bool:
|
def hyperlink(self) -> bool:
|
||||||
return self.options.get(self._HYPERLINK_KEY, False)
|
return self.options.get(self._HYPERLINK_KEY, False)
|
||||||
|
@ -108,6 +114,13 @@ class DocumentSubtag:
|
||||||
self.value: str = value
|
self.value: str = value
|
||||||
self.options: TagOptions = options if options is not None else TagOptions()
|
self.options: TagOptions = options if options is not None else TagOptions()
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return OrderedDict(
|
||||||
|
name=self.name,
|
||||||
|
value=self.value,
|
||||||
|
options=self.options.to_json(),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DocumentTag:
|
class DocumentTag:
|
||||||
"""
|
"""
|
||||||
|
@ -125,6 +138,14 @@ class DocumentTag:
|
||||||
self.options: TagOptions = options if options is not None else TagOptions()
|
self.options: TagOptions = options if options is not None else TagOptions()
|
||||||
self.subtags: list = subtags if subtags is not None else []
|
self.subtags: list = subtags if subtags is not None else []
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return OrderedDict(
|
||||||
|
name=self.name,
|
||||||
|
value=self.value,
|
||||||
|
options=self.options.to_json(),
|
||||||
|
subtags=[subtag.to_json() for subtag in self.subtags],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DocumentTab:
|
class DocumentTab:
|
||||||
"""
|
"""
|
||||||
|
@ -140,6 +161,13 @@ class DocumentTab:
|
||||||
self.tags: List[DocumentTag] = tags
|
self.tags: List[DocumentTag] = tags
|
||||||
self.options: TabOptions = options if options is not None else TabOptions()
|
self.options: TabOptions = options if options is not None else TabOptions()
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return OrderedDict(
|
||||||
|
name=self.name,
|
||||||
|
tags=[tag.to_json() for tag in self.tags],
|
||||||
|
options=self.options.to_json(),
|
||||||
|
)
|
||||||
|
|
||||||
def get_tag(self, name: str):
|
def get_tag(self, name: str):
|
||||||
for tag in self.tags:
|
for tag in self.tags:
|
||||||
if tag.name == name:
|
if tag.name == name:
|
||||||
|
@ -154,6 +182,9 @@ class Document:
|
||||||
def __init__(self, tabs: List[DocumentTab]) -> None:
|
def __init__(self, tabs: List[DocumentTab]) -> None:
|
||||||
self.tabs: List[DocumentTab] = tabs
|
self.tabs: List[DocumentTab] = tabs
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return [tab.to_json() for tab in self.tabs]
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return self.tabs.__iter__()
|
return self.tabs.__iter__()
|
||||||
|
|
||||||
|
@ -186,16 +217,6 @@ def load(fd: IO) -> Document:
|
||||||
return parse_document_from_json(parsed_json)
|
return parse_document_from_json(parsed_json)
|
||||||
|
|
||||||
|
|
||||||
def loads(string: str) -> Document:
|
|
||||||
"""
|
|
||||||
Load a document from a string.
|
|
||||||
"""
|
|
||||||
parsed_json = json.loads(string, object_pairs_hook=OrderedDict)
|
|
||||||
if not isinstance(parsed_json, list):
|
|
||||||
raise ValueError('Parsing as document, expected list')
|
|
||||||
return parse_document_from_json(parsed_json)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_document_from_json(parsed_json: list) -> Document:
|
def parse_document_from_json(parsed_json: list) -> Document:
|
||||||
"""
|
"""
|
||||||
Parses JSON into a Document object.
|
Parses JSON into a Document object.
|
||||||
|
@ -292,6 +313,14 @@ def parse_subtag_from_json(subtag_json: dict) -> DocumentSubtag:
|
||||||
return DocumentSubtag(name, value, options)
|
return DocumentSubtag(name, value, options)
|
||||||
|
|
||||||
|
|
||||||
|
def dump(doc: Document, fd: IO):
|
||||||
|
"""
|
||||||
|
Write a document to a file descriptor.
|
||||||
|
"""
|
||||||
|
dumped_json = doc.to_json()
|
||||||
|
json.dump(dumped_json, fd)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# CLI functions
|
# CLI functions
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue