@@ -54,3 +54,70 @@ def _process_block_and_children(
5454    if  hasattr (block , "children" ) and  block .children :
5555        for  child  in  block .children :
5656            _process_block_and_children (child , block_map )
57+ 
58+ 
59+ def  replace_urls (
60+     input_obj : Page  |  BlockBase  |  list [BlockBase ],
61+     url_replace_map : dict [str , str ],
62+ ) ->  None :
63+     """ 
64+     Recursively processes all blocks in the input object and replaces any file or image URLs 
65+     that are found in the url_replace_map with their corresponding values. 
66+ 
67+     Args: 
68+         input_obj: Can be either a Page object, a single Block object, or a list of Block objects 
69+         url_replace_map: A dictionary mapping original URLs to their replacement URLs 
70+     """ 
71+     # Extract all blocks 
72+     blocks  =  extract_blocks (input_obj )
73+ 
74+     # Process each block 
75+     for  block_id , block  in  blocks .items ():
76+         _replace_url_in_block (block , url_replace_map )
77+ 
78+ 
79+ def  _replace_url_in_container (container , container_type , url_replace_map ):
80+     """ 
81+     Helper function to replace URL in a file or external container. 
82+ 
83+     Args: 
84+         container: The container object that might have URL information 
85+         container_type: The type of container ('file' or 'external') 
86+         url_replace_map: Dictionary mapping original URLs to replacement URLs 
87+     """ 
88+     if  not  hasattr (container , container_type ):
89+         return 
90+ 
91+     url_container  =  getattr (container , container_type )
92+     if  hasattr (url_container , "url" ):
93+         current_url  =  getattr (url_container , "url" )
94+         if  current_url  in  url_replace_map :
95+             setattr (url_container , "url" , url_replace_map [current_url ])
96+ 
97+ 
98+ def  _replace_url_in_block (block : BlockBase , url_replace_map : dict [str , str ]) ->  None :
99+     """ 
100+     Helper function to replace URLs in a specific block based on the url_replace_map. 
101+ 
102+     Args: 
103+         block: The block to process 
104+         url_replace_map: A dictionary mapping original URLs to their replacement URLs 
105+     """ 
106+     if  not  hasattr (block , "type" ):
107+         return 
108+ 
109+     block_type  =  getattr (block , "type" )
110+ 
111+     # Check for image block 
112+     if  block_type  ==  "image"  and  hasattr (block , "image" ):
113+         image  =  getattr (block , "image" )
114+         if  hasattr (image , "type" ):
115+             image_type  =  getattr (image , "type" )
116+             _replace_url_in_container (image , image_type , url_replace_map )
117+ 
118+     # Check for file block 
119+     elif  block_type  ==  "file"  and  hasattr (block , "file" ):
120+         file_block  =  getattr (block , "file" )
121+         if  hasattr (file_block , "type" ):
122+             file_type  =  getattr (file_block , "type" )
123+             _replace_url_in_container (file_block , file_type , url_replace_map )
0 commit comments