r1172 - in xwiki/trunk/src/main/java/com/xpn/xwiki: render/filter util

Sergiu Dumitriu sdumitriu at users.forge.objectweb.org
Sat Aug 19 03:15:19 CEST 2006


Author: sdumitriu
Date: 2006-08-19 03:15:18 +0200 (Sat, 19 Aug 2006)
New Revision: 1172

Modified:
   xwiki/trunk/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/util/TOCGenerator.java
Log:
Fix for Headings id generator. Because the generated element id-s are further parsed, headings with markup (--, for example) would cause invalid html code.

Example:

1.1 an *important* subtitle
becomes:
<h3 class="heading-1-1"><span id="an<strong>important</strong>subtitle">an <strong>important</strong> subtitle</span></h3>
which would be rendered:
important subtitle">an important subtitle




Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java	2006-08-18 23:01:05 UTC (rev 1171)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java	2006-08-19 01:15:18 UTC (rev 1172)
@@ -28,6 +28,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.radeox.api.engine.context.InitialRenderContext;
 import org.radeox.api.engine.context.RenderContext;
 import org.radeox.filter.CacheFilter;
@@ -44,66 +46,69 @@
  * A customized version of Radeox Heading Filter
  */
 public class XWikiHeadingFilter extends LocaleRegexTokenFilter implements CacheFilter {
-  private final String TOC_NUMBERED = "tocNumbered";
-  private final String TOC_DATA = "tocData";
-  
-  private MessageFormat formatter;
+	private static Log log = LogFactory.getFactory().getInstance(XWikiHeadingFilter.class);
 
+	private final String TOC_NUMBERED = "tocNumbered";
+	private final String TOC_DATA = "tocData";
 
-  protected String getLocaleKey() {
-    return "filter.heading";
-  }
+	private MessageFormat formatter;
 
-  public void handleMatch(StringBuffer buffer, MatchResult result, FilterContext context) {
-    buffer.append(handleMatch(result, context));
-  }
 
-  public void setInitialContext(InitialRenderContext context) {
-    super.setInitialContext(context);
-    String outputTemplate = outputMessages.getString(getLocaleKey()+".print");
-    formatter = new MessageFormat("");
-    formatter.applyPattern(outputTemplate);
- }
+	protected String getLocaleKey() {
+		return "filter.heading";
+	}
 
-  public String handleMatch(MatchResult result, FilterContext context) {
-    String id = null;
-    String level = result.group(1);
-	   int level_i = (level.length()+3)/2;
-	   String hlevel = (level_i <= 6 ? level_i : 6)+ "";
-    String text = result.group(3);
-    String numbering = "";
-    
-    RenderContext rcontext = context.getRenderContext();
-    XWikiContext xcontext  = ((XWikiRadeoxRenderEngine) rcontext.getRenderEngine()).getContext();
-    
-    // generate unique ID of the heading  
-    List processedHeadings = (List) rcontext.get("processedHeadings");
-    if (processedHeadings == null) {
-      processedHeadings = new ArrayList();
-      rcontext.set("processedHeadings", processedHeadings);
-    }
-	   boolean isIdOk = false;
-	   id = TOCGenerator.makeHeadingID(text, 0, xcontext);
-	   while(!isIdOk){
-    int occurence = 0;
-	     for (Iterator iter = processedHeadings.iterator(); iter.hasNext();){
-	       if (iter.next().equals(id)) occurence++;
-	     }
-	     id = TOCGenerator.makeHeadingID(id, occurence, xcontext);
-	     if(occurence == 0){
-	       isIdOk = true;
-	     }
-	   }
-	   processedHeadings.add(id);
-    
-    //  add numbering if the flag is set
-    if (xcontext.containsKey(TOC_NUMBERED) && ((Boolean)xcontext.get(TOC_NUMBERED)).booleanValue()) {
-      if (xcontext.containsKey(TOC_DATA)) {
-        Map tocEntry = (Map) ((Map) xcontext.get(TOC_DATA)).get(id);
-        if (tocEntry != null) numbering = (String) tocEntry.get(TOCGenerator.TOC_DATA_NUMBERING) + " ";
-      }
-    }
-    
-		   return formatter.format(new Object[]{id, level.replace('.', '-'), numbering, text, hlevel});
-  } 
+	public void handleMatch(StringBuffer buffer, MatchResult result, FilterContext context) {
+		buffer.append(handleMatch(result, context));
+	}
+
+	public void setInitialContext(InitialRenderContext context) {
+		super.setInitialContext(context);
+		String outputTemplate = outputMessages.getString(getLocaleKey()+".print");
+		formatter = new MessageFormat("");
+		formatter.applyPattern(outputTemplate);
+	}
+
+	public String handleMatch(MatchResult result, FilterContext context) {
+		String id = null;
+		String level = result.group(1);
+		int level_i = (level.length()+3)/2;
+		String hlevel = (level_i <= 6 ? level_i : 6)+ "";
+		String text = result.group(3);
+		String numbering = "";
+
+		RenderContext rcontext = context.getRenderContext();
+		XWikiContext xcontext  = ((XWikiRadeoxRenderEngine) rcontext.getRenderEngine()).getContext();
+
+		// generate unique ID of the heading  
+		List processedHeadings = (List) rcontext.get("processedHeadings");
+		if (processedHeadings == null) {
+			processedHeadings = new ArrayList();
+			rcontext.set("processedHeadings", processedHeadings);
+		}
+		log.error("1");
+		boolean isIdOk = false;
+		id = TOCGenerator.makeHeadingID(text, 0, xcontext);
+		while(!isIdOk){
+			int occurence = 0;
+			for (Iterator iter = processedHeadings.iterator(); iter.hasNext();){
+				if (iter.next().equals(id)) occurence++;
+			}
+			id = TOCGenerator.makeHeadingID(id, occurence, xcontext);
+			if(occurence == 0){
+				isIdOk = true;
+			}
+		}
+		processedHeadings.add(id);
+
+		//  add numbering if the flag is set
+		if (xcontext.containsKey(TOC_NUMBERED) && ((Boolean)xcontext.get(TOC_NUMBERED)).booleanValue()) {
+			if (xcontext.containsKey(TOC_DATA)) {
+				Map tocEntry = (Map) ((Map) xcontext.get(TOC_DATA)).get(id);
+				if (tocEntry != null) numbering = (String) tocEntry.get(TOCGenerator.TOC_DATA_NUMBERING) + " ";
+			}
+		}
+
+		return formatter.format(new Object[]{id, level.replace('.', '-'), numbering, text, hlevel});
+	}
 }

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/util/TOCGenerator.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/util/TOCGenerator.java	2006-08-18 23:01:05 UTC (rev 1171)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/util/TOCGenerator.java	2006-08-19 01:15:18 UTC (rev 1172)
@@ -115,9 +115,9 @@
 
   public static String makeHeadingID (String text, int occurence, XWikiContext context) {
     // Encode to convert unsafe chars
-    text = Utils.encode(text.trim(), context);
+    //text = Utils.encode(text.trim(), context);
     text = "H" + XWiki.getURLEncoded(text);
-    text = text.replaceAll("[\\+|%]", "");
+    text = text.replaceAll("[^a-zA-Z0-9]", "");
         
     if (occurence > 0) {
       return text + "-" + occurence;





More information about the Xwiki-notifications mailing list