Rebuild for 3.0.11 UNRELEASED.
[privoxy.git] / doc / webserver / user-manual / filter-file.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
2 <HTML
3 ><HEAD
4 ><TITLE
5 >Filter Files</TITLE
6 ><META
7 NAME="GENERATOR"
8 CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
9 REL="HOME"
10 TITLE="Privoxy 3.0.11 User Manual"
11 HREF="index.html"><LINK
12 REL="PREVIOUS"
13 TITLE="Actions Files"
14 HREF="actions-file.html"><LINK
15 REL="NEXT"
16 TITLE="Privoxy's Template Files"
17 HREF="templates.html"><LINK
18 REL="STYLESHEET"
19 TYPE="text/css"
20 HREF="../p_doc.css"><META
21 HTTP-EQUIV="Content-Type"
22 CONTENT="text/html;
23 charset=ISO-8859-1">
24 <LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css">
25 </head
26 ><BODY
27 CLASS="SECT1"
28 BGCOLOR="#EEEEEE"
29 TEXT="#000000"
30 LINK="#0000FF"
31 VLINK="#840084"
32 ALINK="#0000FF"
33 ><DIV
34 CLASS="NAVHEADER"
35 ><TABLE
36 SUMMARY="Header navigation table"
37 WIDTH="100%"
38 BORDER="0"
39 CELLPADDING="0"
40 CELLSPACING="0"
41 ><TR
42 ><TH
43 COLSPAN="3"
44 ALIGN="center"
45 >Privoxy 3.0.11 User Manual</TH
46 ></TR
47 ><TR
48 ><TD
49 WIDTH="10%"
50 ALIGN="left"
51 VALIGN="bottom"
52 ><A
53 HREF="actions-file.html"
54 ACCESSKEY="P"
55 >Prev</A
56 ></TD
57 ><TD
58 WIDTH="80%"
59 ALIGN="center"
60 VALIGN="bottom"
61 ></TD
62 ><TD
63 WIDTH="10%"
64 ALIGN="right"
65 VALIGN="bottom"
66 ><A
67 HREF="templates.html"
68 ACCESSKEY="N"
69 >Next</A
70 ></TD
71 ></TR
72 ></TABLE
73 ><HR
74 ALIGN="LEFT"
75 WIDTH="100%"></DIV
76 ><DIV
77 CLASS="SECT1"
78 ><H1
79 CLASS="SECT1"
80 ><A
81 NAME="FILTER-FILE"
82 >9. Filter Files</A
83 ></H1
84 ><P
85 > On-the-fly text substitutions need
86  to be defined in a <SPAN
87 CLASS="QUOTE"
88 >"filter file"</SPAN
89 >. Once defined, they 
90  can then be invoked as an <SPAN
91 CLASS="QUOTE"
92 >"action"</SPAN
93 >.</P
94 ><P
95 > <SPAN
96 CLASS="APPLICATION"
97 >Privoxy</SPAN
98 > supports three different filter actions:
99  <TT
100 CLASS="LITERAL"
101 ><A
102 HREF="actions-file.html#FILTER"
103 >filter</A
104 ></TT
105 > to
106  rewrite the content that is send to the client,
107  <TT
108 CLASS="LITERAL"
109 ><A
110 HREF="actions-file.html#CLIENT-HEADER-FILTER"
111 >client-header-filter</A
112 ></TT
113 >
114  to rewrite headers that are send by the client, and
115  <TT
116 CLASS="LITERAL"
117 ><A
118 HREF="actions-file.html#SERVER-HEADER-FILTER"
119 >server-header-filter</A
120 ></TT
121 >
122  to rewrite headers that are send by the server.</P
123 ><P
124 > <SPAN
125 CLASS="APPLICATION"
126 >Privoxy</SPAN
127 > also supports two tagger actions:
128  <TT
129 CLASS="LITERAL"
130 ><A
131 HREF="actions-file.html#CLIENT-HEADER-TAGGER"
132 >client-header-tagger</A
133 ></TT
134 >
135  and
136  <TT
137 CLASS="LITERAL"
138 ><A
139 HREF="actions-file.html#SERVER-HEADER-TAGGER"
140 >server-header-tagger</A
141 ></TT
142 >.
143  Taggers and filters use the same syntax in the filter files, the difference
144  is that taggers don't modify the text they are filtering, but use a rewritten
145  version of the filtered text as tag. The tags can then be used to change the
146  applying actions through sections with <A
147 HREF="actions-file.html#TAG-PATTERN"
148 >tag-patterns</A
149 >.</P
150 ><P
151 > Multiple filter files can be defined through the <TT
152 CLASS="LITERAL"
153 > <A
154 HREF="config.html#FILTERFILE"
155 >filterfile</A
156 ></TT
157 > config directive. The filters
158  as supplied by the developers are located in
159  <TT
160 CLASS="FILENAME"
161 >default.filter</TT
162 >. It is recommended that any locally
163  defined or modified filters go in a separately defined file such as
164  <TT
165 CLASS="FILENAME"
166 >user.filter</TT
167 >.
168  </P
169 ><P
170 > Common tasks for content filters are to eliminate common annoyances in
171  HTML and JavaScript, such as pop-up windows,
172  exit consoles, crippled windows without navigation tools, the
173  infamous &#60;BLINK&#62; tag etc, to suppress images with certain
174  width and height attributes (standard banner sizes or web-bugs),
175  or just to have fun.</P
176 ><P
177 > Enabled content filters are applied to any content whose
178  <SPAN
179 CLASS="QUOTE"
180 >"Content Type"</SPAN
181 > header is recognised as a sign
182  of text-based content, with the exception of <TT
183 CLASS="LITERAL"
184 >text/plain</TT
185 >.
186  Use the <A
187 HREF="actions-file.html#FORCE-TEXT-MODE"
188 >force-text-mode</A
189 > action
190  to also filter other content.</P
191 ><P
192 > Substitutions are made at the source level, so if you want to <SPAN
193 CLASS="QUOTE"
194 >"roll
195  your own"</SPAN
196 > filters, you should first be familiar with HTML syntax, 
197  and, of course, regular expressions.</P
198 ><P
199 > Just like the <A
200 HREF="actions-file.html"
201 >actions files</A
202 >, the
203  filter file is organized in sections, which are called <SPAN
204 CLASS="emphasis"
205 ><I
206 CLASS="EMPHASIS"
207 >filters</I
208 ></SPAN
209 >
210  here. Each filter consists of a heading line, that starts with one of the
211  <SPAN
212 CLASS="emphasis"
213 ><I
214 CLASS="EMPHASIS"
215 >keywords</I
216 ></SPAN
217 > <TT
218 CLASS="LITERAL"
219 >FILTER:</TT
220 >,
221  <TT
222 CLASS="LITERAL"
223 >CLIENT-HEADER-FILTER:</TT
224 > or <TT
225 CLASS="LITERAL"
226 >SERVER-HEADER-FILTER:</TT
227 >
228  followed by the filter's <SPAN
229 CLASS="emphasis"
230 ><I
231 CLASS="EMPHASIS"
232 >name</I
233 ></SPAN
234 >, and a short (one line) 
235  <SPAN
236 CLASS="emphasis"
237 ><I
238 CLASS="EMPHASIS"
239 >description</I
240 ></SPAN
241 > of what it does. Below that line
242  come the <SPAN
243 CLASS="emphasis"
244 ><I
245 CLASS="EMPHASIS"
246 >jobs</I
247 ></SPAN
248 >, i.e. lines that define the actual
249  text substitutions. By convention, the name of a filter
250  should describe what the filter <SPAN
251 CLASS="emphasis"
252 ><I
253 CLASS="EMPHASIS"
254 >eliminates</I
255 ></SPAN
256 >. The
257  comment is used in the <A
258 HREF="http://config.privoxy.org/"
259 TARGET="_top"
260 >web-based
261  user interface</A
262 >.</P
263 ><P
264 > Once a filter called <TT
265 CLASS="REPLACEABLE"
266 ><I
267 >name</I
268 ></TT
269 > has been defined
270  in the filter file, it can be invoked by using an action of the form
271  +<TT
272 CLASS="LITERAL"
273 ><A
274 HREF="actions-file.html#FILTER"
275 >filter</A
276 >{<TT
277 CLASS="REPLACEABLE"
278 ><I
279 >name</I
280 ></TT
281 >}</TT
282 >
283  in any <A
284 HREF="actions-file.html"
285 >actions file</A
286 >.</P
287 ><P
288 > Filter definitions start with a header line that contains the filter
289  type, the filter name and the filter description.
290  A content filter header line for a filter called <SPAN
291 CLASS="QUOTE"
292 >"foo"</SPAN
293 > could look
294  like this:</P
295 ><P
296 > <TABLE
297 BORDER="0"
298 BGCOLOR="#E0E0E0"
299 WIDTH="100%"
300 ><TR
301 ><TD
302 ><PRE
303 CLASS="SCREEN"
304 >FILTER: foo Replace all "foo" with "bar"</PRE
305 ></TD
306 ></TR
307 ></TABLE
308 ></P
309 ><P
310 > Below that line, and up to the next header line, come the jobs that
311  define what text replacements the filter executes. They are specified
312  in a syntax that imitates <A
313 HREF="http://www.perl.org/"
314 TARGET="_top"
315 >Perl</A
316 >'s
317  <TT
318 CLASS="LITERAL"
319 >s///</TT
320 > operator. If you are familiar with Perl, you
321  will find this to be quite intuitive, and may want to look at the
322  PCRS documentation for the subtle differences to Perl behaviour. Most
323  notably, the non-standard option letter <TT
324 CLASS="LITERAL"
325 >U</TT
326 > is supported,
327  which turns the default to ungreedy matching.</P
328 ><P
329 > If you are new to 
330   <A
331 HREF="http://en.wikipedia.org/wiki/Regular_expressions"
332 TARGET="_top"
333 ><SPAN
334 CLASS="QUOTE"
335 >"Regular
336   Expressions"</SPAN
337 ></A
338 >, you might want to take a look at
339  the <A
340 HREF="appendix.html#REGEX"
341 >Appendix on regular expressions</A
342 >, and
343  see the <A
344 HREF="http://perldoc.perl.org/perlre.html"
345 TARGET="_top"
346 >Perl
347  manual</A
348 > for
349  <A
350 HREF="http://perldoc.perl.org/perlop.html"
351 TARGET="_top"
352 >the 
353  <TT
354 CLASS="LITERAL"
355 >s///</TT
356 > operator's syntax</A
357 > and <A
358 HREF="http://perldoc.perl.org/perlre.html"
359 TARGET="_top"
360 >Perl-style regular
361  expressions</A
362 > in general.
363  The below examples might also help to get you started.</P
364 ><DIV
365 CLASS="SECT2"
366 ><H2
367 CLASS="SECT2"
368 ><A
369 NAME="AEN4418"
370 >9.1. Filter File Tutorial</A
371 ></H2
372 ><P
373 > Now, let's complete our <SPAN
374 CLASS="QUOTE"
375 >"foo"</SPAN
376 > content filter. We have already defined
377  the heading, but the jobs are still missing. Since all it does is to replace
378  <SPAN
379 CLASS="QUOTE"
380 >"foo"</SPAN
381 > with <SPAN
382 CLASS="QUOTE"
383 >"bar"</SPAN
384 >, there is only one (trivial) job
385  needed:</P
386 ><P
387 > <TABLE
388 BORDER="0"
389 BGCOLOR="#E0E0E0"
390 WIDTH="100%"
391 ><TR
392 ><TD
393 ><PRE
394 CLASS="SCREEN"
395 >s/foo/bar/</PRE
396 ></TD
397 ></TR
398 ></TABLE
399 ></P
400 ><P
401 > But wait! Didn't the comment say that <SPAN
402 CLASS="emphasis"
403 ><I
404 CLASS="EMPHASIS"
405 >all</I
406 ></SPAN
407 > occurrences
408  of <SPAN
409 CLASS="QUOTE"
410 >"foo"</SPAN
411 > should be replaced? Our current job will only take
412  care of the first <SPAN
413 CLASS="QUOTE"
414 >"foo"</SPAN
415 > on each page. For global substitution,
416  we'll need to add the <TT
417 CLASS="LITERAL"
418 >g</TT
419 > option:</P
420 ><P
421 > <TABLE
422 BORDER="0"
423 BGCOLOR="#E0E0E0"
424 WIDTH="100%"
425 ><TR
426 ><TD
427 ><PRE
428 CLASS="SCREEN"
429 >s/foo/bar/g</PRE
430 ></TD
431 ></TR
432 ></TABLE
433 ></P
434 ><P
435 > Our complete filter now looks like this:</P
436 ><P
437 > <TABLE
438 BORDER="0"
439 BGCOLOR="#E0E0E0"
440 WIDTH="100%"
441 ><TR
442 ><TD
443 ><PRE
444 CLASS="SCREEN"
445 >FILTER: foo Replace all "foo" with "bar"
446 s/foo/bar/g</PRE
447 ></TD
448 ></TR
449 ></TABLE
450 ></P
451 ><P
452 > Let's look at some real filters for more interesting examples. Here you see
453  a filter that protects against some common annoyances that arise from JavaScript
454  abuse. Let's look at its jobs one after the other:</P
455 ><P
456 > <TABLE
457 BORDER="0"
458 BGCOLOR="#E0E0E0"
459 WIDTH="100%"
460 ><TR
461 ><TD
462 ><PRE
463 CLASS="SCREEN"
464 >FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
465
466 # Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
467 #
468 s|(&#60;script.*)document\.referrer(.*&#60;/script&#62;)|$1"Not Your Business!"$2|Usg</PRE
469 ></TD
470 ></TR
471 ></TABLE
472 ></P
473 ><P
474 > Following the header line and a comment, you see the job. Note that it uses
475  <TT
476 CLASS="LITERAL"
477 >|</TT
478 > as the delimiter instead of <TT
479 CLASS="LITERAL"
480 >/</TT
481 >, because
482  the pattern contains a forward slash, which would otherwise have to be escaped
483  by a backslash (<TT
484 CLASS="LITERAL"
485 >\</TT
486 >).</P
487 ><P
488 > Now, let's examine the pattern: it starts with the text <TT
489 CLASS="LITERAL"
490 >&#60;script.*</TT
491 >
492  enclosed in parentheses. Since the dot matches any character, and <TT
493 CLASS="LITERAL"
494 >*</TT
495 >
496  means: <SPAN
497 CLASS="QUOTE"
498 >"Match an arbitrary number of the element left of myself"</SPAN
499 >, this
500  matches <SPAN
501 CLASS="QUOTE"
502 >"&#60;script"</SPAN
503 >, followed by <SPAN
504 CLASS="emphasis"
505 ><I
506 CLASS="EMPHASIS"
507 >any</I
508 ></SPAN
509 > text, i.e.
510  it matches the whole page, from the start of the first &#60;script&#62; tag.</P
511 ><P
512 > That's more than we want, but the pattern continues: <TT
513 CLASS="LITERAL"
514 >document\.referrer</TT
515 >
516  matches only the exact string <SPAN
517 CLASS="QUOTE"
518 >"document.referrer"</SPAN
519 >. The dot needed to
520  be <SPAN
521 CLASS="emphasis"
522 ><I
523 CLASS="EMPHASIS"
524 >escaped</I
525 ></SPAN
526 >, i.e. preceded by a backslash, to take away its
527  special meaning as a joker, and make it just a regular dot. So far, the meaning is:
528  Match from the start of the first &#60;script&#62; tag in a the page, up to, and including,
529  the text <SPAN
530 CLASS="QUOTE"
531 >"document.referrer"</SPAN
532 >, if <SPAN
533 CLASS="emphasis"
534 ><I
535 CLASS="EMPHASIS"
536 >both</I
537 ></SPAN
538 > are present
539  in the page (and appear in that order).</P
540 ><P
541 > But there's still more pattern to go. The next element, again enclosed in parentheses,
542  is <TT
543 CLASS="LITERAL"
544 >.*&#60;/script&#62;</TT
545 >. You already know what <TT
546 CLASS="LITERAL"
547 >.*</TT
548 >
549  means, so the whole pattern translates to: Match from the start of the first  &#60;script&#62;
550  tag in a page to the end of the last &#60;script&#62; tag, provided that the text
551  <SPAN
552 CLASS="QUOTE"
553 >"document.referrer"</SPAN
554 > appears somewhere in between.</P
555 ><P
556 > This is still not the whole story, since we have ignored the options and the parentheses:
557  The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
558  remembered and be available through the variables <TT
559 CLASS="LITERAL"
560 >$1, $2, ...</TT
561 > in
562  the substitute. The <TT
563 CLASS="LITERAL"
564 >U</TT
565 > option switches to ungreedy matching, which means
566  that the first <TT
567 CLASS="LITERAL"
568 >.*</TT
569 > in the pattern will only <SPAN
570 CLASS="QUOTE"
571 >"eat up"</SPAN
572 > all
573  text in between <SPAN
574 CLASS="QUOTE"
575 >"&#60;script"</SPAN
576 > and the <SPAN
577 CLASS="emphasis"
578 ><I
579 CLASS="EMPHASIS"
580 >first</I
581 ></SPAN
582 > occurrence
583  of <SPAN
584 CLASS="QUOTE"
585 >"document.referrer"</SPAN
586 >, and that the second <TT
587 CLASS="LITERAL"
588 >.*</TT
589 > will
590  only span the text up to the <SPAN
591 CLASS="emphasis"
592 ><I
593 CLASS="EMPHASIS"
594 >first</I
595 ></SPAN
596 > <SPAN
597 CLASS="QUOTE"
598 >"&#60;/script&#62;"</SPAN
599 >
600  tag. Furthermore, the <TT
601 CLASS="LITERAL"
602 >s</TT
603 > option says that the match may span
604  multiple lines in the page, and the <TT
605 CLASS="LITERAL"
606 >g</TT
607 > option again means that the
608  substitution is global.</P
609 ><P
610 > So, to summarize, the pattern means: Match all scripts that contain the text
611  <SPAN
612 CLASS="QUOTE"
613 >"document.referrer"</SPAN
614 >. Remember the parts of the script from
615  (and including) the start tag up to (and excluding) the string
616  <SPAN
617 CLASS="QUOTE"
618 >"document.referrer"</SPAN
619 > as <TT
620 CLASS="LITERAL"
621 >$1</TT
622 >, and the part following
623  that string, up to and including the closing tag, as <TT
624 CLASS="LITERAL"
625 >$2</TT
626 >.</P
627 ><P
628 > Now the pattern is deciphered, but wasn't this about substituting things? So
629  lets look at the substitute: <TT
630 CLASS="LITERAL"
631 >$1"Not Your Business!"$2</TT
632 > is
633  easy to read: The text remembered as <TT
634 CLASS="LITERAL"
635 >$1</TT
636 >, followed by 
637  <TT
638 CLASS="LITERAL"
639 >"Not Your Business!"</TT
640 > (<SPAN
641 CLASS="emphasis"
642 ><I
643 CLASS="EMPHASIS"
644 >including</I
645 ></SPAN
646 >
647  the quotation marks!), followed by the text remembered as <TT
648 CLASS="LITERAL"
649 >$2</TT
650 >.
651  This produces an exact copy of the original string, with the middle part
652  (the <SPAN
653 CLASS="QUOTE"
654 >"document.referrer"</SPAN
655 >) replaced by <TT
656 CLASS="LITERAL"
657 >"Not Your
658  Business!"</TT
659 >.</P
660 ><P
661 > The whole job now reads: Replace <SPAN
662 CLASS="QUOTE"
663 >"document.referrer"</SPAN
664 > by
665  <TT
666 CLASS="LITERAL"
667 >"Not Your Business!"</TT
668 > wherever it appears inside a
669  &#60;script&#62; tag. Note that this job won't break JavaScript syntax,
670  since both the original and the replacement are syntactically valid
671  string objects. The script just won't have access to the referrer
672  information anymore.</P
673 ><P
674 > We'll show you two other jobs from the JavaScript taming department, but
675  this time only point out the constructs of special interest:</P
676 ><P
677 > <TABLE
678 BORDER="0"
679 BGCOLOR="#E0E0E0"
680 WIDTH="100%"
681 ><TR
682 ><TD
683 ><PRE
684 CLASS="SCREEN"
685 ># The status bar is for displaying link targets, not pointless blahblah
686 #
687 s/window\.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</PRE
688 ></TD
689 ></TR
690 ></TABLE
691 ></P
692 ><P
693 > <TT
694 CLASS="LITERAL"
695 >\s</TT
696 > stands for whitespace characters (space, tab, newline,
697  carriage return, form feed), so that <TT
698 CLASS="LITERAL"
699 >\s*</TT
700 > means: <SPAN
701 CLASS="QUOTE"
702 >"zero
703  or more whitespace"</SPAN
704 >. The <TT
705 CLASS="LITERAL"
706 >?</TT
707 > in <TT
708 CLASS="LITERAL"
709 >.*?</TT
710 >
711  makes this matching of arbitrary text ungreedy. (Note that the <TT
712 CLASS="LITERAL"
713 >U</TT
714 >
715  option is not set). The <TT
716 CLASS="LITERAL"
717 >['"]</TT
718 > construct means: <SPAN
719 CLASS="QUOTE"
720 >"a single
721  <SPAN
722 CLASS="emphasis"
723 ><I
724 CLASS="EMPHASIS"
725 >or</I
726 ></SPAN
727 > a double quote"</SPAN
728 >. Finally, <TT
729 CLASS="LITERAL"
730 >\1</TT
731 > is
732  a back-reference to the first parenthesis just like <TT
733 CLASS="LITERAL"
734 >$1</TT
735 > above,
736  with the difference that in the <SPAN
737 CLASS="emphasis"
738 ><I
739 CLASS="EMPHASIS"
740 >pattern</I
741 ></SPAN
742 >, a backslash indicates
743  a back-reference, whereas in the <SPAN
744 CLASS="emphasis"
745 ><I
746 CLASS="EMPHASIS"
747 >substitute</I
748 ></SPAN
749 >, it's the dollar.</P
750 ><P
751 > So what does this job do? It replaces assignments of single- or double-quoted
752  strings to the <SPAN
753 CLASS="QUOTE"
754 >"window.status"</SPAN
755 > object with a dummy assignment
756  (using a variable name that is hopefully odd enough not to conflict with
757  real variables in scripts). Thus, it catches many cases where e.g. pointless
758  descriptions are displayed in the status bar instead of the link target when
759  you move your mouse over links.</P
760 ><P
761 > <TABLE
762 BORDER="0"
763 BGCOLOR="#E0E0E0"
764 WIDTH="100%"
765 ><TR
766 ><TD
767 ><PRE
768 CLASS="SCREEN"
769 ># Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
770 #
771 s/(&#60;body [^&#62;]*)onunload(.*&#62;)/$1never$2/iU</PRE
772 ></TD
773 ></TR
774 ></TABLE
775 ></P
776 ><P
777 > Including the
778  <A
779 HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents"
780 TARGET="_top"
781 >OnUnload
782  event binding</A
783 > in the HTML DOM was a <SPAN
784 CLASS="emphasis"
785 ><I
786 CLASS="EMPHASIS"
787 >CRIME</I
788 ></SPAN
789 >.
790  When I close a browser window, I want it to close and die. Basta.
791  This job replaces the <SPAN
792 CLASS="QUOTE"
793 >"onunload"</SPAN
794 > attribute in
795  <SPAN
796 CLASS="QUOTE"
797 >"&#60;body&#62;"</SPAN
798 > tags with the dummy word <TT
799 CLASS="LITERAL"
800 >never</TT
801 >.
802  Note that the <TT
803 CLASS="LITERAL"
804 >i</TT
805 > option makes the pattern matching
806  case-insensitive. Also note that ungreedy matching alone doesn't always guarantee
807  a minimal match: In the first parenthesis, we had to use <TT
808 CLASS="LITERAL"
809 >[^&#62;]*</TT
810 >
811  instead of <TT
812 CLASS="LITERAL"
813 >.*</TT
814 > to prevent the match from exceeding the 
815  &#60;body&#62; tag if it doesn't contain <SPAN
816 CLASS="QUOTE"
817 >"OnUnload"</SPAN
818 >, but the page's
819  content does.</P
820 ><P
821 > The last example is from the fun department:</P
822 ><P
823 > <TABLE
824 BORDER="0"
825 BGCOLOR="#E0E0E0"
826 WIDTH="100%"
827 ><TR
828 ><TD
829 ><PRE
830 CLASS="SCREEN"
831 >FILTER: fun Fun text replacements
832
833 # Spice the daily news:
834 #
835 s/microsoft(?!\.com)/MicroSuck/ig</PRE
836 ></TD
837 ></TR
838 ></TABLE
839 ></P
840 ><P
841 > Note the <TT
842 CLASS="LITERAL"
843 >(?!\.com)</TT
844 > part (a so-called negative lookahead)
845  in the job's pattern, which means: Don't match, if the string 
846  <SPAN
847 CLASS="QUOTE"
848 >".com"</SPAN
849 > appears directly following <SPAN
850 CLASS="QUOTE"
851 >"microsoft"</SPAN
852 >
853  in the page. This prevents links to microsoft.com from being trashed, while
854  still replacing the word everywhere else.</P
855 ><P
856 > <TABLE
857 BORDER="0"
858 BGCOLOR="#E0E0E0"
859 WIDTH="100%"
860 ><TR
861 ><TD
862 ><PRE
863 CLASS="SCREEN"
864 ># Buzzword Bingo (example for extended regex syntax)
865 #
866 s* industry[ -]leading \
867 |  cutting[ -]edge \
868 |  customer[ -]focused \
869 |  market[ -]driven \
870 |  award[ -]winning # Comments are OK, too! \
871 |  high[ -]performance \
872 |  solutions[ -]based \
873 |  unmatched \
874 |  unparalleled \
875 |  unrivalled \
876 *&#60;font color="red"&#62;&#60;b&#62;BINGO!&#60;/b&#62;&#60;/font&#62; \
877 *igx</PRE
878 ></TD
879 ></TR
880 ></TABLE
881 ></P
882 ><P
883 > The <TT
884 CLASS="LITERAL"
885 >x</TT
886 > option in this job turns on extended syntax, and allows for
887  e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. </P
888 ><P
889 > You get the idea?</P
890 ></DIV
891 ><DIV
892 CLASS="SECT2"
893 ><H2
894 CLASS="SECT2"
895 ><A
896 NAME="PREDEFINED-FILTERS"
897 >9.2. The Pre-defined Filters</A
898 ></H2
899 ><P
900 >The distribution <TT
901 CLASS="FILENAME"
902 >default.filter</TT
903 > file contains a selection of
904 pre-defined filters for your convenience:</P
905 ><P
906 ></P
907 ><DIV
908 CLASS="VARIABLELIST"
909 ><DL
910 ><DT
911 ><SPAN
912 CLASS="emphasis"
913 ><I
914 CLASS="EMPHASIS"
915 >js-annoyances</I
916 ></SPAN
917 ></DT
918 ><DD
919 ><P
920 >    The purpose of this filter is to get rid of particularly annoying JavaScript abuse.
921     To that end, it
922    <P
923 ></P
924 ><UL
925 ><LI
926 ><P
927 >      replaces JavaScript references to the browser's referrer information
928       with the string "Not Your Business!". This compliments the <TT
929 CLASS="LITERAL"
930 ><A
931 HREF="actions-file.html#HIDE-REFERRER"
932 >hide-referrer</A
933 ></TT
934 > action on the content level.
935      </P
936 ></LI
937 ><LI
938 ><P
939 >      removes the bindings to the DOM's
940       <A
941 HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents"
942 TARGET="_top"
943 >unload
944       event</A
945 > which we feel has no right to exist and is responsible for most <SPAN
946 CLASS="QUOTE"
947 >"exit consoles"</SPAN
948 >, i.e.
949       nasty windows that pop up when you close another one.
950      </P
951 ></LI
952 ><LI
953 ><P
954 >      removes code that causes new windows to be opened with undesired properties, such as being
955       full-screen, non-resizeable, without location, status or menu bar etc.
956      </P
957 ></LI
958 ></UL
959 >
960    </P
961 ><P
962 >    Use with caution. This is an aggressive filter, and can break sites that 
963     rely heavily on JavaScript.
964    </P
965 ></DD
966 ><DT
967 ><SPAN
968 CLASS="emphasis"
969 ><I
970 CLASS="EMPHASIS"
971 >js-events</I
972 ></SPAN
973 ></DT
974 ><DD
975 ><P
976 >    This is a very radical measure. It removes virtually all JavaScript event bindings, which
977     means that scripts can not react to user actions such as mouse movements or clicks, window
978     resizing etc, anymore. Use with caution!
979    </P
980 ><P
981 >    We <SPAN
982 CLASS="emphasis"
983 ><I
984 CLASS="EMPHASIS"
985 >strongly discourage</I
986 ></SPAN
987 > using this filter as a default since it breaks
988     many legitimate scripts. It is meant for use only on extra-nasty sites (should you really
989     need to go there).
990    </P
991 ></DD
992 ><DT
993 ><SPAN
994 CLASS="emphasis"
995 ><I
996 CLASS="EMPHASIS"
997 >html-annoyances</I
998 ></SPAN
999 ></DT
1000 ><DD
1001 ><P
1002 >    This filter will undo many common instances of HTML based abuse.
1003    </P
1004 ><P
1005 >    The <TT
1006 CLASS="LITERAL"
1007 >BLINK</TT
1008 > and <TT
1009 CLASS="LITERAL"
1010 >MARQUEE</TT
1011 > tags 
1012     are neutralized (yeah baby!), and browser windows will be created as
1013     resizeable (as of course they should be!), and will have location,
1014     scroll and menu bars -- even if specified otherwise.
1015    </P
1016 ></DD
1017 ><DT
1018 ><SPAN
1019 CLASS="emphasis"
1020 ><I
1021 CLASS="EMPHASIS"
1022 >content-cookies</I
1023 ></SPAN
1024 ></DT
1025 ><DD
1026 ><P
1027 >    Most cookies are set in the HTTP dialog, where they can be intercepted
1028     by the
1029     <TT
1030 CLASS="LITERAL"
1031 ><A
1032 HREF="actions-file.html#CRUNCH-INCOMING-COOKIES"
1033 >crunch-incoming-cookies</A
1034 ></TT
1035 >
1036     and <TT
1037 CLASS="LITERAL"
1038 ><A
1039 HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES"
1040 >crunch-outgoing-cookies</A
1041 ></TT
1042 >
1043     actions. But web sites increasingly make use of HTML meta tags and JavaScript
1044     to sneak cookies to the browser on the content level.
1045    </P
1046 ><P
1047 >    This filter disables most HTML and JavaScript code that reads or sets
1048     cookies. It cannot detect all clever uses of these types of code, so it 
1049     should not be relied on as an absolute fix. Use it wherever you would also
1050     use the cookie crunch actions. 
1051    </P
1052 ></DD
1053 ><DT
1054 ><SPAN
1055 CLASS="emphasis"
1056 ><I
1057 CLASS="EMPHASIS"
1058 >refresh tags</I
1059 ></SPAN
1060 ></DT
1061 ><DD
1062 ><P
1063 >    Disable any refresh tags if the interval is greater than nine seconds (so 
1064     that redirections done via refresh tags are not destroyed). This is useful 
1065     for dial-on-demand setups, or for those who find this HTML feature
1066     annoying.
1067    </P
1068 ></DD
1069 ><DT
1070 ><SPAN
1071 CLASS="emphasis"
1072 ><I
1073 CLASS="EMPHASIS"
1074 >unsolicited-popups</I
1075 ></SPAN
1076 ></DT
1077 ><DD
1078 ><P
1079 >    This filter attempts to prevent only <SPAN
1080 CLASS="QUOTE"
1081 >"unsolicited"</SPAN
1082 > pop-up 
1083     windows from opening, yet still allow pop-up windows that the user 
1084     has explicitly chosen to open. It was added in version 3.0.1, 
1085     as an improvement over earlier such filters.
1086    </P
1087 ><P
1088 >    Technical note: The filter works by redefining the window.open JavaScript
1089     function to a dummy function, <TT
1090 CLASS="LITERAL"
1091 >PrivoxyWindowOpen()</TT
1092 >,
1093     during the loading and rendering phase of each HTML page access, and
1094     restoring the function afterward.
1095    </P
1096 ><P
1097 >    This is recommended only for browsers that cannot perform this function
1098     reliably themselves. And be aware that some sites require such windows 
1099     in order to function normally. Use with caution.
1100    </P
1101 ></DD
1102 ><DT
1103 ><SPAN
1104 CLASS="emphasis"
1105 ><I
1106 CLASS="EMPHASIS"
1107 >all-popups</I
1108 ></SPAN
1109 ></DT
1110 ><DD
1111 ><P
1112 >    Attempt to prevent <SPAN
1113 CLASS="emphasis"
1114 ><I
1115 CLASS="EMPHASIS"
1116 >all</I
1117 ></SPAN
1118 > pop-up windows from opening.
1119     Note this should be used with even more discretion than the above, since
1120     it is more likely to break some sites that require pop-ups for normal
1121     usage. Use with caution.
1122    </P
1123 ></DD
1124 ><DT
1125 ><SPAN
1126 CLASS="emphasis"
1127 ><I
1128 CLASS="EMPHASIS"
1129 >img-reorder</I
1130 ></SPAN
1131 ></DT
1132 ><DD
1133 ><P
1134 >    This is a helper filter that has no value if used alone. It makes the
1135     <TT
1136 CLASS="LITERAL"
1137 >banners-by-size</TT
1138 > and <TT
1139 CLASS="LITERAL"
1140 >banners-by-link</TT
1141 >
1142     (see below) filters more effective and should be enabled together with them.
1143    </P
1144 ></DD
1145 ><DT
1146 ><SPAN
1147 CLASS="emphasis"
1148 ><I
1149 CLASS="EMPHASIS"
1150 >banners-by-size</I
1151 ></SPAN
1152 ></DT
1153 ><DD
1154 ><P
1155 >    This filter removes image tags purely based on what size they are. Fortunately 
1156     for us, many ads and banner images tend to conform to certain standardized
1157     sizes, which makes this filter quite effective for ad stripping purposes.
1158    </P
1159 ><P
1160 >    Occasionally this filter will cause false positives on images that are not ads,
1161     but just happen to be of one of the standard banner sizes.
1162    </P
1163 ><P
1164 >    Recommended only for those who require extreme ad blocking. The default 
1165     block rules should catch 95+% of all ads <SPAN
1166 CLASS="emphasis"
1167 ><I
1168 CLASS="EMPHASIS"
1169 >without</I
1170 ></SPAN
1171 > this filter enabled.
1172    </P
1173 ></DD
1174 ><DT
1175 ><SPAN
1176 CLASS="emphasis"
1177 ><I
1178 CLASS="EMPHASIS"
1179 >banners-by-link</I
1180 ></SPAN
1181 ></DT
1182 ><DD
1183 ><P
1184 >    This is an experimental filter that attempts to kill any banners if 
1185     their URLs seem to point to known or suspected click trackers. It is currently
1186     not of much value and is not recommended for use by default.
1187    </P
1188 ></DD
1189 ><DT
1190 ><SPAN
1191 CLASS="emphasis"
1192 ><I
1193 CLASS="EMPHASIS"
1194 >webbugs</I
1195 ></SPAN
1196 ></DT
1197 ><DD
1198 ><P
1199 >    Webbugs are small, invisible images (technically 1X1 GIF images), that 
1200     are used to track users across websites, and collect information on them.
1201     As an HTML page is loaded by the browser, an embedded image tag causes the
1202     browser to contact a third-party site, disclosing the tracking information
1203     through the requested URL and/or cookies for that third-party domain, without
1204     the user ever becoming aware of the interaction with the third-party site.
1205     HTML-ized spam also uses a similar technique to verify email addresses.
1206    </P
1207 ><P
1208 >    This filter removes the HTML code that loads such <SPAN
1209 CLASS="QUOTE"
1210 >"webbugs"</SPAN
1211 >.
1212    </P
1213 ></DD
1214 ><DT
1215 ><SPAN
1216 CLASS="emphasis"
1217 ><I
1218 CLASS="EMPHASIS"
1219 >tiny-textforms</I
1220 ></SPAN
1221 ></DT
1222 ><DD
1223 ><P
1224 >    A rather special-purpose filter that can be used to enlarge textareas (those
1225     multi-line text boxes in web forms) and turn off hard word wrap in them. 
1226     It was written for the sourceforge.net tracker system where such boxes are
1227     a nuisance, but it can be handy on other sites, too.
1228    </P
1229 ><P
1230 >    It is not recommended to use this filter as a default.
1231    </P
1232 ></DD
1233 ><DT
1234 ><SPAN
1235 CLASS="emphasis"
1236 ><I
1237 CLASS="EMPHASIS"
1238 >jumping-windows</I
1239 ></SPAN
1240 ></DT
1241 ><DD
1242 ><P
1243 >    Many consider windows that move, or resize themselves to be abusive. This filter
1244     neutralizes the related JavaScript code. Note that some sites might not display
1245     or behave as intended when using this filter. Use with caution.
1246    </P
1247 ></DD
1248 ><DT
1249 ><SPAN
1250 CLASS="emphasis"
1251 ><I
1252 CLASS="EMPHASIS"
1253 >frameset-borders</I
1254 ></SPAN
1255 ></DT
1256 ><DD
1257 ><P
1258 >    Some web designers seem to assume that everyone in the world will view their
1259     web sites using the same browser brand and version, screen resolution etc,
1260     because only that assumption could explain why they'd use static frame sizes,
1261     yet prevent their frames from being resized by the user, should they be too
1262     small to show their whole content.
1263    </P
1264 ><P
1265 >    This filter removes the related HTML code. It should only be applied to sites
1266     which need it.
1267    </P
1268 ></DD
1269 ><DT
1270 ><SPAN
1271 CLASS="emphasis"
1272 ><I
1273 CLASS="EMPHASIS"
1274 >demoronizer</I
1275 ></SPAN
1276 ></DT
1277 ><DD
1278 ><P
1279 >    Many Microsoft products that generate HTML use non-standard extensions (read:
1280     violations) of the ISO 8859-1 aka Latin-1 character set. This can cause those
1281     HTML documents to display with errors on standard-compliant platforms. 
1282    </P
1283 ><P
1284 >    This filter translates the MS-only characters into Latin-1 equivalents. 
1285     It is not necessary when using MS products, and will cause corruption of  
1286     all documents that use 8-bit character sets other than Latin-1. It's mostly
1287     worthwhile for Europeans on non-MS platforms, if weird garbage characters
1288     sometimes appear on some pages, or user agents that don't correct for this on 
1289     the fly.
1290  
1291    </P
1292 ></DD
1293 ><DT
1294 ><SPAN
1295 CLASS="emphasis"
1296 ><I
1297 CLASS="EMPHASIS"
1298 >shockwave-flash</I
1299 ></SPAN
1300 ></DT
1301 ><DD
1302 ><P
1303 >    A filter for shockwave haters. As the name suggests, this filter strips code
1304     out of web pages that is used to embed shockwave flash objects. 
1305    </P
1306 ><P
1307 >   </P
1308 ></DD
1309 ><DT
1310 ><SPAN
1311 CLASS="emphasis"
1312 ><I
1313 CLASS="EMPHASIS"
1314 >quicktime-kioskmode</I
1315 ></SPAN
1316 ></DT
1317 ><DD
1318 ><P
1319 >    Change HTML code that embeds Quicktime objects so that kioskmode, which
1320     prevents saving, is disabled.
1321    </P
1322 ></DD
1323 ><DT
1324 ><SPAN
1325 CLASS="emphasis"
1326 ><I
1327 CLASS="EMPHASIS"
1328 >fun</I
1329 ></SPAN
1330 ></DT
1331 ><DD
1332 ><P
1333 >    Text replacements for subversive browsing fun. Make fun of your favorite
1334     Monopolist or play buzzword bingo.
1335    </P
1336 ></DD
1337 ><DT
1338 ><SPAN
1339 CLASS="emphasis"
1340 ><I
1341 CLASS="EMPHASIS"
1342 >crude-parental</I
1343 ></SPAN
1344 ></DT
1345 ><DD
1346 ><P
1347 >    A demonstration-only filter that shows how <SPAN
1348 CLASS="APPLICATION"
1349 >Privoxy</SPAN
1350 >
1351     can be used to delete web content on a keyword basis.
1352    </P
1353 ></DD
1354 ><DT
1355 ><SPAN
1356 CLASS="emphasis"
1357 ><I
1358 CLASS="EMPHASIS"
1359 >ie-exploits</I
1360 ></SPAN
1361 ></DT
1362 ><DD
1363 ><P
1364 >    An experimental collection of text replacements to disable malicious HTML and JavaScript
1365     code that exploits known security holes in Internet Explorer.
1366    </P
1367 ><P
1368 >    Presently, it only protects against Nimda and a cross-site scripting bug, and
1369     would need active maintenance to provide more substantial protection.
1370    </P
1371 ></DD
1372 ><DT
1373 ><SPAN
1374 CLASS="emphasis"
1375 ><I
1376 CLASS="EMPHASIS"
1377 >site-specifics</I
1378 ></SPAN
1379 ></DT
1380 ><DD
1381 ><P
1382 >    Some web sites have very specific problems, the cure for which doesn't apply
1383     anywhere else, or could even cause damage on other sites.
1384    </P
1385 ><P
1386 >    This is a collection of such site-specific cures which should only be applied
1387     to the sites they were intended for, which is what the supplied
1388     <TT
1389 CLASS="FILENAME"
1390 >default.action</TT
1391 > file does. Users shouldn't need to change
1392     anything regarding this filter.
1393    </P
1394 ></DD
1395 ><DT
1396 ><SPAN
1397 CLASS="emphasis"
1398 ><I
1399 CLASS="EMPHASIS"
1400 >google</I
1401 ></SPAN
1402 ></DT
1403 ><DD
1404 ><P
1405 >    A CSS based block for Google text ads. Also removes a width limitation
1406     and the toolbar advertisement.
1407    </P
1408 ></DD
1409 ><DT
1410 ><SPAN
1411 CLASS="emphasis"
1412 ><I
1413 CLASS="EMPHASIS"
1414 >yahoo</I
1415 ></SPAN
1416 ></DT
1417 ><DD
1418 ><P
1419 >    Another CSS based block, this time for Yahoo text ads. And removes 
1420     a width limitation as well.
1421    </P
1422 ></DD
1423 ><DT
1424 ><SPAN
1425 CLASS="emphasis"
1426 ><I
1427 CLASS="EMPHASIS"
1428 >msn</I
1429 ></SPAN
1430 ></DT
1431 ><DD
1432 ><P
1433 >    Another CSS based block, this time for MSN text ads. And removes 
1434     tracking URLs, as well as a width limitation.
1435    </P
1436 ></DD
1437 ><DT
1438 ><SPAN
1439 CLASS="emphasis"
1440 ><I
1441 CLASS="EMPHASIS"
1442 >blogspot</I
1443 ></SPAN
1444 ></DT
1445 ><DD
1446 ><P
1447 >    Cleans up some Blogspot blogs. Read the fine print before using this one!
1448    </P
1449 ><P
1450 >    This filter also intentionally removes some navigation stuff and sets the
1451     page width to 100%. As a result, some rounded <SPAN
1452 CLASS="QUOTE"
1453 >"corners"</SPAN
1454 > would
1455     appear to early or not at all and as fixing this would require a browser
1456     that understands background-size (CSS3), they are removed instead.
1457    </P
1458 ></DD
1459 ><DT
1460 ><SPAN
1461 CLASS="emphasis"
1462 ><I
1463 CLASS="EMPHASIS"
1464 >xml-to-html</I
1465 ></SPAN
1466 ></DT
1467 ><DD
1468 ><P
1469 >    Server-header filter to change the Content-Type from xml to html.
1470    </P
1471 ></DD
1472 ><DT
1473 ><SPAN
1474 CLASS="emphasis"
1475 ><I
1476 CLASS="EMPHASIS"
1477 >html-to-xml</I
1478 ></SPAN
1479 ></DT
1480 ><DD
1481 ><P
1482 >    Server-header filter to change the Content-Type from html to xml.
1483    </P
1484 ></DD
1485 ><DT
1486 ><SPAN
1487 CLASS="emphasis"
1488 ><I
1489 CLASS="EMPHASIS"
1490 >no-ping</I
1491 ></SPAN
1492 ></DT
1493 ><DD
1494 ><P
1495 >    Removes the non-standard <TT
1496 CLASS="LITERAL"
1497 >ping</TT
1498 > attribute from
1499     anchor and area HTML tags.
1500    </P
1501 ></DD
1502 ><DT
1503 ><SPAN
1504 CLASS="emphasis"
1505 ><I
1506 CLASS="EMPHASIS"
1507 >hide-tor-exit-notation</I
1508 ></SPAN
1509 ></DT
1510 ><DD
1511 ><P
1512 >    Client-header filter to remove the <B
1513 CLASS="COMMAND"
1514 >Tor</B
1515 > exit node notation
1516     found in Host and Referer headers.
1517    </P
1518 ><P
1519 >    If <SPAN
1520 CLASS="APPLICATION"
1521 >Privoxy</SPAN
1522 > and <B
1523 CLASS="COMMAND"
1524 >Tor</B
1525 > are chained and <SPAN
1526 CLASS="APPLICATION"
1527 >Privoxy</SPAN
1528 >
1529     is configured to use socks4a, one can use <SPAN
1530 CLASS="QUOTE"
1531 >"http://www.example.org.foobar.exit/"</SPAN
1532 >
1533     to access the host <SPAN
1534 CLASS="QUOTE"
1535 >"www.example.org"</SPAN
1536 > through the
1537     <B
1538 CLASS="COMMAND"
1539 >Tor</B
1540 > exit node <SPAN
1541 CLASS="QUOTE"
1542 >"foobar"</SPAN
1543 >.
1544    </P
1545 ><P
1546 >    As the HTTP client isn't aware of this notation, it treats the
1547     whole string <SPAN
1548 CLASS="QUOTE"
1549 >"www.example.org.foobar.exit"</SPAN
1550 > as host and uses it
1551     for the <SPAN
1552 CLASS="QUOTE"
1553 >"Host"</SPAN
1554 > and <SPAN
1555 CLASS="QUOTE"
1556 >"Referer"</SPAN
1557 > headers. From the
1558     server's point of view the resulting headers are invalid and can cause problems.
1559    </P
1560 ><P
1561 >    An invalid <SPAN
1562 CLASS="QUOTE"
1563 >"Referer"</SPAN
1564 > header can trigger <SPAN
1565 CLASS="QUOTE"
1566 >"hot-linking"</SPAN
1567 >
1568     protections, an invalid <SPAN
1569 CLASS="QUOTE"
1570 >"Host"</SPAN
1571 > header will make it impossible for
1572     the server to find the right vhost (several domains hosted on the same IP address).
1573    </P
1574 ><P
1575 >    This client-header filter removes the <SPAN
1576 CLASS="QUOTE"
1577 >"foo.exit"</SPAN
1578 > part in those headers
1579     to prevent the mentioned problems. Note that it only modifies
1580     the HTTP headers, it doesn't make it impossible for the server
1581     to detect your <B
1582 CLASS="COMMAND"
1583 >Tor</B
1584 > exit node based on the IP address
1585     the request is coming from.
1586    </P
1587 ></DD
1588 ></DL
1589 ></DIV
1590 ></DIV
1591 ></DIV
1592 ><DIV
1593 CLASS="NAVFOOTER"
1594 ><HR
1595 ALIGN="LEFT"
1596 WIDTH="100%"><TABLE
1597 SUMMARY="Footer navigation table"
1598 WIDTH="100%"
1599 BORDER="0"
1600 CELLPADDING="0"
1601 CELLSPACING="0"
1602 ><TR
1603 ><TD
1604 WIDTH="33%"
1605 ALIGN="left"
1606 VALIGN="top"
1607 ><A
1608 HREF="actions-file.html"
1609 ACCESSKEY="P"
1610 >Prev</A
1611 ></TD
1612 ><TD
1613 WIDTH="34%"
1614 ALIGN="center"
1615 VALIGN="top"
1616 ><A
1617 HREF="index.html"
1618 ACCESSKEY="H"
1619 >Home</A
1620 ></TD
1621 ><TD
1622 WIDTH="33%"
1623 ALIGN="right"
1624 VALIGN="top"
1625 ><A
1626 HREF="templates.html"
1627 ACCESSKEY="N"
1628 >Next</A
1629 ></TD
1630 ></TR
1631 ><TR
1632 ><TD
1633 WIDTH="33%"
1634 ALIGN="left"
1635 VALIGN="top"
1636 >Actions Files</TD
1637 ><TD
1638 WIDTH="34%"
1639 ALIGN="center"
1640 VALIGN="top"
1641 >&nbsp;</TD
1642 ><TD
1643 WIDTH="33%"
1644 ALIGN="right"
1645 VALIGN="top"
1646 >Privoxy's Template Files</TD
1647 ></TR
1648 ></TABLE
1649 ></DIV
1650 ></BODY
1651 ></HTML
1652 >