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