Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * UnescapeMarkup.java
   *
   * Copyright 2008 Mark Logic Corporation.
   * Portions Copyright 2007 Sun Microsystems, Inc.
   * All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * https://xproc.dev.java.net/public/CDDL+GPL.html or
  * docs/CDDL+GPL.txt in the distribution. See the License for the
  * specific language governing permissions and limitations under the
  * License. When distributing the software, include this License Header
  * Notice in each file and include the License file at docs/CDDL+GPL.txt.
  */
 
 package com.xmlcalabash.library;
 
 
 import  nu.validator.htmlparser.common.XmlViolationPolicy;
 import  nu.validator.htmlparser.dom.HtmlDocumentBuilder;
 
 

Author(s):
ndw
 
 public class UnescapeMarkup extends DefaultStep {
     private static final QName _namespace = new QName("namespace");
     private static final QName _content_type = new QName("content-type");
     private static final QName _encoding = new QName("encoding");
     private static final QName _charset = new QName("charset");
     private ReadablePipe source = null;
     private WritablePipe result = null;
     private String namespace = null;

    
Creates a new instance of UnescapeMarkup
 
     public UnescapeMarkup(XProcRuntime runtimeXAtomicStep step) {
         super(runtime,step);
     }
 
     public void setInput(String portReadablePipe pipe) {
          = pipe;
     }
 
     public void setOutput(String portWritablePipe pipe) {
          = pipe;
     }
 
     public void reset() {
         .resetReader();
         .resetWriter();
     }
 
     public void run() throws SaxonApiException {
         super.run();
 
         String contentType = getOption("application/xml");
         String defCharset = HttpUtils.getCharset(contentType);
         contentType = HttpUtils.baseContentType(contentType);
 
         if (getOption() != null) {
              = getOption().getString();
         }
 
        String encoding = null;
        if (getOption() != null) {
            encoding = getOption().getString();
        }
        String charset = null;
        if (getOption() == null) {
            charset = defCharset;
        } else {
            charset = getOption().getString();
        }
        XdmNode doc = .read();
        String escapedContent = null;
        if ("base64".equals(encoding)) {
            if (charset == null) {
                throw XProcException.stepError(10);
            }
            escapedContent = decodeBase64(doccharset);
        } else if (encoding != null) {
            throw new XProcException(.getNode(), "Unexpected encoding: " + encoding);
        } else {
            escapedContent = extractText(doc);
        }
        TreeWriter tree = new TreeWriter();
        tree.startDocument(doc.getBaseURI());
        XdmSequenceIterator iter = doc.axisIterator(.);
        XdmNode child = (XdmNodeiter.next();
        while (child.getNodeKind() != .) {
            tree.addSubtree(child);
            child = (XdmNodeiter.next();
        }
        tree.addStartElement(child);
        tree.addAttributes(child);
        tree.startContent();
        if ("text/html".equals(contentType)) {
            XdmNode tagDoc = null;
            if ("tagsoup".equals(.htmlParser())) {
                tagDoc = tagSoup(escapedContent);
            } else {
                tagDoc = parseHTML(escapedContent);
            }
            if ( == null) {
                tree.addSubtree(tagDoc);
            } else {
                remapDefaultNamespace(treetagDoc);
            }
        } else if ("application/json".equals(contentType) || "text/json".equals(contentType)) {
            JSONTokener jt = new JSONTokener(escapedContent);
            XdmNode jsonDoc = JSONtoXML.convert(.getProcessor(), jt.jsonFlavor());
            tree.addSubtree(jsonDoc);
        } else if (!"application/xml".equals(contentType)) {
            throw XProcException.stepError(51);
        } else {
            // Put a wrapper around it so that it doesn't have to have a single root...
            escapedContent = "<wrapper>" + escapedContent + "</wrapper>";
            StringReader sr = new StringReader(escapedContent);
            // Make sure the nodes in the unescapedContent get the right base URI
            InputSource is = new InputSource(sr);
            is.setSystemId(doc.getBaseURI().toASCIIString());
            XdmNode unesc = .parse(is);
            // Now ignore the wrapper that we added...
            XdmNode dummyWrapper = S9apiUtils.getDocumentElement(unesc);
            XdmSequenceIterator realNodes = dummyWrapper.axisIterator(.);
            while (realNodes.hasNext()) {
                unesc = (XdmNoderealNodes.next();
                if ( == null) {
                    tree.addSubtree(unesc);
                } else {
                    remapDefaultNamespace(treeunesc);
                }
            }
        }
        tree.addEndElement();
        tree.endDocument();
        .write(tree.getResult());
    }
    private void remapDefaultNamespace(TreeWriter treeXdmNode unescnode) {
        if (unescnode.getNodeKind() == .) {
            NodeInfo inode = unescnode.getUnderlyingNode();
            int nscount = 0;
            Iterator<NamespaceBindingnsiter = NamespaceIterator.iterateNamespaces(inode);
            while (nsiter.hasNext()) {
                nscount++;
                nsiter.next();
            }
            
            boolean replaced = false;
            NamespaceBinding newNS[] = null;
            if (nscount > 0) {
                NamespaceBinding inscopeNS[] = new NamespaceBinding[nscount];
                newNS = new NamespaceBinding[nscount+1];
                for (int pos = 0; pos < inscopeNS.lengthpos++) {
                    NamespaceBinding ns = inscopeNS[pos];
                    String pfx = ns.getPrefix();
                    if ("".equals(pfx)) {
                        NamespaceBinding newns = new NamespaceBinding(pfx);
                        newNS[pos] = newns;
                        replaced = true;
                    } else {
                        newNS[pos] = ns;
                    }
                }
                if (!replaced) {
                    NamespaceBinding newns = new NamespaceBinding("",);
                    newNS[newNS.length-1] = newns;
                }
            }
            // Careful, we're messing with the namespace bindings
            // Make sure the nameCode is right...
            /* Not sure what to do here in 9.4. Nothing?
            int nameCode = inode.getNameCode();
            int typeCode = inode.getTypeAnnotation() & NamePool.FP_MASK;
            String pfx = pool.getPrefix(nameCode);
            String uri = pool.getURI(nameCode);
            if ("".equals(pfx) && !namespace.equals(uri)) {
                nameCode = pool.allocate(pfx,namespace,unescnode.getNodeName().getLocalName());
            }
            */
            FingerprintedQName newName = new FingerprintedQName(""inode.getLocalPart());
            tree.addStartElement(newNameinode.getSchemaType(), newNS);
            XdmSequenceIterator iter = unescnode.axisIterator(.);
            while (iter.hasNext()) {
                XdmNode child = (XdmNodeiter.next();
                tree.addAttribute(child);
            }
            XdmSequenceIterator childNodes = unescnode.axisIterator(.);
            while (childNodes.hasNext()) {
                XdmNode child = (XdmNodechildNodes.next();
                remapDefaultNamespace(treechild);
            }
            
            tree.addEndElement();
        } else {
            tree.addSubtree(unescnode);
        }
    }
    private String extractText(XdmNode doc) {
        String content = "";
        XdmSequenceIterator iter = doc.axisIterator(.);
        while (iter.hasNext()) {
            XdmNode child = (XdmNodeiter.next();
            if (child.getNodeKind() == . || child.getNodeKind() == .) {
                content += child.getStringValue();
            }
        }
        return content;
    }
    private String decodeBase64(XdmNode docString charset) {
        String content = extractText(doc);
        byte[] decoded = Base64.decode(content);
        try {
            return new String(decodedcharset);
        } catch (UnsupportedEncodingException uee) {
            throw XProcException.stepError(10, uee);
        }
    }
    private XdmNode tagSoup(String text) {
        StringReader inputStream = new StringReader(text);
        InputSource source = new InputSource(inputStream);
        Parser parser = new Parser();
        parser.setEntityResolver(.getResolver());
        SAXSource saxSource = new SAXSource(parsersource);
        DocumentBuilder builder = .getProcessor().newDocumentBuilder();
        try {
            XdmNode doc = builder.build(saxSource);
            return doc;
        } catch (Exception e) {
            throw new XProcException(e);
        }
    }
    private XdmNode parseHTML(String text) {
        HtmlDocumentBuilder htmlBuilder = new HtmlDocumentBuilder(XmlViolationPolicy.ALTER_INFOSET);
        htmlBuilder.setEntityResolver(.getResolver());
        try {
            InputSource src = new InputSource(new StringReader(text));
            Document html = htmlBuilder.parse(src);
            DocumentBuilder builder = .getProcessor().newDocumentBuilder();
            XdmNode doc = builder.build(new DOMSource(html));
            return doc;
        } catch (Exception e) {
            throw new XProcException(e);
        }
    }
New to GrepCode? Check out our FAQ X