aboutsummaryrefslogtreecommitdiffstats
path: root/public/prism/prism-turtle.js
blob: 50493a0de80f95e717a3d4709501cb157323b9d8 (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
Prism.languages.turtle = {
  comment: {
    pattern: /#.*/,
    greedy: true,
  },
  'multiline-string': {
    pattern:
      /"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,
    greedy: true,
    alias: 'string',
    inside: {
      comment: /#.*/,
    },
  },
  string: {
    pattern: /"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,
    greedy: true,
  },
  url: {
    pattern:
      /<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,
    greedy: true,
    inside: {
      punctuation: /[<>]/,
    },
  },
  function: {
    pattern:
      /(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,
    inside: {
      'local-name': {
        pattern: /([^:]*:)[\s\S]+/,
        lookbehind: true,
      },
      prefix: {
        pattern: /[\s\S]+/,
        inside: {
          punctuation: /:/,
        },
      },
    },
  },
  number: /[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
  punctuation: /[{}.,;()[\]]|\^\^/,
  boolean: /\b(?:false|true)\b/,
  keyword: [/(?:\ba|@prefix|@base)\b|=/, /\b(?:base|graph|prefix)\b/i],
  tag: {
    pattern: /@[a-z]+(?:-[a-z\d]+)*/i,
    inside: {
      punctuation: /@/,
    },
  },
};
Prism.languages.trig = Prism.languages['turtle'];
span class="p">() { return braces; }) .replace(/<SPREAD>/g, function () { return spread; }); return RegExp(source, flags); } spread = re(spread).source; Prism.languages.jsx = Prism.languages.extend('markup', javascript); Prism.languages.jsx.tag.pattern = re( /<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/ .source ); Prism.languages.jsx.tag.inside['tag'].pattern = /^<\/?[^\s>\/]*/; Prism.languages.jsx.tag.inside['attr-value'].pattern = /=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/; Prism.languages.jsx.tag.inside['tag'].inside['class-name'] = /^[A-Z]\w*(?:\.[A-Z]\w*)*$/; Prism.languages.jsx.tag.inside['comment'] = javascript['comment']; Prism.languages.insertBefore( 'inside', 'attr-name', { spread: { pattern: re(/<SPREAD>/.source), inside: Prism.languages.jsx, }, }, Prism.languages.jsx.tag ); Prism.languages.insertBefore( 'inside', 'special-attr', { script: { // Allow for two levels of nesting pattern: re(/=<BRACES>/.source), alias: 'language-javascript', inside: { 'script-punctuation': { pattern: /^=(?=\{)/, alias: 'punctuation', }, rest: Prism.languages.jsx, }, }, }, Prism.languages.jsx.tag ); // The following will handle plain text inside tags var stringifyToken = function (token) { if (!token) { return ''; } if (typeof token === 'string') { return token; } if (typeof token.content === 'string') { return token.content; } return token.content.map(stringifyToken).join(''); }; var walkTokens = function (tokens) { var openedTags = []; for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var notTagNorBrace = false; if (typeof token !== 'string') { if ( token.type === 'tag' && token.content[0] && token.content[0].type === 'tag' ) { // We found a tag, now find its kind if (token.content[0].content[0].content === '</') { // Closing tag if ( openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1]) ) { // Pop matching opening tag openedTags.pop(); } } else { if (token.content[token.content.length - 1].content === '/>') { // Autoclosed tag, ignore } else { // Opening tag openedTags.push({ tagName: stringifyToken(token.content[0].content[1]), openedBraces: 0, }); } } } else if ( openedTags.length > 0 && token.type === 'punctuation' && token.content === '{' ) { // Here we might have entered a JSX context inside a tag openedTags[openedTags.length - 1].openedBraces++; } else if ( openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === 'punctuation' && token.content === '}' ) { // Here we might have left a JSX context inside a tag openedTags[openedTags.length - 1].openedBraces--; } else { notTagNorBrace = true; } } if (notTagNorBrace || typeof token === 'string') { if ( openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0 ) { // Here we are inside a tag, and not inside a JSX context. // That's plain text: drop any tokens matched. var plainText = stringifyToken(token); // And merge text with adjacent text if ( i < tokens.length - 1 && (typeof tokens[i + 1] === 'string' || tokens[i + 1].type === 'plain-text') ) { plainText += stringifyToken(tokens[i + 1]); tokens.splice(i + 1, 1); } if ( i > 0 && (typeof tokens[i - 1] === 'string' || tokens[i - 1].type === 'plain-text') ) { plainText = stringifyToken(tokens[i - 1]) + plainText; tokens.splice(i - 1, 1); i--; } tokens[i] = new Prism.Token('plain-text', plainText, null, plainText); } } if (token.content && typeof token.content !== 'string') { walkTokens(token.content); } } }; Prism.hooks.add('after-tokenize', function (env) { if (env.language !== 'jsx' && env.language !== 'tsx') { return; } walkTokens(env.tokens); }); })(Prism);