/******************************************************************************* * 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; } }