diff --git a/packages/less/src/less/functions/index.js b/packages/less/src/less/functions/index.js index 160ac7523..f463c3639 100644 --- a/packages/less/src/less/functions/index.js +++ b/packages/less/src/less/functions/index.js @@ -13,6 +13,7 @@ import string from './string'; import svg from './svg'; import types from './types'; import style from './style'; +import size from './size'; export default environment => { const functions = { functionRegistry, functionCaller }; @@ -30,6 +31,7 @@ export default environment => { functionRegistry.addMultiple(svg(environment)); functionRegistry.addMultiple(types); functionRegistry.addMultiple(style); + functionRegistry.addMultiple(size); return functions; }; diff --git a/packages/less/src/less/functions/size.js b/packages/less/src/less/functions/size.js new file mode 100644 index 000000000..16e61fb4c --- /dev/null +++ b/packages/less/src/less/functions/size.js @@ -0,0 +1,23 @@ +import Variable from '../tree/variable'; +import Anonymous from '../tree/variable'; + +const sizeExpression = function (args) { + args = Array.prototype.slice.call(args); + switch (args.length) { + case 0: throw { type: 'Argument', message: 'one or more arguments required' }; + } + + const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)]; + + args = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', '); + + return new Anonymous(`size(${args})`); +}; + +export default { + size: function(...args) { + try { + return sizeExpression.call(this, args); + } catch (e) {} + }, +}; diff --git a/packages/less/src/less/parser/parser.js b/packages/less/src/less/parser/parser.js index 6af533ff3..283d119ae 100644 --- a/packages/less/src/less/parser/parser.js +++ b/packages/less/src/less/parser/parser.js @@ -482,13 +482,20 @@ const Parser = function Parser(context, imports, fileInfo, currentIndex) { const index = parserInput.i; parserInput.save(); - + + let keywordEntity = this.entities.keyword(); + parserInput.restore(); + parserInput.save(); + validCall = parserInput.$re(/^[\w]+\(/); if (!validCall) { parserInput.forget(); return; + } else if (validCall && keywordEntity && !functionRegistry.get(validCall.substring(0, validCall.length - 1))) { + parserInput.restore(); + return; } - + validCall = validCall.substring(0, validCall.length - 1); let rule = this.ruleProperty(); diff --git a/packages/test-data/css/_main/media.css b/packages/test-data/css/_main/media.css index 83b241bab..8bd685f87 100644 --- a/packages/test-data/css/_main/media.css +++ b/packages/test-data/css/_main/media.css @@ -269,3 +269,11 @@ padding: 0; } } +@media screen and (max-width: 1280px) { + .form-process-table { + width: 1200px; + } + .form-process-table > div { + width: 960px; + } +} diff --git a/packages/test-data/less/_main/media.less b/packages/test-data/less/_main/media.less index 82e9e7cc3..8b9fc0cfd 100644 --- a/packages/test-data/less/_main/media.less +++ b/packages/test-data/less/_main/media.less @@ -297,3 +297,12 @@ } } } + +@media screen and(max-width:1280px) { + .form-process-table { + width: 1200px; + > div { + width: 960px; + } + } +}