/* * Freeplane - mind map editor * Copyright (C) 2008 Dimitry Polivaev * * This file author is Dimitry Polivaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.core.io.xml; import java.io.IOException; import java.util.Properties; import org.freeplane.n3.nanoxml.IXMLParser; import org.freeplane.n3.nanoxml.IXMLReader; import org.freeplane.n3.nanoxml.StdXMLParser; import org.freeplane.n3.nanoxml.XMLParseException; class XMLParser extends StdXMLParser implements IXMLParser { private boolean skipNextElementContent = false; void notParseNextElementContent() { skipNextElementContent = true; } @Override protected void processElement(final String defaultNamespace, final Properties namespaces) throws Exception { try { super.processElement(defaultNamespace, namespaces); } finally { skipNextElementContent = false; } } @Override protected void processElementContent(final String defaultNamespace, final Properties namespaces, final String fullName, final String name, final String prefix) throws IOException, XMLParseException, Exception { if (skipNextElementContent) { boolean inComment = false; final TreeXmlReader builder = (TreeXmlReader) getBuilder(); final StringBuilder waitingBuf = new StringBuilder(); int level = 1; for (;;) { final IXMLReader reader = getReader(); char ch = reader.read(); if (inComment) { waitingBuf.append(ch); if (ch != '-') { continue; } ch = reader.read(); waitingBuf.append(ch); if (ch != '-') { continue; } ch = reader.read(); waitingBuf.append(ch); if (ch != '>') { continue; } inComment = false; continue; } if (ch == '<') { ch = reader.read(); if (ch == '/') { level--; if (level == 0) { break; } } else if (ch == '!') { final char read1 = reader.read(); final char read2 = reader.read(); if (read1 != '-' || read2 != '-') { throw new XMLParseException(reader.getSystemID(), reader.getLineNr(), "Invalid input: <!" + read1 + read2); } inComment = true; waitingBuf.append("<!--"); continue; } else { level++; } waitingBuf.append('<'); } else if (ch == '/') { ch = reader.read(); if (ch == '>') { level--; if (level == 0) { throw new XMLParseException(reader.getSystemID(), reader.getLineNr(), "Invalid input: />"); } } else if (ch == '<') { waitingBuf.append('/'); reader.unread(ch); continue; } waitingBuf.append('/'); } waitingBuf.append(ch); } builder.setElementContent(waitingBuf.toString()); return; } super.processElementContent(defaultNamespace, namespaces, fullName, name, prefix); } }