1/** 2 * Original by Samuel Flores 3 * 4 * Adds the following new token classes: 5 * constant, builtin, variable, symbol, regex 6 */ 7export function installRuby(Prism: any) { 8 Prism.languages.ruby = Prism.languages.extend('clike', { 9 comment: [ 10 /#.*/, 11 { 12 pattern: /^=begin\s[\s\S]*?^=end/m, 13 greedy: true, 14 }, 15 ], 16 'class-name': { 17 pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, 18 lookbehind: true, 19 inside: { 20 punctuation: /[.\\]/, 21 }, 22 }, 23 keyword: /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/, 24 }); 25 26 var interpolation = { 27 pattern: /#\{[^}]+\}/, 28 inside: { 29 delimiter: { 30 pattern: /^#\{|\}$/, 31 alias: 'tag', 32 }, 33 rest: Prism.languages.ruby, 34 }, 35 }; 36 37 delete Prism.languages.ruby.function; 38 39 Prism.languages.insertBefore('ruby', 'keyword', { 40 regex: [ 41 { 42 pattern: /%r([^a-zA-Z0-9\s{([<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/, 43 greedy: true, 44 inside: { 45 interpolation, 46 }, 47 }, 48 { 49 pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, 50 greedy: true, 51 inside: { 52 interpolation, 53 }, 54 }, 55 { 56 // Here we need to specifically allow interpolation 57 pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, 58 greedy: true, 59 inside: { 60 interpolation, 61 }, 62 }, 63 { 64 pattern: /%r\[(?:[^[\]\\]|\\[\s\S])*\][gim]{0,3}/, 65 greedy: true, 66 inside: { 67 interpolation, 68 }, 69 }, 70 { 71 pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, 72 greedy: true, 73 inside: { 74 interpolation, 75 }, 76 }, 77 { 78 pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, 79 lookbehind: true, 80 greedy: true, 81 }, 82 ], 83 variable: /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, 84 symbol: { 85 pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, 86 lookbehind: true, 87 }, 88 'method-definition': { 89 pattern: /(\bdef\s+)[\w.]+/, 90 lookbehind: true, 91 inside: { 92 function: /\w+$/, 93 rest: Prism.languages.ruby, 94 }, 95 }, 96 }); 97 98 Prism.languages.insertBefore('ruby', 'number', { 99 builtin: /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, 100 constant: /\b[A-Z]\w*(?:[?!]|\b)/, 101 }); 102 103 Prism.languages.ruby.string = [ 104 { 105 pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{([<])(?:(?!\1)[^\\]|\\[\s\S])*\1/, 106 greedy: true, 107 inside: { 108 interpolation, 109 }, 110 }, 111 { 112 pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, 113 greedy: true, 114 inside: { 115 interpolation, 116 }, 117 }, 118 { 119 // Here we need to specifically allow interpolation 120 pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, 121 greedy: true, 122 inside: { 123 interpolation, 124 }, 125 }, 126 { 127 pattern: /%[qQiIwWxs]?\[(?:[^[\]\\]|\\[\s\S])*\]/, 128 greedy: true, 129 inside: { 130 interpolation, 131 }, 132 }, 133 { 134 pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, 135 greedy: true, 136 inside: { 137 interpolation, 138 }, 139 }, 140 { 141 pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, 142 greedy: true, 143 inside: { 144 interpolation, 145 }, 146 }, 147 ]; 148} 149