
    j
i                     F    d Z ddlZddlmZ ddlmZ  G d de          ZdS )z#JavaScript framework text splitter.    N)Any)RecursiveCharacterTextSplitterc                   n     e Zd ZdZ	 	 	 ddee         dz  dededed	df
 fd
Zded	ee         fdZ	 xZ
S )JSFrameworkTextSplitterat  Text splitter that handles React (JSX), Vue, and Svelte code.

    This splitter extends `RecursiveCharacterTextSplitter` to handle React (JSX), Vue,
    and Svelte code by:

    1. Detecting and extracting custom component tags from the text
    2. Using those tags as additional separators along with standard JS syntax

    The splitter combines:

    * Custom component tags as separators (e.g. `<Component`, `<div`)
    * JavaScript syntax elements (function, const, if, etc)
    * Standard text splitting on newlines

    This allows chunks to break at natural boundaries in React, Vue, and Svelte
    component code.
    N  r   
separators
chunk_sizechunk_overlapkwargsreturnc                 R     t                      j        d||d| |pg | _        dS )aG  Initialize the JS Framework text splitter.

        Args:
            separators: Optional list of custom separator strings to use
            chunk_size: Maximum size of chunks to return
            chunk_overlap: Overlap in characters between chunks
            **kwargs: Additional arguments to pass to parent class
        )r	   r
   N )super__init___separators)selfr   r	   r
   r   	__class__s        C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_text_splitters/jsx.pyr   z JSFrameworkTextSplitter.__init__   s<     	VJmVVvVVV%+    textc                     t          j        d|          }g }|D ]}||vr|                    |           d |D             }g d}| j        |z   |z   g dz   }|                     ||          S )a  Split text into chunks.

        This method splits the text into chunks by:

        * Extracting unique opening component tags using regex
        * Creating separators list with extracted tags and JS separators
        * Splitting the text using the separators by calling the parent class method

        Args:
            text: String containing code to split

        Returns:
            List of text chunks split on component and JS boundaries
        z<\s*([a-zA-Z0-9]+)[^>]*>c                     g | ]}d | S )<r   ).0tags     r   
<listcomp>z6JSFrameworkTextSplitter.split_text.<locals>.<listcomp>E   s    DDDc	C		DDDr   )z
export z export z

function z
async function z async function z
const z
let z
var z
class z class z
if z if z
for z for z
while z while z
switch z switch z
case z case z	
default z	 default )z<>z

z&&
z||
)refindallappendr   _split_text)r   r   opening_tagscomponent_tagsr   component_separatorsjs_separatorsr   s           r   
split_textz"JSFrameworkTextSplitter.split_text.   s    " z"=tDD 	+ 	+C.((%%c***DD^DDD
 
 
< "# -,,- 	 j111r   )Nr   r   )__name__
__module____qualname____doc__liststrintr   r   r%   __classcell__)r   s   @r   r   r   	   s         ( (,	, ,I$, , 	,
 , 
, , , , , ,$<2s <2tCy <2 <2 <2 <2 <2 <2 <2 <2r   r   )r)   r   typingr   langchain_text_splittersr   r   r   r   r   <module>r0      sw    ) ) 				       C C C C C Ca2 a2 a2 a2 a2< a2 a2 a2 a2 a2r   