package com.liferay.ide.velocity.scanner; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import com.liferay.ide.velocity.vaulttec.ui.editor.text.VelocityTextGuesser; /** * DOCUMENT ME! * * @version $Revision: 7 $ * @author <a href="mailto:akmal.sarhan@gmail.com">Akmal Sarhan </a> */ public class XMLElementGuesser { private int tagoffset = -1; private String fText; private int fType; public XMLElementGuesser(IDocument aDocument, int anOffset, boolean aGuessEnd) { guessWord(aDocument, anOffset, aGuessEnd); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getType() { return fType; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getTagOffset() { return tagoffset; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getText() { return fText; } private static final boolean isWordPart(char aChar) { return Character.isLetterOrDigit(aChar) || (aChar == '-') || (aChar == '_'); } /** * DOCUMENT ME! * * @param aDocument * DOCUMENT ME! * @param anOffset * DOCUMENT ME! * @param aGuessEnd * DOCUMENT ME! * * @return DOCUMENT ME! */ private final String guessWord(IDocument aDocument, int anOffset, boolean aGuessEnd) { try { // Guess start position int start = anOffset; while ((start >= 1) && isWordPart(aDocument.getChar(start - 1))) { start--; } // Guess end position int end = anOffset; if (aGuessEnd) { int len = aDocument.getLength() - 1; while ((end < len) && isWordPart(aDocument.getChar(end))) { end++; } } fText = aDocument.get(start, (end - start)); if (start >= 1) { // Directive or shorthand reference char c1 = aDocument.getChar(start - 1); char c0 = 0; try { c0 = aDocument.getChar(start - 2); } catch (Exception e) { // TODO: handle exception } if (c1 == '<') { fType = VelocityTextGuesser.TAG_DIRECTIVE; tagoffset = start - 1; } else if ((c1 == '/') && (c0 == '<')) { fType = VelocityTextGuesser.TAG_CLOSE; tagoffset = start - 2; } else { fType = -1; } } } catch (BadLocationException e) { } return fText; } }