ggblab 0.9.3__py3-none-any.whl

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 (26) hide show
  1. ggblab/__init__.py +44 -0
  2. ggblab/_version.py +4 -0
  3. ggblab/comm.py +243 -0
  4. ggblab/construction.py +179 -0
  5. ggblab/errors.py +142 -0
  6. ggblab/ggbapplet.py +293 -0
  7. ggblab/parser.py +486 -0
  8. ggblab/persistent_counter.py +175 -0
  9. ggblab/schema.py +114 -0
  10. ggblab/utils.py +109 -0
  11. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/build_log.json +730 -0
  12. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/install.json +5 -0
  13. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/package.json +210 -0
  14. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/schemas/ggblab/package.json.orig +205 -0
  15. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/schemas/ggblab/plugin.json +8 -0
  16. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/lib_index_js.bbfa36bc62ee08eb62b2.js +465 -0
  17. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/lib_index_js.bbfa36bc62ee08eb62b2.js.map +1 -0
  18. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/remoteEntry.2d29364aef8b527d773e.js +568 -0
  19. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/remoteEntry.2d29364aef8b527d773e.js.map +1 -0
  20. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/style.js +4 -0
  21. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/style_index_js.aab9f5416f41ce79cac3.js +492 -0
  22. ggblab-0.9.3.data/data/share/jupyter/labextensions/ggblab/static/style_index_js.aab9f5416f41ce79cac3.js.map +1 -0
  23. ggblab-0.9.3.dist-info/METADATA +768 -0
  24. ggblab-0.9.3.dist-info/RECORD +26 -0
  25. ggblab-0.9.3.dist-info/WHEEL +4 -0
  26. ggblab-0.9.3.dist-info/licenses/LICENSE +29 -0
@@ -0,0 +1,465 @@
1
+ "use strict";
2
+ (self["webpackChunkggblab"] = self["webpackChunkggblab"] || []).push([["lib_index_js"],{
3
+
4
+ /***/ "./lib/index.js"
5
+ /*!**********************!*\
6
+ !*** ./lib/index.js ***!
7
+ \**********************/
8
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
9
+
10
+ __webpack_require__.r(__webpack_exports__);
11
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
13
+ /* harmony export */ });
14
+ /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/application */ "webpack/sharing/consume/default/@jupyterlab/application");
15
+ /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__);
16
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
17
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
18
+ /* harmony import */ var _jupyterlab_launcher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/launcher */ "webpack/sharing/consume/default/@jupyterlab/launcher");
19
+ /* harmony import */ var _jupyterlab_launcher__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_launcher__WEBPACK_IMPORTED_MODULE_2__);
20
+ /* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jupyterlab/settingregistry */ "webpack/sharing/consume/default/@jupyterlab/settingregistry");
21
+ /* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_3__);
22
+ /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
23
+ /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__);
24
+ /* harmony import */ var _widget__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./widget */ "./lib/widget.js");
25
+
26
+
27
+
28
+
29
+ //import { DockLayout } from '@lumino/widgets';
30
+
31
+
32
+ var CommandIDs;
33
+ (function (CommandIDs) {
34
+ CommandIDs.create = 'ggblab:create';
35
+ })(CommandIDs || (CommandIDs = {}));
36
+ // const PANEL_CLASS = 'jp-ggblabPanel';
37
+ /**
38
+ * Initialization data for the ggblab extension.
39
+ */
40
+ const plugin = {
41
+ id: 'ggblab:plugin',
42
+ description: 'A JupyterLab extension.',
43
+ autoStart: true,
44
+ requires: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette],
45
+ optional: [_jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_3__.ISettingRegistry, _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__.ILayoutRestorer, _jupyterlab_launcher__WEBPACK_IMPORTED_MODULE_2__.ILauncher],
46
+ activate: (app, palette, settingRegistry, restorer, launcher) => {
47
+ console.log('JupyterLab extension ggblab-0.0.1 is activated!');
48
+ if (settingRegistry) {
49
+ settingRegistry
50
+ .load(plugin.id)
51
+ .then(settings => {
52
+ console.log('ggblab settings loaded:', settings.composite);
53
+ })
54
+ .catch(reason => {
55
+ console.error('Failed to load settings for ggblab.', reason);
56
+ });
57
+ }
58
+ const { commands } = app;
59
+ const command = CommandIDs.create;
60
+ commands.addCommand(command, {
61
+ caption: 'Create a new React Widget',
62
+ label: 'React Widget',
63
+ icon: args => (args['isPalette'] ? undefined : _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__.reactIcon),
64
+ execute: (args) => {
65
+ console.log('socketPath:', args['socketPath']);
66
+ const content = new _widget__WEBPACK_IMPORTED_MODULE_5__.GeoGebraWidget({
67
+ kernelId: args['kernelId'] || '',
68
+ commTarget: args['commTarget'] || '',
69
+ insertMode: args['insertMode'] || 'split-right',
70
+ socketPath: args['socketPath'] || '',
71
+ wsPort: args['wsPort'] || 8888,
72
+ });
73
+ const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content });
74
+ widget.title.label = 'GeoGebra (' + (args['kernelId'] || '').substring(0, 8) + ')';
75
+ widget.title.icon = _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__.reactIcon;
76
+ app.shell.add(widget, 'main', {
77
+ mode: args['insertMode'] || 'insert-right',
78
+ });
79
+ }
80
+ });
81
+ palette.addItem({
82
+ command,
83
+ category: "Tutorial",
84
+ });
85
+ let tracker = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.WidgetTracker({
86
+ namespace: "ggblab",
87
+ });
88
+ if (restorer) {
89
+ restorer.restore(tracker, {
90
+ command,
91
+ name: () => "ggblab",
92
+ });
93
+ }
94
+ if (launcher) {
95
+ launcher.add({
96
+ command,
97
+ category: "example",
98
+ rank: 1,
99
+ });
100
+ }
101
+ }
102
+ };
103
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (plugin);
104
+
105
+
106
+ /***/ },
107
+
108
+ /***/ "./lib/widget.js"
109
+ /*!***********************!*\
110
+ !*** ./lib/widget.js ***!
111
+ \***********************/
112
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
113
+
114
+ __webpack_require__.r(__webpack_exports__);
115
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
116
+ /* harmony export */ GeoGebraWidget: () => (/* binding */ GeoGebraWidget)
117
+ /* harmony export */ });
118
+ /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
119
+ /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__);
120
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
121
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
122
+ /* harmony import */ var _jupyterlab_services__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/services */ "webpack/sharing/consume/default/@jupyterlab/services");
123
+ /* harmony import */ var _jupyterlab_services__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_services__WEBPACK_IMPORTED_MODULE_2__);
124
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
125
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__);
126
+
127
+
128
+ //import MetaTags from 'react-meta-tags';
129
+
130
+
131
+ //import { Message } from '@lumino/messaging';
132
+ /**
133
+ * React component for a GeoGebra.
134
+ *
135
+ * @returns The React component
136
+ */
137
+ const GGAComponent = (props) => {
138
+ // const [kernels, setKernels] = React.useState<any[]>([]);
139
+ const widgetRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);
140
+ // const [size, setSize] = useState<{width: number; height: number}>({width: 800, height: 600});
141
+ // useEffect(() => {
142
+ // window.addEventListener('resize', () => {
143
+ // if (widgetRef.current) {
144
+ // setSize({
145
+ // width: widgetRef.current.offsetWidth,
146
+ // height: widgetRef.current.offsetHeight,
147
+ // });
148
+ // console.log("Resized to:", size.width, size.height);
149
+ // }
150
+ // });
151
+ // }, []);
152
+ console.log(props.kernelId, props.commTarget, props.socketPath, props.wsPort);
153
+ var applet = null;
154
+ function isArrayOfArrays(value) {
155
+ return Array.isArray(value) && value.every(subArray => Array.isArray(subArray));
156
+ }
157
+ /**
158
+ * Calls a remote procedure on kernel2 to send a message via remote socket between kernel2 to kernel.
159
+ * Executes Python code on kernel2 that sends the message through either a unix socket or websocket.
160
+ *
161
+ * Note on WebSocket Connection Handling:
162
+ * Previous attempts to maintain persistent websocket connections using ping/pong (keep-alive)
163
+ * were unsuccessful. Websocket connections established via kernel2.requestExecute() execute
164
+ * within isolated contexts that are torn down immediately after the code execution completes.
165
+ * Even with ping/pong mechanisms, connections would be disconnected once the kernel's
166
+ * requestExecute() context ended. Therefore, the implementation creates new socket connections
167
+ * for each message send operation, which is more reliable than attempting to maintain
168
+ * persistent but fragile connections.
169
+ *
170
+ * @param kernel2 - The kernel to execute the remote procedure on
171
+ * @param message - The message to send (as a JSON string)
172
+ * @param socketPath - Optional unix socket path (if provided, uses unix socket; otherwise uses websocket)
173
+ * @param wsUrl - WebSocket URL (used if socketPath is not provided)
174
+ */
175
+ async function callRemoteSocketSend(kernel2, message, socketPath, wsUrl) {
176
+ if (socketPath) {
177
+ await kernel2.requestExecute({ code: `
178
+ with unix_connect("${socketPath}") as ws:
179
+ ws.send(r"""${message}""")
180
+ `
181
+ }).done;
182
+ }
183
+ else {
184
+ await kernel2.requestExecute({ code: `
185
+ with connect("${wsUrl}") as ws:
186
+ ws.send(r"""${message}""")
187
+ `
188
+ }).done;
189
+ }
190
+ }
191
+ (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
192
+ (async () => {
193
+ return await _jupyterlab_services__WEBPACK_IMPORTED_MODULE_2__.KernelAPI.listRunning();
194
+ })().then(async (kernels) => {
195
+ // setKernels(kernels);
196
+ console.log("Running kernels:", kernels);
197
+ const baseUrl = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__.PageConfig.getBaseUrl();
198
+ const token = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_3__.PageConfig.getToken();
199
+ console.log(`Base URL: ${baseUrl}`);
200
+ console.log(`Token: ${token}`);
201
+ const settings = _jupyterlab_services__WEBPACK_IMPORTED_MODULE_2__.ServerConnection.makeSettings({
202
+ baseUrl: baseUrl, //'http://localhost:8889/',
203
+ token: token, //'7e89be30eb93ee7c149a839d4c7577e08c2c25b3c7f14647',
204
+ appendToken: true,
205
+ });
206
+ const kernelManager = new _jupyterlab_services__WEBPACK_IMPORTED_MODULE_2__.KernelManager({ serverSettings: settings });
207
+ const kernel2 = await kernelManager.startNew({ name: 'python3' });
208
+ console.log("Started new kernel:", kernel2, props.kernelId);
209
+ await kernel2.requestExecute({ code: `from websockets.sync.client import unix_connect, connect` }).done;
210
+ const wsUrl = `ws://localhost:${props.wsPort}/`;
211
+ const socketPath = props.socketPath || null;
212
+ const kernel = new _jupyterlab_services__WEBPACK_IMPORTED_MODULE_2__.KernelConnection({
213
+ model: { name: 'python3', id: props.kernelId || kernels[0]['id'] },
214
+ serverSettings: settings,
215
+ });
216
+ console.log("Connected to kernel:", kernel);
217
+ async function ggbOnLoad(api) {
218
+ console.log("GeoGebra applet loaded:", api);
219
+ var resize = function () {
220
+ const wrapperDiv = document.getElementById('ggb-element');
221
+ const parentDiv = wrapperDiv === null || wrapperDiv === void 0 ? void 0 : wrapperDiv.parentElement;
222
+ const width = parseInt((parentDiv === null || parentDiv === void 0 ? void 0 : parentDiv.style.width) || "800");
223
+ const height = parseInt((parentDiv === null || parentDiv === void 0 ? void 0 : parentDiv.style.height) || "600");
224
+ // console.log("Window resized:", width, height);
225
+ api.recalculateEnvironments();
226
+ api.setSize(width, height);
227
+ };
228
+ window.addEventListener('resize', resize);
229
+ resize();
230
+ const comm = kernel.createComm(props.commTarget || 'test');
231
+ comm.open('HELO from GGB').done;
232
+ // comm.send('HELO2').done
233
+ // kernel.registerCommTarget('test', (comm, commMsg) => {
234
+ // console.log("Comm opened from kernel with message:", commMsg['content']['data']);
235
+ addEventListener('close', () => {
236
+ // comm.close().done;
237
+ // kernel.shutdown().catch(err => console.error(err));
238
+ kernel2.shutdown().catch(err => console.error(err));
239
+ console.log("Kernel and comm closed.");
240
+ window.removeEventListener('resize', resize);
241
+ });
242
+ comm.onMsg = async (msg) => {
243
+ console.log("Message received from server:", msg['content']['data']);
244
+ const command = JSON.parse(msg.content.data);
245
+ console.log("Parsed command:", command.type, command.payload);
246
+ var rmsg = null;
247
+ if (command.type === "command") {
248
+ var label = api.evalCommandGetLabels(command.payload); // GeoGebraにコマンドを適用
249
+ rmsg = JSON.stringify({
250
+ "type": "created",
251
+ "id": command.id,
252
+ "payload": label
253
+ }); // .replace(/'/g, "\\'");
254
+ }
255
+ else if (command.type === "function") {
256
+ var apiName = command.payload.name;
257
+ console.log(apiName);
258
+ var value = [];
259
+ // if (command.payload.args == null) {
260
+ // value = api[apiName]();
261
+ // } else
262
+ {
263
+ var args = command.payload.args;
264
+ value = [];
265
+ (Array.isArray(apiName) ? apiName : [apiName]).forEach((f) => {
266
+ console.log(f, args);
267
+ if (isArrayOfArrays(args)) {
268
+ var value2 = [];
269
+ args.forEach((arg2) => {
270
+ if (args) {
271
+ value2.push(api[f](...arg2) || null);
272
+ }
273
+ else {
274
+ value2.push(api[f]() || null);
275
+ }
276
+ });
277
+ value.push(value2);
278
+ }
279
+ else {
280
+ if (args) {
281
+ value.push(api[f](...args) || null);
282
+ }
283
+ else {
284
+ value.push(api[f]() || null);
285
+ }
286
+ }
287
+ });
288
+ value = (Array.isArray(apiName) ? value : value[0]);
289
+ console.log("Function value:", value);
290
+ }
291
+ rmsg = JSON.stringify({
292
+ "type": "value",
293
+ "id": command.id,
294
+ "payload": {
295
+ //"label": command.payload,
296
+ "value": value
297
+ }
298
+ }); // .replace(/'/g, "\\'");
299
+ }
300
+ comm.send(rmsg);
301
+ await callRemoteSocketSend(kernel2, rmsg, socketPath, wsUrl);
302
+ };
303
+ // var clientListener = function(data: any) {
304
+ // // console.log("Add listener triggered for:", data);
305
+ // var msg = {
306
+ // "type": "add",
307
+ // "payload": data,
308
+ // }
309
+ // console.log("Add detected:", JSON.stringify(msg));
310
+ // comm.send(JSON.stringify(msg));
311
+ // }
312
+ // api.registerClientListener(clientListener);
313
+ var addListener = async function (data) {
314
+ // console.log("Add listener triggered for:", data);
315
+ var msg = {
316
+ "type": "add",
317
+ "payload": data, // {
318
+ // "label": data,
319
+ // "details": {
320
+ // "type": api.getObjectType(data),
321
+ // "commandString": api.getCommandString(data, false),
322
+ // "visible": api.getVisible(data),
323
+ // "layer": api.getLayer(data),
324
+ // }
325
+ // }
326
+ };
327
+ // console.log("Add detected:", JSON.stringify(msg));
328
+ await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);
329
+ };
330
+ api.registerAddListener(addListener);
331
+ var removeListener = async function (data) {
332
+ // console.log("Add listener triggered for:", data);
333
+ var msg = {
334
+ "type": "remove",
335
+ "payload": data,
336
+ };
337
+ // console.log("Remove detected:", JSON.stringify(msg));
338
+ await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);
339
+ };
340
+ api.registerRemoveListener(removeListener);
341
+ var renameListener = async function (data) {
342
+ // console.log("Add listener triggered for:", data);
343
+ var msg = {
344
+ "type": "rename",
345
+ "payload": data,
346
+ };
347
+ // console.log("Rename detected:", JSON.stringify(msg));
348
+ await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);
349
+ };
350
+ api.registerRenameListener(renameListener);
351
+ var clearListener = async function (data) {
352
+ // console.log("Add listener triggered for:", data);
353
+ var msg = {
354
+ "type": "clear",
355
+ "payload": data
356
+ };
357
+ // console.log("Rename detected:", JSON.stringify(msg));
358
+ await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);
359
+ };
360
+ api.registerClearListener(clearListener);
361
+ const observer = new MutationObserver((mutations) => {
362
+ mutations.forEach((mutation) => {
363
+ mutation.addedNodes.forEach((node) => {
364
+ try {
365
+ node.querySelectorAll('div.dialogMainPanel > div.dialogTitle').forEach((n) => {
366
+ // console.log(n.textContent); 'Error'などのタイトルを検出
367
+ node.querySelector('div.dialogContent')
368
+ .querySelectorAll(`[class$='Label']`).forEach(async (n2) => {
369
+ // console.log(n2.textContent);
370
+ const msg = JSON.stringify({
371
+ "type": n.textContent,
372
+ "payload": n2.textContent
373
+ });
374
+ // comm.send(msg);
375
+ await callRemoteSocketSend(kernel2, msg, socketPath, wsUrl);
376
+ });
377
+ });
378
+ }
379
+ catch (e) {
380
+ // console.log(e, node);
381
+ }
382
+ });
383
+ });
384
+ });
385
+ observer.observe(document.body, { childList: true, subtree: true });
386
+ }
387
+ const metaViewport = document.createElement('meta');
388
+ metaViewport.name = "viewport";
389
+ metaViewport.content = "width=device-width, initial-scale=1";
390
+ document.head.appendChild(metaViewport);
391
+ const scriptTag = document.createElement('script');
392
+ scriptTag.src = 'https://cdn.geogebra.org/apps/deployggb.js';
393
+ scriptTag.async = true;
394
+ scriptTag.onload = () => {
395
+ const params = {
396
+ id: "ggbApplet", // アプレットのID
397
+ appName: "suite", // GeoGebra Classicスマートアプレットを指定
398
+ width: 800, // アプレットの横幅
399
+ height: 600, // アプレットの高さ
400
+ showToolBar: true, // ツールバーを表示
401
+ showAlgebraInput: false, // 入力フィールドを表示
402
+ showMenuBar: true, // メニューバーを表示
403
+ autoHeight: true,
404
+ // autoWidth: false,
405
+ // scale: 2,
406
+ allowUpscale: false,
407
+ appletOnLoad: ggbOnLoad
408
+ };
409
+ applet = new window.GGBApplet(params, true);
410
+ applet.inject("ggb-element");
411
+ };
412
+ document.body.appendChild(scriptTag);
413
+ });
414
+ return () => {
415
+ // コンポーネントのアンマウント時にスクリプトとアプレットをクリーンアップ
416
+ // document.head.removeChild(scriptTag);
417
+ if (applet) {
418
+ console.log("Cleaning up GeoGebra applet.");
419
+ // delete (window as any).applet;
420
+ window.ggbApplet.remove();
421
+ applet = null;
422
+ delete window.GGBApplet;
423
+ }
424
+ };
425
+ }, []);
426
+ return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { id: "ggb-element", ref: widgetRef, style: { width: "100%", height: "100%" } }));
427
+ };
428
+ /**
429
+ * A GeoGebra Lumino Widget that wraps a GeoGebraComponent.
430
+ */
431
+ class GeoGebraWidget extends _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.ReactWidget {
432
+ /**
433
+ * Constructs a new GeoGebraWidget.
434
+ */
435
+ constructor(props) {
436
+ super();
437
+ this.addClass('jp-ggblabWidget');
438
+ this.props = props;
439
+ // this.kernelId = props?.kernelId || '';
440
+ // this.commTarget = props?.commTarget || '';
441
+ // this.wsPort = props?.wsPort || 0;
442
+ // this.socketPath = props?.socketPath || '';
443
+ }
444
+ render() {
445
+ var _a, _b, _c, _d;
446
+ return react__WEBPACK_IMPORTED_MODULE_1___default().createElement(GGAComponent, { kernelId: (_a = this.props) === null || _a === void 0 ? void 0 : _a.kernelId, commTarget: (_b = this.props) === null || _b === void 0 ? void 0 : _b.commTarget, wsPort: (_c = this.props) === null || _c === void 0 ? void 0 : _c.wsPort, socketPath: (_d = this.props) === null || _d === void 0 ? void 0 : _d.socketPath });
447
+ }
448
+ // protected onCloseRequest(msg: Message): void {
449
+ // console.log("GeoGebraWidget is being closed.");
450
+ // super.onCloseRequest(msg);
451
+ // // this.dispose();
452
+ // }
453
+ dispose() {
454
+ console.log("GeoGebraWidget is being disposed.");
455
+ window.dispatchEvent(new Event('close'));
456
+ // delete(window.ggbApplet);
457
+ super.dispose();
458
+ }
459
+ }
460
+
461
+
462
+ /***/ }
463
+
464
+ }]);
465
+ //# sourceMappingURL=lib_index_js.bbfa36bc62ee08eb62b2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib_index_js.bbfa36bc62ee08eb62b2.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIiC;AAKH;AACmB;AACc;AAC/D,+CAA+C;AAEO;AACZ;AAE1C,IAAU,UAAU,CAEnB;AAFD,WAAU,UAAU;IACL,iBAAM,GAAG,eAAe,CAAC;AACxC,CAAC,EAFS,UAAU,KAAV,UAAU,QAEnB;AAED,wCAAwC;AAExC;;GAEG;AACH,MAAM,MAAM,GAAgC;IAC1C,EAAE,EAAE,eAAe;IACnB,WAAW,EAAE,yBAAyB;IACtC,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,CAAC,iEAAe,CAAC;IAC3B,QAAQ,EAAE,CAAC,yEAAgB,EAAE,oEAAe,EAAE,2DAAS,CAAC;IACxD,QAAQ,EAAE,CAAC,GAAoB,EAAE,OAAwB,EAAE,eAAwC,EAAE,QAAgC,EAAE,QAA0B,EAAE,EAAE;QACnK,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAE/D,IAAI,eAAe,EAAE,CAAC;YACpB,eAAe;iBACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;iBACf,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACf,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC,CAAC;iBACD,KAAK,CAAC,MAAM,CAAC,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;QAGzB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;QAClC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE;YAC3B,OAAO,EAAE,2BAA2B;YACpC,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gEAAS,CAAC;YACzD,OAAO,EAAE,CAAC,IAAS,EAAE,EAAE;gBACrB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC/C,MAAM,OAAO,GAAG,IAAI,mDAAc,CAAC;oBACjC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;oBAChC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;oBACpC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,aAAa;oBAC/C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;oBACpC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI;iBAC/B,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,gEAAc,CAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/D,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;gBACnF,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,gEAAS,CAAC;gBAC9B,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;oBAC5B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,cAAc;iBAC3C,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC;YACd,OAAO;YACP,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,IAAI,+DAAa,CAAiC;YAC9D,SAAS,EAAE,QAAQ;SACpB,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;gBACxB,OAAO;gBACP,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ;aACrB,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC;gBACX,OAAO;gBACP,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;IAEH,CAAC;CACF,CAAC;AAEF,iEAAe,MAAM,EAAC;;;;;;;;;;;;;;;;;;;;;;;AClGkC;AACS;AACjE,yCAAyC;AAE2D;AACjD;AAEnD,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,KAAqB,EAAe,EAAE;IAC3D,2DAA2D;IACxD,MAAM,SAAS,GAAG,6CAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,gGAAgG;IAEjG,sBAAsB;IACtB,gDAAgD;IAChD,+BAA+B;IAC/B,oBAAoB;IACpB,oDAAoD;IACpD,sDAAsD;IACtD,cAAc;IACd,+DAA+D;IAC/D,QAAQ;IACR,UAAU;IACV,YAAY;IAER,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE9E,IAAI,MAAM,GAAQ,IAAI,CAAC;IAEvB,SAAS,eAAe,CAAC,KAAU;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,UAAU,oBAAoB,CAC/B,OAAY,EACZ,OAAe,EACf,UAAyB,EACzB,KAAa;QAEb,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE;qBAC5B,UAAU;kBACb,OAAO;CACxB;aACY,CAAC,CAAC,IAAI,CAAC;QACZ,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE;gBACjC,KAAK;kBACH,OAAO;CACxB;aACY,CAAC,CAAC,IAAI,CAAC;QACZ,CAAC;IACL,CAAC;IAED,gDAAS,CAAC,GAAG,EAAE;QACX,CAAC,KAAK,IAAI,EAAE;YACR,OAAO,MAAM,2DAAS,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,uBAAuB;YACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YAEzC,MAAM,OAAO,GAAG,6DAAU,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,KAAK,GAAK,6DAAU,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,kEAAgB,CAAC,YAAY,CAAC;gBAC3C,OAAO,EAAE,OAAO,EAAE,2BAA2B;gBAC7C,KAAK,EAAE,KAAK,EAAM,qDAAqD;gBACvE,WAAW,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,IAAI,+DAAa,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,0DAA0D,EAAE,CAAC,CAAC,IAAI,CAAC;YAExG,MAAM,KAAK,GAAG,kBAAkB,KAAK,CAAC,MAAM,GAAG,CAAC;YAChD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;YAE5C,MAAM,MAAM,GAAG,IAAI,kEAAgB,CAAC;gBAChC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC;gBACjE,cAAc,EAAE,QAAQ;aAC3B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAE5C,KAAK,UAAU,SAAS,CAAC,GAAQ;gBAC7B,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;gBAE5C,IAAI,MAAM,GAAG;oBACT,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;oBAC1D,MAAM,SAAS,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,aAAa;oBAC3C,MAAM,KAAK,GAAI,QAAQ,CAAC,UAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,KAAK,KAAI,KAAK,CAAC,CAAC;oBACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,MAAM,KAAI,KAAK,CAAC,CAAC;oBAC7D,iDAAiD;oBAC9C,GAAG,CAAC,uBAAuB,EAAE;oBAC7B,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,EAAE,CAAC;gBAET,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC;gBAC3D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC;gBACnC,0BAA0B;gBAE1B,yDAAyD;gBACzD,oFAAoF;gBAEjF,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC9B,qBAAqB;oBACrB,sDAAsD;oBACnD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE;oBACvB,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBAErE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAW,CAAC,CAAC;oBACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBAE9D,IAAI,IAAI,GAAQ,IAAI,CAAC;oBACrB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC7B,IAAI,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;wBAE1E,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;4BAClB,MAAM,EAAE,SAAS;4BACjB,IAAI,EAAE,OAAO,CAAC,EAAE;4BAChB,SAAS,EAAE,KAAK;yBACnB,CAAC,CAAC,CAAC,yBAAyB;oBACjC,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBACrC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;wBACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACrB,IAAI,KAAK,GAAU,EAAE,CAAC;wBACtB,sCAAsC;wBACtC,8BAA8B;wBAC9B,UAAU;wBACV,CAAC;4BACG,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;4BAChC,KAAK,GAAG,EAAE,CAAC;4BACX,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;gCACjE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gCACrB,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oCACxB,IAAI,MAAM,GAAU,EAAE,CAAC;oCACvB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAW,EAAE,EAAE;wCACzB,IAAI,IAAI,EAAE,CAAC;4CACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;wCACzC,CAAC;6CAAM,CAAC;4CACJ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;wCAClC,CAAC;oCACL,CAAC,CAAC,CAAC;oCACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gCACvB,CAAC;qCAAM,CAAC;oCACJ,IAAI,IAAI,EAAE,CAAC;wCACP,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;oCACxC,CAAC;yCAAM,CAAC;wCACJ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;oCACjC,CAAC;gCACL,CAAC;4BACL,CAAC,CAAC,CAAC;4BACH,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;4BACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;wBAC1C,CAAC;wBACD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;4BAClB,MAAM,EAAE,OAAO;4BACf,IAAI,EAAE,OAAO,CAAC,EAAE;4BAChB,SAAS,EAAE;gCACP,2BAA2B;gCAC3B,OAAO,EAAE,KAAK;6BACjB;yBACJ,CAAC,CAAC,CAAC,yBAAyB;oBACjC,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;gBAED,6CAA6C;gBAC7C,wDAAwD;gBACxD,kBAAkB;gBAClB,yBAAyB;gBACzB,2BAA2B;gBAC3B,QAAQ;gBACR,yDAAyD;gBACzD,sCAAsC;gBACtC,IAAI;gBACJ,8CAA8C;gBAE9C,IAAI,WAAW,GAAG,KAAK,WAAU,IAAS;oBACzC,oDAAoD;oBACjD,IAAI,GAAG,GAAG;wBACN,MAAM,EAAE,KAAK;wBACb,SAAS,EAAE,IAAI,EAAE,IAAI;wBACjB,kBAAkB;wBAClB,eAAe;wBACf,uCAAuC;wBACvC,0DAA0D;wBAC1D,uCAAuC;wBACvC,mCAAmC;wBACnC,IAAI;wBACR,IAAI;qBACP;oBACD,qDAAqD;oBACrD,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAChF,CAAC;gBACD,GAAG,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;gBAErC,IAAI,cAAc,GAAG,KAAK,WAAU,IAAS;oBAC5C,oDAAoD;oBACjD,IAAI,GAAG,GAAG;wBACN,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,IAAI;qBAClB;oBACD,wDAAwD;oBACxD,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAChF,CAAC;gBACD,GAAG,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBAE3C,IAAI,cAAc,GAAG,KAAK,WAAU,IAAS;oBAC5C,oDAAoD;oBACjD,IAAI,GAAG,GAAG;wBACN,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,IAAI;qBAClB;oBACD,wDAAwD;oBACxD,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAChF,CAAC;gBACD,GAAG,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBAE3C,IAAI,aAAa,GAAG,KAAK,WAAU,IAAS;oBAC5C,oDAAoD;oBAChD,IAAI,GAAG,GAAG;wBACN,MAAM,EAAE,OAAO;wBACf,SAAS,EAAE,IAAI;qBAClB;oBACD,wDAAwD;oBACxD,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAChF,CAAC;gBACD,GAAG,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;gBAEzC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;oBAChD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAC3B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;4BACjC,IAAI,CAAC;gCACA,IAAoB,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oCAC7F,gDAAgD;oCAC3C,IAAoB,CAAC,aAAa,CAAC,mBAAmB,CAAiB;yCACpE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;wCACvD,+BAA+B;wCAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;4CACvB,MAAM,EAAE,CAAC,CAAC,WAAW;4CACrB,SAAS,EAAE,EAAE,CAAC,WAAW;yCAC5B,CAAC,CAAC;wCACH,kBAAkB;wCAClB,MAAM,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;oCAChE,CAAC,CAAC;gCACV,CAAC,CAAC;4BACN,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC;gCACZ,wBAAwB;4BACzB,CAAC;wBACL,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACpD,YAAY,CAAC,IAAI,GAAG,UAAU,CAAC;YAC/B,YAAY,CAAC,OAAO,GAAG,qCAAqC,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACnD,SAAS,CAAC,GAAG,GAAG,4CAA4C,CAAC;YAC7D,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;YACvB,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE;gBACpB,MAAM,MAAM,GAAG;oBACX,EAAE,EAAE,WAAW,EAAE,WAAW;oBAC5B,OAAO,EAAE,OAAO,EAAE,+BAA+B;oBACjD,KAAK,EAAE,GAAG,EAAE,WAAW;oBACvB,MAAM,EAAE,GAAG,EAAE,WAAW;oBACxB,WAAW,EAAE,IAAI,EAAE,WAAW;oBAC9B,gBAAgB,EAAE,KAAK,EAAE,aAAa;oBACtC,WAAW,EAAE,IAAI,EAAE,YAAY;oBAC/B,UAAU,EAAE,IAAI;oBACnB,oBAAoB;oBACpB,YAAY;oBACT,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,SAAS;iBAC1B;gBACD,MAAM,GAAG,IAAK,MAAc,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACrD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACX,sCAAsC;YACtC,wCAAwC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC/C,iCAAiC;gBAC7B,MAAc,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnC,MAAM,GAAG,IAAI,CAAC;gBACd,OAAQ,MAAc,CAAC,SAAS,CAAC;YACrC,CAAC;QACL,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACH,oEAAK,EAAE,EAAC,aAAa,EAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,GAAQ,CACvF,CAAC;AACN,CAAC,CAAC;AAUF;;GAEG;AACI,MAAM,cAAe,SAAQ,kEAAW;IAM3C;;OAEG;IACH,YAAY,KAAsB;QAC9B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,yCAAyC;QACzC,6CAA6C;QAC7C,oCAAoC;QACpC,6CAA6C;IAC9C,CAAC;IAED,MAAM;;QACF,OAAO,2DAAC,YAAY,IAAC,QAAQ,EAAE,UAAI,CAAC,KAAK,0CAAE,QAAQ,EAAE,UAAU,EAAE,UAAI,CAAC,KAAK,0CAAE,UAAU,EAAE,MAAM,EAAE,UAAI,CAAC,KAAK,0CAAE,MAAM,EAAE,UAAU,EAAE,UAAI,CAAC,KAAK,0CAAE,UAAU,GAAI,CAAC;IAChK,CAAC;IAEL,mDAAmD;IACnD,sDAAsD;IACtD,iCAAiC;IACjC,yBAAyB;IACzB,MAAM;IAEF,OAAO;QACH,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,4BAA4B;QACzB,KAAK,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;CACJ","sources":["webpack://ggblab/./src/index.ts","webpack://ggblab/./src/widget.tsx"],"sourcesContent":["import {\n ILayoutRestorer,\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { \n ICommandPalette,\n MainAreaWidget,\n WidgetTracker\n} from '@jupyterlab/apputils';\nimport { ILauncher } from '@jupyterlab/launcher';\nimport { ISettingRegistry } from '@jupyterlab/settingregistry';\n//import { DockLayout } from '@lumino/widgets';\n\nimport { reactIcon } from '@jupyterlab/ui-components';\nimport { GeoGebraWidget } from './widget';\n\nnamespace CommandIDs {\n export const create = 'ggblab:create';\n}\n\n// const PANEL_CLASS = 'jp-ggblabPanel';\n\n/**\n * Initialization data for the ggblab extension.\n */\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'ggblab:plugin',\n description: 'A JupyterLab extension.',\n autoStart: true,\n requires: [ICommandPalette],\n optional: [ISettingRegistry, ILayoutRestorer, ILauncher],\n activate: (app: JupyterFrontEnd, palette: ICommandPalette, settingRegistry: ISettingRegistry | null, restorer: ILayoutRestorer | null, launcher: ILauncher | null) => {\n console.log('JupyterLab extension ggblab-0.0.1 is activated!');\n\n if (settingRegistry) {\n settingRegistry\n .load(plugin.id)\n .then(settings => {\n console.log('ggblab settings loaded:', settings.composite);\n })\n .catch(reason => {\n console.error('Failed to load settings for ggblab.', reason);\n });\n }\n\n const { commands } = app;\n\n\n const command = CommandIDs.create;\n commands.addCommand(command, {\n caption: 'Create a new React Widget',\n label: 'React Widget',\n icon: args => (args['isPalette'] ? undefined : reactIcon),\n execute: (args: any) => {\n console.log('socketPath:', args['socketPath']);\n const content = new GeoGebraWidget({\n kernelId: args['kernelId'] || '', \n commTarget: args['commTarget'] || '', \n insertMode: args['insertMode'] || 'split-right',\n socketPath: args['socketPath'] || '',\n wsPort: args['wsPort'] || 8888,\n });\n const widget = new MainAreaWidget<GeoGebraWidget>({ content });\n widget.title.label = 'GeoGebra (' + (args['kernelId'] || '').substring(0, 8) + ')';\n widget.title.icon = reactIcon;\n app.shell.add(widget, 'main', {\n mode: args['insertMode'] || 'insert-right',\n });\n }\n });\n\n palette.addItem({\n command,\n category: \"Tutorial\",\n });\n\n let tracker = new WidgetTracker<MainAreaWidget<GeoGebraWidget>>({\n namespace: \"ggblab\",\n })\n if (restorer) {\n restorer.restore(tracker, {\n command,\n name: () => \"ggblab\",\n })\n }\n\n if (launcher) {\n launcher.add({\n command,\n category: \"example\",\n rank: 1,\n })\n }\n\n }\n};\n\nexport default plugin;","import { ReactWidget } from '@jupyterlab/ui-components';\nimport React, { useEffect, useRef /*, useState */ } from 'react';\n//import MetaTags from 'react-meta-tags';\n\nimport { ServerConnection, KernelAPI, KernelConnection, KernelManager } from '@jupyterlab/services';\nimport { PageConfig } from '@jupyterlab/coreutils';\nimport { DockLayout } from '@lumino/widgets';\n//import { Message } from '@lumino/messaging';\n\n/**\n * React component for a GeoGebra.\n *\n * @returns The React component\n */\nconst GGAComponent = (props: GGAWidgetProps): JSX.Element => {\n // const [kernels, setKernels] = React.useState<any[]>([]);\n const widgetRef = useRef<HTMLDivElement>(null);\n // const [size, setSize] = useState<{width: number; height: number}>({width: 800, height: 600});\n\n// useEffect(() => {\n// window.addEventListener('resize', () => {\n// if (widgetRef.current) {\n// setSize({\n// width: widgetRef.current.offsetWidth,\n// height: widgetRef.current.offsetHeight,\n// });\n// console.log(\"Resized to:\", size.width, size.height);\n// }\n// });\n// }, []);\n\n console.log(props.kernelId, props.commTarget, props.socketPath, props.wsPort);\n\n var applet: any = null;\n\n function isArrayOfArrays(value: any): boolean {\n return Array.isArray(value) && value.every(subArray => Array.isArray(subArray));\n }\n\n /**\n * Calls a remote procedure on kernel2 to send a message via remote socket between kernel2 to kernel.\n * Executes Python code on kernel2 that sends the message through either a unix socket or websocket.\n * \n * Note on WebSocket Connection Handling:\n * Previous attempts to maintain persistent websocket connections using ping/pong (keep-alive)\n * were unsuccessful. Websocket connections established via kernel2.requestExecute() execute\n * within isolated contexts that are torn down immediately after the code execution completes.\n * Even with ping/pong mechanisms, connections would be disconnected once the kernel's\n * requestExecute() context ended. Therefore, the implementation creates new socket connections\n * for each message send operation, which is more reliable than attempting to maintain\n * persistent but fragile connections.\n * \n * @param kernel2 - The kernel to execute the remote procedure on\n * @param message - The message to send (as a JSON string)\n * @param socketPath - Optional unix socket path (if provided, uses unix socket; otherwise uses websocket)\n * @param wsUrl - WebSocket URL (used if socketPath is not provided)\n */\n async function callRemoteSocketSend(\n kernel2: any,\n message: string,\n socketPath: string | null,\n wsUrl: string\n ): Promise<void> {\n if (socketPath) {\n await kernel2.requestExecute({ code: `\nwith unix_connect(\"${socketPath}\") as ws:\n ws.send(r\"\"\"${message}\"\"\")\n`\n }).done;\n } else {\n await kernel2.requestExecute({ code: `\nwith connect(\"${wsUrl}\") as ws:\n ws.send(r\"\"\"${message}\"\"\")\n`\n }).done;\n }\n }\n\n useEffect(() => {\n (async () => {\n return await KernelAPI.listRunning();\n })().then(async (kernels) => {\n // setKernels(kernels);\n console.log(\"Running kernels:\", kernels);\n\n const baseUrl = PageConfig.getBaseUrl();\n const token = PageConfig.getToken();\n console.log(`Base URL: ${baseUrl}`);\n console.log(`Token: ${token}`);\n const settings = ServerConnection.makeSettings({\n baseUrl: baseUrl, //'http://localhost:8889/',\n token: token, //'7e89be30eb93ee7c149a839d4c7577e08c2c25b3c7f14647',\n appendToken: true,\n });\n\n const kernelManager = new KernelManager({ serverSettings: settings });\n const kernel2 = await kernelManager.startNew({ name: 'python3' });\n console.log(\"Started new kernel:\", kernel2, props.kernelId);\n await kernel2.requestExecute({ code: `from websockets.sync.client import unix_connect, connect` }).done;\n\n const wsUrl = `ws://localhost:${props.wsPort}/`;\n const socketPath = props.socketPath || null;\n\n const kernel = new KernelConnection({\n model: { name: 'python3', id: props.kernelId || kernels[0]['id']},\n serverSettings: settings,\n });\n console.log(\"Connected to kernel:\", kernel);\n\n async function ggbOnLoad(api: any) {\n console.log(\"GeoGebra applet loaded:\", api);\n\n var resize = function() {\n const wrapperDiv = document.getElementById('ggb-element');\n const parentDiv = wrapperDiv?.parentElement\n const width = parseInt(parentDiv?.style.width || \"800\");\n const height = parseInt(parentDiv?.style.height || \"600\");\n // console.log(\"Window resized:\", width, height);\n api.recalculateEnvironments()\n api.setSize(width, height);\n }\n window.addEventListener('resize', resize);\n resize();\n\n const comm = kernel.createComm(props.commTarget || 'test');\n comm.open('HELO from GGB').done;\n // comm.send('HELO2').done\n\n // kernel.registerCommTarget('test', (comm, commMsg) => {\n // console.log(\"Comm opened from kernel with message:\", commMsg['content']['data']);\n \n addEventListener('close', () => {\n // comm.close().done;\n // kernel.shutdown().catch(err => console.error(err));\n kernel2.shutdown().catch(err => console.error(err));\n console.log(\"Kernel and comm closed.\");\n window.removeEventListener('resize', resize);\n });\n\n comm.onMsg = async (msg) => {\n console.log(\"Message received from server:\", msg['content']['data']);\n\n const command = JSON.parse(msg.content.data as any);\n console.log(\"Parsed command:\", command.type, command.payload);\n \n var rmsg: any = null;\n if (command.type === \"command\") {\n var label = api.evalCommandGetLabels(command.payload); // GeoGebraにコマンドを適用\n \n rmsg = JSON.stringify({\n \"type\": \"created\",\n \"id\": command.id, \n \"payload\": label\n }); // .replace(/'/g, \"\\\\'\");\n } else if (command.type === \"function\") {\n var apiName = command.payload.name;\n console.log(apiName);\n var value: any[] = [];\n // if (command.payload.args == null) {\n // value = api[apiName]();\n // } else \n {\n var args = command.payload.args;\n value = [];\n (Array.isArray(apiName) ? apiName : [apiName]).forEach((f: string) => {\n console.log(f, args);\n if (isArrayOfArrays(args)) {\n var value2: any[] = [];\n args.forEach((arg2: any[]) => {\n if (args) {\n value2.push(api[f](...arg2) || null);\n } else {\n value2.push(api[f]() || null);\n }\n });\n value.push(value2);\n } else {\n if (args) {\n value.push(api[f](...args) || null);\n } else {\n value.push(api[f]() || null);\n }\n }\n });\n value = (Array.isArray(apiName) ? value : value[0]);\n console.log(\"Function value:\", value);\n }\n rmsg = JSON.stringify({\n \"type\": \"value\",\n \"id\": command.id,\n \"payload\": {\n //\"label\": command.payload,\n \"value\": value\n }\n }); // .replace(/'/g, \"\\\\'\");\n }\n comm.send(rmsg);\n await callRemoteSocketSend(kernel2, rmsg, socketPath, wsUrl);\n }\n\n // var clientListener = function(data: any) {\n // // console.log(\"Add listener triggered for:\", data);\n // var msg = {\n // \"type\": \"add\",\n // \"payload\": data,\n // }\n // console.log(\"Add detected:\", JSON.stringify(msg));\n // comm.send(JSON.stringify(msg));\n // }\n // api.registerClientListener(clientListener);\n\n var addListener = async function(data: any) {\n // console.log(\"Add listener triggered for:\", data);\n var msg = {\n \"type\": \"add\",\n \"payload\": data, // {\n // \"label\": data, \n // \"details\": {\n // \"type\": api.getObjectType(data),\n // \"commandString\": api.getCommandString(data, false),\n // \"visible\": api.getVisible(data),\n // \"layer\": api.getLayer(data),\n // }\n // }\n }\n // console.log(\"Add detected:\", JSON.stringify(msg));\n await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);\n }\n api.registerAddListener(addListener);\n\n var removeListener = async function(data: any) {\n // console.log(\"Add listener triggered for:\", data);\n var msg = {\n \"type\": \"remove\",\n \"payload\": data,\n }\n // console.log(\"Remove detected:\", JSON.stringify(msg));\n await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);\n }\n api.registerRemoveListener(removeListener);\n\n var renameListener = async function(data: any) {\n // console.log(\"Add listener triggered for:\", data);\n var msg = {\n \"type\": \"rename\",\n \"payload\": data,\n }\n // console.log(\"Rename detected:\", JSON.stringify(msg));\n await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);\n }\n api.registerRenameListener(renameListener);\n\n var clearListener = async function(data: any) {\n // console.log(\"Add listener triggered for:\", data);\n var msg = {\n \"type\": \"clear\",\n \"payload\": data\n }\n // console.log(\"Rename detected:\", JSON.stringify(msg));\n await callRemoteSocketSend(kernel2, JSON.stringify(msg), socketPath, wsUrl);\n }\n api.registerClearListener(clearListener);\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n try {\n (node as HTMLElement).querySelectorAll('div.dialogMainPanel > div.dialogTitle').forEach((n) => {\n // console.log(n.textContent); 'Error'などのタイトルを検出\n ((node as HTMLElement).querySelector('div.dialogContent') as HTMLElement)\n .querySelectorAll(`[class$='Label']`).forEach(async (n2) => {\n // console.log(n2.textContent);\n const msg = JSON.stringify({\n \"type\": n.textContent,\n \"payload\": n2.textContent\n });\n // comm.send(msg);\n await callRemoteSocketSend(kernel2, msg, socketPath, wsUrl);\n })\n })\n } catch (e) {\n // console.log(e, node);\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true }); \n } \n\n const metaViewport = document.createElement('meta');\n metaViewport.name = \"viewport\";\n metaViewport.content = \"width=device-width, initial-scale=1\";\n document.head.appendChild(metaViewport);\n\n const scriptTag = document.createElement('script');\n scriptTag.src = 'https://cdn.geogebra.org/apps/deployggb.js';\n scriptTag.async = true;\n scriptTag.onload = () => {\n const params = {\n id: \"ggbApplet\", // アプレットのID\n appName: \"suite\", // GeoGebra Classicスマートアプレットを指定\n width: 800, // アプレットの横幅\n height: 600, // アプレットの高さ\n showToolBar: true, // ツールバーを表示\n showAlgebraInput: false, // 入力フィールドを表示\n showMenuBar: true, // メニューバーを表示\n autoHeight: true,\n // autoWidth: false,\n // scale: 2,\n allowUpscale: false,\n appletOnLoad: ggbOnLoad\n }\n applet = new (window as any).GGBApplet(params, true);\n applet.inject(\"ggb-element\");\n }\n document.body.appendChild(scriptTag);\n });\n\n return () => {\n // コンポーネントのアンマウント時にスクリプトとアプレットをクリーンアップ\n // document.head.removeChild(scriptTag);\n if (applet) {\n console.log(\"Cleaning up GeoGebra applet.\");\n // delete (window as any).applet;\n (window as any).ggbApplet.remove();\n applet = null;\n delete (window as any).GGBApplet;\n }\n };\n }, []);\n\n return (\n <div id=\"ggb-element\" ref={widgetRef} style={{width: \"100%\", height: \"100%\"}}></div>\n );\n};\n\ninterface GGAWidgetProps {\n kernelId?: string;\n commTarget?: string;\n insertMode?: DockLayout.InsertMode;\n wsPort?: number;\n socketPath?: string;\n}\n\n/**\n * A GeoGebra Lumino Widget that wraps a GeoGebraComponent.\n */\nexport class GeoGebraWidget extends ReactWidget {\n // private kernelId: string;\n // private commTarget: string;\n // private socketPath: string;\n private props: GGAWidgetProps | undefined;\n\n /**\n * Constructs a new GeoGebraWidget.\n */\n constructor(props?: GGAWidgetProps) {\n super();\n this.addClass('jp-ggblabWidget');\n this.props = props;\n // this.kernelId = props?.kernelId || '';\n // this.commTarget = props?.commTarget || '';\n // this.wsPort = props?.wsPort || 0;\n // this.socketPath = props?.socketPath || '';\n }\n\n render(): JSX.Element {\n return <GGAComponent kernelId={this.props?.kernelId} commTarget={this.props?.commTarget} wsPort={this.props?.wsPort} socketPath={this.props?.socketPath} />;\n }\n\n// protected onCloseRequest(msg: Message): void {\n// console.log(\"GeoGebraWidget is being closed.\");\n// super.onCloseRequest(msg);\n// // this.dispose();\n// }\n\n dispose(): void {\n console.log(\"GeoGebraWidget is being disposed.\");\n window.dispatchEvent(new Event('close'));\n // delete(window.ggbApplet);\n super.dispose();\n }\n}\n"],"names":[],"ignoreList":[],"sourceRoot":""}