o k`4@sddlZddlZddlTddlmZmZmZddlm Z m Z ddl m Z ddl mZddlmZmZmZdgZGd ddeZdS) N)*)content_to_unicodeIHTMLPreviewRendererMimeview)Markupescape) expandtabs)_)Chrome add_scriptadd_stylesheet PatchRendererc@s2eZdZdZeeddZd ddZddZdS) r zHTML renderer for patches in unified diff format. This uses the same layout as in the wiki diff view or the changeset view. cCs|dvrdSdS)N)z text/x-diffz text/x-patchr)selfmimetyperr5/usr/lib/python3/dist-packages/trac/mimeview/patch.pyget_quality_ratio+szPatchRenderer.get_quality_ratioNc Cs|j}t|j||}||t|jj}|r!tdd|Ds-|j d|t |dSddid|ddd }t |d t |d t |j|d |S) Ncss|]}|dVqdS)diffsNr.0crrr 5sz'PatchRenderer.render..z6Invalid unified diff content: %.40r... (%d characters)styleinlineTFile)diffno_idchangeslongcolshortcolzcommon/js/diff.jszcommon/css/diff.cssz diff_div.html)reqrenv _diff_to_hdf splitlinesr tab_widthanylogdebuglenr r r render_fragment) rcontextrcontentfilenamerevr"rdatarrrrender0s     zPatchRenderer.renderc0sdd}tdddg}g}t|}zt|} d}} } } g} } d}|d s|d s=|d kr=|||d krd}|d }|dd\}} tdd|Dr\d}tdd|Drgd} d|g} d| g} dd|D}|r|d dd\} } | | | | t|}|r||t|}|snt|}q| s| s|dd} t| dkr| d}t| dkr| d} t|}|ds|j d|WdS|dd} t| dkr| d} t| dkr| d} d}|s| rtd}d t j || ||g}d t j || ddd||dddgddd}t|t|kr:|}nZ|rg|d}|dt| }| dt| }t|dkrft|dkrf||f}n-|dkrxtd | d!d"}d#}n| dkrtd$|d%d&}d'}n d(|| f}d)}nd}g}g}|d*gd+ |||||d, | dd|d d-|d, | dd|dd-d.g}t|}|rtd/|}|sאng}||d0d|ddD\}}}}||d1d} }!||7}||7}t|}||ks||ks|!rd,}"|r$|d |dd}"}|"d,k| krL|"d,k} | r4d2nd3}#|#|dgd4|dgd4d5}$||$n|d}$|"d,krZd6d7g}%nT|"d8kred7}&|&g}%nI|"d9krpd6}&|&g}%n>|"d:kr|&r|$|&d;i}'d|'t|$|&d<<|&g}%n |"d=krd>|dtd?f|d<d=|}nA|j d@|"WdS|%D]}(|(d6kr|d7}n|d7}|$|(d<|qt|}|o|d d:k}!||ks||ks|!s|sqtyYnw|D]})|)dAD]}*|*D]}|d6|d7}+},|+d<|,d<}-}.|dBd3kr@t|-d kr&dC|dB<nt|.d kr2dD|dB<nt|-t|.kr@||-|.tt|-D]C}/t|-|/|dE}t|ddF}dG fdHd|dID}|dJdK}t||-|/<d;|+vr|/|+d;vrtdL|-|/|-|/<qFtt|.D]C}/t|.|/|dE}t|ddF}dM fdNd|dID}|dJdO}t||.|/<d;|,vr|/|,d;vrtdL|.|/|.|/<qqqq|S)PaE Translate a diff file into something suitable for inclusion in HDF. The result is [(filename, revname_old, revname_new, changes)], where changes has the same format as the result of `trac.versioncontrol.diff.hdf_diff`. If the diff cannot be parsed, this method returns None. c Ssddlm}tt|D]V}||||}}|||\}}|dks&|dkrb|t|}|d|d|||d||d||<|t|}|d|d|||d||d||<q dS)Nr)get_change_extent)trac.versioncontrol.diffr2ranger*) fromlinestolinesr2ifrtostartendlastrrr_markup_intraline_changeMs&     z._markup_intraline_changez ( +)|^ cSs,tt|dd\}}t|d|dS)Nrz  z )divmodr*groupr)matchdivmodrrrhtmlify[sz+PatchRenderer._diff_to_hdf..htmlifyTrFz--- zIndex: zC===================================================================zGIT binary patchrNcs|]}|dVqdS)znew fileN startswithrrrrrrz-PatchRenderer._diff_to_hdf..z /dev/nullcsrH)z deleted fileNrIrrrrrtrKcSsg|] }|dr|qS)zindex rIrrrr xsz.PatchRenderer._diff_to_hdf..z..r@z+++ zexpected +++ after ---, got %s)oldnewz ([/.~\\])/znew file %(new)szb/)rP)-+zdeleted file %(deleted)sza/)deleted)rTrSz(a) %s vs. (b) %s)abedit  )pathr/shortrev)changepropscommentsbinaryr diffs_titlerOrPz.@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)cSsg|]}t|pdqS)rN)int)rxrrrrLsunmodrE)offsetlines)typebasechangedrirjrTrS\metarg@z%s (%s)z#this hunk was shorter than expectedzexpected +, - or \, got %srrhaddremz)quoteszc3|] }|VqdSNsubrsegrFspace_rerrrr3r4zz %szc3rqrrrsrurwrrr#ryz)recompileiternextrJappendsplitr'r*r(r)joinosr[ commonprefixlstripr rCgroupsrB setdefault StopIterationr6rrreplacer)0r difflinestabwidthr?r_rrglineoldpatholdrevnewpathnewrevoldinfonewinfor` diffcmd_lineindexr\sepr commonsuffixcommonrVrWr groups_titlerblocksfromlinefromendtolinetoend last_typeextracommandkindblocksides last_siderlsideorBrirjftr9rrwrr$Ds                                 #          zPatchRenderer._diff_to_hdf)NN) __name__ __module__ __qualname____doc__ implementsrrr1r$rrrrr !s   )os.pathrrz trac.coretrac.mimeview.apirrrtrac.util.htmlrrtrac.util.textrtrac.util.translationr trac.web.chromer r r __all__ Componentr rrrrs