/*
* 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.util.Locale;
import java.util.ResourceBundle;
import java.util.regex.Pattern;
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.context.FilterContext;
/*
* The paragraph filter finds any text between two empty lines and inserts a
* <p/> @author stephan @team sonicteam
*
* @version $Id: ParagraphFilter.java 4158 2005-11-25 23:25:19Z
* ian@caret.cam.ac.uk $
*/
public class ParagraphFilter implements Filter, CacheFilter
{
private static Log log = LogFactory.getLog(ParagraphFilter.class);
private InitialRenderContext initialContext;
private String breaksRE;
private String replaceFirst;
private String replaceLast;
private String patternFristRE;
private String patternLastRE;
private String replaceAll;
public String filter(String input, FilterContext context)
{
return simpleFilter(input,context);
}
public String simpleFilter(String input, FilterContext context)
{
log.debug("Paragraph Filter Input " + input);
Pattern patternBreaks = Pattern.compile(breaksRE);
// attempts to locate lin breaks in the content with ([ \t\r]*[\n]){2}
String[] p = patternBreaks.split(input);
if (p.length == 1)
{
// only 1, therefor no embeded paragraphs
return input;
}
StringBuffer sb = new StringBuffer();
int nsplits = 0;
for (int i = 0; i < p.length; i++)
{
if (nsplits == 0)
{
sb.append(replaceFirst);
nsplits++;
}
else
{
sb.append(replaceAll);
nsplits++;
}
sb.append(p[i]);
}
if (nsplits > 0)
{
sb.append(replaceLast);
nsplits++;
}
String output = sb.toString();
log.debug("Paragraph Filter Input " + output);
return output;
}
public String complexFilter(String input, FilterContext context)
{
log.debug("Paragraph Filter Input " + input);
Pattern patternBreaks = Pattern.compile(breaksRE);
// attempts to locate lin breaks in the content with ([ \t\r]*[\n]){2}
String[] p = patternBreaks.split(input);
if (p.length == 1)
{
// only 1, therefor no embeded paragraphs
return input;
}
StringBuffer sb = new StringBuffer();
int nsplits = 0;
// find the last > in the first paragraph
int ins = p[0].lastIndexOf(">");
if (ins > 0 && ins + 1 < p[0].length())
{
// add all upto the last > into the buffer
sb.append(p[0].substring(0, ins + 1));
// then put <p class=\"paragraph\">
sb.append(replaceFirst);
nsplits++;
// then append the remainder
sb.append(p[0].substring(ins + 1));
}
else
{
sb.append(p[0]);
}
for (int i = 1; i < p.length - 1; i++)
{
// for all the following, add in </p><p class=\"paragraph\">
if (nsplits == 0)
{
sb.append(replaceFirst);
nsplits++;
}
else
{
sb.append(replaceAll);
nsplits++;
}
sb.append(p[i]);
}
// in the last block find fidn the first <
ins = p[p.length - 1].indexOf("<");
if (ins > 0)
{
// put the standard line para blreak block in </p><p
// class=\"paragraph\">
if (nsplits == 0)
{
sb.append(replaceFirst);
nsplits++;
}
else
{
sb.append(replaceAll);
nsplits++;
}
// append the first part of the last block
sb.append(p[p.length - 1].substring(0, ins - 1));
// append the last seperator </p>
if (nsplits > 0)
{
sb.append(replaceLast);
nsplits++;
}
// append the remainder block
sb.append(p[p.length - 1].substring(ins - 1));
}
else if (ins == 0)
{
// found "<" inposition found in last block so do </p>
if (nsplits > 0)
{
sb.append(replaceLast);
nsplits++;
}
sb.append(p[p.length - 1]);
}
else
{
// append the last </p>
if (nsplits > 0)
{
sb.append(replaceLast);
nsplits++;
}
sb.append(p[p.length - 1]);
}
String output = sb.toString();
log.debug("Paragraph Filter Input " + output);
return output;
}
public String[] replaces()
{
return FilterPipe.NO_REPLACES;
}
public String[] before()
{
return FilterPipe.EMPTY_BEFORE;
}
public void setInitialContext(InitialRenderContext context)
{
initialContext = context;
ResourceBundle outputMessages = getOutputBundle();
ResourceBundle inputMessages = getInputBundle();
breaksRE = inputMessages.getString("filter.paragraph.breaks.match");
replaceAll = outputMessages.getString("filter.paragraph.breaks.print");
replaceFirst = outputMessages.getString("filter.paragraph.first.print");
replaceLast = outputMessages.getString("filter.paragraph.last.print");
patternFristRE = inputMessages
.getString("filter.paragraph.first.match");
patternLastRE = inputMessages.getString("filter.paragraph.last.match");
}
public String getDescription()
{
return "Hand Coded paragraph filter";
}
protected ResourceBundle getInputBundle()
{
Locale inputLocale = (Locale) initialContext
.get(RenderContext.INPUT_LOCALE);
String inputName = (String) initialContext
.get(RenderContext.INPUT_BUNDLE_NAME);
return ResourceBundle.getBundle(inputName, inputLocale);
}
protected ResourceBundle getOutputBundle()
{
String outputName = (String) initialContext
.get(RenderContext.OUTPUT_BUNDLE_NAME);
Locale outputLocale = (Locale) initialContext
.get(RenderContext.OUTPUT_LOCALE);
return ResourceBundle.getBundle(outputName, outputLocale);
}
}
/*
* private static Log log = LogFactory.getLog(ParagraphFilter.class); private
* String printFirst; private String printNext; private Pattern matchPattern;
* protected String getLocaleKey() { return "filter.paragraph"; } protected
* boolean isSingleLine() { return false; } public String filter(String input,
* FilterContext context) { String result = input; System.err.println("Using
* "+matchPattern.getRegex()+" replacing with "+printFirst+" then "+printNext);
* try { Matcher matcher = Matcher.create(result, matchPattern); Substitution s =
* new Substitution() { boolean firstMatch = true; public void
* handleMatch(StringBuffer buffer, MatchResult result) { if ( firstMatch ) {
* buffer.append(printFirst); firstMatch = false; } else {
* buffer.append(printNext); } } }; result = matcher.substitute(s); //
* Util.substitute(matcher, p, new Perl5Substitution(s, interps), result,
* limit); } catch (Exception e) { //log.warn("<span class=\"error\">Exception</span>: " +
* this + ": " + e); log.warn("Exception for: " + this+" "+e); } catch (Error
* err) { //log.warn("<span class=\"error\">Error</span>: " + this + ": " +
* err); log.warn("Error for: " + this); err.printStackTrace(); } return result; }
* public void setInitialContext(InitialRenderContext context) {
* super.setInitialContext(context); clearRegex(); ResourceBundle outputMessages =
* getOutputBundle(); ResourceBundle inputMessages = getInputBundle(); String
* match = inputMessages.getString(getLocaleKey()+".match"); printFirst =
* outputMessages.getString(getLocaleKey()+".print.1"); printNext =
* outputMessages.getString(getLocaleKey()+".print.2"); try {
* org.radeox.regex.Compiler compiler = org.radeox.regex.Compiler.create();
* compiler.setMultiline(isSingleLine() ? RegexReplaceFilter.SINGLELINE :
* RegexReplaceFilter.MULTILINE); matchPattern = compiler.compile(match); }
* catch (Exception e) { log.warn("bad pattern: " + match + " -> " +
* printFirst+" "+e); } } }
*/