
    %j                         d dl mZ d dlmZ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 dd	lmZmZ g d
ZddgZddgZdgZ G d de          ZdS )    )minidom)DocumentElement)BinaryIOAnyUnion)BeautifulSoup   )_CustomMarkdownify   )
StreamInfo)DocumentConverterDocumentConverterResult)zapplication/rsszapplication/rss+xmlzapplication/atomzapplication/atom+xmlz.rssz.atomztext/xmlzapplication/xmlz.xmlc                        e Zd ZdZ fdZdedededefdZ	dedefdZ
d	eded
z  fdZdedededefdZd	edefdZd	edefdZdedefdZdededeed
f         fdZ xZS )RssConverterz#Convert RSS / Atom type to markdownc                 V    t                                                       i | _        d S )N)super__init___kwargs)self	__class__s    l/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/markitdown/converters/_rss_converter.pyr   zRssConverter.__init__    s$        file_streamstream_infokwargsreturnc                 t   |j         pd                                }|j        pd                                }|t          v rdS t          D ]}|                    |          r dS |t          v r|                     |          S t          D ].}|                    |          r|                     |          c S /dS )N TF)	mimetypelower	extensionPRECISE_FILE_EXTENSIONSPRECISE_MIME_TYPE_PREFIXES
startswithCANDIDATE_FILE_EXTENSIONS
_check_xmlCANDIDATE_MIME_TYPE_PREFIXES)r   r   r   r   r    r"   prefixs          r   acceptszRssConverter.accepts$   s      (.B5577 *0b7799	 ///40 	 	F""6** tt 111??;///2 	4 	4F""6** 4{333334 ur   c                 @   |                                 }	 t          j        |          }|                     |          d u|                    |           S # t
          $ r
}Y d }~nd }~ww xY w	 |                    |           n# |                    |           w xY wdS )NF)tellr   parse
_feed_typeseekBaseException)r   r   cur_posdoc_s        r   r'   zRssConverter._check_xml?   s    ""$$	&-,,C??3''t3 W%%%%  	 	 	DDDD	W%%%%KW%%%%us#   *A 
A* B %A**B Br2   Nc                     |                     d          rdS |                     d          r2|                     d          d         }|                     d          rdS d S )Nrssfeedr   entryatom)getElementsByTagName)r   r2   roots      r   r.   zRssConverter._feed_typeJ   sk    ##E** 	5%%f-- 	++F33A6D((11 vtr   c                     || _         t          j        |          }|                     |          }|dk    r|                     |          S |dk    r|                     |          S t          d          )Nr5   r8   zUnknown feed type)r   r   r-   r.   _parse_rss_type_parse_atom_type
ValueError)r   r   r   r   r2   	feed_types         r   convertzRssConverter.convertT   sx     mK((OOC((	'',,,&  ((---0111r   c                 J   |                     d          d         }|                     |d          }|                     |d          }|                     d          }d| d}|r|| dz  }|D ]}|                     |d          }|                     |d          }	|                     |d	          }
|                     |d
          }|r	|d| dz  }|
r	|d|
 dz  }|	r||                     |	          z  }|r||                     |          z  }t          ||          S )zzParse the type of an Atom feed.

        Returns None if the feed type is not recognized or something goes wrong.
        r6   r   titlesubtitler7   # 
summaryupdatedcontent
## zUpdated on: markdownrB   )r9   _get_data_by_tag_name_parse_contentr   )r   r2   r:   rB   rC   entriesmd_textr7   entry_titleentry_summaryentry_updatedentry_contents               r   r=   zRssConverter._parse_atom_typee   s{   
 ''//2**499--dJ??++G44 u... 	'(&G 	> 	>E44UGDDK 66uiHHM 66uiHHM 66uiHHM 32;2222 <;-;;;; >4..}=== >4..}===&
 
 
 	
r   c                    |                     d          d         }|                     d          }|st          d          |d         }|                     |d          }|                     |d          }|                     d          }|rd| d	}|r|| d	z  }|D ]}	|                     |	d          }
|                     |	d          }|                     |	d
          }|                     |	d          }|
r	|d|
 d	z  }|r	|d| d	z  }|r||                     |          z  }|r||                     |          z  }t	          ||          S )zyParse the type of an RSS feed.

        Returns None if the feed type is not recognized or something goes wrong.
        r5   r   channelzNo channel found in RSS feedrB   descriptionitemrD   rE   pubDatezcontent:encodedrI   zPublished on: rJ   )r9   r>   rL   rM   r   )r   r2   r:   channel_listrU   channel_titlechannel_descriptionitemsrO   rW   rB   rV   rX   rH   s                 r   r<   zRssConverter._parse_rss_type   s   
 ''..q100;; 	=;<<<q/227GDD"88-PP,,V44 	-,=,,,G 	2-1111G 	8 	8D..tW==E44T=IIK00yAAG007HIIG -,5,,,, 87G7777 <4..{;;; 84..w777&
 
 
 	
r   rH   c                     	 t          |d          }t          di | j                            |          S # t          $ r}|cY d}~S d}~ww xY w)z%Parse the content of an RSS feed itemzhtml.parserN )r	   r   r   convert_soupr0   )r   rH   soupr3   s       r   rM   zRssConverter._parse_content   sh    	 -88D%5555BB4HHH 	 	 	NNNNNN	s   36 
A AAAelementtag_namec                     |                     |          }|sdS |d         j        }|rt          |d          r|j        S dS )zwGet data from first child element with the given tag name.
        Returns None when no such element is found.
        Nr   data)r9   
firstChildhasattrrd   )r   ra   rb   nodesfcs        r   rL   z"RssConverter._get_data_by_tag_name   sV     ,,X66 	41X  	r6"" wtr   )__name__
__module____qualname____doc__r   r   r   r   boolr*   r'   strr.   r   r@   r   r=   r<   rM   r   r   rL   __classcell__)r   s   @r   r   r      s       --       	
 
   6	h 	4 	 	 	 	c cDj    22  2 	2
 
!2 2 2 2"
H 
1H 
 
 
 
@#
8 #
0G #
 #
 #
 #
Jc c    *-	sDy	       r   r   N)
defusedxmlr   xml.dom.minidomr   r   typingr   r   r   bs4r	   _markdownifyr   _stream_infor   _base_converterr   r   r$   r#   r(   r&   r   r^   r   r   <module>rw      s         - - - - - - - - ' ' ' ' ' ' ' ' ' '       , , , , , , % % % % % % H H H H H H H H    "7+      
c c c c c$ c c c c cr   