Skip to content

Commit

Permalink
(parser) Adds SHEBANG mode
Browse files Browse the repository at this point in the history
  • Loading branch information
joshgoebel committed Apr 29, 2020
1 parent b984c7b commit a23f19e
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 27 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -2,6 +2,7 @@

Parser Engine:

- (parser) Adds SHEBANG utility mode [Josh Goebel][]
- (enh) Added `on:begin` callback for modes (#2261) [Josh Goebel][]
- (enh) Added `on:end` callback for modes (#2261) [Josh Goebel][]
- (enh) Added ability to programatically ignore begin and end matches (#2261) [Josh Goebel][]
Expand Down
21 changes: 16 additions & 5 deletions src/languages/bash.js
Expand Up @@ -55,11 +55,21 @@ export default function(hljs) {
VAR
]
};
const SHEBANG = {
className: 'meta',
begin: /^#![^\n]+sh\s*$/,
const SH_LIKE_SHELLS = [
"fish",
"bash",
"zsh",
"sh",
"csh",
"ksh",
"tcsh",
"dash",
"scsh",
];
const KNOWN_SHEBANG = hljs.SHEBANG({
binary: `(${SH_LIKE_SHELLS.join("|")})`,
relevance: 10
};
});
const FUNCTION = {
className: 'function',
begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
Expand Down Expand Up @@ -98,7 +108,8 @@ export default function(hljs) {
'-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster
},
contains: [
SHEBANG,
KNOWN_SHEBANG, // to catch known shells and boost relevancy
hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang
FUNCTION,
ARITHMETIC,
hljs.HASH_COMMENT_MODE,
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 = {}) => {
const beginShebang = /^#![ ]*\//;
if (opts.binary) {
opts.begin = regex.concat(
beginShebang,
/.*\b/,
opts.binary,
/\b.*/);
}
return inherit({
className: 'meta',
begin: beginShebang,
end: /$/,
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 a23f19e

Please sign in to comment.