| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 
							- #
 - #  Copyright 2025 The InfiniFlow Authors. All Rights Reserved.
 - #
 - #  Licensed under the Apache License, Version 2.0 (the "License");
 - #  you may not use this file except in compliance with the License.
 - #  You may obtain a copy of the License at
 - #
 - #      http://www.apache.org/licenses/LICENSE-2.0
 - #
 - #  Unless required by applicable law or agreed to in writing, software
 - #  distributed under the License is distributed on an "AS IS" BASIS,
 - #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 - #  See the License for the specific language governing permissions and
 - #  limitations under the License.
 - #
 - import os
 - import re
 - from abc import ABC
 - from jinja2 import Template as Jinja2Template
 - from agent.component.base import ComponentParamBase
 - from api.utils.api_utils import timeout
 - from .message import Message
 - 
 - 
 - class StringTransformParam(ComponentParamBase):
 -     """
 -     Define the code sandbox component parameters.
 -     """
 - 
 -     def __init__(self):
 -         super().__init__()
 -         self.method = "split"
 -         self.script = ""
 -         self.split_ref = ""
 -         self.delimiters = [","]
 -         self.outputs = {"result": {"value": "", "type": "string"}}
 - 
 -     def check(self):
 -         self.check_valid_value(self.method, "Support method", ["split", "merge"])
 -         self.check_empty(self.delimiters, "delimiters")
 - 
 - 
 - class StringTransform(Message, ABC):
 -     component_name = "StringTransform"
 - 
 -     def get_input_form(self) -> dict[str, dict]:
 -         if self._param.method == "split":
 -             return {
 -                 "line": {
 -                     "name": "String",
 -                     "type": "line"
 -                 }
 -             }
 -         return {k: {
 -             "name": o["name"],
 -             "type": "line"
 -         } for k, o in self.get_input_elements_from_text(self._param.script).items()}
 - 
 -     @timeout(os.environ.get("COMPONENT_EXEC_TIMEOUT", 10*60))
 -     def _invoke(self, **kwargs):
 -         if self._param.method == "split":
 -             self._split(kwargs.get("line"))
 -         else:
 -             self._merge(kwargs)
 - 
 -     def _split(self, line:str|None = None):
 -         var = self._canvas.get_variable_value(self._param.split_ref) if not line else line
 -         if not var:
 -             var = ""
 -         assert isinstance(var, str), "The input variable is not a string: {}".format(type(var))
 -         self.set_input_value(self._param.split_ref, var)
 -         res = []
 -         for i,s in enumerate(re.split(r"(%s)"%("|".join([re.escape(d) for d in self._param.delimiters])), var, flags=re.DOTALL)):
 -             if i % 2 == 1:
 -                 continue
 -             res.append(s)
 -         self.set_output("result", res)
 - 
 -     def _merge(self, kwargs:dict[str, str] = {}):
 -         script = self._param.script
 -         script, kwargs = self.get_kwargs(script, kwargs, self._param.delimiters[0])
 - 
 -         if self._is_jinjia2(script):
 -             template = Jinja2Template(script)
 -             try:
 -                 script = template.render(kwargs)
 -             except Exception:
 -                 pass
 - 
 -         for k,v in kwargs.items():
 -             if not v:
 -                 v = ""
 -             script = re.sub(k, v, script)
 - 
 -         self.set_output("result", script)
 - 
 - 
 
 
  |