--- src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java 2006-07-12 14:09:57.000000000 +0300 +++ src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java 2006-07-31 10:37:37.000000000 +0300 @@ -65,34 +65,45 @@ formatter.applyPattern(outputTemplate); } - public String handleMatch(MatchResult result, FilterContext context) { - String id = null; - String level = result.group(1); - String text = result.group(3); - String numbering = ""; - - RenderContext rcontext = context.getRenderContext(); - XWikiContext xcontext = ((XWikiRadeoxRenderEngine) rcontext.getRenderEngine()).getContext(); - + 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); - } - int occurence = 0; - for (Iterator iter = processedHeadings.iterator(); iter.hasNext();) if (iter.next().equals(text)) occurence++; - id = TOCGenerator.makeHeadingID(text, occurence, xcontext); - processedHeadings.add(text); - + 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}); - } + 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}); + } } --- src/main/java/com/xpn/xwiki/util/TOCGenerator.java 2006-07-12 14:09:59.000000000 +0300 +++ src/main/java/com/xpn/xwiki/util/TOCGenerator.java 2006-07-31 10:40:27.000000000 +0300 @@ -33,6 +33,7 @@ import org.apache.commons.collections.OrderedMap; import org.apache.commons.collections.map.ListOrderedMap; +import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.web.Utils; @@ -115,7 +116,9 @@ public static String makeHeadingID (String text, int occurence, XWikiContext context) { // Encode to convert unsafe chars text = Utils.encode(text.trim(), context); - + text = "H" + XWiki.getURLEncoded(text); + text = text.replaceAll("[\\+|%]", ""); + if (occurence > 0) { return text + "-" + occurence; } else { --- src/main/resources/radeox_markup_xwiki.properties 2006-07-12 14:10:01.000000000 +0300 +++ src/main/resources/radeox_markup_xwiki.properties 2006-07-31 10:43:46.000000000 +0300 @@ -22,4 +22,4 @@ # Add anchor and optional TOC numbering into headings filter.heading.match=^[\\p{Space}]*(1(\\.1)*)[\\p{Space}]+(.*?)$ -filter.heading.print=

{2}{3}

\ No newline at end of file +filter.heading.print={2}{3} \ No newline at end of file