Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) 2008-2015 Mozilla Foundation
   *
   * Permission is hereby granted, free of charge, to any person obtaining a 
   * copy of this software and associated documentation files (the "Software"), 
   * to deal in the Software without restriction, including without limitation 
   * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
   * and/or sell copies of the Software, and to permit persons to whom the 
   * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in 
  * all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  * DEALINGS IN THE SOFTWARE.
  */
 
 package nu.validator.xml;
 
 import java.net.URI;
 
 
 
 public class BaseUriTracker implements ContentHandlerUriLangContext {
 
     private enum Direction {
         LTR, RTL, INHERIT
     }
 
     private class Node {
         public URL currentAbsolute// not null
 
         public String originalRelative// null if no xml:base
 
         public String lang// null if no xml:lang
 
         private boolean langSpeficied;
 
         private boolean rtl;

        

Parameters:
currentAbsolute
originalRelative
 
         public Node(URL currentAbsoluteString originalRelativeString lang,
                 boolean langSpecifiedboolean rtl) {
             this. = currentAbsolute;
             this. = originalRelative;
             this. = lang;
             this. = langSpecified;
             this. = rtl;
         }
     }
 
     private LinkedList<Nodestack = new LinkedList<Node>();
 
     private boolean baseSeen = false;
 
     private boolean contentLanguageSeen = false;

    
-1 at start 0 in html >=1 in head -2 situation over
 
     private int inHeadDepth = -1;
 
     private int inCruftDepth = 0;
 
     private boolean equalsIgnoreAsciiCase(CharSequence oneCharSequence other) {
         if (other == null && one == null) {
             return true;
         }
         if (other == null || one == null) {
             return false;
         }
         if (one.length() != other.length()) {
             return false;
         }
         for (int i = 0; i < other.length(); i++) {
             char c0 = one.charAt(i);
             if (c0 >= 'A' && c0 <= 'Z') {
                 c0 += 0x20;
             }
            char c1 = other.charAt(i);
            if (c1 >= 'A' && c1 <= 'Z') {
                c1 += 0x20;
            }
            if (c0 != c1) {
                return false;
            }
        }
        return true;
    }
    public BaseUriTracker(String systemIdString contentLanguage) {
        URL url = null;
        try {
            url = URL.parse(systemId);
        } catch (GalimatiasParseException e) {
            url = null;
        } catch (Exception e) {
            url = null;
        }
        String lang = "";
        boolean langSpecified = false;
        if (contentLanguage != null) {
            try {
                if (!"".equals(contentLanguage)) {
                    ..checkValid(contentLanguage);
                }
                lang = contentLanguage;
                langSpecified = true;
            } catch (DatatypeException e) {
            }
        }
        .add(new Node(urlnulllanglangSpecifiedfalse));
        .add(new Node(urlnulllangfalsefalse)); // base/content-language placeholder
    }
    private Node peek() {
        return .getLast();
    }
    private void pop() {
        .removeLast();
    }
    private void push(String relativeString languageDirection dir) {
        String lang = "";
        boolean langSpecified = false;
        if (language != null) {
            try {
                if (!"".equals(language)) {
                    ..checkValid(language);
                }
                lang = language;
                langSpecified = true;
            } catch (DatatypeException e) {
            }
        }
        Node curr = peek();
        URL base = curr.currentAbsolute;
        if (!langSpecified) {
            lang = curr.lang;
        }
        boolean rtl;
        switch (dir) {
            case :
                rtl = true;
                break;
            case :
                rtl = false;
                break;
            default:
                rtl = curr.rtl;
                break;
        }
        if (relative == null) {
            .addLast(new Node(basenulllanglangSpecifiedrtl));
        } else {
            URL newBase;
            String ascii = null;
            try {
                if (base != null) {
                    try {
                        newBase = base.resolve(relative);
                    } catch (GalimatiasParseException e) {
                        newBase = base;
                    }
                } else {
                    try {
                        newBase = URL.parse((new URI(ascii)).toString());
                    } catch (GalimatiasParseException e) {
                        newBase = null;
                    }
                }
            } catch (Exception e) {
                newBase = base;
            }
            .addLast(new Node(newBaseasciilanglangSpecifiedrtl));
        }
    }
    private void installBase(String href) {
        if () {
            return;
        }
         = true;
        LinkedList<NodeoldStack = ;
         = new LinkedList<Node>();
        int i = 0;
        for (Node node : oldStack) {
            if (i == 0) {
                .addLast(node); // root
            } else if (i == 1) {
                push(hrefnode.langSpeficied ? node.lang : null,
                        node.rtl ? . : .);
            } else {
                push(node.originalRelativenode.langSpeficied ? node.lang
                        : nullnode.rtl ? . : .);
            }
            i++;
        }
    }
    private void installContentLanguage(String language) {
        if () {
            return;
        }
         = true;
        String lang = "";
        boolean langSpecified = false;
        if (language != null) {
            try {
                if (!"".equals(language)) {
                    ..checkValid(language);
                }
                lang = language;
                langSpecified = true;
            } catch (DatatypeException e) {
            }
        }
        if (!langSpecified) {
            return;
        }
        int i = 0;
        for (Node node : ) {
            if (i == 0) {
                // nop
            } else if (i == 1) {
                node.lang = lang;
                node.langSpeficied = true// probably unnecessary...
            } else {
                if (node.langSpeficied) {
                    return;
                } else {
                    node.lang = lang;
                }
            }
            i++;
        }
    }

    
    public String currentLanguage() {
        return .getLast().;
    }

    
    public boolean isCurrentRtl() {
        return .getLast().;
    }
    
    
        try {
            URL relUrl = URL.parse(uri);
            String ascii;
            ascii = relUrl.toString();
            URL base = .getLast().;
            URL rv;
            try {
                if (base == null) {
                    rv = URL.parse(ascii);
                } else {
                    rv = base.resolve(ascii);
                }
            } catch (GalimatiasParseException e) {
                return null;
            }
            return rv.toString();
        } catch (Exception e) {
            return null;
        }
    }
    public void characters(char[] chint startint length)
            throws SAXException {
    }
    public void endDocument() throws SAXException {
    }
    public void endElement(String uriString localNameString name)
            throws SAXException {
        if ( > 0) {
            --;
            if ( == 0) {
                 = -2;
            }
        }
        if ( > 0) {
            --;
        }
        pop();
    }
    public void endPrefixMapping(String prefixthrows SAXException {
    }
    public void ignorableWhitespace(char[] chint startint length)
            throws SAXException {
    }
    public void processingInstruction(String targetString data)
            throws SAXException {
    }
    public void setDocumentLocator(Locator locator) {
    }
    public void skippedEntity(String namethrows SAXException {
    }
    public void startDocument() throws SAXException {
         = -1;
         = 0;
    }
    public void startElement(String uriString localNameString n,
            Attributes attsthrows SAXException {
        if ( >= 1) {
            ++;
            if ("http://www.w3.org/1999/xhtml" == uri) {
                if ("base" == localName) {
                    String href = atts.getValue("""href");
                    if (href != null) {
                        installBase(href);
                    }
                } else if ("meta" == localName) {
                    String httpEquiv = atts.getValue("""http-equiv");
                    if (equalsIgnoreAsciiCase("content-language"httpEquiv)) {
                        String content = atts.getValue("""content");
                        if (content == null) {
                            content = "";
                        }
                        installContentLanguage(content);
                    }
                }
            }
        } else if ( == -1) {
            if ("html" == localName && "http://www.w3.org/1999/xhtml" == uri) {
                 = 0;
            } else {
                 = -2;
            }
        } else if ( == 0 &&  == 0) {
            if ("head" == localName && "http://www.w3.org/1999/xhtml" == uri) {
                 = 1;
            } else {
                 = 1;
            }
        }
        String base = null;
        String lang = null;
        Direction dir = .;
        int len = atts.getLength();
        for (int i = 0; i < leni++) {
            String ns = atts.getURI(i);
            if ("http://www.w3.org/XML/1998/namespace" == ns) {
                String name = atts.getLocalName(i);
                if ("lang" == name) {
                    lang = atts.getValue(i);
                } else if ("base" == name) {
                    base = atts.getValue(i);
                }
            } else if ("" == ns) {
                String name = atts.getLocalName(i);
                if (("dir" == name && "http://www.w3.org/1999/xhtml" == uri)
                        || ("direction" == name && "http://www.w3.org/2000/svg" == uri)) {
                    String value = atts.getValue(i);
                    if (equalsIgnoreAsciiCase("ltr"value)) {
                        dir = .;
                    } else if (equalsIgnoreAsciiCase("rtl"value)) {
                        dir = .;
                    }
                }
            }
        }
        push(baselangdir);
    }
    public void startPrefixMapping(String prefixString uri)
            throws SAXException {
    }
New to GrepCode? Check out our FAQ X