var path = require('path') var styler = require('weex-styler') var { normalizePath } = require('@dcloudio/uni-cli-shared') module.exports = function (content, map) { this.cacheable && this.cacheable() this.callback(null, 'module.exports = ' + genStyleString(content, this), map) } const uniI18n = require('@dcloudio/uni-cli-i18n') // @todo: // font-relative lengths: em, ex, ch, ic // viewport-relative lengths: vi, vb // https://drafts.csswg.org/css-values/#lengths var REGEXP_LENGTH = /^([-+]?[0-9]*\.?[0-9]+)(rem|vw|vh|vmin|vmax|cm|mm|q|in|pt|pc|px)$/ function convertLength (k, v) { if (typeof v !== 'string') { return v } var result = v.match(REGEXP_LENGTH) if (result) { if (result[2] === 'px') { return result[1] } return result[1] + 'CSS_UNIT_' + result[2].toUpperCase() } return v } let isFirst = true function genStyleString (input, loader) { var output = '{}' var resourcePath = normalizePath(path.relative(process.env.UNI_INPUT_DIR, loader.resourcePath)) styler.parse(input, function (err, obj) { if (err) { loader.emitError(err) return } if (obj && obj.jsonStyle) { if (obj.log) { var msgs = [] obj.log.map((log) => { if (log.reason.indexOf('NOTE:') !== 0) { // 仅显示警告,错误信息 if (log.selectors) { msgs.push(`${log.selectors}: ${log.reason} at ${resourcePath}:${log.line}`) } else { msgs.push(`${log.reason} at ${resourcePath}:${log.line}`) } } }) if (msgs.length) { if (isFirst) { msgs.unshift(uniI18n.__('pluginHbuilderx.nvueCssWarning')) isFirst = false } msgs.forEach(msg => { switch (msg.split(':')[0]) { case 'ERROR': console.error(msg) break case 'WARNING' : console.warn(msg) break default: console.log(msg) break } }) } } try { output = JSON.stringify(obj.jsonStyle, convertLength, 2) .replace(/"([-+]?[0-9]*\.?[0-9]+)CSS_UNIT_([A-Z]+)"/g, '$1 * CSS_UNIT.$2') } catch (e) {} } }) return output }