Attachment 'moinmoin-1.3.5-editor-insert-patch.diff'

Download

   1   Patch to MoinMoin 1.3.5 to provide a special character insert bar in
   2   the page editor.
   3   By Deron E. Meranda <http://deron.meranda.us/> April 2005
   4   Released under the GNU General License (GPL) version 2 or later.
   5   Portions of this code (Javascript portion) are derived from GPL'ed
   6   code from to the Wikimedia project.
   7 
   8 --- MoinMoin/config.py.orig	2005-07-17 10:22:37.000000000 -0400
   9 +++ MoinMoin/config.py	2005-08-17 15:39:56.500526704 -0400
  10 @@ -99,6 +99,172 @@
  11      "{o}":   (15, 15, 0, "star_off.png"),
  12  }
  13  
  14 +# Inserters for page edit.
  15 +#
  16 +# A list of tuples, each describing one insert selector.  Each
  17 +# tuple consists of five string, of the form:
  18 +#    (open, close, sample_body, label, description)
  19 +# The open and close strings define the character(s) to insert before
  20 +# and after the cursor.  The sample_body will be placed between the
  21 +# open and close, unless a region is currently selected in which case
  22 +# the selected region is left alone.  The label is what's shown in
  23 +# the insert bar area, and the description is the tool-tip title.
  24 +#
  25 +# These strings are output as raw HTML, so be sure to use proper
  26 +# escaping.  Also escape single-quotes with backslashes as in \\' and
  27 +# double-quotes as &quot;.  The label and description are optional,
  28 +# and if missing will be constructed from the open, close, and body
  29 +# values.
  30 +#
  31 +# You can supply simple strings rather than tuples in the list to add
  32 +# nonselectable text between inserters (again escape appropriately).
  33 +# An empty value or '\n' will result in a forced line break.
  34 +editor_insert_tags = [
  35 +    ('&#192;','','','','Latin capital A with grave'),
  36 +    ('&#224;','','','','Latin small a with grave'),
  37 +    ('&#200;','','','','Latin capital E with grave'),
  38 +    ('&#232;','','','','Latin small e with grave'),
  39 +    ('&#204;','','','','Latin capital I with grave'),
  40 +    ('&#236;','','','','Latin small i with grave'),
  41 +    ('&#210;','','','','Latin capital O with grave'),
  42 +    ('&#242;','','','','Latin small o with grave'),
  43 +    ('&#217;','','','','Latin capital U with grave'),
  44 +    ('&#249;','','','','Latin small u with grave'),
  45 +    ' ',
  46 +    ('&#193;','','','','Latin capital A with acute'),
  47 +    ('&#225;','','','','Latin small a with acute'),
  48 +    ('&#201;','','','','Latin capital E with acute'),
  49 +    ('&#233;','','','','Latin small e with acute'),
  50 +    ('&#205;','','','','Latin capital I with acute'),
  51 +    ('&#237;','','','','Latin small i with acute'),
  52 +    ('&#211;','','','','Latin capital O with acute'),
  53 +    ('&#243;','','','','Latin small o with acute'),
  54 +    ('&#218;','','','','Latin capital U with acute'),
  55 +    ('&#250;','','','','Latin small u with acute'),
  56 +    ('&#221;','','','','Latin capital Y with acute'),
  57 +    ('&#253;','','','','Latin small y with acute'),
  58 +    ' ',
  59 +    ('&#194;','','','','Latin capital A with circumflex'),
  60 +    ('&#226;','','','','Latin small a with circumflex'),
  61 +    ('&#202;','','','','Latin capital E with circumflex'),
  62 +    ('&#234;','','','','Latin small e with circumflex'),
  63 +    ('&#206;','','','','Latin capital I with circumflex'),
  64 +    ('&#238;','','','','Latin small i with circumflex'),
  65 +    ('&#212;','','','','Latin capital O with circumflex'),
  66 +    ('&#244;','','','','Latin small o with circumflex'),
  67 +    ('&#219;','','','','Latin capital U with circumflex'),
  68 +    ('&#251;','','','','Latin small u with circumflex'),
  69 +    ' ',
  70 +    ('&#196;','','','','Latin capital A with dieresis'),
  71 +    ('&#228;','','','','Latin small a with dieresis'),
  72 +    ('&#203;','','','','Latin capital E with dieresis'),
  73 +    ('&#235;','','','','Latin small e with dieresis'),
  74 +    ('&#207;','','','','Latin capital I with dieresis'),
  75 +    ('&#239;','','','','Latin small i with dieresis'),
  76 +    ('&#214;','','','','Latin capital O with dieresis'),
  77 +    ('&#246;','','','','Latin small o with dieresis'),
  78 +    ('&#220;','','','','Latin capital U with dieresis'),
  79 +    ('&#252;','','','','Latin small u with dieresis'),
  80 +    ('&#376;','','','','Latin capital Y with dieresis'),
  81 +    ('&#255;','','','','Latin small y with dieresis'),
  82 +    ' ',
  83 +    ('&#195;','','','','Latin capital A with tilde'),
  84 +    ('&#227;','','','','Latin small a with tilde'),
  85 +    ('&#209;','','','','Latin capital N with tilde'),
  86 +    ('&#241;','','','','Latin small n with tilde'),
  87 +    ('&#213;','','','','Latin capital O with tilde'),
  88 +    ('&#245;','','','','Latin small o with tilde'),
  89 +    ' ',
  90 +    ('&#231;','','','','Latin small c with cedilla'),
  91 +    ('&#199;','','','','Latin capital C  with cedilla'),
  92 +    ' ',
  93 +    ('&#223;','','','','Latin small sharp s'),
  94 +    ('&#216;','','','','Latin capital O with stroke'),
  95 +    ('&#248;','','','','Latin small o with stroke'),
  96 +    ('&#208;','','','','Latin capital letter eth'),
  97 +    ('&#240;','','','','Latin small letter Eth'),
  98 +    ('&#222;','','','','Latin capital letter Thorn'),
  99 +    ('&#254;','','','','Latin small letter thorn'),
 100 +    ' ',
 101 +    ('&#197;','','','','Latin capital A with ring above'),
 102 +    ('&#229;','','','','Latin small a with ring above'),
 103 +    ' ',
 104 +    ('&#198;','','','','Latin capital ligature AE'),
 105 +    ('&#230;','','','','Latin small ligature ae'),
 106 +    ('&#338;','','','','Latin capital ligature OE'),
 107 +    ('&#339;','','','','Latin small ligature oe'),
 108 +    ('&#64256;','','','','Latin small ligature ff'),
 109 +    ('&#64257;','','','','Latin small ligature fi'),
 110 +    ('&#64258;','','','','Latin small ligature fl'),
 111 +    None,
 112 +    'Pairs:&nbsp;',
 113 +    ('&#8220;','&#8221;','text','&#8220;&nbsp;&#8221; ','double-quoted text'),
 114 +    ' ',
 115 +    ('&#8216;','&#8217;','text','&#8216;&nbsp;&#8217; ','single-quoted text'),
 116 +    ' ',
 117 +    ('&#171;','&#187;','text','&#171;&nbsp;&#187; ','guillemot-quoted text'),
 118 +    ' ',
 119 +    ('[',']','text','[&nbsp;] ','square-bracketed text'),
 120 +    ('{','}','text','{&nbsp;} ','braced text'),
 121 +    ('<','>','text','<&nbsp;> ','angle-bracketed text'),
 122 +    ' &nbsp;Punctuation:&nbsp;',
 123 +    ('&#161;','','','','Inverted exclamation mark'),
 124 +    ('&#191;','','','','Inverted question mark'),
 125 +    ('&#162;','','','','Cent sign'),
 126 +    ('&#163;','','','','Pound sign'),
 127 +    ('&#165;','','','','Yen sign'),
 128 +    ('&#8364;','','','','Euro sign'),
 129 +    ' ',
 130 +    ('&ndash;','','','','en-dash'),
 131 +    ('&mdash;','','','','em-dash'),
 132 +    ' ',
 133 +    ('&nbsp;','','','&#9109;','non-breaking space'),
 134 +    ' ',
 135 +    ('&#8230;','','','','horizontal elipsis'),
 136 +    ('&#8226;','','','','bullet'),
 137 +    ('&copy;','','','','copyright sign'),
 138 +    ('&reg;','','','','registered trademark sign'),
 139 +    ('&#8482;','','','','trademark sign'),
 140 +    ('&#8224;','','','','dagger'),
 141 +    ('&#8225;','','','','double dagger'),
 142 +    ('&#167;','','','','section sign'),
 143 +    ' &nbsp;Math:&nbsp;',
 144 +    ('&#215;','','','','multiplication sign'),
 145 +    ('&#247;','','','','division sign'),
 146 +    ('+','','','','plus sign'),
 147 +    ('&#8722;','','','','minus sign'),
 148 +    ('&#177;','','','','plus-or-minus sign'),
 149 +    ('=','','','','equal to'),
 150 +    ('&#8800;','','','','not equal to'),
 151 +    ('&#8804;','','','','less than or equal to'),
 152 +    ('&#8805;','','','','greater than or equal to'),
 153 +    ('&#188;','','','','vulgar fraction one-quarter'),
 154 +    ('&#189;','','','','vulgar fraction one-half'),
 155 +    ('&#190;','','','','vulgar fraction three-quarters'),
 156 +    ('&#178;','','','','superscript digit two, squared'),
 157 +    ('&#179;','','','','superscript digit three, cubed'),
 158 +    ('&#181;','','','','micro sign, 1/1000000th'),
 159 +    ('&#176;','','','','degree sign'),
 160 +    None,
 161 +    ' Formatting: ',
 162 +    ("\\'\\'","\\'\\'",'italic','<i>italic</i> ','italics text'),
 163 +    ("\\'\\'\\'","\\'\\'\\'",'bold','<b>bold</b> ','boldface text'),
 164 +    ("__","__",'underline','<u>underline</u> ','underlined text'),
 165 +    #("^","^",'superscript','<sup>super</sup>','superscript text'),
 166 +    #(",,",",,",'subscript','<sub>sub</sub>','subscript text'),
 167 +    ("{{{","}}}",'monospace','<tt>monospace</tt> ','monospace text'),
 168 +    ' ',
 169 +    ('[',']','http://example.com/','<u>URL</u> ','URL hyperlink'),
 170 +    ' ',
 171 +    ('[&quot;','&quot;]','Example page','<u>WikiName</u> ','A quoted-stye Wiki Name'),
 172 +    ' ',
 173 +    ('= ',' =','heading','<b>H1</b> ','heading level 1'),
 174 +    ('== ',' ==','heading','<b>H2</b> ','heading level 2'),
 175 +    ('=== ',' ===','heading','<b>H3</b> ','heading level 3'),
 176 +    ('[[BR]]\\n','','','linebreak','force a new line'),
 177 +]
 178 +
 179 +
 180  # unicode: set the char types (upper, lower, digits, spaces)
 181  from MoinMoin.util.chartypes import _chartypes
 182  for key, val in _chartypes.items():
 183 --- MoinMoin/multiconfig.py.orig	2005-07-30 11:58:51.000000000 -0400
 184 +++ MoinMoin/multiconfig.py	2005-08-17 15:42:30.330184261 -0400
 185 @@ -182,6 +182,7 @@
 186      default_lang = 'en'
 187      default_markup = 'wiki'
 188      docbook_html_dir = r"/usr/share/xml/docbook/stylesheet/nwalsh/html/" # correct for debian sarge
 189 +    edit_insert_tags_enabled = 1
 190      edit_locking = 'warn 10' # None, 'warn <timeout mins>', 'lock <timeout mins>'
 191      edit_rows = 30
 192      hosts_deny = []
 193 --- MoinMoin/PageEditor.py.orig	2005-07-27 11:51:39.000000000 -0400
 194 +++ MoinMoin/PageEditor.py	2005-08-17 15:39:56.502526700 -0400
 195 @@ -75,6 +75,89 @@
 196  </script>
 197  """
 198  
 199 +# This javascript was derived from GPL code from the Wikimedia project.
 200 +_insert_tags_js = """
 201 +<script type="text/javascript">
 202 +var clientPC = navigator.userAgent.toLowerCase(); // Get client info
 203 +var is_gecko = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1)
 204 +                && (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
 205 +var is_safari = ((clientPC.indexOf('AppleWebKit')!=-1) && (clientPC.indexOf('spoofer')==-1));
 206 +var is_khtml = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
 207 +if (clientPC.indexOf('opera')!=-1) {
 208 +    var is_opera = true;
 209 +    var is_opera_preseven = (window.opera && !document.childNodes);
 210 +    var is_opera_seven = (window.opera && document.childNodes);
 211 +}
 212 +// apply tagOpen/tagClose to selection in textarea,
 213 +// use sampleText instead of selection if there is none
 214 +// copied and adapted from phpBB
 215 +function insertTags(tagOpen, tagClose, sampleText) {
 216 +	var txtarea = document.getElementById('editor-textarea');
 217 +	// var txtarea = document.editform.wpTextbox1;
 218 +        if( ! txtarea ) {
 219 +         alert('Can not locate text area control');
 220 +        }
 221 +	else if(document.selection  && !is_gecko) {
 222 +		// IE
 223 +		var theSelection = document.selection.createRange().text;
 224 +		if(!theSelection) { theSelection=sampleText;}
 225 +		txtarea.focus();
 226 +		if(theSelection.charAt(theSelection.length - 1) == " "){// exclude ending space char, if any
 227 +			theSelection = theSelection.substring(0, theSelection.length - 1);
 228 +			document.selection.createRange().text = tagOpen + theSelection + tagClose + " ";
 229 +		} else {
 230 +			document.selection.createRange().text = tagOpen + theSelection + tagClose;
 231 +		}
 232 +	} else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
 233 +        	// Mozilla
 234 + 		var startPos = txtarea.selectionStart;
 235 +		var endPos = txtarea.selectionEnd;
 236 +		var scrollTop=txtarea.scrollTop;
 237 +		var myText = (txtarea.value).substring(startPos, endPos);
 238 +		if(!myText) { myText=sampleText;}
 239 +		if(myText.charAt(myText.length - 1) == " "){ // exclude ending space char, if any
 240 +			subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
 241 +		} else {
 242 +			subst = tagOpen + myText + tagClose;
 243 +		}
 244 +		txtarea.value = txtarea.value.substring(0, startPos) + subst +
 245 +		  txtarea.value.substring(endPos, txtarea.value.length);
 246 +		txtarea.focus();
 247 +
 248 +		var cPos=startPos+(tagOpen.length+myText.length+tagClose.length);
 249 +		txtarea.selectionStart=cPos;
 250 +		txtarea.selectionEnd=cPos;
 251 +		txtarea.scrollTop=scrollTop;
 252 +	} else {
 253 +		// All others
 254 +		var copy_alertText=alertText;
 255 +		var re1=new RegExp("\\$1","g");
 256 +		var re2=new RegExp("\\$2","g");
 257 +		copy_alertText=copy_alertText.replace(re1,sampleText);
 258 +		copy_alertText=copy_alertText.replace(re2,tagOpen+sampleText+tagClose);
 259 +		var text;
 260 +		if (sampleText) {
 261 +			text=prompt(copy_alertText);
 262 +		} else {
 263 +			text="";
 264 +		}
 265 +		if(!text) { text=sampleText;}
 266 +		text=tagOpen+text+tagClose;
 267 +		document.infoform.infobox.value=text;
 268 +		// in Safari this causes scrolling
 269 +		if(!is_safari) {
 270 +			txtarea.focus();
 271 +		}
 272 +		noOverwrite=true;
 273 +	}
 274 +	// reposition cursor if possible
 275 +	if (txtarea && txtarea.createTextRange) {
 276 +		txtarea.caretPos = document.selection.createRange().duplicate();
 277 +	}
 278 +}
 279 +</script>
 280 +"""
 281 +
 282  
 283  #############################################################################
 284  ### PageEditor - Edit pages
 285 @@ -269,19 +352,23 @@
 286          status = [msg for msg in status if msg]
 287          status = ' '.join(status)
 288          status = Status(self.request, content=status)
 289 -        
 290 -        wikiutil.send_title(self.request,
 291 -            title % {'pagename': self.split_title(self.request),},
 292 -            page=self,
 293 -            pagename=self.page_name, msg=status,
 294 -            body_onload=self.lock.locktype and 'countdown()' or '', # broken / bug in Mozilla 1.5, when using #preview
 295 -            html_head=self.lock.locktype and (
 296 +
 297 +	html_head = self.lock.locktype and (
 298                  _countdown_js % {
 299                       'lock_timeout': lock_timeout,
 300                       'lock_expire': lock_expire,
 301                       'lock_mins': lock_mins,
 302                       'lock_secs': lock_secs,
 303                      }) or ''
 304 +        if self.request.cfg.edit_insert_tags_enabled:
 305 +            html_head += _insert_tags_js
 306 +
 307 +        wikiutil.send_title(self.request,
 308 +            title % {'pagename': self.split_title(self.request),},
 309 +            page=self,
 310 +            pagename=self.page_name, msg=status,
 311 +            body_onload=self.lock.locktype and 'countdown()' or '', # broken / bug in Mozilla 1.5, when using #preview
 312 +            html_head=html_head
 313          )
 314          
 315          self.request.write(self.request.formatter.startContent("content"))
 316 @@ -365,6 +452,30 @@
 317  
 318          self.request.write('</p>')
 319  
 320 +        # Character tags insert selection box
 321 +        if self.request.cfg.edit_insert_tags_enabled:
 322 +            self.request.write('<div id="editor-insert-tags">')
 323 +            self.request.write(_("Insert: "))
 324 +            for tag in config.editor_insert_tags:
 325 +                if not tag or tag=='\n':
 326 +                    self.request.write('<br />')
 327 +                    continue
 328 +                elif tag==' ':
 329 +                    self.request.write('&nbsp; ')
 330 +                    continue
 331 +                elif type(tag) is type(' ') or type(tag) is type(u' '):
 332 +                    self.request.write(tag)
 333 +                    continue
 334 +                tag_open, tag_close, tag_body, tag_name, tag_description = tag
 335 +                if not tag_name:
 336 +                    tag_name = tag_open + ' ' + tag_close
 337 +                if not tag_description:
 338 +                    tag_description = tag_name
 339 +                self.request.write("<a href=\"javascript:insertTags('%s','%s','%s')\" title=\"%s\">%s</a>" \
 340 +                                   % (tag_open,tag_close,tag_body,tag_description,tag_name) )
 341 +            self.request.write('</div>')
 342 +        
 343 +        # Change description
 344          self.request.write("<p>", _("Optional comment about this change"),
 345              '<br><input id="editor-comment" type="text" name="comment" value="%s" maxlength="80"></p>' % (
 346                  wikiutil.escape(kw.get('comment', ''), 1), ))
 347 --- wiki/htdocs/classic/css/screen.css.orig	2005-06-26 11:43:05.000000000 -0400
 348 +++ wiki/htdocs/classic/css/screen.css	2005-08-17 15:39:56.503526697 -0400
 349 @@ -261,6 +261,21 @@
 350  	background-color: white;
 351  }
 352  
 353 +div#editor-insert-tags {
 354 +	border: 2px solid #c0c0c0;
 355 +	padding-left: 4pt; padding-right: 4pt;
 356 +	background-color: #e5e5e5; color: black;
 357 +	font-size: 9pt;
 358 +}
 359 +#editor-insert-tags a {
 360 +	text-decoration: none;
 361 +	padding-left: 0.2pt; padding-right: 0.2pt;
 362 +}
 363 +#editor-insert-tags a:hover {
 364 +	background-color: yellow; color: black;
 365 +	text-decoration: underline;
 366 +}
 367 +
 368  /* We use here dumb css1 ids becuase of IE suckiness */
 369  #editor-textarea, #editor-comment {
 370      width: 100%;
 371 --- wiki/htdocs/modern/css/screen.css.orig	2005-06-26 11:43:05.000000000 -0400
 372 +++ wiki/htdocs/modern/css/screen.css	2005-08-17 15:39:56.504526695 -0400
 373 @@ -276,6 +276,21 @@
 374  	padding: 10px 30px 20px 30px;
 375  }
 376  
 377 +div#editor-insert-tags {
 378 +	border: 1px solid #5588bb;
 379 +	padding-left: 4pt; padding-right: 4pt;
 380 +	background-color: #f0f8ff; color: black;
 381 +	font-size: 9pt;
 382 +}
 383 +#editor-insert-tags a {
 384 +	text-decoration: none;
 385 +	padding-left: 0.2pt; padding-right: 0.2pt;
 386 +}
 387 +#editor-insert-tags a:hover {
 388 +	background-color: yellow; color: black;
 389 +	text-decoration: underline;
 390 +}
 391 +
 392  /* We use here dumb css1 ids because of IE suckiness */
 393  #editor-textarea, #editor-comment {
 394      width: 100%;
 395 --- wiki/htdocs/rightsidebar/css/screen.css.orig	2005-07-31 06:27:41.000000000 -0400
 396 +++ wiki/htdocs/rightsidebar/css/screen.css	2005-08-17 15:44:16.821950730 -0400
 397 @@ -211,6 +211,22 @@
 398      width: 100%;
 399  }
 400  
 401 +div#editor-insert-tags {
 402 +	border: 1px solid #9c9c9c;
 403 +	padding-left: 4pt; padding-right: 4pt;
 404 +	background-color: #F0ECE6; color: black;
 405 +	font-size: 9pt;
 406 +}
 407 +#editor-insert-tags a {
 408 +	text-decoration: none;
 409 +	padding-left: 0.2pt; padding-right: 0.2pt;
 410 +}
 411 +#editor-insert-tags a:hover {
 412 +	background-color: yellow; color: black;
 413 +	text-decoration: underline;
 414 +}
 415 +
 416 +
 417  /* We use here dumb css1 ids because of IE suckiness */
 418  #editor-textarea, #editor-comment {
 419      width: 100%;
 420 --- wiki/underlay/pages/HelpOnConfiguration/revisions/00000001.orig	2005-08-04 15:15:29.000000000 -0400
 421 +++ wiki/underlay/pages/HelpOnConfiguration/revisions/00000001	2005-08-17 15:45:29.692792544 -0400
 422 @@ -185,6 +185,7 @@
 423  || default_lang || 'en' || Default language for user interface and page content, see HelpOnLanguages!||
 424  || default_markup || 'wiki' || Default page parser / format (name of module in `MoinMoin.parser`)  ||
 425  || docbook_html_dir || '...' || Path to the docbook html directory (optional, used by the docbook parser). The default value is correct for Debian Sarge. ||
 426 +|| edit_insert_tags_enabled || 1 || Show a special character insert helper in the page editor (requires Javascript) ||
 427  || edit_locking || 'warn 10' || Editor locking policy: `None`, `'warn <timeout in minutes>'`, or `'lock <timeout in minutes>'` ||
 428  || edit_rows || 30 || Default height of the edit box ||
 429  || hosts_deny || `[]` || List of denied IPs; if an IP ends with a dot, it denies a whole subnet (class A, B or C) ||

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2005-07-12 02:26:49, 6.3 KB) [[attachment:NewTableOfContents-1.3.4.py]]
  • [get | view] (2005-05-01 18:12:47, 2.6 KB) [[attachment:README]]
  • [get | view] (2003-12-07 18:15:55, 1.3 KB) [[attachment:TableOfContents-startdepth.diff]]
  • [get | view] (2005-06-25 14:38:34, 4.3 KB) [[attachment:moin-1.3.4-rss_rc.py-per_page_feeds.patch]]
  • [get | view] (2005-06-09 20:25:52, 10.1 KB) [[attachment:moin-cache-friendly.diff]]
  • [get | view] (2005-04-27 17:22:13, 2.3 KB) [[attachment:moin-negotiate-auth.diff]]
  • [get | view] (2005-04-04 05:12:33, 18.0 KB) [[attachment:moinmoin-1.3.4-editor-insert-patch.diff]]
  • [get | view] (2005-04-04 05:50:16, 43.3 KB) [[attachment:moinmoin-1.3.4-editor-insert-screenshot.png]]
  • [get | view] (2005-08-17 20:24:31, 18.1 KB) [[attachment:moinmoin-1.3.5-editor-insert-patch.diff]]
  • [get | view] (2003-12-07 18:15:55, 13.0 KB) [[attachment:multisearch.diff]]
  • [get | view] (2005-06-14 14:45:06, 0.8 KB) [[attachment:vary-cookie.diff]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.