9.0.0 • Published 1 year ago

vscode-textmate v9.0.0

Weekly downloads
115,674
License
MIT
Repository
github
Last release
1 year ago

VSCode TextMate Build Status

An interpreter for grammar files as defined by TextMate. TextMate grammars use the oniguruma dialect (https://github.com/kkos/oniguruma). Supports loading grammar files from JSON or PLIST format. This library is used in VS Code. Cross - grammar injections are currently not supported.

Installing

npm install vscode-textmate

Using

const fs = require('fs');
const path = require('path');
const vsctm = require('vscode-textmate');
const oniguruma = require('vscode-oniguruma');

/**
 * Utility to read a file as a promise
 */
function readFile(path) {
    return new Promise((resolve, reject) => {
        fs.readFile(path, (error, data) => error ? reject(error) : resolve(data));
    })
}

const wasmBin = fs.readFileSync(path.join(__dirname, './node_modules/vscode-oniguruma/release/onig.wasm')).buffer;
const vscodeOnigurumaLib = oniguruma.loadWASM(wasmBin).then(() => {
    return {
        createOnigScanner(patterns) { return new oniguruma.OnigScanner(patterns); },
        createOnigString(s) { return new oniguruma.OnigString(s); }
    };
});

// Create a registry that can create a grammar from a scope name.
const registry = new vsctm.Registry({
    onigLib: vscodeOnigurumaLib,
    loadGrammar: (scopeName) => {
        if (scopeName === 'source.js') {
            // https://github.com/textmate/javascript.tmbundle/blob/master/Syntaxes/JavaScript.plist
            return readFile('./JavaScript.plist').then(data => vsctm.parseRawGrammar(data.toString()))
        }
        console.log(`Unknown scope name: ${scopeName}`);
        return null;
    }
});

// Load the JavaScript grammar and any other grammars included by it async.
registry.loadGrammar('source.js').then(grammar => {
    const text = [
        `function sayHello(name) {`,
        `\treturn "Hello, " + name;`,
        `}`
    ];
    let ruleStack = vsctm.INITIAL;
    for (let i = 0; i < text.length; i++) {
        const line = text[i];
        const lineTokens = grammar.tokenizeLine(line, ruleStack);
        console.log(`\nTokenizing line: ${line}`);
        for (let j = 0; j < lineTokens.tokens.length; j++) {
            const token = lineTokens.tokens[j];
            console.log(` - token from ${token.startIndex} to ${token.endIndex} ` +
              `(${line.substring(token.startIndex, token.endIndex)}) ` +
              `with scopes ${token.scopes.join(', ')}`
            );
        }
        ruleStack = lineTokens.ruleStack;
    }
});

/* OUTPUT:

Unknown scope name: source.js.regexp

Tokenizing line: function sayHello(name) {
 - token from 0 to 8 (function) with scopes source.js, meta.function.js, storage.type.function.js
 - token from 8 to 9 ( ) with scopes source.js, meta.function.js
 - token from 9 to 17 (sayHello) with scopes source.js, meta.function.js, entity.name.function.js
 - token from 17 to 18 (() with scopes source.js, meta.function.js, punctuation.definition.parameters.begin.js
 - token from 18 to 22 (name) with scopes source.js, meta.function.js, variable.parameter.function.js
 - token from 22 to 23 ()) with scopes source.js, meta.function.js, punctuation.definition.parameters.end.js
 - token from 23 to 24 ( ) with scopes source.js
 - token from 24 to 25 ({) with scopes source.js, punctuation.section.scope.begin.js

Tokenizing line:        return "Hello, " + name;
 - token from 0 to 1 (  ) with scopes source.js
 - token from 1 to 7 (return) with scopes source.js, keyword.control.js
 - token from 7 to 8 ( ) with scopes source.js
 - token from 8 to 9 (") with scopes source.js, string.quoted.double.js, punctuation.definition.string.begin.js
 - token from 9 to 16 (Hello, ) with scopes source.js, string.quoted.double.js
 - token from 16 to 17 (") with scopes source.js, string.quoted.double.js, punctuation.definition.string.end.js
 - token from 17 to 18 ( ) with scopes source.js
 - token from 18 to 19 (+) with scopes source.js, keyword.operator.arithmetic.js
 - token from 19 to 20 ( ) with scopes source.js
 - token from 20 to 24 (name) with scopes source.js, support.constant.dom.js
 - token from 24 to 25 (;) with scopes source.js, punctuation.terminator.statement.js

Tokenizing line: }
 - token from 0 to 1 (}) with scopes source.js, punctuation.section.scope.end.js

*/

For grammar authors

See vscode-tmgrammar-test that can help you write unit tests against your grammar.

API doc

See the main.ts file

Developing

  • Clone the repository
  • Run npm install
  • Compile in the background with npm run watch
  • Run tests with npm test
  • Run benchmark with npm run benchmark
  • Troubleshoot a grammar with npm run inspect -- PATH_TO_GRAMMAR PATH_TO_FILE

Code of Conduct

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.

License

MIT

@theia/monaco@theia/plugin-exthard_scanyijicolorbarvscode-tmgrammar-test-helperdresser@newhorizon-tech/dd-npm-package-template@reversodev/oceanic-fleetvpc-shiki-renderer@infinitebrahmanuniverse/nolb-vsc@everything-registry/sub-chunk-3069project-wajs-dvshiki-hfcpackshiki-languages-pathsshiki-nova1751shiki-pathsshiki-relshiki-themessignilsthlreact-native-android-scoped-storagessa-formsource-code-tokenizertextmate-highlightertextmate-testertextlint-plugin-asciidoc-looseremark-vscodetest-grammarterminosauruswebvimwebvim-testgatsby-remark-vscodeexpviewermonaco-editor-with-textmatemonaco-textmate-providermonaco-theme-convertermonaco-vscode-textmate-theme-testlakefiremdxtsmarkanegithub1s-vscode-webhighmatehard_scanershiki-languagesperlnavigator-servertoolbox-vscode@github1s/vscode-web@dorfire/pkg-vscode-deps@dongjiang/textmate-grammars@intelrug/blade-formatter@gerrit0/shikiunified-vscodevscatvscode-textmate-languageservicevscode-tmgrammar-testvscode-tmlanguage-snapshottypedoc-plugin-toc-group-modtypedoc-exposed-plugincode-lightneryangtao-js@jianboy/vscode-web@photonsh/photon-core@opensumi/ide-core-browser@nora-soderlund/shiki@qodly/docs@mgtd/shiki@mgtd/shiki-themes@modix/smarty-lint@ngeenx/monaco-textmate-loader@nkduy/shiki@nkduy/syntax@nuggxyz/dotnugg-sdk@nyanator/chrome-ext-utils@lsby/textmate_grammar_parse@maccman/shiki@safely-project/safely-ts@runly/gatsby-remark-vscode@tartjs/monaco@swiizyyy/discord-akairo@swordjs/code-oss-dev@tbbjs/vscode-web@tolgee/cli@ws-ui/code-editor@wooorm/starry-night@yolodev/highlight@voloshinskii/tolgee-cli@vutex/vuepress-plugin-shiki@fangdh/typescript-esbuild-2021@vap/shiki@theia/textmate-grammars@stevebauman/shiki@wang-dong/vscode-webaprox.jsant-editor@amiruldev/wajsant-monacoblade-formatter@codeanywhere/theia-plugin-ext@codepunkt/gatsby-remark-vscode@codingame/monaco-vscode-textmate-service-override
9.0.0

1 year ago

7.0.4

1 year ago

7.0.3

2 years ago

7.0.2

2 years ago

8.0.0

1 year ago

7.0.0

2 years ago

7.0.1

2 years ago

6.0.0

2 years ago

5.5.0

2 years ago

5.4.1

3 years ago

5.4.0

3 years ago

5.3.1

3 years ago

5.3.0

3 years ago

5.2.0

4 years ago

5.1.2

4 years ago

5.1.1

4 years ago

5.1.0

4 years ago

5.0.2

4 years ago

5.0.1

4 years ago

5.0.0

4 years ago

4.4.0

4 years ago

4.3.0

5 years ago

4.2.2

5 years ago

4.2.1

5 years ago

4.2.0

5 years ago

4.1.1

5 years ago

4.1.0

5 years ago

4.0.1

6 years ago

4.0.0

6 years ago

4.0.0-next.3

6 years ago

4.0.0-next.2

6 years ago

4.0.0-next.1

6 years ago

3.3.3

6 years ago

3.3.2

6 years ago

3.3.1

6 years ago

3.3.0

6 years ago

3.2.0

6 years ago

3.1.5

7 years ago

3.1.4

7 years ago

3.1.3

7 years ago

3.1.2

7 years ago

3.1.1

7 years ago

3.1.0

7 years ago

3.0.1

7 years ago

3.0.0

7 years ago

2.3.2

7 years ago

2.3.1

7 years ago

2.3.0

8 years ago

2.2.0

8 years ago

2.1.1

8 years ago

2.1.0

8 years ago

2.0.1

8 years ago

2.0.0

8 years ago

1.2.0

8 years ago

1.1.0

8 years ago

1.0.11

8 years ago

1.0.10

8 years ago

1.0.9

8 years ago

1.0.8

8 years ago

1.0.7

8 years ago

1.0.6

8 years ago

1.0.5

8 years ago

1.0.4

8 years ago

1.0.3

8 years ago

1.0.2

8 years ago

1.0.1

9 years ago

1.0.0

9 years ago

0.0.4

9 years ago

0.0.3

9 years ago

0.0.2

9 years ago

0.0.1

9 years ago