/* * * Please visit http://radeox.org/ for updates and contact. * * --LICENSE NOTICE-- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any * later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --LICENSE NOTICE-- */ package org.plog4u.wiki.macro.code; import java.util.HashMap; import java.util.HashSet; import org.radeox.filter.context.FilterContext; import org.radeox.macro.code.SourceCodeFormatter; /* * Abstract C++ syntax based code filter * */ abstract public class AbstractCPPBasedCodeFilter implements SourceCodeFormatter { public static void appendChar(StringBuffer result, char currentChar) { switch (currentChar) { case '\"' : // special html escape character result.append("""); break; case '<' : // special html escape character result.append("<"); break; case '>' : // special html escape character result.append(">"); break; case '&' : // special html escape character result.append("&"); break; case '\'' : // special html escape character result.append("'"); break; default : result.append(currentChar); } } public static void createHashMap(HashMap map, String str) { map.put(str, ""+str+""); } public AbstractCPPBasedCodeFilter() { } private int appendIdentifier( String input, int identStart, int currentPosition, HashMap keywords, HashSet objectWords, StringBuffer result) { String originalIdent = input.substring(identStart, --currentPosition); String keywordIdent = originalIdent; if (!isKeywordLowerCase()) { keywordIdent = keywordIdent.toLowerCase(); } String keywordValue = (String) keywords.get(keywordIdent); if (keywordValue!=null) { result.append(keywordValue); // } else if (objectWords != null && objectWords.contains(originalIdent)) { // result.append(""); // result.append(originalIdent); // result.append(""); } else { result.append(originalIdent); } return currentPosition; } public String filter(String input, FilterContext context) { char[] source = input.toCharArray(); int currentPosition = 0; int identStart = 0; char currentChar = ' '; HashMap keywordsSet = getKeywordSet(); HashSet objectsSet = getObjectSet(); StringBuffer result = new StringBuffer(input.length() + input.length() / 4); boolean identFound = false; result.append(""); try { while (true) { currentChar = source[currentPosition++]; // if (currentChar >= 'a' && currentChar <= 'z' && isKeywordLowerCase()) { // identStart = currentPosition - 1; // identFound = true; // // start of identifier ? // while (currentChar >= 'a' && currentChar <= 'z') { // currentChar = source[currentPosition++]; // } // currentPosition = appendIdentifier(input, identStart, currentPosition, keywordsSet, objectsSet, result); // identFound = false; // continue; // while loop // } else if ((currentChar >= 'A' && currentChar <= 'Z') || (currentChar == '_') || (currentChar >= 'a' && currentChar <= 'z')) { identStart = currentPosition - 1; identFound = true; // start of identifier ? while ((currentChar >= 'a' && currentChar <= 'z') || (currentChar >= 'A' && currentChar <= 'Z') || currentChar == '_') { currentChar = source[currentPosition++]; } currentPosition = appendIdentifier(input, identStart, currentPosition, keywordsSet, objectsSet, result); identFound = false; continue; // while loop } else if (currentChar == '\"') { //strings result.append(""); appendChar(result, currentChar); while (currentPosition < input.length()) { currentChar = source[currentPosition++]; appendChar(result, currentChar); if (currentChar == '\"' && source[currentPosition - 2] != '\\') { break; } } result.append(""); continue; } else if (currentChar == '/' && currentPosition < input.length() && source[currentPosition] == '/') { // line comment result.append(""); appendChar(result, currentChar); appendChar(result, source[currentPosition++]); while (currentPosition < input.length()) { currentChar = source[currentPosition++]; appendChar(result, currentChar); if (currentChar == '\n') { break; } } result.append(""); continue; } else if (currentChar == '/' && currentPosition < input.length() && source[currentPosition] == '*') { if (currentPosition < (input.length() - 1) && source[currentPosition + 1] == '*') { // javadoc style result.append(""); } else { // multiline comment result.append(""); } appendChar(result, currentChar); appendChar(result, source[currentPosition++]); while (currentPosition < input.length()) { currentChar = source[currentPosition++]; appendChar(result, currentChar); if (currentChar == '/' && source[currentPosition - 2] == '*') { break; } } result.append(""); continue; } else if (currentChar == '<' && isPHPTag() && currentPosition+3 < input.length() && source[currentPosition] == '?' && source[currentPosition+1] == 'p' && source[currentPosition+2] == 'h' && source[currentPosition+3] == 'p') { // php start tag currentPosition++; result.append("<?php"); continue; } else if (currentChar == '?' && isPHPTag() && currentPosition < input.length() && source[currentPosition] == '>') { // php start tag currentPosition += 4; result.append("?>"); continue; } appendChar(result, currentChar); } } catch (IndexOutOfBoundsException e) { if (identFound) { currentPosition = appendIdentifier(input, identStart, currentPosition, keywordsSet, null, result); } } result.append(""); return result.toString(); } /** * @return Returns the KEYWORD_SET. */ abstract public HashMap getKeywordSet(); /** * @return Returns the OBJECT_SET. */ abstract public HashSet getObjectSet(); public int getPriority() { return 0; } /** * @return Returns the KEYWORD_MAP. */ public boolean isKeywordLowerCase() { return true; } /** * */ public boolean isPHPTag() { return false; } }