Nodes/ComfyUI_EmAySee_CustomNodes/EmAySee Text Combiner
ComfyUI Node

EmAySee Text Combiner

Join up to 50 strings with newlines before they hit your prompt encoder

By EmAySee·Created about a year ago·Updated 5 months ago· 3
EmAySee Text Combiner
    • text
    ◄text_1—►
    ◄text_2—►
    ◄text_3—►
    ◄text_4—►
    ◄text_5—►
    ◄text_6—►
    ◄text_7—►
    ◄text_8—►
    ◄text_9—►
    ◄text_10—►
    ◄text_11—►
    ◄text_12—►
    ◄text_13—►
    ◄text_14—►
    ◄text_15—►
    ◄text_16—►
    ◄text_17—►
    ◄text_18—►
    ◄text_19—►
    ◄text_20—►
    ◄text_21—►
    ◄text_22—►
    ◄text_23—►
    ◄text_24—►
    ◄text_25—►
    ◄text_26—►
    ◄text_27—►
    ◄text_28—►
    ◄text_29—►
    ◄text_30—►
    ◄text_31—►
    ◄text_32—►
    ◄text_33—►
    ◄text_34—►
    ◄text_35—►
    ◄text_36—►
    ◄text_37—►
    ◄text_38—►
    ◄text_39—►
    ◄text_40—►
    ◄text_41—►
    ◄text_42—►
    ◄text_43—►
    ◄text_44—►
    ◄text_45—►
    ◄text_46—►
    ◄text_47—►
    ◄text_48—►
    ◄text_49—►
    ◄text_50—►

    ComfyUI workflows have a habit of growing string sources like weeds: a wildcard picker, an LLM output, a fixed style block, a tag list, a negative-prompt section. At some point they all need to land in the same CLIP Text Encode, and a single STRING input takes one string. EmAySee Text Combiner is the gather node for that job: up to fifty optional string inputs, joined with newlines, one string out. It's the "collect all the prompt parts" node in this pack, and for prompt-assembly workflows it's genuinely the right tool.

    The fifty-cap matters more than it sounds like it should. Most text-combiner nodes top out around five or ten inputs; this one lets you wire a whole prompt architecture - subject, style, quality tags, lighting, camera, artist block, negative section - without stringing multiple combiners in series. Newlines are the separator (not commas, not spaces), so it suits multi-line prompt styles. If you want commas, join first with the pack's Text Replace or do it in a different combiner.

    How it works

    Every one of text_1 through text_50 is optional and force-input (you can't type into them - they're meant to be wired). The node walks them in order, skips any that are None or empty, and joins the rest with "\n":

    return ("\n".join(text_list),)
    

    That's the entire mechanism. Order is preserved, empty inputs are silently dropped, and the output is a single text string.

    The inputs that matter

    Honestly, none of them are special - they're all "text_N" and they all behave identically. What matters is the discipline you bring: keep a convention for which slot does what (slots 1-5 for subject blocks, 6-10 for style, etc.) so a workflow stays readable. The output, text, wires into your CLIP Text Encode's prompt input, or into another text node upstream of it.

    One thing to know: because every input is forceInput, you can't use this node to hand-type a fixed string into a slot. If you want to include a constant block, pipe it through a simple text node first - which, in this pack, means running a string literal through any string passthrough or the Text Replace node with empty find/replace pairs.

    Installing it

    Standard for this pack: ComfyUI_EmAySee_CustomNodes via ComfyUI Manager, or git clone https://github.com/EmAySee/ComfyUI_EmAySee_CustomNodes into custom_nodes/, restart. No dependencies, no models - pure string joining.

    Where people get burned

    The newline separator is the main gotcha: if your downstream expects comma-separated tags, this node will hand you newline-separated output, which some tag consumers choke on. Route through a join/transform node if you need commas. Also, fifty inputs is a lot of widget noise on the graph - for most workflows you'll use five or six slots and leave the rest empty, and empties are skipped, so that's fine. But a stray space or line-break in a single input will land in the middle of your joined prompt, so keep your source strings clean upstream. If your combiner output starts with a blank line, check for a source node that outputs whitespace.

    CategoryEmAySee/Text

    Inputs (50)

    NameTypeDefaultDescription
    text_1optSTRING—
    text_2optSTRING—
    text_3optSTRING—
    text_4optSTRING—
    text_5optSTRING—
    text_6optSTRING—
    text_7optSTRING—
    text_8optSTRING—
    text_9optSTRING—
    text_10optSTRING—
    text_11optSTRING—
    text_12optSTRING—
    text_13optSTRING—
    text_14optSTRING—
    text_15optSTRING—
    text_16optSTRING—
    text_17optSTRING—
    text_18optSTRING—
    text_19optSTRING—
    text_20optSTRING—
    text_21optSTRING—
    text_22optSTRING—
    text_23optSTRING—
    text_24optSTRING—
    text_25optSTRING—
    text_26optSTRING—
    text_27optSTRING—
    text_28optSTRING—
    text_29optSTRING—
    text_30optSTRING—
    text_31optSTRING—
    text_32optSTRING—
    text_33optSTRING—
    text_34optSTRING—
    text_35optSTRING—
    text_36optSTRING—
    text_37optSTRING—
    text_38optSTRING—
    text_39optSTRING—
    text_40optSTRING—
    text_41optSTRING—
    text_42optSTRING—
    text_43optSTRING—
    text_44optSTRING—
    text_45optSTRING—
    text_46optSTRING—
    text_47optSTRING—
    text_48optSTRING—
    text_49optSTRING—
    text_50optSTRING—

    Outputs (1)

    NameTypeDescription
    textSTRING—