KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > richtext > transformers > XmlField


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10
11 package org.mmbase.richtext.transformers;
12
13 import org.mmbase.util.transformers.*;
14
15 import java.io.*;
16 import java.util.HashMap JavaDoc;
17 import java.util.Map JavaDoc;
18
19 import javax.xml.transform.stream.StreamSource JavaDoc;
20 import javax.xml.transform.stream.StreamResult JavaDoc;
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 /**
34  * Like {@link org.mmbase.util.transformers.XmlField} but adds everything related to the MMXF doctype. This means basicly that it knows how to surround <mmxf />
35  *
36  * @author Michiel Meeuwissen
37  * @version $Id: XmlField.java,v 1.2 2006/01/02 16:57:46 michiel Exp $
38  * @todo THIS CLASS NEEDS A CONCEPT! It gets a bit messy.
39  */

40
41 public class XmlField extends org.mmbase.util.transformers.XmlField {
42
43     private static final Logger log = Logging.getLoggerInstance(XmlField.class);
44
45     // can be decoded:
46
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     // default doctype
53
public final static String JavaDoc XML_DOCTYPE = "<!DOCTYPE mmxf PUBLIC \"" + Mmxf.DOCUMENTTYPE_PUBLIC + "\" \"" + Mmxf.DOCUMENTTYPE_SYSTEM + "\">\n";
54
55
56     private final static String JavaDoc CODING = "UTF-8"; // This class only support UTF-8 now.
57

58     // for validation only.
59
private final static String JavaDoc XML_HEADER = "<?xml version=\"1.0\" encoding=\"" + CODING + "\"?>\n" + XML_DOCTYPE;
60     private final static String JavaDoc XML_TAGSTART = "<mmxf version=\"1.1\" xmlns=\"" + Mmxf.NAMESPACE + "\">";
61     private final static String JavaDoc 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 JavaDoc wikiToXML(String JavaDoc 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 JavaDoc 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     /**
93      * chop of the mmxf xml tagstart and tagend:
94      */

95
96     final static private String JavaDoc xmlBody(String JavaDoc 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 JavaDoc transformers() {
108         Map JavaDoc 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 JavaDoc transform(String JavaDoc 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 JavaDoc transformBack(String JavaDoc r) {
135         String JavaDoc result = null;
136         try {
137             switch (to) {
138             case RICH :
139                 result = XML_TAGSTART + richToXML(r) + XML_TAGEND;
140                 // rich will not be validated... Cannot be used yet!!
141
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 JavaDoc 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