物管理前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1 lines
5.0 KiB

function s(t,e){return new RegExp((e?"":"^")+"(?:"+t.join("|")+")"+(e?"$":"\\b"))}function o(t,e,r){return r.tokenize.push(t),t(e,r)}var d=/^(?:[-+/%|&^]|\*\*?|[<>]{2})/,F=/^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/,g=/^(?:\[\][?=]?)/,I=/^(?:\.(?:\.{2})?|->|[?:])/,f=/^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/,h=/^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/,w=s(["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__"]),v=s(["true","false","nil","self"]),S=["def","fun","macro","class","module","struct","lib","enum","union","do","for"],A=s(S),E=["if","unless","case","while","until","begin","then"],T=s(E),x=["end","else","elsif","rescue","ensure"],Z=s(x),y=["\\)","\\}","\\]"],N=new RegExp("^(?:"+y.join("|")+")$"),_={def:b,fun:b,macro:O,class:i,module:i,struct:i,lib:i,enum:i,union:i},p={"[":"]","{":"}","(":")","<":">"};function z(t,e){if(t.eatSpace())return null;if(e.lastToken!="\\"&&t.match("{%",!1))return o(c("%","%"),t,e);if(e.lastToken!="\\"&&t.match("{{",!1))return o(c("{","}"),t,e);if(t.peek()=="#")return t.skipToEnd(),"comment";var r;if(t.match(f))return t.eat(/[?!]/),r=t.current(),t.eat(":")?"atom":e.lastToken=="."?"property":w.test(r)?(A.test(r)?!(r=="fun"&&e.blocks.indexOf("lib")>=0)&&!(r=="def"&&e.lastToken=="abstract")&&(e.blocks.push(r),e.currentIndent+=1):(e.lastStyle=="operator"||!e.lastStyle)&&T.test(r)?(e.blocks.push(r),e.currentIndent+=1):r=="end"&&(e.blocks.pop(),e.currentIndent-=1),_.hasOwnProperty(r)&&e.tokenize.push(_[r]),"keyword"):v.test(r)?"atom":"variable";if(t.eat("@"))return t.peek()=="["?o(m("[","]","meta"),t,e):(t.eat("@"),t.match(f)||t.match(h),"propertyName");if(t.match(h))return"tag";if(t.eat(":"))return t.eat('"')?o(k('"',"atom",!1),t,e):t.match(f)||t.match(h)||t.match(d)||t.match(F)||t.match(g)?"atom":(t.eat(":"),"operator");if(t.eat('"'))return o(k('"',"string",!0),t,e);if(t.peek()=="%"){var n="string",a=!0,u;if(t.match("%r"))n="string.special",u=t.next();else if(t.match("%w"))a=!1,u=t.next();else if(t.match("%q"))a=!1,u=t.next();else if(u=t.match(/^%([^\w\s=])/))u=u[1];else{if(t.match(/^%[a-zA-Z_\u009F-\uFFFF][\w\u009F-\uFFFF]*/))return"meta";if(t.eat("%"))return"operator"}return p.hasOwnProperty(u)&&(u=p[u]),o(k(u,n,a),t,e)}return(r=t.match(/^<<-('?)([A-Z]\w*)\1/))?o(D(r[2],!r[1]),t,e):t.eat("'")?(t.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/),t.eat("'"),"atom"):t.eat("0")?(t.eat("x")?t.match(/^[0-9a-fA-F_]+/):t.eat("o")?t.match(/^[0-7_]+/):t.eat("b")&&t.match(/^[01_]+/),"number"):t.eat(/^\d/)?(t.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?/),"number"):t.match(d)?(t.eat("="),"operator"):t.match(F)||t.match(I)?"operator":(r=t.match(/[({[]/,!1))?(r=r[0],o(m(r,p[r],null),t,e)):t.eat("\\")?(t.next(),"meta"):(t.next(),null)}function m(t,e,r,n){return function(a,u){if(!n&&a.match(t))return u.tokenize[u.tokenize.length-1]=m(t,e,r,!0),u.currentIndent+=1,r;var l=z(a,u);return a.current()===e&&(u.tokenize.pop(),u.currentIndent-=1,l=r),l}}function c(t,e,r){return function(n,a){return!r&&n.match("{"+t)?(a.currentIndent+=1,a.tokenize[a.tokenize.length-1]=c(t,e,!0),"meta"):n.match(e+"}")?(a.currentIndent-=1,a.tokenize.pop(),"meta"):z(n,a)}}function O(t,e){if(t.eatSpace())return null;var r;if(r=t.match(f)){if(r=="def")return"keyword";t.eat(/[?!]/)}return e.tokenize.pop(),"def"}function b(t,e){return t.eatSpace()?null:(t.match(f)?t.eat(/[!?]/):t.match(d)||t.match(F)||t.match(g),e.tokenize.pop(),"def")}function i(t,e){return t.eatSpace()?null:(t.match(h),e.tokenize.pop(),"def")}function k(t,e,r){return function(n,a){for(var u=!1;n.peek();)if(u)n.next(),u=!1;else{if(n.match("{%",!1))return a.tokenize.push(c("%","%")),e;if(n.match("{{",!1))return a.tokenize.push(c("{","}")),e;if(r&&n.match("#{",!1))return a.tokenize.push(m("#{","}","meta")),e;var l=n.next();if(l==t)return a.tokenize.pop(),e;u=r&&l=="\\"}return e}}function D(t,e){return function(r,n){if(r.sol()&&(r.eatSpace(),r.match(t)))return n.tokenize.pop(),"string";for(var a=!1;r.peek();)if(a)r.next(),a=!1;else{if(r.match("{%",!1))return n.tokenize.push(c("%","%")),"string";if(r.match("{{",!1))return n.tokenize.push(c("{","}")),"string";if(e&&r.match("#{",!1))return n.tokenize.push(m("#{","}","meta")),"string";a=e&&r.next()=="\\"}return"string"}}const L={name:"crystal",startState:function(){return{tokenize:[z],currentIndent:0,lastToken:null,lastStyle:null,blocks:[]}},token:function(t,e){var r=e.tokenize[e.tokenize.length-1](t,e),n=t.current();return r&&r!="comment"&&(e.lastToken=n,e.lastStyle=r),r},indent:function(t,e,r){return e=e.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g,""),Z.test(e)||N.test(e)?r.unit*(t.currentIndent-1):r.unit*t.currentIndent},languageData:{indentOnInput:s(y.concat(x),!0),commentTokens:{line:"#"}}};export{L as crystal};