⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tocgenerator.java

📁 xwiki 源码
💻 JAVA
字号:
package com.xpn.xwiki.util;

import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.collections.OrderedMap;
import org.apache.commons.collections.map.ListOrderedMap;

import com.xpn.xwiki.XWiki;


public class TOCGenerator {
  public static final String TOC_DATA_NUMBERING = "numbering";
  public static final String TOC_DATA_LEVEL = "level";
  public static final String TOC_DATA_TEXT = "text";
  
  
  public static Map generateTOC(String content, int init, int max, boolean numbered) {
    OrderedMap tocData = ListOrderedMap.decorate(new HashMap());
    List processedHeadings = new ArrayList();
    int previousNumbers[] = { 0, 0, 0, 0, 0, 0, 0 };

    Pattern pattern = Pattern.compile("^[\\p{Space}]*(1(\\.1)*)[\\p{Space}]+(.*?)$", Pattern.MULTILINE);
    Matcher matcher = pattern.matcher(content);
    while (matcher.find()) {
      int level = (matcher.group(1).lastIndexOf("1") + 2) / 2;
      String text = matcher.group(3);
      
      int occurence = 0;
      for (Iterator iter = processedHeadings.iterator(); iter.hasNext();) if (iter.next().equals(text)) occurence++;

      String id = makeHeadingID (text, occurence);
      
      Map tocEntry = new HashMap();
      tocEntry.put(TOC_DATA_LEVEL, new Integer(level));
      tocEntry.put(TOC_DATA_TEXT, text);
      
      if (level >= init && level <= max) {
        if (numbered) {
          String number = "";
          int currentNumber = 0;
          for (int i = previousNumbers.length-1; i >= init; i--) {
            int num = 0;
            int previousNumber = previousNumbers[i];
            // if there is already a number previously assigned to a level
            if (previousNumber > 0) {
              // copy parent level from previous number
              num = previousNumber;
              if (i == level) {
                // increment the number if there was already previous number on the same leaf level
                num = previousNumber + 1;
              } else if (i > level) {
                //reset numbers of all deeper levels
                previousNumbers[i] = 0;
              }
            } else {
              num = 1;
              // incremet the previous number if there was already a number assigned
              // to any of the depper levels
              if (i < level) previousNumbers[i] = previousNumbers[i] + 1;
            }
  
            // construct the string representation of the number
            if (i <= level) {
              if ((number.length()) == 0) {
                // start new number
                number = num + number;
                currentNumber = num;
              } else {
                // append to the existing number
                number = num + "." + number;
              }
            }
          }
          // remeber the number for this leaf level
          previousNumbers[level] = currentNumber;
  
          tocEntry.put(TOC_DATA_NUMBERING, number);
        }
        tocData.put(id, tocEntry);
        processedHeadings.add(text);
      }
    }
    return tocData;
  }

  public static String makeHeadingID (String text, int occurence) {
    // Encode to convert unsafe chars
    text = XWiki.getURLEncoded(text);
    
    if (occurence > 0) {
      return text + "-" + occurence;
    } else {
      return text;
    }
  }
  
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -