§
    šŠtjó#  ã                   ó¢   — d dl Z d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ  e j        e¦  «        ZdZ G d„ d	e¦  «        ZdS )
é    N)ÚBytesIO)ÚListÚOptionalÚSequence)ÚElementTree)ÚDocument)Ú
BaseLoaderé@   c                   ór  — e Zd ZdZ	 d ddœdededee         defd	„Z	 	 	 	 	 	 d!dee	e                  dee	e                  dee         dededede	e
         fd„Zdedede	e         dd
fd„Zdee         dedede	e
         fd„Zdedededee
         fd„Zdedefd„Zdedefd„Zededefd„¦   «         Zd
S )"Ú
QuipLoaderz_Load `Quip` pages.

    Port of https://github.com/quip/quip-api/tree/master/samples/baqup
    é<   F)Úallow_dangerous_xml_parsingÚapi_urlÚaccess_tokenÚrequest_timeoutr   c                ó˜   — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w ||||¬¦  «        | _        |st	          d¦  «        ‚dS )a•  
        Args:
            api_url: https://platform.quip.com
            access_token: token of access quip API. Please refer:
                https://quip.com/dev/automation/documentation/current#section/Authentication/Get-Access-to-Quip's-APIs
            request_timeout: timeout of request, default 60s.
            allow_dangerous_xml_parsing: Allow dangerous XML parsing, defaults to False
        r   )Ú
QuipClientz?`quip_api` package not found, please run `pip install quip_api`)r   Úbase_urlr   ac  The quip client uses the built-in XML parser which may causesecurity issues when parsing XML data in some cases. Please see https://docs.python.org/3/library/xml.html#xml-vulnerabilities For more information, set `allow_dangerous_xml_parsing` as True if you are sure that your distribution of the standard library is not vulnerable to XML vulnerabilities.N)Úquip_api.quipr   ÚImportErrorÚquip_clientÚ
ValueError)Úselfr   r   r   r   r   s         úg/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/quip.pyÚ__init__zQuipLoader.__init__   s™   € ð 	Ø0Ð0Ð0Ð0Ð0Ð0Ð0øÝð 	ð 	ð 	ÝØQñô ð ð	øøøð
 &˜:Ø%°Èð
ñ 
ô 
ˆÔð +ð 		Ýð<ñô ð ð		ð 		s   ‚	 ‰#Néè  Ú
folder_idsÚ
thread_idsÚmax_docsÚinclude_all_foldersÚinclude_commentsÚinclude_imagesÚreturnc                 ó   — |s|s|st          d¦  «        ‚|pg }|r|D ]}|                      |d|¦  «         Œ|r[| j                             ¦   «         }d|v r|                      |d         d|¦  «         d|v r|                      |d         d|¦  «         t	          t          |d|…         ¦  «        ¦  «        }|                      |||¦  «        S )aA  
        Args:
            :param folder_ids: List of specific folder IDs to load, defaults to None
            :param thread_ids: List of specific thread IDs to load, defaults to None
            :param max_docs: Maximum number of docs to retrieve in total, defaults 1000
            :param include_all_folders: Include all folders that your access_token
                   can access, but doesn't include your private folder
            :param include_comments: Include comments, defaults to False
            :param include_images: Include images, defaults to False
        z_Must specify at least one among `folder_ids`, `thread_ids` or set `include_all`_folders as Truer   Úgroup_folder_idsÚshared_folder_idsN)r   Úget_thread_ids_by_folder_idr   Úget_authenticated_userÚlistÚsetÚprocess_threads)	r   r   r   r   r    r!   r"   Ú	folder_idÚusers	            r   ÚloadzQuipLoader.load=   s*  € ð& ð 	 *ð 	Ð5Hð 	Ýð7ñô ð ð
  Ð% 2ˆ
àð 	KØ'ð Kð K�	Ø×0Ò0°¸A¸zÑJÔJÐJÐJàð 		ØÔ#×:Ò:Ñ<Ô<ˆDØ! TÐ)Ð)Ø×0Ò0ØÐ+Ô,¨a°ñô ð ð # dÐ*Ð*Ø×0Ò0ØÐ,Ô-¨q°*ñô ð õ �#˜j¨¨(¨Ô3Ñ4Ô4Ñ5Ô5ˆ
Ø×#Ò# J°Ð@PÑQÔQÐQó    r,   Údepthc           	      óz  — ddl m}m} 	 | j                             |¦  «        }nŽ# |$ rV}|j        dk    rt          j        d|› d|› d|› �¦  «         n"t          j        d|› d|› d|j        › �¦  «         Y d	}~d	S d	}~w|$ r-}t          j        d|› d|› d
|j        › �¦  «         Y d	}~d	S d	}~ww xY w|d                              dd|z  ¦  «        }t          j	        d|› d|› �¦  «         |d         D ]F}	d|	v r!|  
                    |	d         |dz   |¦  «         Œ'd|	v r|                     |	d         ¦  «         ŒGd	S )z4Get thread ids by folder id and update in thread_idsr   )Ú	HTTPErrorÚ	QuipErrori“  zdepth z!, Skipped over restricted folder z, z, Skipped over folder z due to unknown error Nz due to HTTP error ÚfolderÚtitlez	Folder %sz, Processing folder Úchildrenr,   é   Ú	thread_id)r   r2   r3   r   Ú
get_folderÚcodeÚloggingÚwarningÚgetÚinfor'   Úappend)
r   r,   r0   r   r2   r3   r4   Úer5   Úchilds
             r   r'   z&QuipLoader.get_thread_ids_by_folder_idj   s  € ð 	7Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð	ØÔ%×0Ò0°Ñ;Ô;ˆFˆFøØð 
	ð 
	ð 
	ØŒv˜Š}ˆ}Ý”ØU˜UÐUÐUÀYÐUÐUÐRSÐUÐUñô ð ð õ ”ð5˜Uð 5ð 5¸)ð 5ð 5Ø,-¬Fð5ð 5ñô ð ð ˆFˆFˆFˆFˆFøøøøØð 	ð 	ð 	ÝŒOð.˜ð .ð .°ið .ð .Ø%&¤Vð.ð .ñô ð ð ˆFˆFˆFˆFˆFøøøøð	øøøð �xÔ ×$Ò$ W¨k¸IÑ.EÑFÔFˆåŒÐ@˜eÐ@Ð@¸Ð@Ð@ÑAÔAÐAØ˜JÔ'ð 	6ð 	6ˆEØ˜eÐ#Ð#Ø×0Ò0Ø˜+Ô&¨°©	°:ñô ð ð ð  Ð%Ð%Ø×!Ò! %¨Ô"4Ñ5Ô5Ð5øð	6ð 	6s!   Š% ¥B0ªAA;Á;B0Â"B+Â+B0Úinclude_messagesc                 óp   — g }|D ]0}|                       |||¦  «        }|�|                     |¦  «         Œ1|S )z2Process a list of thread into a list of documents.)Úprocess_threadr?   )r   r   r"   rB   Údocsr8   Údocs          r   r+   zQuipLoader.process_threads�   sM   € ð ˆØ#ð 	!ð 	!ˆIØ×%Ò% i°ÐAQÑRÔRˆCØˆØ—’˜CÑ Ô Ð øØˆr/   r8   c           
      ó¸  — | j                              |¦  «        }|d         d         }|d         d         }|d         d         }|d         d         }t                               |¦  «        }t                               d|› d|› d|› d	|› �¦  «         d
|v rÃ	 | j                              |d
         ¦  «        }	nJ# t          j        j	        j
        $ r.}
t                               d|› d|› d|
› �¦  «         Y d }
~
d S d }
~
ww xY w||||dœ}d}|r|                      |	¦  «        }|r|dz   |                      |¦  «        z   }t          |d
         |z   |¬¦  «        S d S )NÚthreadÚidr5   ÚlinkÚupdated_useczprocessing thread z title z link z update_ts ÚhtmlzError parsing thread ú z, skipping, )r5   Ú	update_tsrI   ÚsourceÚ z/n)Úpage_contentÚmetadata)r   Ú
get_threadr   Ú_sanitize_titleÚloggerr>   Úparse_document_htmlÚxmlÚetreeÚcElementTreeÚ
ParseErrorÚerrorÚprocess_thread_imagesÚprocess_thread_messagesr   )r   r8   r"   rB   rH   r5   rJ   rN   Úsanitized_titleÚtreer@   rR   Útexts                r   rD   zQuipLoader.process_threadš   sÒ  € ð Ô!×,Ò,¨YÑ7Ô7ˆØ˜8Ô$ TÔ*ˆ	Ø�xÔ  Ô)ˆØ�hÔ Ô'ˆØ˜8Ô$ ^Ô4ˆ	Ý$×4Ò4°UÑ;Ô;ˆå�Šð1 ð 1ð 1°?ð 1ð 1Øð1ð 1Ø%.ð1ð 1ñ	
ô 	
ð 	
ð
 �VÐÐðØÔ'×;Ò;¸FÀ6¼NÑKÔK��øÝ”9Ô)Ô4ð ð ð Ý—’ÐW°UÐWÐW¸YÐWÐWÐTUÐWÐWÑXÔXÐXØ�t�t�t�t�tøøøøðøøøð
 )Ø&ØØð	ð ˆHð ˆDØð 8Ø×1Ò1°$Ñ7Ô7�àð MØ˜d‘{ T×%AÒ%AÀ)Ñ%LÔ%LÑL�åØ# Fœ^¨dÑ2Ø!ðñ ô ð ð ˆts   Â B9 Â9D Ã#C;Ã;D r_   c                 óV  — d}	 ddl m} ddlm} n# t          $ r t          d¦  «        ‚w xY w|                     d¦  «        D ]å}|                     d¦  «        }|r|                     d¦  «        sŒ/|                     d	¦  «        \  }}}}	| j         	                    ||	¦  «        }
	 | 
                    t          |
                     ¦   «         ¦  «        ¦  «        }|d
z   |                     |¦  «        z   }Œµ# t          $ r$}t                               d|› �¦  «         |‚d }~ww xY w|S )NrP   r   )ÚImage)Úpytesseractzg`Pillow or pytesseract` package not found, please run `pip install Pillow` or `pip install pytesseract`ÚimgÚsrcz/blobú/ú
z!failed to convert image to text, )ÚPILrb   rc   r   Úiterr=   Ú
startswithÚsplitr   Úget_blobÚopenr   ÚreadÚimage_to_stringÚOSErrorrU   r[   )r   r_   r`   rb   rc   rd   re   Ú_r8   Úblob_idÚblob_responseÚimager@   s                r   r\   z QuipLoader.process_thread_imagesÆ   sn  € Øˆð	Ø!Ð!Ð!Ð!Ð!Ð!Ø/Ð/Ð/Ð/Ð/Ð/Ð/øÝð 	ð 	ð 	ÝðDñô ð ð	øøøð —9’9˜UÑ#Ô#ð 	ð 	ˆCØ—'’'˜%‘.”.ˆCØð ˜cŸnšn¨WÑ5Ô5ð ØØ'*§y¢y°¡~¤~Ñ$ˆAˆq�)˜WØ Ô,×5Ò5°iÀÑIÔIˆMðØŸ
š
¥7¨=×+=Ò+=Ñ+?Ô+?Ñ#@Ô#@ÑAÔA�Ø˜d‘{ [×%@Ò%@ÀÑ%GÔ%GÑG��øÝð ð ð Ý—’ÐDÀÐDÐDÑEÔEÐEØ�øøøøðøøøð ˆs!   „ ‘+Â(AC8Ã8
D&ÄD!Ä!D&c                 ó  — d }g }	 | j                              ||d¬¦  «        }|                     |¦  «         |r|d         d         dz
  }nnŒH|                     ¦   «          d„ |D ¦   «         }d                     |¦  «        S )	NTéd   )Úmax_created_usecÚcountéÿÿÿÿÚcreated_usecr7   c                 ó   — g | ]
}|d          ‘ŒS )r`   © )Ú.0Úmessages     r   ú
<listcomp>z6QuipLoader.process_thread_messages.<locals>.<listcomp>ï   s   € Ð9Ð9Ð9 W�˜”Ð9Ð9Ð9r/   rg   )r   Úget_messagesÚextendÚreverseÚjoin)r   r8   rw   ÚmessagesÚchunkÚtextss         r   r]   z"QuipLoader.process_thread_messagesá   s«   € ØÐØˆð	ØÔ$×1Ò1ØÐ,<ÀCð 2ñ ô ˆEð �OŠO˜EÑ"Ô"Ð"Øð Ø#(¨¤9¨^Ô#<¸qÑ#@Ð Ð àð	ð 	×ÒÑÔÐà9Ð9°Ð9Ñ9Ô9ˆà�yŠy˜ÑÔÐr/   r5   c                 ó¬   — t          j        dd| ¦  «        }t          j        dd|¦  «        }t          |¦  «        t          k    r|d t          …         }|S )Nz\srM   z(?u)[^- \w.]rP   )ÚreÚsubÚlenÚ_MAXIMUM_TITLE_LENGTH)r5   r^   s     r   rT   zQuipLoader._sanitize_titleó   sS   € åœ& ¨¨UÑ3Ô3ˆÝœ& °"°oÑFÔFˆÝˆÑÔÕ"7Ò7Ð7Ø-Ð.DÕ/DÐ.DÔEˆOØÐr/   )r   )NNr   FFF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   ÚintÚboolr   r   r   r.   r'   r   r+   rD   r   r\   r]   ÚstaticmethodrT   r|   r/   r   r   r      s/  € € € € € ðð ð *,ð	$ð -2ð$ð $ð $àð$ð ð$ð " #œð	$ð &*ð$ð $ð $ð $ðP +/Ø*.Ø"&Ø$)Ø!&Ø$ð+Rð +Rà˜T #œYÔ'ð+Rð ˜T #œYÔ'ð+Rð ˜3”-ð	+Rð
 "ð+Rð ð+Rð ð+Rð 
ˆhŒð+Rð +Rð +Rð +RðZ#6Øð#6Ø%(ð#6Ø6:¸3´ið#6à	ð#6ð #6ð #6ð #6ðJ	Ø" 3œ-ð	Ø9=ð	ØQUð	à	ˆhŒð	ð 	ð 	ð 	ð*Øð*Ø.2ð*ØFJð*à	�(Ô	ð*ð *ð *ð *ðX¨+ð ¸#ð ð ð ð ð6 °ð  ¸ð  ð  ð  ð  ð$ ð˜sð  sð ð ð ñ „\ðð ð r/   r   )r;   rˆ   Úxml.etree.cElementTreerW   Úior   Útypingr   r   r   Úxml.etree.ElementTreer   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser	   Ú	getLoggerrŒ   rU   r‹   r   r|   r/   r   ú<module>r›      sß   ðØ €€€Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø -Ð -Ð -Ð -Ð -Ð -à -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @à	ˆÔ	˜8Ñ	$Ô	$€àÐ ðhð hð hð hð h�ñ hô hð hð hð hr/   