188c88e8eSopenharmony_ci# Weex `<style>` Transformer
288c88e8eSopenharmony_ci
388c88e8eSopenharmony_ci[![NPM version][npm-image]][npm-url]
488c88e8eSopenharmony_ci[![Build status][circle-image]][circle-url]
588c88e8eSopenharmony_ci[![Downloads][downloads-image]][downloads-url]
688c88e8eSopenharmony_ci
788c88e8eSopenharmony_ci[npm-image]: https://img.shields.io/npm/v/weex-styler.svg?style=flat-square
888c88e8eSopenharmony_ci[npm-url]: https://npmjs.org/package/weex-styler
988c88e8eSopenharmony_ci[circle-image]: https://circleci.com/gh/alibaba/weex_toolchain.svg?style=svg
1088c88e8eSopenharmony_ci[circle-url]: https://circleci.com/gh/alibaba/weex_toolchain/tree/master
1188c88e8eSopenharmony_ci[downloads-image]: https://img.shields.io/npm/dm/weex-styler.svg?style=flat-square
1288c88e8eSopenharmony_ci[downloads-url]: https://npmjs.org/package/weex-styler
1388c88e8eSopenharmony_ci
1488c88e8eSopenharmony_ci## Features
1588c88e8eSopenharmony_ci
1688c88e8eSopenharmony_ci- convert a `<style>` element to JSON format
1788c88e8eSopenharmony_ci- autofix common mistakes
1888c88e8eSopenharmony_ci- friendly warnings
1988c88e8eSopenharmony_ci
2088c88e8eSopenharmony_ci## API
2188c88e8eSopenharmony_ci
2288c88e8eSopenharmony_ci- `parse(code, done)`
2388c88e8eSopenharmony_ci- `validate(json, done)`
2488c88e8eSopenharmony_ci- `validateItem(name, value)`
2588c88e8eSopenharmony_ci
2688c88e8eSopenharmony_ci### util api
2788c88e8eSopenharmony_ci
2888c88e8eSopenharmony_ci- `util.hyphenedToCamelCase(value)`
2988c88e8eSopenharmony_ci- `util.camelCaseToHyphened(value)`
3088c88e8eSopenharmony_ci
3188c88e8eSopenharmony_ci```javascript
3288c88e8eSopenharmony_ci/**
3388c88e8eSopenharmony_ci * Parse `<style>` code to a JSON Object and log errors & warnings
3488c88e8eSopenharmony_ci * 
3588c88e8eSopenharmony_ci * @param {string} code
3688c88e8eSopenharmony_ci * @param {function} done
3788c88e8eSopenharmony_ci */
3888c88e8eSopenharmony_cifunction parse(code, done) {}
3988c88e8eSopenharmony_ci
4088c88e8eSopenharmony_ci/**
4188c88e8eSopenharmony_ci * Validate a JSON Object and log errors & warnings
4288c88e8eSopenharmony_ci * 
4388c88e8eSopenharmony_ci * @param {object} json
4488c88e8eSopenharmony_ci * @param {function} done
4588c88e8eSopenharmony_ci */
4688c88e8eSopenharmony_cifunction validate(json, done) {}
4788c88e8eSopenharmony_ci
4888c88e8eSopenharmony_ci/**
4988c88e8eSopenharmony_ci * Result callback
5088c88e8eSopenharmony_ci *
5188c88e8eSopenharmony_ci * data
5288c88e8eSopenharmony_ci * - jsonStyle{}: `classname.propname.value`-like object
5388c88e8eSopenharmony_ci * - log[{line, column, reason}]
5488c88e8eSopenharmony_ci * 
5588c88e8eSopenharmony_ci * @param {Error} err
5688c88e8eSopenharmony_ci * @param {object} data
5788c88e8eSopenharmony_ci */
5888c88e8eSopenharmony_cifunction done(err, data) {}
5988c88e8eSopenharmony_ci
6088c88e8eSopenharmony_ci/**
6188c88e8eSopenharmony_ci * Validate a single name-value pair
6288c88e8eSopenharmony_ci * 
6388c88e8eSopenharmony_ci * @param  {string} name  camel cased
6488c88e8eSopenharmony_ci * @param  {string} value
6588c88e8eSopenharmony_ci * @return {object}
6688c88e8eSopenharmony_ci * - value
6788c88e8eSopenharmony_ci * - log{reason}
6888c88e8eSopenharmony_ci */
6988c88e8eSopenharmony_cifunction validateItem(name, value) {}
7088c88e8eSopenharmony_ci```
7188c88e8eSopenharmony_ci
7288c88e8eSopenharmony_ci## Validation
7388c88e8eSopenharmony_ci
7488c88e8eSopenharmony_ci- rule check: only common rule type supported, othres will be ignored
7588c88e8eSopenharmony_ci- selector check: only single-classname selector is supported, others will be ignored
7688c88e8eSopenharmony_ci- prop name check: out-of-defined prop name will be warned but preserved
7788c88e8eSopenharmony_ci- prop value check: common prop value mistakes will be autofixed or ignored
7888c88e8eSopenharmony_ci    + color type: keywords, `#xxx` -> warning: `#xxxxxx`
7988c88e8eSopenharmony_ci    + color type: `transparent` -> error: not supported
8088c88e8eSopenharmony_ci    + length type: `100px` -> warning: `100`
8188c88e8eSopenharmony_ci
8288c88e8eSopenharmony_ci## Demo
8388c88e8eSopenharmony_ci
8488c88e8eSopenharmony_ci```javascript
8588c88e8eSopenharmony_civar styler = require('weex-styler')
8688c88e8eSopenharmony_ci
8788c88e8eSopenharmony_civar code = 'html {color: #000000;} .foo {color: red; -webkit-transform: rotate(90deg); width: 200px;}'
8888c88e8eSopenharmony_ci
8988c88e8eSopenharmony_cistyler.parse(code, function (err, data) {
9088c88e8eSopenharmony_ci  // syntax error
9188c88e8eSopenharmony_ci  // format: {line, column, reason, ...}
9288c88e8eSopenharmony_ci  err
9388c88e8eSopenharmony_ci  // result
9488c88e8eSopenharmony_ci  // {foo: {color: '#ff0000', webkitTransform: 'rotate(90deg)', width: 200}}
9588c88e8eSopenharmony_ci  data.jsonStyle
9688c88e8eSopenharmony_ci  // format: {line, column, reason}
9788c88e8eSopenharmony_ci  // - Error: Selector `html` is not supported. Weex only support single-classname selector
9888c88e8eSopenharmony_ci  // - Warning: prop value `red` is autofixed to `#ff0000`
9988c88e8eSopenharmony_ci  // - Warning: prop name `-webkit-transform` is not supported
10088c88e8eSopenharmony_ci  // - Warning: prop value `200px` is autofixed to `200`
10188c88e8eSopenharmony_ci  data.log[]
10288c88e8eSopenharmony_ci})
10388c88e8eSopenharmony_ci
10488c88e8eSopenharmony_civar jsonStyle = {
10588c88e8eSopenharmony_ci  foo: {
10688c88e8eSopenharmony_ci    color: 'red',
10788c88e8eSopenharmony_ci    webkitTransform: 'rotate(90deg)',
10888c88e8eSopenharmony_ci    width: '200px'
10988c88e8eSopenharmony_ci  }
11088c88e8eSopenharmony_ci}
11188c88e8eSopenharmony_ci
11288c88e8eSopenharmony_cistyler.validate(json, function (err, data) {
11388c88e8eSopenharmony_ci  // syntax error
11488c88e8eSopenharmony_ci  err
11588c88e8eSopenharmony_ci  // result
11688c88e8eSopenharmony_ci  // {foo: {color: '#ff0000', webkitTransform: 'rotate(90deg)', width: 200}}
11788c88e8eSopenharmony_ci  data.jsonStyle
11888c88e8eSopenharmony_ci  // format: {reason}
11988c88e8eSopenharmony_ci  // - Warning: prop value `red` is autofixed to `#ff0000`
12088c88e8eSopenharmony_ci  // - Warning: prop name `-webkit-transform` is not supported
12188c88e8eSopenharmony_ci  // - Warning: prop value `200px` is autofixed to `200`
12288c88e8eSopenharmony_ci  data.log[]
12388c88e8eSopenharmony_ci})
12488c88e8eSopenharmony_ci```
125