From: <san...@us...> - 2006-04-19 19:43:53
|
Revision: 116 Author: sandymac Date: 2006-04-19 12:43:45 -0700 (Wed, 19 Apr 2006) ViewCVS: http://svn.sourceforge.net/gatorsieve/?rev=116&view=rev Log Message: ----------- Updated transform to output help content. Modified Paths: -------------- WebSieve/trunk/src/webapp/NoProbs.css WebSieve/trunk/src/webapp/editScript.jspx WebSieve/trunk/src/webapp/help.html WebSieve/trunk/src/webapp/helpToc.xsl Modified: WebSieve/trunk/src/webapp/NoProbs.css =================================================================== --- WebSieve/trunk/src/webapp/NoProbs.css 2006-04-19 16:23:52 UTC (rev 115) +++ WebSieve/trunk/src/webapp/NoProbs.css 2006-04-19 19:43:45 UTC (rev 116) @@ -1,7 +1,6 @@ /*Style sheet for NoProbs must be included to with HTML.*/ /*Styles for body.*/ -body -{ +body { margin: 0 auto; padding: 0; font: 76% Verdana, Helvetica, Tahoma, Arial, sans-serif; @@ -10,8 +9,7 @@ } /*Styles for main content which will be wrapped to centere. */ -#MainWrapper -{ +#MainWrapper { background: #ffffff; color: #303030; margin: 0 auto; @@ -21,16 +19,14 @@ } /*Styles for the main header at the top. */ -#Header -{ +#Header { color:#ffffff; background-color: #79A3C1; padding-top: 1em; padding-bottom: 1em; padding-left: 2em; } -#Header a -{ +#Header a { font-weight:normal; font-size: larger; text-decoration:none; @@ -39,8 +35,7 @@ } /*Styles for the main header menus. */ -#HeaderMenus -{ +#HeaderMenus { color:#000000; height:1.2em; line-height:1.2em; @@ -49,18 +44,18 @@ background-color: #dcdcdc; border-bottom:solid thin #a9a9a9; } -#HeaderMenus ul -{ + +#HeaderMenus ul { padding: 0 0 0 0; margin: 0 0 0 0; } -#HeaderMenus li -{ + +#HeaderMenus li { float:left; list-style-type:none; } -#HeaderMenus li a -{ + +#HeaderMenus li a { display:block; color: black; background-color: inherit; @@ -68,22 +63,21 @@ text-decoration:none; padding:0 1em; } -#HeaderMenus .selected -{ + +#HeaderMenus .selected { color: #336699; text-decoration: none; background-color:inherit; } -#HeaderMenus a:hover -{ + +#HeaderMenus a:hover { background-color:inherit; color: #336699; text-decoration: none; } /*Styles for the contens that are displayes in side column. */ -#SideContents -{ +#SideContents { float:right; width: 22%; color: #333300; @@ -91,36 +85,36 @@ line-height:1.4em; background-color:#ffffff; } -#SideContents h3 -{ + +#SideContents h3 { color: #4D6E8F; font-size: 1.4em; margin: 0 auto; padding: 0 0 8px 0; background-color:inherit; } -#SideContents p -{ + +#SideContents p { font-size: 90%; text-align: justify; background-color:inherit; color: #333300; margin: 0 0 12px 0; } -#SideContents a -{ + +#SideContents a { text-decoration: none; background-color:inherit; color: #660000; } /*Styles for the main contets in the page. */ -#MainContent -{ +#MainContent { margin: 0 26% 2em 2%; padding: 0 1em 0 1em; border-right: solid thin #ddd; line-height: 1.6em; + font-size: 110%; } .FullWidth#MainContent { @@ -128,28 +122,28 @@ border-right: none; } -#MainContent h2 -{ - color:#000000; +#MainContent h1 { + margin-top: 0.67em; + margin-bottom: 0.67em; +} + +#MainContent h2 { font-size: 1.5em; - margin: 0 0 0.5em 0; - background-color:inherit; - text-align: left; + margin: 0.5em 0 0.5em 0; } -#MainContent p -{ + +#MainContent p { color:#494949; text-align: justify; - background-color:inherit; } -#MainContent a -{ + +#MainContent a { text-decoration: none; background-color:inherit; color: #000066; } -#MainContent img -{ + +#MainContent img { display:inline; color: inherit; background-color:inherit; @@ -157,8 +151,7 @@ } /*Styles for the page footer. */ -#Footer -{ +#Footer { margin: 0 auto; padding: 1em 0 0.5em 0; border-top: solid thin #ddd; @@ -167,25 +160,24 @@ font-size: 0.9em; line-height: 1.6em; } -#Footer a -{ + +#Footer a { color: #000099; background-color: inherit; text-decoration: none; } -#Footer a:hover -{ + +#Footer a:hover { text-decoration: underline; } /*Styles for other classes. */ -.AlignLeft -{ +.AlignLeft { margin: 10px 10px 5px 0; float: left; } -.AlignRight -{ + +.AlignRight { margin: 10px 0 0 10px; float: right; } \ No newline at end of file Modified: WebSieve/trunk/src/webapp/editScript.jspx =================================================================== --- WebSieve/trunk/src/webapp/editScript.jspx 2006-04-19 16:23:52 UTC (rev 115) +++ WebSieve/trunk/src/webapp/editScript.jspx 2006-04-19 19:43:45 UTC (rev 116) @@ -80,17 +80,6 @@ <div id="MainContent"> - <h2> - <c:choose> - <c:when test="${!empty(scriptText)}"> - <fmt:message key="message.edit.title"/> - </c:when> - <c:otherwise> - <fmt:message key="message.create.title"/> - </c:otherwise> - </c:choose> - </h2> - <c:if test="${!empty(errorMessage)}"> <x:parse var="errorXml" xml="${errorMessage}"/> <div class="message"> Modified: WebSieve/trunk/src/webapp/help.html =================================================================== --- WebSieve/trunk/src/webapp/help.html 2006-04-19 16:23:52 UTC (rev 115) +++ WebSieve/trunk/src/webapp/help.html 2006-04-19 19:43:45 UTC (rev 116) @@ -1,20 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <html> -<body id="help"> +<body> -<h1>GatorSieve Help</h1> - -<p> - Filtering email with Sieve. -</p> - <div id="Introduction" class="section" title="Introduction"> - - - <h3>Introduction</h3> - - <p>Sieve [SIEVE] is a language for filtering e-mail messages at the time + <p> + Sieve is a language for filtering e-mail messages at the time of final delivery. It is designed to be implementable on either a mail client or mail server. It is meant to be extensible, simple, and independent of access protocol, mail architecture, and operating @@ -32,146 +23,157 @@ </div> <div id="InstallingScript" class="section" title="Installing a script"> - <p> There are two ways to install a script, creating a new script from scratch and upload an existing script. </p> - <h3>Installing a script</h3> - <div id="CreatingScript" class="section" title="Creating a new script"> - - <h4>Creating a new script</h4> - <p> - You can edit a script's contents in the text area. To install a new script, go to <a - href="edit"> Creating Sieve Scripts </a> and to the Create a new - sieve script, Type in the box area the script you want to create. Choose a script name and press the save button. + You can edit a script's contents in the text area. + To install a new script, go to <a href="edit">Creating Sieve Scripts</a> and to the Create a new + sieve script, type in the box area the script you want to create. + Choose a script name and press the save button. </p> </div> <div id="UploadingScript" class="section" title="Uploading an existing script"> - - <h4>Uploading an existing script</h4> - <p> - You can upload a script from your hard drive, go to <a href="edit"> Creating Sieve - Scripts </a> and to the Upload - a local sieve script, click on browse to look for a file in the file system that you want to upload. Choose a file - name to be uploaded - and press the upload button. + You can upload a script from your hard drive, go to + <a href="edit">Creating Sieve Scripts</a> and to the Upload + a local sieve script, click on browse to look for a file in the file system that you want to upload. + Choose a file name to be uploaded and press the upload button. </p> </div> </div> <div id="ScriptSyntax" class="section" title="Script syntax"> + <p> + The commands for uploading and manipulating the status of sieve scripts + are available by using the <code>sieve</code> program on one of the <a href="list">GatorSieve</a>. + </p> -<h3>Script syntax</h3> + <p> + The working directory for the sieve program is .sieve located off your home directory + </p> -<p> The commands for uploading and manipulating the status of sieve scripts - are available by using the <code>sieve</code> program on one of the <a href="list">Gator - Sieve</a>. -</p> + <p> + The following are commands implemented by GatorSieve: + </p> -<p>The working directory for the sieve program is .sieve located off your home directory</p> - -<p>The following are commands implemented by Gator Sieve: <ul> - <li><strong>list</strong> - list scripts on server. Go to<a href="list"> Gator - Sieve</a></li> - <li><strong>put</strong> <filename> - upload script to server. Go to <a - href="edit"> Create Sieve Script</a></li> - <li><strong>get</strong> <name> [<filename>] - get script. Go to <a - href="list"> Gator Sieve</a> and select the script name to view.</li> - <li><strong>delete</strong> <name> - delete script. Go to <a href="list"> - Gator Sieve</a> click on the delete button.</li> - <li><strong>activate</strong> <name> - set a script as the active script. Go to <a - href="list"> Gator Sieve</a> click on activate button.</li> + <li> + <strong>list</strong> - list scripts on server. Go to <a href="list">GatorSieve</a> + </li> + <li> + <strong>put</strong> <filename> - upload script to server. + Go to <a href="edit">Create Sieve Script</a> + </li> + <li> + <strong>get</strong> <name> [<filename>] - get script. + Go to <a href="list">GatorSieve</a> and select the script name to view. + </li> + <li> + <strong>delete</strong> <name> - delete script. + Go to <a href="list">GatorSieve</a> click on the delete button. + </li> + <li> + <strong>activate</strong> <name> - set a script as the active script. + Go to <a href="list">GatorSieve</a> click on activate button. + </li> Note: you may have up to five scripts installed on the IMAP server only one may be active at any one time. - <li><strong>deactivate</strong> - deactivate all scripts. Go to <a href="list"> - Gator Sieve</a> click on deactivate button. </li> + <li> + <strong>deactivate</strong> - deactivate all scripts. + Go to <a href="list">GatorSieve</a> click on deactivate button. + </li> Note: only the active script shows the deactivate button. </ul> -</p> </div> -<!--<p>--> -<div id="Capabilities" class="section" title="Capabilities"> -<h4>Capabilities</h4> -<ul> -<li> fileinto - <p> - The "fileinto" action delivers the message into the specified folder. - </p> - Example: <pre><code>require "fileinto"; - if header :contains ["from"] "coyote" { +<div id="Capabilities" class="section" title="Capabilities"> + <ul> + <li> fileinto + <p> + The "fileinto" action delivers the message into the specified folder. + </p> + Example: +<pre><code>require "fileinto"; +if header :contains ["from"] "coyote" { fileinto "INBOX.harassment"; - }</code></pre> +}</code></pre> + </li> - -</li> -<li> reject - <p> - The reject" action refuses delivery of a message by resending - the message to the sender, wrapping it in a "reject" form, noting that it was rejected by the - recipient. In the following script, message A is rejected and - returned to the sender. - </p> - Example: <pre><code> if header :contains "from" "co...@de..." { + <li> reject + <p> + The reject" action refuses delivery of a message by resending + the message to the sender, wrapping it in a "reject" form, noting that it was rejected by the + recipient. In the following script, message A is rejected and + returned to the sender. + </p> + Example: +<pre><code> if header :contains "from" "co...@de..." { reject "I am not taking mail from you"; - }</code></pre> -</li> -<li> envelope - <p>In most cases, the envelope "to" address is the preferred - address to examine for subaddress information when the desire is to - sort messages based on how they were addressed so as to get to a - specific recipient. The envelope address is, after all, the reason a - given message is being processed by a given sieve script for a given - user. This is particularly true when mailing lists, aliases, and - "virtual domains" are involved since the envelope may be the only - source of detail information for the specific recipient. - </p> - Example: <pre><code>require "envelope"; - if envelope :all :is "from" "ti...@ex..." { +}</code></pre> + </li> + + <li> envelope + <p> + In most cases, the envelope "to" address is the preferred + address to examine for subaddress information when the desire is to + sort messages based on how they were addressed so as to get to a + specific recipient. The envelope address is, after all, the reason a + given message is being processed by a given sieve script for a given + user. This is particularly true when mailing lists, aliases, and + "virtual domains" are involved since the envelope may be the only + source of detail information for the specific recipient. + </p> + Example: +<pre><code>require "envelope"; +if envelope :all :is "from" "ti...@ex..." { discard; # Redirect all mail sent to +foo. if envelope :detail "to" "foo" { - redirect "ke...@ex..."; - }</code></pre> -</li> -<li> vacation - <p>The "vacation" action implements a vacation autoresponder with the - purpose to provide correspondents with notification that the user - is away for an extended period of time and that they should not - expect quick responses.</p> + redirect "ke...@ex..."; + } +}</code></pre> + </li> - <p>Example: + <li> vacation + <p> + The "vacation" action implements a vacation autoresponder with the + purpose to provide correspondents with notification that the user + is away for an extended period of time and that they should not + expect quick responses. + </p> + + <p>Example: <pre><code>require "vacation"; if header :contains "subject" "cyrus" { vacation "I'm out -- send mail to cyrus-bugs"; } else { vacation "I'm out -- call me at +1 304 555 0123"; }</code></pre> - </p> -</li> -<li> imapflags - <p>This is an extension to the Sieve language defined by [SIEVE] for - setting [IMAP] flags. It defines several new actions "setflag", - "addflag", "removeflag", "mark" and "unmark". + </p> + </li> - </p> - Example: + <li> imapflags + <p>This is an extension to the Sieve language defined by [SIEVE] for + setting [IMAP] flags. It defines several new actions "setflag", + "addflag", "removeflag", "mark" and "unmark". + + </p> + Example: <pre><code>if header :contains "from" "bo...@fr..." { setflag "\\Flagged"; fileinto "INBOX.From Boss"; }</code></pre> -</li> -<li> notify - <p>The Notify action specifies that a notification should be sent to the - user. </p> - Example: + </li> + + <li> notify + <p>The Notify action specifies that a notification should be sent to the + user. </p> + Example: <pre><code>require ["notify", "fileinto", "variables"]; if header :contains "from" "bo...@ex..." { @@ -193,119 +195,101 @@ notify :priority "3" :message "[SIEVE] ${from}: ${subject}"; fileinto "INBOX.sieve"; }</code></pre> -</li> -<li> subaddress - <p>On email systems that allow for "subaddressing" or "detailed - addressing" (e.g., "ken...@ex..."), it is sometimes - desirable to make comparisons against these sub-parts of addresses. - </p> - Example:<pre><code>require "subaddress"; + </li> - # File mailing list messages (subscribed as "ken+mta-filters"). - if envelope :detail "to" "mta-filters" { + <li> subaddress + <p>On email systems that allow for "subaddressing" or "detailed + addressing" (e.g., "ken...@ex..."), it is sometimes + desirable to make comparisons against these sub-parts of addresses. + </p> + Example: +<pre><code>require "subaddress"; + +# File mailing list messages (subscribed as "ken+mta-filters"). +if envelope :detail "to" "mta-filters" { fileinto "inbox.ietf-mta-filters"; - } +} - # If a message is not to me (ignoring +detail), junk it. - if not allof (address :user ["to", "cc", "bcc"] "ken", - address :domain ["to", "cc", "bcc"] "example.org") { - discard;}</code></pre> -</li> +# If a message is not to me (ignoring +detail), junk it. +if not allof (address :user ["to", "cc", "bcc"] "ken", address :domain ["to", "cc", "bcc"] "example.org") { + discard; +}</code></pre> + </li> + <li> relational + <p> + The RELATIONAL extension provides relational operators on the + address, envelope, and header tests. This extension also provides a + way of counting the entities in a message header or address field. + </p> + Example: +<pre><code>require ["relational", "comparator-i;ascii-numeric"]; -<li> relational - <p> The RELATIONAL extension provides relational operators on the - address, envelope, and header tests. This extension also provides a - way of counting the entities in a message header or address field. - - </p> - Example: <pre><code>require ["relational", "comparator-i;ascii-numeric"]; - - if header :value "lt" :comparator "i;ascii-numeric" - ["x-priority"] ["3"] - { +if header :value "lt" :comparator "i;ascii-numeric" ["x-priority"] ["3"] { fileinto "Priority"; - } - - elseif address :count "gt" :comparator "i;ascii-numeric" - ["to"] ["5"] - { +} elseif address :count "gt" :comparator "i;ascii-numeric" ["to"] ["5"] { # everything with more than 5 recipients in the "to" field # is considered SPAM fileinto "SPAM"; - } - - elseif address :value "gt" :all :comparator "i;ascii-casemap" - ["from"] ["M"] - { +} elseif address :value "gt" :all :comparator "i;ascii-casemap" ["from"] ["M"] { fileinto "From N-Z"; - } else { +} else { fileinto "From A-M"; - } +} - if allof ( address :count "eq" :comparator "i;ascii-numeric" - ["to", "cc"] ["1"] , - address :all :comparator "i;ascii-casemap" - ["to", "cc"] ["me...@fo...valid"] - { +if allof ( address :count "eq" :comparator "i;ascii-numeric" ["to", "cc"] ["1"] , address :all :comparator "i;ascii-casemap" ["to", "cc"] ["me...@fo...valid"] { fileinto "Only me"; - }</code></pre> +}</code></pre> + </li> -</li> -<li> comparator-i;ascii-numeric - <p>The numeric value can be compared to specific values using the SIEVE relational - [RELATIONAL] extension in conjunction with the "i;ascii-numeric" - comparator, which will test for the presence of a numeric - value at the start of the string, ignoring any additional text in the - string. The additional text can be used to carry implementation - specific details about the tests performed and descriptive comments - about the result. - The "i;ascii-numeric" comparator, MUST be - supported for any implementation of this extension. The comparator - "i;ascii-numeric" MUST support at least 32 bit unsigned integers. - </p> - Example: <pre><code>require ["spamtest", "fileinto", - "relational", "comparator-i;ascii-numeric"]; + <li> comparator-i;ascii-numeric + <p> + The numeric value can be compared to specific values using the SIEVE relational + [RELATIONAL] extension in conjunction with the "i;ascii-numeric" + comparator, which will test for the presence of a numeric + value at the start of the string, ignoring any additional text in the + string. The additional text can be used to carry implementation + specific details about the tests performed and descriptive comments + about the result. + The "i;ascii-numeric" comparator, MUST be + supported for any implementation of this extension. The comparator + "i;ascii-numeric" MUST support at least 32 bit unsigned integers. + </p> + Example: +<pre><code>require ["spamtest", "fileinto", "relational", "comparator-i;ascii-numeric"]; - if spamtest :value "eq" :comparator "i;ascii-numeric" "0" - { +if spamtest :value "eq" :comparator "i;ascii-numeric" "0" { fileinto "INBOX.unclassified"; - } - elsif spamtest :value "ge" :comparator "i;ascii-numeric" "3" - { +} elsif spamtest :value "ge" :comparator "i;ascii-numeric" "3" { fileinto "INBOX.spam-trap"; - }</code></pre> -</li> -<li> regex - <p>Commands that support matching may take the optional tagged argument - ":regex" to specify that a regular expression match should be - performed. The ":regex" match type is compatible with both the "i;octet" and - "i;ascii-casemap" comparators and may be used with them. +}</code></pre> + </li> - </p> - Example:<pre><code>require "regex"; - # Try to catch unsolicited email. - if anyof ( + <li> regex + <p> + Commands that support matching may take the optional tagged argument + ":regex" to specify that a regular expression match should be + performed. The ":regex" match type is compatible with both the "i;octet" and + "i;ascii-casemap" comparators and may be used with them. + </p> + Example: +<pre><code>require "regex"; +# Try to catch unsolicited email. +if anyof ( # if a message is not to me (with optional +detail), - not address :regex ["to", "cc", "bcc"] - "me(\\\\+.*)?@company\\\\.com", + not address :regex ["to", "cc", "bcc"] "me(\\\\+.*)?@company\\\\.com", # or the subject is all uppercase (no lowercase) - header :regex :comparator "i;octet" "subject" - "^[^[:lower:]]+$" ) { - + header :regex :comparator "i;octet" "subject" "^[^[:lower:]]+$" + ) { discard; # junk it - } -</code></pre> -</li> +}</code></pre> + </li> -</ul> + </ul> </div> <div id="Examples" class="section" title="Script Examples"> - - <h3>Script Examples</h3> - <p> <a href="http://wiki.fastmail.fm/index.php/SieveVacation">Vacation Examples</a> </p> @@ -324,7 +308,6 @@ </div> <div id="Technical" class="section" title="Technical Overview Links"> - <h3>Technical Overview Links</h3> <ul> <li> <a href="http://www.rfc-archive.org/getrfc.php?rfc=3598"> Modified: WebSieve/trunk/src/webapp/helpToc.xsl =================================================================== --- WebSieve/trunk/src/webapp/helpToc.xsl 2006-04-19 16:23:52 UTC (rev 115) +++ WebSieve/trunk/src/webapp/helpToc.xsl 2006-04-19 19:43:45 UTC (rev 116) @@ -18,17 +18,18 @@ ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --> <xsl:stylesheet version="1.0" - xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > + <xsl:output method="xml" omit-xml-declaration="yes"/> <xsl:template match="//body"> <ul> - <xsl:apply-templates select="./div[@class='section']"/> + <xsl:apply-templates select="./div[@class='section']" mode="toc"/> </ul> + <xsl:apply-templates select="./div[@class='section']" mode="body"/> </xsl:template> - <xsl:template match="div[@class='section']"> + <xsl:template match="div[@class='section']" mode="toc"> <li> <a> <xsl:attribute name="href"> @@ -39,10 +40,58 @@ </a> <xsl:if test="./div[@class='section']"> <ul> - <xsl:apply-templates select="./div[@class='section']"/> + <xsl:apply-templates select="./div[@class='section']" mode="toc"/> </ul> </xsl:if> </li> </xsl:template> + + <xsl:template match="div[@class='section']" mode="body"> + <div> + <xsl:apply-templates select="." mode="title"/> + <a> + <xsl:attribute name="name"> + <xsl:value-of select="@id"/> + </xsl:attribute> + <xsl:text> </xsl:text> + </a> + <xsl:apply-templates mode="body"/> + </div> + </xsl:template> + + <xsl:template match="div[count(ancestor-or-self::div[@class='section']) = 1]" mode="title"> + <h1> + <xsl:value-of select="@title"/> + </h1> + </xsl:template> + + <xsl:template match="div[count(ancestor-or-self::div[@class='section']) = 2]" mode="title"> + <h2> + <xsl:value-of select="@title"/> + </h2> + </xsl:template> + + <xsl:template match="div[count(ancestor-or-self::div[@class='section']) = 3]" mode="title"> + <h3> + <xsl:value-of select="@title"/> + </h3> + </xsl:template> + + <xsl:template match="div[count(ancestor-or-self::div[@class='section']) = 4]" mode="title"> + <h4> + <xsl:value-of select="@title"/> + </h4> + </xsl:template> + + <xsl:template match="div[count(ancestor-or-self::div[@class='section']) = 5]" mode="title"> + <h5> + <xsl:value-of select="@title"/> + </h5> + </xsl:template> + + <xsl:template match="@*|node()" mode="body"> + <xsl:copy> + <xsl:apply-templates select="@*|node()" mode="body"/> + </xsl:copy> + </xsl:template> </xsl:stylesheet> - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |