summaryrefslogtreecommitdiffstats
path: root/public/prism/prism-pascaligo.js
blob: 337ddef8b128d9a5e922bd81a885b87414f80b34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(function (Prism) {
  // Pascaligo is a layer 2 smart contract language for the tezos blockchain

  var braces = /\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source;
  var type = /(?:\b\w+(?:<braces>)?|<braces>)/.source.replace(
    /<braces>/g,
    function () {
      return braces;
    }
  );

  var pascaligo = (Prism.languages.pascaligo = {
    comment: /\(\*[\s\S]+?\*\)|\/\/.*/,
    string: {
      pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,
      greedy: true,
    },
    'class-name': [
      {
        pattern: RegExp(
          /(\btype\s+\w+\s+is\s+)<type>/.source.replace(/<type>/g, function () {
            return type;
          }),
          'i'
        ),
        lookbehind: true,
        inside: null, // see below
      },
      {
        pattern: RegExp(
          /<type>(?=\s+is\b)/.source.replace(/<type>/g, function () {
            return type;
          }),
          'i'
        ),
        inside: null, // see below
      },
      {
        pattern: RegExp(
          /(:\s*)<type>/.source.replace(/<type>/g, function () {
            return type;
          })
        ),
        lookbehind: true,
        inside: null, // see below
      },
    ],
    keyword: {
      pattern:
        /(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,
      lookbehind: true,
    },
    boolean: {
      pattern: /(^|[^&])\b(?:False|True)\b/i,
      lookbehind: true,
    },
    builtin: {
      pattern: /(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,
      lookbehind: true,
    },
    function: /\b\w+(?=\s*\()/,
    number: [
      // Hexadecimal, octal and binary
      /%[01]+|&[0-7]+|\$[a-f\d]+/i,
      // Decimal
      /\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i,
    ],
    operator:
      /->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,
    punctuation: /\(\.|\.\)|[()\[\]:;,.{}]/,
  });

  var classNameInside = [
    'comment',
    'keyword',
    'builtin',
    'operator',
    'punctuation',
  ].reduce(function (accum, key) {
    accum[key] = pascaligo[key];
    return accum;
  }, {});

  pascaligo['class-name'].forEach(function (p) {
    p.inside = classNameInside;
  });
})(Prism);