コード例 #1
0
function _isMatchingMediaQuery (rule, matchConfig) {
  if (rule.type !== 'media') {
    // ignore (keep) all non media query rules
    return true
  }

  try {
    var mediaAST = cssMediaQuery.parse(rule.media)
  } catch (e) {
    // cant parse, most likely browser cant either
    return false
  }
  var keep = mediaAST.some(function (mq) {
    if (mq.type === 'print') {
      return false
    }
    return mq.expressions.some(function (expression, index) {
      if (expression.modifier === 'min') {
        return cssMediaQuery.match('(min-' + expression.feature + ':' + expression.value + ')', matchConfig)
      } else {
        return true
      }
    })
  })
  return keep
}
function _isMatchingMediaQuery(rule, matchConfig) {
  if (rule.type !== 'media') {
    // ignore (keep) all non media query rules
    return true;
  }

  var mediaAST;
  try {
    mediaAST = cssMediaQuery.parse(rule.media);
  } catch (e) {
    // cant parse, most likely browser cant either
    return false;
  }
  var keep = mediaAST.some(function (mq) {
    if (mq.type === 'print') {
      return false;
    }
    // f.e. @media all {}
    // go for false positives over false negatives,
    // i.e. accept @media randomThing {}
    if (mq.expressions.length === 0) {
      return true;
    }
    return mq.expressions.some(function (expression) {
      if (expression.modifier === 'min') {
        return cssMediaQuery.match('(min-' + expression.feature + ':' + expression.value + ')', matchConfig);
      } else {
        return true;
      }
    });
  });
  return keep;
}
コード例 #3
0
ファイル: start.js プロジェクト: Tinja/pure-site
function normalizeMediaQuery(mq, options) {
    mq = mq.trim();
    var expand = options && options.expand;

    if (expand) {
        mq = 'screen and (min-width: ' + mq + ')';
    }

    try {
        mediaQuery.parse(mq);
        return mq;
    } catch (e) {
        // When we've already expanded the short-hand MQ syntax, or when the
        // short-hand form doesn't look like a length value, re-throw the error.
        if (expand || !/^(\d|\.)/.test(mq)) {
            throw e;
        }
    }

    // Try again, this time expanding the `mq` assuming it's in the short-hand.
    return normalizeMediaQuery(mq, {expand: true});
}
コード例 #4
0
ファイル: index.js プロジェクト: YangShaoQun/taro
const transform = (css, options) => {
  const { stylesheet } = parseCSS(css);
  const rules = sortRules(stylesheet.rules);

  const result = {};

  for (const r in rules) {
    const rule = rules[r];
    for (const s in rule.selectors) {
      if (rule.selectors[s] === ":export") {
        if (!result.__exportProps) {
          result.__exportProps = {};
        }

        rule.declarations.forEach(({ property, value }) => {
          const isAlreadyDefinedAsClass =
            result[property] !== undefined &&
            result.__exportProps[property] === undefined;

          if (isAlreadyDefinedAsClass) {
            throw new Error(
              `Failed to parse :export block because a CSS class in the same file is already using the name "${property}"`,
            );
          }

          result.__exportProps[property] = value;
        });
        continue;
      }

      if (
        rule.selectors[s].indexOf(".") !== 0 ||
        rule.selectors[s].indexOf(":") !== -1 ||
        rule.selectors[s].indexOf("[") !== -1 ||
        rule.selectors[s].indexOf("~") !== -1 ||
        rule.selectors[s].indexOf(">") !== -1 ||
        rule.selectors[s].indexOf("+") !== -1 ||
        rule.selectors[s].indexOf(" ") !== -1
      ) {
        continue;
      }

      const selector = rule.selectors[s].replace(/^\./, "");
      const styles = (result[selector] = result[selector] || {});
      transformDecls(styles, rule.declarations, result);
    }

    if (
      rule.type == "media" &&
      options != null &&
      options.parseMediaQueries === true
    ) {
      const parsed = mediaQuery.parse(rule.media);

      parsed.forEach(mq => {
        if (mediaQueryTypes.indexOf(mq.type) === -1) {
          throw new Error(`Failed to parse media query type "${mq.type}"`);
        }

        mq.expressions.forEach(e => {
          const mf = e.modifier ? `${e.modifier}-${e.feature}` : e.feature;
          const val = e.value ? `: ${e.value}` : "";

          if (mediaQueryFeatures.indexOf(e.feature) === -1) {
            throw new Error(`Failed to parse media query feature "${mf}"`);
          }

          if (
            dimensionFeatures.indexOf(e.feature) > -1 &&
            lengthRe.test(e.value) === false
          ) {
            throw new Error(
              `Failed to parse media query expression "(${mf}${val})"`,
            );
          }
        });
      });

      const media = "@media " + rule.media;

      result.__mediaQueries = result.__mediaQueries || {};
      result.__mediaQueries[media] = parsed;

      for (const r in rule.rules) {
        const ruleRule = rule.rules[r];
        for (const s in ruleRule.selectors) {
          result[media] = result[media] || {};
          const selector = ruleRule.selectors[s].replace(/^\./, "");
          const mediaStyles = (result[media][selector] =
            result[media][selector] || {});
          transformDecls(mediaStyles, ruleRule.declarations, result);
        }
      }
    }
  }

  if (result.__exportProps) {
    Object.assign(result, result.__exportProps);
    delete result.__exportProps;
  }

  return result;
};