{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/components/widgets/lively-code-mirror-modes.js"],"names":["Preferences","Morph","toTitleCase","comparePos","a","b","line","ch","Mode","constructor","cmm","data","enter","exit","CommandMode","InsertMode","CaseMode","PsychMode","KillMode","GenerateMode","LivelyMode","SelectMode","CodeMirrorModes","lcm","cm","stack","inputModes","defaultMode","commandModeAsDefault","get","type","getMode","length","last","withASTCapabilities","callback","Promise","resolve","astCapabilities","then","ac","handleKeyEvent","evt","circumventMode","completion","state","completionActive","key","digit","split","find","ea","cancelDefaultEvent","pick","parseInt","shiftKey","execCommand","noModifier","altKey","ctrlKey","popMode","preventDefault","codemirrorIgnore","f24","killF24SpecificState","innerOuter","outer","selections","listSelections","map","anchor","head","findSmartAroundSelection","setSelections","forEach","underlineText","includes","getCursor","lineContent","getLine","match","endOfCondition","index","singlePlainCursor","somethingSelected","condition","insertions","push","insertion","end","endsWith","replaceSelection","altRight","getSelections","replaceSelections","ctrlRight","insertArrowFunction","chars","i","pos","reverse","anchorLine","headLine","startLine","endLine","start","content","getRange","replaceRange","repeat","pushMode","æ","unifiedKeyDescription","alt","ctrl","shift","shiftRight","transformCase","transformer","word","findWordAt","addSelection","multi","operations","z","Enter","Space","m","c","text","camelCase","C","capitalize","k","kebabCase","l","lowerFirst","L","toLower","lowerCase","s","snakeCase","S","startCase","u","upperFirst","U","toUpper","upperCase","t","operation","lively","notify","command","inclusive","e","inlineLocalVariable","generateIf","v","extractExpressionIntoLocalVariable","test","newlineAndIndent","ensureMode","n","livelyNotify","lively4url","cursor","setCursor","j","o","dispatchMode","renderModeStack","pop","modeMap","Map","set","mode","warn","modeContainer","prototype","getSubmorph","innerHTML","append","self","__CodeMirrorModes__"],"mappings":";;;;;;;;;;;;;AACOA,iB;;AACAC,W;;AAGAC,iB;;;;;;;;;;;AAEEC,qD;;;;;;;;;;;;;AANFH,sD;;;;;;;;;;;;;AACAC,gD;;;;;;;;;;;;;AAGAC,sD;;;;;;;;;AAEP,eAASC,UAAT,CAAoBC,CAApB,EAAuBC,CAAvB,EAA0B;AACxB,eAAOD,EAAEE,IAAF,GAASD,EAAEC,IAAX,IAAmBF,EAAEG,EAAF,GAAOF,EAAEE,EAAnC;AACD;;AAED,YAAMC,IAAN,CAAW;AACTC,oBAAYC,GAAZ,EAAiBC,IAAjB,EAAuB;AACrB,eAAKD,GAAL,GAAWA,GAAX;AACA,eAAKC,IAAL,GAAYA,IAAZ;AACD;AACDC,gBAAQ,CAAE;AACVC,eAAO,CAAE;AANA;;;;;;;;AAALL,+C;;;;;;;AASN,YAAMM,WAAN,SAA0BN,IAA1B,CAA+B;;AAE/B;;;;;;;AAFMM,sD;;;;;;;AAGN,YAAMC,UAAN,SAAyBP,IAAzB,CAA8B;;AAE9B;;;;;;;AAFMO,qD;;;;;;;AAGN,YAAMC,QAAN,SAAuBR,IAAvB,CAA4B;;;;;;;AAAtBQ,mD;;;;;;;AACN,YAAMC,SAAN,SAAwBT,IAAxB,CAA6B;;;;;;;AAAvBS,oD;;;;;;;AACN,YAAMC,QAAN,SAAuBV,IAAvB,CAA4B;;;;;;;AAAtBU,mD;;;;;;;AACN,YAAMC,YAAN,SAA2BX,IAA3B,CAAgC;;;;;;;AAA1BW,uD;;;;;;;AACN,YAAMC,UAAN,SAAyBZ,IAAzB,CAA8B;;;;;;;AAAxBY,qD;;;;;;;AACN,YAAMC,UAAN,SAAyBb,IAAzB,CAA8B;;;;;;;;AAAxBa,qD;;;;;;;AAEN,YAAMC,eAAN,CAAsB;;AAEpBb,oBAAYc,GAAZ,EAAiBC,EAAjB,EAAqB;AACnB,eAAKD,GAAL,GAAWA,GAAX;AACA,eAAKC,EAAL,GAAUA,EAAV;AACD;;AAED,YAAIC,KAAJ,GAAY;AACV,cAAI,CAAC,KAAKF,GAAL,CAASG,UAAd,EAA0B;AACxB,iBAAKH,GAAL,CAASG,UAAT,GAAsB,EAAtB;AACD;AACD,iBAAO,KAAKH,GAAL,CAASG,UAAhB;AACD;;AAED,YAAIC,WAAJ,GAAkB;AAChB,gBAAMC,uBAAuB5B,YAAY6B,GAAZ,CAAgB,sBAAhB,CAA7B;AACA,iBAAO;AACLC,kBAAMF,uBAAuB,SAAvB,GAAmC,QADpC;AAELjB,kBAAM;AAFD,WAAP;AAID;;AAEDoB,kBAAU;AACR,iBAAO,KAAKN,KAAL,CAAWO,MAAX,GAAoB,CAApB,GAAwB,KAAKP,KAAL,CAAWQ,IAAnC,GAA0C,KAAKN,WAAtD;AACD;;AAEDO,4BAAoBC,QAApB,EAA8B;AAC5BC,kBAAQC,OAAR,CAAgB,KAAKd,GAAL,CAASe,eAAzB,EAA0CC,IAA1C,CAA+CJ,QAA/C;AACD;;AAED,YAAIK,EAAJ,GAAS;AACP,iBAAO,KAAKjB,GAAL,CAASe,eAAhB;AACD;;AAEDG,uBAAeC,GAAf,EAAoB;AAClB;AACA,gBAAMC,iBAAiB3C,YAAY6B,GAAZ,CAAgB,2BAAhB,CAAvB;AACA,cAAIc,cAAJ,EAAoB;AAClB;AACD;;AAED,gBAAMC,aAAa,KAAKpB,EAAL,CAAQqB,KAAR,CAAcC,gBAAjC;AACA,cAAIF,UAAJ,EAAgB;AACd,gBAAIF,IAAIK,GAAJ,KAAY,QAAhB,EAA0B;AACxB;AACA;AACD;;AAED,kBAAMC,QAAQ,aAAaC,KAAb,CAAmB,EAAnB,EAAuBC,IAAvB,CAA4BC,MAAMA,OAAOT,IAAIK,GAA7C,CAAd;AACA,gBAAIC,KAAJ,EAAW;AACTI;AACAR,yBAAWS,IAAX,CAAgBT,WAAWjC,IAA3B,EAAiC2C,SAASN,KAAT,CAAjC;AACD;AACF;;AAED;AACA,cAAIN,IAAIK,GAAJ,KAAY,QAAZ,IAAwBL,IAAIa,QAAhC,EAA0C;AACxCH;AACA,iBAAK5B,EAAL,CAAQgC,WAAR,CAAoB,iBAApB;AACA;AACD;;AAED,gBAAM,EAAE1B,IAAF,EAAQnB,IAAR,KAAiB,KAAKoB,OAAL,EAAvB;;AAEA;AACA,gBAAM0B,aAAa,CAACf,IAAIgB,MAAL,IAAe,CAAChB,IAAIiB,OAApB,IAA+B,CAACjB,IAAIa,QAAvD;AACA,cAAIb,IAAIK,GAAJ,KAAY,QAAZ,IAAwBU,UAA5B,EAAwC;AACtCL;AACA,gBAAI,KAAK3B,KAAL,CAAWO,MAAX,KAAsB,CAAtB,IAA2BF,SAAS,QAAxC,EAAkD;AAChD,mBAAKN,EAAL,CAAQgC,WAAR,CAAoB,iBAApB;AACD,aAFD,MAEO;AACL,mBAAKI,OAAL;AACD;AACD;AACD;;AAED,cAAIlB,IAAIK,GAAJ,KAAY,KAAhB,EAAuB;AACrBK;AACA,iBAAK5B,EAAL,CAAQgC,WAAR,CAAoBd,IAAIiB,OAAJ,GAAc,YAAd,GAA6BjB,IAAIa,QAAJ,GAAe,YAAf,GAA8B,YAA/E;AACA;AACD;;AAED,mBAASH,kBAAT,GAA8B;AAC5BV,gBAAImB,cAAJ;AACAnB,gBAAIoB,gBAAJ,GAAuB,IAAvB;AACD;;AAED,cAAIpB,IAAIqB,GAAR,EAAa;AACX,kBAAMC,uBAAuB,MAAM;AACjC,qBAAO,KAAKxC,EAAL,CAAQyC,UAAf;AACD,aAFD;;AAIA,gBAAIvB,IAAIK,GAAJ,KAAY,GAAhB,EAAqB;AACnB,mBAAKvB,EAAL,CAAQyC,UAAR,GAAqB,OAArB;AACAb;AACA;AACD;AACD,gBAAIV,IAAIK,GAAJ,KAAY,GAAhB,EAAqB;AACnB,mBAAKvB,EAAL,CAAQyC,UAAR,GAAqB,OAArB;AACAb;AACA;AACD;AACD,gBAAIV,IAAIK,GAAJ,KAAY,GAAhB,EAAqB;AACnB,oBAAMmB,QAAQ,KAAK1C,EAAL,CAAQyC,UAAR,KAAuB,OAArC;AACA,oBAAME,aAAa,KAAK3C,EAAL,CAAQ4C,cAAR,GAAyBC,GAAzB,CAA6B,CAAC,EAAEC,MAAF,EAAUC,IAAV,EAAD,KAAsB;AACpE,uBAAO,KAAK/B,EAAL,CAAQgC,wBAAR,CAAiC,KAAKhD,EAAtC,EAA0C8C,MAA1C,EAAkDC,IAAlD,EAAwDL,KAAxD,CAAP;AACD,eAFkB,CAAnB;AAGA,mBAAK1C,EAAL,CAAQiD,aAAR,CAAsBN,UAAtB;AACAH;AACAZ;AACA;AACD;AACD,gBAAIV,IAAIK,GAAJ,KAAY,GAAhB,EAAqB;AACnB,mBAAKvB,EAAL,CAAQ4C,cAAR,GAAyBM,OAAzB,CAAiC,CAAC,EAAEJ,MAAF,EAAUC,IAAV,EAAD,KAAsB;AACrD,qBAAK/B,EAAL,CAAQmC,aAAR,CAAsB,KAAKnD,EAA3B,EAA+B8C,MAA/B,EAAuCC,IAAvC;AACD,eAFD;AAGAP;AACAZ;AACA;AACD;AACF;;AAED,cAAItB,SAAS,QAAb,EAAuB;AACrB,kBAAMN,KAAK,KAAKA,EAAhB;;AAEA;AACA,gBAAI,UAAUyB,KAAV,CAAgB,EAAhB,EAAoB2B,QAApB,CAA6BlC,IAAIK,GAAjC,CAAJ,EAA2C;AACzC,oBAAM,EAAEzC,IAAF,EAAQC,EAAR,KAAeiB,GAAGqD,SAAH,EAArB;AACA,oBAAMC,cAActD,GAAGuD,OAAH,CAAWzE,IAAX,CAApB;AACA,oBAAM0E,QAAQF,YAAYE,KAAZ,CAAkB,4BAAlB,CAAd;;AAEA,oBAAMC,iBAAiBD,SAASA,MAAME,KAAN,GAAcF,MAAM,CAAN,EAAShD,MAAvB,GAAgCgD,MAAM,CAAN,EAAShD,MAAzC,KAAoDzB,EAApF;AACA,oBAAM4E,oBAAoB,CAAC3D,GAAG4D,iBAAH,EAAD,IAA2B5D,GAAG4C,cAAH,GAAoBpC,MAApB,KAA+B,CAApF;AACA,kBAAImD,qBAAqBF,cAAzB,EAAyC;AACvC,sBAAMI,YAAYL,MAAM,CAAN,CAAlB;AACA,sBAAMM,aAAa,EAAnB;AACAA,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,IAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,IAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,KAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,KAAN,EAAa,IAAb,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,OAAN,EAAe,EAAf,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,MAAN,EAAc,EAAd,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,MAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,EAAN,EAAU,OAAV,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,MAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,EAAN,EAAU,OAAV,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,IAAN,EAAY,EAAZ,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,EAAN,EAAU,IAAV,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,GAAN,EAAW,IAAX,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,EAAN,EAAU,KAAV,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,IAAN,EAAY,EAAZ,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,EAAN,EAAU,MAAV,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,IAAN,EAAY,EAAZ,CAAhB;AACAD,2BAAWC,IAAX,CAAgB,CAAC,GAAD,EAAM,EAAN,EAAU,MAAV,CAAhB;;AAEA,sBAAMC,YAAYF,WAAWpC,IAAX,CAAgB,CAAC,CAACH,GAAD,EAAM0C,GAAN,CAAD,KAAgB;AAChD,yBAAO1C,QAAQL,IAAIK,GAAZ,IAAmBsC,UAAUK,QAAV,CAAmBD,GAAnB,CAA1B;AACD,iBAFiB,CAAlB;AAGA,oBAAID,SAAJ,EAAe;AACbhE,qBAAGmE,gBAAH,CAAoBH,UAAU,CAAV,CAApB;;AAEApC;AACD;AAEF;AACF;;AAED;AACA,gBAAIV,IAAIK,GAAJ,KAAY,GAAZ,IAAmBL,IAAIkD,QAA3B,EAAqC;AACnC,oBAAMpE,KAAK,KAAKA,EAAhB;;AAEA,oBAAM2C,aAAa3C,GAAGqE,aAAH,EAAnB;AACArE,iBAAGmE,gBAAH,CAAoB,QAApB;AACAnE,iBAAGsE,iBAAH,CAAqB3B,UAArB,EAAiC,QAAjC;AACAf;AACD;;AAED;AACA,gBAAIV,IAAIK,GAAJ,KAAY,GAAZ,IAAmBL,IAAIqD,SAA3B,EAAsC;AACpC,mBAAKvD,EAAL,CAAQwD,mBAAR,CAA4B,CAA5B;;AAEA5C;AACD;;AAED;AACA,gBAAIV,IAAIK,GAAJ,KAAY,GAAZ,IAAmBL,IAAIkD,QAA3B,EAAqC;AACnC,oBAAMpE,KAAK,KAAKA,EAAhB;;AAEA,oBAAMyE,QAAQzE,GAAG4C,cAAH,GAAoBC,GAApB,CAAwB,CAAC,EAAEE,IAAF,EAAD,KAAcA,KAAKhE,EAA3C,CAAd;AACA,mBAAKiB,EAAL,CAAQgC,WAAR,CAAoB,YAApB;AACAhC,iBAAGiD,aAAH,CAAiBjD,GAAG4C,cAAH,GAAoBC,GAApB,CAAwB,CAAC,EAAEE,IAAF,EAAD,EAAW2B,CAAX,KAAiB;AACxD,sBAAMC,MAAM,EAAE7F,MAAMiE,KAAKjE,IAAb,EAAmBC,IAAI0F,MAAMC,CAAN,CAAvB,EAAZ;AACA,uBAAO,EAAE5B,QAAQ6B,GAAV,EAAe5B,MAAM4B,GAArB,EAAP;AACD,eAHgB,CAAjB;;AAKA/C;AACD;;AAED;AACA;AACA,gBAAIV,IAAIK,GAAJ,KAAY,GAAZ,IAAmBL,IAAIkD,QAA3B,EAAqC;AACnC,oBAAMpE,KAAK,KAAKA,EAAhB;;AAEAA,iBAAG4C,cAAH,GAAoBgC,OAApB,GAA8B1B,OAA9B,CAAsC,CAAC,EAAEJ,MAAF,EAAUC,IAAV,EAAD,KAAsB;AAC1D,sBAAM8B,aAAa/B,OAAOhE,IAA1B;AACA,sBAAMgG,WAAW/B,KAAKjE,IAAtB;;AAEA,sBAAMiG,YAAYF,aAAaC,QAAb,GAAwBA,QAAxB,GAAmCD,UAArD;AACA,sBAAMG,UAAUH,aAAaC,QAAb,GAAwBD,UAAxB,GAAqCC,QAArD;;AAEA,sBAAMG,QAAQ,EAAEnG,MAAMiG,SAAR,EAAmBhG,IAAI,CAAvB,EAAd;AACA,sBAAMmG,UAAUlF,GAAGmF,QAAH,CAAYF,KAAZ,EAAmB,EAAEnG,MAAMkG,UAAU,CAAlB,EAAqBjG,IAAI,CAAzB,EAAnB,CAAhB;AACAiB,mBAAGoF,YAAH,CAAgBF,OAAhB,EAAyBD,KAAzB,EAAgCA,KAAhC;AACD,eAVD;AAWArD;AACD;;AAED;AACA,gBAAIV,IAAIK,GAAJ,KAAY,GAAZ,IAAmBL,IAAIkD,QAAvB,IAAmC,CAAClD,IAAImE,MAA5C,EAAoD;AAClD,mBAAKC,QAAL,CAAc,QAAd,GAAyB1D,oBAAzB;AACD;;AAED;AACD;;AAED,cAAI2D,IAAIjF,IAAR;;AAEA,gBAAMkF,wBAAwBtE,OAAO;AACnC,kBAAMuE,MAAMvE,IAAIgB,MAAJ,GAAahB,IAAIkD,QAAJ,GAAe,IAAf,GAAsB,GAAnC,GAAyC,EAArD;AACA,kBAAMsB,OAAOxE,IAAIiB,OAAJ,GAAcjB,IAAIqD,SAAJ,GAAgB,IAAhB,GAAuB,GAArC,GAA2C,EAAxD;AACA,kBAAMoB,QAAQzE,IAAIa,QAAJ,GAAeb,IAAI0E,UAAJ,GAAiB,IAAjB,GAAwB,GAAvC,GAA6C,EAA3D;AACA,mBAAOF,OAAOC,KAAP,GAAeF,GAAf,GAAqBvE,IAAIK,GAAhC;AACD,WALD;;AAOA,cAAIjB,SAAS,MAAT,IAAmB,CAACY,IAAImE,MAA5B,EAAoC;AAClC,kBAAMQ,gBAAgBC,eAAe;AACnC;AACA,mBAAK9F,EAAL,CAAQ4C,cAAR,GAAyBM,OAAzB,CAAiC,CAAC,EAAEJ,MAAF,EAAUC,IAAV,EAAD,KAAsB;AACrD,oBAAIpE,WAAWmE,MAAX,EAAmBC,IAAnB,MAA6B,CAAjC,EAAoC;AAClC,wBAAMgD,OAAO,KAAK/F,EAAL,CAAQgG,UAAR,CAAmBlD,MAAnB,CAAb;AACA,uBAAK9C,EAAL,CAAQiG,YAAR,CAAqBF,KAAKjD,MAA1B,EAAkCiD,KAAKhD,IAAvC;AACD;AACF,eALD;;AAOA,oBAAMJ,aAAa,KAAK3C,EAAL,CAAQqE,aAAR,EAAnB;AACA,mBAAKrE,EAAL,CAAQsE,iBAAR,CAA0B3B,WAAWE,GAAX,CAAeiD,WAAf,CAA1B,EAAuD,QAAvD;;AAEA,kBAAI,CAAC3G,KAAK+G,KAAV,EAAiB;AACf,qBAAK9D,OAAL;AACD;AACF,aAfD;;AAiBA,kBAAM+D,aAAa;AACjB;AACAC,iBAAG,MAAM,KAAKpG,EAAL,CAAQgC,WAAR,CAAoB,MAApB,CAFQ;AAGjB;AACAqE,qBAAO,MAAM,KAAKjE,OAAL,EAJI;AAKjB;AACAkE,qBAAO,MAAM,KAAKlE,OAAL,EANI;AAOjB;AACAmE,iBAAG,MAAMpH,KAAK+G,KAAL,GAAa,CAAC/G,KAAK+G,KARX;AASjB;AACAM,iBAAG,MAAMX,cAAcY,QAAQA,KAAKC,SAAL,EAAtB,CAVQ;AAWjB;AACAC,iBAAG,MAAMd,cAAcY,QAAQA,KAAKG,UAAL,EAAtB,CAZQ;AAajB;AACAC,iBAAG,MAAMhB,cAAcY,QAAQA,KAAKK,SAAL,EAAtB,CAdQ;AAejB;AACAC,iBAAG,MAAMlB,cAAcY,QAAQA,KAAKO,UAAL,EAAtB,CAhBQ;AAiBjB;AACAC,iBAAG,MAAMpB,cAAcY,QAAQA,KAAKS,OAAL,EAAtB,CAlBQ;AAmBjB;AACA,oBAAM,MAAMrB,cAAcY,QAAQA,KAAKU,SAAL,EAAtB,CApBK;AAqBjB;AACAC,iBAAG,MAAMvB,cAAcY,QAAQA,KAAKY,SAAL,EAAtB,CAtBQ;AAuBjB;AACAC,iBAAG,MAAMzB,cAAcY,QAAQA,KAAKc,SAAL,EAAtB,CAxBQ;AAyBjB;AACAC,iBAAG,MAAM3B,cAAcY,QAAQA,KAAKgB,UAAL,EAAtB,CA1BQ;AA2BjB;AACAC,iBAAG,MAAM7B,cAAcY,QAAQA,KAAKkB,OAAL,EAAtB,CA5BQ;AA6BjB;AACA,oBAAM,MAAM9B,cAAcY,QAAQA,KAAKmB,SAAL,EAAtB,CA9BK;AA+BjB;AACAC,iBAAG,MAAMhC,cAAcY,QAAQ/H,YAAY+H,IAAZ,CAAtB;AAhCQ,aAAnB;;AAmCA,kBAAMqB,YAAY3B,WAAW,CAACjF,IAAIiB,OAAJ,GAAc,GAAd,GAAoB,EAArB,IAA2BjB,IAAIK,GAA1C,CAAlB;AACA,gBAAIuG,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAc9G,IAAIK,GAAlB;AACD;AACD;AACD;;AAED,cAAIjB,SAAS,QAAT,IAAqB,CAACY,IAAImE,MAA9B,EAAsC;AACpC,kBAAMQ,gBAAgBC,eAAe;AACnC;AACA,mBAAK9F,EAAL,CAAQ4C,cAAR,GAAyBM,OAAzB,CAAiC,CAAC,EAAEJ,MAAF,EAAUC,IAAV,EAAD,KAAsB;AACrD,oBAAIpE,WAAWmE,MAAX,EAAmBC,IAAnB,MAA6B,CAAjC,EAAoC;AAClC,wBAAMgD,OAAO,KAAK/F,EAAL,CAAQgG,UAAR,CAAmBlD,MAAnB,CAAb;AACA,uBAAK9C,EAAL,CAAQiG,YAAR,CAAqBF,KAAKjD,MAA1B,EAAkCiD,KAAKhD,IAAvC;AACD;AACF,eALD;;AAOA,oBAAMJ,aAAa,KAAK3C,EAAL,CAAQqE,aAAR,EAAnB;AACA,mBAAKrE,EAAL,CAAQsE,iBAAR,CAA0B3B,WAAWE,GAAX,CAAeiD,WAAf,CAA1B,EAAuD,QAAvD;;AAEA,kBAAI,CAAC3G,KAAK+G,KAAV,EAAiB;AACf,qBAAK9D,OAAL;AACD;AACF,aAfD;;AAiBA,kBAAM+D,aAAa;AACjB;AACAC,iBAAG,MAAM,KAAKpG,EAAL,CAAQgC,WAAR,CAAoB,MAApB,CAFQ;AAGjB;AACAqE,qBAAO,MAAM,KAAKjE,OAAL,EAJI;AAKjB;AACAkE,qBAAO,MAAM,KAAKlE,OAAL,EANI;AAOjB;AACAmE,iBAAG,MAAMpH,KAAK+G,KAAL,GAAa,CAAC/G,KAAK+G,KARX;AASjB;AACAM,iBAAG,MAAMX,cAAcY,QAAQA,KAAKC,SAAL,EAAtB,CAVQ;AAWjB;AACAC,iBAAG,MAAMd,cAAcY,QAAQA,KAAKG,UAAL,EAAtB,CAZQ;AAajB;AACAC,iBAAG,MAAMhB,cAAcY,QAAQA,KAAKK,SAAL,EAAtB,CAdQ;AAejB;AACAC,iBAAG,MAAMlB,cAAcY,QAAQA,KAAKO,UAAL,EAAtB,CAhBQ;AAiBjB;AACAC,iBAAG,MAAMpB,cAAcY,QAAQA,KAAKS,OAAL,EAAtB,CAlBQ;AAmBjB;AACA,oBAAM,MAAMrB,cAAcY,QAAQA,KAAKU,SAAL,EAAtB,CApBK;AAqBjB;AACAC,iBAAG,MAAMvB,cAAcY,QAAQA,KAAKY,SAAL,EAAtB,CAtBQ;AAuBjB;AACAC,iBAAG,MAAMzB,cAAcY,QAAQA,KAAKc,SAAL,EAAtB,CAxBQ;AAyBjB;AACAC,iBAAG,MAAM3B,cAAcY,QAAQA,KAAKgB,UAAL,EAAtB,CA1BQ;AA2BjB;AACAC,iBAAG,MAAM7B,cAAcY,QAAQA,KAAKkB,OAAL,EAAtB,CA5BQ;AA6BjB;AACA,oBAAM,MAAM9B,cAAcY,QAAQA,KAAKmB,SAAL,EAAtB,CA9BK;AA+BjB;AACAC,iBAAG,MAAMhC,cAAcY,QAAQ/H,YAAY+H,IAAZ,CAAtB;AAhCQ,aAAnB;;AAmCA,kBAAMqB,YAAY3B,WAAW,CAACjF,IAAIiB,OAAJ,GAAc,GAAd,GAAoB,EAArB,IAA2BjB,IAAIK,GAA1C,CAAlB;AACA,gBAAIuG,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAc9G,IAAIK,GAAlB;AACD;AACD;AACD;;AAED,cAAIjB,SAAS,OAAT,IAAoB,CAACY,IAAImE,MAA7B,EAAqC;AACnC,gBAAInE,IAAIK,GAAJ,CAAQf,MAAR,KAAmB,CAAnB,IAAwBU,IAAIK,GAAJ,KAAY,OAAxC,EAAiD;AAC/C,oBAAM,EAAE0G,OAAF,EAAWC,SAAX,KAAyB/I,IAA/B;;AAEAyC;AACA,mBAAKQ,OAAL;;AAEA,mBAAKpB,EAAL,CAAQiH,OAAR,EAAiB/G,IAAIK,GAArB,EAA0B2G,SAA1B;AACA;AACD;AACF;;AAED,cAAI5H,SAAS,SAAT,IAAsB,CAACY,IAAImE,MAA/B,EAAuC;AACrC,kBAAMG,wBAAwB2C,KAAK;AACjC,oBAAM1C,MAAM0C,EAAEjG,MAAF,GAAW,MAAX,GAAoB,EAAhC;AACA,oBAAMwD,OAAOyC,EAAEhG,OAAF,GAAY,OAAZ,GAAsB,EAAnC;AACA,oBAAMwD,QAAQwC,EAAEpG,QAAF,GAAa,QAAb,GAAwB,EAAtC;AACA,qBAAO2D,OAAOC,KAAP,GAAeF,GAAf,GAAqB0C,EAAE5G,GAA9B;AACD,aALD;;AAOA,kBAAM4E,aAAa;AACjBzB,iBAAG,MAAM;AACP,qBAAK1D,EAAL,CAAQoH,mBAAR;AACD,eAHgB;AAIjB/B,qBAAO,MAAM;AACX,qBAAKf,QAAL,CAAc,QAAd;AACD,eANgB;AAOjBuB,iBAAG,MAAM;AACP,qBAAKvB,QAAL,CAAc,MAAd;AACD,eATgB;AAUjB,yBAAW,MAAM;AACf,qBAAKtF,EAAL,CAAQgC,WAAR,CAAoB,YAApB;AACD;AAZgB,aAAnB;;AAeA,kBAAM8F,YAAY3B,WAAWX,sBAAsBtE,GAAtB,CAAX,CAAlB;AACA,gBAAI4G,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAcxC,sBAAsBtE,GAAtB,CAAd,EAA0C,CAAC,KAAKnB,GAAN,EAAW,KAAKC,EAAhB,EAAoBkB,GAApB,CAA1C;AACD;AACF;;AAED,cAAIZ,SAAS,UAAT,IAAuB,CAACY,IAAImE,MAAhC,EAAwC;AACtC,kBAAMG,wBAAwB2C,KAAK;AACjC,oBAAM1C,MAAM0C,EAAEjG,MAAF,GAAW,MAAX,GAAoB,EAAhC;AACA,oBAAMwD,OAAOyC,EAAEhG,OAAF,GAAY,OAAZ,GAAsB,EAAnC;AACA,oBAAMwD,QAAQwC,EAAEpG,QAAF,GAAa,QAAb,GAAwB,EAAtC;AACA,qBAAO2D,OAAOC,KAAP,GAAeF,GAAf,GAAqB0C,EAAE5G,GAA9B;AACD,aALD;;AAOA,kBAAM4E,aAAa;AACjB;AACAzB,iBAAG,MAAM;AACP,qBAAKtC,OAAL;AACA,qBAAKpB,EAAL,CAAQqH,UAAR,CAAmB,IAAnB;AACD,eALgB;AAMjB;AACAC,iBAAG,MAAM;AACP,qBAAKlG,OAAL;AACA,oBAAI,KAAKpC,EAAL,CAAQ4D,iBAAR,EAAJ,EAAiC;AAC/B,uBAAK5C,EAAL,CAAQuH,kCAAR;AACD,iBAFD,MAEO;AACL,wBAAMzJ,OAAO,KAAKkB,EAAL,CAAQuD,OAAR,CAAgB,KAAKvD,EAAL,CAAQqD,SAAR,GAAoBvE,IAApC,CAAb;;AAEA,sBAAI,KAAK0J,IAAL,CAAU1J,IAAV,CAAJ,EAAqB;AACnB,yBAAKkC,EAAL,CAAQyH,gBAAR,CAAyB,IAAzB;AACD;AACD,uBAAKzI,EAAL,CAAQgC,WAAR,CAAoB,YAApB;;AAEA,uBAAKhC,EAAL,CAAQmE,gBAAR,CAAyB,QAAzB;AACA,uBAAKnE,EAAL,CAAQmE,gBAAR,CAAyB,YAAzB,EAAuC,OAAvC;AACA,uBAAKnE,EAAL,CAAQmE,gBAAR,CAAyB,MAAzB,EAAiC,QAAjC;;AAEA,uBAAKuE,UAAL,CAAgB,QAAhB;AACD;AACF;AAzBgB,aAAnB;;AA4BA,kBAAMZ,YAAY3B,WAAWX,sBAAsBtE,GAAtB,CAAX,CAAlB;AACA,gBAAI4G,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAcxC,sBAAsBtE,GAAtB,CAAd,EAA0C,CAAC,KAAKnB,GAAN,EAAW,KAAKC,EAAhB,EAAoBkB,GAApB,CAA1C;AACD;AACF;;AAED,cAAIZ,SAAS,QAAT,IAAqB,CAACY,IAAImE,MAA9B,EAAsC;AACpC,kBAAMG,wBAAwB2C,KAAK;AACjC,oBAAM1C,MAAM0C,EAAEjG,MAAF,GAAW,MAAX,GAAoB,EAAhC;AACA,oBAAMwD,OAAOyC,EAAEhG,OAAF,GAAY,OAAZ,GAAsB,EAAnC;AACA,oBAAMwD,QAAQwC,EAAEpG,QAAF,GAAa,QAAb,GAAwB,EAAtC;AACA,qBAAO2D,OAAOC,KAAP,GAAeF,GAAf,GAAqB0C,EAAE5G,GAA9B;AACD,aALD;;AAOA,kBAAM4E,aAAa,EAAnB;;AAEA,kBAAM2B,YAAY3B,WAAWX,sBAAsBtE,GAAtB,CAAX,CAAlB;AACA,gBAAI4G,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAcxC,sBAAsBtE,GAAtB,CAAd,EAA0C,CAAC,KAAKnB,GAAN,EAAW,KAAKC,EAAhB,EAAoBkB,GAApB,CAA1C;AACD;AACF;;AAED,cAAIZ,SAAS,QAAT,IAAqB,CAACY,IAAImE,MAA9B,EAAsC;AACpC,kBAAMG,wBAAwB2C,KAAK;AACjC,oBAAM1C,MAAM0C,EAAEjG,MAAF,GAAW,MAAX,GAAoB,EAAhC;AACA,oBAAMwD,OAAOyC,EAAEhG,OAAF,GAAY,OAAZ,GAAsB,EAAnC;AACA,oBAAMwD,QAAQwC,EAAEpG,QAAF,GAAa,QAAb,GAAwB,EAAtC;AACA,qBAAO2D,OAAOC,KAAP,GAAeF,GAAf,GAAqB0C,EAAE5G,GAA9B;AACD,aALD;;AAOA,kBAAM4E,aAAa;AACjB;AACAwC,iBAAG,MAAM,KAAK3H,EAAL,CAAQ4H,YAAR,EAFQ;AAGjB;AACApB,iBAAG,MAAM,KAAKxG,EAAL,CAAQ6H,UAAR;AAJQ,aAAnB;;AAOA,kBAAMf,YAAY3B,WAAWX,sBAAsBtE,GAAtB,CAAX,CAAlB;AACA,gBAAI4G,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAcxC,sBAAsBtE,GAAtB,CAAd,EAA0C,CAAC,KAAKnB,GAAN,EAAW,KAAKC,EAAhB,EAAoBkB,GAApB,CAA1C;AACD;AACF;;AAED,cAAIZ,SAAS,MAAT,IAAmB,CAACY,IAAImE,MAA5B,EAAoC;AAClC,kBAAMG,wBAAwB2C,KAAK;AACjC,oBAAM1C,MAAM0C,EAAEjG,MAAF,GAAW,MAAX,GAAoB,EAAhC;AACA,oBAAMwD,OAAOyC,EAAEhG,OAAF,GAAY,OAAZ,GAAsB,EAAnC;AACA,oBAAMwD,QAAQwC,EAAEpG,QAAF,GAAa,QAAb,GAAwB,EAAtC;AACA,qBAAO2D,OAAOC,KAAP,GAAeF,GAAf,GAAqB0C,EAAE5G,GAA9B;AACD,aALD;;AAOA,kBAAM4E,aAAa;AACjBU,iBAAG,MAAM;AACP,sBAAMiC,SAAS,KAAK9I,EAAL,CAAQqD,SAAR,EAAf;AACA,qBAAKrD,EAAL,CAAQgC,WAAR,CAAoB,YAApB;AACA,qBAAKhC,EAAL,CAAQ+I,SAAR,CAAkBD,MAAlB;AACA,qBAAK1G,OAAL;AACD,eANgB;AAOjB2E,iBAAG,MAAM;AACP,qBAAK/G,EAAL,CAAQgC,WAAR,CAAoB,UAApB,EADO,CAC0B;AACjC,qBAAKI,OAAL;AACD,eAVgB;AAWjB4G,iBAAG,MAAM;AACP,qBAAKhJ,EAAL,CAAQgC,WAAR,CAAoB,aAApB;AACA,qBAAKI,OAAL;AACD,eAdgB;AAejB6G,iBAAG,MAAM;AACP,qBAAKjJ,EAAL,CAAQgC,WAAR,CAAoB,qBAApB;AACA,qBAAKI,OAAL;AACD,eAlBgB;AAmBjBoF,iBAAG,MAAM;AACP,qBAAKxH,EAAL,CAAQgC,WAAR,CAAoB,oBAApB;AACA,qBAAKI,OAAL;AACD;AAtBgB,aAAnB;;AAyBA,kBAAM0F,YAAY3B,WAAWX,sBAAsBtE,GAAtB,CAAX,CAAlB;AACA,gBAAI4G,SAAJ,EAAe;AACblG;AACAkG;AACD,aAHD,MAGO;AACLC,qBAAOC,MAAP,CAAcxC,sBAAsBtE,GAAtB,CAAd,EAA0C,CAAC,KAAKnB,GAAN,EAAW,KAAKC,EAAhB,EAAoBkB,GAApB,CAA1C;AACD;AACF;AACF;;AAEDwH,mBAAWpI,IAAX,EAAiBnB,OAAO,EAAxB,EAA4B;AAC1B,cAAI,KAAKoB,OAAL,GAAeD,IAAf,KAAwBA,IAA5B,EAAkC;AAChC;AACD;;AAED,eAAKgF,QAAL,CAAchF,IAAd,EAAoBnB,IAApB;AACD;;AAEDmG,iBAAShF,IAAT,EAAenB,OAAO,EAAtB,EAA0B;AACxB,eAAKc,KAAL,CAAW8D,IAAX,CAAgB,EAAEzD,IAAF,EAAQnB,IAAR,EAAhB;AACA,eAAK+J,YAAL,CAAkB5I,IAAlB,EAAwBnB,IAAxB,EAA8BC,KAA9B;AACA,eAAK+J,eAAL;AACD;;AAED/G,kBAAU;AACR,cAAI,KAAKnC,KAAL,CAAWO,MAAX,KAAsB,CAA1B,EAA6B;AAC3BuH,mBAAOC,MAAP,CAAc,gBAAd;AACA;AACD;AACD,gBAAM,EAAE1H,IAAF,EAAQnB,IAAR,KAAiB,KAAKc,KAAL,CAAWQ,IAAlC;AACA,eAAKyI,YAAL,CAAkB5I,IAAlB,EAAwBnB,IAAxB,EAA8BE,IAA9B;AACA,eAAKY,KAAL,CAAWmJ,GAAX;AACA,eAAKD,eAAL;AACD;;AAEDD,qBAAa5I,IAAb,EAAmBnB,IAAnB,EAAyB;AACvB,gBAAMkK,UAAU,IAAIC,GAAJ,EAAhB;AACAD,kBAAQE,GAAR,CAAY,MAAZ,EAAoB/J,QAApB;AACA6J,kBAAQE,GAAR,CAAY,OAAZ,EAAqB9J,SAArB;AACA4J,kBAAQE,GAAR,CAAY,SAAZ,EAAuBjK,WAAvB;AACA+J,kBAAQE,GAAR,CAAY,QAAZ,EAAsBhK,UAAtB;AACA8J,kBAAQE,GAAR,CAAY,MAAZ,EAAoB7J,QAApB;AACA2J,kBAAQE,GAAR,CAAY,UAAZ,EAAwB5J,YAAxB;AACA0J,kBAAQE,GAAR,CAAY,QAAZ,EAAsB3J,UAAtB;AACAyJ,kBAAQE,GAAR,CAAY,QAAZ,EAAsB1J,UAAtB;;AAEA,cAAI2J,OAAOH,QAAQhJ,GAAR,CAAYC,IAAZ,CAAX;AACA,cAAI,CAACkJ,IAAL,EAAW;AACTzB,mBAAO0B,IAAP,CAAY,uBAAuBnJ,IAAnC;AACAkJ,mBAAOxK,IAAP;AACD;AACD,iBAAO,IAAIwK,IAAJ,CAAS,IAAT,EAAerK,IAAf,CAAP;AACD;;AAEDgK,0BAAkB;AAAA;;AAChB,gBAAMO,gBAAgB,kBAAK3J,GAAL,EAAUtB,MAAMkL,SAAN,CAAgBC,WAA1B,kBAAsC,kBAAtC,CAAtB;AACAF,wBAAcG,SAAd,GAA0B,EAA1B;AACAH,wBAAcI,MAAd,CAAqB,GAAG,KAAK7J,KAAL,CAAW4C,GAAX,CAAe,CAAC,EAAEvC,IAAF,EAAD,kEAAyB,6EAAzB,+BAAwGA,IAAxG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAf,EAAoIsE,OAApI,EAAxB;AACD;AAzkBmB;;;;;;;;AAAhB9E,0D;;;;;;;AA4kBNiK,WAAKC,mBAAL,GAA2B,SAASA,mBAAT,CAA6BjK,GAA7B,EAAkCC,EAAlC,EAAsC;AAC/D,eAAO,IAAIF,eAAJ,CAAoBC,GAApB,EAAyBC,EAAzB,CAAP;AACD,OAFD","file":"lively-code-mirror-modes.js","sourcesContent":["\nimport Preferences from 'src/client/preferences.js';\nimport Morph from \"src/components/widgets/lively-morph.js\";\nimport 'src/client/modifiers-right.js';\n\nimport toTitleCase from \"src/external/title-case.js\";\n\nfunction comparePos(a, b) {\n  return a.line - b.line || a.ch - b.ch;\n}\n\nclass Mode {\n  constructor(cmm, data) {\n    this.cmm = cmm;\n    this.data = data;\n  }\n  enter() {}\n  exit() {}\n}\n\nclass CommandMode extends Mode {}\n\n// the standard editor mode\nclass InsertMode extends Mode {}\n\n// special-purpose modes\nclass CaseMode extends Mode {}\nclass PsychMode extends Mode {}\nclass KillMode extends Mode {}\nclass GenerateMode extends Mode {}\nclass LivelyMode extends Mode {}\nclass SelectMode extends Mode {}\n\nclass CodeMirrorModes {\n\n  constructor(lcm, cm) {\n    this.lcm = lcm;\n    this.cm = cm;\n  }\n\n  get stack() {\n    if (!this.lcm.inputModes) {\n      this.lcm.inputModes = [];\n    }\n    return this.lcm.inputModes;\n  }\n\n  get defaultMode() {\n    const commandModeAsDefault = Preferences.get('CommandModeAsDefault');\n    return {\n      type: commandModeAsDefault ? 'command' : 'insert',\n      data: {}\n    };\n  }\n\n  getMode() {\n    return this.stack.length > 0 ? this.stack.last : this.defaultMode;\n  }\n\n  withASTCapabilities(callback) {\n    Promise.resolve(this.lcm.astCapabilities).then(callback);\n  }\n  \n  get ac() {\n    return this.lcm.astCapabilities\n  }\n\n  handleKeyEvent(evt) {\n    // Use this option in context menu to toggle off mode-specific behavior in case you shot yourself in the foot\n    const circumventMode = Preferences.get('CircumventCodeMirrorModes');\n    if (circumventMode) {\n      return;\n    }\n\n    const completion = this.cm.state.completionActive;\n    if (completion) {\n      if (evt.key === 'Escape') {\n        // use default behavior, i.e. close the completion\n        return;\n      }\n\n      const digit = '0123456789'.split('').find(ea => ea === evt.key);\n      if (digit) {\n        cancelDefaultEvent();\n        completion.pick(completion.data, parseInt(digit));\n      }\n    }\n\n    // #KeyboardShortcut Shift-Escape clear multi-selection\n    if (evt.key === 'Escape' && evt.shiftKey) {\n      cancelDefaultEvent();\n      this.cm.execCommand('singleSelection');\n      return;\n    }\n\n    const { type, data } = this.getMode();\n\n    // leave any mode with `Escape`\n    const noModifier = !evt.altKey && !evt.ctrlKey && !evt.shiftKey;\n    if (evt.key === 'Escape' && noModifier) {\n      cancelDefaultEvent();\n      if (this.stack.length === 0 && type === 'insert') {\n        this.cm.execCommand('singleSelection');\n      } else {\n        this.popMode();\n      }\n      return;\n    }\n\n    if (evt.key === 'Tab') {\n      cancelDefaultEvent();\n      this.cm.execCommand(evt.ctrlKey ? 'indentAuto' : evt.shiftKey ? 'indentLess' : 'indentMore');\n      return;\n    }\n\n    function cancelDefaultEvent() {\n      evt.preventDefault();\n      evt.codemirrorIgnore = true;\n    }\n\n    if (evt.f24) {\n      const killF24SpecificState = () => {\n        delete this.cm.innerOuter\n      }\n\n      if (evt.key === 'o') {\n        this.cm.innerOuter = 'outer'\n        cancelDefaultEvent();\n        return;\n      }\n      if (evt.key === 'i') {\n        this.cm.innerOuter = 'inner'\n        cancelDefaultEvent();\n        return;\n      }\n      if (evt.key === 'l') {\n        const outer = this.cm.innerOuter === 'outer';\n        const selections = this.cm.listSelections().map(({ anchor, head }) => {\n          return this.ac.findSmartAroundSelection(this.cm, anchor, head, outer)\n        });\n        this.cm.setSelections(selections)\n        killF24SpecificState()\n        cancelDefaultEvent();\n        return;\n      }\n      if (evt.key === 'q') {\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          this.ac.underlineText(this.cm, anchor, head);\n        });\n        killF24SpecificState()\n        cancelDefaultEvent();\n        return;\n      }\n    }\n\n    if (type === 'insert') {\n      const cm = this.cm;\n\n      // #KeyboardShortcut = insert ' === ' at end of if condition\n      if (' =!<>&|'.split('').includes(evt.key)) {\n        const { line, ch } = cm.getCursor();\n        const lineContent = cm.getLine(line);\n        const match = lineContent.match(/(\\s*\\bif\\s*\\()(.+)\\)\\s?\\{?/);\n\n        const endOfCondition = match && match.index + match[1].length + match[2].length === ch;\n        const singlePlainCursor = !cm.somethingSelected() && cm.listSelections().length === 1;\n        if (singlePlainCursor && endOfCondition) {\n          const condition = match[2];\n          const insertions = []\n          insertions.push(['=', '<', '= '])\n          insertions.push(['=', '>', '= '])\n          insertions.push(['=', '!', '== '])\n          insertions.push(['=', ' ==', '= '])\n          insertions.push(['=', ' === ', ''])\n          insertions.push(['=', '!== ', ''])\n          insertions.push(['=', ' ', '=== '])\n          insertions.push(['=', '', ' === '])\n          insertions.push([' ', ' ', ''])\n          insertions.push(['!', ' ', '!== '])\n          insertions.push(['!', '', ' !== '])\n          insertions.push(['<', ' <', ''])\n          insertions.push(['<', ' ', '<'])\n          insertions.push(['<', '', ' <'])\n          insertions.push(['>', ' ', '> '])\n          insertions.push(['>', '', ' > '])\n          insertions.push(['&', '& ', ''])\n          insertions.push(['&', '', ' && '])\n          insertions.push(['|', '| ', ''])\n          insertions.push(['|', '', ' || '])\n\n          const insertion = insertions.find(([key, end]) => {\n            return key === evt.key && condition.endsWith(end)\n          });\n          if (insertion) {\n            cm.replaceSelection(insertion[2]);\n            \n            cancelDefaultEvent();\n          }\n\n        }\n      }\n\n      // #KeyboardShortcut AltRight-A insert arrow function with 0 arguments\n      if (evt.key === 'a' && evt.altRight) {\n        const cm = this.cm;\n\n        const selections = cm.getSelections();\n        cm.replaceSelection('() => ');\n        cm.replaceSelections(selections, 'around');\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut CtrlRight-A insert arrow function with 1 argument\n      if (evt.key === 'a' && evt.ctrlRight) {\n        this.ac.insertArrowFunction(1);\n\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut AltRight-K kill line(s)\n      if (evt.key === 'k' && evt.altRight) {\n        const cm = this.cm;\n\n        const chars = cm.listSelections().map(({ head }) => head.ch);\n        this.cm.execCommand('deleteLine');\n        cm.setSelections(cm.listSelections().map(({ head }, i) => {\n          const pos = { line: head.line, ch: chars[i] };\n          return { anchor: pos, head: pos };\n        }));\n\n        cancelDefaultEvent();\n      }\n\n      // #TODO: need to merge selections, if there are multiple on the same line\n      // #KeyboardShortcut AltRight-D duplicate line(s)\n      if (evt.key === 'd' && evt.altRight) {\n        const cm = this.cm;\n\n        cm.listSelections().reverse().forEach(({ anchor, head }) => {\n          const anchorLine = anchor.line;\n          const headLine = head.line;\n\n          const startLine = anchorLine > headLine ? headLine : anchorLine;\n          const endLine = anchorLine > headLine ? anchorLine : headLine;\n\n          const start = { line: startLine, ch: 0 };\n          const content = cm.getRange(start, { line: endLine + 1, ch: 0 });\n          cm.replaceRange(content, start, start);\n        });\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut AltRight-S enter select mode\n      if (evt.key === 's' && evt.altRight && !evt.repeat) {\n        this.pushMode('select'), cancelDefaultEvent();\n      }\n\n      return;\n    }\n\n    var æ = type;\n\n    const unifiedKeyDescription = evt => {\n      const alt = evt.altKey ? evt.altRight ? '>^' : '^' : '';\n      const ctrl = evt.ctrlKey ? evt.ctrlRight ? '>!' : '!' : '';\n      const shift = evt.shiftKey ? evt.shiftRight ? '>+' : '+' : '';\n      return ctrl + shift + alt + evt.key;\n    };\n\n    if (type === 'case' && !evt.repeat) {\n      const transformCase = transformer => {\n        // extend collapsed selections to words\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          if (comparePos(anchor, head) === 0) {\n            const word = this.cm.findWordAt(anchor);\n            this.cm.addSelection(word.anchor, word.head);\n          }\n        });\n\n        const selections = this.cm.getSelections();\n        this.cm.replaceSelections(selections.map(transformer), 'around');\n\n        if (!data.multi) {\n          this.popMode();\n        }\n      };\n\n      const operations = {\n        // #KeyboardShortcut z (case mode) undo\n        z: () => this.cm.execCommand('undo'),\n        // #KeyboardShortcut Enter (case mode) exit case mode\n        Enter: () => this.popMode(),\n        // #KeyboardShortcut Space (case mode) exit case mode\n        Space: () => this.popMode(),\n        // #KeyboardShortcut m (case mode) chain multiple case transformations\n        m: () => data.multi = !data.multi,\n        // #KeyboardShortcut c (case mode) camelCase\n        c: () => transformCase(text => text.camelCase()),\n        // #KeyboardShortcut C (case mode) Capitalize\n        C: () => transformCase(text => text.capitalize()),\n        // #KeyboardShortcut k (case mode) kebab-case\n        k: () => transformCase(text => text.kebabCase()),\n        // #KeyboardShortcut l (case mode) lOWERFIRST\n        l: () => transformCase(text => text.lowerFirst()),\n        // #KeyboardShortcut L (case mode) tolower\n        L: () => transformCase(text => text.toLower()),\n        // #KeyboardShortcut Ctrl-l (case mode) lower case\n        '^l': () => transformCase(text => text.lowerCase()),\n        // #KeyboardShortcut s (case mode) snake_case\n        s: () => transformCase(text => text.snakeCase()),\n        // #KeyboardShortcut S (case mode) Start Case\n        S: () => transformCase(text => text.startCase()),\n        // #KeyboardShortcut u (case mode) Upperfirst\n        u: () => transformCase(text => text.upperFirst()),\n        // #KeyboardShortcut U (case mode) TOUPPER\n        U: () => transformCase(text => text.toUpper()),\n        // #KeyboardShortcut Ctrl-u (case mode) UPPER CASE\n        '^u': () => transformCase(text => text.upperCase()),\n        // #KeyboardShortcut t (case mode) To Title Case\n        t: () => transformCase(text => toTitleCase(text))\n      };\n\n      const operation = operations[(evt.ctrlKey ? '^' : '') + evt.key];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(evt.key);\n      }\n      return;\n    }\n\n    if (type === 'select' && !evt.repeat) {\n      const transformCase = transformer => {\n        // extend collapsed selections to words\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          if (comparePos(anchor, head) === 0) {\n            const word = this.cm.findWordAt(anchor);\n            this.cm.addSelection(word.anchor, word.head);\n          }\n        });\n\n        const selections = this.cm.getSelections();\n        this.cm.replaceSelections(selections.map(transformer), 'around');\n\n        if (!data.multi) {\n          this.popMode();\n        }\n      };\n\n      const operations = {\n        // #KeyboardShortcut z (case mode) undo\n        z: () => this.cm.execCommand('undo'),\n        // #KeyboardShortcut Enter (case mode) exit case mode\n        Enter: () => this.popMode(),\n        // #KeyboardShortcut Space (case mode) exit case mode\n        Space: () => this.popMode(),\n        // #KeyboardShortcut m (case mode) chain multiple case transformations\n        m: () => data.multi = !data.multi,\n        // #KeyboardShortcut c (case mode) camelCase\n        c: () => transformCase(text => text.camelCase()),\n        // #KeyboardShortcut C (case mode) Capitalize\n        C: () => transformCase(text => text.capitalize()),\n        // #KeyboardShortcut k (case mode) kebab-case\n        k: () => transformCase(text => text.kebabCase()),\n        // #KeyboardShortcut l (case mode) lOWERFIRST\n        l: () => transformCase(text => text.lowerFirst()),\n        // #KeyboardShortcut L (case mode) tolower\n        L: () => transformCase(text => text.toLower()),\n        // #KeyboardShortcut Ctrl-l (case mode) lower case\n        '^l': () => transformCase(text => text.lowerCase()),\n        // #KeyboardShortcut s (case mode) snake_case\n        s: () => transformCase(text => text.snakeCase()),\n        // #KeyboardShortcut S (case mode) Start Case\n        S: () => transformCase(text => text.startCase()),\n        // #KeyboardShortcut u (case mode) Upperfirst\n        u: () => transformCase(text => text.upperFirst()),\n        // #KeyboardShortcut U (case mode) TOUPPER\n        U: () => transformCase(text => text.toUpper()),\n        // #KeyboardShortcut Ctrl-u (case mode) UPPER CASE\n        '^u': () => transformCase(text => text.upperCase()),\n        // #KeyboardShortcut t (case mode) To Title Case\n        t: () => transformCase(text => toTitleCase(text))\n      };\n\n      const operation = operations[(evt.ctrlKey ? '^' : '') + evt.key];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(evt.key);\n      }\n      return;\n    }\n\n    if (type === 'psych' && !evt.repeat) {\n      if (evt.key.length === 1 || evt.key === 'Enter') {\n        const { command, inclusive } = data;\n\n        cancelDefaultEvent();\n        this.popMode();\n\n        this.ac[command](evt.key, inclusive);\n        return;\n      }\n    }\n\n    if (type === 'command' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        i: () => {\n          this.ac.inlineLocalVariable();\n        },\n        Enter: () => {\n          this.pushMode('insert');\n        },\n        k: () => {\n          this.pushMode('kill');\n        },\n        'Shift-K': () => {\n          this.cm.execCommand('deleteLine');\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'generate' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        // #KeyboardShortcut i wrap in if-statement\n        i: () => {\n          this.popMode();\n          this.ac.generateIf('if');\n        },\n        // #KeyboardShortcut v declare variable\n        v: () => {\n          this.popMode();\n          if (this.cm.somethingSelected()) {\n            this.ac.extractExpressionIntoLocalVariable();\n          } else {\n            const line = this.cm.getLine(this.cm.getCursor().line);\n\n            if (/\\S/.test(line)) {\n              this.ac.newlineAndIndent(true);\n            }\n            this.cm.execCommand('indentAuto');\n\n            this.cm.replaceSelection('const ');\n            this.cm.replaceSelection(' = $hole$;', 'start');\n            this.cm.replaceSelection('name', 'around');\n\n            this.ensureMode('insert');\n          }\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'select' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {};\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'lively' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        // #KeyboardShortcut Alt-N wrap selection in lively notify\n        n: () => this.ac.livelyNotify(),\n        // #KeyboardShortcut Alt-U insert lively4url\n        u: () => this.ac.lively4url()\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'kill' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        k: () => {\n          const cursor = this.cm.getCursor();\n          this.cm.execCommand('deleteLine');\n          this.cm.setCursor(cursor);\n          this.popMode();\n        },\n        l: () => {\n          this.cm.execCommand('killLine'); // cursor to end of line\n          this.popMode();\n        },\n        j: () => {\n          this.cm.execCommand('delLineLeft');\n          this.popMode();\n        },\n        o: () => {\n          this.cm.execCommand('delWrappedLineRight');\n          this.popMode();\n        },\n        u: () => {\n          this.cm.execCommand('delWrappedLineLeft');\n          this.popMode();\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n  }\n\n  ensureMode(type, data = {}) {\n    if (this.getMode().type === type) {\n      return;\n    }\n\n    this.pushMode(type, data);\n  }\n\n  pushMode(type, data = {}) {\n    this.stack.push({ type, data });\n    this.dispatchMode(type, data).enter();\n    this.renderModeStack();\n  }\n\n  popMode() {\n    if (this.stack.length === 0) {\n      lively.notify('no mode to pop');\n      return;\n    }\n    const { type, data } = this.stack.last;\n    this.dispatchMode(type, data).exit();\n    this.stack.pop();\n    this.renderModeStack();\n  }\n\n  dispatchMode(type, data) {\n    const modeMap = new Map();\n    modeMap.set('case', CaseMode);\n    modeMap.set('psych', PsychMode);\n    modeMap.set('command', CommandMode);\n    modeMap.set('insert', InsertMode);\n    modeMap.set('kill', KillMode);\n    modeMap.set('generate', GenerateMode);\n    modeMap.set('lively', LivelyMode);\n    modeMap.set('select', SelectMode);\n\n    let mode = modeMap.get(type);\n    if (!mode) {\n      lively.warn('No mode found for ' + type);\n      mode = Mode;\n    }\n    return new mode(this, data);\n  }\n\n  renderModeStack() {\n    const modeContainer = this.lcm::Morph.prototype.getSubmorph('#modes-indicator');\n    modeContainer.innerHTML = '';\n    modeContainer.append(...this.stack.map(({ type }) => <div style=\"background: aliceblue; color: cornflowerblue; border-top: 0.5px solid blue;\">{type}</div>).reverse());\n  }\n}\n\nself.__CodeMirrorModes__ = function __CodeMirrorModes__(lcm, cm) {\n  return new CodeMirrorModes(lcm, cm);\n};"]}