blob: 3caf31cf9898cdb6b674896e6d4da89c5409c84f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2008 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Goh KONDOH - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.model.dom.sgml.errorhandler;
import java.io.IOException;
import org.eclipse.actf.model.dom.sgml.ISGMLConstants;
import org.eclipse.actf.model.dom.sgml.SGMLParser;
public class AttributeValueErrorHandler implements ITokenErrorHandler, ISGMLConstants {
public boolean handleError(int code, SGMLParser parser, String errorStr)
throws IOException {
if (code != ATTR_VALUE)
return false;
int gtIndex = errorStr.indexOf('>');
int ltIndex;
char closingChar;
int errorStrLen = errorStr.length();
if (errorStrLen == 0)
return false;
if ((closingChar = errorStr.charAt(0)) != '\'' && closingChar != '"') {
return false;
}
if (gtIndex > 1 && (ltIndex = errorStr.indexOf('<')) > gtIndex) {
// case of attr="value_without_endquote> ... <nextTag
int nextTagBegin = ltIndex + 1;
if (errorStr.charAt(nextTagBegin) == '/')
nextTagBegin++;
int nextTagEnd = nextTagBegin;
char c0;
while (Character.isLowerCase(c0 = errorStr.charAt(nextTagEnd))
|| Character.isUpperCase(c0)) {
nextTagEnd++;
}
if (nextTagBegin == nextTagEnd)
return false;
String nextTag = errorStr.substring(nextTagBegin, nextTagEnd);
if (parser.getDTD().getElementDefinition(nextTag) != null) {
parser.error(STARTTAG_SYNTAX_ERR,
" attribute value missed closing quotation.");
parser.insert(errorStr.substring(0, gtIndex) + closingChar
+ errorStr.substring(gtIndex));
return true;
}
} else if (errorStr.charAt(errorStrLen - 1) == closingChar
&& errorStr.length() > 1
&& errorStr.charAt(errorStrLen - 2) == '=') {
// case of attr="value_without_endquote
// nextAttrName="nextAttrValue...
for (int i = 0; i < errorStrLen; i++) {
if (Character.isWhitespace(errorStr.charAt(i))) {
int errorPoint = i;
while (Character.isWhitespace(errorStr.charAt(++i)))
;
char c0;
// int nextAttrNameStart = i;
c0 = errorStr.charAt(i);
if (!Character.isLowerCase(c0)
&& !Character.isUpperCase(c0)) {
return false;
}
do {
i++;
c0 = errorStr.charAt(i);
} while (Character.isLowerCase(c0)
|| Character.isUpperCase(c0));
while (Character.isWhitespace(c0 = errorStr.charAt(i)))
i++;
if (c0 == '=') {
parser.insert(errorStr.substring(0, errorPoint)
+ closingChar + errorStr.substring(errorPoint));
parser.error(STARTTAG_SYNTAX_ERR,
" attribute value missed closing quotation.");
return true;
}
}
}
}
return false;
}
}