package org.objectstyle.wolips.wodclipse.core.util; import java.util.Map; import jp.aonir.fuzzyxml.FuzzyXMLAttribute; import jp.aonir.fuzzyxml.FuzzyXMLElement; import org.eclipse.jface.text.Position; import org.objectstyle.wolips.bindings.api.ApiCache; import org.objectstyle.wolips.bindings.wod.SimpleWodBinding; import org.objectstyle.wolips.bindings.wod.SimpleWodElement; import org.objectstyle.wolips.bindings.wod.TagShortcut; import org.objectstyle.wolips.variables.BuildProperties; import org.objectstyle.wolips.wodclipse.core.util.WodHtmlUtils.BindingValue; public class FuzzyXMLWodElement extends SimpleWodElement { private FuzzyXMLElement _xmlElement; public FuzzyXMLWodElement(FuzzyXMLElement element, BuildProperties buildProperties) { String elementName = element.getName(); String searchFor = elementName.contains("wo:")?"wo:":"tb:"; String namespaceElementName = elementName.substring(searchFor.length()).trim(); int elementTypePosition = element.getOffset() + element.getNameOffset() + searchFor.length() + 1; int elementTypeLength = namespaceElementName.length(); TagShortcut matchingTagShortcut = null; for (TagShortcut tagShortcut : ApiCache.getTagShortcuts()) { if (namespaceElementName.equalsIgnoreCase(tagShortcut.getShortcut())) { matchingTagShortcut = tagShortcut; } } if (matchingTagShortcut != null) { namespaceElementName = matchingTagShortcut.getActual(); } _setElementName("_temp"); _setElementType(namespaceElementName); setElementTypePosition(new Position(elementTypePosition, elementTypeLength)); setInline(true); if (matchingTagShortcut != null) { for (Map.Entry<String, String> shortcutAttribute : matchingTagShortcut.getAttributes().entrySet()) { BindingValue value = WodHtmlUtils.toBindingValue(shortcutAttribute.getValue(), buildProperties.getInlineBindingPrefix(), buildProperties.getInlineBindingSuffix()); SimpleWodBinding wodBinding = new SimpleWodBinding(null, shortcutAttribute.getKey(), value.getValue()); addBinding(wodBinding); } } FuzzyXMLAttribute[] attributes = element.getAttributes(); for (FuzzyXMLAttribute attribute : attributes) { String namespace = attribute.getNamespace(); String name = attribute.getName(); String originalValue = attribute.getValue(); BindingValue value = WodHtmlUtils.toBindingValue(originalValue, buildProperties.getInlineBindingPrefix(), buildProperties.getInlineBindingSuffix()); Position valuePosition; Position valueNamespacePosition = null; if (value.getValueNamespace() != null) { int valueNamespaceOffset = originalValue.indexOf(value.getValueNamespace()); valueNamespacePosition = new Position(element.getOffset() + attribute.getValueDataOffset() + valueNamespaceOffset + 1, value.getValueNamespace().length()); int valueOffset = originalValue.indexOf(value.getValue(), valueNamespaceOffset + value.getValueNamespace().length()); valuePosition = new Position(valueNamespacePosition.offset + valueOffset, attribute.getValueDataLength() - valueOffset); } else { valuePosition = new Position(element.getOffset() + attribute.getValueDataOffset() + 1, attribute.getValueDataLength()); } SimpleWodBinding wodBinding = new SimpleWodBinding(namespace, name, value.getValueNamespace(), value.getValue(), new Position(attribute.getNamespaceOffset(), attribute.getNamespaceLength()), new Position(attribute.getNameOffset(), attribute.getNameLength()), valueNamespacePosition, valuePosition, -1); wodBinding.setStartOffset(attribute.getOffset()); wodBinding.setEndOffset(attribute.getOffset() + attribute.getLength()); addBinding(wodBinding); } setStartOffset(element.getOffset()); setEndOffset(element.getOffset() + element.getOpenTagLength() + 2); if (element.hasCloseTag()) { setFullEndOffset(element.getCloseTagOffset() + element.getCloseTagLength() + 2); } else { setFullEndOffset(getEndOffset()); } if (attributes.length > 0) { int endOffset = attributes[attributes.length - 1].getOffset() + attributes[attributes.length - 1].getLength(); setNewBindingOffset(endOffset); } else { setNewBindingOffset(element.getOffset() + element.getNameOffset() + element.getNameLength() + 1); } setNewBindingIndent(1); } public FuzzyXMLElement getXmlElement() { return _xmlElement; } }