§
    šŠtjï=  ã                   óŠ   — d dl Z d dlmZmZmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ  G d„ d	e¦  «        ZdS )
é    N)ÚAnyÚAsyncIteratorÚIteratorÚListÚOptionalÚSetÚUnion)Úurlparse)ÚBeautifulSoup)ÚDocument)Ú
BaseLoader)ÚWebBaseLoaderc                   ó  — e Zd ZdZ	 	 	 	 	 d%dddœdeded	ee         d
edededee         deee                  fd„Zdedefd„Z		 d&de
e         dededefd„Zdeee
e         f         defd„Zdedefd„Zdede
e         fd„Z	 d'dedee         dee         de
e         fd„Z	 d'ded	edee         dee         de
e         f
d„Zdee         fd „Zdee         fd!„Z	 d'ded"ee         dee         fd#„Zdede
e         fd$„ZdS )(ÚGitbookLoadera   Load `GitBook` data.

    1. load from either a single page, or
    2. load all (relative) paths in the sitemap, handling nested sitemap indexes.

    When `load_all_paths=True`, the loader parses XML sitemaps and requires the
    `lxml` package to be installed (`pip install lxml`).
    FNÚmainT)Úsitemap_urlÚallowed_domainsÚweb_pageÚload_all_pathsÚbase_urlÚcontent_selectorÚcontinue_on_failureÚshow_progressr   r   c                óº  — |p|| _         | j                              d¦  «        r| j         dd…         | _         || _        || _        || _        || _        || _        || _        | j        €t          |¦  «        j	        }	|	r|	h| _        |r|p	| j         › d�| _
        n|| _
        |                      | j
        ¦  «        st          d| j
        › d| j        › �¦  «        ‚dS )aT  Initialize with web page and whether to load all paths.

        Args:
            web_page: The web page to load or the starting point from where
                relative paths are discovered.
            load_all_paths: If set to True, all relative paths in the navbar
                are loaded instead of only `web_page`. Requires `lxml` package.
            base_url: If `load_all_paths` is True, the relative paths are
                appended to this base url. Defaults to `web_page`.
            content_selector: The CSS selector for the content to load.
                Defaults to "main".
            continue_on_failure: whether to continue loading the sitemap if an error
                occurs loading a url, emitting a warning instead of raising an
                exception. Setting this to True makes the loader more robust, but also
                may result in missing data. Default: False
            show_progress: whether to show a progress bar while loading. Default: True
            sitemap_url: Custom sitemap URL to use when load_all_paths is True.
                Defaults to "{base_url}/sitemap.xml".
            allowed_domains: Optional set of allowed domains to fetch from.
                If None (default), the loader will restrict crawling to the domain
                of the `web_page` URL to prevent potential SSRF vulnerabilities.
                Provide an explicit set (e.g., {"example.com", "docs.example.com"})
                to allow crawling across multiple domains. Use with caution in
                server environments where users might control the input URLs.
        ú/Néÿÿÿÿz/sitemap.xmlz
Domain in z% is not in the allowed domains list: )r   Úendswithr   r   r   r   r   r   r
   ÚnetlocÚ	start_urlÚ_is_url_allowedÚ
ValueError)
Úselfr   r   r   r   r   r   r   r   Úinitial_domains
             új/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/gitbook.pyÚ__init__zGitbookLoader.__init__   s  € ðJ !Ð, HˆŒØŒ=×!Ò! #Ñ&Ô&ð 	/Ø œM¨#¨2¨#Ô.ˆDŒMà ˆŒØ,ˆÔØ 0ˆÔØ#6ˆÔ Ø*ˆÔØ.ˆÔð ÔÐ'Ý% hÑ/Ô/Ô6ˆNØð 8Ø(6Ð'7�Ô$ð ð 	&Ø(ÐJ¨t¬}Ð,JÐ,JÐ,JˆDŒNˆNà%ˆDŒNð ×#Ò# D¤NÑ3Ô3ð 	Ýð*˜Tœ^ð *ð *ØÔ'ð*ð *ñô ð ð	ð 	ó    ÚurlÚreturnc                 óš   — | j         €dS 	 t          |¦  «        }|j        dvrdS |j        sdS |j        | j         v S # t          $ r Y dS w xY w)z0Check if a URL has an allowed scheme and domain.NF)ÚhttpÚhttps)r   r
   Úschemer   Ú	Exception)r"   r'   Úparseds      r$   r    zGitbookLoader._is_url_allowedY   sz   € ð
 ÔÐ'Ø�5ð	Ý˜c‘]”]ˆFð Œ}Ð$5Ð5Ð5Ø�uð ”=ð Ø�uØ”= DÔ$8Ð8Ð8øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‹< ¥< ®< ¼
A
Á	A
ÚURLÚurl_listÚurl_typec                 ó’   — |                       |¦  «        r|                     |¦  «         dS t          j        d|› d|› �¦  «         dS )aB  Safely add a URL to a list if it's from an allowed domain.

        Args:
            url_list: The list to add the URL to
            url: The URL to add
            url_type: Type of URL for warning message (e.g., "sitemap", "content")

        Returns:
            bool: True if URL was added, False if skipped
        TzSkipping disallowed z URL: F)r    ÚappendÚwarningsÚwarn)r"   r0   r'   r1   s       r$   Ú_safe_add_urlzGitbookLoader._safe_add_urlp   sW   € ð ×Ò Ñ$Ô$ð 	Ø�OŠO˜CÑ Ô Ð Ø�4åŒMÐF°ÐFÐFÀÐFÐFÑGÔGÐGØ�5r&   Úurl_or_urlsc                 ó:   — t          || j        | j        ¬¦  «        S )zŒCreate a new WebBaseLoader instance for the given URL(s).

        This ensures each operation gets its own isolated WebBaseLoader.
        )Úweb_pathr   r   )r   r   r   )r"   r7   s     r$   Ú_create_web_loaderz GitbookLoader._create_web_loader„   s*   € õ
 Ø Ø $Ô 8ØÔ,ð
ñ 
ô 
ð 	
r&   Úsoupc                 ó0   — |                      d¦  «        duS )z+Check if the soup contains a sitemap index.ÚsitemapindexN)Úfind)r"   r;   s     r$   Ú_is_sitemap_indexzGitbookLoader._is_sitemap_index�   s   € à�yŠy˜Ñ(Ô(°Ð4Ð4r&   c                 ó²   — |                      d¦  «        }g }|D ]<}|                     d¦  «        }|r#|j        r|                      ||j        d¦  «         Œ=|S )z*Extract sitemap URLs from a sitemap index.ÚsitemapÚloc)Úfind_allr>   Útextr6   )r"   r;   Úsitemap_tagsÚurlsrA   rB   s         r$   Ú_extract_sitemap_urlsz#GitbookLoader._extract_sitemap_urls“   si   € à—}’} YÑ/Ô/ˆØˆØ#ð 	>ð 	>ˆGØ—,’,˜uÑ%Ô%ˆCØð >�s”xð >Ø×"Ò" 4¨¬°9Ñ=Ô=Ð=øØˆr&   Úprocessed_urlsÚ
web_loaderc                 óR  — |€|                       | j        ¦  «        }|                      |¦  «        râ|                      |¦  «        }g }|D ]Æ}||v rt	          j        d|› �¦  «         Œ|                     |¦  «         	 |j        }|g|_        |                     d¬¦  «        }||_        |  	                    |||¦  «        }	| 
                    |	¦  «         Œ�# t          $ r-}
| j        rt	          j        d|› d|
› �¦  «         n‚ Y d}
~
Œ¿d}
~
ww xY w|S |                      |¦  «        S )aO  Process a sitemap, handling both direct content URLs and sitemap indexes.

        Args:
            soup: The BeautifulSoup object of the sitemap
            processed_urls: Set of already processed URLs to avoid cycles
            web_loader: WebBaseLoader instance to reuse for all requests,
                created if None
        Nz(Skipping already processed sitemap URL: úlxml-xml©ÚparserúError processing sitemap ú: )r:   r   r?   rG   r4   r5   ÚaddÚ	web_pathsÚscrapeÚ_process_sitemapÚextendr-   r   Ú
_get_paths)r"   r;   rH   rI   Úsitemap_urlsÚall_content_urlsr   Úoriginal_web_pathsÚsitemap_soupÚcontent_urlsÚes              r$   rS   zGitbookLoader._process_sitemap�   s“  € ð ÐØ×0Ò0°´Ñ@Ô@ˆJð ×!Ò! $Ñ'Ô'ð &	)Ø×5Ò5°dÑ;Ô;ˆLØ!Ðà+ð ð �Ø .Ð0Ð0Ý”MØPÀ;ÐPÐPñô ð ð à×"Ò" ;Ñ/Ô/Ð/ðà)3Ô)=Ð&Ø,7¨=�JÔ(ð $.×#4Ò#4¸JÐ#4Ñ#GÔ#G�Lð ,>�JÔ(ð $(×#8Ò#8Ø$ n°jñ$ô $�Lð %×+Ò+¨LÑ9Ô9Ð9Ð9øÝ ð ð ð ØÔ/ð Ý œÐ&TÀ+Ð&TÐ&TÐQRÐ&TÐ&TÑUÔUÐUÐUàð VÐUÐUÐUÐUøøøøðøøøð $Ð#ð —?’? 4Ñ(Ô(Ð(s   Á?ACÃ
DÃ"#D
Ä
Dc              ƒ   ó€  ‡K  — |€|                       | j        ¦  «        }|                      |¦  «        rö|                      |¦  «        }g }ˆfd„|D ¦   «         }|sg S |j        }||_        |                     |d¬¦  «        ƒ d{V —†}	||_        t          ||	¦  «        D ]ˆ\  }
}‰                     |
¦  «         	 |                      ||‰|¦  «        ƒ d{V —†}| 	                    |¦  «         ŒO# t          $ r-}| j        rt          j        d|
› d|› �¦  «         n‚ Y d}~Œ�d}~ww xY w|S |                      |¦  «        S )a^  Async version of _process_sitemap.

        Args:
            soup: The BeautifulSoup object of the sitemap
            base_url: The base URL for relative paths
            processed_urls: Set of already processed URLs to avoid cycles
            web_loader: WebBaseLoader instance to reuse for all requests,
                created if None
        Nc                 ó   •— g | ]}|‰v¯|‘Œ	S © r^   )Ú.0r'   rH   s     €r$   ú
<listcomp>z3GitbookLoader._aprocess_sitemap.<locals>.<listcomp>ò   s#   ø€ ÐQÐQÐQ °sÀ.Ð7PÐ7P˜Ð7PÐ7PÐ7Pr&   rK   rL   rN   rO   )r:   r   r?   rG   rQ   Úascrape_allÚziprP   Ú_aprocess_sitemaprT   r-   r   r4   r5   rU   )r"   r;   r   rH   rI   rV   rW   Únew_urlsrX   Úsoupsr   rY   rZ   r[   s      `          r$   rc   zGitbookLoader._aprocess_sitemapØ   sÓ  øè è € ð" ÐØ×0Ò0°´Ñ@Ô@ˆJð ×!Ò! $Ñ'Ô'ð &	)Ø×5Ò5°dÑ;Ô;ˆLØ!Ðð RÐQÐQÐQ |ÐQÑQÔQˆHàð Ø�	ð ",Ô!5ÐØ#+ˆJÔ ð %×0Ò0°À*Ð0ÑMÔMÐMÐMÐMÐMÐMÐMˆEð $6ˆJÔ å-0°¸5Ñ-AÔ-Að ð Ñ)�˜\Ø×"Ò" ;Ñ/Ô/Ð/ð
à)-×)?Ò)?Ø$ h°À
ñ*ô *ð $ð $ð $ð $ð $ð $�Lð %×+Ò+¨LÑ9Ô9Ð9Ð9øÝ ð ð ð ØÔ/ð Ý œÐ&TÀ+Ð&TÐ&TÐQRÐ&TÐ&TÑUÔUÐUÐUàð VÐUÐUÐUÐUøøøøðøøøð $Ð#ð —?’? 4Ñ(Ô(Ð(s   Â;3C/Ã/
D&Ã9#D!Ä!D&c              #   ó¬  K  — | j         sS|                      | j        ¦  «        }|                     ¦   «         }|                      || j        ¦  «        }|r|V — dS dS |                      | j        ¦  «        }|                     d¬¦  «        }t          ¦   «         }|                      ||¦  «        }|s#| j        rt          j
        d| j        › �¦  «         g }|D ]}|                      ||d¦  «         Œ|sdS |                      |¦  «        }	|	                     |¦  «        }
t          |
|¦  «        D ]!\  }}|                      ||¦  «        }|r|V — Œ"dS )zDFetch text from one single GitBook page or recursively from sitemap.rK   rL   ú$No content URLs found in sitemap at ÚcontentN)r   r:   r   rR   Ú_get_documentr   ÚsetrS   r   r4   r5   r6   Ú
scrape_allrb   )r"   Útemp_loaderr;   ÚdocÚ	soup_inforH   Úrelative_pathsrF   r'   Úcontent_loaderÚ
soup_infoss              r$   Ú	lazy_loadzGitbookLoader.lazy_load  sŸ  è è € àÔ"ð &	à×1Ò1°$´-Ñ@Ô@ˆKØ×%Ò%Ñ'Ô'ˆDØ×$Ò$ T¨4¬=Ñ9Ô9ˆCØð Ø�	�	�	�	�	ðð ð ×1Ò1°$´.ÑAÔAˆKà#×*Ò*°*Ð*Ñ=Ô=ˆIõ (+¡u¤uˆNØ!×2Ò2°9¸nÑMÔMˆNà!ð W dÔ&8ð WÝ”ÐUÀTÄ^ÐUÐUÑVÔVÐVð !ˆDØ%ð 9ð 9�à×"Ò" 4¨¨iÑ8Ô8Ð8Ð8àð Ø�ð "×4Ò4°TÑ:Ô:ˆNð (×2Ò2°4Ñ8Ô8ˆJå"% j°$Ñ"7Ô"7ð ð ‘�	˜3Ø×(Ò(¨°CÑ8Ô8�Øð Ø�I�I�Iøðð r&   c                ó(  K  — | j         si|                      | j        ¦  «        }|                     | j        g¦  «        ƒ d{V —†}|d         }|                      || j        ¦  «        }|r|W V — dS dS |                      | j        ¦  «        }|                     | j        gd¬¦  «        ƒ d{V —†}|d         }t          ¦   «         }|                      || j        |¦  «        ƒ d{V —†}|s#| j	        rt          j        d| j        › �¦  «         g }|D ]}|                      ||d¦  «         Œ|sdS |                      |¦  «        }	|	                     |¦  «        ƒ d{V —†}
t          |
|¦  «        D ]"\  }}|                      ||¦  «        }|�|W V — Œ#dS )z/Asynchronously fetch text from GitBook page(s).Nr   rK   rL   rg   rh   )r   r:   r   ra   ri   r   rj   rc   r   r   r4   r5   r6   rb   )r"   rl   re   rn   rm   rH   ro   rF   r'   rp   rq   Ú	maybe_docs               r$   Ú
alazy_loadzGitbookLoader.alazy_load?  s  è è € àÔ"ð *	$à×1Ò1°$´-Ñ@Ô@ˆKØ%×1Ò1°4´=°/ÑBÔBÐBÐBÐBÐBÐBÐBˆEØ˜aœˆIØ×$Ò$ Y°´Ñ>Ô>ˆCØð Ø�	�	�	�	�	�	ðð ð ×1Ò1°$´.ÑAÔAˆKà%×1Ò1°4´>Ð2BÈ:Ð1ÑVÔVÐVÐVÐVÐVÐVÐVˆEØ˜aœˆIõ (+¡u¤uˆNØ#'×#9Ò#9Ø˜4œ=¨.ñ$ô $ð ð ð ð ð ð ˆNð "ð W dÔ&8ð WÝ”ÐUÀTÄ^ÐUÐUÑVÔVÐVð !ˆDØ%ð 9ð 9�à×"Ò" 4¨¨iÑ8Ô8Ð8Ð8àð Ø�ð "×4Ò4°TÑ:Ô:ˆNð  .×9Ò9¸$Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ˆJå"% j°$Ñ"7Ô"7ð $ð $‘�	˜3Ø ×.Ò.¨y¸#Ñ>Ô>�	ØÐ(Ø#�O�O�O�Oøð$ð $r&   Ú
custom_urlc                 ó  — |                      | j        ¦  «        }|sdS |                     d¬¦  «                             ¦   «         }|                      d¦  «        }|r|j        nd}|p| j        |dœ}t          ||¬¦  «        S )z,Fetch content from page and return Document.Nú
)Ú	separatorÚh1Ú )ÚsourceÚtitle)Úpage_contentÚmetadata)r>   r   Úget_textÚstriprD   r   r   )r"   r;   rv   Úpage_content_rawrh   Útitle_if_existsr}   r   s           r$   ri   zGitbookLoader._get_documentm  s”   € ð  Ÿ9š9 TÔ%:Ñ;Ô;ÐØð 	Ø�4Ø"×+Ò+°dÐ+Ñ;Ô;×AÒAÑCÔCˆØ*×/Ò/°Ñ5Ô5ˆØ(7Ð?�Ô$Ð$¸RˆØ(Ð9¨D¬MÀEÐJÐJˆÝ W°xÐ@Ñ@Ô@Ð@r&   c                 ó|   — g }|                      d¦  «        D ]#}|j        r|                     |j        ¦  «         Œ$|S )zFetch all URLs in the sitemap.rB   )rC   rD   r3   )r"   r;   rF   rB   s       r$   rU   zGitbookLoader._get_pathsz  sH   € àˆØ—=’= Ñ'Ô'ð 	&ð 	&ˆCØŒxð &ð —’˜CœHÑ%Ô%Ð%øØˆr&   )FNr   FT)r/   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚboolr   r   r%   r    r   r6   r	   r   r:   r   r?   rG   rS   rc   r   r   rr   r   ru   r   ri   rU   r^   r&   r$   r   r      s  € € € € € ðð ð  %Ø"&Ø &Ø$)Ø"ðAð &*Ø.2ðAð Að AàðAð ðAð ˜3”-ð	Að
 ðAð "ðAð ðAð ˜c”]ðAð " # c¤(Ô+ðAð Að Að AðF 3ð ¨4ð ð ð ð ð0 >Cðð Ø˜Sœ	ðØ(+ðØ7:ðà	ðð ð ð ð(	
¨e°C¸¸c¼°NÔ.Cð 	
Èð 	
ð 	
ð 	
ð 	
ð5 mð 5¸ð 5ð 5ð 5ð 5ð¨-ð ¸DÀ¼Ið ð ð ð ð /3ð	9)ð 9)àð9)ð ˜Cœð9)ð ˜]Ô+ð	9)ð
 
ˆcŒð9)ð 9)ð 9)ð 9)ð@ /3ð;)ð ;)àð;)ð ð;)ð ˜Cœð	;)ð
 ˜]Ô+ð;)ð 
ˆcŒð;)ð ;)ð ;)ð ;)ðz(˜8 HÔ-ð (ð (ð (ð (ðT,$ -°Ô"9ð ,$ð ,$ð ,$ð ,$ð^ 6:ðAð AØðAØ%-¨c¤]ðAà	�(Ô	ðAð Að Að Að˜sð  t¨C¤yð ð ð ð ð ð r&   r   )r4   Útypingr   r   r   r   r   r   r	   Úurllib.parser
   Úbs4r   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser   Ú-langchain_community.document_loaders.web_baser   r   r^   r&   r$   ú<module>r‘      sÜ   ðØ €€€Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @Ø GÐ GÐ GÐ GÐ GÐ Gðvð vð vð vð v�Jñ vô vð vð vð vr&   