
    Ng                     b    d dl mZmZ d dlZd dlmZ d dlmZ d dlm	Z	 dZ
 G d de          ZdS )	    )ListOptionalN)Document)
BaseLoader)WebBaseLoaderzhttps://www.ifixit.com/api/2.0c            	           e Zd ZdZdefdZdee         fdZe	dded	edee         fd
            Z
	 ddee         dee         fdZ	 ddee         dedee         fdZddee         dee         fdZdS )IFixitLoadera  Load `iFixit` repair guides, device wikis and answers.

    iFixit is the largest, open repair community on the web. The site contains nearly
    100k repair manuals, 200k Questions & Answers on 42k devices, and all the data is
    licensed under CC-BY.

    This loader will allow you to download the text of a repair guide, text of Q&A's
    and wikis from devices on iFixit using their open APIs and web scraping.
    web_pathc                    |                     d          st          d          |                    dd          g d}	 t          fd|D                       st          d          d                     d          D             }	 |d	         d
k    r|d	         nd| _        | j        dk    s| j        dk    r|d         | _        n|d         | _        || _        dS )zInitialize with a web path.zhttps://www.ifixit.comz1web path must start with 'https://www.ifixit.com' )z/Devicez/Guidez/Answersz	/Teardownc              3   B   K   | ]}                     |          V  d S N)
startswith).0allowed_pathpaths     g/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/document_loaders/ifixit.py	<genexpr>z(IFixitLoader.__init__.<locals>.<genexpr>!   s/      SS\4??<00SSSSSS    z?web path must start with /Device, /Guide, /Teardown or /Answersc                     g | ]}||S  r   )r   xs     r   
<listcomp>z)IFixitLoader.__init__.<locals>.<listcomp>&   s    2222!222r   /r   TeardownGuideAnswers      N)r   
ValueErrorreplaceanysplit	page_typeidr
   )selfr
   allowed_pathspiecesr   s       @r   __init__zIFixitLoader.__init__   s   ""#;<< 	RPQQQ 8"==FFFSSSS]SSSSS 	Q   32TZZ__222;&,Qi:&=&=7>W$$)(C(CQiDGGQiDG r   returnc                     | j         dk    r|                                 S | j         dk    s| j         dk    r|                                 S | j         dk    r|                                 S t	          d| j         z             )NDevicer   r   r   zUnknown page type: )r$   load_device
load_guideload_questions_and_answersr    )r&   s    r   loadzIFixitLoader.load2   s    >X%%##%%%^w&&$.J*F*F??$$$^y((224442T^CDDDr   r   allquerydoc_typec                    t          j        t          dz   | z   dz   |z             }|j        dk    r*t	          d| z   dz   |                                z             |                                }|d         }g }|D ]d}	 t          |d                   }|j        dk    r||                    d	
          z  }n||	                                z  }U# t          $ r Y aw xY w|S )zLoad suggestions.

        Args:
            query: A query string
            doc_type: The type of document to search for. Can be one of "all",
              "device", "guide", "teardown", "answer", "wiki".

        Returns:

        z	/suggest/z
?doctypes=   z Could not load suggestions for "z"
resultsurlr,   F)include_guides)
requestsgetIFIXIT_BASE_URLstatus_coder    jsonr	   r$   r-   r0   )r2   r3   resdatar6   outputresultloaders           r   load_suggestionszIFixitLoader.load_suggestions<   s    lk)E1L@8K
 
 ?c!!2U:UBSXXZZO   xxzzy/ 	 	F%fUm44#x//f000FFFFFfkkmm+F    s   >AC
CCNurl_overridec                    t          || j        n|          }|                                }g }|                    dd          j        }|                    d|z              |                    |                    d          j                                                   |                    dd          }|r/|                    d|j                                        z              |                    d	          D ]}|	                    d
          r d|d
         v r|                    d           n5d|d         v r|                    d           n|                    d           |d |                    d          D             z  }|                    d           d
                    |                                          }| j        |d}	t          ||	          gS )zLoad a list of questions and answers.

        Args:
            url_override: A URL to override the default URL.

        Returns: List[Document]

        Nh1z
post-title# z.post-content .post-textdivzpost-answers-headerz
## z".js-answers-list .post.post-answeritempropacceptedAnswerz
### Accepted Answerzpost-helpfulclassz
### Most Helpful Answerz
### Other Answerc                 @    g | ]}|j                                         S r   )textstrip)r   as     r   r   z;IFixitLoader.load_questions_and_answers.<locals>.<listcomp>   s/       #$  r   
sourcetitlepage_contentmetadata)r   r
   scrapefindrM   append
select_onerN   selecthas_attrjoinr   )
r&   rD   rB   soupr@   rS   answersHeaderanswerrM   rV   s
             r   r/   z'IFixitLoader.load_questions_and_answersb   s    0Dt}},WW}}		$--2dUl###doo&@AAFLLNNOOO		%)>?? 	@MM'M$6$<$<$>$>>???kk"FGG 	  	 Fz** 4/?6*CU/U/U566666'?229::::2333  (.6P(Q(Q   F MM$yy  &&(("me<<dX>>>??r   Tr8   c                    
 g }|t           dz   | j        z   }n|}t          j        |          }|                                
d                    
fddD                                                       }| j        
d         d}|                    t          ||                     |rR	 d	 
d
         D             }|D ]<}	|                    t          |	                                          d                    =|S )zLoads a device

        Args:
            url_override: A URL to override the default URL.
            include_guides: Whether to include guides linked to from the device.
              Defaults to True.

        Returns:

        Nz/wikis/CATEGORY/rP   c                 (    g | ]}|v |         S r   r   )r   keyr?   s     r   r   z,IFixitLoader.load_device.<locals>.<listcomp>   s.       $;; S	;;r   )rS   descriptioncontents_rawrS   rQ   rT   c                     g | ]
}|d          S )r7   r   )r   guides     r   r   z,IFixitLoader.load_device.<locals>.<listcomp>   s    CCC5%,CCCr   guidesr   )r;   r%   r9   r:   r=   r]   rN   r
   rY   r   r	   r0   )r&   rD   r8   	documentsr7   r>   rM   rV   
guide_urls	guide_urlr?   s             @r   r-   zIFixitLoader.load_device   s,    	!$66@CCCl3xxzzyy   C  
 
 %'' 	 #md7mDDthGGGHHH 	DTCCDNCCCJ' D D	  i!8!8!=!=!?!?!BCCCCr   c                 ^   |t           dz   | j        z   }n|}t          j        |          }|j        dk    r/t          d| j        z   dz   |                                z             |                                }d|d         z   |d         g}|                    d	           t          |d
                   dk    r|                    d           n)|d
         D ] }|                    d|d         z              !|                    d           t          |d                   dk    r|                    d           n)|d         D ] }|                    d|d         z              !|d         D ]m}|                    d|d         dk    r|d         nd
                    |d                   z              |d         D ]}	|                    |	d                    n|                    |d                    d                    |          }
| j        |d         d}t          |
|          gS )zLoad a guide

        Args:
            url_override: A URL to override the default URL.

        Returns: List[Document]

        Nz/guides/r5   zCould not load guide: rP   rG   rS   introduction_rawz

###Tools Required:toolsr   z
 - Nonez
 - rM   z

###Parts Required:partsstepsz

## r   zStep {}orderbylinestext_rawconclusion_rawrQ   rT   )r;   r%   r9   r:   r<   r    r
   r=   rY   lenformatr]   r   )r&   rD   r7   r>   r?   	doc_partstoolpartrowlinerM   rV   s               r   r.   zIFixitLoader.load_guide   sp    !J.8CCCl3?c!!(4=84?#((**L   xxzzDM)40B+CD	1222tG}""[))))W 9 9  4<!788881222tG}""[))))W 9 9  4<!78888= 	3 	3C 7|r)) LL"))#i.99	   G 3 3  j!122223 	./000yy##"md7mDDdX>>>??r   )r   r1   r   )NT)__name__
__module____qualname____doc__strr)   r   r   r0   staticmethodrC   r   r/   boolr-   r.   r   r   r   r	   r	      sS        ! ! ! ! !6Ed8n E E E E # # #C #DN # # # \#L -1*@ *@$SM*@	h*@ *@ *@ *@Z JN& &$SM&BF&	h& & & &P:@ :@x} :@X :@ :@ :@ :@ :@ :@r   r	   )typingr   r   r9   langchain_core.documentsr   )langchain_community.document_loaders.baser   -langchain_community.document_loaders.web_baser   r;   r	   r   r   r   <module>r      s    ! ! ! ! ! ! ! !  - - - - - - @ @ @ @ @ @ G G G G G G2d@ d@ d@ d@ d@: d@ d@ d@ d@ d@r   