blob: 0f0a4be5cf90adceae258cae3f9189cc4a411726 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.wst.jsdt.web.css.core.internal.document;
import java.util.regex.Pattern;
import org.eclipse.wst.jsdt.web.css.core.internal.parserz.JSPedCSSRegionContexts;
import org.eclipse.wst.css.core.internal.document.CSSModelCreationContext;
import org.eclipse.wst.css.core.internal.document.CSSModelParser;
import org.eclipse.wst.css.core.internal.document.CSSNodeImpl;
import org.eclipse.wst.css.core.internal.document.CSSStructuredDocumentRegionContainer;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSDocument;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSRuleContainer;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocumentRegion;
/**
*
*/
class JSPedCSSModelParser extends CSSModelParser {
public JSPedCSSModelParser(ICSSDocument doc) {
super(doc);
}
/**
*
*/
@Override
protected CSSNodeImpl insertStructuredDocumentRegion(
IStructuredDocumentRegion region) {
CSSModelCreationContext creationContext = getCreationContext();
if (creationContext == null || region == null) {
return null;
}
String type = ((BasicStructuredDocumentRegion) region).getType();
CSSNodeImpl modified = null;
// ICSSNode target = fCreationContext.getTargetNode();
if (type == JSPedCSSRegionContexts.CSS_JSP_DIRECTIVE) {
boolean isInclude = region.getText().indexOf("include") != -1;
if (isInclude) {
modified = insertUnknownImport(region);
} else {
modified = insertUnknownRule(region);
}
}
// post process
if (modified != null) {
if (modified instanceof CSSStructuredDocumentRegionContainer) {
((CSSStructuredDocumentRegionContainer) modified)
.propagateRangeStructuredDocumentRegion();
}
}
return modified != null ? modified : super
.insertStructuredDocumentRegion(region);
}
private CSSNodeImpl insertUnknownImport(IStructuredDocumentRegion region) {
CSSModelCreationContext creationContext = getCreationContext();
CSSNodeImpl parent = creationContext.getTargetNode();
ICSSDocument sheet = parent.getOwnerDocument();
String text = region.getText();
Pattern pattern = Pattern.compile(" ");
String[] strs = pattern.split(text);
String hrefValue = null;
for (int i = 0; i < strs.length; i++) {
String hrefStr = "file=\"";
if (strs[i].startsWith(hrefStr)) {
int hrefStr_length = hrefStr.length();
// minus 1 to avoid quote?
int hrefValue_length = strs[i].length() - 1;
if (hrefValue_length > hrefStr_length) {
hrefValue = strs[i].substring(hrefStr_length,
hrefValue_length);
} else {
/*
* ISSUE: this handles cases where, e.g. "file=" has no
* subsequent 'value' ... and from code in
* insertStructuredDocumentRegion I believe should return
* null, rather than empty string, but, this may need some
* fine tuning eventually.
*/
hrefValue = null;
}
break;
}
}
if (hrefValue == null) {
return null;
}
JSPCSSImportRuleImpl rule = new JSPCSSImportRuleImpl();
rule.setOwnerDocument(sheet);
rule.appendChild((CSSNodeImpl) sheet.createMediaList());
rule.setRangeStructuredDocumentRegion(region, region);
if (!isUpdateContextActive()) {
rule.setHref(hrefValue);// Attribute(ICSSImportRule.HREF,
// hrefValue);
}
// insert to tree
if (!isUpdateContextActive() && parent != null) {
// propagateRangePreInsert(sheet, rule);
CSSNodeImpl next = creationContext.getNextNode();
if (next != null) {
((CSSNodeImpl) sheet).insertBefore(rule, next);
} else {
((CSSNodeImpl) sheet).appendChild(rule);
}
}
// creationContext.setTargetNode(rule);
return rule;
}
private CSSNodeImpl insertUnknownRule(IStructuredDocumentRegion flatNode) {
CSSModelCreationContext creationContext = getCreationContext();
CSSNodeImpl parent = creationContext.getTargetNode();
if (!isParseFloating() && !(parent instanceof ICSSRuleContainer)) {
return null;
}
JSPCSSNodeImpl rule = new JSPCSSNodeImpl(flatNode.getText());
rule.setOwnerDocument(parent.getOwnerDocument());
// setup flat container
rule.setRangeStructuredDocumentRegion(flatNode, flatNode);
// insert to tree
if (!isUpdateContextActive() && parent != null) {
propagateRangePreInsert(parent, rule);
CSSNodeImpl next = creationContext.getNextNode();
if (next != null) {
parent.insertBefore(rule, next);
} else {
parent.appendChild(rule);
}
}
// creationContext.setTargetNode(parent.getOwnerDocument());
// TargetNext is set to null automatically
return rule;
}
}