1 10 11 package org.mmbase.richtext.transformers; 12 13 import org.mmbase.util.transformers.*; 14 15 import java.io.*; 16 import java.util.HashMap ; 17 import java.util.Map ; 18 19 import javax.xml.transform.stream.StreamSource ; 20 import javax.xml.transform.stream.StreamResult ; 21 22 import java.util.regex.*; 23 24 import org.mmbase.util.StringObject; 25 import org.mmbase.util.ResourceLoader; 26 import org.mmbase.util.XSLTransformer; 27 import org.mmbase.richtext.Mmxf; 28 29 30 import org.mmbase.util.logging.Logger; 31 import org.mmbase.util.logging.Logging; 32 33 40 41 public class XmlField extends org.mmbase.util.transformers.XmlField { 42 43 private static final Logger log = Logging.getLoggerInstance(XmlField.class); 44 45 public final static int RICH = 1; 47 public final static int POOR = 2; 48 public final static int BODY = 3; 49 public final static int XML = 4; 50 public final static int WIKI = 12; 51 52 public final static String XML_DOCTYPE = "<!DOCTYPE mmxf PUBLIC \"" + Mmxf.DOCUMENTTYPE_PUBLIC + "\" \"" + Mmxf.DOCUMENTTYPE_SYSTEM + "\">\n"; 54 55 56 private final static String CODING = "UTF-8"; 58 private final static String XML_HEADER = "<?xml version=\"1.0\" encoding=\"" + CODING + "\"?>\n" + XML_DOCTYPE; 60 private final static String XML_TAGSTART = "<mmxf version=\"1.1\" xmlns=\"" + Mmxf.NAMESPACE + "\">"; 61 private final static String XML_TAGEND = "</mmxf>"; 62 63 64 65 66 private static Pattern wikiWrappingAnchor = Pattern.compile("\\[(\\w+):(.*?)\\]"); 67 private static Pattern wikiP = Pattern.compile("<p>\\[(\\w+)\\]"); 68 private static Pattern wikiSection = Pattern.compile("<section><h>\\[(\\w+)\\]"); 69 private static Pattern wikiAnchor = Pattern.compile("\\[(\\w+)\\]"); 70 71 static { 72 org.mmbase.util.Encode.register(XmlField.class.getName()); 73 } 74 75 public static String wikiToXML(String data) { 76 Matcher wrappingAnchors = wikiWrappingAnchor.matcher(prepareDataString(data)); 77 data = wrappingAnchors.replaceAll("<a id=\"$1\">$2</a>"); 78 StringObject obj = new StringObject(data); 79 handleRich(obj, true, false, true); 80 handleFormat(obj, false); 81 String string = obj.toString(); 82 Matcher ps = wikiP.matcher(string); 83 string = ps.replaceAll("<p id=\"$1\">"); 84 Matcher sections = wikiSection.matcher(string); 85 string = sections.replaceAll("<section id=\"$1\"><h>"); 86 Matcher anchors = wikiAnchor.matcher(string); 87 string = anchors.replaceAll("<a id=\"$1\" />"); 88 return string; 89 90 } 91 92 95 96 final static private String xmlBody(String s) { 97 return s.substring(XML_TAGSTART.length(), s.length() - XML_TAGEND.length()); 98 } 99 100 public XmlField() { 101 super(); 102 } 103 public XmlField(int to) { 104 super(to); 105 } 106 107 public Map transformers() { 108 Map h = super.transformers(); 109 h.put("MMXF_RICH", new Config(XmlField.class, RICH, "Converts mmxf to enriched ASCII (can be reversed)")); 110 h.put("MMXF_POOR", new Config(XmlField.class, POOR, "Converts mmxf to enriched ASCII (inversal will not produce <br />'s")); 111 h.put("MMXF_ASCII", new Config(XmlField.class, ASCII, "Converts mmxf to ASCII (cannoted be reversed)")); 112 h.put("MMXF_BODY", new Config(XmlField.class, BODY, "Takes away the surrounding mmxf tags (returns XML)")); 113 h.put("MMXF_XHTML", new Config(XmlField.class, XHTML, "Converts mnxf to piece of XHTML")); 114 h.put("MMXF_MMXF", new Config(XmlField.class, XML, "Only validates the XML with the DTD (when decoding)")); 115 return h; 116 } 117 118 public String transform(String data) { 119 switch (to) { 120 case RICH : 121 case POOR : 122 return XSLTransform("mmxf2rich.xslt", data); 123 case WIKI : 124 return XSLTransform("2rich.xslt", data); 125 case XHTML : 126 return XSLTransform("mmxf2xhtml.xslt", data); 127 case BODY : 128 return xmlBody(data); 129 default: 130 return super.transform(data); 131 } 132 } 133 134 public String transformBack(String r) { 135 String result = null; 136 try { 137 switch (to) { 138 case RICH : 139 result = XML_TAGSTART + richToXML(r) + XML_TAGEND; 140 break; 142 case POOR : 143 result = XML_TAGSTART + poorToXML(r) + XML_TAGEND; 144 validate(XML_HEADER + result); 145 break; 146 case WIKI : 147 result = XML_TAGSTART + wikiToXML(r) + XML_TAGEND; 148 validate(XML_HEADER + result); 149 break; 150 case BODY : 151 result = XML_TAGSTART + r + XML_TAGEND; 152 validate(XML_HEADER + result); 153 break; 154 case XML : 155 result = r; 156 validate(XML_HEADER + result); 157 break; 158 default: 159 result = super.transformBack(r); 160 } 161 } catch (FormatException fe) { 162 log.error(fe.toString() + " source: \n" + result); 163 } 164 return result; 165 } 166 167 public String getEncoding() { 168 switch (to) { 169 case RICH : 170 return "MMXF_RICH"; 171 case POOR : 172 return "MMXF_POOR"; 173 case ASCII : 174 return "MMXF_ASCII"; 175 case XML : 176 return "MMXF_MMXF"; 177 default : 178 return super.getEncoding(); 179 } 180 } 181 } 182 | Popular Tags |