summaryrefslogtreecommitdiff
path: root/browser-ext
diff options
context:
space:
mode:
authorbscan <10503608+bscan@users.noreply.github.com>2023-01-15 17:09:29 -0500
committerbscan <10503608+bscan@users.noreply.github.com>2023-01-15 17:09:29 -0500
commit2c17a5096fa5c9310ffea8d478e30c7175b0b125 (patch)
treec82c5eacfc4d6213eca7bc49b75263c047c34d94 /browser-ext
parentd8b9250e26f5e86037d401de523478353413564d (diff)
downloadPerlNavigator-2c17a5096fa5c9310ffea8d478e30c7175b0b125.zip
First version of Web Extension. Currently only offers syntax highlighting.
Diffstat (limited to 'browser-ext')
-rw-r--r--browser-ext/package-lock.json92
-rw-r--r--browser-ext/package.json19
-rw-r--r--browser-ext/src/browserServerMain.ts111
-rw-r--r--browser-ext/tsconfig.json12
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