From 54e535dfd85a5d0134f05d09bb2e71e3ce2bd16e Mon Sep 17 00:00:00 2001 From: Ivan Sagalaev Date: Wed, 9 Mar 2016 12:06:53 -0800 Subject: [PATCH 1/3] Fixes to Less selectors - Recognize `>` as a starting character for a selector. - Parse attributes before selectors. This avoids the situation when an attributes value contains `{` somewhere in the middle and makes it look like a selector for a pre-parsing regexp. --- src/languages/css.js | 3 ++- src/languages/less.js | 25 +++++++++++++++++-------- test/detect/less/default.txt | 5 ----- test/markup/less/selectors.expect.txt | 8 ++++++++ test/markup/less/selectors.txt | 8 ++++++++ 5 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 test/markup/less/selectors.expect.txt create mode 100644 test/markup/less/selectors.txt diff --git a/src/languages/css.js b/src/languages/css.js index e20d719f43..f53ea951fd 100644 --- a/src/languages/css.js +++ b/src/languages/css.js @@ -76,10 +76,11 @@ function(hljs) { // because it doesn’t let it to be parsed as // a rule set but instead drops parser into // the default mode which is how it should be. + illegal: /:/, // break on Less variables @var: ... contains: [ { className: 'keyword', - begin: /\S+/ + begin: /\w+/ }, { begin: /\s/, endsWithParent: true, excludeEnd: true, diff --git a/src/languages/less.js b/src/languages/less.js index 4205a0b867..a3f04d4f2c 100644 --- a/src/languages/less.js +++ b/src/languages/less.js @@ -63,11 +63,19 @@ function(hljs) { /* Rule-Level Modes */ var RULE_MODE = { - className: 'attribute', - begin: INTERP_IDENT_RE, end: ':', excludeEnd: true, - contains: [hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE], - illegal: /\S/, - starts: {end: '[;}]', returnEnd: true, contains: VALUE, illegal: '[<=$]'} + begin: INTERP_IDENT_RE + '\\s*:', returnBegin: true, end: '[;}]', + relevance: 0, + contains: [ + { + className: 'attribute', + begin: INTERP_IDENT_RE, end: ':', excludeEnd: true, + starts: { + endsWithParent: true, illegal: '[<=$]', + relevance: 0, + contains: VALUE + } + } + ] }; var AT_RULE_MODE = { @@ -95,7 +103,7 @@ function(hljs) { // then fall into the scary lookahead-discriminator variant. // this mode also handles mixin definitions and calls variants: [{ - begin: '[\\.#:&\\[]', end: '[;{}]' // mixin calls end with ';' + begin: '[\\.#:&\\[>]', end: '[;{}]' // mixin calls end with ';' }, { begin: INTERP_IDENT_RE + '[^;]*{', end: '{' @@ -114,6 +122,7 @@ function(hljs) { IDENT_MODE('selector-class', '\\.' + INTERP_IDENT_RE, 0), IDENT_MODE('selector-tag', '&', 0), {className: 'selector-attr', begin: '\\[', end: '\\]'}, + {className: 'selector-pseudo', begin: /:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/}, {begin: '\\(', end: '\\)', contains: VALUE_WITH_RULESETS}, // argument list of parametric mixins {begin: '!important'} // eat !important after mixin call or it will be colored as tag ] @@ -124,8 +133,8 @@ function(hljs) { hljs.C_BLOCK_COMMENT_MODE, AT_RULE_MODE, VAR_RULE_MODE, - SELECTOR_MODE, - RULE_MODE + RULE_MODE, + SELECTOR_MODE ); return { diff --git a/test/detect/less/default.txt b/test/detect/less/default.txt index e59f8be786..ce100f7dca 100644 --- a/test/detect/less/default.txt +++ b/test/detect/less/default.txt @@ -1,8 +1,3 @@ -/* -Using the most minimal language subset to ensure we -have enough relevance hints for proper Less detection -*/ - @import "fruits"; @rhythm: 1.5em; diff --git a/test/markup/less/selectors.expect.txt b/test/markup/less/selectors.expect.txt new file mode 100644 index 0000000000..425530e590 --- /dev/null +++ b/test/markup/less/selectors.expect.txt @@ -0,0 +1,8 @@ +#foo { + tag #bar {} + > #bar {} + #bar {} + &#bar {} + &:hover {} + height: ~"@{height}px"; +} diff --git a/test/markup/less/selectors.txt b/test/markup/less/selectors.txt new file mode 100644 index 0000000000..8a5ed6e5c6 --- /dev/null +++ b/test/markup/less/selectors.txt @@ -0,0 +1,8 @@ +#foo { + tag #bar {} + > #bar {} + #bar {} + &#bar {} + &:hover {} + height: ~"@{height}px"; +} From c50b28fde78bafbfe83854dbf5a35f00238be35f Mon Sep 17 00:00:00 2001 From: Mikko Kouhia Date: Sun, 13 Mar 2016 20:23:03 +0200 Subject: [PATCH 2/3] Update Gams highlighting - Do not highlight whole assignment, just the numbers - Split keywords to regular keywords, literals and built-ins - Allow comments inside assignments, listings and definitions --- src/languages/gams.js | 98 +++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/src/languages/gams.js b/src/languages/gams.js index 2303455822..60ea5752ff 100644 --- a/src/languages/gams.js +++ b/src/languages/gams.js @@ -8,11 +8,30 @@ */ function (hljs) { - var KEYWORDS = - 'abort acronym acronyms alias all and assign binary card diag display else eps eq equation equations file files ' + - 'for free ge gt if inf integer le loop lt maximizing minimizing model models na ne negative no not option ' + - 'options or ord parameter parameters positive prod putpage puttl repeat sameas scalar scalars semicont semiint ' + - 'set sets smax smin solve sos1 sos2 sum system table then until using variable variables while xor yes'; + var KEYWORDS = { + 'keyword': + 'abort acronym acronyms alias all and assign binary card diag display ' + + 'else eq file files for free ge gt if integer le loop lt maximizing ' + + 'minimizing model models ne negative no not option options or ord ' + + 'positive prod put putpage puttl repeat sameas semicont semiint smax ' + + 'smin solve sos1 sos2 sum system table then until using while xor yes', + 'literal': 'eps inf na', + 'built-in': + 'abs arccos arcsin arctan arctan2 Beta betaReg binomial ceil centropy ' + + 'cos cosh cvPower div div0 eDist entropy errorf execSeed exp fact ' + + 'floor frac gamma gammaReg log logBeta logGamma log10 log2 mapVal max ' + + 'min mod ncpCM ncpF ncpVUpow ncpVUsin normal pi poly power ' + + 'randBinomial randLinear randTriangle round rPower sigmoid sign ' + + 'signPower sin sinh slexp sllog10 slrec sqexp sqlog10 sqr sqrec sqrt ' + + 'tan tanh trunc uniform uniformInt vcPower bool_and bool_eqv bool_imp ' + + 'bool_not bool_or bool_xor ifThen rel_eq rel_ge rel_gt rel_le rel_lt ' + + 'rel_ne gday gdow ghour gleap gmillisec gminute gmonth gsecond gyear ' + + 'jdate jnow jstart jtime errorLevel execError gamsRelease gamsVersion ' + + 'handleCollect handleDelete handleStatus handleSubmit heapFree ' + + 'heapLimit heapSize jobHandle jobKill jobStatus jobTerminate ' + + 'licenseLevel licenseStatus maxExecError sleep timeClose timeComp ' + + 'timeElapsed timeExec timeStart' + }; var PARAMS = { className: 'params', begin: /\(/, end: /\)/, @@ -26,7 +45,7 @@ function (hljs) { {begin: /\$/}, ] }; - var COMMSTR = { + var QSTR = { // One-line quoted comment string className: 'comment', variants: [ {begin: '\'', end: '\''}, @@ -36,10 +55,17 @@ function (hljs) { contains: [hljs.BACKSLASH_ESCAPE] }; var ASSIGNMENT = { - className: 'number', begin: '/', end: '/', - // contains: [COMMSTR], + keywords: KEYWORDS, + contains: [ + QSTR, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, + hljs.C_NUMBER_MODE, + ], }; var DESCTEXT = { // Parameter/set/variable description text begin: /[a-z][a-z0-9_]*(\([a-z0-9_, ]*\))?[ \t]+/, @@ -47,13 +73,11 @@ function (hljs) { end: '$', endsWithParent: true, contains: [ - COMMSTR, + QSTR, ASSIGNMENT, { className: 'comment', - variants: [ - {begin: /([ ]*[a-z0-9&#*=?@>\\<:\-,()$\[\]_.{}!+%^]+)+/}, - ], + begin: /([ ]*[a-z0-9&#*=?@>\\<:\-,()$\[\]_.{}!+%^]+)+/, }, ], }; @@ -88,6 +112,9 @@ function (hljs) { 'scalar scalars equation equations', end: ';', contains: [ + hljs.COMMENT('^\\*', '$'), + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, hljs.QUOTE_STRING_MODE, hljs.APOS_STRING_MODE, ASSIGNMENT, @@ -102,62 +129,33 @@ function (hljs) { { // table header row beginKeywords: 'table', end: '$', - contains: [ - hljs.QUOTE_STRING_MODE, - hljs.APOS_STRING_MODE, - DESCTEXT, - ], + contains: [DESCTEXT], }, + hljs.COMMENT('^\\*', '$'), + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, hljs.C_NUMBER_MODE, + // Table does not contain DESCTEXT or ASSIGNMENT ] }, // Function definitions { className: 'function', - begin: /^[a-z][a-z0-9_, ()$]+\.{2}/, - end: ';', - keywords: KEYWORDS, + begin: /^[a-z][a-z0-9_,\-+' ()$]+\.{2}/, returnBegin: true, contains: [ - { // Function headline - begin: /^[a-z][a-z0-9_]*/, - returnBegin: true, - returnEnd: true, - end: /\.{2}/, - contains: [ { // Function title className: 'title', - begin: /[a-z][a-z0-9_]+(?![^(]*\))/, + begin: /^[a-z][a-z0-9_]+/, }, PARAMS, SYMBOLS, ], - }, - SYMBOLS, - hljs.C_NUMBER_MODE, - ], - }, - { - beginKeywords: 'model', - end: ';', - contains: [ - COMMSTR, - { - className: 'number', - begin: '/', - end: '/', - keywords: 'all', - }, - ], }, hljs.C_NUMBER_MODE, - // ASSIGNMENT, SYMBOLS, - { - className: 'meta', - begin: /\.(lo|up|fx|l|m|scale|prior)/, - }, ] }; } - From f960db8ba69dafeea351df60f8d299c4468fba8c Mon Sep 17 00:00:00 2001 From: Mikko Kouhia Date: Sun, 13 Mar 2016 20:24:34 +0200 Subject: [PATCH 3/3] Update Gams demo snippet --- test/detect/gams/default.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/detect/gams/default.txt b/test/detect/gams/default.txt index 305b758470..9de006e4d5 100644 --- a/test/detect/gams/default.txt +++ b/test/detect/gams/default.txt @@ -14,3 +14,18 @@ TABLE D(I,J) distance in thousands of miles SEATTLE 2.5 1.7 1.8 SAN-DIEGO 2.5 1.8 1.4 ; SCALAR F freight in dollars per case per thousand miles /90/ ; +PARAMETER C(I,J) transport cost in thousands of dollars per case ; + C(I,J) = F * D(I,J) / 1000 ; +VARIABLES + X(I,J) shipment quantities in cases + Z total transportation costs in thousands of dollars ; +POSITIVE VARIABLE X ; +EQUATIONS + COST define objective function + SUPPLY(I) observe supply limit at plant i + DEMAND(J) satisfy demand at market j ; +COST .. Z =E= SUM((I,J), C(I,J)*X(I,J)) ; +SUPPLY(I) .. SUM(J, X(I,J)) =L= A(I) ; +DEMAND(J) .. SUM(I, X(I,J)) =G= B(J) ; +MODEL TRANSPORT /ALL/ ; +SOLVE TRANSPORT USING LP MINIMIZING Z ;