Hi Ross.

Ross Gardler:
> That would be good, but don't hold your breath. Patches welcome (and 
> help available on the dev list).

The attached patch to Cocoon should do something like I requested.  It's
completely untested, and I didn't even compile it (it wasn't immediately
obvious to me how to use Cocoon's build system, since I know nothing of
Maven).

It adds a parameter that can be given to the LinkRewriterTransformer to
tell it to let a fragment identifier pass through, or not.

I made the default "false", so that fragids are not given to the
rewriter, since I imagine that would be the more common case.

Also, I'm not sure why there are two copies of the link rewriter stuff
in Cocoon's repository (one under src/blocks/linkrewriter, and another
under blocks/cocoon-linkrewriter); they seem to be identical except for
the $Id$ string.

Thanks,

Cameron

-- 
 Cameron McCormack                      ICQ: 26955922
 cam (at) mcc.id.au                     MSN: cam (at) mcc.id.au
 http://mcc.id.au/                      JBR: heycam (at) jabber.org
--- 
src/blocks/linkrewriter/trunk/java/org/apache/cocoon/transformation/LinkRewriterTransformer.java
    2006-05-10 10:19:39.000000000 +1000
+++ 
src/blocks/linkrewriter/trunk/java/org/apache/cocoon/transformation/LinkRewriterTransformer.java.new
        2006-05-10 10:19:03.000000000 +1000
@@ -172,6 +172,13 @@
  *   <dd>String to use for links with a correct InputModule prefix, but no 
value
  *   therein.  Defaults to the original URI.</dd>
  *
+ *   <dt>fragid-passthrough</dt>
+ *   <dd>Boolean that, when <code>true</code>, specifies that a fragment
+ *   identifier on the URI reference will be passed through to the rewriter,
+ *   and when <code>false</code>, specifies that it will be stripped off 
+ *   before being sent to the rewriter, and then appended to the rewritten
+ *   URI.</dd>
+ *
  *   <dt>namespace-uri</dt>
  *   <dd>The namespace uri of elements whose attributes are considered for
  *   transformation. Defaults to the empty namespace ("").</dd>
@@ -240,6 +247,7 @@
     private String origInSchemes;
     private String origOutSchemes;
     private String origNamespaceURI;
+    private String origFragidPassthrough;
 
     /**
      * A map where keys are those attributes which are considered 'links'.
@@ -275,6 +283,13 @@
     private Set outSchemes;
 
     /**
+     * Whether to pass the fragment identifier part of the URI reference
+     * to the transformer, or split it off and append it back to the
+     * transformed URI.
+     */
+    private boolean fragidPassthrough;
+
+    /**
      * A map of attributes considered 'links' and corresponding RE expression
      * or NO_REGEXP object. Recreated once per invocation or copied from
      * origLinkAttrs based on setup() method parameters.
@@ -295,6 +310,7 @@
         this.origBadLinkStr = conf.getChild("bad-link-str").getValue(null);
         this.origInSchemes = conf.getChild("schemes").getValue("");
         this.origOutSchemes = conf.getChild("exclude-schemes").getValue("http 
https ftp news mailto");
+        this.origFragidPassthrough = 
conf.getChild("fragid-passthrough").getValueAsBoolean(false);
 
         this.origNamespaceURI = 
conf.getChild("namespace-uri").getValue(NAMESPACE);
 
@@ -364,6 +380,8 @@
         this.inSchemes = split(parameters.getParameter("schemes", 
this.origInSchemes), " ");
         this.outSchemes = split(parameters.getParameter("exclude-schemes", 
this.origOutSchemes), " ");
 
+        this.fragidPassthrough = 
parameters.getParameterAsBoolean("fragid-passthrough", 
this.origFragidPassthrough);
+
         this.linkAttrs = this.origLinkAttrs;
         if (parameters.isParameter("link-attrs")) {
             try {
@@ -378,6 +396,7 @@
             getLogger().debug("link-attrs = " + linkAttrs);
             getLogger().debug("schemes = " + inSchemes);
             getLogger().debug("exclude-schemes = " + outSchemes);
+            getLogger().debug("fragid-passthrough = " + fragidPassthrough);
             getLogger().debug("namespace-uri = " + namespaceURI);
         }
 
@@ -542,10 +561,19 @@
      */
     private String createTransformedLink(String oldLink) {
         String newLink = null;
-        int i = oldLink.indexOf(":");
+        int i = oldLink.indexOf(':');
         if (i != -1) {
             String scheme = oldLink.substring(0, i);
-            String addr = oldLink.substring(i + 1);
+            String addr;
+            String fragid;
+            int j = oldLink.indexOf('#');
+            if (fragidPassthrough || j == -1) {
+                addr = oldLink.substring(i + 1);
+                fragid = null;
+            } else {
+                addr = oldLink.substring(i + 1, j - i - 1);
+                fragid = oldLink.substring(j);
+            }
             if (outSchemes.contains(scheme)) {
                 if (getLogger().isDebugEnabled()) {
                     getLogger().debug("Ignoring link '" + oldLink + "'");
@@ -559,6 +587,9 @@
                                                               scheme,
                                                               addr,
                                                               (badLinkStr != 
null? badLinkStr: scheme + ":" + addr));
+                    if (fragid != null) {
+                        newLink += fragid;
+                    }
                     if (getLogger().isDebugEnabled()) {
                         getLogger().debug("Converted link '" + oldLink + "' to 
'" + newLink + "'");
                     }