/*
* This file is part of "SnipSnap Radeox Rendering Engine".
*
* Copyright (c) 2002 Stephan J. Schmidt, Matthias L. Jugel
* All Rights Reserved.
*
* Please visit http://radeox.org/ for updates and contact.
*
* --LICENSE NOTICE--
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* --LICENSE NOTICE--
*/
package org.radeox.filter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.radeox.filter.context.FilterContext;
import org.radeox.filter.regex.LocaleRegexTokenFilter;
import org.radeox.regex.MatchResult;
/*
* Listfilter checks for lists in in its input. These are transformed to output
* lists, e.g. in HTML. Recognices different lists like numbered lists,
* unnumbered lists, greek lists, alpha lists etc. @credits nested list support
* by Davor Cubranic @author stephan @team sonicteam
*
* @version $Id: ListFilter.java 98611 2011-09-26 13:08:13Z steve.swinsburg@gmail.com $
*/
public class ListFilter extends LocaleRegexTokenFilter implements CacheFilter
{
private static Log log = LogFactory.getLog(ListFilter.class);
private final static Map openList = new HashMap();
private final static Map closeList = new HashMap();
private static final String UL_CLOSE = "</ul>";
private static final String OL_CLOSE = "</ol>";
protected String getLocaleKey()
{
return "filter.list";
}
protected boolean isSingleLine()
{
return false;
}
public ListFilter()
{
super();
openList.put(new Character('-'), "<ul class=\"minus\">");
openList.put(new Character('*'), "<ul class=\"star\">");
openList.put(new Character('#'), "<ol>");
openList.put(new Character('i'), "<ol class=\"roman\">");
openList.put(new Character('I'), "<ol class=\"ROMAN\">");
openList.put(new Character('a'), "<ol class=\"alpha\">");
openList.put(new Character('A'), "<ol class=\"ALPHA\">");
openList.put(new Character('g'), "<ol class=\"greek\">");
openList.put(new Character('h'), "<ol class=\"hiragana\">");
openList.put(new Character('H'), "<ol class=\"HIRAGANA\">");
openList.put(new Character('k'), "<ol class=\"katakana\">");
openList.put(new Character('K'), "<ol class=\"KATAKANA\">");
openList.put(new Character('j'), "<ol class=\"HEBREW\">");
openList.put(new Character('1'), "<ol>");
closeList.put(new Character('-'), UL_CLOSE);
closeList.put(new Character('*'), UL_CLOSE);
closeList.put(new Character('#'), OL_CLOSE);
closeList.put(new Character('i'), OL_CLOSE);
closeList.put(new Character('I'), OL_CLOSE);
closeList.put(new Character('a'), OL_CLOSE);
closeList.put(new Character('A'), OL_CLOSE);
closeList.put(new Character('1'), OL_CLOSE);
closeList.put(new Character('g'), OL_CLOSE);
closeList.put(new Character('G'), OL_CLOSE);
closeList.put(new Character('h'), OL_CLOSE);
closeList.put(new Character('H'), OL_CLOSE);
closeList.put(new Character('k'), OL_CLOSE);
closeList.put(new Character('K'), OL_CLOSE);
closeList.put(new Character('j'), OL_CLOSE);
};
public void handleMatch(StringBuffer buffer, MatchResult result,
FilterContext context)
{
try
{
BufferedReader reader = new BufferedReader(new StringReader(result
.group(0)));
// System.err.println("match="+result.group(0));
addList(buffer, reader);
}
catch (Exception e)
{
log.warn("ListFilter: unable get list content", e);
}
}
/**
* Adds a list to a buffer
*
* @param buffer
* The buffer to write to
* @param reader
* Input is read from this Reader
*/
private void addList(StringBuffer buffer, BufferedReader reader)
throws IOException
{
char[] lastBullet = new char[0];
String line = null;
boolean goneUp = false;
while ((line = reader.readLine()) != null)
{
// no nested list handling, trim lines:
line = line.trim();
if (line.length() == 0)
{
continue;
}
// if the line doesn't contain a space ignore it. (it shouldn't have
// matched!)
int bulletEnd = line.indexOf(' ');
if (bulletEnd < 1)
{
continue;
}
if (line.charAt(bulletEnd - 1) == '.')
{
bulletEnd--;
}
char[] bullet = line.substring(0, bulletEnd).toCharArray();
// Logger.log("found bullet: ('" + new String(lastBullet) + "') '" +
// new String(bullet) + "'");
// check whether we find a new list
int sharedPrefixEnd;
for (sharedPrefixEnd = 0;; sharedPrefixEnd++)
{
if (bullet.length <= sharedPrefixEnd
|| lastBullet.length <= sharedPrefixEnd
|| +bullet[sharedPrefixEnd] != lastBullet[sharedPrefixEnd])
{
break;
}
}
goneUp = false;
for (int i = sharedPrefixEnd; i < lastBullet.length; i++)
{
// Logger.log("closing " + lastBullet[i]);
if (lastBullet[i] != '.')
{
buffer.append("</li>").append(
closeList.get(new Character(lastBullet[i])))
.append("\n");
}
}
for (int i = sharedPrefixEnd; i < bullet.length; i++)
{
// Logger.log("opening " + bullet[i]);
if (bullet[i] != '.')
{
buffer.append(openList.get(new Character(bullet[i])))
.append("<li>");
}
goneUp = true;
}
if (!goneUp)
{
buffer.append("</li>\n<li>");
}
buffer.append(line.substring(line.indexOf(' ') + 1));
lastBullet = bullet;
}
for (int i = lastBullet.length - 1; i >= 0; i--)
{
// Logger.log("closing " + lastBullet[i]);
if (lastBullet[i] != '.')
{
buffer.append("</li>").append(
closeList.get(new Character(lastBullet[i])));
}
}
buffer.append('\n');
}
}