1 line
4.9 KiB
JavaScript
1 line
4.9 KiB
JavaScript
function e(e,t){return RegExp((t?``:`^`)+`(?:`+e.join(`|`)+`)`+(t?`$`:`\\b`))}function t(e,t,n){return n.tokenize.push(e),e(t,n)}var n=/^(?:[-+/%|&^]|\*\*?|[<>]{2})/,r=/^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/,i=/^(?:\[\][?=]?)/,a=/^(?:\.(?:\.{2})?|->|[?:])/,o=/^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/,s=/^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/,c=e(`abstract.alias.as.asm.begin.break.case.class.def.do.else.elsif.end.ensure.enum.extend.for.fun.if.include.instance_sizeof.lib.macro.module.next.of.out.pointerof.private.protected.rescue.return.require.select.sizeof.struct.super.then.type.typeof.uninitialized.union.unless.until.when.while.with.yield.__DIR__.__END_LINE__.__FILE__.__LINE__`.split(`.`)),l=e([`true`,`false`,`nil`,`self`]),u=e([`def`,`fun`,`macro`,`class`,`module`,`struct`,`lib`,`enum`,`union`,`do`,`for`]),d=e([`if`,`unless`,`case`,`while`,`until`,`begin`,`then`]),f=[`end`,`else`,`elsif`,`rescue`,`ensure`],p=e(f),m=[`\\)`,`\\}`,`\\]`],h=RegExp(`^(?:`+m.join(`|`)+`)$`),g={def:S,fun:S,macro:x,class:C,module:C,struct:C,lib:C,enum:C,union:C},_={"[":`]`,"{":`}`,"(":`)`,"<":`>`};function v(e,f){if(e.eatSpace())return null;if(f.lastToken!=`\\`&&e.match(`{%`,!1))return t(b(`%`,`%`),e,f);if(f.lastToken!=`\\`&&e.match(`{{`,!1))return t(b(`{`,`}`),e,f);if(e.peek()==`#`)return e.skipToEnd(),`comment`;var p;if(e.match(o))return e.eat(/[?!]/),p=e.current(),e.eat(`:`)?`atom`:f.lastToken==`.`?`property`:c.test(p)?(u.test(p)?!(p==`fun`&&f.blocks.indexOf(`lib`)>=0)&&!(p==`def`&&f.lastToken==`abstract`)&&(f.blocks.push(p),f.currentIndent+=1):(f.lastStyle==`operator`||!f.lastStyle)&&d.test(p)?(f.blocks.push(p),f.currentIndent+=1):p==`end`&&(f.blocks.pop(),--f.currentIndent),g.hasOwnProperty(p)&&f.tokenize.push(g[p]),`keyword`):l.test(p)?`atom`:`variable`;if(e.eat(`@`))return e.peek()==`[`?t(y(`[`,`]`,`meta`),e,f):(e.eat(`@`),e.match(o)||e.match(s),`propertyName`);if(e.match(s))return`tag`;if(e.eat(`:`))return e.eat(`"`)?t(w(`"`,`atom`,!1),e,f):e.match(o)||e.match(s)||e.match(n)||e.match(r)||e.match(i)?`atom`:(e.eat(`:`),`operator`);if(e.eat(`"`))return t(w(`"`,`string`,!0),e,f);if(e.peek()==`%`){var m=`string`,h=!0,v;if(e.match(`%r`))m=`string.special`,v=e.next();else if(e.match(`%w`))h=!1,v=e.next();else if(e.match(`%q`))h=!1,v=e.next();else if(v=e.match(/^%([^\w\s=])/))v=v[1];else if(e.match(/^%[a-zA-Z_\u009F-\uFFFF][\w\u009F-\uFFFF]*/))return`meta`;else if(e.eat(`%`))return`operator`;return _.hasOwnProperty(v)&&(v=_[v]),t(w(v,m,h),e,f)}return(p=e.match(/^<<-('?)([A-Z]\w*)\1/))?t(T(p[2],!p[1]),e,f):e.eat(`'`)?(e.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/),e.eat(`'`),`atom`):e.eat(`0`)?(e.eat(`x`)?e.match(/^[0-9a-fA-F_]+/):e.eat(`o`)?e.match(/^[0-7_]+/):e.eat(`b`)&&e.match(/^[01_]+/),`number`):e.eat(/^\d/)?(e.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?/),`number`):e.match(n)?(e.eat(`=`),`operator`):e.match(r)||e.match(a)?`operator`:(p=e.match(/[({[]/,!1))?(p=p[0],t(y(p,_[p],null),e,f)):e.eat(`\\`)?(e.next(),`meta`):(e.next(),null)}function y(e,t,n,r){return function(i,a){if(!r&&i.match(e))return a.tokenize[a.tokenize.length-1]=y(e,t,n,!0),a.currentIndent+=1,n;var o=v(i,a);return i.current()===t&&(a.tokenize.pop(),--a.currentIndent,o=n),o}}function b(e,t,n){return function(r,i){return!n&&r.match(`{`+e)?(i.currentIndent+=1,i.tokenize[i.tokenize.length-1]=b(e,t,!0),`meta`):r.match(t+`}`)?(--i.currentIndent,i.tokenize.pop(),`meta`):v(r,i)}}function x(e,t){if(e.eatSpace())return null;var n;if(n=e.match(o)){if(n==`def`)return`keyword`;e.eat(/[?!]/)}return t.tokenize.pop(),`def`}function S(e,t){return e.eatSpace()?null:(e.match(o)?e.eat(/[!?]/):e.match(n)||e.match(r)||e.match(i),t.tokenize.pop(),`def`)}function C(e,t){return e.eatSpace()?null:(e.match(s),t.tokenize.pop(),`def`)}function w(e,t,n){return function(r,i){for(var a=!1;r.peek();)if(a)r.next(),a=!1;else{if(r.match(`{%`,!1))return i.tokenize.push(b(`%`,`%`)),t;if(r.match(`{{`,!1))return i.tokenize.push(b(`{`,`}`)),t;if(n&&r.match(`#{`,!1))return i.tokenize.push(y(`#{`,`}`,`meta`)),t;var o=r.next();if(o==e)return i.tokenize.pop(),t;a=n&&o==`\\`}return t}}function T(e,t){return function(n,r){if(n.sol()&&(n.eatSpace(),n.match(e)))return r.tokenize.pop(),`string`;for(var i=!1;n.peek();)if(i)n.next(),i=!1;else{if(n.match(`{%`,!1))return r.tokenize.push(b(`%`,`%`)),`string`;if(n.match(`{{`,!1))return r.tokenize.push(b(`{`,`}`)),`string`;if(t&&n.match(`#{`,!1))return r.tokenize.push(y(`#{`,`}`,`meta`)),`string`;i=n.next()==`\\`&&t}return`string`}}var E={name:`crystal`,startState:function(){return{tokenize:[v],currentIndent:0,lastToken:null,lastStyle:null,blocks:[]}},token:function(e,t){var n=t.tokenize[t.tokenize.length-1](e,t),r=e.current();return n&&n!=`comment`&&(t.lastToken=r,t.lastStyle=n),n},indent:function(e,t,n){return t=t.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g,``),p.test(t)||h.test(t)?n.unit*(e.currentIndent-1):n.unit*e.currentIndent},languageData:{indentOnInput:e(m.concat(f),!0),commentTokens:{line:`#`}}};export{E as crystal}; |