diff options
Diffstat (limited to 'bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal')
280 files changed, 29886 insertions, 18 deletions
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java index 84a8587d66..36e6d2a2f8 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java @@ -37,15 +37,15 @@ import org.eclipse.wst.sse.core.util.StringUtils; import org.eclipse.wst.xml.core.document.IDOMAttr; import org.eclipse.wst.xml.core.document.IDOMDocument; import org.eclipse.wst.xml.core.document.IDOMElement; -import org.eclipse.wst.xml.core.document.ISourceGenerator; import org.eclipse.wst.xml.core.document.IDOMModel; import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.document.ISourceGenerator; import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; -import org.eclipse.wst.xml.core.parser.XMLRegionContext; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -383,7 +383,7 @@ public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler { IStructuredDocumentRegion endTagStructuredDocumentRegion = newNode.getEndStructuredDocumentRegion(); ITextRegionList regionList = startTagStructuredDocumentRegion.getRegions(); - if (startTagStructuredDocumentRegion != null && regionList != null && regionList.get(regionList.size() - 1).getType() == XMLRegionContext.XML_EMPTY_TAG_CLOSE) { + if (startTagStructuredDocumentRegion != null && regionList != null && regionList.get(regionList.size() - 1).getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { } else { @@ -428,7 +428,7 @@ public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler { ITextRegion lastRegion = regionList.get(regionList.size() - 1); if (lastRegion != null) { String regionType = lastRegion.getType(); - if ((regionType != XMLRegionContext.XML_EMPTY_TAG_CLOSE) && (regionType != XMLRegionContext.XML_TAG_CLOSE)) { + if ((regionType != DOMRegionContext.XML_EMPTY_TAG_CLOSE) && (regionType != DOMRegionContext.XML_TAG_CLOSE)) { IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); // insert ">" after lastRegion of flatNode @@ -563,11 +563,11 @@ public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler { IStructuredDocumentRegion startStructuredDocumentRegion = newNode.getStartStructuredDocumentRegion(); int index = startStructuredDocumentRegion.getEndOffset(); ITextRegion lastRegion = startStructuredDocumentRegion.getLastRegion(); - if (lastRegion.getType() == XMLRegionContext.XML_TAG_CLOSE) { + if (lastRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) { index--; lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1); } - else if (lastRegion.getType() == XMLRegionContext.XML_EMPTY_TAG_CLOSE) { + else if (lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { index = index - 2; lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1); } diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java index 03356c9c78..dd87fe893f 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java @@ -16,7 +16,7 @@ import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler; import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences; import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; import org.eclipse.wst.xml.core.document.IDOMNode; -import org.eclipse.wst.xml.core.parser.XMLRegionContext; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; import org.w3c.dom.Node; // nakamori_TODO: check and remove CSS formatting @@ -127,7 +127,7 @@ class HTMLCleanupHandlerFactory { IStructuredDocumentRegion flatNode = ((IDOMNode) node).getFirstStructuredDocumentRegion(); if (flatNode == null) return false; - if (flatNode.getType() != XMLRegionContext.BLOCK_TEXT) + if (flatNode.getType() != DOMRegionContext.BLOCK_TEXT) return false; // check if the parent is STYLE element diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java index ea6a01d816..04502a97c9 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java @@ -12,8 +12,8 @@ package org.eclipse.wst.html.core.internal.cleanup; import org.eclipse.core.runtime.Preferences; import org.eclipse.wst.html.core.contenttype.ContentTypeIdForHTML; -import org.eclipse.wst.html.core.format.HTMLFormatProcessorImpl; import org.eclipse.wst.html.core.internal.HTMLCorePlugin; +import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl; import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler; import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor; import org.eclipse.wst.xml.core.internal.cleanup.CleanupProcessorXML; diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java new file mode 100644 index 0000000000..321d0c46dc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.commentelement.handlers; + + + +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.ISourceGenerator; +import org.eclipse.wst.xml.core.internal.commentelement.CommentElementHandler; +import org.eclipse.wst.xml.core.internal.commentelement.util.CommentElementFactory; +import org.eclipse.wst.xml.core.internal.commentelement.util.TagScanner; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; +import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; + +/** + */ +public class CommentElementHandlerForSSI implements CommentElementHandler { + + /** + * @see com.ibm.sed.model.commentelement.CommentElementHandler#createElement(Document, String, boolean) + */ + public Element createElement(Document document, String data, boolean isJSPTag) { + ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document); + if (modelQuery == null) { + return null; + } + CMDocument cm = modelQuery.getCorrespondingCMDocument(document); + if (cm == null) { + return null; + } + CMNamedNodeMap map = cm.getElements(); + if (map == null) { + return null; + } + + TagScanner scanner = new TagScanner(data, 1); + String name = scanner.nextName(); + if (name == null) { + return null; + } + StringBuffer buffer = new StringBuffer(name.length() + 4); + buffer.append(SSI_PREFIX); + buffer.append(':'); + buffer.append(name); + String tagName = buffer.toString(); + // check if valid (defined) SSI tag or not + if (map.getNamedItem(tagName) == null) { + return null; + } + + CommentElementFactory factory = new CommentElementFactory(document, isJSPTag, this); + Element element = factory.create(tagName, CommentElementFactory.IS_START); + + // set attributes + String attrName = scanner.nextName(); + while (attrName != null) { + String attrValue = scanner.nextValue(); + Attr attr = document.createAttribute(attrName); + if (attr != null) { + if (attrValue != null) + attr.setValue(attrValue); + element.setAttributeNode(attr); + } + attrName = scanner.nextName(); + } + return element; + } + + /** + * @see com.ibm.sed.model.commentelement.CommentElementHandler#generateStartTagContent(IDOMElement) + */ + public String generateStartTagContent(IDOMElement element) { + ISourceGenerator generator = element.getModel().getGenerator(); + StringBuffer buffer = new StringBuffer(); + + buffer.append('#'); + buffer.append(element.getLocalName()); + + NamedNodeMap attributes = element.getAttributes(); + int length = attributes.getLength(); + for (int i = 0; i < length; i++) { + Attr attr = (Attr) attributes.item(i); + if (attr == null) { + continue; + } + buffer.append(' '); + String attrName = generator.generateAttrName(attr); + if (attrName != null) { + buffer.append(attrName); + } + String attrValue = generator.generateAttrValue(attr); + if (attrValue != null) { + // attr name only for HTML boolean and JSP + buffer.append('='); + buffer.append(attrValue); + } + } + + return buffer.toString(); + } + + /** + * @see com.ibm.sed.model.commentelement.CommentElementHandler#generateEndTagContent(IDOMElement) + */ + public String generateEndTagContent(IDOMElement element) { + return null; // always empty + } + + public boolean isEmpty() { + return true; + } + + /* (non-Javadoc) + * @see com.ibm.sed.model.commentelement.CommentElementHandler#isCommentElement(com.ibm.sed.model.xml.XMLElement) + */ + public boolean isCommentElement(IDOMElement element) { + if (element == null) { + return false; + } + Document document = element.getOwnerDocument(); + ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document); + if (modelQuery == null) { + return false; + } + CMDocument cm = modelQuery.getCorrespondingCMDocument(document); + if (cm == null) { + return false; + } + CMNamedNodeMap map = cm.getElements(); + if (map == null) { + return false; + } + String prefix = element.getPrefix(); + if (prefix == null || !prefix.equals(SSI_PREFIX)) { + return false; + } + String tagName = element.getTagName(); + if (tagName.length() <= 4) { + return false; + } + if (map.getNamedItem(tagName) == null) { + return false; + } + else { + return true; + } + } + + private static final String SSI_PREFIX = "ssi";//$NON-NLS-1$ +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java new file mode 100644 index 0000000000..d1c5a06546 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java @@ -0,0 +1,1295 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for attribute declarations. + */ +final class AttributeCollection extends CMNamedNodeMapImpl implements HTML40Namespace { + + /** bodycolors. */ + private static final String[] BODYCOLORS = {ATTR_NAME_BGCOLOR, ATTR_NAME_TEXT, ATTR_NAME_LINK, ATTR_NAME_VLINK, HTML40Namespace.ATTR_NAME_ALINK}; + /** coreattrs. */ + private static final String[] CORE = {ATTR_NAME_ID, ATTR_NAME_CLASS, ATTR_NAME_STYLE, ATTR_NAME_TITLE}; + /** events. */ + private static final String[] EVENTS = {ATTR_NAME_ONCLICK, ATTR_NAME_ONDBLCLICK, ATTR_NAME_ONMOUSEDOWN, ATTR_NAME_ONMOUSEUP, ATTR_NAME_ONMOUSEOVER, ATTR_NAME_ONMOUSEMOVE, ATTR_NAME_ONMOUSEOUT, ATTR_NAME_ONKEYPRESS, ATTR_NAME_ONKEYDOWN, ATTR_NAME_ONKEYUP, ATTR_NAME_ONHELP}; + /** i18n. lang, dir */ + private static final String[] I18N = {ATTR_NAME_LANG, ATTR_NAME_DIR}; + /** cellhaligh. */ + private static final String[] CELLHALIGN = {ATTR_NAME_CHAR, ATTR_NAME_CHAROFF}; + + /** + * constructor. + */ + public AttributeCollection() { + super(); + } + + /** + * Create an attribute declaration. + * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl + * @param attrName java.lang.String + */ + private HTMLAttrDeclImpl create(String attrName) { + HTMLAttrDeclImpl attr = null; + HTMLCMDataTypeImpl atype = null; + + if (attrName.equalsIgnoreCase(ATTR_NAME_ABBR)) { + // (abbr %Text; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ABBR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ACCEPT)) { + // (accept %ContentTypes; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ACCEPT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ACCEPT_CHARSET)) { + // (accept-charset %Charsets;; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARSETS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ACCEPT_CHARSET, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ACTION)) { + // (action %URI #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ACTION, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ARCHIVE)) { + // (archive CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ARCHIVE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ACCESSKEY)) { + // (accesskey %Character; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ACCESSKEY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ALINK)) { + // (alink %Color; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ALINK, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ALT)) { + // (alt %Text; #REQUIRED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ALT, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOSTART)) { + // (autostart (true|false) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOSTART, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOPLAY)) { + // (autoplay (true|false) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOPLAY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOSIZE)) { + // (autosize (true|false) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOSIZE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_AXIS)) { + // (axis CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_AXIS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BACKGROUND)) { + // (background %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BACKGROUND, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BEHAVIOR)) { + // (behavior (scroll|slide|alternate) scroll) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_SCROLL, ATTR_VALUE_SLIDE, ATTR_VALUE_ALTERNATE}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_SCROLL); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BEHAVIOR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BGCOLOR)) { + // (bgcolor %Color; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BGCOLOR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BORDER)) { + // (border %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDER, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CELLSPACING)) { + // (cellspacing %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CELLSPACING, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CELLPADDING)) { + // (cellpadding %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CELLPADDING, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CGI)) { + // (cgi %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CGI, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CHAR)) { + // (char %Character; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CHAR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CHAROFF)) { + // (charoff %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CHAROFF, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CHARSET)) { + // (charset %Charset; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARSET); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CHARSET, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CITE)) { + // (cite %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CITE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CLASS)) { + // (class CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CLASS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CLASSID)) { + // (classid %URI #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CLASSID, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CMD)) { + // (cmd CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CMD, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CHECKED)) { + // (checked (checked) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_CHECKED}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CHECKED, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CLEAR)) { + // (clear (left | all | right | none) none) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_ALL, ATTR_VALUE_RIGHT, ATTR_VALUE_NONE}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_NONE); + + attr = new HTMLAttrDeclImpl(ATTR_NAME_CLEAR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CODE)) { + // (code CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CODE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CODEBASE)) { + // (codebase %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CODEBASE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CODETYPE)) { + // (codetype %CotentType; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CODETYPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_COLOR)) { + // (color %Color; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR); + attr = new HTMLAttrDeclImpl(ATTR_NAME_COLOR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_COMPACT)) { + // (compact (compact) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_COMPACT}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_COMPACT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_COLS)) { + // (cols NUMBER #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_COLS, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_COLSPAN)) { + // (colspan NUMBER 1) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1); + attr = new HTMLAttrDeclImpl(ATTR_NAME_COLSPAN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CONTENT)) { + // (content CDATA #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTENT, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CONTROLLER)) { + // (controller (true|false) true) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_TRUE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTROLLER, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_COORDS)) { + // (coords %Coords; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COORDS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_COORDS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DATA)) { + // (data %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DATA, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DATETIME)) { + // (datetime %Datetime; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.DATETIME); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DATETIME, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DATAPAGESIZE)) { + // (datapagesize CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DATAPAGESIZE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DECLARE)) { + // (declare (declare) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_DECLARE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DECLARE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DEFER)) { + // (defer (defer) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_DEFER}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DEFER, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DIR)) { + // (dir (ltr|rtl) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_LTR, ATTR_VALUE_RTL}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DIR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DIRECTION)) { + // (direction (left|right|up|down) left) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT, ATTR_VALUE_UP, ATTR_VALUE_DOWN}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DIRECTION, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DIRECTKEY)) { + // (directkey %Character; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DIRECTKEY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_DISABLED)) { + // (disabled (disabled) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // boolean attribute must have the same value as its name. + String[] values = {ATTR_NAME_DISABLED}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_DISABLED, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ENCTYPE)) { + // (enctype %ContentType; "application/x-www-form-urlencoded") + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_WWW_FORM_URLENCODED); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ENCTYPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ERRMSG)) { + // (errmsg CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ERRMSG, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_EVENT)) { + // (event CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_EVENT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_FACE)) { + // (face CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_FACE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_FILE)) { + // (file %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_FILE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_FOR)) { + // (for %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_FOR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_FRAME)) { + // (frame %TFrame; #IMPLIED) + // %TFrame; is (void|above|below|hsides|lhs|rhs|vsides|box|border). + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_VOID, ATTR_VALUE_ABOVE, ATTR_VALUE_BELOW, ATTR_VALUE_HSIDES, ATTR_VALUE_LHS, ATTR_VALUE_RHS, ATTR_VALUE_VSIDES, ATTR_VALUE_BOX, ATTR_VALUE_BORDER}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAME, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_FRAMEBORDER)) { + // (frameborder (1|0) 1) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_1, ATTR_VALUE_0}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1); + attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAMEBORDER, atype, CMAttributeDeclaration.OPTIONAL); + + //<<D215684 + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_FRAMESPACING)) { + // (framespacing CDATA; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAMESPACING, atype, CMAttributeDeclaration.OPTIONAL); + //D215684 + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HEADERS)) { + // (HEADERS IDREFS; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.IDREFS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HEADERS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HEIGHT)) { + // (height %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HIDDEN)) { + // (hidden CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HIDDEN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HREF)) { + // (href %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HREF, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HREFLANG)) { + // (hreflang %LanguageCode; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LANGUAGE_CODE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HREFLANG, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HSPACE)) { + // (hspace %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HSPACE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HTTP_EQUIV)) { + // (http-equiv NAME #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HTTP_EQUIV, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ID)) { + // (id ID #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ID); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ID, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ISMAP)) { + // (ismap (ismap) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_ISMAP}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ISMAP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ISTYLE)) { + // (istyle CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ISTYLE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LABEL)) { + // (label %Text; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LABEL, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LANG)) { + // (lang %LanguageCode; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LANGUAGE_CODE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LANG, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LANGUAGE)) { + // (language %CDATA; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LANGUAGE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LINK)) { + // (link %Color; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LINK, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LONGDESC)) { + // (longdesc %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LONGDESC, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LOOP)) { + // (loop CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LOOP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MACRO)) { + // (macro CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MACRO, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MAPFILE)) { + // (mapfile %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MAPFILE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MARGINWIDTH)) { + // (marginwidth %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MARGINWIDTH, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MARGINHEIGHT)) { + // (marginheight %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MARGINHEIGHT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MAXLENGTH)) { + // (maxlength NUMBER #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MAXLENGTH, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MAYSCRIPT)) { + // (mayscript (mayscript) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_MAYSCRIPT}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MAYSCRIPT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MEDIA)) { + // (media %MediaDesc; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MEDIA_DESC); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MEDIA, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_METHOD)) { + // (method (GET|POST) GET) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_GET, ATTR_VALUE_POST}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_GET); + attr = new HTMLAttrDeclImpl(ATTR_NAME_METHOD, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MULTIPLE)) { + // (multiple (multiple) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_MULTIPLE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MULTIPLE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NAME)) { + // (name CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NOHREF)) { + // (nohref (nohref) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_NOHREF}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NOHREF, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NORESIZE)) { + // (noresize (noresize) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_NORESIZE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NORESIZE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NOSHADE)) { + // (noshade (noshade) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_NOSHADE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NOSHADE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NOWRAP)) { + // (nowrap (nowrap) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_NOWRAP}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NOWRAP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_OBJECT)) { + // (object CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_OBJECT}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_OBJECT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONBLUR)) { + // (onblur %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONBLUR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCLICK)) { + // (onclick %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCLICK, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCHANGE)) { + // (onchange %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCHANGE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDBLCLICK)) { + // (ondblclick %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDBLCLICK, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONFOCUS)) { + // (onfocus %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONFOCUS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONHELP)) { + // (onhelp %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONHELP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONKEYPRESS)) { + // (onkeypress %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONKEYPRESS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONKEYDOWN)) { + // (onkeydown %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONKEYDOWN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONKEYUP)) { + // (onkyeup %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONKEYUP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONLOAD)) { + // (onload %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONLOAD, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEDOWN)) { + // (onmousedown %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEDOWN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEUP)) { + // (onmouseup %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEUP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEOVER)) { + // (onmouseover %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEOVER, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEMOVE)) { + // (onmousemove %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEMOVE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEOUT)) { + // (onmouseout %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEOUT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONRESET)) { + // (onreset %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONRESET, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSELECT)) { + // (onselect %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSELECT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSUBMIT)) { + // (onsubmit %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSUBMIT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ONUNLOAD)) { + // (onunload %Script; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ONUNLOAD, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_PALETTE)) { + // (palette CDATA; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_PALETTE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_PANEL)) { + // (panel CDATA; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_PANEL, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_PLAYCOUNT)) { + // (playcount NUMBER; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_PLAYCOUNT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_PROFILE)) { + // (profile %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_PROFILE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_PROMPT)) { + // (prompt %Text; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_PROMPT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_READONLY)) { + // (readonly (readonly) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_READONLY}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_READONLY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_REPEAT)) { + // (repeat CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_REPEAT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_REL)) { + // (rel %LinkTypes; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LINK_TYPES); + attr = new HTMLAttrDeclImpl(ATTR_NAME_REL, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_REV)) { + // (rev %LinkTypes; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LINK_TYPES); + attr = new HTMLAttrDeclImpl(ATTR_NAME_REV, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ROWS)) { + // (rows NUMBER #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ROWS, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ROWSPAN)) { + // (rowspan NUMBER 1) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ROWSPAN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_RULES)) { + // (rules %TRules; #IMPLIED) + // %TRules; is (none | groups | rows | cols | all). + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_NONE, ATTR_VALUE_GROUPS, ATTR_VALUE_ROWS, ATTR_VALUE_COLS, ATTR_VALUE_ALL}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_RULES, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SCALE)) { + // (scale CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SCALE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SCHEME)) { + // (scheme CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SCHEME, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SELECTED)) { + // (selected (selected) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_SELECTED}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SELECTED, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SCOPE)) { + // (SCOPE %Scope; #IMPLIED) + // %Scope; is (row|col|rowgroup|colgroup) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_ROW, ATTR_VALUE_COL, ATTR_VALUE_ROWGROUP, ATTR_VALUE_COLGROUP}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SCOPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SCROLLAMOUNT)) { + // (scrollamount NUMBER #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLAMOUNT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SCROLLDELAY)) { + // (scrolldelay NUMBER #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLDELAY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SCROLLING)) { + // (scrolling (yes|no|auto) auto) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_YES, ATTR_VALUE_NO, ATTR_VALUE_AUTO}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_AUTO); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLING, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SHAPE)) { + // (shape %Shape; rect): %Shape; is (rect|circle|poly|default). + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_RECT, ATTR_VALUE_CIRCLE, ATTR_VALUE_POLY, ATTR_VALUE_DEFAULT}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_RECT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SHAPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SHOWCONTROLS)) { + // (showcontrols (true|false) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SHOWCONTROLS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SIZE)) { + // (size %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SIZEFMT)) { + // (sizefmt CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZEFMT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SPAN)) { + // (span NUMBER 1) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SPAN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SRC)) { + // (src %URI; #IMPLIED) + // NOTE: "src" attributes are defined in several elements. + // The definition of IMG is different from others. + // So, it should be locally defined. + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SRC, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_START)) { + // (start NUMBER #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_START, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_STANDBY)) { + // (standby %Text; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_STANDBY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_STYLE)) { + // (style %StyleSheet; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.STYLE_SHEET); + attr = new HTMLAttrDeclImpl(ATTR_NAME_STYLE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SUMMARY)) { + // (summary %Text; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SUMMARY, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TABINDEX)) { + // (tabindex NUMBER #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TABINDEX, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TARGET)) { + // (target %FrameTarget; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.FRAME_TARGET); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TARGET, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TEXT)) { + // (text CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TEXT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TEXTFOCUS)) { + // (textfocus CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TEXTFOCUS, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TITLE)) { + // (title %Text; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TITLE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TIMEFMT)) { + // (timefmt CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TIMEFMT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TRUESPEED)) { + // (truespeed (truespeed) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_TRUESPEED}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TRUESPEED, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TYPE)) { + // (type %CotentType; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_USEMAP)) { + // (usemap %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_USEMAP, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VALIGN)) { + // (valign (top|middle|bottom|baseline) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_BASELINE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VALIGN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VALUE)) { + // (value CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VALUETYPE)) { + // (valuetype (DATA|REF|OBJECT) DATA) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_DATA, ATTR_VALUE_REF, ATTR_VALUE_OBJECT}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_DATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUETYPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VAR)) { + // (var CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VAR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VERSION)) { + // (version CDATA #FIXED '%HTML.Version;) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_FIXED, ATTR_VALUE_VERSION_TRANSITIONAL); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VERSION, atype, CMAttributeDeclaration.FIXED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VIRTUAL)) { + // (virtual %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VIRTUAL, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VLINK)) { + // (vlink %Color; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VLINK, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VOLUME)) { + // (volume CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VOLUME, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_WIDTH)) { + // (width %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VSPACE)) { + // (vspace %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VSPACE, atype, CMAttributeDeclaration.OPTIONAL); + + // <<D205514 + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TOPMARGIN)) { + // (topmargin, CDATA, #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TOPMARGIN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BOTTOMMARGIN)) { + // (bottommargin, CDATA, #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BOTTOMMARGIN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_LEFTMARGIN)) { + // (leftmargin, CDATA, #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_LEFTMARGIN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_RIGHTMARGIN)) { + // (rightmargin, CDATA, #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_RIGHTMARGIN, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BORDERCOLOR)) { + // (bordercolor, %Color; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDERCOLOR, atype, CMAttributeDeclaration.OPTIONAL); + // D205514 + + } + else { + // unknown attribute; maybe error. + // should warn. + attr = null; + } + + return attr; + } + + /** + * Get align attribute which has %CAlign; as values.. + * At this time (4/19/2001), it is identical to %LAlign;. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public static final HTMLAttrDeclImpl createAlignForCaption() { + // align (local) + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values + String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + return attr; + } + + /** + * Get align attribute which has %IAlign; as values.. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public static final HTMLAttrDeclImpl createAlignForImage() { + // align (local) + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values + String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + return attr; + } + + /** + * Get align attribute which has %LAlign; as values.. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public static final HTMLAttrDeclImpl createAlignForLegend() { + // align (local) + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values + String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + return attr; + } + + /** + * Create an attribute declaration for <code>align</code> + * in several elements, like <code>P</code>, <code>DIV</code>. + * The values are different from attributes those have the same name + * in other elements (<code>IMG</code> and <code>TABLE</code>). + * So, it can't treat as global attributes. + * <strong>NOTE: These attribute declaration has + * no owner CMDocument instance.</strong> + * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl + */ + public static final HTMLAttrDeclImpl createAlignForParagraph() { + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values: left|center|right|justify + String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT, ATTR_VALUE_JUSTIFY}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + return attr; + } + + /** + * Get %attrs; declarations. + * %attrs; consists of %coreattrs;, %i18n, and %events;. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getAttrs(CMNamedNodeMapImpl declarations) { + // %coreattrs; + Iterator names = Arrays.asList(CORE).iterator(); + getDeclarations(declarations, names); + // %i18n; + names = Arrays.asList(I18N).iterator(); + getDeclarations(declarations, names); + // %events; + names = Arrays.asList(EVENTS).iterator(); + getDeclarations(declarations, names); + } + + /** + * Get %bodycolors; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getBodycolors(CMNamedNodeMapImpl declarations) { + Iterator names = Arrays.asList(BODYCOLORS).iterator(); + getDeclarations(declarations, names); + } + + /** + * Get %cellhalign; declarations. + * %cellhaligh; consists of: + * - (align (left|center|right|justify|char) #IMPLIED) + * - (char %Character; #IMPLIED) + * - (charoff %Length; #IMPLIED) + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getCellhalign(CMNamedNodeMapImpl declarations) { + // (align (left|center|right|justify|char) #IMPLIED) should be defined + // locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values + String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT, ATTR_VALUE_JUSTIFY, ATTR_VALUE_CHAR}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + declarations.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + + // the rest. + Iterator names = Arrays.asList(CELLHALIGN).iterator(); + getDeclarations(declarations, names); + } + + /** + * Get %cellvalign; declarations. + * %cellhaligh; is: + * - (valign (top|middle|bottom|baseline) #IMPLIED) + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getCellvalign(CMNamedNodeMapImpl declarations) { + HTMLAttributeDeclaration dec = getDeclaration(HTML40Namespace.ATTR_NAME_VALIGN); + if (dec != null) + declarations.putNamedItem(HTML40Namespace.ATTR_NAME_VALIGN, dec); + } + + /** + * Get %coreattrs; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getCore(CMNamedNodeMapImpl declarations) { + Iterator names = Arrays.asList(CORE).iterator(); + getDeclarations(declarations, names); + } + + /** + * Get a global attribute declaration. + * @return com.ibm.sed.contentmodel.html.HTMLAttrributeDeclaration + * @param attrName java.lang.String + */ + public HTMLAttributeDeclaration getDeclaration(String attrName) { + CMNode cmnode = getNamedItem(attrName); + if (cmnode != null) + return (HTMLAttributeDeclaration) cmnode; // already exists. + + HTMLAttrDeclImpl dec = create(attrName); + if (dec != null) + putNamedItem(attrName, dec); + + return dec; + } + + /** + * Get declarations which are specified by names. + * @param declarations com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + * @param names java.util.Iterator + */ + public void getDeclarations(CMNamedNodeMapImpl declarations, Iterator names) { + while (names.hasNext()) { + String attrName = (String) names.next(); + HTMLAttributeDeclaration dec = getDeclaration(attrName); + if (dec != null) + declarations.putNamedItem(attrName, dec); + } + } + + /** + * Get %events; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getEvents(CMNamedNodeMapImpl declarations) { + Iterator names = Arrays.asList(EVENTS).iterator(); + getDeclarations(declarations, names); + } + + /** + * Get %i18n; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getI18n(CMNamedNodeMapImpl declarations) { + Iterator names = Arrays.asList(I18N).iterator(); + getDeclarations(declarations, names); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java new file mode 100644 index 0000000000..dac7c81524 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; + + + +/** + * Implementation of CMContent for HTML CM. + */ +abstract class CMContentImpl extends CMNodeImpl implements CMContent { + + public static final int UNBOUNDED = -1; + /** -1: it's UNBOUNDED. */ + private int maxOccur = UNBOUNDED; + /** 0: it's OPTIONAL, 1, it's REQUIRED. */ + private int minOccur = 0; + + /** + * The primary consturctor. + * Use this one for usual cases.<br> + */ + public CMContentImpl(String name, int min, int max) { + super(name); + minOccur = min; + maxOccur = max; + } + + /** + * getMaxOccur method + * @return int + * + * If -1, it's UNBOUNDED. + */ + public int getMaxOccur() { + return maxOccur; + } + + /** + * getMinOccur method + * @return int + * + * If 0, it's OPTIONAL. + * If 1, it's REQUIRED. + */ + public int getMinOccur() { + return minOccur; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java new file mode 100644 index 0000000000..a8ab34c9c1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList; + +/** + */ +class CMGroupImpl extends CMContentImpl implements CMGroup { + + private int operator = CMGroup.SEQUENCE; + private CMNodeListImpl children = null; + + /** + * CMGroupImpl constructor comment. + */ + public CMGroupImpl(int op, int minOccur, int maxOccur) { + super(null, minOccur, maxOccur); + switch (op) { + case CMGroup.ALL : + case CMGroup.CHOICE : + case CMGroup.SEQUENCE : + operator = op; + break; + default : + // should warn. + break; + } + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + protected CMNode appendChild(CMNode child) { + if (child == null) + return null; + if (children == null) + children = new CMNodeListImpl(); + return children.appendNode(child); + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList + */ + public CMNodeList getChildNodes() { + return children; + } + + /** + * getNodeType method + * @return int + * + * Returns one of : + * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION. + */ + public int getNodeType() { + return CMNode.GROUP; + } + + /** + * getOperation method + * @return int + * + * Returns one of : + * ALONE (a), SEQUENCE (a,b), CHOICE (a|b), ALL (a&b). + */ + public int getOperator() { + return operator; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java new file mode 100644 index 0000000000..21ce1b23a2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Hashtable; +import java.util.Iterator; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * An implementation of the CMNamedNodeMap interface. + * This class is intented to be used as a container of attribute declarations. + * If someone wants to use this class for other purpose, he must pay attention + * to the fact that this class is tolerant of the key name case. That is, this + * class does not distinguish "name", "NAME", and "Name" as a key name. + */ +class CMNamedNodeMapImpl implements CMNamedNodeMap { + + private Hashtable items = null; + + /** + */ + public CMNamedNodeMapImpl() { + super(); + items = new Hashtable(); + } + + /** + * getLength method + * @return int + */ + public int getLength() { + return items.size(); + } + + /** + * getNamedItem method + * @return CMNode <code>null</code> for unknown keys. + * @param name java.lang.String + */ + public CMNode getNamedItem(String name) { + String cookedName = makeCanonicalForm(name); + if (!items.containsKey(cookedName)) + return null; + return (CMNode) items.get(cookedName); + } + + /** + * item method + * @return CMNode + * @param index int + */ + public CMNode item(int index) { + Iterator iter = iterator(); + while (iter.hasNext()) { + CMNode node = (CMNode) iter.next(); + if (--index < 0) + return node; + } + return null; + } + + /** + * @return java.util.Iterator + */ + public Iterator iterator() { + return items.values().iterator(); + } + + /** + * @return java.lang.String + * @param rawForm java.lang.String + */ + private String makeCanonicalForm(String rawForm) { + return rawForm.toUpperCase(); + } + + /** + * @param key java.lang.String + * @param item java.lang.String + */ + void putNamedItem(String name, CMNode item) { + String cookedName = makeCanonicalForm(name); + if (items.containsKey(cookedName)) + return; // already registered. + items.put(cookedName, item); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java new file mode 100644 index 0000000000..20f4c283a7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * CMNamespace implementation. + */ +class CMNamespaceImpl extends CMNodeImpl implements CMNamespace { + + private java.lang.String prefix = null; + + /** + * CMNamespaceImpl constructor comment. + */ + public CMNamespaceImpl(String uri, String pfx) { + super(uri); + prefix = pfx; + } + + /** + * getNodeType method + * @return int + * + * Returns one of : + * + */ + public int getNodeType() { + return CMNode.NAME_SPACE; + } + + /** + * getPrefix method + * @return java.lang.String + */ + public String getPrefix() { + return prefix; + } + + /** + * getURI method + * @return java.lang.String + */ + public String getURI() { + return getNodeName(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java new file mode 100644 index 0000000000..bb9d68e5bc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + + + +/** + */ +abstract class CMNodeImpl implements CMNode { + + private java.lang.String name = null; + + /** + * CMNodeImpl constructor comment. + */ + public CMNodeImpl(String nm) { + super(); + name = nm; + } + + /** + * getNodeName method + * @return java.lang.String + */ + public String getNodeName() { + return name; + } + + /** + * getProperty method + * @return java.lang.Object + * + * Returns the object property desciped by the propertyName + * + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.IS_XHTML)) + return new Boolean(false); + return null; + } + + /** + * supports method + * @return boolean + * + * Returns true if the CMNode supports a specified property + * + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.IS_XHTML)) + return true; + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java new file mode 100644 index 0000000000..33ceec8f56 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList; + +/** + * Analog of dom.NodeList for CM. + * So, the implementation is very similar to + * {@link com.ibm.sed.model.xml.NodeListImpl}.<br> + */ +class CMNodeListImpl implements CMNodeList { + + private java.util.Vector nodes = null; + + /** + * CMNodeListImpl constructor comment. + */ + public CMNodeListImpl() { + super(); + nodes = new java.util.Vector(); + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param node org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + protected CMNode appendNode(CMNode node) { + nodes.addElement(node); + return node; + } + + /** + * getLength method + * @return int + */ + public int getLength() { + return nodes.size(); + } + + /** + * item method + * @return CMNode + * @param index int + */ + public CMNode item(int index) { + if (index < 0 || index >= nodes.size()) + return null; + return (CMNode) nodes.elementAt(index); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java new file mode 100644 index 0000000000..79a286c1b5 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * This class is intended to represent a complex type definition + * in XML Schema.<br> + */ +abstract class ComplexTypeDefinition { + + protected CMGroupImpl content = null; + protected ElementCollection collection = null; + protected String primaryCandidateName = null; + + /** + * ComplexTypeDefinition constructor comment. + */ + public ComplexTypeDefinition(ElementCollection elementCollection) { + super(); + collection = elementCollection; + createContent(); + } + + /** + * Create an actual content model. + * This method should be called once and only once in the constructor.<br> + */ + protected abstract void createContent(); + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMGroup + */ + public CMGroup getContent() { + return content; + } + + /** + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + /* NOTE: Do we need LOGICAL type? + * -- 3/7/2001 + */ + public abstract int getContentType(); + + /** + * Get content hint. + * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public HTMLElementDeclaration getPrimaryCandidate() { + if (primaryCandidateName == null) + return null; + return (HTMLElementDeclaration) collection.getNamedItem(primaryCandidateName); + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public abstract String getTypeName(); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java new file mode 100644 index 0000000000..59552a32ae --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java @@ -0,0 +1,185 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * Factory of ComplexTypeDefinition. + */ +final class ComplexTypeDefinitionFactory { + + private static ComplexTypeDefinitionFactory instance = null; + private java.util.Hashtable definitions = null; + // constants for complex type name + /** for ADDRESS. */ + public final static String CTYPE_ADDRESS = "CTYPE_ADDRESS";//$NON-NLS-1$ + /** CDATA content. No ComplexTypeDefinition instance shuld be created. */ + public final static String CTYPE_CDATA = "CTYPE_CDATA";//$NON-NLS-1$ + /** col group content. COL* */ + public final static String CTYPE_COLUMN_GROUP = "CTYPE_COLUMN_GROUP";//$NON-NLS-1$ + /** for DL. */ + public final static String CTYPE_DEFINITION_LIST = "CTYPE_DEFINITION_LIST";//$NON-NLS-1$ + /** for EMBED. */ + public final static String CTYPE_EMBED = "CTYPE_EMBED";//$NON-NLS-1$ + /** empty content. No ComplexTypeDefinition instance should be created. */ + public final static String CTYPE_EMPTY = "CTYPE_EMPTY";//$NON-NLS-1$ + /** for FIELDSET. */ + public final static String CTYPE_FIELDSET = "CTYPE_FIELDSET";//$NON-NLS-1$ + /** for FRAMESET. */ + public final static String CTYPE_FRAMESET = "CTYPE_FRAMESET";//$NON-NLS-1$ + /** flow content. (%flow;)* */ + public final static String CTYPE_FLOW_CONTAINER = "CTYPE_FLOW_CONTAINER";//$NON-NLS-1$ + /** html content. HEAD, (FRAMESET|BODY) */ + public final static String CTYPE_HTML = "CTYPE_HTML";//$NON-NLS-1$ + /** head content. TITLE & ISINDEX? & BASE? */ + public final static String CTYPE_HEAD = "CTYPE_HEAD";//$NON-NLS-1$ + /** inline content. (%inline;)* */ + public final static String CTYPE_INLINE_CONTAINER = "CTYPE_INLINE_CONTAINER";//$NON-NLS-1$ + /** list item container. (LI)+ */ + public final static String CTYPE_LI_CONTAINER = "CTYPE_LI_CONTAINER";//$NON-NLS-1$ + /** for MAP. */ + public final static String CTYPE_MAP = "CTYPE_MAP";//$NON-NLS-1$ + /** noframes content. */ + public final static String CTYPE_NOFRAMES_CONTENT = "CTYPE_NOFRAMES_CONTENT";//$NON-NLS-1$ + /** for OPTGROUP. */ + public final static String CTYPE_OPTION_CONTAINER = "CTYPE_OPTION_CONTAINER";//$NON-NLS-1$ + /** param container. For OBJECT/APPLET. */ + public final static String CTYPE_PARAM_CONTAINER = "CTYPE_PARAM_CONTAINER";//$NON-NLS-1$ + /** PCDATA content. No ComplexTypeDefinition instance shuld be created. */ + public final static String CTYPE_PCDATA = "CTYPE_PCDATA";//$NON-NLS-1$ + /** for SELECT. */ + public final static String CTYPE_SELECT = "CTYPE_SELECT";//$NON-NLS-1$ + /** table content. CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+ */ + public final static String CTYPE_TABLE = "CTYPE_TABLE";//$NON-NLS-1$ + /** table cell contaier. (TH|TD)+ */ + public final static String CTYPE_TCELL_CONTAINER = "CTYPE_TCELL_CONTAINER";//$NON-NLS-1$ + /** table record container. (TR)+ */ + public final static String CTYPE_TR_CONTAINER = "CTYPE_TR_CONTAINER";//$NON-NLS-1$ + + /** + * ComplexTypeDefinitionFactory constructor comment. + */ + private ComplexTypeDefinitionFactory() { + super(); + definitions = new java.util.Hashtable(); + } + + /** + * Factory method for ComplexTypeDefinition. + * Each instance created in this method must be registered into + * the map with its name. + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition + * @param definitionName java.lang.String + * @param elementCollection ElementCollection + */ + public ComplexTypeDefinition createTypeDefinition(String definitionName, ElementCollection elementCollection) { + if (definitions.containsKey(definitionName)) { + return (ComplexTypeDefinition) definitions.get(definitionName); + } + + ComplexTypeDefinition def = null; + if (definitionName == CTYPE_ADDRESS) { + def = new CtdAddress(elementCollection); + + } + else if (definitionName == CTYPE_COLUMN_GROUP) { + def = new CtdColumnGroup(elementCollection); + + } + else if (definitionName == CTYPE_DEFINITION_LIST) { + def = new CtdDl(elementCollection); + + } + else if (definitionName == CTYPE_EMBED) { + def = new CtdEmbed(elementCollection); + + } + else if (definitionName == CTYPE_FIELDSET) { + def = new CtdFieldset(elementCollection); + + } + else if (definitionName == CTYPE_FLOW_CONTAINER) { + def = new CtdFlowContainer(elementCollection); + + } + else if (definitionName == CTYPE_FRAMESET) { + def = new CtdFrameset(elementCollection); + + } + else if (definitionName == CTYPE_HEAD) { + def = new CtdHead(elementCollection); + + } + else if (definitionName == CTYPE_HTML) { + def = new CtdHtml(elementCollection); + + } + else if (definitionName == CTYPE_INLINE_CONTAINER) { + def = new CtdInlineContainer(elementCollection); + + } + else if (definitionName == CTYPE_LI_CONTAINER) { + def = new CtdLiContainer(elementCollection); + + } + else if (definitionName == CTYPE_MAP) { + def = new CtdMap(elementCollection); + + } + else if (definitionName == CTYPE_NOFRAMES_CONTENT) { + def = new CtdNoframesContent(elementCollection); + + } + else if (definitionName == CTYPE_OPTION_CONTAINER) { + def = new CtdOptionContainer(elementCollection); + + } + else if (definitionName == CTYPE_PARAM_CONTAINER) { + def = new CtdParamContainer(elementCollection); + + } + else if (definitionName == CTYPE_SELECT) { + def = new CtdSelect(elementCollection); + + } + else if (definitionName == CTYPE_TABLE) { + def = new CtdTable(elementCollection); + + } + else if (definitionName == CTYPE_TCELL_CONTAINER) { + def = new CtdTableCellContainer(elementCollection); + + } + else if (definitionName == CTYPE_TR_CONTAINER) { + def = new CtdTrContainer(elementCollection); + + } + else { + def = null; + } + if (def == null) + return null; // fail to create. + definitions.put(definitionName, def); + return def; + } + + /** + * For singleton.<br> + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinitionFactory + */ + public synchronized static ComplexTypeDefinitionFactory getInstance() { + if (instance != null) + return instance; + instance = new ComplexTypeDefinitionFactory(); + return instance; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java new file mode 100644 index 0000000000..c79f788eaa --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for ADDRESS. + */ +final class CtdAddress extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdAddress(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * ((%inline) | P)*. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )* + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + // (%inline) + CMGroupImpl inlines = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (inlines == null) + return; + collection.getInline(inlines); + content.appendChild(inlines); + // P + CMNode p = collection.getNamedItem(HTML40Namespace.ElementName.P); + if (p != null) + content.appendChild(p); + } + + /** + * ((%inline) | P)*. + * Because %inline; contains #PCDATA, the type is MIXED. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_ADDRESS; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java new file mode 100644 index 0000000000..b0b2e59aa3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * COL group. + * (COL)* + */ +final class CtdColumnGroup extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdColumnGroup(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * (COL)* + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( )* + content = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED); + // COL + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.COL); + if (dec != null) + content.appendChild(dec); + } + + /** + * (COL)* + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_COLUMN_GROUP; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java new file mode 100644 index 0000000000..561b2142d6 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for DL. + */ +final class CtdDl extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdDl(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.DT; + } + + /** + * (DT | DD)+ + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )+ + content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + // DT + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.DT); + if (dec != null) + content.appendChild(dec); + // DD + dec = collection.getNamedItem(HTML40Namespace.ElementName.DD); + if (dec != null) + content.appendChild(dec); + } + + /** + * (DT | DD)+. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java new file mode 100644 index 0000000000..a96fcc616a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for EMBED. + */ +final class CtdEmbed extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdEmbed(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.NOEMBED; + } + + /** + * (NOEMBED). + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( ) + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + // NOEMBED + CMNode noembed = collection.getNamedItem(HTML40Namespace.ElementName.NOEMBED); + if (noembed != null) + content.appendChild(noembed); + } + + /** + * (NOEMBED). + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_EMBED; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java new file mode 100644 index 0000000000..61713a377f --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for FIELDSET. + */ +final class CtdFieldset extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdFieldset(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.LEGEND; + } + + /** + * (#PCDATA, LEGEND, (%flow;)*) + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( , , ) + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + // #PCDATA + // ...?? + + // LEGEND + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.LEGEND); + if (dec != null) + content.appendChild(dec); + // (%flow;)* + CMGroupImpl flows = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + if (flows == null) + return; + collection.getFlow(flows); + content.appendChild(flows); + } + + /** + * (#PCDATA, LEGEND, (%flow;)*) + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_FIELDSET; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java new file mode 100644 index 0000000000..3bdad70d20 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * Complex type definition for containers of <code>%flow;</code>. + */ +final class CtdFlowContainer extends ComplexTypeDefinition { + + /** + */ + public CtdFlowContainer(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * (%flow;)* + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + collection.getFlow(content); + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java new file mode 100644 index 0000000000..42b79bdc59 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for FRAMESET. + * ((FRAMESET | FRAME)+ & NOFRAMES?) + */ +final class CtdFrameset extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdFrameset(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.FRAME; + } + + /** + * ((FRAMESET | FRAME)+ & NOFRAMES?). + * --> ((FRAMESET | FRAME)+ & (NOFRAMES)?) + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( & ) + content = new CMGroupImpl(CMGroup.ALL, 1, 1); + + // ( | )+ + CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + if (group == null) + return; + content.appendChild(group); + + // FRAMESET + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.FRAMESET); + if (dec != null) + group.appendChild(dec); + // FRAME + dec = collection.getNamedItem(HTML40Namespace.ElementName.FRAME); + if (dec != null) + group.appendChild(dec); + + // ( )? + group = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1); + if (group == null) + return; + content.appendChild(group); + + // NOFRAMES + dec = collection.getNamedItem(HTML40Namespace.ElementName.NOFRAMES); + if (dec != null) + group.appendChild(dec); + } + + /** + * ((FRAMESET | FRAME)+ & NOFRAMES?) + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_FRAMESET; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java new file mode 100644 index 0000000000..e0e321c499 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java @@ -0,0 +1,176 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Complex type definition for the head content. + * Content Model: (TITLE & ISINDEX? & BASE?) + */ +final class CtdHead extends ComplexTypeDefinition { + + /** + */ + public CtdHead(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.TITLE; + } + + /** + * for HEAD. + * To avoid using inclusion, the content model comes from the XHTML 1.0. + * + * (%head.misc;, ((title, %head.misc;, (base, %head.misc;)?) | (base, %head.misc;, (title, %head.misc;)))) + * And %head.misc; is: + * (script|style|meta|link|object|isindex)* + * + * 0: (%head.misc, A) + * A: (B | C) + * B: (title, %head.misc;, D) + * C: (base, %head.misc;, E) + * D: (base, %head.misc;)? + * E: (title, %head.misc;) + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // At 1st, create %head.misc; content. + // %head.misc; + // ( | )* + CMGroupImpl misc = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + if (misc == null) + return; + String[] names = {HTML40Namespace.ElementName.SCRIPT, HTML40Namespace.ElementName.STYLE, HTML40Namespace.ElementName.META, HTML40Namespace.ElementName.LINK, HTML40Namespace.ElementName.OBJECT, HTML40Namespace.ElementName.ISINDEX}; + collection.getDeclarations(misc, Arrays.asList(names).iterator()); + // 2nd, get a title + CMNode title = collection.getNamedItem(HTML40Namespace.ElementName.TITLE); + // 3rd, get a base + CMNode base = collection.getNamedItem(HTML40Namespace.ElementName.BASE); + if (title == null || base == null) + return; + + // Top level content is a sequence of %head.misc; and A. + // 0: (%head.misc;, A) + // create a sequence + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (content == null) + return; + // append %head.misc; + content.appendChild(misc); + // create A and append it to the top level. + { + // A is a choice of B and C. + // A: (B | C) + // create a choice + CMGroupImpl gA = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (gA == null) + return; + // append A to the top level. + content.appendChild(gA); + + // create B and append it to A + { + // B is a sequence of title, %head.misc;, and D. + // B: (title, %head.misc;, D) + // create a sequence + CMGroupImpl gB = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (gB == null) + return; + // append B to A. + gA.appendChild(gB); + + // append title to B + gB.appendChild(title); + // append %head.misc; to B + gB.appendChild(misc); + // create D and append it to B. + { + // D is a sequence of base, %head.misc;. + // D: (base, %head.misc;)? + // create a sequence + CMGroupImpl gD = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1); + if (gD == null) + return; + // append D to B. + gB.appendChild(gD); + + // append base to D + gD.appendChild(base); + // append %head.misc; to D. + gD.appendChild(misc); + } + } + // create C and append it to A + { + // C is a sequence of base, %head.misc;, and E + // C: (base, %head.misc;, E) + // create a sequence + CMGroupImpl gC = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (gC == null) + return; + // append C to A. + gA.appendChild(gC); + + // append base to C + gC.appendChild(base); + // append %head.misc; to C + gC.appendChild(misc); + + // create E and append it to C. + { + // E is a sequence of title and %head.misc;. + // E: (title, %head.misc;) + // create a sequence + CMGroupImpl gE = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (gE == null) + return; + // append E to C. + gC.appendChild(gE); + + // append title to E + gE.appendChild(title); + // append %head.misc; to E. + gE.appendChild(misc); + } + } + } + } + + /** + * Element content.<br> + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_HEAD; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java new file mode 100644 index 0000000000..7949e14282 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Complex type definition for <code>HTML</code>.<br> + * Content Model: + * HEAD, (FRAMESET|BODY)<br> + */ +final class CtdHtml extends ComplexTypeDefinition { + + /** + */ + public CtdHtml(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.HEAD; + } + + /** + * (%html.content;). + * %html.content; is HEAD, (FRAMESET | BODY). + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( ) + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (content == null) + return; + + // HEAD + CMNode edec = collection.getNamedItem(HTML40Namespace.ElementName.HEAD); + if (edec != null) + content.appendChild(edec); + + // ( | ) + CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + content.appendChild(group); + + // FRAMESET, BODY + String[] names = {HTML40Namespace.ElementName.FRAMESET, HTML40Namespace.ElementName.BODY}; + collection.getDeclarations(group, Arrays.asList(names).iterator()); + } + + /** + * Element content. + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_HTML; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java new file mode 100644 index 0000000000..6a4cb93821 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * Complex type definition for (%inline;)*. + */ +final class CtdInlineContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdInlineContainer(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * (%inline)*. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + collection.getInline(content); + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java new file mode 100644 index 0000000000..edc4b6929d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * List item container. + * (LI)+ + */ +final class CtdLiContainer extends ComplexTypeDefinition { + + /** + * @param elemenCollection ElementCollection + */ + public CtdLiContainer(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.LI; + } + + /** + * (LI)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // (LI)+ + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + CMNode li = collection.getNamedItem(HTML40Namespace.ElementName.LI); + if (li != null) + content.appendChild(li); + } + + /** + * ELEMENT content.<br> + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java new file mode 100644 index 0000000000..9e08bb3839 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for MAP. + */ +final class CtdMap extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdMap(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.AREA; + } + + /** + * ((%block;) | AREA)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )+ + content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + // (%block;) + CMGroupImpl blocks = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (blocks == null) + return; + collection.getBlock(blocks); + content.appendChild(blocks); + // AREA + CMNode area = collection.getNamedItem(HTML40Namespace.ElementName.AREA); + if (area != null) + content.appendChild(area); + } + + /** + * ((%block;) | AREA)+. + * Because %block; consists of elements only, the type is ELEMENT. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_MAP; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java new file mode 100644 index 0000000000..f9a30c1123 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for NOFRAMES. + */ +final class CtdNoframesContent extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdNoframesContent(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.BODY; + } + + /** + * (BODY). + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( ) + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + // BODY + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.BODY); + if (dec != null) + content.appendChild(dec); + } + + /** + * (BODY) + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_NOFRAMES_CONTENT; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java new file mode 100644 index 0000000000..e3f4fde2e3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * OPTION container. + * (OPTION)+ + */ +final class CtdOptionContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdOptionContainer(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.OPTION; + } + + /** + * (OPTION)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( )+ + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + // OPTION + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTION); + if (dec != null) + content.appendChild(dec); + } + + /** + * (OPTION)+ + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_OPTION_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java new file mode 100644 index 0000000000..e2aa03ccd5 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * PARAM container. For OBJECT and APPLET. + */ +final class CtdParamContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdParamContainer(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * (PARAM | %flow;)*. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )* + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + // PARAM + CMNode param = collection.getNamedItem(HTML40Namespace.ElementName.PARAM); + if (param != null) + content.appendChild(param); + // %flow; + CMGroupImpl flows = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (flows == null) + return; + collection.getInline(flows); + content.appendChild(flows); + } + + /** + * (PARAM | %flow;)*. + * Because %flow; contains #PCDATA, the type is MIXED. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_PARAM_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java new file mode 100644 index 0000000000..50659d06bc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for SELECT. + */ +final class CtdSelect extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdSelect(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.OPTION; + } + + /** + * (OPTGROUP | OPTION)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )+ + content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + // OPTGROUP + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTGROUP); + if (dec != null) + content.appendChild(dec); + // OPTION + dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTION); + if (dec != null) + content.appendChild(dec); + } + + /** + * (OPTGROUP | OPTION)+. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_SELECT; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java new file mode 100644 index 0000000000..6357a3bb18 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for TABLE. + * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+) + */ +final class CtdTable extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdTable(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.TBODY; + } + + /** + * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+) + * --> ((CAPTION)?, ((COL)* | (COLGROUP)*), (THEAD)?, (TFOOT)?, (TBODY)+) + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( , , , ,) + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + + // (CAPTION)? + // ( )? + CMGroupImpl wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1); + if (wrap == null) + return; + content.appendChild(wrap); + // CAPTION + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.CAPTION); + if (dec != null) + wrap.appendChild(dec); + + // ((COL)* | (COLGROUP)*) + // ( | ) + CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (group == null) + return; + content.appendChild(group); + // (COL)* + wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED); + if (wrap == null) + return; + group.appendChild(wrap); + dec = collection.getNamedItem(HTML40Namespace.ElementName.COL); + if (dec != null) + wrap.appendChild(dec); + // (COLGROUP)* + wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED); + if (wrap == null) + return; + group.appendChild(wrap); + dec = collection.getNamedItem(HTML40Namespace.ElementName.COLGROUP); + if (dec != null) + wrap.appendChild(dec); + + // (THEAD)? + wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1); + if (wrap == null) + return; + content.appendChild(wrap); + dec = collection.getNamedItem(HTML40Namespace.ElementName.THEAD); + if (dec != null) + wrap.appendChild(dec); + + // (TFOOT)? + wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1); + if (wrap == null) + return; + content.appendChild(wrap); + dec = collection.getNamedItem(HTML40Namespace.ElementName.TFOOT); + if (dec != null) + wrap.appendChild(dec); + + // (TBODY)+ + wrap = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + if (wrap == null) + return; + content.appendChild(wrap); + dec = collection.getNamedItem(HTML40Namespace.ElementName.TBODY); + if (dec != null) + wrap.appendChild(dec); + } + + /** + * ((FRAMESET | FRAME)+ & NOFRAMES?) + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_TABLE; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java new file mode 100644 index 0000000000..24a6ad61c8 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Table cell container. + * (TH | TD)+ + */ +final class CtdTableCellContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdTableCellContainer(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.TD; + } + + /** + * (TH | TD)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( )+ + content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + // TH + CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.TH); + if (dec != null) + content.appendChild(dec); + // TD + dec = collection.getNamedItem(HTML40Namespace.ElementName.TD); + if (dec != null) + content.appendChild(dec); + } + + /** + * (TH | TD)+ + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_TCELL_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java new file mode 100644 index 0000000000..2f8b5ef696 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Table record container. + * (TR)+ + */ +final class CtdTrContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdTrContainer(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = HTML40Namespace.ElementName.TR; + } + + /** + * (TR)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // (TR)+ + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + CMNode tr = collection.getNamedItem(HTML40Namespace.ElementName.TR); + if (tr != null) + content.appendChild(tr); + } + + /** + * ELEMENT content.<br> + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_TR_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java new file mode 100644 index 0000000000..4b0d55840d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java @@ -0,0 +1,238 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.HashMap; +import java.util.Iterator; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + */ +abstract class DeclCollection implements CMNamedNodeMap { + + + protected class DualMap { + public DualMap() { + super(); + } + + public DualMap(Object[] objects) { + super(); + initialize(objects); + } + + public int size() { + return table.length; + } + + public Object getValue(int key) { + if (!isValidIndex(key)) + return null; + return table[key]; + } + + public int getKey(Object value) { + Integer keyObj = (Integer) map.get(value); + if (keyObj == null) + return ID_UNKNOWN; + return keyObj.intValue(); + } + + protected void initialize(Object[] objects) { + if (objects == null) + return; + table = objects; + map = new HashMap(); + for (int key = 0; key < objects.length; key++) { + Object value = table[key]; + map.put(value, new Integer(key)); + } + } + + private Object[] table = null; + private HashMap map = null; + + private boolean isValidIndex(int index) { + return index >= 0 && index < table.length; + } + } + + protected class TolerantStringDualMap extends DualMap { + public TolerantStringDualMap(String[] names) { + super(); + Object[] objects = new Object[names.length]; + for (int i = 0; i < names.length; i++) { + objects[i] = makeCanonicalForm(names[i]); + } + initialize(objects); + } + + public int getKey(Object value) { + try { + String name = (String) value; + return super.getKey(makeCanonicalForm(name)); + } + catch (ClassCastException e) { + return ID_UNKNOWN; + } + } + + private String makeCanonicalForm(String raw) { + return raw.toUpperCase(); + } + } + + private class DeclIterator implements Iterator { + public DeclIterator() { + maxid = fDecls.length - 1; + } + + public boolean hasNext() { + return id < maxid; + } + + public Object next() { + if (!hasNext()) + return null; + return item(++id); + } + + public void remove() { /* nothing should be done. */ + } + + private int id = -1; + private int maxid = -1; + } + + CMNode[] fDecls = null; + protected final static boolean STRICT_CASE = false; + protected final static boolean TOLERANT_CASE = true; + protected final static int ID_UNKNOWN = -1; + private DualMap fMap = null; + + /** + */ + public DeclCollection(String[] names, boolean tolerant) { + super(); + fDecls = new CMNode[names.length]; + if (tolerant) { + fMap = new TolerantStringDualMap(names); + } + else { + fMap = new DualMap(names); + } + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param id int + */ + protected abstract CMNode create(String name); + + /** + */ + public CMNamedNodeMap getDeclarations(String[] names) { + CMNamedNodeMapImpl map = new CMNamedNodeMapImpl(); + for (int i = 0; i < names.length; i++) { + String name = names[i]; + CMNode node = getNamedItem(name); + if (node == null) + continue; + map.putNamedItem(name, node); + } + return map; + } + + /** + * @param declarations com.ibm.sed.contentmodel.html.CMGroupImpl + * @param names java.util.Iterator + */ + public void getDeclarations(CMGroupImpl group, Iterator names) { + while (names.hasNext()) { + String entityName = (String) names.next(); + CMNode dec = getNamedItem(entityName); + if (dec != null) + group.appendChild(dec); + } + } + + /** + * Map name to id. + * @return int + * @param name java.lang.String + */ + protected int getID(String name) { + return fMap.getKey(name); + } + + /** + * getLength method + * @return int + */ + public int getLength() { + return fDecls.length; + } + + /** + * @return java.lang.String + * @param id int + */ + protected String getName(int id) { + return (String) fMap.getValue(id); + } + + /** + * getNamedItem method + * @return CMNode + * @param name java.lang.String + */ + public CMNode getNamedItem(String name) { + int id = getID(name); + if (!isValidID(id)) + return null; + return item(id); + } + + /** + * @return boolean + * @param id int + */ + private boolean isValidID(int id) { + return id >= 0 && id < fDecls.length; + } + + /** + * item method + * @return CMNode + * @param index int + */ + public CMNode item(int index) { + if (!isValidID(index)) + return null; + CMNode decl = fDecls[index]; + if (decl != null) + return decl; // already exist. + + decl = create(getName(index)); + fDecls[index] = decl; + return decl; + } + + /** + */ + public Iterator iterator() { + return new DeclIterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java new file mode 100644 index 0000000000..db0c9888d2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java @@ -0,0 +1,886 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.Vector; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for element declarations. + */ +final class ElementCollection extends DeclCollection implements org.eclipse.wst.html.core.HTML40Namespace.ElementName { + + + // Element IDs + private static class Ids { + public static final int ID_A = 0; + public static final int ID_ABBR = 1; + public static final int ID_ACRONYM = 2; + public static final int ID_ADDRESS = 3; + public static final int ID_APPLET = 4; + public static final int ID_AREA = 5; + public static final int ID_B = 6; + public static final int ID_BASE = 7; + public static final int ID_BASEFONT = 8; + public static final int ID_BDO = 9; + public static final int ID_BIG = 10; + public static final int ID_BLINK = 11; + public static final int ID_BLOCKQUOTE = 12; + public static final int ID_BODY = 13; + public static final int ID_BR = 14; + public static final int ID_BUTTON = 15; + public static final int ID_CAPTION = 16; + public static final int ID_CENTER = 17; + public static final int ID_CITE = 18; + public static final int ID_CODE = 19; + public static final int ID_COL = 20; + public static final int ID_COLGROUP = 21; + public static final int ID_DD = 22; + public static final int ID_DEL = 23; + public static final int ID_DFN = 24; + public static final int ID_DIR = 25; + public static final int ID_DIV = 26; + public static final int ID_DL = 27; + public static final int ID_DT = 28; + public static final int ID_EM = 29; + public static final int ID_EMBED = 30; + public static final int ID_FIELDSET = 31; + public static final int ID_FONT = 32; + public static final int ID_FORM = 33; + public static final int ID_FRAME = 34; + public static final int ID_FRAMESET = 35; + public static final int ID_H1 = 36; + public static final int ID_H2 = 37; + public static final int ID_H3 = 38; + public static final int ID_H4 = 39; + public static final int ID_H5 = 40; + public static final int ID_H6 = 41; + public static final int ID_HEAD = 42; + public static final int ID_HR = 43; + public static final int ID_HTML = 44; + public static final int ID_I = 45; + public static final int ID_IFRAME = 46; + public static final int ID_IMG = 47; + public static final int ID_INPUT = 48; + public static final int ID_INS = 49; + public static final int ID_ISINDEX = 50; + public static final int ID_KBD = 51; + public static final int ID_LABEL = 52; + public static final int ID_LEGEND = 53; + public static final int ID_LI = 54; + public static final int ID_LINK = 55; + public static final int ID_MAP = 56; + public static final int ID_MENU = 57; + public static final int ID_META = 58; + public static final int ID_NOEMBED = 59; + public static final int ID_NOFRAMES = 60; + public static final int ID_NOSCRIPT = 61; + public static final int ID_OBJECT = 62; + public static final int ID_OL = 63; + public static final int ID_OPTGROUP = 64; + public static final int ID_OPTION = 65; + public static final int ID_P = 66; + public static final int ID_PARAM = 67; + public static final int ID_PRE = 68; + public static final int ID_Q = 69; + public static final int ID_S = 70; + public static final int ID_SAMP = 71; + public static final int ID_SCRIPT = 72; + public static final int ID_SELECT = 73; + public static final int ID_SMALL = 74; + public static final int ID_SPAN = 75; + public static final int ID_STRIKE = 76; + public static final int ID_STRONG = 77; + public static final int ID_STYLE = 78; + public static final int ID_SUB = 79; + public static final int ID_SUP = 80; + public static final int ID_TABLE = 81; + public static final int ID_TBODY = 82; + public static final int ID_TD = 83; + public static final int ID_TEXTAREA = 84; + public static final int ID_TFOOT = 85; + public static final int ID_TH = 86; + public static final int ID_THEAD = 87; + public static final int ID_TITLE = 88; + public static final int ID_TR = 89; + public static final int ID_TT = 90; + public static final int ID_U = 91; + public static final int ID_UL = 92; + public static final int ID_VAR = 93; + public static final int ID_MARQUEE = 94; + public static final int ID_SSI_CONFIG = 95; + public static final int ID_SSI_ECHO = 96; + public static final int ID_SSI_EXEC = 97; + public static final int ID_SSI_FSIZE = 98; + public static final int ID_SSI_FLASTMOD = 99; + public static final int ID_SSI_INCLUDE = 100; + public static final int ID_SSI_PRINTENV = 101; + public static final int ID_SSI_SET = 102; + // <<D205513 + public static final int ID_BGSOUND = 103; + public static final int ID_NOBR = 104; + public static final int ID_WBR = 105; + + // D205513 + + public static int getNumOfIds() { + if (numofids != -1) + return numofids; + + // NOTE: If the reflection is too slow, this method should + // just return the literal value, like 105. + // -- 5/25/2001 + Class clazz = Ids.class; + Field[] fields = clazz.getFields(); + numofids = 0; + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("ID_"))//$NON-NLS-1$ + numofids++; + } + return numofids; + } + + // chache the result of the reflection. + private static int numofids = -1; + } + + /** %fontstyle;. TT | I | B | U | S | STRIKE | BIG | SMALL | BLINK */ + private static final String[] FONTSTYLE = {TT, I, B, U, S, STRIKE, BIG, SMALL, BLINK}; + /** %formctl;. INPUT | SELECT | TEXTAREA | LABEL | BUTTON */ + private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA, LABEL, BUTTON}; + /** %phrase;. + * EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM + */ + private static final String[] PHRASE = {EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM}; + /** %special;. + * A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT | + * MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | EMBED | MARQUEE | + * D2W | SUBMIT + * WBR | NOBR | BGSOUND + */ + private static final String[] SPECIAL = {A, IMG, APPLET, OBJECT, FONT, BASEFONT, BR, WBR, // D205513 + SCRIPT, MAP, Q, SUB, SUP, SPAN, BDO, IFRAME, EMBED, BGSOUND, // D205513 + MARQUEE, NOBR // D205513 + }; + /** %heading;. H[1-6] */ + private static final String[] HEADING = {H1, H2, H3, H4, H5, H6}; + /** %list;. UL | OL | DIR | MENU */ + private static final String[] LIST = {UL, OL, DIR, MENU}; + /** %preformatted;. PRE */ + private static final String[] PREFORMATTED = {PRE}; + private AttributeCollection attributeCollection = null; + private static String[] fNames = null; + + static { + fNames = new String[Ids.getNumOfIds()]; + fNames[Ids.ID_A] = A; + fNames[Ids.ID_ABBR] = ABBR; + fNames[Ids.ID_ACRONYM] = ACRONYM; + fNames[Ids.ID_ADDRESS] = ADDRESS; + fNames[Ids.ID_APPLET] = APPLET; + fNames[Ids.ID_AREA] = AREA; + fNames[Ids.ID_B] = B; + fNames[Ids.ID_BASE] = BASE; + fNames[Ids.ID_BASEFONT] = BASEFONT; + fNames[Ids.ID_BDO] = BDO; + fNames[Ids.ID_BIG] = BIG; + fNames[Ids.ID_BLINK] = BLINK; + fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE; + fNames[Ids.ID_BODY] = BODY; + fNames[Ids.ID_BR] = BR; + fNames[Ids.ID_BUTTON] = BUTTON; + fNames[Ids.ID_CAPTION] = CAPTION; + fNames[Ids.ID_CENTER] = CENTER; + fNames[Ids.ID_CITE] = CITE; + fNames[Ids.ID_CODE] = CODE; + fNames[Ids.ID_COL] = COL; + fNames[Ids.ID_COLGROUP] = COLGROUP; + fNames[Ids.ID_DD] = DD; + fNames[Ids.ID_DEL] = DEL; + fNames[Ids.ID_DFN] = DFN; + fNames[Ids.ID_DIR] = DIR; + fNames[Ids.ID_DIV] = DIV; + fNames[Ids.ID_DL] = DL; + fNames[Ids.ID_DT] = DT; + fNames[Ids.ID_EM] = EM; + fNames[Ids.ID_EMBED] = EMBED; + fNames[Ids.ID_FIELDSET] = FIELDSET; + fNames[Ids.ID_FONT] = FONT; + fNames[Ids.ID_FORM] = FORM; + fNames[Ids.ID_FRAME] = FRAME; + fNames[Ids.ID_FRAMESET] = FRAMESET; + fNames[Ids.ID_H1] = H1; + fNames[Ids.ID_H2] = H2; + fNames[Ids.ID_H3] = H3; + fNames[Ids.ID_H4] = H4; + fNames[Ids.ID_H5] = H5; + fNames[Ids.ID_H6] = H6; + fNames[Ids.ID_HEAD] = HEAD; + fNames[Ids.ID_HR] = HR; + fNames[Ids.ID_HTML] = HTML; + fNames[Ids.ID_I] = I; + fNames[Ids.ID_IFRAME] = IFRAME; + fNames[Ids.ID_IMG] = IMG; + fNames[Ids.ID_INPUT] = INPUT; + fNames[Ids.ID_INS] = INS; + fNames[Ids.ID_ISINDEX] = ISINDEX; + fNames[Ids.ID_KBD] = KBD; + fNames[Ids.ID_LABEL] = LABEL; + fNames[Ids.ID_LEGEND] = LEGEND; + fNames[Ids.ID_LI] = LI; + fNames[Ids.ID_LINK] = LINK; + fNames[Ids.ID_MAP] = MAP; + fNames[Ids.ID_MENU] = MENU; + fNames[Ids.ID_META] = META; + fNames[Ids.ID_NOEMBED] = NOEMBED; + fNames[Ids.ID_NOFRAMES] = NOFRAMES; + fNames[Ids.ID_NOSCRIPT] = NOSCRIPT; + fNames[Ids.ID_OBJECT] = OBJECT; + fNames[Ids.ID_OL] = OL; + fNames[Ids.ID_OPTGROUP] = OPTGROUP; + fNames[Ids.ID_OPTION] = OPTION; + fNames[Ids.ID_P] = P; + fNames[Ids.ID_PARAM] = PARAM; + fNames[Ids.ID_PRE] = PRE; + fNames[Ids.ID_Q] = Q; + fNames[Ids.ID_S] = S; + fNames[Ids.ID_SAMP] = SAMP; + fNames[Ids.ID_SCRIPT] = SCRIPT; + fNames[Ids.ID_SELECT] = SELECT; + fNames[Ids.ID_SMALL] = SMALL; + fNames[Ids.ID_SPAN] = SPAN; + fNames[Ids.ID_STRIKE] = STRIKE; + fNames[Ids.ID_STRONG] = STRONG; + fNames[Ids.ID_STYLE] = STYLE; + fNames[Ids.ID_SUB] = SUB; + fNames[Ids.ID_SUP] = SUP; + fNames[Ids.ID_TABLE] = TABLE; + fNames[Ids.ID_TBODY] = TBODY; + fNames[Ids.ID_TD] = TD; + fNames[Ids.ID_TEXTAREA] = TEXTAREA; + fNames[Ids.ID_TFOOT] = TFOOT; + fNames[Ids.ID_TH] = TH; + fNames[Ids.ID_THEAD] = THEAD; + fNames[Ids.ID_TITLE] = TITLE; + fNames[Ids.ID_TR] = TR; + fNames[Ids.ID_TT] = TT; + fNames[Ids.ID_U] = U; + fNames[Ids.ID_UL] = UL; + fNames[Ids.ID_VAR] = VAR; + fNames[Ids.ID_MARQUEE] = MARQUEE; + fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG; + fNames[Ids.ID_SSI_ECHO] = SSI_ECHO; + fNames[Ids.ID_SSI_EXEC] = SSI_EXEC; + fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE; + fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD; + fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE; + fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV; + fNames[Ids.ID_SSI_SET] = SSI_SET; + fNames[Ids.ID_BGSOUND] = BGSOUND; + fNames[Ids.ID_NOBR] = NOBR; + fNames[Ids.ID_WBR] = WBR; + } + + /** + */ + public ElementCollection(AttributeCollection collection) { + super(fNames, TOLERANT_CASE); + attributeCollection = collection; + } + + /** + * Actually creates HTMLElementDeclaration instance. + * @return HTMLElementDeclaration + */ + protected CMNode create(String elementName) { + HTMLElemDeclImpl edec = null; + + if (elementName.equalsIgnoreCase(A)) { + edec = new HedA(this); + } + else if (elementName.equalsIgnoreCase(ABBR)) { + edec = new HedPhrase(ABBR, this); + + } + else if (elementName.equalsIgnoreCase(ACRONYM)) { + edec = new HedPhrase(ACRONYM, this); + + } + else if (elementName.equalsIgnoreCase(ADDRESS)) { + edec = new HedADDRESS(this); + + } + else if (elementName.equalsIgnoreCase(APPLET)) { + edec = new HedAPPLET(this); + + } + else if (elementName.equalsIgnoreCase(AREA)) { + edec = new HedAREA(this); + + } + else if (elementName.equalsIgnoreCase(B)) { + edec = new HedFontStyle(B, this); + + } + else if (elementName.equalsIgnoreCase(BASE)) { + edec = new HedBASE(this); + + } + else if (elementName.equalsIgnoreCase(BASEFONT)) { + edec = new HedBASEFONT(this); + + } + else if (elementName.equalsIgnoreCase(BDO)) { + edec = new HedBDO(this); + + } + else if (elementName.equalsIgnoreCase(BIG)) { + edec = new HedFontStyle(BIG, this); + + } + else if (elementName.equalsIgnoreCase(BLINK)) { + edec = new HedFontStyle(BLINK, this); + + } + else if (elementName.equalsIgnoreCase(BLOCKQUOTE)) { + edec = new HedBLOCKQUOTE(this); + + } + else if (elementName.equalsIgnoreCase(BODY)) { + edec = new HedBODY(this); + + } + else if (elementName.equalsIgnoreCase(BR)) { + edec = new HedBR(this); + + } + else if (elementName.equalsIgnoreCase(BUTTON)) { + edec = new HedBUTTON(this); + + } + else if (elementName.equalsIgnoreCase(CAPTION)) { + edec = new HedCAPTION(this); + + } + else if (elementName.equalsIgnoreCase(CENTER)) { + edec = new HedCENTER(this); + + } + else if (elementName.equalsIgnoreCase(CITE)) { + edec = new HedPhrase(CITE, this); + + } + else if (elementName.equalsIgnoreCase(CODE)) { + edec = new HedPhrase(CODE, this); + + } + else if (elementName.equalsIgnoreCase(COL)) { + edec = new HedCOL(this); + + } + else if (elementName.equalsIgnoreCase(COLGROUP)) { + edec = new HedCOLGROUP(this); + + } + else if (elementName.equalsIgnoreCase(DD)) { + edec = new HedDD(this); + + } + else if (elementName.equalsIgnoreCase(DEL)) { + edec = new HedMarkChanges(DEL, this); + + } + else if (elementName.equalsIgnoreCase(DFN)) { + edec = new HedPhrase(DFN, this); + + } + else if (elementName.equalsIgnoreCase(DIR)) { + edec = new HedMENU(DIR, this); + + } + else if (elementName.equalsIgnoreCase(DIV)) { + edec = new HedDIV(this); + + } + else if (elementName.equalsIgnoreCase(DL)) { + edec = new HedDL(this); + + } + else if (elementName.equalsIgnoreCase(DT)) { + edec = new HedDT(this); + + } + else if (elementName.equalsIgnoreCase(EM)) { + edec = new HedPhrase(EM, this); + + } + else if (elementName.equalsIgnoreCase(EMBED)) { + edec = new HedEMBED(this); + + } + else if (elementName.equalsIgnoreCase(FIELDSET)) { + edec = new HedFIELDSET(this); + + } + else if (elementName.equalsIgnoreCase(FONT)) { + edec = new HedFONT(this); + + } + else if (elementName.equalsIgnoreCase(FORM)) { + edec = new HedFORM(this); + + } + else if (elementName.equalsIgnoreCase(FRAME)) { + edec = new HedFRAME(this); + + } + else if (elementName.equalsIgnoreCase(FRAMESET)) { + edec = new HedFRAMESET(this); + + } + else if (elementName.equalsIgnoreCase(H1)) { + edec = new HedHeading(H1, this); + + } + else if (elementName.equalsIgnoreCase(H2)) { + edec = new HedHeading(H2, this); + + } + else if (elementName.equalsIgnoreCase(H3)) { + edec = new HedHeading(H3, this); + + } + else if (elementName.equalsIgnoreCase(H4)) { + edec = new HedHeading(H4, this); + + } + else if (elementName.equalsIgnoreCase(H5)) { + edec = new HedHeading(H5, this); + + } + else if (elementName.equalsIgnoreCase(H6)) { + edec = new HedHeading(H6, this); + + } + else if (elementName.equalsIgnoreCase(HEAD)) { + edec = new HedHEAD(this); + + } + else if (elementName.equalsIgnoreCase(HR)) { + edec = new HedHR(this); + + } + else if (elementName.equalsIgnoreCase(HTML)) { + edec = new HedHTML(this); + + } + else if (elementName.equalsIgnoreCase(I)) { + edec = new HedFontStyle(I, this); + + } + else if (elementName.equalsIgnoreCase(IFRAME)) { + edec = new HedIFRAME(this); + + } + else if (elementName.equalsIgnoreCase(IMG)) { + edec = new HedIMG(this); + + } + else if (elementName.equalsIgnoreCase(INPUT)) { + edec = new HedINPUT(this); + + } + else if (elementName.equalsIgnoreCase(INS)) { + edec = new HedMarkChanges(INS, this); + + } + else if (elementName.equalsIgnoreCase(ISINDEX)) { + edec = new HedISINDEX(this); + + } + else if (elementName.equalsIgnoreCase(KBD)) { + edec = new HedPhrase(KBD, this); + + } + else if (elementName.equalsIgnoreCase(LABEL)) { + edec = new HedLABEL(this); + + } + else if (elementName.equalsIgnoreCase(LEGEND)) { + edec = new HedLEGEND(this); + + } + else if (elementName.equalsIgnoreCase(LI)) { + edec = new HedLI(this); + + } + else if (elementName.equalsIgnoreCase(LINK)) { + edec = new HedLINK(this); + + } + else if (elementName.equalsIgnoreCase(MAP)) { + edec = new HedMAP(this); + + } + else if (elementName.equalsIgnoreCase(MARQUEE)) { + edec = new HedMARQUEE(this); + + } + else if (elementName.equalsIgnoreCase(MENU)) { + edec = new HedMENU(MENU, this); + + } + else if (elementName.equalsIgnoreCase(META)) { + edec = new HedMETA(this); + + } + else if (elementName.equalsIgnoreCase(NOEMBED)) { + edec = new HedNOEMBED(this); + + } + else if (elementName.equalsIgnoreCase(NOFRAMES)) { + edec = new HedNOFRAMES(this); + + } + else if (elementName.equalsIgnoreCase(NOSCRIPT)) { + edec = new HedNOSCRIPT(this); + + } + else if (elementName.equalsIgnoreCase(OBJECT)) { + edec = new HedOBJECT(this); + + } + else if (elementName.equalsIgnoreCase(OL)) { + edec = new HedOL(this); + + } + else if (elementName.equalsIgnoreCase(OPTGROUP)) { + edec = new HedOPTGROUP(this); + + } + else if (elementName.equalsIgnoreCase(OPTION)) { + edec = new HedOPTION(this); + + } + else if (elementName.equalsIgnoreCase(P)) { + edec = new HedP(this); + + } + else if (elementName.equalsIgnoreCase(PARAM)) { + edec = new HedPARAM(this); + + } + else if (elementName.equalsIgnoreCase(PRE)) { + edec = new HedPRE(this); + + } + else if (elementName.equalsIgnoreCase(Q)) { + edec = new HedQ(this); + + } + else if (elementName.equalsIgnoreCase(S)) { + edec = new HedFontStyle(S, this); + + } + else if (elementName.equalsIgnoreCase(SAMP)) { + edec = new HedPhrase(SAMP, this); + + } + else if (elementName.equalsIgnoreCase(SCRIPT)) { + edec = new HedSCRIPT(this); + + } + else if (elementName.equalsIgnoreCase(SELECT)) { + edec = new HedSELECT(this); + + } + else if (elementName.equalsIgnoreCase(SMALL)) { + edec = new HedFontStyle(SMALL, this); + + } + else if (elementName.equalsIgnoreCase(SPAN)) { + edec = new HedSPAN(this); + + } + else if (elementName.equalsIgnoreCase(STRIKE)) { + edec = new HedFontStyle(STRIKE, this); + + } + else if (elementName.equalsIgnoreCase(STRONG)) { + edec = new HedPhrase(STRONG, this); + + } + else if (elementName.equalsIgnoreCase(STYLE)) { + edec = new HedSTYLE(this); + + } + else if (elementName.equalsIgnoreCase(SUB)) { + edec = new HedScripts(SUB, this); + + } + else if (elementName.equalsIgnoreCase(SUP)) { + edec = new HedScripts(SUP, this); + + } + else if (elementName.equalsIgnoreCase(TABLE)) { + edec = new HedTABLE(this); + + } + else if (elementName.equalsIgnoreCase(TBODY)) { + edec = new HedTableBody(TBODY, this); + + } + else if (elementName.equalsIgnoreCase(TD)) { + edec = new HedTableCell(TD, this); + + } + else if (elementName.equalsIgnoreCase(TEXTAREA)) { + edec = new HedTEXTAREA(this); + + } + else if (elementName.equalsIgnoreCase(TFOOT)) { + edec = new HedTableBody(TFOOT, this); + + } + else if (elementName.equalsIgnoreCase(TH)) { + edec = new HedTableCell(TH, this); + + } + else if (elementName.equalsIgnoreCase(THEAD)) { + edec = new HedTableBody(THEAD, this); + + } + else if (elementName.equalsIgnoreCase(TITLE)) { + edec = new HedTITLE(this); + + } + else if (elementName.equalsIgnoreCase(TR)) { + edec = new HedTR(this); + + } + else if (elementName.equalsIgnoreCase(TT)) { + edec = new HedFontStyle(TT, this); + + } + else if (elementName.equalsIgnoreCase(U)) { + edec = new HedFontStyle(U, this); + + } + else if (elementName.equalsIgnoreCase(UL)) { + edec = new HedUL(this); + + } + else if (elementName.equalsIgnoreCase(VAR)) { + edec = new HedPhrase(VAR, this); + + } + else if (elementName.equalsIgnoreCase(SSI_CONFIG)) { + edec = new HedSSIConfig(this); + + } + else if (elementName.equalsIgnoreCase(SSI_ECHO)) { + edec = new HedSSIEcho(this); + + } + else if (elementName.equalsIgnoreCase(SSI_EXEC)) { + edec = new HedSSIExec(this); + + } + else if (elementName.equalsIgnoreCase(SSI_FSIZE)) { + edec = new HedSSIFsize(this); + + } + else if (elementName.equalsIgnoreCase(SSI_FLASTMOD)) { + edec = new HedSSIFlastmod(this); + + } + else if (elementName.equalsIgnoreCase(SSI_INCLUDE)) { + edec = new HedSSIInclude(this); + + } + else if (elementName.equalsIgnoreCase(SSI_PRINTENV)) { + edec = new HedSSIPrintenv(this); + + } + else if (elementName.equalsIgnoreCase(SSI_SET)) { + edec = new HedSSISet(this); + + } + else if (elementName.equalsIgnoreCase(BGSOUND)) { + edec = new HedBGSOUND(this); + + } + else if (elementName.equalsIgnoreCase(NOBR)) { + edec = new HedNOBR(this); + + } + else if (elementName.equalsIgnoreCase(WBR)) { + edec = new HedWBR(this); + + } // unknown + else { + // NOTE: We don't define the UNKNOWN element declaration. + // <code>null</code> for a declaration is a sign of + // the target element is unknown. + // -- 3/9/2001 + edec = null; + } + return edec; + } + + /** + * @return com.ibm.sed.contentmodel.html.AttributeCollection + */ + public AttributeCollection getAttributeCollection() { + return attributeCollection; + } + + /** + */ + public final Collection getNamesOfBlock() { + // P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, + // TABLE, FIELDSET, ADDRESS + String[] blockMisc = {P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, TABLE, FIELDSET, ADDRESS}; + Vector names = new Vector(Arrays.asList(blockMisc)); + // %heading; + names.addAll(Arrays.asList(HEADING)); + // %list; + names.addAll(Arrays.asList(LIST)); + // %preformatted; + names.addAll(Arrays.asList(PREFORMATTED)); + + return names; + } + + /** + * %block;. + * %block; is: + * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER | + * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR | + * TABLE | FIELDSET | ADDRESS.<br> + * @param group CMGroupImpl Return values. + */ + public final void getBlock(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, getNamesOfBlock().iterator()); + } + + /** + * Create element declarations and store them + * into a <code>CMGroupImpl</code> instance. + * @param group CMGroupImpl Return values. + */ + public final void getFlow(CMGroupImpl group) { + if (group == null) + return; + getBlock(group); + getInline(group); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getFontstyle(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(FONTSTYLE).iterator()); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getFormctrl(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(FORMCTL).iterator()); + } + + /** + * %heading;. + * @param group CMGroupImpl Return values. + */ + public final void getHeading(CMGroupImpl group) { + if (group == null) + return; + + getDeclarations(group, Arrays.asList(HEADING).iterator()); + } + + /** + * Create element declarations and store them + * into a <code>CMGroupImpl</code> instance. + * @param group CMGroupImpl Return values. + */ + public final void getInline(CMGroupImpl group) { + if (group == null) + return; + getFontstyle(group); + getPhrase(group); + getSpecial(group); + getFormctrl(group); + } + + /** + * %list;. + * @param group CMGroupImpl Return values. + */ + public final void getList(CMGroupImpl group) { + if (group == null) + return; + + getDeclarations(group, Arrays.asList(LIST).iterator()); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getPhrase(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(PHRASE).iterator()); + } + + /** + * %preformatted; + * @param group CMGroupImpl Return values. + */ + public final void getPreformatted(CMGroupImpl group) { + if (group == null) + return; + + getDeclarations(group, Arrays.asList(PREFORMATTED).iterator()); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getSpecial(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(SPECIAL).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java new file mode 100644 index 0000000000..8343a9256c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java @@ -0,0 +1,837 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.lang.reflect.Field; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for entity declarations. + */ +final class EntityCollection extends DeclCollection implements org.eclipse.wst.html.core.HTML40Namespace.EntityName { + + + private static class Ids { + public static final int ID_AACUTE_L = 0; + public static final int ID_AACUTE_U = 1; + public static final int ID_ACIRC_L = 2; + public static final int ID_ACIRC_U = 3; + public static final int ID_ACUTE = 4; + public static final int ID_AELIG_L = 5; + public static final int ID_AELIG_U = 6; + public static final int ID_AGRAVE_L = 7; + public static final int ID_AGRAVE_U = 8; + public static final int ID_ALEFSYM = 9; + public static final int ID_ALPHA_L = 10; + public static final int ID_ALPHA_U = 11; + public static final int ID_AMP = 12; + public static final int ID_AND = 13; + public static final int ID_ANG = 14; + public static final int ID_ARING_L = 15; + public static final int ID_ARING_U = 16; + public static final int ID_ASYMP = 17; + public static final int ID_ATILDE_L = 18; + public static final int ID_ATILDE_U = 19; + public static final int ID_AUML_L = 20; + public static final int ID_AUML_U = 21; + public static final int ID_BDQUO = 22; + public static final int ID_BETA_L = 23; + public static final int ID_BETA_U = 24; + public static final int ID_BRVBAR = 25; + public static final int ID_BULL = 26; + public static final int ID_CAP = 27; + public static final int ID_CCEDIL_L = 28; + public static final int ID_CCEDIL_U = 29; + public static final int ID_CEDIL = 30; + public static final int ID_CENT = 31; + public static final int ID_CHI_L = 32; + public static final int ID_CHI_U = 33; + public static final int ID_CIRC = 34; + public static final int ID_CLUBS = 35; + public static final int ID_CONG = 36; + public static final int ID_COPY = 37; + public static final int ID_CRARR = 38; + public static final int ID_CUP = 39; + public static final int ID_CURREN = 40; + public static final int ID_DAGGER_L = 41; + public static final int ID_DAGGER_U = 42; + public static final int ID_DARR_L = 43; + public static final int ID_DARR_U = 44; + public static final int ID_DEG = 45; + public static final int ID_DELTA_L = 46; + public static final int ID_DELTA_U = 47; + public static final int ID_DIAMS = 48; + public static final int ID_DIVIDE = 49; + public static final int ID_EACUTE_L = 50; + public static final int ID_EACUTE_U = 51; + public static final int ID_ECIRC_L = 52; + public static final int ID_ECIRC_U = 53; + public static final int ID_EGRAVE_L = 54; + public static final int ID_EGRAVE_U = 55; + public static final int ID_EMPTY = 56; + public static final int ID_EMSP = 57; + public static final int ID_ENSP = 58; + public static final int ID_EPSILON_L = 59; + public static final int ID_EPSILON_U = 60; + public static final int ID_EQUIV = 61; + public static final int ID_ETA_L = 62; + public static final int ID_ETA_U = 63; + public static final int ID_ETH_L = 64; + public static final int ID_ETH_U = 65; + public static final int ID_EUML_L = 66; + public static final int ID_EUML_U = 67; + public static final int ID_EURO = 68; + public static final int ID_EXIST = 69; + public static final int ID_FNOF = 70; + public static final int ID_FORALL = 71; + public static final int ID_FRAC12 = 72; + public static final int ID_FRAC14 = 73; + public static final int ID_FRAC34 = 74; + public static final int ID_FRASL = 75; + public static final int ID_GAMMA_L = 76; + public static final int ID_GAMMA_U = 77; + public static final int ID_GE = 78; + public static final int ID_GT = 79; + public static final int ID_HARR_L = 80; + public static final int ID_HARR_U = 81; + public static final int ID_HEARTS = 82; + public static final int ID_HELLIP = 83; + public static final int ID_IACUTE_L = 84; + public static final int ID_IACUTE_U = 85; + public static final int ID_ICIRC_L = 86; + public static final int ID_ICIRC_U = 87; + public static final int ID_IEXCL = 88; + public static final int ID_IGRAVE_L = 89; + public static final int ID_IGRAVE_U = 90; + public static final int ID_IMAGE = 91; + public static final int ID_INFIN = 92; + public static final int ID_INT = 93; + public static final int ID_IOTA_L = 94; + public static final int ID_IOTA_U = 95; + public static final int ID_IQUEST = 96; + public static final int ID_ISIN = 97; + public static final int ID_IUML_L = 98; + public static final int ID_IUML_U = 99; + public static final int ID_KAPPA_L = 100; + public static final int ID_KAPPA_U = 101; + public static final int ID_LAMBDA_L = 102; + public static final int ID_LAMBDA_U = 103; + public static final int ID_LANG = 104; + public static final int ID_LAQUO = 105; + public static final int ID_LARR_L = 106; + public static final int ID_LARR_U = 107; + public static final int ID_LCEIL = 108; + public static final int ID_LDQUO = 109; + public static final int ID_LE = 110; + public static final int ID_LFLOOR = 111; + public static final int ID_LOWAST = 112; + public static final int ID_LOZ = 113; + public static final int ID_LRM = 114; + public static final int ID_LSAQUO = 115; + public static final int ID_LSQUO = 116; + public static final int ID_LT = 117; + public static final int ID_MACR = 118; + public static final int ID_MDASH = 119; + public static final int ID_MICRO = 120; + public static final int ID_MIDDOT = 121; + public static final int ID_MINUS = 122; + public static final int ID_MU_L = 123; + public static final int ID_MU_U = 124; + public static final int ID_NABLA = 125; + public static final int ID_NBSP = 126; + public static final int ID_NDASH = 127; + public static final int ID_NE = 128; + public static final int ID_NI = 129; + public static final int ID_NOT = 130; + public static final int ID_NOTIN = 131; + public static final int ID_NSUB = 132; + public static final int ID_NTILDE_L = 133; + public static final int ID_NTILDE_U = 134; + public static final int ID_NU_L = 135; + public static final int ID_NU_U = 136; + public static final int ID_OACUTE_L = 137; + public static final int ID_OACUTE_U = 138; + public static final int ID_OCIRC_L = 139; + public static final int ID_OCIRC_U = 140; + public static final int ID_OELIG_L = 141; + public static final int ID_OELIG_U = 142; + public static final int ID_OGRAVE_L = 143; + public static final int ID_OGRAVE_U = 144; + public static final int ID_OLINE = 145; + public static final int ID_OMEGA_L = 146; + public static final int ID_OMEGA_U = 147; + public static final int ID_OMICRON_L = 148; + public static final int ID_OMICRON_U = 149; + public static final int ID_OPLUS = 150; + public static final int ID_OR = 151; + public static final int ID_ORDF = 152; + public static final int ID_ORDM = 153; + public static final int ID_OSLASH_L = 154; + public static final int ID_OSLASH_U = 155; + public static final int ID_OTILDE_L = 156; + public static final int ID_OTILDE_U = 157; + public static final int ID_OTIMES = 158; + public static final int ID_OUML_L = 159; + public static final int ID_OUML_U = 160; + public static final int ID_PARA = 161; + public static final int ID_PART = 162; + public static final int ID_PERMIL = 163; + public static final int ID_PERP = 164; + public static final int ID_PHI_L = 165; + public static final int ID_PHI_U = 166; + public static final int ID_PIV = 167; + public static final int ID_PI_L = 168; + public static final int ID_PI_U = 169; + public static final int ID_PLUSMN = 170; + public static final int ID_POUND = 171; + public static final int ID_PRIME_L = 172; + public static final int ID_PRIME_U = 173; + public static final int ID_PROD = 174; + public static final int ID_PROP = 175; + public static final int ID_PSI_L = 176; + public static final int ID_PSI_U = 177; + public static final int ID_QUOT = 178; + public static final int ID_RADIC = 179; + public static final int ID_RANG = 180; + public static final int ID_RAQUO = 181; + public static final int ID_RARR_L = 182; + public static final int ID_RARR_U = 183; + public static final int ID_RCEIL = 184; + public static final int ID_RDQUO = 185; + public static final int ID_REAL = 186; + public static final int ID_REG = 187; + public static final int ID_RFLOOR = 188; + public static final int ID_RHO_L = 189; + public static final int ID_RHO_U = 190; + public static final int ID_RLM = 191; + public static final int ID_RSAQUO = 192; + public static final int ID_RSQUO = 193; + public static final int ID_SBQUO = 194; + public static final int ID_SCARON_L = 195; + public static final int ID_SCARON_U = 196; + public static final int ID_SDOT = 197; + public static final int ID_SECT = 198; + public static final int ID_SHY = 199; + public static final int ID_SIGMAF = 200; + public static final int ID_SIGMA_L = 201; + public static final int ID_SIGMA_U = 202; + public static final int ID_SIM = 203; + public static final int ID_SPADES = 204; + public static final int ID_SUB = 205; + public static final int ID_SUBE = 206; + public static final int ID_SUM = 207; + public static final int ID_SUP = 208; + public static final int ID_SUP1 = 209; + public static final int ID_SUP2 = 210; + public static final int ID_SUP3 = 211; + public static final int ID_SUPE = 212; + public static final int ID_SZLIG = 213; + public static final int ID_TAU_L = 214; + public static final int ID_TAU_U = 215; + public static final int ID_THERE4 = 216; + public static final int ID_THETASYM = 217; + public static final int ID_THETA_L = 218; + public static final int ID_THETA_U = 219; + public static final int ID_THINSP = 220; + public static final int ID_THORN_L = 221; + public static final int ID_THORN_U = 222; + public static final int ID_TILDE = 223; + public static final int ID_TIMES = 224; + public static final int ID_TRADE = 225; + public static final int ID_UACUTE_L = 226; + public static final int ID_UACUTE_U = 227; + public static final int ID_UARR_L = 228; + public static final int ID_UARR_U = 229; + public static final int ID_UCIRC_L = 230; + public static final int ID_UCIRC_U = 231; + public static final int ID_UGRAVE_L = 232; + public static final int ID_UGRAVE_U = 233; + public static final int ID_UML = 234; + public static final int ID_UPSIH = 235; + public static final int ID_UPSILON_L = 236; + public static final int ID_UPSILON_U = 237; + public static final int ID_UUML_L = 238; + public static final int ID_UUML_U = 239; + public static final int ID_WEIERP = 240; + public static final int ID_XI_L = 241; + public static final int ID_XI_U = 242; + public static final int ID_YACUTE_L = 243; + public static final int ID_YACUTE_U = 244; + public static final int ID_YEN = 245; + public static final int ID_YUML_L = 246; + public static final int ID_YUML_U = 247; + public static final int ID_ZETA_L = 248; + public static final int ID_ZETA_U = 249; + public static final int ID_ZWJ = 250; + public static final int ID_ZWNJ = 251; + + public static int getNumOfIds() { + if (numofids != -1) + return numofids; + + // NOTE: If the reflection is too slow, this method should + // just return the literal value, like 252. + // -- 5/24/2001 + Class clazz = Ids.class; + Field[] fields = clazz.getFields(); + numofids = 0; + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("ID_"))//$NON-NLS-1$ + numofids++; + } + return numofids; + } + + // chache the result of the reflection. + private static int numofids = -1; + } + + private static String[] names = null; + + static { + names = new String[Ids.getNumOfIds()]; + names[Ids.ID_AACUTE_L] = AACUTE_L; + names[Ids.ID_AACUTE_U] = AACUTE_U; + names[Ids.ID_ACIRC_L] = ACIRC_L; + names[Ids.ID_ACIRC_U] = ACIRC_U; + names[Ids.ID_ACUTE] = ACUTE; + names[Ids.ID_AELIG_L] = AELIG_L; + names[Ids.ID_AELIG_U] = AELIG_U; + names[Ids.ID_AGRAVE_L] = AGRAVE_L; + names[Ids.ID_AGRAVE_U] = AGRAVE_U; + names[Ids.ID_ALEFSYM] = ALEFSYM; + names[Ids.ID_ALPHA_L] = ALPHA_L; + names[Ids.ID_ALPHA_U] = ALPHA_U; + names[Ids.ID_AMP] = AMP; + names[Ids.ID_AND] = AND; + names[Ids.ID_ANG] = ANG; + names[Ids.ID_ARING_L] = ARING_L; + names[Ids.ID_ARING_U] = ARING_U; + names[Ids.ID_ASYMP] = ASYMP; + names[Ids.ID_ATILDE_L] = ATILDE_L; + names[Ids.ID_ATILDE_U] = ATILDE_U; + names[Ids.ID_AUML_L] = AUML_L; + names[Ids.ID_AUML_U] = AUML_U; + names[Ids.ID_BDQUO] = BDQUO; + names[Ids.ID_BETA_L] = BETA_L; + names[Ids.ID_BETA_U] = BETA_U; + names[Ids.ID_BRVBAR] = BRVBAR; + names[Ids.ID_BULL] = BULL; + names[Ids.ID_CAP] = CAP; + names[Ids.ID_CCEDIL_L] = CCEDIL_L; + names[Ids.ID_CCEDIL_U] = CCEDIL_U; + names[Ids.ID_CEDIL] = CEDIL; + names[Ids.ID_CENT] = CENT; + names[Ids.ID_CHI_L] = CHI_L; + names[Ids.ID_CHI_U] = CHI_U; + names[Ids.ID_CIRC] = CIRC; + names[Ids.ID_CLUBS] = CLUBS; + names[Ids.ID_CONG] = CONG; + names[Ids.ID_COPY] = COPY; + names[Ids.ID_CRARR] = CRARR; + names[Ids.ID_CUP] = CUP; + names[Ids.ID_CURREN] = CURREN; + names[Ids.ID_DAGGER_L] = DAGGER_L; + names[Ids.ID_DAGGER_U] = DAGGER_U; + names[Ids.ID_DARR_L] = DARR_L; + names[Ids.ID_DARR_U] = DARR_U; + names[Ids.ID_DEG] = DEG; + names[Ids.ID_DELTA_L] = DELTA_L; + names[Ids.ID_DELTA_U] = DELTA_U; + names[Ids.ID_DIAMS] = DIAMS; + names[Ids.ID_DIVIDE] = DIVIDE; + names[Ids.ID_EACUTE_L] = EACUTE_L; + names[Ids.ID_EACUTE_U] = EACUTE_U; + names[Ids.ID_ECIRC_L] = ECIRC_L; + names[Ids.ID_ECIRC_U] = ECIRC_U; + names[Ids.ID_EGRAVE_L] = EGRAVE_L; + names[Ids.ID_EGRAVE_U] = EGRAVE_U; + names[Ids.ID_EMPTY] = EMPTY; + names[Ids.ID_EMSP] = EMSP; + names[Ids.ID_ENSP] = ENSP; + names[Ids.ID_EPSILON_L] = EPSILON_L; + names[Ids.ID_EPSILON_U] = EPSILON_U; + names[Ids.ID_EQUIV] = EQUIV; + names[Ids.ID_ETA_L] = ETA_L; + names[Ids.ID_ETA_U] = ETA_U; + names[Ids.ID_ETH_L] = ETH_L; + names[Ids.ID_ETH_U] = ETH_U; + names[Ids.ID_EUML_L] = EUML_L; + names[Ids.ID_EUML_U] = EUML_U; + names[Ids.ID_EURO] = EURO; + names[Ids.ID_EXIST] = EXIST; + names[Ids.ID_FNOF] = FNOF; + names[Ids.ID_FORALL] = FORALL; + names[Ids.ID_FRAC12] = FRAC12; + names[Ids.ID_FRAC14] = FRAC14; + names[Ids.ID_FRAC34] = FRAC34; + names[Ids.ID_FRASL] = FRASL; + names[Ids.ID_GAMMA_L] = GAMMA_L; + names[Ids.ID_GAMMA_U] = GAMMA_U; + names[Ids.ID_GE] = GE; + names[Ids.ID_GT] = GT; + names[Ids.ID_HARR_L] = HARR_L; + names[Ids.ID_HARR_U] = HARR_U; + names[Ids.ID_HEARTS] = HEARTS; + names[Ids.ID_HELLIP] = HELLIP; + names[Ids.ID_IACUTE_L] = IACUTE_L; + names[Ids.ID_IACUTE_U] = IACUTE_U; + names[Ids.ID_ICIRC_L] = ICIRC_L; + names[Ids.ID_ICIRC_U] = ICIRC_U; + names[Ids.ID_IEXCL] = IEXCL; + names[Ids.ID_IGRAVE_L] = IGRAVE_L; + names[Ids.ID_IGRAVE_U] = IGRAVE_U; + names[Ids.ID_IMAGE] = IMAGE; + names[Ids.ID_INFIN] = INFIN; + names[Ids.ID_INT] = INT; + names[Ids.ID_IOTA_L] = IOTA_L; + names[Ids.ID_IOTA_U] = IOTA_U; + names[Ids.ID_IQUEST] = IQUEST; + names[Ids.ID_ISIN] = ISIN; + names[Ids.ID_IUML_L] = IUML_L; + names[Ids.ID_IUML_U] = IUML_U; + names[Ids.ID_KAPPA_L] = KAPPA_L; + names[Ids.ID_KAPPA_U] = KAPPA_U; + names[Ids.ID_LAMBDA_L] = LAMBDA_L; + names[Ids.ID_LAMBDA_U] = LAMBDA_U; + names[Ids.ID_LANG] = LANG; + names[Ids.ID_LAQUO] = LAQUO; + names[Ids.ID_LARR_L] = LARR_L; + names[Ids.ID_LARR_U] = LARR_U; + names[Ids.ID_LCEIL] = LCEIL; + names[Ids.ID_LDQUO] = LDQUO; + names[Ids.ID_LE] = LE; + names[Ids.ID_LFLOOR] = LFLOOR; + names[Ids.ID_LOWAST] = LOWAST; + names[Ids.ID_LOZ] = LOZ; + names[Ids.ID_LRM] = LRM; + names[Ids.ID_LSAQUO] = LSAQUO; + names[Ids.ID_LSQUO] = LSQUO; + names[Ids.ID_LT] = LT; + names[Ids.ID_MACR] = MACR; + names[Ids.ID_MDASH] = MDASH; + names[Ids.ID_MICRO] = MICRO; + names[Ids.ID_MIDDOT] = MIDDOT; + names[Ids.ID_MINUS] = MINUS; + names[Ids.ID_MU_L] = MU_L; + names[Ids.ID_MU_U] = MU_U; + names[Ids.ID_NABLA] = NABLA; + names[Ids.ID_NBSP] = NBSP; + names[Ids.ID_NDASH] = NDASH; + names[Ids.ID_NE] = NE; + names[Ids.ID_NI] = NI; + names[Ids.ID_NOT] = NOT; + names[Ids.ID_NOTIN] = NOTIN; + names[Ids.ID_NSUB] = NSUB; + names[Ids.ID_NTILDE_L] = NTILDE_L; + names[Ids.ID_NTILDE_U] = NTILDE_U; + names[Ids.ID_NU_L] = NU_L; + names[Ids.ID_NU_U] = NU_U; + names[Ids.ID_OACUTE_L] = OACUTE_L; + names[Ids.ID_OACUTE_U] = OACUTE_U; + names[Ids.ID_OCIRC_L] = OCIRC_L; + names[Ids.ID_OCIRC_U] = OCIRC_U; + names[Ids.ID_OELIG_L] = OELIG_L; + names[Ids.ID_OELIG_U] = OELIG_U; + names[Ids.ID_OGRAVE_L] = OGRAVE_L; + names[Ids.ID_OGRAVE_U] = OGRAVE_U; + names[Ids.ID_OLINE] = OLINE; + names[Ids.ID_OMEGA_L] = OMEGA_L; + names[Ids.ID_OMEGA_U] = OMEGA_U; + names[Ids.ID_OMICRON_L] = OMICRON_L; + names[Ids.ID_OMICRON_U] = OMICRON_U; + names[Ids.ID_OPLUS] = OPLUS; + names[Ids.ID_OR] = OR; + names[Ids.ID_ORDF] = ORDF; + names[Ids.ID_ORDM] = ORDM; + names[Ids.ID_OSLASH_L] = OSLASH_L; + names[Ids.ID_OSLASH_U] = OSLASH_U; + names[Ids.ID_OTILDE_L] = OTILDE_L; + names[Ids.ID_OTILDE_U] = OTILDE_U; + names[Ids.ID_OTIMES] = OTIMES; + names[Ids.ID_OUML_L] = OUML_L; + names[Ids.ID_OUML_U] = OUML_U; + names[Ids.ID_PARA] = PARA; + names[Ids.ID_PART] = PART; + names[Ids.ID_PERMIL] = PERMIL; + names[Ids.ID_PERP] = PERP; + names[Ids.ID_PHI_L] = PHI_L; + names[Ids.ID_PHI_U] = PHI_U; + names[Ids.ID_PIV] = PIV; + names[Ids.ID_PI_L] = PI_L; + names[Ids.ID_PI_U] = PI_U; + names[Ids.ID_PLUSMN] = PLUSMN; + names[Ids.ID_POUND] = POUND; + names[Ids.ID_PRIME_L] = PRIME_L; + names[Ids.ID_PRIME_U] = PRIME_U; + names[Ids.ID_PROD] = PROD; + names[Ids.ID_PROP] = PROP; + names[Ids.ID_PSI_L] = PSI_L; + names[Ids.ID_PSI_U] = PSI_U; + names[Ids.ID_QUOT] = QUOT; + names[Ids.ID_RADIC] = RADIC; + names[Ids.ID_RANG] = RANG; + names[Ids.ID_RAQUO] = RAQUO; + names[Ids.ID_RARR_L] = RARR_L; + names[Ids.ID_RARR_U] = RARR_U; + names[Ids.ID_RCEIL] = RCEIL; + names[Ids.ID_RDQUO] = RDQUO; + names[Ids.ID_REAL] = REAL; + names[Ids.ID_REG] = REG; + names[Ids.ID_RFLOOR] = RFLOOR; + names[Ids.ID_RHO_L] = RHO_L; + names[Ids.ID_RHO_U] = RHO_U; + names[Ids.ID_RLM] = RLM; + names[Ids.ID_RSAQUO] = RSAQUO; + names[Ids.ID_RSQUO] = RSQUO; + names[Ids.ID_SBQUO] = SBQUO; + names[Ids.ID_SCARON_L] = SCARON_L; + names[Ids.ID_SCARON_U] = SCARON_U; + names[Ids.ID_SDOT] = SDOT; + names[Ids.ID_SECT] = SECT; + names[Ids.ID_SHY] = SHY; + names[Ids.ID_SIGMAF] = SIGMAF; + names[Ids.ID_SIGMA_L] = SIGMA_L; + names[Ids.ID_SIGMA_U] = SIGMA_U; + names[Ids.ID_SIM] = SIM; + names[Ids.ID_SPADES] = SPADES; + names[Ids.ID_SUB] = SUB; + names[Ids.ID_SUBE] = SUBE; + names[Ids.ID_SUM] = SUM; + names[Ids.ID_SUP] = SUP; + names[Ids.ID_SUP1] = SUP1; + names[Ids.ID_SUP2] = SUP2; + names[Ids.ID_SUP3] = SUP3; + names[Ids.ID_SUPE] = SUPE; + names[Ids.ID_SZLIG] = SZLIG; + names[Ids.ID_TAU_L] = TAU_L; + names[Ids.ID_TAU_U] = TAU_U; + names[Ids.ID_THERE4] = THERE4; + names[Ids.ID_THETASYM] = THETASYM; + names[Ids.ID_THETA_L] = THETA_L; + names[Ids.ID_THETA_U] = THETA_U; + names[Ids.ID_THINSP] = THINSP; + names[Ids.ID_THORN_L] = THORN_L; + names[Ids.ID_THORN_U] = THORN_U; + names[Ids.ID_TILDE] = TILDE; + names[Ids.ID_TIMES] = TIMES; + names[Ids.ID_TRADE] = TRADE; + names[Ids.ID_UACUTE_L] = UACUTE_L; + names[Ids.ID_UACUTE_U] = UACUTE_U; + names[Ids.ID_UARR_L] = UARR_L; + names[Ids.ID_UARR_U] = UARR_U; + names[Ids.ID_UCIRC_L] = UCIRC_L; + names[Ids.ID_UCIRC_U] = UCIRC_U; + names[Ids.ID_UGRAVE_L] = UGRAVE_L; + names[Ids.ID_UGRAVE_U] = UGRAVE_U; + names[Ids.ID_UML] = UML; + names[Ids.ID_UPSIH] = UPSIH; + names[Ids.ID_UPSILON_L] = UPSILON_L; + names[Ids.ID_UPSILON_U] = UPSILON_U; + names[Ids.ID_UUML_L] = UUML_L; + names[Ids.ID_UUML_U] = UUML_U; + names[Ids.ID_WEIERP] = WEIERP; + names[Ids.ID_XI_L] = XI_L; + names[Ids.ID_XI_U] = XI_U; + names[Ids.ID_YACUTE_L] = YACUTE_L; + names[Ids.ID_YACUTE_U] = YACUTE_U; + names[Ids.ID_YEN] = YEN; + names[Ids.ID_YUML_L] = YUML_L; + names[Ids.ID_YUML_U] = YUML_U; + names[Ids.ID_ZETA_L] = ZETA_L; + names[Ids.ID_ZETA_U] = ZETA_U; + names[Ids.ID_ZWJ] = ZWJ; + names[Ids.ID_ZWNJ] = ZWNJ; + } + private static char[] values = null; + + static { + values = new char[Ids.getNumOfIds()]; + values[Ids.ID_AACUTE_L] = 225; + values[Ids.ID_AACUTE_U] = 193; + values[Ids.ID_ACIRC_L] = 226; + values[Ids.ID_ACIRC_U] = 194; + values[Ids.ID_ACUTE] = 180; + values[Ids.ID_AELIG_L] = 230; + values[Ids.ID_AELIG_U] = 198; + values[Ids.ID_AGRAVE_L] = 224; + values[Ids.ID_AGRAVE_U] = 192; + values[Ids.ID_ALEFSYM] = 8501; + values[Ids.ID_ALPHA_L] = 945; + values[Ids.ID_ALPHA_U] = 913; + values[Ids.ID_AMP] = 38; + values[Ids.ID_AND] = 8743; + values[Ids.ID_ANG] = 8736; + values[Ids.ID_ARING_L] = 229; + values[Ids.ID_ARING_U] = 197; + values[Ids.ID_ASYMP] = 8776; + values[Ids.ID_ATILDE_L] = 227; + values[Ids.ID_ATILDE_U] = 195; + values[Ids.ID_AUML_L] = 228; + values[Ids.ID_AUML_U] = 196; + values[Ids.ID_BDQUO] = 8222; + values[Ids.ID_BETA_L] = 946; + values[Ids.ID_BETA_U] = 914; + values[Ids.ID_BRVBAR] = 166; + values[Ids.ID_BULL] = 8226; + values[Ids.ID_CAP] = 8745; + values[Ids.ID_CCEDIL_L] = 231; + values[Ids.ID_CCEDIL_U] = 199; + values[Ids.ID_CEDIL] = 184; + values[Ids.ID_CENT] = 162; + values[Ids.ID_CHI_L] = 967; + values[Ids.ID_CHI_U] = 935; + values[Ids.ID_CIRC] = 710; + values[Ids.ID_CLUBS] = 9827; + values[Ids.ID_CONG] = 8773; + values[Ids.ID_COPY] = 169; + values[Ids.ID_CRARR] = 8629; + values[Ids.ID_CUP] = 8746; + values[Ids.ID_CURREN] = 164; + values[Ids.ID_DAGGER_L] = 8224; + values[Ids.ID_DAGGER_U] = 8225; + values[Ids.ID_DARR_L] = 8595; + values[Ids.ID_DARR_U] = 8659; + values[Ids.ID_DEG] = 176; + values[Ids.ID_DELTA_L] = 948; + values[Ids.ID_DELTA_U] = 916; + values[Ids.ID_DIAMS] = 9830; + values[Ids.ID_DIVIDE] = 247; + values[Ids.ID_EACUTE_L] = 233; + values[Ids.ID_EACUTE_U] = 201; + values[Ids.ID_ECIRC_L] = 234; + values[Ids.ID_ECIRC_U] = 202; + values[Ids.ID_EGRAVE_L] = 232; + values[Ids.ID_EGRAVE_U] = 200; + values[Ids.ID_EMPTY] = 8709; + values[Ids.ID_EMSP] = 8195; + values[Ids.ID_ENSP] = 8194; + values[Ids.ID_EPSILON_L] = 949; + values[Ids.ID_EPSILON_U] = 917; + values[Ids.ID_EQUIV] = 8801; + values[Ids.ID_ETA_L] = 951; + values[Ids.ID_ETA_U] = 919; + values[Ids.ID_ETH_L] = 240; + values[Ids.ID_ETH_U] = 208; + values[Ids.ID_EUML_L] = 235; + values[Ids.ID_EUML_U] = 203; + values[Ids.ID_EURO] = 8364; + values[Ids.ID_EXIST] = 8707; + values[Ids.ID_FNOF] = 402; + values[Ids.ID_FORALL] = 8704; + values[Ids.ID_FRAC12] = 189; + values[Ids.ID_FRAC14] = 188; + values[Ids.ID_FRAC34] = 190; + values[Ids.ID_FRASL] = 8260; + values[Ids.ID_GAMMA_L] = 947; + values[Ids.ID_GAMMA_U] = 915; + values[Ids.ID_GE] = 8805; + values[Ids.ID_GT] = 62; + values[Ids.ID_HARR_L] = 8596; + values[Ids.ID_HARR_U] = 8660; + values[Ids.ID_HEARTS] = 9829; + values[Ids.ID_HELLIP] = 8230; + values[Ids.ID_IACUTE_L] = 237; + values[Ids.ID_IACUTE_U] = 205; + values[Ids.ID_ICIRC_L] = 238; + values[Ids.ID_ICIRC_U] = 206; + values[Ids.ID_IEXCL] = 161; + values[Ids.ID_IGRAVE_L] = 236; + values[Ids.ID_IGRAVE_U] = 204; + values[Ids.ID_IMAGE] = 8465; + values[Ids.ID_INFIN] = 8734; + values[Ids.ID_INT] = 8747; + values[Ids.ID_IOTA_L] = 953; + values[Ids.ID_IOTA_U] = 921; + values[Ids.ID_IQUEST] = 191; + values[Ids.ID_ISIN] = 8712; + values[Ids.ID_IUML_L] = 239; + values[Ids.ID_IUML_U] = 207; + values[Ids.ID_KAPPA_L] = 954; + values[Ids.ID_KAPPA_U] = 922; + values[Ids.ID_LAMBDA_L] = 955; + values[Ids.ID_LAMBDA_U] = 923; + values[Ids.ID_LANG] = 9001; + values[Ids.ID_LAQUO] = 171; + values[Ids.ID_LARR_L] = 8592; + values[Ids.ID_LARR_U] = 8656; + values[Ids.ID_LCEIL] = 8968; + values[Ids.ID_LDQUO] = 8220; + values[Ids.ID_LE] = 8804; + values[Ids.ID_LFLOOR] = 8970; + values[Ids.ID_LOWAST] = 8727; + values[Ids.ID_LOZ] = 9674; + values[Ids.ID_LRM] = 8206; + values[Ids.ID_LSAQUO] = 8249; + values[Ids.ID_LSQUO] = 8216; + values[Ids.ID_LT] = 60; + values[Ids.ID_MACR] = 175; + values[Ids.ID_MDASH] = 8212; + values[Ids.ID_MICRO] = 181; + values[Ids.ID_MIDDOT] = 183; + values[Ids.ID_MINUS] = 8722; + values[Ids.ID_MU_L] = 956; + values[Ids.ID_MU_U] = 924; + values[Ids.ID_NABLA] = 8711; + values[Ids.ID_NBSP] = 160; + values[Ids.ID_NDASH] = 8211; + values[Ids.ID_NE] = 8800; + values[Ids.ID_NI] = 8715; + values[Ids.ID_NOT] = 172; + values[Ids.ID_NOTIN] = 8713; + values[Ids.ID_NSUB] = 8836; + values[Ids.ID_NTILDE_L] = 241; + values[Ids.ID_NTILDE_U] = 209; + values[Ids.ID_NU_L] = 957; + values[Ids.ID_NU_U] = 925; + values[Ids.ID_OACUTE_L] = 243; + values[Ids.ID_OACUTE_U] = 211; + values[Ids.ID_OCIRC_L] = 244; + values[Ids.ID_OCIRC_U] = 212; + values[Ids.ID_OELIG_L] = 339; + values[Ids.ID_OELIG_U] = 338; + values[Ids.ID_OGRAVE_L] = 242; + values[Ids.ID_OGRAVE_U] = 210; + values[Ids.ID_OLINE] = 8254; + values[Ids.ID_OMEGA_L] = 969; + values[Ids.ID_OMEGA_U] = 937; + values[Ids.ID_OMICRON_L] = 959; + values[Ids.ID_OMICRON_U] = 927; + values[Ids.ID_OPLUS] = 8853; + values[Ids.ID_OR] = 8744; + values[Ids.ID_ORDF] = 170; + values[Ids.ID_ORDM] = 186; + values[Ids.ID_OSLASH_L] = 248; + values[Ids.ID_OSLASH_U] = 216; + values[Ids.ID_OTILDE_L] = 245; + values[Ids.ID_OTILDE_U] = 213; + values[Ids.ID_OTIMES] = 8855; + values[Ids.ID_OUML_L] = 246; + values[Ids.ID_OUML_U] = 214; + values[Ids.ID_PARA] = 182; + values[Ids.ID_PART] = 8706; + values[Ids.ID_PERMIL] = 8240; + values[Ids.ID_PERP] = 8869; + values[Ids.ID_PHI_L] = 966; + values[Ids.ID_PHI_U] = 934; + values[Ids.ID_PIV] = 982; + values[Ids.ID_PI_L] = 960; + values[Ids.ID_PI_U] = 928; + values[Ids.ID_PLUSMN] = 177; + values[Ids.ID_POUND] = 163; + values[Ids.ID_PRIME_L] = 8242; + values[Ids.ID_PRIME_U] = 8243; + values[Ids.ID_PROD] = 8719; + values[Ids.ID_PROP] = 8733; + values[Ids.ID_PSI_L] = 968; + values[Ids.ID_PSI_U] = 936; + values[Ids.ID_QUOT] = 34; + values[Ids.ID_RADIC] = 8730; + values[Ids.ID_RANG] = 9002; + values[Ids.ID_RAQUO] = 187; + values[Ids.ID_RARR_L] = 8594; + values[Ids.ID_RARR_U] = 8658; + values[Ids.ID_RCEIL] = 8969; + values[Ids.ID_RDQUO] = 8221; + values[Ids.ID_REAL] = 8476; + values[Ids.ID_REG] = 174; + values[Ids.ID_RFLOOR] = 8971; + values[Ids.ID_RHO_L] = 961; + values[Ids.ID_RHO_U] = 929; + values[Ids.ID_RLM] = 8207; + values[Ids.ID_RSAQUO] = 8250; + values[Ids.ID_RSQUO] = 8217; + values[Ids.ID_SBQUO] = 8218; + values[Ids.ID_SCARON_L] = 353; + values[Ids.ID_SCARON_U] = 352; + values[Ids.ID_SDOT] = 8901; + values[Ids.ID_SECT] = 167; + values[Ids.ID_SHY] = 173; + values[Ids.ID_SIGMAF] = 962; + values[Ids.ID_SIGMA_L] = 963; + values[Ids.ID_SIGMA_U] = 931; + values[Ids.ID_SIM] = 8764; + values[Ids.ID_SPADES] = 9824; + values[Ids.ID_SUB] = 8834; + values[Ids.ID_SUBE] = 8838; + values[Ids.ID_SUM] = 8721; + values[Ids.ID_SUP] = 8835; + values[Ids.ID_SUP1] = 185; + values[Ids.ID_SUP2] = 178; + values[Ids.ID_SUP3] = 179; + values[Ids.ID_SUPE] = 8839; + values[Ids.ID_SZLIG] = 223; + values[Ids.ID_TAU_L] = 964; + values[Ids.ID_TAU_U] = 932; + values[Ids.ID_THERE4] = 8756; + values[Ids.ID_THETASYM] = 977; + values[Ids.ID_THETA_L] = 952; + values[Ids.ID_THETA_U] = 920; + values[Ids.ID_THINSP] = 8201; + values[Ids.ID_THORN_L] = 254; + values[Ids.ID_THORN_U] = 222; + values[Ids.ID_TILDE] = 732; + values[Ids.ID_TIMES] = 215; + values[Ids.ID_TRADE] = 8482; + values[Ids.ID_UACUTE_L] = 250; + values[Ids.ID_UACUTE_U] = 218; + values[Ids.ID_UARR_L] = 8593; + values[Ids.ID_UARR_U] = 8657; + values[Ids.ID_UCIRC_L] = 251; + values[Ids.ID_UCIRC_U] = 219; + values[Ids.ID_UGRAVE_L] = 249; + values[Ids.ID_UGRAVE_U] = 217; + values[Ids.ID_UML] = 168; + values[Ids.ID_UPSIH] = 978; + values[Ids.ID_UPSILON_L] = 965; + values[Ids.ID_UPSILON_U] = 933; + values[Ids.ID_UUML_L] = 252; + values[Ids.ID_UUML_U] = 220; + values[Ids.ID_WEIERP] = 8472; + values[Ids.ID_XI_L] = 958; + values[Ids.ID_XI_U] = 926; + values[Ids.ID_YACUTE_L] = 253; + values[Ids.ID_YACUTE_U] = 221; + values[Ids.ID_YEN] = 165; + values[Ids.ID_YUML_L] = 255; + values[Ids.ID_YUML_U] = 376; + values[Ids.ID_ZETA_L] = 950; + values[Ids.ID_ZETA_U] = 918; + values[Ids.ID_ZWJ] = 8205; + values[Ids.ID_ZWNJ] = 8204; + } + + /** + */ + public EntityCollection() { + super(names, STRICT_CASE); + } + + /** + * Create an entity declaration. + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param attrName java.lang.String + */ + protected CMNode create(String entityName) { + int id = getID(entityName); + if (id == ID_UNKNOWN) + return null; + + String value = String.valueOf(values[id]); + HTMLEntityDeclImpl dec = new HTMLEntityDeclImpl(entityName, value); + + return dec; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java new file mode 100644 index 0000000000..2fb191c230 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * CMDocument implementation for the HTML. + */ +class HCMDocImpl extends CMNodeImpl implements HTMLCMDocument { + + /** Namespace for all names of elements, entities and attributes. */ + private CMNamespaceImpl namespace = null; + private ElementCollection elements = null; + private EntityCollection entities = null; + private AttributeCollection attributes = null; + + /** + */ + public HCMDocImpl(String docTypeName, CMNamespaceImpl targetNamespace) { + super(docTypeName); + namespace = targetNamespace; + attributes = new AttributeCollection(); + elements = new ElementCollection(attributes); + entities = new EntityCollection(); + } + + /** + * @return com.ibm.sed.contentmodel.html.AttributeCollection + */ + AttributeCollection getAttributes() { + return attributes; + } + + /** + * @see com.ibm.sed.contentmodel.html.HTMLCMDocument + */ + public HTMLElementDeclaration getElementDeclaration(String elementName) { + if (elements == null) + return null; + return (HTMLElementDeclaration) elements.getNamedItem(elementName); + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamedNodeMap getElements() { + return elements; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamedNodeMap getEntities() { + return entities; + } + + /** + * @see com.ibm.sed.contentmodel.html.HTMLCMDocument + */ + public HTMLEntityDeclaration getEntityDeclaration(String entityName) { + if (entities == null) + return null; + return (HTMLEntityDeclaration) entities.getNamedItem(entityName); + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamespace getNamespace() { + return namespace; + } + + /** + * @see CMNode + */ + public int getNodeType() { + return CMNode.DOCUMENT; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java new file mode 100644 index 0000000000..f044ef6571 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Implementation class of {@link <code>HTMLAttributeDeclaration</code>} interface.<br> + */ +class HTMLAttrDeclImpl extends CMNodeImpl implements HTMLAttributeDeclaration { + + private HTMLCMDataTypeImpl type = null; + private int usage = 0; + + /** + */ + public HTMLAttrDeclImpl(String attrName, HTMLCMDataTypeImpl valueType, int valueUsage) { + super(attrName); + this.type = valueType; + + switch (valueUsage) { + case OPTIONAL : + case REQUIRED : + case FIXED : + case PROHIBITED : + this.usage = valueUsage; + break; + default : + // should warn... + this.usage = OPTIONAL; // fall back + break; + } + } + + /** + * getAttrName method + * @return java.lang.String + */ + public String getAttrName() { + return getNodeName(); + } + + /** + * getAttrType method + * @return CMDataType + */ + public CMDataType getAttrType() { + return type; + } + + /** + * @deprecated by superinterface + */ + public String getDefaultValue() { + if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT) + return null; + return type.getImpliedValue(); + } + + /** + * @deprecated by superinterface + */ + public Enumeration getEnumAttr() { + Vector v = new Vector(Arrays.asList(type.getEnumeratedValues())); + return v.elements(); + } + + /** + * getNodeType method + * @return int + * + * Returns one of : + * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION. + */ + public int getNodeType() { + return CMNode.ATTRIBUTE_DECLARATION; + } + + /** + * @return int + */ + public int getUsage() { + return usage; + } + + /** + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return true; + else if (propertyName.equals(HTMLCMProperties.IS_SCRIPTABLE)) + return true; + return super.supports(propertyName); + } + + /** + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return new Boolean(true); + else if (propertyName.equals(HTMLCMProperties.IS_SCRIPTABLE)) { + return getAttrType().getDataTypeName() == HTMLCMDataType.SCRIPT ? new Boolean(true) : new Boolean(false); + } + return super.getProperty(propertyName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java new file mode 100644 index 0000000000..1bff6f675a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; + + + +/** + * This interface is intended to be a public interface which has + * interfaces defined in both of {@link <code>CMAttributeDeclaration</code>} + * and {@link <code>HTMLCMNode</code>}.<br> + */ +public interface HTMLAttributeDeclaration extends CMAttributeDeclaration { + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java new file mode 100644 index 0000000000..34361dd96b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * HTML extension for data types. + */ +public interface HTMLCMDataType extends CMDataType { + + /** Boolean; it should be defined in CMDataType. */ + public static final String BOOLEAN = "BOOLEAN"; //$NON-NLS-1$ + public static final String COLOR = "COLOR"; //$NON-NLS-1$ + public static final String EVENT = "EVENT"; //$NON-NLS-1$ + public static final String IDREFS = "IDREFS"; //$NON-NLS-1$ + /** Name; it should be defined in CMDataType. */ + public static final String NAME = "NAME"; //$NON-NLS-1$ + // Following types are just aliases. + /** %Character; == CDATA */ + public static final String CHARACTER = CMDataType.CDATA; + /** %Charset; == CDATA */ + public static final String CHARSET = CMDataType.CDATA; + /** %Charsets; == CDATA */ + public static final String CHARSETS = CMDataType.CDATA; + /** %ContentType; == CDATA */ + public static final String CONTENT_TYPE = CMDataType.CDATA; + /** %Coords; == CDATA */ + public static final String COORDS = CMDataType.CDATA; + /** %Datetime; == CDATA */ + public static final String DATETIME = CMDataType.CDATA; + /** %FrameTarget; == CDATA */ + public static final String FRAME_TARGET = CMDataType.CDATA; + /** %LanguageCode; == NAME */ + public static final String LANGUAGE_CODE = NAME; + /** %Length; == CDATA */ + public static final String LENGTH = CMDataType.CDATA; + /** %LinkTypes; == CDATA */ + public static final String LINK_TYPES = CMDataType.CDATA; + /** %LIStyle; == CDATA */ + public static final String LI_STYLE = CMDataType.CDATA; + /** %MediaDesc; == CDATA */ + public static final String MEDIA_DESC = CMDataType.CDATA; + /** %MultiLength; == CDATA */ + public static final String MULTI_LENGTH = CMDataType.CDATA; + /** %OLStyle; == CDATA */ + public static final String OL_STYLE = CMDataType.CDATA; + /** %Pixles; == CDATA */ + public static final String PIXELS = CMDataType.CDATA; + /** %Script; == EVENT */ + public static final String SCRIPT = EVENT; + /** %StyleSheet; == EVENT */ + public static final String STYLE_SHEET = CMDataType.CDATA; + /** %Text; == CDATA */ + public static final String TEXT = CMDataType.CDATA; +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java new file mode 100644 index 0000000000..fe6e6881b7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + + + +/** + */ +class HTMLCMDataTypeImpl extends CMNodeImpl implements HTMLCMDataType { + + private int impliedValueKind = IMPLIED_VALUE_NONE; + private String impliedValue = null; + private final static String[] emptyArray = new String[0]; + private String[] enumValues = emptyArray; + private String instanceValue = null; + + /** + * HTMLCMDataTypeImpl constructor comment. + * @param nm java.lang.String + */ + public HTMLCMDataTypeImpl(String typeName) { + super(typeName); + } + + /** + * HTMLCMDataTypeImpl constructor comment. + * @param nm java.lang.String + */ + public HTMLCMDataTypeImpl(String typeName, String instanceValue) { + super(typeName); + this.instanceValue = instanceValue; + } + + /** + * getTypeName method + * @return java.lang.String + * + * This method returns a suitable default value that can be used when an instance of the data type is created. + * This returns null of a suitable default is not available. + */ + public String generateInstanceValue() { + return instanceValue; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDataType + */ + public String getDataTypeName() { + return getNodeName(); + } + + /** + * getTypeName method + * @return java.lang.String[] + * + */ + public String[] getEnumeratedValues() { + return enumValues; + } + + /** + * getTypeName method + * @return java.lang.String + * + * Returns the implied value or null if none exists. + */ + public String getImpliedValue() { + return impliedValue; + } + + /** + * getImpliedValueKind method + * @return int + * + * Returns one of : + * IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED, IMPLIED_VALUE_DEFAULT. + */ + public int getImpliedValueKind() { + return impliedValueKind; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + public int getNodeType() { + return CMNode.DATA_TYPE; + } + + /** + */ + void setEnumValues(String[] values) { + enumValues = new String[values.length]; + for (int i = 0; i < values.length; i++) { + enumValues[i] = values[i]; + } + } + + /** + * package scope. + */ + void setImpliedValue(int kind, String value) { + switch (kind) { + case IMPLIED_VALUE_FIXED : + case IMPLIED_VALUE_DEFAULT : + impliedValueKind = kind; + impliedValue = value; + break; + case IMPLIED_VALUE_NONE : + default : + impliedValueKind = IMPLIED_VALUE_NONE; + impliedValue = null; // maybe a null string? + break; + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java new file mode 100644 index 0000000000..8a5a1ecaf0 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; + + + +/** + * HTML extension for CMDocument. + * This interface provides some short hand methods to get declarations + * by a name. + */ +public interface HTMLCMDocument extends CMDocument { + + /** + * A short hand method to get a element declaration for a HTML element.<br> + * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration + * @param elementName java.lang.String + */ + HTMLElementDeclaration getElementDeclaration(String elementName); + + /** + * A short hand method to get a entity declaration of HTML documents.<br> + * @return com.ibm.sed.contentmodel.html.HTMLEntityDeclaration + * @param entityName java.lang.String + */ + HTMLEntityDeclaration getEntityDeclaration(String entityName); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java new file mode 100644 index 0000000000..00650f5720 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Hashtable; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.html.core.internal.contentmodel.chtml.CHCMDocImpl; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; + +/** + * INodeAdapter factory for HTML and JSP documents. + */ +public final class HTMLCMDocumentFactory { + + private static Hashtable cmdocs = new Hashtable(); + + static { + CMNamespaceImpl h40ns = new CMNamespaceImpl(HTML40Namespace.HTML40_URI, HTML40Namespace.HTML40_TAG_PREFIX); + CMNamespaceImpl j11ns = new CMNamespaceImpl(JSP11Namespace.JSP11_URI, JSP11Namespace.JSP_TAG_PREFIX); + + HCMDocImpl html40doc = new HCMDocImpl(CMDocType.HTML_DOC_TYPE, h40ns); + CHCMDocImpl chtmldoc = new CHCMDocImpl(CMDocType.CHTML_DOC_TYPE, h40ns); + JCMDocImpl jsp11doc = new JCMDocImpl(CMDocType.JSP11_DOC_TYPE, j11ns); + + cmdocs.put(CMDocType.HTML_DOC_TYPE, html40doc); + cmdocs.put(CMDocType.CHTML_DOC_TYPE, chtmldoc); + cmdocs.put(CMDocType.JSP11_DOC_TYPE, jsp11doc); + } + + /** + * HTMLCMAdapterFactory constructor. + */ + private HTMLCMDocumentFactory() { + super(); + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + * @param cmtype java.lang.String + */ + public static CMDocument getCMDocument(String cmtype) { + Object obj = cmdocs.get(cmtype); + if (obj == null) + return null; + + return (CMDocument) obj; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java new file mode 100644 index 0000000000..8538731aef --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + +/** + * In HTML Documents, name and value of an attribute/element/entity + * should be treated ignoring theirs case. However, in XML documents, + * they should be distinguished with sensitiveness of their case. + * CMNode is basically designed to represent DTDs or Schemas for XML + * documents. So, it doesn't have interfaces to retrieve such information. + * However, declarations in the HTML CM should provide such information. + * This intermediate interface is intended to provide whether ignore cases + * or not.<br> + */ +interface HTMLCMNode extends org.eclipse.wst.xml.core.internal.contentmodel.CMNode { + + /** + * Returns <code>true</code>, if declaration is for HTML attribute/element/entity. + * Otherwise, returns <code>false</code>. + * @return boolean + */ + boolean shouldIgnoreCase(); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java new file mode 100644 index 0000000000..4ef99ba35f --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java @@ -0,0 +1,377 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Base class for all Hed???? classes. + */ +abstract class HTMLElemDeclImpl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration { + + // DTD + protected CMNamedNodeMapImpl attributes = null; + protected String typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY; + /** Never access this field directly. Instead, use getComplexTypeDefinition method. */ + private ComplexTypeDefinition typeDefinition = null; + protected CMGroupImpl inclusion = null; + protected CMGroupImpl exclusion = null; + // advanced information + protected CMNamedNodeMap prohibitedAncestors = null; + protected int correctionType = CORRECT_NONE; + protected int formatType = FORMAT_HTML; + protected int layoutType = LAYOUT_NONE; + protected int omitType = OMIT_NONE; + protected boolean keepSpaces = false; + protected boolean indentChild = false; + protected ElementCollection elementCollection = null; + protected AttributeCollection attributeCollection = null; + protected final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() { + public int getLength() { + return 0; + } + + public CMNode getNamedItem(String name) { + return null; + } + + public CMNode item(int index) { + return null; + } + + public Iterator iterator() { + return new Iterator() { + public boolean hasNext() { + return false; + } + + public Object next() { + return null; + } + + public void remove() { + } + }; + } + }; + + /** + * HTMLElemDeclImpl constructor. + * In the HTML DTD, an element declaration has no specification + * for its occurrence. Occurrence is specifed in content model, like + * <code>(LI)+</code>. To avoid confusion (and complexity), + * occurrence of an element declaration is always 1 (it means, min = 1 and + * max = 1). Instead, occurrence of CMGroup represents actual occurrence + * of the content. + * <br> + * @param name java.lang.String + */ + public HTMLElemDeclImpl(String elementName, ElementCollection collection) { + super(elementName, 1, 1); + elementCollection = collection; + attributeCollection = collection.getAttributeCollection(); + } + + /** + */ + protected abstract void createAttributeDeclarations(); + + /** + * + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + private ComplexTypeDefinition createComplexTypeDefinition() { + if (typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_CDATA) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_EMPTY) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_PCDATA)) + return null; + + ComplexTypeDefinitionFactory factory = ComplexTypeDefinitionFactory.getInstance(); + if (factory == null) + return null; // fatal error. + + ComplexTypeDefinition def = factory.createTypeDefinition(typeDefinitionName, elementCollection); + return def; + } + + /** + * Get an attribute declaration. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) { + if (attributes == null) { + createAttributeDeclarations(); + if (attributes == null) + return null; // fail to create + } + + CMNode cmnode = attributes.getNamedItem(attrName); + if (cmnode == null) { + return null; + } + else { + return (HTMLAttributeDeclaration) cmnode; // already exists. + } + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMNamedNodeMap getAttributes() { + if (attributes == null) + createAttributeDeclarations(); // lazy eval. + return attributes; + } + + /** + * Get an instance of complex type definition. + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + private ComplexTypeDefinition getComplexTypeDefinition() { + if (typeDefinition == null) + typeDefinition = createComplexTypeDefinition(); + return typeDefinition; + } + + /** + * Content.<br> + * Element declarations which type is EMPTY or CDATA (maybe PCDATA) + * <strong>MUST</strong> override this method and always return null. + * This default implementation always tries to create a complex type definition + * instance and access to it. + * <br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMContent getContent() { + ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval. + return (def != null) ? def.getContent() : null; + } + + /** + * Content type.<br> + * Element declarations which type is EMPTY or CDATA (maybe PCDATA) + * <strong>MUST</strong> override this method and return an appropriate type. + * This default implementation always tries to create a complex type definition + * instance and access to it. + * <br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public int getContentType() { + ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval. + return (def != null) ? def.getContentType() : CMElementDeclaration.CDATA; + } + + /** + * @see HTMLElementDeclaration#getCorrectionType + */ + public int getCorrectionType() { + return correctionType; + } + + /** + * HTML element doesn't have any data type. So, this method always + * returns <code>null</code>.<br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMDataType getDataType() { + return null; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public String getElementName() { + return getNodeName(); + } + + /** + * Exclusion. + * Almost elements don't have a exclusion. + * Only classes those have exclusion should override this method. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + return null; + } + + /** + * Default format type is <code>FORMAT_HTML</code>.<br> + */ + public int getFormatType() { + return formatType; + } + + /** + * Inclusion. + * Almost elements don't have a inclusion. + * Only classes those have inclusion should override this method. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getInclusion() { + return null; + } + + /** + */ + public int getLayoutType() { + return layoutType; + } + + /** + * Line break hint is strongly related to layout type. + * Indeed, in the C++DOM, it is determined from layout type only. + * So, this implementation, as the default implementation for all declarations, + * also determines from layout type only.<br> + * @return int + */ + public int getLineBreakHint() { + switch (getLayoutType()) { + case HTMLElementDeclaration.LAYOUT_BLOCK : + return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END; + case HTMLElementDeclaration.LAYOUT_BREAK : + return HTMLElementDeclaration.BREAK_AFTER_START; + case HTMLElementDeclaration.LAYOUT_HIDDEN : + return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END; + default : + return HTMLElementDeclaration.BREAK_NONE; + } + } + + /** + * No HTML element has local elements. So, this method always + * returns an empty map. + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMNamedNodeMap getLocalElements() { + return EMPTY_MAP; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + public int getNodeType() { + return CMNode.ELEMENT_DECLARATION; + } + + /** + */ + public int getOmitType() { + return omitType; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + return EMPTY_MAP; + } + + /** + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return true; + } + else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { + ComplexTypeDefinition def = getComplexTypeDefinition(); + return (def != null); + } + else { + PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); + if (pp == null) + return false; + return pp.supports(this); + } + + } + + /** + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return new Boolean(true); + } + else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { + ComplexTypeDefinition def = getComplexTypeDefinition(); + return (def != null) ? def.getPrimaryCandidate() : null; + } + else { + PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); + if (pp == null) + return null; + return pp.get(this); + } + } + + /** + * Return element names which terminates this element.<br> + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return null; + } + + /** + * return true when the element is a JSP element. + */ + public boolean isJSP() { + return false; + } + + /** + * In some elements, such as APPLET, a source generator should indent child + * elements that their parents. That is, a source generator should generate + * source of APPLET and PARAMS like this: + * <PRE> + * <APPLET ...> + * <PARAM ... > + * <PARAM ... > + * </APPLET> + * <PRE> + * @return boolean + */ + public boolean shouldIndentChildSource() { + return indentChild; + } + + /** + * Most of elements can compact spaces in their child text nodes. + * Some special elements should keep them in their source. + * @return boolean + */ + public boolean shouldKeepSpaces() { + return keepSpaces; + } + + /** + * @return boolean + */ + public boolean shouldTerminateAt(HTMLElementDeclaration nextElement) { + Iterator i = getTerminators(); + if (i == null) + return false; + String nextName = nextElement.getElementName(); + while (i.hasNext()) { + if (nextName.equals(i.next())) + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java new file mode 100644 index 0000000000..12a2ceb393 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * This interface is intended to be a public interface which has + * interfaces defined in both of {@link <code>CMElementDeclaration</code>} + * and {@link <code>HTMLCMNode</code>}.<br> + * In addition to this, some interfaces are added to this interface, + * those are specially to HTML elements.<br> + */ +public interface HTMLElementDeclaration extends CMElementDeclaration { + + /** Tag ommission; Not ommisible. */ + int OMIT_NONE = 0; + /** Tag ommission; Both tags are ommisible. */ + int OMIT_BOTH = 1; + /** Tag ommission; The end tag is ommisible. */ + int OMIT_END = 2; + /** Tag ommission; The end tag is ommitted when created. */ + int OMIT_END_DEFAULT = 3; + /** Tag ommission; The end tag must be omitted. */ + int OMIT_END_MUST = 4; + /** Line Break; No break. */ + int BREAK_NONE = 10; + /** Line Break; Break after the start tag. */ + int BREAK_AFTER_START = 11; + /** Line Break; Break both before the start tagn and after the end tag. */ + int BREAK_BEFORE_START_AND_AFTER_END = 12; + /* Layout */ + /** initial value; the value should never returns to client programs. */ + int LAYOUT_NONE = 100; + int LAYOUT_BLOCK = 101; + int LAYOUT_WRAP = 102; + /** No wrap object; like IMG, APPLET,... */ + int LAYOUT_OBJECT = 103; + /** BR */ + int LAYOUT_BREAK = 104; + /** Hidden object; like HTML or HEAD */ + int LAYOUT_HIDDEN = 105; + /* Correction */ + /** Correct; No correct. */ + int CORRECT_NONE = 1000; + /** Correct; Meaningless when the content is empty. */ + int CORRECT_EMPTY = 1001; + /** Correct; Meaningless when no attribut is set. */ + int CORRECT_NEUTRAL = 1002; + /** Correct; Meaningless when same element is nested. */ + int CORRECT_DUPLICATED = 1003; + /** Format; HTML */ + int FORMAT_HTML = 10000; + /** Format; SSI */ + int FORMAT_SSI = 10001; + /** Format; JSP script */ + int FORMAT_JSP_SCRIPT = 10002; + /** Format; JSP directive */ + int FORMAT_JSP_DIRECTIVE = 10003; + /** Format; XML */ + int FORMAT_XML = 10004; + /** Format; MW */ + int FORMAT_MW = 10005; + + /** + * A short hand method to get an attribute declaration of a HTML element. + * @return com.ibm.sed.contentmodel.html.HTMLAttributeDeclaration + * @param attrName java.lang.String + */ + HTMLAttributeDeclaration getAttributeDeclaration(String attrName); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java new file mode 100644 index 0000000000..61f4eaf2f0 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + + + +/** + */ +class HTMLEntityDeclImpl extends CMNodeImpl implements HTMLEntityDeclaration { + + private java.lang.String value = null; + + /** + * CMEntityDeclImpl constructor comment. + * @param entityName java.lang.String; Entity name. + * @param entityValue java.lang.String; Value string. + */ + public HTMLEntityDeclImpl(String entityName, String entityValue) { + super(entityName); + value = entityValue; + } + + /** + * getName method + * @return java.lang.String + */ + public String getName() { + return getNodeName(); + } + + /** + * Get CMNode type.<br> + * @return int; Always return ENTITY_DECLARATION. + */ + public int getNodeType() { + return CMNode.ENTITY_DECLARATION; + } + + /** + * getValue method + * @return java.lang.String + */ + public String getValue() { + return value; + } + + /** + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return true; + return super.supports(propertyName); + } + + /** + * Entities in HTML documents are always treated with ignoring cases. + * Because no special entities are defined in JSP 1.0, this method + * can always return <code>true</code>.<br> + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return new Boolean(true); + return super.getProperty(propertyName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java new file mode 100644 index 0000000000..2663e23fcb --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * This interface is intended to be a public interface which has + * interfaces defined in both of {@link <code>CMEntityDeclaration</code>} + * and {@link <code>HTMLCMNode</code>}.<br> + */ +public interface HTMLEntityDeclaration extends org.eclipse.wst.xml.core.internal.contentmodel.CMEntityDeclaration { + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java new file mode 100644 index 0000000000..d3a4b266d5 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * This interface is commonly used in declaration implementation, and internal use. + * Use getProperty() method for public use. + */ +public interface HTMLPropertyDeclaration { + /** + * To determin the type, look up the following keywords in C++DOM/DTDParser.cpp: + * <ul> + * <li>CORRECT_DUPLICATED - <code>GROUP_NODUP</code></li> + * <li>CORRECT_EMPTY - <code>GROUP_COMPACT</code></li> + * <li>CORRECT_NEUTRAL - <code>GROUP_NEUTRAL</code></li> + * <li>CORRECT_NONE - <code>(N/A)</code></li> + * </ul> + * @return int + */ + int getCorrectionType(); + /** + * Get the list of declarations those should be excluded from the content.<br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + CMContent getExclusion(); + /** + * To determin the type, see the following files in the C++DOM: + * ElementType.cpp - ElementType#setGroup(). + * Element.cpp - Element#getStartTag(). + * @return int + */ + int getFormatType(); + /** + * Get the list of declarations those should be included into the content.<br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + CMContent getInclusion(); + /** + * To determin the type, look up the following keywords in C++DOM/DTDParser.cpp: + * <ul> + * <li>LAYOUT_BLOCK - <code>GROUP_BLOCK</code></li> + * <li>LAYOUT_BREAK - <code>GROUP_BREAK</code></li> + * <li>LAYOUT_HIDDEN - <code>GROUP_HIDDEN</code></li> + * <li>LAYOUT_NONE - <code>(N/A)</code></li> + * <li>LAYOUT_OBJECT - <code>GROUP_NOWRAP</code></li> + * <li>LAYOUT_WRAP - <code>(N/A)</code></li> + * </ul> + * @return int + */ + int getLayoutType(); + /** + * To determine the type, see <code>Element::isBreakingBeforeElement()</code> + * and <code>Element::isBreakingAfterElement()</code> defined in C++DOM/Element.cpp.<br> + * @return int + */ + int getLineBreakHint(); + /** + * To determine the type, Check the HTML DTD. + * And look up <code>GROUP_NOEND</code> in C++DOM/DTDParser.cpp.<br> + * @return int + */ + int getOmitType(); + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap + */ + CMNamedNodeMap getProhibitedAncestors(); + /** + * return true when the element is a JSP element. + */ + boolean isJSP(); + /** + * @return boolean + */ + boolean shouldIndentChildSource(); + /** + * Some elements should keep spaces in its child text nodes. + * For example, PRE and TEXTAREA. This method returns true, + * if a target element is one of such elements. + * @return boolean + */ + boolean shouldKeepSpaces(); + /** + * Returns <code>true</code>, if <code>nextElement</code> terminates + * the current element. + * Some elements like <code>P</code> terminates other <code>P</code>. + * That is, when <code><P></code> appears at the next to <code>P</code>, + * which end tags is omitted, it represents not only the beginning of the + * new <code>P</code> element but also the end of the previous <code>P</code>. + * <br> + * See the C++DOM/HTMLParser#_terminate(Element*) method. + * @param nextElement com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + boolean shouldTerminateAt(HTMLElementDeclaration nextElement); +} diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java new file mode 100644 index 0000000000..b4890041a5 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * A. + */ +final class HedA extends HedInlineContainer { + + /** + */ + public HedA(ElementCollection collection) { + super(HTML40Namespace.ElementName.A, collection); + // CORRECT_EMPTY - GROUP_COMPACT + correctionType = CORRECT_EMPTY; + } + + /** + * %attrs; + * (charset %Charset; #IMPLIED) + * (type %ContentType; #IMPLIED) + * (name CDATA #IMPLIED) + * (href %URI; #IMPLIED) + * (hreflang %LanguageCode; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + * (rel %LinkTypes; #IMPLIED) + * (rev %LinkTypes; #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (directkey %Character; #IMPLIED) + * (shape %Shape; rect) + * (coords %Coords; #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_TYPE, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_HREFLANG, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_REL, HTML40Namespace.ATTR_NAME_REV, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_DIRECTKEY, HTML40Namespace.ATTR_NAME_SHAPE, HTML40Namespace.ATTR_NAME_COORDS, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Exclusion. + * <code>A</code> has the exclusion. + * It is <code>A</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + CMNode a = elementCollection.getNamedItem(HTML40Namespace.ElementName.A); + if (a != null) + exclusion.appendChild(a); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.A, HTML40Namespace.ElementName.BUTTON}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java new file mode 100644 index 0000000000..8210a00fcc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * ADDRESS. + */ +final class HedADDRESS extends HTMLElemDeclImpl { + + /** + */ + public HedADDRESS(ElementCollection collection) { + super(HTML40Namespace.ElementName.ADDRESS, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_ADDRESS; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java new file mode 100644 index 0000000000..7365806f4a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * APPLET. + */ +final class HedAPPLET extends HTMLElemDeclImpl { + + /** + */ + public HedAPPLET(ElementCollection collection) { + super(HTML40Namespace.ElementName.APPLET, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PARAM_CONTAINER; + layoutType = LAYOUT_OBJECT; + indentChild = true; + } + + /** + * %coreattrs; + * (codebase %URI; #IMPLIED) + * (archive CDATA #IMPLIED) + * (code CDATA #IMPLIED) + * (object CDATA #IMPLIED) + * (alt %Text; #IMPLIED) ... should be defined locally. + * (name CDATA #IMPLIED) + * (width %Length; #REQUIRED) + * (height %Length; #REQUIRED) + * (align %IAlign; #IMPLIED) + * (hspace %Pixels; #IMPLIED) + * (vspace %Pixels; #IMPLIED) + * (mayscript (mayscript) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_CODEBASE, HTML40Namespace.ATTR_NAME_ARCHIVE, HTML40Namespace.ATTR_NAME_CODE, HTML40Namespace.ATTR_NAME_OBJECT, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_MAYSCRIPT}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // %align; ... should be defined locally. + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java new file mode 100644 index 0000000000..69d951a0a1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * AREA. + */ +final class HedAREA extends HedEmpty { + + /** + */ + public HedAREA(ElementCollection collection) { + super(HTML40Namespace.ElementName.AREA, collection); + // LAYOUT_HIDDEN. + // Because, AREA is GROUP_HIDDEN in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_HIDDEN; + } + + /** + * AREA. + * %attrs; + * (shape %Shape; rect) + * (coords %Coords; #IMPLIED) + * (href %URI; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + * (nohref (nohref) #IMPLIED) + * (alt %Text; #REQUIRED) + * (tabindex NUMBER #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_SHAPE, HTML40Namespace.ATTR_NAME_COORDS, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_NOHREF, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java new file mode 100644 index 0000000000..2c001719bd --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * BASE. + */ +final class HedBASE extends HedEmpty { + + /** + */ + public HedBASE(ElementCollection collection) { + super(HTML40Namespace.ElementName.BASE, collection); + // LAYOUT_HIDDEN. + // Because, BASE is GROUP_HIDDEN in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_HIDDEN; + } + + /** + * BASE. + * (href %URI; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_TARGET}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java new file mode 100644 index 0000000000..c2bd5e9f32 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * BASEFONT. + */ +final class HedBASEFONT extends HedEmpty { + + /** + */ + public HedBASEFONT(ElementCollection collection) { + super(HTML40Namespace.ElementName.BASEFONT, collection); + // LAYOUT_OBJECT - GROUP_NOWRAP. + layoutType = LAYOUT_OBJECT; + } + + /** + * BASEFONT. + * (id ID #IMPLIED) + * (size CDATA #REQUIRED) ... should be localy defined. + * (color %Color; #IMPLIED) + * (face CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_ID, HTML40Namespace.ATTR_NAME_COLOR, HTML40Namespace.ATTR_NAME_FACE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (size CDATA #REQUIRED) ... should be localy defined. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java new file mode 100644 index 0000000000..d8365bf4d3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * BDO. + */ +final class HedBDO extends HedInlineContainer { + + /** + */ + public HedBDO(ElementCollection collection) { + super(HTML40Namespace.ElementName.BDO, collection); + // CORRECT_EMPTY - GROUP_COMPACT + correctionType = CORRECT_EMPTY; + } + + /** + * %coreattrs; + * (lang %LanguageCode; #IMPLIED) + * (dir (ltr|rtl) #REQUIRED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_LANG}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (dir (ltr|rtl) #REQUIRED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {HTML40Namespace.ATTR_VALUE_LTR, HTML40Namespace.ATTR_VALUE_RTL}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_DIR, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_DIR, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java new file mode 100644 index 0000000000..e85ee5af47 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + + + +final class HedBGSOUND extends HedEmpty { + + public HedBGSOUND(ElementCollection collection) { + super(HTML40Namespace.ElementName.BGSOUND, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * (src, CDATA, #IMPLIED) + * (loop, CDATA, #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + // src + HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_SRC); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr); + // loop + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_INFINITE); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_LOOP, atype, CMAttributeDeclaration.OPTIONAL); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_LOOP, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java new file mode 100644 index 0000000000..75dfe539b0 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * BLOCKQUOTE. + */ +final class HedBLOCKQUOTE extends HedFlowContainer { + + /** + */ + public HedBLOCKQUOTE(ElementCollection collection) { + super(HTML40Namespace.ElementName.BLOCKQUOTE, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * (cite %URI; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_CITE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java new file mode 100644 index 0000000000..4cfd615559 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * BODY. + */ +final class HedBODY extends HedFlowContainer { + + private static String[] terminators = {HTML40Namespace.ElementName.HEAD, HTML40Namespace.ElementName.BODY, HTML40Namespace.ElementName.FRAMESET, HTML40Namespace.ElementName.HTML}; + + /** + */ + public HedBODY(ElementCollection collection) { + super(HTML40Namespace.ElementName.BODY, collection); + layoutType = LAYOUT_BLOCK; + omitType = OMIT_BOTH; + } + + /** + * %attrs; + * %bodycolors; + * (onload %Script; #IMPLIED) + * (onunload %Script; #IMPLIED) + * (background %URI; #IMPLIED) + * (marginwidth %Pixels; #IMPLIED) ... D205514 + * (marginheight %Pixels; #IMPLIED) .. D205514 + * (topmargin, CDATA, #IMPLIED) ...... D205514 + * (bottommargin, CDATA, #IMPLIED) ... D205514 + * (leftmargin, CDATA, #IMPLIED) ..... D205514 + * (rightmargin, CDATA, #IMPLIED) .... D205514 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %bodycolors; + attributeCollection.getBodycolors(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_ONLOAD, HTML40Namespace.ATTR_NAME_ONUNLOAD, HTML40Namespace.ATTR_NAME_BACKGROUND, + // <<D205514 + HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_TOPMARGIN, HTML40Namespace.ATTR_NAME_BOTTOMMARGIN, HTML40Namespace.ATTR_NAME_LEFTMARGIN, HTML40Namespace.ATTR_NAME_RIGHTMARGIN + // D205514 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Inclusion. + * "Lazy eval."<br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getInclusion() { + if (inclusion != null) + return inclusion; // already created. + if (elementCollection == null) + return null; + + // (INS|DEL) + inclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + String[] names = {HTML40Namespace.ElementName.INS, HTML40Namespace.ElementName.DEL}; + elementCollection.getDeclarations(inclusion, Arrays.asList(names).iterator()); + return inclusion; + } + + /** + * BODY has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java new file mode 100644 index 0000000000..6232117b58 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; + + + +/** + * BR. + */ +final class HedBR extends HedEmpty { + + /** + */ + public HedBR(ElementCollection collection) { + super(HTML40Namespace.ElementName.BR, collection); + // LAYOUT_BREAK. + // Because, BR is GROUP_BREAK in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_BREAK; + } + + /** + * BR. + * %coreattrs; + * (clear (left | all | right | none) none) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + // clear + HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_CLEAR); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_CLEAR, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java new file mode 100644 index 0000000000..568fb476aa --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * BUTTON. + */ +final class HedBUTTON extends HedFlowContainer { + + /** + */ + public HedBUTTON(ElementCollection collection) { + super(HTML40Namespace.ElementName.BUTTON, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * %reserved; ... empty. + * (name CDATA #IMPLIED) + * (value CDATA #IMPLIED) + * (type (button|submit|reset) submit) ... should be defined locally. + * (disabled (disabled) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (type (button|submit|reset) submit) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {HTML40Namespace.ATTR_VALUE_BUTTON, HTML40Namespace.ATTR_VALUE_SUBMIT, HTML40Namespace.ATTR_VALUE_RESET}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + } + + /** + * Exclusion. + * <code>FORM</code> has the exclusion. + * It is <code>FORM</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; // fatal + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + String[] names = {HTML40Namespace.ElementName.A, HTML40Namespace.ElementName.FORM, HTML40Namespace.ElementName.ISINDEX, HTML40Namespace.ElementName.FIELDSET, HTML40Namespace.ElementName.IFRAME}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + elementCollection.getFormctrl(exclusion); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java new file mode 100644 index 0000000000..7f409280bb --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; + + + +/** + * CAPTION. + */ +final class HedCAPTION extends HedInlineContainer { + + /** + */ + public HedCAPTION(ElementCollection collection) { + super(HTML40Namespace.ElementName.CAPTION, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * (align %CAlign; #IMPLIED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForCaption(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java new file mode 100644 index 0000000000..029e3656a2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * CENTER. + */ +final class HedCENTER extends HedFlowContainer { + + /** + */ + public HedCENTER(ElementCollection collection) { + super(HTML40Namespace.ElementName.CENTER, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java new file mode 100644 index 0000000000..2e2214a7f0 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; + +/** + * COL. + */ +final class HedCOL extends HedEmpty { + + /** + */ + public HedCOL(ElementCollection collection) { + super(HTML40Namespace.ElementName.COL, collection); + // LAYOUT_BLOCK. + // Because, COL is GROUP_BLOCK in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_BLOCK; + } + + /** + * COL. + * %attrs; + * (span NUMBER 1) + * (width %MultiLength; #IMPLIED) ... should be defined locally. + * %cellhalign; + * %cellvalign; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (span NUMBER 1) + String[] names = {HTML40Namespace.ATTR_NAME_SPAN}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (width %MultiLength; #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MULTI_LENGTH); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr); + + // %cellhalign; + attributeCollection.getCellhalign(attributes); + // %cellvalign; + attributeCollection.getCellvalign(attributes); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java new file mode 100644 index 0000000000..2903b7e8db --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; + +/** + * COLGROUP. + */ +final class HedCOLGROUP extends HTMLElemDeclImpl { + + private static String[] terminators = {HTML40Namespace.ElementName.COLGROUP, HTML40Namespace.ElementName.CAPTION, HTML40Namespace.ElementName.THEAD, HTML40Namespace.ElementName.TBODY, HTML40Namespace.ElementName.TFOOT, HTML40Namespace.ElementName.TR}; + + /** + * @param ownerDocument com.ibm.sed.contentmodel.html.HCMDocImpl + */ + public HedCOLGROUP(ElementCollection collection) { + super(HTML40Namespace.ElementName.COLGROUP, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_COLUMN_GROUP; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END; + indentChild = true; + } + + /** + * %attrs; + * (span NUMBER 1) + * (width %MultiLength; #IMPLIED) ... should be defined locally. + * %cellhalign; + * %cellvalign; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %cellhalign; + attributeCollection.getCellhalign(attributes); + // %cellvalign; + attributeCollection.getCellvalign(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_SPAN}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (width %MultiLength; #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MULTI_LENGTH); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr); + } + + /** + * LI has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java new file mode 100644 index 0000000000..06676e76f2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * DD. + */ +final class HedDD extends HedFlowContainer { + + private static String[] terminators = {HTML40Namespace.ElementName.DT, HTML40Namespace.ElementName.DD}; + + /** + */ + public HedDD(ElementCollection collection) { + super(HTML40Namespace.ElementName.DD, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END_DEFAULT; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + * DD has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java new file mode 100644 index 0000000000..401399ed7a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * DIV. + */ +final class HedDIV extends HedFlowContainer { + + /** + */ + public HedDIV(ElementCollection collection) { + super(HTML40Namespace.ElementName.DIV, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * %align; + * %reserved; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %align; + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + // %reserved; ... empty + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java new file mode 100644 index 0000000000..c6535a553e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * DL. + */ +final class HedDL extends HTMLElemDeclImpl { + + /** + */ + public HedDL(ElementCollection collection) { + super(HTML40Namespace.ElementName.DL, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + indentChild = true; + } + + /** + * %arrays; + * (compact (compact) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_COMPACT}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java new file mode 100644 index 0000000000..4fa23ab9a7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * DT. + */ +final class HedDT extends HedInlineContainer { + + private static String[] terminators = {HTML40Namespace.ElementName.DT, HTML40Namespace.ElementName.DD}; + + /** + */ + public HedDT(ElementCollection collection) { + super(HTML40Namespace.ElementName.DT, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END_DEFAULT; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + * DT has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java new file mode 100644 index 0000000000..89b4c6a796 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * EMBED. + */ +final class HedEMBED extends HTMLElemDeclImpl { + + /** + */ + public HedEMBED(ElementCollection collection) { + super(HTML40Namespace.ElementName.EMBED, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMBED; + layoutType = LAYOUT_OBJECT; + omitType = OMIT_END_DEFAULT; + } + + /** + * %coreattrs; + * %events; + * (src %URI; #REQUIRED) ... should be defined locally. + * (height %Length; #IMPLIED) + * (width %Length; #IMPLIED) + * (align %IAlign; #IMPLIED) ... should be defined locally. + * (hspace %Pixels; #IMPLIED) + * (vspace %Pixels; #IMPLIED) + * (loop CDATA #IMPLIED) + * (hidden CDATA #IMPLIED) + * (volume CDATA #IMPLIED) + * (autostart (true|false) #IMPLIED) + * (autoplay (true|false) #IMPLIED) + * (autosize (true|false) #IMPLIED) + * (controller (true|false) true) + * (scale CDATA #IMPLIED) + * (showcontrols (true|false) #IMPLIED) + * (playcount NUMBER #IMPLIED) + * (repeat CDATA #IMPLIED) + * (panel CDATA #IMPLIED) + * (text CDATA #IMPLIED) + * (palette CDATA #IMPLIED) + * (textfocus CDATA #IMPLIED) + * (type CDATA #IMPLIED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + // %events; + attributeCollection.getEvents(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_LOOP, HTML40Namespace.ATTR_NAME_HIDDEN, HTML40Namespace.ATTR_NAME_VOLUME, HTML40Namespace.ATTR_NAME_AUTOSTART, HTML40Namespace.ATTR_NAME_AUTOPLAY, HTML40Namespace.ATTR_NAME_AUTOSIZE, HTML40Namespace.ATTR_NAME_CONTROLLER, HTML40Namespace.ATTR_NAME_SCALE, HTML40Namespace.ATTR_NAME_SHOWCONTROLS, HTML40Namespace.ATTR_NAME_PLAYCOUNT, HTML40Namespace.ATTR_NAME_REPEAT, HTML40Namespace.ATTR_NAME_PANEL, HTML40Namespace.ATTR_NAME_TEXT, HTML40Namespace.ATTR_NAME_PALETTE, HTML40Namespace.ATTR_NAME_TEXTFOCUS}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + // (src %URI; #REQUIRED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr); + + // (align %IAlign; #IMPLIED) ... should be defined locally. + attr = AttributeCollection.createAlignForImage(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + + // (type CDATA #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java new file mode 100644 index 0000000000..8f5898a5fe --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * Base class for EMPTY type element declarations. + */ +abstract class HedEmpty extends HTMLElemDeclImpl { + + /** + */ + public HedEmpty(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY; + // EMPTY type has no end tag. + omitType = OMIT_END_MUST; + } + + /** + * Content.<br> + * EMPTY type always returns <code>null</code>. + * <br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getContent() { + return null; + } + + /** + * Content type.<br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public int getContentType() { + return CMElementDeclaration.EMPTY; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java new file mode 100644 index 0000000000..1d76bff525 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * FIELDSET. + */ +final class HedFIELDSET extends HTMLElemDeclImpl { + + /** + */ + public HedFIELDSET(ElementCollection collection) { + super(HTML40Namespace.ElementName.FIELDSET, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FIELDSET; + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java new file mode 100644 index 0000000000..21da885a3c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * FONT. + */ +final class HedFONT extends HedInlineContainer { + + /** + */ + public HedFONT(ElementCollection collection) { + super(HTML40Namespace.ElementName.FONT, collection); + // CORRECT_EMPTY - GROUP_COMPACT + correctionType = CORRECT_EMPTY; + } + + /** + * %coreattrs; + * %i18n; + * (size CDATA #IMPLIED) ... should be defined locally. + * (color %Color; #IMPLIED) + * (face CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + // %i18n; + attributeCollection.getI18n(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_COLOR, HTML40Namespace.ATTR_NAME_FACE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (size CDATA #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java new file mode 100644 index 0000000000..561610ed23 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * FORM. + */ +final class HedFORM extends HedFlowContainer { + + /** + */ + public HedFORM(ElementCollection collection) { + super(HTML40Namespace.ElementName.FORM, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * (action %URI; #REQUIRED) + * (method (GET|POST) GET) + * (enctype %ContentType; "application/x-www-form-urlencoded") + * (accept %ContentTypes; #IMPLIED) + * (name CDATA #IMPLIED) + * (onsubmit %Script; #IMPLIED) + * (onreset %Script; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + * (accept-charset %Charsets; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_ACTION, HTML40Namespace.ATTR_NAME_METHOD, HTML40Namespace.ATTR_NAME_ENCTYPE, HTML40Namespace.ATTR_NAME_ACCEPT, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_ONSUBMIT, HTML40Namespace.ATTR_NAME_ONRESET, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_ACCEPT_CHARSET}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Exclusion. + * <code>FORM</code> has the exclusion. + * It is <code>FORM</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; // fatal + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + CMNode form = elementCollection.getNamedItem(HTML40Namespace.ElementName.FORM); + if (form != null) + exclusion.appendChild(form); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.FORM, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java new file mode 100644 index 0000000000..6c91365f10 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * FRAME. + */ +final class HedFRAME extends HedEmpty { + + /** + */ + public HedFRAME(ElementCollection collection) { + super(HTML40Namespace.ElementName.FRAME, collection); + // LAYOUT_HIDDEN. + // Because, FRAME is GROUP_HIDDEN in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_HIDDEN; + } + + /** + * FRAME. + * %coreattrs; + * (longdesc %URI; #IMPLIED) + * (name CDATA #IMPLIED) + * (src %URI; #IMPLIED) + * (frameborder (1|0) 1) + * (marginwidth %Pixels; #IMPLIED) + * (marginheight %Pixels; #IMPLIED) + * (noresize (noresize) #IMPLIED) + * (scrolling (yes|no|auto) auto) + * (bordercolor %Color #IMPLIED) ... D205514 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_FRAMEBORDER, HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_NORESIZE, HTML40Namespace.ATTR_NAME_SCROLLING, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D20554 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java new file mode 100644 index 0000000000..a3be42bb97 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * FRAMESET. + */ +final class HedFRAMESET extends HTMLElemDeclImpl { + + /** + */ + public HedFRAMESET(ElementCollection collection) { + super(HTML40Namespace.ElementName.FRAMESET, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FRAMESET; + layoutType = LAYOUT_HIDDEN; + indentChild = true; + } + + /** + * %coreattrs; + * (rows %MultiLengths; #IMPLIED) ... should be defined locally. + * (cols %MultiLengths; #IMPLIED) ... should be defined locally. + * (onload %Script; #IMPLIED) + * (onunload %Script; #IMPLIED) + * (frameborder (yes|no) #IMPLIED) ... should be defined locally. + * (border %Pixels; #IMPLIED) + * (bordercolor %Color #IMPLIED) ... D205514 + * (framespacing CDATA #IMPLIED) ... D215684 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getCore(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_ONLOAD, HTML40Namespace.ATTR_NAME_ONUNLOAD, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_BORDERCOLOR, // D205514 + HTML40Namespace.ATTR_NAME_FRAMESPACING // D215684 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + // (rows %MultiLengths; #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MULTI_LENGTH); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ROWS, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ROWS, attr); + + // (cols %MultiLengths; #IMPLIED) ... should be defined locally. + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_COLS, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_COLS, attr); + + // (frameborder (yes|no) #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {HTML40Namespace.ATTR_VALUE_YES, HTML40Namespace.ATTR_VALUE_NO}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_FRAMEBORDER, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_FRAMEBORDER, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java new file mode 100644 index 0000000000..96d47e2055 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * Base class for (%flow;)* containers. + */ +abstract class HedFlowContainer extends HTMLElemDeclImpl { + + /** + */ + public HedFlowContainer(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java new file mode 100644 index 0000000000..c02371e9fc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * %fontstyle; + */ +final class HedFontStyle extends HedInlineContainer { + + /** + */ + public HedFontStyle(String elementName, ElementCollection collection) { + super(elementName, collection); + if (elementName.equalsIgnoreCase(HTML40Namespace.ElementName.BIG) || elementName.equalsIgnoreCase(HTML40Namespace.ElementName.SMALL)) { + correctionType = CORRECT_EMPTY; + } + else { // B, I, U, ... + correctionType = CORRECT_DUPLICATED; + } + } + + /** + * %attrs; + * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + String myName = getElementName(); + if (!myName.equalsIgnoreCase(HTML40Namespace.ElementName.BIG) && !myName.equalsIgnoreCase(HTML40Namespace.ElementName.SMALL)) + return EMPTY_MAP; + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.PRE}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java new file mode 100644 index 0000000000..c9323dad86 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * HTML. + */ +final class HedHEAD extends HTMLElemDeclImpl { + + private static String[] terminators = {HTML40Namespace.ElementName.HEAD, HTML40Namespace.ElementName.BODY, HTML40Namespace.ElementName.FRAMESET, HTML40Namespace.ElementName.HTML}; + + /** + */ + public HedHEAD(ElementCollection collection) { + super(HTML40Namespace.ElementName.HEAD, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HEAD; + layoutType = LAYOUT_HIDDEN; + omitType = OMIT_BOTH; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>HEAD</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td>%i18n;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * <tr> + * <td>profile</td><td>URI</td><td>#IMPLIED</td><td>N/A</td><td>-</td> + * </tr> + * </tbody> + * </table> + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + // profile + HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_PROFILE); + if (adec != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_PROFILE, adec); + } + + /** + * HEAD has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java new file mode 100644 index 0000000000..d7a5f6dd99 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * HR. + */ +final class HedHR extends HedEmpty { + + /** + */ + public HedHR(ElementCollection collection) { + super(HTML40Namespace.ElementName.HR, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs + * (align (left|center|right) #IMPLIED) ... should be defined locally. + * (noshade (noshade) #IMPLIED) + * (size %Pixels; #IMPLIED) + * (width %Length; #IMPLIED) + * (color %Color; #IMPLIED) ... D205514 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (align (left|center|right) #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {HTML40Namespace.ATTR_VALUE_LEFT, HTML40Namespace.ATTR_VALUE_CENTER, HTML40Namespace.ATTR_VALUE_RIGHT}; + atype.setEnumValues(values); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + + // the rest. + String[] names = {HTML40Namespace.ATTR_NAME_NOSHADE, HTML40Namespace.ATTR_NAME_SIZE, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_COLOR // D205514 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java new file mode 100644 index 0000000000..d4934c3296 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * HTML. + */ +final class HedHTML extends HTMLElemDeclImpl { + + private static String[] terminators = {HTML40Namespace.ElementName.HTML}; + + /** + */ + public HedHTML(ElementCollection collection) { + super(HTML40Namespace.ElementName.HTML, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HTML; + layoutType = LAYOUT_HIDDEN; + omitType = OMIT_BOTH; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>HTML</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td><code>%i18n;</code></td><td>-</td><td>-</td><td>-</td> + * <td>{@link PDCMDocImpl#getAttrDeclarationsI18n}</td> + * </tr> + * <tr> + * <td>version</td><td>CDATA</td><td>#FIXED</td> + * <td>{@link HTML_VERSION_TRANSITIONAL}</td><td>deplecated in HTML4.01</td> + * </tr> + * </tbody> + * </table><br> + * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + // version + HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_VERSION); + if (adec != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VERSION, adec); + } + + /** + * HTML has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java new file mode 100644 index 0000000000..d6b644e34e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java @@ -0,0 +1,86 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * H[1-6]. + */ +final class HedHeading extends HedInlineContainer { + + /** + */ + public HedHeading(String elementName, ElementCollection collection) { + super(elementName, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>H1</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * <tr> + * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * </tbody> + * </table> + * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>. + * Unfortunately, this <code>align</code> is different from one in + * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration + * of <code>align</code> should be localy created and it shouldn't be registered + * in a <code>HCMDocImpl</code> instance.</p> + * <p>However, %align is used in sevaral times. I wouldn't write same code + * in many times. So, I add a new utility method into <code>CMUtil</code> + * to create the attribute declaration.</p> + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // align + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java new file mode 100644 index 0000000000..cc9290c474 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * IFRAME. + */ +final class HedIFRAME extends HedFlowContainer { + + /** + */ + public HedIFRAME(ElementCollection collection) { + super(HTML40Namespace.ElementName.IFRAME, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * %coreattrs; + * (longdesc %URI; #IMPLIED) + * (name CDATA #IMPLIED) + * (src %URI; #IMPLIED) + * (frameborder (1|0) 1) + * (marginwidth %Pixels; #IMPLIED) + * (marginheight %Pixels; #IMPLIED) + * (scrolling (yes|no|auto) auto) + * (align %IAlign; #IMPLIED) ... should be defined locally. + * (height %Length; #IMPLIED) + * (width %Length; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_FRAMEBORDER, HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_SCROLLING, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // align + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java new file mode 100644 index 0000000000..c73fcc9079 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * IMG. + */ +final class HedIMG extends HedEmpty { + + /** + */ + public HedIMG(ElementCollection collection) { + super(HTML40Namespace.ElementName.IMG, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * IMG. + * %attrs; + * (src %URI; #REQUIRED): should be defined locally. + * (alt %Text; #REQUIRED) + * (longdesc %URI; #IMPLIED) + * (name CDATA #IMPLIED) + * (height %Length; #IMPLIED) + * (width %Length; #IMPLIED) + * (usemap %URI; #IMPLIED) + * (ismap (ismap) #IMPLIED) + * (align %IAlign; #IMPLIED): should be defined locally. + * (border %Pixels; #IMPLIED) + * (hspace %Pixels; #IMPLIED) + * (vspace %Pixels; #IMPLIED) + * (mapfile %URI; #IMPLIED) + * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (src %URI; #REQUIRED): should be defined locally. + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr); + + String[] names = {HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_ISMAP, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_MAPFILE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // align (local); should be defined locally. + attr = AttributeCollection.createAlignForImage(); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.PRE}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java new file mode 100644 index 0000000000..deca6e6328 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * INPUT. + */ +final class HedINPUT extends HedEmpty { + + /** + */ + public HedINPUT(ElementCollection collection) { + super(HTML40Namespace.ElementName.INPUT, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * INPUT. + * %attrs; + * (type %InputType; TEXT) ... should be defined locally. + * (name CDATA #IMPLIED) + * (value CDATA #IMPLIED) + * (checked (checked) #IMPLIED) + * (disabled (disabled) #IMPLIED) + * (readonly (readonly) #IMPLIED) + * (size CDATA #IMPLIED) ... should be defined locally. + * (maxlength NUMBER #IMPLIED) + * (src %URI; #IMPLIED) + * (alt CDATA #IMPLIED) ... should be defined locally. + * (usemap %URI; #IMPLIED) + * (ismap (ismap) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + * (onselect %Script; #IMPLIED) + * (onchange %Script; #IMPLIED) + * (accept %ContentTypes; #IMPLIED) + * (align %IAlign; #IMPLIED) ... should be defined locally. + * (istyle CDATA #IMPLIED) + * <<D215684 + * (width CDATA; #IMPLIED) + * (height CDATA; #IMPLIED) + * (border CDATA; #IMPLIED) + * D215684 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + // (type %InputType; TEXT) ... should be defined locally. + // NOTE: %InputType is ENUM; + // (text | password | checkbox | radio | submit | reset | + // file | hidden | image | button) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {HTML40Namespace.ATTR_VALUE_TEXT, HTML40Namespace.ATTR_VALUE_PASSWORD, HTML40Namespace.ATTR_VALUE_CHECKBOX, HTML40Namespace.ATTR_VALUE_RADIO, HTML40Namespace.ATTR_VALUE_SUBMIT, HTML40Namespace.ATTR_VALUE_RESET, HTML40Namespace.ATTR_VALUE_FILE, HTML40Namespace.ATTR_VALUE_HIDDEN, HTML40Namespace.ATTR_VALUE_IMAGE, HTML40Namespace.ATTR_VALUE_BUTTON}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_TEXT); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + + // (size CDATA #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr); + + // (alt CDATA #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALT, attr); + + // (align %IAlign; #IMPLIED) ... should be defined locally. + attr = AttributeCollection.createAlignForImage(); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + + // the rest. + String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_CHECKED, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_READONLY, HTML40Namespace.ATTR_NAME_SIZE, HTML40Namespace.ATTR_NAME_MAXLENGTH, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_ISMAP, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONSELECT, HTML40Namespace.ATTR_NAME_ONCHANGE, HTML40Namespace.ATTR_NAME_ACCEPT, HTML40Namespace.ATTR_NAME_ALIGN, HTML40Namespace.ATTR_NAME_ISTYLE, + //<<D215684 + HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BORDER + //<D215684 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java new file mode 100644 index 0000000000..2a7df91a79 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * ISINDEX. + */ +final class HedISINDEX extends HedEmpty { + + /** + */ + public HedISINDEX(ElementCollection collection) { + super(HTML40Namespace.ElementName.ISINDEX, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * ISINDEX. + * %coreattrs; + * %i18n; + * (prompt %Text; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + // %i18n; + attributeCollection.getI18n(attributes); + + HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_PROMPT); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_PROMPT, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java new file mode 100644 index 0000000000..08812aa8ad --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * Base class for (%inline;)* containers. + */ +abstract class HedInlineContainer extends HTMLElemDeclImpl { + + /** + * HedInlineContainer. + * @param elementName java.lang.String + * @param collection ElementCollection + */ + public HedInlineContainer(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java new file mode 100644 index 0000000000..f172b46591 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * LABEL. + */ +final class HedLABEL extends HedInlineContainer { + + /** + */ + public HedLABEL(ElementCollection collection) { + super(HTML40Namespace.ElementName.LABEL, collection); + } + + /** + * %attrs; + * (for IDREF #IMPLIED) ... should be defined locally. + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (for IDREF #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.IDREF); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_FOR, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_FOR, attr); + + String[] names = {HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Exclusion. + * <code>LABEL</code> has the exclusion. + * It is <code>LABEL</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + CMNode label = elementCollection.getNamedItem(HTML40Namespace.ElementName.LABEL); + if (label != null) + exclusion.appendChild(label); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.LABEL}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java new file mode 100644 index 0000000000..888c5656b4 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * LEGEND. + */ +final class HedLEGEND extends HedInlineContainer { + + /** + */ + public HedLEGEND(ElementCollection collection) { + super(HTML40Namespace.ElementName.LEGEND, collection); + } + + /** + * (accesskey %Character; #IMPLIED) + * (align %LAlign; #IMPLIED) ... shuld be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_ACCESSKEY}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // align + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForLegend(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java new file mode 100644 index 0000000000..5dacdfb167 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * LI. + */ +final class HedLI extends HedFlowContainer { + + private static String[] terminators = {HTML40Namespace.ElementName.LI}; + + /** + */ + public HedLI(ElementCollection collection) { + super(HTML40Namespace.ElementName.LI, collection); + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END_DEFAULT; + } + + /** + * %attrs; + * (type %LIStyle; #IMPLIED) ... should be defined locally. + * (value NUMBER #IMPLIED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (type %LIStyle; #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LI_STYLE); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + + // (value NUMBER #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VALUE, attr); + } + + /** + * LI has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java new file mode 100644 index 0000000000..b7779c3b4d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; + +/** + * LINK. + */ +final class HedLINK extends HedEmpty { + + /** + */ + public HedLINK(ElementCollection collection) { + super(HTML40Namespace.ElementName.LINK, collection); + layoutType = LAYOUT_HIDDEN; + } + + /** + * LINK. + * %attrs; + * (charset %Charset; #IMPLIED) + * (href %URI; #IMPLIED) + * (hreflang %LanguageCode; #IMPLIED) + * (type %ContentType; #IMPLIED): should be defined locally. + * (rel %LinkTypes; #IMPLIED) + * (rev %LinkTypes; #IMPLIED) + * (media %MediaDesc; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_HREFLANG, HTML40Namespace.ATTR_NAME_REL, HTML40Namespace.ATTR_NAME_REV, HTML40Namespace.ATTR_NAME_MEDIA, HTML40Namespace.ATTR_NAME_TARGET}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (type %ContentType; #IMPLIED) + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java new file mode 100644 index 0000000000..ca497170be --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * Base class for list item container declarations. + * - OL, UL, MENU, DIR. + */ +abstract class HedListItemContainer extends HTMLElemDeclImpl { + + /** + */ + public HedListItemContainer(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + indentChild = true; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java new file mode 100644 index 0000000000..13ce8b61ec --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + + + +/** + * MAP. + */ +final class HedMAP extends HTMLElemDeclImpl { + + /** + */ + public HedMAP(ElementCollection collection) { + super(HTML40Namespace.ElementName.MAP, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_MAP; + layoutType = LAYOUT_OBJECT; + indentChild = true; + } + + /** + * %attrs; + * (name CDATA #REQUIRED) ... should be defined locally + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (name CDATA #REQUIRED) ... should be defined locally + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java new file mode 100644 index 0000000000..4dd399f612 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * MARQUEE. + */ +final class HedMARQUEE extends HedFlowContainer { + + /** + */ + public HedMARQUEE(ElementCollection collection) { + super(HTML40Namespace.ElementName.MARQUEE, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * %attrs; + * (behavior (scroll|slide|alternate) scroll) + * (bgcolor %Color; #IMPLIED) + * (direction (left|right|up|down) left) + * (height CDATA #IMPLIED) ... should be defined locally. + * (hspace NUMBER #IMPLIED) ... should be defined locally. + * (loop CDATA #IMPLIED) + * (scrollamount NUMBER #IMPLIED) + * (scrolldelay NUMBER #IMPLIED) + * (vspace NUMBER #IMPLIED) ... should be defined locally. + * (width CDATA #IMPLIED) ... should be defined locally. + * (truespeed (truespeed) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_BEHAVIOR, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_DIRECTION, HTML40Namespace.ATTR_NAME_LOOP, HTML40Namespace.ATTR_NAME_SCROLLAMOUNT, HTML40Namespace.ATTR_NAME_SCROLLDELAY, HTML40Namespace.ATTR_NAME_TRUESPEED}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + // (height CDATA #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_HEIGHT, attr); + + // (width CDATA #IMPLIED) ... should be defined locally. + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr); + + // (hspace NUMBER #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_HSPACE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_HSPACE, attr); + + // (vspace NUMBER #IMPLIED) ... should be defined locally. + attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_VSPACE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VSPACE, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java new file mode 100644 index 0000000000..d6bb4642d5 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * MENU/DIR. + */ +final class HedMENU extends HedListItemContainer { + + /** + */ + public HedMENU(String elementName, ElementCollection collection) { + super(elementName, collection); + } + + /** + * MENU/DIR. + * (compact (compact) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_COMPACT}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Exclusion. + * <code>MENU/DIR</code> has the exclusion. + * It is <code>%block;</code>. + * %block; is: + * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER | + * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR | + * TABLE | FIELDSET | ADDRESS. + * %heading; is: H1 | H2 | H3 | H4 | H5 | H6. + * %list; is : UL | OL | DIR | MENU. + * %preformatted; is PRE. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + // %block; + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + String[] names = {HTML40Namespace.ElementName.P, HTML40Namespace.ElementName.H1, HTML40Namespace.ElementName.H2, HTML40Namespace.ElementName.H3, HTML40Namespace.ElementName.H4, HTML40Namespace.ElementName.H5, HTML40Namespace.ElementName.H6, HTML40Namespace.ElementName.UL, HTML40Namespace.ElementName.OL, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU, HTML40Namespace.ElementName.PRE, HTML40Namespace.ElementName.DL, HTML40Namespace.ElementName.DIV, HTML40Namespace.ElementName.CENTER, HTML40Namespace.ElementName.NOSCRIPT, HTML40Namespace.ElementName.NOFRAMES, HTML40Namespace.ElementName.BLOCKQUOTE, HTML40Namespace.ElementName.FORM, HTML40Namespace.ElementName.ISINDEX, HTML40Namespace.ElementName.HR, HTML40Namespace.ElementName.TABLE, HTML40Namespace.ElementName.FIELDSET, HTML40Namespace.ElementName.ADDRESS}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java new file mode 100644 index 0000000000..e9cbdea413 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; + +/** + * META. + */ +final class HedMETA extends HedEmpty { + + /** + */ + public HedMETA(ElementCollection collection) { + super(HTML40Namespace.ElementName.META, collection); + layoutType = LAYOUT_HIDDEN; + } + + /** + * META. + * %i18n; + * (http-equiv NAME #IMPLIED) + * (name NAME #IMPLIED) ... should be defined locally. + * (content CDATA #REQUIRED) + * (scheme CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + + // (name NAME #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr); + + String[] names = {HTML40Namespace.ATTR_NAME_HTTP_EQUIV, HTML40Namespace.ATTR_NAME_CONTENT, HTML40Namespace.ATTR_NAME_SCHEME}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java new file mode 100644 index 0000000000..0e97abd4fc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * (INS|DEL) + */ +final class HedMarkChanges extends HedFlowContainer { + + /** + */ + public HedMarkChanges(String elementName, ElementCollection collection) { + super(elementName, collection); + } + + /** + * %attrs; + * (cite %URI; #IMPLIED) + * (datetime %Datetime; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_CITE, HTML40Namespace.ATTR_NAME_DATETIME}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java new file mode 100644 index 0000000000..e1041258f8 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * NOBR -- not standard tag but it is commonly used. + */ +final class HedNOBR extends HedInlineContainer { + + + public HedNOBR(ElementCollection collection) { + super(HTML40Namespace.ElementName.NOBR, collection); + correctionType = HTMLElementDeclaration.CORRECT_DUPLICATED; + } + + protected void createAttributeDeclarations() { + // No attributes is defined. + if (attributes != null) + return; + attributes = new CMNamedNodeMapImpl(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java new file mode 100644 index 0000000000..6be05205de --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; + + + +/** + * NOEMBED. + */ +final class HedNOEMBED extends HedFlowContainer { + + /** + */ + public HedNOEMBED(ElementCollection collection) { + super(HTML40Namespace.ElementName.NOEMBED, collection); + } + + /** + * %coreattrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java new file mode 100644 index 0000000000..83940650a9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * NOFRAMES. + */ +final class HedNOFRAMES extends HTMLElemDeclImpl { + + /** + */ + public HedNOFRAMES(ElementCollection collection) { + super(HTML40Namespace.ElementName.NOFRAMES, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_NOFRAMES_CONTENT; + layoutType = LAYOUT_HIDDEN; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + * Exclusion. + * <code>NOFRAMES</code> has the exclusion. + * It is <code>NOFRAMES</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + CMNode label = elementCollection.getNamedItem(HTML40Namespace.ElementName.NOFRAMES); + if (label != null) + exclusion.appendChild(label); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU, HTML40Namespace.ElementName.NOFRAMES}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java new file mode 100644 index 0000000000..2f29dd8bf9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * NOSCRIPT. + */ +final class HedNOSCRIPT extends HedFlowContainer { + + /** + */ + public HedNOSCRIPT(ElementCollection collection) { + super(HTML40Namespace.ElementName.NOSCRIPT, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java new file mode 100644 index 0000000000..8d9f98ddae --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java @@ -0,0 +1,86 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * OBJECT. + */ +final class HedOBJECT extends HTMLElemDeclImpl { + + /** + */ + public HedOBJECT(ElementCollection collection) { + super(HTML40Namespace.ElementName.OBJECT, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PARAM_CONTAINER; + layoutType = LAYOUT_OBJECT; + indentChild = true; + } + + /** + * %attrs; + * %reserved; ... empty. + * (declare (declare) #IMPLIED) + * (classid %URI; #IMPLIED) + * (codebase %URI; #IMPLIED) + * (data %URI; #IMPLIED) + * (type %ContentType; #IMPLIED) + * (codetype %ContentType; #IMPLIED) + * (archive CDATA #IMPLIED) + * (standby %Text; #IMPLIED) + * (height %Length; #IMPLIED) + * (width %Length; #IMPLIED) + * (usemap %URI; #IMPLIED) + * (name CDATA #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (align %IAlign; #IMPLIED) ... should be defined locally. + * (border %Pixels; #IMPLIED) + * (hspace %Pixels; #IMPLIED) + * (vspace %Pixels; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %reserved; ... empty. + + String[] names = {HTML40Namespace.ATTR_NAME_DECLARE, HTML40Namespace.ATTR_NAME_CLASSID, HTML40Namespace.ATTR_NAME_CODEBASE, HTML40Namespace.ATTR_NAME_DATA, HTML40Namespace.ATTR_NAME_TYPE, HTML40Namespace.ATTR_NAME_CODETYPE, HTML40Namespace.ATTR_NAME_ARCHIVE, HTML40Namespace.ATTR_NAME_STANDBY, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + // %align; ... should be defined locally. + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage(); + if (attr != null) + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.PRE}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java new file mode 100644 index 0000000000..6c0fbf21c1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * OL. + */ +final class HedOL extends HedListItemContainer { + + /** + */ + public HedOL(ElementCollection collection) { + super(HTML40Namespace.ElementName.OL, collection); + } + + /** + * OL. + * (type %OLStyle; #IMPLIED) ... should be defined locally. + * (compact (compact) #IMPLIED) + * (start NUMBER #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (type %OLStyle; #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.OL_STYLE); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + + // the rest. + String[] names = {HTML40Namespace.ATTR_NAME_COMPACT, HTML40Namespace.ATTR_NAME_START}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java new file mode 100644 index 0000000000..be680cb9f6 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; + +/** + * OPTGROUP. + */ +final class HedOPTGROUP extends HTMLElemDeclImpl { + + /** + */ + public HedOPTGROUP(ElementCollection collection) { + super(HTML40Namespace.ElementName.OPTGROUP, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_OPTION_CONTAINER; + layoutType = LAYOUT_HIDDEN; + indentChild = true; + } + + /** + * %attrs; + * (disabled (disabled) #IMPLIED) + * (label %Text; #REQUIRED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // (disabled (disabled) #IMPLIED) + String[] names = {HTML40Namespace.ATTR_NAME_DISABLED}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (label %Text; #REQUIRED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_LABEL, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_LABEL, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java new file mode 100644 index 0000000000..2de188e0e3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * OPTION. + */ +final class HedOPTION extends HedPcdata { + + private static String[] terminators = {HTML40Namespace.ElementName.OPTION}; + + /** + */ + public HedOPTION(ElementCollection collection) { + super(HTML40Namespace.ElementName.OPTION, collection); + layoutType = LAYOUT_HIDDEN; + omitType = OMIT_END; + } + + /** + * OPTION. + * %attrs; + * (selected (selected) #IMPLIED) + * (disabled (disabled) #IMPLIED) + * (label %Text; #IMPLIED) + * (value CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_SELECTED, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_LABEL, HTML40Namespace.ATTR_NAME_VALUE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * OPTION has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java new file mode 100644 index 0000000000..9bf079f06d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Collection; +import java.util.Iterator; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * P. + */ +final class HedP extends HedInlineContainer { + + private static Collection terminators = null; + + /** + */ + public HedP(ElementCollection collection) { + super(HTML40Namespace.ElementName.P, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>P</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * <tr> + * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * </tbody> + * </table> + * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>. + * Unfortunately, this <code>align</code> is different from one in + * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration + * of <code>align</code> should be localy created and it shouldn't be registered + * in a <code>HCMDocImpl</code> instance.</p> + * <p>However, %align is used in sevaral times. I wouldn't write same code + * in many times. So, I add a new utility method into <code>CMUtil</code> + * to create the attribute declaration.</p> + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + // %attrs; + attributeCollection.getAttrs(attributes); + // align + HTMLAttrDeclImpl adec = AttributeCollection.createAlignForParagraph(); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, adec); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + return prohibitedAncestors; + } + + /** + * Return names of terminators. + * <code>P</code> has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + if (terminators != null) + return terminators.iterator(); + //<<D217982 + terminators = new Vector(); + terminators.addAll(elementCollection.getNamesOfBlock()); + terminators.add(HTML40Namespace.ElementName.LI); + terminators.add(HTML40Namespace.ElementName.DT); + terminators.add(HTML40Namespace.ElementName.DD); + //D217982 + return terminators.iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java new file mode 100644 index 0000000000..ba9879cee3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * PARAM. + */ +final class HedPARAM extends HedEmpty { + + /** + */ + public HedPARAM(ElementCollection collection) { + super(HTML40Namespace.ElementName.PARAM, collection); + layoutType = LAYOUT_HIDDEN; + } + + /** + * PARAM. + * (id ID #IMPLIED) + * (name CDATA #REQUIRED) ... should be defined locally. + * (value CDATA #IMPLIED) + * (valuetype (DATA|REF|OBJECT) DATA) + * (type %ContentType; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_ID, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_VALUETYPE, HTML40Namespace.ATTR_NAME_TYPE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (name CDATA #REQUIRED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java new file mode 100644 index 0000000000..6df4ec2eed --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * PRE. + */ +final class HedPRE extends HedInlineContainer { + + /** + * PRE element should keep spaces in its source. + */ + public HedPRE(ElementCollection collection) { + super(HTML40Namespace.ElementName.PRE, collection); + // CORRECT_EMPTY - GROUP_COMPACT + correctionType = CORRECT_EMPTY; + + keepSpaces = true; + } + + /** + * %attrs; + * (width NUMBER #IMPLIED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // (width NUMBER #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr); + } + + /** + * Exclusion. + * <code>PRE</code> has the exclusion. + * It is <code>%pre.exclusion;</code>. + * %pre.exclusion is: + * IMG | OBJECT | APPLET | BIG | SMALL | SUB | SUP | FONT | BASEFONT + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + String[] names = {HTML40Namespace.ElementName.IMG, HTML40Namespace.ElementName.OBJECT, HTML40Namespace.ElementName.APPLET, HTML40Namespace.ElementName.BIG, HTML40Namespace.ElementName.SMALL, HTML40Namespace.ElementName.SUB, HTML40Namespace.ElementName.SUP, HTML40Namespace.ElementName.FONT, HTML40Namespace.ElementName.BASEFONT}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java new file mode 100644 index 0000000000..7e14c31104 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * Base class for PCDATA type element declarations.<br> + */ +abstract class HedPcdata extends HTMLElemDeclImpl { + + /** + */ + public HedPcdata(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PCDATA; + } + + /** + * Content.<br> + * PCDATA type always returns <code>null</code>. + * <br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getContent() { + return null; + } + + /** + * Content type.<br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public int getContentType() { + return CMElementDeclaration.PCDATA; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java new file mode 100644 index 0000000000..7471184794 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * %phrase; + */ +final class HedPhrase extends HedInlineContainer { + + /** + */ + public HedPhrase(String elementName, ElementCollection collection) { + super(elementName, collection); + correctionType = HTMLElementDeclaration.CORRECT_DUPLICATED; + } + + /** + * %attrs; + * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java new file mode 100644 index 0000000000..b8a0de29df --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * Q. + */ +final class HedQ extends HedInlineContainer { + + /** + */ + public HedQ(ElementCollection collection) { + super(HTML40Namespace.ElementName.Q, collection); + correctionType = CORRECT_DUPLICATED; + } + + /** + * %attrs; + * (cite %URI; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_CITE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java new file mode 100644 index 0000000000..b66b0f32f1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * SCRIPT. + */ +final class HedSCRIPT extends HTMLElemDeclImpl { + + /** + */ + public HedSCRIPT(ElementCollection collection) { + super(HTML40Namespace.ElementName.SCRIPT, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_CDATA; + layoutType = LAYOUT_OBJECT; + } + + /** + * SCRIPT. + * (charset %Charset; #IMPLIED) + * (type %ContentType; #REQUIRED) ... should be defined locally. + * (language CDATA #IMPLIED) + * (src %URI; #IMPLIED) + * (defer (defer) #IMPLIED) + * (event CDATA #IMPLIED) + * (for %URI; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_LANGUAGE, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_DEFER, HTML40Namespace.ATTR_NAME_EVENT, HTML40Namespace.ATTR_NAME_FOR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // (type %ContentType; #REQUIRED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/javascript"); //$NON-NLS-1$ + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + } + + /** + * <code>SCRIPT</code> is CDATA type. + * So, the method always returns <code>null</code>. + * <br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getContent() { + return null; + } + + /** + * CDATA content.<br> + * @return int + */ + public int getContentType() { + return CMElementDeclaration.CDATA; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java new file mode 100644 index 0000000000..e3155f6dd2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * SELECT. + */ +final class HedSELECT extends HTMLElemDeclImpl { + + /** + */ + public HedSELECT(ElementCollection collection) { + super(HTML40Namespace.ElementName.SELECT, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_SELECT; + layoutType = LAYOUT_OBJECT; + indentChild = true; + } + + /** + * %attrs; + * %reserved; + * (name CDATA #IMPLIED) + * (size NUMBER #IMPLIED) ... should be defined locally. + * (multiple (multiple) #IMPLIED) + * (disabled (disabled) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + * (onchange %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (size NUMBER #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr); + + String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_MULTIPLE, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONCHANGE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java new file mode 100644 index 0000000000..1ab6079d95 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; + + + +/** + * SPAN. + */ +final class HedSPAN extends HedInlineContainer { + + /** + * SPAN. + */ + public HedSPAN(ElementCollection collection) { + super(HTML40Namespace.ElementName.SPAN, collection); + } + + /** + * %attrs; + * %reserved; ... empty. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java new file mode 100644 index 0000000000..71330951bc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTMLCMProperties; + + + +/** + * Base class for SSI declarations. + */ +abstract class HedSSIBase extends HedEmpty { + + /** + */ + public HedSSIBase(String elementName, ElementCollection collection) { + super(elementName, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + */ + public int getFormatType() { + return HTMLElementDeclaration.FORMAT_SSI; + } + + /** + */ + public boolean supports(String propName) { + if (propName.equals(HTMLCMProperties.IS_SSI)) + return true; + return super.supports(propName); + } + + /* + */ + public Object getProperty(String propName) { + if (propName.equals(HTMLCMProperties.IS_SSI)) + return new Boolean(true); + return super.getProperty(propName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java new file mode 100644 index 0000000000..f8117bff96 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:CONFIG. + */ +final class HedSSIConfig extends HedSSIBase { + + /** + */ + public HedSSIConfig(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_CONFIG, collection); + } + + /** + * SSI:CONFIG. + * (errmsg CDATA #IMPLIED) + * (sizefmt CDATA #IMPLIED) + * (timefmt CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_ERRMSG, HTML40Namespace.ATTR_NAME_SIZEFMT, HTML40Namespace.ATTR_NAME_TIMEFMT}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java new file mode 100644 index 0000000000..4a18ea576b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:ECHO. + */ +final class HedSSIEcho extends HedSSIBase { + + /** + */ + public HedSSIEcho(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_ECHO, collection); + } + + /** + * SSI:ECHO + * (var CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_VAR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java new file mode 100644 index 0000000000..7d2e0cd68d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:EXEC. + */ +final class HedSSIExec extends HedSSIBase { + + /** + */ + public HedSSIExec(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_EXEC, collection); + } + + /** + * SSI:EXEC + * (cgi %URI; #IMPLIED) + * (cmd CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_CGI, HTML40Namespace.ATTR_NAME_CMD}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java new file mode 100644 index 0000000000..7c4b124d81 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:FLASTMOD. + */ +final class HedSSIFlastmod extends HedSSIBase { + + /** + */ + public HedSSIFlastmod(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_FLASTMOD, collection); + } + + /** + * SSI:FLASTMOD + * (file %URI; #IMPLIED) + * (virtual %URI #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_FILE, HTML40Namespace.ATTR_NAME_VIRTUAL}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java new file mode 100644 index 0000000000..a60a47e77f --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:FSIZE. + */ +final class HedSSIFsize extends HedSSIBase { + + /** + */ + public HedSSIFsize(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_FSIZE, collection); + } + + /** + * SSI:FSIZE + * (file %URI; #IMPLIED) + * (virtual %URI #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_FILE, HTML40Namespace.ATTR_NAME_VIRTUAL}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java new file mode 100644 index 0000000000..2b73be4327 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:INCLUDE. + */ +final class HedSSIInclude extends HedSSIBase { + + /** + */ + public HedSSIInclude(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_INCLUDE, collection); + } + + /** + * SSI:INCLUDE + * (file %URI; #IMPLIED) + * (virtual %URI #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_FILE, HTML40Namespace.ATTR_NAME_VIRTUAL}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java new file mode 100644 index 0000000000..351942a286 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * SSI:PRINTENV. + */ +final class HedSSIPrintenv extends HedSSIBase { + + /** + */ + public HedSSIPrintenv(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_PRINTENV, collection); + } + + /** + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + } + + /** + * SSI:PRINTENV has no attributes. So, this method should + * always return <code>null</code>. + * Note: Since somebody doesn't expect null is returned, return the empty attribute + * like a custom tag which doesn't have attributes + */ + public CMNamedNodeMap getAttributes() { + return super.getAttributes(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java new file mode 100644 index 0000000000..50faca1513 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * SSI:SET. + */ +final class HedSSISet extends HedSSIBase { + + /** + */ + public HedSSISet(ElementCollection collection) { + super(HTML40Namespace.ElementName.SSI_SET, collection); + } + + /** + * SSI:SET + * (var CDATA #IMPLIED) + * (value CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {HTML40Namespace.ATTR_NAME_VAR, HTML40Namespace.ATTR_NAME_VALUE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java new file mode 100644 index 0000000000..ad9c3a67d1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * STYLE. + */ +final class HedSTYLE extends HTMLElemDeclImpl { + + /** + */ + public HedSTYLE(ElementCollection collection) { + super(HTML40Namespace.ElementName.STYLE, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_CDATA; + layoutType = LAYOUT_HIDDEN; + } + + /** + * STYLE + * %i18n; + * (type %ContentType; #REQUIRED) ... should be defined locally. + * (media %MediaDesc; #IMPLIED) + * (title %Text; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_MEDIA, HTML40Namespace.ATTR_NAME_TITLE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + // (type %ContentType; #REQUIRED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + } + + /** + * Content.<br> + * <code>STYLE</code> is CDATA content type. So, it always returns <code>null</code>. + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getContent() { + return null; + } + + /** + * CDATA content.<br> + * @return int + */ + public int getContentType() { + return CMElementDeclaration.CDATA; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java new file mode 100644 index 0000000000..d921ada949 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * SUB and SUP. + */ +final class HedScripts extends HedInlineContainer { + + /** + */ + public HedScripts(String elementName, ElementCollection collection) { + super(elementName, collection); + correctionType = CORRECT_EMPTY; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.PRE}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java new file mode 100644 index 0000000000..e0e0139762 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * TABLE. + */ +final class HedTABLE extends HTMLElemDeclImpl { + + /** + */ + public HedTABLE(ElementCollection collection) { + super(HTML40Namespace.ElementName.TABLE, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_TABLE; + layoutType = LAYOUT_BLOCK; + indentChild = true; + } + + /** + * TABLE. + * %attrs; + * %reserved; + * (summary %Text; #IMPLIED) + * (width %Length; #IMPLIED) + * (border %Pixels; #IMPLIED) + * (frame %TFrame; #IMPLIED) + * (rules %TRules; #IMPLIED) + * (cellspacing %Length; #IMPLIED) + * (cellpadding %Length; #IMPLIED) + * (align %TAlign; #IMPLIED) + * (bgcolor %Color; #IMPLIED) + * (datapagesize CDATA #IMPLIED) + * (height %Pixels; #IMPLIED) + * (background %URI; #IMPLIED) + * (bordercolor %Color #IMPLIED) ... D205514 + * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %reserved; + // ... %reserved; is empty in the current DTD. + + String[] names = {HTML40Namespace.ATTR_NAME_SUMMARY, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_FRAME, HTML40Namespace.ATTR_NAME_RULES, HTML40Namespace.ATTR_NAME_CELLSPACING, HTML40Namespace.ATTR_NAME_CELLPADDING, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_DATAPAGESIZE, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D205514 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // align (local) + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] alignValues = {HTML40Namespace.ATTR_VALUE_LEFT, HTML40Namespace.ATTR_VALUE_CENTER, HTML40Namespace.ATTR_VALUE_RIGHT}; + atype.setEnumValues(alignValues); + HTMLAttrDeclImpl adec = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, adec); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java new file mode 100644 index 0000000000..576538cd34 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * TEXTAREA. + */ +final class HedTEXTAREA extends HedPcdata { + + /** + * TEXTAREA should keep spaces in its source. + */ + public HedTEXTAREA(ElementCollection collection) { + super(HTML40Namespace.ElementName.TEXTAREA, collection); + layoutType = LAYOUT_OBJECT; + + keepSpaces = true; + } + + /** + * TEXTAREA. + * %attrs; + * %reserved; ... empty + * (name CDATA #IMPLIED) + * (rows NUMBER #REQUIRED) + * (cols NUMBER #REQUIRED) + * (disabled (disabled) #IMPLIED) + * (readonly (readonly) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + * (onselect %Script; #IMPLIED) + * (onchange %Script; #IMPLIED) + * (istyle CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_ROWS, HTML40Namespace.ATTR_NAME_COLS, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_READONLY, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONSELECT, HTML40Namespace.ATTR_NAME_ONCHANGE, HTML40Namespace.ATTR_NAME_ISTYLE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.BUTTON}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java new file mode 100644 index 0000000000..19eefc9b3e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * TITLE. + */ +final class HedTITLE extends HedPcdata { + + /** + */ + public HedTITLE(ElementCollection collection) { + super(HTML40Namespace.ElementName.TITLE, collection); + layoutType = LAYOUT_HIDDEN; + } + + /** + * TITLE. + * %i18n; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + } + + /** + * Exclusion. + * <code>TITLE</code> has the exclusion. + * It is <code>%head.misc;</code>. + * %head.misc; is <code>SCRIPT|STYLE|META|LINK|OBJECT</code>. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + // (SCRIPT|STYLE|META|LINK|OBJECT) + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + + String[] names = {HTML40Namespace.ElementName.SCRIPT, HTML40Namespace.ElementName.STYLE, HTML40Namespace.ElementName.META, HTML40Namespace.ElementName.LINK, HTML40Namespace.ElementName.OBJECT}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + return exclusion; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java new file mode 100644 index 0000000000..1c3eddd278 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * TR. + */ +final class HedTR extends HTMLElemDeclImpl { + + private static String[] terminators = {HTML40Namespace.ElementName.TR}; + + /** + */ + public HedTR(ElementCollection collection) { + super(HTML40Namespace.ElementName.TR, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_TCELL_CONTAINER; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END; + indentChild = true; + } + + /** + * %attrs; + * %cellhalign; + * %cellvalign; + * (bgcolor %Color; #IMPLIED) + * (background %URI; #IMPLIED) + * (bordercolor %Color #IMPLIED) ... D205514 + * (height %Length #IMPLIED) bug2246 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %cellhalign; + attributeCollection.getCellhalign(attributes); + // %cellvalign; + attributeCollection.getCellvalign(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR, HTML40Namespace.ATTR_NAME_HEIGHT // D205514 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * TR has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java new file mode 100644 index 0000000000..4aaa8d053d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * THEAD/TFOOT/TBODY + */ +final class HedTableBody extends HTMLElemDeclImpl { + + private static String[] terminators = {HTML40Namespace.ElementName.CAPTION, HTML40Namespace.ElementName.COL, HTML40Namespace.ElementName.COLGROUP, HTML40Namespace.ElementName.THEAD, HTML40Namespace.ElementName.TBODY, HTML40Namespace.ElementName.TFOOT}; + + /** + */ + public HedTableBody(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_TR_CONTAINER; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + if (elementName == HTML40Namespace.ElementName.TBODY) { + omitType = OMIT_BOTH; + } + else { + omitType = OMIT_END; + } + indentChild = true; + } + + /** + * TBODY/TFOOT/THEAD + * %attrs; + * %cellhalign; + * %cellvalign; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %cellhalign; + attributeCollection.getCellhalign(attributes); + // %cellvalign; + attributeCollection.getCellvalign(attributes); + } + + /** + * THEAD, TFOOT and TBODY have terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java new file mode 100644 index 0000000000..2ff0d3099a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; + + +/** + * (TH | TD). + */ +final class HedTableCell extends HedFlowContainer { + + private static String[] terminators = {HTML40Namespace.ElementName.TR, HTML40Namespace.ElementName.TH, HTML40Namespace.ElementName.TD}; + + /** + */ + public HedTableCell(String elementName, ElementCollection collection) { + super(elementName, collection); + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END; + } + + /** + * %attrs; + * (abbr %Text; #IMPLIED) + * (axis CDATA #IMPLIED) + * (headers IDREFS #IMPLIED) + * (scope %Scope; #IMPLIED) + * (rowspan NUMBER 1) + * (colspan NUMBER 1) + * %cellhalign; + * %cellvalign; + * (nowrap (nowrap) #IMPLIED) + * (bgcolor %Color; #IMPLIED) + * (width %Length; #IMPLIED) + * (height %Length; #IMPLIED) + * (background %URI; #IMPLIED) + * (bordercolor %Color #IMPLIED) ... D205514 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %cellhalign; + attributeCollection.getCellhalign(attributes); + // %cellvalign; + attributeCollection.getCellvalign(attributes); + + String[] names = {HTML40Namespace.ATTR_NAME_ABBR, HTML40Namespace.ATTR_NAME_AXIS, HTML40Namespace.ATTR_NAME_HEADERS, HTML40Namespace.ATTR_NAME_SCOPE, HTML40Namespace.ATTR_NAME_ROWSPAN, HTML40Namespace.ATTR_NAME_COLSPAN, HTML40Namespace.ATTR_NAME_NOWRAP, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D205514 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * TH and TD have terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java new file mode 100644 index 0000000000..14f8dacfe4 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * UL. + */ +final class HedUL extends HedListItemContainer { + + /** + */ + public HedUL(ElementCollection collection) { + super(HTML40Namespace.ElementName.UL, collection); + } + + /** + * UL. + * (type %ULStyle; #IMPLIED) ... should be defined locally. + * (compact (compact) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (type %ULStyle; #IMPLIED) ... should be defined locally. + // %ULStyle; is (disc|square|circle). + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {HTML40Namespace.ATTR_VALUE_DISC, HTML40Namespace.ATTR_VALUE_SQUARE, HTML40Namespace.ATTR_VALUE_CIRCLE}; + atype.setEnumValues(values); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr); + + // the rest. + String[] names = {HTML40Namespace.ATTR_NAME_COMPACT}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java new file mode 100644 index 0000000000..f7b08d6c10 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import org.eclipse.wst.html.core.HTML40Namespace; + + + +final class HedWBR extends HedEmpty { + + public HedWBR(ElementCollection collection) { + super(HTML40Namespace.ElementName.WBR, collection); + // LAYOUT_BREAK. + // same as BR. + layoutType = LAYOUT_BREAK; + } + + protected void createAttributeDeclarations() { + // No attributes is defined. + if (attributes != null) + return; + attributes = new CMNamedNodeMapImpl(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java new file mode 100644 index 0000000000..89d76e4d14 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Implementation of CMDocument for the JSP 1.1. + */ +class JCMDocImpl extends CMNodeImpl implements JSPCMDocument { + + /** Namespace for all names of elements, entities and attributes. */ + private CMNamespaceImpl namespace = null; + private JSPElementCollection elements = null; + + /** + * HCMDocImpl constructor comment. + */ + public JCMDocImpl(String docTypeName, CMNamespaceImpl targetNamespace) { + super(docTypeName); + namespace = targetNamespace; + elements = new JSPElementCollection(); + } + + /** + * @see com.ibm.sed.contentmodel.html.HTMLCMDocument + */ + public HTMLElementDeclaration getElementDeclaration(String elementName) { + if (elements == null) + return null; + return (HTMLElementDeclaration) elements.getNamedItem(elementName); + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamedNodeMap getElements() { + return elements; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamedNodeMap getEntities() { + return null; + } + + /** + * @see com.ibm.sed.contentmodel.html.HTMLCMDocument + */ + public HTMLEntityDeclaration getEntityDeclaration(String entityName) { + return null; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace getNamespace() { + return namespace; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + public int getNodeType() { + return CMNode.DOCUMENT; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java new file mode 100644 index 0000000000..acfff3b016 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + +/** + * JSP 1.1 Namespace. Note, this interface was + * copied form JSP core packages. One implication + * is that extra care is needed in using '==' instead + * of '.equals'. + */ +public interface JSP11Namespace { + + public static interface ElementName { + // Element names + public static final String SCRIPTLET = "jsp:scriptlet"; //$NON-NLS-1$ + public static final String EXPRESSION = "jsp:expression"; //$NON-NLS-1$ + public static final String DECLARATION = "jsp:declaration"; //$NON-NLS-1$ + public static final String DIRECTIVE_PAGE = "jsp:directive.page"; //$NON-NLS-1$ + public static final String DIRECTIVE_INCLUDE = "jsp:directive.include"; //$NON-NLS-1$ + public static final String DIRECTIVE_TAGLIB = "jsp:directive.taglib"; //$NON-NLS-1$ + public static final String USEBEAN = "jsp:useBean"; //$NON-NLS-1$ + public static final String SETPROPERTY = "jsp:setProperty"; //$NON-NLS-1$ + public static final String GETPROPERTY = "jsp:getProperty"; //$NON-NLS-1$ + public static final String INCLUDE = "jsp:include"; //$NON-NLS-1$ + public static final String FORWARD = "jsp:forward"; //$NON-NLS-1$ + public static final String PLUGIN = "jsp:plugin"; //$NON-NLS-1$ + public static final String PARAMS = "jsp:params"; //$NON-NLS-1$ + public static final String FALLBACK = "jsp:fallback"; //$NON-NLS-1$ + public static final String PARAM = "jsp:param"; //$NON-NLS-1$ + public static final String ROOT = "jsp:root"; //$NON-NLS-1$ + public static final String TEXT = "jsp:text"; //$NON-NLS-1$ + } + + public static final String JSP11_URI = ""; //$NON-NLS-1$ + public static final String JSP_TAG_PREFIX = "jsp"; //$NON-NLS-1$ + // attribute names + // directive.page + public static final String ATTR_NAME_LANGUAGE = "language"; //$NON-NLS-1$ + public static final String ATTR_NAME_EXTENDS = "extends"; //$NON-NLS-1$ + public static final String ATTR_NAME_CONTENT_TYPE = "contentType"; //$NON-NLS-1$ + public static final String ATTR_NAME_IMPORT = "import"; //$NON-NLS-1$ + public static final String ATTR_NAME_SESSION = "session"; //$NON-NLS-1$ + public static final String ATTR_NAME_BUFFER = "buffer"; //$NON-NLS-1$ + public static final String ATTR_NAME_AUTOFLUSH = "autoFlush"; //$NON-NLS-1$ + public static final String ATTR_NAME_IS_THREAD_SAFE = "isThreadSafe"; //$NON-NLS-1$ + public static final String ATTR_NAME_INFO = "info"; //$NON-NLS-1$ + public static final String ATTR_NAME_ERROR_PAGE = "errorPage"; //$NON-NLS-1$ + public static final String ATTR_NAME_IS_ERROR_PAGE = "isErrorPage"; //$NON-NLS-1$ + public static final String ATTR_NAME_PAGE_ENCODING = "pageEncoding"; //$NON-NLS-1$ + // directive.include + public static final String ATTR_NAME_FILE = "file"; //$NON-NLS-1$ + // directive.taglib + public static final String ATTR_NAME_URI = "uri"; //$NON-NLS-1$ + public static final String ATTR_NAME_PREFIX = "prefix"; //$NON-NLS-1$ + // useBean + public static final String ATTR_NAME_ID = "id"; //$NON-NLS-1$ + public static final String ATTR_NAME_SCOPE = "scope"; //$NON-NLS-1$ + public static final String ATTR_NAME_CLASS = "class"; //$NON-NLS-1$ + public static final String ATTR_NAME_BEAN_NAME = "beanName"; //$NON-NLS-1$ + public static final String ATTR_NAME_TYPE = "type"; //$NON-NLS-1$ + // setProperty + public static final String ATTR_NAME_NAME = "name"; //$NON-NLS-1$ + public static final String ATTR_NAME_PROPERTY = "property"; //$NON-NLS-1$ + public static final String ATTR_NAME_VALUE = "value"; //$NON-NLS-1$ + public static final String ATTR_NAME_PARAM = "param"; //$NON-NLS-1$ + // include + public static final String ATTR_NAME_PAGE = "page"; //$NON-NLS-1$ + public static final String ATTR_NAME_FLUSH = "flush"; //$NON-NLS-1$ + // plugin + public static final String ATTR_NAME_CODE = "code"; //$NON-NLS-1$ + public static final String ATTR_NAME_CODEBASE = "codebase"; //$NON-NLS-1$ + public static final String ATTR_NAME_ALIGN = "align"; //$NON-NLS-1$ + public static final String ATTR_NAME_ARCHIVE = "archive"; //$NON-NLS-1$ + public static final String ATTR_NAME_HEIGHT = "height"; //$NON-NLS-1$ + public static final String ATTR_NAME_HSPACE = "hspace"; //$NON-NLS-1$ + public static final String ATTR_NAME_JREVERSION = "jreversion"; //$NON-NLS-1$ + public static final String ATTR_NAME_VSPACE = "vspace"; //$NON-NLS-1$ + public static final String ATTR_NAME_WIDTH = "width"; //$NON-NLS-1$ + public static final String ATTR_NAME_NSPLUGINURL = "nspluginurl"; //$NON-NLS-1$ + public static final String ATTR_NAME_IEPLUGINURL = "iepluginurl"; //$NON-NLS-1$ + // root + public static final String ATTR_NAME_XMLNS_JSP = "xmlns:jsp"; //$NON-NLS-1$ + public static final String ATTR_NAME_VERSION = "version"; //$NON-NLS-1$ + // attribute values + public static final String ATTR_VALUE_TRUE = "true"; //$NON-NLS-1$ + public static final String ATTR_VALUE_FALSE = "false"; //$NON-NLS-1$ + public static final String ATTR_VALUE_JAVA = "java"; //$NON-NLS-1$ + public static final String ATTR_VALUE_CT_DEFAULT = "text/html; charset=ISO-8859-1";//D195366 //$NON-NLS-1$ + public static final String ATTR_VALUE_BUFSIZ_DEFAULT = "8kb"; //$NON-NLS-1$ + public static final String ATTR_VALUE_PAGE = "page"; //$NON-NLS-1$ + public static final String ATTR_VALUE_SESSION = "session"; //$NON-NLS-1$ + public static final String ATTR_VALUE_REQUEST = "request"; //$NON-NLS-1$ + public static final String ATTR_VALUE_APPLICATION = "application"; //$NON-NLS-1$ + public static final String ATTR_VALUE_BEAN = "bean"; //$NON-NLS-1$ + public static final String ATTR_VALUE_APPLET = "applet"; //$NON-NLS-1$ + public static final String ATTR_VALUE_TOP = "top"; //$NON-NLS-1$ + public static final String ATTR_VALUE_MIDDLE = "middle"; //$NON-NLS-1$ + public static final String ATTR_VALUE_BOTTOM = "bottom"; //$NON-NLS-1$ + public static final String ATTR_VALUE_LEFT = "left"; //$NON-NLS-1$ + public static final String ATTR_VALUE_RIGHT = "right"; //$NON-NLS-1$ + public static final String ATTR_VALUE_JVER11 = "1.1"; //$NON-NLS-1$ + public static final String ATTR_VALUE_XMLNS_JSP = "http://java.sun.com/JSP/Page"; //$NON-NLS-1$ +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java new file mode 100644 index 0000000000..959063d13c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +/** + * JSP extension for CMDocument. + * This interface provides some short hand methods to get declarations + * by a name. + */ +public interface JSPCMDocument extends org.eclipse.wst.xml.core.internal.contentmodel.CMDocument { + + /** + * A short hand method to get a element declaration for a JSP element. + * JSP declaration class implements HTMLElementDeclaration interface. + * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration + * @param elementName java.lang.String + */ + HTMLElementDeclaration getElementDeclaration(String elementName); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java new file mode 100644 index 0000000000..cc8acf6b45 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java @@ -0,0 +1,897 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for element declarations of the JSP 1.1. + */ +final class JSPElementCollection extends DeclCollection implements JSP11Namespace.ElementName { + + + private class TypePacket { + public String name = null; + public int content = CMElementDeclaration.EMPTY; + public int omit = HTMLElementDeclaration.OMIT_NONE; + public int lineBreak = HTMLElementDeclaration.BREAK_NONE; + public int layout = HTMLElementDeclaration.LAYOUT_NONE; + public int correct = HTMLElementDeclaration.CORRECT_NONE; + public int format = HTMLElementDeclaration.FORMAT_XML; + public boolean indentChild = false; + + public TypePacket() { + } + } + + /** JSP element declaration. */ + private class ElemDecl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration { + private TypePacket type = null; + private CMGroupImpl content = null; + private CMNamedNodeMapImpl attributes = null; + + public ElemDecl(TypePacket t) { + super(t.name, 1, 1); + type = t; + } + + public void setContent(CMGroupImpl group) { + content = group; + } + + public void setAttributes(CMNamedNodeMapImpl attrs) { + attributes = attrs; + } + + // implementes CMNode + public int getNodeType() { + return CMNode.ELEMENT_DECLARATION; + } + + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return true; + } + else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { + return true; + } + else { + PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); + if (pp == null) + return false; + return pp.supports(this); + } + } + + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return new Boolean(false); //D208839 + } + else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { + String myName = getElementName(); + if (myName == JSP11Namespace.ElementName.PLUGIN) { + return getNamedItem(JSP11Namespace.ElementName.PARAMS); // outer class method. + } + else if (myName == JSP11Namespace.ElementName.PARAMS) { + return getNamedItem(JSP11Namespace.ElementName.PARAM); // outer class method. + } + else { + return null; + } + } + else { + PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); + if (pp == null) + return null; + return pp.get(this); + } + } + + // implementes CMElementDeclaration + public CMNamedNodeMap getAttributes() { + return attributes; + } + + public CMContent getContent() { + return content; + } + + public int getContentType() { + return type.content; + } + + public CMDataType getDataType() { + return null; + } + + public String getElementName() { + return getNodeName(); + } + + public CMNamedNodeMap getLocalElements() { + return null; + } + + // implementes HTMLElementDeclaration + public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) { + if (attributes == null) + return null; + return (HTMLAttributeDeclaration) attributes.getNamedItem(attrName); + } + + public int getCorrectionType() { + return type.correct; + } + + public CMContent getExclusion() { + return null; + } + + public CMContent getInclusion() { + return null; + } + + public CMNamedNodeMap getProhibitedAncestors() { + return EMPTY_MAP; + } + + public int getFormatType() { + return type.format; + } + + public int getLayoutType() { + return type.layout; + } + + public int getLineBreakHint() { + return type.lineBreak; + } + + public int getOmitType() { + return type.omit; + } + + public boolean shouldTerminateAt(HTMLElementDeclaration dec) { + return false; + } + + public boolean shouldKeepSpaces() { + return false; + } + + public boolean shouldIndentChildSource() { + return type.indentChild; + } + + public boolean isJSP() { + return true; + } + } + + // element IDs + private static class Ids { + public static final int ID_SCRIPTLET = 0; + public static final int ID_EXPRESSION = 1; + public static final int ID_DECLARATION = 2; + public static final int ID_DIRECTIVE_PAGE = 3; + public static final int ID_DIRECTIVE_INCLUDE = 4; + public static final int ID_DIRECTIVE_TAGLIB = 5; + public static final int ID_USEBEAN = 6; + public static final int ID_SETPROPERTY = 7; + public static final int ID_GETPROPERTY = 8; + public static final int ID_INCLUDE = 9; + public static final int ID_FORWARD = 10; + public static final int ID_PLUGIN = 11; + public static final int ID_PARAMS = 12; + public static final int ID_FALLBACK = 13; + public static final int ID_PARAM = 14; + public static final int ID_ROOT = 15; + public static final int ID_TEXT = 16; + + public static int getNumOfIds() { + if (numofids != -1) + return numofids; + + // NOTE: If the reflection is too slow, this method should + // just return the literal value, like 105. + // -- 5/25/2001 + Class clazz = Ids.class; + Field[] fields = clazz.getFields(); + numofids = 0; + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("ID_"))//$NON-NLS-1$ + numofids++; + } + return numofids; + } + + // chache the result of the reflection. + private static int numofids = -1; + } + + // attribute creater + private class JACreater implements JSP11Namespace { + // attribute declaration + private class AttrDecl extends CMNodeImpl implements HTMLAttributeDeclaration { + HTMLCMDataTypeImpl type = null; + int usage = CMAttributeDeclaration.OPTIONAL; + + // methods + public AttrDecl(String attrName) { + super(attrName); + } + + public String getAttrName() { + return getNodeName(); + } + + public CMDataType getAttrType() { + return type; + } + + /** @deprecated by superclass */ + public String getDefaultValue() { + if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT) + return null; + return type.getImpliedValue(); + } + + /** @deprecated by superclass */ + public Enumeration getEnumAttr() { + Vector v = new Vector(Arrays.asList(type.getEnumeratedValues())); + return v.elements(); + } + + public int getNodeType() { + return CMNode.ATTRIBUTE_DECLARATION; + } + + public int getUsage() { + return usage; + } + + public boolean shouldIgnoreCase() { + return false; + } + } + + private CMNamedNodeMapImpl declarations = null; + + public JACreater() { + declarations = new CMNamedNodeMapImpl(); + } + + public CMNamedNodeMapImpl getDeclarations(int eid) { + switch (eid) { + case Ids.ID_DIRECTIVE_PAGE : + createForDirPage(); + break; + case Ids.ID_DIRECTIVE_INCLUDE : + createForDirInclude(); + break; + case Ids.ID_DIRECTIVE_TAGLIB : + createForDirTaglib(); + break; + case Ids.ID_USEBEAN : + createForUseBean(); + break; + case Ids.ID_SETPROPERTY : + createForSetProperty(); + break; + case Ids.ID_GETPROPERTY : + createForGetProperty(); + break; + case Ids.ID_INCLUDE : + createForInclude(); + break; + case Ids.ID_FORWARD : + createForForward(); + break; + case Ids.ID_PLUGIN : + createForPlugin(); + break; + case Ids.ID_PARAM : + createForParam(); + break; + case Ids.ID_ROOT : + createForRoot(); + break; + default : + // should warn. + break; + } + return declarations; + } + + private AttrDecl createBoolType(String name, String defValue) { + AttrDecl adec = new AttrDecl(name); + adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + adec.type.setEnumValues(values); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, defValue); + return adec; + } + + private void createForDirPage() { + AttrDecl adec = null; + // ("language" CDATA DECLARED "java") + adec = new AttrDecl(ATTR_NAME_LANGUAGE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_JAVA); + declarations.putNamedItem(ATTR_NAME_LANGUAGE, adec); + + // ("extends" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_EXTENDS); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_EXTENDS, adec); + + // ("contentType" CDATA DECLARED "text/html; ISO-8859-1") + adec = new AttrDecl(ATTR_NAME_CONTENT_TYPE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_CT_DEFAULT); + declarations.putNamedItem(ATTR_NAME_CONTENT_TYPE, adec); + + // ("import" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_IMPORT); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_IMPORT, adec); + + // ("session" ENUM DECLARED (true|false) "true") + adec = createBoolType(ATTR_NAME_SESSION, ATTR_VALUE_TRUE); + if (adec != null) + declarations.putNamedItem(ATTR_NAME_SESSION, adec); + + // ("buffer" CDATA DECLARED "8kb") + adec = new AttrDecl(ATTR_NAME_BUFFER); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_BUFSIZ_DEFAULT); + declarations.putNamedItem(ATTR_NAME_BUFFER, adec); + + // ("autoFlush" ENUM DECLARED (true|false) "true") + adec = createBoolType(ATTR_NAME_AUTOFLUSH, ATTR_VALUE_TRUE); + if (adec != null) + declarations.putNamedItem(ATTR_NAME_AUTOFLUSH, adec); + + // ("isThreadSafe" ENUM DECLARED (true|false) "true") + adec = createBoolType(ATTR_NAME_IS_THREAD_SAFE, ATTR_VALUE_TRUE); + if (adec != null) + declarations.putNamedItem(ATTR_NAME_IS_THREAD_SAFE, adec); + + // ("info" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_INFO); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_INFO, adec); + + // ("errorPage" URI IMPLIED) + adec = new AttrDecl(ATTR_NAME_ERROR_PAGE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + declarations.putNamedItem(ATTR_NAME_ERROR_PAGE, adec); + + // ("isErrorPage" ENUM DECLARED (true|false) "false") + adec = createBoolType(ATTR_NAME_IS_ERROR_PAGE, ATTR_VALUE_FALSE); + if (adec != null) + declarations.putNamedItem(ATTR_NAME_IS_ERROR_PAGE, adec); + + // ("pageEncoding" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_PAGE_ENCODING); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_PAGE_ENCODING, adec); + + } + + private void createForDirInclude() { + // ("file" URI REQUIRED); Defect TORO:185241 + AttrDecl adec = new AttrDecl(ATTR_NAME_FILE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_FILE, adec); + } + + private void createForDirTaglib() { + // ("uri" URI REQUIRED) + AttrDecl adec = new AttrDecl(ATTR_NAME_URI); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_URI, adec); + + // ("prefix" CDATA REQUIRED) + adec = new AttrDecl(ATTR_NAME_PREFIX); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_PREFIX, adec); + } + + private void createForUseBean() { + // ("id" ID REQUIRED) + AttrDecl adec = new AttrDecl(ATTR_NAME_ID); + adec.type = new HTMLCMDataTypeImpl(CMDataType.ID); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_ID, adec); + + // ("scope" ENUM DECLARED (page|session|request|application) "page") + adec = new AttrDecl(ATTR_NAME_SCOPE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_PAGE, ATTR_VALUE_SESSION, ATTR_VALUE_REQUEST, ATTR_VALUE_APPLICATION}; + adec.type.setEnumValues(values); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_PAGE); + declarations.putNamedItem(ATTR_NAME_SCOPE, adec); + + // ("class" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_CLASS); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_CLASS, adec); + + // ("beanName" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_BEAN_NAME); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_BEAN_NAME, adec); + + // ("type" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_TYPE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_TYPE, adec); + } + + private void createForSetProperty() { + // ("name" IDREF REQUIRED) + AttrDecl adec = new AttrDecl(ATTR_NAME_NAME); + adec.type = new HTMLCMDataTypeImpl(CMDataType.IDREF); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_NAME, adec); + + // ("property" CDATA REQUIRED) + adec = new AttrDecl(ATTR_NAME_PROPERTY); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_PROPERTY, adec); + + // ("value" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_VALUE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_VALUE, adec); + + // ("param" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_PARAM); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_PARAM, adec); + + } + + private void createForGetProperty() { + // ("name" IDREF REQUIRED) + AttrDecl adec = new AttrDecl(ATTR_NAME_NAME); + adec.type = new HTMLCMDataTypeImpl(CMDataType.IDREF); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_NAME, adec); + + // ("property" CDATA REQUIRED) + adec = new AttrDecl(ATTR_NAME_PROPERTY); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_PROPERTY, adec); + + } + + private void createForInclude() { + AttrDecl adec = null; + // ("page" URI REQUIRED) + adec = new AttrDecl(ATTR_NAME_PAGE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_PAGE, adec); + + // ("flush" ENUM REQUIRED (true|false)); Defect TORO:185241 + adec = new AttrDecl(ATTR_NAME_FLUSH); + adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); + adec.usage = CMAttributeDeclaration.REQUIRED; + String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE}; + adec.type.setEnumValues(values); + declarations.putNamedItem(ATTR_NAME_FLUSH, adec); + } + + private void createForForward() { + // ("page" URI REQUIRED) + AttrDecl adec = new AttrDecl(ATTR_NAME_PAGE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_PAGE, adec); + } + + private void createForPlugin() { + // ("type" ENUM REQUIRED (bean|applet)) + AttrDecl adec = new AttrDecl(ATTR_NAME_TYPE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); + adec.usage = CMAttributeDeclaration.REQUIRED; + String[] values = {ATTR_VALUE_BEAN, ATTR_VALUE_APPLET}; + adec.type.setEnumValues(values); + declarations.putNamedItem(ATTR_NAME_TYPE, adec); + + // ("code" CDATA REQUIRED) + adec = new AttrDecl(ATTR_NAME_CODE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_CODE, adec); + + // ("codebase" URI REQUIRED) + adec = new AttrDecl(ATTR_NAME_CODEBASE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_CODEBASE, adec); + + // ("align" ENUM IMPLIED (top|middle|bottom|left|right)) + adec = new AttrDecl(ATTR_NAME_ALIGN); + adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] aligns = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT}; + adec.type.setEnumValues(aligns); + declarations.putNamedItem(ATTR_NAME_ALIGN, adec); + + // ("archive" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_ARCHIVE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_ARCHIVE, adec); + + // ("height" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_HEIGHT); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_HEIGHT, adec); + + // ("hspace" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_HSPACE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_HSPACE, adec); + + // ("jreversion" CDATA DECLARED "1.1") + adec = new AttrDecl(ATTR_NAME_JREVERSION); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_JVER11); + declarations.putNamedItem(ATTR_NAME_JREVERSION, adec); + + // ("name" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_NAME); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_NAME, adec); + + // ("vspace" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_VSPACE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_VSPACE, adec); + + // ("width" CDATA IMPLIED) + adec = new AttrDecl(ATTR_NAME_WIDTH); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + declarations.putNamedItem(ATTR_NAME_WIDTH, adec); + + // ("nspluginurl" URI IMPLIED) + adec = new AttrDecl(ATTR_NAME_NSPLUGINURL); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + declarations.putNamedItem(ATTR_NAME_NSPLUGINURL, adec); + + // ("iepluginurl" URI IMPLIED) + adec = new AttrDecl(ATTR_NAME_IEPLUGINURL); + adec.type = new HTMLCMDataTypeImpl(CMDataType.URI); + declarations.putNamedItem(ATTR_NAME_IEPLUGINURL, adec); + } + + private void createForParam() { + // ("name" CDATA REQUIRED) + AttrDecl adec = new AttrDecl(ATTR_NAME_NAME); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_NAME, adec); + + // ("value" CDATA REQUIRED); Defect TORO:185241 + adec = new AttrDecl(ATTR_NAME_VALUE); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_VALUE, adec); + + } + + private void createForRoot() { + // ("xmlns:jsp" CDATA "http://jva.sun.com/JSP/Page") + AttrDecl adec = new AttrDecl(ATTR_NAME_XMLNS_JSP); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_XMLNS_JSP); + declarations.putNamedItem(ATTR_NAME_XMLNS_JSP, adec); + // ("version" CDATA REQUIRED) + adec = new AttrDecl(ATTR_NAME_VERSION); + adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA); + adec.usage = CMAttributeDeclaration.REQUIRED; + declarations.putNamedItem(ATTR_NAME_VERSION, adec); + } + } + + private final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() { + public int getLength() { + return 0; + } + + public CMNode getNamedItem(String name) { + return null; + } + + public CMNode item(int index) { + return null; + } + + public Iterator iterator() { + return new Iterator() { + public boolean hasNext() { + return false; + } + + public Object next() { + return null; + } + + public void remove() { + } + }; + } + }; + private static String[] names = null; + + static { + names = new String[Ids.getNumOfIds()]; + names[Ids.ID_SCRIPTLET] = SCRIPTLET; + names[Ids.ID_EXPRESSION] = EXPRESSION; + names[Ids.ID_DECLARATION] = DECLARATION; + names[Ids.ID_DIRECTIVE_PAGE] = DIRECTIVE_PAGE; + names[Ids.ID_DIRECTIVE_INCLUDE] = DIRECTIVE_INCLUDE; + names[Ids.ID_DIRECTIVE_TAGLIB] = DIRECTIVE_TAGLIB; + names[Ids.ID_USEBEAN] = USEBEAN; + names[Ids.ID_SETPROPERTY] = SETPROPERTY; + names[Ids.ID_GETPROPERTY] = GETPROPERTY; + names[Ids.ID_INCLUDE] = INCLUDE; + names[Ids.ID_FORWARD] = FORWARD; + names[Ids.ID_PLUGIN] = PLUGIN; + names[Ids.ID_PARAMS] = PARAMS; + names[Ids.ID_FALLBACK] = FALLBACK; + names[Ids.ID_PARAM] = PARAM; + names[Ids.ID_ROOT] = ROOT; + names[Ids.ID_TEXT] = TEXT; + } + + /** + */ + public JSPElementCollection() { + super(names, TOLERANT_CASE); + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param elementName java.lang.String + */ + protected CMNode create(String elementName) { + return createElemDecl(getID(elementName)); + } + + /** + * @return com.ibm.sed.contentmodel.html.CMGroupImpl + * @param eid int + */ + private CMGroupImpl createContent(int eid) { + if (eid == ID_UNKNOWN) + return null; + + CMGroupImpl content = null; + CMNode child = null; + + switch (eid) { + case Ids.ID_INCLUDE : + case Ids.ID_FORWARD : + // (jsp:param)* + content = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED); + child = item(Ids.ID_PARAM); + if (child != null) + content.appendChild(child); + break; + case Ids.ID_PLUGIN : + // (jsp:params | jsp:fallback)? + content = new CMGroupImpl(CMGroup.CHOICE, 0, 1); + // jsp:params + child = item(Ids.ID_PARAMS); + if (child != null) + content.appendChild(child); + // jsp:fallback + child = item(Ids.ID_FALLBACK); + if (child != null) + content.appendChild(child); + break; + case Ids.ID_PARAMS : + // (jsp:param)+ + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + child = item(Ids.ID_PARAM); + if (child != null) + content.appendChild(child); + break; + case Ids.ID_ROOT : + // %Body; + // --> (jsp:text|%Directives;|%Scripts;|%Actions;)* + // %Directives --> jsp:directive.page|jsp:directive.include + // %Scripts; --> jsp:scriptlet|jsp:declaration|jsp:expression + // %Actions --> jsp:useBean|jsp.setProperty|jsp:getProperty + // |jsp:include|jsp:forward|jsp:plugin + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + int validChildren[] = {Ids.ID_TEXT, + // %Directves; + Ids.ID_DIRECTIVE_PAGE, Ids.ID_DIRECTIVE_INCLUDE, + // %Scripts; + Ids.ID_SCRIPTLET, Ids.ID_DECLARATION, Ids.ID_EXPRESSION, + // %Actions; + Ids.ID_USEBEAN, Ids.ID_SETPROPERTY, Ids.ID_GETPROPERTY, Ids.ID_INCLUDE, Ids.ID_FORWARD, Ids.ID_PLUGIN}; + for (int i = 0; i < validChildren.length; i++) { + child = item(validChildren[i]); + if (child != null) + content.appendChild(child); + } + break; + } + + return content; + } + + /** + * @return com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + * @param eid int + */ + private HTMLElementDeclaration createElemDecl(int eid) { + if (eid == ID_UNKNOWN) + return null; + + TypePacket packet = new TypePacket(); + switch (eid) { + case Ids.ID_SCRIPTLET : + // content, omit, lineBreak, layout, correct, format + // scriptlet + packet.name = SCRIPTLET; + packet.content = CMElementDeclaration.CDATA; + packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; + packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT; + break; + case Ids.ID_EXPRESSION : + // expression + packet.name = EXPRESSION; + packet.content = CMElementDeclaration.CDATA; + packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; + packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT; + break; + case Ids.ID_DECLARATION : + // declaration + packet.name = DECLARATION; + packet.content = CMElementDeclaration.CDATA; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT; + break; + case Ids.ID_DIRECTIVE_PAGE : + // directive.page + packet.name = DIRECTIVE_PAGE; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE; + break; + case Ids.ID_DIRECTIVE_INCLUDE : + // directive.inlcude + packet.name = DIRECTIVE_INCLUDE; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE; + break; + case Ids.ID_DIRECTIVE_TAGLIB : + // directive.taglib + packet.name = DIRECTIVE_TAGLIB; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE; + break; + case Ids.ID_USEBEAN : + // useBean + packet.name = USEBEAN; + packet.content = CMElementDeclaration.ANY; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + packet.indentChild = true; + break; + case Ids.ID_SETPROPERTY : + // setProperty + packet.name = SETPROPERTY; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + break; + case Ids.ID_GETPROPERTY : + // getProperty + packet.name = GETPROPERTY; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; + break; + case Ids.ID_INCLUDE : + // include + packet.name = INCLUDE; + packet.content = CMElementDeclaration.ELEMENT; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; + packet.indentChild = true; + break; + case Ids.ID_FORWARD : + // forward + packet.name = FORWARD; + packet.content = CMElementDeclaration.ELEMENT; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; + packet.indentChild = true; + break; + case Ids.ID_PLUGIN : + // plugin + packet.name = PLUGIN; + packet.content = CMElementDeclaration.ELEMENT; + packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT; + packet.indentChild = true; + break; + case Ids.ID_PARAMS : + // params + packet.name = PARAMS; + packet.content = CMElementDeclaration.ELEMENT; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + packet.indentChild = true; + break; + case Ids.ID_FALLBACK : + // fallback + packet.name = FALLBACK; + packet.content = CMElementDeclaration.CDATA; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + break; + case Ids.ID_PARAM : + // param + packet.name = PARAM; + packet.omit = HTMLElementDeclaration.OMIT_END; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; + break; + case Ids.ID_ROOT : + packet.name = ROOT; + packet.content = CMElementDeclaration.ELEMENT; + packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; // same as HTML + break; + case Ids.ID_TEXT : + packet.name = TEXT; + packet.content = CMElementDeclaration.PCDATA; + break; + default : + // unknown ID + return null; + } + + ElemDecl dec = new ElemDecl(packet); + + CMGroupImpl content = createContent(eid); + if (content != null) + dec.setContent(content); + + JACreater creater = new JACreater(); + dec.setAttributes(creater.getDeclarations(eid)); + + return dec; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java new file mode 100644 index 0000000000..09cba4b407 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + + +/** + * PropertyProvider class. + * This class is intended to be used in HTMLElementDeclaration instances. + */ +interface PropertyProvider { + + boolean supports(HTMLElementDeclaration edecl); + + Object get(HTMLElementDeclaration edecl); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java new file mode 100644 index 0000000000..3ffb396e50 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java @@ -0,0 +1,359 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel; + +import java.util.Hashtable; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.annotation.AnnotationMap; + +/** + * The factory object of PropertyProvider. + */ +final class PropertyProviderFactory { + + + /** + * DefaultProvider is intended to be used for unknown properties. + * It always returns null value for any properties. + */ + class DefaultProvider implements PropertyProvider { + public DefaultProvider() { + super(); + } + + public boolean supports(HTMLElementDeclaration edecl) { + return false; + } + + public Object get(HTMLElementDeclaration edecl) { + return null; + } + } + + abstract class AbstractElementPropertyProvider implements PropertyProvider { + protected AbstractElementPropertyProvider() { + super(); + } + + public boolean supports(HTMLElementDeclaration edecl) { + return (edecl != null); + } + + public Object get(HTMLElementDeclaration edecl) { + if (!(edecl instanceof HTMLPropertyDeclaration)) + return null; + return getElementProperty((HTMLPropertyDeclaration)edecl); + } + + abstract protected Object getElementProperty(HTMLPropertyDeclaration decl); + } + + /* + * "tagInfo" + * gets documentation for the element + */ + class PPTagInfo extends AbstractElementPropertyProvider { + private final static String htmlAnnotationLoc = "platform:/plugin/org.eclipse.wst.html.core/data/htmref.xml"; //$NON-NLS-1$ + protected AnnotationMap fAnnotationMap = null; + + public PPTagInfo() { + super(); + } + + /** + * Gets the annotationMap. + * @return Returns a AnnotationMap + */ + protected AnnotationMap getAnnotationMap() { + if (fAnnotationMap == null) { + fAnnotationMap = new AnnotationMap(); + try { + fAnnotationMap.load(htmlAnnotationLoc); + } + catch (Exception e) { + // no annotation available + } + } + return fAnnotationMap; + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + if (decl instanceof HTMLElementDeclaration) { + return getAnnotationMap().getProperty(((HTMLElementDeclaration)decl).getElementName(), "tagInfo"); //$NON-NLS-1$ + } else { + return null; + } + } + } + + /* + * "shouldKeepSpace" + */ + class PPShouldKeepSpace extends AbstractElementPropertyProvider { + public PPShouldKeepSpace() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(decl.shouldKeepSpaces()); + } + } + + /* + * "shouldIndentChildSource" + */ + class PPShouldIndentChildSource extends AbstractElementPropertyProvider { + public PPShouldIndentChildSource() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(decl.shouldIndentChildSource()); + } + } + + /* + * "terminators" + */ + class PPTerminators extends AbstractElementPropertyProvider { + public PPTerminators() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + if (! (decl instanceof HTMLElemDeclImpl)) return null; + return ((HTMLElemDeclImpl)decl).getTerminators(); + } + } + + /* + * "prohibitedAncestors" + */ + class PPProhibitedAncestors extends AbstractElementPropertyProvider { + public PPProhibitedAncestors() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return decl.getProhibitedAncestors(); + } + } + + /* + * "isJSP" + */ + class PPIsJSP extends AbstractElementPropertyProvider { + public PPIsJSP() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(decl.isJSP()); + } + } + + /* + * "isXHTML" + * HTMLElementDeclaration itself never represent any XHTML element declaration. + * So, this property must be always false. + */ + class PPIsXHTML extends AbstractElementPropertyProvider { + public PPIsXHTML() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(false); + } + } + + /* + * "isSSI" + * Each declaration class for SSI elements must provide this property itself, + * and then return true. Other declaration must always return false. + */ + class PPIsSSI extends AbstractElementPropertyProvider { + public PPIsSSI() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(false); + } + } + + /* + * "lineBreakHint" + */ + class PPLineBreakHint extends AbstractElementPropertyProvider { + public PPLineBreakHint() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + String hint = HTMLCMProperties.Values.BREAK_NONE; + switch (decl.getLineBreakHint()) { + case HTMLElementDeclaration.BREAK_AFTER_START : + hint = HTMLCMProperties.Values.BREAK_AFTER_START; + break; + case HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END : + hint = HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END; + break; + case HTMLElementDeclaration.BREAK_NONE : + // nothing to do + default : + break; + } + return hint; + } + } + + /* + * "layoutType" + */ + class PPLayoutType extends AbstractElementPropertyProvider { + public PPLayoutType() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + String type = HTMLCMProperties.Values.LAYOUT_NONE; + switch (decl.getLayoutType()) { + case HTMLElementDeclaration.LAYOUT_BLOCK : + type = HTMLCMProperties.Values.LAYOUT_BLOCK; + break; + case HTMLElementDeclaration.LAYOUT_BREAK : + type = HTMLCMProperties.Values.LAYOUT_BREAK; + break; + case HTMLElementDeclaration.LAYOUT_HIDDEN : + type = HTMLCMProperties.Values.LAYOUT_HIDDEN; + break; + case HTMLElementDeclaration.LAYOUT_OBJECT : + type = HTMLCMProperties.Values.LAYOUT_OBJECT; + break; + case HTMLElementDeclaration.LAYOUT_WRAP : + type = HTMLCMProperties.Values.LAYOUT_WRAP; + break; + case HTMLElementDeclaration.LAYOUT_NONE : + // nothing to do. + default : + break; + } + return type; + } + } + + /* + * "omitType" + */ + class PPOmitType extends AbstractElementPropertyProvider { + public PPOmitType() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + String type = HTMLCMProperties.Values.OMIT_NONE; + switch (decl.getOmitType()) { + case HTMLElementDeclaration.OMIT_BOTH : + type = HTMLCMProperties.Values.OMIT_BOTH; + break; + case HTMLElementDeclaration.OMIT_END : + type = HTMLCMProperties.Values.OMIT_END; + break; + case HTMLElementDeclaration.OMIT_END_DEFAULT : + type = HTMLCMProperties.Values.OMIT_END_DEFAULT; + break; + case HTMLElementDeclaration.OMIT_END_MUST : + type = HTMLCMProperties.Values.OMIT_END_MUST; + break; + case HTMLElementDeclaration.OMIT_NONE : + // nothing to do. + default : + break; + } + return type; + } + } + + /* + * "inclusion" + */ + class PPInclusion extends AbstractElementPropertyProvider { + public PPInclusion() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return decl.getInclusion(); + } + } + + public static PropertyProvider getProvider(String propName) { + PropertyProviderFactory factory = getInstance(); + PropertyProvider pp = (PropertyProvider) factory.registry.get(propName); + if (pp != null) + return pp; + + pp = factory.create(propName); + if (pp == null) + return factory.defaultProvider; + + factory.registry.put(propName, pp); + return pp; + } + + private static PropertyProviderFactory instance = null; + + private synchronized static PropertyProviderFactory getInstance() { + if (instance != null) + return instance; + instance = new PropertyProviderFactory(); + return instance; + } + + private Hashtable registry = new Hashtable(); + private PropertyProvider defaultProvider = new DefaultProvider(); + + private PropertyProviderFactory() { + super(); + } + + private PropertyProvider create(String propName) { + PropertyProvider pp = null; + if (propName.equals(HTMLCMProperties.IS_JSP)) + pp = new PPIsJSP(); + else if (propName.equals(HTMLCMProperties.IS_XHTML)) + pp = new PPIsXHTML(); + else if (propName.equals(HTMLCMProperties.IS_SSI)) + pp = new PPIsSSI(); + else if (propName.equals(HTMLCMProperties.LAYOUT_TYPE)) + pp = new PPLayoutType(); + else if (propName.equals(HTMLCMProperties.LINE_BREAK_HINT)) + pp = new PPLineBreakHint(); + else if (propName.equals(HTMLCMProperties.PROHIBITED_ANCESTORS)) + pp = new PPProhibitedAncestors(); + else if (propName.equals(HTMLCMProperties.SHOULD_KEEP_SPACE)) + pp = new PPShouldKeepSpace(); + else if (propName.equals(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)) + pp = new PPShouldIndentChildSource(); + else if (propName.equals(HTMLCMProperties.TERMINATORS)) + pp = new PPTerminators(); + else if (propName.equals(HTMLCMProperties.TAGINFO)) + pp = new PPTagInfo(); + else if (propName.equals(HTMLCMProperties.OMIT_TYPE)) + pp = new PPOmitType(); + else if (propName.equals(HTMLCMProperties.INCLUSION)) + pp = new PPInclusion(); + + return pp; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java new file mode 100644 index 0000000000..ab8d2eac1b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java @@ -0,0 +1,324 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Iterator; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for attribute declarations. + */ +final class AttributeCollection extends CMNamedNodeMapImpl implements CHTMLNamespace { + /** + * constructor. + */ + public AttributeCollection() { + super(); + } + + /** + * Create an attribute declaration. + * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl + * @param attrName java.lang.String + */ + private HTMLAttrDeclImpl create(String attrName) { + HTMLAttrDeclImpl attr = null; + HTMLCMDataTypeImpl atype = null; + + if (attrName.equalsIgnoreCase(ATTR_NAME_ACTION)) { + // (action %URI #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ACTION, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ALT)) { + // (alt %Text; #REQUIRED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ALT, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_BORDER)) { + // (border %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDER, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CHECKED)) { + // (checked (checked) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_CHECKED}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_CHECKED, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_CLEAR)) { + // (clear (left | all | right | none) none) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_ALL, ATTR_VALUE_RIGHT, ATTR_VALUE_NONE}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_NONE); + + attr = new HTMLAttrDeclImpl(ATTR_NAME_CLEAR, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_COLS)) { + // (cols NUMBER #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_COLS, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ENCTYPE)) { + // (enctype %ContentType; "application/x-www-form-urlencoded") + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_WWW_FORM_URLENCODED); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ENCTYPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HEIGHT)) { + // (height %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HREF)) { + // (href %URI; #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HREF, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HSPACE)) { + // (hspace %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HSPACE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_HTTP_EQUIV)) { + // (http-equiv NAME #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME); + attr = new HTMLAttrDeclImpl(ATTR_NAME_HTTP_EQUIV, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MAXLENGTH)) { + // (maxlength NUMBER #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MAXLENGTH, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_METHOD)) { + // (method (GET|POST) GET) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_VALUE_GET, ATTR_VALUE_POST}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_GET); + attr = new HTMLAttrDeclImpl(ATTR_NAME_METHOD, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_MULTIPLE)) { + // (multiple (multiple) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_MULTIPLE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_MULTIPLE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NAME)) { + // (name CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_NOSHADE)) { + // (noshade (noshade) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_NOSHADE}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_NOSHADE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_ROWS)) { + // (rows NUMBER #REQUIRED) + atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + attr = new HTMLAttrDeclImpl(ATTR_NAME_ROWS, atype, CMAttributeDeclaration.REQUIRED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SELECTED)) { + // (selected (selected) #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {ATTR_NAME_SELECTED}; + atype.setEnumValues(values); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SELECTED, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SIZE)) { + // (size %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_SRC)) { + // (src %URI; #IMPLIED) + // NOTE: "src" attributes are defined in several elements. + // The definition of IMG is different from others. + // So, it should be locally defined. + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(ATTR_NAME_SRC, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_TYPE)) { + // (type %CotentType; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE); + attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VALUE)) { + // (value CDATA #IMPLIED) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VERSION)) { + // (version CDATA #FIXED '%HTML.Version;) + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_FIXED, ATTR_VALUE_VERSION_TRANSITIONAL); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VERSION, atype, CMAttributeDeclaration.FIXED); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_WIDTH)) { + // (width %Length; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH); + attr = new HTMLAttrDeclImpl(ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + + } + else if (attrName.equalsIgnoreCase(ATTR_NAME_VSPACE)) { + // (vspace %Pixels; #IMPLIED) + atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS); + attr = new HTMLAttrDeclImpl(ATTR_NAME_VSPACE, atype, CMAttributeDeclaration.OPTIONAL); + + // <<D205514 + } + else { + // unknown attribute; maybe error. + // should warn. + attr = null; + } + + return attr; + } + + /** + * Get %bodycolors; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getBodycolors(CMNamedNodeMapImpl declarations) { + } + + /** + * Get align attribute which has %IAlign; as values.. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public static final HTMLAttrDeclImpl createAlignForImage() { + // align (local) + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values + String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + return attr; + } + + /** + * Create an attribute declaration for <code>align</code> + * in several elements, like <code>P</code>, <code>DIV</code>. + * The values are different from attributes those have the same name + * in other elements (<code>IMG</code> and <code>TABLE</code>). + * So, it can't treat as global attributes. + * <strong>NOTE: These attribute declaration has + * no owner CMDocument instance.</strong> + * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl + */ + public static final HTMLAttrDeclImpl createAlignForParagraph() { + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + // set enum values: left|center|right|justify + String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT,}; + atype.setEnumValues(values); + + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + return attr; + } + + /** + * Get %attrs; declarations. + * %attrs; consists of %coreattrs;, %i18n, and %events;. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getAttrs(CMNamedNodeMapImpl declarations) { + } + + /** + * Get %coreattrs; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getCore(CMNamedNodeMapImpl declarations) { + } + + /** + * Get a global attribute declaration. + * @return com.ibm.sed.contentmodel.html.HTMLAttrributeDeclaration + * @param attrName java.lang.String + */ + public HTMLAttributeDeclaration getDeclaration(String attrName) { + CMNode cmnode = getNamedItem(attrName); + if (cmnode != null) + return (HTMLAttributeDeclaration) cmnode; // already exists. + + HTMLAttrDeclImpl dec = create(attrName); + if (dec != null) + putNamedItem(attrName, dec); + + return dec; + } + + /** + * Get declarations which are specified by names. + * @param declarations com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + * @param names java.util.Iterator + */ + public void getDeclarations(CMNamedNodeMapImpl declarations, Iterator names) { + while (names.hasNext()) { + String attrName = (String) names.next(); + HTMLAttributeDeclaration dec = getDeclaration(attrName); + if (dec != null) + declarations.putNamedItem(attrName, dec); + } + } + + /** + * Get %events; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getEvents(CMNamedNodeMapImpl declarations) { + } + + /** + * Get %i18n; declarations. + * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl + */ + public void getI18n(CMNamedNodeMapImpl declarations) { + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java new file mode 100644 index 0000000000..6627ae8ac8 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLEntityDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * CMDocument implementation for the HTML. + */ +public class CHCMDocImpl extends CMNodeImpl implements HTMLCMDocument { + + /** Namespace for all names of elements, entities and attributes. */ + private CMNamespace namespace = null; + private ElementCollection elements = null; + private EntityCollection entities = null; + private AttributeCollection attributes = null; + + /** + */ + public CHCMDocImpl(String docTypeName, CMNamespace targetNamespace) { + super(docTypeName); + namespace = targetNamespace; + attributes = new AttributeCollection(); + elements = new ElementCollection(attributes); + entities = new EntityCollection(); + } + + /** + * @return com.ibm.sed.contentmodel.html.AttributeCollection + */ + AttributeCollection getAttributes() { + return attributes; + } + + /** + * @see com.ibm.sed.contentmodel.html.HTMLCMDocument + */ + public HTMLElementDeclaration getElementDeclaration(String elementName) { + if (elements == null) + return null; + return (HTMLElementDeclaration) elements.getNamedItem(elementName); + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamedNodeMap getElements() { + return elements; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public CMNamedNodeMap getEntities() { + return entities; + } + + /** + * @see com.ibm.sed.contentmodel.html.HTMLCMDocument + */ + public HTMLEntityDeclaration getEntityDeclaration(String entityName) { + if (entities == null) + return null; + return (HTMLEntityDeclaration) entities.getNamedItem(entityName); + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument + */ + public org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace getNamespace() { + return namespace; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + public int getNodeType() { + return CMNode.DOCUMENT; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java new file mode 100644 index 0000000000..3aa8424ac2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java @@ -0,0 +1,152 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.HTML40Namespace; + + + +/** + * Provide all names defined in the HTML 4.0? specification. + */ +public interface CHTMLNamespace { + + // Element names + public static interface ElementName { + public static final String A = HTML40Namespace.ElementName.A; + public static final String ADDRESS = HTML40Namespace.ElementName.ADDRESS; + public static final String BASE = HTML40Namespace.ElementName.BASE; + public static final String BLOCKQUOTE = HTML40Namespace.ElementName.BLOCKQUOTE; + public static final String BODY = HTML40Namespace.ElementName.BODY; + public static final String BR = HTML40Namespace.ElementName.BR; + public static final String CENTER = HTML40Namespace.ElementName.CENTER; + public static final String DD = HTML40Namespace.ElementName.DD; + public static final String DIR = HTML40Namespace.ElementName.DIR; + public static final String DIV = HTML40Namespace.ElementName.DIV; + public static final String DL = HTML40Namespace.ElementName.DL; + public static final String DT = HTML40Namespace.ElementName.DT; + public static final String FORM = HTML40Namespace.ElementName.FORM; + public static final String H1 = HTML40Namespace.ElementName.H1; + public static final String H2 = HTML40Namespace.ElementName.H2; + public static final String H3 = HTML40Namespace.ElementName.H3; + public static final String H4 = HTML40Namespace.ElementName.H4; + public static final String H5 = HTML40Namespace.ElementName.H5; + public static final String H6 = HTML40Namespace.ElementName.H6; + public static final String HEAD = HTML40Namespace.ElementName.HEAD; + public static final String HR = HTML40Namespace.ElementName.HR; + public static final String HTML = HTML40Namespace.ElementName.HTML; + public static final String IMG = HTML40Namespace.ElementName.IMG; + public static final String INPUT = HTML40Namespace.ElementName.INPUT; + public static final String LI = HTML40Namespace.ElementName.LI; + public static final String MENU = HTML40Namespace.ElementName.MENU; + public static final String META = HTML40Namespace.ElementName.META; + public static final String OL = HTML40Namespace.ElementName.OL; + public static final String OPTION = HTML40Namespace.ElementName.OPTION; + public static final String P = HTML40Namespace.ElementName.P; + public static final String PRE = HTML40Namespace.ElementName.PRE; + public static final String SELECT = HTML40Namespace.ElementName.SELECT; + public static final String TEXTAREA = HTML40Namespace.ElementName.TEXTAREA; + public static final String TITLE = HTML40Namespace.ElementName.TITLE; + public static final String UL = HTML40Namespace.ElementName.UL; + public static final String SSI_CONFIG = HTML40Namespace.ElementName.SSI_CONFIG; + public static final String SSI_ECHO = HTML40Namespace.ElementName.SSI_ECHO; + public static final String SSI_EXEC = HTML40Namespace.ElementName.SSI_EXEC; + public static final String SSI_FSIZE = HTML40Namespace.ElementName.SSI_FSIZE; + public static final String SSI_FLASTMOD = HTML40Namespace.ElementName.SSI_FLASTMOD; + public static final String SSI_INCLUDE = HTML40Namespace.ElementName.SSI_INCLUDE; + public static final String SSI_PRINTENV = HTML40Namespace.ElementName.SSI_PRINTENV; + public static final String SSI_SET = HTML40Namespace.ElementName.SSI_SET; + } + + // Character Entities + public static interface EntityName { + } + + // global attribute names + public static final String ATTR_NAME_VERSION = HTML40Namespace.ATTR_NAME_VERSION; + public static final String ATTR_NAME_SRC = HTML40Namespace.ATTR_NAME_SRC; + public static final String ATTR_NAME_ALT = HTML40Namespace.ATTR_NAME_ALT; + public static final String ATTR_NAME_HEIGHT = HTML40Namespace.ATTR_NAME_HEIGHT; + public static final String ATTR_NAME_WIDTH = HTML40Namespace.ATTR_NAME_WIDTH; + public static final String ATTR_NAME_ALIGN = HTML40Namespace.ATTR_NAME_ALIGN; + public static final String ATTR_NAME_BORDER = HTML40Namespace.ATTR_NAME_BORDER; + public static final String ATTR_NAME_HSPACE = HTML40Namespace.ATTR_NAME_HSPACE; + public static final String ATTR_NAME_VSPACE = HTML40Namespace.ATTR_NAME_VSPACE; + public static final String ATTR_NAME_NAME = HTML40Namespace.ATTR_NAME_NAME; + public static final String ATTR_NAME_CLEAR = HTML40Namespace.ATTR_NAME_CLEAR; + public static final String ATTR_NAME_NOSHADE = HTML40Namespace.ATTR_NAME_NOSHADE; + public static final String ATTR_NAME_CHECKED = HTML40Namespace.ATTR_NAME_CHECKED; + public static final String ATTR_NAME_MAXLENGTH = HTML40Namespace.ATTR_NAME_MAXLENGTH; + public static final String ATTR_NAME_ISTYLE = HTML40Namespace.ATTR_NAME_ISTYLE; + public static final String ATTR_NAME_HTTP_EQUIV = HTML40Namespace.ATTR_NAME_HTTP_EQUIV; + public static final String ATTR_NAME_CONTENT = HTML40Namespace.ATTR_NAME_CONTENT; + + public static final String ATTR_NAME_HREF = HTML40Namespace.ATTR_NAME_HREF; + public static final String ATTR_NAME_MULTIPLE = HTML40Namespace.ATTR_NAME_MULTIPLE; + public static final String ATTR_NAME_SELECTED = HTML40Namespace.ATTR_NAME_SELECTED; + public static final String ATTR_NAME_ROWS = HTML40Namespace.ATTR_NAME_ROWS; + public static final String ATTR_NAME_COLS = HTML40Namespace.ATTR_NAME_COLS; + public static final String ATTR_NAME_ACTION = HTML40Namespace.ATTR_NAME_ACTION; + public static final String ATTR_NAME_METHOD = HTML40Namespace.ATTR_NAME_METHOD; + public static final String ATTR_NAME_ENCTYPE = HTML40Namespace.ATTR_NAME_ENCTYPE; + public static final String ATTR_NAME_SIZE = HTML40Namespace.ATTR_NAME_SIZE; + public static final String ATTR_NAME_TYPE = HTML40Namespace.ATTR_NAME_TYPE; + public static final String ATTR_NAME_VALUE = HTML40Namespace.ATTR_NAME_VALUE; + + + + public static final String ATTR_NAME_ERRMSG = HTML40Namespace.ATTR_NAME_ERRMSG; + public static final String ATTR_NAME_SIZEFMT = HTML40Namespace.ATTR_NAME_SIZEFMT; + public static final String ATTR_NAME_TIMEFMT = HTML40Namespace.ATTR_NAME_TIMEFMT; + public static final String ATTR_NAME_VAR = HTML40Namespace.ATTR_NAME_VAR; + public static final String ATTR_NAME_CGI = HTML40Namespace.ATTR_NAME_CGI; + public static final String ATTR_NAME_CMD = HTML40Namespace.ATTR_NAME_CMD; + public static final String ATTR_NAME_FILE = HTML40Namespace.ATTR_NAME_FILE; + public static final String ATTR_NAME_VIRTUAL = HTML40Namespace.ATTR_NAME_VIRTUAL; + + // global attribute values; mainly used in enumeration. + public static final String ATTR_VALUE_VERSION_TRANSITIONAL = "-//W3C//DTD Compact HTML 1.0 Draft//EN"; //$NON-NLS-1$ + // for align (top|middle|bottom|left|right) + public static final String ATTR_VALUE_TOP = HTML40Namespace.ATTR_VALUE_TOP; + public static final String ATTR_VALUE_MIDDLE = HTML40Namespace.ATTR_VALUE_MIDDLE; + public static final String ATTR_VALUE_BOTTOM = HTML40Namespace.ATTR_VALUE_BOTTOM; + public static final String ATTR_VALUE_LEFT = HTML40Namespace.ATTR_VALUE_LEFT; + public static final String ATTR_VALUE_CENTER = HTML40Namespace.ATTR_VALUE_CENTER; + public static final String ATTR_VALUE_RIGHT = HTML40Namespace.ATTR_VALUE_RIGHT; + // for clear (left|all|right|none): left and right are already defined above. + public static final String ATTR_VALUE_ALL = HTML40Namespace.ATTR_VALUE_ALL; + public static final String ATTR_VALUE_NONE = HTML40Namespace.ATTR_VALUE_NONE; + // for type of INPUT + // (text | password | checkbox | radio | submit | reset | + // file | hidden | image | button) + public static final String ATTR_VALUE_TEXT = HTML40Namespace.ATTR_VALUE_TEXT; + public static final String ATTR_VALUE_PASSWORD = HTML40Namespace.ATTR_VALUE_PASSWORD; + public static final String ATTR_VALUE_CHECKBOX = HTML40Namespace.ATTR_VALUE_CHECKBOX; + public static final String ATTR_VALUE_RADIO = HTML40Namespace.ATTR_VALUE_RADIO; + public static final String ATTR_VALUE_SUBMIT = HTML40Namespace.ATTR_VALUE_SUBMIT; + public static final String ATTR_VALUE_RESET = HTML40Namespace.ATTR_VALUE_RESET; + public static final String ATTR_VALUE_HIDDEN = HTML40Namespace.ATTR_VALUE_HIDDEN; + // for span, colspan, rowspan + public static final String ATTR_VALUE_1 = HTML40Namespace.ATTR_VALUE_1; + // for frameborder + public static final String ATTR_VALUE_0 = HTML40Namespace.ATTR_VALUE_0; + // for method of FORM + public static final String ATTR_VALUE_GET = HTML40Namespace.ATTR_VALUE_GET; + public static final String ATTR_VALUE_POST = HTML40Namespace.ATTR_VALUE_POST; + public static final String ATTR_VALUE_WWW_FORM_URLENCODED = HTML40Namespace.ATTR_VALUE_WWW_FORM_URLENCODED; + // for behaviro of MARQUEE + public static final String ATTR_VALUE_SCROLL = HTML40Namespace.ATTR_VALUE_SCROLL; + public static final String ATTR_VALUE_SLIDE = HTML40Namespace.ATTR_VALUE_SLIDE; + public static final String ATTR_VALUE_ALTERNATE = HTML40Namespace.ATTR_VALUE_ALTERNATE; + // for direction of MARQUEE + public static final String ATTR_VALUE_UP = HTML40Namespace.ATTR_VALUE_UP; + public static final String ATTR_VALUE_DOWN = HTML40Namespace.ATTR_VALUE_DOWN; +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java new file mode 100644 index 0000000000..28b7966b9d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +/** + * Implementation of CMContent for HTML CM. + */ +abstract class CMContentImpl extends CMNodeImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMContent { + + public static final int UNBOUNDED = -1; + /** -1: it's UNBOUNDED. */ + private int maxOccur = UNBOUNDED; + /** 0: it's OPTIONAL, 1, it's REQUIRED. */ + private int minOccur = 0; + + /** + * The primary consturctor. + * Use this one for usual cases.<br> + */ + public CMContentImpl(String name, int min, int max) { + super(name); + minOccur = min; + maxOccur = max; + } + + /** + * getMaxOccur method + * @return int + * + * If -1, it's UNBOUNDED. + */ + public int getMaxOccur() { + return maxOccur; + } + + /** + * getMinOccur method + * @return int + * + * If 0, it's OPTIONAL. + * If 1, it's REQUIRED. + */ + public int getMinOccur() { + return minOccur; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java new file mode 100644 index 0000000000..812b3ed3dc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList; + +/** + */ +class CMGroupImpl extends CMContentImpl implements CMGroup { + + private int operator = CMGroup.SEQUENCE; + private CMNodeListImpl children = null; + + /** + * CMGroupImpl constructor comment. + */ + public CMGroupImpl(int op, int minOccur, int maxOccur) { + super(null, minOccur, maxOccur); + switch (op) { + case CMGroup.ALL : + case CMGroup.CHOICE : + case CMGroup.SEQUENCE : + operator = op; + break; + default : + // should warn. + break; + } + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + protected CMNode appendChild(CMNode child) { + if (child == null) + return null; + if (children == null) + children = new CMNodeListImpl(); + return children.appendNode(child); + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList + */ + public CMNodeList getChildNodes() { + return children; + } + + /** + * getNodeType method + * @return int + * + * Returns one of : + * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION. + */ + public int getNodeType() { + return CMNode.GROUP; + } + + /** + * getOperation method + * @return int + * + * Returns one of : + * ALONE (a), SEQUENCE (a,b), CHOICE (a|b), ALL (a&b). + */ + public int getOperator() { + return operator; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java new file mode 100644 index 0000000000..a32cdfdba6 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Iterator; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * An implementation of the CMNamedNodeMap interface. + * This class is intented to be used as a container of attribute declarations. + * If someone wants to use this class for other purpose, he must pay attention + * to the fact that this class is tolerant of the key name case. That is, this + * class does not distinguish "name", "NAME", and "Name" as a key name. + */ +class CMNamedNodeMapImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap { + + private java.util.Hashtable items = null; + + /** + */ + public CMNamedNodeMapImpl() { + super(); + items = new java.util.Hashtable(); + } + + /** + * getLength method + * @return int + */ + public int getLength() { + return items.size(); + } + + /** + * getNamedItem method + * @return CMNode <code>null</code> for unknown keys. + * @param name java.lang.String + */ + public CMNode getNamedItem(String name) { + String cookedName = makeCanonicalForm(name); + if (!items.containsKey(cookedName)) + return null; + return (CMNode) items.get(cookedName); + } + + /** + * item method + * @return CMNode + * @param index int + */ + public CMNode item(int index) { + Iterator iter = iterator(); + while (iter.hasNext()) { + CMNode node = (CMNode) iter.next(); + if (--index < 0) + return node; + } + return null; + } + + /** + * @return java.util.Iterator + */ + public Iterator iterator() { + return items.values().iterator(); + } + + /** + * @return java.lang.String + * @param rawForm java.lang.String + */ + private String makeCanonicalForm(String rawForm) { + return rawForm.toUpperCase(); + } + + /** + * @param key java.lang.String + * @param item java.lang.String + */ + void putNamedItem(String name, CMNode item) { + String cookedName = makeCanonicalForm(name); + if (items.containsKey(cookedName)) + return; // already registered. + items.put(cookedName, item); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java new file mode 100644 index 0000000000..fb242d68e5 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.HTMLCMProperties; + + + +/** + */ +abstract class CMNodeImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMNode { + + private java.lang.String name = null; + + /** + * CMNodeImpl constructor comment. + */ + public CMNodeImpl(String nm) { + super(); + name = nm; + } + + /** + * getNodeName method + * @return java.lang.String + */ + public String getNodeName() { + return name; + } + + /** + * getProperty method + * @return java.lang.Object + * + * Returns the object property desciped by the propertyName + * + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.IS_XHTML)) + return new Boolean(false); + return null; + } + + /** + * supports method + * @return boolean + * + * Returns true if the CMNode supports a specified property + * + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.IS_XHTML)) + return true; + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java new file mode 100644 index 0000000000..80581b0149 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Analog of dom.NodeList for CM. + * So, the implementation is very similar to + * {@link com.ibm.sed.model.xml.NodeListImpl}.<br> + */ +class CMNodeListImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList { + + private java.util.Vector nodes = null; + + /** + * CMNodeListImpl constructor comment. + */ + public CMNodeListImpl() { + super(); + nodes = new java.util.Vector(); + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param node org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + protected CMNode appendNode(CMNode node) { + nodes.addElement(node); + return node; + } + + /** + * getLength method + * @return int + */ + public int getLength() { + return nodes.size(); + } + + /** + * item method + * @return CMNode + * @param index int + */ + public CMNode item(int index) { + if (index < 0 || index >= nodes.size()) + return null; + return (CMNode) nodes.elementAt(index); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java new file mode 100644 index 0000000000..a5ce36c636 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * This class is intended to represent a complex type definition + * in XML Schema.<br> + */ +abstract class ComplexTypeDefinition { + + protected CMGroupImpl content = null; + protected ElementCollection collection = null; + protected String primaryCandidateName = null; + + /** + * ComplexTypeDefinition constructor comment. + */ + public ComplexTypeDefinition(ElementCollection elementCollection) { + super(); + collection = elementCollection; + createContent(); + } + + /** + * Create an actual content model. + * This method should be called once and only once in the constructor.<br> + */ + protected abstract void createContent(); + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMGroup + */ + public CMGroup getContent() { + return content; + } + + /** + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + /* NOTE: Do we need LOGICAL type? + * -- 3/7/2001 + */ + public abstract int getContentType(); + + /** + * Get content hint. + * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public HTMLElementDeclaration getPrimaryCandidate() { + if (primaryCandidateName == null) + return null; + return (HTMLElementDeclaration) collection.getNamedItem(primaryCandidateName); + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public abstract String getTypeName(); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java new file mode 100644 index 0000000000..02e1081879 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +/** + * Factory of ComplexTypeDefinition. + */ +final class ComplexTypeDefinitionFactory { + + private static ComplexTypeDefinitionFactory instance = null; + private java.util.Hashtable definitions = null; + // constants for complex type name + /** for ADDRESS. */ + public final static String CTYPE_ADDRESS = "CTYPE_ADDRESS";//$NON-NLS-1$ + /** CDATA content. No ComplexTypeDefinition instance shuld be created. */ + public final static String CTYPE_CDATA = "CTYPE_CDATA";//$NON-NLS-1$ + /** col group content. COL* */ + public final static String CTYPE_COLUMN_GROUP = "CTYPE_COLUMN_GROUP";//$NON-NLS-1$ + /** for DL. */ + public final static String CTYPE_DEFINITION_LIST = "CTYPE_DEFINITION_LIST";//$NON-NLS-1$ + /** for EMBED. */ + public final static String CTYPE_EMBED = "CTYPE_EMBED";//$NON-NLS-1$ + /** empty content. No ComplexTypeDefinition instance should be created. */ + public final static String CTYPE_EMPTY = "CTYPE_EMPTY";//$NON-NLS-1$ + /** for FIELDSET. */ + public final static String CTYPE_FIELDSET = "CTYPE_FIELDSET";//$NON-NLS-1$ + /** for FRAMESET. */ + public final static String CTYPE_FRAMESET = "CTYPE_FRAMESET";//$NON-NLS-1$ + /** flow content. (%flow;)* */ + public final static String CTYPE_FLOW_CONTAINER = "CTYPE_FLOW_CONTAINER";//$NON-NLS-1$ + /** html content. HEAD, (FRAMESET|BODY) */ + public final static String CTYPE_HTML = "CTYPE_HTML";//$NON-NLS-1$ + /** head content. TITLE & ISINDEX? & BASE? */ + public final static String CTYPE_HEAD = "CTYPE_HEAD";//$NON-NLS-1$ + /** inline content. (%inline;)* */ + public final static String CTYPE_INLINE_CONTAINER = "CTYPE_INLINE_CONTAINER";//$NON-NLS-1$ + /** list item container. (LI)+ */ + public final static String CTYPE_LI_CONTAINER = "CTYPE_LI_CONTAINER";//$NON-NLS-1$ + /** for MAP. */ + public final static String CTYPE_MAP = "CTYPE_MAP";//$NON-NLS-1$ + /** noframes content. */ + public final static String CTYPE_NOFRAMES_CONTENT = "CTYPE_NOFRAMES_CONTENT";//$NON-NLS-1$ + /** for OPTGROUP. */ + public final static String CTYPE_OPTION_CONTAINER = "CTYPE_OPTION_CONTAINER";//$NON-NLS-1$ + /** param container. For OBJECT/APPLET. */ + public final static String CTYPE_PARAM_CONTAINER = "CTYPE_PARAM_CONTAINER";//$NON-NLS-1$ + /** PCDATA content. No ComplexTypeDefinition instance shuld be created. */ + public final static String CTYPE_PCDATA = "CTYPE_PCDATA";//$NON-NLS-1$ + /** for SELECT. */ + public final static String CTYPE_SELECT = "CTYPE_SELECT";//$NON-NLS-1$ + /** table content. CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+ */ + public final static String CTYPE_TABLE = "CTYPE_TABLE";//$NON-NLS-1$ + /** table cell contaier. (TH|TD)+ */ + public final static String CTYPE_TCELL_CONTAINER = "CTYPE_TCELL_CONTAINER";//$NON-NLS-1$ + /** table record container. (TR)+ */ + public final static String CTYPE_TR_CONTAINER = "CTYPE_TR_CONTAINER";//$NON-NLS-1$ + + /** + * ComplexTypeDefinitionFactory constructor comment. + */ + private ComplexTypeDefinitionFactory() { + super(); + definitions = new java.util.Hashtable(); + } + + /** + * Factory method for ComplexTypeDefinition. + * Each instance created in this method must be registered into + * the map with its name. + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition + * @param definitionName java.lang.String + * @param elementCollection ElementCollection + */ + public ComplexTypeDefinition createTypeDefinition(String definitionName, ElementCollection elementCollection) { + if (definitions.containsKey(definitionName)) { + return (ComplexTypeDefinition) definitions.get(definitionName); + } + + ComplexTypeDefinition def = null; + if (definitionName == CTYPE_ADDRESS) { + def = new CtdAddress(elementCollection); + + } + else if (definitionName == CTYPE_DEFINITION_LIST) { + def = new CtdDl(elementCollection); + + } + else if (definitionName == CTYPE_FLOW_CONTAINER) { + def = new CtdFlowContainer(elementCollection); + + } + else if (definitionName == CTYPE_HEAD) { + def = new CtdHead(elementCollection); + + } + else if (definitionName == CTYPE_HTML) { + def = new CtdHtml(elementCollection); + + } + else if (definitionName == CTYPE_INLINE_CONTAINER) { + def = new CtdInlineContainer(elementCollection); + + } + else if (definitionName == CTYPE_LI_CONTAINER) { + def = new CtdLiContainer(elementCollection); + + + } + else if (definitionName == CTYPE_OPTION_CONTAINER) { + def = new CtdOptionContainer(elementCollection); + + } + else if (definitionName == CTYPE_SELECT) { + def = new CtdSelect(elementCollection); + + } + else { + def = null; + } + if (def == null) + return null; // fail to create. + definitions.put(definitionName, def); + return def; + } + + /** + * For singleton.<br> + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinitionFactory + */ + public synchronized static ComplexTypeDefinitionFactory getInstance() { + if (instance != null) + return instance; + instance = new ComplexTypeDefinitionFactory(); + return instance; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java new file mode 100644 index 0000000000..84796f4af4 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for ADDRESS. + */ +final class CtdAddress extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdAddress(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * ((%inline) | P)*. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )* + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + // (%inline) + CMGroupImpl inlines = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (inlines == null) + return; + collection.getInline(inlines); + content.appendChild(inlines); + // P + CMNode p = collection.getNamedItem(CHTMLNamespace.ElementName.P); + if (p != null) + content.appendChild(p); + } + + /** + * ((%inline) | P)*. + * Because %inline; contains #PCDATA, the type is MIXED. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_ADDRESS; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java new file mode 100644 index 0000000000..dcfb159a3d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for DL. + */ +final class CtdDl extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdDl(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = CHTMLNamespace.ElementName.DT; + } + + /** + * (DT | DD)+ + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )+ + content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + // DT + CMNode dec = collection.getNamedItem(CHTMLNamespace.ElementName.DT); + if (dec != null) + content.appendChild(dec); + // DD + dec = collection.getNamedItem(CHTMLNamespace.ElementName.DD); + if (dec != null) + content.appendChild(dec); + } + + /** + * (DT | DD)+. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java new file mode 100644 index 0000000000..99e4bf99a1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * Complex type definition for containers of <code>%flow;</code>. + */ +final class CtdFlowContainer extends ComplexTypeDefinition { + + /** + */ + public CtdFlowContainer(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * (%flow;)* + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + collection.getFlow(content); + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java new file mode 100644 index 0000000000..c54ae883ac --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java @@ -0,0 +1,175 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Complex type definition for the head content. + * Content Model: (TITLE & ISINDEX? & BASE?) + */ +final class CtdHead extends ComplexTypeDefinition { + + /** + */ + public CtdHead(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = CHTMLNamespace.ElementName.TITLE; + } + + /** + * for HEAD. + * To avoid using inclusion, the content model comes from the XHTML 1.0. + * + * (%head.misc;, ((title, %head.misc;, (base, %head.misc;)?) | (base, %head.misc;, (title, %head.misc;)))) + * And %head.misc; is: + * (script|style|meta|link|object|isindex)* + * + * 0: (%head.misc, A) + * A: (B | C) + * B: (title, %head.misc;, D) + * C: (base, %head.misc;, E) + * D: (base, %head.misc;)? + * E: (title, %head.misc;) + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // At 1st, create %head.misc; content. + // %head.misc; + // ( | )* + CMGroupImpl misc = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + if (misc == null) + return; + String[] names = {CHTMLNamespace.ElementName.META,}; + collection.getDeclarations(misc, Arrays.asList(names).iterator()); + // 2nd, get a title + CMNode title = collection.getNamedItem(CHTMLNamespace.ElementName.TITLE); + // 3rd, get a base + CMNode base = collection.getNamedItem(CHTMLNamespace.ElementName.BASE); + if (title == null || base == null) + return; + + // Top level content is a sequence of %head.misc; and A. + // 0: (%head.misc;, A) + // create a sequence + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (content == null) + return; + // append %head.misc; + content.appendChild(misc); + // create A and append it to the top level. + { + // A is a choice of B and C. + // A: (B | C) + // create a choice + CMGroupImpl gA = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + if (gA == null) + return; + // append A to the top level. + content.appendChild(gA); + + // create B and append it to A + { + // B is a sequence of title, %head.misc;, and D. + // B: (title, %head.misc;, D) + // create a sequence + CMGroupImpl gB = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (gB == null) + return; + // append B to A. + gA.appendChild(gB); + + // append title to B + gB.appendChild(title); + // append %head.misc; to B + gB.appendChild(misc); + // create D and append it to B. + { + // D is a sequence of base, %head.misc;. + // D: (base, %head.misc;)? + // create a sequence + CMGroupImpl gD = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1); + if (gD == null) + return; + // append D to B. + gB.appendChild(gD); + + // append base to D + gD.appendChild(base); + // append %head.misc; to D. + gD.appendChild(misc); + } + } + // create C and append it to A + { + // C is a sequence of base, %head.misc;, and E + // C: (base, %head.misc;, E) + // create a sequence + CMGroupImpl gC = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (gC == null) + return; + // append C to A. + gA.appendChild(gC); + + // append base to C + gC.appendChild(base); + // append %head.misc; to C + gC.appendChild(misc); + + // create E and append it to C. + { + // E is a sequence of title and %head.misc;. + // E: (title, %head.misc;) + // create a sequence + CMGroupImpl gE = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (gE == null) + return; + // append E to C. + gC.appendChild(gE); + + // append title to E + gE.appendChild(title); + // append %head.misc; to E. + gE.appendChild(misc); + } + } + } + } + + /** + * Element content.<br> + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_HEAD; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java new file mode 100644 index 0000000000..5887c64928 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Complex type definition for <code>HTML</code>.<br> + * Content Model: + * HEAD, (FRAMESET|BODY)<br> + */ +final class CtdHtml extends ComplexTypeDefinition { + + /** + */ + public CtdHtml(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = CHTMLNamespace.ElementName.HEAD; + } + + /** + * (%html.content;). + * %html.content; is HEAD, (FRAMESET | BODY). + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( ) + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1); + if (content == null) + return; + + // HEAD + CMNode edec = collection.getNamedItem(CHTMLNamespace.ElementName.HEAD); + if (edec != null) + content.appendChild(edec); + + // ( | ) + CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + content.appendChild(group); + + // FRAMESET, BODY + String[] names = {CHTMLNamespace.ElementName.BODY}; + collection.getDeclarations(group, Arrays.asList(names).iterator()); + } + + /** + * Element content. + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_HTML; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java new file mode 100644 index 0000000000..92293d4603 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * Complex type definition for (%inline;)*. + */ +final class CtdInlineContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdInlineContainer(ElementCollection elementCollection) { + super(elementCollection); + } + + /** + * (%inline)*. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED); + collection.getInline(content); + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public int getContentType() { + return CMElementDeclaration.MIXED; + } + + /** + * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java new file mode 100644 index 0000000000..8e4716a019 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * List item container. + * (LI)+ + */ +final class CtdLiContainer extends ComplexTypeDefinition { + + /** + * @param elemenCollection ElementCollection + */ + public CtdLiContainer(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = CHTMLNamespace.ElementName.LI; + } + + /** + * (LI)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // (LI)+ + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + CMNode li = collection.getNamedItem(CHTMLNamespace.ElementName.LI); + if (li != null) + content.appendChild(li); + } + + /** + * ELEMENT content.<br> + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java new file mode 100644 index 0000000000..b1e0a5496c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * OPTION container. + * (OPTION)+ + */ +final class CtdOptionContainer extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdOptionContainer(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = CHTMLNamespace.ElementName.OPTION; + } + + /** + * (OPTION)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( )+ + content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED); + // OPTION + CMNode dec = collection.getNamedItem(CHTMLNamespace.ElementName.OPTION); + if (dec != null) + content.appendChild(dec); + } + + /** + * (OPTION)+ + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * Name of complex type definition. + * Each singleton must know its own name. + * All names should be defined in + * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br> + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_OPTION_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java new file mode 100644 index 0000000000..cc0d61ed69 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * for SELECT. + */ +final class CtdSelect extends ComplexTypeDefinition { + + /** + * @param elementCollection ElementCollection + */ + public CtdSelect(ElementCollection elementCollection) { + super(elementCollection); + primaryCandidateName = CHTMLNamespace.ElementName.OPTION; + } + + /** + * (OPTGROUP | OPTION)+. + */ + protected void createContent() { + if (content != null) + return; // already created. + if (collection == null) + return; + + // ( | )+ + content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED); + // OPTION + CMNode dec = collection.getNamedItem(CHTMLNamespace.ElementName.OPTION); + if (dec != null) + content.appendChild(dec); + } + + /** + * (OPTGROUP | OPTION)+. + * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA, + * those are defined in CMElementDeclaration. + */ + public int getContentType() { + return CMElementDeclaration.ELEMENT; + } + + /** + * @return java.lang.String + */ + public String getTypeName() { + return ComplexTypeDefinitionFactory.CTYPE_SELECT; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java new file mode 100644 index 0000000000..30b6beaa58 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java @@ -0,0 +1,238 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.HashMap; +import java.util.Iterator; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + */ +abstract class DeclCollection implements CMNamedNodeMap { + + + protected class DualMap { + public DualMap() { + super(); + } + + public DualMap(Object[] objects) { + super(); + initialize(objects); + } + + public int size() { + return table.length; + } + + public Object getValue(int key) { + if (!isValidIndex(key)) + return null; + return table[key]; + } + + public int getKey(Object value) { + Integer keyObj = (Integer) map.get(value); + if (keyObj == null) + return ID_UNKNOWN; + return keyObj.intValue(); + } + + protected void initialize(Object[] objects) { + if (objects == null) + return; + table = objects; + map = new HashMap(); + for (int key = 0; key < objects.length; key++) { + Object value = table[key]; + map.put(value, new Integer(key)); + } + } + + private Object[] table = null; + private HashMap map = null; + + private boolean isValidIndex(int index) { + return index >= 0 && index < table.length; + } + } + + protected class TolerantStringDualMap extends DualMap { + public TolerantStringDualMap(String[] names) { + super(); + Object[] objects = new Object[names.length]; + for (int i = 0; i < names.length; i++) { + objects[i] = makeCanonicalForm(names[i]); + } + initialize(objects); + } + + public int getKey(Object value) { + try { + String name = (String) value; + return super.getKey(makeCanonicalForm(name)); + } + catch (ClassCastException e) { + return ID_UNKNOWN; + } + } + + private String makeCanonicalForm(String raw) { + return raw.toUpperCase(); + } + } + + private class DeclIterator implements Iterator { + public DeclIterator() { + maxid = fDecls.length - 1; + } + + public boolean hasNext() { + return id < maxid; + } + + public Object next() { + if (!hasNext()) + return null; + return item(++id); + } + + public void remove() { /* nothing should be done. */ + } + + private int id = -1; + private int maxid = -1; + } + + CMNode[] fDecls = null; + protected final static boolean STRICT_CASE = false; + protected final static boolean TOLERANT_CASE = true; + protected final static int ID_UNKNOWN = -1; + private DualMap fMap = null; + + /** + */ + public DeclCollection(String[] names, boolean tolerant) { + super(); + fDecls = new CMNode[names.length]; + if (tolerant) { + fMap = new TolerantStringDualMap(names); + } + else { + fMap = new DualMap(names); + } + } + + /** + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param id int + */ + protected abstract CMNode create(String name); + + /** + */ + public CMNamedNodeMap getDeclarations(String[] names) { + CMNamedNodeMapImpl map = new CMNamedNodeMapImpl(); + for (int i = 0; i < names.length; i++) { + String name = names[i]; + CMNode node = getNamedItem(name); + if (node == null) + continue; + map.putNamedItem(name, node); + } + return map; + } + + /** + * @param declarations com.ibm.sed.contentmodel.html.CMGroupImpl + * @param names java.util.Iterator + */ + public void getDeclarations(CMGroupImpl group, Iterator names) { + while (names.hasNext()) { + String entityName = (String) names.next(); + CMNode dec = getNamedItem(entityName); + if (dec != null) + group.appendChild(dec); + } + } + + /** + * Map name to id. + * @return int + * @param name java.lang.String + */ + protected int getID(String name) { + return fMap.getKey(name); + } + + /** + * getLength method + * @return int + */ + public int getLength() { + return fDecls.length; + } + + /** + * @return java.lang.String + * @param id int + */ + protected String getName(int id) { + return (String) fMap.getValue(id); + } + + /** + * getNamedItem method + * @return CMNode + * @param name java.lang.String + */ + public CMNode getNamedItem(String name) { + int id = getID(name); + if (!isValidID(id)) + return null; + return item(id); + } + + /** + * @return boolean + * @param id int + */ + private boolean isValidID(int id) { + return id >= 0 && id < fDecls.length; + } + + /** + * item method + * @return CMNode + * @param index int + */ + public CMNode item(int index) { + if (!isValidID(index)) + return null; + CMNode decl = fDecls[index]; + if (decl != null) + return decl; // already exist. + + decl = create(getName(index)); + fDecls[index] = decl; + return decl; + } + + /** + */ + public Iterator iterator() { + return new DeclIterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java new file mode 100644 index 0000000000..826be12f3b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java @@ -0,0 +1,495 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.Vector; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for element declarations. + */ +final class ElementCollection extends DeclCollection implements org.eclipse.wst.html.core.HTML40Namespace.ElementName { + + + // Element IDs + private static class Ids { + public static final int ID_A = 0; + public static final int ID_ADDRESS = 1; + public static final int ID_BASE = 2; + public static final int ID_BLOCKQUOTE = 3; + public static final int ID_BODY = 4; + public static final int ID_BR = 5; + public static final int ID_CENTER = 6; + public static final int ID_DD = 7; + public static final int ID_DIR = 8; + public static final int ID_DIV = 9; + public static final int ID_DL = 10; + public static final int ID_DT = 11; + public static final int ID_FORM = 12; + public static final int ID_H1 = 13; + public static final int ID_H2 = 14; + public static final int ID_H3 = 15; + public static final int ID_H4 = 16; + public static final int ID_H5 = 17; + public static final int ID_H6 = 18; + public static final int ID_HEAD = 19; + public static final int ID_HR = 20; + public static final int ID_HTML = 21; + public static final int ID_IMG = 22; + public static final int ID_INPUT = 23; + public static final int ID_LI = 24; + public static final int ID_MENU = 25; + public static final int ID_META = 26; + public static final int ID_OL = 27; + public static final int ID_OPTION = 28; + public static final int ID_P = 29; + public static final int ID_PRE = 30; + public static final int ID_SELECT = 31; + public static final int ID_TEXTAREA = 32; + public static final int ID_TITLE = 33; + public static final int ID_UL = 34; + public static final int ID_SSI_CONFIG = 35; + public static final int ID_SSI_ECHO = 36; + public static final int ID_SSI_EXEC = 37; + public static final int ID_SSI_FSIZE = 38; + public static final int ID_SSI_FLASTMOD = 39; + public static final int ID_SSI_INCLUDE = 40; + public static final int ID_SSI_PRINTENV = 41; + public static final int ID_SSI_SET = 42; + + public static int getNumOfIds() { + if (numofids != -1) + return numofids; + + // NOTE: If the reflection is too slow, this method should + // just return the literal value, like 105. + // -- 5/25/2001 + Class clazz = Ids.class; + Field[] fields = clazz.getFields(); + numofids = 0; + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("ID_"))//$NON-NLS-1$ + numofids++; + } + return numofids; + } + + // chache the result of the reflection. + private static int numofids = -1; + } + + /** %formctl;. INPUT | SELECT | TEXTAREA */ + private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA}; + /** %phrase;. + * DFN + */ + private static final String[] PHRASE = {DFN}; + /** %special;. + * A | IMG | BR + */ + private static final String[] SPECIAL = {A, IMG, BR}; + /** %heading;. H[1-6] */ + private static final String[] HEADING = {H1, H2, H3, H4, H5, H6}; + /** %list;. UL | OL | DIR | MENU */ + private static final String[] LIST = {UL, OL, DIR, MENU}; + /** %preformatted;. PRE */ + private static final String[] PREFORMATTED = {PRE}; + private AttributeCollection attributeCollection = null; + private static String[] names = null; + + static { + names = new String[Ids.getNumOfIds()]; + names[Ids.ID_A] = A; + names[Ids.ID_ADDRESS] = ADDRESS; + names[Ids.ID_BASE] = BASE; + names[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE; + names[Ids.ID_BODY] = BODY; + names[Ids.ID_BR] = BR; + names[Ids.ID_CENTER] = CENTER; + names[Ids.ID_DD] = DD; + names[Ids.ID_DIR] = DIR; + names[Ids.ID_DIV] = DIV; + names[Ids.ID_DL] = DL; + names[Ids.ID_DT] = DT; + names[Ids.ID_FORM] = FORM; + names[Ids.ID_H1] = H1; + names[Ids.ID_H2] = H2; + names[Ids.ID_H3] = H3; + names[Ids.ID_H4] = H4; + names[Ids.ID_H5] = H5; + names[Ids.ID_H6] = H6; + names[Ids.ID_HEAD] = HEAD; + names[Ids.ID_HR] = HR; + names[Ids.ID_HTML] = HTML; + names[Ids.ID_IMG] = IMG; + names[Ids.ID_INPUT] = INPUT; + names[Ids.ID_LI] = LI; + names[Ids.ID_MENU] = MENU; + names[Ids.ID_META] = META; + names[Ids.ID_OL] = OL; + names[Ids.ID_OPTION] = OPTION; + names[Ids.ID_P] = P; + names[Ids.ID_PRE] = PRE; + names[Ids.ID_SELECT] = SELECT; + names[Ids.ID_TEXTAREA] = TEXTAREA; + names[Ids.ID_TITLE] = TITLE; + names[Ids.ID_UL] = UL; + names[Ids.ID_SSI_CONFIG] = SSI_CONFIG; + names[Ids.ID_SSI_ECHO] = SSI_ECHO; + names[Ids.ID_SSI_EXEC] = SSI_EXEC; + names[Ids.ID_SSI_FSIZE] = SSI_FSIZE; + names[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD; + names[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE; + names[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV; + names[Ids.ID_SSI_SET] = SSI_SET; + } + + /** + */ + public ElementCollection(AttributeCollection collection) { + super(names, TOLERANT_CASE); + attributeCollection = collection; + } + + /** + * Actually creates HTMLElementDeclaration instance. + * @return HTMLElementDeclaration + */ + protected CMNode create(String elementName) { + HTMLElemDeclImpl edec = null; + + if (elementName.equalsIgnoreCase(A)) { + edec = new HedA(this); + + } + else if (elementName.equalsIgnoreCase(ADDRESS)) { + edec = new HedADDRESS(this); + + } + else if (elementName.equalsIgnoreCase(BASE)) { + edec = new HedBASE(this); + + } + else if (elementName.equalsIgnoreCase(BLOCKQUOTE)) { + edec = new HedBLOCKQUOTE(this); + + } + else if (elementName.equalsIgnoreCase(BODY)) { + edec = new HedBODY(this); + + } + else if (elementName.equalsIgnoreCase(BR)) { + edec = new HedBR(this); + + } + else if (elementName.equalsIgnoreCase(CENTER)) { + edec = new HedCENTER(this); + + } + else if (elementName.equalsIgnoreCase(DD)) { + edec = new HedDD(this); + + } + else if (elementName.equalsIgnoreCase(DIR)) { + edec = new HedMENU(DIR, this); + + } + else if (elementName.equalsIgnoreCase(DIV)) { + edec = new HedDIV(this); + + } + else if (elementName.equalsIgnoreCase(DL)) { + edec = new HedDL(this); + + } + else if (elementName.equalsIgnoreCase(DT)) { + edec = new HedDT(this); + + } + else if (elementName.equalsIgnoreCase(FORM)) { + edec = new HedFORM(this); + + } + else if (elementName.equalsIgnoreCase(H1)) { + edec = new HedHeading(H1, this); + + } + else if (elementName.equalsIgnoreCase(H2)) { + edec = new HedHeading(H2, this); + + } + else if (elementName.equalsIgnoreCase(H3)) { + edec = new HedHeading(H3, this); + + } + else if (elementName.equalsIgnoreCase(H4)) { + edec = new HedHeading(H4, this); + + } + else if (elementName.equalsIgnoreCase(H5)) { + edec = new HedHeading(H5, this); + + } + else if (elementName.equalsIgnoreCase(H6)) { + edec = new HedHeading(H6, this); + + } + else if (elementName.equalsIgnoreCase(HEAD)) { + edec = new HedHEAD(this); + + } + else if (elementName.equalsIgnoreCase(HR)) { + edec = new HedHR(this); + + } + else if (elementName.equalsIgnoreCase(HTML)) { + edec = new HedHTML(this); + + } + else if (elementName.equalsIgnoreCase(IMG)) { + edec = new HedIMG(this); + + } + else if (elementName.equalsIgnoreCase(INPUT)) { + edec = new HedINPUT(this); + + } + else if (elementName.equalsIgnoreCase(LI)) { + edec = new HedLI(this); + + } + else if (elementName.equalsIgnoreCase(MENU)) { + edec = new HedMENU(MENU, this); + + } + else if (elementName.equalsIgnoreCase(META)) { + edec = new HedMETA(this); + + } + else if (elementName.equalsIgnoreCase(OL)) { + edec = new HedOL(this); + + } + else if (elementName.equalsIgnoreCase(OPTION)) { + edec = new HedOPTION(this); + + } + else if (elementName.equalsIgnoreCase(P)) { + edec = new HedP(this); + + } + else if (elementName.equalsIgnoreCase(PRE)) { + edec = new HedPRE(this); + + } + else if (elementName.equalsIgnoreCase(SELECT)) { + edec = new HedSELECT(this); + + } + else if (elementName.equalsIgnoreCase(TEXTAREA)) { + edec = new HedTEXTAREA(this); + + } + else if (elementName.equalsIgnoreCase(TITLE)) { + edec = new HedTITLE(this); + + } + else if (elementName.equalsIgnoreCase(UL)) { + edec = new HedUL(this); + + } + else if (elementName.equalsIgnoreCase(SSI_CONFIG)) { + edec = new HedSSIConfig(this); + + } + else if (elementName.equalsIgnoreCase(SSI_ECHO)) { + edec = new HedSSIEcho(this); + + } + else if (elementName.equalsIgnoreCase(SSI_EXEC)) { + edec = new HedSSIExec(this); + + } + else if (elementName.equalsIgnoreCase(SSI_FSIZE)) { + edec = new HedSSIFsize(this); + + } + else if (elementName.equalsIgnoreCase(SSI_FLASTMOD)) { + edec = new HedSSIFlastmod(this); + + } + else if (elementName.equalsIgnoreCase(SSI_INCLUDE)) { + edec = new HedSSIInclude(this); + + } + else if (elementName.equalsIgnoreCase(SSI_PRINTENV)) { + edec = new HedSSIPrintenv(this); + + } + else if (elementName.equalsIgnoreCase(SSI_SET)) { + edec = new HedSSISet(this); + + } // unknown + else { + // NOTE: We don't define the UNKNOWN element declaration. + // <code>null</code> for a declaration is a sign of + // the target element is unknown. + // -- 3/9/2001 + edec = null; + } + return edec; + } + + /** + * @return com.ibm.sed.contentmodel.html.AttributeCollection + */ + public AttributeCollection getAttributeCollection() { + return attributeCollection; + } + + /** + */ + public final Collection getNamesOfBlock() { + // P | %list | %preformatted | DL | DIV | CENTER | BLOCKQUOTE | FORM | HR + String[] blockMisc = {P, DL, DIV, CENTER, BLOCKQUOTE, FORM, HR,}; + Vector blockNames = new Vector(Arrays.asList(blockMisc)); + // %heading; + blockNames.addAll(Arrays.asList(HEADING)); + // %list; + blockNames.addAll(Arrays.asList(LIST)); + // %preformatted; + blockNames.addAll(Arrays.asList(PREFORMATTED)); + + return blockNames; + } + + /** + * %block;. + * %block; is: + * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER | + * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR | + * TABLE | FIELDSET | ADDRESS.<br> + * @param group CMGroupImpl Return values. + */ + public final void getBlock(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, getNamesOfBlock().iterator()); + } + + /** + * Create element declarations and store them + * into a <code>CMGroupImpl</code> instance. + * @param group CMGroupImpl Return values. + */ + public final void getFlow(CMGroupImpl group) { + if (group == null) + return; + getBlock(group); + getInline(group); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getFontstyle(CMGroupImpl group) { + return; + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getFormctrl(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(FORMCTL).iterator()); + } + + /** + * %heading;. + * @param group CMGroupImpl Return values. + */ + public final void getHeading(CMGroupImpl group) { + if (group == null) + return; + + getDeclarations(group, Arrays.asList(HEADING).iterator()); + } + + /** + * Create element declarations and store them + * into a <code>CMGroupImpl</code> instance. + * @param group CMGroupImpl Return values. + */ + public final void getInline(CMGroupImpl group) { + if (group == null) + return; + getFontstyle(group); + getPhrase(group); + getSpecial(group); + getFormctrl(group); + } + + /** + * %list;. + * @param group CMGroupImpl Return values. + */ + public final void getList(CMGroupImpl group) { + if (group == null) + return; + + getDeclarations(group, Arrays.asList(LIST).iterator()); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getPhrase(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(PHRASE).iterator()); + } + + /** + * %preformatted; + * @param group CMGroupImpl Return values. + */ + public final void getPreformatted(CMGroupImpl group) { + if (group == null) + return; + + getDeclarations(group, Arrays.asList(PREFORMATTED).iterator()); + } + + /** + * Create element declarations and store them into a <code>CMGroupImpl</code> + * instance.<br> + * @param group CMGroupImpl Return values. + */ + public final void getSpecial(CMGroupImpl group) { + if (group == null) + return; + getDeclarations(group, Arrays.asList(SPECIAL).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java new file mode 100644 index 0000000000..fe0ae2803c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java @@ -0,0 +1,837 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.lang.reflect.Field; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Factory for entity declarations. + */ +final class EntityCollection extends DeclCollection implements org.eclipse.wst.html.core.HTML40Namespace.EntityName { + + + private static class Ids { + public static final int ID_AACUTE_L = 0; + public static final int ID_AACUTE_U = 1; + public static final int ID_ACIRC_L = 2; + public static final int ID_ACIRC_U = 3; + public static final int ID_ACUTE = 4; + public static final int ID_AELIG_L = 5; + public static final int ID_AELIG_U = 6; + public static final int ID_AGRAVE_L = 7; + public static final int ID_AGRAVE_U = 8; + public static final int ID_ALEFSYM = 9; + public static final int ID_ALPHA_L = 10; + public static final int ID_ALPHA_U = 11; + public static final int ID_AMP = 12; + public static final int ID_AND = 13; + public static final int ID_ANG = 14; + public static final int ID_ARING_L = 15; + public static final int ID_ARING_U = 16; + public static final int ID_ASYMP = 17; + public static final int ID_ATILDE_L = 18; + public static final int ID_ATILDE_U = 19; + public static final int ID_AUML_L = 20; + public static final int ID_AUML_U = 21; + public static final int ID_BDQUO = 22; + public static final int ID_BETA_L = 23; + public static final int ID_BETA_U = 24; + public static final int ID_BRVBAR = 25; + public static final int ID_BULL = 26; + public static final int ID_CAP = 27; + public static final int ID_CCEDIL_L = 28; + public static final int ID_CCEDIL_U = 29; + public static final int ID_CEDIL = 30; + public static final int ID_CENT = 31; + public static final int ID_CHI_L = 32; + public static final int ID_CHI_U = 33; + public static final int ID_CIRC = 34; + public static final int ID_CLUBS = 35; + public static final int ID_CONG = 36; + public static final int ID_COPY = 37; + public static final int ID_CRARR = 38; + public static final int ID_CUP = 39; + public static final int ID_CURREN = 40; + public static final int ID_DAGGER_L = 41; + public static final int ID_DAGGER_U = 42; + public static final int ID_DARR_L = 43; + public static final int ID_DARR_U = 44; + public static final int ID_DEG = 45; + public static final int ID_DELTA_L = 46; + public static final int ID_DELTA_U = 47; + public static final int ID_DIAMS = 48; + public static final int ID_DIVIDE = 49; + public static final int ID_EACUTE_L = 50; + public static final int ID_EACUTE_U = 51; + public static final int ID_ECIRC_L = 52; + public static final int ID_ECIRC_U = 53; + public static final int ID_EGRAVE_L = 54; + public static final int ID_EGRAVE_U = 55; + public static final int ID_EMPTY = 56; + public static final int ID_EMSP = 57; + public static final int ID_ENSP = 58; + public static final int ID_EPSILON_L = 59; + public static final int ID_EPSILON_U = 60; + public static final int ID_EQUIV = 61; + public static final int ID_ETA_L = 62; + public static final int ID_ETA_U = 63; + public static final int ID_ETH_L = 64; + public static final int ID_ETH_U = 65; + public static final int ID_EUML_L = 66; + public static final int ID_EUML_U = 67; + public static final int ID_EURO = 68; + public static final int ID_EXIST = 69; + public static final int ID_FNOF = 70; + public static final int ID_FORALL = 71; + public static final int ID_FRAC12 = 72; + public static final int ID_FRAC14 = 73; + public static final int ID_FRAC34 = 74; + public static final int ID_FRASL = 75; + public static final int ID_GAMMA_L = 76; + public static final int ID_GAMMA_U = 77; + public static final int ID_GE = 78; + public static final int ID_GT = 79; + public static final int ID_HARR_L = 80; + public static final int ID_HARR_U = 81; + public static final int ID_HEARTS = 82; + public static final int ID_HELLIP = 83; + public static final int ID_IACUTE_L = 84; + public static final int ID_IACUTE_U = 85; + public static final int ID_ICIRC_L = 86; + public static final int ID_ICIRC_U = 87; + public static final int ID_IEXCL = 88; + public static final int ID_IGRAVE_L = 89; + public static final int ID_IGRAVE_U = 90; + public static final int ID_IMAGE = 91; + public static final int ID_INFIN = 92; + public static final int ID_INT = 93; + public static final int ID_IOTA_L = 94; + public static final int ID_IOTA_U = 95; + public static final int ID_IQUEST = 96; + public static final int ID_ISIN = 97; + public static final int ID_IUML_L = 98; + public static final int ID_IUML_U = 99; + public static final int ID_KAPPA_L = 100; + public static final int ID_KAPPA_U = 101; + public static final int ID_LAMBDA_L = 102; + public static final int ID_LAMBDA_U = 103; + public static final int ID_LANG = 104; + public static final int ID_LAQUO = 105; + public static final int ID_LARR_L = 106; + public static final int ID_LARR_U = 107; + public static final int ID_LCEIL = 108; + public static final int ID_LDQUO = 109; + public static final int ID_LE = 110; + public static final int ID_LFLOOR = 111; + public static final int ID_LOWAST = 112; + public static final int ID_LOZ = 113; + public static final int ID_LRM = 114; + public static final int ID_LSAQUO = 115; + public static final int ID_LSQUO = 116; + public static final int ID_LT = 117; + public static final int ID_MACR = 118; + public static final int ID_MDASH = 119; + public static final int ID_MICRO = 120; + public static final int ID_MIDDOT = 121; + public static final int ID_MINUS = 122; + public static final int ID_MU_L = 123; + public static final int ID_MU_U = 124; + public static final int ID_NABLA = 125; + public static final int ID_NBSP = 126; + public static final int ID_NDASH = 127; + public static final int ID_NE = 128; + public static final int ID_NI = 129; + public static final int ID_NOT = 130; + public static final int ID_NOTIN = 131; + public static final int ID_NSUB = 132; + public static final int ID_NTILDE_L = 133; + public static final int ID_NTILDE_U = 134; + public static final int ID_NU_L = 135; + public static final int ID_NU_U = 136; + public static final int ID_OACUTE_L = 137; + public static final int ID_OACUTE_U = 138; + public static final int ID_OCIRC_L = 139; + public static final int ID_OCIRC_U = 140; + public static final int ID_OELIG_L = 141; + public static final int ID_OELIG_U = 142; + public static final int ID_OGRAVE_L = 143; + public static final int ID_OGRAVE_U = 144; + public static final int ID_OLINE = 145; + public static final int ID_OMEGA_L = 146; + public static final int ID_OMEGA_U = 147; + public static final int ID_OMICRON_L = 148; + public static final int ID_OMICRON_U = 149; + public static final int ID_OPLUS = 150; + public static final int ID_OR = 151; + public static final int ID_ORDF = 152; + public static final int ID_ORDM = 153; + public static final int ID_OSLASH_L = 154; + public static final int ID_OSLASH_U = 155; + public static final int ID_OTILDE_L = 156; + public static final int ID_OTILDE_U = 157; + public static final int ID_OTIMES = 158; + public static final int ID_OUML_L = 159; + public static final int ID_OUML_U = 160; + public static final int ID_PARA = 161; + public static final int ID_PART = 162; + public static final int ID_PERMIL = 163; + public static final int ID_PERP = 164; + public static final int ID_PHI_L = 165; + public static final int ID_PHI_U = 166; + public static final int ID_PIV = 167; + public static final int ID_PI_L = 168; + public static final int ID_PI_U = 169; + public static final int ID_PLUSMN = 170; + public static final int ID_POUND = 171; + public static final int ID_PRIME_L = 172; + public static final int ID_PRIME_U = 173; + public static final int ID_PROD = 174; + public static final int ID_PROP = 175; + public static final int ID_PSI_L = 176; + public static final int ID_PSI_U = 177; + public static final int ID_QUOT = 178; + public static final int ID_RADIC = 179; + public static final int ID_RANG = 180; + public static final int ID_RAQUO = 181; + public static final int ID_RARR_L = 182; + public static final int ID_RARR_U = 183; + public static final int ID_RCEIL = 184; + public static final int ID_RDQUO = 185; + public static final int ID_REAL = 186; + public static final int ID_REG = 187; + public static final int ID_RFLOOR = 188; + public static final int ID_RHO_L = 189; + public static final int ID_RHO_U = 190; + public static final int ID_RLM = 191; + public static final int ID_RSAQUO = 192; + public static final int ID_RSQUO = 193; + public static final int ID_SBQUO = 194; + public static final int ID_SCARON_L = 195; + public static final int ID_SCARON_U = 196; + public static final int ID_SDOT = 197; + public static final int ID_SECT = 198; + public static final int ID_SHY = 199; + public static final int ID_SIGMAF = 200; + public static final int ID_SIGMA_L = 201; + public static final int ID_SIGMA_U = 202; + public static final int ID_SIM = 203; + public static final int ID_SPADES = 204; + public static final int ID_SUB = 205; + public static final int ID_SUBE = 206; + public static final int ID_SUM = 207; + public static final int ID_SUP = 208; + public static final int ID_SUP1 = 209; + public static final int ID_SUP2 = 210; + public static final int ID_SUP3 = 211; + public static final int ID_SUPE = 212; + public static final int ID_SZLIG = 213; + public static final int ID_TAU_L = 214; + public static final int ID_TAU_U = 215; + public static final int ID_THERE4 = 216; + public static final int ID_THETASYM = 217; + public static final int ID_THETA_L = 218; + public static final int ID_THETA_U = 219; + public static final int ID_THINSP = 220; + public static final int ID_THORN_L = 221; + public static final int ID_THORN_U = 222; + public static final int ID_TILDE = 223; + public static final int ID_TIMES = 224; + public static final int ID_TRADE = 225; + public static final int ID_UACUTE_L = 226; + public static final int ID_UACUTE_U = 227; + public static final int ID_UARR_L = 228; + public static final int ID_UARR_U = 229; + public static final int ID_UCIRC_L = 230; + public static final int ID_UCIRC_U = 231; + public static final int ID_UGRAVE_L = 232; + public static final int ID_UGRAVE_U = 233; + public static final int ID_UML = 234; + public static final int ID_UPSIH = 235; + public static final int ID_UPSILON_L = 236; + public static final int ID_UPSILON_U = 237; + public static final int ID_UUML_L = 238; + public static final int ID_UUML_U = 239; + public static final int ID_WEIERP = 240; + public static final int ID_XI_L = 241; + public static final int ID_XI_U = 242; + public static final int ID_YACUTE_L = 243; + public static final int ID_YACUTE_U = 244; + public static final int ID_YEN = 245; + public static final int ID_YUML_L = 246; + public static final int ID_YUML_U = 247; + public static final int ID_ZETA_L = 248; + public static final int ID_ZETA_U = 249; + public static final int ID_ZWJ = 250; + public static final int ID_ZWNJ = 251; + + public static int getNumOfIds() { + if (numofids != -1) + return numofids; + + // NOTE: If the reflection is too slow, this method should + // just return the literal value, like 252. + // -- 5/24/2001 + Class clazz = Ids.class; + Field[] fields = clazz.getFields(); + numofids = 0; + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("ID_"))//$NON-NLS-1$ + numofids++; + } + return numofids; + } + + // chache the result of the reflection. + private static int numofids = -1; + } + + private static String[] names = null; + + static { + names = new String[Ids.getNumOfIds()]; + names[Ids.ID_AACUTE_L] = AACUTE_L; + names[Ids.ID_AACUTE_U] = AACUTE_U; + names[Ids.ID_ACIRC_L] = ACIRC_L; + names[Ids.ID_ACIRC_U] = ACIRC_U; + names[Ids.ID_ACUTE] = ACUTE; + names[Ids.ID_AELIG_L] = AELIG_L; + names[Ids.ID_AELIG_U] = AELIG_U; + names[Ids.ID_AGRAVE_L] = AGRAVE_L; + names[Ids.ID_AGRAVE_U] = AGRAVE_U; + names[Ids.ID_ALEFSYM] = ALEFSYM; + names[Ids.ID_ALPHA_L] = ALPHA_L; + names[Ids.ID_ALPHA_U] = ALPHA_U; + names[Ids.ID_AMP] = AMP; + names[Ids.ID_AND] = AND; + names[Ids.ID_ANG] = ANG; + names[Ids.ID_ARING_L] = ARING_L; + names[Ids.ID_ARING_U] = ARING_U; + names[Ids.ID_ASYMP] = ASYMP; + names[Ids.ID_ATILDE_L] = ATILDE_L; + names[Ids.ID_ATILDE_U] = ATILDE_U; + names[Ids.ID_AUML_L] = AUML_L; + names[Ids.ID_AUML_U] = AUML_U; + names[Ids.ID_BDQUO] = BDQUO; + names[Ids.ID_BETA_L] = BETA_L; + names[Ids.ID_BETA_U] = BETA_U; + names[Ids.ID_BRVBAR] = BRVBAR; + names[Ids.ID_BULL] = BULL; + names[Ids.ID_CAP] = CAP; + names[Ids.ID_CCEDIL_L] = CCEDIL_L; + names[Ids.ID_CCEDIL_U] = CCEDIL_U; + names[Ids.ID_CEDIL] = CEDIL; + names[Ids.ID_CENT] = CENT; + names[Ids.ID_CHI_L] = CHI_L; + names[Ids.ID_CHI_U] = CHI_U; + names[Ids.ID_CIRC] = CIRC; + names[Ids.ID_CLUBS] = CLUBS; + names[Ids.ID_CONG] = CONG; + names[Ids.ID_COPY] = COPY; + names[Ids.ID_CRARR] = CRARR; + names[Ids.ID_CUP] = CUP; + names[Ids.ID_CURREN] = CURREN; + names[Ids.ID_DAGGER_L] = DAGGER_L; + names[Ids.ID_DAGGER_U] = DAGGER_U; + names[Ids.ID_DARR_L] = DARR_L; + names[Ids.ID_DARR_U] = DARR_U; + names[Ids.ID_DEG] = DEG; + names[Ids.ID_DELTA_L] = DELTA_L; + names[Ids.ID_DELTA_U] = DELTA_U; + names[Ids.ID_DIAMS] = DIAMS; + names[Ids.ID_DIVIDE] = DIVIDE; + names[Ids.ID_EACUTE_L] = EACUTE_L; + names[Ids.ID_EACUTE_U] = EACUTE_U; + names[Ids.ID_ECIRC_L] = ECIRC_L; + names[Ids.ID_ECIRC_U] = ECIRC_U; + names[Ids.ID_EGRAVE_L] = EGRAVE_L; + names[Ids.ID_EGRAVE_U] = EGRAVE_U; + names[Ids.ID_EMPTY] = EMPTY; + names[Ids.ID_EMSP] = EMSP; + names[Ids.ID_ENSP] = ENSP; + names[Ids.ID_EPSILON_L] = EPSILON_L; + names[Ids.ID_EPSILON_U] = EPSILON_U; + names[Ids.ID_EQUIV] = EQUIV; + names[Ids.ID_ETA_L] = ETA_L; + names[Ids.ID_ETA_U] = ETA_U; + names[Ids.ID_ETH_L] = ETH_L; + names[Ids.ID_ETH_U] = ETH_U; + names[Ids.ID_EUML_L] = EUML_L; + names[Ids.ID_EUML_U] = EUML_U; + names[Ids.ID_EURO] = EURO; + names[Ids.ID_EXIST] = EXIST; + names[Ids.ID_FNOF] = FNOF; + names[Ids.ID_FORALL] = FORALL; + names[Ids.ID_FRAC12] = FRAC12; + names[Ids.ID_FRAC14] = FRAC14; + names[Ids.ID_FRAC34] = FRAC34; + names[Ids.ID_FRASL] = FRASL; + names[Ids.ID_GAMMA_L] = GAMMA_L; + names[Ids.ID_GAMMA_U] = GAMMA_U; + names[Ids.ID_GE] = GE; + names[Ids.ID_GT] = GT; + names[Ids.ID_HARR_L] = HARR_L; + names[Ids.ID_HARR_U] = HARR_U; + names[Ids.ID_HEARTS] = HEARTS; + names[Ids.ID_HELLIP] = HELLIP; + names[Ids.ID_IACUTE_L] = IACUTE_L; + names[Ids.ID_IACUTE_U] = IACUTE_U; + names[Ids.ID_ICIRC_L] = ICIRC_L; + names[Ids.ID_ICIRC_U] = ICIRC_U; + names[Ids.ID_IEXCL] = IEXCL; + names[Ids.ID_IGRAVE_L] = IGRAVE_L; + names[Ids.ID_IGRAVE_U] = IGRAVE_U; + names[Ids.ID_IMAGE] = IMAGE; + names[Ids.ID_INFIN] = INFIN; + names[Ids.ID_INT] = INT; + names[Ids.ID_IOTA_L] = IOTA_L; + names[Ids.ID_IOTA_U] = IOTA_U; + names[Ids.ID_IQUEST] = IQUEST; + names[Ids.ID_ISIN] = ISIN; + names[Ids.ID_IUML_L] = IUML_L; + names[Ids.ID_IUML_U] = IUML_U; + names[Ids.ID_KAPPA_L] = KAPPA_L; + names[Ids.ID_KAPPA_U] = KAPPA_U; + names[Ids.ID_LAMBDA_L] = LAMBDA_L; + names[Ids.ID_LAMBDA_U] = LAMBDA_U; + names[Ids.ID_LANG] = LANG; + names[Ids.ID_LAQUO] = LAQUO; + names[Ids.ID_LARR_L] = LARR_L; + names[Ids.ID_LARR_U] = LARR_U; + names[Ids.ID_LCEIL] = LCEIL; + names[Ids.ID_LDQUO] = LDQUO; + names[Ids.ID_LE] = LE; + names[Ids.ID_LFLOOR] = LFLOOR; + names[Ids.ID_LOWAST] = LOWAST; + names[Ids.ID_LOZ] = LOZ; + names[Ids.ID_LRM] = LRM; + names[Ids.ID_LSAQUO] = LSAQUO; + names[Ids.ID_LSQUO] = LSQUO; + names[Ids.ID_LT] = LT; + names[Ids.ID_MACR] = MACR; + names[Ids.ID_MDASH] = MDASH; + names[Ids.ID_MICRO] = MICRO; + names[Ids.ID_MIDDOT] = MIDDOT; + names[Ids.ID_MINUS] = MINUS; + names[Ids.ID_MU_L] = MU_L; + names[Ids.ID_MU_U] = MU_U; + names[Ids.ID_NABLA] = NABLA; + names[Ids.ID_NBSP] = NBSP; + names[Ids.ID_NDASH] = NDASH; + names[Ids.ID_NE] = NE; + names[Ids.ID_NI] = NI; + names[Ids.ID_NOT] = NOT; + names[Ids.ID_NOTIN] = NOTIN; + names[Ids.ID_NSUB] = NSUB; + names[Ids.ID_NTILDE_L] = NTILDE_L; + names[Ids.ID_NTILDE_U] = NTILDE_U; + names[Ids.ID_NU_L] = NU_L; + names[Ids.ID_NU_U] = NU_U; + names[Ids.ID_OACUTE_L] = OACUTE_L; + names[Ids.ID_OACUTE_U] = OACUTE_U; + names[Ids.ID_OCIRC_L] = OCIRC_L; + names[Ids.ID_OCIRC_U] = OCIRC_U; + names[Ids.ID_OELIG_L] = OELIG_L; + names[Ids.ID_OELIG_U] = OELIG_U; + names[Ids.ID_OGRAVE_L] = OGRAVE_L; + names[Ids.ID_OGRAVE_U] = OGRAVE_U; + names[Ids.ID_OLINE] = OLINE; + names[Ids.ID_OMEGA_L] = OMEGA_L; + names[Ids.ID_OMEGA_U] = OMEGA_U; + names[Ids.ID_OMICRON_L] = OMICRON_L; + names[Ids.ID_OMICRON_U] = OMICRON_U; + names[Ids.ID_OPLUS] = OPLUS; + names[Ids.ID_OR] = OR; + names[Ids.ID_ORDF] = ORDF; + names[Ids.ID_ORDM] = ORDM; + names[Ids.ID_OSLASH_L] = OSLASH_L; + names[Ids.ID_OSLASH_U] = OSLASH_U; + names[Ids.ID_OTILDE_L] = OTILDE_L; + names[Ids.ID_OTILDE_U] = OTILDE_U; + names[Ids.ID_OTIMES] = OTIMES; + names[Ids.ID_OUML_L] = OUML_L; + names[Ids.ID_OUML_U] = OUML_U; + names[Ids.ID_PARA] = PARA; + names[Ids.ID_PART] = PART; + names[Ids.ID_PERMIL] = PERMIL; + names[Ids.ID_PERP] = PERP; + names[Ids.ID_PHI_L] = PHI_L; + names[Ids.ID_PHI_U] = PHI_U; + names[Ids.ID_PIV] = PIV; + names[Ids.ID_PI_L] = PI_L; + names[Ids.ID_PI_U] = PI_U; + names[Ids.ID_PLUSMN] = PLUSMN; + names[Ids.ID_POUND] = POUND; + names[Ids.ID_PRIME_L] = PRIME_L; + names[Ids.ID_PRIME_U] = PRIME_U; + names[Ids.ID_PROD] = PROD; + names[Ids.ID_PROP] = PROP; + names[Ids.ID_PSI_L] = PSI_L; + names[Ids.ID_PSI_U] = PSI_U; + names[Ids.ID_QUOT] = QUOT; + names[Ids.ID_RADIC] = RADIC; + names[Ids.ID_RANG] = RANG; + names[Ids.ID_RAQUO] = RAQUO; + names[Ids.ID_RARR_L] = RARR_L; + names[Ids.ID_RARR_U] = RARR_U; + names[Ids.ID_RCEIL] = RCEIL; + names[Ids.ID_RDQUO] = RDQUO; + names[Ids.ID_REAL] = REAL; + names[Ids.ID_REG] = REG; + names[Ids.ID_RFLOOR] = RFLOOR; + names[Ids.ID_RHO_L] = RHO_L; + names[Ids.ID_RHO_U] = RHO_U; + names[Ids.ID_RLM] = RLM; + names[Ids.ID_RSAQUO] = RSAQUO; + names[Ids.ID_RSQUO] = RSQUO; + names[Ids.ID_SBQUO] = SBQUO; + names[Ids.ID_SCARON_L] = SCARON_L; + names[Ids.ID_SCARON_U] = SCARON_U; + names[Ids.ID_SDOT] = SDOT; + names[Ids.ID_SECT] = SECT; + names[Ids.ID_SHY] = SHY; + names[Ids.ID_SIGMAF] = SIGMAF; + names[Ids.ID_SIGMA_L] = SIGMA_L; + names[Ids.ID_SIGMA_U] = SIGMA_U; + names[Ids.ID_SIM] = SIM; + names[Ids.ID_SPADES] = SPADES; + names[Ids.ID_SUB] = SUB; + names[Ids.ID_SUBE] = SUBE; + names[Ids.ID_SUM] = SUM; + names[Ids.ID_SUP] = SUP; + names[Ids.ID_SUP1] = SUP1; + names[Ids.ID_SUP2] = SUP2; + names[Ids.ID_SUP3] = SUP3; + names[Ids.ID_SUPE] = SUPE; + names[Ids.ID_SZLIG] = SZLIG; + names[Ids.ID_TAU_L] = TAU_L; + names[Ids.ID_TAU_U] = TAU_U; + names[Ids.ID_THERE4] = THERE4; + names[Ids.ID_THETASYM] = THETASYM; + names[Ids.ID_THETA_L] = THETA_L; + names[Ids.ID_THETA_U] = THETA_U; + names[Ids.ID_THINSP] = THINSP; + names[Ids.ID_THORN_L] = THORN_L; + names[Ids.ID_THORN_U] = THORN_U; + names[Ids.ID_TILDE] = TILDE; + names[Ids.ID_TIMES] = TIMES; + names[Ids.ID_TRADE] = TRADE; + names[Ids.ID_UACUTE_L] = UACUTE_L; + names[Ids.ID_UACUTE_U] = UACUTE_U; + names[Ids.ID_UARR_L] = UARR_L; + names[Ids.ID_UARR_U] = UARR_U; + names[Ids.ID_UCIRC_L] = UCIRC_L; + names[Ids.ID_UCIRC_U] = UCIRC_U; + names[Ids.ID_UGRAVE_L] = UGRAVE_L; + names[Ids.ID_UGRAVE_U] = UGRAVE_U; + names[Ids.ID_UML] = UML; + names[Ids.ID_UPSIH] = UPSIH; + names[Ids.ID_UPSILON_L] = UPSILON_L; + names[Ids.ID_UPSILON_U] = UPSILON_U; + names[Ids.ID_UUML_L] = UUML_L; + names[Ids.ID_UUML_U] = UUML_U; + names[Ids.ID_WEIERP] = WEIERP; + names[Ids.ID_XI_L] = XI_L; + names[Ids.ID_XI_U] = XI_U; + names[Ids.ID_YACUTE_L] = YACUTE_L; + names[Ids.ID_YACUTE_U] = YACUTE_U; + names[Ids.ID_YEN] = YEN; + names[Ids.ID_YUML_L] = YUML_L; + names[Ids.ID_YUML_U] = YUML_U; + names[Ids.ID_ZETA_L] = ZETA_L; + names[Ids.ID_ZETA_U] = ZETA_U; + names[Ids.ID_ZWJ] = ZWJ; + names[Ids.ID_ZWNJ] = ZWNJ; + } + private static char[] values = null; + + static { + values = new char[Ids.getNumOfIds()]; + values[Ids.ID_AACUTE_L] = 225; + values[Ids.ID_AACUTE_U] = 193; + values[Ids.ID_ACIRC_L] = 226; + values[Ids.ID_ACIRC_U] = 194; + values[Ids.ID_ACUTE] = 180; + values[Ids.ID_AELIG_L] = 230; + values[Ids.ID_AELIG_U] = 198; + values[Ids.ID_AGRAVE_L] = 224; + values[Ids.ID_AGRAVE_U] = 192; + values[Ids.ID_ALEFSYM] = 8501; + values[Ids.ID_ALPHA_L] = 945; + values[Ids.ID_ALPHA_U] = 913; + values[Ids.ID_AMP] = 38; + values[Ids.ID_AND] = 8743; + values[Ids.ID_ANG] = 8736; + values[Ids.ID_ARING_L] = 229; + values[Ids.ID_ARING_U] = 197; + values[Ids.ID_ASYMP] = 8776; + values[Ids.ID_ATILDE_L] = 227; + values[Ids.ID_ATILDE_U] = 195; + values[Ids.ID_AUML_L] = 228; + values[Ids.ID_AUML_U] = 196; + values[Ids.ID_BDQUO] = 8222; + values[Ids.ID_BETA_L] = 946; + values[Ids.ID_BETA_U] = 914; + values[Ids.ID_BRVBAR] = 166; + values[Ids.ID_BULL] = 8226; + values[Ids.ID_CAP] = 8745; + values[Ids.ID_CCEDIL_L] = 231; + values[Ids.ID_CCEDIL_U] = 199; + values[Ids.ID_CEDIL] = 184; + values[Ids.ID_CENT] = 162; + values[Ids.ID_CHI_L] = 967; + values[Ids.ID_CHI_U] = 935; + values[Ids.ID_CIRC] = 710; + values[Ids.ID_CLUBS] = 9827; + values[Ids.ID_CONG] = 8773; + values[Ids.ID_COPY] = 169; + values[Ids.ID_CRARR] = 8629; + values[Ids.ID_CUP] = 8746; + values[Ids.ID_CURREN] = 164; + values[Ids.ID_DAGGER_L] = 8224; + values[Ids.ID_DAGGER_U] = 8225; + values[Ids.ID_DARR_L] = 8595; + values[Ids.ID_DARR_U] = 8659; + values[Ids.ID_DEG] = 176; + values[Ids.ID_DELTA_L] = 948; + values[Ids.ID_DELTA_U] = 916; + values[Ids.ID_DIAMS] = 9830; + values[Ids.ID_DIVIDE] = 247; + values[Ids.ID_EACUTE_L] = 233; + values[Ids.ID_EACUTE_U] = 201; + values[Ids.ID_ECIRC_L] = 234; + values[Ids.ID_ECIRC_U] = 202; + values[Ids.ID_EGRAVE_L] = 232; + values[Ids.ID_EGRAVE_U] = 200; + values[Ids.ID_EMPTY] = 8709; + values[Ids.ID_EMSP] = 8195; + values[Ids.ID_ENSP] = 8194; + values[Ids.ID_EPSILON_L] = 949; + values[Ids.ID_EPSILON_U] = 917; + values[Ids.ID_EQUIV] = 8801; + values[Ids.ID_ETA_L] = 951; + values[Ids.ID_ETA_U] = 919; + values[Ids.ID_ETH_L] = 240; + values[Ids.ID_ETH_U] = 208; + values[Ids.ID_EUML_L] = 235; + values[Ids.ID_EUML_U] = 203; + values[Ids.ID_EURO] = 8364; + values[Ids.ID_EXIST] = 8707; + values[Ids.ID_FNOF] = 402; + values[Ids.ID_FORALL] = 8704; + values[Ids.ID_FRAC12] = 189; + values[Ids.ID_FRAC14] = 188; + values[Ids.ID_FRAC34] = 190; + values[Ids.ID_FRASL] = 8260; + values[Ids.ID_GAMMA_L] = 947; + values[Ids.ID_GAMMA_U] = 915; + values[Ids.ID_GE] = 8805; + values[Ids.ID_GT] = 62; + values[Ids.ID_HARR_L] = 8596; + values[Ids.ID_HARR_U] = 8660; + values[Ids.ID_HEARTS] = 9829; + values[Ids.ID_HELLIP] = 8230; + values[Ids.ID_IACUTE_L] = 237; + values[Ids.ID_IACUTE_U] = 205; + values[Ids.ID_ICIRC_L] = 238; + values[Ids.ID_ICIRC_U] = 206; + values[Ids.ID_IEXCL] = 161; + values[Ids.ID_IGRAVE_L] = 236; + values[Ids.ID_IGRAVE_U] = 204; + values[Ids.ID_IMAGE] = 8465; + values[Ids.ID_INFIN] = 8734; + values[Ids.ID_INT] = 8747; + values[Ids.ID_IOTA_L] = 953; + values[Ids.ID_IOTA_U] = 921; + values[Ids.ID_IQUEST] = 191; + values[Ids.ID_ISIN] = 8712; + values[Ids.ID_IUML_L] = 239; + values[Ids.ID_IUML_U] = 207; + values[Ids.ID_KAPPA_L] = 954; + values[Ids.ID_KAPPA_U] = 922; + values[Ids.ID_LAMBDA_L] = 955; + values[Ids.ID_LAMBDA_U] = 923; + values[Ids.ID_LANG] = 9001; + values[Ids.ID_LAQUO] = 171; + values[Ids.ID_LARR_L] = 8592; + values[Ids.ID_LARR_U] = 8656; + values[Ids.ID_LCEIL] = 8968; + values[Ids.ID_LDQUO] = 8220; + values[Ids.ID_LE] = 8804; + values[Ids.ID_LFLOOR] = 8970; + values[Ids.ID_LOWAST] = 8727; + values[Ids.ID_LOZ] = 9674; + values[Ids.ID_LRM] = 8206; + values[Ids.ID_LSAQUO] = 8249; + values[Ids.ID_LSQUO] = 8216; + values[Ids.ID_LT] = 60; + values[Ids.ID_MACR] = 175; + values[Ids.ID_MDASH] = 8212; + values[Ids.ID_MICRO] = 181; + values[Ids.ID_MIDDOT] = 183; + values[Ids.ID_MINUS] = 8722; + values[Ids.ID_MU_L] = 956; + values[Ids.ID_MU_U] = 924; + values[Ids.ID_NABLA] = 8711; + values[Ids.ID_NBSP] = 160; + values[Ids.ID_NDASH] = 8211; + values[Ids.ID_NE] = 8800; + values[Ids.ID_NI] = 8715; + values[Ids.ID_NOT] = 172; + values[Ids.ID_NOTIN] = 8713; + values[Ids.ID_NSUB] = 8836; + values[Ids.ID_NTILDE_L] = 241; + values[Ids.ID_NTILDE_U] = 209; + values[Ids.ID_NU_L] = 957; + values[Ids.ID_NU_U] = 925; + values[Ids.ID_OACUTE_L] = 243; + values[Ids.ID_OACUTE_U] = 211; + values[Ids.ID_OCIRC_L] = 244; + values[Ids.ID_OCIRC_U] = 212; + values[Ids.ID_OELIG_L] = 339; + values[Ids.ID_OELIG_U] = 338; + values[Ids.ID_OGRAVE_L] = 242; + values[Ids.ID_OGRAVE_U] = 210; + values[Ids.ID_OLINE] = 8254; + values[Ids.ID_OMEGA_L] = 969; + values[Ids.ID_OMEGA_U] = 937; + values[Ids.ID_OMICRON_L] = 959; + values[Ids.ID_OMICRON_U] = 927; + values[Ids.ID_OPLUS] = 8853; + values[Ids.ID_OR] = 8744; + values[Ids.ID_ORDF] = 170; + values[Ids.ID_ORDM] = 186; + values[Ids.ID_OSLASH_L] = 248; + values[Ids.ID_OSLASH_U] = 216; + values[Ids.ID_OTILDE_L] = 245; + values[Ids.ID_OTILDE_U] = 213; + values[Ids.ID_OTIMES] = 8855; + values[Ids.ID_OUML_L] = 246; + values[Ids.ID_OUML_U] = 214; + values[Ids.ID_PARA] = 182; + values[Ids.ID_PART] = 8706; + values[Ids.ID_PERMIL] = 8240; + values[Ids.ID_PERP] = 8869; + values[Ids.ID_PHI_L] = 966; + values[Ids.ID_PHI_U] = 934; + values[Ids.ID_PIV] = 982; + values[Ids.ID_PI_L] = 960; + values[Ids.ID_PI_U] = 928; + values[Ids.ID_PLUSMN] = 177; + values[Ids.ID_POUND] = 163; + values[Ids.ID_PRIME_L] = 8242; + values[Ids.ID_PRIME_U] = 8243; + values[Ids.ID_PROD] = 8719; + values[Ids.ID_PROP] = 8733; + values[Ids.ID_PSI_L] = 968; + values[Ids.ID_PSI_U] = 936; + values[Ids.ID_QUOT] = 34; + values[Ids.ID_RADIC] = 8730; + values[Ids.ID_RANG] = 9002; + values[Ids.ID_RAQUO] = 187; + values[Ids.ID_RARR_L] = 8594; + values[Ids.ID_RARR_U] = 8658; + values[Ids.ID_RCEIL] = 8969; + values[Ids.ID_RDQUO] = 8221; + values[Ids.ID_REAL] = 8476; + values[Ids.ID_REG] = 174; + values[Ids.ID_RFLOOR] = 8971; + values[Ids.ID_RHO_L] = 961; + values[Ids.ID_RHO_U] = 929; + values[Ids.ID_RLM] = 8207; + values[Ids.ID_RSAQUO] = 8250; + values[Ids.ID_RSQUO] = 8217; + values[Ids.ID_SBQUO] = 8218; + values[Ids.ID_SCARON_L] = 353; + values[Ids.ID_SCARON_U] = 352; + values[Ids.ID_SDOT] = 8901; + values[Ids.ID_SECT] = 167; + values[Ids.ID_SHY] = 173; + values[Ids.ID_SIGMAF] = 962; + values[Ids.ID_SIGMA_L] = 963; + values[Ids.ID_SIGMA_U] = 931; + values[Ids.ID_SIM] = 8764; + values[Ids.ID_SPADES] = 9824; + values[Ids.ID_SUB] = 8834; + values[Ids.ID_SUBE] = 8838; + values[Ids.ID_SUM] = 8721; + values[Ids.ID_SUP] = 8835; + values[Ids.ID_SUP1] = 185; + values[Ids.ID_SUP2] = 178; + values[Ids.ID_SUP3] = 179; + values[Ids.ID_SUPE] = 8839; + values[Ids.ID_SZLIG] = 223; + values[Ids.ID_TAU_L] = 964; + values[Ids.ID_TAU_U] = 932; + values[Ids.ID_THERE4] = 8756; + values[Ids.ID_THETASYM] = 977; + values[Ids.ID_THETA_L] = 952; + values[Ids.ID_THETA_U] = 920; + values[Ids.ID_THINSP] = 8201; + values[Ids.ID_THORN_L] = 254; + values[Ids.ID_THORN_U] = 222; + values[Ids.ID_TILDE] = 732; + values[Ids.ID_TIMES] = 215; + values[Ids.ID_TRADE] = 8482; + values[Ids.ID_UACUTE_L] = 250; + values[Ids.ID_UACUTE_U] = 218; + values[Ids.ID_UARR_L] = 8593; + values[Ids.ID_UARR_U] = 8657; + values[Ids.ID_UCIRC_L] = 251; + values[Ids.ID_UCIRC_U] = 219; + values[Ids.ID_UGRAVE_L] = 249; + values[Ids.ID_UGRAVE_U] = 217; + values[Ids.ID_UML] = 168; + values[Ids.ID_UPSIH] = 978; + values[Ids.ID_UPSILON_L] = 965; + values[Ids.ID_UPSILON_U] = 933; + values[Ids.ID_UUML_L] = 252; + values[Ids.ID_UUML_U] = 220; + values[Ids.ID_WEIERP] = 8472; + values[Ids.ID_XI_L] = 958; + values[Ids.ID_XI_U] = 926; + values[Ids.ID_YACUTE_L] = 253; + values[Ids.ID_YACUTE_U] = 221; + values[Ids.ID_YEN] = 165; + values[Ids.ID_YUML_L] = 255; + values[Ids.ID_YUML_U] = 376; + values[Ids.ID_ZETA_L] = 950; + values[Ids.ID_ZETA_U] = 918; + values[Ids.ID_ZWJ] = 8205; + values[Ids.ID_ZWNJ] = 8204; + } + + /** + */ + public EntityCollection() { + super(names, STRICT_CASE); + } + + /** + * Create an entity declaration. + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode + * @param attrName java.lang.String + */ + protected CMNode create(String entityName) { + int id = getID(entityName); + if (id == ID_UNKNOWN) + return null; + + String value = String.valueOf(values[id]); + HTMLEntityDeclImpl dec = new HTMLEntityDeclImpl(entityName, value); + + return dec; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java new file mode 100644 index 0000000000..d5aa9b5e66 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java @@ -0,0 +1,118 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Implementation class of {@link <code>HTMLAttributeDeclaration</code>} interface.<br> + */ +class HTMLAttrDeclImpl extends CMNodeImpl implements HTMLAttributeDeclaration { + + private HTMLCMDataTypeImpl type = null; + private int usage = 0; + + /** + */ + public HTMLAttrDeclImpl(String attrName, HTMLCMDataTypeImpl valueType, int valueUsage) { + super(attrName); + this.type = valueType; + + switch (valueUsage) { + case OPTIONAL : + case REQUIRED : + case FIXED : + case PROHIBITED : + this.usage = valueUsage; + break; + default : + // should warn... + this.usage = OPTIONAL; // fall back + break; + } + } + + /** + * getAttrName method + * @return java.lang.String + */ + public String getAttrName() { + return getNodeName(); + } + + /** + * getAttrType method + * @return CMDataType + */ + public CMDataType getAttrType() { + return type; + } + + /** + * @deprecated in superclass + */ + public String getDefaultValue() { + if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT) + return null; + return type.getImpliedValue(); + } + + /** + * @deprecated in superclass + */ + public Enumeration getEnumAttr() { + Vector v = new Vector(Arrays.asList(type.getEnumeratedValues())); + return v.elements(); + } + + /** + * getNodeType method + * @return int + * + * Returns one of : + * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION. + */ + public int getNodeType() { + return CMNode.ATTRIBUTE_DECLARATION; + } + + /** + * @return int + */ + public int getUsage() { + return usage; + } + + /** + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return true; + return super.supports(propertyName); + } + + /** + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return new Boolean(true); + return super.getProperty(propertyName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java new file mode 100644 index 0000000000..64931b6dbf --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + + + +/** + */ +class HTMLCMDataTypeImpl extends CMNodeImpl implements HTMLCMDataType { + + private int impliedValueKind = IMPLIED_VALUE_NONE; + private String impliedValue = null; + private final static String[] emptyArray = new String[0]; + private String[] enumValues = emptyArray; + private String instanceValue = null; + + /** + * HTMLCMDataTypeImpl constructor comment. + * @param nm java.lang.String + */ + public HTMLCMDataTypeImpl(String typeName) { + super(typeName); + } + + /** + * HTMLCMDataTypeImpl constructor comment. + * @param nm java.lang.String + */ + public HTMLCMDataTypeImpl(String typeName, String instanceValue) { + super(typeName); + this.instanceValue = instanceValue; + } + + /** + * getTypeName method + * @return java.lang.String + * + * This method returns a suitable default value that can be used when an instance of the data type is created. + * This returns null of a suitable default is not available. + */ + public String generateInstanceValue() { + return instanceValue; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDataType + */ + public String getDataTypeName() { + return getNodeName(); + } + + /** + * getTypeName method + * @return java.lang.String[] + * + */ + public String[] getEnumeratedValues() { + return enumValues; + } + + /** + * getTypeName method + * @return java.lang.String + * + * Returns the implied value or null if none exists. + */ + public String getImpliedValue() { + return impliedValue; + } + + /** + * getImpliedValueKind method + * @return int + * + * Returns one of : + * IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED, IMPLIED_VALUE_DEFAULT. + */ + public int getImpliedValueKind() { + return impliedValueKind; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + public int getNodeType() { + return CMNode.DATA_TYPE; + } + + /** + */ + void setEnumValues(String[] values) { + enumValues = new String[values.length]; + for (int i = 0; i < values.length; i++) { + enumValues[i] = values[i]; + } + } + + /** + * package scope. + */ + void setImpliedValue(int kind, String value) { + switch (kind) { + case IMPLIED_VALUE_FIXED : + case IMPLIED_VALUE_DEFAULT : + impliedValueKind = kind; + impliedValue = value; + break; + case IMPLIED_VALUE_NONE : + default : + impliedValueKind = IMPLIED_VALUE_NONE; + impliedValue = null; // maybe a null string? + break; + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java new file mode 100644 index 0000000000..a1e555acf9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + +/** + * In HTML Documents, name and value of an attribute/element/entity + * should be treated ignoring theirs case. However, in XML documents, + * they should be distinguished with sensitiveness of their case. + * CMNode is basically designed to represent DTDs or Schemas for XML + * documents. So, it doesn't have interfaces to retrieve such information. + * However, declarations in the HTML CM should provide such information. + * This intermediate interface is intended to provide whether ignore cases + * or not.<br> + */ +interface HTMLCMNode extends org.eclipse.wst.xml.core.internal.contentmodel.CMNode { + + /** + * Returns <code>true</code>, if declaration is for HTML attribute/element/entity. + * Otherwise, returns <code>false</code>. + * @return boolean + */ + boolean shouldIgnoreCase(); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java new file mode 100644 index 0000000000..a75268b8cc --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java @@ -0,0 +1,380 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * Base class for all Hed???? classes. + */ +abstract class HTMLElemDeclImpl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration { + + // DTD + protected CMNamedNodeMapImpl attributes = null; + protected String typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY; + /** Never access this field directly. Instead, use getComplexTypeDefinition method. */ + private ComplexTypeDefinition typeDefinition = null; + protected CMGroupImpl inclusion = null; + protected CMGroupImpl exclusion = null; + // advanced information + protected CMNamedNodeMap prohibitedAncestors = null; + protected int correctionType = CORRECT_NONE; + protected int formatType = FORMAT_HTML; + protected int layoutType = LAYOUT_NONE; + protected int omitType = OMIT_NONE; + protected boolean keepSpaces = false; + protected boolean indentChild = false; + protected ElementCollection elementCollection = null; + protected AttributeCollection attributeCollection = null; + protected final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() { + public int getLength() { + return 0; + } + + public CMNode getNamedItem(String name) { + return null; + } + + public CMNode item(int index) { + return null; + } + + public Iterator iterator() { + return new Iterator() { + public boolean hasNext() { + return false; + } + + public Object next() { + return null; + } + + public void remove() { + } + }; + } + }; + + /** + * HTMLElemDeclImpl constructor. + * In the HTML DTD, an element declaration has no specification + * for its occurrence. Occurrence is specifed in content model, like + * <code>(LI)+</code>. To avoid confusion (and complexity), + * occurrence of an element declaration is always 1 (it means, min = 1 and + * max = 1). Instead, occurrence of CMGroup represents actual occurrence + * of the content. + * <br> + * @param name java.lang.String + */ + public HTMLElemDeclImpl(String elementName, ElementCollection collection) { + super(elementName, 1, 1); + elementCollection = collection; + attributeCollection = collection.getAttributeCollection(); + } + + /** + */ + protected abstract void createAttributeDeclarations(); + + /** + * + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + private ComplexTypeDefinition createComplexTypeDefinition() { + if (typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_CDATA) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_EMPTY) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_PCDATA)) + return null; + + ComplexTypeDefinitionFactory factory = ComplexTypeDefinitionFactory.getInstance(); + if (factory == null) + return null; // fatal error. + + ComplexTypeDefinition def = factory.createTypeDefinition(typeDefinitionName, elementCollection); + return def; + } + + /** + * Get an attribute declaration. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) { + if (attributes == null) { + createAttributeDeclarations(); + if (attributes == null) + return null; // fail to create + } + + CMNode cmnode = attributes.getNamedItem(attrName); + if (cmnode == null) { + return null; + } + else { + return (HTMLAttributeDeclaration) cmnode; // already exists. + } + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMNamedNodeMap getAttributes() { + if (attributes == null) + createAttributeDeclarations(); // lazy eval. + return attributes; + } + + /** + * Get an instance of complex type definition. + * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition + */ + private ComplexTypeDefinition getComplexTypeDefinition() { + if (typeDefinition == null) + typeDefinition = createComplexTypeDefinition(); + return typeDefinition; + } + + /** + * Content.<br> + * Element declarations which type is EMPTY or CDATA (maybe PCDATA) + * <strong>MUST</strong> override this method and always return null. + * This default implementation always tries to create a complex type definition + * instance and access to it. + * <br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMContent getContent() { + ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval. + return (def != null) ? def.getContent() : null; + } + + /** + * Content type.<br> + * Element declarations which type is EMPTY or CDATA (maybe PCDATA) + * <strong>MUST</strong> override this method and return an appropriate type. + * This default implementation always tries to create a complex type definition + * instance and access to it. + * <br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public int getContentType() { + ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval. + return (def != null) ? def.getContentType() : CMElementDeclaration.CDATA; + } + + /** + * @see HTMLElementDeclaration#getCorrectionType + */ + public int getCorrectionType() { + return correctionType; + } + + /** + * HTML element doesn't have any data type. So, this method always + * returns <code>null</code>.<br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMDataType getDataType() { + return null; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public String getElementName() { + return getNodeName(); + } + + /** + * Exclusion. + * Almost elements don't have a exclusion. + * Only classes those have exclusion should override this method. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + return null; + } + + /** + * Default format type is <code>FORMAT_HTML</code>.<br> + */ + public int getFormatType() { + return formatType; + } + + /** + * Inclusion. + * Almost elements don't have a inclusion. + * Only classes those have inclusion should override this method. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getInclusion() { + return null; + } + + /** + */ + public int getLayoutType() { + return layoutType; + } + + /** + * Line break hint is strongly related to layout type. + * Indeed, in the C++DOM, it is determined from layout type only. + * So, this implementation, as the default implementation for all declarations, + * also determines from layout type only.<br> + * @return int + */ + public int getLineBreakHint() { + switch (getLayoutType()) { + case HTMLElementDeclaration.LAYOUT_BLOCK : + return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END; + case HTMLElementDeclaration.LAYOUT_BREAK : + return HTMLElementDeclaration.BREAK_AFTER_START; + case HTMLElementDeclaration.LAYOUT_HIDDEN : + return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END; + default : + return HTMLElementDeclaration.BREAK_NONE; + } + } + + /** + * No HTML element has local elements. So, this method always + * returns an empty map. + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public CMNamedNodeMap getLocalElements() { + return EMPTY_MAP; + } + + /** + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode + */ + public int getNodeType() { + return CMNode.ELEMENT_DECLARATION; + } + + /** + */ + public int getOmitType() { + return omitType; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + return EMPTY_MAP; + } + + /** + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return true; + } + else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { + ComplexTypeDefinition def = getComplexTypeDefinition(); + return (def != null); + } + else { + PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); + if (pp == null) + return false; + return pp.supports(this); + } + + } + + /** + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return new Boolean(true); + } + else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) { + ComplexTypeDefinition def = getComplexTypeDefinition(); + return (def != null) ? def.getPrimaryCandidate() : null; + } + else { + PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName); + if (pp == null) + return null; + return pp.get(this); + } + } + + /** + * Return element names which terminates this element.<br> + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return null; + } + + /** + * return true when the element is a JSP element. + */ + public boolean isJSP() { + return false; + } + + /** + * In some elements, such as APPLET, a source generator should indent child + * elements that their parents. That is, a source generator should generate + * source of APPLET and PARAMS like this: + * <PRE> + * <APPLET ...> + * <PARAM ... > + * <PARAM ... > + * </APPLET> + * <PRE> + * @return boolean + */ + public boolean shouldIndentChildSource() { + return indentChild; + } + + /** + * Most of elements can compact spaces in their child text nodes. + * Some special elements should keep them in their source. + * @return boolean + */ + public boolean shouldKeepSpaces() { + return keepSpaces; + } + + /** + * @return boolean + */ + public boolean shouldTerminateAt(HTMLElementDeclaration nextElement) { + Iterator i = getTerminators(); + if (i == null) + return false; + String nextName = nextElement.getElementName(); + while (i.hasNext()) { + if (nextName.equals(i.next())) + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java new file mode 100644 index 0000000000..496e93a7c6 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLEntityDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + + + +/** + */ +class HTMLEntityDeclImpl extends CMNodeImpl implements HTMLEntityDeclaration { + + private java.lang.String value = null; + + /** + * CMEntityDeclImpl constructor comment. + * @param entityName java.lang.String; Entity name. + * @param entityValue java.lang.String; Value string. + */ + public HTMLEntityDeclImpl(String entityName, String entityValue) { + super(entityName); + value = entityValue; + } + + /** + * getName method + * @return java.lang.String + */ + public String getName() { + return getNodeName(); + } + + /** + * Get CMNode type.<br> + * @return int; Always return ENTITY_DECLARATION. + */ + public int getNodeType() { + return CMNode.ENTITY_DECLARATION; + } + + /** + * getValue method + * @return java.lang.String + */ + public String getValue() { + return value; + } + + /** + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return true; + return super.supports(propertyName); + } + + /** + * Entities in HTML documents are always treated with ignoring cases. + * Because no special entities are defined in JSP 1.0, this method + * can always return <code>true</code>.<br> + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return new Boolean(true); + return super.getProperty(propertyName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java new file mode 100644 index 0000000000..1957ee951c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * A. + */ +final class HedA extends HedInlineContainer { + + /** + */ + public HedA(ElementCollection collection) { + super(CHTMLNamespace.ElementName.A, collection); + // CORRECT_EMPTY - GROUP_COMPACT + correctionType = CORRECT_EMPTY; + } + + /** + * %attrs; + * (charset %Charset; #IMPLIED) + * (type %ContentType; #IMPLIED) + * (name CDATA #IMPLIED) + * (href %URI; #IMPLIED) + * (hreflang %LanguageCode; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + * (rel %LinkTypes; #IMPLIED) + * (rev %LinkTypes; #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (directkey %Character; #IMPLIED) + * (shape %Shape; rect) + * (coords %Coords; #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_HREF,}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Exclusion. + * <code>A</code> has the exclusion. + * It is <code>A</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + CMNode a = elementCollection.getNamedItem(CHTMLNamespace.ElementName.A); + if (a != null) + exclusion.appendChild(a); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.A,}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java new file mode 100644 index 0000000000..55579d8b87 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * ADDRESS. + */ +final class HedADDRESS extends HTMLElemDeclImpl { + + /** + */ + public HedADDRESS(ElementCollection collection) { + super(CHTMLNamespace.ElementName.ADDRESS, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_ADDRESS; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java new file mode 100644 index 0000000000..ab2c8161be --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * BASE. + */ +final class HedBASE extends HedEmpty { + + /** + */ + public HedBASE(ElementCollection collection) { + super(CHTMLNamespace.ElementName.BASE, collection); + // LAYOUT_HIDDEN. + // Because, BASE is GROUP_HIDDEN in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_HIDDEN; + } + + /** + * BASE. + * (href %URI; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_HREF,}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java new file mode 100644 index 0000000000..818156e29b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * BLOCKQUOTE. + */ +final class HedBLOCKQUOTE extends HedFlowContainer { + + /** + */ + public HedBLOCKQUOTE(ElementCollection collection) { + super(CHTMLNamespace.ElementName.BLOCKQUOTE, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * (cite %URI; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java new file mode 100644 index 0000000000..992288f2cf --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +/** + * BODY. + */ +final class HedBODY extends HedFlowContainer { + + private static String[] terminators = {CHTMLNamespace.ElementName.HEAD, CHTMLNamespace.ElementName.BODY, CHTMLNamespace.ElementName.HTML}; + + /** + */ + public HedBODY(ElementCollection collection) { + super(CHTMLNamespace.ElementName.BODY, collection); + layoutType = LAYOUT_BLOCK; + omitType = OMIT_BOTH; + } + + /** + * %attrs; + * %bodycolors; + * (onload %Script; #IMPLIED) + * (onunload %Script; #IMPLIED) + * (background %URI; #IMPLIED) + * (marginwidth %Pixels; #IMPLIED) ... D205514 + * (marginheight %Pixels; #IMPLIED) .. D205514 + * (topmargin, CDATA, #IMPLIED) ...... D205514 + * (bottommargin, CDATA, #IMPLIED) ... D205514 + * (leftmargin, CDATA, #IMPLIED) ..... D205514 + * (rightmargin, CDATA, #IMPLIED) .... D205514 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %bodycolors; + attributeCollection.getBodycolors(attributes); + + } + + /** + * BODY has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java new file mode 100644 index 0000000000..30ef48ba45 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration; + + + +/** + * BR. + */ +final class HedBR extends HedEmpty { + + /** + */ + public HedBR(ElementCollection collection) { + super(CHTMLNamespace.ElementName.BR, collection); + // LAYOUT_BREAK. + // Because, BR is GROUP_BREAK in the C++DOM/DTDParser.cpp. + layoutType = LAYOUT_BREAK; + } + + /** + * BR. + * %coreattrs; + * (clear (left | all | right | none) none) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %coreattrs; + attributeCollection.getCore(attributes); + // clear + HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(CHTMLNamespace.ATTR_NAME_CLEAR); + if (attr != null) + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_CLEAR, attr); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java new file mode 100644 index 0000000000..c2c60d69ab --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * CENTER. + */ +final class HedCENTER extends HedFlowContainer { + + /** + */ + public HedCENTER(ElementCollection collection) { + super(CHTMLNamespace.ElementName.CENTER, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java new file mode 100644 index 0000000000..a5da292dd3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +/** + * DD. + */ +final class HedDD extends HedFlowContainer { + + private static String[] terminators = {CHTMLNamespace.ElementName.DT, CHTMLNamespace.ElementName.DD}; + + /** + */ + public HedDD(ElementCollection collection) { + super(CHTMLNamespace.ElementName.DD, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END_DEFAULT; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + * DD has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java new file mode 100644 index 0000000000..adb56c2df7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * DIV. + */ +final class HedDIV extends HedFlowContainer { + + /** + */ + public HedDIV(ElementCollection collection) { + super(CHTMLNamespace.ElementName.DIV, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * %align; + * %reserved; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // %align; + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph(); + if (attr != null) + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr); + // %reserved; ... empty + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java new file mode 100644 index 0000000000..c09c9ac095 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * DL. + */ +final class HedDL extends HTMLElemDeclImpl { + + /** + */ + public HedDL(ElementCollection collection) { + super(CHTMLNamespace.ElementName.DL, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + indentChild = true; + } + + /** + * %arrays; + * (compact (compact) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java new file mode 100644 index 0000000000..e12c4c4c07 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +/** + * DT. + */ +final class HedDT extends HedInlineContainer { + + private static String[] terminators = {CHTMLNamespace.ElementName.DT, CHTMLNamespace.ElementName.DD}; + + /** + */ + public HedDT(ElementCollection collection) { + super(CHTMLNamespace.ElementName.DT, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END_DEFAULT; + } + + /** + * %attrs; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + } + + /** + * DT has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java new file mode 100644 index 0000000000..92c30da559 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * Base class for EMPTY type element declarations. + */ +abstract class HedEmpty extends HTMLElemDeclImpl { + + /** + */ + public HedEmpty(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY; + // EMPTY type has no end tag. + omitType = OMIT_END_MUST; + } + + /** + * Content.<br> + * EMPTY type always returns <code>null</code>. + * <br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getContent() { + return null; + } + + /** + * Content type.<br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public int getContentType() { + return CMElementDeclaration.EMPTY; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java new file mode 100644 index 0000000000..751acd8e0b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + * FORM. + */ +final class HedFORM extends HedFlowContainer { + + /** + */ + public HedFORM(ElementCollection collection) { + super(CHTMLNamespace.ElementName.FORM, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs; + * (action %URI; #REQUIRED) + * (method (GET|POST) GET) + * (enctype %ContentType; "application/x-www-form-urlencoded") + * (accept %ContentTypes; #IMPLIED) + * (name CDATA #IMPLIED) + * (onsubmit %Script; #IMPLIED) + * (onreset %Script; #IMPLIED) + * (target %FrameTarget; #IMPLIED) + * (accept-charset %Charsets; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {CHTMLNamespace.ATTR_NAME_ACTION, CHTMLNamespace.ATTR_NAME_METHOD, CHTMLNamespace.ATTR_NAME_ENCTYPE, CHTMLNamespace.ATTR_NAME_NAME,}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * Exclusion. + * <code>FORM</code> has the exclusion. + * It is <code>FORM</code> itself. + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; // fatal + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + CMNode form = elementCollection.getNamedItem(CHTMLNamespace.ElementName.FORM); + if (form != null) + exclusion.appendChild(form); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.FORM, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java new file mode 100644 index 0000000000..99f307b1d7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +/** + * Base class for (%flow;)* containers. + */ +abstract class HedFlowContainer extends HTMLElemDeclImpl { + + /** + */ + public HedFlowContainer(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java new file mode 100644 index 0000000000..2366dce8d1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +/** + * HTML. + */ +final class HedHEAD extends HTMLElemDeclImpl { + + private static String[] terminators = {CHTMLNamespace.ElementName.HEAD, CHTMLNamespace.ElementName.BODY, CHTMLNamespace.ElementName.HTML}; + + /** + */ + public HedHEAD(ElementCollection collection) { + super(CHTMLNamespace.ElementName.HEAD, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HEAD; + layoutType = LAYOUT_HIDDEN; + omitType = OMIT_BOTH; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>HEAD</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td>%i18n;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * <tr> + * <td>profile</td><td>URI</td><td>#IMPLIED</td><td>N/A</td><td>-</td> + * </tr> + * </tbody> + * </table> + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + } + + /** + * HEAD has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java new file mode 100644 index 0000000000..ed65ab335b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * HR. + */ +final class HedHR extends HedEmpty { + + /** + */ + public HedHR(ElementCollection collection) { + super(CHTMLNamespace.ElementName.HR, collection); + layoutType = LAYOUT_BLOCK; + } + + /** + * %attrs + * (align (left|center|right) #IMPLIED) ... should be defined locally. + * (noshade (noshade) #IMPLIED) + * (size %Pixels; #IMPLIED) + * (width %Length; #IMPLIED) + * (color %Color; #IMPLIED) ... D205514 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (align (left|center|right) #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {CHTMLNamespace.ATTR_VALUE_LEFT, CHTMLNamespace.ATTR_VALUE_CENTER, CHTMLNamespace.ATTR_VALUE_RIGHT}; + atype.setEnumValues(values); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr); + + // the rest. + String[] names = {CHTMLNamespace.ATTR_NAME_NOSHADE, CHTMLNamespace.ATTR_NAME_SIZE, CHTMLNamespace.ATTR_NAME_WIDTH,}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java new file mode 100644 index 0000000000..f0d59262e9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration; + + +/** + * HTML. + */ +final class HedHTML extends HTMLElemDeclImpl { + + private static String[] terminators = {CHTMLNamespace.ElementName.HTML}; + + /** + */ + public HedHTML(ElementCollection collection) { + super(CHTMLNamespace.ElementName.HTML, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HTML; + layoutType = LAYOUT_HIDDEN; + omitType = OMIT_BOTH; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>HTML</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td><code>%i18n;</code></td><td>-</td><td>-</td><td>-</td> + * <td>{@link PDCMDocImpl#getAttrDeclarationsI18n}</td> + * </tr> + * <tr> + * <td>version</td><td>CDATA</td><td>#FIXED</td> + * <td>{@link HTML_VERSION_TRANSITIONAL}</td><td>deplecated in HTML4.01</td> + * </tr> + * </tbody> + * </table><br> + * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + // version + HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(CHTMLNamespace.ATTR_NAME_VERSION); + if (adec != null) + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_VERSION, adec); + } + + /** + * HTML has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java new file mode 100644 index 0000000000..5a89a58c4d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * H[1-6]. + */ +final class HedHeading extends HedInlineContainer { + + /** + */ + public HedHeading(String elementName, ElementCollection collection) { + super(elementName, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>H1</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * <tr> + * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * </tbody> + * </table> + * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>. + * Unfortunately, this <code>align</code> is different from one in + * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration + * of <code>align</code> should be localy created and it shouldn't be registered + * in a <code>HCMDocImpl</code> instance.</p> + * <p>However, %align is used in sevaral times. I wouldn't write same code + * in many times. So, I add a new utility method into <code>CMUtil</code> + * to create the attribute declaration.</p> + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // align + HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph(); + if (attr != null) + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java new file mode 100644 index 0000000000..f7f30c603f --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * IMG. + */ +final class HedIMG extends HedEmpty { + + /** + */ + public HedIMG(ElementCollection collection) { + super(CHTMLNamespace.ElementName.IMG, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * IMG. + * %attrs; + * (src %URI; #REQUIRED): should be defined locally. + * (alt %Text; #REQUIRED) + * (longdesc %URI; #IMPLIED) + * (name CDATA #IMPLIED) + * (height %Length; #IMPLIED) + * (width %Length; #IMPLIED) + * (usemap %URI; #IMPLIED) + * (ismap (ismap) #IMPLIED) + * (align %IAlign; #IMPLIED): should be defined locally. + * (border %Pixels; #IMPLIED) + * (hspace %Pixels; #IMPLIED) + * (vspace %Pixels; #IMPLIED) + * (mapfile %URI; #IMPLIED) + * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (src %URI; #REQUIRED): should be defined locally. + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + atype = new HTMLCMDataTypeImpl(CMDataType.URI); + attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_SRC, attr); + + String[] names = {CHTMLNamespace.ATTR_NAME_ALT, CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_HEIGHT, CHTMLNamespace.ATTR_NAME_WIDTH, CHTMLNamespace.ATTR_NAME_BORDER, CHTMLNamespace.ATTR_NAME_HSPACE, CHTMLNamespace.ATTR_NAME_VSPACE,}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + + // align (local); should be defined locally. + attr = AttributeCollection.createAlignForImage(); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.PRE}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java new file mode 100644 index 0000000000..bf0951ccce --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * INPUT. + */ +final class HedINPUT extends HedEmpty { + + /** + */ + public HedINPUT(ElementCollection collection) { + super(CHTMLNamespace.ElementName.INPUT, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + * INPUT. + * %attrs; + * (type %InputType; TEXT) ... should be defined locally. + * (name CDATA #IMPLIED) + * (value CDATA #IMPLIED) + * (checked (checked) #IMPLIED) + * (disabled (disabled) #IMPLIED) + * (readonly (readonly) #IMPLIED) + * (size CDATA #IMPLIED) ... should be defined locally. + * (maxlength NUMBER #IMPLIED) + * (src %URI; #IMPLIED) + * (alt CDATA #IMPLIED) ... should be defined locally. + * (usemap %URI; #IMPLIED) + * (ismap (ismap) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + * (onselect %Script; #IMPLIED) + * (onchange %Script; #IMPLIED) + * (accept %ContentTypes; #IMPLIED) + * (align %IAlign; #IMPLIED) ... should be defined locally. + * (istyle CDATA #IMPLIED) + * <<D215684 + * (width CDATA; #IMPLIED) + * (height CDATA; #IMPLIED) + * (border CDATA; #IMPLIED) + * D215684 + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + HTMLCMDataTypeImpl atype = null; + HTMLAttrDeclImpl attr = null; + // (type %InputType; TEXT) ... should be defined locally. + // NOTE: %InputType is ENUM; + // (text | password | checkbox | radio | submit | reset | + // file | hidden | image | button) + atype = new HTMLCMDataTypeImpl(CMDataType.ENUM); + String[] values = {CHTMLNamespace.ATTR_VALUE_TEXT, CHTMLNamespace.ATTR_VALUE_PASSWORD, CHTMLNamespace.ATTR_VALUE_CHECKBOX, CHTMLNamespace.ATTR_VALUE_RADIO, CHTMLNamespace.ATTR_VALUE_SUBMIT, CHTMLNamespace.ATTR_VALUE_RESET, CHTMLNamespace.ATTR_VALUE_HIDDEN,}; + atype.setEnumValues(values); + atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, CHTMLNamespace.ATTR_VALUE_TEXT); + attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_TYPE, attr); + + // (size CDATA #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_SIZE, attr); + + // (alt CDATA #IMPLIED) ... should be defined locally. + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALT, attr); + + // (align %IAlign; #IMPLIED) ... should be defined locally. + attr = AttributeCollection.createAlignForImage(); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr); + + // the rest. + String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_VALUE, CHTMLNamespace.ATTR_NAME_CHECKED, CHTMLNamespace.ATTR_NAME_SIZE, CHTMLNamespace.ATTR_NAME_MAXLENGTH, CHTMLNamespace.ATTR_NAME_SRC, CHTMLNamespace.ATTR_NAME_ALT, CHTMLNamespace.ATTR_NAME_ALIGN, CHTMLNamespace.ATTR_NAME_ISTYLE, + //<<D215684 + CHTMLNamespace.ATTR_NAME_WIDTH, CHTMLNamespace.ATTR_NAME_HEIGHT, CHTMLNamespace.ATTR_NAME_BORDER + //<D215684 + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java new file mode 100644 index 0000000000..99f14c90a6 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +/** + * Base class for (%inline;)* containers. + */ +abstract class HedInlineContainer extends HTMLElemDeclImpl { + + /** + * HedInlineContainer. + * @param elementName java.lang.String + * @param collection ElementCollection + */ + public HedInlineContainer(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java new file mode 100644 index 0000000000..6a3a344f4d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +/** + * LI. + */ +final class HedLI extends HedFlowContainer { + + private static String[] terminators = {CHTMLNamespace.ElementName.LI}; + + /** + */ + public HedLI(ElementCollection collection) { + super(CHTMLNamespace.ElementName.LI, collection); + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END_DEFAULT; + } + + /** + * %attrs; + * (type %LIStyle; #IMPLIED) ... should be defined locally. + * (value NUMBER #IMPLIED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + } + + /** + * LI has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java new file mode 100644 index 0000000000..9e457c7963 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +/** + * Base class for list item container declarations. + * - OL, UL, MENU, DIR. + */ +abstract class HedListItemContainer extends HTMLElemDeclImpl { + + /** + */ + public HedListItemContainer(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER; + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + indentChild = true; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java new file mode 100644 index 0000000000..50e020ff1e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * MENU/DIR. + */ +final class HedMENU extends HedListItemContainer { + + /** + */ + public HedMENU(String elementName, ElementCollection collection) { + super(elementName, collection); + } + + /** + * MENU/DIR. + * (compact (compact) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + } + + /** + * Exclusion. + * <code>MENU/DIR</code> has the exclusion. + * It is <code>%block;</code>. + * %block; is: + * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER | + * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR | + * TABLE | FIELDSET | ADDRESS. + * %heading; is: H1 | H2 | H3 | H4 | H5 | H6. + * %list; is : UL | OL | DIR | MENU. + * %preformatted; is PRE. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + // %block; + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + String[] names = {CHTMLNamespace.ElementName.P, CHTMLNamespace.ElementName.H1, CHTMLNamespace.ElementName.H2, CHTMLNamespace.ElementName.H3, CHTMLNamespace.ElementName.H4, CHTMLNamespace.ElementName.H5, CHTMLNamespace.ElementName.H6, CHTMLNamespace.ElementName.UL, CHTMLNamespace.ElementName.OL, CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU, CHTMLNamespace.ElementName.PRE, CHTMLNamespace.ElementName.DL, CHTMLNamespace.ElementName.DIV, CHTMLNamespace.ElementName.CENTER, CHTMLNamespace.ElementName.BLOCKQUOTE, CHTMLNamespace.ElementName.FORM, CHTMLNamespace.ElementName.HR, CHTMLNamespace.ElementName.ADDRESS}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java new file mode 100644 index 0000000000..882eca9843 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * META. + */ +final class HedMETA extends HedEmpty { + + /** + */ + public HedMETA(ElementCollection collection) { + super(CHTMLNamespace.ElementName.META, collection); + layoutType = LAYOUT_HIDDEN; + } + + /** + * META. + * %i18n; + * (http-equiv NAME #IMPLIED) + * (name NAME #IMPLIED) ... should be defined locally. + * (content CDATA #REQUIRED) + * (scheme CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + + // (name NAME #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_NAME, attr); + + // 249493 + atype = new HTMLCMDataTypeImpl(CMDataType.CDATA); + attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_CONTENT, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_CONTENT, attr); + + String[] names = {CHTMLNamespace.ATTR_NAME_HTTP_EQUIV, + // CHTMLNamespace.ATTR_NAME_CONTENT + }; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java new file mode 100644 index 0000000000..b2583d0a20 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * OL. + */ +final class HedOL extends HedListItemContainer { + + /** + */ + public HedOL(ElementCollection collection) { + super(CHTMLNamespace.ElementName.OL, collection); + } + + /** + * OL. + * (type %OLStyle; #IMPLIED) ... should be defined locally. + * (compact (compact) #IMPLIED) + * (start NUMBER #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java new file mode 100644 index 0000000000..84a081d473 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; +import java.util.Iterator; + +/** + * OPTION. + */ +final class HedOPTION extends HedPcdata { + + private static String[] terminators = {CHTMLNamespace.ElementName.OPTION}; + + /** + */ + public HedOPTION(ElementCollection collection) { + super(CHTMLNamespace.ElementName.OPTION, collection); + layoutType = LAYOUT_HIDDEN; + omitType = OMIT_END; + } + + /** + * OPTION. + * %attrs; + * (selected (selected) #IMPLIED) + * (disabled (disabled) #IMPLIED) + * (label %Text; #IMPLIED) + * (value CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {CHTMLNamespace.ATTR_NAME_SELECTED, CHTMLNamespace.ATTR_NAME_VALUE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } + + /** + * OPTION has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + return Arrays.asList(terminators).iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java new file mode 100644 index 0000000000..9619c28997 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Collection; +import java.util.Iterator; +import java.util.Vector; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * P. + */ +final class HedP extends HedInlineContainer { + + private static Collection terminators = null; + + /** + */ + public HedP(ElementCollection collection) { + super(CHTMLNamespace.ElementName.P, collection); + correctionType = CORRECT_EMPTY; + layoutType = LAYOUT_BLOCK; + omitType = OMIT_END; + } + + /** + * Create all attribute declarations. + * This method is called once in the constructor of the super class. + * The <code>P</code> element may have the following attributes: + * <table> + * <tbody> + * <tr> + * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th> + * </tr> + * <tr> + * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * <tr> + * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td> + * </tr> + * </tbody> + * </table> + * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>. + * Unfortunately, this <code>align</code> is different from one in + * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration + * of <code>align</code> should be localy created and it shouldn't be registered + * in a <code>HCMDocImpl</code> instance.</p> + * <p>However, %align is used in sevaral times. I wouldn't write same code + * in many times. So, I add a new utility method into <code>CMUtil</code> + * to create the attribute declaration.</p> + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + // %attrs; + attributeCollection.getAttrs(attributes); + // align + HTMLAttrDeclImpl adec = AttributeCollection.createAlignForParagraph(); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, adec); + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + return prohibitedAncestors; + } + + /** + * Return names of terminators. + * <code>P</code> has terminators. + * @return java.util.Iterator + */ + protected Iterator getTerminators() { + if (terminators != null) + return terminators.iterator(); + //<<D217982 + terminators = new Vector(); + terminators.addAll(elementCollection.getNamesOfBlock()); + terminators.add(CHTMLNamespace.ElementName.LI); + terminators.add(CHTMLNamespace.ElementName.DT); + terminators.add(CHTMLNamespace.ElementName.DD); + //D217982 + return terminators.iterator(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java new file mode 100644 index 0000000000..649d1473d6 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * PRE. + */ +final class HedPRE extends HedInlineContainer { + + /** + * PRE element should keep spaces in its source. + */ + public HedPRE(ElementCollection collection) { + super(CHTMLNamespace.ElementName.PRE, collection); + // CORRECT_EMPTY - GROUP_COMPACT + correctionType = CORRECT_EMPTY; + + keepSpaces = true; + } + + /** + * %attrs; + * (width NUMBER #IMPLIED) ... should be defined locally. + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + // (width NUMBER #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_WIDTH, attr); + } + + /** + * Exclusion. + * <code>PRE</code> has the exclusion. + * It is <code>%pre.exclusion;</code>. + * %pre.exclusion is: + * IMG | OBJECT | APPLET | BIG | SMALL | SUB | SUP | FONT | BASEFONT + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + String[] names = {CHTMLNamespace.ElementName.IMG,}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + + return exclusion; + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java new file mode 100644 index 0000000000..15b13c334e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + * Base class for PCDATA type element declarations.<br> + */ +abstract class HedPcdata extends HTMLElemDeclImpl { + + /** + */ + public HedPcdata(String elementName, ElementCollection collection) { + super(elementName, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PCDATA; + } + + /** + * Content.<br> + * PCDATA type always returns <code>null</code>. + * <br> + * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent + */ + public CMContent getContent() { + return null; + } + + /** + * Content type.<br> + * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration + */ + public int getContentType() { + return CMElementDeclaration.PCDATA; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java new file mode 100644 index 0000000000..cbd0bb80a2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + * SELECT. + */ +final class HedSELECT extends HTMLElemDeclImpl { + + /** + */ + public HedSELECT(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SELECT, collection); + typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_SELECT; + layoutType = LAYOUT_OBJECT; + indentChild = true; + } + + /** + * %attrs; + * %reserved; + * (name CDATA #IMPLIED) + * (size NUMBER #IMPLIED) ... should be defined locally. + * (multiple (multiple) #IMPLIED) + * (disabled (disabled) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + * (onchange %Script; #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + // (size NUMBER #IMPLIED) ... should be defined locally. + HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER); + HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL); + attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_SIZE, attr); + + String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_MULTIPLE,}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java new file mode 100644 index 0000000000..6ffdbe5940 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; + + + + +/** + * Base class for SSI declarations. + */ +abstract class HedSSIBase extends HedEmpty { + + /** + */ + public HedSSIBase(String elementName, ElementCollection collection) { + super(elementName, collection); + layoutType = LAYOUT_OBJECT; + } + + /** + */ + public int getFormatType() { + return HTMLElementDeclaration.FORMAT_SSI; + } + + /** + */ + public boolean supports(String propName) { + if (propName.equals(HTMLCMProperties.IS_SSI)) + return true; + return super.supports(propName); + } + + /* + */ + public Object getProperty(String propName) { + if (propName.equals(HTMLCMProperties.IS_SSI)) + return new Boolean(true); + return super.getProperty(propName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java new file mode 100644 index 0000000000..d5e92e341d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:CONFIG. + */ +final class HedSSIConfig extends HedSSIBase { + + /** + */ + public HedSSIConfig(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_CONFIG, collection); + } + + /** + * SSI:CONFIG. + * (errmsg CDATA #IMPLIED) + * (sizefmt CDATA #IMPLIED) + * (timefmt CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_ERRMSG, CHTMLNamespace.ATTR_NAME_SIZEFMT, CHTMLNamespace.ATTR_NAME_TIMEFMT}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java new file mode 100644 index 0000000000..3cf3f7c2bf --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:ECHO. + */ +final class HedSSIEcho extends HedSSIBase { + + /** + */ + public HedSSIEcho(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_ECHO, collection); + } + + /** + * SSI:ECHO + * (var CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_VAR}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java new file mode 100644 index 0000000000..e97cb5d6b7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:EXEC. + */ +final class HedSSIExec extends HedSSIBase { + + /** + */ + public HedSSIExec(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_EXEC, collection); + } + + /** + * SSI:EXEC + * (cgi %URI; #IMPLIED) + * (cmd CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_CGI, CHTMLNamespace.ATTR_NAME_CMD}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java new file mode 100644 index 0000000000..75eaf9d1c1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:FLASTMOD. + */ +final class HedSSIFlastmod extends HedSSIBase { + + /** + */ + public HedSSIFlastmod(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_FLASTMOD, collection); + } + + /** + * SSI:FLASTMOD + * (file %URI; #IMPLIED) + * (virtual %URI #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_FILE, CHTMLNamespace.ATTR_NAME_VIRTUAL}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java new file mode 100644 index 0000000000..3fbf3c11fd --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:FSIZE. + */ +final class HedSSIFsize extends HedSSIBase { + + /** + */ + public HedSSIFsize(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_FSIZE, collection); + } + + /** + * SSI:FSIZE + * (file %URI; #IMPLIED) + * (virtual %URI #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_FILE, CHTMLNamespace.ATTR_NAME_VIRTUAL}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java new file mode 100644 index 0000000000..4788b5e161 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:INCLUDE. + */ +final class HedSSIInclude extends HedSSIBase { + + /** + */ + public HedSSIInclude(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_INCLUDE, collection); + } + + /** + * SSI:INCLUDE + * (file %URI; #IMPLIED) + * (virtual %URI #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_FILE, CHTMLNamespace.ATTR_NAME_VIRTUAL}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java new file mode 100644 index 0000000000..0064a4f0cd --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * SSI:PRINTENV. + */ +final class HedSSIPrintenv extends HedSSIBase { + + /** + */ + public HedSSIPrintenv(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_PRINTENV, collection); + } + + /** + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + } + + /** + * SSI:PRINTENV has no attributes. So, this method should + * always return <code>null</code>. + * Note: Since somebody doesn't expect null is returned, return the empty attribute + * like a custom tag which doesn't have attributes + */ + public CMNamedNodeMap getAttributes() { + return super.getAttributes(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java new file mode 100644 index 0000000000..e1a8e1d627 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * SSI:SET. + */ +final class HedSSISet extends HedSSIBase { + + /** + */ + public HedSSISet(ElementCollection collection) { + super(CHTMLNamespace.ElementName.SSI_SET, collection); + } + + /** + * SSI:SET + * (var CDATA #IMPLIED) + * (value CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + String[] names = {CHTMLNamespace.ATTR_NAME_VAR, CHTMLNamespace.ATTR_NAME_VALUE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java new file mode 100644 index 0000000000..bef9535cf1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +/** + * TEXTAREA. + */ +final class HedTEXTAREA extends HedPcdata { + + /** + * TEXTAREA should keep spaces in its source. + */ + public HedTEXTAREA(ElementCollection collection) { + super(CHTMLNamespace.ElementName.TEXTAREA, collection); + layoutType = LAYOUT_OBJECT; + + keepSpaces = true; + } + + /** + * TEXTAREA. + * %attrs; + * %reserved; ... empty + * (name CDATA #IMPLIED) + * (rows NUMBER #REQUIRED) + * (cols NUMBER #REQUIRED) + * (disabled (disabled) #IMPLIED) + * (readonly (readonly) #IMPLIED) + * (tabindex NUMBER #IMPLIED) + * (accesskey %Character; #IMPLIED) + * (onfocus %Script; #IMPLIED) + * (onblur %Script; #IMPLIED) + * (onselect %Script; #IMPLIED) + * (onchange %Script; #IMPLIED) + * (istyle CDATA #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_ROWS, CHTMLNamespace.ATTR_NAME_COLS, CHTMLNamespace.ATTR_NAME_ISTYLE}; + attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator()); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java new file mode 100644 index 0000000000..ad6a7429e4 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import java.util.Arrays; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; + +/** + * TITLE. + */ +final class HedTITLE extends HedPcdata { + + /** + */ + public HedTITLE(ElementCollection collection) { + super(CHTMLNamespace.ElementName.TITLE, collection); + layoutType = LAYOUT_HIDDEN; + } + + /** + * TITLE. + * %i18n; + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %i18n; + attributeCollection.getI18n(attributes); + } + + /** + * Exclusion. + * <code>TITLE</code> has the exclusion. + * It is <code>%head.misc;</code>. + * %head.misc; is <code>SCRIPT|STYLE|META|LINK|OBJECT</code>. + * <br> + * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration + */ + public CMContent getExclusion() { + if (exclusion != null) + return exclusion; // already created. + if (elementCollection == null) + return null; + + // (SCRIPT|STYLE|META|LINK|OBJECT) + exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1); + + String[] names = {CHTMLNamespace.ElementName.META,}; + elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator()); + return exclusion; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java new file mode 100644 index 0000000000..15ddbc1451 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; + +/** + * UL. + */ +final class HedUL extends HedListItemContainer { + + /** + */ + public HedUL(ElementCollection collection) { + super(CHTMLNamespace.ElementName.UL, collection); + } + + /** + * UL. + * (type %ULStyle; #IMPLIED) ... should be defined locally. + * (compact (compact) #IMPLIED) + */ + protected void createAttributeDeclarations() { + if (attributes != null) + return; // already created. + if (attributeCollection == null) + return; // fatal + + attributes = new CMNamedNodeMapImpl(); + + // %attrs; + attributeCollection.getAttrs(attributes); + + } + + /** + */ + public CMNamedNodeMap getProhibitedAncestors() { + if (prohibitedAncestors != null) + return prohibitedAncestors; + + String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU}; + prohibitedAncestors = elementCollection.getDeclarations(names); + + return prohibitedAncestors; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java new file mode 100644 index 0000000000..6ed567daaf --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; + + + +/** + * PropertyProvider class. + * This class is intended to be used in HTMLElementDeclaration instances. + */ +interface PropertyProvider { + + boolean supports(HTMLElementDeclaration edecl); + + Object get(HTMLElementDeclaration edecl); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java new file mode 100644 index 0000000000..847610309d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java @@ -0,0 +1,363 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.chtml; + +import java.util.Hashtable; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.annotation.AnnotationMap; + +/** + * The factory object of PropertyProvider. + */ +final class PropertyProviderFactory { + + + /** + * DefaultProvider is intended to be used for unknown properties. + * It always returns null value for any properties. + */ + class DefaultProvider implements PropertyProvider { + public DefaultProvider() { + super(); + } + + public boolean supports(HTMLElementDeclaration edecl) { + return false; + } + + public Object get(HTMLElementDeclaration edecl) { + return null; + } + } + + abstract class AbstractElementPropertyProvider implements PropertyProvider { + protected AbstractElementPropertyProvider() { + super(); + } + + public boolean supports(HTMLElementDeclaration edecl) { + return (edecl != null); + } + + public Object get(HTMLElementDeclaration edecl) { + if (!(edecl instanceof HTMLPropertyDeclaration)) + return null; + return getElementProperty((HTMLPropertyDeclaration)edecl); + } + + abstract protected Object getElementProperty(HTMLPropertyDeclaration decl); + } + + /* + * "tagInfo" + * gets documentation for the element + */ + class PPTagInfo extends AbstractElementPropertyProvider { + private final static String htmlAnnotationLoc = "platform:/plugin/org.eclipse.wst.html.core/data/htmref.xml"; //$NON-NLS-1$ + protected AnnotationMap fAnnotationMap = null; + + public PPTagInfo() { + super(); + } + + /** + * Gets the annotationMap. + * @return Returns a AnnotationMap + */ + protected AnnotationMap getAnnotationMap() { + if (fAnnotationMap == null) { + fAnnotationMap = new AnnotationMap(); + try { + fAnnotationMap.load(htmlAnnotationLoc); + } + catch (Exception e) { + // no annotation available + } + } + return fAnnotationMap; + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + if (decl instanceof HTMLElementDeclaration) { + return getAnnotationMap().getProperty(((HTMLElementDeclaration)decl).getElementName(), "tagInfo"); //$NON-NLS-1$ + } else { + return null; + } + } + } + + /* + * "shouldKeepSpace" + */ + class PPShouldKeepSpace extends AbstractElementPropertyProvider { + public PPShouldKeepSpace() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(decl.shouldKeepSpaces()); + } + } + + /* + * "shouldIndentChildSource" + */ + class PPShouldIndentChildSource extends AbstractElementPropertyProvider { + public PPShouldIndentChildSource() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(decl.shouldIndentChildSource()); + } + } + + /* + * "terminators" + */ + class PPTerminators extends AbstractElementPropertyProvider { + public PPTerminators() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + if (decl == null) + return null; + if (! (decl instanceof HTMLElemDeclImpl)) return null; + return ((HTMLElemDeclImpl)decl).getTerminators(); + } + } + + /* + * "prohibitedAncestors" + */ + class PPProhibitedAncestors extends AbstractElementPropertyProvider { + public PPProhibitedAncestors() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return decl.getProhibitedAncestors(); + } + } + + /* + * "isJSP" + */ + class PPIsJSP extends AbstractElementPropertyProvider { + public PPIsJSP() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(decl.isJSP()); + } + } + + /* + * "isXHTML" + * HTMLElementDeclaration itself never represent any XHTML element declaration. + * So, this property must be always false. + */ + class PPIsXHTML extends AbstractElementPropertyProvider { + public PPIsXHTML() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(false); + } + } + + /* + * "isSSI" + * Each declaration class for SSI elements must provide this property itself, + * and then return true. Other declaration must always return false. + */ + class PPIsSSI extends AbstractElementPropertyProvider { + public PPIsSSI() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return new Boolean(false); + } + } + + /* + * "lineBreakHint" + */ + class PPLineBreakHint extends AbstractElementPropertyProvider { + public PPLineBreakHint() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + String hint = HTMLCMProperties.Values.BREAK_NONE; + switch (decl.getLineBreakHint()) { + case HTMLElementDeclaration.BREAK_AFTER_START : + hint = HTMLCMProperties.Values.BREAK_AFTER_START; + break; + case HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END : + hint = HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END; + break; + case HTMLElementDeclaration.BREAK_NONE : + // nothing to do + default : + break; + } + return hint; + } + } + + /* + * "layoutType" + */ + class PPLayoutType extends AbstractElementPropertyProvider { + public PPLayoutType() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + String type = HTMLCMProperties.Values.LAYOUT_NONE; + switch (decl.getLayoutType()) { + case HTMLElementDeclaration.LAYOUT_BLOCK : + type = HTMLCMProperties.Values.LAYOUT_BLOCK; + break; + case HTMLElementDeclaration.LAYOUT_BREAK : + type = HTMLCMProperties.Values.LAYOUT_BREAK; + break; + case HTMLElementDeclaration.LAYOUT_HIDDEN : + type = HTMLCMProperties.Values.LAYOUT_HIDDEN; + break; + case HTMLElementDeclaration.LAYOUT_OBJECT : + type = HTMLCMProperties.Values.LAYOUT_OBJECT; + break; + case HTMLElementDeclaration.LAYOUT_WRAP : + type = HTMLCMProperties.Values.LAYOUT_WRAP; + break; + case HTMLElementDeclaration.LAYOUT_NONE : + // nothing to do. + default : + break; + } + return type; + } + } + + /* + * "omitType" + */ + class PPOmitType extends AbstractElementPropertyProvider { + public PPOmitType() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + String type = HTMLCMProperties.Values.OMIT_NONE; + switch (decl.getOmitType()) { + case HTMLElementDeclaration.OMIT_BOTH : + type = HTMLCMProperties.Values.OMIT_BOTH; + break; + case HTMLElementDeclaration.OMIT_END : + type = HTMLCMProperties.Values.OMIT_END; + break; + case HTMLElementDeclaration.OMIT_END_DEFAULT : + type = HTMLCMProperties.Values.OMIT_END_DEFAULT; + break; + case HTMLElementDeclaration.OMIT_END_MUST : + type = HTMLCMProperties.Values.OMIT_END_MUST; + break; + case HTMLElementDeclaration.OMIT_NONE : + // nothing to do. + default : + break; + } + return type; + } + } + + /* + * "inclusion" + */ + class PPInclusion extends AbstractElementPropertyProvider { + public PPInclusion() { + super(); + } + + protected Object getElementProperty(HTMLPropertyDeclaration decl) { + return decl.getInclusion(); + } + } + + public static PropertyProvider getProvider(String propName) { + PropertyProviderFactory factory = getInstance(); + PropertyProvider pp = (PropertyProvider) factory.registry.get(propName); + if (pp != null) + return pp; + + pp = factory.create(propName); + if (pp == null) + return factory.defaultProvider; + + factory.registry.put(propName, pp); + return pp; + } + + private static PropertyProviderFactory instance = null; + + private synchronized static PropertyProviderFactory getInstance() { + if (instance != null) + return instance; + instance = new PropertyProviderFactory(); + return instance; + } + + private Hashtable registry = new Hashtable(); + private PropertyProvider defaultProvider = new DefaultProvider(); + + private PropertyProviderFactory() { + super(); + } + + private PropertyProvider create(String propName) { + PropertyProvider pp = null; + if (propName.equals(HTMLCMProperties.IS_JSP)) + pp = new PPIsJSP(); + else if (propName.equals(HTMLCMProperties.IS_XHTML)) + pp = new PPIsXHTML(); + else if (propName.equals(HTMLCMProperties.IS_SSI)) + pp = new PPIsSSI(); + else if (propName.equals(HTMLCMProperties.LAYOUT_TYPE)) + pp = new PPLayoutType(); + else if (propName.equals(HTMLCMProperties.LINE_BREAK_HINT)) + pp = new PPLineBreakHint(); + else if (propName.equals(HTMLCMProperties.PROHIBITED_ANCESTORS)) + pp = new PPProhibitedAncestors(); + else if (propName.equals(HTMLCMProperties.SHOULD_KEEP_SPACE)) + pp = new PPShouldKeepSpace(); + else if (propName.equals(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)) + pp = new PPShouldIndentChildSource(); + else if (propName.equals(HTMLCMProperties.TERMINATORS)) + pp = new PPTerminators(); + else if (propName.equals(HTMLCMProperties.TAGINFO)) + pp = new PPTagInfo(); + else if (propName.equals(HTMLCMProperties.OMIT_TYPE)) + pp = new PPOmitType(); + else if (propName.equals(HTMLCMProperties.INCLUSION)) + pp = new PPInclusion(); + + return pp; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java new file mode 100644 index 0000000000..7de746b01c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.contentmodel.ssi; + +import java.util.Hashtable; +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; + +/** + * CMDocument factory for SSI documents. + */ +public final class SSICMDocumentFactory { + + private final static String PREFIX = "SSI";//$NON-NLS-1$ + private final static String DOC_TYPE_NAME = "SSI";//$NON-NLS-1$ + + static class CMNamespaceImpl implements CMNamespace { + public CMNamespaceImpl() { + super(); + } + + public String getPrefix() { + return PREFIX; + } + + public String getURI() { + return ""; //$NON-NLS-1$ + } + + public String getNodeName() { + return DOC_TYPE_NAME; + } + + public int getNodeType() { + return CMNode.NAME_SPACE; + } + + public boolean supports(String propertyName) { + return false; + } + + public Object getProperty(String propertyName) { + return null; + } + + } + + static class CMDocImpl implements CMDocument { + private static CMDocument hcm = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE); + + static class Elements implements CMNamedNodeMap { + private static String[] names = {HTML40Namespace.ElementName.SSI_CONFIG, HTML40Namespace.ElementName.SSI_ECHO, HTML40Namespace.ElementName.SSI_EXEC, HTML40Namespace.ElementName.SSI_FSIZE, HTML40Namespace.ElementName.SSI_FLASTMOD, HTML40Namespace.ElementName.SSI_INCLUDE, HTML40Namespace.ElementName.SSI_PRINTENV, HTML40Namespace.ElementName.SSI_SET}; + private Hashtable map = new Hashtable(); + + public Elements() { + CMNamedNodeMap elems = hcm.getElements(); + for (int i = 0; i < names.length; i++) { + String name = names[i]; + CMElementDeclaration dec = (CMElementDeclaration) elems.getNamedItem(name); + if (dec != null) + map.put(name, dec); + } + } + + public int getLength() { + return map.size(); + } + + public CMNode getNamedItem(String name) { + String cooked = getCanonicalName(name); + if (!map.containsKey(cooked)) + return null; + return (CMNode) map.get(cooked); + } + + public CMNode item(int index) { + Iterator iter = iterator(); + while (iter.hasNext()) { + Object node = iter.next(); + if (--index < 0) + return (CMNode) node; + } + return null; + } + + public Iterator iterator() { + return map.values().iterator(); + } + + private String getCanonicalName(String rawName) { + return rawName.toUpperCase(); + } + } + + static private Elements elements = new Elements(); + + + public CMDocImpl() { + super(); + } + + public String getNodeName() { + return ""; //$NON-NLS-1$ + } + + public int getNodeType() { + return CMNode.DOCUMENT; + } + + public CMNamedNodeMap getElements() { + return elements; + } + + public CMNamedNodeMap getEntities() { + return null; + } + + public CMNamespace getNamespace() { + return ssins; + } + + public Object getProperty(String propertyName) { + return null; + } + + public boolean supports(String propertyName) { + return false; + } + } + + private static CMNamespace ssins = new CMNamespaceImpl(); + private static CMDocument mycm = new CMDocImpl(); + + private SSICMDocumentFactory() { + super(); + } + + public static CMDocument getCMDocument() { + return mycm; + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java new file mode 100644 index 0000000000..7dbc200de0 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2001, 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +/* + * Created on Sep 2, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.wst.html.core.internal.document; + +import org.eclipse.wst.xml.core.internal.document.DOMModelImpl; +import org.w3c.dom.Document; + +/** + * @author davidw + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class DOMStyleModelImpl extends DOMModelImpl { + public DOMStyleModelImpl() { + // remember, the document is created in super constructor, + // via internalCreateDocument + super(); + } + + public void releaseFromEdit() { + releaseStyleSheets(); + super.releaseFromEdit(); + } + + /** + */ + public void releaseFromRead() { + releaseStyleSheets(); + super.releaseFromRead(); + } + + private void releaseStyleSheets() { + if (!isShared()) { + Document doc = getDocument(); + if (doc instanceof DocumentStyleImpl) { + ((DocumentStyleImpl) doc).releaseStyleSheets(); + } + } + } + + /** + * createDocument method + * @return org.w3c.dom.Document + */ + protected Document internalCreateDocument() { + DocumentStyleImpl document = new DocumentStyleImpl(); + document.setModel(this); + return document; + } + + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java new file mode 100644 index 0000000000..e464beeb5a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +/* + * Created on Sep 2, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.wst.html.core.internal.document; + +import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.eclipse.wst.xml.core.internal.document.DocumentImpl; +import org.w3c.dom.DOMException; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.css.CSSStyleDeclaration; +import org.w3c.dom.css.DocumentCSS; +import org.w3c.dom.stylesheets.StyleSheetList; + +/** + * @author davidw + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class DocumentStyleImpl extends DocumentImpl implements IDOMDocument, DocumentCSS { + public DocumentStyleImpl() { + super(); + } + + protected DocumentStyleImpl(DocumentImpl that) { + super(that); + } + + public CSSStyleDeclaration getOverrideStyle(Element element, String pseudoName) { + INodeAdapter adapter = getAdapterFor(IStyleSheetListAdapter.class); + if (adapter == null) + return null; + return ((IStyleSheetListAdapter) adapter).getOverrideStyle(element, pseudoName); + } + + public StyleSheetList getStyleSheets() { + INodeAdapter adapter = getAdapterFor(IStyleSheetListAdapter.class); + if (adapter == null) + return null; + return ((IStyleSheetListAdapter) adapter).getStyleSheets(); + } + + protected void releaseStyleSheets() { + INodeAdapter adapter = getExistingAdapter(IStyleSheetListAdapter.class); + if (adapter == null) + return; + ((IStyleSheetListAdapter) adapter).releaseStyleSheets(); + } + + /** + * createElement method + * @return org.w3c.dom.Element + * @param tagName java.lang.String + */ + public Element createElement(String tagName) throws DOMException { + checkTagNameValidity(tagName); + + ElementStyleImpl element = new ElementStyleImpl(); + element.setOwnerDocument(this); + element.setTagName(tagName); + return element; + } + + /** + * cloneNode method + * @return org.w3c.dom.Node + * @param deep boolean + */ + public Node cloneNode(boolean deep) { + DocumentStyleImpl cloned = new DocumentStyleImpl(this); + if (deep) + cloned.importChildNodes(this, true); + return cloned; + } + + protected void setModel(IDOMModel model) { + super.setModel(model); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java new file mode 100644 index 0000000000..2198b24145 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +/* + * Created on Sep 2, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.wst.html.core.internal.document; + +import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleDeclarationAdapter; +import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.internal.document.ElementImpl; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.css.CSSStyleDeclaration; +import org.w3c.dom.css.ElementCSSInlineStyle; +import org.w3c.dom.stylesheets.LinkStyle; +import org.w3c.dom.stylesheets.StyleSheet; + +public class ElementStyleImpl extends ElementImpl implements IDOMElement, ElementCSSInlineStyle, LinkStyle { + public ElementStyleImpl() { + super(); + } + + public ElementStyleImpl(ElementImpl that) { + super(that); + } + + public StyleSheet getSheet() { + INodeAdapter adapter = getAdapterFor(IStyleSheetAdapter.class); + if (adapter == null) + return null; + if (!(adapter instanceof IStyleSheetAdapter)) + return null; + return ((IStyleSheetAdapter) adapter).getSheet(); + } + + public CSSStyleDeclaration getStyle() { + INodeAdapter adapter = getAdapterFor(IStyleDeclarationAdapter.class); + if (adapter == null) + return null; + if (!(adapter instanceof IStyleDeclarationAdapter)) + return null; + return ((IStyleDeclarationAdapter) adapter).getStyle(); + } + + protected void setOwnerDocument(Document ownerDocument) { + super.setOwnerDocument(ownerDocument); + } + + protected void setTagName(String tagName) { + super.setTagName(tagName); + } + + public Node cloneNode(boolean deep) { + ElementImpl cloned = new ElementStyleImpl(this); + if (deep) + cloneChildNodes(cloned, deep); + return cloned; + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java new file mode 100644 index 0000000000..9d9e9da409 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java @@ -0,0 +1,302 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.wst.html.core.internal.cleanup.HTMLCleanupProcessorImpl; +import org.eclipse.wst.sse.core.IModelManager; +import org.eclipse.wst.sse.core.IStructuredModel; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences; +import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames; +import org.eclipse.wst.sse.core.text.IStructuredDocument; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.document.IDOMDocumentType; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.ProcessingInstruction; +import org.w3c.dom.Text; + +/** + */ +public class HTMLConverter { + + /** + */ + public HTMLConverter() { + super(); + + } + + public void cleanupModel(IDOMModel model) { + if (model == null) + return; + + HTMLCleanupProcessorImpl processor = new HTMLCleanupProcessorImpl(); + IStructuredCleanupPreferences pref = processor.getCleanupPreferences(); + + // backup options + boolean compressEmptyElementTags = pref.getCompressEmptyElementTags(); + boolean insertRequiredAttrs = pref.getInsertRequiredAttrs(); + boolean insertMissingTags = pref.getInsertMissingTags(); + boolean quoteAttrValues = pref.getQuoteAttrValues(); + boolean formatSource = pref.getFormatSource(); + int tagNameCase = pref.getTagNameCase(); + int attrNameCase = pref.getAttrNameCase(); + + // setup options + pref.setCompressEmptyElementTags(true); + pref.setInsertRequiredAttrs(true); + pref.setInsertMissingTags(true); + pref.setQuoteAttrValues(true); + pref.setFormatSource(false); + if (model.getDocument().isXMLType()) { // XHTML + pref.setTagNameCase(CommonModelPreferenceNames.LOWER); + pref.setAttrNameCase(CommonModelPreferenceNames.LOWER); + } + else { + pref.setTagNameCase(CommonModelPreferenceNames.ASIS); + pref.setAttrNameCase(CommonModelPreferenceNames.ASIS); + } + + processor.cleanupModel(model); + + // set back options + pref.setCompressEmptyElementTags(compressEmptyElementTags); + pref.setInsertRequiredAttrs(insertRequiredAttrs); + pref.setInsertMissingTags(insertMissingTags); + pref.setQuoteAttrValues(quoteAttrValues); + pref.setFormatSource(formatSource); + pref.setTagNameCase(tagNameCase); + pref.setAttrNameCase(attrNameCase); + } + + /** + * declaratoin: "data" for XML declaration, such as "version=\"1.0\"" + * publicId: publicId for DOCTYPE declaration + */ + public void convert(IDOMModel model, String declaration, String publicId) { + if (model == null) + return; + setDeclaration(model, declaration, publicId); + cleanupModel(model); + } + + /** + * declaratoin: "data" for XML declaration, such as "version=\"1.0\"" + * publicId: publicId for DOCTYPE declaration + */ + public void convert(InputStream input, OutputStream output, String declaration, String publicId) throws UnsupportedEncodingException, IOException, CoreException { + IDOMModel model = readModel(input); + if (model == null) + return; + try { + convert(model, declaration, publicId); + writeModel(model, output); + } + finally { + if (model != null) + model.releaseFromEdit(); + } + } + + /** + * declaratoin: "data" for XML declaration, such as "version=\"1.0\"" + * publicId: publicId for DOCTYPE declaration + */ + public void convert(IFile file, String declaration, String publicId) throws IOException, CoreException { + IDOMModel model = readModel(file); + if (model == null) + return; + try { + convert(model, declaration, publicId); + writeModel(model, file); + } + finally { + if (model != null) + model.releaseFromEdit(); + } + } + + /** + */ + private static void insertBreak(IDOMModel model, Node node) { + if (model == null || node == null) + return; + if (node.getNodeType() == Node.TEXT_NODE) + return; + + // get delimiter string + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument == null) + return; + String delim = structuredDocument.getLineDelimiter(); + if (delim == null || delim.length() == 0) + return; + + Node parent = node.getParentNode(); + if (parent == null) + return; + Document document = node.getOwnerDocument(); + if (document == null) + return; + Text text = document.createTextNode(delim); + parent.insertBefore(text, node); + } + + /** + */ + private IDOMModel readModel(InputStream input) throws IOException, UnsupportedEncodingException { + if (input == null) + return null; + // create temporary model + String id = input.toString() + ".html"; //$NON-NLS-1$ + IModelManager manager = StructuredModelManager.getModelManager(); + IStructuredModel model = manager.getModelForEdit(id, input, null); + if (!(model instanceof IDOMModel)) { + if (model == null) + model.releaseFromEdit(); + return null; + } + return (IDOMModel) model; + } + + /** + */ + private IDOMModel readModel(IFile file) throws IOException, CoreException { + if (file == null) + return null; + IModelManager manager = StructuredModelManager.getModelManager(); + IStructuredModel model = manager.getModelForEdit(file); + if (!(model instanceof IDOMModel)) { + if (model != null) + model.releaseFromEdit(); + return null; + } + return (IDOMModel) model; + } + + /** + */ + public void setDeclaration(IDOMModel model, String declaration, String publicId) { + if (model == null) + return; + IDOMDocument document = model.getDocument(); + if (document == null) + return; + + try { + model.aboutToChangeModel(); + + ProcessingInstruction pi = null; + Node child = document.getFirstChild(); + if (child != null && child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) { + String target = child.getNodeName(); + if (target != null && target.equals("xml")) { //$NON-NLS-1$ + pi = (ProcessingInstruction) child; + child = child.getNextSibling(); + } + } + IDOMDocumentType docType = (IDOMDocumentType) document.getDoctype(); + + if (declaration != null) { + if (pi != null) { + pi.setData(declaration); + } + else { + pi = document.createProcessingInstruction("xml", declaration); //$NON-NLS-1$ + document.insertBefore(pi, child); + insertBreak(model, child); + } + } + + if (publicId != null) { + HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(publicId); + String name = (entry != null ? entry.getName() : null); + if (name == null || name.length() == 0) + name = "HTML"; // default //$NON-NLS-1$ + if (docType != null) { + if (!name.equals(docType.getName())) { // replace + Node parent = docType.getParentNode(); + child = docType; + docType = (IDOMDocumentType) document.createDoctype(name); + parent.insertBefore(docType, child); + parent.removeChild(child); + } + } + else { + docType = (IDOMDocumentType) document.createDoctype(name); + document.insertBefore(docType, child); + insertBreak(model, child); + } + docType.setPublicId(publicId); + if (entry != null) { + String systemId = entry.getSystemId(); + if (systemId != null) + docType.setSystemId(systemId); + String namespaceURI = entry.getNamespaceURI(); + if (namespaceURI != null) { + Element element = document.getDocumentElement(); + if (element != null) { + element.setAttribute("xmlns", namespaceURI); //$NON-NLS-1$ + } + } + } + } + } + finally { + model.changedModel(); + } + } + + /** + */ + private void writeModel(IDOMModel model, OutputStream output) throws UnsupportedEncodingException, IOException, CoreException { + if (model == null || output == null) + return; + model.save(); + } + + /** + */ + private void writeModel(IDOMModel model, IFile file) throws IOException, CoreException { + if (model == null || file == null) + return; + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument == null) + return; + //ByteArrayOutputStream output = null; + ByteArrayInputStream input = null; + try { + //output = new + // ByteArrayOutputStream(structuredDocument.getLength()); + model.save(); + //input = new ByteArrayInputStream(output.toByteArray()); + //file.setContents(input, true, true, null); + } + finally { + // if (output != null) + // output.close(); + if (input != null) + input.close(); + } + + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java new file mode 100644 index 0000000000..49d80e53bd --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java @@ -0,0 +1,303 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.IStructuredModel; +import org.eclipse.wst.sse.ui.contentproperties.ContentSettings; +import org.eclipse.wst.sse.ui.contentproperties.ContentSettingsChangeSubject; +import org.eclipse.wst.sse.ui.contentproperties.IContentSettings; +import org.eclipse.wst.sse.ui.contentproperties.IContentSettingsListener; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.document.IDOMDocumentType; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter; +import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapterImpl; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentType; +import org.w3c.dom.Node; + +/** + */ +public class HTMLDocumentTypeAdapter extends DocumentTypeAdapterImpl implements IContentSettingsListener, HTMLDocumentTypeConstants { + + private HTMLDocumentTypeAdapterFactory factory = null; + private HTMLDocumentTypeEntry entry = null; + private boolean isXMLType = false; + private final static String XML = "xml"; //$NON-NLS-1$ + private final static String XHTML = "xhtml"; //$NON-NLS-1$ + private final static String WML = "wml"; //$NON-NLS-1$ + + + /** + */ + protected HTMLDocumentTypeAdapter() { + super(); + } + + /** + */ + protected HTMLDocumentTypeAdapter(IDOMDocument document, HTMLDocumentTypeAdapterFactory factory) { + super(document); + + this.factory = factory; + + // initialize + documentTypeChanged(); + + ContentSettingsChangeSubject.getSubject().addListener(this); + } + + /** + */ + public void contentSettingsChanged(IResource resource) { + if (resource == null) + return; + IDOMDocument document = getDocument(); + if (document == null) + return; + IDOMModel model = document.getModel(); + if (model == null) + return; + IFile file = getFile(model); + if (file == null) + return; + IProject project = file.getProject(); + if (project == null) + return; + if (!project.equals(resource.getProject())) + return; + documentTypeChanged(); + } + + /** + */ + private void documentTypeChanged() { + IDOMDocument document = getDocument(); + if (document == null) + return; // error + IDOMModel model = document.getModel(); + if (model == null) + return; // error + + IFile file = getFile(model); + + // find DOCTYPE delcaration and Public ID + String publicId = null; + DocumentType newDocumentType = findDocumentType(document); + if (newDocumentType != null) { + publicId = newDocumentType.getPublicId(); + } else { + // lookup default set by contentsettings + publicId = getDefaultPublicId(file); + } + + // lookup DOCTYPE registry + HTMLDocumentTypeEntry newEntry = null; + if (publicId != null) { + newEntry = HTMLDocumentTypeRegistry.getInstance().getEntry(publicId); + } + + boolean newXMLType = (newEntry != null ? newEntry.isXMLType() : false); + boolean newWMLType = (newEntry != null ? newEntry.isWMLType() : false); + + if (!newXMLType) { + // find XML declaration + if (findXMLNode(document) != null) { + newXMLType = true; + } + + // check file extension + if (file != null) { + String ext = file.getFileExtension(); + if (ext != null && ext.equalsIgnoreCase(XHTML)) { + newXMLType = true; + } + + if (ext != null && ext.equalsIgnoreCase(WML)) { + newXMLType = true; + newWMLType = true; + } + } + + } + + if (newEntry == null) { + // lookup system default + if (newXMLType && newDocumentType == null) { + // use default XHTML, if it's XML and no document type + // declared + if (newWMLType) + newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_WML); + else + newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_XHTML); + + } else { + newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_HTML); + } + if (newEntry == null) + return; // error + } + + if (newDocumentType == null) { + DocumentType oldDocumentType = getDocumentType(); + if (oldDocumentType == null || oldDocumentType.getName() != newEntry.getName()) { + // create implicit DocumentType + DOMImplementation impl = document.getImplementation(); + if (impl != null) { + String name = newEntry.getName(); + publicId = newEntry.getPublicId(); + String systemId = newEntry.getSystemId(); + newDocumentType = impl.createDocumentType(name, publicId, systemId); + } + } + } + + boolean notify = false; + if (this.entry != null) { // do not notify on initialization + notify = (newEntry != this.entry || newXMLType != this.isXMLType); + } + + if (newDocumentType != null) + setDocumentType(newDocumentType); + this.entry = newEntry; + this.isXMLType = newXMLType; + + if (notify) + notifyDocumentTypeChanged(); + } + + /** + */ + private IDOMDocumentType findDocumentType(IDOMDocument document) { + IDOMDocumentType documentType = (IDOMDocumentType) document.getDoctype(); + if (documentType != null && documentType.getExistingAdapter(DocumentTypeAdapter.class) == null) { + // watch future changes + documentType.addAdapter(this); + } + return documentType; + } + + /** + */ + private Node findXMLNode(Document document) { + for (Node child = document.getFirstChild(); child != null; child = child.getNextSibling()) { + if (child.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) + continue; + String target = child.getNodeName(); + if (target != null && target.equals(XML)) { + return child; + } + } + return null; + } + + /** + */ + public int getAttrNameCase() { + if (isXMLType()) + return LOWER_CASE; // XHTML + return this.factory.getAttrNameCase(); + } + + /** + */ + private String getDefaultPublicId(IFile file) { + if (file == null) + return null; + IProject project = file.getProject(); + if (project == null) + return null; + IContentSettings settings = ContentSettings.getInstance(); + if (settings == null) + return null; + String publicId = settings.getProperty(file, IContentSettings.HTML_DOCUMENT_TYPE); + if (publicId == null || publicId.length() == 0) { + // look up project default + publicId = settings.getProperty(project, IContentSettings.HTML_DOCUMENT_TYPE); + } + return publicId; + } + + private IFile getFile(IStructuredModel model) { + IFile result = null; + String location = model.getBaseLocation(); + if (location != null) { + IPath path = new Path(location); + if (!path.toFile().exists() && path.segmentCount() > 1) { + result = ResourcesPlugin.getWorkspace().getRoot().getFile(path); + } + } + return result; + } + + /** + */ + public int getTagNameCase() { + if (isXMLType()) + return LOWER_CASE; // XHTML + return this.factory.getTagNameCase(); + } + + /** + */ + public boolean hasFeature(String feature) { + if (feature == null) + return false; + if (feature.equals(HTML)) + return true; + if (feature.equals(SSI)) + return true; + if (feature.equals(FRAMESET)) { + if (this.entry == null) + return false; + return this.entry.hasFrameset(); + } + return false; + } + + /** + */ + public boolean isXMLType() { + return this.isXMLType; + } + + /** + */ + public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { + if (notifier == null) + return; + if (notifier instanceof IDOMDocument) { + if (eventType != INodeNotifier.STRUCTURE_CHANGED) + return; + } else { + if (eventType != INodeNotifier.CHANGE) + return; + } + documentTypeChanged(); + } + + /** + */ + public void release() { + ContentSettingsChangeSubject.getSubject().removeListener(this); + super.release(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java new file mode 100644 index 0000000000..0ad0c6bfca --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import org.eclipse.core.runtime.Preferences; +import org.eclipse.wst.html.core.internal.HTMLCorePlugin; +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter; + +/** + */ +public class HTMLDocumentTypeAdapterFactory implements INodeAdapterFactory, Preferences.IPropertyChangeListener, CommonModelPreferenceNames { + + private int tagNameCase = DocumentTypeAdapter.UPPER_CASE; + private int attrNameCase = DocumentTypeAdapter.LOWER_CASE; + private Preferences preferences = null; + + // for removal later on release() + private DocumentTypeAdapter fAdapter = null; + private INodeNotifier fNotifier = null; + + /** + */ + public HTMLDocumentTypeAdapterFactory() { + super(); + this.preferences = HTMLCorePlugin.getDefault().getPluginPreferences(); + //this.store = CommonPreferencesPlugin.getDefault().getPreferenceStore(ContentTypeRegistry.HTML_ID); + if (this.preferences != null) { + updateCases(); // initialize + this.preferences.addPropertyChangeListener(this); + } + } + + /** + * Method that returns the adapter associated with the given object. + * It may be a singleton or not ... depending on the needs of the INodeAdapter ... + * but in general it is recommended for an adapter to be stateless, + * so the efficiencies of a singleton can be gained. + * + * The implementation of this method should call addAdapter on the adapted + * object with the correct instance of the adapter. + */ + public INodeAdapter adapt(INodeNotifier notifier) { + DocumentTypeAdapter adapter = (DocumentTypeAdapter)notifier.getExistingAdapter(DocumentTypeAdapter.class); + if (adapter != null) + return adapter; + if (!(notifier instanceof IDOMDocument)) + return null; + adapter = new HTMLDocumentTypeAdapter((IDOMDocument) notifier, this); + notifier.addAdapter(adapter); + + fAdapter = adapter; + fNotifier = notifier; + + return adapter; + } + + /** + */ + public int getAttrNameCase() { + return this.attrNameCase; + } + + /** + */ + public int getTagNameCase() { + return this.tagNameCase; + } + + /** + */ + public boolean isFactoryForType(Object type) { + return (type == DocumentTypeAdapter.class); + } + + /** + */ + public void propertyChange(Preferences.PropertyChangeEvent event) { + if (event == null) + return; + String property = event.getProperty(); + if (property == null) + return; + + if (property.equals(TAG_NAME_CASE) || property.equals(ATTR_NAME_CASE)) { + updateCases(); + } + } + + /** + */ + private void updateCases() { + this.tagNameCase = DocumentTypeAdapter.UPPER_CASE; + this.attrNameCase = DocumentTypeAdapter.LOWER_CASE; + + if (this.preferences == null) + return; + + if (this.preferences.getInt(TAG_NAME_CASE) == LOWER) { + this.tagNameCase = DocumentTypeAdapter.LOWER_CASE; + } + if (this.preferences.getInt(ATTR_NAME_CASE) == UPPER) { + this.attrNameCase = DocumentTypeAdapter.UPPER_CASE; + } + } + + /** + */ + public void release() { + if(fAdapter != null && fNotifier != null) { + fAdapter.release(); + fNotifier.removeAdapter(fAdapter); + } + } + + /** + * Overriding copy method + */ + public INodeAdapterFactory copy() { + return new HTMLDocumentTypeAdapterFactory(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java new file mode 100644 index 0000000000..abc328444d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + +public interface HTMLDocumentTypeConstants { + + public final static String HTML = "HTML"; //$NON-NLS-1$ + public final static String FRAMESET = "FRAMESET"; //$NON-NLS-1$ + public final static String SSI = "SSI"; //$NON-NLS-1$ + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java new file mode 100644 index 0000000000..c8a51b3d5b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +/** + */ +public class HTMLDocumentTypeEntry { + + private String name; + private String publicId; + private String systemId; + private String namespaceURI; + private boolean isXMLType; + private boolean isXHTMLType; + private boolean isWMLType; + private boolean hasFrameset; + private String displayName; + private boolean isDefaultXHTML; + private boolean isDefaultWML; + private static String XHTML_NAME = "html"; //$NON-NLS-1$ + private static String HTML_NAME = "HTML"; //$NON-NLS-1$ + + /** + */ + private HTMLDocumentTypeEntry() { + super(); + } + + /** + */ + public HTMLDocumentTypeEntry(String name, String publicId, String systemId, String namespaceURI, boolean isXHTMLType, boolean hasFrameset, String displayName, boolean isDefaultXHTML, boolean isDefaultWML, boolean isWMLType) { + super(); + + if (name != null && name.length() > 0) { + this.name = name; + } + else { + if (isXMLType) + this.name = XHTML_NAME;// need code for wml? + else + this.name = HTML_NAME; + } + this.publicId = publicId; + this.systemId = systemId; + this.namespaceURI = namespaceURI; + this.isXMLType = isXHTMLType | isWMLType; + this.hasFrameset = hasFrameset; + this.displayName = displayName; + this.isDefaultXHTML = isDefaultXHTML; + this.isDefaultWML = isDefaultWML; + this.isXHTMLType = isXHTMLType; + this.isWMLType = isWMLType; + } + + /** + */ + public final String getName() { + return this.name; + } + + /** + */ + public final String getNamespaceURI() { + return this.namespaceURI; + } + + /** + */ + public final String getPublicId() { + return this.publicId; + } + + /** + */ + public final String getSystemId() { + return this.systemId; + } + + /** + */ + public final boolean isXMLType() { + return this.isXMLType; + } + + /** + */ + public final boolean hasFrameset() { + return this.hasFrameset; + } + + /** + */ + public final String getDisplayName() { + return this.displayName; + } + + /** + */ + public final boolean isDefaultXHTML() { + return this.isDefaultXHTML; + } + + public final boolean isDefaultWML() { + return this.isDefaultWML; + } + + + public final boolean isXHTMLType() { + return isXHTMLType; + } + + public final boolean isWMLType() { + return isWMLType; + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java new file mode 100644 index 0000000000..6f9cd0cd4a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import java.util.Enumeration; +import java.util.Hashtable; + +/** + */ +public class HTMLDocumentTypeRegistry { + + private static HTMLDocumentTypeRegistry instance = null; + private Hashtable entries = null; + private HTMLDocumentTypeEntry defaultEntry = null; + private HTMLDocumentTypeEntry defaultXHTMLEntry = null; + private HTMLDocumentTypeEntry defaultWMLEntry = null; + private HTMLDocumentTypeEntry defaultCHTMLEntry = null; + + final static int DEFAULT_HTML = 0; + final static int DEFAULT_XHTML = 1; + final static int DEFAULT_WML = 2; + final static int DEFAULT_CHTML = 3; + + public static final String CHTML_PUBLIC_ID = "-//W3C//DTD Compact HTML 1.0 Draft//EN";//$NON-NLS-1$ + + /** + */ + private HTMLDocumentTypeRegistry() { + super(); + + this.entries = new Hashtable(); + // HTML 4.01 + String name = "HTML";//$NON-NLS-1$ + String publicId = "-//W3C//DTD HTML 4.01 Transitional//EN";//$NON-NLS-1$ + String displayName = "HTML 4.01 Transitional"; //$NON-NLS-1$ + this.defaultEntry = new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false); + this.entries.put(publicId, this.defaultEntry); + publicId = "-//W3C//DTD HTML 4.01//EN";//$NON-NLS-1$ + displayName = "HTML 4.01 Strict"; //$NON-NLS-1$ + this.entries.put(publicId, new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false)); + publicId = "-//W3C//DTD HTML 4.01 Frameset//EN";//$NON-NLS-1$ + displayName = "HTML 4.01 Frameset"; //$NON-NLS-1$ + this.entries.put(publicId, new HTMLDocumentTypeEntry(name, publicId, null, null, false, true, displayName, false, false, false)); + // CHTML + name = "HTML";//$NON-NLS-1$ + publicId = CHTML_PUBLIC_ID; + displayName = "Compact HTML 1.0 Draft"; //$NON-NLS-1$ + this.defaultCHTMLEntry = new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false); + this.entries.put(publicId, this.defaultCHTMLEntry); + + HTMLDocumentTypeRegistryReader reader = new HTMLDocumentTypeRegistryReader(); + if (reader != null) + reader.readRegistry(this); + } + + /** + */ + void regist(String pid, HTMLDocumentTypeEntry doctype) { + if (pid == null || doctype == null) + return; + this.entries.put(pid, doctype); + if (this.defaultXHTMLEntry == null) { + if (doctype.isDefaultXHTML()) + this.defaultXHTMLEntry = doctype; + } + if (this.defaultWMLEntry == null) { + if (doctype.isDefaultWML()) + this.defaultWMLEntry = doctype; + } + } + + /** + * + */ + public HTMLDocumentTypeEntry getDefaultEntry(int type) { + HTMLDocumentTypeEntry entry = null; + switch (type) { + case DEFAULT_XHTML : + entry = this.defaultXHTMLEntry; + break; + case DEFAULT_WML : + entry = this.defaultWMLEntry; + break; + case DEFAULT_CHTML : + entry = this.defaultCHTMLEntry; + break; + case DEFAULT_HTML : + default : + entry = this.defaultEntry; + break; + } + return entry; + } + + /** + * + */ + public HTMLDocumentTypeEntry getDefaultEntry() { + return this.defaultEntry; + } + + /** + */ + public HTMLDocumentTypeEntry getXHTMLDefaultEntry() { + return this.defaultXHTMLEntry; + } + + /** + */ + public Enumeration getEntries() { + return this.entries.elements(); + } + + /** + */ + public HTMLDocumentTypeEntry getEntry(String publicId) { + if (publicId == null) + return null; + return (HTMLDocumentTypeEntry) this.entries.get(publicId); + } + + /** + */ + public synchronized static HTMLDocumentTypeRegistry getInstance() { + if (instance == null) + instance = new HTMLDocumentTypeRegistry(); + return instance; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java new file mode 100644 index 0000000000..2dbf6ed764 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java @@ -0,0 +1,107 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; + +/** + */ +class HTMLDocumentTypeRegistryReader { + + // + private final static String PLUGIN_ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$ + private final static String EXTENSION_POINT_ID = "documentTypes"; //$NON-NLS-1$ + private final static String TAG_NAME = "documentType"; //$NON-NLS-1$ + private final static String ATT_PID = "publicID"; //$NON-NLS-1$ + private final static String ATT_SID = "systemID"; //$NON-NLS-1$ + private final static String ATT_IS_XHTML = "isXHTML"; //$NON-NLS-1$ + private final static String ATT_IS_WML = "isWML"; //$NON-NLS-1$ + private final static String ATT_HAS_FRAMESET = "hasFrameset"; //$NON-NLS-1$ + private final static String ATT_NSURI = "namespaceURI"; //$NON-NLS-1$ + private final static String ATT_ENAME = "elementName"; //$NON-NLS-1$ + private final static String ATT_DNAME = "displayName"; //$NON-NLS-1$ + private final static String ATT_IS_DEFAULT_XHTML = "defaultXHTML"; //$NON-NLS-1$ + private final static String ATT_IS_DEFAULT_WML = "defaultWML"; //$NON-NLS-1$ + private final static String ATV_TRUE = "true"; //$NON-NLS-1$ + private final static String ATV_NULL_STRING = ""; //$NON-NLS-1$ + + /** + */ + HTMLDocumentTypeRegistryReader() { + super(); + } + + /** + */ + void readRegistry(HTMLDocumentTypeRegistry reg) { + if (reg == null) + return; + IExtensionRegistry registry = Platform.getExtensionRegistry(); + IExtensionPoint point = registry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID); + if (point != null) { + IConfigurationElement[] elements = point.getConfigurationElements(); + for (int i = 0; i < elements.length; i++) { + HTMLDocumentTypeEntry doctype = readElement(elements[i]); + // null can be returned if there's an error reading the element + if (doctype != null) { + reg.regist(doctype.getPublicId(), doctype); + } + } + } + } + + /** + */ + private HTMLDocumentTypeEntry readElement(IConfigurationElement element) { + HTMLDocumentTypeEntry doctype = null; + String pid = null; + String sid = null; + String nsuri = null; + String root = null; + boolean xhtml = true; + boolean frameset = false; + String dname = null; + boolean defaultXhtml = false; + boolean defaultWML = false; + boolean isWML = false; + + if (element.getName().equals(TAG_NAME)) { + pid = element.getAttribute(ATT_PID); + // publicID attribute is mandatory. + if (pid == null || pid.equals(ATV_NULL_STRING)) + return null; + + sid = element.getAttribute(ATT_SID); + nsuri = element.getAttribute(ATT_NSURI); + root = element.getAttribute(ATT_ENAME); + xhtml = getBoolean(element, ATT_IS_XHTML); + frameset = getBoolean(element, ATT_HAS_FRAMESET); + dname = element.getAttribute(ATT_DNAME); + defaultXhtml = getBoolean(element, ATT_IS_DEFAULT_XHTML); + defaultWML = getBoolean(element, ATT_IS_DEFAULT_WML); + isWML = getBoolean(element, ATT_IS_WML); + doctype = new HTMLDocumentTypeEntry(root, pid, sid, nsuri, xhtml, frameset, dname, defaultXhtml, defaultWML, isWML); + } + return doctype; + } + + /** + */ + private boolean getBoolean(IConfigurationElement element, String att) { + String value = element.getAttribute(att); + if (value != null && value.equals(ATV_TRUE)) + return true; + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java new file mode 100644 index 0000000000..203fea0a87 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java @@ -0,0 +1,354 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMText; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList; +import org.eclipse.wst.xml.core.internal.document.CMNodeUtil; +import org.eclipse.wst.xml.core.internal.document.ModelParserAdapter; +import org.eclipse.wst.xml.core.internal.document.TagAdapter; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * HTMLDocumentImpl class + */ +public class HTMLModelParserAdapter implements ModelParserAdapter { + /** + * note: I made public, temparily, so could be used by JSPLoader + */ + protected HTMLModelParserAdapter() { + super(); + } + + private boolean shouldTerminateAt(CMElementDeclaration parent, CMElementDeclaration child) { + if (!parent.supports(HTMLCMProperties.TERMINATORS)) + return false; + java.util.Iterator i = (java.util.Iterator) parent.getProperty(HTMLCMProperties.TERMINATORS); + if (i == null) + return false; + String nextName = child.getElementName(); + while (i.hasNext()) { + // NOTE: CMElementDeclaration of child is not always HTMLCMElementDeclaration. + // It might be one of based on DTD (for XHTML element). So, comparison must + // be performed ignoring case. + // -- 3/20/2002 + String terminator = (String) i.next(); + if (terminator == null) + continue; + if (nextName.equalsIgnoreCase(terminator)) + return true; + } + return false; + } + + /** + */ + public boolean canContain(Element element, Node child) { + if (element == null || child == null) + return false; + IDOMElement impl = (IDOMElement) element; + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (!impl.isGlobalTag()) + return true; // non HTML tag + IDOMElement childElement = (IDOMElement) child; + + CMElementDeclaration myDec = CMNodeUtil.getElementDeclaration(element); + if (myDec == null) + return true; + //if (!(myDec instanceof HTMLElementDeclaration)) return true; + if (myDec.getContentType() == CMElementDeclaration.EMPTY) + return false; + + if (!childElement.isGlobalTag()) + return true; // non HTML tag + CMElementDeclaration childDec = CMNodeUtil.getElementDeclaration(childElement); + if (childDec == null) + return true; + //if (!(childDec instanceof HTMLElementDeclaration)) return true; + + if (myDec instanceof HTMLElementDeclaration) { + if (((Boolean) ((HTMLElementDeclaration) myDec).getProperty(HTMLCMProperties.IS_JSP)).booleanValue()) + return true; + } + if (shouldTerminateAt(myDec, childDec) && !isValidChild(myDec, childDec)) { + return false; + } + + String tagName = impl.getTagName(); + if (tagName == null) + return true; + String childName = childElement.getTagName(); + if (childName == null) + return true; + if (!impl.hasStartTag() && !impl.hasEndTag()) { + // implicit element + if (tagName.equalsIgnoreCase(childElement.getTagName())) + return false; + if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) { + if (!childName.equalsIgnoreCase(HTML40Namespace.ElementName.META) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.TITLE) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.LINK) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.BASE) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.ISINDEX)) { + return false; + } + } + + Node parent = element.getParentNode(); + if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) { + IDOMElement parentElement = (IDOMElement) parent; + if (!parentElement.hasStartTag() && !parentElement.hasEndTag()) { + if (!canContain(parentElement, child)) + return false; + } + } + return true; + } + + // contexual termination for TABLE content tags + boolean isTableContent = false; + if (childName.equalsIgnoreCase(HTML40Namespace.ElementName.TBODY) || childName.equalsIgnoreCase(HTML40Namespace.ElementName.THEAD) || childName.equalsIgnoreCase(HTML40Namespace.ElementName.TFOOT)) { + if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE)) + return true; + isTableContent = true; + } + else if (childName.equalsIgnoreCase(HTML40Namespace.ElementName.TR)) { + if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TBODY) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.THEAD) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TFOOT) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE)) + return true; + isTableContent = true; + } + else if (childName.equalsIgnoreCase(HTML40Namespace.ElementName.TD) || childName.equalsIgnoreCase(HTML40Namespace.ElementName.TH)) { + if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TR) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TBODY) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.THEAD) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TFOOT) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE)) + return true; + isTableContent = true; + } + if (isTableContent) { + // TABLE content tags should terminate non TABLE content tags, + // if in TABLE + for (Node parent = element.getParentNode(); parent != null; parent = parent.getParentNode()) { + if (parent.getNodeType() != Node.ELEMENT_NODE) + break; + IDOMElement parentElement = (IDOMElement) parent; + String parentName = parentElement.getTagName(); + if (parentName == null) + continue; + if (parentName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE)) + return false; + } + } + if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.EMBED)) { + if (!childName.equalsIgnoreCase(HTML40Namespace.ElementName.NOEMBED)) + return false; + } + } + else if (child.getNodeType() == Node.TEXT_NODE) { + String tagName = impl.getTagName(); + if (tagName != null && tagName.equalsIgnoreCase(HTML40Namespace.ElementName.EMBED)) { + IDOMText text = (IDOMText) child; + if (!text.isWhitespace()) + return false; + } + } + else if (child.getNodeType() == Node.DOCUMENT_TYPE_NODE) { + if (impl.isImplicitTag()) + return false; + } + + return true; + } + + /** + */ + public boolean canBeImplicitTag(Element element) { + return false; + } + + /** + */ + public boolean canBeImplicitTag(Element element, Node child) { + return false; + } + + /** + */ + public Element createCommentElement(Document document, String data, boolean isJSPTag) { + if (document == null || data == null || data.length() == 0) + return null; + + return createMetaElement(document, data, isJSPTag); + } + + /** + * This routine create an implicit Element for given parent and child, + * such as HTML, BODY, HEAD, and TBODY for HTML document. + */ + public Element createImplicitElement(Document document, Node parent, Node child) { + return null; + } + + /** + */ + private Element createMetaElement(Document document, String data, boolean isJSPTag) { + if (data == null || data.length() == 0) + return null; + + TagScanner scanner = new TagScanner(data, 0, true); // one line + String name = scanner.nextName(); + if (name == null || !name.equalsIgnoreCase(MetaData.METADATA)) + return null; + + String type = null; + boolean isStartSpan = false; + boolean isEndSpan = false; + name = scanner.nextName(); + while (name != null) { + String value = scanner.nextValue(); + if (name.equalsIgnoreCase(MetaData.TYPE)) { + if (value == null) + return null; + if (value.equalsIgnoreCase(MetaData.DESIGNER_CONTROL)) { + type = MetaData.DESIGNER_CONTROL; + } + else if (value.equalsIgnoreCase(MetaData.DYNAMIC_DATA)) { + type = MetaData.DYNAMIC_DATA; + } + else if (value.equalsIgnoreCase(MetaData.AUTHOR_TIME_VISUAL)) { + type = MetaData.AUTHOR_TIME_VISUAL; + } + else if (value.equalsIgnoreCase(MetaData.ANNOTATION)) { + type = MetaData.ANNOTATION; + } + else { + return null; + } + } + else if (name.equalsIgnoreCase(MetaData.STARTSPAN)) { + isStartSpan = true; + } + else if (name.equalsIgnoreCase(MetaData.ENDSPAN)) { + if (!isStartSpan) + isEndSpan = true; + } + name = scanner.nextName(); + } + if (type == null) + return null; + if (!isStartSpan && !isEndSpan) + return null; + String metaData = null; + int offset = scanner.getNextOffset(); // skip new line + if (offset < data.length()) + metaData = data.substring(offset); + if (metaData == null) + metaData = new String(); + + IDOMElement element = (IDOMElement) document.createElement(MetaData.PREFIX + type); + + MetaDataAdapter adapter = new MetaDataAdapter(type); + if (isStartSpan) { + if (metaData != null) + adapter.setData(metaData); + } + else { + if (metaData != null) + adapter.setEndData(metaData); + } + element.addAdapter(adapter); + adapter.setElement(element); + element.setJSPTag(isJSPTag); + + return element; + } + + /** + */ + public String getFindRootName(String tagName) { + if (tagName == null) + return null; + // tag matching should not beyond TABLE tag except BODY tag + if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.BODY)) + return null; + return HTML40Namespace.ElementName.TABLE; + } + + /** + */ + public boolean isAdapterForType(Object type) { + return (type == ModelParserAdapter.class); + } + + /** + */ + public boolean isEndTag(IDOMElement element) { + TagAdapter adapter = (TagAdapter) element.getExistingAdapter(TagAdapter.class); + if (adapter != null) + return adapter.isEndTag(); + return element.isEndTag(); + } + + /** + */ + public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { + } + + private static boolean isValidChild(CMElementDeclaration parent, CMElementDeclaration child) { + if (parent == null || child == null) + return false; + CMContent content = parent.getContent(); + if (content == null) + return false; + return isChild(content, child); + } + + /** + */ + private static boolean isChild(CMContent content, CMElementDeclaration target) { + switch (content.getNodeType()) { + case CMNode.ELEMENT_DECLARATION : + return isSameDeclaration((CMElementDeclaration) content, target); + case CMNode.GROUP : + CMNodeList children = ((CMGroup) content).getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + CMNode child = children.item(i); + switch (child.getNodeType()) { + case CMNode.ELEMENT_DECLARATION : + if (isSameDeclaration((CMElementDeclaration) child, target)) + return true; + continue; // Go next child. + case CMNode.GROUP : + if (isChild((CMContent) child, target)) + return true; + continue; // Go next child. + default : + continue; // Go next child. + } + } + } + return false; + } + + /** + */ + private static boolean isSameDeclaration(CMElementDeclaration aDec, CMElementDeclaration otherDec) { + return aDec.getElementName() == otherDec.getElementName(); + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java new file mode 100644 index 0000000000..08f03f9f44 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.xml.core.internal.document.ModelParserAdapter; + +/** + */ +public class HTMLModelParserAdapterFactory implements INodeAdapterFactory { + + private static HTMLModelParserAdapterFactory instance = null; + + /** + */ + private HTMLModelParserAdapterFactory() { + super(); + } + + /** + * Method that returns the adapter associated with the given object. + * It may be a singleton or not ... depending on the needs of the INodeAdapter ... + * but in general it is recommended for an adapter to be stateless, + * so the efficiencies of a singleton can be gained. + * + * The implementation of this method should call addAdapter on the adapted + * object with the correct instance of the adapter. + */ + public INodeAdapter adapt(INodeNotifier notifier) { + return new HTMLModelParserAdapter(); + } + + /** + */ + public synchronized static HTMLModelParserAdapterFactory getInstance() { + if (instance == null) + instance = new HTMLModelParserAdapterFactory(); + return instance; + } + + /** + */ + public boolean isFactoryForType(Object type) { + return (type == ModelParserAdapter.class); + } + + /** + */ + public void release() { + } + + /** + * Overriding copy method + */ + public INodeAdapterFactory copy() { + return getInstance(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java new file mode 100644 index 0000000000..132e18b995 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +/** + */ +public interface MetaData { + + static final String METADATA = "METADATA";//$NON-NLS-1$ + static final String TYPE = "type";//$NON-NLS-1$ + static final String STARTSPAN = "startspan";//$NON-NLS-1$ + static final String ENDSPAN = "endspan";//$NON-NLS-1$ + static final String DESIGNER_CONTROL = "DesignerControl";//$NON-NLS-1$ + static final String DYNAMIC_DATA = "DynamicData";//$NON-NLS-1$ + static final String AUTHOR_TIME_VISUAL = "AuthorTimeVisual";//$NON-NLS-1$ + static final String ANNOTATION = "Annotation";//$NON-NLS-1$ + static final String PREFIX = "METADATA:";//$NON-NLS-1$ +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java new file mode 100644 index 0000000000..5fa2103f73 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java @@ -0,0 +1,301 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import java.util.Iterator; + +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.text.IStructuredDocument; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.sse.core.text.ITextRegionList; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.eclipse.wst.xml.core.internal.document.TagAdapter; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; + +/** + */ +public class MetaDataAdapter implements TagAdapter, MetaData { + + private IDOMElement element = null; + private String type = null; + private String data = null; + private String endData = null; + + /** + */ + public MetaDataAdapter(String type) { + super(); + + if (type != null) { + if (type.equals(ANNOTATION)) { + this.type = ANNOTATION; + } + else if (type.equals(AUTHOR_TIME_VISUAL)) { + this.type = AUTHOR_TIME_VISUAL; + } + else { + this.type = type; + } + } + } + + /** + */ + private String getData(IStructuredDocumentRegion flatNode) { + if (flatNode == null) + return null; + ITextRegionList regions = flatNode.getRegions(); + if (regions == null) + return null; + + String data = null; + Iterator e = regions.iterator(); + while (e.hasNext()) { + ITextRegion region = (ITextRegion) e.next(); + String regionType = region.getType(); + if (isCommentText(regionType)) { + data = flatNode.getText(region); + break; + } + } + if (data == null) + return null; + int length = data.length(); + int offset = 0; + for (; offset < length; offset++) { + char c = data.charAt(offset); + if (c == '\r' || c == '\n') { + offset++; + break; + } + } + for (; offset < length; offset++) { + char c = data.charAt(offset); + if (c != '\r' && c != '\n') { + break; + } + } + return data.substring(offset); + } + + private boolean isCommentText(String regionType) { + boolean result = false; + result = isDOMComment(regionType) || isNestedContentComment(regionType); + return result; + } + + /** + * ISSUE: this is a bit of hidden JSP knowledge that was implemented this + * way for expedency. Should be evolved in future to depend on + * "nestedContext". + */ + + private boolean isNestedContentComment(String regionType) { + final String JSP_COMMENT_TEXT = "JSP_COMMENT_TEXT"; //$NON-NLS-1$ + return regionType.equals(JSP_COMMENT_TEXT); + } + + private boolean isDOMComment(String regionType) { + return regionType == DOMRegionContext.XML_COMMENT_TEXT; + } + + public String getData() { + if (this.element == null) + return null; + IStructuredDocumentRegion flatNode = this.element.getStartStructuredDocumentRegion(); + if (flatNode == null) + return null; + if (this.data != null) + return this.data; + return getData(flatNode); + } + + /** + */ + private String getDelimiter(IDOMModel model) { + String delim = null; + if (model != null) { + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument != null) + delim = structuredDocument.getLineDelimiter(); + } + if (delim == null) + delim = "\r\n";//$NON-NLS-1$ + return delim; + } + + /** + */ + public String getEndData() { + if (this.element == null) + return null; + IStructuredDocumentRegion flatNode = this.element.getEndStructuredDocumentRegion(); + if (flatNode == null) + return null; + if (this.endData != null) + return this.endData; + return getData(flatNode); + } + + /** + */ + public String getEndTag(IDOMElement element) { + StringBuffer buffer = new StringBuffer(); + if (element.isJSPTag()) + buffer.append("<%--");//$NON-NLS-1$ + else + buffer.append("<!--");//$NON-NLS-1$ + buffer.append(METADATA); + buffer.append(' '); + buffer.append(TYPE); + buffer.append("=\"");//$NON-NLS-1$ + buffer.append(this.type); + buffer.append("\" ");//$NON-NLS-1$ + buffer.append(MetaData.ENDSPAN); + String data = getEndData(); + if (data != null && data.length() > 0) { + String delim = getDelimiter(element.getModel()); + buffer.append(delim); + buffer.append(data); + buffer.append(delim); + } + if (element.isJSPTag()) + buffer.append("--%>");//$NON-NLS-1$ + else + buffer.append("-->");//$NON-NLS-1$ + + return buffer.toString(); + } + + /** + */ + public String getStartTag(IDOMElement element) { + StringBuffer buffer = new StringBuffer(); + if (element.isJSPTag()) + buffer.append("<%--");//$NON-NLS-1$ + else + buffer.append("<!--");//$NON-NLS-1$ + buffer.append(METADATA); + buffer.append(' '); + buffer.append(TYPE); + buffer.append("=\"");//$NON-NLS-1$ + buffer.append(this.type); + buffer.append("\" ");//$NON-NLS-1$ + buffer.append(MetaData.STARTSPAN); + String data = getData(); + if (data != null && data.length() > 0) { + String delim = getDelimiter(element.getModel()); + buffer.append(delim); + buffer.append(data); + buffer.append(delim); + } + if (element.isJSPTag()) + buffer.append("--%>");//$NON-NLS-1$ + else + buffer.append("-->");//$NON-NLS-1$ + + return buffer.toString(); + } + + /** + */ + public String getType() { + return this.type; + } + + /** + */ + public boolean isAdapterForType(Object type) { + return (type == TagAdapter.class || type == MetaDataAdapter.class); + } + + /** + */ + public boolean isEndTag() { + if (this.element == null) + return false; + if (this.element.hasStartTag()) + return false; + if (this.element.hasEndTag()) + return true; + if (this.data != null) + return false; + return (this.endData != null); + } + + /** + */ + public boolean isRuntimeContainer() { + return (this.type == ANNOTATION || this.type == AUTHOR_TIME_VISUAL); + } + + /** + */ + public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { + } + + /** + */ + public void setData(String data) { + this.data = data; + + if (this.element != null) + this.element.notifyStartTagChanged(); + } + + /** + */ + public void setEndData(String data) { + this.endData = data; + + if (this.element != null) + this.element.notifyEndTagChanged(); + } + + /** + */ + public void setElement(IDOMElement element) { + this.element = element; + + if (this.element != null) { + this.element.setCommentTag(true); + if (this.type != MetaData.ANNOTATION) { + this.element.setJSPTag(true); + } + } + } + + /** + */ + public void setRuntimeSource(String source) { + if (source == null) + return; + if (this.element == null) + return; + if (isRuntimeContainer()) + return; + + IDOMModel model = this.element.getModel(); + if (model == null) + return; + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument == null) + return; + int offset = this.element.getStartEndOffset(); + int end = this.element.getEndStartOffset(); + int length = end - offset; + structuredDocument.replaceText(model, offset, length, source); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java new file mode 100644 index 0000000000..17e0bb1436 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +/** + */ +class TagScanner { + + private String tag = null; + private int offset = 0; + private int length = 0; + private boolean oneLine = false; + + /** + */ + TagScanner(String tag, int offset) { + super(); + + this.tag = tag; + this.offset = offset; + if (tag != null) + this.length = tag.length(); + } + + /** + */ + TagScanner(String tag, int offset, boolean oneLine) { + this(tag, offset); + + this.oneLine = oneLine; + } + + /** + */ + int getNextOffset() { + for (; this.offset < this.length; this.offset++) { + char c = this.tag.charAt(this.offset); + if (!isEnd(c)) + break; + } + return this.offset; + } + + /** + */ + int getOffset() { + return this.offset; + } + + /** + */ + private final boolean isEnd(char c) { + return (this.oneLine && (c == '\r' || c == '\n')); + } + + /** + */ + private static boolean isEqual(char c) { + return (c == '='); + } + + /** + */ + private static boolean isQuote(char c) { + return (c == '"' || c == '\''); + } + + /** + */ + private static boolean isSpace(char c) { + return Character.isWhitespace(c); + } + + /** + */ + private char nextChar() { + for (; this.offset < this.length; this.offset++) { + char c = this.tag.charAt(this.offset); + if (isEnd(c)) + break; + if (!isSpace(c)) + return c; + } + return 0; + } + + /** + */ + String nextName() { + if (this.tag == null) + return null; + if (this.offset >= this.length) + return null; + + if (nextChar() == 0) + return null; + + int nameOffset = this.offset; + for (; this.offset < this.length; this.offset++) { + char c = this.tag.charAt(this.offset); + if (isEnd(c) || isSpace(c)) + break; + if (isEqual(c) && this.offset > nameOffset) + break; + } + if (this.offset == nameOffset) + return null; + + return this.tag.substring(nameOffset, this.offset); + } + + /** + */ + String nextValue() { + if (this.tag == null) + return null; + if (this.offset >= this.length) + return null; + + char seperator = nextChar(); + if (!isEqual(seperator)) + return null; + this.offset++; // skip '=' + char quote = nextChar(); + if (quote == 0) + return null; + if (isQuote(quote)) + this.offset++; + else + quote = 0; + + int valueOffset = this.offset; + for (; this.offset < this.length; this.offset++) { + char c = this.tag.charAt(this.offset); + if (isEnd(c)) { + quote = 0; + break; + } + if (quote == 0) { + if (isSpace(c)) + break; + } + else { + if (c == quote) + break; + } + } + int valueEnd = this.offset; + if (quote != 0 && this.offset < this.length) + this.offset++; + if (valueEnd == valueOffset) + return null; + + return this.tag.substring(valueOffset, valueEnd); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java new file mode 100644 index 0000000000..94cd5e8030 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.document; + + + +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.internal.document.TagAdapter; + +/** + */ +public class UnknownTagAdapter implements TagAdapter { + + private String startTag = null; + private String endTag = null; + + /** + */ + public UnknownTagAdapter() { + super(); + } + + /** + */ + public String getEndTag(IDOMElement element) { + String tag = null; + if (this.endTag != null) { + tag = this.endTag; + this.endTag = null; + } + return tag; + } + + /** + */ + public String getStartTag(IDOMElement element) { + String tag = null; + if (this.startTag != null) { + tag = this.startTag; + this.startTag = null; + } + return tag; + } + + /** + */ + public boolean isAdapterForType(Object type) { + return (type == TagAdapter.class); + } + + /** + */ + public boolean isEndTag() { + return false; + } + + /** + */ + public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { + } + + /** + */ + public void setEndTag(String endTag) { + this.endTag = endTag; + } + + /** + */ + public void setStartTag(String startTag) { + this.startTag = startTag; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java new file mode 100644 index 0000000000..a0242c9e3c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.encoding; + +import org.eclipse.jface.text.IDocument; +import org.eclipse.wst.html.core.internal.contenttype.HTMLResourceEncodingDetector; +import org.eclipse.wst.sse.core.internal.document.DocumentReader; +import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector; + +/** + * This class parses beginning portion of HTML file to get the encoding value + * in a META tag. Example: + * <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> + * + * Note: even though, technically, a META tag must come in a <HEAD>tag, we + * don't check for that, under the assumption that whatever, or whereever, the + * the first <META>tag is, it is the one intended to be used by the user, and + * they may just be trying to repair the error. The HTML validator will tell + * them if its in the wrong location. + * + */ +public class HTMLDocumentCharsetDetector extends HTMLResourceEncodingDetector implements IDocumentCharsetDetector { + + + public HTMLDocumentCharsetDetector() { + super(); + } + + public void set(IDocument document) { + set(new DocumentReader(document, 0)); + + + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java new file mode 100644 index 0000000000..d6bc40e467 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.encoding; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.text.IDocumentPartitioner; +import org.eclipse.wst.html.core.contenttype.ContentTypeIdForHTML; +import org.eclipse.wst.html.core.htmlcss.HTMLStyleSelectorAdapterFactory; +import org.eclipse.wst.html.core.htmlcss.StyleAdapterFactory; +import org.eclipse.wst.html.core.internal.contenttype.EncodingGuesser; +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeAdapterFactory; +import org.eclipse.wst.html.core.internal.document.HTMLModelParserAdapterFactory; +import org.eclipse.wst.html.core.internal.modelquery.ModelQueryAdapterFactoryForHTML; +import org.eclipse.wst.html.core.internal.text.StructuredTextPartitionerForHTML; +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.IStructuredModel; +import org.eclipse.wst.sse.core.document.IEncodedDocument; +import org.eclipse.wst.sse.core.internal.PropagatingAdapter; +import org.eclipse.wst.sse.core.internal.document.AbstractDocumentLoader; +import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector; +import org.eclipse.wst.sse.core.internal.document.IDocumentLoader; +import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory; +import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences; +import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument; +import org.eclipse.wst.sse.core.parser.BlockMarker; +import org.eclipse.wst.sse.core.parser.RegionParser; +import org.eclipse.wst.sse.core.text.IStructuredDocument; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser; +import org.eclipse.wst.xml.core.internal.parser.XMLStructuredDocumentReParser; +import org.eclipse.wst.xml.core.internal.propagate.PropagatingAdapterFactoryImpl; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; + +public class HTMLDocumentLoader extends AbstractDocumentLoader { + + public HTMLDocumentLoader() { + super(); + } + + /** + * Convenience method to add tag names using BlockMarker object + */ + protected void addHTMLishTag(XMLSourceParser parser, String tagname) { + BlockMarker bm = new BlockMarker(tagname, null, DOMRegionContext.BLOCK_TEXT, false); + parser.addBlockMarker(bm); + } + + /** + * Default encoding. For HTML, there is no spec. + */ + protected String getSpecDefaultEncoding() { + return null; + } + + /** + * @return java.lang.String + * @param string + * byte[] + * @param length + * int + * + * Do automatic encoding detection by guess + */ + protected String getEncodingNameByGuess(byte[] string, int length) { + final String ianaEnc = EncodingGuesser.guessEncoding(string, length); + return ianaEnc; + } + + /* + * @see AbstractLoader#createNewStructuredDocument() + */ + protected IEncodedDocument newEncodedDocument() { + IStructuredDocument structuredDocument = StructuredDocumentFactory.getNewStructuredDocumentInstance(getParser()); + ((BasicStructuredDocument) structuredDocument).setReParser(new XMLStructuredDocumentReParser()); + + return structuredDocument; + } + + /* + * @see IModelLoader#getParser() + */ + public RegionParser getParser() { + XMLSourceParser parser = new XMLSourceParser(); + // for the "static HTML" case, we need to initialize + // Blocktags here. + addHTMLishTag(parser, "script"); //$NON-NLS-1$ + addHTMLishTag(parser, "style"); //$NON-NLS-1$ + return parser; + } + + /** + * This method must return those factories which must be attached to the + * structuredModel before content is applied. + */ + public List getAdapterFactories() { + List result = new ArrayList(); + INodeAdapterFactory factory = null; + factory = StyleAdapterFactory.getInstance(); + result.add(factory); + factory = HTMLStyleSelectorAdapterFactory.getInstance(); + result.add(factory); + factory = new HTMLDocumentTypeAdapterFactory(); + result.add(factory); + factory = HTMLModelParserAdapterFactory.getInstance(); + result.add(factory); + // + factory = new ModelQueryAdapterFactoryForHTML(); + result.add(factory); + + factory = new PropagatingAdapterFactoryImpl(); + result.add(factory); + + + return result; + } + + protected String getPreferredNewLineDelimiter() { + return ContentTypeEncodingPreferences.getPreferredNewLineDelimiter(ContentTypeIdForHTML.ContentTypeID_HTML); + } + + public IDocumentCharsetDetector getDocumentEncodingDetector() { + if (fDocumentEncodingDetector == null) { + fDocumentEncodingDetector = new HTMLDocumentCharsetDetector(); + } + return fDocumentEncodingDetector; + } + + protected void preLoadAdapt(IStructuredModel structuredModel) { + // DMW: just added this preload on 8/16/2002 + // I noticed the ProagatingAdapterFactory was being added, + // that that the ProagatingAdapterAdapter was not being + // preload adapted -- I'm assuing it ALWAYS has to be. + IDOMModel domModel = (IDOMModel) structuredModel; + // if there is a model in the adapter, this will adapt it to + // first node. After that the PropagatingAdater spreads over the + // children being + // created. Each time that happends, a side effect is to + // also "spread" sprecific registered adapters, + // they two can propigate is needed. + ((INodeNotifier) domModel.getDocument()).getAdapterFor(PropagatingAdapter.class); + } + + public IDocumentPartitioner getDefaultDocumentPartitioner() { + return new StructuredTextPartitionerForHTML(); + } + + public IDocumentLoader newInstance() { + return new HTMLDocumentLoader(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java new file mode 100644 index 0000000000..708855402f --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.encoding; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.wst.html.core.htmlcss.HTMLStyleSelectorAdapterFactory; +import org.eclipse.wst.html.core.htmlcss.StyleAdapterFactory; +import org.eclipse.wst.html.core.internal.document.DOMStyleModelImpl; +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeAdapterFactory; +import org.eclipse.wst.html.core.internal.document.HTMLModelParserAdapterFactory; +import org.eclipse.wst.html.core.internal.modelquery.ModelQueryAdapterFactoryForHTML; +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.IStructuredModel; +import org.eclipse.wst.sse.core.IModelLoader; +import org.eclipse.wst.sse.core.internal.PropagatingAdapter; +import org.eclipse.wst.sse.core.internal.document.IDocumentLoader; +import org.eclipse.wst.sse.core.internal.model.AbstractModelLoader; +import org.eclipse.wst.sse.core.parser.BlockMarker; +import org.eclipse.wst.sse.core.util.Debug; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.eclipse.wst.xml.core.internal.DebugAdapterFactory; +import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser; +import org.eclipse.wst.xml.core.internal.propagate.PropagatingAdapterFactoryImpl; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; + +public class HTMLModelLoader extends AbstractModelLoader { + + + public HTMLModelLoader() { + super(); + } + + /** + * Convenience method to add tag names using BlockMarker object + */ + protected void addHTMLishTag(XMLSourceParser parser, String tagname) { + BlockMarker bm = new BlockMarker(tagname, null, DOMRegionContext.BLOCK_TEXT, false); + parser.addBlockMarker(bm); + } + + public IStructuredModel newModel() { + DOMStyleModelImpl model = new DOMStyleModelImpl(); + return model; + } + + /** + * This method must return those factories which must be attached to the + * structuredModel before content is applied. + */ + public List getAdapterFactories() { + List result = new ArrayList(); + INodeAdapterFactory factory = null; + factory = StyleAdapterFactory.getInstance(); + result.add(factory); + factory = HTMLStyleSelectorAdapterFactory.getInstance(); + result.add(factory); + factory = new HTMLDocumentTypeAdapterFactory(); + result.add(factory); + factory = HTMLModelParserAdapterFactory.getInstance(); + result.add(factory); + // + factory = new ModelQueryAdapterFactoryForHTML(); + result.add(factory); + + factory = new PropagatingAdapterFactoryImpl(); + result.add(factory); + + + return result; + } + + protected void preLoadAdapt(IStructuredModel structuredModel) { + super.preLoadAdapt(structuredModel); + // DMW: just added this preload on 8/16/2002 + // I noticed the ProagatingAdapterFactory was being added, + // that that the ProagatingAdapterAdapter was not being + // preload adapted -- I'm assuing it ALWAYS has to be. + IDOMModel domModel = (IDOMModel) structuredModel; + // if there is a model in the adapter, this will adapt it to + // first node. After that the PropagatingAdater spreads over the + // children being + // created. Each time that happends, a side effect is to + // also "spread" sprecific registered adapters, + // they two can propigate is needed. + ((INodeNotifier) domModel.getDocument()).getAdapterFor(PropagatingAdapter.class); + if (Debug.debugNotificationAndEvents) { + PropagatingAdapter propagatingAdapter = (PropagatingAdapter) ((INodeNotifier) domModel.getDocument()).getAdapterFor(PropagatingAdapter.class); + propagatingAdapter.addAdaptOnCreateFactory(new DebugAdapterFactory()); + } } + + public IModelLoader newInstance() { + return new HTMLModelLoader(); + } + + public IDocumentLoader getDocumentLoader() { + if (documentLoaderInstance == null) { + documentLoaderInstance = new HTMLDocumentLoader(); + } + return documentLoaderInstance; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java new file mode 100644 index 0000000000..c7438f8d0c --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + + + +import org.eclipse.wst.css.core.internal.format.CSSSourceFormatter; +import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter; +import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; +import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode; +import org.eclipse.wst.html.core.HTMLFormatContraints; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.document.IDOMText; + +// nakamori_TODO: check and remove + +public class EmbeddedCSSFormatter extends HTMLFormatter { + + //private IAdapterFactory factory = new CSSSourceFormatterFactory(CSSSourceFormatter.class, true); + /** + */ + protected EmbeddedCSSFormatter() { + super(); + } + + /** + */ + protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + IDOMText text = (IDOMText) node; + + String source = getCSSContent(node); + if (source == null) { // fallback + source = text.getSource(); + } + + int offset = text.getStartOffset(); + int length = text.getEndOffset() - offset; + replaceSource(text.getModel(), offset, length, source); + setWidth(contraints, source); + } + + /** + */ + private String getCSSContent(IDOMNode text) { + ICSSModel model = getCSSModel(text); + if (model == null) + return null; + ICSSNode document = model.getDocument(); + if (document == null) + return null; + INodeNotifier notifier = (INodeNotifier) document; + INodeAdapter adapter = notifier.getAdapterFor(CSSSourceFormatter.class); + if (adapter == null) + return null; + CSSSourceFormatter formatter = (CSSSourceFormatter) adapter; + StringBuffer buffer = formatter.format(document); + if (buffer == null) + return null; + return buffer.toString(); + } + + /** + */ + private ICSSModel getCSSModel(IDOMNode text) { + if (text == null) + return null; + INodeNotifier notifier = (INodeNotifier) text.getParentNode(); + if (notifier == null) + return null; + INodeAdapter adapter = notifier.getAdapterFor(IStyleSheetAdapter.class); + if (adapter == null) + return null; + if (!(adapter instanceof IStyleSheetAdapter)) + return null; + IStyleSheetAdapter styleAdapter = (IStyleSheetAdapter) adapter; + return styleAdapter.getModel(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java new file mode 100644 index 0000000000..6667d85933 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java @@ -0,0 +1,356 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + +import java.util.Iterator; + +import org.eclipse.wst.css.core.internal.format.CSSSourceFormatter; +import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleDeclarationAdapter; +import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; +import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode; +import org.eclipse.wst.html.core.HTMLFormatContraints; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.sse.core.text.ITextRegionList; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; +import org.w3c.dom.Attr; +import org.w3c.dom.NamedNodeMap; + +// nakamori_TODO: check and remove CSS formatting + +public class HTMLElementFormatter extends HTMLFormatter { + + /** + */ + protected HTMLElementFormatter() { + super(); + } + + /** + */ + private void compressTailingSpaces(IStructuredDocumentRegion flatNode, ITextRegion region) { + int offset = region.getTextEnd(); + int count = region.getEnd() - offset; + if (count == 1) { + String source = flatNode.getFullText(region); + int start = region.getStart(); + if (source != null && source.charAt(offset - start) == ' ') { + // nothing to do + return; + } + } + replaceSource(flatNode, offset, count, " ");//$NON-NLS-1$ + } + + /** + */ + private void formatEndTag(IDOMElement element, HTMLFormatContraints contraints) { + IStructuredDocumentRegion endStructuredDocumentRegion = element.getEndStructuredDocumentRegion(); + if (endStructuredDocumentRegion == null) + return; + + if (element.isJSPTag() || element.isCommentTag()) { + String endTag = endStructuredDocumentRegion.getText(); + if (endTag != null && endTag.length() > 0) { + setWidth(contraints, endTag); + } + return; + } + + ITextRegion prevRegion = null; + ITextRegionList regions = endStructuredDocumentRegion.getRegions(); + Iterator e = regions.iterator(); + while (e.hasNext()) { + ITextRegion region = (ITextRegion) e.next(); + if (region == null) + continue; + String regionType = region.getType(); + if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTag(regionType)) { + if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_END_TAG_OPEN) { + removeTailingSpaces(endStructuredDocumentRegion, prevRegion); + } + } + else if (regionType == DOMRegionContext.XML_TAG_CLOSE) { + if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_NAME || isNestedRootTag(prevRegion.getType()))) { + removeTailingSpaces(endStructuredDocumentRegion, prevRegion); + } + } + prevRegion = region; + } + if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_NAME || isNestedRootTag(prevRegion.getType()))) { + removeTailingSpaces(endStructuredDocumentRegion, prevRegion); + } + + String newEndTag = endStructuredDocumentRegion.getText(); + if (newEndTag != null && newEndTag.length() > 0) { + setWidth(contraints, newEndTag); + } + } + + /** + */ + protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + IDOMElement element = (IDOMElement) node; + + formatStartTag(element, contraints); + + formatChildNodes(element, contraints); + + formatEndTag(element, contraints); + } + + /** + */ + private void formatStartTag(IDOMElement element, HTMLFormatContraints contraints) { + IStructuredDocumentRegion startStructuredDocumentRegion = element.getStartStructuredDocumentRegion(); + if (startStructuredDocumentRegion == null) + return; + + // We should format attributes in JSPTag? + // if (element.isJSPTag() || element.isCommentTag()) { + if (element.isCommentTag()) { + String startTag = startStructuredDocumentRegion.getText(); + if (startTag != null && startTag.length() > 0) { + setWidth(contraints, startTag); + } + return; + } + + // first process style attribute + if (element.isGlobalTag()) { + Attr attr = element.getAttributeNode("style");//$NON-NLS-1$ + if (attr != null) + formatStyleAttr(attr); + } + boolean insertBreak = false; + insertBreak = ((IStructuredFormatPreferencesXML) getFormatPreferences()).getSplitMultiAttrs(); + + if (insertBreak) { + NamedNodeMap attributes = element.getAttributes(); + if (attributes == null || attributes.getLength() < 2) + insertBreak = false; + } + String breakSpaces = getBreakSpaces(element); + String indent = getIndent(); + if (indent != null && indent.length() > 0) { + breakSpaces += indent; + } + ITextRegion lastBreakRegion = null; + + ITextRegion prevRegion = null; + ITextRegionList regions = startStructuredDocumentRegion.getRegions(); + Iterator e = regions.iterator(); + while (e.hasNext()) { + ITextRegion region = (ITextRegion) e.next(); + if (region == null) + continue; + + ITextRegion breakRegion = null; + + String regionType = region.getType(); + if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTag(regionType)) { + if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_TAG_OPEN) { + removeTailingSpaces(startStructuredDocumentRegion, prevRegion); + } + breakRegion = region; + } + else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) { + if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) { + // attribute name without value + breakRegion = prevRegion; + } + } + else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) { + if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) { + removeTailingSpaces(startStructuredDocumentRegion, prevRegion); + } + } + else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) { + if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) { + removeTailingSpaces(startStructuredDocumentRegion, prevRegion); + } + breakRegion = region; + } + else if (regionType == DOMRegionContext.XML_TAG_CLOSE || regionType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { + if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) { + // attribute name without value + breakRegion = prevRegion; + } + } + + if (breakRegion != null) { + int end = breakRegion.getTextEnd(); + if (lastBreakRegion != null) { + int offset = lastBreakRegion.getEnd(); + int count = end - offset; + if (insertBreak || !isWidthAvailable(contraints, count + 1)) { + replaceTailingSpaces(startStructuredDocumentRegion, lastBreakRegion, breakSpaces); + setWidth(contraints, breakSpaces); + } + else { + compressTailingSpaces(startStructuredDocumentRegion, lastBreakRegion); + addWidth(contraints, 1); + } + addWidth(contraints, count); + } + else { + addWidth(contraints, end); + } + lastBreakRegion = breakRegion; + } + + prevRegion = region; + } + if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) { + // attribute name without value + int end = prevRegion.getTextEnd(); + if (lastBreakRegion != null) { + int offset = lastBreakRegion.getEnd(); + int count = end - offset; + if (insertBreak || !isWidthAvailable(contraints, count + 1)) { + replaceTailingSpaces(startStructuredDocumentRegion, lastBreakRegion, breakSpaces); + setWidth(contraints, breakSpaces); + } + else { + compressTailingSpaces(startStructuredDocumentRegion, lastBreakRegion); + addWidth(contraints, 1); + } + addWidth(contraints, count); + } + else { + addWidth(contraints, end); + } + lastBreakRegion = prevRegion; + } + + if (lastBreakRegion != null) { + int offset = lastBreakRegion.getTextEnd(); + int count = startStructuredDocumentRegion.getLength() - offset; + if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { + compressTailingSpaces(startStructuredDocumentRegion, lastBreakRegion); + count++; + } + else + removeTailingSpaces(startStructuredDocumentRegion, lastBreakRegion); + addWidth(contraints, count); + } + else { + addWidth(contraints, startStructuredDocumentRegion.getLength()); + } + } + + /** + * ISSUE: this is a bit of hidden JSP knowledge that was implemented this + * way for expedency. Should be evolved in future to depend on + * "nestedContext". + */ + private boolean isNestedTag(String regionType) { + final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$ + final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$NON-NLS-1$ + boolean result = regionType.equals(JSP_ROOT_TAG_NAME) || regionType.equals(JSP_DIRECTIVE_NAME); + return result; + } + + /** + * ISSUE: this is a bit of hidden JSP knowledge that was implemented this + * way for expedency. Should be evolved in future to depend on + * "nestedContext". + */ + private boolean isNestedRootTag(String regionType) { + final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$ + boolean result = regionType.equals(JSP_ROOT_TAG_NAME); + return result; + } + + + /** + */ + private void formatStyleAttr(Attr attr) { + if (attr == null) + return; + String value = getCSSValue(attr); + if (value == null) + return; + String oldValue = ((IDOMNode) attr).getValueSource(); + if (oldValue != null && value.equals(oldValue)) + return; + attr.setValue(value); + } + + /** + */ + private ICSSModel getCSSModel(Attr attr) { + if (attr == null) + return null; + INodeNotifier notifier = (INodeNotifier) attr.getOwnerElement(); + if (notifier == null) + return null; + INodeAdapter adapter = notifier.getAdapterFor(IStyleDeclarationAdapter.class); + if (adapter == null) + return null; + if (!(adapter instanceof IStyleDeclarationAdapter)) + return null; + IStyleDeclarationAdapter styleAdapter = (IStyleDeclarationAdapter) adapter; + return styleAdapter.getModel(); + } + + /** + */ + private String getCSSValue(Attr attr) { + ICSSModel model = getCSSModel(attr); + if (model == null) + return null; + ICSSNode document = model.getDocument(); + if (document == null) + return null; + INodeNotifier notifier = (INodeNotifier) document; + INodeAdapter adapter = notifier.getAdapterFor(CSSSourceFormatter.class); + if (adapter == null) + return null; + CSSSourceFormatter formatter = (CSSSourceFormatter) adapter; + StringBuffer buffer = formatter.format(document); + if (buffer == null) + return null; + return buffer.toString(); + } + + /** + */ + private void removeTailingSpaces(IStructuredDocumentRegion flatNode, ITextRegion region) { + int offset = region.getTextEnd(); + int count = region.getEnd() - offset; + if (count <= 0) + return; + replaceSource(flatNode, offset, count, null); + } + + /** + */ + private void replaceTailingSpaces(IStructuredDocumentRegion flatNode, ITextRegion region, String spaces) { + int offset = region.getTextEnd(); + int count = region.getEnd() - offset; + if (count == spaces.length()) { + String source = flatNode.getFullText(region); + if (source != null && source.endsWith(spaces)) { + // nothing to do + return; + } + } + replaceSource(flatNode, offset, count, spaces); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java new file mode 100644 index 0000000000..d0e4f46007 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + +import org.eclipse.wst.html.core.HTMLFormatContraints; +import org.eclipse.wst.sse.core.internal.format.StructuredFormatContraints; + +/** + * @deprecated + * Please un-deprecate this if Page Designer thinks they are needed. + */ +public class HTMLFormatContraintsImpl extends StructuredFormatContraints implements HTMLFormatContraints { + protected int fAvailableLineWidth; + + /** + * @deprecated + * It's very hard to keep the available line width accurate. + * Sometimes a node wants to start on a new line, sometimes it doesn't. + * It's best for the node to figure out the available line width on the fly. + */ + public int getAvailableLineWidth() { + return fAvailableLineWidth; + } + + /** + * @deprecated + * It's very hard to keep the available line width accurate. + * Sometimes a node wants to start on a new line, sometimes it doesn't. + * It's best for the node to figure out the available line width on the fly. + */ + public void setAvailableLineWidth(int availableLineWidth) { + fAvailableLineWidth = availableLineWidth; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java new file mode 100644 index 0000000000..4bf8bebfe8 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + +import org.eclipse.core.runtime.Preferences; +import org.eclipse.wst.html.core.internal.HTMLCorePlugin; +import org.eclipse.wst.sse.core.internal.SSECorePlugin; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter; +import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames; +import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML; +import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML; +import org.eclipse.wst.xml.core.internal.provisional.format.StructuredFormatPreferencesXML; +import org.w3c.dom.Node; + +public class HTMLFormatProcessorImpl extends FormatProcessorXML { + protected String getFileExtension() { + return "html"; //$NON-NLS-1$ + } + + protected IStructuredFormatter getFormatter(Node node) { + IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(node, getFormatPreferences()); + + return formatter; + } + + public IStructuredFormatPreferences getFormatPreferences() { + if (fFormatPreferences == null) { + fFormatPreferences = new StructuredFormatPreferencesXML(); + + Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences(); + if (preferences != null) { + fFormatPreferences.setLineWidth(preferences.getInt(CommonModelPreferenceNames.LINE_WIDTH)); + ((IStructuredFormatPreferencesXML) fFormatPreferences).setSplitMultiAttrs(preferences.getBoolean(CommonModelPreferenceNames.SPLIT_MULTI_ATTRS)); + fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(CommonModelPreferenceNames.CLEAR_ALL_BLANK_LINES)); + + if (preferences.getBoolean(CommonModelPreferenceNames.INDENT_USING_TABS)) + fFormatPreferences.setIndent("\t"); //$NON-NLS-1$ + else { + int tabWidth = SSECorePlugin.getDefault().getPluginPreferences().getInt(CommonModelPreferenceNames.TAB_WIDTH); + String indent = ""; //$NON-NLS-1$ + for (int i = 0; i < tabWidth; i++) { + indent += " "; //$NON-NLS-1$ + } + fFormatPreferences.setIndent(indent); + } + } + } + + return fFormatPreferences; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java new file mode 100644 index 0000000000..0ecca81ed7 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java @@ -0,0 +1,650 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Preferences; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.HTMLFormatContraints; +import org.eclipse.wst.html.core.internal.HTMLCorePlugin; +import org.eclipse.wst.sse.core.internal.SSECorePlugin; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter; +import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames; +import org.eclipse.wst.sse.core.text.IStructuredDocument; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMModel; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; +import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; +import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML; +import org.eclipse.wst.xml.core.internal.provisional.format.StructuredFormatPreferencesXML; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +public class HTMLFormatter implements IStructuredFormatter { + + private static final String HTML_NAME = "html";//$NON-NLS-1$ + private static final String BODY_NAME = "BODY";//$NON-NLS-1$ + + /** + */ + protected void addWidth(HTMLFormatContraints contraints, int width) { + if (contraints == null) + return; + if (!splitLines() || getLineWidth() < 0) + return; + + int availableWidth = contraints.getAvailableLineWidth() - width; + if (availableWidth < 0) + availableWidth = 0; + contraints.setAvailableLineWidth(availableWidth); + } + + /** + */ + protected boolean canFormatChild(Node node) { + while (node != null) { + if (node.getNodeType() != Node.ELEMENT_NODE) + return true; + CMElementDeclaration decl = getElementDeclaration((Element) node); + if (decl != null) { + if (decl.getContentType() == CMElementDeclaration.CDATA) + return false; + if (decl.supports(HTMLCMProperties.SHOULD_KEEP_SPACE)) { + boolean shouldKeepSpace = ((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_KEEP_SPACE)).booleanValue(); + if (shouldKeepSpace) + return false; + } + } + node = node.getParentNode(); + } + return false; + } + + /** + */ + protected boolean canInsertBreakAfter(CMElementDeclaration decl) { + if (decl == null) + return false; + if (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT)) + return false; + String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT); + if (hint == null) + return false; + return (hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END) || hint.equals(HTMLCMProperties.Values.BREAK_AFTER_START)); + } + + /** + */ + protected boolean canInsertBreakAfter(Node node) { + if (node == null) + return false; + Node parent = node.getParentNode(); + if (parent == null) + return false; + Node next = node.getNextSibling(); + + if (parent.getNodeType() == Node.DOCUMENT_NODE) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + // do not insert break after unclosed tag + if (!((IDOMElement) node).isClosed()) + return false; + } + return true; + } + else if (parent.getNodeType() == Node.ELEMENT_NODE) { + IDOMElement element = (IDOMElement) parent; + // do not insert break before missing end tag + if (next == null && element.getEndStructuredDocumentRegion() == null) + return false; + + // insert line break under non-HTML elements including JSP elements + if (element.getPrefix() != null) + return true; + + CMElementDeclaration decl = getElementDeclaration(element); + if (decl != null) { + if (decl.getContentType() == CMElementDeclaration.ELEMENT) + return true; + String tagName = element.getTagName(); + // special for direct children under BODY + if (tagName != null && tagName.equalsIgnoreCase(BODY_NAME)) + return true; + } + } + + if (node.getNodeType() == Node.ELEMENT_NODE) { + IDOMElement element = (IDOMElement) node; + CMElementDeclaration decl = getElementDeclaration(element); + if (canInsertBreakAfter(decl)) { + // spcial for BR + return canFormatChild(parent); + } + } + if (next != null && next.getNodeType() == Node.ELEMENT_NODE) { + CMElementDeclaration decl = getElementDeclaration((Element) next); + if (canInsertBreakBefore(decl)) + return true; + } + return false; + } + + /** + */ + protected boolean canInsertBreakBefore(CMElementDeclaration decl) { + if (decl == null) + return false; + if (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT)) + return false; + String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT); + if (hint == null) + return false; + return hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END); + } + + /** + */ + protected boolean canInsertBreakBefore(Node node) { + if (node == null) + return false; + Node parent = node.getParentNode(); + if (parent == null) + return false; + Node prev = node.getPreviousSibling(); + + if (parent.getNodeType() == Node.DOCUMENT_NODE) { + if (prev == null) + return false; + return true; + } + else if (parent.getNodeType() == Node.ELEMENT_NODE) { + IDOMElement element = (IDOMElement) parent; + // do not insert break after missing start tag + if (prev == null && element.getStartStructuredDocumentRegion() == null) + return false; + + // insert line break under non-HTML elements including JSP elements + if (element.getPrefix() != null) + return true; + + CMElementDeclaration decl = getElementDeclaration(element); + if (decl != null) { + if (decl.getContentType() == CMElementDeclaration.ELEMENT) + return true; + String tagName = element.getTagName(); + // special for direct children under BODY + if (tagName != null && tagName.equalsIgnoreCase(BODY_NAME)) + return true; + } + } + + if (node.getNodeType() == Node.ELEMENT_NODE) { + CMElementDeclaration decl = getElementDeclaration((Element) node); + if (canInsertBreakBefore(decl)) + return true; + } + if (prev != null && prev.getNodeType() == Node.ELEMENT_NODE) { + CMElementDeclaration decl = getElementDeclaration((Element) prev); + if (canInsertBreakAfter(decl)) { + // spcial for BR + return canFormatChild(parent); + } + } + return false; + } + + /** + */ + public void format(Node node) { + format(node, getFormatContraints()); + } + + /** + */ + public void format(Node node, IStructuredFormatContraints contraints) { + if (node instanceof IDOMNode && contraints instanceof HTMLFormatContraints) + format((IDOMNode) node, (HTMLFormatContraints) contraints); + } + + public void format(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + if (node.getParentNode() == null) + return; // do not format removed node + + setWidth(contraints, node); + + if (canInsertBreakBefore(node)) + insertBreakBefore(node, contraints); + + formatNode(node, contraints); + + if (canInsertBreakAfter(node)) + insertBreakAfter(node, contraints); + } + + /** + */ + protected void formatChildNodes(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + if (!node.hasChildNodes()) + return; + + // concat adjacent texts + node.normalize(); + + // disable sibling indent during formatting all the children + boolean indent = false; + if (contraints != null) { + indent = contraints.getFormatWithSiblingIndent(); + contraints.setFormatWithSiblingIndent(false); + } + + boolean insertBreak = true; + IDOMNode child = (IDOMNode) node.getFirstChild(); + while (child != null) { + if (child.getParentNode() != node) + break; + IDOMNode next = (IDOMNode) child.getNextSibling(); + + if (insertBreak && canInsertBreakBefore(child)) { + insertBreakBefore(child, contraints); + } + + IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(child, getFormatPreferences()); + if (formatter != null) { + if (formatter instanceof HTMLFormatter) { + HTMLFormatter htmlFormatter = (HTMLFormatter) formatter; + htmlFormatter.formatNode(child, contraints); + } + else { + formatter.format(child); + } + } + + if (canInsertBreakAfter(child)) { + insertBreakAfter(child, contraints); + insertBreak = false; // not to insert twice + } + else { + insertBreak = true; + } + + child = next; + } + + if (contraints != null) + contraints.setFormatWithSiblingIndent(indent); + } + + /** + */ + protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + + if (node.hasChildNodes()) { // container + formatChildNodes(node, contraints); + } + else { // leaf + IStructuredDocumentRegion flatNode = node.getStartStructuredDocumentRegion(); + if (flatNode != null) { + String source = flatNode.getText(); + if (source != null && source.length() > 0) { + setWidth(contraints, source); + } + } + } + } + + /** + */ + protected String getBreakSpaces(Node node) { + if (node == null) + return null; + StringBuffer buffer = new StringBuffer(); + + String delim = ((IDOMNode) node).getModel().getStructuredDocument().getLineDelimiter(); + if (delim != null && delim.length() > 0) + buffer.append(delim); + + String indent = getIndent(); + if (indent != null && indent.length() > 0) { + for (Node parent = node.getParentNode(); parent != null; parent = parent.getParentNode()) { + if (parent.getNodeType() != Node.ELEMENT_NODE) + break; + // ignore omitted tag + if (((IDOMNode) parent).getStartStructuredDocumentRegion() == null) + continue; + + IDOMElement element = (IDOMElement) parent; + if (element.getPrefix() != null) { + String localName = element.getLocalName(); + // special for html:html + if (localName != null && !localName.equals(HTML_NAME)) { + buffer.append(indent); + } + continue; + } + + CMElementDeclaration decl = getElementDeclaration(element); + if (decl != null && decl.supports(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)) { + boolean shouldIndent = ((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)).booleanValue(); + if (shouldIndent) + buffer.append(indent); + } + + } + } + + return buffer.toString(); + } + + /** + */ + protected String getIndent() { + return getFormatPreferences().getIndent(); + } + + /** + */ + protected int getLineWidth() { + return getFormatPreferences().getLineWidth(); + } + + /** + */ + protected CMElementDeclaration getElementDeclaration(Element element) { + if (element == null) + return null; + Document document = element.getOwnerDocument(); + if (document == null) + return null; + ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document); + if (modelQuery == null) + return null; + return modelQuery.getCMElementDeclaration(element); + } + + /** + */ + protected void insertBreakAfter(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + if (node.getNodeType() == Node.TEXT_NODE) + return; + Node parent = node.getParentNode(); + if (parent == null) + return; + Node next = node.getNextSibling(); + + String spaces = null; + if (next == null) { // last spaces + // use parent indent for the end tag + spaces = getBreakSpaces(parent); + } + else if (next.getNodeType() == Node.TEXT_NODE) { + if (contraints != null && contraints.getFormatWithSiblingIndent()) { + IDOMNode text = (IDOMNode) next; + IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(text, getFormatPreferences()); + if (formatter instanceof HTMLTextFormatter) { + HTMLTextFormatter textFormatter = (HTMLTextFormatter) formatter; + textFormatter.formatText(text, contraints, HTMLTextFormatter.FORMAT_HEAD); + } + } + return; + } + else { + spaces = getBreakSpaces(node); + } + if (spaces == null || spaces.length() == 0) + return; + + replaceSource(node.getModel(), node.getEndOffset(), 0, spaces); + setWidth(contraints, spaces); + } + + /** + */ + protected void insertBreakBefore(IDOMNode node, HTMLFormatContraints contraints) { + if (node == null) + return; + if (node.getNodeType() == Node.TEXT_NODE) + return; + Node parent = node.getParentNode(); + if (parent == null) + return; + Node prev = node.getPreviousSibling(); + + String spaces = null; + if (prev != null && prev.getNodeType() == Node.TEXT_NODE) { + if (contraints != null && contraints.getFormatWithSiblingIndent()) { + IDOMNode text = (IDOMNode) prev; + IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(text, getFormatPreferences()); + if (formatter instanceof HTMLTextFormatter) { + HTMLTextFormatter textFormatter = (HTMLTextFormatter) formatter; + textFormatter.formatText(text, contraints, HTMLTextFormatter.FORMAT_TAIL); + } + } + return; + } + else { + spaces = getBreakSpaces(node); + } + if (spaces == null || spaces.length() == 0) + return; + + replaceSource(node.getModel(), node.getStartOffset(), 0, spaces); + setWidth(contraints, spaces); + } + + /** + */ + protected boolean isWidthAvailable(HTMLFormatContraints contraints, int width) { + if (contraints == null) + return true; + if (!splitLines() || getLineWidth() < 0) + return true; + return (contraints.getAvailableLineWidth() >= width); + } + + /** + */ + protected boolean keepBlankLines(HTMLFormatContraints contraints) { + if (contraints == null) + return true; + return (!contraints.getClearAllBlankLines()); + } + + /** + */ + protected void replaceSource(IStructuredDocumentRegion flatNode, int offset, int length, String source) { + if (flatNode == null) + return; + IStructuredDocument structuredDocument = flatNode.getParentDocument(); + if (structuredDocument == null) + return; + if (source == null) + source = new String(); + int startOffset = flatNode.getStartOffset(); + if (structuredDocument.containsReadOnly(startOffset + offset, length)) + return; + // We use 'structuredDocument' as the requester object just so this and the other + // format-related 'repalceText' (in replaceSource) can use the same requester. + // Otherwise, if requester is not identical, + // the undo group gets "broken" into multiple pieces based + // on the requesters being different. Technically, any unique, common + // requester object would work. + structuredDocument.replaceText(structuredDocument, startOffset + offset, length, source); + } + + /** + */ + protected void replaceSource(IDOMModel model, int offset, int length, String source) { + if (model == null) + return; + IStructuredDocument structuredDocument = model.getStructuredDocument(); + if (structuredDocument == null) + return; + if (source == null) + source = new String(); + if (structuredDocument.containsReadOnly(offset, length)) + return; + // We use 'structuredDocument' as the requester object just so this and the other + // format-related 'repalceText' (in replaceSource) can use the same requester. + // Otherwise, if requester is not identical, + // the undo group gets "broken" into multiple pieces based + // on the requesters being different. Technically, any unique, common + // requester object would work. + structuredDocument.replaceText(structuredDocument, offset, length, source); + } + + /** + */ + protected void setWidth(HTMLFormatContraints contraints, String source) { + if (contraints == null) + return; + if (source == null) + return; + int length = source.length(); + if (length == 0) + return; + + if (!splitLines()) + return; + int lineWidth = getLineWidth(); + if (lineWidth < 0) + return; + + int offset = source.lastIndexOf('\n'); + int offset2 = source.lastIndexOf('\r'); + if (offset2 > offset) + offset = offset2; + if (offset >= 0) + offset++; + + int availableWidth = 0; + if (offset >= 0) { + availableWidth = lineWidth - (length - offset); + } + else { + availableWidth = contraints.getAvailableLineWidth() - length; + } + if (availableWidth < 0) + availableWidth = 0; + contraints.setAvailableLineWidth(availableWidth); + } + + /** + */ + protected void setWidth(HTMLFormatContraints contraints, Node node) { + if (contraints == null) + return; + if (node == null) + return; + IStructuredDocument structuredDocument = ((IDOMNode) node).getStructuredDocument(); + if (structuredDocument == null) + return; // error + + if (!splitLines()) + return; + int lineWidth = getLineWidth(); + if (lineWidth < 0) + return; + + int offset = ((IDOMNode) node).getStartOffset(); + int line = structuredDocument.getLineOfOffset(offset); + int lineOffset = 0; + try { + lineOffset = structuredDocument.getLineOffset(line); + } + catch (BadLocationException ex) { + return; // error + } + if (lineOffset > offset) + return; // error + + int availableWidth = lineWidth - (offset - lineOffset); + if (availableWidth < 0) + availableWidth = 0; + + contraints.setAvailableLineWidth(availableWidth); + } + + /** + */ + protected boolean splitLines() { + return true;//getFormatPreferences().getSplitLines(); + } + + protected IStructuredFormatPreferences fFormatPreferences = null; + protected HTMLFormatContraints fFormatContraints = null; + protected IProgressMonitor fProgressMonitor = null; + + //public void format(XMLNode node, FormatContraints formatContraints) { + // if (formatContraints.getFormatWithSiblingIndent()) + // formatContraints.setCurrentIndent(getSiblingIndent(node)); + // + // formatNode(node, formatContraints); + //} + + public void setFormatPreferences(IStructuredFormatPreferences formatPreferences) { + fFormatPreferences = formatPreferences; + } + + public IStructuredFormatPreferences getFormatPreferences() { + if (fFormatPreferences == null) { + fFormatPreferences = new StructuredFormatPreferencesXML(); + + Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences(); + if (preferences != null) { + fFormatPreferences.setLineWidth(preferences.getInt(CommonModelPreferenceNames.LINE_WIDTH)); + ((IStructuredFormatPreferencesXML) fFormatPreferences).setSplitMultiAttrs(preferences.getBoolean(CommonModelPreferenceNames.SPLIT_MULTI_ATTRS)); + fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(CommonModelPreferenceNames.CLEAR_ALL_BLANK_LINES)); + + if (preferences.getBoolean(CommonModelPreferenceNames.INDENT_USING_TABS)) + fFormatPreferences.setIndent("\t"); //$NON-NLS-1$ + else { + int tabWidth = SSECorePlugin.getDefault().getPluginPreferences().getInt(CommonModelPreferenceNames.TAB_WIDTH); + String indent = ""; //$NON-NLS-1$ + for (int i = 0; i < tabWidth; i++) { + indent += " "; //$NON-NLS-1$ + } + fFormatPreferences.setIndent(indent); + } + } + } + + return fFormatPreferences; + } + + public IStructuredFormatContraints getFormatContraints() { + if (fFormatContraints == null) { + fFormatContraints = new HTMLFormatContraintsImpl(); + + fFormatContraints.setAvailableLineWidth(getFormatPreferences().getLineWidth()); + fFormatContraints.setClearAllBlankLines(getFormatPreferences().getClearAllBlankLines()); + } + + return fFormatContraints; + } + + public void setProgressMonitor(IProgressMonitor progressMonitor) { + fProgressMonitor = progressMonitor; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java new file mode 100644 index 0000000000..b4146dffb4 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + +import org.eclipse.core.runtime.Preferences; +import org.eclipse.wst.html.core.internal.HTMLCorePlugin; +import org.eclipse.wst.sse.core.internal.SSECorePlugin; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences; +import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter; +import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames; +import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML; +import org.eclipse.wst.xml.core.internal.provisional.format.StructuredFormatPreferencesXML; +import org.w3c.dom.Node; + +// nakamori_TODO: check and remove CSS formatting + +class HTMLFormatterFactory { + private static HTMLFormatterFactory fInstance = null; + protected IStructuredFormatPreferencesXML fFormatPreferences = null; + + static synchronized HTMLFormatterFactory getInstance() { + if (fInstance == null) { + fInstance = new HTMLFormatterFactory(); + } + return fInstance; + } + + protected IStructuredFormatter createFormatter(Node node, IStructuredFormatPreferences formatPreferences) { + IStructuredFormatter formatter = null; + + switch (node.getNodeType()) { + case Node.ELEMENT_NODE : + formatter = new HTMLElementFormatter(); + break; + case Node.TEXT_NODE : + if (isEmbeddedCSS(node)) { + formatter = new EmbeddedCSSFormatter(); + } + else { + formatter = new HTMLTextFormatter(); + } + break; + default : + formatter = new HTMLFormatter(); + break; + } + + // init FormatPreferences + formatter.setFormatPreferences(formatPreferences); + + return formatter; + } + + /** + */ + private boolean isEmbeddedCSS(Node node) { + if (node == null) + return false; + Node parent = node.getParentNode(); + if (parent == null) + return false; + if (parent.getNodeType() != Node.ELEMENT_NODE) + return false; + String name = parent.getNodeName(); + if (name == null) + return false; + return name.equalsIgnoreCase("STYLE");//$NON-NLS-1$ + } + + + private HTMLFormatterFactory() { + super(); + } + + protected IStructuredFormatPreferencesXML getFormatPreferences() { + if (fFormatPreferences == null) { + fFormatPreferences = new StructuredFormatPreferencesXML(); + + Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences(); + if (preferences != null) { + fFormatPreferences.setLineWidth(preferences.getInt(CommonModelPreferenceNames.LINE_WIDTH)); + fFormatPreferences.setSplitMultiAttrs(preferences.getBoolean(CommonModelPreferenceNames.SPLIT_MULTI_ATTRS)); + fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(CommonModelPreferenceNames.CLEAR_ALL_BLANK_LINES)); + + if (preferences.getBoolean(CommonModelPreferenceNames.INDENT_USING_TABS)) + fFormatPreferences.setIndent("\t"); //$NON-NLS-1$ + else { + int tabWidth = SSECorePlugin.getDefault().getPluginPreferences().getInt(CommonModelPreferenceNames.TAB_WIDTH); + String indent = ""; //$NON-NLS-1$ + for (int i = 0; i < tabWidth; i++) { + indent += " "; //$NON-NLS-1$ + } + fFormatPreferences.setIndent(indent); + } + } + } + + return fFormatPreferences; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java new file mode 100644 index 0000000000..2d9fbd2464 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java @@ -0,0 +1,298 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + + + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.HTMLFormatContraints; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.document.IDOMText; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +public class HTMLTextFormatter extends HTMLFormatter { + + public static int FORMAT_ALL = 0; + public static int FORMAT_HEAD = 1; + public static int FORMAT_TAIL = 2; + + /** + */ + protected HTMLTextFormatter() { + super(); + } + + /** + */ + private boolean canFormatText(IDOMText text) { + if (text == null) + return false; + + IStructuredDocumentRegion flatNode = text.getFirstStructuredDocumentRegion(); + if (flatNode != null) { + String type = flatNode.getType(); + if (isUnparsedRegion(type)) + return false; + } + + Node parent = text.getParentNode(); + if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) { + IDOMElement element = (IDOMElement) parent; + if (!element.isGlobalTag() && !text.isWhitespace()) + return false; + } + + return canFormatChild(parent); + } + + private boolean isUnparsedRegion(String type) { + boolean result = isNestedScannedRegion(type) || isBlockScannedRegion(type); + return result; + } + + private boolean isBlockScannedRegion(String type) { + return type == DOMRegionContext.BLOCK_TEXT; + } + + /** + * ISSUE: this is a bit of hidden JSP knowledge that was implemented this + * way for expedency. Should be evolved in future to depend on "nestedContext". + */ + private boolean isNestedScannedRegion(String type) { + final String JSP_CONTENT = "JSP_CONTENT"; //$NON-NLS-1$ + return type.equals(JSP_CONTENT); + } + + /** + */ + private boolean canRemoveHeadingSpaces(IDOMNode node) { + if (node == null) + return false; + if (node.getPreviousSibling() != null) + return false; + Node parent = node.getParentNode(); + if (parent == null || parent.getNodeType() != Node.ELEMENT_NODE) + return false; + + CMElementDeclaration decl = getElementDeclaration((Element) parent); + if (decl == null || (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT))) + return false; + String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT); + return hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END); + } + + /** + */ + private boolean canRemoveTailingSpaces(IDOMNode node) { + if (node == null) + return false; + if (node.getNextSibling() != null) + return false; + Node parent = node.getParentNode(); + if (parent == null || parent.getNodeType() != Node.ELEMENT_NODE) + return false; + + CMElementDeclaration decl = getElementDeclaration((Element) parent); + if (decl == null || (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT))) + return false; + String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT); + return hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END); + } + + /** + */ + protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) { + formatText(node, contraints, FORMAT_ALL); // full format + } + + /** + */ + protected void formatText(IDOMNode node, HTMLFormatContraints contraints, int mode) { + if (node == null) + return; + Node parent = node.getParentNode(); + if (parent == null) + return; + + IDOMText text = (IDOMText) node; + String source = text.getSource(); + + if (!canFormatText(text)) { + setWidth(contraints, source); + return; + } + + int offset = text.getStartOffset(); + int length = text.getEndOffset() - offset; + + // format adjacent text at once + if (mode == FORMAT_HEAD) { + Node next = node.getNextSibling(); + while (next != null && next.getNodeType() == Node.TEXT_NODE) { + IDOMText nextText = (IDOMText) next; + length += (nextText.getEndOffset() - nextText.getStartOffset()); + String nextSource = nextText.getSource(); + if (nextSource != null && nextSource.length() > 0) { + if (source == null) + source = nextSource; + else + source += nextSource; + } + next = next.getNextSibling(); + } + } + else if (mode == FORMAT_TAIL) { + Node prev = node.getPreviousSibling(); + while (prev != null && prev.getNodeType() == Node.TEXT_NODE) { + IDOMText prevText = (IDOMText) prev; + offset = prevText.getStartOffset(); + length += (prevText.getEndOffset() - offset); + String prevSource = prevText.getSource(); + if (prevSource != null && prevSource.length() > 0) { + if (source == null) + source = prevSource; + else + source = prevSource + source; + } + prev = prev.getPreviousSibling(); + } + } + + SpaceConverter converter = new SpaceConverter(source, keepBlankLines(contraints)); + + int wordLength = converter.nextWord(); + if (wordLength == 0) { // only spaces + if (!converter.hasSpaces()) + return; // empty + boolean removeSpaces = false; + if (parent.getNodeType() == Node.ELEMENT_NODE) { + // check if tags are omitted + IDOMNode element = (IDOMNode) parent; + if (node.getPreviousSibling() == null && element.getStartStructuredDocumentRegion() == null) { + removeSpaces = true; + } + else if (node.getNextSibling() == null && element.getEndStructuredDocumentRegion() == null) { + removeSpaces = true; + } + } + if (removeSpaces) { + converter.replaceSpaces(null); + } + else if (!isWidthAvailable(contraints, 2) || canInsertBreakAfter(node) || canInsertBreakBefore(node)) { + String spaces = null; + if (node.getNextSibling() == null) { // last spaces + // use parent indent for the end tag + spaces = getBreakSpaces(parent); + } + else { + spaces = getBreakSpaces(node); + } + converter.replaceSpaces(spaces); + setWidth(contraints, spaces); + } + else if (canRemoveHeadingSpaces(node) || canRemoveTailingSpaces(node)) { + converter.replaceSpaces(null); + } + else { + converter.compressSpaces(); + addWidth(contraints, 1); + } + } + else { + String breakSpaces = null; + + // format heading spaces + boolean hasSpaces = converter.hasSpaces(); + if (mode == FORMAT_TAIL) { + // keep spaces as is + addWidth(contraints, converter.getSpaceCount()); + } + else if ((hasSpaces && !isWidthAvailable(contraints, wordLength + 1)) || canInsertBreakBefore(node)) { + breakSpaces = getBreakSpaces(node); + converter.replaceSpaces(breakSpaces); + setWidth(contraints, breakSpaces); + } + else { + if (hasSpaces) { + if (canRemoveHeadingSpaces(node)) { + converter.replaceSpaces(null); + } + else { + converter.compressSpaces(); + addWidth(contraints, 1); + } + } + } + addWidth(contraints, wordLength); + + // format middle + wordLength = converter.nextWord(); + while (wordLength > 0) { + if (mode != FORMAT_ALL) { + // keep spaces as is + addWidth(contraints, converter.getSpaceCount()); + } + else if (!isWidthAvailable(contraints, wordLength + 1)) { + if (breakSpaces == null) + breakSpaces = getBreakSpaces(node); + converter.replaceSpaces(breakSpaces); + setWidth(contraints, breakSpaces); + } + else { + converter.compressSpaces(); + addWidth(contraints, 1); + } + addWidth(contraints, wordLength); + wordLength = converter.nextWord(); + } + + // format tailing spaces + hasSpaces = converter.hasSpaces(); + if (mode == FORMAT_HEAD) { + // keep spaces as is + addWidth(contraints, converter.getSpaceCount()); + } + else if ((hasSpaces && !isWidthAvailable(contraints, 2)) || canInsertBreakAfter(node)) { + if (node.getNextSibling() == null) { // last test + // use parent indent for the end tag + breakSpaces = getBreakSpaces(parent); + } + else { + if (breakSpaces == null) + breakSpaces = getBreakSpaces(node); + } + converter.replaceSpaces(breakSpaces); + setWidth(contraints, breakSpaces); + } + else { + if (hasSpaces) { + if (canRemoveTailingSpaces(node)) { + converter.replaceSpaces(null); + } + else { + converter.compressSpaces(); + addWidth(contraints, 1); + } + } + } + } + + if (converter.isModified()) { + source = converter.getSource(); + replaceSource(text.getModel(), offset, length, source); + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java new file mode 100644 index 0000000000..a7b6f66bf9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.format; + + + +final class SpaceConverter { + + private String source = null; + private int length = 0; + private int startOffset = 0; + private int endOffset = 0; + private int spaceCount = 0; + private int wordCount = 0; + private StringBuffer buffer = null; + private int lastOffset = 0; + private boolean keepBlankLines = false; + + /** + */ + public SpaceConverter(String source) { + super(); + + if (source == null) { + this.source = new String(); + } + else { + this.source = source; + this.length = source.length(); + } + } + + /** + */ + public SpaceConverter(String source, boolean keepBlankLines) { + super(); + + if (source == null) { + this.source = new String(); + } + else { + this.source = source; + this.length = source.length(); + } + this.keepBlankLines = keepBlankLines; + } + + /** + */ + public void compressSpaces() { + if (this.spaceCount == 0) + return; + if (this.spaceCount == 1 && this.source.charAt(this.startOffset) == ' ') + return; + + if (this.buffer == null) + this.buffer = new StringBuffer(); + if (this.startOffset > this.lastOffset) { + this.buffer.append(this.source.substring(this.lastOffset, this.startOffset)); + } + + this.buffer.append(' '); + + this.lastOffset = this.startOffset + this.spaceCount; + } + + /** + */ + public String getSource() { + if (this.buffer == null) + this.buffer = new StringBuffer(); + if (this.length > this.lastOffset) { + this.buffer.append(this.source.substring(this.lastOffset, this.length)); + } + return this.buffer.toString(); + } + + /** + */ + public int getSpaceCount() { + return this.spaceCount; + } + + /** + */ + public boolean hasSpaces() { + return (this.spaceCount > 0); + } + + /** + */ + public boolean isModified() { + return (this.buffer != null); + } + + /** + * Add number of the old blank lines to new space string + */ + private static String mergeBlankLines(String newSpaces, String oldSpaces) { + if (newSpaces == null || newSpaces.length() == 0) + return newSpaces; + if (oldSpaces == null) + return newSpaces; + + // count old new lines + int newLineCount = 0; + int oldLength = oldSpaces.length(); + for (int i = 0; i < oldLength; i++) { + char c = oldSpaces.charAt(i); + if (c == '\r') { + newLineCount++; + if (i + 1 < oldLength) { + c = oldSpaces.charAt(i + 1); + if (c == '\n') + i++; + } + } + else { + if (c == '\n') + newLineCount++; + } + } + if (newLineCount < 2) + return newSpaces; // no blank line + + // here assuming newSpaces starts with a new line if any + String delim = null; + char d = newSpaces.charAt(0); + if (d == '\r') { + if (newSpaces.length() > 1 && newSpaces.charAt(1) == '\n') + delim = "\r\n";//$NON-NLS-1$ + else + delim = "\r";//$NON-NLS-1$ + } + else { + if (d == '\n') + delim = "\n";//$NON-NLS-1$ + else + return newSpaces; // no new line + } + + newLineCount--; + StringBuffer buffer = new StringBuffer(newSpaces.length() + newLineCount * 2); + while (newLineCount > 0) { + buffer.append(delim); + newLineCount--; + } + buffer.append(newSpaces); + return buffer.toString(); + } + + /** + */ + public int nextWord() { + if (this.endOffset == this.length) { + this.startOffset = this.endOffset; + this.spaceCount = 0; + this.wordCount = 0; + return 0; + } + + this.startOffset = this.endOffset; + int i = this.startOffset; + for (; i < this.length; i++) { + if (!Character.isWhitespace(this.source.charAt(i))) + break; + } + this.spaceCount = i - this.startOffset; + + int wordOffset = i; + for (; i < this.length; i++) { + if (Character.isWhitespace(this.source.charAt(i))) + break; + } + this.wordCount = i - wordOffset; + this.endOffset = i; + + return this.wordCount; + } + + /** + */ + public void replaceSpaces(String spaces) { + int spaceLength = (spaces != null ? spaces.length() : 0); + String oldSpaces = null; + if (spaceLength == this.spaceCount) { + if (spaceLength == 0) + return; + if (this.startOffset == 0) { + if (this.source.startsWith(spaces)) + return; + } + else if (this.endOffset == this.length) { + if (this.source.endsWith(spaces)) + return; + } + else { + int textOffset = this.startOffset + this.spaceCount; + oldSpaces = this.source.substring(this.startOffset, textOffset); + if (oldSpaces.equals(spaces)) + return; + } + } + if (this.keepBlankLines && this.spaceCount > 0) { + if (oldSpaces == null) { + int textOffset = this.startOffset + this.spaceCount; + oldSpaces = this.source.substring(this.startOffset, textOffset); + } + if (oldSpaces != null) { + spaces = mergeBlankLines(spaces, oldSpaces); + } + } + + if (this.buffer == null) + this.buffer = new StringBuffer(); + if (this.startOffset > this.lastOffset) { + this.buffer.append(this.source.substring(this.lastOffset, this.startOffset)); + } + + if (spaceLength > 0) + this.buffer.append(spaces); + + this.lastOffset = this.startOffset + this.spaceCount; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java new file mode 100644 index 0000000000..2125e74b59 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelhandler; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSelectorAdapter; +import org.eclipse.wst.html.core.htmlcss.HTMLStyleSelectorAdapterFactory; +import org.eclipse.wst.html.core.htmlcss.StyleAdapterFactory; +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeAdapterFactory; +import org.eclipse.wst.html.core.internal.document.HTMLModelParserAdapterFactory; +import org.eclipse.wst.html.core.internal.modelquery.ModelQueryAdapterFactoryForEmbeddedHTML; +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.internal.model.FactoryRegistry; +import org.eclipse.wst.sse.core.modelhandler.EmbeddedTypeHandler; +import org.eclipse.wst.sse.core.parser.BlockMarker; +import org.eclipse.wst.sse.core.parser.BlockTagParser; +import org.eclipse.wst.sse.core.parser.JSPCapableParser; +import org.eclipse.wst.sse.core.util.Assert; +import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter; +import org.eclipse.wst.xml.core.internal.document.ModelParserAdapter; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; + +public class EmbeddedHTML implements EmbeddedTypeHandler { + public String ContentTypeID_EmbeddedHTML = "org.eclipse.wst.html.core.internal.contenttype.EmbeddedHTML"; //$NON-NLS-1$ + + // saved for removal later + private HashSet fLocalFactories = new HashSet(); + + private List supportedMimeTypes; + + /** + * Constructor for EmbeddedHTML. + */ + public EmbeddedHTML() { + super(); + } + + /** + * Convenience method to add tag names using BlockMarker object + */ + protected void addHTMLishTag(BlockTagParser parser, String tagname) { + BlockMarker bm = new BlockMarker(tagname, null, DOMRegionContext.BLOCK_TEXT, false); + parser.addBlockMarker(bm); + } + + /** + * @see EmbeddedContentType#getFamilyId() + */ + public String getFamilyId() { + return ModelHandlerForHTML.AssociatedContentTypeID; + } + + /* + * Only "model side" embedded factories can be added here. + */ + public List getAdapterFactories() { + List factories = new ArrayList(); + factories.add(new ModelQueryAdapterFactoryForEmbeddedHTML()); + // factories.addAll(PluginContributedFactoryReader.getInstance().getFactories(this)); + return factories; + } + + /* + * @see EmbeddedContentType#initializeParser(RegionParser) + */ + public void initializeParser(JSPCapableParser parser) { + addHTMLishTag(parser, "script"); //$NON-NLS-1$ + addHTMLishTag(parser, "style"); //$NON-NLS-1$ + } + + public List getSupportedMimeTypes() { + if (supportedMimeTypes == null) { + supportedMimeTypes = new ArrayList(); + supportedMimeTypes.add("text/html"); //$NON-NLS-1$ + supportedMimeTypes.add("text/xhtml"); //$NON-NLS-1$ + supportedMimeTypes.add("application/xhtml+xml"); //$NON-NLS-1$ + supportedMimeTypes.add("application/xml"); //$NON-NLS-1$ + supportedMimeTypes.add("text/vnd.wap.wml"); //$NON-NLS-1$ + } + return supportedMimeTypes; + } + + public void initializeFactoryRegistry(FactoryRegistry registry) { + Assert.isNotNull(registry); + + INodeAdapterFactory factory = null; + if (!registry.contains(DocumentTypeAdapter.class)) { + factory = new HTMLDocumentTypeAdapterFactory(); + registry.addFactory(factory); + fLocalFactories.add(factory); + } + if (!registry.contains(ModelParserAdapter.class)) { + factory = HTMLModelParserAdapterFactory.getInstance(); + registry.addFactory(factory); + factory = StyleAdapterFactory.getInstance(); + } + if (!registry.contains(IStyleSelectorAdapter.class)) { + registry.addFactory(factory); + factory = HTMLStyleSelectorAdapterFactory.getInstance(); + registry.addFactory(factory); + } + } + + public void uninitializeFactoryRegistry(FactoryRegistry registry) { + Assert.isNotNull(registry); + + if (!fLocalFactories.isEmpty()) { + Iterator it = fLocalFactories.iterator(); + while (it.hasNext()) { + INodeAdapterFactory af = (INodeAdapterFactory) it.next(); + af.release(); + registry.removeFactory(af); + } + } + fLocalFactories.clear(); +// // note this BIG assumption about factory singletons! +// // for this particular list, they are, but may not +// // be in future. +// +// IAdapterFactory factory = new HTMLDocumentTypeAdapterFactory(); +// factory.release(); +// registry.removeFactory(factory); +// +// factory = HTMLModelParserAdapterFactory.getInstance(); +// factory.release(); +// registry.removeFactory(factory); +// +// factory = StyleAdapterFactory.getInstance(); +// factory.release(); +// registry.removeFactory(factory); +// +// factory = HTMLStyleSelectorAdapterFactory.getInstance(); +// factory.release(); +// registry.removeFactory(factory); + } + + public void uninitializeParser(JSPCapableParser parser) { + // I'm assuming block markers are unique based on name only + // we add these as full BlockMarkers, but remove based on name alone. + parser.removeBlockMarker("script"); //$NON-NLS-1$ + parser.removeBlockMarker("script"); //$NON-NLS-1$ + } + + public EmbeddedTypeHandler newInstance() { + return new EmbeddedHTML(); + } + + /** + * will someday be controlled via extension point + */ + public boolean isDefault() { + return true; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java new file mode 100644 index 0000000000..2a88f14129 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelhandler; + +import org.eclipse.wst.html.core.internal.encoding.HTMLDocumentCharsetDetector; +import org.eclipse.wst.html.core.internal.encoding.HTMLDocumentLoader; +import org.eclipse.wst.html.core.internal.encoding.HTMLModelLoader; +import org.eclipse.wst.sse.core.IModelLoader; +import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector; +import org.eclipse.wst.sse.core.internal.document.IDocumentLoader; +import org.eclipse.wst.sse.core.modelhandler.AbstractModelHandler; +import org.eclipse.wst.sse.core.modelhandler.IModelHandler; + +public class ModelHandlerForHTML extends AbstractModelHandler implements IModelHandler { + /** + * Needs to match what's in plugin registry. + * In fact, can be overwritten at run time with + * what's in registry! (so should never be 'final') + */ + static String AssociatedContentTypeID = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$ + /** + * Needs to match what's in plugin registry. + * In fact, can be overwritten at run time with + * what's in registry! (so should never be 'final') + */ + private static String ModelHandlerID_HTML = "org.eclipse.wst.html.core.modelhandler"; //$NON-NLS-1$ + + + public ModelHandlerForHTML() { + super(); + setId(ModelHandlerID_HTML); + setAssociatedContentTypeId(AssociatedContentTypeID); + } + + public IModelLoader getModelLoader() { + return new HTMLModelLoader(); + } + + public IDocumentCharsetDetector getEncodingDetector() { + return new HTMLDocumentCharsetDetector(); + } + + public IDocumentLoader getDocumentLoader() { + return new HTMLDocumentLoader(); + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java new file mode 100644 index 0000000000..ae41f91851 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + +import java.util.Enumeration; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; + +/** + */ +class CMAttributeDeclarationBuddySystem extends CMNodeBuddySystem implements CMAttributeDeclaration { + + + public CMAttributeDeclarationBuddySystem(CMAttributeDeclaration self, CMAttributeDeclaration buddy, boolean isXHTML) { + super(self, buddy, isXHTML); + } + + /* + * @see CMAttributeDeclaration#getAttrName() + */ + public String getAttrName() { + return getSelf().getAttrName(); + } + + /* + * @see CMAttributeDeclaration#getAttrType() + */ + public CMDataType getAttrType() { + return getSelf().getAttrType(); + } + + /* + * @see CMAttributeDeclaration#getDefaultValue() + * @deprecated in superclass + */ + public String getDefaultValue() { + return getSelf().getDefaultValue(); + } + + /* + * @see CMAttributeDeclaration#getEnumAttr() + * @deprecated in superclass + */ + public Enumeration getEnumAttr() { + return getSelf().getEnumAttr(); + } + + /* + * @see CMAttributeDeclaration#getUsage() + */ + public int getUsage() { + return getSelf().getUsage(); + } + + private CMAttributeDeclaration getSelf() { + return (CMAttributeDeclaration) self; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java new file mode 100644 index 0000000000..0f8f13e8b4 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + +import java.util.Iterator; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory; +import org.eclipse.wst.html.core.internal.contentmodel.ssi.SSICMDocumentFactory; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; + +/** + */ +class CMDocumentForBuddySystem extends CMNodeBuddySystem implements CMDocument { + + + private static CMDocument getHTMLCMDocument() { + return HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE); + } + + class Elements extends CMNamedNodeMapForBuddySystem { + public Elements(CMNamedNodeMap elements, boolean isXHTML) { + super(isXHTML); + makeBuddySystem(elements); + addSSIDecls(); + } + + protected String getKeyName(CMNode original) { + CMElementDeclaration edecl = getDecl(original); + if (edecl == null) + return null; + return edecl.getElementName(); + } + + protected CMNode createBuddySystem(CMNode original) { + CMElementDeclaration edecl = getDecl(original); + return new CMElementDeclarationBuddySystem(edecl, isXHTML()); + } + + private CMElementDeclaration getDecl(CMNode cmnode) { + if (cmnode == null) + return null; + if (cmnode.getNodeType() != CMNode.ELEMENT_DECLARATION) + return null; + return (CMElementDeclaration) cmnode; + } + + private void addSSIDecls() { + CMDocument ssi = SSICMDocumentFactory.getCMDocument(); + if (ssi == null) + return; + CMNamedNodeMap elements = ssi.getElements(); + Iterator i = elements.iterator(); + while (i.hasNext()) { + CMElementDeclaration decl = (CMElementDeclaration) i.next(); + if (decl == null) + continue; + put(decl.getElementName(), decl); + } + } + } + + private Elements elements = null; + + public CMDocumentForBuddySystem(CMDocument self, boolean isXHTML) { + super(self, getHTMLCMDocument(), isXHTML); + } + + /* + * @see CMDocument#getElements() + */ + public CMNamedNodeMap getElements() { + if (elements != null) + return elements; + CMDocument cmdoc = getSelf(); + if (cmdoc == null) + return null; + elements = new Elements(cmdoc.getElements(), isXHTML); + return elements; + } + + /* + * @see CMDocument#getEntities() + */ + public CMNamedNodeMap getEntities() { + CMDocument cmdoc = getSelf(); + if (cmdoc == null) + return null; + return cmdoc.getEntities(); + } + + /* + * @see CMDocument#getNamespace() + */ + public CMNamespace getNamespace() { + CMDocument cmdoc = getSelf(); + if (cmdoc == null) + return null; + return cmdoc.getNamespace(); + } + + private CMDocument getSelf() { + if (self.getNodeType() != CMNode.DOCUMENT) + return null; + return (CMDocument) self; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java new file mode 100644 index 0000000000..5e70f549b8 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java @@ -0,0 +1,201 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; + +/** + */ +class CMElementDeclarationBuddySystem extends CMNodeBuddySystem implements CMElementDeclaration { + + + private static CMDocument htmlcm = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE); + + private static CMElementDeclaration getHTMLCMElemDecl(CMElementDeclaration original) { + CMElementDeclaration buddy = null; + if (htmlcm != null) { + CMNamedNodeMap elems = htmlcm.getElements(); + if (elems != null) { + buddy = (CMElementDeclaration) elems.getNamedItem(original.getElementName()); + } + } + return buddy; + } + + private class Attrs extends CMNamedNodeMapForBuddySystem { + private CMNamedNodeMap buddyAttrs = null; + + public Attrs(CMNamedNodeMap attrs, CMNamedNodeMap buddyAttrs, boolean isXHTML) { + super(isXHTML); + this.buddyAttrs = buddyAttrs; + makeBuddySystem(attrs); + } + + protected String getKeyName(CMNode original) { + CMAttributeDeclaration adecl = getDecl(original); + if (adecl == null) + return null; + return adecl.getAttrName(); + } + + protected CMNode createBuddySystem(CMNode original) { + CMAttributeDeclaration adecl = getDecl(original); + if (adecl == null) + return null; + CMAttributeDeclaration buddy = null; + if (buddyAttrs != null) { + buddy = (CMAttributeDeclaration) buddyAttrs.getNamedItem(adecl.getAttrName()); + } + return new CMAttributeDeclarationBuddySystem(adecl, buddy, isXHTML()); + } + + private CMAttributeDeclaration getDecl(CMNode cmnode) { + if (cmnode == null) + return null; + if (cmnode.getNodeType() != CMNode.ATTRIBUTE_DECLARATION) + return null; + return (CMAttributeDeclaration) cmnode; + } + } + + private Attrs attributes = null; + + public CMElementDeclarationBuddySystem(CMElementDeclaration self, boolean isXHTML) { + super(self, getHTMLCMElemDecl(self), isXHTML); + } + + /* + * @see CMElementDeclaration#getAttributes() + */ + public CMNamedNodeMap getAttributes() { + if (attributes != null) + return attributes; + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return null; + CMElementDeclaration htmlDecl = getBuddy(); + CMNamedNodeMap htmlAttrs = (htmlDecl == null) ? null : htmlDecl.getAttributes(); + attributes = new Attrs(edecl.getAttributes(), htmlAttrs, isXHTML); + return attributes; + } + + /* + * @see CMElementDeclaration#getContent() + */ + public CMContent getContent() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return null; + return edecl.getContent(); + } + + /* + * @see CMElementDeclaration#getContentType() + */ + public int getContentType() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return CMElementDeclaration.ANY; + return edecl.getContentType(); + } + + /* + * @see CMElementDeclaration#getElementName() + */ + public String getElementName() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return null; + return edecl.getElementName(); + } + + /* + * @see CMElementDeclaration#getDataType() + */ + public CMDataType getDataType() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return null; + return edecl.getDataType(); + } + + /* + * @see CMElementDeclaration#getLocalElements() + */ + public CMNamedNodeMap getLocalElements() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return null; + return edecl.getLocalElements(); + } + + /* + * @see CMContent#getMaxOccur() + */ + public int getMaxOccur() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return -1; + return edecl.getMaxOccur(); + } + + /* + * @see CMContent#getMinOccur() + */ + public int getMinOccur() { + CMElementDeclaration edecl = getSelf(); + if (edecl == null) + return -1; + return edecl.getMinOccur(); + } + + /* + * @see CMNode#supports(String) + */ + public boolean supports(String propertyName) { + if (isXHTML && propertyName.equals(HTMLCMProperties.OMIT_TYPE)) + return true; + return super.supports(propertyName); + } + + /* + * @see CMNode#getProperty(String) + */ + public Object getProperty(String propertyName) { + if (isXHTML && propertyName.equals(HTMLCMProperties.OMIT_TYPE)) + return HTMLCMProperties.Values.OMIT_NONE; + return super.getProperty(propertyName); + } + + private CMElementDeclaration getSelf() { + if (self.getNodeType() != CMNode.ELEMENT_DECLARATION) + return null; + return (CMElementDeclaration) self; + } + + private CMElementDeclaration getBuddy() { + if (buddy == null) + return null; + if (buddy.getNodeType() != CMNode.ELEMENT_DECLARATION) + return null; + return (CMElementDeclaration) buddy; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java new file mode 100644 index 0000000000..643daa65ee --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + +import java.util.Hashtable; +import java.util.Iterator; + +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + */ +abstract class CMNamedNodeMapForBuddySystem implements CMNamedNodeMap { + + + private boolean isXHTML = false; + private Hashtable map = new Hashtable(); + + /** + * Constructor of CMNamedNodeMapForBuddySystem. + * CAUTION: Each derived class must call 'makeBuddySystem' method in its + * constructor to build up its contents. + */ + public CMNamedNodeMapForBuddySystem(boolean isXHTML) { + super(); + this.isXHTML = isXHTML; + } + + /* + * @see CMNamedNodeMap#getLength() + */ + public int getLength() { + return map.size(); + } + + /* + * @see CMNamedNodeMap#getNamedItem(String) + */ + public CMNode getNamedItem(String name) { + String key = canonicalName(name); + if (!map.containsKey(key)) + return null; + return (CMNode) map.get(key); + } + + /* + * @see CMNamedNodeMap#item(int) + */ + public CMNode item(int index) { + Iterator iter = iterator(); + while (iter.hasNext()) { + Object node = iter.next(); + if (--index < 0) + return (CMNode) node; + } + return null; + } + + /* + * @see CMNamedNodeMap#iterator() + */ + public Iterator iterator() { + return map.values().iterator(); + } + + /* package scope. */ + void put(String name, CMNode cmnode) { + if (name == null || cmnode == null) + return; + map.put(canonicalName(name), cmnode); + } + + abstract protected String getKeyName(CMNode original); + + abstract protected CMNode createBuddySystem(CMNode original); + + protected boolean isXHTML() { + return isXHTML; + } + + /** + * Each derived class must call this method in its constructor + * to build up its contents. + */ + protected void makeBuddySystem(CMNamedNodeMap original) { + Iterator i = original.iterator(); + if (i == null) + return; + while (i.hasNext()) { + CMNode org = (CMNode) i.next(); + String key = getKeyName(org); + CMNode newNode = createBuddySystem(org); + put(key, newNode); + } + } + + private String canonicalName(String name) { + return name.toUpperCase(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java new file mode 100644 index 0000000000..3e508733cd --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; + +/** + */ +class CMNodeBuddySystem implements CMNode { + + + protected boolean isXHTML = false; + protected CMNode self = null; + protected CMNode buddy = null; + + public CMNodeBuddySystem(CMNode self, CMNode buddy, boolean isXHTML) { + super(); + this.self = self; + this.buddy = buddy; + this.isXHTML = isXHTML; + } + + /* + * @see CMNode#getNodeName() + */ + public String getNodeName() { + return self.getNodeName(); + } + + /* + * @see CMNode#getNodeType() + */ + public int getNodeType() { + return self.getNodeType(); + } + + /* + * @see CMNode#supports(String) + */ + public boolean supports(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) + return true; + if (propertyName.equals(HTMLCMProperties.IS_XHTML)) + return true; + if (buddy == null) + return false; + return buddy.supports(propertyName); + } + + /* + * @see CMNode#getProperty(String) + */ + public Object getProperty(String propertyName) { + if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) { + return new Boolean(!isXHTML); + } + if (propertyName.equals(HTMLCMProperties.IS_XHTML)) { + return new Boolean(isXHTML); + } + + if (buddy == null || (!buddy.supports(propertyName))) + return null; + return buddy.getProperty(propertyName); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java new file mode 100644 index 0000000000..e72c2632c8 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java @@ -0,0 +1,200 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.ranges.Range; + +/** + */ +public interface DocumentQuery { + + /** + * isRenderRoot() returns true if - node is BODY element (both explicit + * and implicit) - node is portalhtml:body element - node is Document node + * and the document is treated as fragment (with BODY context) Note that + * in editing a fragment file, Document node should be treated as a + * substitute of BODY element. + */ + boolean isRenderRoot(Node node); + + /** + * isHeadCorrespondent() returns true if - node is HEAD element (both + * explicit and implicit) - node is portalhtml:head element - node is + * Document node and the document is treated as fragment (with HEAD + * context) Note that in editing a fragment file (with HEAD context), + * Document node should be treated as a substitute of HEAD element. + */ + boolean isHeadCorrespondent(Node node); + + /** + * Implicit BODY element will be gone in V6 SED model. So page designer + * provides an API to get a range whose content nodes are rendered in + * design view. getRenderRootRange() returns - a range from BODY's first + * to its last (if the document has BODY element) - a range form + * Document's first to its last (if the document is fragment with BODY + * context) - null (if the document is fragment with HEAD context) [The + * following cases will be supported since V6] - a range from a custom + * tag's first to its last (if the document has a custom tag which + * generates BODY element at runtime) - a range from Document's + * appropirate offset to its last (if the document does not have explicit + * BODY/HTML) - a range from HTML element's appropriate offset to its last + * (if the document does not have explicit BODY but have explicit HTML) + * + * @param doc + * @return + */ + Range getRenderRootRange(Document doc); + + /** + * Implicit HEAD element will be gone in V6 SED model. So page designer + * provides an API to get a range whose content nodes are treated as HEAD + * element's child. getHeadCorrespondentRange() returns - a range from + * HEAD's first to its last (if the document has HEAD element) - a range + * form Document's first to its last (if the document is fragment with + * HEAD context) - null (if the document is fragment with BODY context) + * [The following cases will be supported since V6] - a range from a + * custom tag's first to its last (if the document has a custom tag which + * generates HEAD element at runtime) - a range from Document's first to + * appropirate offset (if the document does not have explicit HEAD/HTML) - + * a range from HTML element's first to appropriate offset (if the + * document does not have explicit HEAD but have explicit HTML) + * + * @param doc + * @return + */ + Range getHeadCorrespondentRange(Document doc); + + /** + * getRenderRootNode() with [create=false] returns - BODY element if this + * document is not fragment and has BODY element - null if this document + * is not fragment and does not have BODY element - Document node if this + * document is fragment with BODY context - null if this document is + * fragment with HEAD context [The following cases will be supported since + * V6] - a custom tag which generates BODY tag at runtime - Document node + * or HTML element if this document is not fragment but does not have + * explicit BODY element getRenderRootNode() with [create=true] returns - + * BODY element if this document is not fragment and has BODY element (no + * modifictation) - newly created BODY element if this document is not + * fragment but does not have BODY element - Document node if this + * document is fragment with BODY context (no modifictation) [The + * following cases will be supported since V6] - a custom tag which + * generates BODY tag at runtime (no modifictation) - newly created BODY + * element if this document is not fragment but does not have explicit + * BODY element getRenderRootNode() throws HTMLCommandException (since V6) + * if - this document is fragment with HEAD context and - "create" + * parameter is true Note that in editing a fragment file, Document node + * should be treated as a substitute of BODY element. + * + * @param childOrDocument + * @param create + * @return + */ + Node getRenderRootNode(Node childOrDocument, boolean create); + + /** + * getHeadCorrespondentNode() with [create=false] returns - HEAD element + * if this document is not fragment and has HEAD element - null if this + * document is not fragment and does not have HEAD element - Document node + * if this document is fragment with HEAD context - null if this document + * is fragment with BODY context [The following cases will be supported + * since V6] - a custom tag which generates HEAD tag at runtime - Document + * node or HTML element if this document is not fragment but does not have + * explicit HEAD element getHeadCorrespondentNode() with [create=true] + * returns - HEAD element if this document is not fragment and has HEAD + * element (no modifictation) - newly created HEAD element if this + * document is not fragment but does not have HEAD element - Document node + * if this document is fragment with HEAD context (no modifictation) [The + * following cases will be supported since V6] - a custom tag which + * generates HEAD tag at runtime (no modifictation) - newly created HEAD + * element if this document is not fragment but does not have explicit + * HEAD element getHeadCorrespondentNode() throws HTMLCommandException + * (since V6) if - this document is fragment with BODY context and - + * "create" parameter is true Note that in editing a fragment file, + * Document node should be treated as a substitute of HEAD element. + * + * @param childOrDocument + * @param create + * @return + */ + Node getHeadCorrespondentNode(Node childOrDocument, boolean create); + + /** + * getHtmlCorrespondentNode() throws HTMLCommandException (since V6) if - + * this document is fragment and "create" parameter is true + * + * @param childOrDocument + * @param create + * @return + */ + Node getHtmlCorrespondentNode(Node childOrDocument, boolean create); + + /** + * This inner class is intended for insertion target. please use this like + * the following : DocumentQuery.InsertionTarget ins; + * ins.getParent().insertBefore(youInsertionNode, ins.getRef()); + */ + public class InsertionTarget { + private final Node parent; + private final Node ref; + + public InsertionTarget(Node parent, Node ref) { + this.parent = parent; + this.ref = ref; + } + + public Node getParent() { + return parent; + } + + public Node getRef() { + return ref; + } + } + + /** + * getHeadInsertionTarget() returns appropriate insetion target location + * for HEAD child tags such as <script>, <style>, <meta>etc. Basically + * this function returns <HEAD>tag's the last position. Note that this + * would not create actual <HEAD>tag when the document does not have it. + * <HEAD>is omittable tag so this function returns appropriate position + * to which implicit <HEAD>can be inserted, if the document has no + * <HEAD>. + * + * @param doc + * @return + */ + InsertionTarget getHeadInsertionTarget(Document doc); + + /** + * getPageInsertionTarget() returns appropriate insetion target location + * for page-level markups, such as JSP directives, usebean tags or <html> + * tag. Basically this function returns just before <HTML>tag. Note that + * this would not create actual <HTML>tag when the document does not have + * it. In such case, this function returns a position just before the + * meaningful tags such as HTML/JSP elements. + * + * @param doc + * @return + */ + InsertionTarget getPageInsertionTarget(Document doc); + + /** + * isFragment() returns whether the document is fragment or complete + * document + * + * @param doc + * @return + */ + boolean isFragment(Document doc); + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java new file mode 100644 index 0000000000..8ca043c68d --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + + +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + */ +public interface ElementDeclarationAdapter extends INodeAdapter { + + /** + */ + CMElementDeclaration getDeclaration(); + + /** + */ + void setDeclaration(CMElementDeclaration declaration); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java new file mode 100644 index 0000000000..46d3abf7b9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + + +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; + +/** + */ +public class ElementDeclarationAdapterFactory implements INodeAdapterFactory { + + private static ElementDeclarationAdapterFactory instance = null; + + /** + */ + private ElementDeclarationAdapterFactory() { + super(); + } + + /** + */ + public INodeAdapter adapt(INodeNotifier notifier) { + if (notifier == null) + return null; + INodeAdapter adapter = notifier.getExistingAdapter(ElementDeclarationAdapter.class); + if (adapter != null) + return adapter; + adapter = new HTMLElementDeclarationAdapter(); + notifier.addAdapter(adapter); + return adapter; + } + + /** + */ + public synchronized static ElementDeclarationAdapterFactory getInstance() { + if (instance == null) + instance = new ElementDeclarationAdapterFactory(); + return instance; + } + + /** + */ + public boolean isFactoryForType(Object type) { + return (type == ElementDeclarationAdapter.class); + } + + public void release() { + // default is to do nothing + } + + /** + * Overriding copy method + */ + public INodeAdapterFactory copy() { + return getInstance(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java new file mode 100644 index 0000000000..b8dea12ead --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + +import java.util.Collection; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList; +import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; +import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +public final class HMQUtil { + + private final static Vector nullVector = new Vector(); + + /* HMQUtil class must not instantiate. */ + private HMQUtil() { + super(); + } + + /* gather all element declarations in inclusion of each parent of the target. + * the inclusion of the target is also gathered. */ + public static Collection getInclusions(Element target) { + if (target == null) + return nullVector; + Collection inclusions = gatherInclusions(getAncestorDeclarations(target)); + + Hashtable availables = new Hashtable(); + Iterator iter = inclusions.iterator(); + while (iter.hasNext()) { + CMContent inclusion = (CMContent) iter.next(); + switch (inclusion.getNodeType()) { + case CMNode.GROUP : + extractDeclarations(availables, (CMGroup) inclusion); + break; + case CMNode.ELEMENT_DECLARATION : + addInclusion(availables, (CMElementDeclaration) inclusion); + break; + } + } + + return availables.values(); + } + + private static Collection getAncestorDeclarations(Element target) { + Vector ancestors = new Vector(); + + Document doc = target.getOwnerDocument(); + ModelQuery query = ModelQueryUtil.getModelQuery(doc); + CMElementDeclaration decl = query.getCMElementDeclaration(target); + ancestors.add(decl); + + Element parent = getParent(target); + while (parent != null) { + decl = query.getCMElementDeclaration(parent); + if (decl != null) + ancestors.add(decl); + parent = getParent(parent); + } + return ancestors; + } + + private static void addInclusion(Hashtable availables, CMElementDeclaration decl) { + String name = decl.getElementName(); + if (availables.containsKey(name)) + return; + availables.put(name, decl); + } + + private static Collection gatherInclusions(Collection ancestors) { + Vector inclusions = new Vector(); + Iterator iter = ancestors.iterator(); + while (iter.hasNext()) { + CMElementDeclaration decl = (CMElementDeclaration) iter.next(); + if (decl.supports(HTMLCMProperties.INCLUSION)) { + CMContent inclusion = (CMContent) decl.getProperty(HTMLCMProperties.INCLUSION); + if (inclusion != null) + inclusions.add(inclusion); + } + } + return inclusions; + } + + private static Element getParent(Node target) { + Node parent = target.getParentNode(); + while (parent != null) { + if (parent.getNodeType() == Node.ELEMENT_NODE) + return (Element) parent; + parent = parent.getParentNode(); + } + return null; + } + + private static void extractDeclarations(Hashtable availables, CMGroup group) { + CMNodeList content = group.getChildNodes(); + for (int i = 0; i < content.getLength(); i++) { + CMNode cmn = content.item(i); + if (cmn == null || cmn.getNodeType() != CMNode.ELEMENT_DECLARATION) + continue; + addInclusion(availables, (CMElementDeclaration) cmn); + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java new file mode 100644 index 0000000000..856d5d6d7e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + + +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; + +/** + */ +public class HTMLElementDeclarationAdapter implements ElementDeclarationAdapter { + + private CMElementDeclaration declaration = null; + + /** + */ + public HTMLElementDeclarationAdapter() { + super(); + } + + /** + */ + public CMElementDeclaration getDeclaration() { + return this.declaration; + } + + /** + * Allowing the INodeAdapter to compare itself against the type + * allows it to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return (type == ElementDeclarationAdapter.class); + } + + /** + */ + public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) { + } + + /** + */ + public void setDeclaration(CMElementDeclaration declaration) { + this.declaration = declaration; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java new file mode 100644 index 0000000000..97627d02e1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + + +import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.SimpleAssociationProvider; +import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache; +import org.eclipse.wst.xml.uriresolver.util.IdResolver; + +/** + */ +public class HTMLModelQueryAssociationProvider extends SimpleAssociationProvider { + + /** + * @param modelQueryCMProvider org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryCMProvider + */ + public HTMLModelQueryAssociationProvider(CMDocumentCache cache, IdResolver idResolver) { + super(new HTMLModelQueryCMProvider(cache, idResolver)); + } + + // MIWA: We cannot cache a CMElementDeclaration any more. Because, when the DOCTYPE + // was changed, CMDocument would be changed. Then, a cached CMElementDeclaration + // would be invalid. If some performance problems occurs, we consider a smarter + // cache mechanism. + // + // public CMElementDeclaration getCMElementDeclaration(Element element) { + // // check if element declaration is cached + // INodeNotifier notifier = (INodeNotifier) element; + // ElementDeclarationAdapter adapter = (ElementDeclarationAdapter) notifier.getExistingAdapter(ElementDeclarationAdapter.class); + // if (adapter != null) + // return adapter.getDeclaration(); + // + // CMElementDeclaration decl = super.getCMElementDeclaration(element); + // + // // cache HTML element declaration only + // if (decl != null && decl instanceof HTMLElementDeclaration) { + // IAdapterFactory factory = ElementDeclarationAdapterFactory.getInstance(); + // adapter = (ElementDeclarationAdapter) factory.adapt(notifier); + // if (adapter != null) + // adapter.setDeclaration(decl); + // } + // + // return decl; + // } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java new file mode 100644 index 0000000000..97792ffc13 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + +import java.util.Hashtable; + +import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory; +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry; +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryCMProvider; +import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache; +import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; +import org.eclipse.wst.xml.uriresolver.util.IdResolver; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentType; +import org.w3c.dom.Node; + +/** + * CMDocument provider for HTML and XHTML documents. + */ +public class HTMLModelQueryCMProvider implements ModelQueryCMProvider { + + + private static CMDocument staticHTML = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE); + private static CMDocument staticCHTML = HTMLCMDocumentFactory.getCMDocument(CMDocType.CHTML_DOC_TYPE); + private static HTMLDocumentTypeRegistry doctypeRegistry = HTMLDocumentTypeRegistry.getInstance(); + private static Hashtable buddyCache = new Hashtable(); + + private XHTMLAssociationProvider xhtmlassoc = null; + + public HTMLModelQueryCMProvider(CMDocumentCache cache, IdResolver idResolver) { + super(); + xhtmlassoc = new XHTMLAssociationProvider(cache, idResolver); + } + + /** + * Returns the CMDocument that corresponds to the DOM Node. + * or null if no CMDocument is appropriate for the DOM Node. + */ + public CMDocument getCorrespondingCMDocument(Node node) { + IDOMDocument owner = getOwnerXMLDocument(node); + if (owner == null) + return null; + + String pid = getPublicId(owner); + if (pid == null) + return staticHTML; + + HTMLDocumentTypeEntry entry = doctypeRegistry.getEntry(pid); + if (entry == null) + return staticHTML; + + pid = entry.getPublicId(); + CMDocument dtdcm = xhtmlassoc.getXHTMLCMDocument(pid, entry.getSystemId()); + if (dtdcm == null) { + if (pid != null && pid.equals(HTMLDocumentTypeRegistry.CHTML_PUBLIC_ID)) { + return staticCHTML; + } + return staticHTML; + } + + CMDocument buddycm = (CMDocument) buddyCache.get(pid); + if (buddycm != null) + return buddycm; + + buddycm = new CMDocumentForBuddySystem(dtdcm, entry.isXMLType()); + buddyCache.put(pid, buddycm); + return buddycm; + } + + // private methods + private IDOMDocument getOwnerXMLDocument(Node node) { + if (node == null) + return null; + Document owner = (node.getNodeType() == Node.DOCUMENT_NODE) ? (Document) node : node.getOwnerDocument(); + if (owner == null) + return null; + if (!(owner instanceof IDOMDocument)) + return null; + return (IDOMDocument) owner; + } + + private String getPublicId(IDOMDocument doc) { + if (doc == null) + return null; + DocumentType doctype = doc.getDoctype(); + return (doctype != null) ? doctype.getPublicId() : doc.getDocumentTypeId(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java new file mode 100644 index 0000000000..14f94e003e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java @@ -0,0 +1,140 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + +import java.util.List; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl; +import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache; +import org.eclipse.wst.xml.core.internal.ssemodelquery.MovableModelQuery; +import org.eclipse.wst.xml.uriresolver.util.IdResolver; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + + +public class HTMLModelQueryImpl extends ModelQueryImpl implements MovableModelQuery { + + protected CMDocumentCache fCache = null; + + public HTMLModelQueryImpl(CMDocumentCache cache, IdResolver idResolver) { + super(new HTMLModelQueryAssociationProvider(cache, idResolver)); + fCache = cache; + } + + public List getAvailableContent(Element element, CMElementDeclaration ed, int includeOptions) { + List originalCandidates = super.getAvailableContent(element, ed, includeOptions); + if ((includeOptions & INCLUDE_CHILD_NODES) == 0) + return originalCandidates; + // When the target document is XHTML, it is waste to find inclusions, + // since inclusion is available in HTML only. + if (!ed.supports(HTMLCMProperties.IS_XHTML)) + return originalCandidates; + + Boolean isXhtml = Boolean.FALSE; + isXhtml = (Boolean) ed.getProperty(HTMLCMProperties.IS_XHTML); + if (isXhtml != null && isXhtml.booleanValue()) + return originalCandidates; + + // OK, the target is surely a HTML element, so it may have inclusion. + // Try to find it. + Vector candidates = new Vector(originalCandidates); + + switch (ed.getContentType()) { + case CMElementDeclaration.ANY : + case CMElementDeclaration.ELEMENT : + case CMElementDeclaration.MIXED : + // do enumerate inclusions. + candidates.addAll(HMQUtil.getInclusions(element)); + break; + case CMElementDeclaration.EMPTY : + case CMElementDeclaration.PCDATA : + case CMElementDeclaration.CDATA : + default : + // should not add any inclusions. + // so, nothing to do here. + break; + } + // If the current element does not available, it is impossible + // to filter out exclusion. + if (element == null) + return candidates; + + // Now, the time to check exclusion. + Vector content = new Vector(candidates.size()); + for (int i = 0; i < candidates.size(); i++) { + CMElementDeclaration candidate = (CMElementDeclaration) candidates.elementAt(i); + if (candidate == null) + continue; + if (isExcluded(candidate, element)) + continue; + content.add(candidate); + } + + return content; + } + + /** + * @see MovableModelQuery#setIdResolver(IdResolver) + */ + public void setIdResolver(IdResolver newIdResolver) { + modelQueryAssociationProvider = new HTMLModelQueryAssociationProvider(fCache, newIdResolver); + } + + // utilities + private static boolean isExcluded(CMElementDeclaration candidate, Element target) { + CMNamedNodeMap prohibited = getProhibitedAncestors(candidate); + if (prohibited == null) + return false; + Element parent = target; + while (parent != null) { + CMNode pdec = prohibited.getNamedItem(parent.getNodeName()); + if (pdec != null) + return true; + parent = getExplicitParentElement(parent); + } + return false; + } + + private static CMNamedNodeMap getProhibitedAncestors(CMElementDeclaration dec) { + if (!dec.supports(HTMLCMProperties.PROHIBITED_ANCESTORS)) + return null; + return (CMNamedNodeMap) dec.getProperty(HTMLCMProperties.PROHIBITED_ANCESTORS); + } + + /* get an ancestor element ignoring implicit ones. */ + private static Element getExplicitParentElement(Node child) { + if (child == null) + return null; + + Node p = child.getParentNode(); + while (p != null) { + if (p.getNodeType() == Node.ELEMENT_NODE) { + if (p instanceof IDOMElement) { + if (((IDOMElement) p).isImplicitTag()) { + p = p.getParentNode(); + continue; + } + } + return (Element) p; + } + p = p.getParentNode(); + } + return null; + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java new file mode 100644 index 0000000000..be38bcb988 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + + +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter; + +public class ModelQueryAdapterFactoryForEmbeddedHTML extends ModelQueryAdapterFactoryForHTML { + + + /** + * Constructor for ModelQueryAdapterFactoryForEmbeddedHTML. + */ + public ModelQueryAdapterFactoryForEmbeddedHTML() { + this(ModelQueryAdapter.class, false); + } + + /** + * Constructor for ModelQueryAdapterFactoryForEmbeddedHTML. + * @param adapterKey + * @param registerAdapters + */ + protected ModelQueryAdapterFactoryForEmbeddedHTML(Object adapterKey, boolean registerAdapters) { + super(adapterKey, registerAdapters); + } + + /** + * @see org.eclipse.wst.sse.core.INodeAdapterFactory#adapt(INodeNotifier) + */ + public INodeAdapter adapt(INodeNotifier object) { + if (object == null) + return null; + return adaptNew(object); + } + + public Object clone() throws CloneNotSupportedException { + + return new ModelQueryAdapterFactoryForEmbeddedHTML(this.adapterKey, this.shouldRegisterAdapter); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java new file mode 100644 index 0000000000..90df589860 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java @@ -0,0 +1,175 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + + +import java.io.File; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.wst.sse.core.AbstractAdapterFactory; +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.IModelStateListener; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.IStructuredModel; +import org.eclipse.wst.sse.core.util.Debug; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; +import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache; +import org.eclipse.wst.xml.core.internal.modelquery.XMLCatalogIdResolver; +import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter; +import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapterImpl; +import org.eclipse.wst.xml.uriresolver.util.IdResolver; + +/** + * Creates a ModelQueryAdapter for HTML models + */ +public class ModelQueryAdapterFactoryForHTML extends AbstractAdapterFactory implements IModelStateListener { + + protected ModelQueryAdapterImpl modelQueryAdapterImpl; + protected IStructuredModel stateNotifier = null; + + /** + * ModelQueryAdapterFactoryForHTML constructor comment. + */ + public ModelQueryAdapterFactoryForHTML() { + this(ModelQueryAdapter.class, true); + } + + /** + * ModelQueryAdapterFactoryForHTML constructor comment. + * + * @param adapterKey + * java.lang.Object + * @param registerAdapters + * boolean + */ + public ModelQueryAdapterFactoryForHTML(Object adapterKey, boolean registerAdapters) { + super(adapterKey, registerAdapters); + } + + /** + * createAdapter method comment. + */ + protected INodeAdapter createAdapter(INodeNotifier target) { + + if (Debug.displayInfo) + System.out.println("-----------------------ModelQueryAdapterFactoryForHTML.createAdapter" + target); //$NON-NLS-1$ + if (modelQueryAdapterImpl == null) { + if (target instanceof IDOMNode) { + IDOMNode xmlNode = (IDOMNode) target; + IStructuredModel model = stateNotifier = xmlNode.getModel(); + stateNotifier.addModelStateListener(this); + String baseLocation = null; + String modelsBaseLocation = model.getBaseLocation(); + if (modelsBaseLocation != null) { + File file = new Path(modelsBaseLocation).toFile(); + if (file.exists()) { + baseLocation = file.getAbsolutePath(); + } + else { + IPath basePath = new Path(model.getBaseLocation()); + IPath derivedPath = null; + if (basePath.segmentCount() > 1) + derivedPath = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath).getLocation(); + else + derivedPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(basePath); + if (derivedPath != null) { + baseLocation = derivedPath.toString(); + } + } + } + if (Debug.displayInfo) + System.out.println("----------------ModelQueryAdapterFactoryForHTML... baseLocation : " + baseLocation); //$NON-NLS-1$ + + CMDocumentCache cmDocumentCache = new CMDocumentCache(); + IdResolver idResolver = new XMLCatalogIdResolver(baseLocation, model.getResolver()); + ModelQuery modelQuery = new HTMLModelQueryImpl(cmDocumentCache, idResolver); + modelQuery.setEditMode(ModelQuery.EDIT_MODE_UNCONSTRAINED); + modelQueryAdapterImpl = new ModelQueryAdapterImpl(cmDocumentCache, modelQuery, idResolver); + } + } + return modelQueryAdapterImpl; + } + + protected void updateResolver(IStructuredModel model) { + String baseLocation = model.getBaseLocation(); + IFile baseFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation())); + if (baseFile != null) { + baseLocation = baseFile.getLocation().toString(); + } + modelQueryAdapterImpl.setIdResolver(new XMLCatalogIdResolver(baseLocation, model.getResolver())); + } + + /** + * @see IModelStateListener#modelAboutToBeChanged(IStructuredModel) + */ + public void modelAboutToBeChanged(IStructuredModel model) { + } + + /** + * @see IModelStateListener#modelChanged(IStructuredModel) + */ + public void modelChanged(IStructuredModel model) { + } + + /** + * @see IModelStateListener#modelDirtyStateChanged(IStructuredModel, + * boolean) + */ + public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) { + } + + /** + * @see IModelStateListener#modelResourceDeleted(IStructuredModel) + */ + public void modelResourceDeleted(IStructuredModel model) { + } + + /** + * @see IModelStateListener#modelResourceMoved(IStructuredModel, + * IStructuredModel) + */ + public void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel) { + stateNotifier.removeModelStateListener(this); + stateNotifier = newModel; + updateResolver(stateNotifier); + stateNotifier.addModelStateListener(this); + } + + public void release() { + super.release(); + if (stateNotifier != null) + stateNotifier.removeModelStateListener(this); + stateNotifier = null; + if (modelQueryAdapterImpl != null) + modelQueryAdapterImpl.release(); + } + + public INodeAdapterFactory copy() { + + return new ModelQueryAdapterFactoryForHTML(this.adapterKey, this.shouldRegisterAdapter); + } + + public void modelAboutToBeReinitialized(IStructuredModel structuredModel) { + // TODO Auto-generated method stub + + } + + public void modelReinitialized(IStructuredModel structuredModel) { + // TODO Auto-generated method stub + + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java new file mode 100644 index 0000000000..9aac42d15a --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.modelquery; + + +import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; +import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.XMLAssociationProvider; +import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache; +import org.eclipse.wst.xml.uriresolver.util.IdResolver; +import org.w3c.dom.Document; + +/** + * A Class to provide an association between XHTML documents and DTDs for + * XHTML. This class is intended to be used only in HTMLModelQueryCMProvider. + */ +/* + * This class closely resemble XMLModelQueryAssociationProvider. + */ +class XHTMLAssociationProvider extends XMLAssociationProvider { + + protected IdResolver idResolver = null; + private String fCachedGrammerURI; + private String fCachedPublicID; + private String fCachedSystemID; + private static final boolean USE_QUICK_CACHE = true; + + public XHTMLAssociationProvider(CMDocumentCache cache, IdResolver idResolver) { + super(cache); + this.idResolver = idResolver; + } + + /** + * + * @param publicId + * @param systemId + * @return + */ + public CMDocument getXHTMLCMDocument(String publicId, String systemId) { + String grammerURI = null; + if (USE_QUICK_CACHE) { + // In parsing a document, we get many identiical requests to this + // method, so instead of looking up (resolving) grammerURI each + // time, + // we'll just return previously cached one. Probably not worth + // have a + // more complex cache than that. + if (fCachedGrammerURI != null && fCachedPublicID.equals(publicId) && fCachedSystemID.equals(systemId)) { + grammerURI = fCachedGrammerURI; + } + else { + grammerURI = idResolver.resolveId(publicId, systemId); + fCachedGrammerURI = grammerURI; + fCachedPublicID = publicId; + fCachedSystemID = systemId; + } + } + else { + grammerURI = idResolver.resolveId(publicId, systemId); + } + + if (grammerURI == null) + return null; + CMDocument cmDocument = documentManager.getCMDocument(publicId, grammerURI); + return cmDocument; + } + + /** + */ + protected String resolveGrammarURI(Document document, String publicId, String systemId) { + return idResolver.resolveId(publicId, systemId); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java index cea0c8f221..f33525a4a9 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java @@ -24,8 +24,8 @@ import org.eclipse.wst.sse.core.text.ITextRegion; import org.eclipse.wst.sse.core.text.ITextRegionList; import org.eclipse.wst.sse.core.util.ScriptLanguageKeys; import org.eclipse.wst.sse.core.util.StringUtils; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; import org.eclipse.wst.xml.core.internal.text.rules.StructuredTextPartitionerForXML; -import org.eclipse.wst.xml.core.parser.XMLRegionContext; /** * Document partitioner for HTML. Client-side scripts of type JavaScript are @@ -76,16 +76,16 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF } ITextRegionList regions = node.getRegions(); - if (regions.size() > 4 && regions.get(1).getType() == XMLRegionContext.XML_TAG_NAME) { + if (regions.size() > 4 && regions.get(1).getType() == DOMRegionContext.XML_TAG_NAME) { ITextRegion potentialLanguageRegion = regions.get(1); String potentialLanguageString = node.getText(potentialLanguageRegion); if (potentialLanguageString.equalsIgnoreCase(HTML40Namespace.ElementName.SCRIPT)) { for (int i = 0; i < regions.size(); i++) { ITextRegion region = regions.get(i); String regionType = region.getType(); - if (regionType == XMLRegionContext.XML_TAG_ATTRIBUTE_NAME) + if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) attrNameRegion = region; - else if (regionType == XMLRegionContext.XML_TAG_ATTRIBUTE_VALUE) { + else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) { String attrName = node.getText(attrNameRegion); if (attrName.equalsIgnoreCase(HTML40Namespace.ATTR_NAME_LANGUAGE)) language = StringUtils.strip(node.getText(region)); @@ -106,7 +106,7 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF } private boolean isValidScriptingRegionType(String type) { - return type == XMLRegionContext.BLOCK_TEXT || type == XMLRegionContext.XML_CDATA_OPEN || type == XMLRegionContext.XML_CDATA_TEXT || type == XMLRegionContext.XML_CDATA_CLOSE; + return type == DOMRegionContext.BLOCK_TEXT || type == DOMRegionContext.XML_CDATA_OPEN || type == DOMRegionContext.XML_CDATA_TEXT || type == DOMRegionContext.XML_CDATA_CLOSE; } protected void initLegalContentTypes() { @@ -129,9 +129,9 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF public String getPartitionType(ITextRegion region, int offset) { String result = null; - if (region.getType() == XMLRegionContext.XML_COMMENT_TEXT || region.getType() == XMLRegionContext.XML_COMMENT_OPEN) + if (region.getType() == DOMRegionContext.XML_COMMENT_TEXT || region.getType() == DOMRegionContext.XML_COMMENT_OPEN) result = IHTMLPartitionTypes.HTML_COMMENT; - else if (region.getType() == XMLRegionContext.XML_DOCTYPE_DECLARATION || region.getType() == XMLRegionContext.XML_DECLARATION_OPEN) + else if (region.getType() == DOMRegionContext.XML_DOCTYPE_DECLARATION || region.getType() == DOMRegionContext.XML_DECLARATION_OPEN) result = IHTMLPartitionTypes.HTML_DECLARATION; else result = super.getPartitionType(region, offset); @@ -145,14 +145,14 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF ITextRegion[] regions = previousNode.getRegions().toArray(); for (int i = 0; i < regions.length; i++) { - if(regions[i].getType() == XMLRegionContext.XML_TAG_NAME) { + if(regions[i].getType() == DOMRegionContext.XML_TAG_NAME) { previousStartTagNameRegion = regions[i]; break; } } regions = nextNode.getRegions().toArray(); for (int i = 0; i < regions.length; i++) { - if(regions[i].getType() == XMLRegionContext.XML_TAG_NAME) { + if(regions[i].getType() == DOMRegionContext.XML_TAG_NAME) { nextEndTagNameRegion = regions[i]; break; } diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java new file mode 100644 index 0000000000..b9b4d93d19 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +abstract class AbstractErrorInfo implements ErrorInfo, ErrorState { + + + private int state = NONE_ERROR; + private Segment seg = null; + + public AbstractErrorInfo(int state, Segment seg) { + super(); + this.state = state; + this.seg = seg; + } + + abstract public String getHint(); + + abstract public short getTargetType(); + + public int getLength() { + return (seg == null) ? 0 : seg.getLength(); + } + + public int getOffset() { + return (seg == null) ? 0 : seg.getOffset(); + } + + public int getState() { + return this.state; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java new file mode 100644 index 0000000000..e84216dfce --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java @@ -0,0 +1,200 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + +import java.util.Iterator; + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.html.core.internal.modelquery.HMQUtil; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMContent; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList; +import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; +import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +final class CMUtil { + + /** + * Never instantiate! + */ + private CMUtil() { + super(); + } + + /** + * You cannot always retrieve HTMLElementDeclaration via an Element instance. + * Because, it occasionally a JSP custom tag. -- 9/7/2001 + */ + public static CMElementDeclaration getDeclaration(Element target) { + Document doc = target.getOwnerDocument(); + ModelQuery query = ModelQueryUtil.getModelQuery(doc); + return query.getCMElementDeclaration(target); + } + + /** + */ + public static boolean isCaseSensitive(CMElementDeclaration decl) { + if (decl == null || (!decl.supports(HTMLCMProperties.SHOULD_IGNORE_CASE))) + return false; + return !((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_IGNORE_CASE)).booleanValue(); + } + + /** + */ + private static boolean isChild(CMContent content, CMElementDeclaration target) { + switch (content.getNodeType()) { + case CMNode.ELEMENT_DECLARATION : + if (isWholeTagOmissible((CMElementDeclaration) content)) + if (isChild(((CMElementDeclaration) content).getContent(), target)) + return true; + return isSameDeclaration((CMElementDeclaration) content, target); + case CMNode.GROUP : + CMNodeList children = ((CMGroup) content).getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + CMNode child = children.item(i); + switch (child.getNodeType()) { + case CMNode.ELEMENT_DECLARATION : + if (isWholeTagOmissible((CMElementDeclaration) child)) + if (isChild(((CMElementDeclaration) child).getContent(), target)) + return true; + if (isSameDeclaration((CMElementDeclaration) child, target)) + return true; + continue; // Go next child. + case CMNode.GROUP : + if (isChild((CMContent) child, target)) + return true; + continue; // Go next child. + default : + continue; // Go next child. + } + } + } + return false; + } + + /** + */ + public static boolean isEndTagOmissible(CMElementDeclaration decl) { + if (!(decl.supports(HTMLCMProperties.OMIT_TYPE))) + return false; + String omitType = (String) decl.getProperty(HTMLCMProperties.OMIT_TYPE); + return !omitType.equals(HTMLCMProperties.Values.OMIT_NONE); + } + + /** + */ + public static boolean isWholeTagOmissible(CMElementDeclaration decl) { + if (!(decl.supports(HTMLCMProperties.OMIT_TYPE))) + return false; + String omitType = (String) decl.getProperty(HTMLCMProperties.OMIT_TYPE); + return omitType.equals(HTMLCMProperties.Values.OMIT_BOTH); + } + + /** + */ + public static boolean isJSP(CMElementDeclaration decl) { + if (!decl.supports(HTMLCMProperties.IS_JSP)) + return false; + return ((Boolean) decl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue(); + } + + /** + */ + public static boolean isXHTML(CMElementDeclaration decl) { + if (!decl.supports(HTMLCMProperties.IS_XHTML)) + return false; + return ((Boolean) decl.getProperty(HTMLCMProperties.IS_XHTML)).booleanValue(); + } + + /** + * The method to distinguish HTML and XHTML from other mark up. + * This method returns true if the target is, + * (1) not JSP, + * (2) not SSI. + */ + public static boolean isHTML(CMElementDeclaration decl) { + return (!isJSP(decl)) && (!isSSI(decl)); + } + + /** + */ + private static boolean isSameDeclaration(CMElementDeclaration aDec, CMElementDeclaration otherDec) { + return aDec.getElementName() == otherDec.getElementName(); + } + + /** + */ + public static boolean isSSI(CMElementDeclaration edec) { + if (edec == null) + return false; + if (!edec.supports(HTMLCMProperties.IS_SSI)) + return false; + return ((Boolean) edec.getProperty(HTMLCMProperties.IS_SSI)).booleanValue(); + } + + /** + * Call this method only when the parent content type is one of + * the following: ANY, ELEMENT, or MIXED. + */ + public static boolean isValidChild(CMElementDeclaration parent, CMElementDeclaration child) { + if (parent == null || child == null) + return false; + if (isHTML(parent) && (!isHTML(child))) + return true; + CMContent content = parent.getContent(); + if (content == null) + return false; + return isChild(content, child); + } + + public static boolean isForeign(Element target) { + if (!(target instanceof IDOMElement)) + return true; + IDOMElement element = (IDOMElement) target; + return !element.isGlobalTag(); + } + + /** + * This method returns true if all of the following conditions are met: + * (1) value type is ENUM, + * (2) only one value is defined in the enumeration, + * (3) the value has same name to the attribute name. + */ + public static boolean isBooleanAttr(CMAttributeDeclaration adec) { + CMDataType attrtype = adec.getAttrType(); + if (attrtype == null) + return false; + if (attrtype.getDataTypeName() != CMDataType.ENUM) + return false; + String[] values = attrtype.getEnumeratedValues(); + if (values.length != 1) + return false; + return values[0].equals(adec.getAttrName()); + } + + public static boolean isValidInclusion(CMElementDeclaration decl, Element parent) { + Iterator iter = HMQUtil.getInclusions(parent).iterator(); + while (iter.hasNext()) { + CMElementDeclaration inclusion = (CMElementDeclaration) iter.next(); + if (isSameDeclaration(decl, inclusion)) + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java new file mode 100644 index 0000000000..0dbc052f1b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import java.util.Iterator; +import java.util.Vector; + +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.sse.core.validate.ValidationAdapter; +import org.eclipse.wst.sse.core.validate.ValidationReporter; +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +abstract class CompositeValidator extends ValidationComponent { + + protected Vector components = new Vector(); + + /** + * CompositeValidator constructor comment. + */ + public CompositeValidator() { + super(); + } + + /** + */ + public void setReporter(ValidationReporter reporter) { + super.setReporter(reporter); + + Iterator i = components.iterator(); + while (i.hasNext()) { + ValidationAdapter component = (ValidationAdapter) i.next(); + if (component == null) + continue; + component.setReporter(reporter); + } + } + + /** + */ + public void validate(IndexedRegion node) { + Iterator i = components.iterator(); + while (i.hasNext()) { + ValidationComponent component = (ValidationComponent) i.next(); + if (component == null) + continue; + component.validate(node); + } + } + + /** + */ + void add(ValidationComponent validator) { + components.add(validator); + } + + /** + * This method registers all components in 'validators'. + * Each derivative must call this methid in its constructor. + */ + protected void register(ValidationComponent[] validators) { + for (int i = 0; i < validators.length; i++) { + if (validators[i] != null) + add(validators[i]); + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java new file mode 100644 index 0000000000..2fab110fae --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.sse.core.validate.ValidationAdapter; +import org.eclipse.wst.sse.core.validate.ValidationReporter; +import org.eclipse.wst.xml.core.internal.validate.AbstractPropagatingValidator; +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +class DocumentPropagatingValidator extends AbstractPropagatingValidator { + + + private ValidationComponent validator = new HTMLSimpleDocumentValidator(); + private ElementPropagatingValidator propagatee = new ElementPropagatingValidator(); + + public DocumentPropagatingValidator() { + super(); + } + + public void validate(IndexedRegion node) { + getPropagatee().setReporter(this.reporter); + super.validate(node); + } + + public boolean isAdapterForType(Object type) { + return (type == DocumentPropagatingValidator.class || super.isAdapterForType(type)); + } + + public void setReporter(ValidationReporter reporter) { + super.setReporter(reporter); + validator.setReporter(reporter); + propagatee.setReporter(reporter); + } + + /** + * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getPropagatee() + */ + protected final ValidationComponent getPropagatee() { + return propagatee; + } + + /** + * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getValidator() + */ + protected final ValidationAdapter getValidator() { + return validator; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java new file mode 100644 index 0000000000..140d90f9ae --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + +import org.eclipse.wst.sse.core.validate.ValidationAdapter; +import org.eclipse.wst.sse.core.validate.ValidationReporter; +import org.eclipse.wst.xml.core.internal.validate.AbstractPropagatingValidator; +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +class ElementPropagatingValidator extends AbstractPropagatingValidator { + + + private ValidationComponent validator = new HTMLSimpleValidator(); + + public ElementPropagatingValidator() { + super(); + } + + public boolean isAdapterForType(Object type) { + return (type == ElementPropagatingValidator.class || super.isAdapterForType(type)); + } + + public void setReporter(ValidationReporter reporter) { + super.setReporter(reporter); + validator.setReporter(reporter); + } + + /** + * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getPropagatee() + */ + protected ValidationComponent getPropagatee() { + return this; + } + + /** + * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getValidator() + */ + protected ValidationAdapter getValidator() { + return validator; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java new file mode 100644 index 0000000000..34b430e71b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +interface ErrorInfo { + + public String getHint(); + + public int getLength(); + + public int getOffset(); + + public int getState(); + + public short getTargetType(); +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java new file mode 100644 index 0000000000..6026c2c4c9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import org.w3c.dom.Attr; +import org.w3c.dom.Node; +import org.w3c.dom.Text; + +final class ErrorInfoImpl extends AbstractErrorInfo { + + private Node target = null; + + // private Segment seg = null; + /** + */ + public ErrorInfoImpl(int state, Segment errorSeg, Node target) { + super(state, errorSeg); + this.target = target; + } + + /** + */ + public String getHint() { + switch (target.getNodeType()) { + case Node.ATTRIBUTE_NODE : + switch (getState()) { + case UNDEFINED_VALUE_ERROR : + case MISMATCHED_VALUE_ERROR : + case UNCLOSED_ATTR_VALUE : + //D210422 + return ((Attr) target).getValue(); + default : + return target.getNodeName(); + } + case Node.TEXT_NODE : + return ((Text) target).getData(); + case Node.ELEMENT_NODE : + default : + return target.getNodeName(); + } + } + + public short getTargetType() { + return target.getNodeType(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java new file mode 100644 index 0000000000..f7259400e9 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +interface ErrorState { + static final int NONE_ERROR = 0; + // generic error + static final int UNDEFINED_NAME_ERROR = 11; + static final int UNDEFINED_VALUE_ERROR = 12; + static final int MISMATCHED_VALUE_ERROR = 13; + // format error + static final int FORMAT_ERROR_LEVEL = 100; + static final int INVALID_NAME_ERROR = 101; + static final int INVALID_CHAR_ERROR = 102; + static final int MISMATCHED_ERROR = 103; + static final int MISMATCHED_END_TAG_ERROR = 104; + static final int MISSING_START_TAG_ERROR = 105; + static final int MISSING_END_TAG_ERROR = 106; + static final int UNNECESSARY_END_TAG_ERROR = 107; + static final int INVALID_ATTR_ERROR = 108; + static final int INVALID_DIRECTIVE_ERROR = 109; + static final int UNCLOSED_TAG_ERROR = 110; + static final int UNCLOSED_END_TAG_ERROR = 111; + static final int INVALID_EMPTY_ELEMENT_TAG = 112; + static final int UNCLOSED_ATTR_VALUE = 113; //D210422 + // layout error + static final int LAYOUT_ERROR_LEVEL = 1000; + static final int INVALID_CONTENT_ERROR = 1001; + static final int DUPLICATE_ERROR = 1002; + static final int COEXISTENCE_ERROR = 1003; +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java new file mode 100644 index 0000000000..960199def1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.xml.core.document.IDOMNode; + +final class FMUtil { + + public final static int SEG_NONE = 0; + public final static int SEG_WHOLE_TAG = 1; + public final static int SEG_START_TAG = 2; + public final static int SEG_END_TAG = 3; + + /** + */ + private FMUtil() { + super(); + } + + /** + */ + public final static Segment getSegment(IDOMNode target, int segType) { + if (target == null) + return new Segment(0, 0); + Segment seg = null; + IStructuredDocumentRegion startTag = null; + IStructuredDocumentRegion endTag = null; + switch (segType) { + case SEG_WHOLE_TAG : + startTag = target.getFirstStructuredDocumentRegion(); + if (startTag != null) { + endTag = target.getLastStructuredDocumentRegion(); + seg = new Segment(startTag, endTag); + } + else { + int startOffset = target.getStartOffset(); + int endOffset = target.getEndOffset(); + seg = new Segment(startOffset, endOffset - startOffset); + } + break; + case SEG_START_TAG : + startTag = target.getStartStructuredDocumentRegion(); + if (startTag != null) { + seg = new Segment(startTag); + } + else { + seg = new Segment(target.getStartOffset(), 0); + } + break; + case SEG_END_TAG : + endTag = target.getEndStructuredDocumentRegion(); + if (endTag != null) { + seg = new Segment(endTag); + } + else { + seg = new Segment(target.getEndOffset(), 0); + } + break; + case SEG_NONE : + default : + return new Segment(0, 0); + } + return seg; + } + + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java new file mode 100644 index 0000000000..c80856ce31 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java @@ -0,0 +1,255 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import java.util.Iterator; + +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.sse.core.text.ITextRegionContainer; +import org.eclipse.wst.sse.core.text.ITextRegionList; +import org.eclipse.wst.xml.core.document.IDOMAttr; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; +import org.w3c.dom.Attr; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; + +public class HTMLAttributeValidator extends PrimeValidator { + + private static final int REGION_NAME = 1; + private static final int REGION_VALUE = 2; + // <<D210422 + private static final char SINGLE_QUOTE = '\''; + private static final char DOUBLE_QUOTE = '\"'; + + // D210422 + /** + * HTMLAttributeValidator constructor comment. + */ + public HTMLAttributeValidator() { + super(); + } + + /** + */ + private Segment getErrorSegment(IDOMNode errorNode, int regionType) { + ITextRegion rgn = null; + switch (regionType) { + case REGION_NAME : + rgn = errorNode.getNameRegion(); + break; + case REGION_VALUE : + rgn = errorNode.getValueRegion(); + break; + default : + // nothing to do. + break; + } + if (rgn != null) { + if (errorNode instanceof IDOMAttr) { + IDOMElement ownerElement = (IDOMElement) ((IDOMAttr) errorNode).getOwnerElement(); + if (ownerElement != null) { + int regionStartOffset = ownerElement.getFirstStructuredDocumentRegion().getStartOffset(rgn); + int regionLength = rgn.getLength(); + return new Segment(regionStartOffset, regionLength); + } + } + } + return new Segment(errorNode.getStartOffset(), 0); + } + + /** + * Allowing the INodeAdapter to compare itself against the type allows it + * to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return ((type == HTMLAttributeValidator.class) || super.isAdapterForType(type)); + } + + /** + */ + public void validate(IndexedRegion node) { + Element target = (Element) node; + if (CMUtil.isForeign(target)) + return; + CMElementDeclaration edec = CMUtil.getDeclaration(target); + if (edec == null) + return; + CMNamedNodeMap declarations = edec.getAttributes(); + + NamedNodeMap attrs = target.getAttributes(); + for (int i = 0; i < attrs.getLength(); i++) { + int rgnType = REGION_NAME; + int state = ErrorState.NONE_ERROR; + Attr a = (Attr) attrs.item(i); + // D203637; If the target attr has prefix, the validator should + // not + // warn about it. That is, just ignore. It is able to check + // whether + // an attr has prefix or not by calling XMLAttr#isGlobalAttr(). + // When a attr has prefix (not global), it returns false. + boolean isXMLAttr = a instanceof IDOMAttr; + if (isXMLAttr) { + IDOMAttr xmlattr = (IDOMAttr) a; + if (!xmlattr.isGlobalAttr()) + continue; // skip futher validation and begin next loop. + } + + CMAttributeDeclaration adec = (CMAttributeDeclaration) declarations.getNamedItem(a.getName()); + if (adec == null) { + // No attr declaration was found. That is, the attr name is + // undefined. + // but not regard it as undefined name if it includes JSP + if (hasJSPRegion(((IDOMNode) a).getNameRegion())) { + rgnType = REGION_NAME; + state = ErrorState.UNDEFINED_NAME_ERROR; + } + } + else { + // The attr declaration was found. + // At 1st, the name should be checked. + if (CMUtil.isHTML(edec) && (!CMUtil.isXHTML(edec))) { + // If the target element is pure HTML (not XHTML), some + // attributes + // might be written in boolean format. It should be check + // specifically. + if (CMUtil.isBooleanAttr(adec) && ((IDOMAttr) a).hasNameOnly()) + continue; // OK, keep going. No more check is needed + // against this attr. + } + else { + // If the target is other than pure HTML (JSP or XHTML), + // the name + // must be checked exactly (ie in case sensitive way). + String actual = a.getName(); + String desired = adec.getAttrName(); + if (!actual.equals(desired)) { // case mismatch + rgnType = REGION_NAME; + state = ErrorState.MISMATCHED_ERROR; + } + } + // Then, the value must be checked. + if (state == ErrorState.NONE_ERROR) { // Need more check. + // Now, the value should be checked, if the type is ENUM. + CMDataType attrType = adec.getAttrType(); + String actualValue = a.getValue(); + if (attrType.getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED) { + // Check FIXED value. + String validValue = attrType.getImpliedValue(); + if (!actualValue.equals(validValue)) { + rgnType = REGION_VALUE; + state = ErrorState.UNDEFINED_VALUE_ERROR; + } + } + else { + String[] candidates = attrType.getEnumeratedValues(); + if (candidates != null && candidates.length > 0) { + // several candidates are found. + boolean found = false; + for (int index = 0; index < candidates.length; index++) { + String candidate = candidates[index]; + // At 1st, compare ignoring case. + if (actualValue.equalsIgnoreCase(candidate)) { + found = true; + if (CMUtil.isCaseSensitive(edec) && (!actualValue.equals(candidate))) { + rgnType = REGION_VALUE; + state = ErrorState.MISMATCHED_VALUE_ERROR; + } + break; // exit the loop. + } + } + if (!found) { + // No candidate was found. That is, + // actualValue is invalid. + // but not regard it as undefined value if it + // includes JSP. + if (hasJSPRegion(((IDOMNode) a).getValueRegion())) { + rgnType = REGION_VALUE; + state = ErrorState.UNDEFINED_VALUE_ERROR; + } + } + } + } + } + // <<D210422 + if (state == ErrorState.NONE_ERROR) { // Need more check. + if (isXMLAttr) { + String source = ((IDOMAttr) a).getValueRegionText(); + if (source != null) { + char firstChar = source.charAt(0); + char lastChar = source.charAt(source.length() - 1); + if (isQuote(firstChar) || isQuote(lastChar)) { + if (lastChar != firstChar) { + rgnType = REGION_VALUE; + state = ErrorState.UNCLOSED_ATTR_VALUE; + } + } + } + } + } + // D210422 + } + if (state != ErrorState.NONE_ERROR) { + Segment seg = getErrorSegment((IDOMNode) a, rgnType); + if (seg != null) + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(state, seg, a))); + } + } + } + + /** + */ + private boolean hasJSPRegion(ITextRegion container) { + if (!(container instanceof ITextRegionContainer)) + return false; + ITextRegionList regions = ((ITextRegionContainer) container).getRegions(); + if (regions == null) + return false; + Iterator e = regions.iterator(); + while (e.hasNext()) { + ITextRegion region = (ITextRegion) e.next(); + if (region == null) + continue; + String regionType = region.getType(); + if (regionType == DOMRegionContext.XML_TAG_OPEN || (isNextedTagName(regionType))) + return true; + } + return false; + } + + /** + * ISSUE: this is a bit of hidden JSP knowledge that was implemented this + * way for expedency. Should be evolved in future to depend on "nestedContext". + */ + private boolean isNextedTagName(String regionType) { + final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$ + final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$ + final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$ + final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$ + + boolean result = regionType.equals(JSP_SCRIPTLET_OPEN) || regionType.equals(JSP_EXPRESSION_OPEN) || regionType.equals(JSP_DECLARATION_OPEN) || regionType.equals(JSP_DIRECTIVE_OPEN); + return result; + } + + // <<D214022 + private boolean isQuote(char c) { + return (c == SINGLE_QUOTE) || (c == DOUBLE_QUOTE); + } + // D210422 +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java new file mode 100644 index 0000000000..cf1f24db81 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + +import org.eclipse.wst.html.core.HTML40Namespace; +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.document.IDOMText; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentType; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class HTMLDocumentContentValidator extends PrimeValidator { + + + private final static class Division { + private Vector explicitHtmls = new Vector(); + private Vector rest = new Vector(); + + public Division(Document document, NodeList children) { + String rootTagName = getRootTagName(document); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (isHtmlTag(child, rootTagName)) { + explicitHtmls.add(child); + } + else { + rest.add(child); + } + } + } + + public boolean hasExplicitHtmls() { + return explicitHtmls.size() > 0; + } + + public List getExplicitHtmls() { + return explicitHtmls; + } + + public Iterator getRestNodes() { + return rest.iterator(); + } + + /* utilities */ + private static boolean isHtmlTag(Node node, String tagName) { + if (node.getNodeType() != Node.ELEMENT_NODE) + return false; + return ((Element) node).getTagName().equalsIgnoreCase(tagName); + } + + private static String getRootTagName(Document document) { + DocumentTypeAdapter adapter = (DocumentTypeAdapter) ((IDOMDocument) document).getAdapterFor(DocumentTypeAdapter.class); + if (adapter != null) { + DocumentType docType = adapter.getDocumentType(); + if (docType != null) { + return docType.getName(); + } + } + + return HTML40Namespace.ElementName.HTML; + } + } + + /** + * HTMLDocumentContentValidator constructor comment. + */ + public HTMLDocumentContentValidator() { + super(); + } + + /** + * Allowing the INodeAdapter to compare itself against the type + * allows it to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return ((type == HTMLDocumentContentValidator.class) || super.isAdapterForType(type)); + } + + /** + */ + public void validate(IndexedRegion node) { + // isFragment check should be more intelligent. + boolean isFragment = true; + + Document target = (Document) node; + NodeList children = target.getChildNodes(); + if (children == null) + return; + + Division division = new Division(target, children); + if (division.hasExplicitHtmls()) { + isFragment = false; + + List explicits = division.getExplicitHtmls(); + if (explicits.size() > 1) { + for (int i = 1; i < explicits.size(); i++) { + Element html = (Element) explicits.get(i); + // report error (duplicate) + Segment errorSeg = FMUtil.getSegment((IDOMNode) html, FMUtil.SEG_START_TAG); + if (errorSeg != null) + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(ErrorState.DUPLICATE_ERROR, errorSeg, html))); + } + } + } + validateContent(division.getRestNodes(), isFragment); + } + + /* + * This methods validate nodes other than HTML elements. + */ + private void validateContent(Iterator children, boolean isFragment) { + boolean foundDoctype = false; + while (children.hasNext()) { + IDOMNode child = (IDOMNode) children.next(); + + int error = ErrorState.NONE_ERROR; + int segType = FMUtil.SEG_WHOLE_TAG; + + switch (child.getNodeType()) { + case Node.ELEMENT_NODE : + if (! isFragment) { + Element childElem = (Element) child; + CMElementDeclaration ced = CMUtil.getDeclaration(childElem); + // Undefined element is valid. + if (ced == null) + continue; + // JSP (includes custom tags) and SSI are valid. + if (CMUtil.isForeign(childElem) || CMUtil.isSSI(ced)) + continue; // Defect 186774 + + // report error (invalid content) + error = ErrorState.INVALID_CONTENT_ERROR; + // mark the whole start tag as error. + segType = FMUtil.SEG_START_TAG; + } + break; + case Node.TEXT_NODE : + if (! isFragment) { + // TEXT node is valid when it contains white space characters only. + // Otherwise, it is invalid content. + if (((IDOMText) child).isWhitespace()) + continue; + error = ErrorState.INVALID_CONTENT_ERROR; + segType = FMUtil.SEG_WHOLE_TAG; + } + break; + case Node.DOCUMENT_TYPE_NODE : + // DOCTYPE is also valid when it appears once and only once. + if (!foundDoctype) { + foundDoctype = true; + continue; + } + error = ErrorState.DUPLICATE_ERROR; + segType = FMUtil.SEG_WHOLE_TAG; + break; + case Node.COMMENT_NODE : + // always valid. + case Node.PROCESSING_INSTRUCTION_NODE : + continue; + default : + if (! isFragment) { + error = ErrorState.INVALID_CONTENT_ERROR; + segType = FMUtil.SEG_WHOLE_TAG; + } + break; + } + if (error != ErrorState.NONE_ERROR) { + Segment errorSeg = FMUtil.getSegment(child, segType); + if (errorSeg != null) + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(error, errorSeg, child))); + } + } + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java new file mode 100644 index 0000000000..725314a2b3 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import org.eclipse.wst.html.core.HTMLCMProperties; +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; +import org.w3c.dom.Element; + +public class HTMLElementAncestorValidator extends PrimeValidator { + + /** + * HTMLElementAncestorValidator constructor comment. + */ + public HTMLElementAncestorValidator() { + super(); + } + + /** + * Allowing the INodeAdapter to compare itself against the type + * allows it to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return ((type == HTMLElementAncestorValidator.class) || super.isAdapterForType(type)); + } + + /** + * Check exclusion which is defined in only HTML DTD (SGML). + */ + public void validate(IndexedRegion node) { + Element target = (Element) node; + if (CMUtil.isForeign(target)) + return; + CMElementDeclaration dec = CMUtil.getDeclaration(target); + if (dec == null) + return; // cannot validate. + if (!CMUtil.isHTML(dec)) + return; // no need to validate + if (!dec.supports(HTMLCMProperties.PROHIBITED_ANCESTORS)) + return; // cannot validate. + CMNamedNodeMap prohibited = (CMNamedNodeMap) dec.getProperty(HTMLCMProperties.PROHIBITED_ANCESTORS); + if (prohibited.getLength() <= 0) + return; // no prohibited ancestors. + + Element parent = SMUtil.getParentElement(target); + while (parent != null) { + CMNode pdec = prohibited.getNamedItem(parent.getNodeName()); + if (pdec != null) { // prohibited element is found in ancestors. + Segment errorSeg = FMUtil.getSegment((IDOMNode) node, FMUtil.SEG_START_TAG); + if (errorSeg != null) + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(ErrorState.INVALID_CONTENT_ERROR, errorSeg, target))); + break; // If one prohibited ancestor is found, it's enough. + } + parent = SMUtil.getParentElement(parent); + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java new file mode 100644 index 0000000000..828ffb1f1e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java @@ -0,0 +1,178 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.document.IDOMText; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class HTMLElementContentValidator extends PrimeValidator { + + /** + * HTMLElementContentValidator constructor comment. + */ + public HTMLElementContentValidator() { + super(); + } + + /** + * Allowing the INodeAdapter to compare itself against the type + * allows it to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return ((type == HTMLElementContentValidator.class) || super.isAdapterForType(type)); + } + + /** + */ + public void validate(IndexedRegion node) { + Element target = (Element) node; + if (CMUtil.isForeign(target)) + return; + + validateContent(target, target.getChildNodes()); + } + + private void validateContent(Element parent, NodeList children) { + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child == null) + continue; + + // perform actual validation + validateNode(parent, child); + } + } + +// private int countExplicitSiblings(Element parent, String tagName) { +// NodeList children = parent.getChildNodes(); +// int count = 0; +// for (int i = 0; i < children.getLength(); i++) { +// Node child = children.item(i); +// if (child.getNodeType() != Node.ELEMENT_NODE) +// continue; +// if (tagName.equalsIgnoreCase(((Element) child).getTagName())) { +// count++; +// } +// } +// return count; +// } + + /* The implementation of the following method is practical but accurate. + * The accurate maximum occurence should be retreive from the content model. + * However, it is useful enough, since almost implicit elements are HTML, + * HEAD, or BODY. + */ +// private int getMaxOccur(Element parent, String childTag) { +// return 1; +// } + + private void validateNode(Element target, Node child) { + // NOTE: If the target element is 'UNKNOWN', that is, it has no + // element declaration, the content type of the element should be + // regarded as 'ANY'. -- 9/10/2001 + int contentType = CMElementDeclaration.ANY; + CMElementDeclaration edec = CMUtil.getDeclaration(target); + if (edec != null) + contentType = edec.getContentType(); + + int error = ErrorState.NONE_ERROR; + int segType = FMUtil.SEG_WHOLE_TAG; + + switch (child.getNodeType()) { + case Node.ELEMENT_NODE : + Element childElem = (Element) child; + // Defect 200321: + // This validator cares only HTML/XHTML elements. If a child is + // an element of foreign markup languages, just ignore it. + if (CMUtil.isForeign(childElem)) + return; + + CMElementDeclaration ced = CMUtil.getDeclaration((Element) child); + // Defect 186774: If a child is not one of HTML elements, + // it should be regarded as a valid child regardless the + // type of the parent content model. -- 10/12/2001 + if (ced == null || CMUtil.isSSI(ced) || (!CMUtil.isHTML(ced))) + return; + + switch (contentType) { + case CMElementDeclaration.ANY : + // Keep going. + return; + case CMElementDeclaration.ELEMENT : + case CMElementDeclaration.MIXED : + if (ced == null) + return; + if (CMUtil.isValidChild(edec, ced)) + return; + // Now, it is the time to check inclusion, unless the target + // document is not a XHTML. + if (!CMUtil.isXHTML(edec)) { + // pure HTML + if (CMUtil.isValidInclusion(ced, target)) + return; + } + error = ErrorState.INVALID_CONTENT_ERROR; + break; + default : + error = ErrorState.INVALID_CONTENT_ERROR; + break; + } + // Mark the whole START tag as an error segment. + segType = FMUtil.SEG_START_TAG; + break; + case Node.TEXT_NODE : + switch (contentType) { + case CMElementDeclaration.ANY : + case CMElementDeclaration.MIXED : + case CMElementDeclaration.PCDATA : + case CMElementDeclaration.CDATA : + // D184339 + // Keep going. + return; + case CMElementDeclaration.ELEMENT : + case CMElementDeclaration.EMPTY : + if (((IDOMText) child).isWhitespace()) + return; + error = ErrorState.INVALID_CONTENT_ERROR; + break; + default : + error = ErrorState.INVALID_CONTENT_ERROR; + break; + } + // Mark the whole node as an error segment. + segType = FMUtil.SEG_WHOLE_TAG; + break; + case Node.COMMENT_NODE : + case Node.PROCESSING_INSTRUCTION_NODE : + if (contentType != CMElementDeclaration.EMPTY) + return; + error = ErrorState.INVALID_CONTENT_ERROR; + // Mark the whole node as an error segment. + segType = FMUtil.SEG_WHOLE_TAG; + break; + default : + error = ErrorState.INVALID_CONTENT_ERROR; + // Mark the whole node as an error segment. + segType = FMUtil.SEG_WHOLE_TAG; + break; + } + if (error != ErrorState.NONE_ERROR) { + Segment errorSeg = FMUtil.getSegment((IDOMNode) child, segType); + if (errorSeg != null) + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(error, errorSeg, child))); + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java new file mode 100644 index 0000000000..f9a93924d2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +class HTMLSimpleDocumentValidator extends CompositeValidator { + + /** + * HTMLSimpleDocumentValidator constructor comment. + */ + public HTMLSimpleDocumentValidator() { + super(); + + ValidationComponent[] validators = new ValidationComponent[2]; + + validators[0] = new HTMLDocumentContentValidator(); + validators[1] = new SyntaxValidator(); + + register(validators); + } + + /** + * Allowing the INodeAdapter to compare itself against the type + * allows it to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return ((type == HTMLSimpleDocumentValidator.class) || super.isAdapterForType(type)); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java new file mode 100644 index 0000000000..ff2a5e188f --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +class HTMLSimpleValidator extends CompositeValidator { + + /** + * HTMLSimpleValidator constructor comment. + */ + public HTMLSimpleValidator() { + super(); + + ValidationComponent[] validators = new ValidationComponent[5]; + + validators[0] = new HTMLAttributeValidator(); + validators[1] = new HTMLElementContentValidator(); + validators[2] = new SyntaxValidator(); + validators[3] = new HTMLElementAncestorValidator(); + validators[4] = new NamespaceValidator(); + + register(validators); + } + + /** + * Allowing the INodeAdapter to compare itself against the type + * allows it to return true in more than one case. + */ + public boolean isAdapterForType(Object type) { + return ((type == HTMLSimpleValidator.class) || super.isAdapterForType(type)); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java new file mode 100644 index 0000000000..88cdc39d72 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import org.eclipse.wst.sse.core.AbstractAdapterFactory; +import org.eclipse.wst.sse.core.INodeAdapterFactory; +import org.eclipse.wst.sse.core.INodeAdapter; +import org.eclipse.wst.sse.core.INodeNotifier; +import org.eclipse.wst.sse.core.validate.ValidationAdapter; +import org.w3c.dom.Node; + +public class HTMLValidationAdapterFactory extends AbstractAdapterFactory { + + private static HTMLValidationAdapterFactory instance = null; + + /** + * HTMLValidationAdapterFactory constructor comment. + */ + public HTMLValidationAdapterFactory() { + super(ValidationAdapter.class, true); + } + + /** + * HTMLValidationAdapterFactory constructor comment. + * @param adapterKey java.lang.Object + * @param registerAdapters boolean + */ + public HTMLValidationAdapterFactory(Object adapterKey, boolean registerAdapters) { + super(adapterKey, registerAdapters); + } + + /** + */ + protected INodeAdapter createAdapter(INodeNotifier target) { + Node node = (Node) target; + switch (node.getNodeType()) { + case Node.DOCUMENT_NODE : + return new DocumentPropagatingValidator(); + case Node.ELEMENT_NODE : + return new ElementPropagatingValidator(); + default : + return new NullValidator(); + } + } + + /** + */ + public synchronized static HTMLValidationAdapterFactory getInstance() { + if (instance != null) + return instance; + instance = new HTMLValidationAdapterFactory(); + return instance; + } + + /** + * Overriding Object's clone() method + * This is used in IModelManager's IStructuredModel copying. + */ + public INodeAdapterFactory copy() { + return getInstance(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java new file mode 100644 index 0000000000..fb9b91bc5b --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java @@ -0,0 +1,254 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import java.text.MessageFormat; +import java.util.Hashtable; + +import org.eclipse.wst.html.core.internal.HTMLCorePlugin; +import org.eclipse.wst.html.core.internal.Logger; +import org.eclipse.wst.sse.core.validate.ValidationMessage; +import org.w3c.dom.Node; + +class MessageFactory implements ErrorState { + + + private static class ErrorTable { + private class Packet { + public Packet(String msg, int severity) { + this.msg = msg; + this.severity = severity; + } + + public String getMessage() { + return msg; + } + + public int getSeverity() { + return severity; + } + + private String msg = null; + private int severity = -1; + } + + public ErrorTable() { + } + + public void put(int state, String msg, int severity) { + Packet packet = new Packet(msg, severity); + map.put(new Integer(state), packet); + } + + public String getMessage(int state) { + return getPacket(state).getMessage(); + } + + public int getSeverity(int state) { + return getPacket(state).getSeverity(); + } + + private Packet getPacket(int state) { + return (Packet) map.get(new Integer(state)); + } + + private Hashtable map = new Hashtable(); + } + + private static interface NodeType { + static final int ATTRIBUTE = 0; + static final int ELEMENT = 1; + static final int DOCUMENT_TYPE = 2; + static final int TEXT = 3; + static final int COMMENT = 4; + static final int CDATA_SECTION = 5; + static final int PROCESSING_INSTRUCTION = 6; + static final int ENTITY_REFERENCE = 7; + + static final int MAX_TYPE = 8; + } + + // error messages + private static final String MSG_NO_ERROR = HTMLCorePlugin.getResourceString("%No_error._UI_"); //$NON-NLS-1$ = "No error." + private static final String MSG_UNDEFINED_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Undefined_attribute_name_(_ERROR_"); //$NON-NLS-1$ = "Undefined attribute name ({0})." + private static final String MSG_UNDEFINED_VALUE_ERROR = HTMLCorePlugin.getResourceString("%Undefined_attribute_value__ERROR_"); //$NON-NLS-1$ = "Undefined attribute value ({0})." + private static final String MSG_DUPLICATE_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Multiple_values_specified__ERROR_"); //$NON-NLS-1$ = "Multiple values specified for an attribute ({0})." + private static final String MSG_MISMATCHED_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Attribute_name_({0})_uses__ERROR_"); //$NON-NLS-1$ = "Attribute name ({0}) uses wrong case character." + private static final String MSG_INVALID_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Invalid_attribute_name_({0_ERROR_"); //$NON-NLS-1$ = "Invalid attribute name ({0})." + private static final String MSG_ATTR_NO_VALUE_ERROR = HTMLCorePlugin.getResourceString("%Invalid_attribute_({0})._ERROR_"); //$NON-NLS-1$ = "Invalid attribute ({0})." + private static final String MSG_INVALID_CONTENT_ERROR = HTMLCorePlugin.getResourceString("%Invalid_location_of_tag_({_ERROR_"); //$NON-NLS-1$ = "Invalid location of tag ({0})." + private static final String MSG_DUPLICATE_TAG_ERROR = HTMLCorePlugin.getResourceString("%Duplicate_tag_({0})._ERROR_"); //$NON-NLS-1$ = "Duplicate tag ({0})." + private static final String MSG_MISSING_START_TAG_ERROR = HTMLCorePlugin.getResourceString("%No_start_tag_(<{0}>)._ERROR_"); //$NON-NLS-1$ = "No start tag (<{0}>)." + private static final String MSG_MISSING_END_TAG_ERROR = HTMLCorePlugin.getResourceString("%No_end_tag_(</{0}>)._ERROR_"); //$NON-NLS-1$ = "No end tag (</{0}>)." + private static final String MSG_UNNECESSARY_END_TAG_ERROR = HTMLCorePlugin.getResourceString("%End_tag_(</{0}>)_not_neede_ERROR_"); //$NON-NLS-1$ = "End tag (</{0}>) not needed." + private static final String MSG_UNDEFINED_TAG_ERROR = HTMLCorePlugin.getResourceString("%Unknown_tag_({0})._ERROR_"); //$NON-NLS-1$ = "Unknown tag ({0})." + private static final String MSG_MISMATCHED_TAG_ERROR = HTMLCorePlugin.getResourceString("%Tag_name_({0})_uses_wrong__ERROR_"); //$NON-NLS-1$ = "Tag name ({0}) uses wrong case character." + private static final String MSG_INVALID_TAG_ERROR = HTMLCorePlugin.getResourceString("%Invalid_tag_name_({0})._ERROR_"); //$NON-NLS-1$ = "Invalid tag name ({0})." + private static final String MSG_INVALID_DIRECTIVE_ERROR = HTMLCorePlugin.getResourceString("%Invalid_JSP_directive_({0}_ERROR_"); //$NON-NLS-1$ = "Invalid JSP directive ({0})." + private static final String MSG_INVALID_TEXT_ERROR = HTMLCorePlugin.getResourceString("%Invalid_text_string_({0})._ERROR_"); //$NON-NLS-1$ = "Invalid text string ({0})." + private static final String MSG_INVALID_CHAR_ERROR = HTMLCorePlugin.getResourceString("%Invalid_character_used_in__ERROR_"); //$NON-NLS-1$ = "Invalid character used in text string ({0})." + private static final String MSG_UNKNOWN_ERROR = HTMLCorePlugin.getResourceString("%Unknown_error._ERROR_"); //$NON-NLS-1$ = "Unknown error." + private static final String MSG_UNCLOSED_START_TAG_ERROR = HTMLCorePlugin.getResourceString("%Start_tag_(<{0}>)_not_clos_ERROR_"); //$NON-NLS-1$ = "Start tag (<{0}>) not closed." + private static final String MSG_UNCLOSED_END_TAG_ERROR = HTMLCorePlugin.getResourceString("%End_tag_(</{0}>)_not_close_ERROR_"); //$NON-NLS-1$ = "End tag (</{0}>) not closed." + //private static final String MSG_UNCLOSED_TAG_ERROR = HTMLCorePlugin.getResourceString("%Tag_({0})_not_closed._ERROR_"); //$NON-NLS-1$ = "Tag ({0}) not closed." + private static final String MSG_MISMATCHED_ATTR_VALUE_ERROR = HTMLCorePlugin.getResourceString("%Attribute_value_({0})_uses_ERROR_"); //$NON-NLS-1$ = "Attribute value ({0}) uses wrong case character." + private static final String MSG_UNCLOSED_COMMENT_ERROR = HTMLCorePlugin.getResourceString("%Comment_not_closed._ERROR_"); //$NON-NLS-1$ = "Comment not closed." + private static final String MSG_UNCLOSED_DOCTYPE_ERROR = HTMLCorePlugin.getResourceString("%DOCTYPE_declaration_not_cl_ERROR_"); //$NON-NLS-1$ = "DOCTYPE declaration not closed." + private static final String MSG_UNCLOSED_PI_ERROR = HTMLCorePlugin.getResourceString("%Processing_instruction_not_ERROR_"); //$NON-NLS-1$ = "Processing instruction not closed." + private static final String MSG_UNCLOSED_CDATA_SECTION_ERROR = HTMLCorePlugin.getResourceString("%CDATA_section_not_closed._ERROR_"); //$NON-NLS-1$ = "CDATA section not closed." + private static final String MSG_INVALID_EMPTY_ELEMENT_TAG = HTMLCorePlugin.getResourceString("%_ERROR_Tag_({0})_should_be_an_empty-element_tag_1"); //$NON-NLS-1$ = "Tag ({0}) should be an empty-element tag." + private static final String MSG_UNCLOSED_ATTR_VALUE_ERROR = HTMLCorePlugin.getResourceString("%_ERROR_Attribute_value_({0})_not_closed._1"); //$NON-NLS-1$ ="Attribute value ({0}) not closed." + private static ErrorTable[] errTables = new ErrorTable[NodeType.MAX_TYPE]; + + static { + for (int i = 0; i < NodeType.MAX_TYPE; i++) { + errTables[i] = new ErrorTable(); + } + // NOTE: The severities are just stub. They must be reviewed. + // -- 8/30/2001 + + // attribute error map + ErrorTable attrTable = errTables[NodeType.ATTRIBUTE];// short hand + attrTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + attrTable.put(UNDEFINED_NAME_ERROR, MSG_UNDEFINED_ATTR_ERROR, ValidationMessage.WARNING); + attrTable.put(UNDEFINED_VALUE_ERROR, MSG_UNDEFINED_VALUE_ERROR, ValidationMessage.WARNING); + attrTable.put(MISMATCHED_ERROR, MSG_MISMATCHED_ATTR_ERROR, ValidationMessage.WARNING); + attrTable.put(INVALID_NAME_ERROR, MSG_INVALID_ATTR_ERROR, ValidationMessage.WARNING); + attrTable.put(INVALID_ATTR_ERROR, MSG_ATTR_NO_VALUE_ERROR, ValidationMessage.WARNING); + attrTable.put(DUPLICATE_ERROR, MSG_DUPLICATE_ATTR_ERROR, ValidationMessage.WARNING); + attrTable.put(MISMATCHED_VALUE_ERROR, MSG_MISMATCHED_ATTR_VALUE_ERROR, ValidationMessage.ERROR); + //<<D210422 + attrTable.put(UNCLOSED_ATTR_VALUE, MSG_UNCLOSED_ATTR_VALUE_ERROR, ValidationMessage.WARNING); + //D210422 + // element error map + ErrorTable elemTable = errTables[NodeType.ELEMENT];// short hand + elemTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + elemTable.put(UNDEFINED_NAME_ERROR, MSG_UNDEFINED_TAG_ERROR, ValidationMessage.WARNING); + elemTable.put(INVALID_NAME_ERROR, MSG_INVALID_TAG_ERROR, ValidationMessage.ERROR); + elemTable.put(MISMATCHED_ERROR, MSG_MISMATCHED_TAG_ERROR, ValidationMessage.WARNING); + elemTable.put(MISMATCHED_END_TAG_ERROR, MSG_MISMATCHED_TAG_ERROR, ValidationMessage.ERROR); + elemTable.put(MISSING_START_TAG_ERROR, MSG_MISSING_START_TAG_ERROR, ValidationMessage.ERROR); + elemTable.put(MISSING_END_TAG_ERROR, MSG_MISSING_END_TAG_ERROR, ValidationMessage.WARNING); + elemTable.put(UNNECESSARY_END_TAG_ERROR, MSG_UNNECESSARY_END_TAG_ERROR, ValidationMessage.WARNING); + elemTable.put(INVALID_DIRECTIVE_ERROR, MSG_INVALID_DIRECTIVE_ERROR, ValidationMessage.ERROR); + elemTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + elemTable.put(DUPLICATE_ERROR, MSG_DUPLICATE_TAG_ERROR, ValidationMessage.WARNING); + elemTable.put(COEXISTENCE_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + elemTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_START_TAG_ERROR, ValidationMessage.ERROR); + elemTable.put(UNCLOSED_END_TAG_ERROR, MSG_UNCLOSED_END_TAG_ERROR, ValidationMessage.ERROR); + elemTable.put(INVALID_EMPTY_ELEMENT_TAG, MSG_INVALID_EMPTY_ELEMENT_TAG, ValidationMessage.WARNING); + + // document type error map + ErrorTable docTable = errTables[NodeType.DOCUMENT_TYPE];// short hand + docTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + docTable.put(DUPLICATE_ERROR, MSG_DUPLICATE_TAG_ERROR, ValidationMessage.ERROR); + docTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + docTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_DOCTYPE_ERROR, ValidationMessage.ERROR); + + // text error map + ErrorTable textTable = errTables[NodeType.TEXT]; + textTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + textTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_TEXT_ERROR, ValidationMessage.WARNING); + textTable.put(INVALID_CHAR_ERROR, MSG_INVALID_CHAR_ERROR, ValidationMessage.WARNING); + + // comment error map + ErrorTable commTable = errTables[NodeType.COMMENT]; + commTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + commTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + commTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_COMMENT_ERROR, ValidationMessage.ERROR); + + // cdata section error map + ErrorTable cdatTable = errTables[NodeType.CDATA_SECTION]; + cdatTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + cdatTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + cdatTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_CDATA_SECTION_ERROR, ValidationMessage.ERROR); + + // processing instruction error map + ErrorTable piTable = errTables[NodeType.PROCESSING_INSTRUCTION]; + piTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + piTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + piTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_PI_ERROR, ValidationMessage.ERROR); + + // entity reference error map + ErrorTable erTable = errTables[NodeType.ENTITY_REFERENCE]; + erTable.put(NONE_ERROR, MSG_NO_ERROR, 0); + erTable.put(UNDEFINED_NAME_ERROR, MSG_UNDEFINED_TAG_ERROR, ValidationMessage.WARNING); + erTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING); + } + + /** + */ + public static ValidationMessage createMessage(ErrorInfo info) { + String errorMsg = getErrorMessage(info); + int errorSeverity = getErrorSeverity(info); + return new ValidationMessage(errorMsg, info.getOffset(), info.getLength(), errorSeverity); + } + + private static String getErrorMessage(ErrorInfo info) { + ErrorTable tab = getErrorTable(info.getTargetType()); + if (tab == null) + return MSG_UNKNOWN_ERROR; + + String template = tab.getMessage(info.getState()); + Object[] arguments = {info.getHint()}; + String s = null; + try { + s = MessageFormat.format(template, arguments); + } + catch (IllegalArgumentException e) { + Logger.logException(e); + s = template + ":" + arguments.toString(); //$NON-NLS-1$ + } + return s; + } + + /** + */ + private static int getErrorSeverity(ErrorInfo info) { + ErrorTable tab = getErrorTable(info.getTargetType()); + if (tab == null) + return 0; + return tab.getSeverity(info.getState()); + } + + private static ErrorTable getErrorTable(short nodetype) { + ErrorTable tab = null; + switch (nodetype) { + case Node.ATTRIBUTE_NODE : + tab = errTables[NodeType.ATTRIBUTE]; + break; + case Node.ELEMENT_NODE : + tab = errTables[NodeType.ELEMENT]; + break; + case Node.DOCUMENT_TYPE_NODE : + tab = errTables[NodeType.DOCUMENT_TYPE]; + break; + case Node.TEXT_NODE : + tab = errTables[NodeType.TEXT]; + break; + case Node.COMMENT_NODE : + tab = errTables[NodeType.COMMENT]; + break; + case Node.CDATA_SECTION_NODE : + tab = errTables[NodeType.CDATA_SECTION]; + break; + case Node.PROCESSING_INSTRUCTION_NODE : + tab = errTables[NodeType.PROCESSING_INSTRUCTION]; + break; + case Node.ENTITY_REFERENCE_NODE : + tab = errTables[NodeType.ENTITY_REFERENCE]; + break; + default : + return null; + } + return tab; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java new file mode 100644 index 0000000000..d82487f91e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.xml.core.document.IDOMAttr; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; +import org.w3c.dom.Attr; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +public class NamespaceValidator extends PrimeValidator implements ErrorState { + + private final static String XMLNS_PREFIX = "xmlns";//$NON-NLS-1$ + private final static String NS_SEPARATOR = ":";//$NON-NLS-1$ + + public NamespaceValidator() { + super(); + } + + public boolean isAdapterForType(Object type) { + return ((type == NamespaceValidator.class) || super.isAdapterForType(type)); + } + + public void validate(IndexedRegion node) { + Element target = (Element) node; + if (isXMLElement(target) && hasUnknownPrefix(target)) { + IDOMElement e = (IDOMElement) target; + if (!isValidPrefix(e.getPrefix(), target) && !e.isCommentTag()) { + // report unknown tag error. + Segment errorSeg = FMUtil.getSegment(e, FMUtil.SEG_START_TAG); + if (errorSeg != null) + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(UNDEFINED_NAME_ERROR, errorSeg, e))); + } + } + // (2) check prefix of each attr + NamedNodeMap attrs = target.getAttributes(); + for (int i = 0; i < attrs.getLength(); i++) { + Node n = attrs.item(i); + if (!(n instanceof IDOMAttr)) + continue; + IDOMAttr a = (IDOMAttr) n; + String prefix = a.getPrefix(); + if ((prefix != null) && isUnknownAttr(a, target)) { + // The attr has unknown prefix. So, check it. + if (!isValidPrefix(prefix, target)) { + // report unknown attr error. + ITextRegion r = a.getNameRegion(); + if (r == null) + continue; + int a_offset = a.getNameRegionStartOffset(); + int a_length = a.getNameRegion().getLength(); + reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(UNDEFINED_NAME_ERROR, new Segment(a_offset, a_length), a))); + } + } + } + } + + // private methods + private boolean isXMLElement(Element target) { + return target instanceof IDOMElement; + } + + private boolean hasUnknownPrefix(Element target) { + return isUnknownElement(target) && CMUtil.isForeign(target); + } + + private boolean isUnknownElement(Element target) { + CMElementDeclaration dec = CMUtil.getDeclaration(target); + return dec == null; + } + + private boolean isUnknownAttr(IDOMAttr attr, Element target) { + CMElementDeclaration dec = CMUtil.getDeclaration(target); + if (dec == null) + return true; // unknown. + CMNamedNodeMap adecls = dec.getAttributes(); + CMAttributeDeclaration adec = (CMAttributeDeclaration) adecls.getNamedItem(attr.getName()); + return adec == null; + } + + private boolean isValidPrefix(String prefix, Element e) { + if (prefix.equals(XMLNS_PREFIX)) + return true; // "xmlns:foo" attr is always valid. + + // (1) check the element has the namespace definition or not. + if (isValidPrefixWithinElement(prefix, e)) + return true; + + // (2) check ancestors of the element have the namespace definition or not. + Element parent = SMUtil.getParentElement(e); + while (parent != null) { + if (isValidPrefixWithinElement(prefix, parent)) + return true; + parent = SMUtil.getParentElement(parent); + } + return false; + } + + private boolean isValidPrefixWithinElement(String prefix, Element e) { + String ns = XMLNS_PREFIX + NS_SEPARATOR + prefix; + NamedNodeMap attrs = e.getAttributes(); + for (int i = 0; i < attrs.getLength(); i++) { + Node n = attrs.item(i); + if (n == null) + continue; + if (n.getNodeType() != Node.ATTRIBUTE_NODE) + continue; + if (ns.equals(((Attr) n).getName())) + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java new file mode 100644 index 0000000000..28cd512ca1 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.sse.core.validate.ValidationReporter; +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +/** + * NullValidator class is intended to be a replacement of null + * for ValidationComponent type. + */ +final class NullValidator extends ValidationComponent { + + public NullValidator() { + super(); + } + + public void validate(IndexedRegion node) { + return; + } + + public void setReporter(ValidationReporter reporter) { + return; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java new file mode 100644 index 0000000000..b44f258b87 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import org.eclipse.wst.xml.core.internal.validate.ValidationComponent; + +abstract class PrimeValidator extends ValidationComponent { + + /** + * PrimeValidator constructor comment. + */ + public PrimeValidator() { + super(); + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java new file mode 100644 index 0000000000..6bf6fede41 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +final class SMUtil { + + private SMUtil() { + super(); + } + + /* get an ancestor element ignoring implicit ones. */ + public static Element getParentElement(Node child) { + if (child == null) + return null; + + Node p = child.getParentNode(); + while (p != null) { + if (p.getNodeType() == Node.ELEMENT_NODE) { + return (Element) p; + } + p = p.getParentNode(); + } + return null; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java new file mode 100644 index 0000000000..109ce0088e --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + + + +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; + +public class Segment { + + private int offset = 0; + private int length = 0; + + /** + */ + public Segment(int offset, int length) { + super(); + this.offset = offset; + this.length = length; + } + + public Segment(IStructuredDocumentRegion region) { + super(); + this.offset = region.getStartOffset(); + this.length = region.getLength(); + } + + /** + * NOTE: 'start' and 'end' must be the start and end of the contiguous regions. + * Otherwise, this class cannot work correctly. + */ + public Segment(IStructuredDocumentRegion start, IStructuredDocumentRegion end) { + super(); + this.offset = start.getStartOffset(); + int endOffset = (end == null) ? start.getEndOffset() : end.getEndOffset(); + this.length = endOffset - this.offset; + } + + //public Segment(ITextRegion start, ITextRegion end) { + // super(); + // this.offset = start.getStartOffset(); + // int endOffset = (end == null) ? start.getEndOffset() : end.getEndOffset(); + // this.length = endOffset - this.offset; + //} + /** + */ + public int getLength() { + return this.length; + } + + /** + */ + public int getOffset() { + return this.offset; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java new file mode 100644 index 0000000000..26437db6b2 --- /dev/null +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java @@ -0,0 +1,345 @@ +/******************************************************************************* + * Copyright (c) 2004 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.html.core.internal.validate; + +import java.util.Iterator; + +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry; +import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry; +import org.eclipse.wst.sse.core.IndexedRegion; +import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion; +import org.eclipse.wst.sse.core.text.ITextRegion; +import org.eclipse.wst.sse.core.text.ITextRegionList; +import org.eclipse.wst.xml.core.document.IDOMDocument; +import org.eclipse.wst.xml.core.document.IDOMElement; +import org.eclipse.wst.xml.core.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; +import org.eclipse.wst.xml.core.internal.document.InvalidCharacterException; +import org.eclipse.wst.xml.core.internal.document.SourceValidator; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +class SyntaxValidator extends PrimeValidator implements ErrorState { + + + static private boolean isValidRegion(ITextRegion rgn) { + String type = rgn.getType(); + if (type == null) + return false; // no type is invalid. + if (type == DOMRegionContext.XML_END_TAG_OPEN || type == DOMRegionContext.XML_TAG_NAME || type == DOMRegionContext.XML_TAG_CLOSE) { + return true; + } + return false; + } + + static private String getTagName(IStructuredDocumentRegion tag) { + ITextRegionList regions = tag.getRegions(); + Iterator iter = regions.iterator(); + while (iter.hasNext()) { + ITextRegion rgn = (ITextRegion) iter.next(); + if (rgn.getType() == DOMRegionContext.XML_TAG_NAME) + return tag.getText(rgn); + } + return "";//$NON-NLS-1$ + } + + static private boolean isEmptyContent(CMElementDeclaration decl) { + return (decl != null) && (decl.getContentType() == CMElementDeclaration.EMPTY); + } + + public SyntaxValidator() { + super(); + } + + public boolean isAdapterForType(Object type) { + return ((type == SyntaxValidator.class) || super.isAdapterForType(type)); + } + + class ElementInfo { + public ElementInfo() { + super(); + } + + public IDOMElement target = null; + public CMElementDeclaration decl = null; + public IStructuredDocumentRegion startTag = null; + public IStructuredDocumentRegion endTag = null; + public boolean hasStartTag = false; + public boolean hasEndTag = false; + public boolean isXHTML = false; + } + + public void validate(IndexedRegion indexedNode) { + Node node = (Node) indexedNode; + validateChildren(node); + + if (node.getNodeType() != Node.ELEMENT_NODE) + return; + if (!(node instanceof IDOMElement)) + return; + + ElementInfo info = new ElementInfo(); + info.target = (IDOMElement) node; + + // gather information to validate from target at once. + getInfo(info); + + if (info.target.isGlobalTag()) { + validateTags(info); + validateNames(info); + if (info.decl != null && info.isXHTML) { + validateTagCase(info); + } + } + } + + private void getInfo(ElementInfo info) { + info.decl = CMUtil.getDeclaration(info.target); + info.startTag = info.target.getStartStructuredDocumentRegion(); + info.endTag = info.target.getEndStructuredDocumentRegion(); + + info.hasStartTag = (info.startTag != null); + info.hasEndTag = (info.endTag != null); + + Document doc = info.target.getOwnerDocument(); + if (!(doc instanceof IDOMDocument)) + return; + String typeid = ((IDOMDocument) doc).getDocumentTypeId(); + if (typeid != null) { + HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(typeid); + info.isXHTML = (entry != null && entry.isXMLType()); + } + } + + class TagErrorInfoImpl extends AbstractErrorInfo { + private String hint = null; + + public TagErrorInfoImpl(int state, IStructuredDocumentRegion tag, String hint) { + super(state, new Segment(tag)); + this.hint = hint; + } + + public String getHint() { + return hint; + } + + public short getTargetType() { + return Node.ELEMENT_NODE; + } + } + + private boolean isEndTagCorrupted(ElementInfo info) { + ITextRegionList regions = info.endTag.getRegions(); + if (regions == null || regions.isEmpty()) + return false; + Iterator iter = regions.iterator(); + while (iter.hasNext()) { + ITextRegion rgn = (ITextRegion) iter.next(); + if (!isValidRegion(rgn)) + return true; // found invalid region type. + } + return false; // all regions are valid. + } + + private String getEndTagFullText(ElementInfo info) { + String hint = "";//$NON-NLS-1$ + ITextRegionList regions = info.endTag.getRegions(); + Iterator iter = regions.iterator(); + while (iter.hasNext()) { + ITextRegion rgn = (ITextRegion) iter.next(); + String type = rgn.getType(); + if (type == null) + continue; + if (type == DOMRegionContext.XML_END_TAG_OPEN || type == DOMRegionContext.XML_TAG_CLOSE) + continue; + hint += info.endTag.getFullText(rgn); + } + return hint; + } + + private void reportCorruptedEndTagError(ElementInfo info) { + String hint = getEndTagFullText(info); + TagErrorInfoImpl error = new TagErrorInfoImpl(UNDEFINED_NAME_ERROR, info.endTag, hint); + this.reporter.report(MessageFactory.createMessage(error)); + } + + private void validateTags(ElementInfo info) { + if (info.hasStartTag) { + if (!info.target.isStartTagClosed()) { + // Mark the whole START tag as an error segment. + Segment errorSeg = new Segment(info.startTag); + report(UNCLOSED_TAG_ERROR, errorSeg, info.target); + } + } + else { + if (info.hasEndTag) { + if (info.decl != null) { + if (CMUtil.isHTML(info.decl) && !info.target.hasChildNodes()) { + if (info.target.isContainer()) { + // Set the error mark to the start of the element. + Segment errorSeg = new Segment(info.target.getStartOffset(), 0); + report(MISSING_START_TAG_ERROR, errorSeg, info.target); + } + else { + // Mark the whole END tag as an error segment. + Segment errorSeg = new Segment(info.endTag); + report(UNNECESSARY_END_TAG_ERROR, errorSeg, info.target); + } + } + else if (info.isXHTML) { + Segment errorSeg = new Segment(info.target.getStartOffset(), 0); + report(MISSING_START_TAG_ERROR, errorSeg, info.target); + } + } + } + } + + if (info.hasEndTag) { + if (!info.target.isClosed()) { + // Set the whole END tag as error segment. + Segment errorSeg = new Segment(info.endTag); + report(UNCLOSED_END_TAG_ERROR, errorSeg, info.target); + } + } + else { + if (info.isXHTML) { // XHTML + if (!info.target.isEmptyTag()) { + if (isEmptyContent(info.decl)) { + // EMPTY element should be written in <.../> form. + Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG); + report(INVALID_EMPTY_ELEMENT_TAG, errorSeg, info.target); + } + else { + // end tag is required. + Segment errorSeg = new Segment(info.target.getEndOffset(), 0); + report(MISSING_END_TAG_ERROR, errorSeg, info.target); + } + } + } + else { // HTML + if (info.hasStartTag) { + if (info.decl != null && CMUtil.isHTML(info.decl) && !info.target.isEmptyTag() && !CMUtil.isEndTagOmissible(info.decl)) { + // Set the error mark to the end of the element. + Segment errorSeg = new Segment(info.target.getEndOffset(), 0); + report(MISSING_END_TAG_ERROR, errorSeg, info.target); + } + } + } + } + } + + /* perform validation about tag name definition. */ + private void validateNames(ElementInfo info) { + boolean corrupted = info.hasEndTag && isEndTagCorrupted(info); + if (info.decl == null) { + // If no declaration is retrieved, the target is really + // unknown element. + if (!info.hasStartTag && corrupted) { + reportCorruptedEndTagError(info); + } + else { + Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG); + report(UNDEFINED_NAME_ERROR, errorSeg, info.target); + } + } + else { + // Even if a declaration could be retrieved, if the end + // tag is corrupted, it should be reported as undefined + // name. (D202493) + if (corrupted) { + reportCorruptedEndTagError(info); + } + } + } + + /* perform validation tag case only for XHTML document */ + private void validateTagCase(ElementInfo info) { + String declared = info.decl.getElementName(); + String startTagName = "";//$NON-NLS-1$ + String endTagName = "";//$NON-NLS-1$ + if (declared == null) + return; + + // start tag + if (info.hasStartTag) { + startTagName = getTagName(info.startTag); + if (!declared.equals(startTagName)) { + TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.startTag, startTagName); + this.reporter.report(MessageFactory.createMessage(error)); + } + } + // end tag + if (info.hasEndTag) { + endTagName = getTagName(info.endTag); + if (!info.hasStartTag || (!endTagName.equals(startTagName))) { + if (!declared.equals(endTagName)) { + TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.endTag, endTagName); + this.reporter.report(MessageFactory.createMessage(error)); + } + } + } + } + + private void validateChildren(Node target) { + if ((target.getNodeType() == Node.ELEMENT_NODE) && CMUtil.isForeign((Element) target)) + return; + + for (Node child = target.getFirstChild(); child != null; child = child.getNextSibling()) { + switch (child.getNodeType()) { + case Node.TEXT_NODE : + { + IDOMNode text = (IDOMNode) child; + int charOffset = validateTextSource(text); + if (charOffset >= 0) { + charOffset += text.getStartOffset(); + Segment errorSeg = new Segment(charOffset, 1); + if (errorSeg != null) + report(INVALID_CHAR_ERROR, errorSeg, text); + } + break; + } + case Node.COMMENT_NODE : + case Node.DOCUMENT_TYPE_NODE : + case Node.PROCESSING_INSTRUCTION_NODE : + case Node.CDATA_SECTION_NODE : + { + IDOMNode tag = (IDOMNode) child; + if (!tag.isClosed()) { + Segment errorSeg = FMUtil.getSegment(tag, FMUtil.SEG_WHOLE_TAG); + if (errorSeg != null) + report(UNCLOSED_TAG_ERROR, errorSeg, tag); + } + break; + } + default : + break; + } + } + } + + private int validateTextSource(IDOMNode text) { + try { + SourceValidator validator = new SourceValidator(text); + validator.validateSource(text.getSource()); + } + catch (InvalidCharacterException ex) { + return ex.getOffset(); + } + return -1; + } + + private void report(int state, Segment errorSeg, Node node) { + ErrorInfo info = new ErrorInfoImpl(state, errorSeg, node); + reporter.report(MessageFactory.createMessage(info)); + } +}
\ No newline at end of file |