blob: 0aa723fadba288607014a3401e10ac06326b8b4f [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.jst.jsp.css.core.internal.document;
import java.util.regex.Pattern;
import org.eclipse.jst.jsp.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);
}
/**
*
*/
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;
}
}