com.hfg.css.CssUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com_hfg Show documentation
Show all versions of com_hfg Show documentation
com.hfg xml, html, svg, and bioinformatics utility library
package com.hfg.css;
import java.awt.Color;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import com.hfg.graphics.ColorUtil;
import com.hfg.util.StringBuilderPlus;
import com.hfg.util.StringUtil;
import com.hfg.xml.XMLTag;
//------------------------------------------------------------------------------
/**
* Contains CSS-related utility functions.
*
* @author J. Alex Taylor, hairyfatguy.com
*/
//------------------------------------------------------------------------------
// com.hfg XML/HTML Coding Library
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com
// [email protected]
//------------------------------------------------------------------------------
public class CssUtil
{
//###########################################################################
// PUBLIC FUNCTIONS
//###########################################################################
//--------------------------------------------------------------------------
public static String colorToCssValue(Color inValue)
{
String value = "";
if (inValue != null)
{
if (255 == inValue.getAlpha())
{
// No opacity
value = "#" + ColorUtil.colorToHex(inValue);
}
else
{
// Use rgba() format to specify the opacity
value = "rgba(" + inValue.getRed() + ", " + inValue.getGreen() + ", " + inValue.getBlue()
+ ", " + String.format("%.1f", inValue.getAlpha()/255f)+ ")";
}
}
return value;
}
//--------------------------------------------------------------------------
/**
Adds the specified style attribute content to the specified tag.
@param inTag extends XMLTag instead of HTMLTag so that the SVG classes can use it as well.
@param inValue style value to add
*/
public static void addStyle(XMLTag inTag, String inValue)
{
if (StringUtil.isSet(inValue))
{
String oldValue = inTag.getAttributeValue(CSS.STYLE);
if (StringUtil.isSet(oldValue))
{
String[] attrPairs = inValue.trim().split(";");
Map styleAttrMap = new HashMap<>(attrPairs.length);
for (String pair : attrPairs)
{
String[] pieces = pair.split(":");
styleAttrMap.put(pieces[0].trim(), pieces[1].trim());
}
StringBuilderPlus buffer = new StringBuilderPlus(oldValue.trim()).setDelimiter(";");
for (String attrName : styleAttrMap.keySet())
{
boolean newAttr = true;
if (buffer.indexOf(attrName) >= 0)
{
// The specified attribute may already be present. Check more carefully
Pattern pattern = Pattern.compile("(?:^|;|\\s)" + attrName + "\\s*:\\s*(.+?)(?:;|$)");
Matcher m = pattern.matcher(buffer.toString());
if (m.find())
{
if (styleAttrMap.get(attrName).contains("!important")
|| ! m.group(1).contains("!important"))
{
buffer.replace(m.start(1), m.end(1), styleAttrMap.get(attrName));
}
newAttr = false;
}
}
if (newAttr)
{
// Add the new style attribute
if (buffer.charAt(buffer.length() -1) == ';')
{
buffer.append(' ');
buffer.append(attrName);
}
else
{
buffer.delimitedAppend(attrName);
}
buffer.append(":");
buffer.append(styleAttrMap.get(attrName));
}
}
inValue = buffer.toString();
}
inTag.setAttribute(CSS.STYLE, inValue);
}
}
//--------------------------------------------------------------------------
/**
Removes the specified CSS property from the style attribute content of the specified tag if it is present.
@param inTag extends XMLTag instead of HTMLTag so that the SVG classes can use it as well.
@param inProperty CSS property to remove
*/
public static void removeStyleProperty(XMLTag inTag, CSSProperty inProperty)
{
if (inProperty != null)
{
String oldValue = inTag.getAttributeValue(CSS.STYLE);
if (StringUtil.isSet(oldValue))
{
List declarations = CSSDeclaration.parse(oldValue);
boolean containsProperty = false;
for (int i = 0; i < declarations.size(); i++)
{
CSSDeclaration declaration = declarations.get(i);
if (declaration.getProperty().equals(inProperty))
{
containsProperty = true;
declarations.remove(i);
break;
}
}
// It the property wasn't present there is nothing to do
if (containsProperty)
{
inTag.setAttribute(CSS.STYLE, StringUtil.join(declarations, ";"));
}
}
}
}
}