Skip to content

Commit

Permalink
smarter shebang
Browse files Browse the repository at this point in the history
  • Loading branch information
joshgoebel committed Apr 28, 2020
1 parent 73aceb6 commit 87bd22b
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 26 deletions.
7 changes: 3 additions & 4 deletions src/languages/bash.js
Expand Up @@ -55,11 +55,10 @@ export default function(hljs) {
VAR
]
};
const SHEBANG = {
className: 'meta',
begin: /^#![^\n]+sh\s*$/,
const SHEBANG = hljs.SHEBANG({
binary: /(fish|bash|zsh|sh)/,
relevance: 10
};
});
const FUNCTION = {
className: 'function',
begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
Expand Down
7 changes: 1 addition & 6 deletions src/languages/hy.js
Expand Up @@ -45,11 +45,6 @@ export default function(hljs) {
var SYMBOL_RE = '[' + SYMBOLSTART + '][' + SYMBOLSTART + '0-9/;:]*';
var SIMPLE_NUMBER_RE = '[-+]?\\d+(\\.\\d+)?';

var SHEBANG = {
className: 'meta',
begin: '^#!', end: '$'
};

var SYMBOL = {
begin: SYMBOL_RE,
relevance: 0
Expand Down Expand Up @@ -105,6 +100,6 @@ export default function(hljs) {
name: 'Hy',
aliases: ['hylang'],
illegal: /\S/,
contains: [SHEBANG, LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER, LITERAL]
contains: [hljs.SHEBANG(), LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER, LITERAL]
}
}
8 changes: 4 additions & 4 deletions src/languages/javascript.js
Expand Up @@ -97,15 +97,15 @@ export default function(hljs) {
aliases: ['js', 'jsx', 'mjs', 'cjs'],
keywords: KEYWORDS,
contains: [
hljs.SHEBANG({
binary: "node",
relevance: 5
}),
{
className: 'meta',
relevance: 10,
begin: /^\s*['"]use (strict|asm)['"]/
},
{
className: 'meta',
begin: /^#!/, end: /$/
},
hljs.APOS_STRING_MODE,
hljs.QUOTE_STRING_MODE,
HTML_TEMPLATE,
Expand Down
6 changes: 1 addition & 5 deletions src/languages/lisp.js
Expand Up @@ -9,10 +9,6 @@ export default function(hljs) {
var LISP_IDENT_RE = '[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*';
var MEC_RE = '\\|[^]*?\\|';
var LISP_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?';
var SHEBANG = {
className: 'meta',
begin: '^#!', end: '$'
};
var LITERAL = {
className: 'literal',
begin: '\\b(t{1}|nil)\\b'
Expand Down Expand Up @@ -97,7 +93,7 @@ export default function(hljs) {
illegal: /\S/,
contains: [
NUMBER,
SHEBANG,
hljs.SHEBANG(),
LITERAL,
STRING,
COMMENT,
Expand Down
8 changes: 1 addition & 7 deletions src/languages/scheme.js
Expand Up @@ -50,12 +50,6 @@ export default function(hljs) {
'with-input-from-file with-output-to-file write write-char zero?'
};

var SHEBANG = {
className: 'meta',
begin: '^#!',
end: '$'
};

var LITERAL = {
className: 'literal',
begin: '(#t|#f|#\\\\' + SCHEME_IDENT_RE + '|#\\\\.)'
Expand Down Expand Up @@ -150,6 +144,6 @@ export default function(hljs) {
return {
name: 'Scheme',
illegal: /\S/,
contains: [SHEBANG, NUMBER, STRING, QUOTED_IDENT, QUOTED_LIST, LIST].concat(COMMENT_MODES)
contains: [hljs.SHEBANG(), NUMBER, STRING, QUOTED_IDENT, QUOTED_LIST, LIST].concat(COMMENT_MODES)
};
}
1 change: 1 addition & 0 deletions src/languages/typescript.js
Expand Up @@ -127,6 +127,7 @@ export default function(hljs) {
aliases: ['ts'],
keywords: KEYWORDS,
contains: [
hljs.SHEBANG(),
{
className: 'meta',
begin: /^\s*['"]use strict['"]/
Expand Down
21 changes: 21 additions & 0 deletions src/lib/modes.js
@@ -1,4 +1,5 @@
import { inherit } from './utils';
import * as regex from './regex';

// Common regexps
export const IDENT_RE = '[a-zA-Z]\\w*';
Expand All @@ -8,6 +9,26 @@ export const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+
export const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
export const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';

export const SHEBANG = (opts = {}) => {
if (opts.binary) {
opts.begin = regex.concat(
/^#!\//,
/.*/,
opts.binary,
/\b.*/);
}
return inherit({
className: 'meta',
begin: /^#!\//,
end: /$/,
illegal: '\\n',
relevance: 0,
"on:begin": (m, resp) => {
if (m.index !== 0) resp.ignoreMatch();
}
}, opts);
};

// Common modes
export const BACKSLASH_ESCAPE = {
begin: '\\\\[\\s\\S]', relevance: 0
Expand Down
5 changes: 5 additions & 0 deletions src/lib/regex.js
Expand Up @@ -8,6 +8,11 @@ export function source(re) {
return (re && re.source) || re;
}

export function concat(...args) {
const joined = args.map((x) => source(x)).join("");
return joined;
}

export function countMatchGroups(re) {
return (new RegExp(re.toString() + '|')).exec('').length - 1;
}
Expand Down

0 comments on commit 87bd22b

Please sign in to comment.