daniel
7 years ago
93 changed files with 49737 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,99 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSStyleSheet; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author koch |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public abstract class AbstractCSSRuleImpl extends CSSOMObjectImpl implements CSSFormatable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7829784704712797815L; |
||||||
|
|
||||||
|
private CSSStyleSheetImpl parentStyleSheet_; |
||||||
|
private CSSRule parentRule_; |
||||||
|
|
||||||
|
protected CSSStyleSheetImpl getParentStyleSheetImpl() { |
||||||
|
return parentStyleSheet_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentStyleSheet(final CSSStyleSheetImpl parentStyleSheet) { |
||||||
|
parentStyleSheet_ = parentStyleSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentRule(final CSSRule parentRule) { |
||||||
|
parentRule_ = parentRule; |
||||||
|
} |
||||||
|
|
||||||
|
public AbstractCSSRuleImpl(final CSSStyleSheetImpl parentStyleSheet, final CSSRule parentRule) { |
||||||
|
super(); |
||||||
|
parentStyleSheet_ = parentStyleSheet; |
||||||
|
parentRule_ = parentRule; |
||||||
|
} |
||||||
|
|
||||||
|
public AbstractCSSRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleSheet getParentStyleSheet() { |
||||||
|
return parentStyleSheet_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRule getParentRule() { |
||||||
|
return parentRule_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public abstract String getCssText(CSSFormat format); |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return super.equals(obj); |
||||||
|
// don't use parentRule and parentStyleSheet in equals()
|
||||||
|
// recursive loop -> stack overflow!
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
final int hash = super.hashCode(); |
||||||
|
// don't use parentRule and parentStyleSheet in hashCode()
|
||||||
|
// recursive loop -> stack overflow!
|
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,145 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSCharsetRule; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSCharsetRule}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSCharsetRuleImpl extends AbstractCSSRuleImpl implements CSSCharsetRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -2472209213089007127L; |
||||||
|
|
||||||
|
private String encoding_; |
||||||
|
|
||||||
|
public CSSCharsetRuleImpl( |
||||||
|
final CSSStyleSheetImpl parentStyleSheet, |
||||||
|
final CSSRule parentRule, |
||||||
|
final String encoding) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
encoding_ = encoding; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSCharsetRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return CHARSET_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
sb.append("@charset \""); |
||||||
|
|
||||||
|
final String enc = getEncoding(); |
||||||
|
if (null != enc) { |
||||||
|
sb.append(enc); |
||||||
|
} |
||||||
|
sb.append("\";"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be a charset rule
|
||||||
|
if (r.getType() == CSSRule.CHARSET_RULE) { |
||||||
|
encoding_ = ((CSSCharsetRuleImpl) r).encoding_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_CHARSET_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getEncoding() { |
||||||
|
return encoding_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEncoding(final String encoding) throws DOMException { |
||||||
|
encoding_ = encoding; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSCharsetRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSCharsetRule ccr = (CSSCharsetRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getEncoding(), ccr.getEncoding()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, encoding_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,141 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSFontFaceRule; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSStyleDeclaration; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSFontFaceRule}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSFontFaceRuleImpl extends AbstractCSSRuleImpl implements CSSFontFaceRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -3604191834588759088L; |
||||||
|
|
||||||
|
private CSSStyleDeclarationImpl style_; |
||||||
|
|
||||||
|
public CSSFontFaceRuleImpl(final CSSStyleSheetImpl parentStyleSheet, final CSSRule parentRule) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
} |
||||||
|
|
||||||
|
public CSSFontFaceRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return FONT_FACE_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append("@font-face {"); |
||||||
|
|
||||||
|
final CSSStyleDeclaration style = getStyle(); |
||||||
|
if (null != style) { |
||||||
|
sb.append(style.getCssText()); |
||||||
|
} |
||||||
|
sb.append("}"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be a font face rule
|
||||||
|
if (r.getType() == CSSRule.FONT_FACE_RULE) { |
||||||
|
style_ = ((CSSFontFaceRuleImpl) r).style_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_FONT_FACE_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleDeclaration getStyle() { |
||||||
|
return style_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setStyle(final CSSStyleDeclarationImpl style) { |
||||||
|
style_ = style; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSFontFaceRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSFontFaceRule cffr = (CSSFontFaceRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getStyle(), cffr.getStyle()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, style_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,171 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSImportRule; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSStyleSheet; |
||||||
|
import org.w3c.dom.stylesheets.MediaList; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSImportRule}. |
||||||
|
* |
||||||
|
* TODO: Implement getStyleSheet() |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSImportRuleImpl extends AbstractCSSRuleImpl implements CSSImportRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7807829682009179339L; |
||||||
|
|
||||||
|
private String href_; |
||||||
|
private MediaList media_; |
||||||
|
|
||||||
|
public void setHref(final String href) { |
||||||
|
href_ = href; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMedia(final MediaList media) { |
||||||
|
media_ = media; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSImportRuleImpl( |
||||||
|
final CSSStyleSheetImpl parentStyleSheet, |
||||||
|
final CSSRule parentRule, |
||||||
|
final String href, |
||||||
|
final MediaList media) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
href_ = href; |
||||||
|
media_ = media; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSImportRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return IMPORT_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append("@import"); |
||||||
|
|
||||||
|
final String href = getHref(); |
||||||
|
if (null != href) { |
||||||
|
sb.append(" url(").append(href).append(")"); |
||||||
|
} |
||||||
|
|
||||||
|
final MediaList ml = getMedia(); |
||||||
|
if (null != ml && ml.getLength() > 0) { |
||||||
|
sb.append(" ").append(((MediaListImpl) getMedia()).getMediaText(format)); |
||||||
|
} |
||||||
|
sb.append(";"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be an import rule
|
||||||
|
if (r.getType() == CSSRule.IMPORT_RULE) { |
||||||
|
href_ = ((CSSImportRuleImpl) r).href_; |
||||||
|
media_ = ((CSSImportRuleImpl) r).media_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_IMPORT_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getHref() { |
||||||
|
return href_; |
||||||
|
} |
||||||
|
|
||||||
|
public MediaList getMedia() { |
||||||
|
return media_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleSheet getStyleSheet() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSImportRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSImportRule cir = (CSSImportRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getHref(), cir.getHref()) |
||||||
|
&& LangUtils.equals(getMedia(), cir.getMedia()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, href_); |
||||||
|
hash = LangUtils.hashCode(hash, media_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,250 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.ObjectInputStream; |
||||||
|
import java.io.ObjectOutputStream; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import com.fr.third.steadystate.css.util.ThrowCssExceptionErrorHandler; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSMediaRule; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSRuleList; |
||||||
|
import org.w3c.dom.stylesheets.MediaList; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSMediaRule}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSMediaRuleImpl extends AbstractCSSRuleImpl implements CSSMediaRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 6603734096445214651L; |
||||||
|
|
||||||
|
private MediaList media_; |
||||||
|
private CSSRuleList cssRules_; |
||||||
|
|
||||||
|
public void setMedia(final MediaList media) { |
||||||
|
media_ = media; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssRules(final CSSRuleList cssRules) { |
||||||
|
cssRules_ = cssRules; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSMediaRuleImpl( |
||||||
|
final CSSStyleSheetImpl parentStyleSheet, |
||||||
|
final CSSRule parentRule, |
||||||
|
final MediaList media) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
media_ = media; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSMediaRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return MEDIA_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder("@media "); |
||||||
|
|
||||||
|
sb.append(((MediaListImpl) getMedia()).getMediaText(format)); |
||||||
|
sb.append(" {"); |
||||||
|
for (int i = 0; i < getCssRules().getLength(); i++) { |
||||||
|
final CSSRule rule = getCssRules().item(i); |
||||||
|
sb.append(rule.getCssText()).append(" "); |
||||||
|
} |
||||||
|
sb.append("}"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be a media rule
|
||||||
|
if (r.getType() == CSSRule.MEDIA_RULE) { |
||||||
|
media_ = ((CSSMediaRuleImpl) r).media_; |
||||||
|
cssRules_ = ((CSSMediaRuleImpl) r).cssRules_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_MEDIA_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public MediaList getMedia() { |
||||||
|
return media_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRuleList getCssRules() { |
||||||
|
if (cssRules_ == null) { |
||||||
|
cssRules_ = new CSSRuleListImpl(); |
||||||
|
} |
||||||
|
return cssRules_; |
||||||
|
} |
||||||
|
|
||||||
|
public int insertRule(final String rule, final int index) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(rule)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
parser.setParentStyleSheet(parentStyleSheet); |
||||||
|
parser.setErrorHandler(ThrowCssExceptionErrorHandler.INSTANCE); |
||||||
|
// parser._parentRule is never read
|
||||||
|
// parser.setParentRule(_parentRule);
|
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// Insert the rule into the list of rules
|
||||||
|
((CSSRuleListImpl) getCssRules()).insert(r, index); |
||||||
|
|
||||||
|
} |
||||||
|
catch (final IndexOutOfBoundsException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INDEX_SIZE_ERR, |
||||||
|
DOMExceptionImpl.INDEX_OUT_OF_BOUNDS, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
return index; |
||||||
|
} |
||||||
|
|
||||||
|
public void deleteRule(final int index) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
try { |
||||||
|
((CSSRuleListImpl) getCssRules()).delete(index); |
||||||
|
} |
||||||
|
catch (final IndexOutOfBoundsException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INDEX_SIZE_ERR, |
||||||
|
DOMExceptionImpl.INDEX_OUT_OF_BOUNDS, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setRuleList(final CSSRuleListImpl rules) { |
||||||
|
cssRules_ = rules; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSMediaRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSMediaRule cmr = (CSSMediaRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getMedia(), cmr.getMedia()) |
||||||
|
&& LangUtils.equals(getCssRules(), cmr.getCssRules()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, media_); |
||||||
|
hash = LangUtils.hashCode(hash, cssRules_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
private void writeObject(final ObjectOutputStream out) throws IOException { |
||||||
|
out.writeObject(cssRules_); |
||||||
|
out.writeObject(media_); |
||||||
|
} |
||||||
|
|
||||||
|
private void readObject(final ObjectInputStream in) |
||||||
|
throws IOException, ClassNotFoundException { |
||||||
|
|
||||||
|
cssRules_ = (CSSRuleList) in.readObject(); |
||||||
|
if (cssRules_ != null) { |
||||||
|
for (int i = 0; i < cssRules_.getLength(); i++) { |
||||||
|
final CSSRule cssRule = cssRules_.item(i); |
||||||
|
if (cssRule instanceof AbstractCSSRuleImpl) { |
||||||
|
((AbstractCSSRuleImpl) cssRule).setParentRule(this); |
||||||
|
((AbstractCSSRuleImpl) cssRule).setParentStyleSheet(getParentStyleSheetImpl()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
media_ = (MediaList) in.readObject(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author koch |
||||||
|
*/ |
||||||
|
public interface CSSOMObject { |
||||||
|
|
||||||
|
Object getUserData(String key); |
||||||
|
|
||||||
|
Object setUserData(String key, Object data); |
||||||
|
} |
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.Hashtable; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSOMObject}. |
||||||
|
* |
||||||
|
* @author koch |
||||||
|
*/ |
||||||
|
public class CSSOMObjectImpl implements CSSOMObject, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 0L; |
||||||
|
|
||||||
|
private Map<String, Object> userDataMap_; |
||||||
|
|
||||||
|
public Map<String, Object> getUserDataMap() { |
||||||
|
if (userDataMap_ == null) { |
||||||
|
userDataMap_ = new Hashtable<String, Object>(); |
||||||
|
} |
||||||
|
return userDataMap_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setUserDataMap(final Map<String, Object> userDataMap) { |
||||||
|
userDataMap_ = userDataMap; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSOMObjectImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public Object getUserData(final String key) { |
||||||
|
return getUserDataMap().get(key); |
||||||
|
} |
||||||
|
|
||||||
|
public Object setUserData(final String key, final Object data) { |
||||||
|
return getUserDataMap().put(key, data); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSOMObjectImpl)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSOMObjectImpl coi = (CSSOMObjectImpl) obj; |
||||||
|
return LangUtils.equals(userDataMap_, coi.userDataMap_); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = LangUtils.HASH_SEED; |
||||||
|
hash = LangUtils.hashCode(hash, userDataMap_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,172 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSPageRule; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSStyleDeclaration; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSPageRule}. |
||||||
|
* |
||||||
|
* TODO: Implement setSelectorText() |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSPageRuleImpl extends AbstractCSSRuleImpl implements CSSPageRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -6007519872104320812L; |
||||||
|
|
||||||
|
private String pseudoPage_; |
||||||
|
private CSSStyleDeclaration style_; |
||||||
|
|
||||||
|
public CSSPageRuleImpl( |
||||||
|
final CSSStyleSheetImpl parentStyleSheet, |
||||||
|
final CSSRule parentRule, |
||||||
|
final String pseudoPage) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
pseudoPage_ = pseudoPage; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSPageRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return PAGE_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
final String sel = getSelectorText(); |
||||||
|
sb.append("@page ").append(sel); |
||||||
|
|
||||||
|
if (sel.length() > 0) { |
||||||
|
sb.append(" "); |
||||||
|
} |
||||||
|
sb.append("{"); |
||||||
|
|
||||||
|
final CSSStyleDeclaration style = getStyle(); |
||||||
|
if (null != style) { |
||||||
|
sb.append(style.getCssText()); |
||||||
|
} |
||||||
|
sb.append("}"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be a page rule
|
||||||
|
if (r.getType() == CSSRule.PAGE_RULE) { |
||||||
|
pseudoPage_ = ((CSSPageRuleImpl) r).pseudoPage_; |
||||||
|
style_ = ((CSSPageRuleImpl) r).style_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_PAGE_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getSelectorText() { |
||||||
|
if (null == pseudoPage_) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return pseudoPage_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelectorText(final String selectorText) throws DOMException { |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleDeclaration getStyle() { |
||||||
|
return style_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setPseudoPage(final String pseudoPage) { |
||||||
|
pseudoPage_ = pseudoPage; |
||||||
|
} |
||||||
|
|
||||||
|
public void setStyle(final CSSStyleDeclarationImpl style) { |
||||||
|
style_ = style; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSPageRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSPageRule cpr = (CSSPageRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getSelectorText(), cpr.getSelectorText()) |
||||||
|
&& LangUtils.equals(getStyle(), cpr.getStyle()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, pseudoPage_); |
||||||
|
hash = LangUtils.hashCode(hash, style_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,141 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSRuleList; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSRuleList}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSRuleListImpl implements CSSRuleList, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -1269068897476453290L; |
||||||
|
|
||||||
|
private List<CSSRule> rules_; |
||||||
|
|
||||||
|
public List<CSSRule> getRules() { |
||||||
|
if (rules_ == null) { |
||||||
|
rules_ = new ArrayList<CSSRule>(); |
||||||
|
} |
||||||
|
return rules_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRules(final List<CSSRule> rules) { |
||||||
|
rules_ = rules; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRuleListImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public int getLength() { |
||||||
|
return getRules().size(); |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRule item(final int index) { |
||||||
|
if (index < 0 || null == rules_ || index >= rules_.size()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return rules_.get(index); |
||||||
|
} |
||||||
|
|
||||||
|
public void add(final CSSRule rule) { |
||||||
|
getRules().add(rule); |
||||||
|
} |
||||||
|
|
||||||
|
public void insert(final CSSRule rule, final int index) { |
||||||
|
getRules().add(index, rule); |
||||||
|
} |
||||||
|
|
||||||
|
public void delete(final int index) { |
||||||
|
getRules().remove(index); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < getLength(); i++) { |
||||||
|
if (i > 0) { |
||||||
|
sb.append("\r\n"); |
||||||
|
} |
||||||
|
|
||||||
|
final CSSRule rule = item(i); |
||||||
|
sb.append(((CSSFormatable) rule).getCssText(format)); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSRuleList)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSRuleList crl = (CSSRuleList) obj; |
||||||
|
return equalsRules(crl); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean equalsRules(final CSSRuleList crl) { |
||||||
|
if ((crl == null) || (getLength() != crl.getLength())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
for (int i = 0; i < getLength(); i++) { |
||||||
|
final CSSRule cssRule1 = item(i); |
||||||
|
final CSSRule cssRule2 = crl.item(i); |
||||||
|
if (!LangUtils.equals(cssRule1, cssRule2)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = LangUtils.HASH_SEED; |
||||||
|
hash = LangUtils.hashCode(hash, rules_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,196 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSStyleDeclaration; |
||||||
|
import org.w3c.dom.css.CSSStyleRule; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSStyleRule}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSStyleRuleImpl extends AbstractCSSRuleImpl implements CSSStyleRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -697009251364657426L; |
||||||
|
|
||||||
|
private SelectorList selectors_; |
||||||
|
private CSSStyleDeclaration style_; |
||||||
|
|
||||||
|
public SelectorList getSelectors() { |
||||||
|
return selectors_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelectors(final SelectorList selectors) { |
||||||
|
selectors_ = selectors; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleRuleImpl(final CSSStyleSheetImpl parentStyleSheet, |
||||||
|
final CSSRule parentRule, final SelectorList selectors) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
selectors_ = selectors; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return STYLE_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final CSSStyleDeclaration style = getStyle(); |
||||||
|
if (null == style) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
final String selectorText = ((CSSFormatable) selectors_).getCssText(format); |
||||||
|
final String styleText = ((CSSFormatable) style).getCssText(format); |
||||||
|
|
||||||
|
if (null == styleText || styleText.length() == 0) { |
||||||
|
return selectorText + " { }"; |
||||||
|
} |
||||||
|
|
||||||
|
if (format != null && format.getPropertiesInSeparateLines()) { |
||||||
|
return selectorText + " {" + styleText + "}"; |
||||||
|
} |
||||||
|
|
||||||
|
return selectorText + " { " + styleText + " }"; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be a style rule
|
||||||
|
if (r.getType() == CSSRule.STYLE_RULE) { |
||||||
|
selectors_ = ((CSSStyleRuleImpl) r).selectors_; |
||||||
|
style_ = ((CSSStyleRuleImpl) r).style_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_STYLE_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getSelectorText() { |
||||||
|
return selectors_.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelectorText(final String selectorText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(selectorText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
selectors_ = parser.parseSelectors(is); |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleDeclaration getStyle() { |
||||||
|
return style_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setStyle(final CSSStyleDeclaration style) { |
||||||
|
style_ = style; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSStyleRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSStyleRule csr = (CSSStyleRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getSelectorText(), csr.getSelectorText()) |
||||||
|
&& LangUtils.equals(getStyle(), csr.getStyle()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, selectors_); |
||||||
|
hash = LangUtils.hashCode(hash, style_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,411 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.ObjectInputStream; |
||||||
|
import java.io.ObjectOutputStream; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.io.StringReader; |
||||||
|
import java.net.URI; |
||||||
|
import java.net.URISyntaxException; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import com.fr.third.steadystate.css.util.ThrowCssExceptionErrorHandler; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.Node; |
||||||
|
import org.w3c.dom.css.CSSImportRule; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSRuleList; |
||||||
|
import org.w3c.dom.css.CSSStyleSheet; |
||||||
|
import org.w3c.dom.stylesheets.MediaList; |
||||||
|
import org.w3c.dom.stylesheets.StyleSheet; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSStyleSheet}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSStyleSheetImpl implements CSSStyleSheet, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -2300541300646796363L; |
||||||
|
|
||||||
|
private boolean disabled_; |
||||||
|
private Node ownerNode_; |
||||||
|
private StyleSheet parentStyleSheet_; |
||||||
|
private String href_; |
||||||
|
private String title_; |
||||||
|
private MediaList media_; |
||||||
|
private CSSRule ownerRule_; |
||||||
|
private boolean readOnly_; |
||||||
|
private CSSRuleList cssRules_; |
||||||
|
private String baseUri_; |
||||||
|
|
||||||
|
public void setMedia(final MediaList media) { |
||||||
|
media_ = media; |
||||||
|
} |
||||||
|
|
||||||
|
private String getBaseUri() { |
||||||
|
return baseUri_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setBaseUri(final String baseUri) { |
||||||
|
baseUri_ = baseUri; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSStyleSheetImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getType() { |
||||||
|
return "text/css"; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getDisabled() { |
||||||
|
return disabled_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* We will need to respond more fully if a stylesheet is disabled, probably |
||||||
|
* by generating an event for the main application. |
||||||
|
*/ |
||||||
|
public void setDisabled(final boolean disabled) { |
||||||
|
disabled_ = disabled; |
||||||
|
} |
||||||
|
|
||||||
|
public Node getOwnerNode() { |
||||||
|
return ownerNode_; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleSheet getParentStyleSheet() { |
||||||
|
return parentStyleSheet_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getHref() { |
||||||
|
return href_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTitle() { |
||||||
|
return title_; |
||||||
|
} |
||||||
|
|
||||||
|
public MediaList getMedia() { |
||||||
|
return media_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRule getOwnerRule() { |
||||||
|
return ownerRule_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRuleList getCssRules() { |
||||||
|
if (cssRules_ == null) { |
||||||
|
cssRules_ = new CSSRuleListImpl(); |
||||||
|
} |
||||||
|
return cssRules_; |
||||||
|
} |
||||||
|
|
||||||
|
public int insertRule(final String rule, final int index) throws DOMException { |
||||||
|
if (readOnly_) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(rule)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
parser.setParentStyleSheet(this); |
||||||
|
parser.setErrorHandler(ThrowCssExceptionErrorHandler.INSTANCE); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
if (r == null) { |
||||||
|
// this should neven happen because of the ThrowCssExceptionErrorHandler
|
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
"Parsing rule '" + rule + "' failed."); |
||||||
|
} |
||||||
|
|
||||||
|
if (getCssRules().getLength() > 0) { |
||||||
|
// We need to check that this type of rule can legally go into
|
||||||
|
// the requested position.
|
||||||
|
int msg = -1; |
||||||
|
if (r.getType() == CSSRule.CHARSET_RULE) { |
||||||
|
|
||||||
|
// Index must be 0, and there can be only one charset rule
|
||||||
|
if (index != 0) { |
||||||
|
msg = DOMExceptionImpl.CHARSET_NOT_FIRST; |
||||||
|
} |
||||||
|
else if (getCssRules().item(0).getType() == CSSRule.CHARSET_RULE) { |
||||||
|
msg = DOMExceptionImpl.CHARSET_NOT_UNIQUE; |
||||||
|
} |
||||||
|
} |
||||||
|
else if (r.getType() == CSSRule.IMPORT_RULE) { |
||||||
|
// Import rules must preceed all other rules (except
|
||||||
|
// charset rules)
|
||||||
|
if (index <= getCssRules().getLength()) { |
||||||
|
for (int i = 0; i < index; i++) { |
||||||
|
final int rt = getCssRules().item(i).getType(); |
||||||
|
if ((rt != CSSRule.CHARSET_RULE) && (rt != CSSRule.IMPORT_RULE)) { |
||||||
|
msg = DOMExceptionImpl.IMPORT_NOT_FIRST; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
if (index <= getCssRules().getLength()) { |
||||||
|
for (int i = index; i < getCssRules().getLength(); i++) { |
||||||
|
final int rt = getCssRules().item(i).getType(); |
||||||
|
if ((rt == CSSRule.CHARSET_RULE) || (rt == CSSRule.IMPORT_RULE)) { |
||||||
|
msg = DOMExceptionImpl.INSERT_BEFORE_IMPORT; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (msg > -1) { |
||||||
|
throw new DOMExceptionImpl(DOMException.HIERARCHY_REQUEST_ERR, msg); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Insert the rule into the list of rules
|
||||||
|
((CSSRuleListImpl) getCssRules()).insert(r, index); |
||||||
|
|
||||||
|
} |
||||||
|
catch (final IndexOutOfBoundsException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INDEX_SIZE_ERR, |
||||||
|
DOMExceptionImpl.INDEX_OUT_OF_BOUNDS, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
return index; |
||||||
|
} |
||||||
|
|
||||||
|
public void deleteRule(final int index) throws DOMException { |
||||||
|
if (readOnly_) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
((CSSRuleListImpl) getCssRules()).delete(index); |
||||||
|
} |
||||||
|
catch (final IndexOutOfBoundsException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INDEX_SIZE_ERR, |
||||||
|
DOMExceptionImpl.INDEX_OUT_OF_BOUNDS, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isReadOnly() { |
||||||
|
return readOnly_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadOnly(final boolean b) { |
||||||
|
readOnly_ = b; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOwnerNode(final Node ownerNode) { |
||||||
|
ownerNode_ = ownerNode; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentStyleSheet(final StyleSheet parentStyleSheet) { |
||||||
|
parentStyleSheet_ = parentStyleSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHref(final String href) { |
||||||
|
href_ = href; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTitle(final String title) { |
||||||
|
title_ = title; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMediaText(final String mediaText) { |
||||||
|
final InputSource source = new InputSource(new StringReader(mediaText)); |
||||||
|
try { |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final SACMediaList sml = parser.parseMedia(source); |
||||||
|
media_ = new MediaListImpl(sml); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
// TODO handle exception
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setOwnerRule(final CSSRule ownerRule) { |
||||||
|
ownerRule_ = ownerRule; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssRules(final CSSRuleList rules) { |
||||||
|
cssRules_ = rules; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final CSSRuleList rules = getCssRules(); |
||||||
|
if (rules instanceof CSSFormatable) { |
||||||
|
return ((CSSRuleListImpl) rules).getCssText(format); |
||||||
|
} |
||||||
|
return getCssRules().toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSStyleSheet)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSStyleSheet css = (CSSStyleSheet) obj; |
||||||
|
boolean eq = LangUtils.equals(getCssRules(), css.getCssRules()); |
||||||
|
eq = eq && (getDisabled() == css.getDisabled()); |
||||||
|
eq = eq && LangUtils.equals(getHref(), css.getHref()); |
||||||
|
eq = eq && LangUtils.equals(getMedia(), css.getMedia()); |
||||||
|
// TODO implement some reasonful equals method for ownerNode
|
||||||
|
// eq = eq && Utils.equals(getOwnerNode(), css.getOwnerNode());
|
||||||
|
// don't use ownerNode and parentStyleSheet in equals()
|
||||||
|
// recursive loop -> stack overflow!
|
||||||
|
eq = eq && LangUtils.equals(getTitle(), css.getTitle()); |
||||||
|
return eq; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = LangUtils.HASH_SEED; |
||||||
|
hash = LangUtils.hashCode(hash, baseUri_); |
||||||
|
hash = LangUtils.hashCode(hash, cssRules_); |
||||||
|
hash = LangUtils.hashCode(hash, disabled_); |
||||||
|
hash = LangUtils.hashCode(hash, href_); |
||||||
|
hash = LangUtils.hashCode(hash, media_); |
||||||
|
hash = LangUtils.hashCode(hash, ownerNode_); |
||||||
|
// don't use ownerNode and parentStyleSheet in hashCode()
|
||||||
|
// recursive loop -> stack overflow!
|
||||||
|
hash = LangUtils.hashCode(hash, readOnly_); |
||||||
|
hash = LangUtils.hashCode(hash, title_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
private void writeObject(final ObjectOutputStream out) throws IOException { |
||||||
|
out.writeObject(baseUri_); |
||||||
|
out.writeObject(cssRules_); |
||||||
|
out.writeBoolean(disabled_); |
||||||
|
out.writeObject(href_); |
||||||
|
out.writeObject(media_); |
||||||
|
// TODO ownerNode may not be serializable!
|
||||||
|
// out.writeObject(ownerNode);
|
||||||
|
out.writeBoolean(readOnly_); |
||||||
|
out.writeObject(title_); |
||||||
|
} |
||||||
|
|
||||||
|
private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException { |
||||||
|
baseUri_ = (String) in.readObject(); |
||||||
|
cssRules_ = (CSSRuleList) in.readObject(); |
||||||
|
if (cssRules_ != null) { |
||||||
|
for (int i = 0; i < cssRules_.getLength(); i++) { |
||||||
|
final CSSRule cssRule = cssRules_.item(i); |
||||||
|
if (cssRule instanceof AbstractCSSRuleImpl) { |
||||||
|
((AbstractCSSRuleImpl) cssRule).setParentStyleSheet(this); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
disabled_ = in.readBoolean(); |
||||||
|
href_ = (String) in.readObject(); |
||||||
|
media_ = (MediaList) in.readObject(); |
||||||
|
// TODO ownerNode may not be serializable!
|
||||||
|
// ownerNode = (Node) in.readObject();
|
||||||
|
readOnly_ = in.readBoolean(); |
||||||
|
title_ = (String) in.readObject(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Imports referenced CSSStyleSheets. |
||||||
|
* |
||||||
|
* @param recursive <code>true</code> if the import should be done |
||||||
|
* recursively, <code>false</code> otherwise |
||||||
|
*/ |
||||||
|
public void importImports(final boolean recursive) throws DOMException { |
||||||
|
for (int i = 0; i < getCssRules().getLength(); i++) { |
||||||
|
final CSSRule cssRule = getCssRules().item(i); |
||||||
|
if (cssRule.getType() == CSSRule.IMPORT_RULE) { |
||||||
|
final CSSImportRule cssImportRule = (CSSImportRule) cssRule; |
||||||
|
try { |
||||||
|
final URI importURI = new URI(getBaseUri()).resolve(cssImportRule.getHref()); |
||||||
|
final CSSStyleSheetImpl importedCSS = (CSSStyleSheetImpl) |
||||||
|
new CSSOMParser().parseStyleSheet(new InputSource( |
||||||
|
importURI.toString()), null, importURI.toString()); |
||||||
|
if (recursive) { |
||||||
|
importedCSS.importImports(recursive); |
||||||
|
} |
||||||
|
final MediaList mediaList = cssImportRule.getMedia(); |
||||||
|
if (mediaList.getLength() == 0) { |
||||||
|
mediaList.appendMedium("all"); |
||||||
|
} |
||||||
|
final CSSMediaRuleImpl cssMediaRule = new CSSMediaRuleImpl(this, null, mediaList); |
||||||
|
cssMediaRule.setRuleList((CSSRuleListImpl) importedCSS.getCssRules()); |
||||||
|
deleteRule(i); |
||||||
|
((CSSRuleListImpl) getCssRules()).insert(cssMediaRule, i); |
||||||
|
} |
||||||
|
catch (final URISyntaxException e) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, e.getLocalizedMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
// TODO handle exception
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,126 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
import org.w3c.dom.css.CSSStyleSheet; |
||||||
|
|
||||||
|
import org.w3c.dom.stylesheets.StyleSheet; |
||||||
|
import org.w3c.dom.stylesheets.StyleSheetList; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link StyleSheetList}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:waldbaer@users.sourceforge.net">Johannes Koch</a> |
||||||
|
*/ |
||||||
|
public class CSSStyleSheetListImpl implements StyleSheetList { |
||||||
|
private List<CSSStyleSheet> cssStyleSheets_; |
||||||
|
|
||||||
|
public List<CSSStyleSheet> getCSSStyleSheets() { |
||||||
|
if (cssStyleSheets_ == null) { |
||||||
|
cssStyleSheets_ = new ArrayList<CSSStyleSheet>(); |
||||||
|
} |
||||||
|
return cssStyleSheets_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCSSStyleSheets(final List<CSSStyleSheet> cssStyleSheets) { |
||||||
|
cssStyleSheets_ = cssStyleSheets; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new instance of CSSStyleSheetListImpl |
||||||
|
*/ |
||||||
|
public CSSStyleSheetListImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
// start StyleSheetList
|
||||||
|
public int getLength() { |
||||||
|
return getCSSStyleSheets().size(); |
||||||
|
} |
||||||
|
|
||||||
|
public StyleSheet item(final int index) { |
||||||
|
return getCSSStyleSheets().get(index); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Adds a CSSStyleSheet. |
||||||
|
* |
||||||
|
* @param cssStyleSheet the CSSStyleSheet |
||||||
|
*/ |
||||||
|
public void add(final CSSStyleSheet cssStyleSheet) { |
||||||
|
getCSSStyleSheets().add(cssStyleSheet); |
||||||
|
} |
||||||
|
// end StyleSheetList
|
||||||
|
|
||||||
|
/** |
||||||
|
* Merges all StyleSheets in this list into one. |
||||||
|
* |
||||||
|
* @return the new (merged) StyleSheet |
||||||
|
*/ |
||||||
|
public StyleSheet merge() { |
||||||
|
final CSSStyleSheetImpl merged = new CSSStyleSheetImpl(); |
||||||
|
final CSSRuleListImpl cssRuleList = new CSSRuleListImpl(); |
||||||
|
final Iterator<CSSStyleSheet> it = getCSSStyleSheets().iterator(); |
||||||
|
while (it.hasNext()) { |
||||||
|
final CSSStyleSheetImpl cssStyleSheet = (CSSStyleSheetImpl) it.next(); |
||||||
|
final CSSMediaRuleImpl cssMediaRule = new CSSMediaRuleImpl(merged, null, cssStyleSheet.getMedia()); |
||||||
|
cssMediaRule.setRuleList((CSSRuleListImpl) cssStyleSheet.getCssRules()); |
||||||
|
cssRuleList.add(cssMediaRule); |
||||||
|
} |
||||||
|
merged.setCssRules(cssRuleList); |
||||||
|
merged.setMediaText("all"); |
||||||
|
return merged; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof StyleSheetList)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final StyleSheetList ssl = (StyleSheetList) obj; |
||||||
|
return equalsStyleSheets(ssl); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean equalsStyleSheets(final StyleSheetList ssl) { |
||||||
|
if ((ssl == null) || (getLength() != ssl.getLength())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
for (int i = 0; i < getLength(); i++) { |
||||||
|
final StyleSheet styleSheet1 = item(i); |
||||||
|
final StyleSheet styleSheet2 = ssl.item(i); |
||||||
|
if (!LangUtils.equals(styleSheet1, styleSheet2)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = LangUtils.HASH_SEED; |
||||||
|
hash = LangUtils.hashCode(hash, cssStyleSheets_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,140 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSUnknownRule; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link CSSUnknownRule}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSUnknownRuleImpl extends AbstractCSSRuleImpl implements CSSUnknownRule { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -268104019127675990L; |
||||||
|
|
||||||
|
private String text_; |
||||||
|
|
||||||
|
public String getText() { |
||||||
|
return text_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setText(final String text) { |
||||||
|
text_ = text; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSUnknownRuleImpl( |
||||||
|
final CSSStyleSheetImpl parentStyleSheet, |
||||||
|
final CSSRule parentRule, |
||||||
|
final String text) { |
||||||
|
super(parentStyleSheet, parentRule); |
||||||
|
text_ = text; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSUnknownRuleImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public short getType() { |
||||||
|
return UNKNOWN_RULE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
if (null == text_) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return text_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
final CSSStyleSheetImpl parentStyleSheet = getParentStyleSheetImpl(); |
||||||
|
if (parentStyleSheet != null && parentStyleSheet.isReadOnly()) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NO_MODIFICATION_ALLOWED_ERR, |
||||||
|
DOMExceptionImpl.READ_ONLY_STYLE_SHEET); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSRule r = parser.parseRule(is); |
||||||
|
|
||||||
|
// The rule must be an unknown rule
|
||||||
|
if (r.getType() == CSSRule.UNKNOWN_RULE) { |
||||||
|
text_ = ((CSSUnknownRuleImpl) r).text_; |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_MODIFICATION_ERR, |
||||||
|
DOMExceptionImpl.EXPECTING_FONT_FACE_RULE); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final CSSException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSUnknownRule)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSUnknownRule cur = (CSSUnknownRule) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& LangUtils.equals(getCssText(), cur.getCssText()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, text_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,431 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.StringReader; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import com.fr.third.steadystate.css.parser.LexicalUnitImpl; |
||||||
|
import com.fr.third.steadystate.css.userdata.UserDataConstants; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSPrimitiveValue; |
||||||
|
import org.w3c.dom.css.CSSValue; |
||||||
|
import org.w3c.dom.css.CSSValueList; |
||||||
|
import org.w3c.dom.css.Counter; |
||||||
|
import org.w3c.dom.css.RGBColor; |
||||||
|
import org.w3c.dom.css.Rect; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* The <code>CSSValueImpl</code> class can represent either a |
||||||
|
* <code>CSSPrimitiveValue</code> or a <code>CSSValueList</code> so that |
||||||
|
* the type can successfully change when using <code>setCssText</code>. |
||||||
|
* |
||||||
|
* TODO: |
||||||
|
* Float unit conversions, |
||||||
|
* A means of checking valid primitive types for properties |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSValueImpl extends CSSOMObjectImpl implements CSSPrimitiveValue, CSSValueList, CSSFormatable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 406281136418322579L; |
||||||
|
|
||||||
|
private Object value_; |
||||||
|
|
||||||
|
public Object getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final Object value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor |
||||||
|
*/ |
||||||
|
public CSSValueImpl(final LexicalUnit value, final boolean forcePrimitive) { |
||||||
|
LexicalUnit parameters = null; |
||||||
|
try { |
||||||
|
parameters = value.getParameters(); |
||||||
|
} |
||||||
|
catch (final IllegalStateException e) { |
||||||
|
// Batik SAC parser throws IllegalStateException in some cases
|
||||||
|
} |
||||||
|
|
||||||
|
if (!forcePrimitive && (value.getNextLexicalUnit() != null)) { |
||||||
|
value_ = getValues(value); |
||||||
|
} |
||||||
|
else if (parameters != null) { |
||||||
|
if (value.getLexicalUnitType() == LexicalUnit.SAC_RECT_FUNCTION) { |
||||||
|
// Rect
|
||||||
|
value_ = new RectImpl(value.getParameters()); |
||||||
|
} |
||||||
|
else if (value.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR) { |
||||||
|
// RGBColor
|
||||||
|
value_ = new RGBColorImpl(value.getParameters()); |
||||||
|
} |
||||||
|
else if (value.getLexicalUnitType() == LexicalUnit.SAC_COUNTER_FUNCTION) { |
||||||
|
// Counter
|
||||||
|
value_ = new CounterImpl(false, value.getParameters()); |
||||||
|
} |
||||||
|
else if (value.getLexicalUnitType() == LexicalUnit.SAC_COUNTERS_FUNCTION) { |
||||||
|
// Counter
|
||||||
|
value_ = new CounterImpl(true, value.getParameters()); |
||||||
|
} |
||||||
|
else { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
// We need to be a CSSPrimitiveValue
|
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
if (value instanceof LexicalUnitImpl) { |
||||||
|
final Locator locator = ((LexicalUnitImpl) value).getLocator(); |
||||||
|
if (locator != null) { |
||||||
|
setUserData(UserDataConstants.KEY_LOCATOR, locator); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public CSSValueImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
private List<CSSValueImpl> getValues(final LexicalUnit value) { |
||||||
|
final List<CSSValueImpl> values = new ArrayList<CSSValueImpl>(); |
||||||
|
LexicalUnit lu = value; |
||||||
|
while (lu != null) { |
||||||
|
values.add(new CSSValueImpl(lu, true)); |
||||||
|
lu = lu.getNextLexicalUnit(); |
||||||
|
} |
||||||
|
return values; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSValueImpl(final LexicalUnit value) { |
||||||
|
this(value, false); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
if (getCssValueType() == CSS_VALUE_LIST) { |
||||||
|
|
||||||
|
// Create the string from the LexicalUnits so we include the correct
|
||||||
|
// operators in the string
|
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
final List<?> list = (List<?>) value_; |
||||||
|
final Iterator<?> it = list.iterator(); |
||||||
|
|
||||||
|
boolean separate = false; |
||||||
|
while (it.hasNext()) { |
||||||
|
final Object o = it.next(); |
||||||
|
|
||||||
|
final CSSValueImpl cssValue = (CSSValueImpl) o; |
||||||
|
if (separate) { |
||||||
|
if (cssValue.value_ instanceof LexicalUnit) { |
||||||
|
final LexicalUnit lu = (LexicalUnit) cssValue.value_; |
||||||
|
if (lu.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
sb.append(" "); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
sb.append(" "); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (cssValue.value_ instanceof CSSFormatable) { |
||||||
|
sb.append(((CSSFormatable) o).getCssText(format)); |
||||||
|
} |
||||||
|
else { |
||||||
|
sb.append(o.toString()); |
||||||
|
} |
||||||
|
separate = true; |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
if (value_ instanceof CSSFormatable) { |
||||||
|
return ((CSSFormatable) value_).getCssText(format); |
||||||
|
} |
||||||
|
return value_ != null ? value_.toString() : ""; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCssText(final String cssText) throws DOMException { |
||||||
|
try { |
||||||
|
final InputSource is = new InputSource(new StringReader(cssText)); |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
final CSSValueImpl v2 = (CSSValueImpl) parser.parsePropertyValue(is); |
||||||
|
value_ = v2.value_; |
||||||
|
setUserDataMap(v2.getUserDataMap()); |
||||||
|
} |
||||||
|
catch (final Exception e) { |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.SYNTAX_ERR, |
||||||
|
DOMExceptionImpl.SYNTAX_ERROR, |
||||||
|
e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public short getCssValueType() { |
||||||
|
if (value_ instanceof List) { |
||||||
|
return CSS_VALUE_LIST; |
||||||
|
} |
||||||
|
if ((value_ instanceof LexicalUnit) |
||||||
|
&& (((LexicalUnit) value_).getLexicalUnitType() == LexicalUnit.SAC_INHERIT)) { |
||||||
|
return CSS_INHERIT; |
||||||
|
} |
||||||
|
return CSS_PRIMITIVE_VALUE; |
||||||
|
} |
||||||
|
|
||||||
|
public short getPrimitiveType() { |
||||||
|
if (value_ instanceof LexicalUnit) { |
||||||
|
final LexicalUnit lu = (LexicalUnit) value_; |
||||||
|
switch (lu.getLexicalUnitType()) { |
||||||
|
case LexicalUnit.SAC_INHERIT: |
||||||
|
return CSS_IDENT; |
||||||
|
case LexicalUnit.SAC_INTEGER: |
||||||
|
case LexicalUnit.SAC_REAL: |
||||||
|
return CSS_NUMBER; |
||||||
|
case LexicalUnit.SAC_EM: |
||||||
|
return CSS_EMS; |
||||||
|
case LexicalUnit.SAC_EX: |
||||||
|
return CSS_EXS; |
||||||
|
case LexicalUnit.SAC_PIXEL: |
||||||
|
return CSS_PX; |
||||||
|
case LexicalUnit.SAC_INCH: |
||||||
|
return CSS_IN; |
||||||
|
case LexicalUnit.SAC_CENTIMETER: |
||||||
|
return CSS_CM; |
||||||
|
case LexicalUnit.SAC_MILLIMETER: |
||||||
|
return CSS_MM; |
||||||
|
case LexicalUnit.SAC_POINT: |
||||||
|
return CSS_PT; |
||||||
|
case LexicalUnit.SAC_PICA: |
||||||
|
return CSS_PC; |
||||||
|
case LexicalUnit.SAC_PERCENTAGE: |
||||||
|
return CSS_PERCENTAGE; |
||||||
|
case LexicalUnit.SAC_URI: |
||||||
|
return CSS_URI; |
||||||
|
case LexicalUnit.SAC_COUNTER_FUNCTION: |
||||||
|
// case LexicalUnit.SAC_COUNTERS_FUNCTION:
|
||||||
|
return CSS_COUNTER; |
||||||
|
// case LexicalUnit.SAC_RGBCOLOR:
|
||||||
|
// return CSS_RGBCOLOR;
|
||||||
|
case LexicalUnit.SAC_DEGREE: |
||||||
|
return CSS_DEG; |
||||||
|
case LexicalUnit.SAC_GRADIAN: |
||||||
|
return CSS_GRAD; |
||||||
|
case LexicalUnit.SAC_RADIAN: |
||||||
|
return CSS_RAD; |
||||||
|
case LexicalUnit.SAC_MILLISECOND: |
||||||
|
return CSS_MS; |
||||||
|
case LexicalUnit.SAC_SECOND: |
||||||
|
return CSS_S; |
||||||
|
case LexicalUnit.SAC_HERTZ: |
||||||
|
return CSS_HZ; |
||||||
|
case LexicalUnit.SAC_KILOHERTZ: |
||||||
|
return CSS_KHZ; |
||||||
|
case LexicalUnit.SAC_IDENT: |
||||||
|
return CSS_IDENT; |
||||||
|
case LexicalUnit.SAC_STRING_VALUE: |
||||||
|
return CSS_STRING; |
||||||
|
case LexicalUnit.SAC_ATTR: |
||||||
|
return CSS_ATTR; |
||||||
|
// case LexicalUnit.SAC_RECT_FUNCTION:
|
||||||
|
// return CSS_RECT;
|
||||||
|
case LexicalUnit.SAC_UNICODERANGE: |
||||||
|
case LexicalUnit.SAC_SUB_EXPRESSION: |
||||||
|
case LexicalUnit.SAC_FUNCTION: |
||||||
|
return CSS_STRING; |
||||||
|
case LexicalUnit.SAC_DIMENSION: |
||||||
|
return CSS_DIMENSION; |
||||||
|
default: |
||||||
|
return CSS_UNKNOWN; |
||||||
|
} |
||||||
|
} |
||||||
|
else if (value_ instanceof RectImpl) { |
||||||
|
return CSS_RECT; |
||||||
|
} |
||||||
|
else if (value_ instanceof RGBColorImpl) { |
||||||
|
return CSS_RGBCOLOR; |
||||||
|
} |
||||||
|
else if (value_ instanceof CounterImpl) { |
||||||
|
return CSS_COUNTER; |
||||||
|
} |
||||||
|
return CSS_UNKNOWN; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFloatValue(final short unitType, final float floatValue) throws DOMException { |
||||||
|
value_ = LexicalUnitImpl.createNumber(null, floatValue); |
||||||
|
} |
||||||
|
|
||||||
|
public float getFloatValue(final short unitType) throws DOMException { |
||||||
|
if (value_ instanceof LexicalUnit) { |
||||||
|
final LexicalUnit lu = (LexicalUnit) value_; |
||||||
|
return lu.getFloatValue(); |
||||||
|
} |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_ACCESS_ERR, |
||||||
|
DOMExceptionImpl.FLOAT_ERROR); |
||||||
|
|
||||||
|
// We need to attempt a conversion
|
||||||
|
// return 0;
|
||||||
|
} |
||||||
|
|
||||||
|
public void setStringValue(final short stringType, final String stringValue) throws DOMException { |
||||||
|
switch (stringType) { |
||||||
|
case CSS_STRING: |
||||||
|
value_ = LexicalUnitImpl.createString(null, stringValue); |
||||||
|
break; |
||||||
|
case CSS_URI: |
||||||
|
value_ = LexicalUnitImpl.createURI(null, stringValue); |
||||||
|
break; |
||||||
|
case CSS_IDENT: |
||||||
|
value_ = LexicalUnitImpl.createIdent(null, stringValue); |
||||||
|
break; |
||||||
|
case CSS_ATTR: |
||||||
|
// _value = LexicalUnitImpl.createAttr(null, stringValue);
|
||||||
|
// break;
|
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.NOT_SUPPORTED_ERR, |
||||||
|
DOMExceptionImpl.NOT_IMPLEMENTED); |
||||||
|
default: |
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_ACCESS_ERR, |
||||||
|
DOMExceptionImpl.STRING_ERROR); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* TODO: return a value for a list type |
||||||
|
*/ |
||||||
|
public String getStringValue() throws DOMException { |
||||||
|
if (value_ instanceof LexicalUnit) { |
||||||
|
final LexicalUnit lu = (LexicalUnit) value_; |
||||||
|
if ((lu.getLexicalUnitType() == LexicalUnit.SAC_IDENT) |
||||||
|
|| (lu.getLexicalUnitType() == LexicalUnit.SAC_STRING_VALUE) |
||||||
|
|| (lu.getLexicalUnitType() == LexicalUnit.SAC_URI) |
||||||
|
|| (lu.getLexicalUnitType() == LexicalUnit.SAC_INHERIT) |
||||||
|
|| (lu.getLexicalUnitType() == LexicalUnit.SAC_ATTR)) { |
||||||
|
return lu.getStringValue(); |
||||||
|
} |
||||||
|
|
||||||
|
// for rgba values we are using this type
|
||||||
|
if (lu.getLexicalUnitType() == LexicalUnit.SAC_FUNCTION) { |
||||||
|
return lu.toString(); |
||||||
|
} |
||||||
|
} |
||||||
|
else if (value_ instanceof List) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_ACCESS_ERR, |
||||||
|
DOMExceptionImpl.STRING_ERROR); |
||||||
|
} |
||||||
|
|
||||||
|
public Counter getCounterValue() throws DOMException { |
||||||
|
if (value_ instanceof Counter) { |
||||||
|
return (Counter) value_; |
||||||
|
} |
||||||
|
|
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_ACCESS_ERR, |
||||||
|
DOMExceptionImpl.COUNTER_ERROR); |
||||||
|
} |
||||||
|
|
||||||
|
public Rect getRectValue() throws DOMException { |
||||||
|
if (value_ instanceof Rect) { |
||||||
|
return (Rect) value_; |
||||||
|
} |
||||||
|
|
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_ACCESS_ERR, |
||||||
|
DOMExceptionImpl.RECT_ERROR); |
||||||
|
} |
||||||
|
|
||||||
|
public RGBColor getRGBColorValue() throws DOMException { |
||||||
|
if (value_ instanceof RGBColor) { |
||||||
|
return (RGBColor) value_; |
||||||
|
} |
||||||
|
|
||||||
|
throw new DOMExceptionImpl( |
||||||
|
DOMException.INVALID_ACCESS_ERR, |
||||||
|
DOMExceptionImpl.RGBCOLOR_ERROR); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public int getLength() { |
||||||
|
if (value_ instanceof List) { |
||||||
|
return ((List<CSSValue>) value_).size(); |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public CSSValue item(final int index) { |
||||||
|
if (value_ instanceof List) { |
||||||
|
final List<CSSValue> list = (List<CSSValue>) value_; |
||||||
|
return list.get(index); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof CSSValue)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final CSSValue cv = (CSSValue) obj; |
||||||
|
// TODO to be improved!
|
||||||
|
return super.equals(obj) |
||||||
|
&& (getCssValueType() == cv.getCssValueType()) |
||||||
|
&& LangUtils.equals(getCssText(), cv.getCssText()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, value_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,144 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.Counter; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link Counter}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CounterImpl implements Counter, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7996279151817598904L; |
||||||
|
|
||||||
|
private String identifier_; |
||||||
|
private String listStyle_; |
||||||
|
private String separator_; |
||||||
|
|
||||||
|
public void setIdentifier(final String identifier) { |
||||||
|
identifier_ = identifier; |
||||||
|
} |
||||||
|
|
||||||
|
public void setListStyle(final String listStyle) { |
||||||
|
listStyle_ = listStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSeparator(final String separator) { |
||||||
|
separator_ = separator; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates new CounterImpl |
||||||
|
*/ |
||||||
|
public CounterImpl(final boolean separatorSpecified, final LexicalUnit lu) throws DOMException { |
||||||
|
LexicalUnit next = lu; |
||||||
|
identifier_ = next.getStringValue(); |
||||||
|
next = next.getNextLexicalUnit(); // ','
|
||||||
|
if (next != null) { |
||||||
|
if (next.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
// error
|
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"Counter parameters must be separated by ','."); |
||||||
|
} |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (separatorSpecified && (next != null)) { |
||||||
|
separator_ = next.getStringValue(); |
||||||
|
next = next.getNextLexicalUnit(); // ','
|
||||||
|
if (next != null) { |
||||||
|
if (next.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
// error
|
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"Counter parameters must be separated by ','."); |
||||||
|
} |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
} |
||||||
|
} |
||||||
|
if (next != null) { |
||||||
|
listStyle_ = next.getStringValue(); |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next != null) { |
||||||
|
// error
|
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"Too many parameters for counter function."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public CounterImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getIdentifier() { |
||||||
|
return identifier_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getListStyle() { |
||||||
|
return listStyle_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSeparator() { |
||||||
|
return separator_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
if (separator_ == null) { |
||||||
|
// This is a 'counter()' function
|
||||||
|
sb.append("counter("); |
||||||
|
} |
||||||
|
else { |
||||||
|
// This is a 'counters()' function
|
||||||
|
sb.append("counters("); |
||||||
|
} |
||||||
|
sb.append(identifier_); |
||||||
|
if (separator_ != null) { |
||||||
|
sb.append(", \"").append(separator_).append("\""); |
||||||
|
} |
||||||
|
if (listStyle_ != null) { |
||||||
|
sb.append(", ").append(listStyle_); |
||||||
|
} |
||||||
|
sb.append(")"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
|
||||||
|
import java.util.Locale; |
||||||
|
import java.util.ResourceBundle; |
||||||
|
|
||||||
|
/** |
||||||
|
* Custom {@link DOMException} extension. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class DOMExceptionImpl extends DOMException { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7365733663951145145L; |
||||||
|
|
||||||
|
public static final int SYNTAX_ERROR = 0; |
||||||
|
public static final int INDEX_OUT_OF_BOUNDS = 1; |
||||||
|
public static final int READ_ONLY_STYLE_SHEET = 2; |
||||||
|
public static final int EXPECTING_UNKNOWN_RULE = 3; |
||||||
|
public static final int EXPECTING_STYLE_RULE = 4; |
||||||
|
public static final int EXPECTING_CHARSET_RULE = 5; |
||||||
|
public static final int EXPECTING_IMPORT_RULE = 6; |
||||||
|
public static final int EXPECTING_MEDIA_RULE = 7; |
||||||
|
public static final int EXPECTING_FONT_FACE_RULE = 8; |
||||||
|
public static final int EXPECTING_PAGE_RULE = 9; |
||||||
|
public static final int FLOAT_ERROR = 10; |
||||||
|
public static final int STRING_ERROR = 11; |
||||||
|
public static final int COUNTER_ERROR = 12; |
||||||
|
public static final int RECT_ERROR = 13; |
||||||
|
public static final int RGBCOLOR_ERROR = 14; |
||||||
|
public static final int CHARSET_NOT_FIRST = 15; |
||||||
|
public static final int CHARSET_NOT_UNIQUE = 16; |
||||||
|
public static final int IMPORT_NOT_FIRST = 17; |
||||||
|
public static final int NOT_FOUND = 18; |
||||||
|
public static final int NOT_IMPLEMENTED = 19; |
||||||
|
public static final int INSERT_BEFORE_IMPORT = 20; |
||||||
|
|
||||||
|
private static ResourceBundle ExceptionResource_ = |
||||||
|
ResourceBundle.getBundle( |
||||||
|
"com.fr.third.steadystate.css.parser.ExceptionResource", |
||||||
|
Locale.getDefault()); |
||||||
|
|
||||||
|
public DOMExceptionImpl(final short code, final int messageKey) { |
||||||
|
this(code, messageKey, null); |
||||||
|
} |
||||||
|
|
||||||
|
public DOMExceptionImpl(final int code, final int messageKey) { |
||||||
|
this(code, messageKey, null); |
||||||
|
} |
||||||
|
|
||||||
|
public DOMExceptionImpl(final int code, final int messageKey, final String info) { |
||||||
|
super((short) code, constructMessage(messageKey, info)); |
||||||
|
} |
||||||
|
|
||||||
|
private static String constructMessage(final int key, final String info) { |
||||||
|
final String messageKey = "s" + String.valueOf(key); |
||||||
|
String message = ExceptionResource_.getString(messageKey); |
||||||
|
if (null != info && info.length() > 0) { |
||||||
|
message = message + " (" + info + ")"; |
||||||
|
} |
||||||
|
return message; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,210 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.StringReader; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.CSSOMParser; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import com.fr.third.steadystate.css.parser.SACMediaListImpl; |
||||||
|
import com.fr.third.steadystate.css.userdata.UserDataConstants; |
||||||
|
import com.fr.third.steadystate.css.util.ThrowCssExceptionErrorHandler; |
||||||
|
import org.w3c.css.sac.CSSParseException; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.stylesheets.MediaList; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.media.MediaQuery; |
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implements {@link MediaList}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class MediaListImpl extends CSSOMObjectImpl implements MediaList { |
||||||
|
private static final long serialVersionUID = 6662784733573034870L; |
||||||
|
|
||||||
|
private List<MediaQuery> mediaQueries_; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates new MediaList. |
||||||
|
* @param mediaList the media list |
||||||
|
*/ |
||||||
|
public MediaListImpl(final SACMediaList mediaList) { |
||||||
|
this(); |
||||||
|
|
||||||
|
setMediaList(mediaList); |
||||||
|
|
||||||
|
if (mediaList instanceof Locatable) { |
||||||
|
final Locator locator = ((Locatable) mediaList).getLocator(); |
||||||
|
if (locator != null) { |
||||||
|
setUserData(UserDataConstants.KEY_LOCATOR, locator); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* The attributes are null. |
||||||
|
*/ |
||||||
|
public MediaListImpl() { |
||||||
|
mediaQueries_ = new ArrayList<MediaQuery>(10); |
||||||
|
} |
||||||
|
|
||||||
|
public String getMediaText() { |
||||||
|
return getMediaText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a string representation of the rule based on the given format. |
||||||
|
* If provided format is null, the result is the same as getCssText() |
||||||
|
* |
||||||
|
* @param format the formatting rules |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getMediaText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(""); |
||||||
|
boolean isNotFirst = false; |
||||||
|
for (MediaQuery mediaQuery : mediaQueries_) { |
||||||
|
if (isNotFirst) { |
||||||
|
sb.append(", "); |
||||||
|
} |
||||||
|
else { |
||||||
|
isNotFirst = true; |
||||||
|
} |
||||||
|
sb.append(mediaQuery.getCssText(format)); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setMediaText(final String mediaText) throws DOMException { |
||||||
|
final InputSource source = new InputSource(new StringReader(mediaText)); |
||||||
|
try { |
||||||
|
final CSSOMParser parser = new CSSOMParser(); |
||||||
|
parser.setErrorHandler(ThrowCssExceptionErrorHandler.INSTANCE); |
||||||
|
final SACMediaList sml = parser.parseMedia(source); |
||||||
|
setMediaList(sml); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, e.getLocalizedMessage()); |
||||||
|
} |
||||||
|
catch (final IOException e) { |
||||||
|
throw new DOMException(DOMException.NOT_FOUND_ERR, e.getLocalizedMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int getLength() { |
||||||
|
return mediaQueries_.size(); |
||||||
|
} |
||||||
|
|
||||||
|
public String item(final int index) { |
||||||
|
final MediaQuery mq = mediaQuery(index); |
||||||
|
if (null == mq) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
return mq.getMedia(); |
||||||
|
} |
||||||
|
|
||||||
|
public MediaQuery mediaQuery(final int index) { |
||||||
|
if (index < 0 || (index >= mediaQueries_.size())) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return mediaQueries_.get(index); |
||||||
|
} |
||||||
|
|
||||||
|
public void deleteMedium(final String oldMedium) throws DOMException { |
||||||
|
for (MediaQuery mediaQuery : mediaQueries_) { |
||||||
|
final String str = mediaQuery.getMedia(); |
||||||
|
if (str.equalsIgnoreCase(oldMedium)) { |
||||||
|
mediaQueries_.remove(mediaQuery); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
throw new DOMExceptionImpl(DOMException.NOT_FOUND_ERR, DOMExceptionImpl.NOT_FOUND); |
||||||
|
} |
||||||
|
|
||||||
|
public void appendMedium(final String newMedium) throws DOMException { |
||||||
|
mediaQueries_.add(new MediaQuery(newMedium)); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getMediaText(null); |
||||||
|
} |
||||||
|
|
||||||
|
public void setMedia(final List<String> media) { |
||||||
|
mediaQueries_.clear(); |
||||||
|
for (String medium : media) { |
||||||
|
mediaQueries_.add(new MediaQuery(medium)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void setMediaList(final SACMediaList mediaList) { |
||||||
|
if (mediaList instanceof SACMediaListImpl) { |
||||||
|
final SACMediaListImpl impl = (SACMediaListImpl) mediaList; |
||||||
|
for (int i = 0; i < mediaList.getLength(); i++) { |
||||||
|
mediaQueries_.add(impl.mediaQuery(i)); |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
for (int i = 0; i < mediaList.getLength(); i++) { |
||||||
|
mediaQueries_.add(new MediaQuery(mediaList.item(i))); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private boolean equalsMedia(final MediaList ml) { |
||||||
|
if ((ml == null) || (getLength() != ml.getLength())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
for (int i = 0; i < getLength(); i++) { |
||||||
|
final String m1 = item(i); |
||||||
|
final String m2 = ml.item(i); |
||||||
|
if (!LangUtils.equals(m1, m2)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof MediaList)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final MediaList ml = (MediaList) obj; |
||||||
|
return super.equals(obj) && equalsMedia(ml); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, mediaQueries_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,165 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.dom.css.CSSValue; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class Property extends CSSOMObjectImpl implements CSSFormatable { |
||||||
|
private static final long serialVersionUID = 8720637891949104989L; |
||||||
|
|
||||||
|
private String name_; |
||||||
|
private CSSValue value_; |
||||||
|
private boolean important_; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates new Property. |
||||||
|
* @param name the name |
||||||
|
* @param value the value |
||||||
|
* @param important true if the important flag set |
||||||
|
*/ |
||||||
|
public Property(final String name, final CSSValue value, final boolean important) { |
||||||
|
name_ = name; |
||||||
|
value_ = value; |
||||||
|
important_ = important; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* The attributes are null. |
||||||
|
*/ |
||||||
|
public Property() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the name. |
||||||
|
* @return the name |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
return name_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the name to a new value. |
||||||
|
* @param name the new name |
||||||
|
*/ |
||||||
|
public void setName(final String name) { |
||||||
|
name_ = name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the value. |
||||||
|
* @return the value |
||||||
|
*/ |
||||||
|
public CSSValue getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns true if the important flag is set. |
||||||
|
* @return true or false |
||||||
|
*/ |
||||||
|
public boolean isImportant() { |
||||||
|
return important_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the value to a new value. |
||||||
|
* @param value the new CSSValue |
||||||
|
*/ |
||||||
|
public void setValue(final CSSValue value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the important flag to a new value. |
||||||
|
* @param important the new flag value |
||||||
|
*/ |
||||||
|
public void setImportant(final boolean important) { |
||||||
|
important_ = important; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(name_); |
||||||
|
if (null != value_) { |
||||||
|
sb.append(": "); |
||||||
|
sb.append(((CSSValueImpl) value_).getCssText(format)); |
||||||
|
} |
||||||
|
if (important_) { |
||||||
|
sb.append(" !important"); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof Property)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final Property p = (Property) obj; |
||||||
|
return super.equals(obj) |
||||||
|
&& (important_ == p.important_) |
||||||
|
&& LangUtils.equals(name_, p.name_) |
||||||
|
&& LangUtils.equals(value_, p.value_); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = super.hashCode(); |
||||||
|
hash = LangUtils.hashCode(hash, important_); |
||||||
|
hash = LangUtils.hashCode(hash, name_); |
||||||
|
hash = LangUtils.hashCode(hash, value_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,178 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSPrimitiveValue; |
||||||
|
import org.w3c.dom.css.RGBColor; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link RGBColor}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class RGBColorImpl implements RGBColor, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 8152675334081993160L; |
||||||
|
private CSSPrimitiveValue red_; |
||||||
|
private CSSPrimitiveValue green_; |
||||||
|
private CSSPrimitiveValue blue_; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor that reads the values from the given |
||||||
|
* chain of LexicalUnits. |
||||||
|
* @param lu the values |
||||||
|
* @throws DOMException in case of error |
||||||
|
*/ |
||||||
|
public RGBColorImpl(final LexicalUnit lu) throws DOMException { |
||||||
|
LexicalUnit next = lu; |
||||||
|
red_ = new CSSValueImpl(next, true); |
||||||
|
next = next.getNextLexicalUnit(); // ,
|
||||||
|
if (next != null) { |
||||||
|
if (next.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
// error
|
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"rgb parameters must be separated by ','."); |
||||||
|
} |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next != null) { |
||||||
|
green_ = new CSSValueImpl(next, true); |
||||||
|
next = next.getNextLexicalUnit(); // ,
|
||||||
|
if (next != null) { |
||||||
|
if (next.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
// error
|
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"rgb parameters must be separated by ','."); |
||||||
|
} |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
blue_ = new CSSValueImpl(next, true); |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next != null) { |
||||||
|
// error
|
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"Too many parameters for rgb function."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* The values for the colors are null. |
||||||
|
*/ |
||||||
|
public RGBColorImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the red part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getRed() { |
||||||
|
return red_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the red part to a new value. |
||||||
|
* @param red the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setRed(final CSSPrimitiveValue red) { |
||||||
|
red_ = red; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the green part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getGreen() { |
||||||
|
return green_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the green part to a new value. |
||||||
|
* @param green the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setGreen(final CSSPrimitiveValue green) { |
||||||
|
green_ = green; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the blue part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getBlue() { |
||||||
|
return blue_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the blue part to a new value. |
||||||
|
* @param blue the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setBlue(final CSSPrimitiveValue blue) { |
||||||
|
blue_ = blue; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
if (null != format && format.isRgbAsHex()) { |
||||||
|
sb |
||||||
|
.append("#") |
||||||
|
.append(getColorAsHex(red_)) |
||||||
|
.append(getColorAsHex(green_)) |
||||||
|
.append(getColorAsHex(blue_)); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
sb |
||||||
|
.append("rgb(") |
||||||
|
.append(red_) |
||||||
|
.append(", ") |
||||||
|
.append(green_) |
||||||
|
.append(", ") |
||||||
|
.append(blue_) |
||||||
|
.append(")"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
private String getColorAsHex(final CSSPrimitiveValue color) { |
||||||
|
return String.format("%02x", Math.round(color.getFloatValue(LexicalUnit.SAC_INTEGER))); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,219 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.dom; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.css.CSSPrimitiveValue; |
||||||
|
import org.w3c.dom.css.Rect; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link Rect}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
*/ |
||||||
|
public class RectImpl implements Rect, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -7031248513917920621L; |
||||||
|
|
||||||
|
private CSSPrimitiveValue top_; |
||||||
|
private CSSPrimitiveValue right_; |
||||||
|
private CSSPrimitiveValue bottom_; |
||||||
|
private CSSPrimitiveValue left_; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor that reads the values from the given |
||||||
|
* chain of LexicalUnits. |
||||||
|
* @param lu the values |
||||||
|
* @throws DOMException in case of error |
||||||
|
*/ |
||||||
|
public RectImpl(final LexicalUnit lu) throws DOMException { |
||||||
|
// top
|
||||||
|
if (lu == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses first parameter."); |
||||||
|
} |
||||||
|
top_ = new CSSValueImpl(lu, true); |
||||||
|
|
||||||
|
// right
|
||||||
|
LexicalUnit next = lu.getNextLexicalUnit(); // ,
|
||||||
|
if (next == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses second parameter."); |
||||||
|
} |
||||||
|
|
||||||
|
boolean isCommaSeparated = false; |
||||||
|
if (next.getLexicalUnitType() == LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
isCommaSeparated = true; |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses second parameter."); |
||||||
|
} |
||||||
|
} |
||||||
|
right_ = new CSSValueImpl(next, true); |
||||||
|
|
||||||
|
// bottom
|
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses third parameter."); |
||||||
|
} |
||||||
|
if (isCommaSeparated) { |
||||||
|
if (next.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"All or none rect parameters must be separated by ','."); |
||||||
|
} |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses third parameter."); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
if (next.getLexicalUnitType() == LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"All or none rect parameters must be separated by ','."); |
||||||
|
} |
||||||
|
} |
||||||
|
bottom_ = new CSSValueImpl(next, true); |
||||||
|
|
||||||
|
// left
|
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses fourth parameter."); |
||||||
|
} |
||||||
|
if (isCommaSeparated) { |
||||||
|
if (next.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"All or none rect parameters must be separated by ','."); |
||||||
|
} |
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next == null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Rect misses fourth parameter."); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
if (next.getLexicalUnitType() == LexicalUnit.SAC_OPERATOR_COMMA) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, |
||||||
|
"All or none rect parameters must be separated by ','."); |
||||||
|
} |
||||||
|
} |
||||||
|
left_ = new CSSValueImpl(next, true); |
||||||
|
|
||||||
|
// too many
|
||||||
|
next = next.getNextLexicalUnit(); |
||||||
|
if (next != null) { |
||||||
|
throw new DOMException(DOMException.SYNTAX_ERR, "Too many parameters for rect function."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* The values for the coordinates are null. |
||||||
|
*/ |
||||||
|
public RectImpl() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the top part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getTop() { |
||||||
|
return top_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the top part to a new value. |
||||||
|
* @param top the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setTop(final CSSPrimitiveValue top) { |
||||||
|
top_ = top; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the right part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getRight() { |
||||||
|
return right_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the right part to a new value. |
||||||
|
* @param right the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setRight(final CSSPrimitiveValue right) { |
||||||
|
right_ = right; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the bottom part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getBottom() { |
||||||
|
return bottom_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the bottom part to a new value. |
||||||
|
* @param bottom the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setBottom(final CSSPrimitiveValue bottom) { |
||||||
|
bottom_ = bottom; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the left part. |
||||||
|
*/ |
||||||
|
public CSSPrimitiveValue getLeft() { |
||||||
|
return left_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the left part to a new value. |
||||||
|
* @param left the new CSSPrimitiveValue |
||||||
|
*/ |
||||||
|
public void setLeft(final CSSPrimitiveValue left) { |
||||||
|
left_ = left; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
return new StringBuilder("rect(") |
||||||
|
.append(top_).append(", ") |
||||||
|
.append(right_).append(", ") |
||||||
|
.append(bottom_).append(", ") |
||||||
|
.append(left_).append(")").toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,84 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.format; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
/** |
||||||
|
* Format object that controls the output produced by toString(CssFormat). |
||||||
|
* |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CSSFormat { |
||||||
|
private static final String NEW_LINE = System.getProperty("line.separator"); |
||||||
|
|
||||||
|
private boolean rgbAsHex_; |
||||||
|
private boolean propertiesInSeparateLines_; |
||||||
|
private boolean useSourceStringValues_; |
||||||
|
private String propertiesIndent_ = ""; |
||||||
|
|
||||||
|
public boolean isRgbAsHex() { |
||||||
|
return rgbAsHex_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSFormat setRgbAsHex(final boolean rgbAsHex) { |
||||||
|
rgbAsHex_ = rgbAsHex; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean useSourceStringValues() { |
||||||
|
return useSourceStringValues_; |
||||||
|
} |
||||||
|
|
||||||
|
public CSSFormat setUseSourceStringValues(final boolean useSourceStringValues) { |
||||||
|
useSourceStringValues_ = useSourceStringValues; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getPropertiesInSeparateLines() { |
||||||
|
return propertiesInSeparateLines_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getPropertiesIndent() { |
||||||
|
return propertiesIndent_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* If this value is larger than -1 the individual properties from a rule |
||||||
|
* are rendered in separate lines; the parameter defines the indentation level. |
||||||
|
* Set this to -1 to disable the feature (default) |
||||||
|
* |
||||||
|
* @param anIndent the number of blanks used for indentation |
||||||
|
* @return the format itself |
||||||
|
*/ |
||||||
|
public CSSFormat setPropertiesInSeparateLines(final int anIndent) { |
||||||
|
propertiesInSeparateLines_ = anIndent > -1; |
||||||
|
|
||||||
|
if (anIndent > 0) { |
||||||
|
final char[] chars = new char[anIndent]; |
||||||
|
Arrays.fill(chars, ' '); |
||||||
|
propertiesIndent_ = new String(chars); |
||||||
|
} |
||||||
|
else { |
||||||
|
propertiesIndent_ = ""; |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNewLine() { |
||||||
|
return NEW_LINE; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.format; |
||||||
|
|
||||||
|
/** |
||||||
|
* Common interface for all classes supporting formated output. |
||||||
|
* |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public interface CSSFormatable { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a string representation of the rule based on the given format. |
||||||
|
* If provided format is null, the result is the same as getCssText() |
||||||
|
* |
||||||
|
* @param format the formatting rules |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
String getCssText(CSSFormat format); |
||||||
|
} |
@ -0,0 +1,799 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.selectors.ConditionFactoryImpl; |
||||||
|
import com.fr.third.steadystate.css.parser.selectors.SelectorFactoryImpl; |
||||||
|
import com.fr.third.steadystate.css.sac.ConditionFactoryAdapter; |
||||||
|
import com.fr.third.steadystate.css.sac.ConditionFactoryExt; |
||||||
|
import com.fr.third.steadystate.css.sac.DocumentHandlerAdapter; |
||||||
|
import com.fr.third.steadystate.css.sac.DocumentHandlerExt; |
||||||
|
import com.fr.third.steadystate.css.sac.SelectorFactoryAdapter; |
||||||
|
import com.fr.third.steadystate.css.sac.SelectorFactoryExt; |
||||||
|
import org.w3c.css.sac.CSSParseException; |
||||||
|
import org.w3c.css.sac.ConditionFactory; |
||||||
|
import org.w3c.css.sac.DocumentHandler; |
||||||
|
import org.w3c.css.sac.ErrorHandler; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.Parser; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SelectorFactory; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.net.URL; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.Locale; |
||||||
|
import java.util.MissingResourceException; |
||||||
|
import java.util.ResourceBundle; |
||||||
|
|
||||||
|
/** |
||||||
|
* Base implementation of {@link Parser}. |
||||||
|
* |
||||||
|
* @author koch |
||||||
|
* @author RBRi |
||||||
|
*/ |
||||||
|
abstract class AbstractSACParser implements SACParser { |
||||||
|
private DocumentHandlerExt documentHandler_; |
||||||
|
private ErrorHandler errorHandler_; |
||||||
|
private InputSource source_; |
||||||
|
private Locale locale_; |
||||||
|
private SelectorFactoryExt selectorFactory_; |
||||||
|
private ConditionFactoryExt conditionFactory_; |
||||||
|
private ResourceBundle sacParserMessages_; |
||||||
|
|
||||||
|
private boolean ieStarHackAccepted_; |
||||||
|
|
||||||
|
private static final String NUM_CHARS = "0123456789."; |
||||||
|
|
||||||
|
protected DocumentHandlerExt getDocumentHandler() { |
||||||
|
if (documentHandler_ == null) { |
||||||
|
setDocumentHandler(new HandlerBase()); |
||||||
|
} |
||||||
|
return documentHandler_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDocumentHandler(final DocumentHandler handler) { |
||||||
|
if (handler instanceof DocumentHandlerExt) { |
||||||
|
documentHandler_ = (DocumentHandlerExt) handler; |
||||||
|
} |
||||||
|
else { |
||||||
|
documentHandler_ = new DocumentHandlerAdapter(handler); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected ErrorHandler getErrorHandler() { |
||||||
|
if (errorHandler_ == null) { |
||||||
|
setErrorHandler(new HandlerBase()); |
||||||
|
} |
||||||
|
return errorHandler_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setErrorHandler(final ErrorHandler eh) { |
||||||
|
errorHandler_ = eh; |
||||||
|
} |
||||||
|
|
||||||
|
protected InputSource getInputSource() { |
||||||
|
return source_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setIeStarHackAccepted(final boolean accepted) { |
||||||
|
ieStarHackAccepted_ = accepted; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isIeStarHackAccepted() { |
||||||
|
return ieStarHackAccepted_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLocale(final Locale locale) { |
||||||
|
if (locale_ != locale) { |
||||||
|
sacParserMessages_ = null; |
||||||
|
} |
||||||
|
locale_ = locale; |
||||||
|
} |
||||||
|
|
||||||
|
protected Locale getLocale() { |
||||||
|
if (locale_ == null) { |
||||||
|
setLocale(Locale.getDefault()); |
||||||
|
} |
||||||
|
return locale_; |
||||||
|
} |
||||||
|
|
||||||
|
protected SelectorFactoryExt getSelectorFactory() { |
||||||
|
if (selectorFactory_ == null) { |
||||||
|
selectorFactory_ = new SelectorFactoryImpl(); |
||||||
|
} |
||||||
|
return selectorFactory_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelectorFactory(final SelectorFactory selectorFactory) { |
||||||
|
if (selectorFactory instanceof SelectorFactoryExt) { |
||||||
|
selectorFactory_ = (SelectorFactoryExt) selectorFactory; |
||||||
|
} |
||||||
|
else { |
||||||
|
selectorFactory_ = new SelectorFactoryAdapter(selectorFactory); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected ConditionFactoryExt getConditionFactory() { |
||||||
|
if (conditionFactory_ == null) { |
||||||
|
conditionFactory_ = new ConditionFactoryImpl(); |
||||||
|
} |
||||||
|
return conditionFactory_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConditionFactory(final ConditionFactory conditionFactory) { |
||||||
|
if (conditionFactory instanceof ConditionFactoryExt) { |
||||||
|
conditionFactory_ = (ConditionFactoryExt) conditionFactory; |
||||||
|
} |
||||||
|
else { |
||||||
|
conditionFactory_ = new ConditionFactoryAdapter(conditionFactory); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected ResourceBundle getSACParserMessages() { |
||||||
|
if (sacParserMessages_ == null) { |
||||||
|
try { |
||||||
|
sacParserMessages_ = ResourceBundle.getBundle( |
||||||
|
"com.fr.third.steadystate.css.parser.SACParserMessages", |
||||||
|
getLocale()); |
||||||
|
} |
||||||
|
catch (final MissingResourceException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
return sacParserMessages_; |
||||||
|
} |
||||||
|
|
||||||
|
protected Locator createLocator(final Token t) { |
||||||
|
return new LocatorImpl(getInputSource().getURI(), |
||||||
|
t == null ? 0 : t.beginLine, |
||||||
|
t == null ? 0 : t.beginColumn); |
||||||
|
} |
||||||
|
|
||||||
|
protected String add_escapes(final String str) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
char ch; |
||||||
|
for (int i = 0; i < str.length(); i++) { |
||||||
|
ch = str.charAt(i); |
||||||
|
switch (ch) { |
||||||
|
case 0 : |
||||||
|
continue; |
||||||
|
case '\b': |
||||||
|
sb.append("\\b"); |
||||||
|
continue; |
||||||
|
case '\t': |
||||||
|
sb.append("\\t"); |
||||||
|
continue; |
||||||
|
case '\n': |
||||||
|
sb.append("\\n"); |
||||||
|
continue; |
||||||
|
case '\f': |
||||||
|
sb.append("\\f"); |
||||||
|
continue; |
||||||
|
case '\r': |
||||||
|
sb.append("\\r"); |
||||||
|
continue; |
||||||
|
case '\"': |
||||||
|
sb.append("\\\""); |
||||||
|
continue; |
||||||
|
case '\'': |
||||||
|
sb.append("\\\'"); |
||||||
|
continue; |
||||||
|
case '\\': |
||||||
|
sb.append("\\\\"); |
||||||
|
continue; |
||||||
|
default: |
||||||
|
if (ch < 0x20 || ch > 0x7e) { |
||||||
|
final String s = "0000" + Integer.toString(ch, 16); |
||||||
|
sb.append("\\u" + s.substring(s.length() - 4, s.length())); |
||||||
|
} |
||||||
|
else { |
||||||
|
sb.append(ch); |
||||||
|
} |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
protected CSSParseException toCSSParseException(final String key, final ParseException e) { |
||||||
|
final String messagePattern1 = getSACParserMessages().getString("invalidExpectingOne"); |
||||||
|
final String messagePattern2 = getSACParserMessages().getString("invalidExpectingMore"); |
||||||
|
int maxSize = 0; |
||||||
|
final StringBuilder expected = new StringBuilder(); |
||||||
|
for (int i = 0; i < e.expectedTokenSequences.length; i++) { |
||||||
|
if (maxSize < e.expectedTokenSequences[i].length) { |
||||||
|
maxSize = e.expectedTokenSequences[i].length; |
||||||
|
} |
||||||
|
for (int j = 0; j < e.expectedTokenSequences[i].length; j++) { |
||||||
|
expected.append(e.tokenImage[e.expectedTokenSequences[i][j]]); |
||||||
|
} |
||||||
|
if (i < e.expectedTokenSequences.length - 1) { |
||||||
|
expected.append(", "); |
||||||
|
} |
||||||
|
} |
||||||
|
final StringBuilder invalid = new StringBuilder(); |
||||||
|
Token tok = e.currentToken.next; |
||||||
|
for (int i = 0; i < maxSize; i++) { |
||||||
|
if (i != 0) { |
||||||
|
invalid.append(" "); |
||||||
|
} |
||||||
|
if (tok.kind == 0) { |
||||||
|
invalid.append(e.tokenImage[0]); |
||||||
|
break; |
||||||
|
} |
||||||
|
invalid.append(add_escapes(tok.image)); |
||||||
|
tok = tok.next; |
||||||
|
} |
||||||
|
String s = null; |
||||||
|
try { |
||||||
|
s = getSACParserMessages().getString(key); |
||||||
|
} |
||||||
|
catch (final MissingResourceException ex) { |
||||||
|
s = key; |
||||||
|
} |
||||||
|
final StringBuilder message = new StringBuilder(s); |
||||||
|
message.append(" ("); |
||||||
|
if (e.expectedTokenSequences.length == 1) { |
||||||
|
message.append(MessageFormat.format(messagePattern1, new Object[] {invalid, expected})); |
||||||
|
} |
||||||
|
else { |
||||||
|
message.append(MessageFormat.format(messagePattern2, new Object[] {invalid, expected})); |
||||||
|
} |
||||||
|
message.append(")"); |
||||||
|
return new CSSParseException(message.toString(), |
||||||
|
getInputSource().getURI(), e.currentToken.next.beginLine, |
||||||
|
e.currentToken.next.beginColumn); |
||||||
|
} |
||||||
|
|
||||||
|
protected CSSParseException toCSSParseException(final DOMException e) { |
||||||
|
final String messagePattern = getSACParserMessages().getString("domException"); |
||||||
|
return new CSSParseException( |
||||||
|
MessageFormat.format(messagePattern, e.getMessage()), getInputSource().getURI(), 1, 1); |
||||||
|
} |
||||||
|
|
||||||
|
protected CSSParseException toCSSParseException(final TokenMgrError e) { |
||||||
|
final String messagePattern = getSACParserMessages().getString("tokenMgrError"); |
||||||
|
return new CSSParseException(messagePattern, getInputSource().getURI(), 1, 1); |
||||||
|
} |
||||||
|
|
||||||
|
protected CSSParseException toCSSParseException(final String messageKey, |
||||||
|
final Object[] msgParams, final Locator locator) { |
||||||
|
final String messagePattern = getSACParserMessages().getString(messageKey); |
||||||
|
return new CSSParseException(MessageFormat.format(messagePattern, msgParams), locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected CSSParseException createSkipWarning(final String key, final CSSParseException e) { |
||||||
|
String s = null; |
||||||
|
try { |
||||||
|
s = getSACParserMessages().getString(key); |
||||||
|
} |
||||||
|
catch (final MissingResourceException ex) { |
||||||
|
s = key; |
||||||
|
} |
||||||
|
return new CSSParseException(s, e.getURI(), e.getLineNumber(), e.getColumnNumber()); |
||||||
|
} |
||||||
|
|
||||||
|
public void parseStyleSheet(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
try { |
||||||
|
styleSheet(); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidStyleSheet", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void parseStyleSheet(final String uri) throws IOException { |
||||||
|
parseStyleSheet(new InputSource(uri)); |
||||||
|
} |
||||||
|
|
||||||
|
public void parseStyleDeclaration(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
try { |
||||||
|
styleDeclaration(); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidStyleDeclaration", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void parseRule(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
try { |
||||||
|
styleSheetRuleSingle(); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidRule", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public SelectorList parseSelectors(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
SelectorList sl = null; |
||||||
|
try { |
||||||
|
sl = parseSelectorsInternal(); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidSelectorList", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
return sl; |
||||||
|
} |
||||||
|
|
||||||
|
public LexicalUnit parsePropertyValue(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
LexicalUnit lu = null; |
||||||
|
try { |
||||||
|
lu = expr(); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidExpr", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
return lu; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean parsePriority(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
boolean b = false; |
||||||
|
try { |
||||||
|
b = prio(); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidPrio", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
return b; |
||||||
|
} |
||||||
|
|
||||||
|
public SACMediaList parseMedia(final InputSource source) throws IOException { |
||||||
|
source_ = source; |
||||||
|
ReInit(getCharStream(source)); |
||||||
|
final SACMediaListImpl ml = new SACMediaListImpl(); |
||||||
|
try { |
||||||
|
mediaList(ml); |
||||||
|
} |
||||||
|
catch (final ParseException e) { |
||||||
|
getErrorHandler().error(toCSSParseException("invalidMediaList", e)); |
||||||
|
} |
||||||
|
catch (final TokenMgrError e) { |
||||||
|
getErrorHandler().error(toCSSParseException(e)); |
||||||
|
} |
||||||
|
catch (final CSSParseException e) { |
||||||
|
getErrorHandler().error(e); |
||||||
|
} |
||||||
|
return ml; |
||||||
|
} |
||||||
|
|
||||||
|
private CharStream getCharStream(final InputSource source) throws IOException { |
||||||
|
if (source.getCharacterStream() != null) { |
||||||
|
return new CssCharStream(source.getCharacterStream(), 1, 1); |
||||||
|
} |
||||||
|
if (source.getByteStream() != null) { |
||||||
|
final InputStreamReader reader; |
||||||
|
final String encoding = source.getEncoding(); |
||||||
|
if (encoding == null || encoding.length() < 1) { |
||||||
|
reader = new InputStreamReader(source.getByteStream(), Charset.defaultCharset()); |
||||||
|
} |
||||||
|
else { |
||||||
|
reader = new InputStreamReader(source.getByteStream(), encoding); |
||||||
|
} |
||||||
|
return new CssCharStream(reader, 1, 1); |
||||||
|
} |
||||||
|
if (source.getURI() != null) { |
||||||
|
final InputStreamReader reader = new InputStreamReader(new URL(source.getURI()).openStream()); |
||||||
|
return new CssCharStream(reader, 1, 1); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public abstract String getParserVersion(); |
||||||
|
protected abstract String getGrammarUri(); |
||||||
|
protected abstract void ReInit(CharStream charStream); |
||||||
|
protected abstract void styleSheet() throws CSSParseException, ParseException; |
||||||
|
protected abstract void styleDeclaration() throws ParseException; |
||||||
|
protected abstract void styleSheetRuleSingle() throws ParseException; |
||||||
|
protected abstract SelectorList parseSelectorsInternal() throws ParseException; |
||||||
|
protected abstract SelectorList selectorList() throws ParseException; |
||||||
|
protected abstract LexicalUnit expr() throws ParseException; |
||||||
|
protected abstract boolean prio() throws ParseException; |
||||||
|
protected abstract void mediaList(SACMediaListImpl ml) throws ParseException; |
||||||
|
|
||||||
|
protected void handleStartDocument() { |
||||||
|
getDocumentHandler().startDocument(getInputSource()); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleEndDocument() { |
||||||
|
getDocumentHandler().endDocument(getInputSource()); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleIgnorableAtRule(final String s, final Locator locator) { |
||||||
|
getDocumentHandler().ignorableAtRule(s, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleCharset(final String characterEncoding, final Locator locator) { |
||||||
|
getDocumentHandler().charset(characterEncoding, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleImportStyle(final String uri, final SACMediaList media, |
||||||
|
final String defaultNamespaceURI, final Locator locator) { |
||||||
|
getDocumentHandler().importStyle(uri, media, defaultNamespaceURI, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleStartMedia(final SACMediaList media, final Locator locator) { |
||||||
|
getDocumentHandler().startMedia(media, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleMedium(final String medium, final Locator locator) { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
protected void handleEndMedia(final SACMediaList media) { |
||||||
|
getDocumentHandler().endMedia(media); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleStartPage(final String name, final String pseudoPage, final Locator locator) { |
||||||
|
getDocumentHandler().startPage(name, pseudoPage, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleEndPage(final String name, final String pseudoPage) { |
||||||
|
getDocumentHandler().endPage(name, pseudoPage); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleStartFontFace(final Locator locator) { |
||||||
|
getDocumentHandler().startFontFace(locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleEndFontFace() { |
||||||
|
getDocumentHandler().endFontFace(); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleSelector(final Selector selector) { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
protected void handleStartSelector(final SelectorList selectors, final Locator locator) { |
||||||
|
getDocumentHandler().startSelector(selectors, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleEndSelector(final SelectorList selectors) { |
||||||
|
getDocumentHandler().endSelector(selectors); |
||||||
|
} |
||||||
|
|
||||||
|
protected void handleProperty(final String name, final LexicalUnit value, |
||||||
|
final boolean important, final Locator locator) { |
||||||
|
getDocumentHandler().property(name, value, important, locator); |
||||||
|
} |
||||||
|
|
||||||
|
protected LexicalUnit functionInternal(final LexicalUnit prev, final String funct, |
||||||
|
final LexicalUnit params) { |
||||||
|
|
||||||
|
if ("counter(".equalsIgnoreCase(funct)) { |
||||||
|
return LexicalUnitImpl.createCounter(prev, params); |
||||||
|
} |
||||||
|
else if ("counters(".equalsIgnoreCase(funct)) { |
||||||
|
return LexicalUnitImpl.createCounters(prev, params); |
||||||
|
} |
||||||
|
else if ("attr(".equalsIgnoreCase(funct)) { |
||||||
|
return LexicalUnitImpl.createAttr(prev, params.getStringValue()); |
||||||
|
} |
||||||
|
else if ("rect(".equalsIgnoreCase(funct)) { |
||||||
|
return LexicalUnitImpl.createRect(prev, params); |
||||||
|
} |
||||||
|
else if ("rgb(".equalsIgnoreCase(funct)) { |
||||||
|
return LexicalUnitImpl.createRgbColor(prev, params); |
||||||
|
} |
||||||
|
return LexicalUnitImpl.createFunction( |
||||||
|
prev, |
||||||
|
funct.substring(0, funct.length() - 1), |
||||||
|
params); |
||||||
|
} |
||||||
|
|
||||||
|
protected LexicalUnit hexcolorInternal(final LexicalUnit prev, final Token t) { |
||||||
|
// Step past the hash at the beginning
|
||||||
|
final int i = 1; |
||||||
|
int r = 0; |
||||||
|
int g = 0; |
||||||
|
int b = 0; |
||||||
|
final int len = t.image.length() - 1; |
||||||
|
try { |
||||||
|
if (len == 3) { |
||||||
|
r = Integer.parseInt(t.image.substring(i + 0, i + 1), 16); |
||||||
|
g = Integer.parseInt(t.image.substring(i + 1, i + 2), 16); |
||||||
|
b = Integer.parseInt(t.image.substring(i + 2, i + 3), 16); |
||||||
|
r = (r << 4) | r; |
||||||
|
g = (g << 4) | g; |
||||||
|
b = (b << 4) | b; |
||||||
|
} |
||||||
|
else if (len == 6) { |
||||||
|
r = Integer.parseInt(t.image.substring(i + 0, i + 2), 16); |
||||||
|
g = Integer.parseInt(t.image.substring(i + 2, i + 4), 16); |
||||||
|
b = Integer.parseInt(t.image.substring(i + 4, i + 6), 16); |
||||||
|
} |
||||||
|
else { |
||||||
|
final String pattern = getSACParserMessages().getString("invalidColor"); |
||||||
|
throw new CSSParseException(MessageFormat.format( |
||||||
|
pattern, new Object[] {t}), |
||||||
|
getInputSource().getURI(), t.beginLine, |
||||||
|
t.beginColumn); |
||||||
|
} |
||||||
|
|
||||||
|
// Turn into an "rgb()"
|
||||||
|
final LexicalUnit lr = LexicalUnitImpl.createNumber(null, r); |
||||||
|
final LexicalUnit lc1 = LexicalUnitImpl.createComma(lr); |
||||||
|
final LexicalUnit lg = LexicalUnitImpl.createNumber(lc1, g); |
||||||
|
final LexicalUnit lc2 = LexicalUnitImpl.createComma(lg); |
||||||
|
LexicalUnitImpl.createNumber(lc2, b); |
||||||
|
|
||||||
|
return LexicalUnitImpl.createRgbColor(prev, lr); |
||||||
|
} |
||||||
|
catch (final NumberFormatException ex) { |
||||||
|
final String pattern = getSACParserMessages().getString("invalidColor"); |
||||||
|
throw new CSSParseException(MessageFormat.format( |
||||||
|
pattern, new Object[] {t}), |
||||||
|
getInputSource().getURI(), t.beginLine, |
||||||
|
t.beginColumn, ex); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int intValue(final char op, final String s) { |
||||||
|
final int result = Integer.parseInt(s); |
||||||
|
if (op == '-') { |
||||||
|
return -1 * result; |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
float floatValue(final char op, final String s) { |
||||||
|
final float result = Float.parseFloat(s); |
||||||
|
if (op == '-') { |
||||||
|
return -1 * result; |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
int getLastNumPos(final String s) { |
||||||
|
int i = 0; |
||||||
|
for ( ; i < s.length(); i++) { |
||||||
|
if (NUM_CHARS.indexOf(s.charAt(i)) < 0) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return i - 1; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unescapes escaped characters in the specified string, according to the |
||||||
|
* <a href="http://www.w3.org/TR/CSS21/syndata.html#escaped-characters">CSS specification</a>. |
||||||
|
* |
||||||
|
* This could be done directly in the parser, but portions of the lexer would have to be moved |
||||||
|
* to the parser, meaning that the grammar would no longer match the standard grammar specified |
||||||
|
* by the W3C. This would make the parser and lexer much less maintainable. |
||||||
|
*/ |
||||||
|
public String unescape(final String s, final boolean unescapeDoubleQuotes) { |
||||||
|
if (s == null) { |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
// avoid creation of new string if possible
|
||||||
|
StringBuilder buf = null; |
||||||
|
int index = -1; |
||||||
|
int len = s.length(); |
||||||
|
len--; |
||||||
|
if (unescapeDoubleQuotes) { |
||||||
|
while (index < len) { |
||||||
|
final char c = s.charAt(++index); |
||||||
|
|
||||||
|
if (c == '\\' || (c == '\"')) { |
||||||
|
buf = new StringBuilder(len); |
||||||
|
buf.append(s.substring(0, index)); |
||||||
|
index--; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
while (index < len) { |
||||||
|
if ('\\' == s.charAt(++index)) { |
||||||
|
buf = new StringBuilder(len); |
||||||
|
buf.append(s.substring(0, index)); |
||||||
|
index--; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (null == buf) { |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
// ok, we have to construct a new string
|
||||||
|
int numValue = -1; |
||||||
|
int hexval; |
||||||
|
int digitCount = 0; |
||||||
|
|
||||||
|
while (index < len) { |
||||||
|
final char c = s.charAt(++index); |
||||||
|
|
||||||
|
if (numValue > -1) { |
||||||
|
hexval = hexval(c); |
||||||
|
if (hexval != -1) { |
||||||
|
numValue = (numValue * 16) + hexval; |
||||||
|
if (++digitCount < 6) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (numValue > 0xFFFF || numValue == 0) { |
||||||
|
numValue = 0xFFFD; |
||||||
|
} |
||||||
|
buf.append((char) numValue); |
||||||
|
numValue = -1; |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (digitCount > 0) { |
||||||
|
if (numValue > 0xFFFF || numValue == 0) { |
||||||
|
numValue = 0xFFFD; |
||||||
|
} |
||||||
|
|
||||||
|
buf.append((char) numValue); |
||||||
|
|
||||||
|
if (c == ' ' || c == '\t') { |
||||||
|
numValue = -1; |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
numValue = -1; |
||||||
|
if (digitCount == 0 && c == '\\') { |
||||||
|
buf.append('\\'); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (c == '\n' || c == '\f') { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (c == '\r') { |
||||||
|
if (index < len) { |
||||||
|
if (s.charAt(index + 1) == '\n') { |
||||||
|
index++; |
||||||
|
} |
||||||
|
} |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (c == '\\') { |
||||||
|
numValue = 0; |
||||||
|
digitCount = 0; |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (c == '\"' && !unescapeDoubleQuotes) { |
||||||
|
buf.append('\\'); |
||||||
|
} |
||||||
|
|
||||||
|
buf.append(c); |
||||||
|
} |
||||||
|
|
||||||
|
if (numValue > -1) { |
||||||
|
if (digitCount == 0) { |
||||||
|
buf.append('\\'); |
||||||
|
} |
||||||
|
else { |
||||||
|
if (numValue > 0xFFFF || numValue == 0) { |
||||||
|
numValue = 0xFFFD; |
||||||
|
} |
||||||
|
buf.append((char) numValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return buf.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private static int hexval(final char c) { |
||||||
|
switch (c) { |
||||||
|
case '0' : |
||||||
|
return 0; |
||||||
|
case '1' : |
||||||
|
return 1; |
||||||
|
case '2' : |
||||||
|
return 2; |
||||||
|
case '3' : |
||||||
|
return 3; |
||||||
|
case '4' : |
||||||
|
return 4; |
||||||
|
case '5' : |
||||||
|
return 5; |
||||||
|
case '6' : |
||||||
|
return 6; |
||||||
|
case '7' : |
||||||
|
return 7; |
||||||
|
case '8' : |
||||||
|
return 8; |
||||||
|
case '9' : |
||||||
|
return 9; |
||||||
|
|
||||||
|
case 'a' : |
||||||
|
case 'A' : |
||||||
|
return 10; |
||||||
|
case 'b' : |
||||||
|
case 'B' : |
||||||
|
return 11; |
||||||
|
case 'c' : |
||||||
|
case 'C' : |
||||||
|
return 12; |
||||||
|
case 'd' : |
||||||
|
case 'D' : |
||||||
|
return 13; |
||||||
|
case 'e' : |
||||||
|
case 'E' : |
||||||
|
return 14; |
||||||
|
case 'f' : |
||||||
|
case 'F' : |
||||||
|
return 15; |
||||||
|
default : |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,505 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.dom.CSSCharsetRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSFontFaceRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSImportRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSMediaRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSOMObject; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSPageRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSRuleListImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSStyleDeclarationImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSStyleRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSStyleSheetImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSUnknownRuleImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.CSSValueImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.MediaListImpl; |
||||||
|
import com.fr.third.steadystate.css.dom.Property; |
||||||
|
import com.fr.third.steadystate.css.sac.DocumentHandlerExt; |
||||||
|
import com.fr.third.steadystate.css.userdata.UserDataConstants; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.ErrorHandler; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.Parser; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
import org.w3c.css.sac.helpers.ParserFactory; |
||||||
|
import org.w3c.dom.DOMException; |
||||||
|
import org.w3c.dom.Node; |
||||||
|
import org.w3c.dom.css.CSSRule; |
||||||
|
import org.w3c.dom.css.CSSStyleDeclaration; |
||||||
|
import org.w3c.dom.css.CSSStyleSheet; |
||||||
|
import org.w3c.dom.css.CSSValue; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.lang.reflect.InvocationTargetException; |
||||||
|
import java.lang.reflect.Method; |
||||||
|
import java.util.Stack; |
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
*/ |
||||||
|
public class CSSOMParser { |
||||||
|
|
||||||
|
private static final Object LOCK = new Object(); |
||||||
|
private static final String DEFAULT_PARSER = "com.fr.third.steadystate.css.parser.SACParserCSS21"; |
||||||
|
|
||||||
|
private static String LastFailed_; |
||||||
|
|
||||||
|
private Parser parser_; |
||||||
|
private CSSStyleSheetImpl parentStyleSheet_; |
||||||
|
|
||||||
|
/** Creates new CSSOMParser */ |
||||||
|
public CSSOMParser() { |
||||||
|
this (null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates new CSSOMParser. |
||||||
|
* |
||||||
|
* @param parser the SAC Parser |
||||||
|
*/ |
||||||
|
public CSSOMParser(final Parser parser) { |
||||||
|
synchronized (LOCK) { |
||||||
|
if (null != parser) { |
||||||
|
System.setProperty("org.w3c.css.sac.parser", parser.getClass().getCanonicalName()); |
||||||
|
parser_ = parser; |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// no parser provided, determine the correct one
|
||||||
|
String currentParser = System.getProperty("org.w3c.css.sac.parser"); |
||||||
|
try { |
||||||
|
// use the direct method if we already failed once before
|
||||||
|
if (null != LastFailed_ && LastFailed_.equals(currentParser)) { |
||||||
|
parser_ = new SACParserCSS21(); |
||||||
|
} |
||||||
|
else { |
||||||
|
if (null == currentParser) { |
||||||
|
System.setProperty("org.w3c.css.sac.parser", DEFAULT_PARSER); |
||||||
|
currentParser = DEFAULT_PARSER; |
||||||
|
} |
||||||
|
final ParserFactory factory = new ParserFactory(); |
||||||
|
parser_ = factory.makeParser(); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (final Exception e) { |
||||||
|
final Logger log = Logger.getLogger("com.fr.third.steadystate.css"); |
||||||
|
log.warning(e.toString()); |
||||||
|
log.warning("using the default 'SACParserCSS21' instead"); |
||||||
|
log.throwing("CSSOMParser", "consturctor", e); |
||||||
|
LastFailed_ = currentParser; |
||||||
|
parser_ = new SACParserCSS21(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setErrorHandler(final ErrorHandler eh) { |
||||||
|
parser_.setErrorHandler(eh); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Parses a SAC input source into a CSSOM style sheet. |
||||||
|
* |
||||||
|
* @param source the SAC input source |
||||||
|
* @param ownerNode the owner node (see the definition of |
||||||
|
* <code>ownerNode</code> in org.w3c.dom.css.StyleSheet) |
||||||
|
* @param href the href (see the definition of <code>href</code> in |
||||||
|
* org.w3c.dom.css.StyleSheet) |
||||||
|
* @return the CSSOM style sheet |
||||||
|
* @throws IOException if the underlying SAC parser throws an IOException |
||||||
|
*/ |
||||||
|
public CSSStyleSheet parseStyleSheet(final InputSource source, |
||||||
|
final Node ownerNode, final String href) throws IOException { |
||||||
|
final CSSOMHandler handler = new CSSOMHandler(); |
||||||
|
handler.setOwnerNode(ownerNode); |
||||||
|
handler.setHref(href); |
||||||
|
parser_.setDocumentHandler(handler); |
||||||
|
parser_.parseStyleSheet(source); |
||||||
|
final Object o = handler.getRoot(); |
||||||
|
if (o instanceof CSSStyleSheet) { |
||||||
|
return (CSSStyleSheet) o; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Parses a SAC input source into a CSSOM style declaration. |
||||||
|
* |
||||||
|
* @param source the SAC input source |
||||||
|
* @return the CSSOM style declaration |
||||||
|
* @throws IOException if the underlying SAC parser throws an IOException |
||||||
|
*/ |
||||||
|
public CSSStyleDeclaration parseStyleDeclaration(final InputSource source) throws IOException { |
||||||
|
final CSSStyleDeclarationImpl sd = new CSSStyleDeclarationImpl(null); |
||||||
|
parseStyleDeclaration(sd, source); |
||||||
|
return sd; |
||||||
|
} |
||||||
|
|
||||||
|
public void parseStyleDeclaration(final CSSStyleDeclaration sd, final InputSource source) throws IOException { |
||||||
|
final Stack<Object> nodeStack = new Stack<Object>(); |
||||||
|
nodeStack.push(sd); |
||||||
|
final CSSOMHandler handler = new CSSOMHandler(nodeStack); |
||||||
|
parser_.setDocumentHandler(handler); |
||||||
|
parser_.parseStyleDeclaration(source); |
||||||
|
} |
||||||
|
|
||||||
|
public CSSValue parsePropertyValue(final InputSource source) throws IOException { |
||||||
|
final CSSOMHandler handler = new CSSOMHandler(); |
||||||
|
parser_.setDocumentHandler(handler); |
||||||
|
final LexicalUnit lu = parser_.parsePropertyValue(source); |
||||||
|
if (null == lu) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return new CSSValueImpl(lu); |
||||||
|
} |
||||||
|
|
||||||
|
public CSSRule parseRule(final InputSource source) throws IOException { |
||||||
|
final CSSOMHandler handler = new CSSOMHandler(); |
||||||
|
parser_.setDocumentHandler(handler); |
||||||
|
parser_.parseRule(source); |
||||||
|
return (CSSRule) handler.getRoot(); |
||||||
|
} |
||||||
|
|
||||||
|
public SelectorList parseSelectors(final InputSource source) throws IOException { |
||||||
|
final HandlerBase handler = new HandlerBase(); |
||||||
|
parser_.setDocumentHandler(handler); |
||||||
|
return parser_.parseSelectors(source); |
||||||
|
} |
||||||
|
|
||||||
|
public SACMediaList parseMedia(final InputSource source) throws IOException { |
||||||
|
final HandlerBase handler = new HandlerBase(); |
||||||
|
parser_.setDocumentHandler(handler); |
||||||
|
if (parser_ instanceof AbstractSACParser) { |
||||||
|
return ((AbstractSACParser) parser_).parseMedia(source); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentStyleSheet(final CSSStyleSheetImpl parentStyleSheet) { |
||||||
|
parentStyleSheet_ = parentStyleSheet; |
||||||
|
} |
||||||
|
|
||||||
|
protected CSSStyleSheetImpl getParentStyleSheet() { |
||||||
|
return parentStyleSheet_; |
||||||
|
} |
||||||
|
|
||||||
|
class CSSOMHandler implements DocumentHandlerExt { |
||||||
|
private Stack<Object> nodeStack_; |
||||||
|
private Object root_; |
||||||
|
private Node ownerNode_; |
||||||
|
private String href_; |
||||||
|
|
||||||
|
private Node getOwnerNode() { |
||||||
|
return ownerNode_; |
||||||
|
} |
||||||
|
|
||||||
|
private void setOwnerNode(final Node ownerNode) { |
||||||
|
ownerNode_ = ownerNode; |
||||||
|
} |
||||||
|
|
||||||
|
private String getHref() { |
||||||
|
return href_; |
||||||
|
} |
||||||
|
|
||||||
|
private void setHref(final String href) { |
||||||
|
href_ = href; |
||||||
|
} |
||||||
|
|
||||||
|
CSSOMHandler(final Stack<Object> nodeStack) { |
||||||
|
nodeStack_ = nodeStack; |
||||||
|
} |
||||||
|
|
||||||
|
CSSOMHandler() { |
||||||
|
nodeStack_ = new Stack<Object>(); |
||||||
|
} |
||||||
|
|
||||||
|
Object getRoot() { |
||||||
|
return root_; |
||||||
|
} |
||||||
|
|
||||||
|
public void startDocument(final InputSource source) throws CSSException { |
||||||
|
if (nodeStack_.empty()) { |
||||||
|
final CSSStyleSheetImpl ss = new CSSStyleSheetImpl(); |
||||||
|
CSSOMParser.this.setParentStyleSheet(ss); |
||||||
|
ss.setOwnerNode(getOwnerNode()); |
||||||
|
ss.setBaseUri(source.getURI()); |
||||||
|
ss.setHref(getHref()); |
||||||
|
ss.setMediaText(source.getMedia()); |
||||||
|
ss.setTitle(source.getTitle()); |
||||||
|
// Create the rule list
|
||||||
|
final CSSRuleListImpl rules = new CSSRuleListImpl(); |
||||||
|
ss.setCssRules(rules); |
||||||
|
nodeStack_.push(ss); |
||||||
|
nodeStack_.push(rules); |
||||||
|
} |
||||||
|
else { |
||||||
|
// Error
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void endDocument(final InputSource source) throws CSSException { |
||||||
|
// Pop the rule list and style sheet nodes
|
||||||
|
nodeStack_.pop(); |
||||||
|
root_ = nodeStack_.pop(); |
||||||
|
} |
||||||
|
|
||||||
|
public void comment(final String text) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void ignorableAtRule(final String atRule) throws CSSException { |
||||||
|
ignorableAtRule(atRule, null); |
||||||
|
} |
||||||
|
|
||||||
|
public void ignorableAtRule(final String atRule, final Locator locator) throws CSSException { |
||||||
|
// Create the unknown rule and add it to the rule list
|
||||||
|
final CSSUnknownRuleImpl ir = new CSSUnknownRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule(), |
||||||
|
atRule); |
||||||
|
addLocator(locator, ir); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
((CSSRuleListImpl) nodeStack_.peek()).add(ir); |
||||||
|
} |
||||||
|
else { |
||||||
|
root_ = ir; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void namespaceDeclaration(final String prefix, final String uri) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void charset(final String characterEncoding, final Locator locator) |
||||||
|
throws CSSException { |
||||||
|
final CSSCharsetRuleImpl cr = new CSSCharsetRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule(), |
||||||
|
characterEncoding); |
||||||
|
addLocator(locator, cr); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
((CSSRuleListImpl) nodeStack_.peek()).add(cr); |
||||||
|
} |
||||||
|
else { |
||||||
|
root_ = cr; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void importStyle( |
||||||
|
final String uri, |
||||||
|
final SACMediaList media, |
||||||
|
final String defaultNamespaceURI) throws CSSException { |
||||||
|
importStyle(uri, media, defaultNamespaceURI, null); |
||||||
|
} |
||||||
|
|
||||||
|
public void importStyle(final String uri, final SACMediaList media, |
||||||
|
final String defaultNamespaceURI, final Locator locator) throws CSSException { |
||||||
|
// Create the import rule and add it to the rule list
|
||||||
|
final CSSImportRuleImpl ir = new CSSImportRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule(), |
||||||
|
uri, |
||||||
|
new MediaListImpl(media)); |
||||||
|
addLocator(locator, ir); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
((CSSRuleListImpl) nodeStack_.peek()).add(ir); |
||||||
|
} |
||||||
|
else { |
||||||
|
root_ = ir; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void startMedia(final SACMediaList media) throws CSSException { |
||||||
|
startMedia(media, null); |
||||||
|
} |
||||||
|
|
||||||
|
public void startMedia(final SACMediaList media, final Locator locator) throws CSSException { |
||||||
|
final MediaListImpl ml = new MediaListImpl(media); |
||||||
|
// Create the media rule and add it to the rule list
|
||||||
|
final CSSMediaRuleImpl mr = new CSSMediaRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule(), |
||||||
|
ml); |
||||||
|
addLocator(locator, mr); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
((CSSRuleListImpl) nodeStack_.peek()).add(mr); |
||||||
|
} |
||||||
|
|
||||||
|
// Create the rule list
|
||||||
|
final CSSRuleListImpl rules = new CSSRuleListImpl(); |
||||||
|
mr.setRuleList(rules); |
||||||
|
nodeStack_.push(mr); |
||||||
|
nodeStack_.push(rules); |
||||||
|
} |
||||||
|
|
||||||
|
public void endMedia(final SACMediaList media) throws CSSException { |
||||||
|
// Pop the rule list and media rule nodes
|
||||||
|
nodeStack_.pop(); |
||||||
|
root_ = nodeStack_.pop(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startPage(final String name, final String pseudoPage) throws CSSException { |
||||||
|
startPage(name, pseudoPage, null); |
||||||
|
} |
||||||
|
|
||||||
|
public void startPage(final String name, final String pseudoPage, final Locator locator) |
||||||
|
throws CSSException { |
||||||
|
// Create the page rule and add it to the rule list
|
||||||
|
final CSSPageRuleImpl pr = new CSSPageRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule(), pseudoPage); |
||||||
|
addLocator(locator, pr); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
((CSSRuleListImpl) nodeStack_.peek()).add(pr); |
||||||
|
} |
||||||
|
|
||||||
|
// Create the style declaration
|
||||||
|
final CSSStyleDeclarationImpl decl = new CSSStyleDeclarationImpl(pr); |
||||||
|
pr.setStyle(decl); |
||||||
|
nodeStack_.push(pr); |
||||||
|
nodeStack_.push(decl); |
||||||
|
} |
||||||
|
|
||||||
|
public void endPage(final String name, final String pseudoPage) throws CSSException { |
||||||
|
// Pop both the style declaration and the page rule nodes
|
||||||
|
nodeStack_.pop(); |
||||||
|
root_ = nodeStack_.pop(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startFontFace() throws CSSException { |
||||||
|
startFontFace(null); |
||||||
|
} |
||||||
|
|
||||||
|
public void startFontFace(final Locator locator) throws CSSException { |
||||||
|
// Create the font face rule and add it to the rule list
|
||||||
|
final CSSFontFaceRuleImpl ffr = new CSSFontFaceRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule()); |
||||||
|
addLocator(locator, ffr); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
((CSSRuleListImpl) nodeStack_.peek()).add(ffr); |
||||||
|
} |
||||||
|
|
||||||
|
// Create the style declaration
|
||||||
|
final CSSStyleDeclarationImpl decl = new CSSStyleDeclarationImpl(ffr); |
||||||
|
ffr.setStyle(decl); |
||||||
|
nodeStack_.push(ffr); |
||||||
|
nodeStack_.push(decl); |
||||||
|
} |
||||||
|
|
||||||
|
public void endFontFace() throws CSSException { |
||||||
|
// Pop both the style declaration and the font face rule nodes
|
||||||
|
nodeStack_.pop(); |
||||||
|
root_ = nodeStack_.pop(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startSelector(final SelectorList selectors) throws CSSException { |
||||||
|
startSelector(selectors, null); |
||||||
|
} |
||||||
|
|
||||||
|
public void startSelector(final SelectorList selectors, final Locator locator) throws CSSException { |
||||||
|
// Create the style rule and add it to the rule list
|
||||||
|
final CSSStyleRuleImpl sr = new CSSStyleRuleImpl( |
||||||
|
CSSOMParser.this.getParentStyleSheet(), |
||||||
|
getParentRule(), selectors); |
||||||
|
addLocator(locator, sr); |
||||||
|
if (!nodeStack_.empty()) { |
||||||
|
final Object o = nodeStack_.peek(); |
||||||
|
((CSSRuleListImpl) o).add(sr); |
||||||
|
} |
||||||
|
|
||||||
|
// Create the style declaration
|
||||||
|
final CSSStyleDeclarationImpl decl = new CSSStyleDeclarationImpl(sr); |
||||||
|
sr.setStyle(decl); |
||||||
|
nodeStack_.push(sr); |
||||||
|
nodeStack_.push(decl); |
||||||
|
} |
||||||
|
|
||||||
|
public void endSelector(final SelectorList selectors) throws CSSException { |
||||||
|
// Pop both the style declaration and the style rule nodes
|
||||||
|
nodeStack_.pop(); |
||||||
|
root_ = nodeStack_.pop(); |
||||||
|
} |
||||||
|
|
||||||
|
public void property(final String name, final LexicalUnit value, final boolean important) throws CSSException { |
||||||
|
property(name, value, important, null); |
||||||
|
} |
||||||
|
|
||||||
|
public void property(final String name, final LexicalUnit value, final boolean important, |
||||||
|
final Locator locator) { |
||||||
|
final CSSStyleDeclarationImpl decl = (CSSStyleDeclarationImpl) nodeStack_.peek(); |
||||||
|
try { |
||||||
|
final Property property = new Property(name, new CSSValueImpl(value), important); |
||||||
|
addLocator(locator, property); |
||||||
|
decl.addProperty(property); |
||||||
|
} |
||||||
|
catch (final DOMException e) { |
||||||
|
if (parser_ instanceof AbstractSACParser) { |
||||||
|
final AbstractSACParser parser = (AbstractSACParser) parser_; |
||||||
|
parser.getErrorHandler().error(parser.toCSSParseException(e)); |
||||||
|
|
||||||
|
} |
||||||
|
// call ErrorHandler?
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private CSSRule getParentRule() { |
||||||
|
if (!nodeStack_.empty() && nodeStack_.size() > 1) { |
||||||
|
final Object node = nodeStack_.get(nodeStack_.size() - 2); |
||||||
|
if (node instanceof CSSRule) { |
||||||
|
return (CSSRule) node; |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private void addLocator(Locator locator, final CSSOMObject cssomObject) { |
||||||
|
if (locator == null) { |
||||||
|
final Parser parser = CSSOMParser.this.parser_; |
||||||
|
try { |
||||||
|
final Method getLocatorMethod = parser.getClass().getMethod( |
||||||
|
"getLocator", (Class[]) null); |
||||||
|
locator = (Locator) getLocatorMethod.invoke( |
||||||
|
parser, (Object[]) null); |
||||||
|
} |
||||||
|
catch (final SecurityException e) { |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
catch (final NoSuchMethodException e) { |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
catch (final IllegalArgumentException e) { |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
catch (final IllegalAccessException e) { |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
catch (final InvocationTargetException e) { |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
} |
||||||
|
if (locator != null) { |
||||||
|
cssomObject.setUserData(UserDataConstants.KEY_LOCATOR, locator); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,120 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. CharStream.java Version 7.0 */ |
||||||
|
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
/** |
||||||
|
* This interface describes a character stream that maintains line and |
||||||
|
* column number positions of the characters. It also has the capability |
||||||
|
* to backup the stream to some extent. An implementation of this |
||||||
|
* interface is used in the TokenManager implementation generated by |
||||||
|
* JavaCCParser. |
||||||
|
* |
||||||
|
* All the methods except backup can be implemented in any fashion. backup |
||||||
|
* needs to be implemented correctly for the correct operation of the lexer. |
||||||
|
* Rest of the methods are all used to get information like line number, |
||||||
|
* column number and the String that constitutes a token and are not used |
||||||
|
* by the lexer. Hence their implementation won't affect the generated lexer's |
||||||
|
* operation. |
||||||
|
*/ |
||||||
|
|
||||||
|
public |
||||||
|
interface CharStream { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the next character from the selected input. The method |
||||||
|
* of selecting the input is the responsibility of the class
|
||||||
|
* implementing this interface. Can throw any java.io.IOException. |
||||||
|
*/ |
||||||
|
char readChar() throws java.io.IOException; |
||||||
|
|
||||||
|
@Deprecated |
||||||
|
/** |
||||||
|
* Returns the column position of the character last read. |
||||||
|
* @deprecated |
||||||
|
* @see #getEndColumn |
||||||
|
*/ |
||||||
|
int getColumn(); |
||||||
|
|
||||||
|
@Deprecated |
||||||
|
/** |
||||||
|
* Returns the line number of the character last read. |
||||||
|
* @deprecated |
||||||
|
* @see #getEndLine |
||||||
|
*/ |
||||||
|
int getLine(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the column number of the last character for current token (being |
||||||
|
* matched after the last call to BeginTOken). |
||||||
|
*/ |
||||||
|
int getEndColumn(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the line number of the last character for current token (being |
||||||
|
* matched after the last call to BeginTOken). |
||||||
|
*/ |
||||||
|
int getEndLine(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the column number of the first character for current token (being |
||||||
|
* matched after the last call to BeginTOken). |
||||||
|
*/ |
||||||
|
int getBeginColumn(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the line number of the first character for current token (being |
||||||
|
* matched after the last call to BeginTOken). |
||||||
|
*/ |
||||||
|
int getBeginLine(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Backs up the input stream by amount steps. Lexer calls this method if it |
||||||
|
* had already read some characters, but could not use them to match a |
||||||
|
* (longer) token. So, they will be used again as the prefix of the next |
||||||
|
* token and it is the implemetation's responsibility to do this right. |
||||||
|
*/ |
||||||
|
void backup(int amount); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the next character that marks the beginning of the next token. |
||||||
|
* All characters must remain in the buffer between two successive calls |
||||||
|
* to this method to implement backup correctly. |
||||||
|
*/ |
||||||
|
char BeginToken() throws java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a string made up of characters from the marked token beginning |
||||||
|
* to the current buffer position. Implementations have the choice of returning |
||||||
|
* anything that they want to. For example, for efficiency, one might decide |
||||||
|
* to just return null, which is a valid implementation. |
||||||
|
*/ |
||||||
|
String GetImage(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an array of characters that make up the suffix of length 'len' for |
||||||
|
* the currently matched token. This is used to build up the matched string |
||||||
|
* for use in actions in the case of MORE. A simple and inefficient |
||||||
|
* implementation of this is as follows : |
||||||
|
* |
||||||
|
* { |
||||||
|
* String t = GetImage(); |
||||||
|
* return t.substring(t.length() - len, t.length()).toCharArray(); |
||||||
|
* } |
||||||
|
*/ |
||||||
|
char[] GetSuffix(int len); |
||||||
|
|
||||||
|
/** |
||||||
|
* The lexer calls this function to indicate that it is done with the stream |
||||||
|
* and hence implementations can free any resources held by this class. |
||||||
|
* Again, the body of this function can be just empty and it will not |
||||||
|
* affect the lexer's operation. |
||||||
|
*/ |
||||||
|
void Done(); |
||||||
|
|
||||||
|
|
||||||
|
void setTabSize(int i); |
||||||
|
int getTabSize(); |
||||||
|
boolean getTrackLineColumn(); |
||||||
|
void setTrackLineColumn(boolean trackLineColumn); |
||||||
|
} |
||||||
|
/* JavaCC - OriginalChecksum=5226f2ae40a0ca5a5d5c722f00281ba2 (do not edit this line) */ |
@ -0,0 +1,365 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */ |
||||||
|
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
/** |
||||||
|
* An implementation of interface CharStream. |
||||||
|
* There is no processing of escaping in this class because the escaping is |
||||||
|
* part of the parser. CSS has some strange rules about that, so processing |
||||||
|
* unicode escapes in this class is too early. |
||||||
|
*/ |
||||||
|
|
||||||
|
public final class CssCharStream implements CharStream |
||||||
|
{ |
||||||
|
/** Whether parser is static. */ |
||||||
|
public static final boolean staticFlag = false; |
||||||
|
|
||||||
|
private static final int BUFFER_SIZE = 2048; |
||||||
|
|
||||||
|
int bufsize; |
||||||
|
int available; |
||||||
|
int tokenBegin; |
||||||
|
/** Position in buffer. */ |
||||||
|
public int bufpos = -1; |
||||||
|
private int bufline[]; |
||||||
|
private int bufcolumn[]; |
||||||
|
|
||||||
|
private int column = 0; |
||||||
|
private int line = 1; |
||||||
|
|
||||||
|
private boolean prevCharIsCR = false; |
||||||
|
private boolean prevCharIsLF = false; |
||||||
|
|
||||||
|
private java.io.Reader inputStream; |
||||||
|
|
||||||
|
private char[] buffer; |
||||||
|
private int maxNextCharInd = 0; |
||||||
|
private int inBuf = 0; |
||||||
|
|
||||||
|
private int tabSize = 1; |
||||||
|
private boolean trackLineColumn = true; |
||||||
|
|
||||||
|
private void ExpandBuff(boolean wrapAround) |
||||||
|
{ |
||||||
|
char[] newbuffer = new char[bufsize + BUFFER_SIZE]; |
||||||
|
int newbufline[] = new int[bufsize + BUFFER_SIZE]; |
||||||
|
int newbufcolumn[] = new int[bufsize + BUFFER_SIZE]; |
||||||
|
|
||||||
|
try |
||||||
|
{ |
||||||
|
if (wrapAround) |
||||||
|
{ |
||||||
|
System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); |
||||||
|
System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos); |
||||||
|
buffer = newbuffer; |
||||||
|
|
||||||
|
System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); |
||||||
|
System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); |
||||||
|
bufline = newbufline; |
||||||
|
|
||||||
|
System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); |
||||||
|
System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); |
||||||
|
bufcolumn = newbufcolumn; |
||||||
|
|
||||||
|
maxNextCharInd = (bufpos += (bufsize - tokenBegin)); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); |
||||||
|
buffer = newbuffer; |
||||||
|
|
||||||
|
System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); |
||||||
|
bufline = newbufline; |
||||||
|
|
||||||
|
System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); |
||||||
|
bufcolumn = newbufcolumn; |
||||||
|
|
||||||
|
maxNextCharInd = (bufpos -= tokenBegin); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Throwable t) |
||||||
|
{ |
||||||
|
throw new Error(t.getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
bufsize += BUFFER_SIZE; |
||||||
|
available = bufsize; |
||||||
|
tokenBegin = 0; |
||||||
|
} |
||||||
|
|
||||||
|
private final void FillBuff() throws java.io.IOException |
||||||
|
{ |
||||||
|
if (maxNextCharInd == available) |
||||||
|
{ |
||||||
|
if (available == bufsize) |
||||||
|
{ |
||||||
|
if (tokenBegin > BUFFER_SIZE) |
||||||
|
{ |
||||||
|
bufpos = maxNextCharInd = 0; |
||||||
|
available = tokenBegin; |
||||||
|
} |
||||||
|
else if (tokenBegin < 0) |
||||||
|
bufpos = maxNextCharInd = 0; |
||||||
|
else |
||||||
|
ExpandBuff(false); |
||||||
|
} |
||||||
|
else if (available > tokenBegin) |
||||||
|
available = bufsize; |
||||||
|
else if ((tokenBegin - available) < BUFFER_SIZE) |
||||||
|
ExpandBuff(true); |
||||||
|
else |
||||||
|
available = tokenBegin; |
||||||
|
} |
||||||
|
|
||||||
|
int i; |
||||||
|
try { |
||||||
|
if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) |
||||||
|
{ |
||||||
|
inputStream.close(); |
||||||
|
throw new java.io.IOException(); |
||||||
|
} |
||||||
|
|
||||||
|
maxNextCharInd += i; |
||||||
|
return; |
||||||
|
} |
||||||
|
catch(java.io.IOException e) { |
||||||
|
--bufpos; |
||||||
|
backup(0); |
||||||
|
if (tokenBegin == -1) |
||||||
|
tokenBegin = bufpos; |
||||||
|
throw e; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Start. */ |
||||||
|
public final char BeginToken() throws java.io.IOException |
||||||
|
{ |
||||||
|
tokenBegin = -1; |
||||||
|
char c = readChar(); |
||||||
|
tokenBegin = bufpos; |
||||||
|
|
||||||
|
return c; |
||||||
|
} |
||||||
|
|
||||||
|
private final void UpdateLineColumn(char c) |
||||||
|
{ |
||||||
|
column++; |
||||||
|
|
||||||
|
if (prevCharIsLF) |
||||||
|
{ |
||||||
|
prevCharIsLF = false; |
||||||
|
line += (column = 1); |
||||||
|
} |
||||||
|
else if (prevCharIsCR) |
||||||
|
{ |
||||||
|
prevCharIsCR = false; |
||||||
|
if (c == '\n') |
||||||
|
{ |
||||||
|
prevCharIsLF = true; |
||||||
|
} |
||||||
|
else |
||||||
|
line += (column = 1); |
||||||
|
} |
||||||
|
|
||||||
|
switch (c) |
||||||
|
{ |
||||||
|
case '\r' : |
||||||
|
prevCharIsCR = true; |
||||||
|
break; |
||||||
|
case '\n' : |
||||||
|
prevCharIsLF = true; |
||||||
|
break; |
||||||
|
// case '\t' :
|
||||||
|
// column--;
|
||||||
|
// column += (8 - (column & 07));
|
||||||
|
// break;
|
||||||
|
default : |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
bufline[bufpos] = line; |
||||||
|
bufcolumn[bufpos] = column; |
||||||
|
} |
||||||
|
|
||||||
|
/** Read a character. */ |
||||||
|
public final char readChar() throws java.io.IOException |
||||||
|
{ |
||||||
|
if (inBuf > 0) |
||||||
|
{ |
||||||
|
--inBuf; |
||||||
|
|
||||||
|
if (++bufpos == bufsize) |
||||||
|
bufpos = 0; |
||||||
|
|
||||||
|
return buffer[bufpos]; |
||||||
|
} |
||||||
|
|
||||||
|
if (++bufpos >= maxNextCharInd) |
||||||
|
FillBuff(); |
||||||
|
|
||||||
|
char c = buffer[bufpos]; |
||||||
|
|
||||||
|
UpdateLineColumn(c); |
||||||
|
return c; |
||||||
|
} |
||||||
|
|
||||||
|
@Deprecated |
||||||
|
/** |
||||||
|
* @deprecated |
||||||
|
* @see #getEndColumn |
||||||
|
*/ |
||||||
|
public final int getColumn() { |
||||||
|
return bufcolumn[bufpos]; |
||||||
|
} |
||||||
|
|
||||||
|
@Deprecated |
||||||
|
/** |
||||||
|
* @deprecated |
||||||
|
* @see #getEndLine |
||||||
|
*/ |
||||||
|
public final int getLine() { |
||||||
|
return bufline[bufpos]; |
||||||
|
} |
||||||
|
|
||||||
|
/** Get token end column number. */ |
||||||
|
public final int getEndColumn() { |
||||||
|
return bufcolumn[bufpos]; |
||||||
|
} |
||||||
|
|
||||||
|
/** Get token end line number. */ |
||||||
|
public final int getEndLine() { |
||||||
|
return bufline[bufpos]; |
||||||
|
} |
||||||
|
|
||||||
|
/** Get token beginning column number. */ |
||||||
|
public final int getBeginColumn() { |
||||||
|
return bufcolumn[tokenBegin]; |
||||||
|
} |
||||||
|
|
||||||
|
/** Get token beginning line number. */ |
||||||
|
public final int getBeginLine() { |
||||||
|
return bufline[tokenBegin]; |
||||||
|
} |
||||||
|
|
||||||
|
/** Backup a number of characters. */ |
||||||
|
public final void backup(int amount) { |
||||||
|
inBuf += amount; |
||||||
|
if ((bufpos -= amount) < 0) |
||||||
|
bufpos += bufsize; |
||||||
|
} |
||||||
|
|
||||||
|
/** Constructor. */ |
||||||
|
public CssCharStream(java.io.Reader dstream, int startline, int startcolumn, int buffersize) |
||||||
|
{ |
||||||
|
inputStream = dstream; |
||||||
|
line = startline; |
||||||
|
column = startcolumn - 1; |
||||||
|
|
||||||
|
available = bufsize = buffersize; |
||||||
|
buffer = new char[buffersize]; |
||||||
|
bufline = new int[buffersize]; |
||||||
|
bufcolumn = new int[buffersize]; |
||||||
|
} |
||||||
|
|
||||||
|
/** Constructor. */ |
||||||
|
public CssCharStream(java.io.Reader dstream, int startline, |
||||||
|
int startcolumn) |
||||||
|
{ |
||||||
|
this(dstream, startline, startcolumn, 4096); |
||||||
|
} |
||||||
|
|
||||||
|
/** Get token literal value. */ |
||||||
|
public final String GetImage() |
||||||
|
{ |
||||||
|
if (bufpos >= tokenBegin) |
||||||
|
return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); |
||||||
|
return new String(buffer, tokenBegin, bufsize - tokenBegin) + new String(buffer, 0, bufpos + 1); |
||||||
|
} |
||||||
|
|
||||||
|
/** Get the suffix. */ |
||||||
|
public final char[] GetSuffix(int len) |
||||||
|
{ |
||||||
|
char[] ret = new char[len]; |
||||||
|
|
||||||
|
if ((bufpos + 1) >= len) |
||||||
|
System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); |
||||||
|
else |
||||||
|
{ |
||||||
|
System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, len - bufpos - 1); |
||||||
|
System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); |
||||||
|
} |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
/** Reset buffer when finished. */ |
||||||
|
public void Done() |
||||||
|
{ |
||||||
|
buffer = null; |
||||||
|
bufline = null; |
||||||
|
bufcolumn = null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Method to adjust line and column numbers for the start of a token. |
||||||
|
*/ |
||||||
|
public void adjustBeginLineColumn(int newLine, int newCol) |
||||||
|
{ |
||||||
|
int start = tokenBegin; |
||||||
|
int len; |
||||||
|
|
||||||
|
if (bufpos >= tokenBegin) |
||||||
|
{ |
||||||
|
len = bufpos - tokenBegin + inBuf + 1; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
len = bufsize - tokenBegin + bufpos + 1 + inBuf; |
||||||
|
} |
||||||
|
|
||||||
|
int i = 0, j = 0, k = 0; |
||||||
|
int nextColDiff = 0, columnDiff = 0; |
||||||
|
|
||||||
|
while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) |
||||||
|
{ |
||||||
|
bufline[j] = newLine; |
||||||
|
nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; |
||||||
|
bufcolumn[j] = newCol + columnDiff; |
||||||
|
columnDiff = nextColDiff; |
||||||
|
i++; |
||||||
|
} |
||||||
|
|
||||||
|
if (i < len) |
||||||
|
{ |
||||||
|
bufline[j] = newLine++; |
||||||
|
bufcolumn[j] = newCol + columnDiff; |
||||||
|
|
||||||
|
while (i++ < len) |
||||||
|
{ |
||||||
|
if (bufline[j = start % bufsize] != bufline[++start % bufsize]) |
||||||
|
bufline[j] = newLine++; |
||||||
|
else |
||||||
|
bufline[j] = newLine; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
line = bufline[j]; |
||||||
|
column = bufcolumn[j]; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTabSize(int i) { |
||||||
|
tabSize = i; |
||||||
|
} |
||||||
|
|
||||||
|
public int getTabSize() { |
||||||
|
return tabSize; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getTrackLineColumn() { |
||||||
|
return trackLineColumn; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTrackLineColumn(boolean tlc) { |
||||||
|
trackLineColumn = tlc; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import java.util.ListResourceBundle; |
||||||
|
|
||||||
|
/** |
||||||
|
* ExceptionResource. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class ExceptionResource extends ListResourceBundle { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Object[][] getContents() { |
||||||
|
return contents; |
||||||
|
} |
||||||
|
|
||||||
|
static final Object[][] contents = { |
||||||
|
{"s0", "Syntax error"}, |
||||||
|
{"s1", "Index out of bounds error"}, |
||||||
|
{"s2", "This style sheet is read only"}, |
||||||
|
{"s3", "The text does not represent an unknown rule"}, |
||||||
|
{"s4", "The text does not represent a style rule"}, |
||||||
|
{"s5", "The text does not represent a charset rule"}, |
||||||
|
{"s6", "The text does not represent an import rule"}, |
||||||
|
{"s7", "The text does not represent a media rule"}, |
||||||
|
{"s8", "The text does not represent a font face rule"}, |
||||||
|
{"s9", "The text does not represent a page rule"}, |
||||||
|
{"s10", "This isn't a Float type"}, |
||||||
|
{"s11", "This isn't a String type"}, |
||||||
|
{"s12", "This isn't a Counter type"}, |
||||||
|
{"s13", "This isn't a Rect type"}, |
||||||
|
{"s14", "This isn't an RGBColor type"}, |
||||||
|
{"s15", "A charset rule must be the first rule"}, |
||||||
|
{"s16", "A charset rule already exists"}, |
||||||
|
{"s17", "An import rule must preceed all other rules"}, |
||||||
|
{"s18", "The specified type was not found"}, |
||||||
|
{"s20", "Can't insert a rule before the last charset or import rule"} |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,162 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.sac.DocumentHandlerExt; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.CSSParseException; |
||||||
|
import org.w3c.css.sac.ErrorHandler; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
|
||||||
|
/** |
||||||
|
* Empty implementation of the DocumentHandlerExt interface. |
||||||
|
*/ |
||||||
|
public class HandlerBase implements DocumentHandlerExt, ErrorHandler { |
||||||
|
|
||||||
|
public void startDocument(final InputSource source) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void endDocument(final InputSource source) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void comment(final String text) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void ignorableAtRule(final String atRule) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void ignorableAtRule(final String atRule, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void namespaceDeclaration(final String prefix, final String uri) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void importStyle(final String uri, final SACMediaList media, |
||||||
|
final String defaultNamespaceURI) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void importStyle(final String uri, final SACMediaList media, |
||||||
|
final String defaultNamespaceURI, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startMedia(final SACMediaList media) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startMedia(final SACMediaList media, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void endMedia(final SACMediaList media) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startPage(final String name, final String pseudoPage) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startPage(final String name, final String pseudoPage, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void endPage(final String name, final String pseudoPage) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startFontFace() throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startFontFace(final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void endFontFace() throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startSelector(final SelectorList selectors) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void startSelector(final SelectorList selectors, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void endSelector(final SelectorList selectors) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void property(final String name, final LexicalUnit value, final boolean important) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void property(final String name, final LexicalUnit value, final boolean important, final Locator locator) { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void charset(final String characterEncoding, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void warning(final CSSParseException exception) throws CSSException { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(exception.getURI()) |
||||||
|
.append(" [") |
||||||
|
.append(exception.getLineNumber()) |
||||||
|
.append(":") |
||||||
|
.append(exception.getColumnNumber()) |
||||||
|
.append("] ") |
||||||
|
.append(exception.getMessage()); |
||||||
|
System.err.println(sb.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
public void error(final CSSParseException exception) throws CSSException { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(exception.getURI()) |
||||||
|
.append(" [") |
||||||
|
.append(exception.getLineNumber()) |
||||||
|
.append(":") |
||||||
|
.append(exception.getColumnNumber()) |
||||||
|
.append("] ") |
||||||
|
.append(exception.getMessage()); |
||||||
|
System.err.println(sb.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
public void fatalError(final CSSParseException exception) throws CSSException { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(exception.getURI()) |
||||||
|
.append(" [") |
||||||
|
.append(exception.getLineNumber()) |
||||||
|
.append(":") |
||||||
|
.append(exception.getColumnNumber()) |
||||||
|
.append("] ") |
||||||
|
.append(exception.getMessage()); |
||||||
|
System.err.println(sb.toString()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,780 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link LexicalUnit}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class LexicalUnitImpl extends LocatableImpl implements LexicalUnit, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -7260032046960116891L; |
||||||
|
|
||||||
|
private short lexicalUnitType_; |
||||||
|
private LexicalUnit nextLexicalUnit_; |
||||||
|
private LexicalUnit previousLexicalUnit_; |
||||||
|
private float floatValue_; |
||||||
|
private String dimension_; |
||||||
|
private String functionName_; |
||||||
|
private LexicalUnit parameters_; |
||||||
|
private String stringValue_; |
||||||
|
private String sourceStringValue_; |
||||||
|
|
||||||
|
/** cache */ |
||||||
|
private transient String toString_; |
||||||
|
|
||||||
|
public void setLexicalUnitType(final short type) { |
||||||
|
lexicalUnitType_ = type; |
||||||
|
toString_ = null; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNextLexicalUnit(final LexicalUnit next) { |
||||||
|
nextLexicalUnit_ = next; |
||||||
|
} |
||||||
|
|
||||||
|
public void setPreviousLexicalUnit(final LexicalUnit prev) { |
||||||
|
previousLexicalUnit_ = prev; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFloatValue(final float floatVal) { |
||||||
|
floatValue_ = floatVal; |
||||||
|
toString_ = null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDimension() { |
||||||
|
return dimension_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDimension(final String dimension) { |
||||||
|
dimension_ = dimension; |
||||||
|
toString_ = null; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFunctionName(final String function) { |
||||||
|
functionName_ = function; |
||||||
|
toString_ = null; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParameters(final LexicalUnit params) { |
||||||
|
parameters_ = params; |
||||||
|
toString_ = null; |
||||||
|
} |
||||||
|
|
||||||
|
public void setStringValue(final String stringVal) { |
||||||
|
stringValue_ = stringVal; |
||||||
|
toString_ = null; |
||||||
|
} |
||||||
|
|
||||||
|
protected LexicalUnitImpl(final LexicalUnit previous, final short type) { |
||||||
|
this(); |
||||||
|
lexicalUnitType_ = type; |
||||||
|
previousLexicalUnit_ = previous; |
||||||
|
if (previousLexicalUnit_ != null) { |
||||||
|
((LexicalUnitImpl) previousLexicalUnit_).nextLexicalUnit_ = this; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Integer |
||||||
|
*/ |
||||||
|
protected LexicalUnitImpl(final LexicalUnit previous, final int value) { |
||||||
|
this(previous, SAC_INTEGER); |
||||||
|
floatValue_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Dimension |
||||||
|
*/ |
||||||
|
protected LexicalUnitImpl(final LexicalUnit previous, final short type, final float value) { |
||||||
|
this(previous, type); |
||||||
|
floatValue_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unknown dimension |
||||||
|
*/ |
||||||
|
protected LexicalUnitImpl( |
||||||
|
final LexicalUnit previous, |
||||||
|
final short type, |
||||||
|
final String dimension, |
||||||
|
final float value) { |
||||||
|
this(previous, type); |
||||||
|
dimension_ = dimension; |
||||||
|
floatValue_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* String |
||||||
|
*/ |
||||||
|
protected LexicalUnitImpl(final LexicalUnit previous, final short type, final String value) { |
||||||
|
this(previous, type); |
||||||
|
stringValue_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Function |
||||||
|
*/ |
||||||
|
protected LexicalUnitImpl( |
||||||
|
final LexicalUnit previous, |
||||||
|
final short type, |
||||||
|
final String name, |
||||||
|
final LexicalUnit params) { |
||||||
|
this(previous, type); |
||||||
|
functionName_ = name; |
||||||
|
parameters_ = params; |
||||||
|
} |
||||||
|
|
||||||
|
protected LexicalUnitImpl(final LexicalUnit previous, final short type, final String name, |
||||||
|
final String stringValue) { |
||||||
|
this(previous, type); |
||||||
|
functionName_ = name; |
||||||
|
stringValue_ = stringValue; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Default constructor. |
||||||
|
*/ |
||||||
|
protected LexicalUnitImpl() { |
||||||
|
} |
||||||
|
|
||||||
|
public short getLexicalUnitType() { |
||||||
|
return lexicalUnitType_; |
||||||
|
} |
||||||
|
|
||||||
|
public LexicalUnit getNextLexicalUnit() { |
||||||
|
return nextLexicalUnit_; |
||||||
|
} |
||||||
|
|
||||||
|
public LexicalUnit getPreviousLexicalUnit() { |
||||||
|
return previousLexicalUnit_; |
||||||
|
} |
||||||
|
|
||||||
|
public int getIntegerValue() { |
||||||
|
return (int) floatValue_; |
||||||
|
} |
||||||
|
|
||||||
|
public float getFloatValue() { |
||||||
|
return floatValue_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDimensionUnitText() { |
||||||
|
switch (lexicalUnitType_) { |
||||||
|
case SAC_EM: |
||||||
|
return "em"; |
||||||
|
case SAC_EX: |
||||||
|
return "ex"; |
||||||
|
case SAC_PIXEL: |
||||||
|
return "px"; |
||||||
|
case SAC_INCH: |
||||||
|
return "in"; |
||||||
|
case SAC_CENTIMETER: |
||||||
|
return "cm"; |
||||||
|
case SAC_MILLIMETER: |
||||||
|
return "mm"; |
||||||
|
case SAC_POINT: |
||||||
|
return "pt"; |
||||||
|
case SAC_PICA: |
||||||
|
return "pc"; |
||||||
|
case SAC_PERCENTAGE: |
||||||
|
return "%"; |
||||||
|
case SAC_DEGREE: |
||||||
|
return "deg"; |
||||||
|
case SAC_GRADIAN: |
||||||
|
return "grad"; |
||||||
|
case SAC_RADIAN: |
||||||
|
return "rad"; |
||||||
|
case SAC_MILLISECOND: |
||||||
|
return "ms"; |
||||||
|
case SAC_SECOND: |
||||||
|
return "s"; |
||||||
|
case SAC_HERTZ: |
||||||
|
return "Hz"; |
||||||
|
case SAC_KILOHERTZ: |
||||||
|
return "kHz"; |
||||||
|
case SAC_DIMENSION: |
||||||
|
return dimension_; |
||||||
|
default: |
||||||
|
return ""; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getFunctionName() { |
||||||
|
return functionName_; |
||||||
|
} |
||||||
|
|
||||||
|
public LexicalUnit getParameters() { |
||||||
|
return parameters_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getStringValue() { |
||||||
|
return stringValue_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSourceStringValue() { |
||||||
|
return sourceStringValue_; |
||||||
|
} |
||||||
|
|
||||||
|
public LexicalUnit getSubValues() { |
||||||
|
return parameters_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Same as {@link #getCssText(CSSFormat)} but using the default format. |
||||||
|
* |
||||||
|
* @return the formated string |
||||||
|
*/ |
||||||
|
public String getCssText() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
if (null != toString_ && (format == null || !format.useSourceStringValues())) { |
||||||
|
return toString_; |
||||||
|
} |
||||||
|
|
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
switch (lexicalUnitType_) { |
||||||
|
case SAC_OPERATOR_COMMA: |
||||||
|
sb.append(","); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_PLUS: |
||||||
|
sb.append("+"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_MINUS: |
||||||
|
sb.append("-"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_MULTIPLY: |
||||||
|
sb.append("*"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_SLASH: |
||||||
|
sb.append("/"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_MOD: |
||||||
|
sb.append("%"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_EXP: |
||||||
|
sb.append("^"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_LT: |
||||||
|
sb.append("<"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_GT: |
||||||
|
sb.append(">"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_LE: |
||||||
|
sb.append("<="); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_GE: |
||||||
|
sb.append(">="); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_TILDE: |
||||||
|
sb.append("~"); |
||||||
|
break; |
||||||
|
case SAC_INHERIT: |
||||||
|
sb.append("inherit"); |
||||||
|
break; |
||||||
|
case SAC_INTEGER: |
||||||
|
sb.append(String.valueOf(getIntegerValue())); |
||||||
|
break; |
||||||
|
case SAC_REAL: |
||||||
|
sb.append(getTrimedFloatValue()); |
||||||
|
break; |
||||||
|
case SAC_EM: |
||||||
|
case SAC_EX: |
||||||
|
case SAC_PIXEL: |
||||||
|
case SAC_INCH: |
||||||
|
case SAC_CENTIMETER: |
||||||
|
case SAC_MILLIMETER: |
||||||
|
case SAC_POINT: |
||||||
|
case SAC_PICA: |
||||||
|
case SAC_PERCENTAGE: |
||||||
|
case SAC_DEGREE: |
||||||
|
case SAC_GRADIAN: |
||||||
|
case SAC_RADIAN: |
||||||
|
case SAC_MILLISECOND: |
||||||
|
case SAC_SECOND: |
||||||
|
case SAC_HERTZ: |
||||||
|
case SAC_KILOHERTZ: |
||||||
|
case SAC_DIMENSION: |
||||||
|
sb.append(getTrimedFloatValue()); |
||||||
|
final String dimUnitText = getDimensionUnitText(); |
||||||
|
if (null != dimUnitText) { |
||||||
|
sb.append(dimUnitText); |
||||||
|
} |
||||||
|
break; |
||||||
|
case SAC_URI: |
||||||
|
sb.append("url(").append(getStringValue()).append(")"); |
||||||
|
break; |
||||||
|
case SAC_COUNTER_FUNCTION: |
||||||
|
sb.append("counter("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append(")"); |
||||||
|
break; |
||||||
|
case SAC_COUNTERS_FUNCTION: |
||||||
|
sb.append("counters("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append(")"); |
||||||
|
break; |
||||||
|
case SAC_RGBCOLOR: |
||||||
|
sb.append("rgb("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append(")"); |
||||||
|
break; |
||||||
|
case SAC_IDENT: |
||||||
|
sb.append(getStringValue()); |
||||||
|
break; |
||||||
|
case SAC_STRING_VALUE: |
||||||
|
sb.append("\""); |
||||||
|
|
||||||
|
String value = getStringValue(); |
||||||
|
if (null != format && format.useSourceStringValues() |
||||||
|
&& sourceStringValue_ != null |
||||||
|
&& value != sourceStringValue_) { |
||||||
|
value = sourceStringValue_; |
||||||
|
} |
||||||
|
else { |
||||||
|
// replace line breaks
|
||||||
|
value = value.replace("\n", "\\A ").replace("\r", "\\D "); |
||||||
|
} |
||||||
|
sb.append(value); |
||||||
|
|
||||||
|
sb.append("\""); |
||||||
|
break; |
||||||
|
case SAC_ATTR: |
||||||
|
sb.append("attr(") |
||||||
|
.append(getStringValue()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_RECT_FUNCTION: |
||||||
|
sb.append("rect("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append(")"); |
||||||
|
break; |
||||||
|
case SAC_UNICODERANGE: |
||||||
|
final String range = getStringValue(); |
||||||
|
if (null != range) { |
||||||
|
sb.append(range); |
||||||
|
} |
||||||
|
break; |
||||||
|
case SAC_SUB_EXPRESSION: |
||||||
|
final String subExpression = getStringValue(); |
||||||
|
if (null != subExpression) { |
||||||
|
sb.append(subExpression); |
||||||
|
} |
||||||
|
break; |
||||||
|
case SAC_FUNCTION: |
||||||
|
final String functName = getFunctionName(); |
||||||
|
if (null != functName) { |
||||||
|
sb.append(functName); |
||||||
|
} |
||||||
|
sb.append('('); |
||||||
|
appendParams(sb); |
||||||
|
sb.append(")"); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
toString_ = sb.toString(); |
||||||
|
return toString_; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
|
||||||
|
public String toDebugString() { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
switch (lexicalUnitType_) { |
||||||
|
case SAC_OPERATOR_COMMA: |
||||||
|
sb.append("SAC_OPERATOR_COMMA"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_PLUS: |
||||||
|
sb.append("SAC_OPERATOR_PLUS"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_MINUS: |
||||||
|
sb.append("SAC_OPERATOR_MINUS"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_MULTIPLY: |
||||||
|
sb.append("SAC_OPERATOR_MULTIPLY"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_SLASH: |
||||||
|
sb.append("SAC_OPERATOR_SLASH"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_MOD: |
||||||
|
sb.append("SAC_OPERATOR_MOD"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_EXP: |
||||||
|
sb.append("SAC_OPERATOR_EXP"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_LT: |
||||||
|
sb.append("SAC_OPERATOR_LT"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_GT: |
||||||
|
sb.append("SAC_OPERATOR_GT"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_LE: |
||||||
|
sb.append("SAC_OPERATOR_LE"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_GE: |
||||||
|
sb.append("SAC_OPERATOR_GE"); |
||||||
|
break; |
||||||
|
case SAC_OPERATOR_TILDE: |
||||||
|
sb.append("SAC_OPERATOR_TILDE"); |
||||||
|
break; |
||||||
|
case SAC_INHERIT: |
||||||
|
sb.append("SAC_INHERIT"); |
||||||
|
break; |
||||||
|
case SAC_INTEGER: |
||||||
|
sb.append("SAC_INTEGER(") |
||||||
|
.append(String.valueOf(getIntegerValue())) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_REAL: |
||||||
|
sb.append("SAC_REAL(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_EM: |
||||||
|
sb.append("SAC_EM(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_EX: |
||||||
|
sb.append("SAC_EX(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_PIXEL: |
||||||
|
sb.append("SAC_PIXEL(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_INCH: |
||||||
|
sb.append("SAC_INCH(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_CENTIMETER: |
||||||
|
sb.append("SAC_CENTIMETER(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_MILLIMETER: |
||||||
|
sb.append("SAC_MILLIMETER(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_POINT: |
||||||
|
sb.append("SAC_POINT(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_PICA: |
||||||
|
sb.append("SAC_PICA(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_PERCENTAGE: |
||||||
|
sb.append("SAC_PERCENTAGE(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_DEGREE: |
||||||
|
sb.append("SAC_DEGREE(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_GRADIAN: |
||||||
|
sb.append("SAC_GRADIAN(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_RADIAN: |
||||||
|
sb.append("SAC_RADIAN(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_MILLISECOND: |
||||||
|
sb.append("SAC_MILLISECOND(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_SECOND: |
||||||
|
sb.append("SAC_SECOND(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_HERTZ: |
||||||
|
sb.append("SAC_HERTZ(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_KILOHERTZ: |
||||||
|
sb.append("SAC_KILOHERTZ(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_DIMENSION: |
||||||
|
sb.append("SAC_DIMENSION(") |
||||||
|
.append(getTrimedFloatValue()) |
||||||
|
.append(getDimensionUnitText()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_URI: |
||||||
|
sb.append("SAC_URI(url(") |
||||||
|
.append(getStringValue()) |
||||||
|
.append("))"); |
||||||
|
break; |
||||||
|
case SAC_COUNTER_FUNCTION: |
||||||
|
sb.append("SAC_COUNTER_FUNCTION(counter("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append("))"); |
||||||
|
break; |
||||||
|
case SAC_COUNTERS_FUNCTION: |
||||||
|
sb.append("SAC_COUNTERS_FUNCTION(counters("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append("))"); |
||||||
|
break; |
||||||
|
case SAC_RGBCOLOR: |
||||||
|
sb.append("SAC_RGBCOLOR(rgb("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append("))"); |
||||||
|
break; |
||||||
|
case SAC_IDENT: |
||||||
|
sb.append("SAC_IDENT(") |
||||||
|
.append(getStringValue()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_STRING_VALUE: |
||||||
|
sb.append("SAC_STRING_VALUE(\"") |
||||||
|
.append(getStringValue()) |
||||||
|
.append("\")"); |
||||||
|
break; |
||||||
|
case SAC_ATTR: |
||||||
|
sb.append("SAC_ATTR(attr(") |
||||||
|
.append(getStringValue()) |
||||||
|
.append("))"); |
||||||
|
break; |
||||||
|
case SAC_RECT_FUNCTION: |
||||||
|
sb.append("SAC_RECT_FUNCTION(rect("); |
||||||
|
appendParams(sb); |
||||||
|
sb.append("))"); |
||||||
|
break; |
||||||
|
case SAC_UNICODERANGE: |
||||||
|
sb.append("SAC_UNICODERANGE(") |
||||||
|
.append(getStringValue()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_SUB_EXPRESSION: |
||||||
|
sb.append("SAC_SUB_EXPRESSION(") |
||||||
|
.append(getStringValue()) |
||||||
|
.append(")"); |
||||||
|
break; |
||||||
|
case SAC_FUNCTION: |
||||||
|
sb.append("SAC_FUNCTION(") |
||||||
|
.append(getFunctionName()) |
||||||
|
.append("("); |
||||||
|
LexicalUnit l = parameters_; |
||||||
|
while (l != null) { |
||||||
|
sb.append(l.toString()); |
||||||
|
l = l.getNextLexicalUnit(); |
||||||
|
} |
||||||
|
sb.append("))"); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private void appendParams(final StringBuilder sb) { |
||||||
|
LexicalUnit l = parameters_; |
||||||
|
if (l != null) { |
||||||
|
sb.append(l.toString()); |
||||||
|
l = l.getNextLexicalUnit(); |
||||||
|
while (l != null) { |
||||||
|
if (l.getLexicalUnitType() != SAC_OPERATOR_COMMA) { |
||||||
|
sb.append(" "); |
||||||
|
} |
||||||
|
sb.append(l.toString()); |
||||||
|
l = l.getNextLexicalUnit(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getTrimedFloatValue() { |
||||||
|
final float f = getFloatValue(); |
||||||
|
final int i = (int) f; |
||||||
|
|
||||||
|
if (f - i == 0) { |
||||||
|
return Integer.toString((int) f); |
||||||
|
} |
||||||
|
return Float.toString(f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createNumber(final LexicalUnit prev, final int i) { |
||||||
|
return new LexicalUnitImpl(prev, i); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createNumber(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_REAL, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createPercentage(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_PERCENTAGE, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createPixel(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_PIXEL, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createCentimeter(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_CENTIMETER, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createMillimeter(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_MILLIMETER, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createInch(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_INCH, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createPoint(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_POINT, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createPica(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_PICA, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createEm(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_EM, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createEx(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_EX, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createDegree(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_DEGREE, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createRadian(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_RADIAN, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createGradian(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_GRADIAN, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createMillisecond(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_MILLISECOND, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createSecond(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_SECOND, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createHertz(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_HERTZ, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createDimension(final LexicalUnit prev, final float f, final String dim) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_DIMENSION, dim, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createKiloHertz(final LexicalUnit prev, final float f) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_KILOHERTZ, f); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createCounter(final LexicalUnit prev, final LexicalUnit params) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_COUNTER_FUNCTION, "counter", params); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createCounters(final LexicalUnit prev, final LexicalUnit params) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_COUNTERS_FUNCTION, "counters", params); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createAttr(final LexicalUnit prev, final String value) { |
||||||
|
// according to LexicalUnit.SAC_ATTR, LexicalUnit.getStringValue(), not
|
||||||
|
// LexicalUnit.getParameters() is applicable
|
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_ATTR, "name", value); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createRect(final LexicalUnit prev, final LexicalUnit params) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_RECT_FUNCTION, "rect", params); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createRgbColor(final LexicalUnit prev, final LexicalUnit params) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_RGBCOLOR, "rgb", params); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createFunction(final LexicalUnit prev, final String name, final LexicalUnit params) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_FUNCTION, name, params); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createString(final LexicalUnit prev, final String value) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_STRING_VALUE, value); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createString(final LexicalUnit prev, final String value, final String sourceStringValue) { |
||||||
|
final LexicalUnitImpl unit = new LexicalUnitImpl(prev, LexicalUnit.SAC_STRING_VALUE, value); |
||||||
|
unit.sourceStringValue_ = sourceStringValue; |
||||||
|
return unit; |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createIdent(final LexicalUnit prev, final String value) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_IDENT, value); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createURI(final LexicalUnit prev, final String value) { |
||||||
|
return new LexicalUnitImpl(prev, LexicalUnit.SAC_URI, value); |
||||||
|
} |
||||||
|
|
||||||
|
public static LexicalUnit createComma(final LexicalUnit prev) { |
||||||
|
return new LexicalUnitImpl(prev, SAC_OPERATOR_COMMA); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
|
||||||
|
/** |
||||||
|
* An object that provides a SAC locator |
||||||
|
* |
||||||
|
* @author <a href="mailto:waldbaer@users.sourceforge.net">Johannes Koch</a> |
||||||
|
*/ |
||||||
|
public interface Locatable { |
||||||
|
|
||||||
|
Locator getLocator(); |
||||||
|
|
||||||
|
void setLocator(Locator locator); |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link Locatable} |
||||||
|
* |
||||||
|
* @author <a href="mailto:waldbaer@users.sourceforge.net">Johannes Koch</a> |
||||||
|
*/ |
||||||
|
public class LocatableImpl implements Locatable { |
||||||
|
|
||||||
|
private Locator locator_; |
||||||
|
|
||||||
|
public Locator getLocator() { |
||||||
|
return locator_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLocator(final Locator locator) { |
||||||
|
locator_ = locator; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,146 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.util.LangUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link Locator}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
*/ |
||||||
|
public class LocatorImpl implements Locator, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 2240824537064705530L; |
||||||
|
|
||||||
|
private String uri_; |
||||||
|
private int lineNumber_; |
||||||
|
private int columnNumber_; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates new LocatorImpl |
||||||
|
* @param uri the uri |
||||||
|
* @param line the lineNumber |
||||||
|
* @param column the columnNumber |
||||||
|
*/ |
||||||
|
public LocatorImpl(final String uri, final int line, final int column) { |
||||||
|
uri_ = uri; |
||||||
|
lineNumber_ = line; |
||||||
|
columnNumber_ = column; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the URI for the current document event. |
||||||
|
* |
||||||
|
* <p>The parser must resolve the URI fully before passing it to the |
||||||
|
* application.</p> |
||||||
|
* |
||||||
|
* @return A string containing the URI, or null |
||||||
|
* if none is available. |
||||||
|
*/ |
||||||
|
public String getURI() { |
||||||
|
return uri_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return @see #getURI() |
||||||
|
*/ |
||||||
|
public String getUri() { |
||||||
|
return uri_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the uri to a new value. |
||||||
|
* @see #getURI() |
||||||
|
* @param uri the new uri |
||||||
|
*/ |
||||||
|
public void setUri(final String uri) { |
||||||
|
uri_ = uri; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the column number where the current document event ends. |
||||||
|
* Note that this is the column number of the first |
||||||
|
* character after the text associated with the document |
||||||
|
* event. The first column in a line is position 1. |
||||||
|
* @return The column number, or -1 if none is available. |
||||||
|
* @see #getLineNumber |
||||||
|
*/ |
||||||
|
public int getColumnNumber() { |
||||||
|
return columnNumber_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the columnNumber to a new value. |
||||||
|
* @param column the new columnNumber |
||||||
|
*/ |
||||||
|
public void setColumnNumber(final int column) { |
||||||
|
columnNumber_ = column; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the line number where the current document event ends. |
||||||
|
* Note that this is the line position of the first character |
||||||
|
* after the text associated with the document event. |
||||||
|
* @return The line number, or -1 if none is available. |
||||||
|
* @see #getColumnNumber |
||||||
|
*/ |
||||||
|
public int getLineNumber() { |
||||||
|
return lineNumber_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the lineNumber to a new value. |
||||||
|
* @param line the new lineNumber |
||||||
|
*/ |
||||||
|
public void setLineNumber(final int line) { |
||||||
|
lineNumber_ = line; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(final Object obj) { |
||||||
|
if (this == obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (!(obj instanceof Locator)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final Locator l = (Locator) obj; |
||||||
|
return (getColumnNumber() == l.getColumnNumber()) |
||||||
|
&& (getLineNumber() == l.getLineNumber()) |
||||||
|
&& LangUtils.equals(getURI(), l.getURI()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
int hash = LangUtils.HASH_SEED; |
||||||
|
hash = LangUtils.hashCode(hash, columnNumber_); |
||||||
|
hash = LangUtils.hashCode(hash, lineNumber_); |
||||||
|
hash = LangUtils.hashCode(hash, uri_); |
||||||
|
return hash; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return new StringBuilder().append(getUri()).append(" (") |
||||||
|
.append(getLineNumber()).append(':') |
||||||
|
.append(getColumnNumber()).append(')').toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,193 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 7.0 */ |
||||||
|
/* JavaCCOptions:KEEP_LINE_COLUMN=true */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
/** |
||||||
|
* This exception is thrown when parse errors are encountered. |
||||||
|
* You can explicitly create objects of this exception type by |
||||||
|
* calling the method generateParseException in the generated |
||||||
|
* parser. |
||||||
|
* |
||||||
|
* You can modify this class to customize your error reporting |
||||||
|
* mechanisms so long as you retain the public fields. |
||||||
|
*/ |
||||||
|
public class ParseException extends Exception { |
||||||
|
|
||||||
|
/** |
||||||
|
* The version identifier for this Serializable class. |
||||||
|
* Increment only if the <i>serialized</i> form of the |
||||||
|
* class changes. |
||||||
|
*/ |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
/** |
||||||
|
* The end of line string for this machine. |
||||||
|
*/ |
||||||
|
protected static String EOL = System.getProperty("line.separator", "\n"); |
||||||
|
|
||||||
|
/** |
||||||
|
* This constructor is used by the method "generateParseException" |
||||||
|
* in the generated parser. Calling this constructor generates |
||||||
|
* a new object of this type with the fields "currentToken", |
||||||
|
* "expectedTokenSequences", and "tokenImage" set. |
||||||
|
*/ |
||||||
|
public ParseException(Token currentTokenVal, |
||||||
|
int[][] expectedTokenSequencesVal, |
||||||
|
String[] tokenImageVal |
||||||
|
) |
||||||
|
{ |
||||||
|
super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal)); |
||||||
|
currentToken = currentTokenVal; |
||||||
|
expectedTokenSequences = expectedTokenSequencesVal; |
||||||
|
tokenImage = tokenImageVal; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The following constructors are for use by you for whatever |
||||||
|
* purpose you can think of. Constructing the exception in this |
||||||
|
* manner makes the exception behave in the normal way - i.e., as |
||||||
|
* documented in the class "Throwable". The fields "errorToken", |
||||||
|
* "expectedTokenSequences", and "tokenImage" do not contain |
||||||
|
* relevant information. The JavaCC generated code does not use |
||||||
|
* these constructors. |
||||||
|
*/ |
||||||
|
|
||||||
|
public ParseException() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/** Constructor with message. */ |
||||||
|
public ParseException(String message) { |
||||||
|
super(message); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* This is the last token that has been consumed successfully. If |
||||||
|
* this object has been created due to a parse error, the token |
||||||
|
* followng this token will (therefore) be the first error token. |
||||||
|
*/ |
||||||
|
public Token currentToken; |
||||||
|
|
||||||
|
/** |
||||||
|
* Each entry in this array is an array of integers. Each array |
||||||
|
* of integers represents a sequence of tokens (by their ordinal |
||||||
|
* values) that is expected at this point of the parse. |
||||||
|
*/ |
||||||
|
public int[][] expectedTokenSequences; |
||||||
|
|
||||||
|
/** |
||||||
|
* This is a reference to the "tokenImage" array of the generated |
||||||
|
* parser within which the parse error occurred. This array is |
||||||
|
* defined in the generated ...Constants interface. |
||||||
|
*/ |
||||||
|
public String[] tokenImage; |
||||||
|
|
||||||
|
/** |
||||||
|
* It uses "currentToken" and "expectedTokenSequences" to generate a parse |
||||||
|
* error message and returns it. If this object has been created |
||||||
|
* due to a parse error, and you do not catch it (it gets thrown |
||||||
|
* from the parser) the correct error message |
||||||
|
* gets displayed. |
||||||
|
*/ |
||||||
|
private static String initialise(Token currentToken, |
||||||
|
int[][] expectedTokenSequences, |
||||||
|
String[] tokenImage) { |
||||||
|
|
||||||
|
StringBuffer expected = new StringBuffer(); |
||||||
|
int maxSize = 0; |
||||||
|
for (int i = 0; i < expectedTokenSequences.length; i++) { |
||||||
|
if (maxSize < expectedTokenSequences[i].length) { |
||||||
|
maxSize = expectedTokenSequences[i].length; |
||||||
|
} |
||||||
|
for (int j = 0; j < expectedTokenSequences[i].length; j++) { |
||||||
|
expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' '); |
||||||
|
} |
||||||
|
if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { |
||||||
|
expected.append("..."); |
||||||
|
} |
||||||
|
expected.append(EOL).append(" "); |
||||||
|
} |
||||||
|
String retval = "Encountered \""; |
||||||
|
Token tok = currentToken.next; |
||||||
|
for (int i = 0; i < maxSize; i++) { |
||||||
|
if (i != 0) retval += " "; |
||||||
|
if (tok.kind == 0) { |
||||||
|
retval += tokenImage[0]; |
||||||
|
break; |
||||||
|
} |
||||||
|
retval += " " + tokenImage[tok.kind]; |
||||||
|
retval += " \""; |
||||||
|
retval += add_escapes(tok.image); |
||||||
|
retval += " \""; |
||||||
|
tok = tok.next; |
||||||
|
} |
||||||
|
retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; |
||||||
|
retval += "." + EOL; |
||||||
|
|
||||||
|
|
||||||
|
if (expectedTokenSequences.length == 0) { |
||||||
|
// Nothing to add here
|
||||||
|
} else { |
||||||
|
if (expectedTokenSequences.length == 1) { |
||||||
|
retval += "Was expecting:" + EOL + " "; |
||||||
|
} else { |
||||||
|
retval += "Was expecting one of:" + EOL + " "; |
||||||
|
} |
||||||
|
retval += expected.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
return retval; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Used to convert raw characters to their escaped version |
||||||
|
* when these raw version cannot be used as part of an ASCII |
||||||
|
* string literal. |
||||||
|
*/ |
||||||
|
static String add_escapes(String str) { |
||||||
|
StringBuffer retval = new StringBuffer(); |
||||||
|
char ch; |
||||||
|
for (int i = 0; i < str.length(); i++) { |
||||||
|
switch (str.charAt(i)) |
||||||
|
{ |
||||||
|
case '\b': |
||||||
|
retval.append("\\b"); |
||||||
|
continue; |
||||||
|
case '\t': |
||||||
|
retval.append("\\t"); |
||||||
|
continue; |
||||||
|
case '\n': |
||||||
|
retval.append("\\n"); |
||||||
|
continue; |
||||||
|
case '\f': |
||||||
|
retval.append("\\f"); |
||||||
|
continue; |
||||||
|
case '\r': |
||||||
|
retval.append("\\r"); |
||||||
|
continue; |
||||||
|
case '\"': |
||||||
|
retval.append("\\\""); |
||||||
|
continue; |
||||||
|
case '\'': |
||||||
|
retval.append("\\\'"); |
||||||
|
continue; |
||||||
|
case '\\': |
||||||
|
retval.append("\\\\"); |
||||||
|
continue; |
||||||
|
default: |
||||||
|
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { |
||||||
|
String s = "0000" + Integer.toString(ch, 16); |
||||||
|
retval.append("\\u" + s.substring(s.length() - 4, s.length())); |
||||||
|
} else { |
||||||
|
retval.append(ch); |
||||||
|
} |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
return retval.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
/* JavaCC - OriginalChecksum=a8a58654a5ee2b5eb919333733c9ca09 (do not edit this line) */ |
@ -0,0 +1,63 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
/** |
||||||
|
* Util methods used by the parser and lexer. |
||||||
|
* |
||||||
|
* @author RBRi |
||||||
|
*/ |
||||||
|
public final class ParserUtils { |
||||||
|
|
||||||
|
private ParserUtils() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove the given number of chars from start and end. |
||||||
|
* There is no parameter checking, the caller has to take care of this. |
||||||
|
* |
||||||
|
* @param s the StringBuilder |
||||||
|
* @param left no of chars to be removed from start |
||||||
|
* @param right no of chars to be removed from end |
||||||
|
* @return the trimmed string |
||||||
|
*/ |
||||||
|
public static String trimBy(final StringBuilder s, final int left, final int right) { |
||||||
|
return s.substring(left, s.length() - right); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper that removes the leading "url(", the trailing ")" |
||||||
|
* and surrounding quotes from the given string builder. |
||||||
|
* @param s the StringBuilder |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String trimUrl(final StringBuilder s) { |
||||||
|
final String s1 = trimBy(s, 4, 1).trim(); |
||||||
|
if (s1.length() == 0) { |
||||||
|
return s1; |
||||||
|
} |
||||||
|
|
||||||
|
final int end = s1.length() - 1; |
||||||
|
final char c0 = s1.charAt(0); |
||||||
|
if ((c0 == '"' && s1.charAt(end) == '"') |
||||||
|
|| (c0 == '\'' && s1.charAt(end) == '\'')) { |
||||||
|
return s1.substring(1, end); |
||||||
|
} |
||||||
|
|
||||||
|
return s1; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.parser.media.MediaQuery; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link SACMediaList}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class SACMediaListImpl extends LocatableImpl implements SACMediaList { |
||||||
|
|
||||||
|
private final List<MediaQuery> mediaQueries_; |
||||||
|
|
||||||
|
public SACMediaListImpl() { |
||||||
|
mediaQueries_ = new ArrayList<MediaQuery>(); |
||||||
|
} |
||||||
|
|
||||||
|
public int getLength() { |
||||||
|
return mediaQueries_.size(); |
||||||
|
} |
||||||
|
|
||||||
|
public String item(final int index) { |
||||||
|
return mediaQuery(index).getMedia(); |
||||||
|
} |
||||||
|
|
||||||
|
public MediaQuery mediaQuery(final int index) { |
||||||
|
return mediaQueries_.get(index); |
||||||
|
} |
||||||
|
|
||||||
|
public void add(final String s) { |
||||||
|
add(new MediaQuery(s)); |
||||||
|
} |
||||||
|
|
||||||
|
public void add(final MediaQuery mediaQuery) { |
||||||
|
mediaQueries_.add(mediaQuery); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
final int len = getLength(); |
||||||
|
for (int i = 0; i < len; i++) { |
||||||
|
sb.append(item(i)); |
||||||
|
if (i < len - 1) { |
||||||
|
sb.append(", "); |
||||||
|
} |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import org.w3c.css.sac.Parser; |
||||||
|
|
||||||
|
/** |
||||||
|
* Our extension of the {@link Parser} interface. |
||||||
|
* |
||||||
|
* @author RBRi |
||||||
|
*/ |
||||||
|
public interface SACParser extends Parser { |
||||||
|
|
||||||
|
void setIeStarHackAccepted(boolean accepted); |
||||||
|
|
||||||
|
boolean isIeStarHackAccepted(); |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,216 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SACParserCSS1Constants.java */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Token literal values and constants. |
||||||
|
* Generated by org.javacc.parser.OtherFilesGen#start() |
||||||
|
*/ |
||||||
|
public interface SACParserCSS1Constants { |
||||||
|
|
||||||
|
/** End of File. */ |
||||||
|
int EOF = 0; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S = 1; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IDENT = 3; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LINK_PSCLASS = 4; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int VISITED_PSCLASS = 5; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ACTIVE_PSCLASS = 6; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FIRST_LINE = 7; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FIRST_LETTER = 8; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HASH = 9; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LBRACE = 10; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RBRACE = 11; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMA = 12; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DOT = 13; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SEMICOLON = 14; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COLON = 15; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SLASH = 16; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PLUS = 17; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MINUS = 18; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EQUALS = 19; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int GT = 20; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LSQUARE = 21; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RSQUARE = 22; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING = 23; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RROUND = 24; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URL = 25; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDO = 26; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDC = 27; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORT_SYM = 28; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORTANT_SYM = 29; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ATKEYWORD = 30; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EMS = 31; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EXS = 32; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PX = 33; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_CM = 34; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_MM = 35; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_IN = 36; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PT = 37; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PC = 38; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PERCENTAGE = 39; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUMBER = 40; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RGB = 41; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NAME = 42; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int D = 43; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUM = 44; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODERANGE = 45; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RANGE = 46; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q16 = 47; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q15 = 48; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q14 = 49; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q13 = 50; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q12 = 51; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q11 = 52; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LATIN1 = 53; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMCHAR = 54; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMSTART = 55; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING1 = 56; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING2 = 57; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NONASCII = 58; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ESCAPE = 59; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NL = 60; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODE = 61; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HNUM = 62; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H = 63; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNKNOWN = 66; |
||||||
|
|
||||||
|
/** Lexical state. */ |
||||||
|
int DEFAULT = 0; |
||||||
|
/** Lexical state. */ |
||||||
|
int COMMENT = 1; |
||||||
|
|
||||||
|
/** Literal token values. */ |
||||||
|
String[] tokenImage = { |
||||||
|
"<EOF>", |
||||||
|
"<S>", |
||||||
|
"\"/*\"", |
||||||
|
"<IDENT>", |
||||||
|
"\":link\"", |
||||||
|
"\":visited\"", |
||||||
|
"\":active\"", |
||||||
|
"\":first-line\"", |
||||||
|
"\":first-letter\"", |
||||||
|
"<HASH>", |
||||||
|
"\"{\"", |
||||||
|
"\"}\"", |
||||||
|
"\",\"", |
||||||
|
"\".\"", |
||||||
|
"\";\"", |
||||||
|
"\":\"", |
||||||
|
"\"/\"", |
||||||
|
"\"+\"", |
||||||
|
"\"-\"", |
||||||
|
"\"=\"", |
||||||
|
"\">\"", |
||||||
|
"\"[\"", |
||||||
|
"\"]\"", |
||||||
|
"<STRING>", |
||||||
|
"\")\"", |
||||||
|
"<URL>", |
||||||
|
"\"<!--\"", |
||||||
|
"\"-->\"", |
||||||
|
"\"@import\"", |
||||||
|
"<IMPORTANT_SYM>", |
||||||
|
"<ATKEYWORD>", |
||||||
|
"<EMS>", |
||||||
|
"<EXS>", |
||||||
|
"<LENGTH_PX>", |
||||||
|
"<LENGTH_CM>", |
||||||
|
"<LENGTH_MM>", |
||||||
|
"<LENGTH_IN>", |
||||||
|
"<LENGTH_PT>", |
||||||
|
"<LENGTH_PC>", |
||||||
|
"<PERCENTAGE>", |
||||||
|
"<NUMBER>", |
||||||
|
"\"rgb(\"", |
||||||
|
"<NAME>", |
||||||
|
"<D>", |
||||||
|
"<NUM>", |
||||||
|
"<UNICODERANGE>", |
||||||
|
"<RANGE>", |
||||||
|
"<Q16>", |
||||||
|
"<Q15>", |
||||||
|
"<Q14>", |
||||||
|
"<Q13>", |
||||||
|
"<Q12>", |
||||||
|
"\"?\"", |
||||||
|
"<LATIN1>", |
||||||
|
"<NMCHAR>", |
||||||
|
"<NMSTART>", |
||||||
|
"<STRING1>", |
||||||
|
"<STRING2>", |
||||||
|
"<NONASCII>", |
||||||
|
"<ESCAPE>", |
||||||
|
"<NL>", |
||||||
|
"<UNICODE>", |
||||||
|
"<HNUM>", |
||||||
|
"<H>", |
||||||
|
"\"*/\"", |
||||||
|
"<token of kind 65>", |
||||||
|
"<UNKNOWN>", |
||||||
|
}; |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,286 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SACParserCSS21Constants.java */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Token literal values and constants. |
||||||
|
* Generated by org.javacc.parser.OtherFilesGen#start() |
||||||
|
*/ |
||||||
|
public interface SACParserCSS21Constants { |
||||||
|
|
||||||
|
/** End of File. */ |
||||||
|
int EOF = 0; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S = 1; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int W = 2; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H = 6; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HNUM = 7; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NONASCII = 8; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODE = 9; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ESCAPE = 10; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMSTART = 11; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMCHAR = 12; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NL = 13; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING1 = 14; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING2 = 15; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMENT_ = 16; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUMBER = 17; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int INHERIT = 18; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IDENT = 19; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NAME = 20; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUM = 21; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING = 22; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URL = 23; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int A_LETTER = 24; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int C_LETTER = 25; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int D_LETTER = 26; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int E_LETTER = 27; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int G_LETTER = 28; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H_LETTER = 29; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int I_LETTER = 30; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int K_LETTER = 31; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int L_LETTER = 32; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int M_LETTER = 33; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int N_LETTER = 34; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int O_LETTER = 35; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int P_LETTER = 36; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int R_LETTER = 37; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S_LETTER = 38; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int T_LETTER = 39; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int X_LETTER = 40; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Z_LETTER = 41; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDO = 42; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDC = 43; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int INCLUDES = 44; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DASHMATCH = 45; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LBRACE = 46; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RBRACE = 47; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LROUND = 48; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RROUND = 49; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DOT = 50; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SEMICOLON = 51; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COLON = 52; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ASTERISK = 53; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SLASH = 54; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MINUS = 55; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EQUALS = 56; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LSQUARE = 57; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RSQUARE = 58; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PLUS = 59; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int GREATER = 60; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMA = 61; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HASH = 62; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORT_SYM = 63; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PAGE_SYM = 64; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MEDIA_SYM = 65; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CHARSET_SYM = 66; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORTANT_SYM = 67; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EMS = 68; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EXS = 69; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PX = 70; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_CM = 71; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_MM = 72; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_IN = 73; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PT = 74; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PC = 75; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_DEG = 76; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_RAD = 77; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_GRAD = 78; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TIME_MS = 79; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TIME_S = 80; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FREQ_HZ = 81; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FREQ_KHZ = 82; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PERCENTAGE = 83; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DIMENSION = 84; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URI = 85; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION_LANG = 86; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION = 87; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ATKEYWORD = 88; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNKNOWN = 89; |
||||||
|
|
||||||
|
/** Lexical state. */ |
||||||
|
int DEFAULT = 0; |
||||||
|
/** Lexical state. */ |
||||||
|
int COMMENT = 1; |
||||||
|
|
||||||
|
/** Literal token values. */ |
||||||
|
String[] tokenImage = { |
||||||
|
"<EOF>", |
||||||
|
"<S>", |
||||||
|
"<W>", |
||||||
|
"\"/*\"", |
||||||
|
"\"*/\"", |
||||||
|
"<token of kind 5>", |
||||||
|
"<H>", |
||||||
|
"<HNUM>", |
||||||
|
"<NONASCII>", |
||||||
|
"<UNICODE>", |
||||||
|
"<ESCAPE>", |
||||||
|
"<NMSTART>", |
||||||
|
"<NMCHAR>", |
||||||
|
"<NL>", |
||||||
|
"<STRING1>", |
||||||
|
"<STRING2>", |
||||||
|
"<COMMENT_>", |
||||||
|
"<NUMBER>", |
||||||
|
"\"inherit\"", |
||||||
|
"<IDENT>", |
||||||
|
"<NAME>", |
||||||
|
"<NUM>", |
||||||
|
"<STRING>", |
||||||
|
"<URL>", |
||||||
|
"<A_LETTER>", |
||||||
|
"<C_LETTER>", |
||||||
|
"<D_LETTER>", |
||||||
|
"<E_LETTER>", |
||||||
|
"<G_LETTER>", |
||||||
|
"<H_LETTER>", |
||||||
|
"<I_LETTER>", |
||||||
|
"<K_LETTER>", |
||||||
|
"<L_LETTER>", |
||||||
|
"<M_LETTER>", |
||||||
|
"<N_LETTER>", |
||||||
|
"<O_LETTER>", |
||||||
|
"<P_LETTER>", |
||||||
|
"<R_LETTER>", |
||||||
|
"<S_LETTER>", |
||||||
|
"<T_LETTER>", |
||||||
|
"<X_LETTER>", |
||||||
|
"<Z_LETTER>", |
||||||
|
"\"<!--\"", |
||||||
|
"\"-->\"", |
||||||
|
"\"~=\"", |
||||||
|
"\"|=\"", |
||||||
|
"<LBRACE>", |
||||||
|
"\"}\"", |
||||||
|
"\"(\"", |
||||||
|
"\")\"", |
||||||
|
"\".\"", |
||||||
|
"\";\"", |
||||||
|
"\":\"", |
||||||
|
"\"*\"", |
||||||
|
"\"/\"", |
||||||
|
"\"-\"", |
||||||
|
"\"=\"", |
||||||
|
"\"[\"", |
||||||
|
"\"]\"", |
||||||
|
"<PLUS>", |
||||||
|
"<GREATER>", |
||||||
|
"<COMMA>", |
||||||
|
"<HASH>", |
||||||
|
"<IMPORT_SYM>", |
||||||
|
"<PAGE_SYM>", |
||||||
|
"<MEDIA_SYM>", |
||||||
|
"<CHARSET_SYM>", |
||||||
|
"<IMPORTANT_SYM>", |
||||||
|
"<EMS>", |
||||||
|
"<EXS>", |
||||||
|
"<LENGTH_PX>", |
||||||
|
"<LENGTH_CM>", |
||||||
|
"<LENGTH_MM>", |
||||||
|
"<LENGTH_IN>", |
||||||
|
"<LENGTH_PT>", |
||||||
|
"<LENGTH_PC>", |
||||||
|
"<ANGLE_DEG>", |
||||||
|
"<ANGLE_RAD>", |
||||||
|
"<ANGLE_GRAD>", |
||||||
|
"<TIME_MS>", |
||||||
|
"<TIME_S>", |
||||||
|
"<FREQ_HZ>", |
||||||
|
"<FREQ_KHZ>", |
||||||
|
"<PERCENTAGE>", |
||||||
|
"<DIMENSION>", |
||||||
|
"<URI>", |
||||||
|
"<FUNCTION_LANG>", |
||||||
|
"<FUNCTION>", |
||||||
|
"<ATKEYWORD>", |
||||||
|
"<UNKNOWN>", |
||||||
|
"\"progid:\"", |
||||||
|
}; |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,255 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SACParserCSS2Constants.java */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Token literal values and constants. |
||||||
|
* Generated by org.javacc.parser.OtherFilesGen#start() |
||||||
|
*/ |
||||||
|
public interface SACParserCSS2Constants { |
||||||
|
|
||||||
|
/** End of File. */ |
||||||
|
int EOF = 0; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S = 1; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int W = 2; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LBRACE = 6; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RBRACE = 7; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMA = 8; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DOT = 9; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SEMICOLON = 10; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COLON = 11; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ASTERISK = 12; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SLASH = 13; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PLUS = 14; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MINUS = 15; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EQUALS = 16; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int GT = 17; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LSQUARE = 18; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RSQUARE = 19; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HASH = 20; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING = 21; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RROUND = 22; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URL = 23; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URI = 24; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDO = 25; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDC = 26; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int INCLUDES = 27; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DASHMATCH = 28; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORT_SYM = 29; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PAGE_SYM = 30; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MEDIA_SYM = 31; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FONT_FACE_SYM = 32; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CHARSET_SYM = 33; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ATKEYWORD = 34; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORTANT_SYM = 35; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int INHERIT = 36; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EMS = 37; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EXS = 38; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PX = 39; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_CM = 40; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_MM = 41; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_IN = 42; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PT = 43; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PC = 44; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_DEG = 45; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_RAD = 46; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_GRAD = 47; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TIME_MS = 48; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TIME_S = 49; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FREQ_HZ = 50; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FREQ_KHZ = 51; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PERCENTAGE = 52; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DIMEN = 53; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUMBER = 54; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RGB = 55; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION_LANG = 56; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION = 57; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IDENT = 58; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NAME = 59; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUM = 60; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODERANGE = 61; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RANGE = 62; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q16 = 63; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q15 = 64; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q14 = 65; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q13 = 66; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q12 = 67; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q11 = 68; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMSTART = 69; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMCHAR = 70; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING1 = 71; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING2 = 72; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NONASCII = 73; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ESCAPE = 74; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NL = 75; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODE = 76; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HNUM = 77; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H = 78; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNKNOWN = 79; |
||||||
|
|
||||||
|
/** Lexical state. */ |
||||||
|
int DEFAULT = 0; |
||||||
|
/** Lexical state. */ |
||||||
|
int COMMENT = 1; |
||||||
|
|
||||||
|
/** Literal token values. */ |
||||||
|
String[] tokenImage = { |
||||||
|
"<EOF>", |
||||||
|
"<S>", |
||||||
|
"<W>", |
||||||
|
"\"/*\"", |
||||||
|
"\"*/\"", |
||||||
|
"<token of kind 5>", |
||||||
|
"\"{\"", |
||||||
|
"\"}\"", |
||||||
|
"\",\"", |
||||||
|
"\".\"", |
||||||
|
"\";\"", |
||||||
|
"\":\"", |
||||||
|
"\"*\"", |
||||||
|
"\"/\"", |
||||||
|
"\"+\"", |
||||||
|
"\"-\"", |
||||||
|
"\"=\"", |
||||||
|
"\">\"", |
||||||
|
"\"[\"", |
||||||
|
"\"]\"", |
||||||
|
"<HASH>", |
||||||
|
"<STRING>", |
||||||
|
"\")\"", |
||||||
|
"<URL>", |
||||||
|
"<URI>", |
||||||
|
"\"<!--\"", |
||||||
|
"\"-->\"", |
||||||
|
"\"~=\"", |
||||||
|
"\"|=\"", |
||||||
|
"\"@import\"", |
||||||
|
"\"@page\"", |
||||||
|
"\"@media\"", |
||||||
|
"\"@font-face\"", |
||||||
|
"\"@charset\"", |
||||||
|
"<ATKEYWORD>", |
||||||
|
"<IMPORTANT_SYM>", |
||||||
|
"\"inherit\"", |
||||||
|
"<EMS>", |
||||||
|
"<EXS>", |
||||||
|
"<LENGTH_PX>", |
||||||
|
"<LENGTH_CM>", |
||||||
|
"<LENGTH_MM>", |
||||||
|
"<LENGTH_IN>", |
||||||
|
"<LENGTH_PT>", |
||||||
|
"<LENGTH_PC>", |
||||||
|
"<ANGLE_DEG>", |
||||||
|
"<ANGLE_RAD>", |
||||||
|
"<ANGLE_GRAD>", |
||||||
|
"<TIME_MS>", |
||||||
|
"<TIME_S>", |
||||||
|
"<FREQ_HZ>", |
||||||
|
"<FREQ_KHZ>", |
||||||
|
"<PERCENTAGE>", |
||||||
|
"<DIMEN>", |
||||||
|
"<NUMBER>", |
||||||
|
"\"rgb(\"", |
||||||
|
"\"lang(\"", |
||||||
|
"<FUNCTION>", |
||||||
|
"<IDENT>", |
||||||
|
"<NAME>", |
||||||
|
"<NUM>", |
||||||
|
"<UNICODERANGE>", |
||||||
|
"<RANGE>", |
||||||
|
"<Q16>", |
||||||
|
"<Q15>", |
||||||
|
"<Q14>", |
||||||
|
"<Q13>", |
||||||
|
"<Q12>", |
||||||
|
"\"?\"", |
||||||
|
"<NMSTART>", |
||||||
|
"<NMCHAR>", |
||||||
|
"<STRING1>", |
||||||
|
"<STRING2>", |
||||||
|
"<NONASCII>", |
||||||
|
"<ESCAPE>", |
||||||
|
"<NL>", |
||||||
|
"<UNICODE>", |
||||||
|
"<HNUM>", |
||||||
|
"<H>", |
||||||
|
"<UNKNOWN>", |
||||||
|
}; |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,334 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SACParserCSS3Constants.java */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Token literal values and constants. |
||||||
|
* Generated by org.javacc.parser.OtherFilesGen#start() |
||||||
|
*/ |
||||||
|
public interface SACParserCSS3Constants { |
||||||
|
|
||||||
|
/** End of File. */ |
||||||
|
int EOF = 0; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S = 1; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int W = 2; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H = 6; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HNUM = 7; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NONASCII = 8; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODE = 9; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ESCAPE = 10; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMSTART = 11; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMCHAR = 12; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NL = 13; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING1 = 14; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING2 = 15; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMENT_ = 16; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int AND = 17; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NOT = 18; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ONLY = 19; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUMBER = 20; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int INHERIT = 21; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IDENT = 22; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NAME = 23; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUM = 24; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING = 25; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URL = 26; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int A_LETTER = 27; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int C_LETTER = 28; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int D_LETTER = 29; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int E_LETTER = 30; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int F_LETTER = 31; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int G_LETTER = 32; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H_LETTER = 33; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int I_LETTER = 34; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int K_LETTER = 35; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int L_LETTER = 36; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int M_LETTER = 37; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int N_LETTER = 38; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int O_LETTER = 39; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int P_LETTER = 40; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int R_LETTER = 41; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S_LETTER = 42; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int T_LETTER = 43; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int U_LETTER = 44; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int V_LETTER = 45; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int X_LETTER = 46; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Z_LETTER = 47; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDO = 48; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDC = 49; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int INCLUDES = 50; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DASHMATCH = 51; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PREFIXMATCH = 52; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SUFFIXMATCH = 53; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SUBSTRINGMATCH = 54; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LBRACE = 55; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RBRACE = 56; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LROUND = 57; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RROUND = 58; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DOT = 59; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SEMICOLON = 60; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COLON = 61; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ASTERISK = 62; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SLASH = 63; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MINUS = 64; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EQUALS = 65; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LSQUARE = 66; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RSQUARE = 67; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PLUS = 68; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int GREATER = 69; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TILDE = 70; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMA = 71; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HASH = 72; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORT_SYM = 73; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PAGE_SYM = 74; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MEDIA_SYM = 75; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FONT_FACE_SYM = 76; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CHARSET_SYM = 77; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORTANT_SYM = 78; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EMS = 79; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EXS = 80; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PX = 81; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_CM = 82; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_MM = 83; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_IN = 84; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PT = 85; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PC = 86; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_DEG = 87; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_RAD = 88; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ANGLE_GRAD = 89; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TIME_MS = 90; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int TIME_S = 91; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FREQ_HZ = 92; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FREQ_KHZ = 93; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RESOLUTION_DPI = 94; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RESOLUTION_DPCM = 95; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PERCENTAGE = 96; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DIMENSION = 97; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H_PLACEHOLDER = 98; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODE_RANGE = 99; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URI = 100; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION_NOT = 101; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION_LANG = 102; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FUNCTION = 103; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ATKEYWORD = 104; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNKNOWN = 105; |
||||||
|
|
||||||
|
/** Lexical state. */ |
||||||
|
int DEFAULT = 0; |
||||||
|
/** Lexical state. */ |
||||||
|
int COMMENT = 1; |
||||||
|
|
||||||
|
/** Literal token values. */ |
||||||
|
String[] tokenImage = { |
||||||
|
"<EOF>", |
||||||
|
"<S>", |
||||||
|
"<W>", |
||||||
|
"\"/*\"", |
||||||
|
"\"*/\"", |
||||||
|
"<token of kind 5>", |
||||||
|
"<H>", |
||||||
|
"<HNUM>", |
||||||
|
"<NONASCII>", |
||||||
|
"<UNICODE>", |
||||||
|
"<ESCAPE>", |
||||||
|
"<NMSTART>", |
||||||
|
"<NMCHAR>", |
||||||
|
"<NL>", |
||||||
|
"<STRING1>", |
||||||
|
"<STRING2>", |
||||||
|
"<COMMENT_>", |
||||||
|
"\"and\"", |
||||||
|
"\"not\"", |
||||||
|
"\"only\"", |
||||||
|
"<NUMBER>", |
||||||
|
"\"inherit\"", |
||||||
|
"<IDENT>", |
||||||
|
"<NAME>", |
||||||
|
"<NUM>", |
||||||
|
"<STRING>", |
||||||
|
"<URL>", |
||||||
|
"<A_LETTER>", |
||||||
|
"<C_LETTER>", |
||||||
|
"<D_LETTER>", |
||||||
|
"<E_LETTER>", |
||||||
|
"<F_LETTER>", |
||||||
|
"<G_LETTER>", |
||||||
|
"<H_LETTER>", |
||||||
|
"<I_LETTER>", |
||||||
|
"<K_LETTER>", |
||||||
|
"<L_LETTER>", |
||||||
|
"<M_LETTER>", |
||||||
|
"<N_LETTER>", |
||||||
|
"<O_LETTER>", |
||||||
|
"<P_LETTER>", |
||||||
|
"<R_LETTER>", |
||||||
|
"<S_LETTER>", |
||||||
|
"<T_LETTER>", |
||||||
|
"<U_LETTER>", |
||||||
|
"<V_LETTER>", |
||||||
|
"<X_LETTER>", |
||||||
|
"<Z_LETTER>", |
||||||
|
"\"<!--\"", |
||||||
|
"\"-->\"", |
||||||
|
"\"~=\"", |
||||||
|
"\"|=\"", |
||||||
|
"\"^=\"", |
||||||
|
"\"$=\"", |
||||||
|
"\"*=\"", |
||||||
|
"<LBRACE>", |
||||||
|
"\"}\"", |
||||||
|
"\"(\"", |
||||||
|
"\")\"", |
||||||
|
"\".\"", |
||||||
|
"\";\"", |
||||||
|
"\":\"", |
||||||
|
"\"*\"", |
||||||
|
"\"/\"", |
||||||
|
"\"-\"", |
||||||
|
"\"=\"", |
||||||
|
"\"[\"", |
||||||
|
"\"]\"", |
||||||
|
"<PLUS>", |
||||||
|
"<GREATER>", |
||||||
|
"\"~\"", |
||||||
|
"<COMMA>", |
||||||
|
"<HASH>", |
||||||
|
"<IMPORT_SYM>", |
||||||
|
"<PAGE_SYM>", |
||||||
|
"<MEDIA_SYM>", |
||||||
|
"<FONT_FACE_SYM>", |
||||||
|
"<CHARSET_SYM>", |
||||||
|
"<IMPORTANT_SYM>", |
||||||
|
"<EMS>", |
||||||
|
"<EXS>", |
||||||
|
"<LENGTH_PX>", |
||||||
|
"<LENGTH_CM>", |
||||||
|
"<LENGTH_MM>", |
||||||
|
"<LENGTH_IN>", |
||||||
|
"<LENGTH_PT>", |
||||||
|
"<LENGTH_PC>", |
||||||
|
"<ANGLE_DEG>", |
||||||
|
"<ANGLE_RAD>", |
||||||
|
"<ANGLE_GRAD>", |
||||||
|
"<TIME_MS>", |
||||||
|
"<TIME_S>", |
||||||
|
"<FREQ_HZ>", |
||||||
|
"<FREQ_KHZ>", |
||||||
|
"<RESOLUTION_DPI>", |
||||||
|
"<RESOLUTION_DPCM>", |
||||||
|
"<PERCENTAGE>", |
||||||
|
"<DIMENSION>", |
||||||
|
"<H_PLACEHOLDER>", |
||||||
|
"<UNICODE_RANGE>", |
||||||
|
"<URI>", |
||||||
|
"<FUNCTION_NOT>", |
||||||
|
"<FUNCTION_LANG>", |
||||||
|
"<FUNCTION>", |
||||||
|
"<ATKEYWORD>", |
||||||
|
"<UNKNOWN>", |
||||||
|
"\"progid:\"", |
||||||
|
}; |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,219 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SACParserCSSmobileOKBasic1Constants.java */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Token literal values and constants. |
||||||
|
* Generated by org.javacc.parser.OtherFilesGen#start() |
||||||
|
*/ |
||||||
|
public interface SACParserCSSmobileOKBasic1Constants { |
||||||
|
|
||||||
|
/** End of File. */ |
||||||
|
int EOF = 0; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int S = 1; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IDENT = 3; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LINK_PSCLASS = 4; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int VISITED_PSCLASS = 5; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ACTIVE_PSCLASS = 6; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FIRST_LINE = 7; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int FIRST_LETTER = 8; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HASH = 9; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LBRACE = 10; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RBRACE = 11; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COMMA = 12; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int DOT = 13; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SEMICOLON = 14; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int COLON = 15; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ASTERISK = 16; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int SLASH = 17; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PLUS = 18; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MINUS = 19; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EQUALS = 20; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int GT = 21; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LSQUARE = 22; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RSQUARE = 23; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING = 24; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RROUND = 25; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int URL = 26; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDO = 27; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int CDC = 28; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORT_SYM = 29; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int MEDIA_SYM = 30; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int IMPORTANT_SYM = 31; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ATKEYWORD = 32; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EMS = 33; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int EXS = 34; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PX = 35; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_CM = 36; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_MM = 37; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_IN = 38; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PT = 39; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int LENGTH_PC = 40; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int PERCENTAGE = 41; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUMBER = 42; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RGB = 43; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NAME = 44; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int D = 45; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NUM = 46; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODERANGE = 47; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int RANGE = 48; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q16 = 49; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q15 = 50; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q14 = 51; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q13 = 52; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q12 = 53; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int Q11 = 54; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMSTART = 55; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NMCHAR = 56; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING1 = 57; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int STRING2 = 58; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NONASCII = 59; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int ESCAPE = 60; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int NL = 61; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNICODE = 62; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int HNUM = 63; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int H = 64; |
||||||
|
/** RegularExpression Id. */ |
||||||
|
int UNKNOWN = 67; |
||||||
|
|
||||||
|
/** Lexical state. */ |
||||||
|
int DEFAULT = 0; |
||||||
|
/** Lexical state. */ |
||||||
|
int COMMENT = 1; |
||||||
|
|
||||||
|
/** Literal token values. */ |
||||||
|
String[] tokenImage = { |
||||||
|
"<EOF>", |
||||||
|
"<S>", |
||||||
|
"\"/*\"", |
||||||
|
"<IDENT>", |
||||||
|
"\":link\"", |
||||||
|
"\":visited\"", |
||||||
|
"\":active\"", |
||||||
|
"\":first-line\"", |
||||||
|
"\":first-letter\"", |
||||||
|
"<HASH>", |
||||||
|
"\"{\"", |
||||||
|
"\"}\"", |
||||||
|
"\",\"", |
||||||
|
"\".\"", |
||||||
|
"\";\"", |
||||||
|
"\":\"", |
||||||
|
"\"*\"", |
||||||
|
"\"/\"", |
||||||
|
"\"+\"", |
||||||
|
"\"-\"", |
||||||
|
"\"=\"", |
||||||
|
"\">\"", |
||||||
|
"\"[\"", |
||||||
|
"\"]\"", |
||||||
|
"<STRING>", |
||||||
|
"\")\"", |
||||||
|
"<URL>", |
||||||
|
"\"<!--\"", |
||||||
|
"\"-->\"", |
||||||
|
"\"@import\"", |
||||||
|
"\"@media\"", |
||||||
|
"<IMPORTANT_SYM>", |
||||||
|
"<ATKEYWORD>", |
||||||
|
"<EMS>", |
||||||
|
"<EXS>", |
||||||
|
"<LENGTH_PX>", |
||||||
|
"<LENGTH_CM>", |
||||||
|
"<LENGTH_MM>", |
||||||
|
"<LENGTH_IN>", |
||||||
|
"<LENGTH_PT>", |
||||||
|
"<LENGTH_PC>", |
||||||
|
"<PERCENTAGE>", |
||||||
|
"<NUMBER>", |
||||||
|
"\"rgb(\"", |
||||||
|
"<NAME>", |
||||||
|
"<D>", |
||||||
|
"<NUM>", |
||||||
|
"<UNICODERANGE>", |
||||||
|
"<RANGE>", |
||||||
|
"<Q16>", |
||||||
|
"<Q15>", |
||||||
|
"<Q14>", |
||||||
|
"<Q13>", |
||||||
|
"<Q12>", |
||||||
|
"\"?\"", |
||||||
|
"<NMSTART>", |
||||||
|
"<NMCHAR>", |
||||||
|
"<STRING1>", |
||||||
|
"<STRING2>", |
||||||
|
"<NONASCII>", |
||||||
|
"<ESCAPE>", |
||||||
|
"<NL>", |
||||||
|
"<UNICODE>", |
||||||
|
"<HNUM>", |
||||||
|
"<H>", |
||||||
|
"\"*/\"", |
||||||
|
"<token of kind 66>", |
||||||
|
"<UNKNOWN>", |
||||||
|
}; |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,39 @@ |
|||||||
|
# resource bundle for SACParser messages - default |
||||||
|
invalidExpectingOne=Invalid token \"{0}\". Was expecting: {1}. |
||||||
|
invalidExpectingMore=Invalid token \"{0}\". Was expecting one of: {1}. |
||||||
|
invalidColor=Invalid color \"{0}\". |
||||||
|
invalidStyleSheet=Error in style sheet. |
||||||
|
invalidRule=Error in rule. |
||||||
|
invalidUnknownRule=Error in unknown at-rule. |
||||||
|
invalidCharsetRule=Error in @charset rule. |
||||||
|
misplacedCharsetRule=The @charset must be the first element in the style sheet. |
||||||
|
invalidImportRule=Error in @import rule. |
||||||
|
invalidImportRuleIgnored=@import rule must occur before all other rules. |
||||||
|
invalidImportRuleIgnored2=@import rule must occur before all other rules, except the @charset rule. |
||||||
|
invalidPageRule=Error in @page rule. |
||||||
|
invalidFontFaceRule=Error in @font-face rule. |
||||||
|
invalidMediaList=Error in media list. |
||||||
|
invalidMediaRule=Error in @media rule. |
||||||
|
invalidStyleRule=Error in style rule. |
||||||
|
invalidStyleDeclaration=Error in style declaration. |
||||||
|
invalidDeclaration=Error in declaration. |
||||||
|
invalidDeclarationInvalidChar=Error in declaration; invalid character \"{0}\" found. |
||||||
|
invalidDeclarationStarHack=Error in declaration. ''*'' is not allowed as first char of a property. |
||||||
|
invalidSelectorList=Error in selector list. |
||||||
|
invalidSelector=Error in selector. |
||||||
|
invalidSimpleSelector=Error in simple selector. |
||||||
|
invalidClassSelector=Error in class selector. |
||||||
|
invalidElementName=Error in element name. |
||||||
|
invalidAttrib=Error in attribute selector. |
||||||
|
invalidPseudo=Error in pseudo class or element. |
||||||
|
duplicatePseudo=Duplicate pseudo class \":{0}\" or pseudo class \":{0}\" not at end. |
||||||
|
invalidHash=Error in hash. |
||||||
|
invalidExpr=Error in expression. |
||||||
|
invalidExprColon=Error in expression; '':'' found after identifier \"{0}\". |
||||||
|
invalidPrio=Error in priority. |
||||||
|
|
||||||
|
ignoringRule=Ignoring the whole rule. |
||||||
|
ignoringFollowingDeclarations=Ignoring the following declarations in this rule. |
||||||
|
|
||||||
|
tokenMgrError=Lexical error. |
||||||
|
domException=DOM exception: ''{0}'' |
@ -0,0 +1,39 @@ |
|||||||
|
# resource bundle for SACParser messages - german |
||||||
|
invalidExpectingOne=Ung\u00fcltiger Token \"{0}\". Erwartet wurde: {1}. |
||||||
|
invalidExpectingMore=Ung\u00fcltiger Token \"{0}\". Erwartet wurde einer von: {1}. |
||||||
|
invalidColor=Ung\u00fcltige Farbe \"{0}\". |
||||||
|
invalidStyleSheet=Fehler im Stylesheet. |
||||||
|
invalidRule=Fehler in Regel. |
||||||
|
invalidUnknownRule=Fehler in unbekannter At-Regel. |
||||||
|
invalidCharsetRule=Fehler in @charset-Regel. |
||||||
|
misplacedCharsetRule=Die @charset Regel muss das erste Element im Stylesheet sein. |
||||||
|
invalidImportRule=Fehler in @import-Regel. |
||||||
|
invalidImportRuleIgnored=@import-Regel muss vor allen anderen Regeln erscheinen. |
||||||
|
invalidImportRuleIgnored2=@import-Regel muss vor allen anderen Regeln erscheinen, au\u00dfer der @charset-Regel. |
||||||
|
invalidPageRule=Fehler in @page-Regel. |
||||||
|
invalidFontFaceRule=Fehler in @font-face-Regel. |
||||||
|
invalidMediaList=Fehler in Medienliste. |
||||||
|
invalidMediaRule=Fehler in @media-Regel. |
||||||
|
invalidStyleRule=Fehler in Style-Regel. |
||||||
|
invalidStyleDeclaration=Fehler in Styledeklaration. |
||||||
|
invalidDeclaration=Fehler in Deklaration. |
||||||
|
invalidDeclarationInvalidChar=Fehler in Deklaration. Es wurde das ung\u00fcltige Zeichen \"{0}\" gefunden. |
||||||
|
invalidDeclarationStarHack=Error in declaration. ''*'' ist als erstes Zeichen einer Property nicht erlaubt. |
||||||
|
invalidSelectorList=Fehler in Selektorliste. |
||||||
|
invalidSelector=Fehler in Selektor. |
||||||
|
invalidSimpleSelector=Fehler in einfachem Selektor. |
||||||
|
invalidClassSelector=Fehler in Klassen-Selektor. |
||||||
|
invalidElementName=Fehler in Elementname. |
||||||
|
invalidAttrib=Fehler in Attribut-Selektor. |
||||||
|
invalidPseudo=Fehler in Pseudo-Klasse oder Pseudo-Element. |
||||||
|
duplicatePseudo=Doppelte Pseudo-Klasse \":{0}\" oder die Pseudo-Klasse \":{0}\" ist nicht das letzte Element. |
||||||
|
invalidHash=Fehler in Hash. |
||||||
|
invalidExpr=Fehler in Ausdruck. |
||||||
|
invalidExprColon=Fehler in Ausdruck; '':'' nach dem identifier \"{0}\" gefunden. |
||||||
|
invalidPrio=Fehler in Priorit\u00e4t. |
||||||
|
|
||||||
|
ignoringRule=Ignoriere die gesamte Regel. |
||||||
|
ignoringFollowingDeclarations=Ignoriere die folgenden Deklarationen in dieser Regel. |
||||||
|
|
||||||
|
tokenMgrError=Lexikalischer Fehler. |
||||||
|
domException=DOM Fehler: ''{0}'' |
@ -0,0 +1,40 @@ |
|||||||
|
# resource bundle for SACParser messages - default |
||||||
|
invalidExpectingOne=Invalid token \"{0}\". Was expecting: {1}. |
||||||
|
invalidExpectingMore=Invalid token \"{0}\". Was expecting one of: {1}. |
||||||
|
invalidColor=Invalid color \"{0}\". |
||||||
|
invalidStyleSheet=Error in style sheet. |
||||||
|
invalidRule=Error in rule. |
||||||
|
invalidUnknownRule=Error in unknown at-rule. |
||||||
|
invalidCharsetRule=Error in @charset rule. |
||||||
|
misplacedCharsetRule=The @charset must be the first element in the style sheet. |
||||||
|
invalidImportRule=Error in @import rule. |
||||||
|
invalidImportRuleIgnored=@import rule must occur before all other rules. |
||||||
|
invalidImportRuleIgnored2=@import rule must occur before all other rules, except the @charset rule. |
||||||
|
invalidPageRule=Error in @page rule. |
||||||
|
invalidFontFaceRule=Error in @font-face rule. |
||||||
|
invalidMediaList=Error in media list. |
||||||
|
invalidMediaRule=Error in @media rule. |
||||||
|
invalidStyleRule=Error in style rule. |
||||||
|
invalidStyleDeclaration=Error in style declaration. |
||||||
|
invalidDeclaration=Error in declaration. |
||||||
|
invalidDeclarationInvalidChar=Error in declaration; invalid character \"{0}\" found. |
||||||
|
invalidDeclarationStarHack=Error in declaration. ''*'' is not allowed as first char of a property. |
||||||
|
invalidSelectorList=Error in selector list. |
||||||
|
invalidSelector=Error in selector. |
||||||
|
invalidSimpleSelector=Error in simple selector. |
||||||
|
invalidClassSelector=Error in class selector. |
||||||
|
invalidElementName=Error in element name. |
||||||
|
invalidAttrib=Error in attribute selector. |
||||||
|
invalidPseudo=Error in pseudo class or element. |
||||||
|
duplicatePseudo=Duplicate pseudo class \":{0}\" or pseudo class \":{0}\" not at end. |
||||||
|
invalidHash=Error in hash. |
||||||
|
invalidExpr=Error in expression. |
||||||
|
invalidExprColon=Error in expression; '':'' found after identifier \"{0}\". |
||||||
|
invalidPrio=Error in priority. |
||||||
|
|
||||||
|
ignoringRule=Ignoring the whole rule. |
||||||
|
ignoringFollowingDeclarations=Ignoring the following declarations in this rule. |
||||||
|
|
||||||
|
tokenMgrError=Lexical error. |
||||||
|
domException=DOM exception: ''{0}'' |
||||||
|
|
@ -0,0 +1,81 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of {@link SelectorList}. |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class SelectorListImpl extends LocatableImpl implements SelectorList, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7313376916207026333L; |
||||||
|
|
||||||
|
private List<Selector> selectors_ = new ArrayList<Selector>(10); |
||||||
|
|
||||||
|
public List<Selector> getSelectors() { |
||||||
|
return selectors_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelectors(final List<Selector> selectors) { |
||||||
|
selectors_ = selectors; |
||||||
|
} |
||||||
|
|
||||||
|
public int getLength() { |
||||||
|
return selectors_.size(); |
||||||
|
} |
||||||
|
|
||||||
|
public Selector item(final int index) { |
||||||
|
return selectors_.get(index); |
||||||
|
} |
||||||
|
|
||||||
|
public void add(final Selector sel) { |
||||||
|
selectors_.add(sel); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final int len = getLength(); |
||||||
|
|
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < len; i++) { |
||||||
|
final CSSFormatable sel = (CSSFormatable) item(i); |
||||||
|
sb.append(sel.getCssText(format)); |
||||||
|
if (i < len - 1) { |
||||||
|
sb.append(", "); |
||||||
|
} |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. Token.java Version 7.0 */ |
||||||
|
/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COLUMN=true,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
/** |
||||||
|
* Describes the input token stream. |
||||||
|
*/ |
||||||
|
|
||||||
|
@SuppressWarnings("all") public class Token implements java.io.Serializable { |
||||||
|
|
||||||
|
/** |
||||||
|
* The version identifier for this Serializable class. |
||||||
|
* Increment only if the <i>serialized</i> form of the |
||||||
|
* class changes. |
||||||
|
*/ |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
/** |
||||||
|
* An integer that describes the kind of this token. This numbering |
||||||
|
* system is determined by JavaCCParser, and a table of these numbers is |
||||||
|
* stored in the file ...Constants.java. |
||||||
|
*/ |
||||||
|
public int kind; |
||||||
|
|
||||||
|
/** The line number of the first character of this Token. */ |
||||||
|
public int beginLine; |
||||||
|
/** The column number of the first character of this Token. */ |
||||||
|
public int beginColumn; |
||||||
|
/** The line number of the last character of this Token. */ |
||||||
|
public int endLine; |
||||||
|
/** The column number of the last character of this Token. */ |
||||||
|
public int endColumn; |
||||||
|
|
||||||
|
/** |
||||||
|
* The string image of the token. |
||||||
|
*/ |
||||||
|
public String image; |
||||||
|
|
||||||
|
/** |
||||||
|
* A reference to the next regular (non-special) token from the input |
||||||
|
* stream. If this is the last token from the input stream, or if the |
||||||
|
* token manager has not read tokens beyond this one, this field is |
||||||
|
* set to null. This is true only if this token is also a regular |
||||||
|
* token. Otherwise, see below for a description of the contents of |
||||||
|
* this field. |
||||||
|
*/ |
||||||
|
public Token next; |
||||||
|
|
||||||
|
/** |
||||||
|
* This field is used to access special tokens that occur prior to this |
||||||
|
* token, but after the immediately preceding regular (non-special) token. |
||||||
|
* If there are no such special tokens, this field is set to null. |
||||||
|
* When there are more than one such special token, this field refers |
||||||
|
* to the last of these special tokens, which in turn refers to the next |
||||||
|
* previous special token through its specialToken field, and so on |
||||||
|
* until the first special token (whose specialToken field is null). |
||||||
|
* The next fields of special tokens refer to other special tokens that |
||||||
|
* immediately follow it (without an intervening regular token). If there |
||||||
|
* is no such token, this field is null. |
||||||
|
*/ |
||||||
|
public Token specialToken; |
||||||
|
|
||||||
|
/** |
||||||
|
* An optional attribute value of the Token. |
||||||
|
* Tokens which are not used as syntactic sugar will often contain |
||||||
|
* meaningful values that will be used later on by the compiler or |
||||||
|
* interpreter. This attribute value is often different from the image. |
||||||
|
* Any subclass of Token that actually wants to return a non-null value can |
||||||
|
* override this method as appropriate. |
||||||
|
*/ |
||||||
|
public Object getValue() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* No-argument constructor |
||||||
|
*/ |
||||||
|
public Token() {} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a new token for the specified Image. |
||||||
|
*/ |
||||||
|
public Token(int kind) |
||||||
|
{ |
||||||
|
this(kind, null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a new token for the specified Image and Kind. |
||||||
|
*/ |
||||||
|
public Token(int kind, String image) |
||||||
|
{ |
||||||
|
this.kind = kind; |
||||||
|
this.image = image; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the image. |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return image; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a new Token object, by default. However, if you want, you |
||||||
|
* can create and return subclass objects based on the value of ofKind. |
||||||
|
* Simply add the cases to the switch for all those special cases. |
||||||
|
* For example, if you have a subclass of Token called IDToken that |
||||||
|
* you want to create if ofKind is ID, simply add something like : |
||||||
|
* |
||||||
|
* case MyParserConstants.ID : return new IDToken(ofKind, image); |
||||||
|
* |
||||||
|
* to the following switch statement. Then you can cast matchedToken |
||||||
|
* variable to the appropriate type and use sit in your lexical actions. |
||||||
|
*/ |
||||||
|
public static Token newToken(int ofKind, String image) |
||||||
|
{ |
||||||
|
switch(ofKind) |
||||||
|
{ |
||||||
|
default : return new Token(ofKind, image); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static Token newToken(int ofKind) |
||||||
|
{ |
||||||
|
return newToken(ofKind, null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
/* JavaCC - OriginalChecksum=42fb99eba8a3a8a58b2bdee94f557744 (do not edit this line) */ |
@ -0,0 +1,147 @@ |
|||||||
|
/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 7.0 */ |
||||||
|
/* JavaCCOptions: */ |
||||||
|
package com.fr.third.steadystate.css.parser; |
||||||
|
|
||||||
|
/** Token Manager Error. */ |
||||||
|
@SuppressWarnings("all") public class TokenMgrError extends Error |
||||||
|
{ |
||||||
|
|
||||||
|
/** |
||||||
|
* The version identifier for this Serializable class. |
||||||
|
* Increment only if the <i>serialized</i> form of the |
||||||
|
* class changes. |
||||||
|
*/ |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
/* |
||||||
|
* Ordinals for various reasons why an Error of this type can be thrown. |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Lexical error occurred. |
||||||
|
*/ |
||||||
|
public static final int LEXICAL_ERROR = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* An attempt was made to create a second instance of a static token manager. |
||||||
|
*/ |
||||||
|
public static final int STATIC_LEXER_ERROR = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tried to change to an invalid lexical state. |
||||||
|
*/ |
||||||
|
public static final int INVALID_LEXICAL_STATE = 2; |
||||||
|
|
||||||
|
/** |
||||||
|
* Detected (and bailed out of) an infinite loop in the token manager. |
||||||
|
*/ |
||||||
|
public static final int LOOP_DETECTED = 3; |
||||||
|
|
||||||
|
/** |
||||||
|
* Indicates the reason why the exception is thrown. It will have |
||||||
|
* one of the above 4 values. |
||||||
|
*/ |
||||||
|
int errorCode; |
||||||
|
|
||||||
|
/** |
||||||
|
* Replaces unprintable characters by their escaped (or unicode escaped) |
||||||
|
* equivalents in the given string |
||||||
|
*/ |
||||||
|
protected static final String addEscapes(String str) { |
||||||
|
StringBuffer retval = new StringBuffer(); |
||||||
|
char ch; |
||||||
|
for (int i = 0; i < str.length(); i++) { |
||||||
|
switch (str.charAt(i)) |
||||||
|
{ |
||||||
|
case '\b': |
||||||
|
retval.append("\\b"); |
||||||
|
continue; |
||||||
|
case '\t': |
||||||
|
retval.append("\\t"); |
||||||
|
continue; |
||||||
|
case '\n': |
||||||
|
retval.append("\\n"); |
||||||
|
continue; |
||||||
|
case '\f': |
||||||
|
retval.append("\\f"); |
||||||
|
continue; |
||||||
|
case '\r': |
||||||
|
retval.append("\\r"); |
||||||
|
continue; |
||||||
|
case '\"': |
||||||
|
retval.append("\\\""); |
||||||
|
continue; |
||||||
|
case '\'': |
||||||
|
retval.append("\\\'"); |
||||||
|
continue; |
||||||
|
case '\\': |
||||||
|
retval.append("\\\\"); |
||||||
|
continue; |
||||||
|
default: |
||||||
|
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { |
||||||
|
String s = "0000" + Integer.toString(ch, 16); |
||||||
|
retval.append("\\u" + s.substring(s.length() - 4, s.length())); |
||||||
|
} else { |
||||||
|
retval.append(ch); |
||||||
|
} |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
return retval.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a detailed message for the Error when it is thrown by the |
||||||
|
* token manager to indicate a lexical error. |
||||||
|
* Parameters : |
||||||
|
* EOFSeen : indicates if EOF caused the lexical error |
||||||
|
* curLexState : lexical state in which this error occurred |
||||||
|
* errorLine : line number when the error occurred |
||||||
|
* errorColumn : column number when the error occurred |
||||||
|
* errorAfter : prefix that was seen before this error occurred |
||||||
|
* curchar : the offending character |
||||||
|
* Note: You can customize the lexical error message by modifying this method. |
||||||
|
*/ |
||||||
|
protected static String LexicalErr(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, int curChar) { |
||||||
|
char curChar1 = (char)curChar; |
||||||
|
return("Lexical error at line " + |
||||||
|
errorLine + ", column " + |
||||||
|
errorColumn + ". Encountered: " + |
||||||
|
(EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar1)) + "\"") + " (" + curChar + "), ") + |
||||||
|
"after : \"" + addEscapes(errorAfter) + "\""); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* You can also modify the body of this method to customize your error messages. |
||||||
|
* For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not |
||||||
|
* of end-users concern, so you can return something like : |
||||||
|
* |
||||||
|
* "Internal Error : Please file a bug report .... " |
||||||
|
* |
||||||
|
* from this method for such cases in the release version of your parser. |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getMessage() { |
||||||
|
return super.getMessage(); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Constructors of various flavors follow. |
||||||
|
*/ |
||||||
|
|
||||||
|
/** No arg constructor. */ |
||||||
|
public TokenMgrError() { |
||||||
|
} |
||||||
|
|
||||||
|
/** Constructor with message and reason. */ |
||||||
|
public TokenMgrError(String message, int reason) { |
||||||
|
super(message); |
||||||
|
errorCode = reason; |
||||||
|
} |
||||||
|
|
||||||
|
/** Full Constructor. */ |
||||||
|
public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, int curChar, int reason) { |
||||||
|
this(LexicalErr(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); |
||||||
|
} |
||||||
|
} |
||||||
|
/* JavaCC - OriginalChecksum=79a7770cdb8d32ef3bb22077e08dbe6a (do not edit this line) */ |
@ -0,0 +1,101 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.media; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.dom.Property; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class MediaQuery extends LocatableImpl implements CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 456776383828897471L; |
||||||
|
|
||||||
|
private String media_; |
||||||
|
private List<Property> properties_; |
||||||
|
private boolean isOnly_; |
||||||
|
private boolean isNot_; |
||||||
|
|
||||||
|
public MediaQuery(final String media) { |
||||||
|
this(media, false, false); |
||||||
|
} |
||||||
|
|
||||||
|
public MediaQuery(final String media, final boolean isOnly, final boolean isNot) { |
||||||
|
setMedia(media); |
||||||
|
properties_ = new ArrayList<Property>(10); |
||||||
|
isOnly_ = isOnly; |
||||||
|
isNot_ = isNot; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMedia() { |
||||||
|
return media_; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMedia(final String media) { |
||||||
|
media_ = media; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Property> getProperties() { |
||||||
|
return properties_; |
||||||
|
} |
||||||
|
|
||||||
|
public void addMediaProperty(final Property mp) { |
||||||
|
properties_.add(mp); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isOnly() { |
||||||
|
return isOnly_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isNot() { |
||||||
|
return isNot_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (isOnly_) { |
||||||
|
sb.append("only "); |
||||||
|
} |
||||||
|
if (isNot_) { |
||||||
|
sb.append("not "); |
||||||
|
} |
||||||
|
|
||||||
|
sb.append(getMedia()); |
||||||
|
|
||||||
|
for (Property prop : properties_) { |
||||||
|
sb.append(" and (") |
||||||
|
.append(prop.getCssText(format)) |
||||||
|
.append(')'); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,94 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.CombinatorCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class AndConditionImpl extends LocatableImpl implements CombinatorCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -3180583860092672742L; |
||||||
|
|
||||||
|
private Condition firstCondition_; |
||||||
|
private Condition secondCondition_; |
||||||
|
|
||||||
|
public void setFirstCondition(final Condition c1) { |
||||||
|
firstCondition_ = c1; |
||||||
|
if (c1 instanceof Locatable) { |
||||||
|
setLocator(((Locatable) c1).getLocator()); |
||||||
|
} |
||||||
|
else if (c1 == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setSecondCondition(final Condition c2) { |
||||||
|
secondCondition_ = c2; |
||||||
|
} |
||||||
|
|
||||||
|
public AndConditionImpl(final Condition c1, final Condition c2) { |
||||||
|
setFirstCondition(c1); |
||||||
|
setSecondCondition(c2); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_AND_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public Condition getFirstCondition() { |
||||||
|
return firstCondition_; |
||||||
|
} |
||||||
|
|
||||||
|
public Condition getSecondCondition() { |
||||||
|
return secondCondition_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
Condition cond = getFirstCondition(); |
||||||
|
if (null != cond) { |
||||||
|
sb.append(((CSSFormatable) cond).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
cond = getSecondCondition(); |
||||||
|
if (null != cond) { |
||||||
|
sb.append(((CSSFormatable) cond).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,92 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class AttributeConditionImpl extends LocatableImpl implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 9035418830958954213L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private String value_; |
||||||
|
private boolean specified_; |
||||||
|
|
||||||
|
public void setLocaleName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSpecified(final boolean specified) { |
||||||
|
specified_ = specified; |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeConditionImpl(final String localName, final String value, final boolean specified) { |
||||||
|
setLocaleName(localName); |
||||||
|
setValue(value); |
||||||
|
setSpecified(specified); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_ATTRIBUTE_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return specified_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "[" + getLocalName() + "=\"" + value + "\"]"; |
||||||
|
} |
||||||
|
return "[" + getLocalName() + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,94 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class BeginHyphenAttributeConditionImpl extends LocatableImpl |
||||||
|
implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 6552118983276681650L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private String value_; |
||||||
|
private boolean specified_; |
||||||
|
|
||||||
|
public void setLocaleName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSpecified(final boolean specified) { |
||||||
|
specified_ = specified; |
||||||
|
} |
||||||
|
|
||||||
|
public BeginHyphenAttributeConditionImpl(final String localName, final String value, final boolean specified) { |
||||||
|
setLocaleName(localName); |
||||||
|
setValue(value); |
||||||
|
setSpecified(specified); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_BEGIN_HYPHEN_ATTRIBUTE_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return specified_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "[" + getLocalName() + "|=\"" + value + "\"]"; |
||||||
|
} |
||||||
|
return "[" + getLocalName() + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,69 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.CharacterDataSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class CharacterDataSelectorImpl extends LocatableImpl |
||||||
|
implements CharacterDataSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 4635511567927852889L; |
||||||
|
|
||||||
|
private String data_; |
||||||
|
|
||||||
|
public void setData(final String data) { |
||||||
|
data_ = data; |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelectorImpl(final String data) { |
||||||
|
setData(data); |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_CDATA_SECTION_NODE_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public String getData() { |
||||||
|
return data_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String data = getData(); |
||||||
|
if (data == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return data; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,94 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import org.w3c.css.sac.DescendantSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class ChildSelectorImpl extends LocatableImpl implements DescendantSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -5843289529637921083L; |
||||||
|
|
||||||
|
private Selector ancestorSelector_; |
||||||
|
private SimpleSelector simpleSelector_; |
||||||
|
|
||||||
|
public void setAncestorSelector(final Selector ancestorSelector) { |
||||||
|
ancestorSelector_ = ancestorSelector; |
||||||
|
if (ancestorSelector instanceof Locatable) { |
||||||
|
setLocator(((Locatable) ancestorSelector).getLocator()); |
||||||
|
} |
||||||
|
else if (ancestorSelector == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setSimpleSelector(final SimpleSelector simpleSelector) { |
||||||
|
simpleSelector_ = simpleSelector; |
||||||
|
} |
||||||
|
|
||||||
|
public ChildSelectorImpl(final Selector parent, final SimpleSelector simpleSelector) { |
||||||
|
setAncestorSelector(parent); |
||||||
|
setSimpleSelector(simpleSelector); |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_CHILD_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public Selector getAncestorSelector() { |
||||||
|
return ancestorSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector getSimpleSelector() { |
||||||
|
return simpleSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (null != ancestorSelector_) { |
||||||
|
sb.append(((CSSFormatable) ancestorSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
sb.append(" > "); |
||||||
|
|
||||||
|
if (null != simpleSelector_) { |
||||||
|
sb.append(((CSSFormatable) simpleSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class ClassConditionImpl extends LocatableImpl implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -2216489300949054242L; |
||||||
|
|
||||||
|
private String value_; |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public ClassConditionImpl(final String value) { |
||||||
|
setValue(value); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_CLASS_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "." + value; |
||||||
|
} |
||||||
|
return "."; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,164 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.CombinatorCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
import org.w3c.css.sac.ContentCondition; |
||||||
|
import org.w3c.css.sac.LangCondition; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.NegativeCondition; |
||||||
|
import org.w3c.css.sac.PositionalCondition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.sac.ConditionFactoryExt; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author Ronald Brill |
||||||
|
*/ |
||||||
|
public class ConditionFactoryImpl implements ConditionFactoryExt { |
||||||
|
|
||||||
|
public CombinatorCondition createAndCondition(final Condition first, final Condition second) throws CSSException { |
||||||
|
return new AndConditionImpl(first, second); |
||||||
|
} |
||||||
|
|
||||||
|
public CombinatorCondition createOrCondition(final Condition first, final Condition second) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public NegativeCondition createNegativeCondition(final Condition condition) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public PositionalCondition createPositionalCondition( |
||||||
|
final int position, |
||||||
|
final boolean typeNode, |
||||||
|
final boolean type) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createAttributeCondition( |
||||||
|
final String localName, |
||||||
|
final String namespaceURI, |
||||||
|
final boolean specified, |
||||||
|
final String value) throws CSSException { |
||||||
|
return new AttributeConditionImpl(localName, value, specified); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createIdCondition(final String value) throws CSSException { |
||||||
|
return createIdCondition(value, null); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createIdCondition(final String value, final Locator locator) throws CSSException { |
||||||
|
final IdConditionImpl cond = new IdConditionImpl(value); |
||||||
|
cond.setLocator(locator); |
||||||
|
return cond; |
||||||
|
} |
||||||
|
|
||||||
|
public LangCondition createLangCondition(final String lang) throws CSSException { |
||||||
|
return createLangCondition(lang, null); |
||||||
|
} |
||||||
|
public LangCondition createLangCondition(final String lang, final Locator locator) throws CSSException { |
||||||
|
final LangConditionImpl cond = new LangConditionImpl(lang); |
||||||
|
cond.setLocator(locator); |
||||||
|
return cond; |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createOneOfAttributeCondition( |
||||||
|
final String localName, |
||||||
|
final String namespaceURI, |
||||||
|
final boolean specified, |
||||||
|
final String value) throws CSSException { |
||||||
|
return new OneOfAttributeConditionImpl(localName, value, specified); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createBeginHyphenAttributeCondition( |
||||||
|
final String localName, |
||||||
|
final String namespaceURI, |
||||||
|
final boolean specified, |
||||||
|
final String value) throws CSSException { |
||||||
|
return new BeginHyphenAttributeConditionImpl(localName, value, specified); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createPrefixAttributeCondition( |
||||||
|
final String localName, |
||||||
|
final String namespaceURI, |
||||||
|
final boolean specified, |
||||||
|
final String value) throws CSSException { |
||||||
|
return new PrefixAttributeConditionImpl(localName, value, specified); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createSuffixAttributeCondition( |
||||||
|
final String localName, |
||||||
|
final String namespaceURI, |
||||||
|
final boolean specified, |
||||||
|
final String value) throws CSSException { |
||||||
|
return new SuffixAttributeConditionImpl(localName, value, specified); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createSubstringAttributeCondition( |
||||||
|
final String localName, |
||||||
|
final String namespaceURI, |
||||||
|
final boolean specified, |
||||||
|
final String value) throws CSSException { |
||||||
|
return new SubstringAttributeConditionImpl(localName, value, specified); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createClassCondition( |
||||||
|
final String namespaceURI, |
||||||
|
final String value) throws CSSException { |
||||||
|
return createClassCondition(namespaceURI, value, null); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createClassCondition(final String namespaceURI, final String value, |
||||||
|
final Locator locator) throws CSSException { |
||||||
|
final ClassConditionImpl cond = new ClassConditionImpl(value); |
||||||
|
cond.setLocator(locator); |
||||||
|
return cond; |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createPseudoClassCondition( |
||||||
|
final String namespaceURI, |
||||||
|
final String value) throws CSSException { |
||||||
|
return createPseudoClassCondition(namespaceURI, value, null, false); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createPseudoClassCondition(final String namespaceURI, final String value, |
||||||
|
final Locator locator, final boolean doubleColon) throws CSSException { |
||||||
|
final PseudoClassConditionImpl cond = new PseudoClassConditionImpl(value); |
||||||
|
cond.setLocator(locator); |
||||||
|
if (doubleColon) { |
||||||
|
cond.prefixedWithDoubleColon(); |
||||||
|
} |
||||||
|
return cond; |
||||||
|
} |
||||||
|
|
||||||
|
public Condition createOnlyChildCondition() throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public Condition createOnlyTypeCondition() throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public ContentCondition createContentCondition(final String data) |
||||||
|
throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,102 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
import org.w3c.css.sac.ConditionalSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class ConditionalSelectorImpl extends LocatableImpl implements ConditionalSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7217145899707580586L; |
||||||
|
|
||||||
|
private SimpleSelector simpleSelector_; |
||||||
|
private Condition condition_; |
||||||
|
|
||||||
|
public void setSimpleSelector(final SimpleSelector simpleSelector) { |
||||||
|
simpleSelector_ = simpleSelector; |
||||||
|
if (simpleSelector instanceof Locatable) { |
||||||
|
setLocator(((Locatable) simpleSelector).getLocator()); |
||||||
|
} |
||||||
|
else if (simpleSelector == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setCondition(final Condition condition) { |
||||||
|
condition_ = condition; |
||||||
|
if (getLocator() == null) { |
||||||
|
if (condition instanceof Locatable) { |
||||||
|
setLocator(((Locatable) condition).getLocator()); |
||||||
|
} |
||||||
|
else if (condition == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ConditionalSelectorImpl(final SimpleSelector simpleSelector, final Condition condition) { |
||||||
|
setSimpleSelector(simpleSelector); |
||||||
|
setCondition(condition); |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_CONDITIONAL_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector getSimpleSelector() { |
||||||
|
return simpleSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
public Condition getCondition() { |
||||||
|
return condition_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (null != simpleSelector_) { |
||||||
|
sb.append(((CSSFormatable) simpleSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
if (null != condition_) { |
||||||
|
sb.append(((CSSFormatable) condition_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.DescendantSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class DescendantSelectorImpl extends LocatableImpl implements DescendantSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -3620467847449531232L; |
||||||
|
|
||||||
|
private Selector ancestorSelector_; |
||||||
|
private SimpleSelector simpleSelector_; |
||||||
|
|
||||||
|
public void setAncestorSelector(final Selector ancestorSelector) { |
||||||
|
ancestorSelector_ = ancestorSelector; |
||||||
|
if (ancestorSelector instanceof Locatable) { |
||||||
|
setLocator(((Locatable) ancestorSelector).getLocator()); |
||||||
|
} |
||||||
|
else if (ancestorSelector == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setSimpleSelector(final SimpleSelector simpleSelector) { |
||||||
|
simpleSelector_ = simpleSelector; |
||||||
|
} |
||||||
|
|
||||||
|
public DescendantSelectorImpl(final Selector parent, final SimpleSelector simpleSelector) { |
||||||
|
setAncestorSelector(parent); |
||||||
|
setSimpleSelector(simpleSelector); |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_DESCENDANT_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public Selector getAncestorSelector() { |
||||||
|
return ancestorSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector getSimpleSelector() { |
||||||
|
return simpleSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (null != ancestorSelector_) { |
||||||
|
sb.append(((CSSFormatable) ancestorSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
if (Selector.SAC_PSEUDO_ELEMENT_SELECTOR != getSimpleSelector().getSelectorType()) { |
||||||
|
sb.append(' '); |
||||||
|
} |
||||||
|
|
||||||
|
if (null != simpleSelector_) { |
||||||
|
sb.append(((CSSFormatable) simpleSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SiblingSelector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class DirectAdjacentSelectorImpl extends LocatableImpl implements SiblingSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -7328602345833826516L; |
||||||
|
|
||||||
|
private short nodeType_; |
||||||
|
private Selector selector_; // child
|
||||||
|
private SimpleSelector siblingSelector_; // direct adjacent
|
||||||
|
|
||||||
|
public void setNodeType(final short nodeType) { |
||||||
|
nodeType_ = nodeType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelector(final Selector child) { |
||||||
|
selector_ = child; |
||||||
|
if (child instanceof Locatable) { |
||||||
|
setLocator(((Locatable) child).getLocator()); |
||||||
|
} |
||||||
|
else if (child == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setSiblingSelector(final SimpleSelector directAdjacent) { |
||||||
|
siblingSelector_ = directAdjacent; |
||||||
|
} |
||||||
|
|
||||||
|
public DirectAdjacentSelectorImpl(final short nodeType, |
||||||
|
final Selector child, final SimpleSelector directAdjacent) { |
||||||
|
setNodeType(nodeType); |
||||||
|
setSelector(child); |
||||||
|
setSiblingSelector(directAdjacent); |
||||||
|
} |
||||||
|
|
||||||
|
public short getNodeType() { |
||||||
|
return nodeType_; |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_DIRECT_ADJACENT_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public Selector getSelector() { |
||||||
|
return selector_; |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector getSiblingSelector() { |
||||||
|
return siblingSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (null != selector_) { |
||||||
|
sb.append(((CSSFormatable) selector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
sb.append(" + "); |
||||||
|
|
||||||
|
if (null != siblingSelector_) { |
||||||
|
sb.append(((CSSFormatable) siblingSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.ElementSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class ElementSelectorImpl extends LocatableImpl implements ElementSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7507121069969409061L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
|
||||||
|
public void setLocalName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelectorImpl(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_ELEMENT_NODE_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String localeName = getLocalName(); |
||||||
|
if (localeName == null) { |
||||||
|
return "*"; |
||||||
|
} |
||||||
|
return localeName; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.Locatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SiblingSelector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Ahmed Ashour |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class GeneralAdjacentSelectorImpl extends LocatableImpl implements SiblingSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1292704016876205605L; |
||||||
|
|
||||||
|
private short nodeType_; |
||||||
|
private Selector selector_; |
||||||
|
private SimpleSelector siblingSelector_; |
||||||
|
|
||||||
|
public void setNodeType(final short nodeType) { |
||||||
|
nodeType_ = nodeType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelector(final Selector child) { |
||||||
|
selector_ = child; |
||||||
|
if (child instanceof Locatable) { |
||||||
|
setLocator(((Locatable) child).getLocator()); |
||||||
|
} |
||||||
|
else if (child == null) { |
||||||
|
setLocator(null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setSiblingSelector(final SimpleSelector directAdjacent) { |
||||||
|
siblingSelector_ = directAdjacent; |
||||||
|
} |
||||||
|
|
||||||
|
public GeneralAdjacentSelectorImpl(final short nodeType, |
||||||
|
final Selector child, final SimpleSelector directAdjacent) { |
||||||
|
setNodeType(nodeType); |
||||||
|
setSelector(child); |
||||||
|
setSiblingSelector(directAdjacent); |
||||||
|
} |
||||||
|
|
||||||
|
public short getNodeType() { |
||||||
|
return nodeType_; |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
// not correct but the best choice from the old sac
|
||||||
|
return Selector.SAC_DIRECT_ADJACENT_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public Selector getSelector() { |
||||||
|
return selector_; |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector getSiblingSelector() { |
||||||
|
return siblingSelector_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (null != selector_) { |
||||||
|
sb.append(((CSSFormatable) selector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
sb.append(" ~ "); |
||||||
|
|
||||||
|
if (null != siblingSelector_) { |
||||||
|
sb.append(((CSSFormatable) siblingSelector_).getCssText(format)); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class IdConditionImpl extends LocatableImpl implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 5955662524656167683L; |
||||||
|
|
||||||
|
private String value_; |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public IdConditionImpl(final String value) { |
||||||
|
setValue(value); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_ID_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "#" + value; |
||||||
|
} |
||||||
|
return "#"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
import org.w3c.css.sac.LangCondition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class LangConditionImpl extends LocatableImpl implements LangCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1701599531953055387L; |
||||||
|
|
||||||
|
private String lang_; |
||||||
|
|
||||||
|
public void setLang(final String lang) { |
||||||
|
lang_ = lang; |
||||||
|
} |
||||||
|
|
||||||
|
public LangConditionImpl(final String lang) { |
||||||
|
setLang(lang); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_LANG_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLang() { |
||||||
|
return lang_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final StringBuilder result = new StringBuilder(); |
||||||
|
result.append(":lang("); |
||||||
|
|
||||||
|
final String lang = getLang(); |
||||||
|
if (null != lang) { |
||||||
|
result.append(lang); |
||||||
|
} |
||||||
|
|
||||||
|
result.append(")"); |
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,93 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class OneOfAttributeConditionImpl extends LocatableImpl |
||||||
|
implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -1371164446179830634L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private String value_; |
||||||
|
private boolean specified_; |
||||||
|
|
||||||
|
public void setLocalName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSpecified(final boolean specified) { |
||||||
|
specified_ = specified; |
||||||
|
} |
||||||
|
|
||||||
|
public OneOfAttributeConditionImpl(final String localName, final String value, final boolean specified) { |
||||||
|
setLocalName(localName); |
||||||
|
setValue(value); |
||||||
|
setSpecified(specified); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_ONE_OF_ATTRIBUTE_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return specified_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "[" + getLocalName() + "~=\"" + value + "\"]"; |
||||||
|
} |
||||||
|
return "[" + getLocalName() + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Ahmed Ashour |
||||||
|
*/ |
||||||
|
public class PrefixAttributeConditionImpl extends LocatableImpl |
||||||
|
implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -6899059242714875011L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private String value_; |
||||||
|
private boolean specified_; |
||||||
|
|
||||||
|
public void setLocalName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSpecified(final boolean specified) { |
||||||
|
specified_ = specified; |
||||||
|
} |
||||||
|
|
||||||
|
public PrefixAttributeConditionImpl(final String localName, final String value, final boolean specified) { |
||||||
|
setLocalName(localName); |
||||||
|
setValue(value); |
||||||
|
setSpecified(specified); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_ATTRIBUTE_CONDITION; //for now
|
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return specified_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "[" + getLocalName() + "^=\"" + value + "\"]"; |
||||||
|
} |
||||||
|
return "[" + getLocalName() + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,86 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class PseudoClassConditionImpl extends LocatableImpl implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1798016773089155610L; |
||||||
|
|
||||||
|
private String value_; |
||||||
|
private boolean doubleColon_; |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public PseudoClassConditionImpl(final String value) { |
||||||
|
setValue(value); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_PSEUDO_CLASS_CONDITION; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
public void prefixedWithDoubleColon() { |
||||||
|
doubleColon_ = true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value == null) { |
||||||
|
return value; |
||||||
|
} |
||||||
|
return (doubleColon_ ? "::" : ":") + value; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.ElementSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class PseudoElementSelectorImpl extends LocatableImpl implements ElementSelector, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 2913936296006875268L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private boolean doubleColon_; |
||||||
|
|
||||||
|
public void setLocaleName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public PseudoElementSelectorImpl(final String localName) { |
||||||
|
setLocaleName(localName); |
||||||
|
} |
||||||
|
|
||||||
|
public short getSelectorType() { |
||||||
|
return Selector.SAC_PSEUDO_ELEMENT_SELECTOR; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public void prefixedWithDoubleColon() { |
||||||
|
doubleColon_ = true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
if (localName_ == null) { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
return (doubleColon_ ? "::" : ":") + localName_; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,139 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.sac.SelectorFactoryExt; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.CharacterDataSelector; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
import org.w3c.css.sac.ConditionalSelector; |
||||||
|
import org.w3c.css.sac.DescendantSelector; |
||||||
|
import org.w3c.css.sac.ElementSelector; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.NegativeSelector; |
||||||
|
import org.w3c.css.sac.ProcessingInstructionSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SiblingSelector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author <a href="mailto:davidsch@users.sourceforge.net">David Schweinsberg</a> |
||||||
|
* @author Ronald Brill |
||||||
|
*/ |
||||||
|
public class SelectorFactoryImpl implements SelectorFactoryExt { |
||||||
|
|
||||||
|
public ConditionalSelector createConditionalSelector( |
||||||
|
final SimpleSelector selector, |
||||||
|
final Condition condition) throws CSSException { |
||||||
|
return new ConditionalSelectorImpl(selector, condition); |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector createAnyNodeSelector() throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector createRootNodeSelector() throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public NegativeSelector createNegativeSelector(final SimpleSelector selector) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createElementSelector(final String namespaceURI, final String localName) |
||||||
|
throws CSSException { |
||||||
|
return createElementSelector(namespaceURI, localName, null); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createElementSelector(final String namespaceURI, final String localName, |
||||||
|
final Locator locator) throws CSSException { |
||||||
|
if (namespaceURI != null) { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
final ElementSelectorImpl sel = new ElementSelectorImpl(localName); |
||||||
|
sel.setLocator(locator); |
||||||
|
return sel; |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createSyntheticElementSelector() throws CSSException { |
||||||
|
return new SyntheticElementSelectorImpl(); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelector createTextNodeSelector(final String data) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelector createCDataSectionSelector(final String data) |
||||||
|
throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public ProcessingInstructionSelector createProcessingInstructionSelector( |
||||||
|
final String target, |
||||||
|
final String data) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelector createCommentSelector(final String data) throws CSSException { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createPseudoElementSelector(final String namespaceURI, final String pseudoName) |
||||||
|
throws CSSException { |
||||||
|
return createPseudoElementSelector(namespaceURI, pseudoName, null, false); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createPseudoElementSelector(final String namespaceURI, final String pseudoName, |
||||||
|
final Locator locator, final boolean doubleColon) throws CSSException { |
||||||
|
if (namespaceURI != null) { |
||||||
|
throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR); |
||||||
|
} |
||||||
|
|
||||||
|
final PseudoElementSelectorImpl sel = new PseudoElementSelectorImpl(pseudoName); |
||||||
|
sel.setLocator(locator); |
||||||
|
if (doubleColon) { |
||||||
|
sel.prefixedWithDoubleColon(); |
||||||
|
} |
||||||
|
return sel; |
||||||
|
} |
||||||
|
|
||||||
|
public DescendantSelector createDescendantSelector( |
||||||
|
final Selector parent, |
||||||
|
final SimpleSelector descendant) throws CSSException { |
||||||
|
return new DescendantSelectorImpl(parent, descendant); |
||||||
|
} |
||||||
|
|
||||||
|
public DescendantSelector createChildSelector( |
||||||
|
final Selector parent, |
||||||
|
final SimpleSelector child) throws CSSException { |
||||||
|
return new ChildSelectorImpl(parent, child); |
||||||
|
} |
||||||
|
|
||||||
|
public SiblingSelector createDirectAdjacentSelector( |
||||||
|
final short nodeType, |
||||||
|
final Selector child, |
||||||
|
final SimpleSelector directAdjacent) throws CSSException { |
||||||
|
return new DirectAdjacentSelectorImpl(nodeType, child, directAdjacent); |
||||||
|
} |
||||||
|
|
||||||
|
public SiblingSelector createGeneralAdjacentSelector( |
||||||
|
final short nodeType, |
||||||
|
final Selector child, |
||||||
|
final SimpleSelector directAdjacent) throws CSSException { |
||||||
|
return new GeneralAdjacentSelectorImpl(nodeType, child, directAdjacent); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Ahmed Ashour |
||||||
|
*/ |
||||||
|
public class SubstringAttributeConditionImpl extends LocatableImpl |
||||||
|
implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 7628763646156568710L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private String value_; |
||||||
|
private boolean specified_; |
||||||
|
|
||||||
|
public void setLocalName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSpecified(final boolean specified) { |
||||||
|
specified_ = specified; |
||||||
|
} |
||||||
|
|
||||||
|
public SubstringAttributeConditionImpl(final String localName, final String value, final boolean specified) { |
||||||
|
setLocalName(localName); |
||||||
|
setValue(value); |
||||||
|
setSpecified(specified); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_ATTRIBUTE_CONDITION; //for now
|
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return specified_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "[" + getLocalName() + "*=\"" + value + "\"]"; |
||||||
|
} |
||||||
|
return "[" + getLocalName() + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
import com.fr.third.steadystate.css.format.CSSFormatable; |
||||||
|
import com.fr.third.steadystate.css.parser.LocatableImpl; |
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Ahmed Ashour |
||||||
|
*/ |
||||||
|
public class SuffixAttributeConditionImpl extends LocatableImpl |
||||||
|
implements AttributeCondition, CSSFormatable, Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = -957389472252773926L; |
||||||
|
|
||||||
|
private String localName_; |
||||||
|
private String value_; |
||||||
|
private boolean specified_; |
||||||
|
|
||||||
|
public void setLocalName(final String localName) { |
||||||
|
localName_ = localName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(final String value) { |
||||||
|
value_ = value; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSpecified(final boolean specified) { |
||||||
|
specified_ = specified; |
||||||
|
} |
||||||
|
|
||||||
|
public SuffixAttributeConditionImpl(final String localName, final String value, final boolean specified) { |
||||||
|
setLocalName(localName); |
||||||
|
setValue(value); |
||||||
|
setSpecified(specified); |
||||||
|
} |
||||||
|
|
||||||
|
public short getConditionType() { |
||||||
|
return Condition.SAC_ATTRIBUTE_CONDITION; //for now
|
||||||
|
} |
||||||
|
|
||||||
|
public String getNamespaceURI() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLocalName() { |
||||||
|
return localName_; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean getSpecified() { |
||||||
|
return specified_; |
||||||
|
} |
||||||
|
|
||||||
|
public String getValue() { |
||||||
|
return value_; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
final String value = getValue(); |
||||||
|
if (value != null) { |
||||||
|
return "[" + getLocalName() + "$=\"" + value + "\"]"; |
||||||
|
} |
||||||
|
return "[" + getLocalName() + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return getCssText(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.parser.selectors; |
||||||
|
|
||||||
|
import com.fr.third.steadystate.css.format.CSSFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Special ElementSelectorImpl used by the parser at all the places where |
||||||
|
* the parser inserts a '*' selector. The selector will be ignored when |
||||||
|
* generating output. |
||||||
|
* This is done to be backward compatible. |
||||||
|
* |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public class SyntheticElementSelectorImpl extends ElementSelectorImpl { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 3426191759125755798L; |
||||||
|
|
||||||
|
public SyntheticElementSelectorImpl() { |
||||||
|
super(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setLocalName(final String localName) { |
||||||
|
throw new RuntimeException("Method setLocalName is not supported for SyntheticElementSelectorImpl."); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String getCssText(final CSSFormat format) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,119 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.sac; |
||||||
|
|
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.CombinatorCondition; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
import org.w3c.css.sac.ConditionFactory; |
||||||
|
import org.w3c.css.sac.ContentCondition; |
||||||
|
import org.w3c.css.sac.LangCondition; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.NegativeCondition; |
||||||
|
import org.w3c.css.sac.PositionalCondition; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of the ConditionFactoryExt interface that maps calls back to a |
||||||
|
* native sac ConditionFactory. |
||||||
|
*/ |
||||||
|
public class ConditionFactoryAdapter implements ConditionFactoryExt { |
||||||
|
|
||||||
|
private final ConditionFactory conditionFactory_; |
||||||
|
|
||||||
|
public ConditionFactoryAdapter(final ConditionFactory selectorFactory) { |
||||||
|
conditionFactory_ = selectorFactory; |
||||||
|
} |
||||||
|
|
||||||
|
public CombinatorCondition createAndCondition(final Condition first, final Condition second) throws CSSException { |
||||||
|
return conditionFactory_.createAndCondition(first, second); |
||||||
|
} |
||||||
|
|
||||||
|
public CombinatorCondition createOrCondition(final Condition first, final Condition second) throws CSSException { |
||||||
|
return conditionFactory_.createOrCondition(first, second); |
||||||
|
} |
||||||
|
|
||||||
|
public NegativeCondition createNegativeCondition(final Condition condition) throws CSSException { |
||||||
|
return conditionFactory_.createNegativeCondition(condition); |
||||||
|
} |
||||||
|
|
||||||
|
public PositionalCondition createPositionalCondition(final int position, final boolean typeNode, final boolean type) |
||||||
|
throws CSSException { |
||||||
|
return conditionFactory_.createPositionalCondition(position, typeNode, type); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createAttributeCondition(final String localName, final String namespaceURI, |
||||||
|
final boolean specified, final String value) throws CSSException { |
||||||
|
return conditionFactory_.createAttributeCondition(localName, namespaceURI, specified, value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createIdCondition(final String value) throws CSSException { |
||||||
|
return conditionFactory_.createIdCondition(value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createIdCondition(final String value, final Locator locator) throws CSSException { |
||||||
|
return conditionFactory_.createIdCondition(value); |
||||||
|
} |
||||||
|
|
||||||
|
public LangCondition createLangCondition(final String lang) throws CSSException { |
||||||
|
return conditionFactory_.createLangCondition(lang); |
||||||
|
} |
||||||
|
|
||||||
|
public LangCondition createLangCondition(final String lang, final Locator locator) throws CSSException { |
||||||
|
return conditionFactory_.createLangCondition(lang); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createOneOfAttributeCondition(final String localName, final String namespaceURI, |
||||||
|
final boolean specified, final String value) throws CSSException { |
||||||
|
return conditionFactory_.createOneOfAttributeCondition(localName, namespaceURI, specified, value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createBeginHyphenAttributeCondition(final String localName, final String namespaceURI, |
||||||
|
final boolean specified, final String value) throws CSSException { |
||||||
|
return conditionFactory_.createBeginHyphenAttributeCondition(localName, namespaceURI, specified, value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createClassCondition(final String namespaceURI, final String value) throws CSSException { |
||||||
|
return conditionFactory_.createClassCondition(namespaceURI, value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createClassCondition(final String namespaceURI, final String value, final Locator locator) |
||||||
|
throws CSSException { |
||||||
|
return conditionFactory_.createClassCondition(namespaceURI, value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createPseudoClassCondition(final String namespaceURI, final String value) |
||||||
|
throws CSSException { |
||||||
|
return conditionFactory_.createPseudoClassCondition(namespaceURI, value); |
||||||
|
} |
||||||
|
|
||||||
|
public AttributeCondition createPseudoClassCondition(final String namespaceURI, final String value, |
||||||
|
final Locator locator, final boolean doubleColon) throws CSSException { |
||||||
|
return conditionFactory_.createPseudoClassCondition(namespaceURI, value); |
||||||
|
} |
||||||
|
|
||||||
|
public Condition createOnlyChildCondition() throws CSSException { |
||||||
|
return conditionFactory_.createOnlyChildCondition(); |
||||||
|
} |
||||||
|
|
||||||
|
public Condition createOnlyTypeCondition() throws CSSException { |
||||||
|
return conditionFactory_.createOnlyTypeCondition(); |
||||||
|
} |
||||||
|
|
||||||
|
public ContentCondition createContentCondition(final String data) throws CSSException { |
||||||
|
return conditionFactory_.createContentCondition(data); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.sac; |
||||||
|
|
||||||
|
import org.w3c.css.sac.AttributeCondition; |
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.ConditionFactory; |
||||||
|
import org.w3c.css.sac.LangCondition; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
|
||||||
|
/** |
||||||
|
* Extension of the ConditionFactory interface. |
||||||
|
* This was added to support the locator parameter to |
||||||
|
* inform about the code position. |
||||||
|
*/ |
||||||
|
public interface ConditionFactoryExt extends ConditionFactory { |
||||||
|
|
||||||
|
AttributeCondition createClassCondition(String namespaceURI, String value, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
AttributeCondition createIdCondition(String value, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
AttributeCondition createPseudoClassCondition(String namespaceURI, String value, |
||||||
|
Locator locator, boolean doubleColon) |
||||||
|
throws CSSException; |
||||||
|
|
||||||
|
LangCondition createLangCondition(String lang, Locator locator) throws CSSException; |
||||||
|
} |
@ -0,0 +1,169 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.sac; |
||||||
|
|
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.CSSParseException; |
||||||
|
import org.w3c.css.sac.DocumentHandler; |
||||||
|
import org.w3c.css.sac.ErrorHandler; |
||||||
|
import org.w3c.css.sac.InputSource; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of the DocumentHandlerExt interface that maps calls back to a |
||||||
|
* native sac DocumentHandler. |
||||||
|
*/ |
||||||
|
public class DocumentHandlerAdapter implements DocumentHandlerExt, ErrorHandler { |
||||||
|
|
||||||
|
private final DocumentHandler documentHanlder_; |
||||||
|
|
||||||
|
public DocumentHandlerAdapter(final DocumentHandler documentHanlder) { |
||||||
|
documentHanlder_ = documentHanlder; |
||||||
|
} |
||||||
|
|
||||||
|
public void startDocument(final InputSource source) throws CSSException { |
||||||
|
documentHanlder_.startDocument(source); |
||||||
|
} |
||||||
|
|
||||||
|
public void endDocument(final InputSource source) throws CSSException { |
||||||
|
documentHanlder_.endDocument(source); |
||||||
|
} |
||||||
|
|
||||||
|
public void comment(final String text) throws CSSException { |
||||||
|
documentHanlder_.comment(text); |
||||||
|
} |
||||||
|
|
||||||
|
public void ignorableAtRule(final String atRule) throws CSSException { |
||||||
|
documentHanlder_.ignorableAtRule(atRule); |
||||||
|
} |
||||||
|
|
||||||
|
public void ignorableAtRule(final String atRule, final Locator locator) throws CSSException { |
||||||
|
documentHanlder_.ignorableAtRule(atRule); |
||||||
|
} |
||||||
|
|
||||||
|
public void namespaceDeclaration(final String prefix, final String uri) throws CSSException { |
||||||
|
documentHanlder_.namespaceDeclaration(prefix, uri); |
||||||
|
} |
||||||
|
|
||||||
|
public void importStyle(final String uri, final SACMediaList media, |
||||||
|
final String defaultNamespaceURI) throws CSSException { |
||||||
|
documentHanlder_.importStyle(uri, media, defaultNamespaceURI); |
||||||
|
} |
||||||
|
|
||||||
|
public void importStyle(final String uri, final SACMediaList media, |
||||||
|
final String defaultNamespaceURI, final Locator locator) throws CSSException { |
||||||
|
documentHanlder_.importStyle(uri, media, defaultNamespaceURI); |
||||||
|
} |
||||||
|
|
||||||
|
public void startMedia(final SACMediaList media) throws CSSException { |
||||||
|
documentHanlder_.startMedia(media); |
||||||
|
} |
||||||
|
|
||||||
|
public void startMedia(final SACMediaList media, final Locator locator) throws CSSException { |
||||||
|
documentHanlder_.startMedia(media); |
||||||
|
} |
||||||
|
|
||||||
|
public void endMedia(final SACMediaList media) throws CSSException { |
||||||
|
documentHanlder_.endMedia(media); |
||||||
|
} |
||||||
|
|
||||||
|
public void startPage(final String name, final String pseudoPage) throws CSSException { |
||||||
|
documentHanlder_.startPage(name, pseudoPage); |
||||||
|
} |
||||||
|
|
||||||
|
public void startPage(final String name, final String pseudoPage, final Locator locator) throws CSSException { |
||||||
|
documentHanlder_.startPage(name, pseudoPage); |
||||||
|
} |
||||||
|
|
||||||
|
public void endPage(final String name, final String pseudoPage) throws CSSException { |
||||||
|
documentHanlder_.endPage(name, pseudoPage); |
||||||
|
} |
||||||
|
|
||||||
|
public void startFontFace() throws CSSException { |
||||||
|
documentHanlder_.startFontFace(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startFontFace(final Locator locator) throws CSSException { |
||||||
|
documentHanlder_.startFontFace(); |
||||||
|
} |
||||||
|
|
||||||
|
public void endFontFace() throws CSSException { |
||||||
|
documentHanlder_.endFontFace(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startSelector(final SelectorList selectors) throws CSSException { |
||||||
|
documentHanlder_.startSelector(selectors); |
||||||
|
} |
||||||
|
|
||||||
|
public void startSelector(final SelectorList selectors, final Locator locator) throws CSSException { |
||||||
|
documentHanlder_.startSelector(selectors); |
||||||
|
} |
||||||
|
|
||||||
|
public void endSelector(final SelectorList selectors) throws CSSException { |
||||||
|
documentHanlder_.endSelector(selectors); |
||||||
|
} |
||||||
|
|
||||||
|
public void property(final String name, final LexicalUnit value, final boolean important) throws CSSException { |
||||||
|
documentHanlder_.property(name, value, important); |
||||||
|
} |
||||||
|
|
||||||
|
public void property(final String name, final LexicalUnit value, final boolean important, final Locator locator) { |
||||||
|
documentHanlder_.property(name, value, important); |
||||||
|
} |
||||||
|
|
||||||
|
public void charset(final String characterEncoding, final Locator locator) throws CSSException { |
||||||
|
// empty default impl
|
||||||
|
} |
||||||
|
|
||||||
|
public void warning(final CSSParseException exception) throws CSSException { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(exception.getURI()) |
||||||
|
.append(" [") |
||||||
|
.append(exception.getLineNumber()) |
||||||
|
.append(":") |
||||||
|
.append(exception.getColumnNumber()) |
||||||
|
.append("] ") |
||||||
|
.append(exception.getMessage()); |
||||||
|
System.err.println(sb.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
public void error(final CSSParseException exception) throws CSSException { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(exception.getURI()) |
||||||
|
.append(" [") |
||||||
|
.append(exception.getLineNumber()) |
||||||
|
.append(":") |
||||||
|
.append(exception.getColumnNumber()) |
||||||
|
.append("] ") |
||||||
|
.append(exception.getMessage()); |
||||||
|
System.err.println(sb.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
public void fatalError(final CSSParseException exception) throws CSSException { |
||||||
|
final StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(exception.getURI()) |
||||||
|
.append(" [") |
||||||
|
.append(exception.getLineNumber()) |
||||||
|
.append(":") |
||||||
|
.append(exception.getColumnNumber()) |
||||||
|
.append("] ") |
||||||
|
.append(exception.getMessage()); |
||||||
|
System.err.println(sb.toString()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,128 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.sac; |
||||||
|
|
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.DocumentHandler; |
||||||
|
import org.w3c.css.sac.LexicalUnit; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.SACMediaList; |
||||||
|
import org.w3c.css.sac.SelectorList; |
||||||
|
|
||||||
|
/** |
||||||
|
* Extension of the DocumentHanlder interface. |
||||||
|
* This was added to support the locator parameter to |
||||||
|
* inform about the code position. |
||||||
|
*/ |
||||||
|
public interface DocumentHandlerExt extends DocumentHandler { |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of a charset at-rule. |
||||||
|
* |
||||||
|
* @param characterEncoding the character encoding |
||||||
|
* @param locator the SAC locator |
||||||
|
* @throws CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void charset(String characterEncoding, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of a import statement in the style sheet. |
||||||
|
* |
||||||
|
* @param uri The URI of the imported style sheet. |
||||||
|
* @param media The intended destination media for style information. |
||||||
|
* @param defaultNamespaceURI The default namespace URI for the imported |
||||||
|
* style sheet. |
||||||
|
* @param locator the SAC locator |
||||||
|
* @exception CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void importStyle(String uri, SACMediaList media, |
||||||
|
String defaultNamespaceURI, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of an unknown rule t-rule not supported by this |
||||||
|
* parser. |
||||||
|
* |
||||||
|
* @param atRule The complete ignored at-rule. |
||||||
|
* @param locator the SAC locator |
||||||
|
* @exception CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void ignorableAtRule(String atRule, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of the beginning of a font face statement. |
||||||
|
* |
||||||
|
* The Parser will invoke this method at the beginning of every font face |
||||||
|
* statement in the style sheet. there will be a corresponding endFontFace() |
||||||
|
* event for every startFontFace() event. |
||||||
|
* |
||||||
|
* @param locator the SAC locator |
||||||
|
* @exception CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void startFontFace(Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of the beginning of a page statement. |
||||||
|
* |
||||||
|
* The Parser will invoke this method at the beginning of every page |
||||||
|
* statement in the style sheet. there will be a corresponding endPage() |
||||||
|
* event for every startPage() event. |
||||||
|
* |
||||||
|
* @param name the name of the page (if any, null otherwise) |
||||||
|
* @param pseudoPage the pseudo page (if any, null otherwise) |
||||||
|
* @param locator the SAC locator |
||||||
|
* @exception CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void startPage(String name, String pseudoPage, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of the beginning of a media statement. |
||||||
|
* |
||||||
|
* The Parser will invoke this method at the beginning of every media |
||||||
|
* statement in the style sheet. there will be a corresponding endMedia() |
||||||
|
* event for every startElement() event. |
||||||
|
* |
||||||
|
* @param media The intended destination media for style information. |
||||||
|
* @param locator the SAC locator |
||||||
|
* @exception CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void startMedia(SACMediaList media, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of the beginning of a rule statement. |
||||||
|
* |
||||||
|
* @param selectors All intended selectors for all declarations. |
||||||
|
* @param locator the SAC locator |
||||||
|
* @exception CSSException Any CSS exception, possibly wrapping another |
||||||
|
* exception. |
||||||
|
*/ |
||||||
|
void startSelector(SelectorList selectors, Locator locator) throws CSSException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Receive notification of a declaration. |
||||||
|
* |
||||||
|
* @param name the name of the property. |
||||||
|
* @param value the value of the property. All whitespace are stripped. |
||||||
|
* @param important is this property important ? |
||||||
|
* @param locator the SAC locator |
||||||
|
*/ |
||||||
|
void property(String name, LexicalUnit value, boolean important, Locator locator); |
||||||
|
} |
@ -0,0 +1,124 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.sac; |
||||||
|
|
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.CharacterDataSelector; |
||||||
|
import org.w3c.css.sac.Condition; |
||||||
|
import org.w3c.css.sac.ConditionalSelector; |
||||||
|
import org.w3c.css.sac.DescendantSelector; |
||||||
|
import org.w3c.css.sac.ElementSelector; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.NegativeSelector; |
||||||
|
import org.w3c.css.sac.ProcessingInstructionSelector; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SelectorFactory; |
||||||
|
import org.w3c.css.sac.SiblingSelector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of the SelectorFactoryExt interface that maps calls back to a |
||||||
|
* native sac SelectorFactory. |
||||||
|
*/ |
||||||
|
public class SelectorFactoryAdapter implements SelectorFactoryExt { |
||||||
|
|
||||||
|
private final SelectorFactory selectorFactory_; |
||||||
|
|
||||||
|
public SelectorFactoryAdapter(final SelectorFactory selectorFactory) { |
||||||
|
selectorFactory_ = selectorFactory; |
||||||
|
} |
||||||
|
|
||||||
|
public ConditionalSelector createConditionalSelector(final SimpleSelector selector, final Condition condition) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createConditionalSelector(selector, condition); |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector createAnyNodeSelector() throws CSSException { |
||||||
|
return selectorFactory_.createAnyNodeSelector(); |
||||||
|
} |
||||||
|
|
||||||
|
public SimpleSelector createRootNodeSelector() throws CSSException { |
||||||
|
return selectorFactory_.createRootNodeSelector(); |
||||||
|
} |
||||||
|
|
||||||
|
public NegativeSelector createNegativeSelector(final SimpleSelector selector) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createNegativeSelector(selector); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createElementSelector(final String namespaceURI, final String tagName) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createElementSelector(namespaceURI, tagName); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelector createTextNodeSelector(final String data) throws CSSException { |
||||||
|
return selectorFactory_.createTextNodeSelector(data); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelector createCDataSectionSelector(final String data) throws CSSException { |
||||||
|
return selectorFactory_.createCDataSectionSelector(data); |
||||||
|
} |
||||||
|
|
||||||
|
public ProcessingInstructionSelector createProcessingInstructionSelector(final String target, final String data) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createProcessingInstructionSelector(target, data); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterDataSelector createCommentSelector(final String data) throws CSSException { |
||||||
|
return selectorFactory_.createCommentSelector(data); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createPseudoElementSelector(final String namespaceURI, final String pseudoName) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createPseudoElementSelector(namespaceURI, pseudoName); |
||||||
|
} |
||||||
|
|
||||||
|
public DescendantSelector createDescendantSelector(final Selector parent, final SimpleSelector descendant) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createDescendantSelector(parent, descendant); |
||||||
|
} |
||||||
|
|
||||||
|
public DescendantSelector createChildSelector(final Selector parent, final SimpleSelector child) |
||||||
|
throws CSSException { |
||||||
|
return selectorFactory_.createChildSelector(parent, child); |
||||||
|
} |
||||||
|
|
||||||
|
public SiblingSelector createDirectAdjacentSelector(final short nodeType, final Selector child, |
||||||
|
final SimpleSelector directAdjacent) throws CSSException { |
||||||
|
return selectorFactory_.createDirectAdjacentSelector(nodeType, child, directAdjacent); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createElementSelector(final String namespaceURI, final String tagName, |
||||||
|
final Locator locator) throws CSSException { |
||||||
|
return selectorFactory_.createElementSelector(namespaceURI, tagName); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createPseudoElementSelector(final String namespaceURI, final String pseudoName, |
||||||
|
final Locator locator, final boolean doubleColon) throws CSSException { |
||||||
|
return selectorFactory_.createPseudoElementSelector(namespaceURI, pseudoName); |
||||||
|
} |
||||||
|
|
||||||
|
public ElementSelector createSyntheticElementSelector() throws CSSException { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public SiblingSelector createGeneralAdjacentSelector( |
||||||
|
final short nodeType, |
||||||
|
final Selector child, |
||||||
|
final SimpleSelector directAdjacent) throws CSSException { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.sac; |
||||||
|
|
||||||
|
import org.w3c.css.sac.CSSException; |
||||||
|
import org.w3c.css.sac.ElementSelector; |
||||||
|
import org.w3c.css.sac.Locator; |
||||||
|
import org.w3c.css.sac.Selector; |
||||||
|
import org.w3c.css.sac.SelectorFactory; |
||||||
|
import org.w3c.css.sac.SiblingSelector; |
||||||
|
import org.w3c.css.sac.SimpleSelector; |
||||||
|
|
||||||
|
/** |
||||||
|
* Extension of the SelectorFactory interface. |
||||||
|
* This was added to support the locator parameter to |
||||||
|
* inform about the code position. |
||||||
|
*/ |
||||||
|
public interface SelectorFactoryExt extends SelectorFactory { |
||||||
|
|
||||||
|
ElementSelector createElementSelector(String namespaceURI, String tagName, Locator locator) |
||||||
|
throws CSSException; |
||||||
|
|
||||||
|
ElementSelector createPseudoElementSelector(String namespaceURI, String pseudoName, |
||||||
|
Locator locator, boolean doubleColon) |
||||||
|
throws CSSException; |
||||||
|
|
||||||
|
ElementSelector createSyntheticElementSelector() throws CSSException; |
||||||
|
|
||||||
|
SiblingSelector createGeneralAdjacentSelector(short nodeType, Selector child, SimpleSelector directAdjacent) |
||||||
|
throws CSSException; |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.userdata; |
||||||
|
|
||||||
|
public final class UserDataConstants { |
||||||
|
|
||||||
|
private static final String KEY_PREFIX = UserDataConstants.class.getPackage().getName(); |
||||||
|
public static final String KEY_LOCATOR = KEY_PREFIX + ".locator"; |
||||||
|
|
||||||
|
private UserDataConstants() { |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.util; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public final class LangUtils { |
||||||
|
public static final int HASH_SEED = 17; |
||||||
|
public static final int HASH_OFFSET = 37; |
||||||
|
|
||||||
|
private LangUtils() { |
||||||
|
} |
||||||
|
|
||||||
|
public static int hashCode(final int seed, final int hashcode) { |
||||||
|
return seed * HASH_OFFSET + hashcode; |
||||||
|
} |
||||||
|
|
||||||
|
public static int hashCode(final int seed, final boolean b) { |
||||||
|
return hashCode(seed, b ? 1 : 0); |
||||||
|
} |
||||||
|
|
||||||
|
public static int hashCode(final int seed, final Object obj) { |
||||||
|
return hashCode(seed, obj != null ? obj.hashCode() : 0); |
||||||
|
} |
||||||
|
|
||||||
|
public static String join(final List<String> values, String separator) { |
||||||
|
if (values == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
if (separator == null) { |
||||||
|
separator = ""; |
||||||
|
} |
||||||
|
|
||||||
|
boolean isFirst = true; |
||||||
|
final StringBuilder result = new StringBuilder(); |
||||||
|
for (String part : values) { |
||||||
|
if (part != null && part.length() > 0) { |
||||||
|
if (isFirst) { |
||||||
|
isFirst = false; |
||||||
|
} |
||||||
|
else { |
||||||
|
result.append(separator); |
||||||
|
} |
||||||
|
result.append(part); |
||||||
|
} |
||||||
|
} |
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean equals(final Object obj1, final Object obj2) { |
||||||
|
return obj1 == null ? obj2 == null : obj1.equals(obj2); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,145 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.util; |
||||||
|
|
||||||
|
import java.io.BufferedWriter; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.Writer; |
||||||
|
|
||||||
|
/** |
||||||
|
* A simple helper to write formated to a writer. |
||||||
|
* |
||||||
|
* @author rbri |
||||||
|
*/ |
||||||
|
public final class Output { |
||||||
|
private static final String NEW_LINE = System.getProperty("line.separator"); |
||||||
|
|
||||||
|
private Writer writer_; |
||||||
|
private StringBuffer currentIndent_; |
||||||
|
private boolean afterNewLine_; |
||||||
|
private final String indent_; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* |
||||||
|
* @param aWriter the writer to write to |
||||||
|
* @param anIndent String to be used for indenting (e.g. "", " ", " ", "\t") |
||||||
|
*/ |
||||||
|
public Output(final Writer aWriter, final String anIndent) { |
||||||
|
writer_ = new BufferedWriter(aWriter); |
||||||
|
indent_ = anIndent; |
||||||
|
currentIndent_ = new StringBuffer(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the char. |
||||||
|
* |
||||||
|
* @param aChar the char to be written |
||||||
|
* @return this (for convenience) |
||||||
|
* @throws IOException in case of problems |
||||||
|
*/ |
||||||
|
public Output print(final char aChar) throws IOException { |
||||||
|
writeIndentIfNeeded(); |
||||||
|
writer_.write(aChar); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the String. |
||||||
|
* |
||||||
|
* @param aString the string to be written |
||||||
|
* @return this (for convenience) |
||||||
|
* @throws IOException in case of problems |
||||||
|
*/ |
||||||
|
public Output print(final String aString) throws IOException { |
||||||
|
if (null != aString) { |
||||||
|
writeIndentIfNeeded(); |
||||||
|
writer_.write(aString); |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the string on a new line. |
||||||
|
* |
||||||
|
* @param aString the string to be written |
||||||
|
* @return this (for convenience) |
||||||
|
* @throws IOException in case of problems |
||||||
|
*/ |
||||||
|
public Output println(final String aString) throws IOException { |
||||||
|
writeIndentIfNeeded(); |
||||||
|
writer_.write(aString); |
||||||
|
writer_.write(NEW_LINE); |
||||||
|
afterNewLine_ = true; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Start a newline. |
||||||
|
* |
||||||
|
* @return this (for convenience) |
||||||
|
* @throws IOException in case of problems |
||||||
|
*/ |
||||||
|
public Output println() throws IOException { |
||||||
|
writer_.write(NEW_LINE); |
||||||
|
afterNewLine_ = true; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Flushes the output. |
||||||
|
* |
||||||
|
* @return this (for convenience) |
||||||
|
* @throws IOException in case of error |
||||||
|
*/ |
||||||
|
public Output flush() throws IOException { |
||||||
|
writer_.flush(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Indent the following. |
||||||
|
* |
||||||
|
* @return this (for convenience) |
||||||
|
*/ |
||||||
|
public Output indent() { |
||||||
|
currentIndent_.append(indent_); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Clear the indent. |
||||||
|
* |
||||||
|
* @return this (for convenience) |
||||||
|
*/ |
||||||
|
public Output unindent() { |
||||||
|
currentIndent_.setLength(Math.max(0, currentIndent_.length() - indent_.length())); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper to write a newline. |
||||||
|
* |
||||||
|
* @throws IOException |
||||||
|
* in case of problems |
||||||
|
*/ |
||||||
|
private void writeIndentIfNeeded() throws IOException { |
||||||
|
if (afterNewLine_) { |
||||||
|
writer_.write(currentIndent_.toString()); |
||||||
|
afterNewLine_ = false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 1999-2018 David Schweinsberg. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.fr.third.steadystate.css.util; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import org.w3c.css.sac.CSSParseException; |
||||||
|
import org.w3c.css.sac.ErrorHandler; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper implementation of {@link ErrorHandler}, which throws CssException in case of problems. |
||||||
|
* |
||||||
|
* @author rbri |
||||||
|
* @see ErrorHandler |
||||||
|
*/ |
||||||
|
public class ThrowCssExceptionErrorHandler implements ErrorHandler, Serializable { |
||||||
|
private static final long serialVersionUID = -3933638774901855095L; |
||||||
|
|
||||||
|
/** |
||||||
|
* Singleton. |
||||||
|
*/ |
||||||
|
public static final ThrowCssExceptionErrorHandler INSTANCE = new ThrowCssExceptionErrorHandler(); |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public void error(final CSSParseException exception) { |
||||||
|
throw exception; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public void fatalError(final CSSParseException exception) { |
||||||
|
throw exception; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public void warning(final CSSParseException exception) { |
||||||
|
// ignore warnings
|
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue