
    i                     T   U d Z ddgZddlZddlZddlZddlZddlZddl	m
Z
 ddl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  ej,                  d      Zej0                  j3                  ej0                  j5                  e            Zded<   defdZ G d d      Z  G d d      Z!y)a  Render SearXNG instance documentation.

Usage in a Flask app route:

.. code:: python

  from searx import infopage
  from searx.extended_types import sxng_request

  _INFO_PAGES = infopage.InfoPageSet(infopage.MistletoePage)

  @app.route('/info/<pagename>', methods=['GET'])
  def info(pagename):

      locale = sxng_request.preferences.get_value('locale')
      page = _INFO_PAGES.get_page(pagename, locale)

InfoPageInfoPageSet    N)cached_propertyurl_for)
MarkdownIt   )get_setting)GIT_URL)LOCALE_NAMESzsearx.infopage
INFO_PAGESnamec                 V    | dk(  rt               at        S t        dt        d|       )Nr   zmodule z has no attribute )r   r   AttributeError__name__)r   s    (/root/searxng/searx/infopage/__init__.py__getattr__r   -   s0    | ]

78,.@I
JJ    c                   ~    e Zd ZdZdefdZed        Zed        Zed        Z	edefd       Z
deeef   fd	Zd
 Zy)r   z;A page of the :py:obj:`online documentation <InfoPageSet>`.fnamec                     || _         y N)r   )selfr   s     r   __init__zInfoPage.__init__9   s	    
r   c                 ~    t        | j                  dd      5 }|j                         cddd       S # 1 sw Y   yxY w)z5Raw content of the page (without any jinja rendering)rzutf-8)encodingN)openr   read)r   fs     r   raw_contentzInfoPage.raw_content<   s4     $**cG4 	668	 	 	s   3<c                     | j                         }t        j                         j                  | j                        } |j
                  di |S )z1Content of the page (rendered in a Jinja context) )get_ctxjinja2Environmentfrom_stringr!   render)r   ctxtemplates      r   contentzInfoPage.contentB   sB     lln%%'33D4D4DEx%%%r   c                     d}| j                   j                  d      D ]%  }|j                  d      s|j                  d      }' |S )z)Title of the content (without any markup) 
z# )r!   split
startswithstrip)r   _tls      r   titlezInfoPage.titleI   sI     !!''- 	#A||D!WWT]	# 	r   returnc                 r    t        dddi      j                  ddg      j                  | j                        S )zRender Markdown (CommonMark_) to HTML by using markdown-it-py_.

        .. _CommonMark: https://commonmark.org/
        .. _markdown-it-py: https://github.com/executablebooks/markdown-it-py

        
commonmarktypographerTreplacementssmartquotes)r   enabler(   r+   r   s    r   htmlzInfoPage.htmlR   s;     |mT%:;BBNTaCbcjjkokwkwx	
r   c                 v    dt         dt         fd}dt         fd}i }t        |d<   t        |d<   ||d<   ||d	<   |S )
z2Jinja context to render :py:obj:`InfoPage.content`r   urlc                 .    t        |d      }d| d|dS )NT	_external[]()r   )r   r?   s     r   _md_linkz"InfoPage.get_ctx.<locals>._md_linka   s    #.C!%s++r   queryc                 r    t        dd      dt        j                  j                  |       }d| d|dS )NsearchTrA   z?q=rC   rD   rE   )r   urllibparsequote)rG   r?   s     r   
_md_searchz$InfoPage.get_ctx.<locals>._md_searche   s.    &x4@&,,BTBTUZB[\C!&,,r   r   r
   linkrI   )strr   r
   )r   rF   rM   r)   s       r   r$   zInfoPage.get_ctx^   sR    	,3 	,S 	,	-c 	- !# I(MF"H
r   c                 P    d| j                   j                   d| j                  dS )N<z fname=>)	__class__r   r   r<   s    r   __repr__zInfoPage.__repr__q   s&    4>>**+74::.BBr   N)r   
__module____qualname____doc__rO   r   r   r!   r+   r4   r=   dictr$   rT   r#   r   r   r   r   6   s    E c    
 & &   	
c 	
 	
c3h &Cr   c                   d    e Zd ZdZddee   dz  dedz  fdZddededz  fdZddedz  d	e	fd
Z
y)r   a  Cached rendering of the online documentation a SearXNG instance has.

    :param page_class: render online documentation by :py:obj:`InfoPage` parser.
    :type page_class: :py:obj:`InfoPage`

    :param info_folder: information directory
    :type info_folder: str
    N
page_classinfo_folderc                 (   |xs t         | _        |xs t        | _        	 i | _        d| _        	 t        j                  t              D cg c]-  }|j                  dd      t        v s|j                  dd      / c}| _
        	 g d| _        y c c}w )Nen_-)zsearch-syntaxaboutdonate)r   rZ   _INFO_FOLDERfolderCACHElocale_defaultoslistdirreplacer   localestoc)r   rZ   r[   locales       r   r   zInfoPageSet.__init__   s    *4*@&6,,=?
#' 46::l3K#
)/v~~^acfOgkwOwFNN3$#
 	8

 	;#
s   
B(Bpagenamerk   c                    |xs | j                   }|| j                  vry|| j                  vry||f}|| j                  v r| j                  |   S t        j
                  j                  | j                  |j                  dd      |      dz   }t        j
                  j                  |      s&t        j                  d|       d| j                  |<   y| j                  |      }|| j                  |<   |S )aS  Return ``pagename`` instance of :py:obj:`InfoPage`

        :param pagename: name of the page, a value from :py:obj:`InfoPageSet.toc`
        :type pagename: str

        :param locale: language of the page, e.g. ``en``, ``zh_Hans_CN``
                       (default: :py:obj:`InfoPageSet.i18n_origin`)
        :type locale: str

        Nr_   r^   z.mdzfile %s does not exists)re   rj   ri   rd   rf   pathjoinrc   rh   existsloggerinforZ   )r   rl   rk   	cache_keyr   pages         r   get_pagezInfoPageSet.get_page   s     .4..488#%v&	

"::i(( T[[&..c*BHMPUUww~~e$KK159$(DJJy!u% $

9r   fallback_to_defaultc              #      K   |xs | j                   }| j                  D ]L  }|}| j                  ||      }|r*|(| j                   }| j                  || j                         }|F|||f N yw)z!Iterate over all pages of the TOCN)re   rj   ru   )r   rk   rv   	page_namepage_localert   s         r   
iter_pageszInfoPageSet.iter_pages   sy     .4.. 	3I K==F3D"t|"11}}Y0C0CDd22	3s   A"A/%
A/)NNr   )NF)r   rU   rV   rW   typer   rO   r   ru   boolrz   r#   r   r   r   r   u   sW    ;4>D#8 ;cTXj ;,! !cDj !F3t 3 3r   )"rW   __all__typingtrf   os.pathloggingurllib.parserJ   	functoolsr   r%   flask.helpersr   markdown_itr   r-   r
   versionr   ri   r   	getLoggerrq   rn   abspathdirname__file__rb   __annotations__rO   r   r   r   r#   r   r   <module>r      s   & }
%  	    %  ! "   " 
		+	,wwrwwx89 Kc K<C <C~N3 N3r   