@jupyterlab/lsp 4.0.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/lib/adapters/adapter.d.ts +125 -0
  2. package/lib/adapters/adapter.js +382 -0
  3. package/lib/adapters/adapter.js.map +1 -0
  4. package/lib/connection.d.ts +65 -0
  5. package/lib/connection.js +309 -0
  6. package/lib/connection.js.map +1 -0
  7. package/lib/connection_manager.d.ts +71 -0
  8. package/lib/connection_manager.js +312 -0
  9. package/lib/connection_manager.js.map +1 -0
  10. package/lib/extractors/manager.d.ts +13 -0
  11. package/lib/extractors/manager.js +44 -0
  12. package/lib/extractors/manager.js.map +1 -0
  13. package/lib/extractors/text_extractor.d.ts +28 -0
  14. package/lib/extractors/text_extractor.js +27 -0
  15. package/lib/extractors/text_extractor.js.map +1 -0
  16. package/lib/extractors/types.d.ts +65 -0
  17. package/lib/extractors/types.js +2 -0
  18. package/lib/extractors/types.js.map +1 -0
  19. package/lib/feature.d.ts +11 -0
  20. package/lib/feature.js +31 -0
  21. package/lib/feature.js.map +1 -0
  22. package/lib/index.d.ts +17 -0
  23. package/lib/index.js +22 -0
  24. package/lib/index.js.map +1 -0
  25. package/lib/lsp.d.ts +129 -0
  26. package/lib/lsp.js +125 -0
  27. package/lib/lsp.js.map +1 -0
  28. package/lib/manager.d.ts +29 -0
  29. package/lib/manager.js +130 -0
  30. package/lib/manager.js.map +1 -0
  31. package/lib/plugin.d.ts +45 -0
  32. package/lib/plugin.js +3 -0
  33. package/lib/plugin.js.map +1 -0
  34. package/lib/positioning.d.ts +28 -0
  35. package/lib/positioning.js +49 -0
  36. package/lib/positioning.js.map +1 -0
  37. package/lib/schema.d.ts +228 -0
  38. package/lib/schema.js +3 -0
  39. package/lib/schema.js.map +1 -0
  40. package/lib/tokens.d.ts +368 -0
  41. package/lib/tokens.js +58 -0
  42. package/lib/tokens.js.map +1 -0
  43. package/lib/utils.d.ts +18 -0
  44. package/lib/utils.js +71 -0
  45. package/lib/utils.js.map +1 -0
  46. package/lib/virtual/document.d.ts +270 -0
  47. package/lib/virtual/document.js +600 -0
  48. package/lib/virtual/document.js.map +1 -0
  49. package/package.json +75 -0
  50. package/style/index.css +11 -0
  51. package/style/index.js +11 -0
@@ -0,0 +1,312 @@
1
+ import { PageConfig, URLExt } from '@jupyterlab/coreutils';
2
+ import { Signal } from '@lumino/signaling';
3
+ import { LSPConnection } from './connection';
4
+ import { expandDottedPaths, sleep, untilReady } from './utils';
5
+ /**
6
+ * Each Widget with a document (whether file or a notebook) has the same DocumentConnectionManager
7
+ * (see JupyterLabWidgetAdapter). Using id_path instead of uri led to documents being overwritten
8
+ * as two identical id_paths could be created for two different notebooks.
9
+ */
10
+ export class DocumentConnectionManager {
11
+ constructor(options) {
12
+ /**
13
+ * Fired the first time a connection is opened. These _should_ be the only
14
+ * invocation of `.on` (once remaining LSPFeature.connection_handlers are made
15
+ * singletons).
16
+ */
17
+ this.onNewConnection = (connection) => {
18
+ connection.on('error', e => {
19
+ console.error(e);
20
+ // TODO invalid now
21
+ let error = e.length && e.length >= 1 ? e[0] : new Error();
22
+ // TODO: those codes may be specific to my proxy client, need to investigate
23
+ if (error.message.indexOf('code = 1005') !== -1) {
24
+ console.error(`Connection failed for ${connection}`);
25
+ this.forEachDocumentOfConnection(connection, virtualDocument => {
26
+ console.error('disconnecting ' + virtualDocument.uri);
27
+ this.closed.emit({ connection, virtualDocument });
28
+ this.ignoredLanguages.add(virtualDocument.language);
29
+ console.error(`Cancelling further attempts to connect ${virtualDocument.uri} and other documents for this language (no support from the server)`);
30
+ });
31
+ }
32
+ else if (error.message.indexOf('code = 1006') !== -1) {
33
+ console.error('Connection closed by the server');
34
+ }
35
+ else {
36
+ console.error('Connection error:', e);
37
+ }
38
+ });
39
+ connection.on('serverInitialized', capabilities => {
40
+ // Initialize using settings stored in the SettingRegistry
41
+ this.forEachDocumentOfConnection(connection, virtualDocument => {
42
+ // TODO: is this still necessary, e.g. for status bar to update responsively?
43
+ this.initialized.emit({ connection, virtualDocument });
44
+ });
45
+ this.updateServerConfigurations(this.initialConfigurations);
46
+ });
47
+ connection.on('close', closedManually => {
48
+ if (!closedManually) {
49
+ console.error('Connection unexpectedly disconnected');
50
+ }
51
+ else {
52
+ console.log('Connection closed');
53
+ this.forEachDocumentOfConnection(connection, virtualDocument => {
54
+ this.closed.emit({ connection, virtualDocument });
55
+ });
56
+ }
57
+ });
58
+ };
59
+ this.connections = new Map();
60
+ this.documents = new Map();
61
+ this.adapters = new Map();
62
+ this.ignoredLanguages = new Set();
63
+ this.connected = new Signal(this);
64
+ this.initialized = new Signal(this);
65
+ this.disconnected = new Signal(this);
66
+ this.closed = new Signal(this);
67
+ this.documentsChanged = new Signal(this);
68
+ this.languageServerManager = options.languageServerManager;
69
+ Private.setLanguageServerManager(options.languageServerManager);
70
+ }
71
+ connectDocumentSignals(virtualDocument) {
72
+ virtualDocument.foreignDocumentOpened.connect(this.onForeignDocumentOpened, this);
73
+ virtualDocument.foreignDocumentClosed.connect(this.onForeignDocumentClosed, this);
74
+ this.documents.set(virtualDocument.uri, virtualDocument);
75
+ this.documentsChanged.emit(this.documents);
76
+ }
77
+ disconnectDocumentSignals(virtualDocument, emit = true) {
78
+ virtualDocument.foreignDocumentOpened.disconnect(this.onForeignDocumentOpened, this);
79
+ virtualDocument.foreignDocumentClosed.disconnect(this.onForeignDocumentClosed, this);
80
+ this.documents.delete(virtualDocument.uri);
81
+ for (const foreign of virtualDocument.foreignDocuments.values()) {
82
+ this.disconnectDocumentSignals(foreign, false);
83
+ }
84
+ if (emit) {
85
+ this.documentsChanged.emit(this.documents);
86
+ }
87
+ }
88
+ onForeignDocumentOpened(_host, context) {
89
+ console.log('ConnectionManager received foreign document: ', context.foreignDocument.uri);
90
+ }
91
+ onForeignDocumentClosed(_host, context) {
92
+ const { foreignDocument } = context;
93
+ this.unregisterDocument(foreignDocument, false);
94
+ this.disconnectDocumentSignals(foreignDocument);
95
+ }
96
+ async connectSocket(options) {
97
+ let { language, capabilities, virtualDocument } = options;
98
+ this.connectDocumentSignals(virtualDocument);
99
+ const uris = DocumentConnectionManager.solveUris(virtualDocument, language);
100
+ const matchingServers = this.languageServerManager.getMatchingServers({
101
+ language
102
+ });
103
+ console.debug('Matching servers: ', matchingServers);
104
+ // for now use only the server with the highest priority.
105
+ const languageServerId = matchingServers.length === 0 ? null : matchingServers[0];
106
+ // lazily load 1) the underlying library (1.5mb) and/or 2) a live WebSocket-
107
+ // like connection: either already connected or potentially in the process
108
+ // of connecting.
109
+ const connection = await Private.connection(language, languageServerId, uris, this.onNewConnection, capabilities);
110
+ // if connecting for the first time, all documents subsequent documents will
111
+ // be re-opened and synced
112
+ this.connections.set(virtualDocument.uri, connection);
113
+ return connection;
114
+ }
115
+ registerAdapter(path, adapter) {
116
+ this.adapters.set(path, adapter);
117
+ adapter.widget.disposed.connect(() => {
118
+ this.adapters.delete(path);
119
+ });
120
+ }
121
+ updateConfiguration(allServerSettings) {
122
+ this.languageServerManager.setConfiguration(allServerSettings);
123
+ }
124
+ updateServerConfigurations(allServerSettings) {
125
+ let languageServerId;
126
+ for (languageServerId in allServerSettings) {
127
+ if (!allServerSettings.hasOwnProperty(languageServerId)) {
128
+ continue;
129
+ }
130
+ const rawSettings = allServerSettings[languageServerId];
131
+ const parsedSettings = expandDottedPaths(rawSettings.serverSettings || {});
132
+ const serverSettings = {
133
+ settings: parsedSettings
134
+ };
135
+ Private.updateServerConfiguration(languageServerId, serverSettings);
136
+ }
137
+ }
138
+ /**
139
+ * TODO: presently no longer referenced. A failing connection would close
140
+ * the socket, triggering the language server on the other end to exit
141
+ */
142
+ async retryToConnect(options, reconnectDelay, retrialsLeft = -1) {
143
+ let { virtualDocument } = options;
144
+ if (this.ignoredLanguages.has(virtualDocument.language)) {
145
+ return;
146
+ }
147
+ let interval = reconnectDelay * 1000;
148
+ let success = false;
149
+ while (retrialsLeft !== 0 && !success) {
150
+ await this.connect(options)
151
+ .then(() => {
152
+ success = true;
153
+ })
154
+ .catch(e => {
155
+ console.warn(e);
156
+ });
157
+ console.log('will attempt to re-connect in ' + interval / 1000 + ' seconds');
158
+ await sleep(interval);
159
+ // gradually increase the time delay, up to 5 sec
160
+ interval = interval < 5 * 1000 ? interval + 500 : interval;
161
+ }
162
+ }
163
+ disconnect(languageId) {
164
+ Private.disconnect(languageId);
165
+ }
166
+ // async registerDocument(options: IDocumentRegistationOptions) {}
167
+ async connect(options, firstTimeoutSeconds = 30, secondTimeoutMinutes = 5) {
168
+ let connection = await this.connectSocket(options);
169
+ let { virtualDocument } = options;
170
+ if (!connection.isReady) {
171
+ try {
172
+ // user feedback hinted that 40 seconds was too short and some users are willing to wait more;
173
+ // to make the best of both worlds we first check frequently (6.6 times a second) for the first
174
+ // 30 seconds, and show the warning early in case if something is wrong; we then continue retrying
175
+ // for another 5 minutes, but only once per second.
176
+ await untilReady(() => connection.isReady, Math.round((firstTimeoutSeconds * 1000) / 150), 150);
177
+ }
178
+ catch (_a) {
179
+ console.log(`Connection to ${virtualDocument.uri} timed out after ${firstTimeoutSeconds} seconds, will continue retrying for another ${secondTimeoutMinutes} minutes`);
180
+ try {
181
+ await untilReady(() => connection.isReady, 60 * secondTimeoutMinutes, 1000);
182
+ }
183
+ catch (_b) {
184
+ console.log(`Connection to ${virtualDocument.uri} timed out again after ${secondTimeoutMinutes} minutes, giving up`);
185
+ return;
186
+ }
187
+ }
188
+ }
189
+ this.connected.emit({ connection, virtualDocument });
190
+ return connection;
191
+ }
192
+ unregisterDocument(virtualDocument, emit = true) {
193
+ const connection = this.connections.get(virtualDocument.uri);
194
+ if (connection) {
195
+ this.connections.delete(virtualDocument.uri);
196
+ const allConnection = new Set(this.connections.values());
197
+ if (!allConnection.has(connection)) {
198
+ this.disconnect(connection.serverIdentifier);
199
+ }
200
+ if (emit) {
201
+ this.documentsChanged.emit(this.documents);
202
+ }
203
+ }
204
+ }
205
+ updateLogging(logAllCommunication, setTrace) {
206
+ for (const connection of this.connections.values()) {
207
+ connection.logAllCommunication = logAllCommunication;
208
+ if (setTrace !== null) {
209
+ connection.clientNotifications['$/setTrace'].emit({ value: setTrace });
210
+ }
211
+ }
212
+ }
213
+ forEachDocumentOfConnection(connection, callback) {
214
+ for (const [virtualDocumentUri, currentConnection] of this.connections.entries()) {
215
+ if (connection !== currentConnection) {
216
+ continue;
217
+ }
218
+ callback(this.documents.get(virtualDocumentUri));
219
+ }
220
+ }
221
+ }
222
+ (function (DocumentConnectionManager) {
223
+ function solveUris(virtualDocument, language) {
224
+ const wsBase = PageConfig.getBaseUrl().replace(/^http/, 'ws');
225
+ const rootUri = PageConfig.getOption('rootUri');
226
+ const virtualDocumentsUri = PageConfig.getOption('virtualDocumentsUri');
227
+ const baseUri = virtualDocument.hasLspSupportedFile
228
+ ? rootUri
229
+ : virtualDocumentsUri;
230
+ // for now take the best match only
231
+ const matchingServers = Private.getLanguageServerManager().getMatchingServers({
232
+ language
233
+ });
234
+ const languageServerId = matchingServers.length === 0 ? null : matchingServers[0];
235
+ if (languageServerId === null) {
236
+ throw `No language server installed for language ${language}`;
237
+ }
238
+ // workaround url-parse bug(s) (see https://github.com/jupyter-lsp/jupyterlab-lsp/issues/595)
239
+ let documentUri = URLExt.join(baseUri, virtualDocument.uri);
240
+ if (!documentUri.startsWith('file:///') &&
241
+ documentUri.startsWith('file://')) {
242
+ documentUri = documentUri.replace('file://', 'file:///');
243
+ if (documentUri.startsWith('file:///users/') &&
244
+ baseUri.startsWith('file:///Users/')) {
245
+ documentUri = documentUri.replace('file:///users/', 'file:///Users/');
246
+ }
247
+ }
248
+ return {
249
+ base: baseUri,
250
+ document: documentUri,
251
+ server: URLExt.join('ws://jupyter-lsp', language),
252
+ socket: URLExt.join(wsBase, 'lsp', 'ws', languageServerId)
253
+ };
254
+ }
255
+ DocumentConnectionManager.solveUris = solveUris;
256
+ })(DocumentConnectionManager || (DocumentConnectionManager = {}));
257
+ /**
258
+ * Namespace primarily for language-keyed cache of LSPConnections
259
+ */
260
+ var Private;
261
+ (function (Private) {
262
+ const _connections = new Map();
263
+ let _languageServerManager;
264
+ function getLanguageServerManager() {
265
+ return _languageServerManager;
266
+ }
267
+ Private.getLanguageServerManager = getLanguageServerManager;
268
+ function setLanguageServerManager(languageServerManager) {
269
+ _languageServerManager = languageServerManager;
270
+ }
271
+ Private.setLanguageServerManager = setLanguageServerManager;
272
+ function disconnect(languageServerId) {
273
+ const connection = _connections.get(languageServerId);
274
+ if (connection) {
275
+ connection.close();
276
+ _connections.delete(languageServerId);
277
+ }
278
+ }
279
+ Private.disconnect = disconnect;
280
+ /**
281
+ * Return (or create and initialize) the WebSocket associated with the language
282
+ */
283
+ async function connection(language, languageServerId, uris, onCreate, capabilities) {
284
+ let connection = _connections.get(languageServerId);
285
+ if (connection == null) {
286
+ const socket = new WebSocket(uris.socket);
287
+ const connection = new LSPConnection({
288
+ languageId: language,
289
+ serverUri: uris.server,
290
+ rootUri: uris.base,
291
+ serverIdentifier: languageServerId,
292
+ capabilities: capabilities
293
+ });
294
+ // TODO: remove remaining unbounded users of connection.on
295
+ connection.setMaxListeners(999);
296
+ _connections.set(languageServerId, connection);
297
+ connection.connect(socket);
298
+ onCreate(connection);
299
+ }
300
+ connection = _connections.get(languageServerId);
301
+ return connection;
302
+ }
303
+ Private.connection = connection;
304
+ function updateServerConfiguration(languageServerId, settings) {
305
+ const connection = _connections.get(languageServerId);
306
+ if (connection) {
307
+ connection.sendConfigurationChange(settings);
308
+ }
309
+ }
310
+ Private.updateServerConfiguration = updateServerConfiguration;
311
+ })(Private || (Private = {}));
312
+ //# sourceMappingURL=connection_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection_manager.js","sourceRoot":"","sources":["../src/connection_manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { CellType } from '@jupyterlab/nbformat';
2
+ import { ILSPCodeExtractorsManager } from '../tokens';
3
+ import { IForeignCodeExtractor } from './types';
4
+ export declare class CodeExtractorsManager implements ILSPCodeExtractorsManager {
5
+ private _extractorMap;
6
+ private _extractorMapAnyLanguage;
7
+ constructor();
8
+ getExtractors(cellType: CellType, hostLanguage: string | null): IForeignCodeExtractor[];
9
+ /**
10
+ * Register an extractor to extract foreign code from host documents of specified language.
11
+ */
12
+ register(extractor: IForeignCodeExtractor, hostLanguage: string | null): void;
13
+ }
@@ -0,0 +1,44 @@
1
+ export class CodeExtractorsManager {
2
+ constructor() {
3
+ this._extractorMap = new Map();
4
+ this._extractorMapAnyLanguage = new Map();
5
+ ['code', 'markdown', 'raw'].forEach(cell => {
6
+ this._extractorMap.set(cell, new Map());
7
+ this._extractorMapAnyLanguage.set(cell, []);
8
+ });
9
+ }
10
+ getExtractors(cellType, hostLanguage) {
11
+ var _a, _b;
12
+ if (hostLanguage) {
13
+ const currentMap = this._extractorMap.get(cellType);
14
+ return (_a = currentMap.get(hostLanguage)) !== null && _a !== void 0 ? _a : [];
15
+ }
16
+ else {
17
+ return (_b = this._extractorMapAnyLanguage.get(cellType)) !== null && _b !== void 0 ? _b : [];
18
+ }
19
+ }
20
+ /**
21
+ * Register an extractor to extract foreign code from host documents of specified language.
22
+ */
23
+ register(extractor, hostLanguage) {
24
+ const cellType = extractor.cellType;
25
+ if (hostLanguage) {
26
+ cellType.forEach(type => {
27
+ const currentMap = this._extractorMap.get(type);
28
+ const extractorList = currentMap.get(hostLanguage);
29
+ if (!extractorList) {
30
+ currentMap.set(hostLanguage, [extractor]);
31
+ }
32
+ else {
33
+ extractorList === null || extractorList === void 0 ? void 0 : extractorList.push(extractor);
34
+ }
35
+ });
36
+ }
37
+ else {
38
+ cellType.forEach(type => {
39
+ this._extractorMapAnyLanguage.get(type).push(extractor);
40
+ });
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/extractors/manager.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,qBAAqB;IAGhC;QACE,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAGzB,CAAC;QAEJ,IAAI,CAAC,wBAAwB,GAAG,IAAI,GAAG,EAGpC,CAAC;QAEH,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CACX,QAAkB,EAClB,YAA2B;;QAE3B,IAAI,YAAY,EAAE;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACrD,OAAO,MAAA,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,mCAAI,EAAE,CAAC;SAC3C;aAAM;YACL,OAAO,MAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,mCAAI,EAAE,CAAC;SAC1D;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,SAAgC,EAChC,YAA2B;QAE3B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,IAAI,YAAY,EAAE;YAChB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACtB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;gBACjD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACnD,IAAI,CAAC,aAAa,EAAE;oBAClB,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;iBAC3C;qBAAM;oBACL,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,CAAC,SAAS,CAAC,CAAC;iBAChC;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACtB,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import { CellType } from '@jupyterlab/nbformat';
2
+ import { LanguageIdentifier } from '../lsp';
3
+ import { IExtractedCode, IForeignCodeExtractor } from './types';
4
+ export declare class TextForeignCodeExtractor implements IForeignCodeExtractor {
5
+ language: LanguageIdentifier;
6
+ standalone: boolean;
7
+ fileExtension: string;
8
+ cellType: CellType[];
9
+ constructor(options: TextForeignCodeExtractor.IOptions);
10
+ hasForeignCode(code: string, cellType: CellType): boolean;
11
+ extractForeignCode(code: string): IExtractedCode[];
12
+ }
13
+ declare namespace TextForeignCodeExtractor {
14
+ interface IOptions {
15
+ /**
16
+ * The foreign language.
17
+ */
18
+ language: string;
19
+ /**
20
+ * Should the foreign code be appended (False) to the previously established virtual document of the same language,
21
+ * or is it standalone snippet which requires separate connection?
22
+ */
23
+ isStandalone: boolean;
24
+ file_extension: string;
25
+ cellType: CellType[];
26
+ }
27
+ }
28
+ export {};
@@ -0,0 +1,27 @@
1
+ import { positionAtOffset } from '../positioning';
2
+ export class TextForeignCodeExtractor {
3
+ constructor(options) {
4
+ this.language = options.language;
5
+ this.standalone = options.isStandalone;
6
+ this.fileExtension = options.file_extension;
7
+ this.cellType = options.cellType;
8
+ }
9
+ hasForeignCode(code, cellType) {
10
+ return this.cellType.includes(cellType);
11
+ }
12
+ extractForeignCode(code) {
13
+ let lines = code.split('\n');
14
+ let extracts = new Array();
15
+ let foreignCodeFragment = code;
16
+ let start = positionAtOffset(0, lines);
17
+ let end = positionAtOffset(foreignCodeFragment.length, lines);
18
+ extracts.push({
19
+ hostCode: '',
20
+ foreignCode: foreignCodeFragment,
21
+ range: { start, end },
22
+ virtualShift: null
23
+ });
24
+ return extracts;
25
+ }
26
+ }
27
+ //# sourceMappingURL=text_extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text_extractor.js","sourceRoot":"","sources":["../../src/extractors/text_extractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,OAAO,wBAAwB;IAMnC,YAAY,OAA0C;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,QAAkB;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,kBAAkB,CAAC,IAAY;QAC7B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,QAAQ,GAAG,IAAI,KAAK,EAAkB,CAAC;QAE3C,IAAI,mBAAmB,GAAG,IAAI,CAAC;QAE/B,IAAI,KAAK,GAAG,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9D,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,mBAAmB;YAChC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YACrB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,65 @@
1
+ import { CodeEditor } from '@jupyterlab/codeeditor';
2
+ import { CellType } from '@jupyterlab/nbformat';
3
+ import { LanguageIdentifier } from '../lsp';
4
+ export interface IExtractedCode {
5
+ /**
6
+ * Foreign code (may be empty, for example line of '%R') or null if none.
7
+ */
8
+ foreignCode: string | null;
9
+ /**
10
+ * Range of the foreign code relative to the original source.
11
+ * `null` is used internally to represent a leftover host code after extraction.
12
+ */
13
+ range: CodeEditor.IRange | null;
14
+ /**
15
+ * Shift due to any additional code inserted at the beginning of the virtual document
16
+ * (usually in order to mock the arguments passed to a magic, or to provide other context clues for the linters)
17
+ */
18
+ virtualShift: CodeEditor.IPosition | null;
19
+ /**
20
+ * Code to be retained in the virtual document of the host.
21
+ */
22
+ hostCode: string | null;
23
+ }
24
+ /**
25
+ * Foreign code extractor makes it possible to analyze code of language X embedded in code (or notebook) of language Y.
26
+ *
27
+ * The typical examples are:
28
+ * - (X=CSS< Y=HTML), or
29
+ * - (X=JavaScript, Y=HTML),
30
+ *
31
+ * while in the data analysis realm, examples include:
32
+ * - (X=R, Y=IPython),
33
+ * - (X=LATEX Y=IPython),
34
+ * - (X=SQL, Y=IPython)
35
+ *
36
+ * This extension does not aim to provide comprehensive abilities for foreign code extraction,
37
+ * but it does intend to provide stable interface for other extensions to build on it.
38
+ *
39
+ * A simple, regular expression based, configurable foreign extractor is implemented
40
+ * to provide a good reference and a good initial experience for the users.
41
+ */
42
+ export interface IForeignCodeExtractor {
43
+ /**
44
+ * The foreign language.
45
+ */
46
+ language: LanguageIdentifier;
47
+ cellType: CellType[];
48
+ /**
49
+ * Split the code into the host and foreign code (if any foreign code was detected)
50
+ */
51
+ extractForeignCode(code: string): IExtractedCode[];
52
+ /**
53
+ * Does the extractor produce code which should be appended to the previously established virtual document (False)
54
+ * of the same language, or does it produce standalone snippets which require separate connections (True)?
55
+ */
56
+ standalone: boolean;
57
+ /**
58
+ * Test if there is any foreign code in provided code snippet.
59
+ */
60
+ hasForeignCode(code: string, cellType: CellType): boolean;
61
+ /**
62
+ * Extension of the virtual document (some servers check extensions of files), e.g. 'py' or 'R'.
63
+ */
64
+ fileExtension: string;
65
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/extractors/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { ISignal } from '@lumino/signaling';
2
+ import { ClientCapabilities } from './lsp';
3
+ import { IFeature, ILSPFeatureManager } from './tokens';
4
+ export declare class FeatureManager implements ILSPFeatureManager {
5
+ readonly features: Array<IFeature>;
6
+ private _featuresRegistered;
7
+ constructor();
8
+ register(feature: IFeature): void;
9
+ get featuresRegistered(): ISignal<ILSPFeatureManager, IFeature>;
10
+ clientCapabilities(): ClientCapabilities;
11
+ }
package/lib/feature.js ADDED
@@ -0,0 +1,31 @@
1
+ import { Signal } from '@lumino/signaling';
2
+ import mergeWith from 'lodash.mergewith';
3
+ export class FeatureManager {
4
+ constructor() {
5
+ this.features = [];
6
+ this._featuresRegistered = new Signal(this);
7
+ }
8
+ register(feature) {
9
+ if (this.features.some(ft => ft.id === feature.id)) {
10
+ console.warn(`Feature with id ${feature.id} is already registered, skipping.`);
11
+ }
12
+ else {
13
+ this.features.push(feature);
14
+ this._featuresRegistered.emit(feature);
15
+ }
16
+ }
17
+ get featuresRegistered() {
18
+ return this._featuresRegistered;
19
+ }
20
+ clientCapabilities() {
21
+ let capabilities = {};
22
+ for (const feature of this.features) {
23
+ if (!feature.capabilities) {
24
+ continue;
25
+ }
26
+ capabilities = mergeWith(capabilities, feature.capabilities);
27
+ }
28
+ return capabilities;
29
+ }
30
+ }
31
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature.js","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,SAAS,MAAM,kBAAkB,CAAC;AAKzC,MAAM,OAAO,cAAc;IAGzB;QAFgB,aAAQ,GAAoB,EAAE,CAAC;QAG7C,IAAI,CAAC,mBAAmB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ,CAAC,OAAiB;QACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE;YAClD,OAAO,CAAC,IAAI,CACV,mBAAmB,OAAO,CAAC,EAAE,mCAAmC,CACjE,CAAC;SACH;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACxC;IACH,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,kBAAkB;QAChB,IAAI,YAAY,GAAuB,EAAE,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;YACnC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;gBACzB,SAAS;aACV;YACD,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;SAC9D;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * @module lsp
4
+ */
5
+ export * from './connection_manager';
6
+ export * from './manager';
7
+ export * from './tokens';
8
+ export * from './adapters/adapter';
9
+ export * from './positioning';
10
+ export * from './virtual/document';
11
+ export * from './utils';
12
+ export * from './connection';
13
+ export * from './feature';
14
+ export * from './extractors/manager';
15
+ export * from './extractors/text_extractor';
16
+ export * from './extractors/types';
17
+ export * from './plugin';
package/lib/index.js ADDED
@@ -0,0 +1,22 @@
1
+ /* -----------------------------------------------------------------------------
2
+ | Copyright (c) Jupyter Development Team.
3
+ | Distributed under the terms of the Modified BSD License.
4
+ |----------------------------------------------------------------------------*/
5
+ /**
6
+ * @packageDocumentation
7
+ * @module lsp
8
+ */
9
+ export * from './connection_manager';
10
+ export * from './manager';
11
+ export * from './tokens';
12
+ export * from './adapters/adapter';
13
+ export * from './positioning';
14
+ export * from './virtual/document';
15
+ export * from './utils';
16
+ export * from './connection';
17
+ export * from './feature';
18
+ export * from './extractors/manager';
19
+ export * from './extractors/text_extractor';
20
+ export * from './extractors/types';
21
+ export * from './plugin';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;+EAG+E;AAC/E;;;GAGG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC"}