import copy
from hed.models.hed_group import HedGroup
from hed.models.model_constants import DefTagNames
[docs]class DefinitionEntry:
""" A single definition. """
[docs] def __init__(self, name, contents, takes_value, source_context):
""" Initialize info for a single definition.
Parameters:
name (str): The label portion of this name (not including Definition/).
contents (HedGroup): The contents of this definition.
takes_value (bool): If True, expects ONE tag to have a single # sign in it.
source_context (list, None): List (stack) of dictionaries giving context for reporting errors.
"""
self.name = name
if contents:
contents = contents.copy()
contents.sort()
self.contents = contents
self.takes_value = takes_value
self.source_context = source_context
[docs] def get_definition(self, replace_tag, placeholder_value=None, return_copy_of_tag=False):
""" Return a copy of the definition with the tag expanded and the placeholder plugged in.
Returns None if placeholder_value passed when it doesn't take value, or vice versa.
Parameters:
replace_tag (HedTag): The def hed tag to replace with an expanded version
placeholder_value (str or None): If present and required, will replace any pound signs
in the definition contents.
return_copy_of_tag(bool): Set to true for validation
Returns:
HedGroup: The contents of this definition(including the def tag itself)
:raises ValueError:
- Something internally went wrong with finding the placeholder tag. This should not be possible.
"""
if self.takes_value == (not placeholder_value):
return None
if return_copy_of_tag:
replace_tag = replace_tag.copy()
output_contents = [replace_tag]
if self.contents:
output_group = copy.deepcopy(self.contents)
if placeholder_value:
placeholder_tag = output_group.find_placeholder_tag()
if not placeholder_tag:
raise ValueError("Internal error related to placeholders in definition mapping")
placeholder_tag.replace_placeholder(placeholder_value)
output_contents = [replace_tag, output_group]
output_contents = HedGroup(replace_tag._hed_string,
startpos=replace_tag.span[0], endpos=replace_tag.span[1], contents=output_contents)
return output_contents
def __str__(self):
return str(self.contents)