protected void convertShorthandRadiusProperties(CSSDeclaration cssDeclaration) {

    CSSExpression cssExpression = cssDeclaration.getExpression();

    List<CSSExpressionMemberTermSimple> cssExpressionMemberTermSimples =
        cssExpression.getAllSimpleMembers();

    if (cssExpressionMemberTermSimples.size() == 4) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple1 =
          cssExpressionMemberTermSimples.get(0);

      String value = cssExpressionMemberTermSimple1.getValue();

      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple2 =
          cssExpressionMemberTermSimples.get(1);

      cssExpressionMemberTermSimple1.setValue(cssExpressionMemberTermSimple2.getValue());

      cssExpressionMemberTermSimple2.setValue(value);

      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple3 =
          cssExpressionMemberTermSimples.get(2);

      value = cssExpressionMemberTermSimple3.getValue();

      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple4 =
          cssExpressionMemberTermSimples.get(3);

      cssExpressionMemberTermSimple3.setValue(cssExpressionMemberTermSimple4.getValue());

      cssExpressionMemberTermSimple4.setValue(value);
    } else if (cssExpressionMemberTermSimples.size() == 3) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple1 =
          cssExpressionMemberTermSimples.get(0);

      String value = cssExpressionMemberTermSimple1.getValue();

      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple2 =
          cssExpressionMemberTermSimples.get(1);

      cssExpressionMemberTermSimple1.setValue(cssExpressionMemberTermSimple2.getValue());

      cssExpressionMemberTermSimple2.setValue(value);

      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple3 =
          cssExpressionMemberTermSimples.get(2);

      value = cssExpressionMemberTermSimple3.getValue();

      cssExpressionMemberTermSimple3.setValue(cssExpressionMemberTermSimple1.getValue());

      cssExpression.addTermSimple(value);
    }
  }
  protected void resizeYui3BackgroundPosition(
      CSSStyleRule cssStyleRule, CSSDeclaration cssDeclaration) {

    String selector = cssStyleRule.getSelectorsAsCSSString(_cssWriterSettings, 0);

    String property = cssDeclaration.getProperty();

    Matcher matcher = _yui3ResizeHandleInnerPattern.matcher(selector);

    if (!property.equals("background-position")) {
      return;
    }

    if (!matcher.find()) {
      return;
    }

    CSSExpression cssExpression = cssDeclaration.getExpression();

    List<CSSExpressionMemberTermSimple> cssExpressionMemberTermSimples =
        cssExpression.getAllSimpleMembers();

    if (selector.endsWith("bl")) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple1 =
          cssExpressionMemberTermSimples.get(0);

      cssExpressionMemberTermSimple1.setValue("-30px");
    } else if (selector.endsWith("br")) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple1 =
          cssExpressionMemberTermSimples.get(0);

      cssExpressionMemberTermSimple1.setValue("-75px");
    } else if (selector.endsWith("tl")) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple1 =
          cssExpressionMemberTermSimples.get(0);

      cssExpressionMemberTermSimple1.setValue("-58px");
    } else if (selector.endsWith("tr")) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple1 =
          cssExpressionMemberTermSimples.get(0);

      cssExpressionMemberTermSimple1.setValue("-47px");
    }

    CSSExpressionMemberTermSimple cssExpressionMemberTermSimple2 =
        cssExpressionMemberTermSimples.get(1);

    cssExpressionMemberTermSimple2.setValue("0");
  }
  protected void replace(CSSDeclaration cssDeclaration, Map<String, String> replacementValues) {

    CSSExpression cssExpression = cssDeclaration.getExpression();

    List<CSSExpressionMemberTermSimple> cssExpressionMemberTermSimples =
        cssExpression.getAllSimpleMembers();

    for (CSSExpressionMemberTermSimple cssExpressionMemberTermSimple :
        cssExpressionMemberTermSimples) {

      String replacementValue = replacementValues.get(cssExpressionMemberTermSimple.getValue());

      if (replacementValue != null) {
        cssExpressionMemberTermSimple.setValue(replacementValue);
      }
    }
  }
  protected void resizeYui3Offset(CSSStyleRule cssStyleRule, CSSDeclaration cssDeclaration) {

    String selector = cssStyleRule.getSelectorsAsCSSString(_cssWriterSettings, 0);

    Matcher matcher = _yui3ResizeHandleInnerPattern.matcher(selector);

    if (!matcher.find()) {
      return;
    }

    CSSExpression cssExpression = cssDeclaration.getExpression();

    List<CSSExpressionMemberTermSimple> cssExpressionMemberTermSimples =
        cssExpression.getAllSimpleMembers();

    for (CSSExpressionMemberTermSimple cssExpressionMemberTermSimple :
        cssExpressionMemberTermSimples) {

      cssExpressionMemberTermSimple.setValue("2px");
    }
  }
 @Nonnull
 private CSSExpression _createExpression(@Nonnull final CSSNode aNode) {
   _expectNodeType(aNode, ECSSNodeType.EXPR);
   final CSSExpression ret = new CSSExpression();
   ret.setSourceLocation(aNode.getSourceLocation());
   for (final CSSNode aChildNode : aNode) {
     if (ECSSNodeType.EXPRTERM.isNode(aChildNode, m_eVersion))
       ret.addMember(_createExpressionTerm(aChildNode));
     else if (ECSSNodeType.EXPROPERATOR.isNode(aChildNode, m_eVersion)) {
       final String sText = aChildNode.getText();
       final ECSSExpressionOperator eOp = ECSSExpressionOperator.getFromNameOrNull(sText);
       if (eOp == null) s_aLogger.error("Failed to parse expression operator '" + sText + "'");
       else ret.addMember(eOp);
     } else {
       s_aLogger.error(
           "Unsupported child of "
               + ECSSNodeType.getNodeName(aNode, m_eVersion)
               + ": "
               + ECSSNodeType.getNodeName(aChildNode, m_eVersion));
     }
   }
   return ret;
 }
  protected void reverseValue(CSSExpression cssExpression) {
    List<CSSExpressionMemberTermSimple> cssExpressionMemberTermSimples =
        cssExpression.getAllSimpleMembers();

    for (CSSExpressionMemberTermSimple cssExpressionMemberTermSimple :
        cssExpressionMemberTermSimples) {

      String value = cssExpressionMemberTermSimple.getValue();

      value = reverse(value);

      if (value.contains("rtl")) {
        value = value.replace("rtl", "ltr");
      } else if (value.contains("ltr")) {
        value = value.replace("ltr", "rtl");
      }

      cssExpressionMemberTermSimple.setValue(value);
    }
  }
  protected void convertBackgroundProperties(CSSDeclaration cssDeclaration) {
    CSSExpression cssExpression = cssDeclaration.getExpression();

    List<ICSSExpressionMember> icssExpressionMembers = cssExpression.getAllMembers();

    for (ICSSExpressionMember icssExpressionMember : icssExpressionMembers) {

      if (icssExpressionMember instanceof CSSExpressionMemberFunction) {
        CSSExpressionMemberFunction cssExpressionMemberFunction =
            (CSSExpressionMemberFunction) icssExpressionMember;

        reverseValue(cssExpressionMemberFunction.getExpression());
      } else if (icssExpressionMember instanceof CSSExpressionMemberTermSimple) {

        CSSExpressionMemberTermSimple cssExpressionMemberTermSimple =
            (CSSExpressionMemberTermSimple) icssExpressionMember;

        cssExpressionMemberTermSimple.setValue(reverse(cssExpressionMemberTermSimple.getValue()));
      } else if (icssExpressionMember instanceof CSSExpressionMemberTermURI) {

        CSSExpressionMemberTermURI cssExpressionMemberTermURI =
            (CSSExpressionMemberTermURI) icssExpressionMember;

        String uri = cssExpressionMemberTermURI.getURIString();

        int index = uri.lastIndexOf("/") + 1;

        String fileName = reverse(uri.substring(index));

        cssExpressionMemberTermURI.setURIString(uri.substring(0, index) + fileName);
      }
    }

    List<CSSExpressionMemberTermSimple> cssExpressionMemberTermSimples =
        cssExpression.getAllSimpleMembers();

    if (cssExpressionMemberTermSimples.size() == 1) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple =
          cssExpressionMemberTermSimples.get(0);

      String value = cssExpressionMemberTermSimple.getValue();

      Matcher matcher = _percentOrLengthPattern.matcher(value);

      if (matcher.matches()) {
        cssExpression.addTermSimple(value);

        cssExpressionMemberTermSimple.setValue("right");
      }
    } else if (cssExpressionMemberTermSimples.size() == 2) {
      CSSExpressionMemberTermSimple cssExpressionMemberTermSimple =
          cssExpressionMemberTermSimples.get(0);

      String value = cssExpressionMemberTermSimple.getValue();

      Matcher matcher = _percentPattern.matcher(value);

      if (matcher.matches()) {
        int delta = Integer.valueOf(value.replaceAll("[^\\d]", ""), 10);

        value = (100 - delta) + "%";

        cssExpressionMemberTermSimple.setValue(value);
      }
    }
  }