001    /*
002     * Copyright (c) 2007 Henri Sivonen
003     * Copyright (c) 2007 Mozilla Foundation
004     *
005     * Permission is hereby granted, free of charge, to any person obtaining a 
006     * copy of this software and associated documentation files (the "Software"), 
007     * to deal in the Software without restriction, including without limitation 
008     * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
009     * and/or sell copies of the Software, and to permit persons to whom the 
010     * Software is furnished to do so, subject to the following conditions:
011     *
012     * The above copyright notice and this permission notice shall be included in 
013     * all copies or substantial portions of the Software.
014     *
015     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
016     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
017     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
018     * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
019     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
020     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
021     * DEALINGS IN THE SOFTWARE.
022     */
023    
024    package nu.validator.htmlparser.tools;
025    
026    import java.io.File;
027    import java.io.FileOutputStream;
028    import java.io.IOException;
029    
030    import org.xml.sax.SAXException;
031    
032    import nu.validator.htmlparser.common.XmlViolationPolicy;
033    import nu.validator.htmlparser.sax.HtmlSerializer;
034    import nu.validator.htmlparser.test.SystemErrErrorHandler;
035    import nu.validator.htmlparser.xom.HtmlBuilder;
036    import nu.xom.Builder;
037    import nu.xom.Document;
038    import nu.xom.Element;
039    import nu.xom.Nodes;
040    import nu.xom.ParsingException;
041    import nu.xom.Serializer;
042    import nu.xom.ValidityException;
043    import nu.xom.converters.SAXConverter;
044    import nu.xom.xslt.XSLException;
045    import nu.xom.xslt.XSLTransform;
046    
047    public class XSLT4HTML5XOM {
048    
049        private static final String TEMPLATE = "--template=";
050    
051        private static final String INPUT_HTML = "--input-html=";
052    
053        private static final String INPUT_XML = "--input-xml=";
054    
055        private static final String OUTPUT_HTML = "--output-html=";
056    
057        private static final String OUTPUT_XML = "--output-xml=";
058    
059        /**
060         * @param args
061         * @throws IOException 
062         * @throws ParsingException 
063         * @throws ValidityException 
064         * @throws XSLException 
065         * @throws SAXException 
066         */
067        public static void main(String[] args) throws ValidityException,
068                ParsingException, IOException, XSLException, SAXException {
069            if (args.length == 0) {
070                System.out.println("--template=file --input-[html|xml]=file --output-[html|xml]=file --mode=[sax-streaming|sax-buffered|dom]");
071                System.exit(0);
072            }
073            String template = null;
074            String input = null;
075            boolean inputHtml = false;
076            String output = null;
077            boolean outputHtml = false;
078            for (int i = 0; i < args.length; i++) {
079                String arg = args[i];
080                if (arg.startsWith(TEMPLATE)) {
081                    if (template == null) {
082                        template = arg.substring(TEMPLATE.length());
083                    } else {
084                        System.err.println("Tried to set template twice.");
085                        System.exit(1);
086                    }
087                } else if (arg.startsWith(INPUT_HTML)) {
088                    if (input == null) {
089                        input = arg.substring(INPUT_HTML.length());
090                        inputHtml = true;
091                    } else {
092                        System.err.println("Tried to set input twice.");
093                        System.exit(2);
094                    }
095                } else if (arg.startsWith(INPUT_XML)) {
096                    if (input == null) {
097                        input = arg.substring(INPUT_XML.length());
098                        inputHtml = false;
099                    } else {
100                        System.err.println("Tried to set input twice.");
101                        System.exit(2);
102                    }
103                } else if (arg.startsWith(OUTPUT_HTML)) {
104                    if (output == null) {
105                        output = arg.substring(OUTPUT_HTML.length());
106                        outputHtml = true;
107                    } else {
108                        System.err.println("Tried to set output twice.");
109                        System.exit(3);
110                    }
111                } else if (arg.startsWith(OUTPUT_XML)) {
112                    if (output == null) {
113                        output = arg.substring(OUTPUT_XML.length());
114                        outputHtml = false;
115                    } else {
116                        System.err.println("Tried to set output twice.");
117                        System.exit(3);
118                    }
119                }
120            }
121    
122            if (template == null) {
123                System.err.println("No template specified.");
124                System.exit(6);
125            }
126            if (input == null) {
127                System.err.println("No input specified.");
128                System.exit(7);
129            }
130            if (output == null) {
131                System.err.println("No output specified.");
132                System.exit(8);
133            }
134    
135            Builder builder = new Builder();
136    
137            Document transformationDoc = builder.build(new File(template));
138    
139            XSLTransform transform = new XSLTransform(transformationDoc);
140    
141            FileOutputStream outputStream = new FileOutputStream(output);
142    
143            Document inputDoc;
144            if (inputHtml) {
145                builder = new HtmlBuilder(XmlViolationPolicy.ALTER_INFOSET);
146            }
147            inputDoc = builder.build(new File(input));
148            Nodes result = transform.transform(inputDoc);
149            Document outputDoc = new Document((Element) result.get(0));
150            if (outputHtml) {
151                HtmlSerializer htmlSerializer = new HtmlSerializer(outputStream);
152                SAXConverter converter = new SAXConverter(htmlSerializer);
153                converter.setLexicalHandler(htmlSerializer);
154                converter.convert(outputDoc);
155            } else {
156                Serializer serializer = new Serializer(outputStream);
157                serializer.write(outputDoc);
158            }
159            outputStream.flush();
160            outputStream.close();
161        }
162    
163    }