U
    \>eWS                     @  s  d dl mZ d dlZd dlZd dlZ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 dd
lmZ ddlmZ ddlmZmZ ddlmZ erd dl m!Z! dddgZ"e#dZ$G dd dZ%ddddddZ&ddddZ'dS )    )annotationsN)TYPE_CHECKINGAnyBinaryIOCallableClassVarMappingSequence   )util)build_preprocessors)build_block_parser)build_treeprocessors)build_inlinepatterns)build_postprocessors)	Extension)to_html_stringto_xhtml_string)BLOCK_LEVEL_ELEMENTS)ElementMarkdownmarkdownmarkdownFromFileZMARKDOWNc                   @  s   e Zd ZU dZdZeedZded< dd Z	d dd	d
Z
ddd dddZddddddZdd dddZd dddZdd dddZddd d!d"Zddd#d$d%Zd,d'd'd(d d)d*d+Zd&S )-r   a	  
    A parser which converts Markdown to HTML.

    Attributes:
        Markdown.tab_length (int): The number of spaces which correspond to a single tab. Default: `4`.
        Markdown.ESCAPED_CHARS (list[str]): List of characters which get the backslash escape treatment.
        Markdown.block_level_elements (list[str]): List of HTML tags which get treated as block-level elements.
            See [`markdown.util.BLOCK_LEVEL_ELEMENTS`][] for the full list of elements.
        Markdown.registeredExtensions (list[Extension]): List of extensions which have called
            [`registerExtension`][markdown.Markdown.registerExtension] during setup.
        Markdown.doc_tag (str): Element used to wrap document. Default: `div`.
        Markdown.stripTopLevelTags (bool): Indicates whether the `doc_tag` should be removed. Default: 'True'.
        Markdown.references (dict[str, tuple[str, str]]): A mapping of link references found in a parsed document
             where the key is the reference name and the value is a tuple of the URL and title.
        Markdown.htmlStash (util.HtmlStash): The instance of the `HtmlStash` used by an instance of this class.
        Markdown.output_formats (dict[str, Callable[xml.etree.ElementTree.Element]]): A mapping of known output
             formats by name and their respective serializers. Each serializer must be a callable which accepts an
            [`Element`][xml.etree.ElementTree.Element] and returns a `str`.
        Markdown.output_format (str): The output format set by
            [`set_output_format`][markdown.Markdown.set_output_format].
        Markdown.serializer (Callable[xml.etree.ElementTree.Element]): The serializer set by
            [`set_output_format`][markdown.Markdown.set_output_format].
        Markdown.preprocessors (util.Registry): A collection of [`preprocessors`][markdown.preprocessors].
        Markdown.parser (blockparser.BlockParser): A collection of [`blockprocessors`][markdown.blockprocessors].
        Markdown.inlinePatterns (util.Registry): A collection of [`inlinepatterns`][markdown.inlinepatterns].
        Markdown.treeprocessors (util.Registry): A collection of [`treeprocessors`][markdown.treeprocessors].
        Markdown.postprocessors (util.Registry): A collection of [`postprocessors`][markdown.postprocessors].

    div)htmlxhtmlz-ClassVar[dict[str, Callable[[Element], str]]]output_formatsc                 K  s   | dd| _ddddddd	d
ddddddddg| _t | _g | _d| _d| _| 	  i | _
t | _| j| dg | di d | | dd |   dS )a  
        Creates a new Markdown instance.

        Keyword Arguments:
            extensions (list[Extension | str]): A list of extensions.

                If an item is an instance of a subclass of [`markdown.extensions.Extension`][],
                the instance will be used as-is. If an item is of type `str`, it is passed
                to [`build_extension`][markdown.Markdown.build_extension] with its corresponding
                `extension_configs` and the returned instance  of [`markdown.extensions.Extension`][]
                is used.
            extension_configs (dict[str, dict[str, Any]]): Configuration settings for extensions.
            output_format (str): Format of output. Supported formats are:

                * `xhtml`: Outputs XHTML style tags. Default.
                * `html`: Outputs HTML style tags.
            tab_length (int): Length of tabs in the source. Default: `4`

        
tab_length   \`*_{}[]()>#+-.! T
extensionsZextension_configs)r0   configsoutput_formatr   N)getr   ZESCAPED_CHARSr   copyblock_level_elementsregisteredExtensionsZdocTypestripTopLevelTagsbuild_parser
referencesr   Z	HtmlStash	htmlStashregisterExtensionsset_output_formatreset)selfkwargs r@   1/tmp/pip-unpacked-wheel-wj0og6ym/markdown/core.py__init__X   s<                   


zMarkdown.__init__)returnc                 C  s6   t | | _t| | _t| | _t| | _t| | _	| S )a0  
        Build the parser from the various parts.

        Assigns a value to each of the following attributes on the class instance:

        * **`Markdown.preprocessors`** ([`Registry`][markdown.util.Registry]) -- A collection of
          [`preprocessors`][markdown.preprocessors].
        * **`Markdown.parser`** ([`BlockParser`][markdown.blockparser.BlockParser]) -- A collection of
          [`blockprocessors`][markdown.blockprocessors].
        * **`Markdown.inlinePatterns`** ([`Registry`][markdown.util.Registry]) -- A collection of
          [`inlinepatterns`][markdown.inlinepatterns].
        * **`Markdown.treeprocessors`** ([`Registry`][markdown.util.Registry]) -- A collection of
          [`treeprocessors`][markdown.treeprocessors].
        * **`Markdown.postprocessors`** ([`Registry`][markdown.util.Registry]) -- A collection of
          [`postprocessors`][markdown.postprocessors].

        This method could be redefined in a subclass to build a custom parser which is made up of a different
        combination of processors and patterns.

        )
r   preprocessorsr   parserr   ZinlinePatternsr   treeprocessorsr   postprocessors)r>   r@   r@   rA   r8      s    




zMarkdown.build_parserzSequence[Extension | str]zMapping[str, dict[str, Any]])r0   r1   rC   c                 C  s   |D ]z}t |tr&| |||i }t |trV||  td|jj	|jj
f  q|dk	rtd|jj	|jj
tj	tj
q| S )a  
        Load a list of extensions into an instance of the `Markdown` class.

        Arguments:
            extensions (list[Extension | str]): A list of extensions.

                If an item is an instance of a subclass of [`markdown.extensions.Extension`][],
                the instance will be used as-is. If an item is of type `str`, it is passed
                to [`build_extension`][markdown.Markdown.build_extension] with its corresponding `configs` and the
                returned instance  of [`markdown.extensions.Extension`][] is used.
            configs (dict[str, dict[str, Any]]): Configuration settings for extensions.

        z&Successfully loaded extension "%s.%s".Nz*Extension "{}.{}" must be of type: "{}.{}")
isinstancestrbuild_extensionr3   r   ZextendMarkdownloggerdebug	__class__
__module____name__	TypeErrorformat)r>   r0   r1   extr@   r@   rA   r;      s(    


  zMarkdown.registerExtensionsrI   zMapping[str, Any]r   )ext_namer1   rC   c           	   
     s2  t |} fddt D }|r8|d  }|f |S d krL ddn df\ }zt }td   W nB t	k
r } z$d  }|f|j
dd	  |_
 W 5 d	}~X Y nX |rt||f |S z|jf |W S  tk
r, } z2|j
d }d
 |f }|f|j
dd	  |_
 W 5 d	}~X Y nX d	S )a  
        Build extension from a string name, then return an instance using the given `configs`.

        Arguments:
            ext_name: Name of extension as a string.
            configs: Configuration settings for extension.

        Returns:
            An instance of the extension with the given configuration settings.

        First attempt to load an entry point. The string name must be registered as an entry point in the
        `markdown.extensions` group which points to a subclass of the [`markdown.extensions.Extension`][] class.
        If multiple distributions have registered the same name, the first one found is returned.

        If no entry point is found, assume dot notation (`path.to.module:ClassName`). Load the specified class and
        return an instance. If no class is specified, import the module and call a `makeExtension` function and return
        the [`markdown.extensions.Extension`][] instance returned by that function.
        c                   s   g | ]}|j  kr|qS r@   )name).0eprS   r@   rA   
<listcomp>   s     
 z,Markdown.build_extension.<locals>.<listcomp>r   :r
   r/   z,Successfully imported extension module "%s".zFailed loading extension "%s".Nz%Failed to initiate extension '%s': %s)dictr   Zget_installed_extensionsloadsplit	importlibimport_modulerK   rL   ImportErrorargsgetattrZmakeExtensionAttributeError)	r>   rS   r1   entry_pointsrR   
class_namemoduleemessager@   rW   rA   rJ      s4    
 

zMarkdown.build_extension)	extensionrC   c                 C  s   | j | | S )a  
        Register an extension as having a resettable state.

        Arguments:
            extension: An instance of the extension to register.

        This should get called once by an extension during setup. A "registered" extension's
        `reset` method is called by [`Markdown.reset()`][markdown.Markdown.reset]. Not all extensions have or need a
        resettable state, and so it should not be assumed that all extensions are "registered."

        )r6   appendr>   rh   r@   r@   rA   registerExtension   s    zMarkdown.registerExtensionc                 C  s6   | j   | j  | jD ]}t|dr|  q| S )z
        Resets all state variables to prepare the parser instance for new input.

        Called once upon creation of a class instance. Should be called manually between calls
        to [`Markdown.convert`][markdown.Markdown.convert].
        r=   )r:   r=   r9   clearr6   hasattrrj   r@   r@   rA   r=     s    




zMarkdown.reset)rQ   rC   c              
   C  s   |  d| _z| j| j | _W nl tk
r } zNt| j }|  d| jdd	| d f }|f|j
dd  |_
 W 5 d}~X Y nX | S )z
        Set the output format for the class instance.

        Arguments:
            format: Must be a known value in `Markdown.output_formats`.

        Z145z+Invalid Output Format: "%s". Use one of %s."z", "r
   N)lowerrstripr2   r   
serializerKeyErrorlistkeyssortjoinr`   )r>   rQ   rf   Zvalid_formatsrg   r@   r@   rA   r<     s    zMarkdown.set_output_formatr   bool)tagrC   c                 C  s"   t |tr| d| jkS dS )z
        Check if the given `tag` is a block level HTML tag.

        Returns `True` for any string listed in `Markdown.block_level_elements`. A `tag` which is
        not a string always returns `False`.

        /F)rH   rI   ro   rp   r5   )r>   rx   r@   r@   rA   is_block_level.  s    
zMarkdown.is_block_level)sourcerC   c              
   C  sn  |  sdS zt|}W n2 tk
rJ } z| jd7  _ W 5 d}~X Y nX |d| _| jD ]}|| j| _q^| j	| j
 }| jD ]}||}|dk	r|}q| |}| jrNzB|d| j t| j d }|d| j }	|||	   }W nR tk
rL } z2|  d| j r*d}ntd	|   |W 5 d}~X Y nX | jD ]}
|
|}qT|  S )
a  
        Convert a Markdown string to a string in the specified output format.

        Arguments:
            source: Markdown formatted text as Unicode or ASCII string.

        Returns:
            A string in the specified output format.

        Markdown parsing takes place in five steps:

        1. A bunch of [`preprocessors`][markdown.preprocessors] munge the input text.
        2. A [`BlockParser`][markdown.blockparser.BlockParser] parses the high-level structural elements of the
           pre-processed text into an [`ElementTree`][xml.etree.ElementTree.ElementTree] object.
        3. A bunch of [`treeprocessors`][markdown.treeprocessors] are run against the
           [`ElementTree`][xml.etree.ElementTree.ElementTree] object. One such `treeprocessor`
           ([`markdown.treeprocessors.InlineProcessor`][]) runs [`inlinepatterns`][markdown.inlinepatterns]
           against the [`ElementTree`][xml.etree.ElementTree.ElementTree] object, parsing inline markup.
        4. Some [`postprocessors`][markdown.postprocessors] are run against the text after the
           [`ElementTree`][xml.etree.ElementTree.ElementTree] object has been serialized into text.
        5. The output is returned as a string.

        r/   z/. -- Note: Markdown only accepts Unicode input!N
z<%s>   z</%s>z<%s />z4Markdown failed to strip top-level tags. Document=%r)striprI   UnicodeDecodeErrorreasonr\   linesrD   runrE   ZparseDocumentgetrootrF   rq   r7   indexdoc_taglenrindex
ValueErrorendswithrG   )r>   r{   rf   preprootZtreeprocessorZnewRootoutputstartendppr@   r@   rA   convert;  sL    




zMarkdown.convertNzstr | BinaryIO | Nonez
str | None)inputr   encodingrC   c           	      C  s   |pd}|rHt |tr(tj|d|d}nt||}| }|  n
tj }|	d}| 
|}|rt |trtj|d|dd}|| |  qt|}||dd}|| n||d}tjj| | S )	a  
        Converts a Markdown file and returns the HTML as a Unicode string.

        Decodes the file using the provided encoding (defaults to `utf-8`),
        passes the file content to markdown, and outputs the HTML to either
        the provided stream or the file with provided name, using the same
        encoding as the source file. The
        [`xmlcharrefreplace`](https://docs.python.org/3/library/codecs.html#error-handlers)
        error handler is used when encoding the output.

        **Note:** This is the only place that decoding and encoding of Unicode
        takes place in Python-Markdown.  (All other code is Unicode-in /
        Unicode-out.)

        Arguments:
            input: File object or path. Reads from `stdin` if `None`.
            output: File object or path. Writes to `stdout` if `None`.
            encoding: Encoding of input and output files. Defaults to `utf-8`.

        zutf-8r)moder   u   ﻿wxmlcharrefreplace)r   errors)r   )rH   rI   codecsopen	getreaderreadclosesysstdinlstripr   write	getwriterencodestdoutbuffer)	r>   r   r   r   Z
input_filetextr   Zoutput_filewriterr@   r@   rA   convertFile  s0    








zMarkdown.convertFile)NNN)rO   rN   __qualname____doc__r   r   r   r   __annotations__rB   r8   r;   rJ   rk   r=   r<   rz   r   r   r@   r@   r@   rA   r   .   s$   
	+$5K   rI   r   )r   r?   rC   c                 K  s   t f |}|| S )a5  
    Convert a markdown string to HTML and return HTML as a Unicode string.

    This is a shortcut function for [`Markdown`][markdown.Markdown] class to cover the most
    basic use case.  It initializes an instance of [`Markdown`][markdown.Markdown], loads the
    necessary extensions and runs the parser on the given text.

    Arguments:
        text: Markdown formatted text as Unicode or ASCII string.

    Keyword arguments:
        **kwargs: Any arguments accepted by the Markdown class.

    Returns:
        A string in the specified output format.

    )r   r   )r   r?   mdr@   r@   rA   r     s    
)r?   c                  K  s4   t f | }|| dd| dd| dd dS )aE  
    Read Markdown text from a file and write output to a file or a stream.

    This is a shortcut function which initializes an instance of [`Markdown`][markdown.Markdown],
    and calls the [`convertFile`][markdown.Markdown.convertFile] method rather than
    [`convert`][markdown.Markdown.convert].

    Keyword arguments:
        input (str | BinaryIO): A file name or readable object.
        output (str | BinaryIO): A file name or writable object.
        encoding (str): Encoding of input and output.
        **kwargs: Any arguments accepted by the `Markdown` class.

    r   Nr   r   )r   r   r3   )r?   r   r@   r@   rA   r     s
    


)(
__future__r   r   r   loggingr]   typingr   r   r   r   r   r   r	   r/   r   rD   r   Zblockprocessorsr   rF   r   Zinlinepatternsr   rG   r   r0   r   Zserializersr   r   r   xml.etree.ElementTreer   __all__	getLoggerrK   r   r   r   r@   r@   r@   rA   <module>   s0   $

   $