Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Path: blob/master/src/packages/frontend/codemirror/mode/pari.js
Views: 687
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import * as CodeMirror from "codemirror";67CodeMirror.defineMode("pari", function(config, parserConfig) {8var indentUnit = config.indentUnit,9statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,10dontAlignCalls = parserConfig.dontAlignCalls,11keywords = parserConfig.keywords || {},12builtin = parserConfig.builtin || {},13blockKeywords = parserConfig.blockKeywords || {},14atoms = parserConfig.atoms || {},15hooks = parserConfig.hooks || {},16multiLineStrings = parserConfig.multiLineStrings;17var isOperatorChar = /[+\-*&%=<>!?|\/]/;1819var curPunc;2021function tokenBase(stream, state) {22var ch = stream.next();23if (hooks[ch]) {24var result = hooks[ch](stream, state);25if (result !== false) return result;26}27if (ch == '"' || ch == "'") {28state.tokenize = tokenString(ch);29return state.tokenize(stream, state);30}31if (/[\[\]{}\(\),;\:\.]/.test(ch)) {32curPunc = ch;33return null;34}35if (/\d/.test(ch)) {36stream.eatWhile(/[\w\.]/);37return "number";38}39if (ch == "/") {40if (stream.eat("*")) {41state.tokenize = tokenComment;42return tokenComment(stream, state);43}44if (stream.eat("/")) {45stream.skipToEnd();46return "comment";47}48}49if (ch == "\\") {50if (stream.eat("\\")) {51stream.skipToEnd();52return "comment";53}54}55if (isOperatorChar.test(ch)) {56stream.eatWhile(isOperatorChar);57return "operator";58}59stream.eatWhile(/[\w\$_]/);60var cur = stream.current();61if (keywords.propertyIsEnumerable(cur)) {62if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";63return "keyword";64}65if (builtin.propertyIsEnumerable(cur)) {66if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";67return "builtin";68}69if (atoms.propertyIsEnumerable(cur)) return "atom";70return "variable";71}7273function tokenString(quote) {74return function(stream, state) {75var escaped = false, next, end = false;76while ((next = stream.next()) != null) {77if (next == quote && !escaped) {end = true; break;}78escaped = !escaped && next == "\\";79}80if (end || !(escaped || multiLineStrings))81state.tokenize = null;82return "string";83};84}8586function tokenComment(stream, state) {87var maybeEnd = false, ch;88while (ch = stream.next()) {89if (ch == "/" && maybeEnd) {90state.tokenize = null;91break;92}93maybeEnd = (ch == "*");94}95return "comment";96}9798function Context(indented, column, type, align, prev) {99this.indented = indented;100this.column = column;101this.type = type;102this.align = align;103this.prev = prev;104}105function pushContext(state, col, type) {106var indent = state.indented;107if (state.context && state.context.type == "statement")108indent = state.context.indented;109return state.context = new Context(indent, col, type, null, state.context);110}111function popContext(state) {112var t = state.context.type;113if (t == ")" || t == "]" || t == "}")114state.indented = state.context.indented;115return state.context = state.context.prev;116}117118// Interface119120return {121startState: function(basecolumn) {122return {123tokenize: null,124context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),125indented: 0,126startOfLine: true127};128},129130token: function(stream, state) {131var ctx = state.context;132if (stream.sol()) {133if (ctx.align == null) ctx.align = false;134state.indented = stream.indentation();135state.startOfLine = true;136}137if (stream.eatSpace()) return null;138curPunc = null;139var style = (state.tokenize || tokenBase)(stream, state);140if (style == "comment" || style == "meta") return style;141if (ctx.align == null) ctx.align = true;142143if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state);144else if (curPunc == "{") pushContext(state, stream.column(), "}");145else if (curPunc == "[") pushContext(state, stream.column(), "]");146else if (curPunc == "(") pushContext(state, stream.column(), ")");147else if (curPunc == "}") {148while (ctx.type == "statement") ctx = popContext(state);149if (ctx.type == "}") ctx = popContext(state);150while (ctx.type == "statement") ctx = popContext(state);151}152else if (curPunc == ctx.type) popContext(state);153else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))154pushContext(state, stream.column(), "statement");155state.startOfLine = false;156return style;157},158159indent: function(state, textAfter) {160if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;161var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);162if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;163var closing = firstChar == ctx.type;164if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);165else if (ctx.align && (!dontAlignCalls || ctx.type != ")")) return ctx.column + (closing ? 0 : 1);166else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit;167else return ctx.indented + (closing ? 0 : indentUnit);168},169170electricChars: "{}",171blockCommentStart: "/*",172blockCommentEnd: "*/",173lineComment: "\\\\",174fold: "brace"175};176});177178(function() {179function words(str) {180var obj = {}, words = str.split(" ");181for (var i = 0; i < words.length; ++i) obj[words[i]] = true;182return obj;183}184var cKeywords = "Col Euler I List Mat Mod O Pi Pol Polrev Qfb Ser Set Str Strchr Strexpand Strprintf Strtex Vec Vecrev Vecsmall abs acos acosh addhelp addprimes agm alarm algdep alias allocatemem apply arg asin asinh atan atanh bernfrac bernreal bernvec besselh1 besselh2 besseli besselj besseljh besselk besseln bestappr bezout bezoutres bigomega binary binomial bitand bitneg bitnegimply bitor bittest bitxor bnfcertify bnfcompress bnfdecodemodule bnfinit bnfisintnorm bnfisnorm bnfisprincipal bnfissunit bnfisunit bnfnarrow bnfsignunit bnfsunit bnrL1 bnrclassno bnrclassnolist bnrconductor bnrconductorofchar bnrdisc bnrdisclist bnrinit bnrisconductor bnrisprincipal bnrrootnumber bnrstark break ceil centerlift charpoly chinese component concat conj conjvec content contfrac contfracpnqn core coredisc cos cosh cotan default denominator deriv derivnum diffop dilog dirdiv direuler dirmul dirzetak divisors divrem eint1 ellL1 elladd ellak ellan ellanalyticrank ellap ellbil ellchangecurve ellchangepoint ellconvertname elldivpol elleisnum elleta ellgenerators ellglobalred ellgroup ellheight ellheightmatrix ellidentify ellinit ellisoncurve ellj elllocalred elllog elllseries ellminimalmodel ellmodulareqn ellorder ellordinate ellpointtoz ellpow ellrootno ellsearch ellsigma ellsub elltaniyama elltatepairing elltors ellweilpairing ellwp ellzeta ellztopoint erfc error eta eulerphi eval exp extern externstr factor factorback factorcantor factorff factorial factorint factormod factornf factorpadic ffgen ffinit fflog fforder ffprimroot fibonacci floor for fordiv forell forprime forstep forsubgroup forvec frac galoisexport galoisfixedfield galoisgetpol galoisidentify galoisinit galoisisabelian galoisisnormal galoispermtopol galoissubcyclo galoissubfields galoissubgroups gamma gammah gcd getheap getrand getstack gettime global hilbert hyperu idealadd idealaddtoone idealappr idealchinese idealcoprime idealdiv idealfactor idealfactorback idealfrobenius idealhnf idealintersect idealinv ideallist ideallistarch ideallog idealmin idealmul idealnorm idealpow idealprimedec idealramgroups idealred idealstar idealtwoelt idealval if imag incgam incgamc input install intcirc intformal intfouriercos intfourierexp intfouriersin intfuncinit intlaplaceinv intmellininv intmellininvshort intnum intnuminit intnuminitgen intnumromb intnumstep isfundamental ispower isprime ispseudoprime issquare issquarefree kill kronecker lcm length lex lift lindep listcreate listinsert listkill listpop listput listsort lngamma local log matadjoint matalgtobasis matbasistoalg matcompanion matdet matdetint matdiagonal mateigen matfrobenius mathess mathilbert mathnf mathnfmod mathnfmodid matid matimage matimagecompl matindexrank matintersect matinverseimage matisdiagonal matker matkerint matmuldiagonal matmultodiagonal matpascal matrank matrix matrixqz matsize matsnf matsolve matsolvemod matsupplement mattranspose max min minpoly modreverse moebius my newtonpoly next nextprime nfalgtobasis nfbasis nfbasistoalg nfdetint nfdisc nfeltadd nfeltdiv nfeltdiveuc nfeltdivmodpr nfeltdivrem nfeltmod nfeltmul nfeltmulmodpr nfeltnorm nfeltpow nfeltpowmodpr nfeltreduce nfeltreducemodpr nfelttrace nfeltval nffactor nffactorback nffactormod nfgaloisapply nfgaloisconj nfhilbert nfhnf nfhnfmod nfinit nfisideal nfisincl nfisisom nfkermodpr nfmodprinit nfnewprec nfroots nfrootsof1 nfsnf nfsolvemodpr nfsubfields norm norml2 numbpart numdiv numerator numtoperm omega padicappr padicfields padicprec partitions permtonum plot plotbox plotclip plotcolor plotcopy plotcursor plotdraw ploth plothraw plothsizes plotinit plotkill plotlines plotlinetype plotmove plotpoints plotpointsize plotpointtype plotrbox plotrecth plotrecthraw plotrline plotrmove plotrpoint plotscale plotstring polchebyshev polcoeff polcompositum polcyclo poldegree poldisc poldiscreduced polgalois polhensellift polhermite polinterpolate polisirreducible pollead pollegendre polrecip polred polredabs polredbest polredord polresultant polroots polrootsff polrootsmod polrootspadic polsturm polsubcyclo polsylvestermatrix polsym poltchebi poltschirnhaus polylog polzagier precision precprime prime primepi primes print print1 printf printtex prod prodeuler prodinf psdraw psi psploth psplothraw qfbclassno qfbcompraw qfbhclassno qfbnucomp qfbnupow qfbpowraw qfbprimeform qfbred qfbsolve qfgaussred qfjacobi qflll qflllgram qfminim qfperfection qfrep qfsign quadclassunit quaddisc quadgen quadhilbert quadpoly quadray quadregulator quadunit quit random read readvec real removeprimes return rnfalgtobasis rnfbasis rnfbasistoalg rnfcharpoly rnfconductor rnfdedekind rnfdet rnfdisc rnfeltabstorel rnfeltdown rnfeltreltoabs rnfeltup rnfequation rnfhnfbasis rnfidealabstorel rnfidealdown rnfidealhnf rnfidealmul rnfidealnormabs rnfidealnormrel rnfidealreltoabs rnfidealtwoelt rnfidealup rnfinit rnfisabelian rnfisfree rnfisnorm rnfisnorminit rnfkummer rnflllgram rnfnormgroup rnfpolred rnfpolredabs rnfpseudobasis rnfsteinitz round select serconvol serlaplace serreverse setintersect setisset setminus setrand setsearch setunion shift shiftmul sigma sign simplify sin sinh sizebyte sizedigit solve sqr sqrt sqrtint sqrtn stirling subgrouplist subst substpol substvec sum sumalt sumdedekind sumdiv suminf sumnum sumnumalt sumnuminit sumpos system tan tanh taylor teichmuller theta thetanullk thue thueinit trace trap truncate type until valuation variable vecextract vecmax vecmin vecsort vector vectorsmall vectorv version warning weber whatnow while write write1 writebin writetex zeta zetak zetakinit zncoppersmith znlog znorder znprimroot znstar";185186function cppHook(stream, state) {187if (!state.startOfLine) return false;188for (;;) {189if (stream.skipTo("\\")) {190stream.next();191if (stream.eol()) {192state.tokenize = cppHook;193break;194}195} else {196stream.skipToEnd();197state.tokenize = null;198break;199}200}201return "meta";202}203204// C#-style strings where "" escapes a quote.205function tokenAtString(stream, state) {206var next;207while ((next = stream.next()) != null) {208if (next == '"' && !stream.eat('"')) {209state.tokenize = null;210break;211}212}213return "string";214}215216function mimes(ms, mode) {217for (var i = 0; i < ms.length; ++i) CodeMirror.defineMIME(ms[i], mode);218}219220mimes(["text/pari"], {221name: "pari",222keywords: words(cKeywords),223blockKeywords: words("catch class do else finally for if struct switch try while"),224atoms: words("true false null"),225hooks: {"#": cppHook}226});227}());228229230