blob: 684241edd831de9ca4d04217b00da74ad8a3604a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.html.core.contentmodel;
import java.util.Arrays;
import org.eclipse.wst.common.contentmodel.CMElementDeclaration;
import org.eclipse.wst.common.contentmodel.CMGroup;
import org.eclipse.wst.common.contentmodel.CMNode;
import org.eclipse.wst.html.core.HTML40Namespace;
/**
* 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;
}
}