GnMi'`dZddlZddlZddlmZddlmZmZmZddl m Z m Z m Z GddZ y) zCSplitter module for extracting files from aggregated markdown file.N)Path)CallableOptionalDict)InvalidFileErrorFileOperationError ParseErrorc veZdZdZdZdZ d dededeee egdfde ee ffd Z de d ed ede ee ffd Zy)Splitterz9Splits an aggregated file back into individual .md files.z^--- FILE: (.+) ---$cy)zInitialize the Splitter.N)selfs :/mnt/ssd/data/python-lab/ObsidianTool/src/core/splitter.py__init__zSplitter.__init__s Naggregated_file output_dirprogress_callbackreturnc Vt|}t|}|jstd||jstd| |j dd d}t}d} g} t|dd 5} td t|dd D} d} | D]}| d z } |r(| d zdk(r t| | z d z}||d| d| tj|j|j}|rL| r6|j|| | }|dr|d z }|dr|j!|d|j#d } g} | | j%|| r6|j|| | }|dr|d z }|dr|j!|dddd|r |d d|dk(r t'd|t)|||dS#t $r}t d|d}~wwxYw#1swYSxYw#t&$rt $r}t d|d}~wwxYw)a, Split an aggregated file into individual .md files. Args: aggregated_file: Path to aggregated file output_dir: Directory to extract files to progress_callback: Optional callback function(percentage, message) Returns: Dictionary with statistics (files_created, directories_created, etc.) Raises: InvalidFileError: If aggregated file doesn't exist ParseError: If file format is invalid FileOperationError: If file operations fail z Aggregated file does not exist: zPath is not a file: Tparentsexist_okz#Failed to create output directory: Nrrutf-8encodingc3 K|]}dyw)rNr).0_s r z!Splitter.split..@s!S!!Ss rdz Parsing line /created dir_createdzSplit completez1No valid file separators found in aggregated file) files_createddirectories_createdrrzFailed to split file: )rexistsris_filemkdir Exceptionr setopensumintrematchSEPARATOR_PATTERNstrip _write_fileaddgroupappendr len)rrrragg_pathout_pather'r( current_filecurrent_contentf total_lines line_numberline percentager2results rsplitzSplitter.splits,( # "%EoEV#WX X!"%9/9J#KL L P NN4$N 7 ? CM"%% L Ohg6& G!!!ST(C'-R!SS  9D1$K)[3->!-C%(+ *Cs)J%K )* k]RST_S`6abHHT%;%;TZZ\JE'%)%5%5h o%^F%i0 - 2 %m4 3 7 7}8M N(-{{1~ *,(3+224859: !--h oVFi(%* m,+//}0EFM& GR!!#'78! !TUU"/'*+>'?#2(  s P$'J1#%NO O P& G& Gl   C$'=aS%AB B CsPG(HCG7A G7%2H G4!G//G47H<HH(H##H( relative_path content_linesc ||z }d}|jjs2|jjddt|j}dj |}|j d}|r|dz }|j |dd|t|dS#t$r}td |d |d}~wwxYw) as Write a file to the output directory. Args: output_dir: Base output directory relative_path: Relative path for the file content_lines: List of content lines Returns: Dictionary with created status and directory created Raises: FileOperationError: If file write fails NTr rr)r%r& file_pathzFailed to write file z: ) parentr)r+strjoinrstrip write_textr,r )rrrFrGrKr&contentr<s rr5zSplitter._write_filezs( S"]2IK##**,  &&td&C!)"2"23 ggm,GnnT*G4  7 ; * ^   S$'<]O2aS%QR R SsBB B?)B::B?)N)__name__ __module__ __qualname____doc__r3rrMrrr0ranyrErlistr5rrrr r sC/ CG eCeCeC$Hc3Z-=$>? eC c3h eCN/S/S/S /S c3h /Srr )rUr1ospathlibrtypingrrr exceptionsrr r r rrrr\s+I ++HH_S_Sr