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: 24 /\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/, 25 }); 26 27 const interpolation = { 28 pattern: /#\{[^}]+\}/, 29 inside: { 30 delimiter: { 31 pattern: /^#\{|\}$/, 32 alias: 'tag', 33 }, 34 rest: Prism.languages.ruby, 35 }, 36 }; 37 38 delete Prism.languages.ruby.function; 39 40 Prism.languages.insertBefore('ruby', 'keyword', { 41 regex: [ 42 { 43 pattern: /%r([^a-zA-Z0-9\s{([<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/, 44 greedy: true, 45 inside: { 46 interpolation, 47 }, 48 }, 49 { 50 pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, 51 greedy: true, 52 inside: { 53 interpolation, 54 }, 55 }, 56 { 57 // Here we need to specifically allow interpolation 58 pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, 59 greedy: true, 60 inside: { 61 interpolation, 62 }, 63 }, 64 { 65 pattern: /%r\[(?:[^[\]\\]|\\[\s\S])*\][gim]{0,3}/, 66 greedy: true, 67 inside: { 68 interpolation, 69 }, 70 }, 71 { 72 pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, 73 greedy: true, 74 inside: { 75 interpolation, 76 }, 77 }, 78 { 79 pattern: 80 /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, 81 lookbehind: true, 82 greedy: true, 83 }, 84 ], 85 variable: /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, 86 symbol: { 87 pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, 88 lookbehind: true, 89 }, 90 'method-definition': { 91 pattern: /(\bdef\s+)[\w.]+/, 92 lookbehind: true, 93 inside: { 94 function: /\w+$/, 95 rest: Prism.languages.ruby, 96 }, 97 }, 98 }); 99 100 Prism.languages.insertBefore('ruby', 'number', { 101 builtin: 102 /\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/, 103 constant: /\b[A-Z]\w*(?:[?!]|\b)/, 104 }); 105 106 Prism.languages.ruby.string = [ 107 { 108 pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{([<])(?:(?!\1)[^\\]|\\[\s\S])*\1/, 109 greedy: true, 110 inside: { 111 interpolation, 112 }, 113 }, 114 { 115 pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, 116 greedy: true, 117 inside: { 118 interpolation, 119 }, 120 }, 121 { 122 // Here we need to specifically allow interpolation 123 pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, 124 greedy: true, 125 inside: { 126 interpolation, 127 }, 128 }, 129 { 130 pattern: /%[qQiIwWxs]?\[(?:[^[\]\\]|\\[\s\S])*\]/, 131 greedy: true, 132 inside: { 133 interpolation, 134 }, 135 }, 136 { 137 pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, 138 greedy: true, 139 inside: { 140 interpolation, 141 }, 142 }, 143 { 144 pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, 145 greedy: true, 146 inside: { 147 interpolation, 148 }, 149 }, 150 ]; 151} 152