diff options
author | bscan <10503608+bscan@users.noreply.github.com> | 2023-01-15 17:09:29 -0500 |
---|---|---|
committer | bscan <10503608+bscan@users.noreply.github.com> | 2023-01-15 17:09:29 -0500 |
commit | 2c17a5096fa5c9310ffea8d478e30c7175b0b125 (patch) | |
tree | c82c5eacfc4d6213eca7bc49b75263c047c34d94 /browser-ext | |
parent | d8b9250e26f5e86037d401de523478353413564d (diff) | |
download | PerlNavigator-2c17a5096fa5c9310ffea8d478e30c7175b0b125.zip |
First version of Web Extension. Currently only offers syntax highlighting.
Diffstat (limited to 'browser-ext')
-rw-r--r-- | browser-ext/package-lock.json | 92 | ||||
-rw-r--r-- | browser-ext/package.json | 19 | ||||
-rw-r--r-- | browser-ext/src/browserServerMain.ts | 111 | ||||
-rw-r--r-- | browser-ext/tsconfig.json | 12 |
4 files changed, 234 insertions, 0 deletions
diff --git a/browser-ext/package-lock.json b/browser-ext/package-lock.json new file mode 100644 index 0000000..878a5e1 --- /dev/null +++ b/browser-ext/package-lock.json @@ -0,0 +1,92 @@ +{ + "name": "perl-navigator-web-server", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "perl-navigator-web-server", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + } + }, + "dependencies": { + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" + }, + "vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "requires": { + "vscode-languageserver-protocol": "3.16.0" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + } + } +} diff --git a/browser-ext/package.json b/browser-ext/package.json new file mode 100644 index 0000000..7091a32 --- /dev/null +++ b/browser-ext/package.json @@ -0,0 +1,19 @@ +{ + "name": "perl-navigator-web-server", + "description": "Example implementation of a language server in a web extension.", + "version": "1.0.0", + "author": "Microsoft Corporation", + "license": "MIT", + "engines": { + "node": "*" + }, + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/vscode-extension-samples" + }, + "dependencies": { + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1" + }, + "scripts": {} +}
\ No newline at end of file diff --git a/browser-ext/src/browserServerMain.ts b/browser-ext/src/browserServerMain.ts new file mode 100644 index 0000000..5596469 --- /dev/null +++ b/browser-ext/src/browserServerMain.ts @@ -0,0 +1,111 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { createConnection, BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageserver/browser'; + +import { Color, ColorInformation, Range, InitializeParams, InitializeResult, ServerCapabilities, TextDocuments, ColorPresentation, TextEdit, TextDocumentIdentifier } from 'vscode-languageserver'; +import { TextDocument } from 'vscode-languageserver-textdocument'; + + +console.log('running server perl-navigator web'); + +/* browser specific setup code */ + +const messageReader = new BrowserMessageReader(self); +const messageWriter = new BrowserMessageWriter(self); + +const connection = createConnection(messageReader, messageWriter); + +/* from here on, all code is non-browser specific and could be shared with a regular extension */ + +connection.onInitialize((params: InitializeParams): InitializeResult => { + const capabilities: ServerCapabilities = { + colorProvider: {} // provide a color provider + }; + return { capabilities }; +}); + +// Track open, change and close text document events +const documents = new TextDocuments(TextDocument); +documents.listen(connection); + +// Register providers +connection.onDocumentColor(params => getColorInformation(params.textDocument)); +connection.onColorPresentation(params => getColorPresentation(params.color, params.range)); + +// Listen on the connection +connection.listen(); + + +const colorRegExp = /#([0-9A-Fa-f]{6})/g; + +function getColorInformation(textDocument: TextDocumentIdentifier) { + const colorInfos: ColorInformation[] = []; + + const document = documents.get(textDocument.uri); + if (document) { + const text = document.getText(); + + colorRegExp.lastIndex = 0; + let match; + while ((match = colorRegExp.exec(text)) != null) { + const offset = match.index; + const length = match[0].length; + + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)); + const color = parseColor(text, offset); + colorInfos.push({ color, range }); + } + } + console.log(`Found this many colors: ${colorInfos.length}`) + //return colorInfos; + return []; +} + +function getColorPresentation(color: Color, range: Range) { + const result: ColorPresentation[] = []; + const red256 = Math.round(color.red * 255), green256 = Math.round(color.green * 255), blue256 = Math.round(color.blue * 255); + + function toTwoDigitHex(n: number): string { + const r = n.toString(16); + return r.length !== 2 ? '0' + r : r; + } + + const label = `#${toTwoDigitHex(red256)}${toTwoDigitHex(green256)}${toTwoDigitHex(blue256)}`; + result.push({ label: label, textEdit: TextEdit.replace(range, label) }); + + return result; +} + + +const enum CharCode { + Digit0 = 48, + Digit9 = 57, + + A = 65, + F = 70, + + a = 97, + f = 102, +} + +function parseHexDigit(charCode: CharCode): number { + if (charCode >= CharCode.Digit0 && charCode <= CharCode.Digit9) { + return charCode - CharCode.Digit0; + } + if (charCode >= CharCode.A && charCode <= CharCode.F) { + return charCode - CharCode.A + 10; + } + if (charCode >= CharCode.a && charCode <= CharCode.f) { + return charCode - CharCode.a + 10; + } + return 0; +} + +function parseColor(content: string, offset: number): Color { + const r = (16 * parseHexDigit(content.charCodeAt(offset + 1)) + parseHexDigit(content.charCodeAt(offset + 2))) / 255; + const g = (16 * parseHexDigit(content.charCodeAt(offset + 3)) + parseHexDigit(content.charCodeAt(offset + 4))) / 255; + const b = (16 * parseHexDigit(content.charCodeAt(offset + 5)) + parseHexDigit(content.charCodeAt(offset + 6))) / 255; + return Color.create(r, g, b, 1); +}
\ No newline at end of file diff --git a/browser-ext/tsconfig.json b/browser-ext/tsconfig.json new file mode 100644 index 0000000..66b2d5b --- /dev/null +++ b/browser-ext/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": ["es2020", "WebWorker"], + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "strict": true + }, + "include": ["src"], + "exclude": ["node_modules", ".vscode-test-web"] +}
\ No newline at end of file |