1 10 package org.mmbase.util.transformers; 11 12 import java.util.regex.Pattern ; 13 import java.util.regex.Matcher ; 14 15 import org.mmbase.util.transformers.*; 16 import org.mmbase.util.functions.Parameter; 17 import org.mmbase.util.functions.Parameters; 18 import org.mmbase.util.logging.Logger; 19 import org.mmbase.util.logging.Logging; 20 21 35 36 public class CodeSampleFactory implements ParameterizedTransformerFactory { 37 38 private final static Logger log = Logging.getLoggerInstance(CodeSampleFactory.class); 39 40 private final static Parameter[] PARAMS = new Parameter[] { 41 new Parameter("starttag", String .class, "<pre>"), 42 new Parameter("closetag", String .class, ""), 43 new Parameter("escapecode", String .class, "text/html"), new Parameter("escaperest", String .class, ""), 46 }; 47 48 public Parameters createParameters() { 49 return new Parameters(PARAMS); 50 } 51 52 public Transformer createTransformer(Parameters parameters) { 53 parameters.checkRequiredParameters(); 54 55 return new CodeSample( (String ) parameters.get("starttag"), 56 (String ) parameters.get("closetag"), 57 (String ) parameters.get("escapecode"), 58 (String ) parameters.get("escaperest") ); 59 } 60 61 protected class CodeSample extends StringTransformer { 62 private String starttag = "<pre>"; private String closetag = ""; 64 private String escapecode = "text/html"; 65 private String escaperest = ""; 67 71 public CodeSample(String st, String ct, String ec, String er) { 72 starttag = st; 73 closetag = ct; 74 escapecode = ec; 75 escaperest = er; 76 } 77 78 86 public String transform(String str) { 87 return transform(str, starttag, closetag, escapecode, escaperest); 88 } 89 90 102 public String transform(String str, String starttag, String closetag, String escapecode, String escaperest) { 103 StringBuffer result = new StringBuffer (); 104 105 String stag = starttag; 106 String ctag = closetag; 107 if (ctag.equals("")) { ctag = "</" + starttag.substring(1, starttag.length()); 109 } 110 111 Pattern sp = Pattern.compile("\\Q" + stag + "\\E", Pattern.DOTALL); 112 Pattern cp = Pattern.compile("\\Q" + ctag + "\\E", Pattern.DOTALL); 113 Matcher stm = sp.matcher(str); Matcher ctm = cp.matcher(str); 116 int s = 0; while (stm.find() && ctm.find()) { 118 String normalStr = ""; normalStr = str.substring(s, stm.start(0) ); 124 if (log.isDebugEnabled()) log.debug("Found rest str: " + normalStr); 125 normalStr = transformPart(normalStr, escaperest); 126 result.append(normalStr).append(stag); 128 s = ctm.end(0); 130 String codeStr = str.substring(stm.end(0), ctm.start(0)); if (log.isDebugEnabled()) log.debug("Found code str: " + codeStr); 132 codeStr = transformPart(codeStr, escapecode); 133 134 result.append(codeStr).append(ctag); 135 } 136 137 String rest = str.substring(s, str.length()); 140 result.append( transformPart(rest, escaperest) ); 141 if (s == 0) { 142 if (log.isDebugEnabled()) log.debug("No match with the tags '" + stag + "' and '" + ctag + "'"); 143 } 144 return result.toString(); 145 } 146 147 148 158 public String transformPart(String str, String escaper) { 159 if (escaper.equals("p")) { 160 str = XmlField.richToHTMLBlock(str, true, true); 161 } else if (escaper.equals("pp")) { 162 str = XmlField.richToHTMLBlock(str); 163 } else if (escaper.equals("p-ommit-surrounding")) { 164 str = XmlField.richToHTMLBlock(str, true, false); 165 } else if (escaper.equals("pp-ommit-surrounding")) { 166 str = XmlField.richToHTMLBlock(str, false, false); 167 } else if (escaper.equals("inline")) { 168 str = XmlField.poorToHTMLInline(str); 169 } else if (escaper.equals("text/html") || escaper.equals("text/xml")) { 170 str = Xml.XMLEscape(str); 171 } else { str = str; 173 } 175 if (log.isDebugEnabled()) log.debug("Returning: " + str); 176 return str; 177 } 178 179 } 180 } 181 | Popular Tags |