
    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y)    )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                 0    t         |           i | _        y )N)super__init___kwargs)self	__class__s    e/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/markitdown/converters/_rss_converter.pyr   zRssConverter.__init__    s        file_streamstream_infokwargsreturnc                 Z   |j                   xs dj                         }|j                  xs dj                         }|t        v ryt        D ]  }|j                  |      s y |t        v r| j                  |      S t        D ]&  }|j                  |      s| j                  |      c S  y)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 **0b779	 //0 	F""6*	
 11??;//2 	4F""6*{33	4 r   c                    |j                         }	 t        j                  |      }| j                  |      d u|j	                  |       S # t
        $ r
}Y d }~nd }~ww xY w	 |j	                  |       y# |j	                  |       w xY w)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%  		W% W%s#   'A 	AA4 AA4 4Br2   Nc                     |j                  d      ry|j                  d      r&|j                  d      d   }|j                  d      ryy )Nrssfeedr   entryatom)getElementsByTagName)r   r2   roots      r   r.   zRssConverter._feed_typeJ   sJ    ##E*%%f-++F3A6D((1r   c                     || _         t        j                  |      }| j                  |      }|dk(  r| j	                  |      S |dk(  r| j                  |      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   se     mmK(OOC(	'',,& ((--011r   c                    |j                  d      d   }| j                  |d      }| j                  |d      }|j                  d      }d| d}|r|| dz  }|D ]  }| j                  |d      }| j                  |d      }	| j                  |d	      }
| j                  |d
      }|r	|d| dz  }|
r	|d|
 dz  }|	r|| j                  |	      z  }|sz|| j                  |      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   s5   
 ''/2**49--dJ?++G4ugR.(2&G 	>E44UGDK 66uiHM 66uiHM 66uiHMU;-r22\-;;4..}==4..}==	> '
 	
r   c                 <   |j                  d      d   }|j                  d      }|st        d      |d   }| j                  |d      }| j                  |d      }|j                  d      }|rd| d	}|r| d	z  }|D ]  }	| j                  |	d      }
| j                  |	d      }| j                  |	d
      }| j                  |	d      }|
r	d|
 d	z  }|r	d| d	z  }|r| j                  |      z  }|sz| j                  |      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   sf   
 ''.q100;;<<q/227GD"88-P,,V4=/,G-.b11G 	8D..tW=E44T=IK00yAG007HIGU5',,^G9B774..{;;4..w77	8 '
 	
r   rH   c                     	 t        |d      }t        di | j                  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   sE    	 -8D%55BB4HH 	N	s   /2 	AAAAelementtag_namec                 ~    |j                  |      }|sy|d   j                  }|rt        |d      r|j                  S y)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   sB     ,,X61X  r6"wwr   )__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"
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  "7+      
c$ cr   