
    ͆h                        S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	s  J
r	  SSKJr  SSKrSSKJrJr  SrS	r/ S
Q/ SQ/ SQ/ SQ/ SQS.rSrSrSr\R,                  " S5      rSrSrSrSrSrSrSrS rS\ 3r S\ 3r!\" SS5      r"\" SS5      r#\" SS5      r$Sr%S r&S!r'S"r(S#r)\R,                  " S$5      r*S%\4S&\4S'\4S(.r+SiS) jr,\R,                  " S*R[                  \," SS+5      \," SS,5      \," SS-5      5      5      r.S.\4S/\4S0\4S(.r/SiS1 jr0\R,                  " S*R[                  \0" SS+5      \0" SS25      \0" SS-5      5      5      r1\R,                  " S3R[                  \\5      5      r2S4S51r3S6SS7\S8S9S:S;S<S=.	S>SS7\S?S@SASBSCS=.	SDSS7\S?SESFSGSHSCSI.
SJS5S7\SK.SLS4S7\SK.SM.r4SN r5\5" S5SO5      \5" S4SP5      \5" SS-5      \5" SS,5      \5" SS+5      SQ.r6 " SR SS\5      r7 " ST SU\75      r8 " SV SW\5      r9 " SX SY\5      r: " SZ S[\5      r; " S\ S]\5      r< " S^ S_\75      r= " S` Sa\75      r> " Sb Sc\85      r? " Sd Se\85      r@ " Sf Sg\5      rASh rBg)ja  
Magic Link.

pymdownx.magiclink
An extension for Python Markdown.
Find HTML, FTP links, and email address and turn them to actual links

MIT license.

Copyright (c) 2014 - 2017 Isaac Muse <isaacmuse@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions
of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
    )	Extension)Treeprocessor)util   )warn_deprecatedN)LinkInlineProcessorInlineProcessor   	dashboardaccountplanssupportrepomarketplacenotificationsissuespullsponsorssettingsr   r   -explorehelpprojectsimessages	bookmarkshome	bitbucketgithubgitlabtwitterxa}  (?xi)
(?P<mail>
    (?<![-/\+@a-z\d_])(?:[-+a-z\d_]([-a-z\d_+]|\.(?!\.))*)  # Local part
    (?<!\.)@(?:[-a-z\d_]+\.)                                # @domain part start
    (?:(?:[-a-z\d_]|(?<!\.)\.(?!\.))*)[a-z]\b               # @domain.end (allow multiple dot names)
    (?![-@])                                                # Don't allow last char to be followed by these
)
at  (?xi)
(?P<link>
    (?:(?<=\b)|(?<=_))(?:
        (?:ht|f)tps?://[^_\W][-\w]*(?:\.[-\w.]+)*|          # (http|ftp)://
        (?P<www>w{3}\.)[^_\W][-\w]*(?:\.[-\w.]+)*           # www.
    )
    /?[-\w.?,!'(){}\[\]/+&@%$#=:"|~;]*                      # url path, fragments, and query stuff
    (?:[^_\W]|[-/#@$+=])                                    # allowed end chars
)
z(?i)<((?:ht|f)tps?://[^<>]*)>z^[a-zA-Z0-9]+$z\w{1,15}z+[a-zA-Z\d](?:[-a-zA-Z\d_]{0,37}[a-zA-Z\d])?z2[\.a-zA-Z\d_](?:[-a-zA-Z\d_\.]{0,37}[-a-zA-Z\d_])?z[-a-zA-Z\d_]{1,39}z4(?x)
(?P<mention>
    (?<![a-zA-Z])@
    (?:{})
)\b
z(?P<mention>(?<![a-zA-Z])@{})\bc                 j    US:X  a  U  S[          3$ US:X  a  U  S[         3$ US:X  a  U  S[         3$ g)z*Create external mentions by provider type.r$   :r%   r#   N)RE_GITHUB_USERRE_GITLAB_USERRE_BITBUCKET_USER)nameprovider_types     J/opt/services/DDDS/venv/lib/python3.13/site-packages/pymdownx/magiclink.pycreate_ext_mentionsr0   Y   sX      &.)**	(	"&.)**	+	%&+,-- 
&    ztwitter:zx:r$   r%   r#   zi(?x)
(?P<mention>
    (?<![a-zA-Z])
    @(?:{})
)\b
/(?P<mention_repo>[-._a-zA-Z\d]{{0,99}}[a-zA-Z\d])\b
zZ(?x)
(?P<mention>(?<![a-zA-Z])@{})\b
/(?P<mention_repo>[-._a-zA-Z\d]{{0,99}}[a-zA-Z\d])\b
z(?x)
(?P<all>(?<![@/])(?:(?P<user>\b{})/)
(?P<repo>[-._a-zA-Z\d]{{0,99}}[a-zA-Z\d])
(?:(?P<issue>(?:\#|!|\?)[1-9][0-9]*)|(?P<commit>@[a-f\d]{{40}})(?:\.{{3}}(?P<diff>[a-f\d]{{40}}))?))\b
z(?x)
(?P<all>(?<![@/])(?:(?P<user>\b{})/)?
(?P<repo>[-._a-zA-Z\d]{{0,99}}[a-zA-Z\d])
(?:(?P<issue>(?:\#|!|\?)[1-9][0-9]*)|(?P<commit>@[a-f\d]{{40}})(?:\.{{3}}(?P<diff>[a-f\d]{{40}}))?))\b
z(?x)
(?P<all>
    (?:(?<![a-zA-Z])(?P<issue>(?:\#|!|\?)[1-9][0-9]*)|(?P<commit>(?<![@/])\b[a-f\d]{40})(?:\.{3}(?P<diff>[a-f\d]{40}))?)
)\b
z(https?://)(?:www\\\.)?(.*)a  
        (?P<github>(?P<github_base>{}/
        (?P<github_user_repo>(?P<github_user>{})/[^/]+))/
            (?:issues/(?P<github_issue>\d+)/?|
                pull/(?P<github_pull>\d+)/?|
                discussions/(?P<github_discuss>\d+)/?|
                commit/(?P<github_commit>[\da-f]{{7,40}})/?|
                compare/(?P<github_diff1>[\da-f]{{7,40}})\.{{3}}
                    (?P<github_diff2>[\da-f]{{7,40}})))a  
        (?P<bitbucket>(?P<bitbucket_base>{}/
        (?P<bitbucket_user_repo>(?P<bitbucket_user>{})/[^/]+))/
            (?:issues/(?P<bitbucket_issue>\d+)(?:/[^/]+)?/?|
                pull-requests/(?P<bitbucket_pull>\d+)(?:/[^/]+(?:/diff)?)?/?|
                commits/commit/(?P<bitbucket_commit>[\da-f]{{7,40}})/?|
                branches/commits/(?P<bitbucket_diff1>[\da-f]{{7,40}})
                    (?:\.{{2}}|%0d)(?P<bitbucket_diff2>[\da-f]{{7,40}})\#diff))a  
        (?P<gitlab>(?P<gitlab_base>{}/
        (?P<gitlab_user_repo>(?P<gitlab_user>{})/[^/]+))/(?:-/)?
            (?:issues/(?P<gitlab_issue>\d+)/?|
                merge_requests/(?P<gitlab_pull>\d+)/?|
                commit/(?P<gitlab_commit>[\da-f]{{8,40}})/?|
                compare/(?P<gitlab_diff1>[\da-f]{{8,40}})\.{{3}}
                    (?P<gitlab_diff2>[\da-f]{{8,40}})))r$   r#   r%   c                 :   [         U    n[        R                  " UR                  5       R	                  S5      5      nU(       aB  [
        R                  U5      nU(       a&  UR                  S5      S-   UR                  S5      -   nUS   R                  XCS   5      $ z Create repository link provider./r   z(?:w{3}\.)?r
   r   )	REPO_LINK_TEMPLATESreescapelowerrstripRE_WWWmatchgroupformatproviderhostwwwtemplatehost_patms         r/   create_repo_link_patternrF      y     #8,Hyy,,S12H
LL"wwqzN2QWWQZ?HA;h44r1   z(?xi)^(?:{}|{}|{})/?$zhttps://github.comzhttps://bitbucket.orgzhttps://gitlab.comz
        (?P<github>(?P<github_base>{}/
            (?P<github_user_repo>(?P<github_user>{})(?:/(?P<github_repo>[^/]+))?)))
        z
        (?P<bitbucket>(?P<bitbucket_base>{}/
            (?P<bitbucket_user_repo>(?P<bitbucket_user>{})(?:/(?P<bitbucket_repo>[^/]+)/?)?)))
        z
        (?P<gitlab>(?P<gitlab_base>{}/
            (?P<gitlab_user_repo>(?P<gitlab_user>{})(?:/(?P<gitlab_repo>[^/]+))?)))
        c                 :   [         U    n[        R                  " UR                  5       R	                  S5      5      nU(       aB  [
        R                  U5      nU(       a&  UR                  S5      S-   UR                  S5      -   nUS   R                  XCS   5      $ r4   )	USER_LINK_TEMPLATESr7   r8   r9   r:   r;   r<   r=   r>   r?   s         r/   create_user_link_patternrJ      rG   r1   z"https://bitbucket.org"z(?xi)
    ^(?:
        (?P<twitter>(?P<twitter_base>https://(?:w{{3}}\.)?twitter\.com/(?P<twitter_user>{}))) |
        (?P<x>(?P<x_base>https://(?:w{{3}}\.)?x\.com/(?P<x_user>{})))
    )/?$
    r'   r&   GitLabz{}z{}/{{}}/{{}}/-/issues/{{}}z"{}/{{}}/{{}}/-/merge_requests/{{}}z{}/{{}}/{{}}/-/commit/{{}}z"{}/{{}}/{{}}/-/compare/{{}}...{{}}   )	r@   typeurluser_patternissuer   commitcompare	hash_size	Bitbucketz{}/{{}}/{{}}/issues/{{}}z{}/{{}}/{{}}/pull-requests/{{}}z {}/{{}}/{{}}/commits/commit/{{}}z-{}/{{}}/{{}}/branches/commits/{{}}..{{}}#diff   GitHubz{}/{{}}/{{}}/pull/{{}}z{}/{{}}/{{}}/discussions/{{}}z{}/{{}}/{{}}/commit/{{}}z {}/{{}}/{{}}/compare/{{}}...{{}})
r@   rM   rN   rO   rP   r   discussrQ   rR   rS   Twitter)r@   rM   rN   rO   X)r%   r#   r$   r&   r'   c                     [         U    R                  5       nS H<  nX2;  a  M
  X#   R                  UR                  5       R	                  S5      5      X#'   M>     U$ )z+Create the provider with the provided host.)rN   rP   r   rQ   rR   rW   r5   )PROVIDER_TEMPLATEScopyr>   r9   r:   )r@   rA   entrykeys       r/   create_providerr_   8  sW     x(--/EGZ&&tzz|':':3'?@
 H Lr1   zhttps://twitter.comzhttps://x.com)r&   r'   r%   r#   r$   c                       \ rS rSrSrS rSrg)_MagiclinkShorthandPatterniL  zBase shorthand link class.c	                     X0l         X@l        X`l        Xpl        Xl        XPR                  ;   a  UOSU l        [        R                  " XU5        g)Initialize. N)userr   labels	normalizeprovider_infor@   r	   __init__)	selfpatternmdre   r   r@   rf   rg   rh   s	            r/   ri   #_MagiclinkShorthandPattern.__init__O  sB     		"*$,0B0B$B  3r1   )rf   rg   r@   rh   r   re   N)__name__
__module____qualname____firstlineno____doc__ri   __static_attributes__ r1   r/   ra   ra   L  s
    $	4r1   ra   c                   *    \ rS rSrSrS rS rS rSrg)_MagiclinkReferencePatterni[  zfConvert #1, repo#1, user/repo#1, !1, repo!1, user/repo!1, hash, repo@hash, or user/repo@hash to links.c           
         USS nUSS nUS:X  a3  U R                   U   S   nU R                  R                  SS5      n	Sn
UnOUS:X  aF  U R                   U   S   nU R                  R                  SS	5      n	S
n
U R                  (       a  SOUnOcU R                   U   S   S:X  aL  US:X  aF  U R                   U   S   nU R                  R                  SS5      n	Sn
U R                  (       a  SOUnOgU R                  (       a   [
        R                  " U U 35      Ul        OWU R                  (       a"  [
        R                  " U U U 35      Ul        O$[
        R                  " U SU U U 35      Ul        UR                  SUR                  X4U5      5        UR                  SSU SU
 35        UR                  SSR                  U R                   U   S   U	UUU5      5        g)zProcess issues.Nr   #rP   Issuemagiclink-issue!r   Pull Requestmagiclink-pullrM   r$   ?rW   
Discussionmagiclink-discussionFr5   hrefclassmagiclink magiclink- titlez{} {}: {}/{} #{}r@   T)rh   rf   getrg   my_repomd_utilAtomicStringtextmy_usersetr>   )rj   elr@   re   r   rP   
issue_typeissue_value
issue_linkissue_label
class_nameicons               r/   process_issues)_MagiclinkReferencePattern.process_issues^  s    2AY
ABi++H5g>J++//'7;K*JD3++H5f=J++//&.AK)J..3jD)&1X=*PSBS++H5i@J++//)\BK/J..3jD<<**dVK=+ABBG\\**dVD6++GHBG**dV1TF4&+NOBG
vz(([AB
w.xj*FG
%%""8,Z8		
 r1   c           
          USU R                   U   S    nU R                  (       a  UnO#U R                  (       a  U SU 3nO
U SU SU 3nUR                  SU R                   U   S   R	                  X4U5      5        [
        R                  " U5      Ul        UR                  SSU S	35        UR                  S
SR	                  U R                   U   S   U R                  R                  SS5      UUU5      5        g)Process commit.r   rS   @r5   r   rQ   r   r   z magiclink-commitr   z{} {}: {}/{}@{}r@   CommitN
rh   r   r   r   r>   r   r   r   rf   r   )rj   r   r@   re   r   rQ   hash_refr   s           r/   process_commit)_MagiclinkReferencePattern.process_commit  s     !D..x8EF<<D\\V1XJ'DV1TF!H:.D
vt))(3H=DDTQWXY&&t,
w.xj8IJK
$$""8,Z8(3		
r1   c                 B   USU R                   U   S    nUSU R                   U   S    nU R                  (       a  U SU 3n	O)U R                  (       a  U SU SU 3n	OU SU SU SU 3n	UR                  SU R                   U   S   R	                  X4XV5      5        [
        R                  " U	5      Ul        UR                  SS	U S
35        UR                  SSR	                  U R                   U   S   U R                  R                  SS5      UUUU5      5        g)r   r   rS   ...r   r5   r   rR   r   r   z magiclink-comparer   z{} {}: {}/{}@{}...{}r@   CompareNr   )
rj   r   r@   re   r   commit1commit2	hash_ref1	hash_ref2r   s
             r/   process_compare*_MagiclinkReferencePattern.process_compare  s1    Ad00:;GH	Ad00:;GH	<<[I;/D\\V1YKs9+6DV1TF!I;c)=D
vt))(3I>EEdRYcd&&t,
w.xj8JKL
"))""8,Z8	95
	
r1   rt   N)	rn   ro   rp   rq   rr   r   r   r   rs   rt   r1   r/   rv   rv   [  s    p+Z
2
r1   rv   c                       \ rS rSrSrSrSrSrSrSr	Sr
S	rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)MagicShortenerTreeprocessori  zHTree processor that finds repo issue and commit links and shortens them.r   r   r
               c                     X l         X`l        Xpl        Xl        X0l        X@l        XPl        Xl        Xl        SSSS.U l	        Xl
        [        R                  " X5        g)rc   rV   rT   rK   r2   N)baserepo_shortnersocial_shortenercustom_shortners	base_userrepo_labelsrg   r@   rh   rf   excludesr   ri   )rj   rl   base_urlbase_user_urlrf   rg   r   r   r   r   r@   rh   s               r/   ri   $MagicShortenerTreeprocessor.__init__  s]      	* 0 0&!" *$

 !t(r1   c           
          Un[         R                  " U5      Ul        SU;  a  UR                  S5        UR	                  SSR                  X0R                  R                  SS5      U5      5        g)zShorten repo link.zmagiclink-repositoryr   	{} {}: {}
repository
RepositoryNr   r   r   appendr   r>   r   r   )rj   linkr   label	user_repor   s         r/   shorten_repo(MagicShortenerTreeprocessor.shorten_repo  sg     ((.	!345''++L,G	
r1   c           
          [         R                  " SU 35      Ul        SU;  a  UR                  S5        UR	                  SSR                  X0R                  R                  SS5      U5      5        g)zShorten user link.r   zmagiclink-mentionr   r   metionUserNr   )rj   r   r   r   r   s        r/   shorten_user(MagicShortenerTreeprocessor.shorten_user  sh     ((1YK9	j012''++Hf=y	
r1   c                    U R                   R                  SS5      nU R                  (       a  US   SU  SUS   SU  3nOYU R                  (       a2  SR	                  UR                  S5      S   US   SU US   SU 5      nOU SUS   SU  SUS   SU  3n[        R                  " U5      Ul        S	U;  a  UR                  S	5        UR                  S
SR	                  X7UR                  S5      US   SU US   SU 5      5        g)zShorten diff/compare links.rR   r   r   r   r   z
{}@{}...{}r5   r   zmagiclink-comparer   z{} {}: {}@{}...{}Nr   r   r   r   r>   splitr   r   r   r   r   r:   	rj   r   r   r   r   valuerS   
repo_labelr   s	            r/   shorten_diff(MagicShortenerTreeprocessor.shorten_diff  s2    %%)))Y?
<<Ahq+,Ca90E/FGD\\&&ys';A'>a9@UW\]^W_`abkWlmD[%(1Y"7!8E!HQy<Q;RSD((.	j012&&9#3#3C#8%(1Y:OQVWXQYZ[\eQf	
r1   c                    U R                   R                  SS5      nU R                  (       a  USU nOCU R                  (       a(  SR	                  UR                  S5      S   USU 5      nO
U SUSU  3n[        R                  " U5      Ul        SU;  a  UR                  S5        UR                  S	S
R	                  X7UR                  S5      USU 5      5        g)zShorten commit link.rQ   r   r   z{}@{}r5   r   r   zmagiclink-commitr   z{} {}: {}@{}Nr   r   s	            r/   shorten_commit*MagicShortenerTreeprocessor.shorten_commit"  s     %%))(H=
<<9%D\\>>)//#"6q"959;MND[%)"4!56D((.	Z/01!!%Y5E5Ec5JERST]L^_	
r1   c           
         U R                   U   S   nXpR                  :X  a6  U R                  R                  SS5      n	Sn
SU;  a  UR	                  S5        OXpR
                  :X  aI  U R                  R                  SS5      n	U R                  (       a  SOSn
S	U;  a  UR	                  S	5        O]US
:X  aW  XpR                  :X  aH  U R                  R                  SS5      n	U R                  (       a  SOSn
SU;  a  UR	                  S5        U R                  (       a   [        R                  " W
 U 35      Ul        OqU R                  (       a?  [        R                  " SR                  UR                  S5      S   W
U5      5      Ul        O![        R                  " U W
 U 35      Ul        UR                  SSR                  UW	UR!                  S5      U5      5        g)zShorten issue/pull link.rM   rP   ry   rx   rz   r   r|   r{   r}   r$   rW   r   r~   r   z{}{}{}r5   r   r   z{} {}: {} #{}N)rh   ISSUEr   r   r   PULLrg   DISCUSSr   r   r   r   r   r>   r   r   r:   )rj   r@   r   r   r   r   r   	link_typer.   r   r   s              r/   shorten_issue)MagicShortenerTreeprocessor.shorten_issue7  s    **84V<

"))--gw?JD 
2!!"34))#))--fnEJ..3cDz1!!"23h&9+D))--iFJ..3cD%Z7!!"89<<,,veW-=>DI\\,,X__Y__S=QRS=TVZ\a-bcDI,,	{4&-HIDI/00
IDTDTUXDY[`abr1   c           	         U R                   U   S   nSU 3nUR                  SS5      n	U	(       a  U	R                  S5      O/ n
SU
;  a  U
R                  S5        X;  a  U
R                  U5        X0R                  L a  U R                  XXtXV5        O6X0R                  L a  U R                  XXtXV5        OU R                  X!XXEU5        UR                  SSR                  U
5      5        gzShorten URL.r@   z
magiclink-r   rd   r   	magiclinkN)rh   r   r   r   DIFFr   COMMITr   r   r   join)rj   r   r@   r   r   r   rS   r   
prov_class
class_attrr   s              r/   shorten_issue_commit0MagicShortenerTreeprocessor.shorten_issue_commitU  s     ""8,Z8!(,
XXgr*
.8Z%%c*b
j(k*'j) 		!d%S++%%EUxz)T]^#((:./r1   c                    U R                   U   S   nSU 3nUR                  SS5      nU(       a  UR                  S5      O/ nSU;  a  UR                  S5        Xh;  a  UR                  U5        X0R                  L a  U R                  XXT5        OU R                  XXT5        UR                  SSR                  U5      5        gr   )	rh   r   r   r   REPOr   r   r   r   )	rj   r   r@   r   r   r   r   r   r   s	            r/   shorten_user_repo-MagicShortenerTreeprocessor.shorten_user_repol  s     ""8,Z8!(,
XXgr*
.8Z%%c*b
j(k*'j) 		!dAdA#((:./r1   c                     UR                  S5      (       a  SnU$ UR                  S5      (       a  SnU$ UR                  S5      (       a  SnW$ )zGet the provider and hash size.r$   r#   r%   r=   rj   r<   r@   s      r/   get_provider_type-MagicShortenerTreeprocessor.get_provider_type  sW     ;;x  H
 	 [[%%"H  [[""Hr1   c                 j    UR                  S5      (       a  SnU$ UR                  S5      (       a  SnW$ )zGet social provider.r&   r'   r   r   s      r/   get_social_provider/MagicShortenerTreeprocessor.get_social_provider  s:     ;;y!! H  [[Hr1   c                     UR                  US-   5      b7  UR                  US-   5      UR                  US-   5      4nU R                  nX44$ UR                  US-   5      b#  UR                  US-   5      nU R                  nX44$ UR                  US-   5      b#  UR                  US-   5      nU R                  nX44$ US:X  a8  UR                  US-   5      b#  UR                  US-   5      nU R                  nX44$ UR                  US-   5      nU R
                  n X44$ ! [         aT    S	n UR                  US
-   5      b  SnU R                  nSnO! [         a     Of = fU(       d  SnU R                  n WW4$ f = f)zGet the link type._diff1N_diff2_commit_pullr$   _discuss_issueF_repoT)	r=   r   r   r   r   r   
IndexErrorr   USER)rj   r@   r<   r   r   founds         r/   get_type$MagicShortenerTreeprocessor.get_type  s   	&{{8h./;X%895;;xRZGZ;[\ II	4 3 X	12>Hy$89 KK	. - X/0<Hw$67 II	( ' X%%++h6K*L*XHz$9: LL	"  Hx$78 JJ	   	&E;;x'12> E $		I E  II	i	&sN   A	D  5D  5D  >;D  < D   E>-%EE>
E E>E  E>=E>c                 p    U R                   =(       a$    UR                  US-   5      S-   U R                   :H  $ )z2Check if link is from our specified user and repo._baser5   )r   r=   rj   r.   r<   s      r/   
is_my_repo&MagicShortenerTreeprocessor.is_my_repo  s/     yyTU[[)@ACG499TTr1   c                     U R                   =(       a-    UR                  US-   5      R                  U R                   5      $ )z)Check if link is from our specified user.r   )r   r=   
startswithr   s      r/   
is_my_user&MagicShortenerTreeprocessor.is_my_user  s3     ~~a%++mg.E"F"Q"QRVR`R`"aar1   c                     UR                  US-   5      nUR                  5       U R                  R                  U[	        5       5      ;   $ )z Check if user has been excluded._user)r=   r9   r   r   r   )rj   r.   r@   r<   re   s        r/   excluded$MagicShortenerTreeprocessor.excluded  s;     {{=723zz|t}}0035AAAr1   c                 
   U R                   S   U l        UR                  S5      nU GH8  n[        [	        U5      5      nUR
                  R                  S5      nUR
                  R                  SS5      nUR                  nSnU(       a  UR
                  S	 U(       d  U(       d  M  Xv:X  d'  U(       d  M  U R                  (       d  M  SU-   U:X  d  M  U R                  (       a  [        R                  U5      n	U	(       a  U R                  U	5      n
U
nU R                  X5      U l        U R                  =(       d    U R                  X5      U l        U R!                  X5      u  pSnU R#                  XU	5      (       d8  U R%                  UUUU	R'                  U
S	-   5      UU R(                  U   S
   5        U(       d  U R                  (       a  [*        R                  U5      n	U	(       a  U R                  U	5      n
U
nU R                  X5      U l        U R                  =(       d    U R                  X5      U l        U R!                  X5      u  pSnU R#                  XU	5      (       d&  U R-                  UUUU	R'                  U
S	-   5      5        U(       Gd  U R.                  (       Ga  U R.                  R1                  5        GH  u  pUS   R                  U5      n	U	(       a  UnU R(                  U   S   n
U R                  X5      U l        U R                  =(       d    U R                  X5      U l        U R!                  X5      u  pSnU R#                  XU	5      (       d8  U R%                  UUUU	R'                  U
S	-   5      UU R(                  U   S
   5        U(       a  M  US   R                  U5      n	U	(       d  M  UnU R(                  U   S   n
U R                  X5      U l        U R                  =(       d    U R                  X5      U l        U R!                  X5      u  pSnU R#                  XU	5      (       a  GM  U R-                  UUUU	R'                  U
S	-   5      5        GM     U(       a  GMQ  U R2                  (       d  GMe  [4        R                  U5      n	U	(       d  GM  U R7                  U	5      nUS:X  a  [9        S5        U R                  X5      U l        U R                  =(       d    U R                  X5      U l        U R!                  X5      u  pU R#                  XU	5      (       a  GM  U R-                  UUUU	R'                  US-   5      5        GM;     U$ )z%Shorten popular git repository links.hide_protocolar   r   rd   Fzhttps://T
_user_reporS   r   rM   re   r&   IThe 'twitter' social provider has been deprecated, please use 'x' insteadr  )configr  iterlenlistattribr   r   r   RE_REPO_LINKr<   r   r   r   r  r   r   r  r   r=   rh   RE_USER_REPO_LINKr   r   itemsr   RE_SOCIAL_LINKr   r   )rj   rootlinksr   	has_childis_magicr   r   r   rE   r.   r@   r   r   customr]   s                   r/   runMagicShortenerTreeprocessor.run  s}    "[[9		#DDJI{{{3H;;??62.D99DEKK,  d.@.@.@jSWFW\`E`%%$**40A(,(>(>q(A#0'+}'H'+||'Xt}7X+/==+J( $  $}}]aHH 55 $ ( ) !(D E % $ 2 28 <[ I !3!3)//5A(,(>(>q(A#0'+}'H'+||'Xt}7X+/==+J( $#}}]aHH 22 $ ( ) !(D E	 !6!6!6)-)>)>)D)D)F!&M//5'-H,0,>,>v,Fv,NM+/??=+LDL+/<<+\4??=;\DL/3}}]/N,E$(E $(==!#L#L $ 9 9$($,$-$%GGML,H$I$)$($6$6x$@$M!"  %u %f 3 3D 9A q+1040B0B60J60R/3}/P/3||/`t}?`37==3R 0(,'+}}]a'P'P$($:$:(,(0(1()0L(M	%&A *GN u!6!6!6&,,T2Aq#'#;#;A#>#y0+,wx'+x'C'+||'Stx7S+/==+E(#}}XCC 22 $ ( ) !7(: ;	W b r1   )r   r   r   r   r  rf   r   r   rg   r@   rh   r   r   r   N)rn   ro   rp   rq   rr   r   r   r   r   r   r   r   ri   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rs   rt   r1   r/   r   r     s|    R EDFGDDD)B
 

,
*c<0.0*
! FUb
Bwr1   r   c                   "    \ rS rSrSrSrS rSrg)MagiclinkPatterniE  z+Convert html, ftp links to clickable links.r  c                    [         R                  " S5      n[        R                  " UR	                  S5      5      Ul        UR	                  S5      (       a!  SR                  UR	                  S5      5      nOiUR	                  S5      nU R                  S   (       aD  [        R                  " UR
                  UR
                  R                  S5      S-   S 5      Ul        UR                  S	U R                  UR                  5       5      5        U R                  R                  S
S5      (       a  UR                  S[        [        5      5        X1R                  S5      UR!                  S5      4$ )zHandle URL matches.r  r   rB   z	http://{}r  ://r   Nr   repo_url_shortenerFr   r   )etreeElementr   r   r=   r   r>   r  findr   unescapestripr   str
MAGIC_LINKstartend)rj   rE   datar   r   s        r/   handleMatchMagiclinkPattern.handleMatchJ  s     ]]3&&qwwv7775>>%%aggfo6D776?D{{?+!..rwwrww||E7JQ7N7O/PQ
vt}}TZZ\23;;??/77FF;J0771:quuQx''r1   rt   Nrn   ro   rp   rq   rr   ANCESTOR_EXCLUDESr/  rs   rt   r1   r/   r   r   E  s    5(r1   r   c                       \ rS rSrSrS rSrg)MagiclinkAutoPatterni]  z@Return a link Element given an auto link `<http://example/com>`.c                 V   [         R                  " S5      nUR                  SU R                  UR	                  S5      5      5        [
        R                  " UR	                  S5      5      Ul        U R                  S   (       aD  [
        R                  " UR                  UR                  R                  S5      S-   S 5      Ul        U R                  R                  SS	5      (       a  UR                  S
[        [        5      5        X1R                  S5      UR                  S5      4$ )z(Return link optionally without protocol.r  r   r   r  r#  r   Nr$  Fr   r   )r%  r&  r   r(  r=   r   r   r   r  r'  r   r*  MAGIC_AUTO_LINKr,  r-  )rj   rE   r.  r   s       r/   r/   MagiclinkAutoPattern.handleMatch`  s     ]]3
vt}}QWWQZ01&&qwwqz2;;'**277277<<3F3J3K+LMBG;;??/77FF;O 45771:quuQx''r1   rt   N)rn   ro   rp   rq   rr   r/  rs   rt   r1   r/   r4  r4  ]  s
    J(r1   r4  c                   (    \ rS rSrSrSrS rS rSrg)MagiclinkMailPatternio  z(Convert emails to clickable email links.r!  c                 0    [         R                   SUS S3$ )z=Return entity definition by code, or the code if not defined.rx   d;)r   AMP_SUBSTITUTE)rj   codes     r/   email_encode!MagiclinkMailPattern.email_encodet  s    (()4(!44r1   c                    [         R                  " S5      nU R                  UR                  S5      5      nSU 3n[        R
                  " SR                  U Vs/ s H  o`R                  [        U5      5      PM     sn5      5      Ul	        UR                  SSR                  U Vs/ s H$  n[        R                  S[        U5      S S3-   PM&     sn5      5        X1R                  S	5      UR                  S	5      4$ s  snf s  snf )
Handle email link patterns.r  mailzmailto:rd   r   rx   r;  r<  r   )r%  r&  r(  r=   r   r   r   r?  ordr   r   r=  r,  r-  )rj   rE   r.  r   emailr   cs          r/   r/   MagiclinkMailPattern.handleMatchx  s     ]]3aggfo. &&rwwSX/YSXa0A0A#a&0ISX/Y'Z[
vrwwRVWRVQ 6 61SVAJa HRVWXY771:quuQx'' 0ZWs   #D)+Drt   N)	rn   ro   rp   rq   rr   r2  r?  r/  rs   rt   r1   r/   r9  r9  o  s    25(r1   r9  c                   "    \ rS rSrSrSrS rSrg)MagiclinkMentionPatterni  zConvert @mention to links.r!  c           
         UR                  S5      SS nUR                  S5      n[        U5      S:  a  US   nUS   nOU R                  nUS   nUS:X  a  [	        S5        [
        R                  " S5      nUR                  S	S
R                  U R                  U   S   U5      5        UR                  SSR                  U R                  U   S   U R                  R                  SS5      U5      5        UR                  SSU S35        [        R                  " SU 35      Ul        XqR                  S5      UR!                  S5      4$ )rB  mentionr   Nr)   r   r&   r  r  r   z{}/{}rN   r   r   r@   r   r   r   z magiclink-mentionr   )r=   r   r  r@   r   r%  r&  r   r>   rh   rf   r   r   r   r   r,  r-  )rj   rE   r.  r   partsr@   rK  r   s           r/   r/  #MagiclinkMentionPattern.handleMatch  s.    wwy!!"%

3u:>QxHAhG}}HAhGy gh]]3
vw~~d&8&8&B5&I7ST
t11(;JGYbdjIkmtu	
 	w.xj8JKL&&7)}5771:quuQx''r1   rt   Nr1  rt   r1   r/   rI  rI    s    $(r1   rI  c                   "    \ rS rSrSrSrS rSrg)MagiclinkRepositoryPatterni  zConvert @user/repo to links.r!  c           
         UR                  S5      SS nUR                  S5      n[        U5      S:  a  US   nUS   nOU R                  nUS   nUR                  S5      n[        R
                  " S5      nUR                  SS	R                  U R                  U   S
   Xg5      5        UR                  SSR                  U R                  U   S   U R                  R                  SS5      Xg5      5        UR                  SSU S35        [        R                  " U SU 35      Ul        XR                  S5      UR                  S5      4$ )rB  rK  r   Nr)   r   mention_repor  r   z{}/{}/{}rN   r   z{} {}: {}/{}r@   r   r   r   r   z magiclink-repositoryr5   )r=   r   r  r@   r%  r&  r   r>   rh   rf   r   r   r   r   r,  r-  )	rj   rE   r.  r   rL  r@   re   r   r   s	            r/   r/  &MagiclinkRepositoryPattern.handleMatch  s4    wwy!!"%

3u:>QxH8D}}H8Dww~&]]3
vz((););H)Ee)LdYZ
!!""8,Z8$++//,Xd:egk	
 	w.xj8MNO&&$q'78771:quuQx''r1   rt   Nr1  rt   r1   r/   rO  rO    s    &(r1   rO  c                   "    \ rS rSrSrSrS rSrg)MagiclinkExternalRefsPatterni  zXConvert repo#1, user/repo#1, repo!1, user/repo!1, repo@hash, or user/repo@hash to links.r!  c                    UR                  S5      nUR                  S5      nU(       a  UR                  S5      SS OUR                  S5      nU(       a  UR                  S5      OSnUR                  S5      nUR                  S5      nU(       d  U R                  nUR                  S5      n	[        U	5      S:  a  U	S	   n
U	S   nOU R                  n
U(       d  g
XR                  :H  =(       a    XR                  :H  U l        U R
                  =(       a    XpR                  :H  U l        [        R                  " S5      nU(       a  U R                  XXXV5        OeU(       a  U R                  XXU5        OJU R                  XXU5      (       d2  UR                  S	5      UR                  S	5      UR                  S	5      4$ XR                  S	5      UR                  S	5      4$ )rB  rQ   diffr   NrP   r   re   r)   r   NNNr  )r=   re   r   r  r@   r   r   r   r%  r&  r   r   r   r,  r-  )rj   rE   r.  	is_commitis_diffr   value2r   re   rL  r@   r   s               r/   r/  (MagiclinkExternalRefsPattern.handleMatch  sq    GGH%	''&/)2!!"%8H$+wwvwwv99D

3u:>QxH8D}}H #yy(FX-F||9		(9]]3  t5Id%@&&rTGGwwqz1771:quuQx77771:quuQx''r1   r   r   Nr1  rt   r1   r/   rT  rT    s    b#(r1   rT  c                   "    \ rS rSrSrSrS rSrg)MagiclinkInternalRefsPatterni  z Convert #1, !1, and commit_hash.r!  c                    U R                   (       a  U R                  (       d  gUR                  S5      nUR                  S5      nU(       a  UR                  S5      OUR                  S5      nU(       a  UR                  S5      OSnU R                  nU R                   nU R                  n	SU l        SU l        [        R                  " S5      n
U(       a  U R                  XXXV5        OeU(       a  U R                  XXU5        OJU R                  XXU5      (       d2  UR                  S5      UR                  S5      UR                  S5      4$ XR                  S5      UR                  S5      4$ )	rB  rW  rQ   rV  rP   NTr  r   )re   r   r=   r@   r   r   r%  r&  r   r   r   r,  r-  )rj   rE   r.  rX  rY  r   rZ  r   re   r@   r   s              r/   r/  (MagiclinkInternalRefsPattern.handleMatch  s    yy		#GGH%	''&/%.!AGGG4D$+yyyy==]]3  t5Id%@&&rTGGwwqz1771:quuQx77771:quuQx''r1   r\  Nr1  rt   r1   r/   r^  r^    s    *(r1   r^  c                   J   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	rU =r$ )
MagiclinkExtensioni  zCAdd auto link and link transformation extensions to Markdown class.c                    > SS/SS/SS// SQ/ SQ/ SQ/ SQ/ SQS	.S
/SS/SS/SS/0 S/SS/SS/SS/0 S/S.U l         [        TU ]  " U0 UD6  g)rc   Fz^If 'True', links are displayed without the initial ftp://, http:// or https://- Default: FalsezDIf 'True' repo commit and issue links are shortened - Default: Falsez5If 'True' social links are shortened - Default: Falser   r   r   r   r"   z4A list of user names to exclude from URL shortening.zFIf 'True' repo shorthand syntax is converted to links - Default: FalsezHIf 'True' social shorthand syntax is converted to links - Default: Falser$   zKThe base provider to use (github, gitlab, bitbucket, x) - Default: "github"zTitle labels - Default: {}zLNormalize issue, pull, and discussions symbols all to use # - Default: Falserd   z'The base user name to use - Default: ""z"The base repo to use - Default: ""z&Custom repositories hosts - Default {})r  r$  social_url_shortenershortener_user_excluderepo_url_shorthandsocial_url_shorthandr@   rf   normalize_issue_symbolsre   r   r  N)r  superri   )rj   argskwargs	__class__s      r/   ri   MagiclinkExtension.__init__  s    
 # V#
 G% "VsOE? G	' X#
 Z%
 ]
 ,
 ^(
 9
 4
 8i8
r 	$)&)r1   c                 &   [        [        U5      nX#l        UR                  R	                  USS5        [        [        U5      nX$l        UR                  R	                  USS5        UR                  R	                  [        [        U5      SS5        g)zSetup auto links.autolinkx   z
magic-linkU   z
magic-mailg9U@N)	r4  RE_AUTOLINKr  inlinePatternsregisterr   RE_LINKr9  RE_MAIL)rj   rl   r  auto_link_patternlink_patterns        r/   setup_autolinks"MagiclinkExtension.setup_autolinksP  s{     1bA#) 
""#4j#F'4$
""<rB
""#7#DlTXYr1   c           
         S/n[         R                  " X5        U R                  (       Ga  [        U R                  UU R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  R                  USS5        U R                  (       d  [        [        R                  U R                   5      UU R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  R                  USS5        ["        R                  SR%                  U R&                  5      5      n[)        UUU R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  R                  USS5        [)        [*        R                  U R                   5      UU R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  R                  US	S
5        U R                  (       Ga  [-        U R.                  UU R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  R                  USS5        U R                  (       d  [-        [0        R                  U R                   5      UU R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  R                  USS5        [3        [4        UU R
                  U R                  U R                  U R                  U R                  U R                  5      n	UR                  R                  U	SS5        ggg)zSetup shorthand.r   zmagic-repo-ext-mentiongS@zmagic-repo-int-mentiong33333S@|zmagic-ext-mentiongS@zmagic-int-mentiongfffffS@zmagic-ext-refsg     S@zmagic-int-refsgS@zmagic-int-micro-refsg33333S@N)r   escape_chars	git_shortrO  re_git_ext_repo_mentionsre   r   r@   rf   rg   rh   rs  rt  	is_socialRE_GIT_INT_REPO_MENTIONSr>   int_mentionsRE_ALL_EXT_MENTIONSr   ext_mentionsrI  RE_INT_MENTIONSrT  re_git_ext_refsRE_GIT_INT_EXT_REFSr^  RE_GIT_INT_MICRO_REFS)
rj   rl   r}  git_ext_repogit_int_repork   git_mentiongit_ext_refsgit_int_refsgit_int_micro_refss
             r/   setup_shorthand"MagiclinkExtension.setup_shorthand^  s    u"+ >>>5--				""	L &&|5MtT>>9,33D4E4EFIIIIMMKKNN&&	  !!**<9QSWX &,,SXXd6G6G-HI-IIIIMMKKNN	
 	"";0CTJ-""4#4#45IIIIMMKKNN	
 	"";0CTJ >>>7$$				""	L &&|5EtL>>;'..t/@/@AIIIIMMKKNN&&	  !!**<9I4P%A)IIIIMMKKNN&&	&" !!**+=?UW[\- " r1   c                 <   [        UU R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  5      nX#l        UR                  R                  USS5        g)zSetup shortener.zmagic-repo-shortenerg#@N)r   r   r   rf   rg   r   r   r   shortener_exclusionsr@   rh   r  treeprocessorsrt  )rj   rl   r  	shorteners       r/   setup_shortener"MagiclinkExtension.setup_shortener  s     0MMKKNN!!!!%%MM
	 "
""9.DcJr1   c                 j   SnSnU R                   (       a  X#4$ U R                  (       a  U R                  (       aw  SR                  U R                  U R
                     S   U R                  U R                  5      nSR                  U R                  U R
                     S   U R                  5      nX#4$ )zGet base URLs.rd   z	{}/{}/{}/rN   z{}/{}/)r  re   r   r>   rh   r@   )rj   r  r   r   s       r/   get_base_urls MagiclinkExtension.get_base_urls  s     >>**99"))$*<*<T]]*KE*RTXT]T]_c_h_hiH$OOD,>,>t}},Me,TVZV_V_`M&&r1   c                 D
   U R                  5       nUR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  S0 5      U l        UR                  SS5      U l        U R                  [        ;   U l        UR                  S	S5      U l	        UR                  S
S5      U l
        UR                  SS5      U l        UR                  SS5      U l        [        R                  5        VVs0 s H  u  p4U[        U5      _M     snnU l        ["        R%                  5       U l        UR                  S0 5      nUR                  S0 5      n0 U l        [*        [,        [.        /nUR                  5        GHG  u  p[0        R3                  U5      (       d  [5        SU S35      eXR&                  ;  d  M@  [7        U	S   U	S   5      U R&                  U'   U	S   U R&                  U   S'   [8        R:                  " SR=                  [?        U	S   U	S   U	R                  SS5      5      5      5      [8        R:                  " SR=                  [A        U	S   U	S   U	R                  SS5      5      5      5      S.U R(                  U'   X;  a  UR                  U	S   / 5      Xh'   URC                  [E        XS   5      5        GMJ     [F        R=                  SRI                  U5      5      U l%        [L        R=                  SRI                  U5      5      U l'        UR                  S0 5      R                  5        He  u  pXR&                  ;   d  M  [Q        U[R        [T        [        45      (       d  M8  U Vs1 s H  oRW                  5       iM     snU R                   U
'   Mg     U R                  U R&                  ;  a  SU l        U RY                  X5        U R                  (       d  U R                  (       a  / U l-        U R                  (       a  U RZ                  R]                  U5        U R                  (       a>  U RZ                  RC                  [^        5        U RZ                  RC                  [`        5        U R&                  U R                     S   U l1        U Re                  U5        U R                  (       d  U R                  (       a0  U Rg                  U5      u  U l4        U l5        U Rm                  X5        ggs  snnf s  snf )z;Add support for turning html links and emails to link tags.re   rd   r   r@   r$   rf   rh  Frf  rg  r$  rd  r  re  zName 'zB' not allowed, provider name must contain only letters and numbersrM   rA   r   z(?xi)^{}/?$rB   T)r   re   r|  rO   N)7
getConfigsr   re   r   r@   rf   rg   SOCIAL_PROVIDERSr  r~  social_shortr   r   DEFAULT_EXCLUDESr  r   r  PROVIDER_INFOr\   rh   r   RE_GITHUB_EXT_MENTIONSRE_GITLAB_EXT_MENTIONSRE_BITBUCKET_EXT_MENTIONSRE_CUSTOM_NAMEr<   
ValueErrorr_   r7   compiler>   rF   rJ   r   r0   RE_GIT_EXT_REPO_MENTIONSr   r  RE_GIT_EXT_REFSr  
isinstancer  tupler9   ry  r  extendRE_X_EXT_MENTIONSRE_TWITTER_EXT_MENTIONSr  r  r  r   r   r  )rj   rl   r  kvcustom_providerr   external_usersr  r]   r^   r   r'   s                r/   extendMarkdown!MagiclinkExtension.extendMarkdown  s5    " JJvr*	JJvr*	

:x8jj2.$=uE*::$8%@"JJ'=uE#ZZ(<eD &

+A5 I;K;Q;Q;S$T;S41QAY;S$T!*//1 **Xr2::6; "02HJcd,224MF!''// VH$fg  ///-<U6]ERXM-Z""6*9>w""6*:6JJ&--4U6]E&MSXS\S\]bdhSij
 JJ&--4U6]E&MSXS\S\]bdhSij1%%f- )'/||E&M2'FH$%%&9&-&PQ- 50 )A(G(GQ_H`(a%.55chh~6NO **%=rBHHJJC(((ZeS?Q-R-REJ1KU'')U1K))#. K
 == 2 22$DMR(>>T.. "D~~!!((8  !!(():;!!(()@A $ 2 24== A. QD  $ !6!6040B0B60J-DM4-  , "7q %UH 2Ls   TT)r   r   r  r   r  r~  r  r  rf   rg   r@   rh   r  r  r   r   r  r  r   re   )rn   ro   rp   rq   rr   ri   ry  r  r  r  r  rs   __classcell__)rl  s   @r/   rb  rb    s1    M<*|Z^]@K.'J- J-r1   rb  c                      [        U 0 UD6$ )zReturn extension.)rb  )rj  rk  s     r/   makeExtensionr  1  s     t.v..r1   )T)Crr   markdownr   markdown.treeprocessorsr   r   r   r   xml.etree.ElementTreer%  ElementTreerd   r7   markdown.inlinepatternsr   r	   r+  r6  r  rv  ru  rr  r  r  RE_TWITTER_USER	RE_X_USERr*   r+   r,   r  r  r0   r  r  r  r  r  r  r  r  r  r  r;   r6   rF   r>   r  rI   rJ   r  r  r  r[   r_   r  ra   rv   r   r   r4  r9  rI  rO  rT  r^  rb  r  rt   r1   r/   <module>r     s  2  1 $ ! % %  	 H
 Fc?5	/ 	 /-. 	?F)   5. &o%67 )% ,Xx@ ,Xx@ /[I      
2	3	; 		S 	
	; 	
1# L	5 zz '' +?@ .EF +?@	 		 		 	 2	5 JJ '' +?@ .GH +?@  
 		* # 
 &-4.7
  )+14B
 &+(2,5 '	 !	
S/ d y*?@	o	.h(<= .EFh(<=4 4b
!; b
JB- BJ(* (0(? ($(? (((8 (@(!; (>((#= ((V(#= (D_- _-D	/r1   