188c88e8eSopenharmony_ci
288c88e8eSopenharmony_civar util = require('./util')
388c88e8eSopenharmony_civar OHOS_THEME_PROP_GROUPS = require('../../theme/ohosStyles');
488c88e8eSopenharmony_ci
588c88e8eSopenharmony_ci// http://www.w3.org/TR/css3-color/#html4
688c88e8eSopenharmony_civar BASIC_COLOR_KEYWORDS = {
788c88e8eSopenharmony_ci  black: '#000000',
888c88e8eSopenharmony_ci  silver: '#C0C0C0',
988c88e8eSopenharmony_ci  gray: '#808080',
1088c88e8eSopenharmony_ci  white: '#FFFFFF',
1188c88e8eSopenharmony_ci  maroon: '#800000',
1288c88e8eSopenharmony_ci  red: '#FF0000',
1388c88e8eSopenharmony_ci  purple: '#800080',
1488c88e8eSopenharmony_ci  fuchsia: '#FF00FF',
1588c88e8eSopenharmony_ci  green: '#008000',
1688c88e8eSopenharmony_ci  lime: '#00FF00',
1788c88e8eSopenharmony_ci  olive: '#808000',
1888c88e8eSopenharmony_ci  yellow: '#FFFF00',
1988c88e8eSopenharmony_ci  navy: '#000080',
2088c88e8eSopenharmony_ci  blue: '#0000FF',
2188c88e8eSopenharmony_ci  teal: '#008080',
2288c88e8eSopenharmony_ci  aqua: '#00FFFF'
2388c88e8eSopenharmony_ci}
2488c88e8eSopenharmony_ci
2588c88e8eSopenharmony_ci// http://www.w3.org/TR/css3-color/#svg-color
2688c88e8eSopenharmony_civar EXTENDED_COLOR_KEYWORDS = {
2788c88e8eSopenharmony_ci  aliceblue: '#F0F8FF',
2888c88e8eSopenharmony_ci  antiquewhite: '#FAEBD7',
2988c88e8eSopenharmony_ci  aqua: '#00FFFF',
3088c88e8eSopenharmony_ci  aquamarine: '#7FFFD4',
3188c88e8eSopenharmony_ci  azure: '#F0FFFF',
3288c88e8eSopenharmony_ci  beige: '#F5F5DC',
3388c88e8eSopenharmony_ci  bisque: '#FFE4C4',
3488c88e8eSopenharmony_ci  black: '#000000',
3588c88e8eSopenharmony_ci  blanchedalmond: '#FFEBCD',
3688c88e8eSopenharmony_ci  blue: '#0000FF',
3788c88e8eSopenharmony_ci  blueviolet: '#8A2BE2',
3888c88e8eSopenharmony_ci  brown: '#A52A2A',
3988c88e8eSopenharmony_ci  burlywood: '#DEB887',
4088c88e8eSopenharmony_ci  cadetblue: '#5F9EA0',
4188c88e8eSopenharmony_ci  chartreuse: '#7FFF00',
4288c88e8eSopenharmony_ci  chocolate: '#D2691E',
4388c88e8eSopenharmony_ci  coral: '#FF7F50',
4488c88e8eSopenharmony_ci  cornflowerblue: '#6495ED',
4588c88e8eSopenharmony_ci  cornsilk: '#FFF8DC',
4688c88e8eSopenharmony_ci  crimson: '#DC143C',
4788c88e8eSopenharmony_ci  cyan: '#00FFFF',
4888c88e8eSopenharmony_ci  darkblue: '#00008B',
4988c88e8eSopenharmony_ci  darkcyan: '#008B8B',
5088c88e8eSopenharmony_ci  darkgoldenrod: '#B8860B',
5188c88e8eSopenharmony_ci  darkgray: '#A9A9A9',
5288c88e8eSopenharmony_ci  darkgreen: '#006400',
5388c88e8eSopenharmony_ci  darkgrey: '#A9A9A9',
5488c88e8eSopenharmony_ci  darkkhaki: '#BDB76B',
5588c88e8eSopenharmony_ci  darkmagenta: '#8B008B',
5688c88e8eSopenharmony_ci  darkolivegreen: '#556B2F',
5788c88e8eSopenharmony_ci  darkorange: '#FF8C00',
5888c88e8eSopenharmony_ci  darkorchid: '#9932CC',
5988c88e8eSopenharmony_ci  darkred: '#8B0000',
6088c88e8eSopenharmony_ci  darksalmon: '#E9967A',
6188c88e8eSopenharmony_ci  darkseagreen: '#8FBC8F',
6288c88e8eSopenharmony_ci  darkslateblue: '#483D8B',
6388c88e8eSopenharmony_ci  darkslategray: '#2F4F4F',
6488c88e8eSopenharmony_ci  darkslategrey: '#2F4F4F',
6588c88e8eSopenharmony_ci  darkturquoise: '#00CED1',
6688c88e8eSopenharmony_ci  darkviolet: '#9400D3',
6788c88e8eSopenharmony_ci  deeppink: '#FF1493',
6888c88e8eSopenharmony_ci  deepskyblue: '#00BFFF',
6988c88e8eSopenharmony_ci  dimgray: '#696969',
7088c88e8eSopenharmony_ci  dimgrey: '#696969',
7188c88e8eSopenharmony_ci  dodgerblue: '#1E90FF',
7288c88e8eSopenharmony_ci  firebrick: '#B22222',
7388c88e8eSopenharmony_ci  floralwhite: '#FFFAF0',
7488c88e8eSopenharmony_ci  forestgreen: '#228B22',
7588c88e8eSopenharmony_ci  fuchsia: '#FF00FF',
7688c88e8eSopenharmony_ci  gainsboro: '#DCDCDC',
7788c88e8eSopenharmony_ci  ghostwhite: '#F8F8FF',
7888c88e8eSopenharmony_ci  gold: '#FFD700',
7988c88e8eSopenharmony_ci  goldenrod: '#DAA520',
8088c88e8eSopenharmony_ci  gray: '#808080',
8188c88e8eSopenharmony_ci  green: '#008000',
8288c88e8eSopenharmony_ci  greenyellow: '#ADFF2F',
8388c88e8eSopenharmony_ci  grey: '#808080',
8488c88e8eSopenharmony_ci  honeydew: '#F0FFF0',
8588c88e8eSopenharmony_ci  hotpink: '#FF69B4',
8688c88e8eSopenharmony_ci  indianred: '#CD5C5C',
8788c88e8eSopenharmony_ci  indigo: '#4B0082',
8888c88e8eSopenharmony_ci  ivory: '#FFFFF0',
8988c88e8eSopenharmony_ci  khaki: '#F0E68C',
9088c88e8eSopenharmony_ci  lavender: '#E6E6FA',
9188c88e8eSopenharmony_ci  lavenderblush: '#FFF0F5',
9288c88e8eSopenharmony_ci  lawngreen: '#7CFC00',
9388c88e8eSopenharmony_ci  lemonchiffon: '#FFFACD',
9488c88e8eSopenharmony_ci  lightblue: '#ADD8E6',
9588c88e8eSopenharmony_ci  lightcoral: '#F08080',
9688c88e8eSopenharmony_ci  lightcyan: '#E0FFFF',
9788c88e8eSopenharmony_ci  lightgoldenrodyellow: '#FAFAD2',
9888c88e8eSopenharmony_ci  lightgray: '#D3D3D3',
9988c88e8eSopenharmony_ci  lightgreen: '#90EE90',
10088c88e8eSopenharmony_ci  lightgrey: '#D3D3D3',
10188c88e8eSopenharmony_ci  lightpink: '#FFB6C1',
10288c88e8eSopenharmony_ci  lightsalmon: '#FFA07A',
10388c88e8eSopenharmony_ci  lightseagreen: '#20B2AA',
10488c88e8eSopenharmony_ci  lightskyblue: '#87CEFA',
10588c88e8eSopenharmony_ci  lightslategray: '#778899',
10688c88e8eSopenharmony_ci  lightslategrey: '#778899',
10788c88e8eSopenharmony_ci  lightsteelblue: '#B0C4DE',
10888c88e8eSopenharmony_ci  lightyellow: '#FFFFE0',
10988c88e8eSopenharmony_ci  lime: '#00FF00',
11088c88e8eSopenharmony_ci  limegreen: '#32CD32',
11188c88e8eSopenharmony_ci  linen: '#FAF0E6',
11288c88e8eSopenharmony_ci  magenta: '#FF00FF',
11388c88e8eSopenharmony_ci  maroon: '#800000',
11488c88e8eSopenharmony_ci  mediumaquamarine: '#66CDAA',
11588c88e8eSopenharmony_ci  mediumblue: '#0000CD',
11688c88e8eSopenharmony_ci  mediumorchid: '#BA55D3',
11788c88e8eSopenharmony_ci  mediumpurple: '#9370DB',
11888c88e8eSopenharmony_ci  mediumseagreen: '#3CB371',
11988c88e8eSopenharmony_ci  mediumslateblue: '#7B68EE',
12088c88e8eSopenharmony_ci  mediumspringgreen: '#00FA9A',
12188c88e8eSopenharmony_ci  mediumturquoise: '#48D1CC',
12288c88e8eSopenharmony_ci  mediumvioletred: '#C71585',
12388c88e8eSopenharmony_ci  midnightblue: '#191970',
12488c88e8eSopenharmony_ci  mintcream: '#F5FFFA',
12588c88e8eSopenharmony_ci  mistyrose: '#FFE4E1',
12688c88e8eSopenharmony_ci  moccasin: '#FFE4B5',
12788c88e8eSopenharmony_ci  navajowhite: '#FFDEAD',
12888c88e8eSopenharmony_ci  navy: '#000080',
12988c88e8eSopenharmony_ci  oldlace: '#FDF5E6',
13088c88e8eSopenharmony_ci  olive: '#808000',
13188c88e8eSopenharmony_ci  olivedrab: '#6B8E23',
13288c88e8eSopenharmony_ci  orange: '#FFA500',
13388c88e8eSopenharmony_ci  orangered: '#FF4500',
13488c88e8eSopenharmony_ci  orchid: '#DA70D6',
13588c88e8eSopenharmony_ci  palegoldenrod: '#EEE8AA',
13688c88e8eSopenharmony_ci  palegreen: '#98FB98',
13788c88e8eSopenharmony_ci  paleturquoise: '#AFEEEE',
13888c88e8eSopenharmony_ci  palevioletred: '#DB7093',
13988c88e8eSopenharmony_ci  papayawhip: '#FFEFD5',
14088c88e8eSopenharmony_ci  peachpuff: '#FFDAB9',
14188c88e8eSopenharmony_ci  peru: '#CD853F',
14288c88e8eSopenharmony_ci  pink: '#FFC0CB',
14388c88e8eSopenharmony_ci  plum: '#DDA0DD',
14488c88e8eSopenharmony_ci  powderblue: '#B0E0E6',
14588c88e8eSopenharmony_ci  purple: '#800080',
14688c88e8eSopenharmony_ci  red: '#FF0000',
14788c88e8eSopenharmony_ci  rosybrown: '#BC8F8F',
14888c88e8eSopenharmony_ci  royalblue: '#4169E1',
14988c88e8eSopenharmony_ci  rebeccapurple: '#663399',
15088c88e8eSopenharmony_ci  saddlebrown: '#8B4513',
15188c88e8eSopenharmony_ci  salmon: '#FA8072',
15288c88e8eSopenharmony_ci  sandybrown: '#F4A460',
15388c88e8eSopenharmony_ci  seagreen: '#2E8B57',
15488c88e8eSopenharmony_ci  seashell: '#FFF5EE',
15588c88e8eSopenharmony_ci  sienna: '#A0522D',
15688c88e8eSopenharmony_ci  silver: '#C0C0C0',
15788c88e8eSopenharmony_ci  skyblue: '#87CEEB',
15888c88e8eSopenharmony_ci  slateblue: '#6A5ACD',
15988c88e8eSopenharmony_ci  slategray: '#708090',
16088c88e8eSopenharmony_ci  slategrey: '#708090',
16188c88e8eSopenharmony_ci  snow: '#FFFAFA',
16288c88e8eSopenharmony_ci  springgreen: '#00FF7F',
16388c88e8eSopenharmony_ci  steelblue: '#4682B4',
16488c88e8eSopenharmony_ci  tan: '#D2B48C',
16588c88e8eSopenharmony_ci  teal: '#008080',
16688c88e8eSopenharmony_ci  thistle: '#D8BFD8',
16788c88e8eSopenharmony_ci  tomato: '#FF6347',
16888c88e8eSopenharmony_ci  turquoise: '#40E0D0',
16988c88e8eSopenharmony_ci  violet: '#EE82EE',
17088c88e8eSopenharmony_ci  wheat: '#F5DEB3',
17188c88e8eSopenharmony_ci  white: '#FFFFFF',
17288c88e8eSopenharmony_ci  whitesmoke: '#F5F5F5',
17388c88e8eSopenharmony_ci  yellow: '#FFFF00',
17488c88e8eSopenharmony_ci  yellowgreen: '#9ACD32'
17588c88e8eSopenharmony_ci}
17688c88e8eSopenharmony_ci
17788c88e8eSopenharmony_civar DEFAULT_ANIMATION = {
17888c88e8eSopenharmony_ci    animationDuration : "0ms",
17988c88e8eSopenharmony_ci    animationDelay : "0ms",
18088c88e8eSopenharmony_ci    animationDirection : 'normal',
18188c88e8eSopenharmony_ci    animationTimingFunction : 'ease',
18288c88e8eSopenharmony_ci    animationPlayState : 'running',
18388c88e8eSopenharmony_ci    animationIterationCount : 1,
18488c88e8eSopenharmony_ci    animationFillMode : 'none'
18588c88e8eSopenharmony_ci}
18688c88e8eSopenharmony_ci
18788c88e8eSopenharmony_civar LENGTH_REGEXP = /^[-+]?\d*\.?\d+(\S*)$/
18888c88e8eSopenharmony_civar LINE_GRADIENT_ITEM_REGEXP = /^([0-9a-zA-Z-]+)\((.*)\)/
18988c88e8eSopenharmony_civar LINE_GRADIENT_DIRECTION_REGEXP = /^\s*(to|bottom|right|left|top)|[-+]?[0-9]*\.?[0-9]+(.*)/
19088c88e8eSopenharmony_civar LINE_GRADIENT_TO_DIRECTION_REGEXP = /(to|bottom|right|left|top)/
19188c88e8eSopenharmony_civar ANGLE_REGEXP = /^[-+]?[0-9]*\.?[0-9]+(.*)/
19288c88e8eSopenharmony_civar ARRAY_COLOR_STOP_REGEXP = /(rgba|rgb)\([0-9,.\spx%vpfp]+\)\s?[0-9-+px%vpfp]*|[#]?\w+\s?[0-9+-\spx%vpfp]*/gi
19388c88e8eSopenharmony_civar URL_REGEXP = /^url\(\s*['"]?\s*([^()]+?)\s*['"]?\s*\)$/
19488c88e8eSopenharmony_civar NAME_REGEXP = /^[a-zA-Z_]+[a-zA-Z0-9-]*$/
19588c88e8eSopenharmony_civar INT_REGEXP = /^[-+]?[0-9]+$/
19688c88e8eSopenharmony_civar ID_REGEXP = /^\"@id\d+\"$/
19788c88e8eSopenharmony_civar NORMAL_REGEXP =  /^normal$/
19888c88e8eSopenharmony_civar AUTO_REGEXP = /^auto$/
19988c88e8eSopenharmony_civar 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$)/
20088c88e8eSopenharmony_civar TRANSFORM_REGEXP = /[0-9a-zA-Z]+\s*\(\s*[0-9(a-zA-Z-|%)\.]+\s*(,\s*[0-9(a-zA-Z-|%)\.]+)*\)/g
20188c88e8eSopenharmony_civar TRANSFORM_ITEM_REGEXP = /^([0-9a-zA-Z]+)\s*\((.*)\)$/
20288c88e8eSopenharmony_civar FILTER_REGEXP = /^blur\(([1-9]\d*|0)(px|fp|vp)\)$/
20388c88e8eSopenharmony_civar FILTER_PERCENTAGE_REGEXP = /^blur\(([1-9]?\d|100)%\)$/
20488c88e8eSopenharmony_civar FILTER_STYLE_REGEXP = /^blur\(([1-9]?\d|100)%\)\s+[A-Za-z_]+$/
20588c88e8eSopenharmony_civar SUPPORT_CSS_EXPRESSION = /calc\(|var\(\-\-/
20688c88e8eSopenharmony_civar SUPPORT_VAR_EXPRESSION = /var\(\-\-/
20788c88e8eSopenharmony_civar SUPPORT_CSS_UNIT = ['px', 'pt', 'wx', 'vp', 'fp']
20888c88e8eSopenharmony_civar SUPPORT_CSS_TIME_UNIT = ['ms', 's']
20988c88e8eSopenharmony_civar SUPPORT_CSS_PERCENTAGE_UNIT = ['px', '%', 'vp', 'fp']
21088c88e8eSopenharmony_civar SUPPORT_CSS_GRID_UNIT = ['px', '%', 'fr', 'vp', 'fp']
21188c88e8eSopenharmony_civar SUPPORT_CSS_TEXT_INDENT_UNIT = ['px', 'cm', '%', 'em', 'vp', 'fp']
21288c88e8eSopenharmony_civar SUPPORT_CSS_ANGLE_UNIT = ["deg", "rad", "grad", "turn"]
21388c88e8eSopenharmony_civar logTypes = ["NOTE", "WARNING", "ERROR"]
21488c88e8eSopenharmony_ci
21588c88e8eSopenharmony_civar ANYTHING_VALIDATOR = function ANYTHING_VALIDATOR(v) {
21688c88e8eSopenharmony_ci  v = (v || '').toString().trim()
21788c88e8eSopenharmony_ci  return { value: v }
21888c88e8eSopenharmony_ci}
21988c88e8eSopenharmony_ci
22088c88e8eSopenharmony_ci/**
22188c88e8eSopenharmony_ci * the values below is valid
22288c88e8eSopenharmony_ci * - auto
22388c88e8eSopenharmony_ci * - number
22488c88e8eSopenharmony_ci * - number + 'px'|'%'|'vp'| 'fp'
22588c88e8eSopenharmony_ci *
22688c88e8eSopenharmony_ci * @param {string} v
22788c88e8eSopenharmony_ci * @return {function} a function to return
22888c88e8eSopenharmony_ci * - value: number|null
22988c88e8eSopenharmony_ci * - reason(k, v, result)
23088c88e8eSopenharmony_ci */
23188c88e8eSopenharmony_civar AUTO_PERCENTAGE_LENGTH_VALIDATOR = function AUTO_PERCENTAGE_LENGTH_VALIDATOR(v) {
23288c88e8eSopenharmony_ci  v = (v || '').toString().trim()
23388c88e8eSopenharmony_ci  if (v.match(AUTO_REGEXP)) {
23488c88e8eSopenharmony_ci    return { value: v }
23588c88e8eSopenharmony_ci  } else if (v.match(ID_REGEXP)) {
23688c88e8eSopenharmony_ci    return { value: v }
23788c88e8eSopenharmony_ci  } else if (v.match(SUPPORT_CSS_EXPRESSION)) {
23888c88e8eSopenharmony_ci    return { value: v }
23988c88e8eSopenharmony_ci  } else {
24088c88e8eSopenharmony_ci    return LENGTH(v, SUPPORT_CSS_PERCENTAGE_UNIT)
24188c88e8eSopenharmony_ci  }
24288c88e8eSopenharmony_ci}
24388c88e8eSopenharmony_ci
24488c88e8eSopenharmony_ci/**
24588c88e8eSopenharmony_ci * the values below is valid
24688c88e8eSopenharmony_ci * - number
24788c88e8eSopenharmony_ci * - number + 'px'|'%'|'vp'| 'fp'
24888c88e8eSopenharmony_ci *
24988c88e8eSopenharmony_ci * @param {string} v
25088c88e8eSopenharmony_ci * @return {function} a function to return
25188c88e8eSopenharmony_ci * - value: number|null
25288c88e8eSopenharmony_ci * - reason(k, v, result)
25388c88e8eSopenharmony_ci */
25488c88e8eSopenharmony_civar PERCENTAGE_LENGTH_VALIDATOR = function PERCENTAGE_LENGTH_VALIDATOR(v) {
25588c88e8eSopenharmony_ci  v = (v || '').toString().trim()
25688c88e8eSopenharmony_ci  if (v.match(ID_REGEXP)) {
25788c88e8eSopenharmony_ci    return { value: v }
25888c88e8eSopenharmony_ci  } else if (v.match(SUPPORT_CSS_EXPRESSION)) {
25988c88e8eSopenharmony_ci    return { value: v }
26088c88e8eSopenharmony_ci  } else {
26188c88e8eSopenharmony_ci    return LENGTH(v, SUPPORT_CSS_PERCENTAGE_UNIT)
26288c88e8eSopenharmony_ci  }
26388c88e8eSopenharmony_ci}
26488c88e8eSopenharmony_ci
26588c88e8eSopenharmony_ci/**
26688c88e8eSopenharmony_ci * the values below is valid
26788c88e8eSopenharmony_ci * - number
26888c88e8eSopenharmony_ci * - number + 'px'
26988c88e8eSopenharmony_ci *
27088c88e8eSopenharmony_ci * @param {string} v
27188c88e8eSopenharmony_ci * @return {function} a function to return
27288c88e8eSopenharmony_ci * - value: number|null
27388c88e8eSopenharmony_ci * - reason(k, v, result)
27488c88e8eSopenharmony_ci */
27588c88e8eSopenharmony_civar LENGTH_VALIDATOR = function LENGTH_VALIDATOR(v) {
27688c88e8eSopenharmony_ci  v = (v || '').toString().trim()
27788c88e8eSopenharmony_ci  if (v.match(SUPPORT_CSS_EXPRESSION)) {
27888c88e8eSopenharmony_ci    return { value: v }
27988c88e8eSopenharmony_ci  } else if (v.match(ID_REGEXP)) {
28088c88e8eSopenharmony_ci    return { value: v }
28188c88e8eSopenharmony_ci  } else {
28288c88e8eSopenharmony_ci    return LENGTH(v, SUPPORT_CSS_UNIT)
28388c88e8eSopenharmony_ci  }
28488c88e8eSopenharmony_ci}
28588c88e8eSopenharmony_ci
28688c88e8eSopenharmony_civar LENGTH = function LENGTH(v, SUPPORT_UNIT) {
28788c88e8eSopenharmony_ci  v = (v || '').toString().trim()
28888c88e8eSopenharmony_ci  var match = v.match(LENGTH_REGEXP)
28988c88e8eSopenharmony_ci
29088c88e8eSopenharmony_ci  if (match) {
29188c88e8eSopenharmony_ci    var unit = match[1]
29288c88e8eSopenharmony_ci    if (!unit) {
29388c88e8eSopenharmony_ci      return v === '0' ? { value: parseFloat(v) + SUPPORT_UNIT[0] } :
29488c88e8eSopenharmony_ci        {
29588c88e8eSopenharmony_ci          value: parseFloat(v) + SUPPORT_UNIT[0],
29688c88e8eSopenharmony_ci          reason: function(k, v) {
29788c88e8eSopenharmony_ci            return 'WARNING: No unit is specified for the `' + util.camelCaseToHyphened(k) +
29888c88e8eSopenharmony_ci              '` attribute. The default unit is ' + SUPPORT_UNIT[0]
29988c88e8eSopenharmony_ci          }
30088c88e8eSopenharmony_ci        }
30188c88e8eSopenharmony_ci    } else if (SUPPORT_UNIT.indexOf(unit) > -1) {
30288c88e8eSopenharmony_ci      return { value: v }
30388c88e8eSopenharmony_ci    } else {
30488c88e8eSopenharmony_ci      return {
30588c88e8eSopenharmony_ci        value: parseFloat(v) + SUPPORT_UNIT[0],
30688c88e8eSopenharmony_ci        reason: function reason(k, v, result) {
30788c88e8eSopenharmony_ci          return 'ERROR: The `' + k + '` attribute does not support `' + unit +
30888c88e8eSopenharmony_ci            '`. The default unit is ' + SUPPORT_UNIT[0]
30988c88e8eSopenharmony_ci        }
31088c88e8eSopenharmony_ci      }
31188c88e8eSopenharmony_ci    }
31288c88e8eSopenharmony_ci  }
31388c88e8eSopenharmony_ci
31488c88e8eSopenharmony_ci  if (v.indexOf('@') >= 0) {
31588c88e8eSopenharmony_ci    let result
31688c88e8eSopenharmony_ci    // target format "@sys.float.id_sys_length" or '@sys.float.id_sys_length'
31788c88e8eSopenharmony_ci    let SysResourceTypeRefReg = /['"]\s*@sys\.float\.(?<resName>\w+)\s*['"]/
31888c88e8eSopenharmony_ci    result = SysResourceTypeRefReg.exec(v)
31988c88e8eSopenharmony_ci    if (result) {
32088c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
32188c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
32288c88e8eSopenharmony_ci        return { value: "@sys.float." + OHOS_THEME_PROP_GROUPS[resourceName] }
32388c88e8eSopenharmony_ci      }
32488c88e8eSopenharmony_ci    }
32588c88e8eSopenharmony_ci    // target format "@app.float.developer_defined_length" or '@app.float.developer_defined_length'
32688c88e8eSopenharmony_ci    let AppResourceTypeRefReg = /['"]\s*@app\.float\.(?<resName>\w+)\s*['"]/
32788c88e8eSopenharmony_ci    result = AppResourceTypeRefReg.exec(v)
32888c88e8eSopenharmony_ci    if (result) {
32988c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
33088c88e8eSopenharmony_ci      if (resourceName) {
33188c88e8eSopenharmony_ci        return { value: "@app.float." + resourceName}
33288c88e8eSopenharmony_ci      }
33388c88e8eSopenharmony_ci    }
33488c88e8eSopenharmony_ci    // target format "@id_sys_length" or '@id_sys_length' or @id_sys_length
33588c88e8eSopenharmony_ci    let ResourceRefReg = /['"]?\s*@(?<resName>\w+)\s*['"]?/
33688c88e8eSopenharmony_ci    result = ResourceRefReg.exec(v)
33788c88e8eSopenharmony_ci    if (result) {
33888c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
33988c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
34088c88e8eSopenharmony_ci        return { value: "@ohos_id_" + OHOS_THEME_PROP_GROUPS[resourceName] }
34188c88e8eSopenharmony_ci      }
34288c88e8eSopenharmony_ci    }
34388c88e8eSopenharmony_ci  }
34488c88e8eSopenharmony_ci
34588c88e8eSopenharmony_ci  return {
34688c88e8eSopenharmony_ci    value: null,
34788c88e8eSopenharmony_ci    reason: function reason(k, v, result) {
34888c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support the `' +
34988c88e8eSopenharmony_ci        v + '` value (only numbers are supported).'
35088c88e8eSopenharmony_ci    }
35188c88e8eSopenharmony_ci  }
35288c88e8eSopenharmony_ci}
35388c88e8eSopenharmony_ci
35488c88e8eSopenharmony_civar TEXT_INDENT_VALIDATOR = function TEXT_INDENT_VALIDATOR(v) {
35588c88e8eSopenharmony_ci  return LENGTH(v, SUPPORT_CSS_TEXT_INDENT_UNIT)
35688c88e8eSopenharmony_ci}
35788c88e8eSopenharmony_ci
35888c88e8eSopenharmony_civar TEXT_LINE_HEIGHT_VALIDATOR = function TEXT_LINE_HEIGHT_VALIDATOR(v) {
35988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
36088c88e8eSopenharmony_ci
36188c88e8eSopenharmony_ci  if (v.match(NORMAL_REGEXP)) {
36288c88e8eSopenharmony_ci    return { value: v }
36388c88e8eSopenharmony_ci  } else {
36488c88e8eSopenharmony_ci    return LENGTH_VALIDATOR(v)
36588c88e8eSopenharmony_ci  }
36688c88e8eSopenharmony_ci}
36788c88e8eSopenharmony_ci
36888c88e8eSopenharmony_ci/**
36988c88e8eSopenharmony_ci * the values below is valid
37088c88e8eSopenharmony_ci * - number
37188c88e8eSopenharmony_ci * - number + 'ms'|'s'
37288c88e8eSopenharmony_ci *
37388c88e8eSopenharmony_ci * @param {string} v
37488c88e8eSopenharmony_ci * @return {function} a function to return
37588c88e8eSopenharmony_ci * - value: number|null
37688c88e8eSopenharmony_ci * - reason(k, v, result)
37788c88e8eSopenharmony_ci */
37888c88e8eSopenharmony_civar TIME_VALIDATOR = function TIME_VALIDATOR(v) {
37988c88e8eSopenharmony_ci  return LENGTH(v, SUPPORT_CSS_TIME_UNIT)
38088c88e8eSopenharmony_ci}
38188c88e8eSopenharmony_ci
38288c88e8eSopenharmony_ci/**
38388c88e8eSopenharmony_ci * the values below is valid
38488c88e8eSopenharmony_ci * - number {1,4}
38588c88e8eSopenharmony_ci * - number + 'px' {1,4}
38688c88e8eSopenharmony_ci *
38788c88e8eSopenharmony_ci * @param {string} v
38888c88e8eSopenharmony_ci * @return {function} a function to return
38988c88e8eSopenharmony_ci * - value: number|null
39088c88e8eSopenharmony_ci * - reason(k, v, result)
39188c88e8eSopenharmony_ci */
39288c88e8eSopenharmony_civar SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR = function SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR(v) {
39388c88e8eSopenharmony_ci  v = (v || '').toString().trim()
39488c88e8eSopenharmony_ci  let rule = PERCENTAGE_LENGTH_VALIDATOR
39588c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, rule)
39688c88e8eSopenharmony_ci}
39788c88e8eSopenharmony_ci
39888c88e8eSopenharmony_civar SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR = function SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR(v) {
39988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
40088c88e8eSopenharmony_ci  let rule = AUTO_PERCENTAGE_LENGTH_VALIDATOR
40188c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, rule)
40288c88e8eSopenharmony_ci}
40388c88e8eSopenharmony_ci
40488c88e8eSopenharmony_civar SHORTHAND_LENGTH_VALIDATOR = function SHORTHAND_LENGTH_VALIDATOR(v) {
40588c88e8eSopenharmony_ci  v = (v || '').toString().trim()
40688c88e8eSopenharmony_ci  let rule = LENGTH_VALIDATOR
40788c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, rule)
40888c88e8eSopenharmony_ci}
40988c88e8eSopenharmony_ci
41088c88e8eSopenharmony_civar ARRAY_LENGTH_VALIDATOR = function ARRAY_LENGTH_VALIDATOR(v) {
41188c88e8eSopenharmony_ci  v = (v || '').toString().trim().replace(/,/g, ' ')
41288c88e8eSopenharmony_ci  var isArray = true
41388c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, LENGTH_VALIDATOR, isArray)
41488c88e8eSopenharmony_ci}
41588c88e8eSopenharmony_ci
41688c88e8eSopenharmony_ci/**
41788c88e8eSopenharmony_ci * the values below is valid
41888c88e8eSopenharmony_ci * - hex color value (#xxxxxx or #xxx)
41988c88e8eSopenharmony_ci * - basic and extended color keywords in CSS spec
42088c88e8eSopenharmony_ci * - expression
42188c88e8eSopenharmony_ci *
42288c88e8eSopenharmony_ci * @param {string} v
42388c88e8eSopenharmony_ci * @return {function} a function to return
42488c88e8eSopenharmony_ci * - value: string|null
42588c88e8eSopenharmony_ci * - reason(k, v, result)
42688c88e8eSopenharmony_ci */
42788c88e8eSopenharmony_civar COLOR_VAR_VALIDATOR = function COLOR_VAR_VALIDATOR(v) {
42888c88e8eSopenharmony_ci  v = (v || '').toString().trim()
42988c88e8eSopenharmony_ci  if (v.match(SUPPORT_VAR_EXPRESSION)) {
43088c88e8eSopenharmony_ci    return { value: v }
43188c88e8eSopenharmony_ci  } else {
43288c88e8eSopenharmony_ci    return COLOR_VALIDATOR(v)
43388c88e8eSopenharmony_ci  }
43488c88e8eSopenharmony_ci}
43588c88e8eSopenharmony_ci
43688c88e8eSopenharmony_ci/**
43788c88e8eSopenharmony_ci * the values below is valid
43888c88e8eSopenharmony_ci * - hex color value (#xxxxxx or #xxx)
43988c88e8eSopenharmony_ci * - basic and extended color keywords in CSS spec
44088c88e8eSopenharmony_ci *
44188c88e8eSopenharmony_ci * @param {string} v
44288c88e8eSopenharmony_ci * @return {function} a function to return
44388c88e8eSopenharmony_ci * - value: string|null
44488c88e8eSopenharmony_ci * - reason(k, v, result)
44588c88e8eSopenharmony_ci */
44688c88e8eSopenharmony_civar COLOR_VALIDATOR = function COLOR_VALIDATOR(v) {
44788c88e8eSopenharmony_ci  v = (v || '').toString().trim()
44888c88e8eSopenharmony_ci
44988c88e8eSopenharmony_ci  if (v.indexOf('linear-gradient') >= 0) {
45088c88e8eSopenharmony_ci    let result = {
45188c88e8eSopenharmony_ci      values: []
45288c88e8eSopenharmony_ci    }
45388c88e8eSopenharmony_ci    let temp = LINEAR_GRADIENT_VALIDATOR(v)
45488c88e8eSopenharmony_ci    if (util.isValidValue(temp.value)) {
45588c88e8eSopenharmony_ci      let tempValue = JSON.parse(temp.value)
45688c88e8eSopenharmony_ci      result.values.push(tempValue)
45788c88e8eSopenharmony_ci      return { value: JSON.stringify(result) }
45888c88e8eSopenharmony_ci    } else {
45988c88e8eSopenharmony_ci      return temp
46088c88e8eSopenharmony_ci    }
46188c88e8eSopenharmony_ci  }
46288c88e8eSopenharmony_ci
46388c88e8eSopenharmony_ci  if (v.match(ID_REGEXP)) {
46488c88e8eSopenharmony_ci    return { value: v }
46588c88e8eSopenharmony_ci  }
46688c88e8eSopenharmony_ci
46788c88e8eSopenharmony_ci  if (v.indexOf('@') >= 0) {
46888c88e8eSopenharmony_ci    let result
46988c88e8eSopenharmony_ci    // target format "@sys.color.id_color_background" or '@sys.color.id_color_background'
47088c88e8eSopenharmony_ci    let SysResourceTypeRefReg = /['"]\s*@sys\.color\.(?<resName>\w+)\s*['"]/
47188c88e8eSopenharmony_ci    result = SysResourceTypeRefReg.exec(v)
47288c88e8eSopenharmony_ci    if (result) {
47388c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
47488c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
47588c88e8eSopenharmony_ci        return { value: "@sys.color." + OHOS_THEME_PROP_GROUPS[resourceName] }
47688c88e8eSopenharmony_ci      }
47788c88e8eSopenharmony_ci    }
47888c88e8eSopenharmony_ci    // target format "@app.color.developer_defined_color" or '@app.color.developer_defined_color'
47988c88e8eSopenharmony_ci    let AppResourceTypeRefReg = /['"]\s*@app\.color\.(?<resName>\w+)\s*['"]/
48088c88e8eSopenharmony_ci    result = AppResourceTypeRefReg.exec(v)
48188c88e8eSopenharmony_ci    if (result) {
48288c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
48388c88e8eSopenharmony_ci      if (resourceName) {
48488c88e8eSopenharmony_ci        return { value: "@app.color." + resourceName}
48588c88e8eSopenharmony_ci      }
48688c88e8eSopenharmony_ci    }
48788c88e8eSopenharmony_ci    // target format "@id_color_background" or '@id_color_background' or @id_color_background
48888c88e8eSopenharmony_ci    let ResourceRefReg = /['"]?\s*@(?<resName>\w+)\s*['"]?/
48988c88e8eSopenharmony_ci    result = ResourceRefReg.exec(v)
49088c88e8eSopenharmony_ci    if (result) {
49188c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
49288c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
49388c88e8eSopenharmony_ci        return { value: "@ohos_id_" + OHOS_THEME_PROP_GROUPS[resourceName] }
49488c88e8eSopenharmony_ci      }
49588c88e8eSopenharmony_ci    }
49688c88e8eSopenharmony_ci  }
49788c88e8eSopenharmony_ci
49888c88e8eSopenharmony_ci  if (v.match(/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/)) {
49988c88e8eSopenharmony_ci    return { value: v }
50088c88e8eSopenharmony_ci  }
50188c88e8eSopenharmony_ci
50288c88e8eSopenharmony_ci  if (v.match(/^#[0-9a-fA-F]{3}$/)) {
50388c88e8eSopenharmony_ci    return {
50488c88e8eSopenharmony_ci      value: '#' + v[1] + v[1] + v[2] + v[2] + v[3] + v[3],
50588c88e8eSopenharmony_ci      reason: function reason(k, v, result) {
50688c88e8eSopenharmony_ci        return 'NOTE: Attribute value `' + v + '` is automatically fixed to `' + result + '`.'
50788c88e8eSopenharmony_ci      }
50888c88e8eSopenharmony_ci    }
50988c88e8eSopenharmony_ci  }
51088c88e8eSopenharmony_ci
51188c88e8eSopenharmony_ci  if (EXTENDED_COLOR_KEYWORDS[v]) {
51288c88e8eSopenharmony_ci    return {
51388c88e8eSopenharmony_ci      value: EXTENDED_COLOR_KEYWORDS[v],
51488c88e8eSopenharmony_ci      reason: function reason(k, v, result) {
51588c88e8eSopenharmony_ci        return 'NOTE: Attribute value `' + v + '` is automatically fixed to `' + result + '`.'
51688c88e8eSopenharmony_ci      }
51788c88e8eSopenharmony_ci    }
51888c88e8eSopenharmony_ci  }
51988c88e8eSopenharmony_ci
52088c88e8eSopenharmony_ci  if (v === 'transparent' || v === 'none') {
52188c88e8eSopenharmony_ci    return { value: 'rgba(0,0,0,0)' }
52288c88e8eSopenharmony_ci  }
52388c88e8eSopenharmony_ci
52488c88e8eSopenharmony_ci  const returnColorReg = COLOR_REG(v)
52588c88e8eSopenharmony_ci  if (returnColorReg.value !== null) {
52688c88e8eSopenharmony_ci    return returnColorReg
52788c88e8eSopenharmony_ci  }
52888c88e8eSopenharmony_ci
52988c88e8eSopenharmony_ci  return {
53088c88e8eSopenharmony_ci    value: null,
53188c88e8eSopenharmony_ci    reason: function reason(k, v, result) {
53288c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` is invalid for the `' + util.camelCaseToHyphened(k) + '` attribute.'
53388c88e8eSopenharmony_ci    }
53488c88e8eSopenharmony_ci  }
53588c88e8eSopenharmony_ci}
53688c88e8eSopenharmony_ci
53788c88e8eSopenharmony_civar COLOR_REG = function COLOR_REG(v) {
53888c88e8eSopenharmony_ci  let arrColor, r, g, b, a
53988c88e8eSopenharmony_ci  const RGB_REGEXP = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/gi
54088c88e8eSopenharmony_ci  const RGBA_REGEXP = /^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d*\.?\d+)\s*\)$/gi
54188c88e8eSopenharmony_ci  const HSL_REGEXP = /^hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$/gi
54288c88e8eSopenharmony_ci  const HSLA_REGEXP = /^hsla\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d*\.?\d+)\s*\)$/gi
54388c88e8eSopenharmony_ci  if (arrColor = RGB_REGEXP.exec(v)) {
54488c88e8eSopenharmony_ci    r = parseInt(arrColor[1])
54588c88e8eSopenharmony_ci    g = parseInt(arrColor[2])
54688c88e8eSopenharmony_ci    b = parseInt(arrColor[3])
54788c88e8eSopenharmony_ci    if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255) {
54888c88e8eSopenharmony_ci      return { value: 'rgb(' + [r, g, b].join(',') + ')' }
54988c88e8eSopenharmony_ci    }
55088c88e8eSopenharmony_ci  }
55188c88e8eSopenharmony_ci  if (arrColor = RGBA_REGEXP.exec(v)) {
55288c88e8eSopenharmony_ci    r = parseInt(arrColor[1])
55388c88e8eSopenharmony_ci    g = parseInt(arrColor[2])
55488c88e8eSopenharmony_ci    b = parseInt(arrColor[3])
55588c88e8eSopenharmony_ci    a = parseFloat(arrColor[4])
55688c88e8eSopenharmony_ci    if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255 && a >= 0 && a <= 1) {
55788c88e8eSopenharmony_ci      return { value: 'rgba(' + [r, g, b, a].join(',') + ')' }
55888c88e8eSopenharmony_ci    }
55988c88e8eSopenharmony_ci  }
56088c88e8eSopenharmony_ci  if (arrColor = HSL_REGEXP.exec(v)) {
56188c88e8eSopenharmony_ci    r = arrColor[1]
56288c88e8eSopenharmony_ci    g = arrColor[2]
56388c88e8eSopenharmony_ci    b = arrColor[3]
56488c88e8eSopenharmony_ci    if (r >= 0 && r <= 360 && g >= 0 && g <= 100 && b >= 0 && b <= 100) {
56588c88e8eSopenharmony_ci      return { value: 'hsl(' + [r, g+'%', b+'%'].join(',') + ')' }
56688c88e8eSopenharmony_ci    }
56788c88e8eSopenharmony_ci  }
56888c88e8eSopenharmony_ci  if (arrColor = HSLA_REGEXP.exec(v)) {
56988c88e8eSopenharmony_ci    r = arrColor[1]
57088c88e8eSopenharmony_ci    g = arrColor[2]
57188c88e8eSopenharmony_ci    b = arrColor[3]
57288c88e8eSopenharmony_ci    a = arrColor[4]
57388c88e8eSopenharmony_ci    if (r >= 0 && r <= 360 && g >= 0 && g <= 100 && b >= 0 && b <= 100 && a >= 0 && a <= 1) {
57488c88e8eSopenharmony_ci      return { value: 'hsla(' + [r, g+'%', b+'%', a].join(',') + ')' }
57588c88e8eSopenharmony_ci    }
57688c88e8eSopenharmony_ci  }
57788c88e8eSopenharmony_ci
57888c88e8eSopenharmony_ci  return { value: null }
57988c88e8eSopenharmony_ci}
58088c88e8eSopenharmony_ci
58188c88e8eSopenharmony_ci/**
58288c88e8eSopenharmony_ci * the values below is valid
58388c88e8eSopenharmony_ci * - color {1,4}
58488c88e8eSopenharmony_ci *
58588c88e8eSopenharmony_ci * @param {string} v
58688c88e8eSopenharmony_ci * @return {function} a function to return
58788c88e8eSopenharmony_ci * - value: color|null
58888c88e8eSopenharmony_ci * - reason(k, v, result)
58988c88e8eSopenharmony_ci */
59088c88e8eSopenharmony_civar SHORTHAND_COLOR_VALIDATOR = function SHORTHAND_COLOR_VALIDATOR(v) {
59188c88e8eSopenharmony_ci  v = (v || '').toString().trim()
59288c88e8eSopenharmony_ci  v = v.replace(/\s*,\s+/g, ',')
59388c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, COLOR_VAR_VALIDATOR)
59488c88e8eSopenharmony_ci}
59588c88e8eSopenharmony_ci
59688c88e8eSopenharmony_civar ARRAY_COLOR_VALIDATOR = function ARRAY_COLOR_VALIDATOR(v) {
59788c88e8eSopenharmony_ci  v = (v || '').toString().trim()
59888c88e8eSopenharmony_ci  var isArray = true
59988c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v.replace(/,/g, ' '), COLOR_VAR_VALIDATOR, isArray)
60088c88e8eSopenharmony_ci}
60188c88e8eSopenharmony_ci
60288c88e8eSopenharmony_civar SHORTHAND_STYLE_VALIDATOR = function SHORTHAND_STYLE_VALIDATOR(v) {
60388c88e8eSopenharmony_ci  v = (v || '').toString().trim()
60488c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, STYLE_VALIDATOR)
60588c88e8eSopenharmony_ci}
60688c88e8eSopenharmony_ci
60788c88e8eSopenharmony_civar STYLE_VALIDATOR = function STYLE_VALIDATOR(v) {
60888c88e8eSopenharmony_ci  const styleList = ["solid", "dashed", "dotted"]
60988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
61088c88e8eSopenharmony_ci  if (styleList.includes(v)) {
61188c88e8eSopenharmony_ci    return { value:v }
61288c88e8eSopenharmony_ci  } else {
61388c88e8eSopenharmony_ci    return {
61488c88e8eSopenharmony_ci      value: null,
61588c88e8eSopenharmony_ci      reason: function (k,v) {
61688c88e8eSopenharmony_ci        return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' +
61788c88e8eSopenharmony_ci          v + '` (the support value is `' + styleList.join('`|`') + '`).'
61888c88e8eSopenharmony_ci      }
61988c88e8eSopenharmony_ci    }
62088c88e8eSopenharmony_ci  }
62188c88e8eSopenharmony_ci}
62288c88e8eSopenharmony_ci
62388c88e8eSopenharmony_civar SHORTHAND_VALIDATOR = function SHORTHAND_VALIDATOR(v, validateFunction, isArray) {
62488c88e8eSopenharmony_ci  v = (v || '').toString().trim()
62588c88e8eSopenharmony_ci  let value = []
62688c88e8eSopenharmony_ci  let reason = []
62788c88e8eSopenharmony_ci  let results = v.split(/(?<!\+|\-|\*|\/|\,)\s+(?!\+|\-|\*|\/|\,)/).map(validateFunction)
62888c88e8eSopenharmony_ci  for (let i = 0; i < results.length; ++i) {
62988c88e8eSopenharmony_ci    let res = results[i]
63088c88e8eSopenharmony_ci    if (!res.value) {
63188c88e8eSopenharmony_ci      value = null
63288c88e8eSopenharmony_ci      reason = res.reason
63388c88e8eSopenharmony_ci      break
63488c88e8eSopenharmony_ci    }
63588c88e8eSopenharmony_ci    value.push(res.value)
63688c88e8eSopenharmony_ci    if (res.reason) {
63788c88e8eSopenharmony_ci      reason.push(res.reason)
63888c88e8eSopenharmony_ci    }
63988c88e8eSopenharmony_ci  }
64088c88e8eSopenharmony_ci
64188c88e8eSopenharmony_ci  if (!value) {
64288c88e8eSopenharmony_ci    return {
64388c88e8eSopenharmony_ci      value: value,
64488c88e8eSopenharmony_ci      reason: reason
64588c88e8eSopenharmony_ci    }
64688c88e8eSopenharmony_ci  }
64788c88e8eSopenharmony_ci  else {
64888c88e8eSopenharmony_ci    return {
64988c88e8eSopenharmony_ci      value: isArray ? value.join(',') : value.join(' '),
65088c88e8eSopenharmony_ci      reason: reason.length > 0 ? function (k, v, result) {
65188c88e8eSopenharmony_ci        return reason.map(function (res) {
65288c88e8eSopenharmony_ci          if (typeof res === 'function') {
65388c88e8eSopenharmony_ci            return res(k, v, result)
65488c88e8eSopenharmony_ci          }
65588c88e8eSopenharmony_ci        }).join('\n')
65688c88e8eSopenharmony_ci      } : null
65788c88e8eSopenharmony_ci    }
65888c88e8eSopenharmony_ci  }
65988c88e8eSopenharmony_ci}
66088c88e8eSopenharmony_ci
66188c88e8eSopenharmony_civar BORDER_VALIDATOR = function BORDER_VALIDATOR (value, name) {
66288c88e8eSopenharmony_ci  value = (value || '').toString().trim();
66388c88e8eSopenharmony_ci  let values = '';
66488c88e8eSopenharmony_ci  const colorAttribute = value.match(/\(.*?\)/g);
66588c88e8eSopenharmony_ci  if (colorAttribute && colorAttribute.length === 1) {
66688c88e8eSopenharmony_ci    values = value.replace(colorAttribute[0], colorAttribute[0].replace(/\s+/g, '')).split(/\s+/);
66788c88e8eSopenharmony_ci  } else {
66888c88e8eSopenharmony_ci    values = value.split(/\s+/);
66988c88e8eSopenharmony_ci  }
67088c88e8eSopenharmony_ci  const res = []
67188c88e8eSopenharmony_ci  let hasError = false
67288c88e8eSopenharmony_ci  const reasons = []
67388c88e8eSopenharmony_ci  let index = 0
67488c88e8eSopenharmony_ci  const order = []
67588c88e8eSopenharmony_ci  let validatorResult
67688c88e8eSopenharmony_ci  const rules = [
67788c88e8eSopenharmony_ci    {
67888c88e8eSopenharmony_ci      match (item) { return LENGTH_VALIDATOR(item).value },
67988c88e8eSopenharmony_ci      action (item) {
68088c88e8eSopenharmony_ci        validatorResult = LENGTH_VALIDATOR(item)
68188c88e8eSopenharmony_ci        order.push(0)
68288c88e8eSopenharmony_ci        res.push({
68388c88e8eSopenharmony_ci          value: validatorResult.value,
68488c88e8eSopenharmony_ci          type: 'Width'
68588c88e8eSopenharmony_ci        })
68688c88e8eSopenharmony_ci      }
68788c88e8eSopenharmony_ci    },
68888c88e8eSopenharmony_ci    {
68988c88e8eSopenharmony_ci      match (item) { return validate('borderStyle', item).value },
69088c88e8eSopenharmony_ci      action (item) {
69188c88e8eSopenharmony_ci        validatorResult = validate('borderStyle', item)
69288c88e8eSopenharmony_ci        order.push(1)
69388c88e8eSopenharmony_ci        res.push({
69488c88e8eSopenharmony_ci          value: validatorResult.value,
69588c88e8eSopenharmony_ci          type: 'Style'
69688c88e8eSopenharmony_ci        })
69788c88e8eSopenharmony_ci      }
69888c88e8eSopenharmony_ci    },
69988c88e8eSopenharmony_ci    {
70088c88e8eSopenharmony_ci      match (item) { return COLOR_VAR_VALIDATOR(item).value },
70188c88e8eSopenharmony_ci      action (item) {
70288c88e8eSopenharmony_ci        validatorResult = COLOR_VAR_VALIDATOR(item)
70388c88e8eSopenharmony_ci        order.push(2)
70488c88e8eSopenharmony_ci        res.push({
70588c88e8eSopenharmony_ci          value: validatorResult.value,
70688c88e8eSopenharmony_ci          type: 'Color'
70788c88e8eSopenharmony_ci        })
70888c88e8eSopenharmony_ci      }
70988c88e8eSopenharmony_ci    },
71088c88e8eSopenharmony_ci    {
71188c88e8eSopenharmony_ci      match () { return true },
71288c88e8eSopenharmony_ci      action () {
71388c88e8eSopenharmony_ci        hasError = true
71488c88e8eSopenharmony_ci      }
71588c88e8eSopenharmony_ci    }
71688c88e8eSopenharmony_ci  ]
71788c88e8eSopenharmony_ci  if (values && values.length <= 3) {
71888c88e8eSopenharmony_ci    for (let i = 0; i < values.length; i++) {
71988c88e8eSopenharmony_ci      const item = values[i]
72088c88e8eSopenharmony_ci      for (let i = 0; i < rules.length; i++) {
72188c88e8eSopenharmony_ci        if (rules[i].match(item)) {
72288c88e8eSopenharmony_ci          rules[i].action(item)
72388c88e8eSopenharmony_ci          break;
72488c88e8eSopenharmony_ci        }
72588c88e8eSopenharmony_ci      }
72688c88e8eSopenharmony_ci      // style width color pass verification, but did not write in order, such as "1px red solid", should be error
72788c88e8eSopenharmony_ci      let orderIndex = -1
72888c88e8eSopenharmony_ci      order.forEach((item) => {
72988c88e8eSopenharmony_ci        orderIndex < item ? orderIndex = item : hasError = true
73088c88e8eSopenharmony_ci      })
73188c88e8eSopenharmony_ci      // get all warning and note log
73288c88e8eSopenharmony_ci      logUtil(validatorResult, name, item, reasons, index)
73388c88e8eSopenharmony_ci    }
73488c88e8eSopenharmony_ci    // print warning and note
73588c88e8eSopenharmony_ci    if (!hasError) {
73688c88e8eSopenharmony_ci      return {
73788c88e8eSopenharmony_ci        value: res,
73888c88e8eSopenharmony_ci        reason: reasons.length > 0 ? function (k, v) {
73988c88e8eSopenharmony_ci          return (
74088c88e8eSopenharmony_ci            logTypes[index] + ': There are some problems with value `' + v + '` of the `' +
74188c88e8eSopenharmony_ci              util.camelCaseToHyphened(k) + '` attribute. \n ' + reasons.join(' \n'))
74288c88e8eSopenharmony_ci        } : null
74388c88e8eSopenharmony_ci      }
74488c88e8eSopenharmony_ci    }
74588c88e8eSopenharmony_ci  }
74688c88e8eSopenharmony_ci  // print error
74788c88e8eSopenharmony_ci  return {
74888c88e8eSopenharmony_ci    value: null,
74988c88e8eSopenharmony_ci    reason: function reason (k, v, result) {
75088c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) +
75188c88e8eSopenharmony_ci        '` attribute does not support value `' + v +
75288c88e8eSopenharmony_ci        '` (this value does not meet the inspection standards for the width, style, and color).'
75388c88e8eSopenharmony_ci    }
75488c88e8eSopenharmony_ci  }
75588c88e8eSopenharmony_ci}
75688c88e8eSopenharmony_ci
75788c88e8eSopenharmony_cifunction logUtil (validatorResult, name, item, reasons, index) {
75888c88e8eSopenharmony_ci  if (validatorResult.reason) {
75988c88e8eSopenharmony_ci    let str = validatorResult.reason(name, item, validatorResult.value)
76088c88e8eSopenharmony_ci    const mesg = str.match(/^([A-Z]+):/)
76188c88e8eSopenharmony_ci    // When both warning and note information are included, a high severity sign is output
76288c88e8eSopenharmony_ci    const num = logTypes.indexOf(mesg[1])
76388c88e8eSopenharmony_ci    if (index < num) {
76488c88e8eSopenharmony_ci      index = num
76588c88e8eSopenharmony_ci    }
76688c88e8eSopenharmony_ci    str = str.replace(mesg[0], '')
76788c88e8eSopenharmony_ci    reasons.push(str)
76888c88e8eSopenharmony_ci  }
76988c88e8eSopenharmony_ci}
77088c88e8eSopenharmony_ci
77188c88e8eSopenharmony_civar BOX_SHADOW_VALIDATOR = function BOX_SHADOW_VALIDATOR(value, name) {
77288c88e8eSopenharmony_ci  value = (value || '').toString().trim()
77388c88e8eSopenharmony_ci  const values = value.split(/\s+/)
77488c88e8eSopenharmony_ci  let validatorResult
77588c88e8eSopenharmony_ci  const res = []
77688c88e8eSopenharmony_ci  const order = []
77788c88e8eSopenharmony_ci  const reasons = []
77888c88e8eSopenharmony_ci  let index = 0
77988c88e8eSopenharmony_ci  let ruleIndex = 0
78088c88e8eSopenharmony_ci  let hasError = false
78188c88e8eSopenharmony_ci  const rules = [
78288c88e8eSopenharmony_ci    {
78388c88e8eSopenharmony_ci      match (item) { return validate('boxShadowH', item).value },
78488c88e8eSopenharmony_ci      action (item) {
78588c88e8eSopenharmony_ci        validatorResult = validate('boxShadowH', item)
78688c88e8eSopenharmony_ci        order.push(0)
78788c88e8eSopenharmony_ci        res.push({
78888c88e8eSopenharmony_ci          value: validatorResult.value,
78988c88e8eSopenharmony_ci          type: 'H'
79088c88e8eSopenharmony_ci        })
79188c88e8eSopenharmony_ci      }
79288c88e8eSopenharmony_ci    },
79388c88e8eSopenharmony_ci    {
79488c88e8eSopenharmony_ci      match (item) { return validate('boxShadowV', item).value },
79588c88e8eSopenharmony_ci      action (item) {
79688c88e8eSopenharmony_ci        validatorResult = validate('boxShadowV', item)
79788c88e8eSopenharmony_ci        order.push(1)
79888c88e8eSopenharmony_ci        res.push({
79988c88e8eSopenharmony_ci          value: validatorResult.value,
80088c88e8eSopenharmony_ci          type: 'V'
80188c88e8eSopenharmony_ci        })
80288c88e8eSopenharmony_ci      }
80388c88e8eSopenharmony_ci    },
80488c88e8eSopenharmony_ci    {
80588c88e8eSopenharmony_ci      match (item) { return validate('boxShadowBlur', item).value },
80688c88e8eSopenharmony_ci      action (item) {
80788c88e8eSopenharmony_ci        validatorResult = validate('boxShadowBlur', item)
80888c88e8eSopenharmony_ci        order.push(2)
80988c88e8eSopenharmony_ci        res.push({
81088c88e8eSopenharmony_ci          value: validatorResult.value,
81188c88e8eSopenharmony_ci          type: 'Blur'
81288c88e8eSopenharmony_ci        })
81388c88e8eSopenharmony_ci      }
81488c88e8eSopenharmony_ci    },
81588c88e8eSopenharmony_ci    {
81688c88e8eSopenharmony_ci      match (item) { return validate('boxShadowSpread', item).value },
81788c88e8eSopenharmony_ci      action (item) {
81888c88e8eSopenharmony_ci        validatorResult = validate('boxShadowSpread', item)
81988c88e8eSopenharmony_ci        order.push(3)
82088c88e8eSopenharmony_ci        res.push({
82188c88e8eSopenharmony_ci          value: validatorResult.value,
82288c88e8eSopenharmony_ci          type: 'Spread'
82388c88e8eSopenharmony_ci        })
82488c88e8eSopenharmony_ci      }
82588c88e8eSopenharmony_ci    },
82688c88e8eSopenharmony_ci    {
82788c88e8eSopenharmony_ci      match (item) { return COLOR_VAR_VALIDATOR(item).value },
82888c88e8eSopenharmony_ci      action (item) {
82988c88e8eSopenharmony_ci        validatorResult = COLOR_VAR_VALIDATOR(item)
83088c88e8eSopenharmony_ci        order.push(4)
83188c88e8eSopenharmony_ci        res.push({
83288c88e8eSopenharmony_ci          value: validatorResult.value,
83388c88e8eSopenharmony_ci          type: 'Color'
83488c88e8eSopenharmony_ci        })
83588c88e8eSopenharmony_ci      }
83688c88e8eSopenharmony_ci    }
83788c88e8eSopenharmony_ci  ]
83888c88e8eSopenharmony_ci  const length = values.length
83988c88e8eSopenharmony_ci  const flag = (length <= 6 && length >= 2) && values[0].match(LENGTH_REGEXP) && values[1].match(LENGTH_REGEXP)
84088c88e8eSopenharmony_ci  if (values && flag) {
84188c88e8eSopenharmony_ci    for (let i = 0; i < values.length; i++) {
84288c88e8eSopenharmony_ci      const item = values[i]
84388c88e8eSopenharmony_ci      for (let j = ruleIndex; j < rules.length; j++) {
84488c88e8eSopenharmony_ci        if (rules[j].match(item)) {
84588c88e8eSopenharmony_ci          ruleIndex++
84688c88e8eSopenharmony_ci          rules[j].action(item)
84788c88e8eSopenharmony_ci          break
84888c88e8eSopenharmony_ci        }
84988c88e8eSopenharmony_ci      }
85088c88e8eSopenharmony_ci      let orderIndex = -1
85188c88e8eSopenharmony_ci      order.forEach((item) => {
85288c88e8eSopenharmony_ci        orderIndex < item ? orderIndex = item : hasError = true
85388c88e8eSopenharmony_ci      })
85488c88e8eSopenharmony_ci      // get all warning and note log
85588c88e8eSopenharmony_ci      logUtil(validatorResult, name, item, reasons, index)
85688c88e8eSopenharmony_ci    }
85788c88e8eSopenharmony_ci    if (!hasError) {
85888c88e8eSopenharmony_ci      return {
85988c88e8eSopenharmony_ci        value: res,
86088c88e8eSopenharmony_ci        reason: reasons.length > 0 ? function (k, v) {
86188c88e8eSopenharmony_ci          return (
86288c88e8eSopenharmony_ci            logTypes[index] + ': There are some problems with value `' + v +
86388c88e8eSopenharmony_ci              '` of the `' + util.camelCaseToHyphened(k) + '` attribute. \n ' + reasons.join(' \n'))
86488c88e8eSopenharmony_ci        } : null
86588c88e8eSopenharmony_ci      }
86688c88e8eSopenharmony_ci    }
86788c88e8eSopenharmony_ci  }
86888c88e8eSopenharmony_ci  return {
86988c88e8eSopenharmony_ci    value: null,
87088c88e8eSopenharmony_ci    reason: function reason (k, v, result) {
87188c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) +
87288c88e8eSopenharmony_ci        '` attribute does not support value `' + v +
87388c88e8eSopenharmony_ci        '` (this value does not meet the inspection standards).'
87488c88e8eSopenharmony_ci    }
87588c88e8eSopenharmony_ci  }
87688c88e8eSopenharmony_ci}
87788c88e8eSopenharmony_ci
87888c88e8eSopenharmony_ci/**
87988c88e8eSopenharmony_ci * only integer or float value is valid
88088c88e8eSopenharmony_ci *
88188c88e8eSopenharmony_ci * @param {string} v
88288c88e8eSopenharmony_ci * @return {function} a function to return
88388c88e8eSopenharmony_ci * - value: number|null
88488c88e8eSopenharmony_ci * - reason(k, v, result)
88588c88e8eSopenharmony_ci */
88688c88e8eSopenharmony_civar NUMBER_VALIDATOR = function NUMBER_VALIDATOR(v, isInt) {
88788c88e8eSopenharmony_ci  v = (v || '').toString().trim()
88888c88e8eSopenharmony_ci
88988c88e8eSopenharmony_ci  if (v.match(ID_REGEXP)) {
89088c88e8eSopenharmony_ci    return { value: v }
89188c88e8eSopenharmony_ci  }
89288c88e8eSopenharmony_ci
89388c88e8eSopenharmony_ci  var match = v.match(LENGTH_REGEXP)
89488c88e8eSopenharmony_ci
89588c88e8eSopenharmony_ci  if (match && !match[1]) {
89688c88e8eSopenharmony_ci    return { value: isInt === true ? parseInt(v, 10) : parseFloat(v) }
89788c88e8eSopenharmony_ci  }
89888c88e8eSopenharmony_ci
89988c88e8eSopenharmony_ci  if (v.indexOf('@') >= 0) {
90088c88e8eSopenharmony_ci    let result
90188c88e8eSopenharmony_ci    // target format "@sys.float.id_sys_number" or '@sys.float.id_sys_number'
90288c88e8eSopenharmony_ci    let SysResourceTypeRefReg = /['"]\s*@sys\.float\.(?<resName>\w+)\s*['"]/
90388c88e8eSopenharmony_ci    result = SysResourceTypeRefReg.exec(v)
90488c88e8eSopenharmony_ci    if (result) {
90588c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
90688c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
90788c88e8eSopenharmony_ci        return { value: "@sys.float." + OHOS_THEME_PROP_GROUPS[resourceName] }
90888c88e8eSopenharmony_ci      }
90988c88e8eSopenharmony_ci    }
91088c88e8eSopenharmony_ci    // target format "@app.float.developer_defined_number" or '@app.float.developer_defined_number'
91188c88e8eSopenharmony_ci    let AppResourceTypeRefReg = /['"]\s*@app\.float\.(?<resName>\w+)\s*['"]/
91288c88e8eSopenharmony_ci    result = AppResourceTypeRefReg.exec(v)
91388c88e8eSopenharmony_ci    if (result) {
91488c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
91588c88e8eSopenharmony_ci      if (resourceName) {
91688c88e8eSopenharmony_ci        return { value: "@app.float." + resourceName}
91788c88e8eSopenharmony_ci      }
91888c88e8eSopenharmony_ci    }
91988c88e8eSopenharmony_ci    // target format "@id_sys_number" or '@id_sys_number' or @id_sys_number
92088c88e8eSopenharmony_ci    let ResourceRefReg = /['"]?\s*@(?<resName>\w+)\s*['"]?/
92188c88e8eSopenharmony_ci    result = ResourceRefReg.exec(v)
92288c88e8eSopenharmony_ci    if (result) {
92388c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
92488c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
92588c88e8eSopenharmony_ci        return { value: "@ohos_id_" + OHOS_THEME_PROP_GROUPS[resourceName] }
92688c88e8eSopenharmony_ci      }
92788c88e8eSopenharmony_ci    }
92888c88e8eSopenharmony_ci  }
92988c88e8eSopenharmony_ci
93088c88e8eSopenharmony_ci  return {
93188c88e8eSopenharmony_ci    value: null,
93288c88e8eSopenharmony_ci    reason: function reason(k, v, result) {
93388c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) +
93488c88e8eSopenharmony_ci        '` attribute does not support value `' + v + '` (only numbers are supported).'
93588c88e8eSopenharmony_ci    }
93688c88e8eSopenharmony_ci  }
93788c88e8eSopenharmony_ci}
93888c88e8eSopenharmony_ci
93988c88e8eSopenharmony_civar ARRAY_NUMBER_VALIDATOR = function ARRAY_NUMBER_VALIDATOR(v) {
94088c88e8eSopenharmony_ci  v = (v || '').toString().trim().replace(/,/g, ' ')
94188c88e8eSopenharmony_ci  var isArray = true
94288c88e8eSopenharmony_ci  return SHORTHAND_VALIDATOR(v, NUMBER_VALIDATOR, isArray)
94388c88e8eSopenharmony_ci}
94488c88e8eSopenharmony_ci
94588c88e8eSopenharmony_ci/**
94688c88e8eSopenharmony_ci * only integer value is valid
94788c88e8eSopenharmony_ci *
94888c88e8eSopenharmony_ci * @param {string} v
94988c88e8eSopenharmony_ci * @return {function} a function to return
95088c88e8eSopenharmony_ci * - value: number|null
95188c88e8eSopenharmony_ci * - reason(k, v, result)
95288c88e8eSopenharmony_ci */
95388c88e8eSopenharmony_civar INTEGER_VALIDATOR = function INTEGER_VALIDATOR(v) {
95488c88e8eSopenharmony_ci  return NUMBER_VALIDATOR(v, true)
95588c88e8eSopenharmony_ci}
95688c88e8eSopenharmony_ci
95788c88e8eSopenharmony_ci/**
95888c88e8eSopenharmony_ci * transition-property: only css property is valid
95988c88e8eSopenharmony_ci *
96088c88e8eSopenharmony_ci * @param {string} v
96188c88e8eSopenharmony_ci * @return {function} a function to return
96288c88e8eSopenharmony_ci * - value: string|null
96388c88e8eSopenharmony_ci * - reason(k, v, result)
96488c88e8eSopenharmony_ci */
96588c88e8eSopenharmony_civar TRANSITION_PROPERTY_VALIDATOR = function TRANSITION_PROPERTY_VALIDATOR(v) {
96688c88e8eSopenharmony_ci  v = (v || '').toString()
96788c88e8eSopenharmony_ci  v = v.split(/\s*,\s*/).map(util.hyphenedToCamelCase).join(',')
96888c88e8eSopenharmony_ci
96988c88e8eSopenharmony_ci  if (v.split(/\s*,\s*/).every(p => !!validatorMap[p])) {
97088c88e8eSopenharmony_ci    return {value: v}
97188c88e8eSopenharmony_ci  }
97288c88e8eSopenharmony_ci
97388c88e8eSopenharmony_ci  return {
97488c88e8eSopenharmony_ci    value: null,
97588c88e8eSopenharmony_ci    reason: function reason(k, v, result) {
97688c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' +
97788c88e8eSopenharmony_ci        v + '` (only CSS attributes support this value).'
97888c88e8eSopenharmony_ci    }
97988c88e8eSopenharmony_ci  }
98088c88e8eSopenharmony_ci}
98188c88e8eSopenharmony_ci
98288c88e8eSopenharmony_ci/**
98388c88e8eSopenharmony_ci * transition-duration & transition-delay: only number of seconds or milliseconds is valid
98488c88e8eSopenharmony_ci *
98588c88e8eSopenharmony_ci * @param {string} v
98688c88e8eSopenharmony_ci * @return {function} a function to return
98788c88e8eSopenharmony_ci * - value: number|null
98888c88e8eSopenharmony_ci * - reason(k, v, result)
98988c88e8eSopenharmony_ci */
99088c88e8eSopenharmony_civar TRANSITION_INTERVAL_VALIDATOR = function TRANSITION_INTERVAL_VALIDATOR(v) {
99188c88e8eSopenharmony_ci  v = (v || 0).toString()
99288c88e8eSopenharmony_ci  var match, num, ret
99388c88e8eSopenharmony_ci
99488c88e8eSopenharmony_ci  if (match = v.match(/^\d*\.?\d+(ms|s)?$/)) {
99588c88e8eSopenharmony_ci    num = parseFloat(match[0])
99688c88e8eSopenharmony_ci    if (!match[1]) {
99788c88e8eSopenharmony_ci      ret = {value: parseInt(num)}
99888c88e8eSopenharmony_ci    }
99988c88e8eSopenharmony_ci    else {
100088c88e8eSopenharmony_ci      if (match[1] === 's') {
100188c88e8eSopenharmony_ci        num *= 1000
100288c88e8eSopenharmony_ci      }
100388c88e8eSopenharmony_ci      ret = {
100488c88e8eSopenharmony_ci        value: parseInt(num),
100588c88e8eSopenharmony_ci        reason: function reason(k, v, result) {
100688c88e8eSopenharmony_ci          return 'NOTE: Attribute value `' + v + '` is automatically fixed to `' + result + '`.'
100788c88e8eSopenharmony_ci        }
100888c88e8eSopenharmony_ci      }
100988c88e8eSopenharmony_ci    }
101088c88e8eSopenharmony_ci    return ret
101188c88e8eSopenharmony_ci  }
101288c88e8eSopenharmony_ci
101388c88e8eSopenharmony_ci  return {
101488c88e8eSopenharmony_ci    value: null,
101588c88e8eSopenharmony_ci    reason: function reason(k, v, result) {
101688c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' +
101788c88e8eSopenharmony_ci        v + '` (only seconds and milliseconds are supported).'
101888c88e8eSopenharmony_ci    }
101988c88e8eSopenharmony_ci  }
102088c88e8eSopenharmony_ci}
102188c88e8eSopenharmony_ci
102288c88e8eSopenharmony_ci/**
102388c88e8eSopenharmony_ci * transition-timing-function: only linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n) is valid
102488c88e8eSopenharmony_ci *
102588c88e8eSopenharmony_ci * @param {string} v
102688c88e8eSopenharmony_ci * @return {function} a function to return
102788c88e8eSopenharmony_ci * - value: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n)|null
102888c88e8eSopenharmony_ci * - reason(k, v, result)
102988c88e8eSopenharmony_ci */
103088c88e8eSopenharmony_civar TRANSITION_TIMING_FUNCTION_VALIDATOR = function TRANSITION_TIMING_FUNCTION_VALIDATOR(v) {
103188c88e8eSopenharmony_ci  v = (v || '').toString()
103288c88e8eSopenharmony_ci
103388c88e8eSopenharmony_ci  if (v.match(/^linear|ease|ease-in|ease-out|ease-in-out|fast-out-slow-in|linear-out-slow-in$/) ||
103488c88e8eSopenharmony_ci    v.match(/^fast-out-linear-in|friction|extreme-deceleration|sharp|rhythm|smooth$/)) {
103588c88e8eSopenharmony_ci    return {value: v}
103688c88e8eSopenharmony_ci  }
103788c88e8eSopenharmony_ci
103888c88e8eSopenharmony_ci  let match, ret
103988c88e8eSopenharmony_ci  let NUM_REGEXP = /^[-]?\d*\.?\d+$/
104088c88e8eSopenharmony_ci  if (match = v.match(/^cubic-bezier\(\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*\)$/)) {
104188c88e8eSopenharmony_ci    /* istanbul ignore else */
104288c88e8eSopenharmony_ci    if (match[1].match(NUM_REGEXP) && match[2].match(NUM_REGEXP) &&
104388c88e8eSopenharmony_ci      match[3].match(NUM_REGEXP) && match[4].match(NUM_REGEXP)) {
104488c88e8eSopenharmony_ci      ret = [parseFloat(match[1]), parseFloat(match[2]), parseFloat(match[3]), parseFloat(match[4])].join(',')
104588c88e8eSopenharmony_ci      return {value: 'cubic-bezier(' + ret + ')'}
104688c88e8eSopenharmony_ci    }
104788c88e8eSopenharmony_ci  }
104888c88e8eSopenharmony_ci
104988c88e8eSopenharmony_ci  // check steps
105088c88e8eSopenharmony_ci  if (match = v.match(/^steps\(\s*([\d]*)\s*(,\s*(start|end)\s*){0,1}\)$/)) {
105188c88e8eSopenharmony_ci    var stepCnt = parseFloat(match[1]);
105288c88e8eSopenharmony_ci    if (stepCnt > 0) {
105388c88e8eSopenharmony_ci      if (match[3] === undefined) {
105488c88e8eSopenharmony_ci        ret = stepCnt;
105588c88e8eSopenharmony_ci      } else {
105688c88e8eSopenharmony_ci        ret = [stepCnt, match[3]].join(',')
105788c88e8eSopenharmony_ci      }
105888c88e8eSopenharmony_ci      return {value: 'steps(' + ret + ')'}
105988c88e8eSopenharmony_ci    }
106088c88e8eSopenharmony_ci  }
106188c88e8eSopenharmony_ci
106288c88e8eSopenharmony_ci  return {
106388c88e8eSopenharmony_ci    value: null,
106488c88e8eSopenharmony_ci    reason: function reason(k, v, result) {
106588c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' + v +
106688c88e8eSopenharmony_ci             '` (supported values include `linear`, `ease`, `ease-in`, `ease-out`, `ease-in-out`,' +
106788c88e8eSopenharmony_ci             ' `cubic-bezier(n,n,n,n)` and `steps(n[, start|end])`).'
106888c88e8eSopenharmony_ci    }
106988c88e8eSopenharmony_ci  }
107088c88e8eSopenharmony_ci}
107188c88e8eSopenharmony_ci
107288c88e8eSopenharmony_cifunction parseAnimationOption(key, option, style)
107388c88e8eSopenharmony_ci{
107488c88e8eSopenharmony_ci   var subResult = validate(key, option)
107588c88e8eSopenharmony_ci   if (subResult.value) {
107688c88e8eSopenharmony_ci       style[key] = subResult.value
107788c88e8eSopenharmony_ci       return true
107888c88e8eSopenharmony_ci   }
107988c88e8eSopenharmony_ci    return false
108088c88e8eSopenharmony_ci}
108188c88e8eSopenharmony_ci
108288c88e8eSopenharmony_cifunction parseSimpleAnimation(style, animation) {
108388c88e8eSopenharmony_ci    // init default animation brief value
108488c88e8eSopenharmony_ci    Object.assign(style, DEFAULT_ANIMATION)
108588c88e8eSopenharmony_ci    let options = animation.trim().replace(/,\s+/g, ",").split(/\s+/)
108688c88e8eSopenharmony_ci    let durationIdx = NaN
108788c88e8eSopenharmony_ci    let delayIdx = NaN
108888c88e8eSopenharmony_ci    let directionIdx = NaN
108988c88e8eSopenharmony_ci    let timingIdx = NaN
109088c88e8eSopenharmony_ci    let playStateIdx = NaN
109188c88e8eSopenharmony_ci    let iterationIdx = NaN
109288c88e8eSopenharmony_ci    let fillModeIdx = NaN
109388c88e8eSopenharmony_ci    for (let idx in options) {
109488c88e8eSopenharmony_ci        const option = options[idx]
109588c88e8eSopenharmony_ci        if (isNaN(timingIdx) && parseAnimationOption('animationTimingFunction', option, style)) {
109688c88e8eSopenharmony_ci            timingIdx = idx
109788c88e8eSopenharmony_ci            continue
109888c88e8eSopenharmony_ci        }
109988c88e8eSopenharmony_ci        if (isNaN(directionIdx) && parseAnimationOption('animationDirection', option, style)) {
110088c88e8eSopenharmony_ci            directionIdx = idx
110188c88e8eSopenharmony_ci            continue
110288c88e8eSopenharmony_ci        }
110388c88e8eSopenharmony_ci        if (isNaN(playStateIdx) && parseAnimationOption('animationPlayState', option, style)) {
110488c88e8eSopenharmony_ci            playStateIdx = idx
110588c88e8eSopenharmony_ci            continue
110688c88e8eSopenharmony_ci        }
110788c88e8eSopenharmony_ci        if (isNaN(iterationIdx) && parseAnimationOption('animationIterationCount', option, style)) {
110888c88e8eSopenharmony_ci            iterationIdx = idx
110988c88e8eSopenharmony_ci            continue
111088c88e8eSopenharmony_ci        }
111188c88e8eSopenharmony_ci        if (isNaN(fillModeIdx) && parseAnimationOption('animationFillMode', option, style)) {
111288c88e8eSopenharmony_ci            fillModeIdx = idx
111388c88e8eSopenharmony_ci            continue
111488c88e8eSopenharmony_ci        }
111588c88e8eSopenharmony_ci        if (isNaN(durationIdx) && parseAnimationOption('animationDuration', option, style)) {
111688c88e8eSopenharmony_ci            durationIdx = idx
111788c88e8eSopenharmony_ci            continue
111888c88e8eSopenharmony_ci        }
111988c88e8eSopenharmony_ci        if (isNaN(delayIdx) && parseAnimationOption('animationDelay', option, style)) {
112088c88e8eSopenharmony_ci            delayIdx = idx
112188c88e8eSopenharmony_ci            continue
112288c88e8eSopenharmony_ci        }
112388c88e8eSopenharmony_ci    }
112488c88e8eSopenharmony_ci    delete options[durationIdx]
112588c88e8eSopenharmony_ci    delete options[delayIdx]
112688c88e8eSopenharmony_ci    delete options[directionIdx]
112788c88e8eSopenharmony_ci    delete options[timingIdx]
112888c88e8eSopenharmony_ci    delete options[playStateIdx]
112988c88e8eSopenharmony_ci    delete options[iterationIdx]
113088c88e8eSopenharmony_ci    delete options[fillModeIdx]
113188c88e8eSopenharmony_ci    options = options.filter(res => { return !(res === 'undefined') })
113288c88e8eSopenharmony_ci    if (options.length === 1) {
113388c88e8eSopenharmony_ci       if (!parseAnimationOption('animationName', options[0], style)) {
113488c88e8eSopenharmony_ci           return false
113588c88e8eSopenharmony_ci       }
113688c88e8eSopenharmony_ci       return true
113788c88e8eSopenharmony_ci    } else if (options.length > 1) {
113888c88e8eSopenharmony_ci        return false
113988c88e8eSopenharmony_ci    } else {
114088c88e8eSopenharmony_ci        // use default.
114188c88e8eSopenharmony_ci        return true
114288c88e8eSopenharmony_ci    }
114388c88e8eSopenharmony_ci}
114488c88e8eSopenharmony_ci
114588c88e8eSopenharmony_civar ANIMATION_VALIDATOR = function ANIMATION_VALIDATOR(v) {
114688c88e8eSopenharmony_ci    var style = {}
114788c88e8eSopenharmony_ci    if (parseSimpleAnimation(style, v)) {
114888c88e8eSopenharmony_ci        return {value: style}
114988c88e8eSopenharmony_ci    } else {
115088c88e8eSopenharmony_ci        return {
115188c88e8eSopenharmony_ci            value: null,
115288c88e8eSopenharmony_ci            reason: function reason(k, v, result) {
115388c88e8eSopenharmony_ci                return 'ERROR: animation is invalid'
115488c88e8eSopenharmony_ci            }
115588c88e8eSopenharmony_ci        }
115688c88e8eSopenharmony_ci    }
115788c88e8eSopenharmony_ci}
115888c88e8eSopenharmony_ci
115988c88e8eSopenharmony_civar TRANSFORM_VALIDATOR = function TRANSFORM_VALIDATOR(v) {
116088c88e8eSopenharmony_ci  v = (v || '').toString().trim()
116188c88e8eSopenharmony_ci  if (v.match(/^none$/)) {
116288c88e8eSopenharmony_ci    return { value: JSON.stringify({}) }
116388c88e8eSopenharmony_ci  }
116488c88e8eSopenharmony_ci  const values = []
116588c88e8eSopenharmony_ci  TRANSFORM_REGEXP.lastIndex = 0
116688c88e8eSopenharmony_ci  while (true) {
116788c88e8eSopenharmony_ci    let matchValue = TRANSFORM_REGEXP.exec(v)
116888c88e8eSopenharmony_ci    if (!matchValue) {
116988c88e8eSopenharmony_ci      break
117088c88e8eSopenharmony_ci    }
117188c88e8eSopenharmony_ci    values.push(v.slice(matchValue.index, TRANSFORM_REGEXP.lastIndex))
117288c88e8eSopenharmony_ci  }
117388c88e8eSopenharmony_ci  if (!values.length) {
117488c88e8eSopenharmony_ci    return {
117588c88e8eSopenharmony_ci      value: null,
117688c88e8eSopenharmony_ci      reason: function reason(k, v) {
117788c88e8eSopenharmony_ci        return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' + v + '`.'
117888c88e8eSopenharmony_ci      }
117988c88e8eSopenharmony_ci    }
118088c88e8eSopenharmony_ci  }
118188c88e8eSopenharmony_ci  let result = {}
118288c88e8eSopenharmony_ci  let reasonMaps = []
118388c88e8eSopenharmony_ci  let allLength = 0
118488c88e8eSopenharmony_ci  values.forEach(function(v) {
118588c88e8eSopenharmony_ci    let length = 0
118688c88e8eSopenharmony_ci    let match = v.match(TRANSFORM_ITEM_REGEXP)
118788c88e8eSopenharmony_ci    if (match) {
118888c88e8eSopenharmony_ci      let firstValue = match[1]
118988c88e8eSopenharmony_ci      let secondValue = match[2]
119088c88e8eSopenharmony_ci      let checkFuntion = transformValidatorMap[firstValue]
119188c88e8eSopenharmony_ci      if (typeof checkFuntion == 'function') {
119288c88e8eSopenharmony_ci        var checkResult = checkFuntion(secondValue)
119388c88e8eSopenharmony_ci        if (typeof checkResult.value == 'number' || typeof checkResult.value == 'string') {
119488c88e8eSopenharmony_ci          result[firstValue] = checkResult.value
119588c88e8eSopenharmony_ci        }
119688c88e8eSopenharmony_ci        let check = checkReason(checkResult, firstValue, secondValue, length)
119788c88e8eSopenharmony_ci        length = check.length
119888c88e8eSopenharmony_ci        if (check.realReason) {
119988c88e8eSopenharmony_ci          reasonMaps.push(check.realReason)
120088c88e8eSopenharmony_ci        }
120188c88e8eSopenharmony_ci      } else {
120288c88e8eSopenharmony_ci        length = 2
120388c88e8eSopenharmony_ci        reasonMaps.push('property `' + firstValue + '` is invalid.')
120488c88e8eSopenharmony_ci      }
120588c88e8eSopenharmony_ci    } else {
120688c88e8eSopenharmony_ci      length = 2
120788c88e8eSopenharmony_ci      reasonMaps.push('property value `' + v + '` is invalid.')
120888c88e8eSopenharmony_ci    }
120988c88e8eSopenharmony_ci    if (allLength < length) {
121088c88e8eSopenharmony_ci      allLength = length
121188c88e8eSopenharmony_ci    }
121288c88e8eSopenharmony_ci  })
121388c88e8eSopenharmony_ci  return {
121488c88e8eSopenharmony_ci    value: result ? JSON.stringify(result) : null,
121588c88e8eSopenharmony_ci    reason: reasonMaps.length > 0 ?
121688c88e8eSopenharmony_ci      function(k, v) {
121788c88e8eSopenharmony_ci        return logTypes[allLength] + ': Value `' + v + '` of the `' +
121888c88e8eSopenharmony_ci          util.camelCaseToHyphened(k) + '` attribute is incorrect. \n ' + reasonMaps.join(' \n ')
121988c88e8eSopenharmony_ci      } : null
122088c88e8eSopenharmony_ci  }
122188c88e8eSopenharmony_ci}
122288c88e8eSopenharmony_ci
122388c88e8eSopenharmony_civar MULTIPLE_PERCENTAGE_LENGTH_VALIDATOR = function MULTIPLE_PERCENTAGE_LENGTH_VALIDATOR(v) {
122488c88e8eSopenharmony_ci  v = (v || '').toString().trim()
122588c88e8eSopenharmony_ci  return MULTIPLE_POSITION_VALIDATOR(v, PERCENTAGE_LENGTH_VALIDATOR)
122688c88e8eSopenharmony_ci}
122788c88e8eSopenharmony_ci
122888c88e8eSopenharmony_civar MULTIPLE_NUMBER_VALIDATOR = function MULTIPLE_NUMBER_VALIDATOR(v) {
122988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
123088c88e8eSopenharmony_ci  return MULTIPLE_POSITION_VALIDATOR(v, NUMBER_VALIDATOR)
123188c88e8eSopenharmony_ci}
123288c88e8eSopenharmony_ci
123388c88e8eSopenharmony_civar MUTIPLE_ANGLE_VALIDATOR = function MUTIPLE_ANGLE_VALIDATOR(v) {
123488c88e8eSopenharmony_ci  v = (v || '').toString().trim()
123588c88e8eSopenharmony_ci  return MULTIPLE_POSITION_VALIDATOR(v, ANGLE_VALIDATOR)
123688c88e8eSopenharmony_ci}
123788c88e8eSopenharmony_ci
123888c88e8eSopenharmony_civar ROTATE3D_VALIDATOR = function ROTATE3D_VALIDATOR(v) {
123988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
124088c88e8eSopenharmony_ci  let values = v.split(/,/g)
124188c88e8eSopenharmony_ci  if (values && values.length > 0) {
124288c88e8eSopenharmony_ci    let resultValues = []
124388c88e8eSopenharmony_ci    let childResult = void 0
124488c88e8eSopenharmony_ci    let reasonMaps = []
124588c88e8eSopenharmony_ci    let length = 0
124688c88e8eSopenharmony_ci    if (values.length != 4) {
124788c88e8eSopenharmony_ci      length = 2
124888c88e8eSopenharmony_ci      reasonMaps.push('The number of properties is 4, value ' + values + ' is incorrect.')
124988c88e8eSopenharmony_ci    } else {
125088c88e8eSopenharmony_ci      values.forEach(function (value, index) {
125188c88e8eSopenharmony_ci        if (index < 3) {
125288c88e8eSopenharmony_ci          childResult = NUMBER_VALIDATOR(value)
125388c88e8eSopenharmony_ci        } else {
125488c88e8eSopenharmony_ci          childResult = ANGLE_VALIDATOR(value)
125588c88e8eSopenharmony_ci        }
125688c88e8eSopenharmony_ci        if (typeof childResult.value == 'number' || typeof childResult.value == 'string') {
125788c88e8eSopenharmony_ci          resultValues.push(childResult.value)
125888c88e8eSopenharmony_ci        }
125988c88e8eSopenharmony_ci        let check = checkReason(childResult, index.toString(), value, length)
126088c88e8eSopenharmony_ci        length = check.length
126188c88e8eSopenharmony_ci        if (check.realReason !== null) {
126288c88e8eSopenharmony_ci          reasonMaps.push(check.realReason)
126388c88e8eSopenharmony_ci        }
126488c88e8eSopenharmony_ci      })
126588c88e8eSopenharmony_ci    }
126688c88e8eSopenharmony_ci
126788c88e8eSopenharmony_ci    return {
126888c88e8eSopenharmony_ci      value: length < 2 ? resultValues.join(' ') : null,
126988c88e8eSopenharmony_ci      reason: reasonMaps.length > 0 ?
127088c88e8eSopenharmony_ci        function (k, v) {
127188c88e8eSopenharmony_ci          return logTypes[length] + ': Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
127288c88e8eSopenharmony_ci            '` attribute is incorrect. \n ' + reasonMaps.join(' \n ')
127388c88e8eSopenharmony_ci        } : null
127488c88e8eSopenharmony_ci    }
127588c88e8eSopenharmony_ci  }
127688c88e8eSopenharmony_ci}
127788c88e8eSopenharmony_ci
127888c88e8eSopenharmony_civar MULTIPLE_POSITION_VALIDATOR = function MULTIPLE_POSITION_VALIDATOR(v, validateFunction) {
127988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
128088c88e8eSopenharmony_ci  let values = v.split(/,/g)
128188c88e8eSopenharmony_ci  if (values && values.length > 0) {
128288c88e8eSopenharmony_ci    let resultValues = []
128388c88e8eSopenharmony_ci    let childResult = void 0
128488c88e8eSopenharmony_ci    let reasonMaps = []
128588c88e8eSopenharmony_ci    let length = 0
128688c88e8eSopenharmony_ci    if (values.length > 16) {
128788c88e8eSopenharmony_ci      length = 2
128888c88e8eSopenharmony_ci      reasonMaps.push('The maximum number of properties is 16, value ' + values + ' is incorrect.')
128988c88e8eSopenharmony_ci    }
129088c88e8eSopenharmony_ci    values.forEach(function (value, index) {
129188c88e8eSopenharmony_ci      childResult = validateFunction(value)
129288c88e8eSopenharmony_ci      if (typeof childResult.value == 'number' || typeof childResult.value == 'string') {
129388c88e8eSopenharmony_ci        resultValues.push(childResult.value)
129488c88e8eSopenharmony_ci      }
129588c88e8eSopenharmony_ci      let check = checkReason(childResult, index.toString(), value, length)
129688c88e8eSopenharmony_ci      length = check.length
129788c88e8eSopenharmony_ci      if (check.realReason !== null) {
129888c88e8eSopenharmony_ci        reasonMaps.push(check.realReason)
129988c88e8eSopenharmony_ci      }
130088c88e8eSopenharmony_ci    })
130188c88e8eSopenharmony_ci    return {
130288c88e8eSopenharmony_ci      value: length < 2 ? resultValues.join(' ') : null,
130388c88e8eSopenharmony_ci      reason: reasonMaps.length > 0 ?
130488c88e8eSopenharmony_ci        function (k, v) {
130588c88e8eSopenharmony_ci          return logTypes[length] + ': Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
130688c88e8eSopenharmony_ci            '` attribute is incorrect. \n ' + reasonMaps.join(' \n ')
130788c88e8eSopenharmony_ci        } : null
130888c88e8eSopenharmony_ci    }
130988c88e8eSopenharmony_ci  }
131088c88e8eSopenharmony_ci}
131188c88e8eSopenharmony_ci
131288c88e8eSopenharmony_ci/**
131388c88e8eSopenharmony_ci * generate a function to check whether a value is in `list`
131488c88e8eSopenharmony_ci * - first value: default, could be removed
131588c88e8eSopenharmony_ci * - not in `list`: incorrect
131688c88e8eSopenharmony_ci *
131788c88e8eSopenharmony_ci * @param  {Array} list
131888c88e8eSopenharmony_ci * @return {function} a function(v) which returns a function to return
131988c88e8eSopenharmony_ci * - value: string|null
132088c88e8eSopenharmony_ci * - reason(k, v, result)
132188c88e8eSopenharmony_ci */
132288c88e8eSopenharmony_cifunction genEnumValidator(list) {
132388c88e8eSopenharmony_ci  return function ENUM_VALIDATOR(v, name) {
132488c88e8eSopenharmony_ci    v = (v || '').toString().trim()
132588c88e8eSopenharmony_ci    if (v.match(ID_REGEXP)) {
132688c88e8eSopenharmony_ci      return {value: v}
132788c88e8eSopenharmony_ci    }
132888c88e8eSopenharmony_ci
132988c88e8eSopenharmony_ci    var index = list.indexOf(v)
133088c88e8eSopenharmony_ci    if (index > 0) {
133188c88e8eSopenharmony_ci      return {value: v}
133288c88e8eSopenharmony_ci    }
133388c88e8eSopenharmony_ci    if (index === 0) {
133488c88e8eSopenharmony_ci      return {
133588c88e8eSopenharmony_ci        value: v,
133688c88e8eSopenharmony_ci        reason: name !== 'objectFit' ?
133788c88e8eSopenharmony_ci          function reason(k, v, result) {
133888c88e8eSopenharmony_ci            return 'NOTE: Value `' + v + '` is the default value of the `' + util.camelCaseToHyphened(k) +
133988c88e8eSopenharmony_ci              '` attribute (the value can be removed).'
134088c88e8eSopenharmony_ci          } : null
134188c88e8eSopenharmony_ci      }
134288c88e8eSopenharmony_ci    }
134388c88e8eSopenharmony_ci    else {
134488c88e8eSopenharmony_ci      return {
134588c88e8eSopenharmony_ci        value: null,
134688c88e8eSopenharmony_ci        reason: function reason(k, v, result) {
134788c88e8eSopenharmony_ci          return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' + v +
134888c88e8eSopenharmony_ci            '` (the supported value is `' + list.join('`|`') + '`).'
134988c88e8eSopenharmony_ci        }
135088c88e8eSopenharmony_ci      }
135188c88e8eSopenharmony_ci    }
135288c88e8eSopenharmony_ci  }
135388c88e8eSopenharmony_ci}
135488c88e8eSopenharmony_ci
135588c88e8eSopenharmony_civar MASK_VALIDATOR = function MASK_VALIDATOR(v) {
135688c88e8eSopenharmony_ci  if (v.indexOf('url') >= 0) {
135788c88e8eSopenharmony_ci      return URL_VALIDATOR(v)
135888c88e8eSopenharmony_ci  } else {
135988c88e8eSopenharmony_ci      return BACKGROUND_VALIDATOR(v)
136088c88e8eSopenharmony_ci  }
136188c88e8eSopenharmony_ci}
136288c88e8eSopenharmony_ci
136388c88e8eSopenharmony_civar BACKGROUND_VALIDATOR = function BACKGROUND_VALIDATOR(v) {
136488c88e8eSopenharmony_ci  v = (v || '').toString().trim()
136588c88e8eSopenharmony_ci  if (v.indexOf('-gradient') > 0) {
136688c88e8eSopenharmony_ci    let valueMatch = v.match(/(repeating-linear|linear).*?(?=\s*(repeating|linear)|$)/g)
136788c88e8eSopenharmony_ci    let resultValues = {
136888c88e8eSopenharmony_ci      values: []
136988c88e8eSopenharmony_ci    }
137088c88e8eSopenharmony_ci    if (valueMatch && valueMatch.length) {
137188c88e8eSopenharmony_ci      let reasonMaps = []
137288c88e8eSopenharmony_ci      let length = 0
137388c88e8eSopenharmony_ci      valueMatch.forEach(function (realValue) {
137488c88e8eSopenharmony_ci        let temp, gradientValidator
137588c88e8eSopenharmony_ci        if(realValue.indexOf("-gradient") >= 0){
137688c88e8eSopenharmony_ci          temp = realValue.indexOf("repeating") >= 0 ? "repeatingLinearGradient": "linearGradient"
137788c88e8eSopenharmony_ci          gradientValidator = backgroundValidatorMap[temp]
137888c88e8eSopenharmony_ci        }
137988c88e8eSopenharmony_ci        if (typeof gradientValidator == 'function') {
138088c88e8eSopenharmony_ci          let validateResult = gradientValidator(realValue)
138188c88e8eSopenharmony_ci          if (util.isValidValue(validateResult.value)) {
138288c88e8eSopenharmony_ci            let jsonValue = JSON.parse(validateResult.value)
138388c88e8eSopenharmony_ci            resultValues.values.push(jsonValue)
138488c88e8eSopenharmony_ci          }
138588c88e8eSopenharmony_ci          let check = checkReason(validateResult, temp, realValue, length)
138688c88e8eSopenharmony_ci          length = check.length
138788c88e8eSopenharmony_ci          if (check.realReason !== null) {
138888c88e8eSopenharmony_ci            reasonMaps.push(check.realReason)
138988c88e8eSopenharmony_ci          }
139088c88e8eSopenharmony_ci        } else {
139188c88e8eSopenharmony_ci          length = 2
139288c88e8eSopenharmony_ci          reasonMaps.push("background type '" + realValue + "' is not supported.")
139388c88e8eSopenharmony_ci        }
139488c88e8eSopenharmony_ci      })
139588c88e8eSopenharmony_ci      return {
139688c88e8eSopenharmony_ci        value: length < 2 ? JSON.stringify(resultValues) : null,
139788c88e8eSopenharmony_ci        reason: reasonMaps.length > 0 ?
139888c88e8eSopenharmony_ci          function (k, v) {
139988c88e8eSopenharmony_ci            return logTypes[length] + ': Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
140088c88e8eSopenharmony_ci              '` attribute is incorrect. \n ' + reasonMaps.join(' \n ')
140188c88e8eSopenharmony_ci          } : null
140288c88e8eSopenharmony_ci      }
140388c88e8eSopenharmony_ci    }
140488c88e8eSopenharmony_ci  }
140588c88e8eSopenharmony_ci  return {
140688c88e8eSopenharmony_ci    value: null,
140788c88e8eSopenharmony_ci    reason: function (k, v) {
140888c88e8eSopenharmony_ci      return 'ERROR: The format of value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
140988c88e8eSopenharmony_ci        '` attribute is incorrect.'
141088c88e8eSopenharmony_ci    }
141188c88e8eSopenharmony_ci  }
141288c88e8eSopenharmony_ci}
141388c88e8eSopenharmony_ci
141488c88e8eSopenharmony_civar LINEAR_GRADIENT_VALIDATOR = function LINEAR_GRADIENT_VALIDATOR(v) {
141588c88e8eSopenharmony_ci  v = (v || "").toString().trim()
141688c88e8eSopenharmony_ci  let result = {
141788c88e8eSopenharmony_ci    type: "",
141888c88e8eSopenharmony_ci    directions: ["to", "bottom"],
141988c88e8eSopenharmony_ci    values: []
142088c88e8eSopenharmony_ci  }
142188c88e8eSopenharmony_ci  let valueMatch = v.match(LINE_GRADIENT_ITEM_REGEXP)
142288c88e8eSopenharmony_ci  if (valueMatch) {
142388c88e8eSopenharmony_ci    let tempResult = {}
142488c88e8eSopenharmony_ci    let reasonMaps = []
142588c88e8eSopenharmony_ci    let length = 0
142688c88e8eSopenharmony_ci    let typeName = util.hyphenedToCamelCase(valueMatch[1])
142788c88e8eSopenharmony_ci    result.type = typeName
142888c88e8eSopenharmony_ci    let matchValues = valueMatch[2].split(/,/)
142988c88e8eSopenharmony_ci    if (LINE_GRADIENT_DIRECTION_REGEXP.test(matchValues[0])) {
143088c88e8eSopenharmony_ci      let directionValidator
143188c88e8eSopenharmony_ci      if (LINE_GRADIENT_TO_DIRECTION_REGEXP.test(matchValues[0])) {
143288c88e8eSopenharmony_ci        directionValidator = backgroundValidatorMap.linearGradientDirection
143388c88e8eSopenharmony_ci      } else if (matchValues[0].match(ANGLE_REGEXP)) {
143488c88e8eSopenharmony_ci        directionValidator = backgroundValidatorMap.linearGradientAngle
143588c88e8eSopenharmony_ci      }
143688c88e8eSopenharmony_ci      if (typeof directionValidator == "function") {
143788c88e8eSopenharmony_ci        tempResult = directionValidator(matchValues[0])
143888c88e8eSopenharmony_ci        if (util.isValidValue(tempResult.value)) {
143988c88e8eSopenharmony_ci          result.directions = tempResult.value.split(/\s+/)
144088c88e8eSopenharmony_ci        }
144188c88e8eSopenharmony_ci        let check = checkReason(tempResult, typeName, matchValues[0], length)
144288c88e8eSopenharmony_ci        length = check.length
144388c88e8eSopenharmony_ci        if (check.realReason !== null) {
144488c88e8eSopenharmony_ci          reasonMaps.push(check.realReason)
144588c88e8eSopenharmony_ci        }
144688c88e8eSopenharmony_ci        matchValues.splice(0, 1)
144788c88e8eSopenharmony_ci      }
144888c88e8eSopenharmony_ci    }
144988c88e8eSopenharmony_ci    if (matchValues.length > 0) {
145088c88e8eSopenharmony_ci      let colorStopResult = {}
145188c88e8eSopenharmony_ci      colorStopResult = backgroundValidatorMap.linearGradientColor(matchValues)
145288c88e8eSopenharmony_ci      if (util.isValidValue(colorStopResult.value)) {
145388c88e8eSopenharmony_ci        result.values = JSON.parse(colorStopResult.value)
145488c88e8eSopenharmony_ci      }
145588c88e8eSopenharmony_ci      let check = checkReason(colorStopResult, typeName, matchValues, length)
145688c88e8eSopenharmony_ci        length = check.length
145788c88e8eSopenharmony_ci        if (check.realReason !== null) {
145888c88e8eSopenharmony_ci          reasonMaps.push(check.realReason)
145988c88e8eSopenharmony_ci        }
146088c88e8eSopenharmony_ci    } else {
146188c88e8eSopenharmony_ci      length = 2
146288c88e8eSopenharmony_ci      reasonMaps.push("parameter '" + v + "' missing transition colors.")
146388c88e8eSopenharmony_ci    }
146488c88e8eSopenharmony_ci    return {
146588c88e8eSopenharmony_ci      value: length < 2 ? JSON.stringify(result) : null,
146688c88e8eSopenharmony_ci      reason: reasonMaps.length > 0 ?
146788c88e8eSopenharmony_ci        function (k, v) {
146888c88e8eSopenharmony_ci          return logTypes[length] + ': Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
146988c88e8eSopenharmony_ci            '` attribute is incorrect. \n  ' + reasonMaps.join('\n  ')
147088c88e8eSopenharmony_ci        }: null
147188c88e8eSopenharmony_ci    }
147288c88e8eSopenharmony_ci  }
147388c88e8eSopenharmony_ci  return {
147488c88e8eSopenharmony_ci    value: null,
147588c88e8eSopenharmony_ci    reason: function (k, v) {
147688c88e8eSopenharmony_ci      return 'ERROR: The format of value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
147788c88e8eSopenharmony_ci        '` attribute is incorrect.'
147888c88e8eSopenharmony_ci    }
147988c88e8eSopenharmony_ci  }
148088c88e8eSopenharmony_ci}
148188c88e8eSopenharmony_ci
148288c88e8eSopenharmony_civar ARRAY_COLOR_STOP_VALIDATOR = function ARRAY_COLOR_STOP_VALIDATOR(v) {
148388c88e8eSopenharmony_ci  v = (v || '').toString().trim()
148488c88e8eSopenharmony_ci  let values = v.match(ARRAY_COLOR_STOP_REGEXP)
148588c88e8eSopenharmony_ci  if (values && values.length > 1) {
148688c88e8eSopenharmony_ci    let resultValues = []
148788c88e8eSopenharmony_ci    let reasonMaps = []
148888c88e8eSopenharmony_ci    let length = 0
148988c88e8eSopenharmony_ci    processValueItem(v, values, resultValues, reasonMaps, length)
149088c88e8eSopenharmony_ci    return {
149188c88e8eSopenharmony_ci      value: length < 2 ? JSON.stringify(resultValues) : null,
149288c88e8eSopenharmony_ci      reason: reasonMaps.length > 0 ?
149388c88e8eSopenharmony_ci        function (k, v) {
149488c88e8eSopenharmony_ci          return logTypes[length] + ': Value `' + v + '` of the `' +
149588c88e8eSopenharmony_ci            util.camelCaseToHyphened(k) + '` attribute is incorrect. \n  ' + reasonMaps.join('\n  ')
149688c88e8eSopenharmony_ci        } : null
149788c88e8eSopenharmony_ci    }
149888c88e8eSopenharmony_ci  }
149988c88e8eSopenharmony_ci  return {
150088c88e8eSopenharmony_ci    value: null,
150188c88e8eSopenharmony_ci    reason: function (k, v) {
150288c88e8eSopenharmony_ci      return 'ERROR: The format of value `' + v + '` of the `'+ util.camelCaseToHyphened(k) +
150388c88e8eSopenharmony_ci        '` attribute is incorrect. Please specify at least two colors.'
150488c88e8eSopenharmony_ci    }
150588c88e8eSopenharmony_ci  }
150688c88e8eSopenharmony_ci}
150788c88e8eSopenharmony_ci
150888c88e8eSopenharmony_cifunction processValueItem(v, values, resultValues, reasonMaps, length) {
150988c88e8eSopenharmony_ci  values.forEach(function (value, n) {
151088c88e8eSopenharmony_ci    let widthMatch = value.match(/[\s]+[-+0-9]+(px|%|vp|fp)?$/)
151188c88e8eSopenharmony_ci    let tempValues = []
151288c88e8eSopenharmony_ci    if (widthMatch) {
151388c88e8eSopenharmony_ci      let matchResult = PERCENTAGE_LENGTH_VALIDATOR(widthMatch[0])
151488c88e8eSopenharmony_ci      let index = value.indexOf(widthMatch[0])
151588c88e8eSopenharmony_ci      value = value.substring(0, index)
151688c88e8eSopenharmony_ci      if (util.isValidValue(matchResult.value)) {
151788c88e8eSopenharmony_ci        tempValues.push(matchResult.value)
151888c88e8eSopenharmony_ci      }
151988c88e8eSopenharmony_ci      let check = checkReason(matchResult, n.toString(), widthMatch[0], length)
152088c88e8eSopenharmony_ci      length = check.length
152188c88e8eSopenharmony_ci      if (check.realReason !== null) {
152288c88e8eSopenharmony_ci        reasonMaps.push(check.realReason)
152388c88e8eSopenharmony_ci      }
152488c88e8eSopenharmony_ci    }
152588c88e8eSopenharmony_ci    if (value) {
152688c88e8eSopenharmony_ci      let colorResult = COLOR_VAR_VALIDATOR(value)
152788c88e8eSopenharmony_ci      if (util.isValidValue(colorResult.value)) {
152888c88e8eSopenharmony_ci        tempValues.unshift(colorResult.value)
152988c88e8eSopenharmony_ci      }
153088c88e8eSopenharmony_ci      resultValues.push(tempValues.join(' '))
153188c88e8eSopenharmony_ci      let check = checkReason(colorResult, n.toString(), value, length)
153288c88e8eSopenharmony_ci      length = check.length
153388c88e8eSopenharmony_ci      if (check.realReason !== null) {
153488c88e8eSopenharmony_ci        reasonMaps.push(check.realReason)
153588c88e8eSopenharmony_ci      }
153688c88e8eSopenharmony_ci    } else {
153788c88e8eSopenharmony_ci      length = 2
153888c88e8eSopenharmony_ci      reasonMaps.push("parameter '" + v + "' is incorrect format.")
153988c88e8eSopenharmony_ci    }
154088c88e8eSopenharmony_ci  })
154188c88e8eSopenharmony_ci}
154288c88e8eSopenharmony_ci
154388c88e8eSopenharmony_cifunction checkReason(result, k, v, length) {
154488c88e8eSopenharmony_ci  let reason
154588c88e8eSopenharmony_ci  if (result.reason) {
154688c88e8eSopenharmony_ci    reason = result.reason(k, v, result.value)
154788c88e8eSopenharmony_ci    if (reason) {
154888c88e8eSopenharmony_ci      let reasonType = reason.match(/^([A-Z]+):/)
154988c88e8eSopenharmony_ci      let index
155088c88e8eSopenharmony_ci      if (reasonType) {
155188c88e8eSopenharmony_ci        index = logTypes.indexOf(reasonType[1])
155288c88e8eSopenharmony_ci        if (logTypes.indexOf(reasonType[1]) > length) {
155388c88e8eSopenharmony_ci          length = index
155488c88e8eSopenharmony_ci        }
155588c88e8eSopenharmony_ci        reason = reason.replace(reasonType[0], '').trim()
155688c88e8eSopenharmony_ci      }
155788c88e8eSopenharmony_ci    }
155888c88e8eSopenharmony_ci  }
155988c88e8eSopenharmony_ci  return {
156088c88e8eSopenharmony_ci    length: length,
156188c88e8eSopenharmony_ci    realReason: reason ? reason : null
156288c88e8eSopenharmony_ci  }
156388c88e8eSopenharmony_ci}
156488c88e8eSopenharmony_ci
156588c88e8eSopenharmony_civar ANGLE_VALIDATOR = function ANGLE_VALIDATOR(v) {
156688c88e8eSopenharmony_ci  v = (v || '').toString().trim()
156788c88e8eSopenharmony_ci  let match = v.match(ANGLE_REGEXP)
156888c88e8eSopenharmony_ci  if (match) {
156988c88e8eSopenharmony_ci    let unit = match[1]
157088c88e8eSopenharmony_ci    if (unit) {
157188c88e8eSopenharmony_ci      let angle = parseFloat(v)
157288c88e8eSopenharmony_ci      if (unit.toLowerCase() === 'rad') {
157388c88e8eSopenharmony_ci        return {
157488c88e8eSopenharmony_ci          value: Math.round(180 * angle / Math.PI) + SUPPORT_CSS_ANGLE_UNIT[0]
157588c88e8eSopenharmony_ci        }
157688c88e8eSopenharmony_ci      } else {
157788c88e8eSopenharmony_ci        if (SUPPORT_CSS_ANGLE_UNIT.indexOf(unit.toLowerCase()) >= 0) {
157888c88e8eSopenharmony_ci          return { value: v }
157988c88e8eSopenharmony_ci        } else {
158088c88e8eSopenharmony_ci          return {
158188c88e8eSopenharmony_ci            value: angle + SUPPORT_CSS_ANGLE_UNIT[0],
158288c88e8eSopenharmony_ci            reason: function(k, v) {
158388c88e8eSopenharmony_ci              return 'ERROR: The `' + util.camelCaseToHyphened(k) +
158488c88e8eSopenharmony_ci                '` attribute does not support `' + unit + '`. It only supports `' +
158588c88e8eSopenharmony_ci                JSON.stringify(SUPPORT_CSS_ANGLE_UNIT) + '`.'
158688c88e8eSopenharmony_ci            }
158788c88e8eSopenharmony_ci          }
158888c88e8eSopenharmony_ci        }
158988c88e8eSopenharmony_ci      }
159088c88e8eSopenharmony_ci    } else {
159188c88e8eSopenharmony_ci      return {
159288c88e8eSopenharmony_ci        value: parseFloat(v) + SUPPORT_CSS_ANGLE_UNIT[0],
159388c88e8eSopenharmony_ci        reason: function(k, v) {
159488c88e8eSopenharmony_ci          return 'WARNING: No unit is specified for the value `' + v +
159588c88e8eSopenharmony_ci            '` of the `' + util.camelCaseToHyphened(k) + '` attribute. The default unit is `' +
159688c88e8eSopenharmony_ci            SUPPORT_CSS_ANGLE_UNIT[0] + '`.'
159788c88e8eSopenharmony_ci        }
159888c88e8eSopenharmony_ci      }
159988c88e8eSopenharmony_ci    }
160088c88e8eSopenharmony_ci  }
160188c88e8eSopenharmony_ci  return {
160288c88e8eSopenharmony_ci    value: null,
160388c88e8eSopenharmony_ci    reason: function(k, v) {
160488c88e8eSopenharmony_ci      return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `'
160588c88e8eSopenharmony_ci        + v + '` (only numbers are supported).'
160688c88e8eSopenharmony_ci    }
160788c88e8eSopenharmony_ci  }
160888c88e8eSopenharmony_ci}
160988c88e8eSopenharmony_ci
161088c88e8eSopenharmony_civar GRADIENT_DIRECTION_VALIDATOR = function GRADIENT_DIRECTION_VALIDATOR(v) {
161188c88e8eSopenharmony_ci  v = (v || "").toString().trim()
161288c88e8eSopenharmony_ci  let values = v.split(/\s+/)
161388c88e8eSopenharmony_ci  let invalid = false
161488c88e8eSopenharmony_ci  let scaleY = ['top','bottom']
161588c88e8eSopenharmony_ci  let scaleX = ['left','right']
161688c88e8eSopenharmony_ci  let valueOrder = []
161788c88e8eSopenharmony_ci
161888c88e8eSopenharmony_ci  values.forEach(function (value) {
161988c88e8eSopenharmony_ci    if (value === 'to') {
162088c88e8eSopenharmony_ci      valueOrder.push(0)
162188c88e8eSopenharmony_ci    } else if (scaleY.includes(value)) {
162288c88e8eSopenharmony_ci      valueOrder.push(1)
162388c88e8eSopenharmony_ci    } else if (scaleX.includes(value)) {
162488c88e8eSopenharmony_ci      valueOrder.push(2)
162588c88e8eSopenharmony_ci    } else {
162688c88e8eSopenharmony_ci      invalid = true
162788c88e8eSopenharmony_ci    }
162888c88e8eSopenharmony_ci  })
162988c88e8eSopenharmony_ci  if (!invalid) {
163088c88e8eSopenharmony_ci    if (valueOrder[0] === 0 && valueOrder.length > 1 && valueOrder.length < 4 && valueOrder[1] !== 0) {
163188c88e8eSopenharmony_ci      if (valueOrder[2] && valueOrder[1] + valueOrder[2] !== 3) {
163288c88e8eSopenharmony_ci        invalid = true
163388c88e8eSopenharmony_ci      }
163488c88e8eSopenharmony_ci    }
163588c88e8eSopenharmony_ci  }
163688c88e8eSopenharmony_ci
163788c88e8eSopenharmony_ci  return {
163888c88e8eSopenharmony_ci    value: invalid ? null : v,
163988c88e8eSopenharmony_ci    reason: invalid ?
164088c88e8eSopenharmony_ci      function (k, v) {
164188c88e8eSopenharmony_ci        return 'ERROR: The format of value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
164288c88e8eSopenharmony_ci          '` attribute is incorrect.'
164388c88e8eSopenharmony_ci      } : null
164488c88e8eSopenharmony_ci  }
164588c88e8eSopenharmony_ci}
164688c88e8eSopenharmony_ci
164788c88e8eSopenharmony_civar URL_VALIDATOR = function URL_VALIDATOR(v) {
164888c88e8eSopenharmony_ci  v = (v || "").toString().trim()
164988c88e8eSopenharmony_ci  if (v.match(/^none$/i)) {
165088c88e8eSopenharmony_ci    return { value: "none" }
165188c88e8eSopenharmony_ci  }
165288c88e8eSopenharmony_ci  if (v.indexOf('@') >= 0) {
165388c88e8eSopenharmony_ci    let result
165488c88e8eSopenharmony_ci    // target format "@sys.media.sys_background_image" or '@sys.media.sys_background_image'
165588c88e8eSopenharmony_ci    let SysResourceTypeRefReg = /['"]\s*@sys\.media\.(?<resName>\w+)\s*['"]/
165688c88e8eSopenharmony_ci    result = SysResourceTypeRefReg.exec(v)
165788c88e8eSopenharmony_ci    if (result) {
165888c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
165988c88e8eSopenharmony_ci      if (resourceName && OHOS_THEME_PROP_GROUPS[resourceName]) {
166088c88e8eSopenharmony_ci        return { value: "@sys.media." + OHOS_THEME_PROP_GROUPS[resourceName] }
166188c88e8eSopenharmony_ci      }
166288c88e8eSopenharmony_ci    }
166388c88e8eSopenharmony_ci    // target format "@app.media.customized_background_image" or '@app.media.customized_background_image'
166488c88e8eSopenharmony_ci    let AppResourceTypeRefReg = /['"]\s*@app\.media\.(?<resName>\w+)\s*['"]/
166588c88e8eSopenharmony_ci    result = AppResourceTypeRefReg.exec(v)
166688c88e8eSopenharmony_ci    if (result) {
166788c88e8eSopenharmony_ci      const resourceName = result.groups['resName']
166888c88e8eSopenharmony_ci      if (resourceName) {
166988c88e8eSopenharmony_ci        return { value: "@app.media." + resourceName}
167088c88e8eSopenharmony_ci      }
167188c88e8eSopenharmony_ci    }
167288c88e8eSopenharmony_ci  }
167388c88e8eSopenharmony_ci
167488c88e8eSopenharmony_ci  let matchValues = URL_REGEXP.exec(v)
167588c88e8eSopenharmony_ci  if (matchValues) {
167688c88e8eSopenharmony_ci    if(isLiteDevice){
167788c88e8eSopenharmony_ci      return { value: matchValues[0] }
167888c88e8eSopenharmony_ci    }else{
167988c88e8eSopenharmony_ci      if (matchValues[1].match(/^\.\.\/|^\.\//)) {
168088c88e8eSopenharmony_ci        return {
168188c88e8eSopenharmony_ci          value: matchValues[1],
168288c88e8eSopenharmony_ci          isRelative: true
168388c88e8eSopenharmony_ci        }
168488c88e8eSopenharmony_ci      }
168588c88e8eSopenharmony_ci      else {
168688c88e8eSopenharmony_ci        return { value: matchValues[1] }
168788c88e8eSopenharmony_ci      }
168888c88e8eSopenharmony_ci    }
168988c88e8eSopenharmony_ci  }
169088c88e8eSopenharmony_ci  else {
169188c88e8eSopenharmony_ci    return {
169288c88e8eSopenharmony_ci      value: null,
169388c88e8eSopenharmony_ci      reason: function (k, v) {
169488c88e8eSopenharmony_ci          return 'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
169588c88e8eSopenharmony_ci            '` attribute must be none or url(...).'
169688c88e8eSopenharmony_ci      }
169788c88e8eSopenharmony_ci    }
169888c88e8eSopenharmony_ci  }
169988c88e8eSopenharmony_ci}
170088c88e8eSopenharmony_ci
170188c88e8eSopenharmony_civar NAME_VALIDATOR = function NAME_VALIDATOR(v) {
170288c88e8eSopenharmony_ci  v = (v || "").toString().trim()
170388c88e8eSopenharmony_ci  if (v.match(NAME_REGEXP)) {
170488c88e8eSopenharmony_ci    return  { value: v }
170588c88e8eSopenharmony_ci  } else {
170688c88e8eSopenharmony_ci    return {
170788c88e8eSopenharmony_ci      value: null,
170888c88e8eSopenharmony_ci      reason: function(k, v) {
170988c88e8eSopenharmony_ci        return 'ERROR: The format of value `' + v + '` of the `' +  util.camelCaseToHyphened(k) +
171088c88e8eSopenharmony_ci          '` attribute is incorrect.'
171188c88e8eSopenharmony_ci      }
171288c88e8eSopenharmony_ci    }
171388c88e8eSopenharmony_ci  }
171488c88e8eSopenharmony_ci}
171588c88e8eSopenharmony_ci
171688c88e8eSopenharmony_civar ITERATIONCOUNT_VALIDATOR = function ITERATIONCOUNT_VALIDATOR(v) {
171788c88e8eSopenharmony_ci  v = (v || "").toString().trim()
171888c88e8eSopenharmony_ci  if (v.match(INT_REGEXP)) {
171988c88e8eSopenharmony_ci    return {
172088c88e8eSopenharmony_ci      value: parseInt(v, 10)
172188c88e8eSopenharmony_ci    }
172288c88e8eSopenharmony_ci  } else if (v.match(/^infinite$/)) {
172388c88e8eSopenharmony_ci    return { value: -1 }
172488c88e8eSopenharmony_ci  } else {
172588c88e8eSopenharmony_ci    return {
172688c88e8eSopenharmony_ci      value: null,
172788c88e8eSopenharmony_ci      reason: function(k, v) {
172888c88e8eSopenharmony_ci          return 'ERROR: The format of value `' + v + '` of the `' +  util.camelCaseToHyphened(k) +
172988c88e8eSopenharmony_ci            '` attribute is incorrect (only integers and infinity are supported).'
173088c88e8eSopenharmony_ci      }
173188c88e8eSopenharmony_ci    }
173288c88e8eSopenharmony_ci  }
173388c88e8eSopenharmony_ci}
173488c88e8eSopenharmony_ci
173588c88e8eSopenharmony_civar BACKGROUND_SIZE_VALIDATOR = function BACKGROUND_SIZE_VALIDATOR(v) {
173688c88e8eSopenharmony_ci  v = (v || "").toString().trim()
173788c88e8eSopenharmony_ci  let values = v.split(/\s+/)
173888c88e8eSopenharmony_ci  const sizeReg = /auto|contain|cover/g
173988c88e8eSopenharmony_ci  if (values.length === 1) {
174088c88e8eSopenharmony_ci    if (/^(auto|contain|cover)$/.test(v)) {
174188c88e8eSopenharmony_ci      return { value: v }
174288c88e8eSopenharmony_ci    } else {
174388c88e8eSopenharmony_ci      return PERCENTAGE_LENGTH_VALIDATOR(v)
174488c88e8eSopenharmony_ci    }
174588c88e8eSopenharmony_ci  }
174688c88e8eSopenharmony_ci  if (values.length === 2 && !sizeReg.test(v)) {
174788c88e8eSopenharmony_ci    return SHORTHAND_VALIDATOR(v, PERCENTAGE_LENGTH_VALIDATOR)
174888c88e8eSopenharmony_ci  }
174988c88e8eSopenharmony_ci  return {
175088c88e8eSopenharmony_ci    value: null,
175188c88e8eSopenharmony_ci    reason: function(k, v) {
175288c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` of the `' +  util.camelCaseToHyphened(k) + '` attribute is incorrect.'
175388c88e8eSopenharmony_ci    }
175488c88e8eSopenharmony_ci  }
175588c88e8eSopenharmony_ci}
175688c88e8eSopenharmony_ci
175788c88e8eSopenharmony_civar BACKGROUND_POSITION_VALIDATOR = function BACKGROUND_POSITION_VALIDATOR(v) {
175888c88e8eSopenharmony_ci  v = (v || '').toString().trim()
175988c88e8eSopenharmony_ci  let values = v.split(/\s+/)
176088c88e8eSopenharmony_ci  const positionReg = /left|right|top|bottom|center/g
176188c88e8eSopenharmony_ci  if (values.length === 1) {
176288c88e8eSopenharmony_ci    if (/^(left|right|top|bottom|center)$/.test(v)) {
176388c88e8eSopenharmony_ci      return { value: v }
176488c88e8eSopenharmony_ci    } else {
176588c88e8eSopenharmony_ci      return PERCENTAGE_LENGTH_VALIDATOR(v)
176688c88e8eSopenharmony_ci    }
176788c88e8eSopenharmony_ci  }
176888c88e8eSopenharmony_ci  if (values.length === 2) {
176988c88e8eSopenharmony_ci    if (!positionReg.test(v)) {
177088c88e8eSopenharmony_ci      return SHORTHAND_VALIDATOR(v, PERCENTAGE_LENGTH_VALIDATOR)
177188c88e8eSopenharmony_ci    } else {
177288c88e8eSopenharmony_ci      return CHECK_BACKGROUND_POSITION(v)
177388c88e8eSopenharmony_ci    }
177488c88e8eSopenharmony_ci  }
177588c88e8eSopenharmony_ci  return {
177688c88e8eSopenharmony_ci    value: null,
177788c88e8eSopenharmony_ci    reason: function(k, v) {
177888c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` of the `' +  util.camelCaseToHyphened(k) + '` attribute is incorrect.'
177988c88e8eSopenharmony_ci    }
178088c88e8eSopenharmony_ci  }
178188c88e8eSopenharmony_ci}
178288c88e8eSopenharmony_ci
178388c88e8eSopenharmony_civar CHECK_BACKGROUND_POSITION = function CHECK_BACKGROUND_POSITION(v) {
178488c88e8eSopenharmony_ci  let values = v.split(/\s+/)
178588c88e8eSopenharmony_ci  let result = []
178688c88e8eSopenharmony_ci  let reasons = []
178788c88e8eSopenharmony_ci  let directions = []
178888c88e8eSopenharmony_ci  values.forEach(function(value, index) {
178988c88e8eSopenharmony_ci    if (/^(left|right|top|bottom|center)$/.test(value)) {
179088c88e8eSopenharmony_ci      result.push(value)
179188c88e8eSopenharmony_ci      if (checkDirection(value)) {
179288c88e8eSopenharmony_ci        directions.push(checkDirection(value))
179388c88e8eSopenharmony_ci      }
179488c88e8eSopenharmony_ci    } else {
179588c88e8eSopenharmony_ci      let tempResult = PERCENTAGE_LENGTH_VALIDATOR(value)
179688c88e8eSopenharmony_ci      if (tempResult.value) {
179788c88e8eSopenharmony_ci        result.push(value)
179888c88e8eSopenharmony_ci        if(index === 0){
179988c88e8eSopenharmony_ci          directions.push('horizon')
180088c88e8eSopenharmony_ci        } else {
180188c88e8eSopenharmony_ci          directions.push('vertical')
180288c88e8eSopenharmony_ci        }
180388c88e8eSopenharmony_ci      }
180488c88e8eSopenharmony_ci      if (tempResult.reason) {
180588c88e8eSopenharmony_ci        reasons.push(tempResult.reason)
180688c88e8eSopenharmony_ci      }
180788c88e8eSopenharmony_ci    }
180888c88e8eSopenharmony_ci  })
180988c88e8eSopenharmony_ci  if (directions.length === 2 && directions[0] === directions[1]) {
181088c88e8eSopenharmony_ci    reasons.push(function(k, v) {
181188c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) + '` attribute is incorrect.'
181288c88e8eSopenharmony_ci    })
181388c88e8eSopenharmony_ci  }
181488c88e8eSopenharmony_ci  return {
181588c88e8eSopenharmony_ci    value: result.length > 0 ? result.join(' ') : null,
181688c88e8eSopenharmony_ci    reason: reasons.length > 0 ?
181788c88e8eSopenharmony_ci      function(k, v) {
181888c88e8eSopenharmony_ci        return reasons.map(function(res) {
181988c88e8eSopenharmony_ci          if (typeof res === 'function') {
182088c88e8eSopenharmony_ci            return res(k, v)
182188c88e8eSopenharmony_ci          }
182288c88e8eSopenharmony_ci        }).join('\n')
182388c88e8eSopenharmony_ci      }: null
182488c88e8eSopenharmony_ci  }
182588c88e8eSopenharmony_ci}
182688c88e8eSopenharmony_ci
182788c88e8eSopenharmony_cifunction checkDirection(v) {
182888c88e8eSopenharmony_ci  const scaleXReg = /^(left|right)$/
182988c88e8eSopenharmony_ci  const scaleYReg = /^(top|bottom)$/
183088c88e8eSopenharmony_ci  if (scaleXReg.test(v)) {
183188c88e8eSopenharmony_ci    return 'horizon'
183288c88e8eSopenharmony_ci  }
183388c88e8eSopenharmony_ci  if (scaleYReg.test(v)) {
183488c88e8eSopenharmony_ci    return 'vertical'
183588c88e8eSopenharmony_ci  }
183688c88e8eSopenharmony_ci  return null
183788c88e8eSopenharmony_ci}
183888c88e8eSopenharmony_ci
183988c88e8eSopenharmony_civar MYLOCATION_VALIDATOR = function MYLOCATION_VALIDATOR(v) {
184088c88e8eSopenharmony_ci  v = (v || "").toString().trim()
184188c88e8eSopenharmony_ci  let values = v.match(/\((.+?)\)/g) || []
184288c88e8eSopenharmony_ci  let replaceValue = null
184388c88e8eSopenharmony_ci  if (values.length) {
184488c88e8eSopenharmony_ci    for (let index = 0; index < values.length; index++) {
184588c88e8eSopenharmony_ci      replaceValue = values[index].replace(/\s*/g, "")
184688c88e8eSopenharmony_ci      v = v.replace(values[index], replaceValue);
184788c88e8eSopenharmony_ci    }
184888c88e8eSopenharmony_ci  }
184988c88e8eSopenharmony_ci  let realValues = v.split(/\s+/)
185088c88e8eSopenharmony_ci  let resultValues = []
185188c88e8eSopenharmony_ci  let valuesOrder = []
185288c88e8eSopenharmony_ci  let reason = null
185388c88e8eSopenharmony_ci  if (realValues && realValues.length <= 3) {
185488c88e8eSopenharmony_ci    realValues.forEach(function(realValue) {
185588c88e8eSopenharmony_ci      if (typeof COLOR_VAR_VALIDATOR(realValue).value == 'string') {
185688c88e8eSopenharmony_ci        resultValues.push(COLOR_VAR_VALIDATOR(realValue).value)
185788c88e8eSopenharmony_ci        valuesOrder.push(0)
185888c88e8eSopenharmony_ci      } else if (typeof URL_VALIDATOR(realValue).value == 'string') {
185988c88e8eSopenharmony_ci        resultValues.push(URL_VALIDATOR(realValue).value)
186088c88e8eSopenharmony_ci        valuesOrder.push(1)
186188c88e8eSopenharmony_ci      } else {
186288c88e8eSopenharmony_ci        reason = 'value'
186388c88e8eSopenharmony_ci      }
186488c88e8eSopenharmony_ci    })
186588c88e8eSopenharmony_ci    let n = -1
186688c88e8eSopenharmony_ci    valuesOrder.forEach(function(order) {
186788c88e8eSopenharmony_ci      if (order >= n) {
186888c88e8eSopenharmony_ci        n = order
186988c88e8eSopenharmony_ci      } else {
187088c88e8eSopenharmony_ci        if (!reason) {
187188c88e8eSopenharmony_ci          reason = 'order'
187288c88e8eSopenharmony_ci        }
187388c88e8eSopenharmony_ci      }
187488c88e8eSopenharmony_ci    })
187588c88e8eSopenharmony_ci    if (reason) {
187688c88e8eSopenharmony_ci      return {
187788c88e8eSopenharmony_ci        value : null,
187888c88e8eSopenharmony_ci        reason: function(k, v) {
187988c88e8eSopenharmony_ci          return reason == 'value' ?
188088c88e8eSopenharmony_ci            'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
188188c88e8eSopenharmony_ci            '` attribute does not meet the inspection standards for the color or url.' :
188288c88e8eSopenharmony_ci            'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
188388c88e8eSopenharmony_ci            '` attribute must be set in order(color color url).'
188488c88e8eSopenharmony_ci        }
188588c88e8eSopenharmony_ci      }
188688c88e8eSopenharmony_ci    }
188788c88e8eSopenharmony_ci    return {
188888c88e8eSopenharmony_ci      value: resultValues.join(" ")
188988c88e8eSopenharmony_ci    }
189088c88e8eSopenharmony_ci  }
189188c88e8eSopenharmony_ci  return {
189288c88e8eSopenharmony_ci    value: null,
189388c88e8eSopenharmony_ci    reason: function(k, v) {
189488c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) + '` attribute is invalid.'
189588c88e8eSopenharmony_ci    }
189688c88e8eSopenharmony_ci  }
189788c88e8eSopenharmony_ci}
189888c88e8eSopenharmony_ci
189988c88e8eSopenharmony_civar TRANSFORM_ORIGIN_VALIDATOR = function TRANSFORM_ORIGIN_VALIDATOR(v) {
190088c88e8eSopenharmony_ci  v = (v || "").toString().trim()
190188c88e8eSopenharmony_ci  let values = v.split(/\s+/)
190288c88e8eSopenharmony_ci  const positionReg = /left|right|top|bottom|center/g
190388c88e8eSopenharmony_ci  if (values.length == 1) {
190488c88e8eSopenharmony_ci    if (/^(left|right|top|bottom|center)$/.test(v)) {
190588c88e8eSopenharmony_ci      return { value: v }
190688c88e8eSopenharmony_ci    } else {
190788c88e8eSopenharmony_ci      return PERCENTAGE_LENGTH_VALIDATOR(v);
190888c88e8eSopenharmony_ci    }
190988c88e8eSopenharmony_ci  }
191088c88e8eSopenharmony_ci  if (values.length == 2) {
191188c88e8eSopenharmony_ci    if (!positionReg.test(v)) {
191288c88e8eSopenharmony_ci      return SHORTHAND_VALIDATOR(v, PERCENTAGE_LENGTH_VALIDATOR)
191388c88e8eSopenharmony_ci    } else {
191488c88e8eSopenharmony_ci      return CHECK_TRANSFORM_ORIGIN(values)
191588c88e8eSopenharmony_ci    }
191688c88e8eSopenharmony_ci  }
191788c88e8eSopenharmony_ci  return {
191888c88e8eSopenharmony_ci    value: null,
191988c88e8eSopenharmony_ci    reason: function (k, v) {
192088c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
192188c88e8eSopenharmony_ci        '` attribute is invalid. such as left 100px or 50% bottom.'
192288c88e8eSopenharmony_ci    }
192388c88e8eSopenharmony_ci  }
192488c88e8eSopenharmony_ci}
192588c88e8eSopenharmony_ci
192688c88e8eSopenharmony_civar CHECK_TRANSFORM_ORIGIN = function CHECK_TRANSFORM_ORIGIN(values) {
192788c88e8eSopenharmony_ci  let result = []
192888c88e8eSopenharmony_ci  let reasons = []
192988c88e8eSopenharmony_ci  let directions = []
193088c88e8eSopenharmony_ci  values.forEach(function (value, index) {
193188c88e8eSopenharmony_ci    if (/^(left|right|top|bottom|center)$/.test(value)) {
193288c88e8eSopenharmony_ci      result.push(value)
193388c88e8eSopenharmony_ci      directions.push(checkDirection(value))
193488c88e8eSopenharmony_ci    } else {
193588c88e8eSopenharmony_ci      let tempResult = PERCENTAGE_LENGTH_VALIDATOR(value)
193688c88e8eSopenharmony_ci      if (tempResult.value) {
193788c88e8eSopenharmony_ci        result.push(value)
193888c88e8eSopenharmony_ci        if (index === 0) {
193988c88e8eSopenharmony_ci          directions.push('horizon')
194088c88e8eSopenharmony_ci        } else {
194188c88e8eSopenharmony_ci          directions.push('vertical')
194288c88e8eSopenharmony_ci        }
194388c88e8eSopenharmony_ci      }
194488c88e8eSopenharmony_ci      if (tempResult.reason) {
194588c88e8eSopenharmony_ci        reasons.push(tempResult.reason)
194688c88e8eSopenharmony_ci      }
194788c88e8eSopenharmony_ci    }
194888c88e8eSopenharmony_ci  })
194988c88e8eSopenharmony_ci  if (directions.length != 2 || directions.length === 2 &&
195088c88e8eSopenharmony_ci    (directions[0] === 'vertical' || directions[1] === 'horizon')) {
195188c88e8eSopenharmony_ci    reasons.push(function (k, v) {
195288c88e8eSopenharmony_ci      return 'ERROR: Value `' + v + '` of the `' + util.camelCaseToHyphened(k) + '` attribute is incorrect.'
195388c88e8eSopenharmony_ci    })
195488c88e8eSopenharmony_ci  }
195588c88e8eSopenharmony_ci  return {
195688c88e8eSopenharmony_ci    value: result.length > 0 ? result.join(' ') : null,
195788c88e8eSopenharmony_ci    reason: reasons.length > 0 ?
195888c88e8eSopenharmony_ci      function (k, v) {
195988c88e8eSopenharmony_ci        return reasons.map(function (res) {
196088c88e8eSopenharmony_ci          if (typeof res === 'function') {
196188c88e8eSopenharmony_ci            return res(k, v)
196288c88e8eSopenharmony_ci          }
196388c88e8eSopenharmony_ci        }).join('\n')
196488c88e8eSopenharmony_ci      } : null
196588c88e8eSopenharmony_ci  }
196688c88e8eSopenharmony_ci}
196788c88e8eSopenharmony_ci
196888c88e8eSopenharmony_civar GRID_VALIDATOR = function GRID_VALIDATOR(v) {
196988c88e8eSopenharmony_ci  v = (v || '').toString().trim()
197088c88e8eSopenharmony_ci  if (v == 'auto' || v == 'auto-fill') {
197188c88e8eSopenharmony_ci    return { value: v }
197288c88e8eSopenharmony_ci  } else {
197388c88e8eSopenharmony_ci    return LENGTH(v, SUPPORT_CSS_GRID_UNIT)
197488c88e8eSopenharmony_ci  }
197588c88e8eSopenharmony_ci}
197688c88e8eSopenharmony_ci
197788c88e8eSopenharmony_civar GRID_TEMPLATE_VALIDATOR = function GRID_TEMPLATE_VALIDATOR(v) {
197888c88e8eSopenharmony_ci  v = (v || '').toString().trim()
197988c88e8eSopenharmony_ci  if (v.match(/^repeat/)) {
198088c88e8eSopenharmony_ci    let str = []
198188c88e8eSopenharmony_ci    if (v.match(/auto-fill/)) {
198288c88e8eSopenharmony_ci      let match = v.match(/^repeat\((.+),(.+)\)/)
198388c88e8eSopenharmony_ci      str.push(match[1].trim(), match[2].trim())
198488c88e8eSopenharmony_ci      return GRID_TEMPLATE_VALIDATOR(str.join(' '))
198588c88e8eSopenharmony_ci    } else {
198688c88e8eSopenharmony_ci      let match = v.match(/^repeat\((\d+),(.+)\)/)
198788c88e8eSopenharmony_ci      if (match[1] && match[2]) {
198888c88e8eSopenharmony_ci        let n = match[1]
198988c88e8eSopenharmony_ci          while (n > 0) {
199088c88e8eSopenharmony_ci            str.push(match[2].trim())
199188c88e8eSopenharmony_ci            n--
199288c88e8eSopenharmony_ci          }
199388c88e8eSopenharmony_ci        return GRID_TEMPLATE_VALIDATOR(str.join(' '))
199488c88e8eSopenharmony_ci      }
199588c88e8eSopenharmony_ci      else {
199688c88e8eSopenharmony_ci        return {
199788c88e8eSopenharmony_ci          value: null,
199888c88e8eSopenharmony_ci          reason: function reason(k, v, result) {
199988c88e8eSopenharmony_ci            return 'ERROR: The `' + util.camelCaseToHyphened(k) + '` attribute does not support value `' + v + '`.'
200088c88e8eSopenharmony_ci          }
200188c88e8eSopenharmony_ci        }
200288c88e8eSopenharmony_ci      }
200388c88e8eSopenharmony_ci    }
200488c88e8eSopenharmony_ci  }
200588c88e8eSopenharmony_ci  else {
200688c88e8eSopenharmony_ci    let value = []
200788c88e8eSopenharmony_ci    let reason = []
200888c88e8eSopenharmony_ci    let results = v.split(/\s+/).map(GRID_VALIDATOR)
200988c88e8eSopenharmony_ci    for (let i = 0; i < results.length; ++i) {
201088c88e8eSopenharmony_ci      let res = results[i]
201188c88e8eSopenharmony_ci      if (!res.value) {
201288c88e8eSopenharmony_ci        value = null
201388c88e8eSopenharmony_ci        reason = res.reason
201488c88e8eSopenharmony_ci        break
201588c88e8eSopenharmony_ci      }
201688c88e8eSopenharmony_ci      value.push(res.value)
201788c88e8eSopenharmony_ci      if (res.reason) {
201888c88e8eSopenharmony_ci        reason.push(res.reason)
201988c88e8eSopenharmony_ci      }
202088c88e8eSopenharmony_ci    }
202188c88e8eSopenharmony_ci
202288c88e8eSopenharmony_ci    if (!value) {
202388c88e8eSopenharmony_ci      return {
202488c88e8eSopenharmony_ci        value: value,
202588c88e8eSopenharmony_ci        reason: reason
202688c88e8eSopenharmony_ci      }
202788c88e8eSopenharmony_ci    } else {
202888c88e8eSopenharmony_ci      return {
202988c88e8eSopenharmony_ci        value: value.join(' '),
203088c88e8eSopenharmony_ci        reason: reason.length > 0 ? function(k, v, result) {
203188c88e8eSopenharmony_ci          return reason.map(function (res) {
203288c88e8eSopenharmony_ci            if (typeof res === 'function') {
203388c88e8eSopenharmony_ci              return res(k, v, result)
203488c88e8eSopenharmony_ci            }
203588c88e8eSopenharmony_ci          }).join('\n')
203688c88e8eSopenharmony_ci        } : null
203788c88e8eSopenharmony_ci      }
203888c88e8eSopenharmony_ci    }
203988c88e8eSopenharmony_ci  }
204088c88e8eSopenharmony_ci}
204188c88e8eSopenharmony_ci
204288c88e8eSopenharmony_civar DATE_VALIDATOR = function DATE_VALIDATOR(v) {
204388c88e8eSopenharmony_ci  v = (v || '').toString().trim()
204488c88e8eSopenharmony_ci  if (DATE_REGEXP.test(v)) {
204588c88e8eSopenharmony_ci    return { value: v }
204688c88e8eSopenharmony_ci  } else {
204788c88e8eSopenharmony_ci    return {
204888c88e8eSopenharmony_ci      value: null,
204988c88e8eSopenharmony_ci      reason:function (k, v, result) {
205088c88e8eSopenharmony_ci        return 'ERROR: The format of value `' + v + '` of the `' +
205188c88e8eSopenharmony_ci          util.camelCaseToHyphened(k) + '` attribute is incorrect.'
205288c88e8eSopenharmony_ci      }
205388c88e8eSopenharmony_ci    }
205488c88e8eSopenharmony_ci  }
205588c88e8eSopenharmony_ci}
205688c88e8eSopenharmony_ci
205788c88e8eSopenharmony_civar FILTER_VALIDATOR = function FILTER_VALIDATOR(v) {
205888c88e8eSopenharmony_ci  v = (v || '').toString().trim().replace(/\s*/g, '')
205988c88e8eSopenharmony_ci  if (FILTER_REGEXP.test(v)) {
206088c88e8eSopenharmony_ci    return { value: v }
206188c88e8eSopenharmony_ci  } else {
206288c88e8eSopenharmony_ci    return {
206388c88e8eSopenharmony_ci      value: null,
206488c88e8eSopenharmony_ci      reason:function (k, v, result) {
206588c88e8eSopenharmony_ci        return 'ERROR: The format of value `' + v + '` of the `' +
206688c88e8eSopenharmony_ci          util.camelCaseToHyphened(k) + '` attribute is incorrect.'
206788c88e8eSopenharmony_ci      }
206888c88e8eSopenharmony_ci    }
206988c88e8eSopenharmony_ci  }
207088c88e8eSopenharmony_ci}
207188c88e8eSopenharmony_ci
207288c88e8eSopenharmony_civar FILTER_PERCENTAGE_VALIDATOR = function FILTER_PERCENTAGE_VALIDATOR(v) {
207388c88e8eSopenharmony_ci  v = (v || '').toString().trim().replace(/\s*,\s*/g, " ")
207488c88e8eSopenharmony_ci  if (FILTER_PERCENTAGE_REGEXP.test(v)) {
207588c88e8eSopenharmony_ci    return { value: v }
207688c88e8eSopenharmony_ci  }
207788c88e8eSopenharmony_ci  if (FILTER_STYLE_REGEXP.test(v)) {
207888c88e8eSopenharmony_ci    const values = v.trim().split(/\s+/)
207988c88e8eSopenharmony_ci    if(values[1] && values.length === 2){
208088c88e8eSopenharmony_ci      const blurStyleValidator = genEnumValidator(['small_light', 'medium_light', 'large_light',
208188c88e8eSopenharmony_ci        'xlarge_light', 'small_dark', 'medium_dark', 'large_dark', 'xlarge_dark'])
208288c88e8eSopenharmony_ci      const blurStyleResult = blurStyleValidator(values[1])
208388c88e8eSopenharmony_ci      if(util.isValidValue(blurStyleResult.value)){
208488c88e8eSopenharmony_ci        return { value: v }
208588c88e8eSopenharmony_ci      }
208688c88e8eSopenharmony_ci      let reasonMaps = [];
208788c88e8eSopenharmony_ci      let length = 0;
208888c88e8eSopenharmony_ci      let check = checkReason(blurStyleResult, 'window-filter', values[1], length)
208988c88e8eSopenharmony_ci      if(check.realReason !== null) {
209088c88e8eSopenharmony_ci        reasonMaps.push(check.realReason)
209188c88e8eSopenharmony_ci      }
209288c88e8eSopenharmony_ci      return {
209388c88e8eSopenharmony_ci        value: check.length < 2 ? JSON.stringify(blurStyleResult.value) : null,
209488c88e8eSopenharmony_ci        reason: function(k, v) {
209588c88e8eSopenharmony_ci          return 'ERROR: ' + reasonMaps
209688c88e8eSopenharmony_ci        }
209788c88e8eSopenharmony_ci      }
209888c88e8eSopenharmony_ci    }
209988c88e8eSopenharmony_ci  }
210088c88e8eSopenharmony_ci  return {
210188c88e8eSopenharmony_ci    value: null,
210288c88e8eSopenharmony_ci    reason:function (k, v, result) {
210388c88e8eSopenharmony_ci      return 'ERROR: The format of value `' + v + '` of the `' + util.camelCaseToHyphened(k) +
210488c88e8eSopenharmony_ci        '` attribute is incorrect.'
210588c88e8eSopenharmony_ci    }
210688c88e8eSopenharmony_ci  }
210788c88e8eSopenharmony_ci}
210888c88e8eSopenharmony_ci
210988c88e8eSopenharmony_civar BORDER_IMAGE_VALIDATOR = function BORDER_IMAGE_VALIDATOR(v) {
211088c88e8eSopenharmony_ci  var regexp = /(repeating-linear|linear).*?(?=\s*(repeating|linear)|$)/g;
211188c88e8eSopenharmony_ci  if (regexp.test(v)) {
211288c88e8eSopenharmony_ci    return BORDER_IMAGE_GRADIENT_VALIDATOR(v);
211388c88e8eSopenharmony_ci  } else {
211488c88e8eSopenharmony_ci    return BORDER_IMAGE_URL_VALIDATOR(v);
211588c88e8eSopenharmony_ci  }
211688c88e8eSopenharmony_ci}
211788c88e8eSopenharmony_ci
211888c88e8eSopenharmony_civar BORDER_IMAGE_URL_VALIDATOR = function BORDER_IMAGE_URL_VALIDATOR(v) {
211988c88e8eSopenharmony_ci  let base = {
212088c88e8eSopenharmony_ci    values: []
212188c88e8eSopenharmony_ci  };
212288c88e8eSopenharmony_ci  let value = {
212388c88e8eSopenharmony_ci    url: "",
212488c88e8eSopenharmony_ci    repeat: ""
212588c88e8eSopenharmony_ci  };
212688c88e8eSopenharmony_ci  var URL_REGEXP_FIRST = /^url\(\s*['"]?\s*([^()]+?)\s*['"]?\s*\)(.*)/;
212788c88e8eSopenharmony_ci  var regexpFirst = /(stretch|round|repeat|space)$/;
212888c88e8eSopenharmony_ci  var URL_REGEXP_SECOND = /^(.*)(stretch|round|repeat|space)$/;
212988c88e8eSopenharmony_ci  let result;
213088c88e8eSopenharmony_ci  result = URL_REGEXP_FIRST.exec(v);
213188c88e8eSopenharmony_ci  if (regexpFirst.test(result[2])) {
213288c88e8eSopenharmony_ci    let res = URL_REGEXP_SECOND.exec(result[2]);
213388c88e8eSopenharmony_ci    value = BORDER_IMAGE_NOL(res[1]);
213488c88e8eSopenharmony_ci    value.repeat = res[2];
213588c88e8eSopenharmony_ci  } else {
213688c88e8eSopenharmony_ci    var reg = /px|%/;
213788c88e8eSopenharmony_ci    if (reg.test(result[2])) {
213888c88e8eSopenharmony_ci      value = BORDER_IMAGE_NOL(result[2]);
213988c88e8eSopenharmony_ci    }
214088c88e8eSopenharmony_ci  }
214188c88e8eSopenharmony_ci  value.url = result[1];
214288c88e8eSopenharmony_ci  base.values.push(value);
214388c88e8eSopenharmony_ci  return {
214488c88e8eSopenharmony_ci    value: JSON.stringify(base)
214588c88e8eSopenharmony_ci  };
214688c88e8eSopenharmony_ci}
214788c88e8eSopenharmony_ci
214888c88e8eSopenharmony_civar BORDER_IMAGE_NOL = function BORDER_IMAGE_NOL(v) {
214988c88e8eSopenharmony_ci  let value = {
215088c88e8eSopenharmony_ci    url: "",
215188c88e8eSopenharmony_ci    repeat: ""
215288c88e8eSopenharmony_ci  };
215388c88e8eSopenharmony_ci  var reg = /px|%/;
215488c88e8eSopenharmony_ci  if (!reg.test(v)) {
215588c88e8eSopenharmony_ci    return value;
215688c88e8eSopenharmony_ci  }
215788c88e8eSopenharmony_ci  let num = v.split(/\//);
215888c88e8eSopenharmony_ci  switch (num.length) {
215988c88e8eSopenharmony_ci    case 1:
216088c88e8eSopenharmony_ci    value.slice = BORDER_IMAGE_SPLIT(num[0]);
216188c88e8eSopenharmony_ci    break;
216288c88e8eSopenharmony_ci    case 2:
216388c88e8eSopenharmony_ci    value.slice = BORDER_IMAGE_SPLIT(num[0]);
216488c88e8eSopenharmony_ci    value.width = BORDER_IMAGE_SPLIT(num[1]);
216588c88e8eSopenharmony_ci    break;
216688c88e8eSopenharmony_ci    case 3:
216788c88e8eSopenharmony_ci    value.slice = BORDER_IMAGE_SPLIT(num[0]);
216888c88e8eSopenharmony_ci    value.width = BORDER_IMAGE_SPLIT(num[1]);
216988c88e8eSopenharmony_ci    value.outset = BORDER_IMAGE_SPLIT(num[2]);
217088c88e8eSopenharmony_ci    break;
217188c88e8eSopenharmony_ci  }
217288c88e8eSopenharmony_ci  return value;
217388c88e8eSopenharmony_ci}
217488c88e8eSopenharmony_ci
217588c88e8eSopenharmony_civar BORDER_IMAGE_SPLIT = function BORDER_IMAGE_SPLIT(v) {
217688c88e8eSopenharmony_ci  const NUM_REGEXP = SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR(v);
217788c88e8eSopenharmony_ci  let result = [];
217888c88e8eSopenharmony_ci  const value = NUM_REGEXP.value.split(/\s/);
217988c88e8eSopenharmony_ci  value.forEach(element => {
218088c88e8eSopenharmony_ci    result.push(element);
218188c88e8eSopenharmony_ci  });
218288c88e8eSopenharmony_ci  return result;
218388c88e8eSopenharmony_ci}
218488c88e8eSopenharmony_ci
218588c88e8eSopenharmony_civar BORDER_IMAGE_GRADIENT_VALIDATOR = function BORDER_IMAGE_GRADIENT_VALIDATOR(v) {
218688c88e8eSopenharmony_ci  v = (v || "").toString().trim()
218788c88e8eSopenharmony_ci  var BORDER_IMAGE_GRADIENT_ITEM_REGEXP = /^([0-9a-zA-Z-]+)\((.*)\)(.*)/;
218888c88e8eSopenharmony_ci  let base = {
218988c88e8eSopenharmony_ci    values: []
219088c88e8eSopenharmony_ci  }
219188c88e8eSopenharmony_ci  let valueMatch = v.match(BORDER_IMAGE_GRADIENT_ITEM_REGEXP)
219288c88e8eSopenharmony_ci  if (valueMatch) {
219388c88e8eSopenharmony_ci    const gradientStr = valueMatch[1].toString() + '(' + valueMatch[2].toString() + ')';
219488c88e8eSopenharmony_ci    const gradient = LINEAR_GRADIENT_VALIDATOR(gradientStr);
219588c88e8eSopenharmony_ci    let value = {};
219688c88e8eSopenharmony_ci    if (util.isValidValue(gradient.value)) {
219788c88e8eSopenharmony_ci      value = JSON.parse(gradient.value)
219888c88e8eSopenharmony_ci    }
219988c88e8eSopenharmony_ci    var reg = /px|%/;
220088c88e8eSopenharmony_ci    if (valueMatch[3].match(reg)) {
220188c88e8eSopenharmony_ci      value.slice = BORDER_IMAGE_SPLIT(valueMatch[3]);
220288c88e8eSopenharmony_ci    }
220388c88e8eSopenharmony_ci    base.values.push(value);
220488c88e8eSopenharmony_ci    return {
220588c88e8eSopenharmony_ci      value: JSON.stringify(base),
220688c88e8eSopenharmony_ci      reason: gradient.reason
220788c88e8eSopenharmony_ci    }
220888c88e8eSopenharmony_ci  }
220988c88e8eSopenharmony_ci  return {
221088c88e8eSopenharmony_ci    value: null,
221188c88e8eSopenharmony_ci    reason: function(k, v) {
221288c88e8eSopenharmony_ci      return 'ERROR: The format of value `' + v + '` of the `' + util.camelCaseToHyphened(k)
221388c88e8eSopenharmony_ci        + '` attribute is incorrect.'
221488c88e8eSopenharmony_ci    }
221588c88e8eSopenharmony_ci  }
221688c88e8eSopenharmony_ci}
221788c88e8eSopenharmony_ci
221888c88e8eSopenharmony_civar Color_Picker_VALIDATOR = function Color_Picker_VALIDATOR(v) {
221988c88e8eSopenharmony_ci  v = (v || "").toString().trim()
222088c88e8eSopenharmony_ci  let num = v.split(/\//);
222188c88e8eSopenharmony_ci  let base = {
222288c88e8eSopenharmony_ci    cValues: []
222388c88e8eSopenharmony_ci  }
222488c88e8eSopenharmony_ci  num.forEach(element => {
222588c88e8eSopenharmony_ci    base.cValues.push(COLOR_VAR_VALIDATOR(element).value);
222688c88e8eSopenharmony_ci  });
222788c88e8eSopenharmony_ci  return {
222888c88e8eSopenharmony_ci    value: JSON.stringify(base)
222988c88e8eSopenharmony_ci  }
223088c88e8eSopenharmony_ci}
223188c88e8eSopenharmony_ci
223288c88e8eSopenharmony_civar RICH_PROP_NAME_GROUPS = {
223388c88e8eSopenharmony_ci  boxModel: {
223488c88e8eSopenharmony_ci    width: PERCENTAGE_LENGTH_VALIDATOR,
223588c88e8eSopenharmony_ci    height: PERCENTAGE_LENGTH_VALIDATOR,
223688c88e8eSopenharmony_ci    overflow: genEnumValidator(['auto', 'hidden','scroll','visible']),
223788c88e8eSopenharmony_ci    padding: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR,
223888c88e8eSopenharmony_ci    paddingLeft: PERCENTAGE_LENGTH_VALIDATOR,
223988c88e8eSopenharmony_ci    paddingRight: PERCENTAGE_LENGTH_VALIDATOR,
224088c88e8eSopenharmony_ci    paddingTop: PERCENTAGE_LENGTH_VALIDATOR,
224188c88e8eSopenharmony_ci    paddingBottom: PERCENTAGE_LENGTH_VALIDATOR,
224288c88e8eSopenharmony_ci    paddingStart: PERCENTAGE_LENGTH_VALIDATOR,
224388c88e8eSopenharmony_ci    paddingEnd: PERCENTAGE_LENGTH_VALIDATOR,
224488c88e8eSopenharmony_ci    margin: SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR,
224588c88e8eSopenharmony_ci    marginLeft: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
224688c88e8eSopenharmony_ci    marginRight: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
224788c88e8eSopenharmony_ci    marginTop: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
224888c88e8eSopenharmony_ci    marginBottom: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
224988c88e8eSopenharmony_ci    marginStart: PERCENTAGE_LENGTH_VALIDATOR,
225088c88e8eSopenharmony_ci    marginEnd: PERCENTAGE_LENGTH_VALIDATOR,
225188c88e8eSopenharmony_ci    placeholderColor: COLOR_VAR_VALIDATOR,
225288c88e8eSopenharmony_ci    selectedColor: COLOR_VAR_VALIDATOR,
225388c88e8eSopenharmony_ci    caretColor: COLOR_VAR_VALIDATOR,
225488c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
225588c88e8eSopenharmony_ci    progressColor: COLOR_VAR_VALIDATOR,
225688c88e8eSopenharmony_ci    slideWidth: LENGTH_VALIDATOR,
225788c88e8eSopenharmony_ci    slideMargin: LENGTH_VALIDATOR,
225888c88e8eSopenharmony_ci    resizeMode: genEnumValidator(['cover', 'contain', 'stretch', 'center']),
225988c88e8eSopenharmony_ci    columns: NUMBER_VALIDATOR,
226088c88e8eSopenharmony_ci    columnSpan: NUMBER_VALIDATOR,
226188c88e8eSopenharmony_ci    maskColor: COLOR_VAR_VALIDATOR,
226288c88e8eSopenharmony_ci    mylocation: MYLOCATION_VALIDATOR,
226388c88e8eSopenharmony_ci    mylocationFillColor: COLOR_VAR_VALIDATOR,
226488c88e8eSopenharmony_ci    mylocationStrokeColor: COLOR_VAR_VALIDATOR,
226588c88e8eSopenharmony_ci    mylocationIconPath: URL_VALIDATOR,
226688c88e8eSopenharmony_ci    displayIndex: NUMBER_VALIDATOR,
226788c88e8eSopenharmony_ci    aspectRatio: NUMBER_VALIDATOR,
226888c88e8eSopenharmony_ci    minWidth: PERCENTAGE_LENGTH_VALIDATOR,
226988c88e8eSopenharmony_ci    minHeight: PERCENTAGE_LENGTH_VALIDATOR,
227088c88e8eSopenharmony_ci    maxWidth: PERCENTAGE_LENGTH_VALIDATOR,
227188c88e8eSopenharmony_ci    maxHeight: PERCENTAGE_LENGTH_VALIDATOR,
227288c88e8eSopenharmony_ci    flexWeight: NUMBER_VALIDATOR,
227388c88e8eSopenharmony_ci    boxShadow: BOX_SHADOW_VALIDATOR,
227488c88e8eSopenharmony_ci    boxShadowH: LENGTH_VALIDATOR,
227588c88e8eSopenharmony_ci    boxShadowV: LENGTH_VALIDATOR,
227688c88e8eSopenharmony_ci    boxShadowBlur: LENGTH_VALIDATOR,
227788c88e8eSopenharmony_ci    boxShadowSpread: LENGTH_VALIDATOR,
227888c88e8eSopenharmony_ci    boxShadowColor: COLOR_VAR_VALIDATOR,
227988c88e8eSopenharmony_ci    filter: FILTER_VALIDATOR,
228088c88e8eSopenharmony_ci    backdropFilter: FILTER_VALIDATOR,
228188c88e8eSopenharmony_ci    windowFilter: FILTER_PERCENTAGE_VALIDATOR,
228288c88e8eSopenharmony_ci    transitionEffect: genEnumValidator(['unfold', 'none'])
228388c88e8eSopenharmony_ci  },
228488c88e8eSopenharmony_ci  div: {
228588c88e8eSopenharmony_ci    gridTemplateColumns: GRID_TEMPLATE_VALIDATOR,
228688c88e8eSopenharmony_ci    gridTemplateRows: GRID_TEMPLATE_VALIDATOR,
228788c88e8eSopenharmony_ci    gridGap: LENGTH_VALIDATOR,
228888c88e8eSopenharmony_ci    gridColumnsGap: LENGTH_VALIDATOR,
228988c88e8eSopenharmony_ci    gridRowsGap: LENGTH_VALIDATOR,
229088c88e8eSopenharmony_ci    gridRowStart: NUMBER_VALIDATOR,
229188c88e8eSopenharmony_ci    gridRowEnd: NUMBER_VALIDATOR,
229288c88e8eSopenharmony_ci    gridColumnStart: NUMBER_VALIDATOR,
229388c88e8eSopenharmony_ci    gridColumnEnd: NUMBER_VALIDATOR,
229488c88e8eSopenharmony_ci    gridAutoFlow: genEnumValidator(['row', 'column'])
229588c88e8eSopenharmony_ci  },
229688c88e8eSopenharmony_ci  border: {
229788c88e8eSopenharmony_ci    border: BORDER_VALIDATOR,
229888c88e8eSopenharmony_ci    borderWidth: SHORTHAND_LENGTH_VALIDATOR,
229988c88e8eSopenharmony_ci    borderLeftWidth: LENGTH_VALIDATOR,
230088c88e8eSopenharmony_ci    borderTopWidth: LENGTH_VALIDATOR,
230188c88e8eSopenharmony_ci    borderRightWidth: LENGTH_VALIDATOR,
230288c88e8eSopenharmony_ci    borderBottomWidth: LENGTH_VALIDATOR,
230388c88e8eSopenharmony_ci    borderColor: SHORTHAND_COLOR_VALIDATOR,
230488c88e8eSopenharmony_ci    borderLeftColor: COLOR_VAR_VALIDATOR,
230588c88e8eSopenharmony_ci    borderTopColor: COLOR_VAR_VALIDATOR,
230688c88e8eSopenharmony_ci    borderRightColor: COLOR_VAR_VALIDATOR,
230788c88e8eSopenharmony_ci    borderBottomColor: COLOR_VAR_VALIDATOR,
230888c88e8eSopenharmony_ci    borderStyle: SHORTHAND_STYLE_VALIDATOR,
230988c88e8eSopenharmony_ci    borderTopStyle: STYLE_VALIDATOR,
231088c88e8eSopenharmony_ci    borderRightStyle: STYLE_VALIDATOR,
231188c88e8eSopenharmony_ci    borderBottomStyle: STYLE_VALIDATOR,
231288c88e8eSopenharmony_ci    borderLeftStyle: STYLE_VALIDATOR,
231388c88e8eSopenharmony_ci    borderRadius: PERCENTAGE_LENGTH_VALIDATOR,
231488c88e8eSopenharmony_ci    borderBottomLeftRadius: PERCENTAGE_LENGTH_VALIDATOR,
231588c88e8eSopenharmony_ci    borderBottomRightRadius: PERCENTAGE_LENGTH_VALIDATOR,
231688c88e8eSopenharmony_ci    borderTopLeftRadius: PERCENTAGE_LENGTH_VALIDATOR,
231788c88e8eSopenharmony_ci    borderTopRightRadius: PERCENTAGE_LENGTH_VALIDATOR,
231888c88e8eSopenharmony_ci    borderLeft: BORDER_VALIDATOR,
231988c88e8eSopenharmony_ci    borderRight: BORDER_VALIDATOR,
232088c88e8eSopenharmony_ci    borderTop: BORDER_VALIDATOR,
232188c88e8eSopenharmony_ci    borderBottom: BORDER_VALIDATOR,
232288c88e8eSopenharmony_ci    borderImage: BORDER_IMAGE_VALIDATOR,
232388c88e8eSopenharmony_ci    borderImageSource: URL_VALIDATOR,
232488c88e8eSopenharmony_ci    borderImageOutset: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR,
232588c88e8eSopenharmony_ci    borderImageSlice: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR,
232688c88e8eSopenharmony_ci    borderImageWidth: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR,
232788c88e8eSopenharmony_ci    borderImageRepeat: genEnumValidator(['stretch', 'round', 'repeat', 'space'])
232888c88e8eSopenharmony_ci  },
232988c88e8eSopenharmony_ci  indicator: {
233088c88e8eSopenharmony_ci    indicatorSize: LENGTH_VALIDATOR,
233188c88e8eSopenharmony_ci    indicatorTop: PERCENTAGE_LENGTH_VALIDATOR,
233288c88e8eSopenharmony_ci    indicatorRight: PERCENTAGE_LENGTH_VALIDATOR,
233388c88e8eSopenharmony_ci    indicatorBottom: PERCENTAGE_LENGTH_VALIDATOR,
233488c88e8eSopenharmony_ci    indicatorLeft: PERCENTAGE_LENGTH_VALIDATOR,
233588c88e8eSopenharmony_ci    indicatorColor: COLOR_VAR_VALIDATOR,
233688c88e8eSopenharmony_ci    indicatorSelectedColor: COLOR_VAR_VALIDATOR
233788c88e8eSopenharmony_ci  },
233888c88e8eSopenharmony_ci  animation: {
233988c88e8eSopenharmony_ci    animationDuration: TIME_VALIDATOR,
234088c88e8eSopenharmony_ci    animationDelay: TIME_VALIDATOR,
234188c88e8eSopenharmony_ci    animationName: NAME_VALIDATOR,
234288c88e8eSopenharmony_ci    animationTimingFunction: TRANSITION_TIMING_FUNCTION_VALIDATOR,
234388c88e8eSopenharmony_ci    animationIterationCount: ITERATIONCOUNT_VALIDATOR,
234488c88e8eSopenharmony_ci    animationFillMode: genEnumValidator(['none', 'forwards', 'backwards', 'both']),
234588c88e8eSopenharmony_ci    animationPlayState: genEnumValidator(['running', 'paused']),
234688c88e8eSopenharmony_ci    animationDirection: genEnumValidator(['normal', 'reverse', 'alternate', 'alternate-reverse']),
234788c88e8eSopenharmony_ci    animation: ANIMATION_VALIDATOR,
234888c88e8eSopenharmony_ci  },
234988c88e8eSopenharmony_ci  flexbox: {
235088c88e8eSopenharmony_ci    flex: genEnumValidator(['none', 'auto', 'initial']),
235188c88e8eSopenharmony_ci    flexWrap: genEnumValidator(['nowrap', 'wrap']),
235288c88e8eSopenharmony_ci    flexGrow: NUMBER_VALIDATOR,
235388c88e8eSopenharmony_ci    flexShrink: NUMBER_VALIDATOR,
235488c88e8eSopenharmony_ci    flexBasis: LENGTH_VALIDATOR,
235588c88e8eSopenharmony_ci    flexDirection: genEnumValidator(['row', 'column']),
235688c88e8eSopenharmony_ci    justifyContent: genEnumValidator(['flex-start', 'flex-end', 'center', 'space-between',
235788c88e8eSopenharmony_ci      'space-around', 'space-evenly']),
235888c88e8eSopenharmony_ci    alignItems: genEnumValidator(['stretch', 'flex-start', 'flex-end', 'center', 'baseline']),
235988c88e8eSopenharmony_ci    alignContent: genEnumValidator(['stretch', 'flex-start', 'flex-end', 'center', 'space-between', 'space-around']),
236088c88e8eSopenharmony_ci    alignSelf: genEnumValidator(["auto", "flex-start", "flex-end", "center", "baseline", "stretch"])
236188c88e8eSopenharmony_ci  },
236288c88e8eSopenharmony_ci  position: {
236388c88e8eSopenharmony_ci    position: genEnumValidator(['relative', 'fixed', 'absolute']),
236488c88e8eSopenharmony_ci    top: PERCENTAGE_LENGTH_VALIDATOR,
236588c88e8eSopenharmony_ci    bottom: PERCENTAGE_LENGTH_VALIDATOR,
236688c88e8eSopenharmony_ci    left: PERCENTAGE_LENGTH_VALIDATOR,
236788c88e8eSopenharmony_ci    right: PERCENTAGE_LENGTH_VALIDATOR,
236888c88e8eSopenharmony_ci    zIndex: INTEGER_VALIDATOR
236988c88e8eSopenharmony_ci  },
237088c88e8eSopenharmony_ci  common: {
237188c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
237288c88e8eSopenharmony_ci    background: BACKGROUND_VALIDATOR,
237388c88e8eSopenharmony_ci    backgroundColor: COLOR_VAR_VALIDATOR,
237488c88e8eSopenharmony_ci    backgroundImage: URL_VALIDATOR,
237588c88e8eSopenharmony_ci    backgroundRepeat: genEnumValidator(['repeat', 'no-repeat', 'repeat-x', 'repeat-y']),
237688c88e8eSopenharmony_ci    visibility: genEnumValidator(['visible', 'hidden']),
237788c88e8eSopenharmony_ci    objectFit: genEnumValidator(['cover', 'fill', 'contain', 'none', 'scale-down']),
237888c88e8eSopenharmony_ci    backgroundSize: BACKGROUND_SIZE_VALIDATOR,
237988c88e8eSopenharmony_ci    backgroundPosition: BACKGROUND_POSITION_VALIDATOR,
238088c88e8eSopenharmony_ci    display: genEnumValidator(['flex', 'none', 'grid']),
238188c88e8eSopenharmony_ci    imageFill: COLOR_VAR_VALIDATOR,
238288c88e8eSopenharmony_ci    maskImage: MASK_VALIDATOR,
238388c88e8eSopenharmony_ci    maskPosition: BACKGROUND_POSITION_VALIDATOR,
238488c88e8eSopenharmony_ci    maskSize: BACKGROUND_SIZE_VALIDATOR
238588c88e8eSopenharmony_ci  },
238688c88e8eSopenharmony_ci  text: {
238788c88e8eSopenharmony_ci    lines: INTEGER_VALIDATOR,
238888c88e8eSopenharmony_ci    color: COLOR_VAR_VALIDATOR,
238988c88e8eSopenharmony_ci    fontSize: LENGTH_VALIDATOR,
239088c88e8eSopenharmony_ci    fontStyle: genEnumValidator(['normal', 'italic']),
239188c88e8eSopenharmony_ci    fontFamily: ANYTHING_VALIDATOR,
239288c88e8eSopenharmony_ci    fontWeight: genEnumValidator(['normal', 'lighter', 'bold', 'bolder', "medium", "regular",
239388c88e8eSopenharmony_ci      '100', '200', '300', '400', '500', '600', '700', '800', '900']),
239488c88e8eSopenharmony_ci    textDecoration: genEnumValidator(['none', 'underline', 'line-through']),
239588c88e8eSopenharmony_ci    textAlign: genEnumValidator(['start', 'end', 'left', 'center', 'right']),
239688c88e8eSopenharmony_ci    textOverflow: genEnumValidator(['clip', 'ellipsis']),
239788c88e8eSopenharmony_ci    textIndent: TEXT_INDENT_VALIDATOR,
239888c88e8eSopenharmony_ci    lineHeight: TEXT_LINE_HEIGHT_VALIDATOR,
239988c88e8eSopenharmony_ci    letterSpacing: LENGTH_VALIDATOR,
240088c88e8eSopenharmony_ci    minLines: NUMBER_VALIDATOR,
240188c88e8eSopenharmony_ci    maxLines: ANYTHING_VALIDATOR,
240288c88e8eSopenharmony_ci    minFontSize: LENGTH_VALIDATOR,
240388c88e8eSopenharmony_ci    maxFontSize: LENGTH_VALIDATOR,
240488c88e8eSopenharmony_ci    fontSizeStep: LENGTH_VALIDATOR,
240588c88e8eSopenharmony_ci    preferFontSizes: ARRAY_LENGTH_VALIDATOR,
240688c88e8eSopenharmony_ci    adaptHeight: genEnumValidator(['true', 'false']),
240788c88e8eSopenharmony_ci    allowScale: genEnumValidator(['true', 'false']),
240888c88e8eSopenharmony_ci    fontVariant: ANYTHING_VALIDATOR,
240988c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
241088c88e8eSopenharmony_ci    x: PERCENTAGE_LENGTH_VALIDATOR,
241188c88e8eSopenharmony_ci    y: PERCENTAGE_LENGTH_VALIDATOR,
241288c88e8eSopenharmony_ci    dx: PERCENTAGE_LENGTH_VALIDATOR,
241388c88e8eSopenharmony_ci    dy: PERCENTAGE_LENGTH_VALIDATOR,
241488c88e8eSopenharmony_ci    rotate: NUMBER_VALIDATOR,
241588c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
241688c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
241788c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
241888c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
241988c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
242088c88e8eSopenharmony_ci    fontFeatureSettings: ANYTHING_VALIDATOR,
242188c88e8eSopenharmony_ci    textDecorationColor: COLOR_VAR_VALIDATOR
242288c88e8eSopenharmony_ci  },
242388c88e8eSopenharmony_ci  calendar: {
242488c88e8eSopenharmony_ci    boundaryColOffset: LENGTH_VALIDATOR,
242588c88e8eSopenharmony_ci    boundaryRowOffset: LENGTH_VALIDATOR,
242688c88e8eSopenharmony_ci    colSpace: LENGTH_VALIDATOR,
242788c88e8eSopenharmony_ci    dailyFiveRowSpace: LENGTH_VALIDATOR,
242888c88e8eSopenharmony_ci    dayColor: COLOR_VAR_VALIDATOR,
242988c88e8eSopenharmony_ci    dayFontSize: LENGTH_VALIDATOR,
243088c88e8eSopenharmony_ci    dayHeight: LENGTH_VALIDATOR,
243188c88e8eSopenharmony_ci    dayWidth: LENGTH_VALIDATOR,
243288c88e8eSopenharmony_ci    focusedAreaBackgroundColor: COLOR_VAR_VALIDATOR,
243388c88e8eSopenharmony_ci    focusedAreaRadius: LENGTH_VALIDATOR,
243488c88e8eSopenharmony_ci    focusedDayColor: COLOR_VAR_VALIDATOR,
243588c88e8eSopenharmony_ci    focusedLunarColor: COLOR_VAR_VALIDATOR,
243688c88e8eSopenharmony_ci    gregorianCalendarHeight: LENGTH_VALIDATOR,
243788c88e8eSopenharmony_ci    lunarColor: COLOR_VAR_VALIDATOR,
243888c88e8eSopenharmony_ci    lunarDayFontSize: LENGTH_VALIDATOR,
243988c88e8eSopenharmony_ci    lunarDayYAxisOffset: LENGTH_VALIDATOR,
244088c88e8eSopenharmony_ci    lunarHeight: LENGTH_VALIDATOR,
244188c88e8eSopenharmony_ci    markLunarColor: COLOR_VAR_VALIDATOR,
244288c88e8eSopenharmony_ci    nonCurrentMonthDayColor: COLOR_VAR_VALIDATOR,
244388c88e8eSopenharmony_ci    nonCurrentMonthLunarColor: COLOR_VAR_VALIDATOR,
244488c88e8eSopenharmony_ci    nonCurrentMonthOffDayMarkColor: COLOR_VAR_VALIDATOR,
244588c88e8eSopenharmony_ci    nonCurrentMonthWorkDayMarkColor: COLOR_VAR_VALIDATOR,
244688c88e8eSopenharmony_ci    offDayMarkColor: COLOR_VAR_VALIDATOR,
244788c88e8eSopenharmony_ci    offDayMarkSize: LENGTH_VALIDATOR,
244888c88e8eSopenharmony_ci    scheduleMarkerRadius: LENGTH_VALIDATOR,
244988c88e8eSopenharmony_ci    scheduleMarkerXAxisOffset: LENGTH_VALIDATOR,
245088c88e8eSopenharmony_ci    scheduleMarkerYAxisOffset: LENGTH_VALIDATOR,
245188c88e8eSopenharmony_ci    underscoreLength: LENGTH_VALIDATOR,
245288c88e8eSopenharmony_ci    underscoreWidth: LENGTH_VALIDATOR,
245388c88e8eSopenharmony_ci    underscoreXAxisOffset: LENGTH_VALIDATOR,
245488c88e8eSopenharmony_ci    underscoreYAxisOffset: LENGTH_VALIDATOR,
245588c88e8eSopenharmony_ci    weekAndDayRowSpace: LENGTH_VALIDATOR,
245688c88e8eSopenharmony_ci    weekColor: COLOR_VAR_VALIDATOR,
245788c88e8eSopenharmony_ci    weekFontSize: LENGTH_VALIDATOR,
245888c88e8eSopenharmony_ci    weekHeight: LENGTH_VALIDATOR,
245988c88e8eSopenharmony_ci    weekWidth: LENGTH_VALIDATOR,
246088c88e8eSopenharmony_ci    weekendDayColor: COLOR_VAR_VALIDATOR,
246188c88e8eSopenharmony_ci    weekendLunarColor: COLOR_VAR_VALIDATOR,
246288c88e8eSopenharmony_ci    workDayMarkColor: COLOR_VAR_VALIDATOR,
246388c88e8eSopenharmony_ci    workDayMarkSize: LENGTH_VALIDATOR,
246488c88e8eSopenharmony_ci    workStateHorizontalMovingDistance: LENGTH_VALIDATOR,
246588c88e8eSopenharmony_ci    workStateVerticalMovingDistance: LENGTH_VALIDATOR,
246688c88e8eSopenharmony_ci    workStateWidth: LENGTH_VALIDATOR
246788c88e8eSopenharmony_ci  },
246888c88e8eSopenharmony_ci  rating: {
246988c88e8eSopenharmony_ci    starBackground: URL_VALIDATOR,
247088c88e8eSopenharmony_ci    starForeground: URL_VALIDATOR,
247188c88e8eSopenharmony_ci    starSecondary: URL_VALIDATOR,
247288c88e8eSopenharmony_ci    rtlFlip: genEnumValidator(['true', 'false'])
247388c88e8eSopenharmony_ci  },
247488c88e8eSopenharmony_ci  transition: {
247588c88e8eSopenharmony_ci    transitionProperty: TRANSITION_PROPERTY_VALIDATOR,
247688c88e8eSopenharmony_ci    transitionDuration: TRANSITION_INTERVAL_VALIDATOR,
247788c88e8eSopenharmony_ci    transitionDelay: TRANSITION_INTERVAL_VALIDATOR,
247888c88e8eSopenharmony_ci    transitionEnter: NAME_VALIDATOR,
247988c88e8eSopenharmony_ci    transitionExit: NAME_VALIDATOR,
248088c88e8eSopenharmony_ci    transitionDuration: TIME_VALIDATOR,
248188c88e8eSopenharmony_ci    transitionTimingFunction: TRANSITION_TIMING_FUNCTION_VALIDATOR
248288c88e8eSopenharmony_ci  },
248388c88e8eSopenharmony_ci  transform: {
248488c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
248588c88e8eSopenharmony_ci    transformOrigin: TRANSFORM_ORIGIN_VALIDATOR
248688c88e8eSopenharmony_ci  },
248788c88e8eSopenharmony_ci  customized: {
248888c88e8eSopenharmony_ci    itemSize: LENGTH_VALIDATOR,
248988c88e8eSopenharmony_ci    itemColor: COLOR_VAR_VALIDATOR,
249088c88e8eSopenharmony_ci    itemSelectedColor: COLOR_VAR_VALIDATOR,
249188c88e8eSopenharmony_ci    textColor: COLOR_VAR_VALIDATOR,
249288c88e8eSopenharmony_ci    timeColor: COLOR_VAR_VALIDATOR,
249388c88e8eSopenharmony_ci    textHighlightColor: COLOR_VAR_VALIDATOR
249488c88e8eSopenharmony_ci  },
249588c88e8eSopenharmony_ci  list: {
249688c88e8eSopenharmony_ci    itemExtent: PERCENTAGE_LENGTH_VALIDATOR,
249788c88e8eSopenharmony_ci    fadeColor: COLOR_VAR_VALIDATOR,
249888c88e8eSopenharmony_ci    dividerColor: COLOR_VAR_VALIDATOR,
249988c88e8eSopenharmony_ci    dividerHeight: LENGTH_VALIDATOR,
250088c88e8eSopenharmony_ci    dividerLength: LENGTH_VALIDATOR,
250188c88e8eSopenharmony_ci    dividerOrigin: LENGTH_VALIDATOR,
250288c88e8eSopenharmony_ci    scrollbarColor: COLOR_VALIDATOR,
250388c88e8eSopenharmony_ci    scrollbarWidth: LENGTH_VALIDATOR,
250488c88e8eSopenharmony_ci    scrollbarOffset: ARRAY_LENGTH_VALIDATOR
250588c88e8eSopenharmony_ci  },
250688c88e8eSopenharmony_ci  progress: {
250788c88e8eSopenharmony_ci    secondaryColor: COLOR_VAR_VALIDATOR,
250888c88e8eSopenharmony_ci    scaleWidth: LENGTH_VALIDATOR,
250988c88e8eSopenharmony_ci    scaleNumber: NUMBER_VALIDATOR,
251088c88e8eSopenharmony_ci    startAngle: ANGLE_VALIDATOR,
251188c88e8eSopenharmony_ci    totalAngle: ANGLE_VALIDATOR,
251288c88e8eSopenharmony_ci    centerX: LENGTH_VALIDATOR,
251388c88e8eSopenharmony_ci    centerY: LENGTH_VALIDATOR,
251488c88e8eSopenharmony_ci    radius: LENGTH_VALIDATOR,
251588c88e8eSopenharmony_ci    direction: genEnumValidator(['start-to-end', 'end-to-start']),
251688c88e8eSopenharmony_ci    sections: NAME_VALIDATOR,
251788c88e8eSopenharmony_ci    colors: ARRAY_COLOR_VALIDATOR,
251888c88e8eSopenharmony_ci    weights: ARRAY_NUMBER_VALIDATOR
251988c88e8eSopenharmony_ci  },
252088c88e8eSopenharmony_ci  navigation: {
252188c88e8eSopenharmony_ci    titleColor: COLOR_VAR_VALIDATOR,
252288c88e8eSopenharmony_ci    subtitleColor: COLOR_VAR_VALIDATOR
252388c88e8eSopenharmony_ci  },
252488c88e8eSopenharmony_ci  button: {
252588c88e8eSopenharmony_ci    iconWidth: LENGTH_VALIDATOR,
252688c88e8eSopenharmony_ci    iconHeight: LENGTH_VALIDATOR
252788c88e8eSopenharmony_ci  },
252888c88e8eSopenharmony_ci  switch: {
252988c88e8eSopenharmony_ci    textonColor: COLOR_VAR_VALIDATOR,
253088c88e8eSopenharmony_ci    textoffColor: COLOR_VAR_VALIDATOR,
253188c88e8eSopenharmony_ci    textPadding: LENGTH_VALIDATOR
253288c88e8eSopenharmony_ci  },
253388c88e8eSopenharmony_ci  share: {
253488c88e8eSopenharmony_ci    sharedTransitionEffect: genEnumValidator(['exchange', 'static']),
253588c88e8eSopenharmony_ci    sharedTransitionName: NAME_VALIDATOR,
253688c88e8eSopenharmony_ci    sharedTransitionTimingFunction: TRANSITION_TIMING_FUNCTION_VALIDATOR
253788c88e8eSopenharmony_ci  },
253888c88e8eSopenharmony_ci  image: {
253988c88e8eSopenharmony_ci    matchTextDirection: genEnumValidator(['false', 'true']),
254088c88e8eSopenharmony_ci    fitOriginalSize: genEnumValidator(['false', 'true']),
254188c88e8eSopenharmony_ci  },
254288c88e8eSopenharmony_ci  divider: {
254388c88e8eSopenharmony_ci    lineCap: genEnumValidator(['butt', 'square', 'round'])
254488c88e8eSopenharmony_ci  },
254588c88e8eSopenharmony_ci  picker: {
254688c88e8eSopenharmony_ci    columnHeight: LENGTH_VALIDATOR
254788c88e8eSopenharmony_ci  },
254888c88e8eSopenharmony_ci  pickerView: {
254988c88e8eSopenharmony_ci    selectedFontSize: LENGTH_VALIDATOR,
255088c88e8eSopenharmony_ci    selectedFontFamily: ANYTHING_VALIDATOR,
255188c88e8eSopenharmony_ci    focusColor: COLOR_VAR_VALIDATOR,
255288c88e8eSopenharmony_ci    focusFontSize: LENGTH_VALIDATOR,
255388c88e8eSopenharmony_ci    focusFontFamily: ANYTHING_VALIDATOR,
255488c88e8eSopenharmony_ci    disappearFontSize: LENGTH_VALIDATOR,
255588c88e8eSopenharmony_ci    disappearColor: COLOR_VAR_VALIDATOR
255688c88e8eSopenharmony_ci  },
255788c88e8eSopenharmony_ci  colorpicker: {
255888c88e8eSopenharmony_ci    colorPickerColor: Color_Picker_VALIDATOR
255988c88e8eSopenharmony_ci  },
256088c88e8eSopenharmony_ci  colorpickerView: {
256188c88e8eSopenharmony_ci    colorPickerColor: Color_Picker_VALIDATOR
256288c88e8eSopenharmony_ci  },
256388c88e8eSopenharmony_ci  slider: {
256488c88e8eSopenharmony_ci    blockColor: COLOR_VAR_VALIDATOR,
256588c88e8eSopenharmony_ci  },
256688c88e8eSopenharmony_ci  badge: {
256788c88e8eSopenharmony_ci    badgeColor: COLOR_VAR_VALIDATOR,
256888c88e8eSopenharmony_ci    badgeSize: LENGTH_VALIDATOR
256988c88e8eSopenharmony_ci  },
257088c88e8eSopenharmony_ci  ellipse: {
257188c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
257288c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
257388c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd']),
257488c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
257588c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
257688c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
257788c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
257888c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
257988c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
258088c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
258188c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
258288c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
258388c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
258488c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
258588c88e8eSopenharmony_ci    cx: PERCENTAGE_LENGTH_VALIDATOR,
258688c88e8eSopenharmony_ci    cy: PERCENTAGE_LENGTH_VALIDATOR,
258788c88e8eSopenharmony_ci    rx: PERCENTAGE_LENGTH_VALIDATOR,
258888c88e8eSopenharmony_ci    ry: PERCENTAGE_LENGTH_VALIDATOR
258988c88e8eSopenharmony_ci  },
259088c88e8eSopenharmony_ci  rect: {
259188c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
259288c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
259388c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
259488c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd']),
259588c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
259688c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
259788c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
259888c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
259988c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
260088c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
260188c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
260288c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
260388c88e8eSopenharmony_ci    width: PERCENTAGE_LENGTH_VALIDATOR,
260488c88e8eSopenharmony_ci    height: PERCENTAGE_LENGTH_VALIDATOR,
260588c88e8eSopenharmony_ci    x: PERCENTAGE_LENGTH_VALIDATOR,
260688c88e8eSopenharmony_ci    y: PERCENTAGE_LENGTH_VALIDATOR,
260788c88e8eSopenharmony_ci    rx: PERCENTAGE_LENGTH_VALIDATOR,
260888c88e8eSopenharmony_ci    ry: PERCENTAGE_LENGTH_VALIDATOR,
260988c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
261088c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR
261188c88e8eSopenharmony_ci  },
261288c88e8eSopenharmony_ci  circle: {
261388c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
261488c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
261588c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd']),
261688c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
261788c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
261888c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
261988c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
262088c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
262188c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
262288c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
262388c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
262488c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
262588c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
262688c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
262788c88e8eSopenharmony_ci    cx: PERCENTAGE_LENGTH_VALIDATOR,
262888c88e8eSopenharmony_ci    cy: PERCENTAGE_LENGTH_VALIDATOR,
262988c88e8eSopenharmony_ci    r: PERCENTAGE_LENGTH_VALIDATOR
263088c88e8eSopenharmony_ci  },
263188c88e8eSopenharmony_ci  path: {
263288c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
263388c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd']),
263488c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
263588c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
263688c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
263788c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
263888c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
263988c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
264088c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
264188c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
264288c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
264388c88e8eSopenharmony_ci    d: ANYTHING_VALIDATOR,
264488c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
264588c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
264688c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR
264788c88e8eSopenharmony_ci  },
264888c88e8eSopenharmony_ci  svg: {
264988c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
265088c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
265188c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd']),
265288c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
265388c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
265488c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
265588c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
265688c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
265788c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
265888c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
265988c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
266088c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
266188c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
266288c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
266388c88e8eSopenharmony_ci    width: PERCENTAGE_LENGTH_VALIDATOR,
266488c88e8eSopenharmony_ci    height: PERCENTAGE_LENGTH_VALIDATOR,
266588c88e8eSopenharmony_ci    x: PERCENTAGE_LENGTH_VALIDATOR,
266688c88e8eSopenharmony_ci    y: PERCENTAGE_LENGTH_VALIDATOR,
266788c88e8eSopenharmony_ci    viewbox: ANYTHING_VALIDATOR
266888c88e8eSopenharmony_ci  },
266988c88e8eSopenharmony_ci  polygon: {
267088c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
267188c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
267288c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
267388c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
267488c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
267588c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
267688c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
267788c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
267888c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
267988c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
268088c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
268188c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
268288c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
268388c88e8eSopenharmony_ci    points: ANYTHING_VALIDATOR,
268488c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd'])
268588c88e8eSopenharmony_ci  },
268688c88e8eSopenharmony_ci  polyline: {
268788c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
268888c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
268988c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
269088c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
269188c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
269288c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
269388c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
269488c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
269588c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
269688c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
269788c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
269888c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
269988c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
270088c88e8eSopenharmony_ci    points: ANYTHING_VALIDATOR,
270188c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd'])
270288c88e8eSopenharmony_ci  },
270388c88e8eSopenharmony_ci  tspan: {
270488c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
270588c88e8eSopenharmony_ci    x: PERCENTAGE_LENGTH_VALIDATOR,
270688c88e8eSopenharmony_ci    y: PERCENTAGE_LENGTH_VALIDATOR,
270788c88e8eSopenharmony_ci    dx: PERCENTAGE_LENGTH_VALIDATOR,
270888c88e8eSopenharmony_ci    dy: PERCENTAGE_LENGTH_VALIDATOR,
270988c88e8eSopenharmony_ci    rotate: NUMBER_VALIDATOR,
271088c88e8eSopenharmony_ci    fontSize: LENGTH_VALIDATOR,
271188c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
271288c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
271388c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
271488c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
271588c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR
271688c88e8eSopenharmony_ci  },
271788c88e8eSopenharmony_ci  textPath: {
271888c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
271988c88e8eSopenharmony_ci    path: ANYTHING_VALIDATOR,
272088c88e8eSopenharmony_ci    startOffset: PERCENTAGE_LENGTH_VALIDATOR,
272188c88e8eSopenharmony_ci    fontSize: LENGTH_VALIDATOR,
272288c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
272388c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
272488c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
272588c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
272688c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR
272788c88e8eSopenharmony_ci  },
272888c88e8eSopenharmony_ci  animate: {
272988c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
273088c88e8eSopenharmony_ci    attributeName: ANYTHING_VALIDATOR,
273188c88e8eSopenharmony_ci    begin: ANYTHING_VALIDATOR,
273288c88e8eSopenharmony_ci    dur: ANYTHING_VALIDATOR,
273388c88e8eSopenharmony_ci    end: ANYTHING_VALIDATOR,
273488c88e8eSopenharmony_ci    repeatCount: ANYTHING_VALIDATOR,
273588c88e8eSopenharmony_ci    fill: genEnumValidator(['freeze', 'remove']),
273688c88e8eSopenharmony_ci    calcMode: genEnumValidator(['discrete', 'linear', 'paced', 'spline']),
273788c88e8eSopenharmony_ci    keyTimes: ANYTHING_VALIDATOR,
273888c88e8eSopenharmony_ci    keySplines: ANYTHING_VALIDATOR,
273988c88e8eSopenharmony_ci    from: ANYTHING_VALIDATOR,
274088c88e8eSopenharmony_ci    to: ANYTHING_VALIDATOR,
274188c88e8eSopenharmony_ci    values: ANYTHING_VALIDATOR
274288c88e8eSopenharmony_ci  },
274388c88e8eSopenharmony_ci  animateMotion: {
274488c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
274588c88e8eSopenharmony_ci    attributeName: ANYTHING_VALIDATOR,
274688c88e8eSopenharmony_ci    begin: ANYTHING_VALIDATOR,
274788c88e8eSopenharmony_ci    dur: ANYTHING_VALIDATOR,
274888c88e8eSopenharmony_ci    end: ANYTHING_VALIDATOR,
274988c88e8eSopenharmony_ci    repeatCount: ANYTHING_VALIDATOR,
275088c88e8eSopenharmony_ci    fill: genEnumValidator(['freeze', 'remove']),
275188c88e8eSopenharmony_ci    calcMode: genEnumValidator(['discrete', 'linear', 'paced', 'spline']),
275288c88e8eSopenharmony_ci    keyTimes: ANYTHING_VALIDATOR,
275388c88e8eSopenharmony_ci    keySplines: ANYTHING_VALIDATOR,
275488c88e8eSopenharmony_ci    from: ANYTHING_VALIDATOR,
275588c88e8eSopenharmony_ci    to: ANYTHING_VALIDATOR,
275688c88e8eSopenharmony_ci    keyPoints: ANYTHING_VALIDATOR,
275788c88e8eSopenharmony_ci    path: ANYTHING_VALIDATOR,
275888c88e8eSopenharmony_ci    rotate: ANYTHING_VALIDATOR
275988c88e8eSopenharmony_ci  },
276088c88e8eSopenharmony_ci  animateTransform: {
276188c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
276288c88e8eSopenharmony_ci    attributeName: ANYTHING_VALIDATOR,
276388c88e8eSopenharmony_ci    begin: ANYTHING_VALIDATOR,
276488c88e8eSopenharmony_ci    dur: ANYTHING_VALIDATOR,
276588c88e8eSopenharmony_ci    end: ANYTHING_VALIDATOR,
276688c88e8eSopenharmony_ci    repeatCount: ANYTHING_VALIDATOR,
276788c88e8eSopenharmony_ci    fill: genEnumValidator(['freeze', 'remove']),
276888c88e8eSopenharmony_ci    calcMode: genEnumValidator(['discrete', 'linear', 'paced', 'spline']),
276988c88e8eSopenharmony_ci    from: ANYTHING_VALIDATOR,
277088c88e8eSopenharmony_ci    to: ANYTHING_VALIDATOR,
277188c88e8eSopenharmony_ci    type: genEnumValidator(['translate', 'scale', 'skewX', 'skewY'])
277288c88e8eSopenharmony_ci  },
277388c88e8eSopenharmony_ci  line: {
277488c88e8eSopenharmony_ci    fill: COLOR_VAR_VALIDATOR,
277588c88e8eSopenharmony_ci    fillOpacity: NUMBER_VALIDATOR,
277688c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
277788c88e8eSopenharmony_ci    stroke: COLOR_VAR_VALIDATOR,
277888c88e8eSopenharmony_ci    strokeDasharray: ANYTHING_VALIDATOR,
277988c88e8eSopenharmony_ci    strokeDashoffset: LENGTH_VALIDATOR,
278088c88e8eSopenharmony_ci    strokeLinejoin: genEnumValidator(['bevel', 'miter', 'round']),
278188c88e8eSopenharmony_ci    strokeLinecap: genEnumValidator(['butt', 'round', 'square']),
278288c88e8eSopenharmony_ci    strokeMiterlimit: NUMBER_VALIDATOR,
278388c88e8eSopenharmony_ci    strokeOpacity: NUMBER_VALIDATOR,
278488c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
278588c88e8eSopenharmony_ci    fillRule: genEnumValidator(['nonzero', 'evenodd']),
278688c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
278788c88e8eSopenharmony_ci    id: ANYTHING_VALIDATOR,
278888c88e8eSopenharmony_ci    x1: PERCENTAGE_LENGTH_VALIDATOR,
278988c88e8eSopenharmony_ci    y1: PERCENTAGE_LENGTH_VALIDATOR,
279088c88e8eSopenharmony_ci    x2: PERCENTAGE_LENGTH_VALIDATOR,
279188c88e8eSopenharmony_ci    y2: PERCENTAGE_LENGTH_VALIDATOR
279288c88e8eSopenharmony_ci  }
279388c88e8eSopenharmony_ci}
279488c88e8eSopenharmony_ci
279588c88e8eSopenharmony_civar LITE_PROP_NAME_GROUPS = {
279688c88e8eSopenharmony_ci  boxModel: {
279788c88e8eSopenharmony_ci    width: PERCENTAGE_LENGTH_VALIDATOR,
279888c88e8eSopenharmony_ci    height: PERCENTAGE_LENGTH_VALIDATOR,
279988c88e8eSopenharmony_ci    padding: SHORTHAND_LENGTH_VALIDATOR,
280088c88e8eSopenharmony_ci    paddingLeft: LENGTH_VALIDATOR,
280188c88e8eSopenharmony_ci    paddingRight: LENGTH_VALIDATOR,
280288c88e8eSopenharmony_ci    paddingTop: LENGTH_VALIDATOR,
280388c88e8eSopenharmony_ci    paddingBottom: LENGTH_VALIDATOR,
280488c88e8eSopenharmony_ci    margin:SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR,
280588c88e8eSopenharmony_ci    marginLeft: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
280688c88e8eSopenharmony_ci    marginRight: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
280788c88e8eSopenharmony_ci    marginTop: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
280888c88e8eSopenharmony_ci    marginBottom: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
280988c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
281088c88e8eSopenharmony_ci  },
281188c88e8eSopenharmony_ci  border:{
281288c88e8eSopenharmony_ci    borderWidth: SHORTHAND_LENGTH_VALIDATOR,
281388c88e8eSopenharmony_ci    borderColor: SHORTHAND_COLOR_VALIDATOR,
281488c88e8eSopenharmony_ci    borderRadius: LENGTH_VALIDATOR,
281588c88e8eSopenharmony_ci  },
281688c88e8eSopenharmony_ci  animation:{
281788c88e8eSopenharmony_ci    animationDuration: TIME_VALIDATOR,
281888c88e8eSopenharmony_ci    animationDelay: TIME_VALIDATOR,
281988c88e8eSopenharmony_ci    animationName: NAME_VALIDATOR,
282088c88e8eSopenharmony_ci    animationTimingFunction: genEnumValidator(['linear', 'ease-in', 'ease-out', 'ease-in-out']),
282188c88e8eSopenharmony_ci    animationIterationCount: ITERATIONCOUNT_VALIDATOR,
282288c88e8eSopenharmony_ci    animationFillMode: genEnumValidator(['none', 'forwards'])
282388c88e8eSopenharmony_ci  },
282488c88e8eSopenharmony_ci  flexbox: {
282588c88e8eSopenharmony_ci    flexDirection: genEnumValidator(['row', 'column']),
282688c88e8eSopenharmony_ci    flexWrap: genEnumValidator(['nowrap', 'wrap']),
282788c88e8eSopenharmony_ci    justifyContent: genEnumValidator(['flex-start', 'flex-end', 'center', 'space-between',
282888c88e8eSopenharmony_ci      'space-around', 'space-evenly']),
282988c88e8eSopenharmony_ci    alignItems: genEnumValidator(['stretch', 'flex-start', 'flex-end', 'center']),
283088c88e8eSopenharmony_ci  },
283188c88e8eSopenharmony_ci  position: {
283288c88e8eSopenharmony_ci    top: PERCENTAGE_LENGTH_VALIDATOR,
283388c88e8eSopenharmony_ci    left: PERCENTAGE_LENGTH_VALIDATOR,
283488c88e8eSopenharmony_ci  },
283588c88e8eSopenharmony_ci  common: {
283688c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
283788c88e8eSopenharmony_ci    backgroundColor: COLOR_VAR_VALIDATOR,
283888c88e8eSopenharmony_ci    backgroundImage: URL_VALIDATOR,
283988c88e8eSopenharmony_ci    placeholderColor: COLOR_VAR_VALIDATOR,
284088c88e8eSopenharmony_ci    display: genEnumValidator(['flex', 'none']),
284188c88e8eSopenharmony_ci  },
284288c88e8eSopenharmony_ci  text: {
284388c88e8eSopenharmony_ci    color: COLOR_VAR_VALIDATOR,
284488c88e8eSopenharmony_ci    fontSize: LENGTH_VALIDATOR,
284588c88e8eSopenharmony_ci    fontFamily: genEnumValidator(['HYQiHei-65S']),
284688c88e8eSopenharmony_ci    letterSpacing: LENGTH_VALIDATOR,
284788c88e8eSopenharmony_ci    textAlign: genEnumValidator(['left', 'center', 'right']),
284888c88e8eSopenharmony_ci    textOverflow: genEnumValidator(['clip', 'ellipsis']),
284988c88e8eSopenharmony_ci  },
285088c88e8eSopenharmony_ci  slider: {
285188c88e8eSopenharmony_ci    selectedColor: COLOR_VAR_VALIDATOR,
285288c88e8eSopenharmony_ci    selectedFontSize: LENGTH_VALIDATOR,
285388c88e8eSopenharmony_ci    selectedFontFamily: genEnumValidator(['HYQiHei-65S']),
285488c88e8eSopenharmony_ci    blockColor: COLOR_VAR_VALIDATOR,
285588c88e8eSopenharmony_ci  },
285688c88e8eSopenharmony_ci  transform: {
285788c88e8eSopenharmony_ci    transform: TRANSFORM_VALIDATOR,
285888c88e8eSopenharmony_ci  },
285988c88e8eSopenharmony_ci  progress: {
286088c88e8eSopenharmony_ci    centerX: LENGTH_VALIDATOR,
286188c88e8eSopenharmony_ci    centerY: LENGTH_VALIDATOR,
286288c88e8eSopenharmony_ci    radius: LENGTH_VALIDATOR,
286388c88e8eSopenharmony_ci    startAngle: ANGLE_VALIDATOR,
286488c88e8eSopenharmony_ci    totalAngle: ANGLE_VALIDATOR
286588c88e8eSopenharmony_ci  }
286688c88e8eSopenharmony_ci}
286788c88e8eSopenharmony_ci
286888c88e8eSopenharmony_civar CARD_PROP_NAME_GROUPS = {
286988c88e8eSopenharmony_ci  boxModel: {
287088c88e8eSopenharmony_ci    width: PERCENTAGE_LENGTH_VALIDATOR,
287188c88e8eSopenharmony_ci    height: PERCENTAGE_LENGTH_VALIDATOR,
287288c88e8eSopenharmony_ci    overflow: genEnumValidator(['auto', 'hidden','scroll','visible']),
287388c88e8eSopenharmony_ci    padding: SHORTHAND_PERCENTAGE_LENGTH_VALIDATOR,
287488c88e8eSopenharmony_ci    paddingLeft: PERCENTAGE_LENGTH_VALIDATOR,
287588c88e8eSopenharmony_ci    paddingRight: PERCENTAGE_LENGTH_VALIDATOR,
287688c88e8eSopenharmony_ci    paddingTop: PERCENTAGE_LENGTH_VALIDATOR,
287788c88e8eSopenharmony_ci    paddingBottom: PERCENTAGE_LENGTH_VALIDATOR,
287888c88e8eSopenharmony_ci    paddingStart: PERCENTAGE_LENGTH_VALIDATOR,
287988c88e8eSopenharmony_ci    paddingEnd: PERCENTAGE_LENGTH_VALIDATOR,
288088c88e8eSopenharmony_ci    margin: SHORTHAND_AUTO_PERCENTAGE_LENGTH_VALIDATOR,
288188c88e8eSopenharmony_ci    marginLeft: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
288288c88e8eSopenharmony_ci    marginRight: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
288388c88e8eSopenharmony_ci    marginTop: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
288488c88e8eSopenharmony_ci    marginBottom: AUTO_PERCENTAGE_LENGTH_VALIDATOR,
288588c88e8eSopenharmony_ci    marginStart: PERCENTAGE_LENGTH_VALIDATOR,
288688c88e8eSopenharmony_ci    marginEnd: PERCENTAGE_LENGTH_VALIDATOR,
288788c88e8eSopenharmony_ci    columns: NUMBER_VALIDATOR,
288888c88e8eSopenharmony_ci    displayIndex: NUMBER_VALIDATOR,
288988c88e8eSopenharmony_ci    aspectRatio: NUMBER_VALIDATOR,
289088c88e8eSopenharmony_ci    minWidth: PERCENTAGE_LENGTH_VALIDATOR,
289188c88e8eSopenharmony_ci    minHeight: PERCENTAGE_LENGTH_VALIDATOR,
289288c88e8eSopenharmony_ci    maxWidth: PERCENTAGE_LENGTH_VALIDATOR,
289388c88e8eSopenharmony_ci    maxHeight: PERCENTAGE_LENGTH_VALIDATOR,
289488c88e8eSopenharmony_ci    flexWeight: NUMBER_VALIDATOR,
289588c88e8eSopenharmony_ci    boxShadow: BOX_SHADOW_VALIDATOR,
289688c88e8eSopenharmony_ci    boxShadowH: LENGTH_VALIDATOR,
289788c88e8eSopenharmony_ci    boxShadowV: LENGTH_VALIDATOR,
289888c88e8eSopenharmony_ci    boxShadowBlur: LENGTH_VALIDATOR,
289988c88e8eSopenharmony_ci    boxShadowSpread: LENGTH_VALIDATOR,
290088c88e8eSopenharmony_ci    boxShadowColor: COLOR_VAR_VALIDATOR,
290188c88e8eSopenharmony_ci    filter: FILTER_VALIDATOR,
290288c88e8eSopenharmony_ci    backdropFilter: FILTER_VALIDATOR,
290388c88e8eSopenharmony_ci    windowFilter: FILTER_PERCENTAGE_VALIDATOR
290488c88e8eSopenharmony_ci  },
290588c88e8eSopenharmony_ci  div: {
290688c88e8eSopenharmony_ci    gridTemplateColumns: GRID_TEMPLATE_VALIDATOR,
290788c88e8eSopenharmony_ci    gridTemplateRows: GRID_TEMPLATE_VALIDATOR,
290888c88e8eSopenharmony_ci    gridGap: LENGTH_VALIDATOR,
290988c88e8eSopenharmony_ci    gridColumnsGap: LENGTH_VALIDATOR,
291088c88e8eSopenharmony_ci    gridRowsGap: LENGTH_VALIDATOR,
291188c88e8eSopenharmony_ci    gridRowStart: NUMBER_VALIDATOR,
291288c88e8eSopenharmony_ci    gridRowEnd: NUMBER_VALIDATOR,
291388c88e8eSopenharmony_ci    gridColumnStart: NUMBER_VALIDATOR,
291488c88e8eSopenharmony_ci    gridColumnEnd: NUMBER_VALIDATOR
291588c88e8eSopenharmony_ci  },
291688c88e8eSopenharmony_ci  border: {
291788c88e8eSopenharmony_ci    border: BORDER_VALIDATOR,
291888c88e8eSopenharmony_ci    borderWidth: SHORTHAND_LENGTH_VALIDATOR,
291988c88e8eSopenharmony_ci    borderLeftWidth: LENGTH_VALIDATOR,
292088c88e8eSopenharmony_ci    borderTopWidth: LENGTH_VALIDATOR,
292188c88e8eSopenharmony_ci    borderRightWidth: LENGTH_VALIDATOR,
292288c88e8eSopenharmony_ci    borderBottomWidth: LENGTH_VALIDATOR,
292388c88e8eSopenharmony_ci    borderColor: SHORTHAND_COLOR_VALIDATOR,
292488c88e8eSopenharmony_ci    borderLeftColor: COLOR_VAR_VALIDATOR,
292588c88e8eSopenharmony_ci    borderTopColor: COLOR_VAR_VALIDATOR,
292688c88e8eSopenharmony_ci    borderRightColor: COLOR_VAR_VALIDATOR,
292788c88e8eSopenharmony_ci    borderBottomColor: COLOR_VAR_VALIDATOR,
292888c88e8eSopenharmony_ci    borderStyle: genEnumValidator(['solid', 'dashed', 'dotted']),
292988c88e8eSopenharmony_ci    borderTopStyle: genEnumValidator(['solid', 'dashed', 'dotted']),
293088c88e8eSopenharmony_ci    borderRightStyle: genEnumValidator(['solid', 'dashed', 'dotted']),
293188c88e8eSopenharmony_ci    borderBottomStyle: genEnumValidator(['solid', 'dashed', 'dotted']),
293288c88e8eSopenharmony_ci    borderLeftStyle: genEnumValidator(['solid', 'dashed', 'dotted']),
293388c88e8eSopenharmony_ci    borderRadius: LENGTH_VALIDATOR,
293488c88e8eSopenharmony_ci    borderBottomLeftRadius: LENGTH_VALIDATOR,
293588c88e8eSopenharmony_ci    borderBottomRightRadius: LENGTH_VALIDATOR,
293688c88e8eSopenharmony_ci    borderTopLeftRadius: LENGTH_VALIDATOR,
293788c88e8eSopenharmony_ci    borderTopRightRadius: LENGTH_VALIDATOR,
293888c88e8eSopenharmony_ci    borderLeft: BORDER_VALIDATOR,
293988c88e8eSopenharmony_ci    borderRight: BORDER_VALIDATOR,
294088c88e8eSopenharmony_ci    borderTop: BORDER_VALIDATOR,
294188c88e8eSopenharmony_ci    borderBottom: BORDER_VALIDATOR
294288c88e8eSopenharmony_ci  },
294388c88e8eSopenharmony_ci  flexbox: {
294488c88e8eSopenharmony_ci    flex: genEnumValidator(['none', 'auto', 'initial']),
294588c88e8eSopenharmony_ci    flexWrap: genEnumValidator(['nowrap', 'wrap']),
294688c88e8eSopenharmony_ci    flexGrow: NUMBER_VALIDATOR,
294788c88e8eSopenharmony_ci    flexShrink: NUMBER_VALIDATOR,
294888c88e8eSopenharmony_ci    flexBasis: LENGTH_VALIDATOR,
294988c88e8eSopenharmony_ci    flexDirection: genEnumValidator(['row', 'column']),
295088c88e8eSopenharmony_ci    justifyContent: genEnumValidator(['flex-start', 'flex-end', 'center', 'space-between',
295188c88e8eSopenharmony_ci      'space-around', 'space-evenly']),
295288c88e8eSopenharmony_ci    alignItems: genEnumValidator(['stretch', 'flex-start', 'flex-end', 'center', 'baseline']),
295388c88e8eSopenharmony_ci    alignContent: genEnumValidator(['stretch', 'flex-start', 'flex-end', 'center', 'space-between', 'space-around']),
295488c88e8eSopenharmony_ci  },
295588c88e8eSopenharmony_ci  position: {
295688c88e8eSopenharmony_ci    position: genEnumValidator(['relative', 'fixed', 'absolute']),
295788c88e8eSopenharmony_ci    top: PERCENTAGE_LENGTH_VALIDATOR,
295888c88e8eSopenharmony_ci    bottom: PERCENTAGE_LENGTH_VALIDATOR,
295988c88e8eSopenharmony_ci    left: PERCENTAGE_LENGTH_VALIDATOR,
296088c88e8eSopenharmony_ci    right: PERCENTAGE_LENGTH_VALIDATOR,
296188c88e8eSopenharmony_ci    zIndex: INTEGER_VALIDATOR
296288c88e8eSopenharmony_ci  },
296388c88e8eSopenharmony_ci  common: {
296488c88e8eSopenharmony_ci    background: BACKGROUND_VALIDATOR,
296588c88e8eSopenharmony_ci    backgroundColor: COLOR_VAR_VALIDATOR,
296688c88e8eSopenharmony_ci    backgroundImage: URL_VALIDATOR,
296788c88e8eSopenharmony_ci    backgroundSize: BACKGROUND_SIZE_VALIDATOR,
296888c88e8eSopenharmony_ci    backgroundRepeat: genEnumValidator(['repeat', 'no-repeat', 'repeat-x', 'repeat-y']),
296988c88e8eSopenharmony_ci    backgroundPosition: BACKGROUND_POSITION_VALIDATOR,
297088c88e8eSopenharmony_ci    opacity: NUMBER_VALIDATOR,
297188c88e8eSopenharmony_ci    appearingDuration: NUMBER_VALIDATOR,
297288c88e8eSopenharmony_ci    visibility: genEnumValidator(['visible', 'hidden']),
297388c88e8eSopenharmony_ci    display: genEnumValidator(['flex', 'none', 'grid']),
297488c88e8eSopenharmony_ci    imageFill: COLOR_VAR_VALIDATOR,
297588c88e8eSopenharmony_ci    maskImage: MASK_VALIDATOR,
297688c88e8eSopenharmony_ci    maskPosition: BACKGROUND_POSITION_VALIDATOR,
297788c88e8eSopenharmony_ci    maskSize: BACKGROUND_SIZE_VALIDATOR
297888c88e8eSopenharmony_ci  },
297988c88e8eSopenharmony_ci  text: {
298088c88e8eSopenharmony_ci    color: COLOR_VAR_VALIDATOR,
298188c88e8eSopenharmony_ci    fontSize: LENGTH_VALIDATOR,
298288c88e8eSopenharmony_ci    allowScale: genEnumValidator(['true', 'false']),
298388c88e8eSopenharmony_ci    letterSpacing: LENGTH_VALIDATOR,
298488c88e8eSopenharmony_ci    fontStyle: genEnumValidator(['normal', 'italic']),
298588c88e8eSopenharmony_ci    fontFamily: ANYTHING_VALIDATOR,
298688c88e8eSopenharmony_ci    fontWeight: genEnumValidator(['normal', 'lighter', 'bold', 'bolder', "medium", "regular",
298788c88e8eSopenharmony_ci      '100', '200', '300', '400', '500', '600', '700', '800', '900']),
298888c88e8eSopenharmony_ci    textDecoration: genEnumValidator(['none', 'underline', 'line-through']),
298988c88e8eSopenharmony_ci    textAlign: genEnumValidator(['start', 'end', 'left', 'center', 'right']),
299088c88e8eSopenharmony_ci    textOverflow: genEnumValidator(['clip', 'ellipsis']),
299188c88e8eSopenharmony_ci    textIndent: TEXT_INDENT_VALIDATOR,
299288c88e8eSopenharmony_ci    lineHeight: LENGTH_VALIDATOR,
299388c88e8eSopenharmony_ci    maxLines: ANYTHING_VALIDATOR,
299488c88e8eSopenharmony_ci    minFontSize: LENGTH_VALIDATOR,
299588c88e8eSopenharmony_ci    maxFontSize: LENGTH_VALIDATOR,
299688c88e8eSopenharmony_ci    fontSizeStep: LENGTH_VALIDATOR,
299788c88e8eSopenharmony_ci    preferFontSizes: ARRAY_LENGTH_VALIDATOR,
299888c88e8eSopenharmony_ci    adaptHeight: genEnumValidator(['true', 'false'])
299988c88e8eSopenharmony_ci  },
300088c88e8eSopenharmony_ci  progress: {
300188c88e8eSopenharmony_ci    secondaryColor: COLOR_VAR_VALIDATOR,
300288c88e8eSopenharmony_ci    scaleWidth: LENGTH_VALIDATOR,
300388c88e8eSopenharmony_ci    scaleNumber: NUMBER_VALIDATOR,
300488c88e8eSopenharmony_ci    startAngle: ANGLE_VALIDATOR,
300588c88e8eSopenharmony_ci    totalAngle: ANGLE_VALIDATOR,
300688c88e8eSopenharmony_ci    centerX: LENGTH_VALIDATOR,
300788c88e8eSopenharmony_ci    centerY: LENGTH_VALIDATOR,
300888c88e8eSopenharmony_ci    radius: LENGTH_VALIDATOR,
300988c88e8eSopenharmony_ci    direction: genEnumValidator(['start-to-end', 'end-to-start']),
301088c88e8eSopenharmony_ci    sections: NAME_VALIDATOR,
301188c88e8eSopenharmony_ci    colors: ARRAY_COLOR_VALIDATOR,
301288c88e8eSopenharmony_ci    weights: ARRAY_NUMBER_VALIDATOR
301388c88e8eSopenharmony_ci  },
301488c88e8eSopenharmony_ci  chart: {
301588c88e8eSopenharmony_ci    strokeWidth: LENGTH_VALIDATOR,
301688c88e8eSopenharmony_ci  },
301788c88e8eSopenharmony_ci  button: {
301888c88e8eSopenharmony_ci    textColor: COLOR_VAR_VALIDATOR,
301988c88e8eSopenharmony_ci    iconWidth: LENGTH_VALIDATOR,
302088c88e8eSopenharmony_ci    iconHeight: LENGTH_VALIDATOR
302188c88e8eSopenharmony_ci  },
302288c88e8eSopenharmony_ci  image: {
302388c88e8eSopenharmony_ci    objectFit: genEnumValidator(['cover', 'fill', 'contain', 'none', 'scale-down']),
302488c88e8eSopenharmony_ci    matchTextDirection: genEnumValidator(['false', 'true']),
302588c88e8eSopenharmony_ci    fitOriginalSize: genEnumValidator(['false', 'true']),
302688c88e8eSopenharmony_ci  },
302788c88e8eSopenharmony_ci  list: {
302888c88e8eSopenharmony_ci    itemExtent: PERCENTAGE_LENGTH_VALIDATOR,
302988c88e8eSopenharmony_ci    fadeColor: COLOR_VAR_VALIDATOR,
303088c88e8eSopenharmony_ci    dividerColor: COLOR_VAR_VALIDATOR,
303188c88e8eSopenharmony_ci    dividerHeight: LENGTH_VALIDATOR,
303288c88e8eSopenharmony_ci    dividerLength: LENGTH_VALIDATOR,
303388c88e8eSopenharmony_ci    dividerOrigin: LENGTH_VALIDATOR,
303488c88e8eSopenharmony_ci    scrollbarColor: COLOR_VALIDATOR,
303588c88e8eSopenharmony_ci    scrollbarWidth: LENGTH_VALIDATOR,
303688c88e8eSopenharmony_ci    scrollbarOffset: ARRAY_LENGTH_VALIDATOR
303788c88e8eSopenharmony_ci  }
303888c88e8eSopenharmony_ci}
303988c88e8eSopenharmony_ci
304088c88e8eSopenharmony_civar backgroundValidatorMap = {
304188c88e8eSopenharmony_ci  linearGradient: LINEAR_GRADIENT_VALIDATOR,
304288c88e8eSopenharmony_ci  repeatingLinearGradient: LINEAR_GRADIENT_VALIDATOR,
304388c88e8eSopenharmony_ci  linearGradientColor: ARRAY_COLOR_STOP_VALIDATOR,
304488c88e8eSopenharmony_ci  linearGradientAngle: ANGLE_VALIDATOR,
304588c88e8eSopenharmony_ci  linearGradientDirection: GRADIENT_DIRECTION_VALIDATOR
304688c88e8eSopenharmony_ci}
304788c88e8eSopenharmony_ci
304888c88e8eSopenharmony_civar transformValidatorMap = {
304988c88e8eSopenharmony_ci  translate: MULTIPLE_PERCENTAGE_LENGTH_VALIDATOR,
305088c88e8eSopenharmony_ci  translate3d: MULTIPLE_PERCENTAGE_LENGTH_VALIDATOR,
305188c88e8eSopenharmony_ci  translateX: PERCENTAGE_LENGTH_VALIDATOR,
305288c88e8eSopenharmony_ci  translateY: PERCENTAGE_LENGTH_VALIDATOR,
305388c88e8eSopenharmony_ci  translateZ: PERCENTAGE_LENGTH_VALIDATOR,
305488c88e8eSopenharmony_ci  scale: MULTIPLE_NUMBER_VALIDATOR,
305588c88e8eSopenharmony_ci  scale3d: MULTIPLE_NUMBER_VALIDATOR,
305688c88e8eSopenharmony_ci  scaleX: NUMBER_VALIDATOR,
305788c88e8eSopenharmony_ci  scaleY: NUMBER_VALIDATOR,
305888c88e8eSopenharmony_ci  scaleZ: NUMBER_VALIDATOR,
305988c88e8eSopenharmony_ci  rotate: MUTIPLE_ANGLE_VALIDATOR,
306088c88e8eSopenharmony_ci  rotate3d: ROTATE3D_VALIDATOR,
306188c88e8eSopenharmony_ci  rotateX: ANGLE_VALIDATOR,
306288c88e8eSopenharmony_ci  rotateY: ANGLE_VALIDATOR,
306388c88e8eSopenharmony_ci  rotateZ: ANGLE_VALIDATOR,
306488c88e8eSopenharmony_ci  skew: MUTIPLE_ANGLE_VALIDATOR,
306588c88e8eSopenharmony_ci  skewX: ANGLE_VALIDATOR,
306688c88e8eSopenharmony_ci  skewY: ANGLE_VALIDATOR,
306788c88e8eSopenharmony_ci  matrix: MULTIPLE_NUMBER_VALIDATOR,
306888c88e8eSopenharmony_ci  matrix3d: MULTIPLE_NUMBER_VALIDATOR,
306988c88e8eSopenharmony_ci  perspective: PERCENTAGE_LENGTH_VALIDATOR,
307088c88e8eSopenharmony_ci}
307188c88e8eSopenharmony_ci
307288c88e8eSopenharmony_civar SUGGESTED_PROP_NAME_GROUP = {}
307388c88e8eSopenharmony_ci
307488c88e8eSopenharmony_civar validatorMap = {}
307588c88e8eSopenharmony_ci
307688c88e8eSopenharmony_ciconst card = process.env.DEVICE_LEVEL === 'card'
307788c88e8eSopenharmony_civar isLiteDevice = process.env.DEVICE_LEVEL === 'lite'
307888c88e8eSopenharmony_ci
307988c88e8eSopenharmony_civar PROP_NAME_GROUPS = process.env.DEVICE_LEVEL === 'lite' ? LITE_PROP_NAME_GROUPS :
308088c88e8eSopenharmony_ci  card ? CARD_PROP_NAME_GROUPS : RICH_PROP_NAME_GROUPS
308188c88e8eSopenharmony_ci
308288c88e8eSopenharmony_ci/**
308388c88e8eSopenharmony_ci * flatten `PROP_NAME_GROUPS` to `validatorMap`
308488c88e8eSopenharmony_ci */
308588c88e8eSopenharmony_cifunction genValidatorMap() {
308688c88e8eSopenharmony_ci  var groupName, group, name
308788c88e8eSopenharmony_ci  for (groupName in PROP_NAME_GROUPS) {
308888c88e8eSopenharmony_ci    group = PROP_NAME_GROUPS[groupName]
308988c88e8eSopenharmony_ci    for (name in group) {
309088c88e8eSopenharmony_ci      validatorMap[name] = group[name]
309188c88e8eSopenharmony_ci    }
309288c88e8eSopenharmony_ci  }
309388c88e8eSopenharmony_ci}
309488c88e8eSopenharmony_ci
309588c88e8eSopenharmony_cigenValidatorMap()
309688c88e8eSopenharmony_ci
309788c88e8eSopenharmony_cifunction getValueUnit(dem) {
309888c88e8eSopenharmony_ci  var str = dem.toString()
309988c88e8eSopenharmony_ci  var getValue = str.match(/[-]{0,1}[1-9][0-9]*/)
310088c88e8eSopenharmony_ci  var getUnit = str.match(/px|cm|%|em|vp|fp/)
310188c88e8eSopenharmony_ci  var result = {value: getValue, unit: getUnit}
310288c88e8eSopenharmony_ci  return result
310388c88e8eSopenharmony_ci}
310488c88e8eSopenharmony_ci
310588c88e8eSopenharmony_cifunction isOperator(value) {
310688c88e8eSopenharmony_ci  var operatorString = "+-*/()"
310788c88e8eSopenharmony_ci  return operatorString.indexOf(value) > -1
310888c88e8eSopenharmony_ci}
310988c88e8eSopenharmony_ci
311088c88e8eSopenharmony_cifunction getPrioraty(value) {
311188c88e8eSopenharmony_ci  switch(value) {
311288c88e8eSopenharmony_ci    case '+':
311388c88e8eSopenharmony_ci    case '-':
311488c88e8eSopenharmony_ci      return 1
311588c88e8eSopenharmony_ci    case '*':
311688c88e8eSopenharmony_ci    case '/':
311788c88e8eSopenharmony_ci      return 2
311888c88e8eSopenharmony_ci    default:
311988c88e8eSopenharmony_ci      return 0
312088c88e8eSopenharmony_ci  }
312188c88e8eSopenharmony_ci}
312288c88e8eSopenharmony_ci
312388c88e8eSopenharmony_cifunction prioraty(o1, o2) {
312488c88e8eSopenharmony_ci  return getPrioraty(o1) <= getPrioraty(o2)
312588c88e8eSopenharmony_ci}
312688c88e8eSopenharmony_ci
312788c88e8eSopenharmony_cifunction dal2Rpn(exp) {
312888c88e8eSopenharmony_ci  var inputStack = []
312988c88e8eSopenharmony_ci  var outputStack = []
313088c88e8eSopenharmony_ci  var outputQueue = []
313188c88e8eSopenharmony_ci  var str =
313288c88e8eSopenharmony_ci    exp.replace(/calc/g, "").replace(/(?<!var\(\-\-\w+|var\(\-\-\w+\,\s*\w+)\)/g, " )").replace(/(?<!var)\(/g, "( ")
313388c88e8eSopenharmony_ci  var inputStack=str.split(/(?<!\,)\s+/)
313488c88e8eSopenharmony_ci  var value, log
313588c88e8eSopenharmony_ci  while(inputStack.length > 0) {
313688c88e8eSopenharmony_ci    var cur = inputStack.shift()
313788c88e8eSopenharmony_ci    if(isOperator(cur)) {
313888c88e8eSopenharmony_ci      if(cur == '(') {
313988c88e8eSopenharmony_ci        outputStack.push(cur)
314088c88e8eSopenharmony_ci      } else if(cur == ')') {
314188c88e8eSopenharmony_ci        var po = outputStack.pop()
314288c88e8eSopenharmony_ci        while(po != '(' && outputStack.length > 0) {
314388c88e8eSopenharmony_ci          outputQueue.push(po)
314488c88e8eSopenharmony_ci          po = outputStack.pop()
314588c88e8eSopenharmony_ci        }
314688c88e8eSopenharmony_ci        if(po != '(') {
314788c88e8eSopenharmony_ci          log = {reason: 'ERROR: Expression unmatched ()'}
314888c88e8eSopenharmony_ci        }
314988c88e8eSopenharmony_ci      } else {
315088c88e8eSopenharmony_ci        while(prioraty(cur, outputStack[outputStack.length - 1]) && outputStack.length > 0) {
315188c88e8eSopenharmony_ci          outputQueue.push(outputStack.pop())
315288c88e8eSopenharmony_ci        }
315388c88e8eSopenharmony_ci        outputStack.push(cur)
315488c88e8eSopenharmony_ci      }
315588c88e8eSopenharmony_ci    } else {
315688c88e8eSopenharmony_ci      outputQueue.push(cur)
315788c88e8eSopenharmony_ci    }
315888c88e8eSopenharmony_ci  }
315988c88e8eSopenharmony_ci  return {
316088c88e8eSopenharmony_ci    value: outputQueue,
316188c88e8eSopenharmony_ci    log: log
316288c88e8eSopenharmony_ci  }
316388c88e8eSopenharmony_ci}
316488c88e8eSopenharmony_ci
316588c88e8eSopenharmony_cifunction checkComputation(left, right, operator) {
316688c88e8eSopenharmony_ci  var value, log
316788c88e8eSopenharmony_ci  if (operator == '*') {
316888c88e8eSopenharmony_ci    if ((right.match(/[a-zA-Z]/) && left.match(/[a-zA-Z]/)) || (!right.match(/[a-zA-Z]/) && !left.match(/[a-zA-Z]/))) {
316988c88e8eSopenharmony_ci      log = {reason: 'ERROR: The multiplier must contain and contain only one integer'}
317088c88e8eSopenharmony_ci    }
317188c88e8eSopenharmony_ci  }
317288c88e8eSopenharmony_ci  if (operator == '/') {
317388c88e8eSopenharmony_ci    if (right.match(/[a-zA-Z]|(?<![1-9])[0]/)) {
317488c88e8eSopenharmony_ci      log = {reason: 'ERROR: Divisor must be an integer and cannot be zero'}
317588c88e8eSopenharmony_ci    }
317688c88e8eSopenharmony_ci  }
317788c88e8eSopenharmony_ci  if (operator == '+') {
317888c88e8eSopenharmony_ci    if (!(right.match(/[a-zA-Z%]/) && left.match(/[a-zA-Z%]/))) {
317988c88e8eSopenharmony_ci      log = {reason: 'ERROR: Addition cannot contain integers'}
318088c88e8eSopenharmony_ci    }
318188c88e8eSopenharmony_ci  }
318288c88e8eSopenharmony_ci  if (operator == '-') {
318388c88e8eSopenharmony_ci    if (!(right.match(/[a-zA-Z%]/) && left.match(/[a-zA-Z%]/))) {
318488c88e8eSopenharmony_ci      log = {reason: 'ERROR: Subtraction cannot contain integers'}
318588c88e8eSopenharmony_ci    }
318688c88e8eSopenharmony_ci  }
318788c88e8eSopenharmony_ci  return log
318888c88e8eSopenharmony_ci}
318988c88e8eSopenharmony_ci
319088c88e8eSopenharmony_cifunction getResult(left, right, operator) {
319188c88e8eSopenharmony_ci  var value, log, errLog
319288c88e8eSopenharmony_ci  if (left.match(/var/)) {
319388c88e8eSopenharmony_ci    left = cssVarFun(left)
319488c88e8eSopenharmony_ci  }
319588c88e8eSopenharmony_ci  if (right.match(/var/)) {
319688c88e8eSopenharmony_ci    right = cssVarFun(right)
319788c88e8eSopenharmony_ci  }
319888c88e8eSopenharmony_ci  errLog = checkComputation(left, right, operator)
319988c88e8eSopenharmony_ci  if (errLog) {
320088c88e8eSopenharmony_ci    return { value: null, log: errLog }
320188c88e8eSopenharmony_ci  }
320288c88e8eSopenharmony_ci  var result, value, unit
320388c88e8eSopenharmony_ci  var leftValue = getValueUnit(left)
320488c88e8eSopenharmony_ci  var rightValue = getValueUnit(right)
320588c88e8eSopenharmony_ci  if (left.match(/\(/) | right.match(/\(/)) {
320688c88e8eSopenharmony_ci    result = left + ' ' + operator + ' ' + right
320788c88e8eSopenharmony_ci  } else {
320888c88e8eSopenharmony_ci    if (operator == '*') {
320988c88e8eSopenharmony_ci      value = leftValue.value * rightValue.value
321088c88e8eSopenharmony_ci      if (leftValue.unit == null) {
321188c88e8eSopenharmony_ci        unit = rightValue.unit
321288c88e8eSopenharmony_ci      } else { unit = leftValue.unit}
321388c88e8eSopenharmony_ci      result = value + unit
321488c88e8eSopenharmony_ci    } else if (operator == '/') {
321588c88e8eSopenharmony_ci      if (parseInt(rightValue.value) != 0) {
321688c88e8eSopenharmony_ci        value = leftValue.value / rightValue.value
321788c88e8eSopenharmony_ci        unit = leftValue.unit
321888c88e8eSopenharmony_ci        result = value + unit
321988c88e8eSopenharmony_ci      }
322088c88e8eSopenharmony_ci    } else if (operator == '+') {
322188c88e8eSopenharmony_ci      if (JSON.stringify(leftValue.unit) == JSON.stringify(rightValue.unit)) {
322288c88e8eSopenharmony_ci        value = parseInt(leftValue.value) + parseInt(rightValue.value)
322388c88e8eSopenharmony_ci        unit = leftValue.unit
322488c88e8eSopenharmony_ci        result = value + unit
322588c88e8eSopenharmony_ci      } else result = '(' + left + ' ' + operator + ' ' + right + ')'
322688c88e8eSopenharmony_ci    } else if (operator == '-') {
322788c88e8eSopenharmony_ci      if (JSON.stringify(leftValue.unit) == JSON.stringify(rightValue.unit)) {
322888c88e8eSopenharmony_ci        value = parseInt(leftValue.value) - parseInt(rightValue.value)
322988c88e8eSopenharmony_ci        unit = leftValue.unit
323088c88e8eSopenharmony_ci        result = value + unit
323188c88e8eSopenharmony_ci      } else result = '(' + left + ' ' + operator + ' ' + right + ')'
323288c88e8eSopenharmony_ci    }
323388c88e8eSopenharmony_ci  }
323488c88e8eSopenharmony_ci  return { value: result, log: null }
323588c88e8eSopenharmony_ci}
323688c88e8eSopenharmony_ci
323788c88e8eSopenharmony_cifunction evalRpn(rpnQueue) {
323888c88e8eSopenharmony_ci  var outputStack = []
323988c88e8eSopenharmony_ci  var value, res, log
324088c88e8eSopenharmony_ci  while(rpnQueue.length > 0) {
324188c88e8eSopenharmony_ci    var cur = rpnQueue.shift()
324288c88e8eSopenharmony_ci    if(!isOperator(cur)) {
324388c88e8eSopenharmony_ci      outputStack.push(cur)
324488c88e8eSopenharmony_ci    } else {
324588c88e8eSopenharmony_ci      if(outputStack.length < 2) {
324688c88e8eSopenharmony_ci      log = {reason: 'ERROR: Expression does not conform to specification'}
324788c88e8eSopenharmony_ci      }
324888c88e8eSopenharmony_ci      var sec = outputStack.pop()
324988c88e8eSopenharmony_ci      var fir = outputStack.pop()
325088c88e8eSopenharmony_ci      res = getResult(fir, sec, cur)
325188c88e8eSopenharmony_ci      log = res.log
325288c88e8eSopenharmony_ci      if (log) {
325388c88e8eSopenharmony_ci        return {
325488c88e8eSopenharmony_ci          value: null,
325588c88e8eSopenharmony_ci          log: log
325688c88e8eSopenharmony_ci        }
325788c88e8eSopenharmony_ci      } else {
325888c88e8eSopenharmony_ci        outputStack.push(res.value)
325988c88e8eSopenharmony_ci      }
326088c88e8eSopenharmony_ci    }
326188c88e8eSopenharmony_ci  }
326288c88e8eSopenharmony_ci  if(outputStack.length != 1) {
326388c88e8eSopenharmony_ci    log = {reason: 'ERROR: Expression does not conform to specification'}
326488c88e8eSopenharmony_ci  } else {
326588c88e8eSopenharmony_ci    if (outputStack[0].match(/[+-]/)) {
326688c88e8eSopenharmony_ci      value = 'calc' + outputStack[0]
326788c88e8eSopenharmony_ci    } else {
326888c88e8eSopenharmony_ci      value = outputStack[0]
326988c88e8eSopenharmony_ci    }
327088c88e8eSopenharmony_ci  }
327188c88e8eSopenharmony_ci  return {
327288c88e8eSopenharmony_ci    value: value,
327388c88e8eSopenharmony_ci    log: log
327488c88e8eSopenharmony_ci  }
327588c88e8eSopenharmony_ci}
327688c88e8eSopenharmony_ci
327788c88e8eSopenharmony_civar cssPropData = []
327888c88e8eSopenharmony_ci
327988c88e8eSopenharmony_cifunction saveCssProp(name, value) {
328088c88e8eSopenharmony_ci  if (name.match(/\-\-/)) {
328188c88e8eSopenharmony_ci    while (value.match(/var/)) {
328288c88e8eSopenharmony_ci      var value = cssVarFun(value)
328388c88e8eSopenharmony_ci    }
328488c88e8eSopenharmony_ci    cssPropData.push({name: name,value: value})
328588c88e8eSopenharmony_ci  }
328688c88e8eSopenharmony_ci}
328788c88e8eSopenharmony_ci
328888c88e8eSopenharmony_cifunction cssVarFun(value) {
328988c88e8eSopenharmony_ci  if (value.match(/calc/)) {
329088c88e8eSopenharmony_ci    return value
329188c88e8eSopenharmony_ci  } else {
329288c88e8eSopenharmony_ci    if (value.match(/var/)) {
329388c88e8eSopenharmony_ci      if (value.match(/\,/)) {
329488c88e8eSopenharmony_ci        var cssVarFir = value.substring(0,value.indexOf(",")).replace("var(","").trim()
329588c88e8eSopenharmony_ci        var cssVarSec = value.substring(value.indexOf(",")+1,value.length).replace(")","").trim()
329688c88e8eSopenharmony_ci      } else {
329788c88e8eSopenharmony_ci          var cssVarFir = value.replace("var(","").replace(")","").trim()
329888c88e8eSopenharmony_ci          var cssVarSec = ""
329988c88e8eSopenharmony_ci      }
330088c88e8eSopenharmony_ci      let varValue = cssVarSec
330188c88e8eSopenharmony_ci      for(var i=0, len=cssPropData.length; i<len; i++) {
330288c88e8eSopenharmony_ci        var cPDName = cssPropData[i].name.trim()
330388c88e8eSopenharmony_ci        cssVarFir = util.hyphenedToCamelCase(cssVarFir)
330488c88e8eSopenharmony_ci        if (cssVarFir == cPDName) {
330588c88e8eSopenharmony_ci          varValue = cssPropData[i].value
330688c88e8eSopenharmony_ci        }
330788c88e8eSopenharmony_ci      }
330888c88e8eSopenharmony_ci      return varValue
330988c88e8eSopenharmony_ci    } else {
331088c88e8eSopenharmony_ci      return value
331188c88e8eSopenharmony_ci    }
331288c88e8eSopenharmony_ci  }
331388c88e8eSopenharmony_ci}
331488c88e8eSopenharmony_ci
331588c88e8eSopenharmony_cifunction expValidate(name, value) {
331688c88e8eSopenharmony_ci  var res, log
331788c88e8eSopenharmony_ci  saveCssProp(name, value)
331888c88e8eSopenharmony_ci  if (typeof value === 'string' && name != 'border') {
331988c88e8eSopenharmony_ci    if (value.match(/var/)) {
332088c88e8eSopenharmony_ci      value = cssVarFun(value)
332188c88e8eSopenharmony_ci    }
332288c88e8eSopenharmony_ci    if (value.match(/calc/)) {
332388c88e8eSopenharmony_ci      var checkOp =
332488c88e8eSopenharmony_ci        /[a-zA-Z0-9()]\+|\+[a-zA-Z0-9()]|[a-zA-Z0-9()](?<!\-)\-(?!\-)|(?<!\-)\-(?!\-)[a-zA-Z0-9()]|[a-zA-Z0-9()]\*|\*[a-zA-Z0-9()]|[a-zA-Z0-9()]\/|\/[a-zA-Z0-9()]/
332588c88e8eSopenharmony_ci      if (value.match(checkOp) && value.match(/calc\(|var\(\-\-/)) {
332688c88e8eSopenharmony_ci        log = {reason: 'ERROR: Expression error, A space is required before and after the operator'}
332788c88e8eSopenharmony_ci        return {
332888c88e8eSopenharmony_ci          log: log
332988c88e8eSopenharmony_ci        }
333088c88e8eSopenharmony_ci      }
333188c88e8eSopenharmony_ci      res = dal2Rpn(value)
333288c88e8eSopenharmony_ci      res = evalRpn(res.value)
333388c88e8eSopenharmony_ci      log = res.log
333488c88e8eSopenharmony_ci      value = res.value
333588c88e8eSopenharmony_ci    }
333688c88e8eSopenharmony_ci  }
333788c88e8eSopenharmony_ci  return {
333888c88e8eSopenharmony_ci    value: value,
333988c88e8eSopenharmony_ci    log: log
334088c88e8eSopenharmony_ci  }
334188c88e8eSopenharmony_ci}
334288c88e8eSopenharmony_ci
334388c88e8eSopenharmony_ci/**
334488c88e8eSopenharmony_ci * validate a CSS name/value pair
334588c88e8eSopenharmony_ci *
334688c88e8eSopenharmony_ci * @param  {string} name   camel cased
334788c88e8eSopenharmony_ci * @param  {string} value
334888c88e8eSopenharmony_ci * @return {object}
334988c88e8eSopenharmony_ci * - value:string or null
335088c88e8eSopenharmony_ci * - log:{reason:string} or undefined
335188c88e8eSopenharmony_ci */
335288c88e8eSopenharmony_cifunction validate(name, value) {
335388c88e8eSopenharmony_ci  var log, expRes
335488c88e8eSopenharmony_ci  expRes = expValidate(name, value)
335588c88e8eSopenharmony_ci  if (expRes.log) {
335688c88e8eSopenharmony_ci    return {
335788c88e8eSopenharmony_ci      value: null,
335888c88e8eSopenharmony_ci      log: expRes.log
335988c88e8eSopenharmony_ci    }
336088c88e8eSopenharmony_ci  } else {
336188c88e8eSopenharmony_ci    value = expRes.value
336288c88e8eSopenharmony_ci  }
336388c88e8eSopenharmony_ci
336488c88e8eSopenharmony_ci  var result
336588c88e8eSopenharmony_ci  var validator = validatorMap[name]
336688c88e8eSopenharmony_ci  if (typeof validator === 'function') {
336788c88e8eSopenharmony_ci    const flag = /{{{(.+?)}}}|{{(.+?)}}/.test(value) && card
336888c88e8eSopenharmony_ci    if (typeof value !== 'function' &&  !flag) {
336988c88e8eSopenharmony_ci      result = validator(value, name)
337088c88e8eSopenharmony_ci    }
337188c88e8eSopenharmony_ci    /* istanbul ignore else */
337288c88e8eSopenharmony_ci    else {
337388c88e8eSopenharmony_ci      result = {value: value}
337488c88e8eSopenharmony_ci    }
337588c88e8eSopenharmony_ci    if (result.reason) {
337688c88e8eSopenharmony_ci      log = {reason: result.reason(name, value, result.value)}
337788c88e8eSopenharmony_ci    }
337888c88e8eSopenharmony_ci  }
337988c88e8eSopenharmony_ci  else {
338088c88e8eSopenharmony_ci    // ensure number type, no `px`
338188c88e8eSopenharmony_ci    /* istanbul ignore else */
338288c88e8eSopenharmony_ci    if (typeof value !== 'function') {
338388c88e8eSopenharmony_ci      var match = value.match(LENGTH_REGEXP)
338488c88e8eSopenharmony_ci      if (match && (!match[1] || SUPPORT_CSS_UNIT.indexOf(match[1]) === -1)) {
338588c88e8eSopenharmony_ci        value = parseFloat(value)
338688c88e8eSopenharmony_ci      }
338788c88e8eSopenharmony_ci    }
338888c88e8eSopenharmony_ci    result = {value: value}
338988c88e8eSopenharmony_ci    var suggestedName = SUGGESTED_PROP_NAME_GROUP[name]
339088c88e8eSopenharmony_ci    var suggested = suggestedName ? ', suggest `' + util.camelCaseToHyphened(suggestedName) + '`' : ''
339188c88e8eSopenharmony_ci    log = {reason: 'WARNING: `' + util.camelCaseToHyphened(name) +
339288c88e8eSopenharmony_ci      '` is not a standard attribute name and may not be supported' + suggested}
339388c88e8eSopenharmony_ci  }
339488c88e8eSopenharmony_ci  return {
339588c88e8eSopenharmony_ci    value: result.value,
339688c88e8eSopenharmony_ci    log: log
339788c88e8eSopenharmony_ci  }
339888c88e8eSopenharmony_ci}
339988c88e8eSopenharmony_ci
340088c88e8eSopenharmony_civar validateFuncMap = {
340188c88e8eSopenharmony_ci  length: LENGTH_VALIDATOR,
340288c88e8eSopenharmony_ci  number: NUMBER_VALIDATOR,
340388c88e8eSopenharmony_ci  date: DATE_VALIDATOR
340488c88e8eSopenharmony_ci}
340588c88e8eSopenharmony_ci
340688c88e8eSopenharmony_cimodule.exports = {
340788c88e8eSopenharmony_ci  BASIC_COLOR_KEYWORDS: BASIC_COLOR_KEYWORDS,
340888c88e8eSopenharmony_ci  EXTENDED_COLOR_KEYWORDS: EXTENDED_COLOR_KEYWORDS,
340988c88e8eSopenharmony_ci
341088c88e8eSopenharmony_ci  LENGTH_VALIDATOR: LENGTH_VALIDATOR,
341188c88e8eSopenharmony_ci  COLOR_VALIDATOR: COLOR_VALIDATOR,
341288c88e8eSopenharmony_ci  COLOR_VAR_VALIDATOR: COLOR_VAR_VALIDATOR,
341388c88e8eSopenharmony_ci  NUMBER_VALIDATOR: NUMBER_VALIDATOR,
341488c88e8eSopenharmony_ci  INTEGER_VALIDATOR: INTEGER_VALIDATOR,
341588c88e8eSopenharmony_ci  genEnumValidator: genEnumValidator,
341688c88e8eSopenharmony_ci
341788c88e8eSopenharmony_ci  TRANSITION_PROPERTY_VALIDATOR: TRANSITION_PROPERTY_VALIDATOR,
341888c88e8eSopenharmony_ci  TRANSITION_DURATION_VALIDATOR: TRANSITION_INTERVAL_VALIDATOR,
341988c88e8eSopenharmony_ci  TRANSITION_DELAY_VALIDATOR: TRANSITION_INTERVAL_VALIDATOR,
342088c88e8eSopenharmony_ci  TRANSITION_TIMING_FUNCTION_VALIDATOR: TRANSITION_TIMING_FUNCTION_VALIDATOR,
342188c88e8eSopenharmony_ci
342288c88e8eSopenharmony_ci  PROP_NAME_GROUPS: PROP_NAME_GROUPS,
342388c88e8eSopenharmony_ci  validateFuncMap: validateFuncMap,
342488c88e8eSopenharmony_ci
342588c88e8eSopenharmony_ci  map: validatorMap,
342688c88e8eSopenharmony_ci  validate: validate
342788c88e8eSopenharmony_ci}
3428