| /******************************************************************************* |
| * Copyright (c) 2004 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is 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.internal.provisional.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. |
| */ |
| 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; |
| } |
| } |