From 8405f67a5780f1f1be2c3455b6763957faf0a89b Mon Sep 17 00:00:00 2001 From: houhaoyu Date: Tue, 21 Dec 2021 20:48:23 +0800 Subject: [PATCH] houhaoyu@huawei.com update code from wagner Signed-off-by: houhaoyu Change-Id: Ic6c086bfdd8321a1cf42b6af76a8d92ceabd71a6 --- deps/weex-styler/index.js | 3 +- deps/weex-styler/lib/validator.js | 140 +++++++++++++++++++++++------- src/loader.js | 19 ++-- src/script.js | 4 +- src/util.js | 61 +++++++++++-- 5 files changed, 179 insertions(+), 48 deletions(-) diff --git a/deps/weex-styler/index.js b/deps/weex-styler/index.js index 080b3b9..4078b27 100644 --- a/deps/weex-styler/index.js +++ b/deps/weex-styler/index.js @@ -12,6 +12,7 @@ var IMPORT_MATCHER = /(['"]([^()]+?)['"])|(['"]([^()]+?)['"]\s+(only|not)?\s?(sc var LENGTH_REGEXP = /^[-+]?\d*\.?\d+(\S*)$/ const CARD_SELECTOR = /^[\.#][A-Za-z0-9_\-]+$/ const card = process.env.DEVICE_LEVEL === 'card' +var ALL_SELECTOR_MATCHER = /^\*$/ /** * expand margin、padding、border、borderWidth、borderColor、borderStyle properties、animation @@ -254,7 +255,7 @@ function parse(code, done, resourcePath) { } else { rule.selectors.forEach(function (selector) { const flag = card ? selector.match(CARD_SELECTOR) : - selector.match(SELECTOR_MATCHER) || selector.match(DESCENDANT_SELECTOR_MATCHER) + selector.match(SELECTOR_MATCHER) || selector.match(DESCENDANT_SELECTOR_MATCHER) || selector.match(ALL_SELECTOR_MATCHER) if (flag) { var className = selector diff --git a/deps/weex-styler/lib/validator.js b/deps/weex-styler/lib/validator.js index 52782e3..cd8f445 100644 --- a/deps/weex-styler/lib/validator.js +++ b/deps/weex-styler/lib/validator.js @@ -194,6 +194,7 @@ var URL_REGEXP = /^url\(\s*['"]?\s*([^()]+?)\s*['"]?\s*\)$/ var NAME_REGEXP = /^[a-zA-Z_]+[a-zA-Z0-9-]*$/ var INT_REGEXP = /^[-+]?[0-9]+$/ var ID_REGEXP = /^\"@id\d+\"$/ +var AUTO_REGEXP = /^auto$/ var DATE_REGEXP = /(^([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((1[02]|0?[13578])-([12][0-9]|3[01]|0?[1-9]))|((11|0?[469])-(30|[12][0-9]|0?[1-9]))|(0?2-(1[0-9]|2[0-8]|0?[1-9])))$)|(^(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[13579][26])00))-(0?)2-29$)/ var TRANSFORM_REGEXP = /[0-9a-zA-Z]+\s*\(\s*[0-9(a-zA-Z-|%)\.]+\s*(,\s*[0-9(a-zA-Z-|%)\.]+)*\)/g var TRANSFORM_ITEM_REGEXP = /^([0-9a-zA-Z]+)\s*\((.*)\)$/ @@ -213,6 +214,29 @@ var ANYTHING_VALIDATOR = function ANYTHING_VALIDATOR(v) { return { value: v } } +/** + * the values below is valid + * - auto + * - number + * - number + 'px'|'%'|'vp'| 'fp' + * + * @param {string} v + * @return {function} a function to return + * - value: number|null + * - reason(k, v, result) + */ +var AUTO_PERCENTAGE_LENGTH_VALIDATOR = function AUTO_PERCENTAGE_LENGTH_VALIDATOR(v) { + v = (v || '').toString().trim() + if (v.match(AUTO_REGEXP)) { + return { value: v } + } + if (v.match(ID_REGEXP)) { + return { value: v } + } else { + return LENGTH(v, SUPPORT_CSS_PERCENTAGE_UNIT) + } +} + /** * the values below is valid * - number @@ -351,6 +375,12 @@ var SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR = function SHORTHAND_PERCENTAGE_LENGTH return SHORTHAND_VALIDATOR(v, rule) } +var SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR = function SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR(v) { + v = (v || '').toString().trim() + let rule = AUTO_PERCENTAGE_LENGTH_VALIDATOR + return SHORTHAND_VALIDATOR(v, rule) +} + var SHORTHAND_LENGTH_VALIDATOR = function SHORTHAND_LENGTH_VALIDATOR(v) { v = (v || '').toString().trim() let rule = LENGTH_VALIDATOR @@ -2004,15 +2034,40 @@ var BORDER_IMAGE_URL_VALIDATOR = function BORDER_IMAGE_URL_VALIDATOR(v) { }; let value = { url: "", - slice: [], - width: [], - outset: [], repeat: "" }; - var URL_REGEXP = /^url\(\s*['"]?\s*([^()]+?)\s*['"]?\s*\)(.*)(stretch|round|repeat)$/; - let result = URL_REGEXP.exec(v); + var URL_REGEXP_FIRST = /^url\(\s*['"]?\s*([^()]+?)\s*['"]?\s*\)(.*)/; + var regexp_first = /(stretch|round|repeat|space)$/; + var URL_REGEXP_SECOND = /^(.*)(stretch|round|repeat|space)$/; + let result; + result = URL_REGEXP_FIRST.exec(v); + if (regexp_first.test(result[2])) { + let res = URL_REGEXP_SECOND.exec(result[2]); + value = BORDER_IMAGE_NOL(res[1]); + value.repeat = res[2]; + } else { + var reg = /px|%/; + if (reg.test(result[2])) { + value = BORDER_IMAGE_NOL(result[2]); + } + } value.url = result[1]; - let num = result[2].split(/\//); + base.values.push(value); + return { + value: JSON.stringify(base) + }; +} + +var BORDER_IMAGE_NOL = function BORDER_IMAGE_NOL(v) { + let value = { + url: "", + repeat: "" + }; + var reg = /px|%/; + if (!reg.test(v)) { + return value; + } + let num = v.split(/\//); switch (num.length) { case 1: value.slice = BORDER_IMAGE_SPLIT(num[0]); @@ -2027,15 +2082,11 @@ var BORDER_IMAGE_URL_VALIDATOR = function BORDER_IMAGE_URL_VALIDATOR(v) { value.outset = BORDER_IMAGE_SPLIT(num[2]); break; } - value.repeat = result[3]; - base.values.push(value); - return { - value: JSON.stringify(base) - }; + return value; } var BORDER_IMAGE_SPLIT = function BORDER_IMAGE_SPLIT(v) { - const NUM_REGEXP = SHORTHAND_LENGTH_VALIDATOR(v); + const NUM_REGEXP = SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR(v); let result = []; const value = NUM_REGEXP.value.split(/\s/); value.forEach(element => { @@ -2046,7 +2097,7 @@ var BORDER_IMAGE_SPLIT = function BORDER_IMAGE_SPLIT(v) { var BORDER_IMAGE_GRADIENT_VALIDATOR = function BORDER_IMAGE_GRADIENT_VALIDATOR(v) { v = (v || "").toString().trim() - var BORDER_IMAGE_GRADIENT_ITEM_REGEXP = /^([0-9a-zA-Z-]+)\((.*)\)\s(.*)/; + var BORDER_IMAGE_GRADIENT_ITEM_REGEXP = /^([0-9a-zA-Z-]+)\((.*)\)(.*)/; let base = { values: [] } @@ -2058,7 +2109,10 @@ var BORDER_IMAGE_GRADIENT_VALIDATOR = function BORDER_IMAGE_GRADIENT_VALIDATOR(v if (util.isValidValue(gradient.value)) { value = JSON.parse(gradient.value) } - value.slice = BORDER_IMAGE_SPLIT(valueMatch[3]); + var reg = /px|%/; + if (valueMatch[3].match(reg)) { + value.slice = BORDER_IMAGE_SPLIT(valueMatch[3]); + } base.values.push(value); return { value: JSON.stringify(base), @@ -2074,6 +2128,20 @@ var BORDER_IMAGE_GRADIENT_VALIDATOR = function BORDER_IMAGE_GRADIENT_VALIDATOR(v } } +var Color_Picker_VALIDATOR = function Color_Picker_VALIDATOR(v) { + v = (v || "").toString().trim() + let num = v.split(/\//); + let base = { + cValues: [] + } + num.forEach(element => { + base.cValues.push(COLOR_VALIDATOR(element).value); + }); + return { + value: JSON.stringify(base) + } +} + var RICH_PROP_NAME_GROUPS = { boxModel: { width: PERCENTAGE_LENGTH_VALIDATOR, @@ -2086,11 +2154,11 @@ var RICH_PROP_NAME_GROUPS = { paddingBottom: PERCENTAGE_LENGTH_VALIDATOR, paddingStart: PERCENTAGE_LENGTH_VALIDATOR, paddingEnd: PERCENTAGE_LENGTH_VALIDATOR, - margin: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR, - marginLeft: PERCENTAGE_LENGTH_VALIDATOR, - marginRight: PERCENTAGE_LENGTH_VALIDATOR, - marginTop: PERCENTAGE_LENGTH_VALIDATOR, - marginBottom: PERCENTAGE_LENGTH_VALIDATOR, + margin: SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginLeft: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginRight: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginTop: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginBottom: AUTO_PERCENTAGE_LENGTH_VALIDATOR, marginStart: PERCENTAGE_LENGTH_VALIDATOR, marginEnd: PERCENTAGE_LENGTH_VALIDATOR, placeholderColor: COLOR_VALIDATOR, @@ -2166,10 +2234,10 @@ var RICH_PROP_NAME_GROUPS = { borderBottom: BORDER_VALIDATOR, borderImage: BORDER_IMAGE_VALIDATOR, borderImageSource: URL_VALIDATOR, - borderImageSlice: SHORTHAND_LENGTH_VALIDATOR, - borderImageWidth: SHORTHAND_LENGTH_VALIDATOR, - borderImageOutset: SHORTHAND_LENGTH_VALIDATOR, - borderImageRepeat: genEnumValidator(['stretch', 'round', 'repeat']) + borderImageOutset: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR, + borderImageSlice: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR, + borderImageWidth: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR, + borderImageRepeat: genEnumValidator(['stretch', 'round', 'repeat', 'space']) }, indicator: { indicatorSize: LENGTH_VALIDATOR, @@ -2393,6 +2461,12 @@ var RICH_PROP_NAME_GROUPS = { disappearFontSize: LENGTH_VALIDATOR, disappearColor: COLOR_VALIDATOR }, + colorpicker: { + colorPickerColor: Color_Picker_VALIDATOR + }, + colorpickerView: { + colorPickerColor: Color_Picker_VALIDATOR + }, slider: { blockColor: COLOR_VALIDATOR, }, @@ -2634,11 +2708,11 @@ var LITE_PROP_NAME_GROUPS = { paddingRight: LENGTH_VALIDATOR, paddingTop: LENGTH_VALIDATOR, paddingBottom: LENGTH_VALIDATOR, - margin:SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR, - marginLeft: PERCENTAGE_LENGTH_VALIDATOR, - marginRight: PERCENTAGE_LENGTH_VALIDATOR, - marginTop: PERCENTAGE_LENGTH_VALIDATOR, - marginBottom: PERCENTAGE_LENGTH_VALIDATOR, + margin:SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginLeft: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginRight: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginTop: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginBottom: AUTO_PERCENTAGE_LENGTH_VALIDATOR, strokeWidth: LENGTH_VALIDATOR, }, border:{ @@ -2708,11 +2782,11 @@ var CARD_PROP_NAME_GROUPS = { paddingBottom: PERCENTAGE_LENGTH_VALIDATOR, paddingStart: PERCENTAGE_LENGTH_VALIDATOR, paddingEnd: PERCENTAGE_LENGTH_VALIDATOR, - margin: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR, - marginLeft: PERCENTAGE_LENGTH_VALIDATOR, - marginRight: PERCENTAGE_LENGTH_VALIDATOR, - marginTop: PERCENTAGE_LENGTH_VALIDATOR, - marginBottom: PERCENTAGE_LENGTH_VALIDATOR, + margin: SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginLeft: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginRight: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginTop: AUTO_PERCENTAGE_LENGTH_VALIDATOR, + marginBottom: AUTO_PERCENTAGE_LENGTH_VALIDATOR, marginStart: PERCENTAGE_LENGTH_VALIDATOR, marginEnd: PERCENTAGE_LENGTH_VALIDATOR, columns: NUMBER_VALIDATOR, diff --git a/src/loader.js b/src/loader.js index 359d404..c7e919e 100644 --- a/src/loader.js +++ b/src/loader.js @@ -141,7 +141,8 @@ function scriptLoaderString (loaders, config, customLoader) { name: defaultLoaders.resourceReferenceScript }) } - if (config.app && process.env.abilityType === 'page') { + if (config.app && process.env.abilityType === 'page' && + fs.existsSync(process.env.aceManifestPath)) { loaders.push({ name: defaultLoaders.manifest, query: { @@ -189,16 +190,17 @@ function loader (source) { } let output = '' // import app.js - output += loadApp(this, name, isEntry, customLang) + output += loadApp(this, name, isEntry, customLang, source) output += loadPage(this, name, isEntry, customLang, source) return output } function checkApp(_this) { - return _this.resourcePath.indexOf(process.env.abilityType === 'page' ? 'app.js' : `${process.env.abilityType}.js`) > 0 + return _this.resourcePath === path.resolve(process.env.projectPath, + process.env.abilityType === 'page' ? 'app.js' : `${process.env.abilityType}.js`) } -function loadApp (_this, name, isEntry, customLang) { +function loadApp (_this, name, isEntry, customLang, source) { let output = '' let extcss = false if (checkApp(_this)) { @@ -227,7 +229,7 @@ function loadApp (_this, name, isEntry, customLang) { app: true }), _this.resourcePath) - if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH) { + if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH || process.env.DEVICE_LEVEL === 'card') { output += ` $app_define$('@app-application/${name}', [], function($app_require$, $app_exports$, $app_module$) { ` + ` @@ -252,8 +254,11 @@ function loadApp (_this, name, isEntry, customLang) { `module.exports=new ViewModel(options);` } return output + } else if (/\.js$/.test(_this.resourcePath)) { + return source + } else { + return output } - return output } function loadPage (_this, name, isEntry, customLang, source) { @@ -453,4 +458,4 @@ function loadPageCheckLite (extscript, extcss) { for (const key in legacy) { loader[key] = legacy[key] } -module.exports = loader +module.exports = loader \ No newline at end of file diff --git a/src/script.js b/src/script.js index ad98551..dfdac74 100644 --- a/src/script.js +++ b/src/script.js @@ -40,7 +40,7 @@ module.exports = function (source, map) { logWarn(this, log) } parsed = parseRequireModule(parsed) - if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH) { + if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH || process.env.DEVICE_LEVEL === 'card') { const appName = process.env.abilityType === 'page' ? 'app.js' : `${process.env.abilityType}.js` if (path.basename(this.resourcePath) !== appName) { parsed += `\nvar moduleOwn = exports.default || module.exports;\nvar accessors = ['public', 'protected', 'private']; @@ -72,4 +72,4 @@ if (moduleOwn.data && accessors.some(function (acc) { }]) callback('') }) -} +} \ No newline at end of file diff --git a/src/util.js b/src/util.js index c2813cb..1334e65 100644 --- a/src/util.js +++ b/src/util.js @@ -18,6 +18,7 @@ */ import path from 'path' +import fs from 'fs' import loaderUtils from 'loader-utils' import hash from 'hash-sum' import { @@ -221,12 +222,12 @@ export function loadBabelModule (moduleName) { } } -const methodForLite = +const methodForLite = ` function requireModule(moduleName) { return requireNative(moduleName.slice(1)); } -` +` const methodForOthers = ` function requireModule(moduleName) { @@ -239,7 +240,7 @@ function requireModule(moduleName) { } var shortName = moduleName.replace(/@[^.]+\.([^.]+)/, '$1'); target = requireNapi(shortName); - if (target !== 'undefined' && /@ohos/.test(moduleName)) { + if (typeof target !== 'undefined' && /@ohos/.test(moduleName)) { return target; } if (typeof ohosplugin !== 'undefined' && /@ohos/.test(moduleName)) { @@ -274,10 +275,11 @@ export function parseRequireModule (source) { source = `${source}\n${requireMethod}` const requireReg = /require\(['"]([^()]+)['"]\)/g const libReg = /^lib(.+)\.so$/ + const REG_SYSTEM = /@(system|ohos)\.(\S+)/g; let requireStatements = source.match(requireReg) if (requireStatements && requireStatements.length) { for (let requireStatement of requireStatements) { - if (requireStatement.indexOf('@system') > 0 || requireStatement.indexOf('@ohos') > 0) { + if (requireStatement.match(REG_SYSTEM)) { source = source.replace(requireStatement, requireStatement.replace('require', 'requireModule')) } } @@ -332,6 +334,55 @@ export function jsonLoaders (type, customLoader, isVisual, queryType) { } }) } - + return stringifyLoaders(loaders) } + +export function circularFile(inputPath, outputPath) { + if ((!inputPath) || (!outputPath)) { + return; + } + fs.readdir(inputPath,function(err, files){ + if (!files) { + return; + } + files.forEach(file => { + const inputFile = path.resolve(inputPath, file); + const outputFile = path.resolve(outputPath, file); + const fileStat = fs.statSync(inputFile); + if (fileStat.isFile()) { + copyFile(inputFile, outputFile); + } else { + circularFile(inputFile, outputFile); + } + }); + }) +} + +function copyFile(inputFile, outputFile) { + try { + const parent = path.join(outputFile, '..'); + if (!(fs.existsSync(parent) && fs.statSync(parent).isDirectory())) { + mkDir(parent); + } + if (fs.existsSync(outputFile)) { + return; + } + const readStream = fs.createReadStream(inputFile); + const writeStream = fs.createWriteStream(outputFile); + readStream.pipe(writeStream); + readStream.on('close', function() { + writeStream.end(); + }); + } catch (err) { + throw err; + } +} + +export function mkDir(path_) { + const parent = path.join(path_, '..'); + if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) { + mkDir(parent); + } + fs.mkdirSync(path_); +} \ No newline at end of file -- Gitee