Added Bookmarklet for one-click pre-filled access to show-url-info
[privoxy.git] / doc / source / user-manual.sgml
index 87f06d1..5a6e063 100644 (file)
@@ -9,8 +9,10 @@
 <!entity history SYSTEM "history.sgml">
 <!entity copyright SYSTEM "copyright.sgml">
 <!entity license SYSTEM "license.sgml">
+<!entity p-authors SYSTEM "p-authors.sgml">
 <!entity p-version "2.9.15">
 <!entity p-status "beta">
+<!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc  -->
 <!entity % p-not-stable "INCLUDE">
 <!entity % p-stable "IGNORE">
 <!entity % p-text "IGNORE">        <!-- define we are not a text only doc -->
@@ -19,6 +21,7 @@
 <!entity % p-config "IGNORE">
 <!entity % p-supp-userman "IGNORE"> <!-- Omit some from supported.sgml    -->
 <!entity  my-copy "&copy;">         <!-- kludge for docbook2man           -->
+<!entity % draft "IGNORE">          <!-- WIP stuff    -->
 ]>
 <!--
  File        :  $Source: /cvsroot/ijbswa/current/doc/source/user-manual.sgml,v $
@@ -26,8 +29,8 @@
  Purpose     :  user manual
                 This file belongs into
                 ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: user-manual.sgml,v 1.111 2002/05/14 23:01:36 oes Exp $
+
+ $Id: user-manual.sgml,v 1.121 2002/05/23 23:20:17 oes Exp $
 
  Copyright (C) 2001, 2002 Privoxy Developers <developers@privoxy.org>
  See LICENSE.
@@ -53,7 +56,7 @@
  </subscript>
 </pubdate>
 
-<pubdate>$Id: user-manual.sgml,v 1.111 2002/05/14 23:01:36 oes Exp $</pubdate>
+<pubdate>$Id: user-manual.sgml,v 1.121 2002/05/23 23:20:17 oes Exp $</pubdate>
 
 <!--
 
@@ -217,7 +220,10 @@ automatically start Privoxy in the boot process.
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 id="installation-deb"><title>Debian</title>
 <para>
- FIXME.
+ DEBs can be installed with <literal>dpkg -i
+ privoxy_&p-version;-1.deb</literal>, and will use
+ <filename>/etc/privoxy</filename> for the location of configuration
+ files.
 </para>
 </sect3>
 
@@ -341,13 +347,13 @@ automatically start Privoxy in the boot process.
  and <application>Privoxy</application> configurations will need to be
  ported. The functionalities of the old <filename>blockfile</filename>,
  <filename>cookiefile</filename> and <filename>imagelist</filename> 
- are now combined into the <ulink url="actions-file.html"><quote>actions
- files</quote></ulink>.  
+ are now combined into the <link linkend="actions-file"><quote>actions
+ files</quote></link>.  
  <filename>default.action</filename>, is the main actions file. Local
  exceptions should best be put into <filename>user.action</filename>.
 </para>
 <para>
- A <ulink url="filter-file.html"><quote>filter file</quote></ulink> (typically
+ A <link linkend="filter-file"><quote>filter file</quote></link> (typically
  <filename>default.filter</filename>) is new as of <application>Privoxy
  2.9.x</application>, and provides some of the new sophistication (explained
  below). <filename>config</filename> is much the same as before.
@@ -391,10 +397,10 @@ automatically start Privoxy in the boot process.
  </listitem> 
  <listitem>
   <para>
-   The primary configuration file for cookie management, ad and banner 
+   The primary configuration files for cookie management, ad and banner 
    blocking, and many other aspects of <application>Privoxy</application>
-   configuration is in the <ulink url="actions-file.html">actions
-   files</ulink>. It is strongly recommended to become familiar with the new
+   configuration are the <link linkend="actions-file">actions
+   files</link>. It is strongly recommended to become familiar with the new
    actions concept below, before modifying these files. Locally defined rules 
    should go into <filename>user.action</filename>.
   </para>
@@ -419,61 +425,87 @@ automatically start Privoxy in the boot process.
 
  <listitem>
   <para>
-   If upgrading, please back up any configuration files. See 
-   the <link linkend="upgradersnote">Note to Upgraders</link> Section.
 </para>
+   If upgrading, from versions before 2.9.16, please back up any configuration
+   files. See the <link linkend="upgradersnote">Note to Upgraders</link> Section.
+ </para>
 </listitem> 
+
  <listitem>
   <para>
   Install <application>Privoxy</application>. See the <link
-  linkend="installation">Installation Section</link> for platform specific
+  linkend="installation">Installation Section</link> below for platform specific
   information. 
  </para>
  </listitem>  
 
  <listitem>
   <para>
-  Start <application>Privoxy</application>, if the installation program has
-  not done this already. See the section <link linkend="startup">Starting
-  <application>Privoxy</application></link>.
+   Advanced users and those who want to offer <application>Privoxy</application>
+   service to more than just their local machine should check the <link
+   linkend="config">main config file</link>, especially the <link
+   linkend="access-control">security-relevant</link> options. These are 
+   off by default.
   </para>
  </listitem>  
 
  <listitem>
   <para>
-  Set your browser to use <application>Privoxy</application> as HTTP and HTTPS
-  proxy by setting the proxy configuration for address of
-  <literal>127.0.0.1</literal> and port <literal>8118</literal>.
-  (<application>Junkbuster</application> and earlier versions of
-  <application>Privoxy</application> used port 8000.) See the section <link
-  linkend="startup">Starting <application>Privoxy</application></link>.
+  Start <application>Privoxy</application>, if the installation program has
+  not done this already (may vary according to platform). See the section
+  <link linkend="startup">Starting <application>Privoxy</application></link>.
+  </para>
+ </listitem>
+
+ <listitem>
+  <para>
+   Set your browser to use <application>Privoxy</application> as HTTP and
+   HTTPS proxy by setting the proxy configuration for address of
+   <literal>127.0.0.1</literal> and port <literal>8118</literal>.
+   (<application>Junkbuster</application> and earlier versions of
+   <application>Privoxy</application> used port 8000.) See the section <link
+   linkend="startup">Starting <application>Privoxy</application></link> below
+   for more details on this.
   </para>
  </listitem>  
 
  <listitem>
   <para>
-    Flush your browser's caches, to remove any cached ad images.
+    Flush your browser's disk and memory caches, to remove any cached ad images.
   </para>
-</listitem> 
+ </listitem> 
 
  <listitem>
   <para>
-  Enjoy surfing with enhanced comfort and privacy.  You may want to customize the
-  <link linkend="actions-file"><filename>user.action</filename></link> file to
-  personalize your new browsing experience. See the <link
-  linkend="configuration">Configuration section</link> for more configuration
-  options, and how to further customize your installation.
+   A default installation should provide a reasonable starting point for 
+   most. There will undoubtedly be occasions where you will want to adjust the
+   configuration, but that can be dealt with as the need arises. Little 
+   to no initial configuration is required in most cases.
+  </para>
+  <para>
+   See the <link linkend="configuration">Configuration section</link> for more
+   configuration options, and how to customize your installation.
+ <![%draft;[  You might also want to look at the <link
+   linkend="quickstart-ad-blocking">next section</link> for a quick
+   introduction to how <application>Privoxy</application> blocks ads and
+   banners.]]>
   </para>
  </listitem> 
+
  <listitem>
   <para>
-   If you experience problems with sites that <quote>misbehave</quote>, see
-   the <link linkend="actionsanat">Anatomy of an Action</link> section in the
-   Appendix.
+    If you experience ads that slipped through, innocent images that are
+    blocked, or otherwise feel the need to fine-tune
+    <application>Privoxy's</application> behaviour, take a look at the <link
+    linkend="actions-file">actions files</link>. As a quick start, you might
+    find the <link linkend="act-examples">richly commented examples</link>
+    helpful. You can also view and edit the actions files through the <ulink
+    url="http://config.privoxy.org">web-based user interface</ulink>. The
+    Appendix <quote><link linkend="actionsanat">Anatomy of an
+    Action</link></quote> has hints how to debug actions that
+    <quote>misbehave</quote>.
   </para>
  </listitem> 
+
  <listitem>
   <para>
    Please see the section <link linkend="contact">Contacting the
@@ -482,11 +514,262 @@ automatically start Privoxy in the boot process.
   </para>
  </listitem> 
 
+ <listitem>
+  <para>
+   Now enjoy surfing with enhanced comfort and privacy!
+  </para>
+ </listitem> 
+ </itemizedlist>
+</para>
+
+
+<!--   ~~~~~       New section      ~~~~~     -->
+
+<sect2 id="quickstart-ad-blocking">
+<title>Quickstart to Ad Blocking</title>
+<!--
+ NOTE:  This section is deliberately redundant for those that don't 
+ want to read the whole thing (which is getting lengthy).
+-->
+<para>
+ Ad blocking is but one of <application>Privoxy's</application>
+ array of features. Many of these features are for the technically minded advanced 
+ user. But, ad and banner blocking is surely common ground for everybody.
+</para>
+<para> 
+ This section will provide a quick summary of ad blocking so 
+ you can get up to speed quickly without having to read the more extensive
+ information provided below, though this is highly recommeneded.
+</para>
+<para>
+ First a bit of a warning ... blocking ads is much like blocking SPAM: the
+ more aggressive you are about it, the more likely you are to block 
+ things that were not intended. So there is a trade off here. If you want
+ extreme ad free browsing, be prepared to deal with more
+ <quote>problem</quote> sites, and to spend more time adjusting the
+ configuration to solve these unintended consequences. In short, there is 
+ not an easy way to eliminate <emphasis>all</emphasis> ads. Either take 
+ the easy way and settle for <emphasis>most</emphasis> ads blocked with the
+ default configuration, or jump in and tweak it for your personal surfing
+ habits and preferences.
+</para>
+<para>
+ Secondly, a brief explanation of <application>Privoxy's </application>
+ <quote>actions</quote>. <quote>Actions</quote> in this context, are 
+ the directives we use to tell <application>Privoxy</application> to perform
+ some task relating to HTTP transactions (i.e. web browsing). We tell
+ <application>Privoxy</application> to take some <quote>action</quote>. Each
+ action has a unique name and function. While there are many potential
+ <application>actions</application> in <application>Privoxy's</application>
+ arsenal, only a few are used for ad blocking. <link
+ linkend="actions">Actions</link>, and <link linkend="actions-file">action
+ configuration files</link>, are explained in depth below.
+</para>
+<para>
+ Actions are specified in <application>Privoxy's</application> configuration,
+ followed by one or more URLs to which the action should apply. URLs 
+ can actually be URL type <link linkend="af-patterns">patterns</link> that use
+ wildcards so they can apply potentially to a range of similar URLs. The
+ actions, together with the URL patterns are called a section.
+</para>
+<para>
+ When you connect to a website, the full URL will either match one or more
+ of the sections as defined in <application>Privoxy's</application> configuration,
+ or not. If so, then <application>Privoxy</application> will perform the
+ respective actions. If not, then nothing special happens. Futhermore, web
+ pages may contain embedded, secondary URLs that your web browser will
+ use to load additional components of the page, as it parses the
+ original page's HTML content. An ad image for instance, is just a URL
+ embedded in the page somewhere. The image itself may be on the same server,
+ or a server somewhere else on the Internet. Complex web pages will have many
+ such embedded URLs.
+</para>
+
+<para>
+ The actions we need to know about for ad blocking are:  <literal><link
+ linkend="block">block</link></literal>, <literal><link
+ linkend="handle-as-image">handle-as-image</link></literal>, and
+ <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>:
+</para>
+
+<para>
+ <itemizedlist>
+  
+ <listitem>
+  <para>
+   <literal><link linkend="block">block</link></literal> - this action stops
+   any contact between your browser and any URL patterns that match this
+   action's configuration. It can be used for blocking ads, but also anything
+   that is determined to be unwanted. By itself, it simply stops any
+   communication with the remote server and sends <application>Privoxy</application>'s
+   own built-in BLOCKED page instead to let you now what has happened.
+  </para>
+ </listitem> 
+
+ <listitem>
+  <para>
+   <literal><link linkend="handle-as-image">handle-as-image</link></literal> - 
+   tells <application>Privoxy</application> to treat this URL as an image.
+   <application>Privoxy</application>'s default configuration already does this
+   for all common image types (e.g. GIF), but there are many situations where this
+   is not as easy to determine. So we'll force it in these cases. This is particularly
+   important for ad blocking, since  only if we know that it's an image, we can replace
+   it by an image instead of the BLOCKED page, which would only result in a
+   <quote>broken image</quote> icon. There are some limitations to this though. For
+   instance, you can't just brute-force an image substituion for an entire HTML page
+   in most situations.
+  </para>
+ </listitem> 
+
+ <listitem>
+  <para>
+   <literal><link
+   linkend="set-image-blocker">set-image-blocker</link></literal> - tells
+   <application>Privoxy</application> what to display in place of an ad image that
+   has hit a block rule. For this to come into play, the URL must match a
+   <literal><link linkend="block">block</link></literal> action somewhere in the
+   configuration, <emphasis>and</emphasis>, it must also match an
+   <literal><link linkend="handle-as-image">handle-as-image</link></literal> action.
+  </para>
+  <para>
+   The configuration options on what to display instead of the ad are:
+  </para>
+  <simplelist>
+   <member>
+    &nbsp;&nbsp;&nbsp;<emphasis>pattern</emphasis> - a checkboard pattern, so that an ad 
+    replacement is obvious. This is the default.
+   </member>
+  </simplelist>
+  <simplelist>
+   <member>
+    &nbsp;&nbsp;&nbsp;<emphasis>blank</emphasis> - A very small empty GIF image is displayed.
+    This is the so-called <quote>invisible</quote> configuration option.
+   </member>
+  </simplelist>
+  <simplelist>
+   <member>
+    &nbsp;&nbsp;&nbsp;<emphasis>http://&lt;URL&gt;</emphasis> - A redirect to any image anywhere
+    of the user's choosing (advanced usage).
+   </member>
+  </simplelist>
+  </listitem> 
+
+</itemizedlist>
+</para>
+
+<para>
+ The quickest way to adjust any of these settings is with your browser through
+ the special <application>Privoxy</application> editor at <ulink
+ url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
+ (shortcut: <ulink url="http://p.p/">http://p.p/show-status</ulink>). This 
+ is an internal page, and does not require Internet access. Select the
+ appropriate <quote>actions</quote> file, and click
+ <quote><guibutton>Edit</guibutton></quote>. It is best to put personal or
+ local preferences in <filename>user.action</filename> since this is not
+ meant to be overwritten during upgrades, and will over-ride the settings in
+ other files. Here you can insert new <quote>actions</quote>, and URLs for ad
+ blocking or other purposes, and make other adjustments to the configuration.
+ <application>Privoxy</application> will detect these changes automatically.
+</para>
+
+<para>
+ A quick and simple step by step example:
+</para>
+
+<para>
+ <itemizedlist>
+
+  <listitem>
+   <para>
+     Right click on the ad image to be blocked, then select 
+     <quote><guimenuitem>Copy Link Location</guimenuitem></quote> from the
+     pop-up menu. 
+   </para>
+  </listitem> 
+  <listitem>
+   <para>
+    Set your browser to 
+    <ulink
+ url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
+   </para>
+  </listitem> 
+  <listitem>
+   <para>
+    Find <filename>user.action</filename> in the top section, and click 
+    on <quote><guibutton>Edit</guibutton></quote>:
+   </para>
+
+ <!-- image of editor and actions files selections -->
+ <para>
+  <figure pgwide="0" float="0"><title>Actions Files in Use</title>
+   <mediaobject>
+     <imageobject>
+      <imagedata  fileref="../images/files-in-use.jpg" format="jpg">
+       </imageobject> 
+       <textobject>
+        <phrase>Screenshot of Files in Use</phrase>
+      </textobject>
+   </mediaobject>
+  </figure>
+ </para>
+ </listitem> 
+ <listitem>
+  <para>
+   You should have a section with only
+   <literal><link linkend="block">block</link></literal> listed under 
+   <quote>Actions:</quote>.
+   If not, click a <quote><guibutton>Insert new section below</guibutton></quote>
+   button, and in the new section that just appeared, click the 
+   <guibutton>Edit</guibutton> button right under the word <quote>Actions:</quote>.
+   This will bring up a list of all actions. Find
+   <literal><link linkend="block">block</link></literal> near the top, and click
+   in the <quote>Enabled</quote> column, then <quote><guibutton>Submit</guibutton></quote>
+   just below the list.
+  </para>
+ </listitem> 
+ <listitem>
+  <para>
+   Now, in the <literal><link linkend="block">block</link></literal> actions section,
+   click the <quote><guibutton>Add</guibutton></quote> button, and paste the URL the
+   browser got from <quote><guimenuitem>Copy Link Location</guimenuitem></quote>.
+   Remove the <literal>http://</literal> at the beginning of the URL. Then, click
+   <quote><guibutton>Submit</guibutton></quote> (or
+   <quote><guibutton>OK</guibutton></quote> if in a pop-up window).
+  </para>
+ </listitem> 
+ <listitem>
+  <para>
+   Now go back to the original page, and press <keycap>SHIFT-Reload</keycap>
+   (or flush all browser caches). The image should be gone now.
+  </para>
+ </listitem> 
  </itemizedlist>
 </para>
 
+<para>
+ This is a very crude and simple example. There might be good reasons to use a 
+ wildcard pattern match to include potentially similar images from the same
+ site. For a more extensive explanation of <quote>patterns</quote>, and 
+ the entire actions concept, see <link linkend="actions-file">the Actions
+ section</link>.
+</para>
+
+<para>
+ For advanced users who want to hand edit their config files, you might want
+ to now go to the <link linkend="act-examples">Actions Files Tutorial</link>.
+ The ideas explained thererin also apply to the web-based editor.
+</para>
+
+</sect2>
+
 </sect1>
 
+<!--  ~  End section  ~  -->
+
+
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect1 id="startup">
 <title>Starting <application>Privoxy</application></title>
@@ -523,12 +806,12 @@ automatically start Privoxy in the boot process.
  directory. Except on Win32 where it will try <filename>config.txt</filename>.
 </para>
 
-<sect2 id="start-redhatdebian">
-<title>RedHat, Conectiva and Debian</title>
+<sect2 id="start-redhat">
+<title>RedHat and Conectiva</title>
 <para>
 We use a script. Note that RedHat does not start Privoxy upon booting per
 default. It will use the file <filename>/etc/privoxy/config</filename> as its
-main configuration file. FIXME: Debian??
+main configuration file.
 </para>
 <para>
  <screen>
@@ -537,6 +820,21 @@ main configuration file. FIXME: Debian??
 </para>
 </sect2>
 
+<sect2 id="start-debian">
+<title>Debian</title>
+<para>
+ We use a script. Note that Debian starts Privoxy upon booting per
+ default.  It will use the file
+ <filename>/etc/privoxy/config</filename> as its main configuration
+ file.
+</para>
+<para>
+ <screen>
+ # /etc/init.d/privoxy start
+</screen>
+</para>
+</sect2>
+
 <sect2 id="start-suse">
 <title>SuSE</title>
 <para>
@@ -1136,7 +1434,7 @@ actionsfile
   </listitem>
  </varlistentry>
  <varlistentry>
-  <term>Default value:</term>
+  <term>Default values:</term>
   <listitem>
    <simplelist>
     <member>
@@ -1189,7 +1487,7 @@ actionsfile
   <term>Specifies:</term>
   <listitem>
    <para>
-    The <link linkend="filter">filter</link> file to use
+    The <link linkend="filter-file">filter file</link> to use
    </para>
   </listitem>
  </varlistentry>
@@ -1210,7 +1508,7 @@ actionsfile
   <listitem>
    <para>
     No textual content filtering takes place, i.e. all
-    <literal>+filter{<replaceable class="parameter">name</replaceable>}</literal>
+    <literal>+<link linkend="filter">filter</link>{<replaceable class="parameter">name</replaceable>}</literal>
     actions in the actions files are turned neutral.
    </para>
   </listitem>
@@ -1219,13 +1517,25 @@ actionsfile
   <term>Notes:</term>
   <listitem>
    <para>
-    The <quote>default.filter</quote> file contains content modification rules 
-    that use <quote>regular expressions</quote>. These rules permit powerful
-    changes on the content of Web pages, e.g., you could disable your favorite
+    The <link linkend="filter-file">filter file</link> contains content modification
+    rules that use <link linkend="regex">regular expressions</link>. These rules permit
+    powerful changes on the content of Web pages, e.g., you could disable your favorite
     JavaScript annoyances, re-write the actual displayed text, or just have some
     fun replacing <quote>Microsoft</quote> with <quote>MicroSuck</quote> wherever
     it appears on a Web page.
    </para>
+   <para>
+    The
+    <literal>+<link linkend="filter">filter</link>{<replaceable class="parameter">name</replaceable>}</literal>
+    actions rely on the relevant filter (<replaceable class="parameter">name</replaceable>)
+    to be defined in the filter file!
+   </para>
+   <para>
+    A pre-defined filter file called <filename>default.filter</filename> that contains
+    a bunch of handy filters for common problems is included in the distribution.
+    See the section on the <literal><link linkend="filter">filter</link></literal>
+    action for a list.
+   </para>
   </listitem>
  </varlistentry>
 </variablelist>
@@ -1818,8 +2128,16 @@ actionsfile
    <para>
     If you leave out the IP address, <application>Privoxy</application> will
     bind to all interfaces (addresses) on your machine and may become reachable
-    from the Internet. In that case, consider using access control lists (ACL's)
-    (see <quote>ACLs</quote> below), or a firewall.
+    from the Internet. In that case, consider using <link
+    linkend="acls">access control lists</link> (ACL's, see below), and/or
+    a firewall.
+   </para>
+   <para>
+    If you open <application>Privoxy</application> to untrusted users, you will
+    also want to turn off the <literal><link
+    linkend="enable-edit-actions">enable-edit-actions</link></literal> and
+    <literal><link linkend="enable-remote-toggle">enable-remote-toggle</link></literal>
+    options!
    </para>
   </listitem>
  </varlistentry>
@@ -2005,8 +2323,8 @@ actionsfile
 
 <sect3 renderas="sect4" id="acls"><title>
 ACLs: permit-access and deny-access</title>
-<anchor id="permit-acces">
-<anchor id="deny-acces">
+<anchor id="permit-access">
+<anchor id="deny-access">
 
 <variablelist>
  <varlistentry>
@@ -2668,16 +2986,6 @@ forward-socks4 and forward-socks4a</title>
  
  <para>
   <itemizedlist>
-   <listitem>
-    <para>
-      <filename>standard.action</filename> - is used by the web based editor, 
-      to set various pre-defined sets of rules for the default actions section
-      in <filename>default.action</filename>. These have increasing levels of
-      aggressiveness <emphasis>and have no influence on your browsing unless
-      you select them explicitly in the editor</emphasis>. It is not recommend
-      to edit this file.
-    </para>
-   </listitem> 
    <listitem>
     <para>
      <filename>default.action</filename> - is the primary action file 
@@ -2697,6 +3005,16 @@ forward-socks4 and forward-socks4a</title>
      thing should go here. This file will not be upgraded.
     </para>
   </listitem> 
+   <listitem>
+    <para>
+     <filename>standard.action</filename> - is used by the web based editor, 
+     to set various pre-defined sets of rules for the default actions section
+     in <filename>default.action</filename>. These have increasing levels of
+     aggressiveness <emphasis>and have no influence on your browsing unless
+     you select them explicitly in the editor</emphasis>. It is not recommend
+     to edit this file.
+    </para>
+   </listitem> 
   </itemizedlist>
  </para> 
 
@@ -2775,15 +3093,15 @@ forward-socks4 and forward-socks4a</title>
 </sect2>
 
 
-<sect2>
+<sect2 id="actions-apply">
 <title>How Actions are Applied to URLs</title>
 <para>
  Actions files are divided into sections. There are special sections,
- like the <quote><link linkend="aliases">alias</link></quote> sections which will be discussed later. For now
- let's concentrate on regular sections: They have a heading line (often split
- up to multiple lines for readability) which consist of a list of actions,
- separated by whitespace and enclosed in curly braces. Below that, there
- is a list of URL patterns, each on a separate line.
+ like the <quote><link linkend="aliases">alias</link></quote> sections which will
+ be discussed later. For now let's concentrate on regular sections: They have a
+ heading line (often split up to multiple lines for readability) which consist
+ of a list of actions, separated by whitespace and enclosed in curly braces.
Below that, there is a list of URL patterns, each on a separate line.
 </para>
 
 <para>
@@ -2792,10 +3110,12 @@ forward-socks4 and forward-socks4a</title>
  applicable actions for the URL is incrementally updated, using the heading
  of the section in which the pattern is located. If multiple matches for
  the same URL set the same action differently, the last match wins. If not, 
- the effects are aggregated (e.g. a URL might match both the 
- <ulink url="actions-file.html#HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></ulink>
- and <ulink url="actions-file.html#BLOCK"><quote>+block</quote></ulink> actions).
+ the effects are aggregated. E.g. a URL might match a regular section with 
+ a heading line of <literal>{ 
+ +<ulink url="actions-file.html#HANDLE-AS-IMAGE">handle-as-image</ulink> }</literal>,
+ then later another one with just <literal>{
+ +<ulink url="actions-file.html#BLOCK">block</ulink> }</literal>, resulting
+ in <emphasis>both</emphasis> actions to apply.
 </para>
 
 <para>
@@ -2984,12 +3304,10 @@ forward-socks4 and forward-socks4a</title>
 </para>
 
 <para>
- Please also note that matching in the path is case
- <emphasis>INSENSITIVE</emphasis> by default, but you can switch to case
- sensitive at any point in the pattern by using the 
- <quote>(?-i)</quote> switch:
- <literal>www.example.com/(?-i)PaTtErN.*</literal> will match only
- documents whose path starts with <literal>PaTtErN</literal> in
+ Please also note that matching in the path is <emphasis>CASE INSENSITIVE</emphasis>
+ by default, but you can switch to case sensitive at any point in the pattern by using the 
+ <quote>(?-i)</quote> switch: <literal>www.example.com/(?-i)PaTtErN.*</literal> will match
+ only documents whose path starts with <literal>PaTtErN</literal> in
  <emphasis>exactly</emphasis> this capitalization.
 </para>
 </sect3>
@@ -3126,7 +3444,7 @@ forward-socks4 and forward-socks4a</title>
 <!--   ~~~~~       New section      ~~~~~     -->
 
 <sect3 renderas="sect4" id="add-header">
-<title><emphasis>add-header</emphasis></title>
+<title>add-header</title>
 
 <variablelist>
  <varlistentry>
@@ -3190,7 +3508,7 @@ forward-socks4 and forward-socks4a</title>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="block">
-<title><emphasis>block</emphasis></title>
+<title>block</title>
 
 <variablelist>
  <varlistentry>
@@ -3284,7 +3602,7 @@ forward-socks4 and forward-socks4a</title>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="crunch-incoming-cookies">
-<title><emphasis>crunch-incoming-cookies</emphasis></title>
+<title>crunch-incoming-cookies</title>
 
 <variablelist>
  <varlistentry>
@@ -3353,7 +3671,7 @@ forward-socks4 and forward-socks4a</title>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="crunch-outgoing-cookies">
-<title><emphasis>crunch-outgoing-cookies</emphasis></title>
+<title>crunch-outgoing-cookies</title>
 
 <variablelist>
  <varlistentry>
@@ -3423,7 +3741,7 @@ forward-socks4 and forward-socks4a</title>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="deanimate-gifs">
-<title><emphasis>deanimate-gifs</emphasis></title>
+<title>deanimate-gifs</title>
 
 <variablelist>
  <varlistentry>
@@ -3491,7 +3809,7 @@ forward-socks4 and forward-socks4a</title>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="downgrade-http-version">
-<title><emphasis>downgrade-http-version</emphasis></title>
+<title>downgrade-http-version</title>
 
 <variablelist>
  <varlistentry>
@@ -3555,7 +3873,7 @@ problem-host.example.com</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="fast-redirects">
-<title><emphasis>fast-redirects</emphasis></title>
+<title>fast-redirects</title>
 
 <variablelist>
  <varlistentry>
@@ -3634,7 +3952,7 @@ problem-host.example.com</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="filter">
-<title><emphasis>filter</emphasis></title>
+<title>filter</title>
 
 <variablelist>
  <varlistentry>
@@ -3771,7 +4089,7 @@ problem-host.example.com</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="handle-as-image">
-<title><emphasis>handle-as-image</emphasis></title>
+<title>handle-as-image</title>
 
 <variablelist>
  <varlistentry>
@@ -3861,7 +4179,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="hide-forwarded-for-headers">
-<title><emphasis>hide-forwarded-for-headers</emphasis></title>
+<title>hide-forwarded-for-headers</title>
 
 <variablelist>
  <varlistentry>
@@ -3927,7 +4245,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="hide-from-header">
-<title><emphasis>hide-from-header</emphasis></title>
+<title>hide-from-header</title>
 
 <variablelist>
  <varlistentry>
@@ -3999,7 +4317,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="hide-referrer">
-<title><emphasis>hide-referrer</emphasis></title>
+<title>hide-referrer</title>
 <anchor id="hide-referer">
 <variablelist>
  <varlistentry>
@@ -4078,7 +4396,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="hide-user-agent">
-<title><emphasis>hide-user-agent</emphasis></title>
+<title>hide-user-agent</title>
 
 <variablelist>
  <varlistentry>
@@ -4160,7 +4478,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="kill-popups">
-<title><emphasis>kill-popups<anchor id="kill-popup"></emphasis></title>
+<title>kill-popups<anchor id="kill-popup"></title>
 
 <variablelist>
  <varlistentry>
@@ -4215,7 +4533,7 @@ ad.doubleclick.net
     sense to combine it with any <literal><link linkend="filter">filter</link></literal> action,
     since as soon as one <literal><link linkend="filter">filter</link></literal> applies,
     the whole document needs to be buffered anyway, which destroys the advantage of
-    the <literal>kill-popups</literal> action over it's filter equivalent.
+    the <literal>kill-popups</literal> action over its filter equivalent.
    </para>
    <para>
     Killing all pop-ups is a dangerous business. Many shops and banks rely on
@@ -4250,7 +4568,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="limit-connect">
-<title><emphasis>limit-connect</emphasis></title>
+<title>limit-connect</title>
 
 <variablelist>
  <varlistentry>
@@ -4331,7 +4649,7 @@ ad.doubleclick.net
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="prevent-compression">
-<title><emphasis>prevent-compression</emphasis></title>
+<title>prevent-compression</title>
 
 <variablelist>
  <varlistentry>
@@ -4420,7 +4738,7 @@ www.pclinuxonline.com</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="send-vanilla-wafer">
-<title><emphasis>send-vanilla-wafer</emphasis></title>
+<title>send-vanilla-wafer</title>
 
 <variablelist>
  <varlistentry>
@@ -4486,7 +4804,7 @@ www.pclinuxonline.com</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="send-wafer">
-<title><emphasis>send-wafer</emphasis></title>
+<title>send-wafer</title>
 
 <variablelist>
  <varlistentry>
@@ -4552,7 +4870,7 @@ my-internal-testing-server.void</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="session-cookies-only">
-<title><emphasis>session-cookies-only</emphasis></title>
+<title>session-cookies-only</title>
 
 <variablelist>
  <varlistentry>
@@ -4633,7 +4951,7 @@ my-internal-testing-server.void</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect3 renderas="sect4" id="set-image-blocker">
-<title><emphasis>set-image-blocker</emphasis></title>
+<title>set-image-blocker</title>
 
 <variablelist>
  <varlistentry>
@@ -4815,18 +5133,20 @@ my-internal-testing-server.void</screen>
  {{alias}}
 
  # These aliases just save typing later:
+ # (Note that some already use other aliases!)
  #
  +crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
  -crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
- +imageblock = +block +handle-as-image
+ block-as-image      = +block +handle-as-image
+ mercy-for-cookies   = -crunch-all-cookies -session-cookies-only
 
  # These aliases define combinations of actions
  # that are useful for certain types of sites:
  #
  fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -kill-popups
- shop        = -crunch-all-cookies -fast-redirects
+ shop        = -crunch-all-cookies -filter{popups} -kill-popups
 
- # Aliases defined from other aliases, for really lazy people ;-)
+ # Short names for other aliases, for really lazy people ;-)
  #
  c0 = +crunch-all-cookies
  c1 = -crunch-all-cookies</screen>
@@ -4872,434 +5192,871 @@ my-internal-testing-server.void</screen>
 
 <!--   ~~~~~       New section      ~~~~~     -->
 <sect2 id="act-examples">
-<title>Sample Actions Files</title>
+<title>Actions Files Tutorial</title>
 <para>
- Remember that the meaning of each action is reversed by preceding
- the action with a <quote>-</quote>, in place of the <quote>+</quote>. Also, 
- that some actions are turned on in the default section of the actions file, 
- and require little to no additional configuration. These are just <quote>on</quote>.
+ The above chapters have shown <link linkend="actions-file">which actions files
+ there are and how they are organized</link>, how actions are <link
+ linkend="actions">specified</link> and <link linkend="actions-apply">applied
+ to URLs</link>, how <link linkend="af-patterns">patterns</link> work, and how to
+ define and use <link linkend="aliases">aliases</link>. Now, let's look at an
+ example <filename>default.action</filename> and <filename>user.action</filename>
+ file and see how all these pieces come together:
 </para>
 
+<sect3><title>default.action</title>
+
 <para>
- But, other actions that are turned on in the default section <emphasis>do
- typically require</emphasis> exceptions to be listed in the latter sections of 
- one of our actions file. For instance, by default no URLs are
- <quote>blocked</quote> (i.e. in the default definitions of
- <filename>default.action</filename>). We need exceptions to this in order to
- <emphasis>enable</emphasis> ad blocking in the lower sections. But we need to
- be very selective about what we do block. Thus, the default is <quote>off</quote>
- for blocking.
+Every config file should start with a short comment stating its purpose:
 </para>
 
 <para>
- Below is a liberally commented sample <filename>default.action</filename> file
- to demonstrate how all the pieces come together. And to show how exceptions
- to the default policies can be handled. This is followed by a brief 
- <filename>user.action</filename> with similar examples.
+ <screen># Sample default.action file &lt;developers@privoxy.org&gt;</screen>
 </para>
 
 <para>
- <literal>
-  <msgtext> 
-   <literallayout>
-# Sample default.action file &lt;developers@privoxy.org&gt;
+Then, since this is the <filename>default.action</filename> file, the
+first section is a special section for internal use that you needn't
+change or worry about:
+</para>
 
+<para>
+ <screen>
+##########################################################################
 # Settings -- Don't change! For internal Privoxy use ONLY.
+##########################################################################
+
 {{settings}}
-for-privoxy-version=3.0
+for-privoxy-version=3.0</screen>
+</para>
 
+<para>
+After that comes the (optional) alias section. We'll use the example
+section from the above <link linkend="aliases">chapter on aliases</link>,
+that also explains why and how aliases are used:
+</para>
 
+<para>
+ <screen>
 ##########################################################################
-# <ulink url="actions-file.html#ALIASES">Aliases</ulink> must be defined *before* they are used. These are
-# easier to remember, and can combine several actions into one. Once 
-# defined they can be used just like any built-in action -- but within 
-# this file only! Aliases do not require a + or - sign.
+# Aliases
 ##########################################################################
 {{alias}}
 
-# Some useful aliases.
-# Alias to turn off cookie handling, ie allow all cookies unmolested.
+# These aliases just save typing later:
+# (Note that some already use other aliases!)
 #
-mercy-for-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies \
-                    -session-cookies-only
++crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
+-crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
+block-as-image      = +block +handle-as-image
+mercy-for-cookies   = -crunch-all-cookies -session-cookies-only
 
-# Alias to both block and treat as if an image for ad blocking
-# purposes.
+# These aliases define combinations of actions
+# that are useful for certain types of sites:
 #
-+block-as-image   = +block +handle-as-image
+fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -kill-popups
+shop        = mercy-for-cookies -filter{popups} -kill-popups</screen>
+</para>
+
+<para>
+ Now come the regular sections, i.e. sets of actions, accompanied
+ by URL patterns to which they apply. Remember <emphasis>all actions
+ are disabled when matching starts</emphasis>, so we have to explicitly
+ enable the ones we want.
+</para>
+
+<para>
+ The first regular section is probably the most important. It has only
+ one pattern, <quote><literal>/</literal></quote>, but this pattern
+ <link linkend="af-patterns">matches all URLs.</link>. Therefore, the
+ set of actions used in this <quote>default</quote> section <emphasis>will
+ be applied to all requests as a start</emphasis>. It can  be partly or
+ wholly overridden by later matches further down this file, or in user.action,
+ but it will still be largely responsible for your overall browsing
+ experience.
+</para>
+
+<para>
+ Again, at the start of matching, all actions are disabled, so there is
+ no real need to disable any actions here, but we will do that nonetheless,
+ to have a complete listing for your reference. (Remember: A <quote>+</quote>
+ preceding the action name enables the action, a <quote>-</quote> disables!).
+ Also note how this long line has been made more readable by splitting it into
+ multiple lines with line continuation.
+</para> 
+
+<para>
+ <screen>
+##########################################################################
+# "Defaults" section:
+##########################################################################
+ { \
+ -<link linkend="ADD-HEADER">add-header</link> \
+ -<link linkend="BLOCK">block</link> \
+ -<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> \
+ -<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link> \
+ +<link linkend="DEANIMATE-GIFS">deanimate-gifs</link> \
+ -<link linkend="DOWNGRADE-HTTP-VERSION">downgrade-http-version</link> \
+ +<link linkend="FAST-REDIRECTS">fast-redirects</link> \
+ +<link linkend="FILTER-HTML-ANNOYANCES">filter{html-annoyances}</link> \
+ +<link linkend="FILTER-JS-ANNOYANCES">filter{js-annoyances}</link> \
+ -<link linkend="FILTER-CONTENT-COOKIES">filter{content-cookies}</link> \
+ +<link linkend="FILTER-POPUPS">filter{popups}</link> \
+ +<link linkend="FILTER-WEBBUGS">filter{webbugs}</link> \
+ -<link linkend="FILTER-REFRESH-TAGS">filter{refresh-tags}</link> \
+ -<link linkend="FILTER-FUN">filter{fun}</link> \
+ +<link linkend="FILTER-NIMDA">filter{nimda}</link> \
+ +<link linkend="FILTER-BANNERS-BY-SIZE">filter{banners-by-size}</link> \
+ -<link linkend="FILTER-SHOCKWAVE-FLASH">filter{shockwave-flash}</link> \
+ -<link linkend="FILTER-CRUDE-PARENTAL">filter{crude-parental}</link> \
+ -<link linkend="HANDLE-AS-IMAGE">handle-as-image</link> \
+ +<link linkend="HIDE-FORWARDED-FOR-HEADERS">hide-forwarded-for-headers</link> \
+ +<link linkend="HIDE-FROM-HEADER">hide-from-header{block}</link> \
+ +<link linkend="HIDE-REFERER">hide-referrer{forge}</link> \
+ -<link linkend="HIDE-USER-AGENT">hide-user-agent</link> \
+ -<link linkend="KILL-POPUPS">kill-popups</link> \
+ -<link linkend="LIMIT-CONNECT">limit-connect</link> \
+ +<link linkend="PREVENT-COMPRESSION">prevent-compression</link> \
+ -<link linkend="SEND-VANILLA-WAFER">send-vanilla-wafer</link> \
+ -<link linkend="SEND-WAFER">send-wafer</link> \
+ +<link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> \
+ +<link linkend="SET-IMAGE-BLOCKER">set-image-blocker{pattern}</link> \
+ }
+ / # forward slash will match *all* potential URL patterns.</screen>
+</para>
+
+<para>
+ The default behavior is now set. Note that some actions, like not hiding
+ the user agent, are part of a <quote>general policy</quote> that applies
+ universally and won't get any exceptions defined later. Other choices,
+ like not blocking (which is <emphasis>understandably</emphasis> the
+ default!) need exceptions, i.e. we need to specify explicitly what we
+ want to block in later sections.
+ We will also want to make exceptions from our general pop-up-killing,
+ and use our defined aliases for that.
+</para>
+
+<para>
+ The first of our specialized sections is concerned with <quote>fragile</quote>
+ sites, i.e. sites that require minimum interference, because they are either
+ very complex or very keen on tracking you (and have mechanisms in place that
+ make them unusable for people who avoid being tracked). We will simply use
+ our pre-defined <literal>fragile</literal> alias instead of stating the list
+ of actions explicitly:
+</para>
+
+<para>
+ <screen>
+##########################################################################
+# Exceptions for sites that'll break under the default action set:
+##########################################################################
 
-# Shops should be allowed to set persistent cookies
+# "Fragile" Use a minimum set of actions for these sites (see alias above):
+#
+{ fragile }
+.office.microsoft.com           # surprise, surprise!
+.windowsupdate.microsoft.com</screen>
+</para>
+
+<para>
+ Shopping sites are not as fragile, but they typically
+ require cookies to log in, and pop-up windows for shopping
+ carts or item details. Again, we'll use a pre-defined alias:
+</para>
+<para>
+ <screen>
+# Shopping sites:
 #
-shop        = -filter mercy-for-cookies
+{ shop }
+.quietpc.com 
+.worldpay.com   # for quietpc.com
+.jungle.com
+.scan.co.uk</screen>
+</para>
+
+<para>
+ Then, there are sites which rely on pop-up windows (yuck!) to work.
+ Since we made pop-up-killing our default above, we need to make exceptions
+ now. <ulink url="http://www.mozilla.org/">Mozilla</ulink> users, who
+ can turn on smart handling of unwanted pop-ups in their browsers, can
+ safely choose
+ -<literal><link linkend="FILTER-POPUPS">filter{popups}</link></literal> (and
+ -<literal><link linkend="KILL-POPUPS">kill-popups</link></literal>) above
+ and hence don't need this section. Anyway, disabling an already disabled
+ action doesn't hurt, so we'll define our exceptions regardless of what was
+ chosen in the defaults section:
+</para>
 
-# Fragile sites should receive minimum interference:
+<para>
+ <screen>
+# These sites require pop-ups too :( 
 #
-fragile     = -block -deanimate-gifs -fast-redirects -filter -hide-referer \
-              mercy-for-cookies -kill-popups
+{ -<link linkend="KILL-POPUPS">kill-popups</link> -<link linkend="FILTER-POPUPS">filter{popups}</link> }
+.dabs.com
+.overclockers.co.uk
+.deutsche-bank-24.de</screen>
+</para>
+
+<para>
+ The <literal><link linkend="FAST-REDIRECTS">fast-redirects</link></literal>
+ action, which we enabled per default above,  breaks some sites. So disable
+ it for popular sites where we know it misbehaves:
+</para>
+
+<para>
+ <screen>
+{ -<link linkend="FAST-REDIRECTS">fast-redirects</link> }
+login.yahoo.com
+edit.*.yahoo.com
+.google.com
+.altavista.com/.*(like|url|link):http
+.altavista.com/trans.*urltext=http
+.nytimes.com</screen>
+</para>
+
+<para>
+ It is important that <application>Privoxy</application> knows which
+ URLs belong to images, so that <emphasis>if</emphasis> they are to
+ be blocked, a substitute image can be sent, rather than an HTML page.
+ Contacting the remote site to find out is not an option, since it
+ would destroy the loading time advantage of banner blocking, and it
+ would feed the advertisers (in terms of money <emphasis>and</emphasis>
+ information). We can mark any URL as an image with the <literal><link
+ linkend="handle-as-image">handle-as-image</link></literal> action,
+ and marking all URLs that end in a known image file extension is a
+ good start:
+</para>
 
+<para>
+ <screen>
+##########################################################################
+# Images:
 ##########################################################################
-# Matching starts here. Remember that at this time, all actions are
-# disabled, so we need to explicitly enable the ones we want. 
+
+# Define which file types will be treated as images, in case they get
+# blocked further down this file:
 #
-# We begin with "default" action settings, i.e. we define a set of actions
-# for a pattern ("/") <link linkend="af-patterns">that matches all URLs</link>. This default set will be
-# applied to all requests as a start, and can be partly or wholly overridden
-# by later matches further down this file, or in user.action.
+{ +<link linkend="HANDLE-AS-IMAGE">handle-as-image</link> }
+/.*\.(gif|jpe?g|png|bmp|ico)$</screen>
+</para>
+
+<para>
+ And then there are known banner sources. They often use scripts to
+ generate the banners, so it won't be visible from the URL that the
+ request is for an image. Hence we block them <emphasis>and</emphasis>
+ mark them as images in one go, with the help of our
+ <literal>block-as-image</literal> alias defined above. (We could of
+ course just as well use <literal>+<link linkend="block">block</link>
+ +<link linkend="handle-as-image">handle-as-image</link></literal> here.)
+ Remember that the type of the replacement image is chosen by the
+ <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>
+ action. Since all URLs have matched the default section with its
+ <literal>+<link linkend="set-image-blocker">set-image-blocker</link>{pattern}</literal>
+ action before, it still applies and needn't be repeated:
+</para>
+
+<para>
+ <screen>
+# Known ad generators:
 #
-# We will show all potential actions here whether they are enabled
-# or not. We could omit any disabled action if we wanted, since all 
-# actions are 'off' by default anyway. Shown for completeness only.
-# Actions are enabled if preceded by a '+', otherwise they are disabled 
-# (unless an alias has been defined without this).
+{ block-as-image }
+ar.atwola.com 
+.ad.doubleclick.net
+.ad.*.doubleclick.net
+.a.yimg.com/(?:(?!/i/).)*$
+.a[0-9].yimg.com/(?:(?!/i/).)*$
+bs*.gsanet.com
+bs*.einets.com
+.qkimg.net</screen>
+</para>
+
+<para>
+ One of the most important jobs of <application>Privoxy</application>
+ is to block banners. A huge bunch of them are already <quote>blocked</quote>
+ by the <literal><link linkend="filter">filter</link>{banners-by-size}</literal>
+ action, which we enabled above, and which deletes the references to banner
+ images from the pages while they are loaded, so the browser doesn't request
+ them anymore, and hence they don't need to be blocked here. But this naturally
+ doesn't catch all banners, and some people choose not to use filters, so we
+ need a comprehensive list of patterns for banner URLs here, and apply the
+ <literal><link linkend="block">block</link></literal> action to them.
+</para>
+<para>
+ First comes a bunch of generic patterns, which do most of the work, by
+ matching typical domain and path name components of banners. Then comes
+ a list of individual patterns for specific sites, which is omitted here
+ to keep the example short:
+</para>
+
+<para>
+ <screen>
 ##########################################################################
- { \
- <ulink url="actions-file.html#ADD-HEADER">-add-header</ulink> \
- <ulink url="actions-file.html#BLOCK">-block</ulink> \
- <ulink url="actions-file.html#DEANIMATE-GIFS">-deanimate-gifs</ulink> \
- <ulink url="actions-file.html#DOWNGRADE-HTTP-VERSION">-downgrade-http-version</ulink> \
- <ulink url="actions-file.html#FAST-REDIRECTS">+fast-redirects</ulink> \
- <ulink url="actions-file.html#FILTER-HTML-ANNOYANCES">+filter{html-annoyances}</ulink> \
- <ulink url="actions-file.html#FILTER-JS-ANNOYANCES">+filter{js-annoyances}</ulink> \
- <ulink url="actions-file.html#FILTER-CONTENT-COOKIES">-filter{content-cookies}</ulink> \
- <ulink url="actions-file.html#FILTER-POPUPS">-filter{popups}</ulink> \
- <ulink url="actions-file.html#FILTER-WEBBUGS">+filter{webbugs}</ulink> \
- <ulink url="actions-file.html#FILTER-REFRESH-TAGS">-filter{refresh-tags}</ulink> \
- <ulink url="actions-file.html#FILTER-FUN">-filter{fun}</ulink> \
- <ulink url="actions-file.html#FILTER-NIMDA">+filter{nimda}</ulink> \
- <ulink url="actions-file.html#FILTER-BANNERS-BY-SIZE">+filter{banners-by-size}</ulink> \
- <ulink url="actions-file.html#FILTER-SHOCKWAVE-FLASH">-filter{shockwave-flash}</ulink> \
- <ulink url="actions-file.html#FILTER-CRUDE-PARENTAL">-filter{crude-parental}</ulink> \
- <ulink url="actions-file.html#HIDE-FORWARDED-FOR-HEADERS">+hide-forwarded-for-headers</ulink> \
- <ulink url="actions-file.html#HIDE-FROM-HEADER">+hide-from-header{block}</ulink> \
- <ulink url="actions-file.html#HIDE-REFERER">-hide-referrer</ulink> \
- <ulink url="actions-file.html#HIDE-USER-AGENT">-hide-user-agent</ulink> \
- <ulink url="actions-file.html#HANDLE-AS-IMAGE">-handle-as-image</ulink> \
- <ulink url="actions-file.html#SET-IMAGE-BLOCKER">+set-image-blocker{pattern}</ulink> \
- <ulink url="actions-file.html#LIMIT-CONNECT">-limit-connect</ulink> \
- <ulink url="actions-file.html#PREVENT-COMPRESSION">+prevent-compression</ulink> \
- <ulink url="actions-file.html#SESSION-COOKIES-ONLY">-session-cookies-only</ulink> \
- <ulink url="actions-file.html#CRUNCH-OUTGOING-COOKIES">-crunch-outgoing-cookies</ulink> \
- <ulink url="actions-file.html#CRUNCH-INCOMING-COOKIES">-crunch-incoming-cookies</ulink> \
- <ulink url="actions-file.html#KILL-POPUPS">-kill-popups</ulink> \
- <ulink url="actions-file.html#SEND-VANILLA-WAFER">-send-vanilla-wafer</ulink> \
- <ulink url="actions-file.html#SEND-WAFER">-send-wafer</ulink> \
- }
- / # forward slash will match *all* potential URL patterns. 
+# Block these fine banners:
+##########################################################################
+{ <link linkend="BLOCK">+block</link> }
+
+# Generic patterns:
+# 
+ad*.
+.*ads.
+banner?.
+count*.
+/.*count(er)?\.(pl|cgi|exe|dll|asp|php[34]?)
+/(?:.*/)?(publicite|werbung|rekla(ma|me|am)|annonse|maino(kset|nta|s)?)/
+
+# Site-specific patterns (abbreviated):
+#
+.hitbox.com</screen>
+</para>
+
+<para>
+ You wouldn't believe how many advertisers actually call their banner
+ servers ads.<replaceable>company</replaceable>.com, or call the directory
+ in which the banners are stored simply <quote>banners</quote>. So the above
+ generic patterns are surprisingly effective.
+</para>
+<para>
+ But being very generic, they necessarily also catch URLs that we don't want
+ to block. The pattern <literal>.*ads.</literal> e.g. catches 
+ <quote>nasty-<emphasis>ads</emphasis>.nasty-corp.com</quote> as intended,
+ but also <quote>downlo<emphasis>ads</emphasis>.sourcefroge.net</quote> or
+ <quote><emphasis>ads</emphasis>l.some-provider.net.</quote> So here come some
+ well-known exceptions to the <literal>+<link linkend="BLOCK">block</link></literal>
+ section above.
+</para>
+<para>
+ Note that these are exceptions to exceptions from the default! Consider the URL
+ <quote>downloads.sourcefroge.net</quote>: Initially, all actions are deactivated,
+ so it wouldn't get blocked. Then comes the defaults section, which matches the
+ URL, but just deactivates the <literal><link linkend="BLOCK">block</link></literal>
+ action once again. Then it matches <literal>.*ads.</literal>, an exception to the
+ general non-blocking policy, and suddenly
+ <literal><link linkend="BLOCK">+block</link></literal> applies. And now, it'll match
+ <literal>.*loads.</literal>, where <literal><link linkend="BLOCK">-block</link></literal>
+ applies, so (unless it matches <emphasis>again</emphasis> further down) it ends up
+ with no <literal><link linkend="BLOCK">block</link></literal> action applying.
+</para>
 
+<para>
+ <screen>
 ##########################################################################
-# Default behavior is now set. Now we will define some exceptions to our 
-# default action policies.
+# Save some innocent victims of the above generic block patterns:
 ##########################################################################
 
-# These sites are very complex and require very minimal interference.
-# We'll disable most actions with our 'fragile' alias:
- { fragile }
- .office.microsoft.com           # surprise, surprise!
- .windowsupdate.microsoft.com
+# By domain:
+# 
+{ -<link linkend="BLOCK">block</link> }
+adv[io]*.  # (for advogato.org and advice.*)
+adsl.      # (has nothing to do with ads)
+ad[ud]*.   # (adult.* and add.*)
+.edu       # (universities don't host banners (yet!))
+.*loads.   # (downloads, uploads etc)
 
+# By path:
+#
+/.*loads/
 
-# Shopping sites - not as fragile but require some special 
-# handling. We still want to block ads, and we will allow 
-# persistent cookies via the 'shop' alias:
- { shop }
- .quietpc.com 
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
+# Site-specific:
+#
+www.globalintersec.com/adv # (adv = advanced)
+www.ugu.com/sui/ugu/adv</screen>
+</para>
 
+<para>
+ Filtering source code can have nasty side effects,
+ so make an exception for our friends at sourceforge.net,
+ and all paths with <quote>cvs</quote> in them. Note that
+ <literal>-<link linkend="FILTER">filter</link></literal>
+ disables <emphasis>all</emphasis> filters in one fell swoop!
+</para>
 
-# These sites require pop-ups too :(  We'll combine our 'shop' 
-# alias with two other actions into one rule to allow all popups.
- { shop <ulink url="actions-file.html#KILL-POPUPS">-kill-popups</ulink> <ulink url="actions-file.html#FILTER-POPUPS">-filter{popups}</ulink> }
- .dabs.com
- .overclockers.co.uk
+<para>
+ <screen>
+# Don't filter code!
+#
+{ -<link linkend="FILTER">filter</link> }
+/.*cvs
+.sourceforge.net</screen>
+</para>
 
+<para>
+ The actual <filename>default.action</filename> is of course more
+ comprehensive, but we hope this example made clear how it works.
+</para>
 
-# The 'Fast-redirects' action breaks some sites. Disable this action
-# for these known sensitive sites:
- { <ulink url="actions-file.html#FAST-REDIRECTS">-fast-redirects</ulink> }
- login.yahoo.com
- edit.europe.yahoo.com
- .google.com
- .altavista.com/.*(like|url|link):http
- .altavista.com/trans.*urltext=http
- .nytimes.com
+</sect3>
 
+<sect3><title>user.action</title>
 
-# Define which file types will be treated as images. Important
-# for ad blocking.
- { <ulink url="actions-file.html#HANDLE-AS-IMAGE">+handle-as-image</ulink> }
- /.*\.(gif|jpe?g|png|bmp|ico)
-
-
-# Now lets list some domains that are known ad generators. And
-# our alias that we use here will block these as well as force 
-# them to be treated as images. This combination of actions is 
-# important for ad blocking. What the browser will show instead is 
-# determined by the setting of <ulink url="actions-file.html#SET-IMAGE-BLOCKER"><quote>+set-image-blocker</quote></ulink>
- { +imageblock }
- ar.atwola.com 
- .ad.doubleclick.net
- .a.yimg.com/(?:(?!/i/).)*$
- .a[0-9].yimg.com/(?:(?!/i/).)*$
- bs*.gsanet.com
- bs*.einets.com
- .qkimg.net
- ad.*.doubleclick.net
-
-
-# These will just simply be blocked. They will generate the BLOCKED
-# banner page, if matched. Heavy use of wildcards and regular 
-# expressions in this example. Enable block action:
- { <ulink url="actions-file.html#BLOCK">+block</ulink> }
- ad*.
- .*ads.
- banner?.
- count*.
- /.*count(er)?\.(pl|cgi|exe|dll|asp|php[34]?)
- /(?:.*/)?(publicite|werbung|rekla(ma|me|am)|annonse|maino(kset|nta|s)?)/
- .hitbox.com 
-
-
-# The above block section will probably inadvertently catch some 
-# sites we DO NOT want blocked via the wildcards and regular expressions. 
-# Now let's set exceptions to the exceptions so the good guys get better 
-# treatment. Disable block action:
- { <ulink url="actions-file.html#BLOCK">-block</ulink> }
- advogato.org
- adsl.
- ad[ud]*.
- advice.
-# Let's just trust all .edu top level domains.
- .edu
- www.ugu.com/sui/ugu/adv
-# We'll need to access to path names containing 'download' 
- .*downloads.
- /downloads/
-# 'adv' is for globalintersec and means advanced, not advertisement
- www.globalintersec.com/adv
-
-
-# Don't filter *anything* from our friends at sourceforge.
-# Notice we don't have to name the individual filter 
-# identifiers -- we just turn them all off in one fell swoop.
-# Disable all filters for this one site:
- { <ulink url="actions-file.html#FILTER">-filter</ulink> }
- .sourceforge.net
-   </literallayout>
-  </msgtext> 
- </literal>
+<para>
+ So far we are painting with a broad brush by setting general policies,
+ which would be a reasonable starting point for many people. Now, 
+ you'd maybe want to be more specific and have customized rules that
+ are more suitable to your personal habits and preferences. These would
+ be for narrowly defined situations like your ISP or your bank, and should
+ be placed in <filename>user.action</filename>, which is parsed after all other 
+ actions files and hence has the last word, over-riding any previously
+ defined actions. <filename>user.action</filename> is also a 
+ <emphasis>safe</emphasis> place for your personal settings, since
+ <filename>default.action</filename> is actively maintained by the
+ <application>Privoxy</application> developers and you'll probably want
+ to install updated versions from time to time.
 </para>
 
 <para>
- So far we are painting with a broad brush by setting general policies. 
- The above would be a reasonable starting point for many situations. Now, 
- we want to be more specific and have customized rules that are more suitable
- to our personal habits and preferences. These would be for narrowly defined 
- situations like your ISP or your bank, and should be placed in 
- <filename>user.action</filename>, which is parsed after all other 
- actions files and should not be clobbered by upgrades. So any settings here,
- will have the last word and over-ride any previously defined actions.
+ So let's look at a few examples of things that one might typically do in
+ <filename>user.action</filename>: 
 </para>
 
+
+<!-- brief sample user.action here -->
+
 <para>
- Now a few examples of some things that one might do with a
- <filename>user.action</filename> file. 
+ <screen>
+# My user.action file. &lt;fred@foobar.com&gt;</screen>
 </para>
 
-<!-- brief sample user.action here -->
+<para>
+ As <link linkend="aliases">aliases</link> are local to the actions
+ file that they are defined in, you can't use the ones from
+ <filename>default.action</filename>, unless you repeat them here:
+</para>
 
 <para>
- <literal>
-  <msgtext> 
-   <literallayout>
-# Sample user.action file.
-
-# Any aliases you want to use need to be re-defined here.
-# Alias to turn off cookie handling, ie allow all cookies unmolested.
- -crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies \
-                       -session-cookies-only
-
-# Fragile sites should have the minimum changes:
- fragile     = -block -deanimate-gifs -fast-redirects -filter -hide-referer \
-               -crunch-all-cookies -kill-popups
-
-# Allow persistent cookies for a few regular sites that we 
-# trust via our above alias. These will be saved from one browser session 
-# to the next. We are explicitly turning off any and all cookie handling, 
-# even though the crunch-*-cookies settings were disabled in our above 
-# default.action anyway. So cookies from these domains will come through 
-# unmolested.
- { -crunch-all-cookies }
- .sun.com
- .yahoo.com
- .msdn.microsoft.com
- .redhat.com
-
-
-# My ISP uses obnoxious self promoting images on many pages.
-# Nuke them :) Note that <ulink url="actions-file.html#HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></ulink> need not be specified,
-# since all URLs ending in .gif will be tagged as images by the
-# general rules in default.action anyway.
- { <ulink url="actions-file.html#BLOCK">+block</ulink> }
- www.my-isp-example.com/logo[0-9].gif
-
-
-# Say the site where you do your home banking needs to open
-# popup windows, but you have chosen to kill popups by
-# default. This will allow it for your-example-bank.com:
+ <screen>
+# (Re-)define aliases for this file:
 #
- { <ulink url="actions-file.html#FILTER-POPUPS">-filter{popups}</ulink> <ulink url="actions-file.html#KILL-POPUPS">-kill-popups</ulink> }
- .my-example-bank.com
+{{alias}}
+-crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
+mercy-for-cookies   = -crunch-all-cookies -session-cookies-only
+fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -kill-popups
+shop        = mercy-for-cookies -filter{popups} -kill-popups
+allow-ads   = -block -filter{banners-by-size} # (see below)</screen>
+</para>
 
+<para>
+ Say you have accounts on some sites that you visit regularly, and
+ you don't want to have to log in manually each time. So you'd like
+ to allow persistent cookies for these sites. The
+ <literal>mercy-for-cookies</literal> alias defined above does exactly
+ that, i.e. it disables crunching of cookies in any direction, and
+ processing of cookies to make them temporary.
+</para>
 
-# This site is delicate, and requires kid-glove 
-# treatment.
- { fragile }
- .forbes.com
-   </literallayout>
-  </msgtext> 
- </literal>
+<para>
+ <screen>
+{ mercy-for-cookies }
+sunsolve.sun.com
+slashdot.org
+.yahoo.com
+.msdn.microsoft.com
+.redhat.com</screen>
 </para>
-</sect2>
 
-<!--  ~  End section  ~  -->
+<para>
+ Your bank needs popups and is allergic to some filter, but you don't
+ know which, so you disable them all:
+</para>
 
+<para>
+ <screen>
+{ -<link linkend="FILTER">filter</link> -<link linkend="KILL-POPUPS">kill-popups</link> }
+.your-home-banking-site.com</screen>
+</para>
 
+<para>
+ While browsing the web with <application>Privoxy</application> you
+ noticed some ads that sneaked through, but you were too lazy to
+ report them through our fine and easy <link linkend="contact">feedback</link>
+ system, so you have added them here:
+</para>
 
-</sect1>
+<para>
+ <screen>
+{ +<link linkend="BLOCK">block</link> }
+www.a-popular-site.com/some/unobvious/path
+another.popular.site.net/more/junk/here/</screen>
+</para>
+
+<para>
+ Note that, assuming the banners in the above example have regular image
+ extensions (most do),
+ <literal>+<link linkend="HANDLE-AS-IMAGE">handle-as-image</link></literal>
+ need not be specified, since all URLs ending in these extensions will
+ already have been tagged as images in the relevant section of 
+ <filename>default.action</filename> by now.
+</para>
+
+<para>
+ Then you noticed that the default configuration breaks Forbes Magazine,
+ but you were too lazy to find out which action is the culprit, and you
+ were again too lazy to give <link linkend="contact">feedback</link>, so
+ you just used the <literal>fragile</literal> alias on the site, and
+ -- whoa! -- it worked:
+</para>
+
+<para>
+<screen>
+{ fragile }
+.forbes.com</screen>
+</para>
+
+<para>
+ You like the <quote>fun</quote> text replacements in <filename>default.filter</filename>,
+ but it is disabled in the distributed actions file. (My colleagues on the team just
+ don't have a sense of humour, that's why! ;-). So you'd like to turn it on in your private,
+ update-safe config, once and for all:
+</para>
+
+<para>
+<screen>
+{ +<link linkend="filter-fun">filter{fun}</link> }
+/ # For ALL sites!</screen>
+</para>
+
+<para>
+ Note that the above is not really a good idea: There are exceptions
+ to the filters in <filename>default.action</filename> for things that
+ really shouldn't be filtered, like code on CVS->Web interfaces. Since
+ <filename>user.action</filename> has the last word, these exceptions
+ won't be valid for the <quote>fun</quote> filtering specified here.
+</para>
+
+<para>
+ Finally, you might think about how your favourite free websites are
+ funded, and find that they rely on displaying banner advertisements
+ to survive. So you might want to specifically allow banners for those
+ sites that you feel provide value to you:
+</para>
+
+<para>
+<screen>
+{ allow-ads }
+.sourceforge.net
+.slashdot.org
+.osdn.net</screen>   
+</para>
+
+<para>
+ Note that <literal>allow-ads</literal> has been aliased to 
+ <literal>-<link linkend="block">block</link></literal>
+ <literal>-<link linkend="filter-banners-by-size">filter{banners-by-size}</link></literal>
+ above.
+</para>
+</sect3>
+</sect2>
 
 <!--  ~  End section  ~  -->
 
+</sect1>
 
+<!--  ~  End section  ~  -->
 
 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
 
 <sect1 id="filter-file">
 <title>The Filter File</title>
+
 <para>
- Any web page can be dynamically modified with the filter file. This
- modification can be removal, or re-writing, of any web page content,
- including tags and non-visible content. The default filter file is
- oddly enough <filename>default.filter</filename>, located in the config
- directory. 
+ All text substitutions that can be invoked through the
+ <literal><link linkend="filter">filter</link></literal> action
+ must first be defined in the filter file, which is typically
+ called <filename>default.filter</filename> and which can be
+ selected through the <literal>
+ <link linkend="filterfile">filterfile</link></literal> config
+ option.
 </para>
 
 <para>
- This is potentially a very powerful feature, and requires knowledge of both 
- <quote>regular expression</quote> and HTML in order create custom 
- filters. But, there are a number of useful filters included with 
- <application>Privoxy</application> for many common situations.
+ Typical reasons for doing such substitutions are to eliminate
+ common annoyances in HTML and JavaScript, such as pop-up windows,
+ exit consoles, crippled windows without navigation tools, the
+ infamous &lt;BLINK&gt; tag etc, to suppress images with certain
+ width and height attributes (standard banner sizes or web-bugs),
+ or just to have fun. The possibilities are endless.
 </para>
 
 <para>
- The included example file is divided into sections. Each section begins 
- with the <literal>FILTER</literal> keyword, followed by the identifier 
- for that section, e.g. <quote>FILTER: webbugs</quote>. Each section performs
- a similar type of filtering, such as <quote>html-annoyances</quote>.
+ Filtering works on any text-based document type, including plain
+ text, HTML, JavaScript, CSS etc. (all <literal>text/*</literal>
+ MIME types). Substitutions are made at the source level, so if
+ you want to <quote>roll your own</quote> filters, you should be
+ familiar with HTML syntax.
 </para>
 
 <para>
- This file uses regular expressions to alter or remove any string in the
- target page. The expressions can only operate on one line at a time. Some
- examples from the included default <filename>default.filter</filename>:
+ Just like the <link linkend="actions-file">actions files</link>, the
+ filter file is organized in sections, which are called <emphasis>filters</emphasis>
+ here. Each filter consists of a heading line, that starts with the
+ <emphasis>keyword</emphasis> <literal>FILTER:</literal>, followed by
+ the filter's <emphasis>name</emphasis>, and a short (one line) 
+ <emphasis>description</emphasis> of what it does. Below that line
+ come the <emphasis>jobs</emphasis>, i.e. lines that define the actual
+ text substitutions. By convention, the name of a filter
+ should describe what the filter <emphasis>eliminates</emphasis>. The
+ comment is used in the <ulink url="http://config.privoxy.org/">web-based
+ user interface</ulink>.
 </para>
 
 <para>
- Stop web pages from displaying annoying messages in the status bar by
- deleting such references:
+ Once a filter called <replaceable>name</replaceable> has been defined
+ in the filter file, it can be invoked by using an action of the form
+ +<literal><link linkend="filter">filter</link>{<replaceable>name</replaceable>}</literal>
+ in any <link linkend="actions-file">actions file</link>.
+</para>
+<para>
+ A filter header line for a filter called <quote>foo</quote> could look
+ like this:
 </para>
 
 <para>
- <literal>
-  <msgtext> 
-   <literallayout>
- FILTER: html-annoyances
+ <screen>FILTER: foo Replace all "foo" with "bar"</screen>
+</para>
 
- # New browser windows should be resizeable and have a location and status
- # bar. Make it so.
- #
- s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
- s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
- s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
- s/menubar="?(no|0)"?/menubar=1/ig 
+<para>
+ Below that line, and up to the next header line, come the jobs that
+ define what text replacements the filter executes. They are specified
+ in a syntax that imitates <ulink url="http://www.perl.org/">Perl</ulink>'s
+ <literal>s///</literal> operator. If you are familiar with Perl, you
+ will find this to be quite intuitive, and may want to look at the
+ <ulink url="http://www.oesterhelt.org/pcrs/pcrs.1.html">PCRS man page</ulink>
+ for the subtle differences to Perl behaviour. Most notably, the non-standard
+ option letter <literal>U</literal> is supported, which turns the default
+ to ungreedy matching.
+</para>
 
- # The &lt;BLINK&gt; tag was a crime!
- #
- s*&lt;blink&gt;|&lt;/blink&gt;**ig
+<para>
+ If you are new to regular expressions, you might want to take a look at
+ the <link linkend="regex">Appendix on regular expressions</link>, and
+ see the <ulink url="http://perldoc.com/perl5.6.1/pod/perl.html">Perl
+ manual</ulink> for
+ <ulink url="http://perldoc.com/perl5.6.1/pod/perlop.html#s-PATTERN-REPLACEMENT-egimosx">the 
+ <literal>s///</literal> operator's syntax</ulink> and <ulink
+ url="http://perldoc.com/perl5.6.1/pod/perlre.html">Perl-style regular
+ expressions</ulink> in general.
+ The below examples might also help to get you started.
+</para>
 
- # Is this evil? 
- #
- #s/framespacing="?(no|0)"?//ig
- #s/margin(height|width)=[0-9]*//gi
-   </literallayout>
-  </msgtext> 
- </literal>
+<!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
+
+<sect2><title>Filter File Tutorial</title>
+<para>
+ Now, let's complete our <quote>foo</quote> filter. We have already defined
+ the heading, but the jobs are still missing. Since all it does is to replace
+ <quote>foo</quote> with <quote>bar</quote>, there is only one (trivial) job
+ needed:
 </para>
 
 <para>
- Just for kicks, replace any occurrence of <quote>Microsoft</quote> with
- <quote>MicroSuck</quote>, and have a little fun with topical buzzwords: 
+ <screen>s/foo/bar/</screen>
 </para>
 
 <para>
- <literal>
-  <msgtext> 
-   <literallayout>
- FILTER: fun
+ But wait! Didn't the comment say that <emphasis>all</emphasis> occurrences
+ of <quote>foo</quote> should be replaced? Our current job will only take
+ care of the first <quote>foo</quote> on each page. For global substitution,
+ we'll need to add the <literal>g</literal> option:
+</para>
 
- s/microsoft(?!.com)/MicroSuck/ig
+<para>
+ <screen>s/foo/bar/g</screen>
+</para>
 
- # Buzzword Bingo:
- #
- s/industry-leading|cutting-edge|award-winning/&lt;font color=red&gt;&lt;b&gt;BINGO!&lt;/b&gt;&lt;/font&gt;/ig
-   </literallayout>
-  </msgtext> 
- </literal>
+<para>
+ Our complete filter now looks like this:
+</para>
+<para>
+ <screen>FILTER: foo Replace all "foo" with "bar"
+s/foo/bar/g</screen>
 </para>
 
 <para>
- Kill those pesky little web-bugs:
+ Let's look at some real filters for more interesting examples. Here you see
+ a filter that protects against some common annoyances that arise from JavaScript
+ abuse. Let's look at its jobs one after the other:
 </para>
 
+
 <para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
- FILTER: webbugs
+ <screen>
+FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
 
- s/&lt;img\s+[^&gt;]*?(width|height)\s*=\s*['"]?1\D[^&gt;]*?(width|height)\s*=\s*['"]?1(\D[^&gt;]*?)?>/&lt;!-- Squished WebBug --&gt;/sig
-   </literallayout>
-  </msgtext> 
- </literal>
+# Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
+#
+s|(&lt;script.*)document\.referrer(.*&lt;/script&gt;)|$1"Not Your Business!"$2|Usg</screen>
 </para>
 
+<para>
+ Following the header line and a comment, you see the job. Note that it uses
+ <literal>|</literal> as the delimiter instead of <literal>/</literal>, because
+ the pattern contains a forward slash, which would otherwise have to be escaped
+ by a backslash (<literal>\</literal>).
+</para>
 
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2>
-<title>The <emphasis>+filter</emphasis> Action</title>
 <para>
- Filters are enabled with the <ulink
- url="actions-file.html#FILTER"><quote>+filter</quote></ulink> action from within 
- one of the actions files. <quote>+filter</quote> requires one parameter, which 
- should match one of the section identifiers in the filter file itself. Example:
+ Now, let's examine the pattern: it starts with the text <literal>&lt;script.*</literal>
+ enclosed in parentheses. Since the dot matches any character, and <literal>*</literal>
+ means: <quote>Match an arbitrary number of the element left of myself</quote>, this
+ matches <quote>&lt;script</quote>, followed by <emphasis>any</emphasis> text, i.e.
+ it matches the whole page, from the start of the first &lt;script&gt; tag.
 </para>
 
-<screen>
-  +filter{html-annoyances}
-</screen>
+<para>
+ That's more than we want, but the pattern continues: <literal>document\.referrer</literal>
+ matches only the exact string <quote>document.referrer</quote>. The dot needed to
+ be <emphasis>escaped</emphasis>, i.e. preceded by a backslash, to take away its
+ special meaning as a joker, and make it just a regular dot. So far, the meaning is:
+ Match from the start of the first &lt;script&gt; tag in a the page, up to, and including,
+ the text <quote>document.referrer</quote>, if <emphasis>both</emphasis> are present
+ in the page (and appear in that order).
+</para>
 
 <para>
- This would activate that particular filter. Similarly, <quote>+filter</quote>
- can be turned off for selected sites as:
- <quote>-filter{<replaceable>html-annoyances</replaceable>}</quote>. Remember
- too, all actions are off by default, unless they are explicitly enabled in one
of the actions files.
+ But there's still more pattern to go. The next element, again enclosed in parentheses,
+ is <literal>.*&lt;/script&gt;</literal>. You already know what <literal>.*</literal>
+ means, so the whole pattern translates to: Match from the start of the first  &lt;script&gt;
+ tag in a page to the end of the last &lt;script&gt; tag, provided that the text
<quote>document.referrer</quote> appears somewhere in between.
 </para>
 
-</sect2>
+<para>
+ This is still not the whole story, since we have ignored the options and the parentheses:
+ The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
+ remembered and be available through the variables <literal>$1, $2, ...</literal> in
+ the substitute. The <literal>U</literal> option switches to ungreedy matching, which means
+ that the first <literal>.*</literal> in the pattern will only <quote>eat up</quote> all
+ text in between <quote>&lt;script</quote> and the <emphasis>first</emphasis> occurrence
+ of <quote>document.referrer</quote>, and that the second <literal>.*</literal> will
+ only span the text up to the <emphasis>first</emphasis> <quote>&lt;/script&gt;</quote>
+ tag. Furthermore, the <literal>s</literal> option says that the match may span
+ multiple lines in the page, and the <literal>g</literal> option again means that the
+ substitution is global.
+</para>
+
+<para>
+ So, to summarize, the pattern means: Match all scripts that contain the text
+ <quote>document.referrer</quote>. Remember the parts of the script from
+ (and including) the start tag up to (and excluding) the string
+ <quote>document.referrer</quote> as <literal>$1</literal>, and the part following
+ that string, up to and including the closing tag, as <literal>$2</literal>.
+</para>
+
+<para>
+ Now the pattern is deciphered, but wasn't this about substituting things? So
+ lets look at the substitute: <literal>$1"Not Your Business!"$2</literal> is
+ easy to read: The text remembered as <literal>$1</literal>, followed by 
+ <literal>"Not Your Business!"</literal> (<emphasis>including</emphasis>
+ the quotation marks!), followed by the text remembered as <literal>$2</literal>.
+ This produces an exact copy of the original string, with the middle part
+ (the <quote>document.referrer</quote>) replaced by <literal>"Not Your
+ Business!"</literal>.
+</para>
+
+<para>
+ The whole job now reads: Replace <quote>document.referrer</quote> by
+ <literal>"Not Your Business!"</literal> wherever it appears inside a
+ &lt;script&gt tag. Note that this job won't break JavaScript syntax,
+ since both the original and the replacement are syntactically valid
+ string objects. The script just won't have access to the referrer
+ information anymore.
+</para>
+
+<para>
+ We'll show you two other jobs from the JavaScript taming department, but
+ this time only point out the constructs of special interest:
+</para>
+
+<para>
+ <screen>
+# The status bar is for displaying link targets, not pointless blahblah
+#
+s/window\.status\s*=\s*['"].*?['"]/dUmMy=1/ig</screen>
+</para>
+
+<para>
+ <literal>\s</literal> stands for whitespace characters (space, tab, newline,
+ carriage return, form feed), so that <literal>\s*</literal> means: <quote>zero
+ or more whitespace</quote>. The <literal>?</literal> in <literal>.*?</literal>
+ makes this matching of arbitrary text ungreedy. (Note that the <literal>U</literal>
+ option is not set). The <literal>['"]</literal> construct means: <quote>a single
+ <emphasis>or</emphasis> a double quote</quote>.
+</para>
+
+<para>
+ So what does this job do? It replaces assignments of single- or double-quoted
+ strings to the <quote>window.status</quote> object with a dummy assignment
+ (using a variable name that is hopefully odd enough not to conflict with
+ real variables in scripts). Thus, it catches many cases where e.g. pointless
+ descriptions are displayed in the status bar instead of the link target when
+ you move your mouse over links.
+</para>
 
+<para>
+ <screen>
+# Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
+#
+s/(&lt;body .*)onunload(.*&gt;)/$1never$2/iU</screen>
+</para>
+
+<para>
+ Including the
+ <ulink url="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents">OnUnload
+ event binding</ulink> in the HTML DOM was a <emphasis>CRIME</emphasis>.
+ When I close a browser window, I want it to close and die. Basta.
+ This job replaces the <quote>onunload</quote> attribute in
+ <quote>&lt;body&gt</quote> tags with the dummy word <literal>never</literal>.
+ Note that the <literal>i</literal> option makes the pattern matching
+ case-insensitive.
+</para>
+
+<para>
+ The last example is from the fun department:
+</para>
+
+<para>
+ <screen>
+FILTER: fun Fun text replacements
+
+# Spice the daily news:
+#
+s/microsoft(?!\.com)/MicroSuck/ig</screen>
+</para>
+
+<para>
+ Note the <literal>(?!\.com)</literal> part (a so-called negative lookahead)
+ in the job's pattern, which means: Don't match, if the string 
+ <quote>.com</quote> appears directly following <quote>microsoft</quote>
+ in the page. This prevents links to microsoft.com from being messed, while
+ still replacing the word everywhere else.
+</para>
+
+<para>
+ <screen>
+# Buzzword Bingo (example for extended regex syntax)
+#
+s* industry[ -]leading \
+|  cutting[ -]edge \
+|  award[ -]winning # Comments are OK, too! \
+|  high[ -]performance \
+|  solutions[ -]based \
+|  unmatched \
+|  unparalleled \
+|  unrivalled \
+*&lt;font color="red"&gt;&lt;b&gt;BINGO!&lt;/b&gt;&lt;/font&gt; \
+*igx</screen>
+</para>
+
+<para>
+ The <literal>x</literal> option in this job turns on extended syntax, and allows for
+ e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting.
+</para>
+
+<para>
+ You get the idea?
+</para>
+</sect2>
 </sect1>
 
 <!--  ~  End section  ~  -->
@@ -5311,23 +6068,80 @@ fragile     = -block -deanimate-gifs -fast-redirects -filter -hide-referer \
 <sect1 id="templates">
 <title>Templates</title>
 <para>
- When <application>Privoxy</application> displays one of its internal 
- pages, such as a <ulink url="http://bogus_404_page.com">404 Not Found error page</ulink>
- (<application>Privoxy</application> must be running for link to work as
- intended), it uses the appropriate template. On Linux, BSD, and Unix, these
- are located in <filename>/etc/privoxy/templates</filename> by default. These
- may be customized, if desired. <filename>cgi-style.css</filename> is used to
- control the HTML attributes (fonts, etc).
+ All <application>Privoxy</application> built-in pages, i.e. error pages such as the 
+ <ulink url="http://show-the-404-error.page"><quote>404 - No Such Domain</quote>
+ error page</ulink>, the <ulink
+ url="http://ads.bannerserver.example.com/nasty-ads/sponsor.html"><quote>BLOCKED</quote>
+ page</ulink>
+ and all pages of its <ulink url="http://config.privoxy.org/">web-based
+ user interface</ulink>, are generated from <emphasis>templates</emphasis>. 
+ (<application>Privoxy</application> must be running for the above links to work as
+ intended)
 </para>
+
 <para>
- The default 
- <ulink
- url="http://ads.bannerserver.example.com/nasty-ads/sponsor.html">Blocked
- </ulink> (<application>Privoxy</application> needs to be running for page to
- display) banner page with the bright red top banner, is called just
- <quote><filename>blocked</filename></quote>. This may be customized or
- replaced with something else if desired (not recommended for the casual
- user).
+ These templates are stored in a subdirectory of the <link linkend="confdir">configuration
+ directory</link> called <filename>templates</filename>. On unixish platforms,
+ this is typically
+ <ulink url="file:///etc/privoxy/templates/"><filename>/etc/privoxy/templates/</filename></ulink>.
+</para>
+
+<para>
+ The templates are basically normal HTML files, but with place-holders (called symbols
+ or exports), which <application>Privoxy</application> fills at run time. You can
+ edit the templates with a normal text editor, should you want to customize them.
+ (<emphasis>Not recommended for the casual user</emphasis>). Note that
+ just like in configuration files, lines starting with <literal>#</literal> are
+ ignored when the templates are filled in.
+</para>
+
+<para>
+ The place-holders are of the form <literal>@name@</literal>, and you will
+ find a list of available symbols, which vary from template to template,
+ in the comments at the start of each file. Note that these comments are not
+ always accurate, and that it's probably best to look at the existing HTML
+ code to find out which symbols are supported and what they are filled in with.
+</para>
+
+<para>
+ A special application of this substitution mechanism is to make whole
+ blocks of HTML code disappear when a specific symbol is set. We use this
+ for many purposes, one of them being to include the beta warning in all
+ our user interface (CGI) pages when <application>Privoxy</application>
+ in in an alpha or beta development stage:
+</para>
+
+<para>
+ <screen>
+&lt;!-- @if-unstable-start --&gt;
+
+  ... beta warning HTML code goes here ...
+
+&lt;!-- if-unstable-end@ --&gt;</screen>
+</para>
+
+<para>
+ If the "unstable" symbol is set, everything in between and including
+ <literal>@if-unstable-start</literal> and <literal>if-unstable-end@</literal>
+ will disappear, leaving nothing but an empty comment:
+</para>
+
+<para>
+ <screen>&lt;!--  --&gt;</screen>
+</para>
+
+<para>
+ There's also an if-then-else construct and an <literal>#include</literal>
+ mechanism, but you'll sure find out if you are inclined to edit the
+ templates ;-)
+</para>
+
+<para>
+ All templates refer to a style located at
+ <ulink url="http://config.privoxy.org/send-stylesheet"><literal>http://config.privoxy.org/send-stylesheet</literal></ulink>.
+ This is, of course, locally served by <application>Privoxy</application>
+ and the source for it can be found and edited in the
+ <filename>cgi-style.css</filename> template.
 </para>
 
 </sect1>
@@ -5373,6 +6187,13 @@ Requests</title>
  &history;
 <!-- end history -->
 </sect2>
+
+<sect2 id="authors"><title>Authors</title>
+<!-- Include p-authors.sgml: -->
+ &p-authors;
+<!-- end authors -->
+</sect2>
+
 </sect1>
 
 <!--  ~  End section  ~  -->
@@ -5395,30 +6216,29 @@ Requests</title>
 <sect2 id="regex">
 <title>Regular Expressions</title>
 <para>
- <application>Privoxy</application> can use <quote>regular expressions</quote> 
- in various config files. Assuming support for <quote>pcre</quote> (Perl
- Compatible Regular Expressions) is compiled in, which is the default. Such
- configuration directives do not require regular expressions, but they can be
- used to increase flexibility by matching a pattern with wild-cards against
- URLs.
+ <application>Privoxy</application> uses Perl-style <quote>regular
+ expressions</quote> in its <link linkend="actions-file">actions
+ files</link> and <link linkend="filter-file">filter file</link>,
+ through the <ulink url="http://www.pcre.org/">PCRE</ulink> and
+ <ulink url="http://www.oesterhelt.org/pcrs/">PCRS</ulink> libraries.
 </para>
 
 <para>
  If you are reading this, you probably don't understand what <quote>regular
  expressions</quote> are, or what they can do. So this will be a very brief
- introduction only. A full explanation would require a book ;-)
+ introduction only. A full explanation would require a <ulink
+ url="http://www.oreilly.com/catalog/regex/">book</ulink> ;-)
 </para>
 
 <para>
- <quote>Regular expressions</quote> is a way of matching one character
- expression against another to see if it matches or not. One of the
- <quote>expressions</quote> is a literal string of readable characters
- (letter, numbers, etc), and the other is a complex string of literal
- characters combined with wild-cards, and other special characters, called
- meta-characters. The <quote>meta-characters</quote> have special meanings and
- are used to build the complex pattern to be matched against. Perl Compatible
- Regular Expressions is an enhanced form of the regular expression language
- with backward compatibility.
+ Regular expressions provide a language to describe patterns that can be
+ run against strings of characters (letter, numbers, etc), to see if they
+ match the string or not. The  patterns are themselves (sometimes complex)
+ strings of literal characters, combined with  wild-cards, and other special
+ characters, called meta-characters. The <quote>meta-characters</quote> have
+ special meanings and are used to build complex patterns to be matched against.
+ Perl Compatible Regular Expressions are an especially convenient
+ <quote>dialect</quote> of the regular expression language.
 </para>
 
 <para>
@@ -5505,14 +6325,6 @@ Requests</title>
  </member>
 </simplelist></para>
 
-<para><simplelist>
- <member>
-  <emphasis>s/string1/string2/g</emphasis> - This is used to rewrite strings of text. 
-  <quote>string1</quote> is replaced by <quote>string2</quote> in this
-  example. There must of course be a match on <quote>string1</quote> first.
- </member>
-</simplelist></para>
-
 <para>
  These are just some of the ones you are likely to use when matching URLs with 
  <application>Privoxy</application>, and is a long way from a definitive
@@ -5602,16 +6414,6 @@ Requests</title>
  in the expression anywhere).
 </para>
 
-<para>
- <emphasis><literal>s/microsoft(?!.com)/MicroSuck/i</literal></emphasis> - This is 
- a substitution. <quote>MicroSuck</quote> will replace any occurrence of 
- <quote>microsoft</quote>.  The <quote>i</quote> at the end of the expression
- means ignore case. The <quote>(?!.com)</quote> means 
- the match should fail if <quote>microsoft</quote> is followed by
- <quote>.com</quote>. In other words, this acts like a <quote>NOT</quote>
- modifier. In case this is a hyperlink, we don't want to break it ;-).
-</para>
-
 <para>
  We are barely scratching the surface of regular expressions here so that you
  can understand the default <application>Privoxy</application>
@@ -5626,6 +6428,11 @@ Requests</title>
  <ulink url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>
 </para>
 
+<para>
+ For information on regular expression based substititions and their applications
+ in filters, please see the <link linkend="filter-file">filter file tutorial</link>
+ in this manual.
+</para>
 </sect2>
 
 <!--  ~  End section  ~  -->
@@ -5668,9 +6475,9 @@ Requests</title>
    </para>
   </blockquote>
   <para>
-   Alternately, this may be reached at <ulink
-   url="http://p.p/">http://p.p/</ulink>, but this
-   variation may not work as reliably as the above in some configurations.
+   There is a shortcut: <ulink url="http://p.p/">http://p.p/</ulink> (But it
+   doesn't provide a fallback to a real page, in case the request is not
+   sent through <application>Privoxy</application>)
   </para>
  </listitem>
 
@@ -5804,17 +6611,19 @@ Requests</title>
 
   <listitem>
    <para>
-    <ulink url="javascript:w=Math.floor(screen.width/2);h=Math.floor(screen.height*0.9);void(window.open('http://www.privoxy.org/actions','Feedback','screenx='+w+',width='+w+',height='+h+',scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Submit Filter Feedback</ulink>
+    <ulink url="javascript:w=Math.floor(screen.width/2);h=Math.floor(screen.height*0.9);void(window.open('http://www.privoxy.org/actions/index.php?url='+escape(location.href),'Feedback','screenx='+w+',width='+w+',height='+h+',scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Submit Actions File Feedback</ulink>
+   </para>
+  </listitem> 
+  <listitem>
+   <para>
+    <ulink url="javascript:void(window.open('http://config.privoxy.org/show-url-info?url='+escape(location.href),'Why').focus());">Privoxy - Why?</ulink>
    </para>
   </listitem> 
-
  </itemizedlist>
 </para>
 
-
-
 <para>
- Credit: The site which gave me the general idea for these bookmarklets is
+ Credit: The site which gave us the general idea for these bookmarklets is
  <ulink url="http://www.bookmarklets.com">www.bookmarklets.com</ulink>. They
  have more information about bookmarklets. 
 </para>
@@ -5852,14 +6661,14 @@ Requests</title>
  <listitem>
   <para>
    Next, <application>Privoxy</application> checks to see if the URL 
-   matches any <ulink
-   url="actions-file.html#BLOCK"><quote>+block</quote></ulink> patterns. If
+   matches any <link
+   linkend="BLOCK"><quote>+block</quote></link> patterns. If
    so, the URL is then blocked, and the remote web server will not be contacted.
-   <ulink url="actions-file.html#HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></ulink> 
+   <link linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link> 
    is then checked and if it does not match, an 
    HTML <quote>BLOCKED</quote> page is sent back. Otherwise, if it does match,
-   an image is returned. The type of image depends on the setting of <ulink
-   url="actions-file.html#SET-IMAGE-BLOCKER"><quote>+set-image-blocker</quote></ulink>
+   an image is returned. The type of image depends on the setting of <link
+   linkend="SET-IMAGE-BLOCKER"><quote>+set-image-blocker</quote></link>
    (blank, checkerboard pattern, or an HTTP redirect to an image elsewhere).
   </para>
  </listitem> 
@@ -5871,16 +6680,16 @@ Requests</title>
  </listitem> 
  <listitem>
   <para>
-   If the URL pattern matches the <ulink
-   url="actions-file.html#FAST-REDIRECTS"><quote>+fast-redirects</quote></ulink> action,
+   If the URL pattern matches the <link
+   linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link> action,
    it is then processed. Unwanted parts of the requested URL are stripped.
   </para>
  </listitem> 
  <listitem>
   <para>
    Now the rest of the client browser's request headers are processed. If any
-   of these match any of the relevant actions (e.g. <ulink
-   url="actions-file.html#HIDE-USER-AGENT"><quote>+hide-user-agent</quote></ulink>,
+   of these match any of the relevant actions (e.g. <link
+   linkend="HIDE-USER-AGENT"><quote>+hide-user-agent</quote></link>,
    etc.), headers are suppressed or forged as determined by these actions and
    their parameters.
   </para>
@@ -5895,25 +6704,25 @@ Requests</title>
   <para>
    First, the server headers are read and processed to determine, among other
    things, the MIME type (document type) and encoding. The headers are then
-   filtered as determined by the 
-   <ulink url="actions-file.html#CRUNCH-INCOMING-COOKIES"><quote>+crunch-incoming-cookies</quote></ulink>,
-   <ulink url="actions-file.html#SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></ulink>,
-   and <ulink url="actions-file.html#DOWNGRADE-HTTP-VERSION"><quote>+downgrade-http-version</quote></ulink>
+   filtered as deterimed by the 
+   <link linkend="CRUNCH-INCOMING-COOKIES"><quote>+crunch-incoming-cookies</quote></link>,
+   <link linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>,
+   and <link linkend="DOWNGRADE-HTTP-VERSION"><quote>+downgrade-http-version</quote></link>
    actions.
   </para>
  </listitem> 
  <listitem>
   <para>
-   If the <ulink url="actions-file.html#KILL-POPUPS"><quote>+kill-popups</quote></ulink>
+   If the <link linkend="KILL-POPUPS"><quote>+kill-popups</quote></link>
    action applies, and it is an HTML or JavaScript document, the popup-code in the
    response is filtered on-the-fly as it is received.
   </para>
  </listitem> 
  <listitem>
   <para>
-   If a <ulink url="actions-file.html#FILTER"><quote>+filter</quote></ulink>
-   or <ulink
-   url="actions-file.html#DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></ulink>
+   If a <link linkend="FILTER"><quote>+filter</quote></link>
+   or <link
+   linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link>
    action applies (and the document type fits the action), the rest of the page is
    read into memory (up to a configurable limit). Then the filter rules (from
    <filename>default.filter</filename>) are processed against the buffered
@@ -5924,9 +6733,9 @@ Requests</title>
    <application>Privoxy</application> back to your browser. 
   </para>
   <para>
-   If neither <ulink url="actions-file.html#FILTER"><quote>+filter</quote></ulink>
-   or <ulink
-   url="actions-file.html#DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></ulink>
+   If neither <link linkend="FILTER"><quote>+filter</quote></link>
+   or <link
+   linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link>
    matches, then <application>Privoxy</application> passes the raw data through 
    to the client browser as it becomes available.
   </para>
@@ -5954,16 +6763,15 @@ Requests</title>
 
 <para>
  The way <application>Privoxy</application> applies 
- <ulink url="actions-file.html#ACTIONS"><quote>actions</quote></ulink>
- and <ulink url="actions-file.html#FILTER"><quote>filters</quote></ulink>
+ <link linkend="ACTIONS">actions</link> and <link linkend="FILTER">filters</link>
  to any given URL can be complex, and not always so
  easy to understand what is happening. And sometimes we need to be able to
  <emphasis>see</emphasis> just what <application>Privoxy</application> is
  doing. Especially, if something <application>Privoxy</application> is doing
  is causing us a problem inadvertently. It can be a little daunting to look at
  the actions and filters files themselves, since they tend to be filled with
- <quote>regular expressions</quote> whose consequences are not always 
- so obvious. 
+ <link linkend="regex">regular expressions</link> whose consequences are not
always so obvious. 
 </para>
 
 <para>
@@ -5984,8 +6792,8 @@ Requests</title>
  First, enter one URL (or partial URL) at the prompt, and then
  <application>Privoxy</application> will tell us 
  how the current configuration will handle it. This will not
- help with filtering effects (i.e. the <ulink
url="actions-file.html#FILTER"><quote>+filter</quote></ulink> action) from
+ help with filtering effects (i.e. the <link
linkend="FILTER"><quote>+filter</quote></link> action) from
  the <filename>default.filter</filename> file since this is handled very
  differently and not so easy to trap! It also will not tell you about any other
  URLs that may be embedded within the URL you are testing. For instance, images
@@ -6006,19 +6814,38 @@ Requests</title>
  <screen>
  Matches for http://google.com:
 
---- File standard ---
-(no matches in this file)
-
---- File default ---
-
-{ -add-header -block +deanimate-gifs{last} -downgrade-http-version +fast-redirects 
- -filter{popups} -filter{fun} -filter{shockwave-flash} -filter{crude-parental} 
- +filter{html-annoyances} +filter{js-annoyances} +filter{content-cookies} 
- +filter{webbugs} +filter{refresh-tags} +filter{nimda} +filter{banners-by-size} 
- +hide-forwarded-for-headers +hide-from-header{block} +hide-referer{forge} 
- -hide-user-agent -handle-as-image +set-image-blocker{pattern} -limit-connect 
- +prevent-compression +session-cookies-only -crunch-outgoing-cookies 
- -crunch-incoming-cookies -kill-popups -send-vanilla-wafer -send-wafer }
+ In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
+
+{-add-header 
+ -block 
+ -crunch-outgoing-cookies 
+ -crunch-incoming-cookies 
+ +deanimate-gifs{last} 
+ -downgrade-http-version 
+ +fast-redirects 
+ -filter{popups} 
+ -filter{fun} 
+ -filter{shockwave-flash} 
+ -filter{crude-parental} 
+ +filter{html-annoyances} 
+ +filter{js-annoyances} 
+ +filter{content-cookies} 
+ +filter{webbugs} 
+ +filter{refresh-tags} 
+ +filter{nimda} 
+ +filter{banners-by-size} 
+ +hide-forwarded-for-headers 
+ +hide-from-header{block} 
+ +hide-referer{forge} 
+ -hide-user-agent 
+ -handle-as-image 
+ -kill-popups 
+ -limit-connect 
+ +prevent-compression 
+ -send-vanilla-wafer 
+ -send-wafer 
+ +session-cookies-only 
+ +set-image-blocker{pattern} }
 /
 
  { -session-cookies-only }
@@ -6027,14 +6854,14 @@ Requests</title>
  { -fast-redirects }
  .google.com
 
---- File user ---
+In file: user.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
 (no matches in this file)  
 </screen>
 </para>
 
 <para>
  This tells us how we have defined our 
- <ulink url="actions-file.html#ACTIONS"><quote>actions</quote></ulink>, and
+ <link linkend="ACTIONS"><quote>actions</quote></link>, and
  which ones match for our example, <quote>google.com</quote>. The first listing
  is any matches for the <filename>standard.action</filename> file. No hits at
  all here on <quote>standard</quote>. Then next is <quote>default</quote>, or
@@ -6051,12 +6878,12 @@ Requests</title>
  rules, and then list specific URLs (or patterns) that these exceptions would
  apply to. Last match wins. Just below this then are two explicit matches for
  <quote>.google.com</quote>. The first is negating our previous cookie setting, 
- which was for <ulink
url="actions-file.html#SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></ulink>
+ which was for <link
linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>
  (i.e. not persistent). So we will allow persistent cookies for google. The
  second turns <emphasis>off</emphasis> any 
- <ulink
url="actions-file.html#FAST-REDIRECTS"><quote>+fast-redirects</quote></ulink>
+ <link
linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link>
  action, allowing this to take place unmolested. Note that there is a leading
  dot here -- <quote>.google.com</quote>. This will match any hosts and
  sub-domains, in the google.com domain also, such as
@@ -6081,14 +6908,37 @@ Requests</title>
  <screen>
 
  Final results:
- -add-header -block +deanimate-gifs{last} -downgrade-http-version -fast-redirects 
- -filter{popups} -filter{fun} -filter{shockwave-flash} -filter{crude-parental} 
- +filter{html-annoyances} +filter{js-annoyances} +filter{content-cookies} 
- +filter{webbugs} +filter{refresh-tags} +filter{nimda} +filter{banners-by-size} 
- +hide-forwarded-for-headers +hide-from-header{block} +hide-referer{forge} 
- -hide-user-agent -handle-as-image +set-image-blocker{pattern} -limit-connect 
- +prevent-compression -session-cookies-only -crunch-outgoing-cookies 
- -crunch-incoming-cookies -kill-popups -send-vanilla-wafer -send-wafer
+ -add-header 
+ -block 
+ -crunch-outgoing-cookies 
+ -crunch-incoming-cookies 
+ +deanimate-gifs{last} 
+ -downgrade-http-version 
+ -fast-redirects 
+ -filter{popups} 
+ -filter{fun} 
+ -filter{shockwave-flash} 
+ -filter{crude-parental} 
+ +filter{html-annoyances} 
+ +filter{js-annoyances} 
+ +filter{content-cookies} 
+ +filter{webbugs} 
+ +filter{refresh-tags} 
+ +filter{nimda} 
+ +filter{banners-by-size} 
+ +hide-forwarded-for-headers 
+ +hide-from-header{block} 
+ +hide-referer{forge} 
+ -hide-user-agent 
+ -handle-as-image 
+ -kill-popups 
+ -limit-connect 
+ +prevent-compression 
+ -send-vanilla-wafer 
+ -send-wafer
+ -session-cookies-only 
+ +set-image-blocker{pattern} 
 </screen>
 </para>
 
@@ -6119,8 +6969,8 @@ Requests</title>
  We'll just show the interesting part here, the explicit matches. It is 
  matched three different times. Each as an <quote>+block +handle-as-image</quote>,
  which is the expanded form of one of our aliases that had been defined as: 
- <quote>+imageblock</quote>. (<ulink
url="actions-file.html#ALIASES"><quote>Aliases</quote></ulink> are defined in
+ <quote>+imageblock</quote>. (<link
linkend="ALIASES"><quote>Aliases</quote></link> are defined in
  the first section of the actions file and typically used to combine more 
  than one action.)
 </para>
@@ -6131,11 +6981,11 @@ Requests</title>
  would also cover the first. No point in taking chances with these guys 
  though ;-) Note that if you want an ad or obnoxious 
  URL to be invisible, it should be defined as <quote>ad.doubleclick.net</quote>
- is done here -- as both a <ulink
url="actions-file.html#BLOCK"><quote>+block</quote></ulink>
+ is done here -- as both a <link
linkend="BLOCK"><quote>+block</quote></link>
  <emphasis>and</emphasis> an 
- <ulink
url="actions-file.html#HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></ulink>.
+ <link
linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link>.
  The custom alias <quote>+imageblock</quote> just simplifies the process and make 
  it more readable.
 </para>
@@ -6150,13 +7000,34 @@ Requests</title>
 
  Matches for http://www.rhapsodyk.net/adsl/HOWTO/:
 
- { -add-header -block +deanimate-gifs -downgrade-http-version +fast-redirects 
-   +filter{html-annoyances} +filter{js-annoyances} +filter{kill-popups} 
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
-   +filter{fun} +hide-forwarded-for-headers +hide-from-header{block} 
-   +hide-referer{forge} -hide-user-agent -handle-as-image +set-image-blocker{blank} 
-   +prevent-compression +session-cookies-only -crunch-incoming-cookies 
-   -crunch-outgoing-cookies +kill-popups -send-vanilla-wafer -send-wafer }
+ In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
+
+ {-add-header 
+  -block 
+  -crunch-incoming-cookies 
+  -crunch-outgoing-cookies 
+  +deanimate-gifs 
+  -downgrade-http-version 
+  +fast-redirects 
+  +filter{html-annoyances} 
+  +filter{js-annoyances} 
+  +filter{kill-popups} 
+  +filter{webbugs} 
+  +filter{nimda} 
+  +filter{banners-by-size} 
+  +filter{hal} 
+  +filter{fun} 
+  +hide-forwarded-for-headers 
+  +hide-from-header{block} 
+  +hide-referer{forge} 
+  -hide-user-agent 
+  -handle-as-image 
+  +kill-popups 
+  +prevent-compression 
+  -send-vanilla-wafer 
+  -send-wafer 
+  +session-cookies-only 
+  +set-image-blocker{blank} }
    /
 
  { +block +handle-as-image }
@@ -6271,8 +7142,47 @@ Requests</title>
  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
  $Log: user-manual.sgml,v $
+ Revision 1.121  2002/05/23 23:20:17  oes
+  - Changed more (all?) references to actions to the
+    <literal><link> style.
+  - Small fixes in the actions chapter
+  - Small clarifications in the quickstart to ad blocking
+  - Removed <emphasis> from <title>s since the new doc CSS
+    renders them red (bad in TOC).
+
+ Revision 1.120  2002/05/23 19:16:43  roro
+ Correct Debian specials (installation and startup).
+
+ Revision 1.119  2002/05/22 17:17:05  oes
+ Added Security hint
+
+ Revision 1.118  2002/05/21 04:54:55  hal9
+ -New Section: Quickstart to Ad Blocking
+ -Reformat Actions Anatomy to match new CGI layout
+
+ Revision 1.117  2002/05/17 13:56:16  oes
+  - Reworked & extended Templates chapter
+  - Small changes to Regex appendix
+  - #included authors.sgml into (C) and hist chapter
+
+ Revision 1.116  2002/05/17 03:23:46  hal9
+ Fixing merge conflict in Quickstart section.
+
+ Revision 1.115  2002/05/16 16:25:00  oes
+ Extended the Filter File chapter & minor fixes
+
+ Revision 1.114  2002/05/16 09:42:50  oes
+ More ulink->link, added some hints to Quickstart section
+
+ Revision 1.113  2002/05/15 21:07:25  oes
+ Extended and further commented the example actions files
+
+ Revision 1.112  2002/05/15 03:57:14  hal9
+ Spell check. A few minor edits here and there for better syntax and
+ clarification.
+
  Revision 1.111  2002/05/14 23:01:36  oes
- Fixing the fixes
+ Fixing the fixes   
 
  Revision 1.110  2002/05/14 19:10:45  oes
  Restored alphabetical order of actions