/* * This file is part of NixNote/NeighborNote * Copyright 2009 Randy Baumgarte * * This file may be licensed under the terms of of the * GNU General Public License Version 2 (the ``GPL''). * * Software distributed under the License is distributed * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the GPL for the specific language * governing rights and limitations. * * You should have received a copy of the GPL along with this * program. If not, go to http://www.gnu.org/licenses/gpl.html * or write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ package cx.fbn.nevernote.xml; import java.util.Vector; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class XMLNoteRepairHandler extends DefaultHandler { private final Vector<String> tagQueue; private final Vector<String> xml; public XMLNoteRepairHandler() { xml = new Vector<String>(); tagQueue = new Vector<String>(); } public void setXml(String x) { // First, change the <hr> tags. That is usually a problem String val = x.toString().replace("<HR>", "<hr/>"); val = val.replace("<hr>", "<hr/>"); val = val.replace("</HR>", ""); x = val.replace("</hr>", ""); // Another problem is a bad closing bracket x = x.replace("//>", "/>"); // Onother oddball is a bad br x = x.replace("<br/></br>", "<br/>"); int pos = 0; for (; pos > -1;) { String line; pos = x.indexOf('\n'); if (pos > -1) { line = new String(x.substring(0,pos)); x = x.substring(pos+1); } else line = x; xml.add(line); } } public String getXml() { StringBuffer b = new StringBuffer(); for (int i=0; i<xml.size(); i++) { b.append(xml.get(i)); if (i<xml.size()-1) b.append('\n'); } return b.toString(); } public void reset() { tagQueue.clear(); } public void stripAttribute(String attribute, int line, int column) { String repair = new String(xml.get(line-1)); int pos = column-1; String fragment = repair.substring(0,pos); int startPos = fragment.lastIndexOf("<"); fragment = fragment.substring(startPos); // Now we have the fragment, remove the attribute int attributeStart = fragment.indexOf(attribute)-1; int endPos = fragment.indexOf("\"", attributeStart+1); endPos = fragment.indexOf("\"", endPos+1)+1; if (endPos == -1) endPos = fragment.length()-1; String repairedFragment = fragment.substring(0,attributeStart) +fragment.substring(endPos); repair = repair.substring(0,startPos)+ repairedFragment+ repair.substring(column-1); xml.set(line-1, repair); } public void renameElement(String element, int line, int column) { for (int i=0; i<xml.size(); i++) { String value = xml.get(i); value = value.replace("<"+element, "<span"); value = value.replace("</"+element, "</span"); xml.set(i, value); } } public String repair(int line, int column) { StringBuffer repair = new StringBuffer(xml.get(line-1)); int pos = column-1; if (pos > 0) { for (int i=pos; i>=0; i--) { if (repair.charAt(i) == '<') { pos = i; i = -1; } } if (pos > 0) { repair.insert(pos, "</" +tagQueue.get(tagQueue.size()-1) +">"); } xml.remove(line-1); xml.add(line-1, repair.toString()); } return getXml(); } @Override public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { tagQueue.add(qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { String endVal = tagQueue.lastElement(); if (endVal.equals(qName)) { tagQueue.remove(tagQueue.size()-1); } } @Override public void error(SAXParseException e) throws EnmlException { Exception exception = new Exception(); EnmlException e1 = new EnmlException(e.getMessage(), e.getPublicId(), e.getSystemId(), e.getLineNumber(), e.getColumnNumber(), exception); throw e1; } @Override public void warning(SAXParseException e) throws SAXParseException { System.out.println("---------- WARNING ------------- "); throw e; } }