|  | @@ -7,11 +7,35 @@ REGEX = re.compile(r"\{\{(#[a-zA-Z0-9_]{1,50}(\.[a-zA-Z_][a-zA-Z0-9_]{0,29}){1,1
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class VariableTemplateParser:
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  | +    A class for parsing and manipulating template variables in a string.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      Rules:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      1. Template variables must be enclosed in `{{}}`.
 | 
	
		
			
				|  |  |      2. The template variable Key can only be: #node_id.var1.var2#.
 | 
	
		
			
				|  |  |      3. The template variable Key cannot contain new lines or spaces, and must comply with rule 2.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Example usage:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    template = "Hello, {{#node_id.query.name#}}! Your age is {{#node_id.query.age#}}."
 | 
	
		
			
				|  |  | +    parser = VariableTemplateParser(template)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # Extract template variable keys
 | 
	
		
			
				|  |  | +    variable_keys = parser.extract()
 | 
	
		
			
				|  |  | +    print(variable_keys)
 | 
	
		
			
				|  |  | +    # Output: ['#node_id.query.name#', '#node_id.query.age#']
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # Extract variable selectors
 | 
	
		
			
				|  |  | +    variable_selectors = parser.extract_variable_selectors()
 | 
	
		
			
				|  |  | +    print(variable_selectors)
 | 
	
		
			
				|  |  | +    # Output: [VariableSelector(variable='#node_id.query.name#', value_selector=['node_id', 'query', 'name']),
 | 
	
		
			
				|  |  | +    #          VariableSelector(variable='#node_id.query.age#', value_selector=['node_id', 'query', 'age'])]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # Format the template string
 | 
	
		
			
				|  |  | +    inputs = {'#node_id.query.name#': 'John', '#node_id.query.age#': 25}}
 | 
	
		
			
				|  |  | +    formatted_string = parser.format(inputs)
 | 
	
		
			
				|  |  | +    print(formatted_string)
 | 
	
		
			
				|  |  | +    # Output: "Hello, John! Your age is 25."
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def __init__(self, template: str):
 | 
	
	
		
			
				|  | @@ -19,6 +43,12 @@ class VariableTemplateParser:
 | 
	
		
			
				|  |  |          self.variable_keys = self.extract()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def extract(self) -> list:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        Extracts all the template variable keys from the template string.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Returns:
 | 
	
		
			
				|  |  | +            A list of template variable keys.
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  |          # Regular expression to match the template rules
 | 
	
		
			
				|  |  |          matches = re.findall(REGEX, self.template)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -27,6 +57,12 @@ class VariableTemplateParser:
 | 
	
		
			
				|  |  |          return list(set(first_group_matches))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def extract_variable_selectors(self) -> list[VariableSelector]:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        Extracts the variable selectors from the template variable keys.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Returns:
 | 
	
		
			
				|  |  | +            A list of VariableSelector objects representing the variable selectors.
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  |          variable_selectors = []
 | 
	
		
			
				|  |  |          for variable_key in self.variable_keys:
 | 
	
		
			
				|  |  |              remove_hash = variable_key.replace('#', '')
 | 
	
	
		
			
				|  | @@ -42,6 +78,16 @@ class VariableTemplateParser:
 | 
	
		
			
				|  |  |          return variable_selectors
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def format(self, inputs: dict, remove_template_variables: bool = True) -> str:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        Formats the template string by replacing the template variables with their corresponding values.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Args:
 | 
	
		
			
				|  |  | +            inputs: A dictionary containing the values for the template variables.
 | 
	
		
			
				|  |  | +            remove_template_variables: A boolean indicating whether to remove the template variables from the output.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Returns:
 | 
	
		
			
				|  |  | +            The formatted string with template variables replaced by their values.
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  |          def replacer(match):
 | 
	
		
			
				|  |  |              key = match.group(1)
 | 
	
		
			
				|  |  |              value = inputs.get(key, match.group(0))  # return original matched string if key not found
 | 
	
	
		
			
				|  | @@ -59,4 +105,13 @@ class VariableTemplateParser:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @classmethod
 | 
	
		
			
				|  |  |      def remove_template_variables(cls, text: str):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        Removes the template variables from the given text.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Args:
 | 
	
		
			
				|  |  | +            text: The text from which to remove the template variables.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Returns:
 | 
	
		
			
				|  |  | +            The text with template variables removed.
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  |          return re.sub(REGEX, r'{\1}', text)
 |