o k`ފ@spddlZddlZddlmZmZddlmZddlTddlm Z m Z ddl m Z m Z ddlTddlmZmZmZddlmZdd lmZmZdd lmZmZdd lmZdd lmZdd lm Z m!Z!ddl"m#Z#m$Z$ddl%m&Z&m'Z'ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4ddl5m6Z6m7Z7m8Z8ddl9m:Z:m;Z;ddlZ?Gddde>Z@dS)N)AttachmentModule Attachment) IntOption)*)IContentConverterMimeview)IPermissionPolicyIPermissionRequestor) ISearchSource search_to_sqlshorten_result)ITimelineEventProvider)as_intget_reporter_id)from_utimestamp to_utimestamp)tag) shorten_line)_tag_)get_diff_options diff_blocks)HTTPBadRequestIRequestHandler) ChromeINavigationContributorITemplateProvider accesskey add_ctxtnavadd_link add_notice add_scriptadd_stylesheet add_warning prevnext_nav web_context)IWikiPageManipulator WikiSystemvalidate_page_name) format_toOneLinerFormatter)WikiPagec@sXeZdZeeeeeee e e e Z ejZeddddZeddddZedd Zed d Zd Zd Zd dZddZddZddZddZddZddZddZddZ dd Z!dKd"d#Z"d$d%Z#d&d'Z$d(d)Z%d*d+Z&d,d-Z'd.d/Z(dLd1d2Z)d3d4Z*dMd7d8Z+d9d:Z,d;d<Z-d=d>Z.d?d@Z/dAdBZ0dCdDZ1dEdFZ2dGdHZ3dIdJZ4d0S)N WikiModulewikimax_sizeiz-Maximum allowed wiki page size in characters.default_edit_area_heightzODefault height of the textarea on the wiki edit page. (//Since 1.1.5//)cCtjSN)r' START_PAGEselfr62/usr/lib/python3/dist-packages/trac/wiki/web_ui.py@zWikiModule.cCr1r2)r'TITLE_INDEX_PAGEr4r6r6r7r8Ar9zPageTemplates/ DefaultPageccsdtdddddfVdS)Ntxtz Plain Texttext/x-trac-wikiz text/plain )rr4r6r6r7get_supported_conversionsGs  z$WikiModule.get_supported_conversionscCs|dfS)Nztext/plain;charset=utf-8r6)r5reqmimetypecontentkeyr6r6r7convert_contentKszWikiModule.convert_contentcCsdS)Nr-r6r5r@r6r6r7get_active_navigation_itemPz%WikiModule.get_active_navigation_itemccsd||j|jvrddtjtd|jt|ddfVd||jdvr?dd tjtd |jdt|d dfVdSdS) N WIKI_VIEWmainnavr-Wiki)hrefr TracGuidemetanavhelpz Help/Guide) permrealmr3rarrLr-rrEr6r6r7get_navigation_itemsSs zWikiModule.get_navigation_itemscCsgd}|d|fgS)N) WIKI_CREATE WIKI_DELETE WIKI_MODIFY WIKI_RENAMErH WIKI_ADMINr6)r5actionsr6r6r7get_permission_actions_sz!WikiModule.get_permission_actionscCs4td|j}|r|dr|d|jd<dSdS)Nz/wiki(?:/(.+))?$rKpage)rematch path_infogroupargs)r5r@r^r6r6r7 match_requestfs  zWikiModule.match_requestc Cs|jdd}|jd|j}d}|jdr|jd}|jd}|ds1|ds1d|vrDtdd|d}| |j |t |sPt td |d t|j|}t|j||}||jd |rw|j|krwttd ||jd t|d|jdkr|dkrd|jvr| |j |j||jk}dD] } | |jvr| }nq|jd|_|||} |dkr|s| r|||S|||||S|dkr|||dS|dkr|||dS|dkr|||S|dkrt |\} } } | dd}| |j j |jd|||p dddSt!td|dkr$|"||S|dkr/|#||S|dkr:|||S|dkrE|$||S|dkrP|%||S|dkr[|&||S|jd}|rrt'|j(|d|j||j|)||S)Nactionviewr\version old_version/z///{2,}z!Invalid Wiki page name '%(name)s'namerHz-No version "%(num)s" for Wiki page "%(name)s"numrjzcommon/css/wiki.cssPOSTeditcancel)previewdiffmergetext edit_commentdeleterenamerqoptions contextall)rcrfrerxzInvalid request arguments.historyformatr=)*ragetr3getint startswithendswithr]substripredirectrLr-r( TracErrorrr+envrQresourcerequirereResourceNotFoundrjr"methodrs _validate_do_save_render_editor_do_edit_comment _do_delete _do_renamerr_render_confirm_delete_render_confirm_rename_render_edit_comment _render_diff_render_historyrsend_converted _render_view)r5r@rcpagenamererfr\versioned_page has_collisionrSvalidstylerw diff_datarxrzr6r6r7process_requestms                              zWikiModule.process_requestcCsgSr2r6r4r6r6r7get_htdocs_dirsrGzWikiModule.get_htdocs_dirscCstddgS)Nz trac.wiki templates) pkg_resourcesresource_filenamer4r6r6r7get_templates_dirsszWikiModule.get_templates_dirsc Csd}t|jdd|jkrt|td|jdd}|jD](}|||D]\}}d}|r;t|tdt ||dq%t|td |d q%q|S) NTrsz@The wiki page is too long (must be less than %(num)s characters)rlFz5The Wiki page field %(field)s is invalid: %(message)s)fieldmessagezInvalid Wiki page: %(message)s)r) lenrar{r.r#rpage_manipulatorsvalidate_wiki_pagerrstrong)r5r@r\r manipulatorrrr6r6r7rs&    zWikiModule._validatercCs*t|j|j}|r|d|7}|||dS)Nz (%s))r\rctitle)get_resource_summaryrr)r5r@r\rcrr6r6r7 _page_datas  zWikiModule._page_datacst\}}} d} |D]} | drt| dd} nq | dkr#d} t||| d|vd|vd|vd} dfd d } | g| ||| |d g}td td | |fS)Nz-Urz-Bz-iz-b)contextignore_blank_lines ignore_caseignore_space_changescsBtjj|p td|p|d|rjjj|ddSddS)Nzcurrently editedrKre)pathrevshortrevrL)get_resource_namerrrrLr-rj)vlastr\r@r5r6r7 version_infos   z.WikiModule._prepare_diff..version_info)diffspropsnewoldzcommon/css/diff.csszcommon/js/diff.js)r)rr}intrr"r!)r5r@r\old_textnew_textrf new_version diff_style diff_optionsr diff_contextoptionrrchangesr6rr7 _prepare_diffs,   zWikiModule._prepare_diffcCs||jd|jd}d}}|dkr|j}|d}|jj|j|||d}d|jvr3| ||jd}| |t |t d|j|jd | |dS) NrY redirect_torqrK)rcrerfro new_commentzIThe comment of version %(version)s of the page %(name)s has been updated.rerj) rQrrrar{rerLr-rjrrtr r)r5r@r\rrerf redirect_hrefrr6r6r7rs"      zWikiModule._do_edit_commentcCs>||jdd|jvr|t|j|j|j|jd}|jd|}|jj %|rD|rD||krDt ||D] }| |dq9n| |Wdn1sSwY|j sot |td|jd||jdS|r|r||dkrt |td|d||jd n t |td ||jd ||j|jdS) NrVrorerfrKz#The page %(name)s has been deleted.rizHThe versions %(from_)d to %(to)d of the page %(name)s have been deleted.)from_torjz>The version %(version)d of the page %(name)s has been deleted.r)rQrrrarget_resource_urlrrLr|db_transactionrangeruexistsr rrjr-)r5r@r\rerfrr6r6r7rs4       zWikiModule._do_deletec Cs||jdd|jvr|t|j|j|j|j|j }}|j dd}t dd| d}|j d}d}|sAtd}nt|sJtd }n||krStd }n t|j|jr`td |d }|rnt||||||S|jj.}|||rt|j|} td |d | _t|} d||||f} | | | Wdn1swYt|td||d|rt|td||d||j|r|n|dS)NrXronew_namerrhrgrz%A new name is mandatory for a rename.zWThe new name is invalid (a name which is separated with slashes cannot be '.' or '..').z1The new name must be different from the old name.z!The page %(name)s already exists.rizSee [wiki:"%(name)s"].u"[wiki:"%s@%d" %s] → [wiki:"%s"].z7The page %(old_name)s has been renamed to %(new_name)s.)old_namerzIThe page %(old_name)s has been recreated with a redirect to %(new_name)s.)rQrrrarrrrLrjrer{r]rrrr(r+rr#rrrvrsrsaver r-) r5r@r\rrfrrwarndb redirectionauthorcommentr6r6r7r8sP            zWikiModule._do_renamec Cs|js ||jdn ||jdd||jvr&td|jv|_z|t|d|j dWnt yKt |t d| ||YSw|jj|jd|jd }t|td |jtjt d|d d |t|j|j|jdd dS)NrUrWWIKI_CHANGE_READONLYreadonlyrrz*Page not modified, showing latest version.rqrcrez?Your changes have been saved in version %(version)s (%(diff)s).rL)rerqr)rrQrrrrarrrr{rr#rrrLr-rjrer rrrSrrr)r5r@r\rLr6r6r7rfs&  zWikiModule._do_savec Cs:||jdd}d|jvr|jdd}|jd|}|r*|r*||dkr*dn|r.dnd }d}d}d}|D],\} } } } |d ksH| |krN|durN| }|dkrV| |ks^|dkr`|dkr`n|d7}| }q:|||d } t|j |j |j }| |dd|||t |d |dur| ||d |||d | fS)NrVdelete_versionrerrfrKmultiplesingler\ru)whatrrf num_versionsnew_dateold_date attachments)rrfzwiki_delete.html)rQrrrar| get_historyrrselectrrRrjupdatelist _wiki_ctxtnav)r5r@r\rerfrrrrrtrrdatarr6r6r7r~s@    z!WikiModule._render_confirm_deleteNcCsJ||jd|||d}|dur|n|j|d<|||d|fS)NrXrvrzwiki_rename.html)rQrrrrjr)r5r@r\rrr6r6r7rs  z!WikiModule._render_confirm_renamecCsN|jsttd|jd|jd|jd}|r;||jkr!d}n||jkr;|jj}t |j |j|}| |j dt |j |j}| |j d|j}d}}}d} d} } | D]0\} } }}| |krs| }|pmd}|pqd}q^| |kr| d 7} | s| } |dus| |kr| }nq^| } q^|sd}t |j |j|}| |j d|j}|j}|||||||\}}| rt|d |jj|jd | d td | dt|d|jj|jddtd| rt|d|jj|jd | d td | d|||d }||||d|||j| dd||d| |jvd t|tdtdtdd|fS)Nz1Version %(num)s of page "%(name)s" does not existrerkrfrHr anonymousz--rKprevrqrVersion %(num)srupryrcz Page historynext)daterrVersionrrY) changerrflatest_version num_changeslongcolshortcolrrqcan_edit_commentzPrevious Changez Next Changez Wiki Historyzwiki_diff.html)rrrrar{rjr|rerr+rrQrrrs splitlinesrrrLr-rrr$)r5r@r\rf latest_pagerrrrr prev_version next_versionrerrScold_pagerrrrrr6r6r7rs            zWikiModule._render_diffrnFc sP|r|dkrt|j|j}|jdnd}|js&|jdn |jd|j}j dd}djvrFj d|_ned jvryj d }| d r\|d dn|j |}t|j|}|rx|jrxd|jvrx|j|_n2d jvrd} j d rj d } | durt|j|j| } |jd| j|_t d | d}|dvrdjv|_td} dt|jifdddD} djvrj dpd} | | dkrjdtt| dn| d} | rtt| dt|jd }nj d}|r|| dkrjd|dn| d}|||}t|j}||| ||| j dddt|j|d|dvr}|rT|ng}|jr_|jng}|||||jd\}}|||d|dkdd d!n | r|dkrd|d"<| |t!|j"t!|j#t$d#d$|fS)%NrrrH collisionrUrWrrrstemplatergrKrez Reverted to version %(version)s.r)rprqrreditrowsc s&i|]}|jd||qS)zwiki_%s)sessionr{).0rCdefaultsr@r6r7 sz-WikiModule._render_editor..)r sidebyside from_editorr wiki_sidebysider wiki_editrowsscroll_bar_pos)rrr edit_rowsr rrqr)rqrrrprr)rqrrcrrrrrccommon/js/wiki.jszwiki_edit.html)%r+rrjrQrrrrsrar{r}PAGE_TEMPLATES_PREFIXrrrrstrr/rsetrboolmaxrrrr%rrattachment_datarrerradd_wiki_toolbarsadd_auto_previewr!)r5r@r\rcr original_textrr template_pagererrprefsr rrrrrrrr6rr7rs                      zWikiModule._render_editorcCsL||jd|||d}|d|jddi|||d|fS)NrYrtrryzwiki_edit_comment.html)rQrrrrrar{r)r5r@r\rr6r6r7rOs  zWikiModule._render_edit_commentc Cs|js ttd|jd|||d}g}|D]\}}}}|||||p'ddq|||jd| |jvdt |td|jd |j |jd |fS) zExtract the complete history for a given page. This information is used to present a changelog/history for a given page. zPage %(name)s does not existriryr)rerrrrY)ryrrzBack to %(wikipage)s)wikipagezhistory_view.html) rrrrjrrappendrrrQrrLr-) r5r@r\rryrerrrr6r6r7rVs(  zWikiModule._render_historycs|jj}|jr'tjdD]}jj|j||j d}t d||j|j q |}|jj kr7d|d<tjt|j}gg}} |jsd|jvr[ttd|jdtj|d |jvr|jd } tt| d d d D]#} d | d| | d gs|d d d qvn|jfddjD} | fdd| D} tj|j} d} }|rt|d}|dur| D]}|d}||kr||kr| s|} nq|}qֈj!fdd"D}| rt djj|j| dtd| dd}|r*t djj|jddtdn d |jvrJ|jd|j#d }t djj|ddtd|r_t djj|j|dtd|d|rpt$tdtdtdn|rt%tdj|&|d|j'i}j(D] }|)||q|*dd}|+||| jt,j-|j j.|||| d j/*d!d" t0d#d$|fS)%Nr=)rerz alternaterrrUzPage %(name)s not foundrirgrr-Fcs.g|]}|vrdj|vr|qS)rH)lowerrQrRreach)rjr@r5r6r7 s  z+WikiModule._render_view..c s"g|] }dd||dqS)r-rgF) _format_linkr") formatterwsr6r7r$s rcs.g|]}dj|vr|tdqS)rHN)rQrRr)rr)prefixr@r5r6r7r$s rrrrrzView latest versionzView parent pagerzPrevious Versionz Next VersionzView Latest VersionUprszwiki_page_path.htmlwiki_fullwidth) rrsrr start_pagedefault_templaterrehigherrelatedresourcepath_template fullwidthrzwiki_view.html)1rrerrrr?rLr-rjrCr in_mimetyperr3r'r%rQrrr*splitrrjoinhas_pagerr%r!pagessortr+rrr get_pagesrindexr$rrrsrprepare_wiki_pager{rrrDEFAULT_PAGE_TEMPLATErr!)r5r@r\re conversionconversion_hrefrrr-r.partsirrrhistrrparentfieldsrrsr6)r&rjr(r@r5r'r7rrs                         zWikiModule._render_viewcCsd|d|jvrt|td|j|jd|d|jvr,t|td|j|j|jr@t|td|jj|jdddSdS) z$Add the normal wiki ctxtnav entries.rHr-z Start PageIndexHistoryryrN) rQr3rrrLr-r:rrj)r5r@r\r6r6r7rs zWikiModule._wiki_ctxtnavcc"d|jvrdtdfVdSdS)NrHr-z Wiki changesrQrrEr6r6r7get_timeline_filters zWikiModule.get_timeline_filtersc csd|vrIt|j}|jdt|t|fD] \}}}} } ||| d} d|| vr,qdt|| | |ffVqt|j||||D]} | VqCdSdS)Nr-z SELECT time, name, comment, author, version FROM wiki WHERE time>=%s AND time<=%s )idrerH) ResourcerRrdb_queryrrQrrget_timeline_events) r5r@startstopfilters wiki_realmtsrjrrre wiki_pageeventr6r6r7rKs$     zWikiModule.get_timeline_eventsc Cs|d\}}|dkr|jj|j|jdS|dkr2tt|j|}|jdkr,td|dStd|dS|d krbt |jd|j |d |}|jdkr`|jj|j|jd d }t|d tj t d |dd}|SdS)NrurlrrrKz%(page)s edited)r\z%(page)s created description)rrq)rercz (r)) rLr-rHreremrrrr)childrSr) r5rrrRrQrrjmarkup diff_hrefr6r6r7render_timeline_events*       z WikiModule.render_timeline_eventccrD)NrHr-rJrErEr6r6r7get_search_filtersrGzWikiModule.get_search_filtersc csd|vrdS|jjJ}t|gd|\}}t|j}|d||D]+\}} } } ||d} d|| vrMt|j| |jd|t| ft | | t | |fVq"Wdn1sXwYt |j |||D]} | VqgdS)Nr-)zw1.namez w1.authorzw1.texta SELECT w1.name, w1.time, w1.author, w1.text FROM wiki w1,(SELECT name, max(version) AS ver FROM wiki GROUP BY name) w2 WHERE w1.version = w2.ver AND w1.name = w2.name AND )rHrHz%s: %s) rrJr rIrRrQrrLrrr rget_search_results)r5r@termsrNr sql_queryrarOrjrPrrsr\resultr6r6r7r\ s8     zWikiModule.get_search_results)rr2)rnF)5__name__ __module__ __qualname__ implementsrrr rr r rExtensionPointr&rr'rRrr.r/propertyr3r:rr:r?rDrFrTr[rbrrrrrrrrrrrrrrrrrrrFrKrZr[r\r6r6r6r7r,.s^   R !. $ KZr  r,c@s&eZdZdZeeejZddZdS)DefaultWikiPolicyzDefault permission policy for the wiki system. Wiki pages with the read-only attribute require `WIKI_ADMIN` to delete, modify or rename the page. cCsb|r'|j|jkr)|dkrd||vS|dvr+t|j|}|jr-d||vr/dSdSdSdSdSdS)NrrY)rVrWrXF)rRr+rr)r5rcusernamerrQr\r6r6r7check_permissionGs  z"DefaultWikiPolicy.check_permissionN) r`rarb__doc__rcrr'rRrhr6r6r6r7rf:s  rf)Arr]trac.attachmentrr trac.configr trac.coretrac.mimeview.apirr trac.permrr trac.resource trac.searchr r r trac.timeline.apir trac.utilrrtrac.util.datefmtrrtrac.util.htmlrtrac.util.textrtrac.util.translationrrtrac.versioncontrol.diffrr trac.web.apirrtrac.web.chromerrrrrrr r!r"r#r$r% trac.wiki.apir&r'r(trac.wiki.formatterr)r*trac.wiki.modelr+ Componentr,rfr6r6r6r7s:    8