from langflow.custom import Component from langflow.helpers.data import data_to_text, data_to_text_list from langflow.io import DataInput, MultilineInput, Output, StrInput from langflow.schema import Data from langflow.schema.message import Message class ParseDataComponent(Component): display_name = "Parse Data" description = "Convert Data into plain text following a specified template." icon = "braces" name = "ParseData" inputs = [ DataInput(name="data", display_name="Data", info="The data to convert to text.", is_list=True), MultilineInput( name="template", display_name="Template", info="The template to use for formatting the data. " "It can contain the keys {text}, {data} or any other key in the Data.", value="{text}", ), StrInput(name="sep", display_name="Separator", advanced=True, value="\n"), ] outputs = [ Output( display_name="Text", name="text", info="Data as a single Message, with each input Data separated by Separator", method="parse_data", ), Output( display_name="Data List", name="data_list", info="Data as a list of new Data, each having `text` formatted by Template", method="parse_data_as_list", ), ] def _clean_args(self) -> tuple[list[Data], str, str]: data = self.data if isinstance(self.data, list) else [self.data] template = self.template sep = self.sep return data, template, sep def parse_data(self) -> Message: data, template, sep = self._clean_args() result_string = data_to_text(template, data, sep) self.status = result_string return Message(text=result_string) def parse_data_as_list(self) -> list[Data]: data, template, _ = self._clean_args() text_list, data_list = data_to_text_list(template, data) for item, text in zip(data_list, text_list, strict=True): item.set_text(text) self.status = data_list return data_list