From d744f7723d543659227c94e76b8f10c6841a5a0f Mon Sep 17 00:00:00 2001 From: brokun Date: Wed, 17 Apr 2024 11:34:16 +0800 Subject: [PATCH 1/2] fix: wrong spelling --- packages/libro-code-cell/src/code-cell-view.tsx | 6 +++--- .../src/command/libro-command-contribution.ts | 4 ++-- packages/libro-core/src/libro-context-key.ts | 2 +- packages/libro-core/src/libro-view.tsx | 4 ++-- packages/libro-core/src/module.ts | 4 ++-- .../keybind-instructions-view.tsx | 4 ++-- .../src/input-handler/chat-record-input.tsx | 4 ++-- .../src/input-handler/variable-name-input.tsx | 4 ++-- .../libro-prompt-cell/src/prompt-cell-view.tsx | 6 +++--- packages/libro-raw-cell/src/raw-cell-view.tsx | 6 +++--- packages/libro-search/src/libro-search-provider.ts | 4 ++-- packages/libro-search/src/libro-search-view.tsx | 4 ++-- packages/libro-widget/src/base/widget-view.tsx | 14 +++++++------- .../libro-widget/src/widgets/hbox-widget-view.tsx | 10 +++++----- .../src/widgets/instances-progress-widget-view.tsx | 6 +++--- .../src/widgets/progress-widget-view.tsx | 6 +++--- .../libro-widget/src/widgets/text-widget-view.tsx | 6 +++--- 17 files changed, 47 insertions(+), 47 deletions(-) diff --git a/packages/libro-code-cell/src/code-cell-view.tsx b/packages/libro-code-cell/src/code-cell-view.tsx index edcb6f27..b42579de 100644 --- a/packages/libro-code-cell/src/code-cell-view.tsx +++ b/packages/libro-code-cell/src/code-cell-view.tsx @@ -16,7 +16,7 @@ import { LibroExecutableCellView, LibroOutputArea, VirtualizedManagerHelper, - LirboContextKey, + LibroContextKey, } from '@difizen/libro-core'; import type { ViewSize } from '@difizen/mana-app'; import { Disposable } from '@difizen/mana-app'; @@ -103,7 +103,7 @@ const CodeEditorViewComponent = forwardRef( @view('code-editor-cell-view') export class LibroCodeCellView extends LibroExecutableCellView { protected toDisposeOnEditor = new DisposableCollection(); - @inject(LirboContextKey) protected readonly lirboContextKey: LirboContextKey; + @inject(LibroContextKey) protected readonly libroContextKey: LibroContextKey; override view = CodeEditorViewComponent; viewManager: ViewManager; @@ -292,7 +292,7 @@ export class LibroCodeCellView extends LibroExecutableCellView { this.editorView.editorStatus === 'ready' && this.parent.model.active?.id === this.id && !this.parent.model.commandMode && - this.lirboContextKey.commandModeEnabled === true && // 排除弹窗等情况 + this.libroContextKey.commandModeEnabled === true && // 排除弹窗等情况 this.parent.model.readOnly === false ) { this.editorView?.editor.setOption('styleActiveLine', true); diff --git a/packages/libro-core/src/command/libro-command-contribution.ts b/packages/libro-core/src/command/libro-command-contribution.ts index a4f32f03..eca6c42c 100644 --- a/packages/libro-core/src/command/libro-command-contribution.ts +++ b/packages/libro-core/src/command/libro-command-contribution.ts @@ -11,7 +11,7 @@ import { v4 } from 'uuid'; import { LibroCellView, ExecutableCellModel, EditorCellView } from '../cell/index.js'; import type { LibroEditorCellView } from '../cell/index.js'; -import { LirboContextKey } from '../libro-context-key.js'; +import { LibroContextKey } from '../libro-context-key.js'; import type { CellView, NotebookView } from '../libro-protocol.js'; import { LibroToolbarArea } from '../libro-protocol.js'; import { LibroService } from '../libro-service.js'; @@ -29,7 +29,7 @@ export class LibroCommandContribution implements CommandContribution { @inject(ModalService) protected readonly modalService: ModalService; @inject(LibroCommandRegister) protected readonly libroCommand: LibroCommandRegister; @inject(LibroService) protected readonly libroService: LibroService; - @inject(LirboContextKey) protected readonly lirboContextKey: LirboContextKey; + @inject(LibroContextKey) protected readonly libroContextKey: LibroContextKey; registerCommands(command: CommandRegistry): void { this.libroCommand.registerLibroCommand(command, NotebookCommands['EnterEditMode'], { diff --git a/packages/libro-core/src/libro-context-key.ts b/packages/libro-core/src/libro-context-key.ts index 20972029..dd42e839 100644 --- a/packages/libro-core/src/libro-context-key.ts +++ b/packages/libro-core/src/libro-context-key.ts @@ -7,7 +7,7 @@ import { LibroContextKeys } from './libro-protocol.js'; import { LibroService } from './libro-service.js'; @singleton() -export class LirboContextKey { +export class LibroContextKey { protected readonly contextKeyService: ContextKeyService; protected readonly libroService: LibroService; protected toDisposeOnActiveChanged?: Disposable; diff --git a/packages/libro-core/src/libro-view.tsx b/packages/libro-core/src/libro-view.tsx index a689b01d..8d660481 100644 --- a/packages/libro-core/src/libro-view.tsx +++ b/packages/libro-core/src/libro-view.tsx @@ -49,7 +49,7 @@ import { DndList, } from './components/index.js'; import { LibroViewHeader } from './components/libro-view-header.js'; -import { LirboContextKey } from './libro-context-key.js'; +import { LibroContextKey } from './libro-context-key.js'; import { LibroModel } from './libro-model.js'; import { NotebookService, notebookViewFactoryId } from './libro-protocol.js'; import type { @@ -295,7 +295,7 @@ export class LibroView extends BaseView implements NotebookView { @inject(CellService) cellService: CellService; @inject(LibroService) libroService: LibroService; @inject(LibroSlotManager) libroSlotManager: LibroSlotManager; - @inject(LirboContextKey) contextKey: LirboContextKey; + @inject(LibroContextKey) contextKey: LibroContextKey; @inject(ViewManager) protected viewManager: ViewManager; @inject(ConfigurationService) protected configurationService: ConfigurationService; diff --git a/packages/libro-core/src/module.ts b/packages/libro-core/src/module.ts index 033a7ff0..14ef3f5b 100644 --- a/packages/libro-core/src/module.ts +++ b/packages/libro-core/src/module.ts @@ -22,7 +22,7 @@ import { } from './components/index.js'; import { LibroContentModule } from './content/index.js'; import { LibroFormatterModule } from './formatter/index.js'; -import { LirboContextKey } from './libro-context-key.js'; +import { LibroContextKey } from './libro-context-key.js'; import { LibroModel } from './libro-model.js'; import { ModelFactory, @@ -46,7 +46,7 @@ export const LibroModule = ManaModule.create() BaseWorkspaceService, VirtualizedManager, LibroService, - LirboContextKey, + LibroContextKey, LibroModel, LibroView, LibroSettingContribution, diff --git a/packages/libro-jupyter/src/keybind-instructions/keybind-instructions-view.tsx b/packages/libro-jupyter/src/keybind-instructions/keybind-instructions-view.tsx index 53cea9e9..4ae9e3b0 100644 --- a/packages/libro-jupyter/src/keybind-instructions/keybind-instructions-view.tsx +++ b/packages/libro-jupyter/src/keybind-instructions/keybind-instructions-view.tsx @@ -1,4 +1,4 @@ -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import { inject, singleton } from '@difizen/mana-app'; import { getOrigin, prop, useInject } from '@difizen/mana-app'; import type { ModalItem, ModalItemProps } from '@difizen/mana-app'; @@ -49,7 +49,7 @@ const getSearchResult = ( @singleton() export class KeybindInstrutionsService implements Disposable { - @inject(LirboContextKey) contextKey: LirboContextKey; + @inject(LibroContextKey) contextKey: LibroContextKey; isKeybindInstructionsMask = false; @prop() searchCommandModeData: DataType[] = []; @prop() searchEditModeData: DataType[] = []; diff --git a/packages/libro-prompt-cell/src/input-handler/chat-record-input.tsx b/packages/libro-prompt-cell/src/input-handler/chat-record-input.tsx index 25c5710a..a937cb0b 100644 --- a/packages/libro-prompt-cell/src/input-handler/chat-record-input.tsx +++ b/packages/libro-prompt-cell/src/input-handler/chat-record-input.tsx @@ -1,5 +1,5 @@ import { EditFilled } from '@ant-design/icons'; -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import { useInject } from '@difizen/mana-app'; import { Select, Tag } from 'antd'; import classNames from 'classnames'; @@ -25,7 +25,7 @@ export const ChatRecordInput: FC = ( const selectRef = useRef(null); const [selecting, setSelecting] = useState(false); const ref = useRef(null); - const contextKey = useInject(LirboContextKey); + const contextKey = useInject(LibroContextKey); useEffect(() => { if (selecting) { diff --git a/packages/libro-prompt-cell/src/input-handler/variable-name-input.tsx b/packages/libro-prompt-cell/src/input-handler/variable-name-input.tsx index 96fd3840..15edced4 100644 --- a/packages/libro-prompt-cell/src/input-handler/variable-name-input.tsx +++ b/packages/libro-prompt-cell/src/input-handler/variable-name-input.tsx @@ -1,5 +1,5 @@ import { EditFilled } from '@ant-design/icons'; -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import { useInject } from '@difizen/mana-app'; import { l10n } from '@difizen/mana-l10n'; import { Input, Popover } from 'antd'; @@ -80,7 +80,7 @@ export const VariableNameInput: FC = ( ) => { const { value } = props; const [popoverVisible, setPopoverVisible] = useState(false); - const contextKey = useInject(LirboContextKey); + const contextKey = useInject(LibroContextKey); const ref = useRef(null); return (
diff --git a/packages/libro-prompt-cell/src/prompt-cell-view.tsx b/packages/libro-prompt-cell/src/prompt-cell-view.tsx index 987245e0..be6c57a5 100644 --- a/packages/libro-prompt-cell/src/prompt-cell-view.tsx +++ b/packages/libro-prompt-cell/src/prompt-cell-view.tsx @@ -17,7 +17,7 @@ import { LibroExecutableCellView, LibroViewTracker, EditorStatus, - LirboContextKey, + LibroContextKey, } from '@difizen/libro-core'; import type { ExecutionMeta, KernelMessage } from '@difizen/libro-jupyter'; import { KernelError, LibroJupyterModel } from '@difizen/libro-jupyter'; @@ -214,7 +214,7 @@ const PropmtEditorViewComponent = React.forwardRef( @transient() @view('prompt-editor-cell-view') export class LibroPromptCellView extends LibroExecutableCellView { - @inject(LirboContextKey) protected lirboContextKey: LirboContextKey; + @inject(LibroContextKey) protected libroContextKey: LibroContextKey; override view = PropmtEditorViewComponent; declare model: LibroPromptCellModel; @@ -410,7 +410,7 @@ export class LibroPromptCellView extends LibroExecutableCellView { this.editorView.editorStatus === 'ready' && this.parent.model.active?.id === this.id && !this.parent.model.commandMode && - this.lirboContextKey.commandModeEnabled === true && // 排除弹窗等情况 + this.libroContextKey.commandModeEnabled === true && // 排除弹窗等情况 this.parent.model.readOnly === false ) { this.editorView?.editor.setOption('styleActiveLine', true); diff --git a/packages/libro-raw-cell/src/raw-cell-view.tsx b/packages/libro-raw-cell/src/raw-cell-view.tsx index 88b55d9d..a1ea172e 100644 --- a/packages/libro-raw-cell/src/raw-cell-view.tsx +++ b/packages/libro-raw-cell/src/raw-cell-view.tsx @@ -3,7 +3,7 @@ import type { CodeEditorViewOptions, CodeEditorView } from '@difizen/libro-code-editor'; import { CodeEditorManager } from '@difizen/libro-code-editor'; import type { CellViewOptions } from '@difizen/libro-core'; -import { CellService, LibroEditorCellView, LirboContextKey } from '@difizen/libro-core'; +import { CellService, LibroEditorCellView, LibroContextKey } from '@difizen/libro-core'; import { getOrigin, prop, useInject, watch } from '@difizen/mana-app'; import { view, @@ -43,7 +43,7 @@ const CodeEditorViewComponent = React.forwardRef( @transient() @view('raw-cell-view') export class LibroRawCellView extends LibroEditorCellView { - @inject(LirboContextKey) protected readonly lirboContextKey: LirboContextKey; + @inject(LibroContextKey) protected readonly libroContextKey: LibroContextKey; declare model: LibroRawCellModel; override view = CodeEditorViewComponent; @@ -126,7 +126,7 @@ export class LibroRawCellView extends LibroEditorCellView { this.editorView.editorStatus === 'ready' && this.parent.model.active?.id === this.id && !this.parent.model.commandMode && - this.lirboContextKey.commandModeEnabled === true && // 排除弹窗等情况 + this.libroContextKey.commandModeEnabled === true && // 排除弹窗等情况 this.parent.model.readOnly === false ) { this.editorView?.editor.setOption('styleActiveLine', true); diff --git a/packages/libro-search/src/libro-search-provider.ts b/packages/libro-search/src/libro-search-provider.ts index 5f59c8a2..2597bbcc 100644 --- a/packages/libro-search/src/libro-search-provider.ts +++ b/packages/libro-search/src/libro-search-provider.ts @@ -4,7 +4,7 @@ import { EditorCellView, LibroView, VirtualizedManagerHelper, - LirboContextKey, + LibroContextKey, } from '@difizen/libro-core'; import { inject, prop, transient, equals } from '@difizen/mana-app'; import { Deferred, DisposableCollection } from '@difizen/mana-app'; @@ -40,7 +40,7 @@ export const LibroSearchProviderFactory = Symbol('LibroSearchProviderFactory'); */ @transient() export class LibroSearchProvider extends AbstractSearchProvider { - @inject(LirboContextKey) contextKey: LirboContextKey; + @inject(LibroContextKey) contextKey: LibroContextKey; @inject(LibroCellSearchProvider) libroCellSearchProvider: LibroCellSearchProvider; protected cellsChangeDeferred: Deferred | undefined; diff --git a/packages/libro-search/src/libro-search-view.tsx b/packages/libro-search/src/libro-search-view.tsx index 4b4b64e8..df8828e9 100644 --- a/packages/libro-search/src/libro-search-view.tsx +++ b/packages/libro-search/src/libro-search-view.tsx @@ -7,7 +7,7 @@ import { RightOutlined, } from '@ant-design/icons'; import type { LibroView } from '@difizen/libro-core'; -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import { prop, useInject, useObserve, watch } from '@difizen/mana-app'; import { BaseView, view, ViewInstance } from '@difizen/mana-app'; import { inject, transient } from '@difizen/mana-app'; @@ -222,7 +222,7 @@ export const SearchComponent = forwardRef(function SearchCompone @view('libro-search-view') export class LibroSearchView extends BaseView { findInputRef?: React.RefObject | null; - @inject(LirboContextKey) contextKey: LirboContextKey; + @inject(LibroContextKey) contextKey: LibroContextKey; @inject(LibroSearchUtils) utils: LibroSearchUtils; @inject(LibroSearchProviderFactory) searchProviderFactory: LibroSearchProviderFactory; libro?: LibroView; diff --git a/packages/libro-widget/src/base/widget-view.tsx b/packages/libro-widget/src/base/widget-view.tsx index d5806d90..8fb04031 100644 --- a/packages/libro-widget/src/base/widget-view.tsx +++ b/packages/libro-widget/src/base/widget-view.tsx @@ -1,5 +1,5 @@ import type { JSONValue } from '@difizen/libro-common'; -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import type { KernelMessage } from '@difizen/libro-kernel'; import { inject, transient, ViewOption, view, BaseView } from '@difizen/mana-app'; import type { ViewComponent } from '@difizen/mana-app'; @@ -26,27 +26,27 @@ export const LibroWidgetComponent = forwardRef( @view('libro-widget-view') export class WidgetView extends BaseView implements IWidgetView { override view: ViewComponent = LibroWidgetComponent; - lirboContextKey: LirboContextKey; + libroContextKey: LibroContextKey; disableCommandMode = true; constructor( @inject(ViewOption) props: IWidgetViewProps, - @inject(LirboContextKey) lirboContextKey: LirboContextKey, + @inject(LibroContextKey) libroContextKey: LibroContextKey, ) { super(); this.initialize(props); - this.lirboContextKey = lirboContextKey; + this.libroContextKey = libroContextKey; } override onViewMount() { if (this.container && this.container.current && this.disableCommandMode) { this.container.current.addEventListener('focusin', () => { - this.lirboContextKey.disableCommandMode(); + this.libroContextKey.disableCommandMode(); }); this.container.current.addEventListener('blur', (e) => { if (this.container?.current?.contains(e.relatedTarget as Node)) { - this.lirboContextKey.disableCommandMode(); + this.libroContextKey.disableCommandMode(); } else { - this.lirboContextKey.enableCommandMode(); + this.libroContextKey.enableCommandMode(); } }); } diff --git a/packages/libro-widget/src/widgets/hbox-widget-view.tsx b/packages/libro-widget/src/widgets/hbox-widget-view.tsx index 19a0fb20..73e6b755 100644 --- a/packages/libro-widget/src/widgets/hbox-widget-view.tsx +++ b/packages/libro-widget/src/widgets/hbox-widget-view.tsx @@ -1,3 +1,4 @@ +import { LibroContextKey } from '@difizen/libro-core'; import { view, ViewOption, @@ -9,11 +10,10 @@ import { } from '@difizen/mana-app'; import { forwardRef } from 'react'; +import { LibroWidgets } from '../base/libro-widgets.js'; import type { IWidgetViewProps } from '../base/protocal.js'; import { WidgetView } from '../base/widget-view.js'; import './index.less'; -import { LibroWidgets } from '../base/libro-widgets.js'; -import { LirboContextKey } from '@difizen/libro-core'; export const HBoxWidgetComponent = forwardRef( function HBoxWidgetComponent() { @@ -41,14 +41,14 @@ export class HBoxWidget extends WidgetView { override libroWidgets: LibroWidgets; constructor( @inject(ViewOption) props: IWidgetViewProps, - @inject(LirboContextKey) lirboContextKey: LirboContextKey, + @inject(LibroContextKey) libroContextKey: LibroContextKey, @inject(LibroWidgets) libroWidgets: LibroWidgets, ) { - super(props, lirboContextKey); + super(props, libroContextKey); this.box_style = props.attributes.bar_style; this.layout = props.attributes.layout; this.children = props.attributes.children; - this.lirboContextKey = lirboContextKey; + this.libroContextKey = libroContextKey; this.libroWidgets = libroWidgets; } diff --git a/packages/libro-widget/src/widgets/instances-progress-widget-view.tsx b/packages/libro-widget/src/widgets/instances-progress-widget-view.tsx index 611d79b8..ce35a07f 100644 --- a/packages/libro-widget/src/widgets/instances-progress-widget-view.tsx +++ b/packages/libro-widget/src/widgets/instances-progress-widget-view.tsx @@ -1,4 +1,4 @@ -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import type { KernelMessage } from '@difizen/libro-kernel'; import { useInject, @@ -70,9 +70,9 @@ export class InstancesProgressWidget extends WidgetView { modalProgressItemKey = ''; constructor( @inject(ViewOption) props: IWidgetViewProps, - @inject(LirboContextKey) lirboContextKey: LirboContextKey, + @inject(LibroContextKey) libroContextKey: LibroContextKey, ) { - super(props, lirboContextKey); + super(props, libroContextKey); this.prefix = props.attributes.prefix; this.suffix = props.attributes.suffix; } diff --git a/packages/libro-widget/src/widgets/progress-widget-view.tsx b/packages/libro-widget/src/widgets/progress-widget-view.tsx index 0b66b4ca..0c5d05f3 100644 --- a/packages/libro-widget/src/widgets/progress-widget-view.tsx +++ b/packages/libro-widget/src/widgets/progress-widget-view.tsx @@ -1,4 +1,4 @@ -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import type { KernelMessage } from '@difizen/libro-kernel'; import { view, @@ -51,9 +51,9 @@ export class ProgressWidget extends WidgetView { value: number; constructor( @inject(ViewOption) props: IWidgetViewProps, - @inject(LirboContextKey) lirboContextKey: LirboContextKey, + @inject(LibroContextKey) libroContextKey: LibroContextKey, ) { - super(props, lirboContextKey); + super(props, libroContextKey); this.bar_style = props.attributes.bar_style; this.description = props.attributes.description; this.description_tooltip = props.attributes.description_tooltip; diff --git a/packages/libro-widget/src/widgets/text-widget-view.tsx b/packages/libro-widget/src/widgets/text-widget-view.tsx index 572b35e0..6e841126 100644 --- a/packages/libro-widget/src/widgets/text-widget-view.tsx +++ b/packages/libro-widget/src/widgets/text-widget-view.tsx @@ -1,4 +1,4 @@ -import { LirboContextKey } from '@difizen/libro-core'; +import { LibroContextKey } from '@difizen/libro-core'; import { view, ViewOption, @@ -68,9 +68,9 @@ export class LibroTextWidget extends WidgetView { value: number; constructor( @inject(ViewOption) props: IWidgetViewProps, - @inject(LirboContextKey) lirboContextKey: LirboContextKey, + @inject(LibroContextKey) libroContextKey: LibroContextKey, ) { - super(props, lirboContextKey); + super(props, libroContextKey); this.bar_style = props.attributes.bar_style; this.description = props.attributes.description; this.description_tooltip = props.attributes.description_tooltip; From cb1541b41cc1eb2c3f8fdf395daeaabe77214277 Mon Sep 17 00:00:00 2001 From: brokun Date: Wed, 17 Apr 2024 14:47:42 +0800 Subject: [PATCH 2/2] feat(jupyter): integrate jupyter-widgets --- .changeset/tiny-cobras-bake.md | 33 +++++++++++++ packages/libro-jupyter/package.json | 1 + packages/libro-jupyter/src/module.ts | 4 ++ packages/libro-jupyter/src/widget/index.less | 7 +++ packages/libro-jupyter/src/widget/index.ts | 2 + .../src/widget/widget-render.tsx | 47 +++++++++++++++++++ .../widget/widget-rendermime-contribution.ts | 35 ++++++++++++++ .../src/kernel/kernel-connection.ts | 2 +- 8 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 .changeset/tiny-cobras-bake.md create mode 100644 packages/libro-jupyter/src/widget/index.less create mode 100644 packages/libro-jupyter/src/widget/index.ts create mode 100644 packages/libro-jupyter/src/widget/widget-render.tsx create mode 100644 packages/libro-jupyter/src/widget/widget-rendermime-contribution.ts diff --git a/.changeset/tiny-cobras-bake.md b/.changeset/tiny-cobras-bake.md new file mode 100644 index 00000000..4b2ba891 --- /dev/null +++ b/.changeset/tiny-cobras-bake.md @@ -0,0 +1,33 @@ +--- +"@difizen/libro-cofine-editor-contribution": patch +"@difizen/libro-cofine-editor-core": patch +"@difizen/libro-search-code-cell": patch +"@difizen/libro-cofine-textmate": patch +"@difizen/libro-language-client": patch +"@difizen/libro-cofine-editor": patch +"@difizen/libro-markdown-cell": patch +"@difizen/libro-shared-model": patch +"@difizen/libro-code-editor": patch +"@difizen/libro-prompt-cell": patch +"@difizen/libro-virtualized": patch +"@difizen/libro-codemirror": patch +"@difizen/libro-rendermime": patch +"@difizen/libro-code-cell": patch +"@difizen/libro-markdown": patch +"@difizen/libro-raw-cell": patch +"@difizen/libro-terminal": patch +"@difizen/libro-jupyter": patch +"@difizen/libro-common": patch +"@difizen/libro-kernel": patch +"@difizen/libro-output": patch +"@difizen/libro-search": patch +"@difizen/libro-widget": patch +"@difizen/libro-core": patch +"@difizen/libro-l10n": patch +"@difizen/libro-lab": patch +"@difizen/libro-lsp": patch +"@difizen/libro-toc": patch +"@difizen/libro-docs": patch +--- + +Jupyter: integrate jupyter-widgets diff --git a/packages/libro-jupyter/package.json b/packages/libro-jupyter/package.json index 3181e626..03dde5e2 100644 --- a/packages/libro-jupyter/package.json +++ b/packages/libro-jupyter/package.json @@ -60,6 +60,7 @@ "@difizen/libro-markdown-cell": "^0.1.30", "@difizen/libro-raw-cell": "^0.1.30", "@difizen/libro-language-client": "^0.1.30", + "@difizen/libro-widget": "^0.1.30", "@difizen/mana-app": "latest", "@difizen/mana-l10n": "latest", "@ant-design/colors": "^7.0.0", diff --git a/packages/libro-jupyter/src/module.ts b/packages/libro-jupyter/src/module.ts index edd88a48..e412897f 100644 --- a/packages/libro-jupyter/src/module.ts +++ b/packages/libro-jupyter/src/module.ts @@ -25,6 +25,7 @@ import { import { RawCellModule } from '@difizen/libro-raw-cell'; import { LibroSearchModule } from '@difizen/libro-search'; import { SearchCodeCellModule } from '@difizen/libro-search-code-cell'; +import { WidgetModule } from '@difizen/libro-widget'; import { ManaModule } from '@difizen/mana-app'; import { LibroBetweenCellModule } from './add-between-cell/index.js'; @@ -56,6 +57,7 @@ import { LibroJupyterToolbarContribution, SaveFileErrorContribution, } from './toolbar/index.js'; +import { LibroWidgetMimeContribution } from './widget/index.js'; export const LibroJupyterModule = ManaModule.create() .register( @@ -74,6 +76,7 @@ export const LibroJupyterModule = ManaModule.create() LibroJupyterSettingContribution, JupyterServerLaunchManager, LibroJupyterView, + LibroWidgetMimeContribution, { token: CellExecutionTimeProvider, useValue: CellExecutionTip, @@ -114,4 +117,5 @@ export const LibroJupyterModule = ManaModule.create() PlotlyModule, LibroJupyterFileModule, LibroLanguageClientModule, + WidgetModule, ); diff --git a/packages/libro-jupyter/src/widget/index.less b/packages/libro-jupyter/src/widget/index.less new file mode 100644 index 00000000..da2971f3 --- /dev/null +++ b/packages/libro-jupyter/src/widget/index.less @@ -0,0 +1,7 @@ +.libro-widget-render { + margin: 10px 24px; +} + +.libro-widget-render:empty { + margin: unset; +} diff --git a/packages/libro-jupyter/src/widget/index.ts b/packages/libro-jupyter/src/widget/index.ts new file mode 100644 index 00000000..edb5f0ab --- /dev/null +++ b/packages/libro-jupyter/src/widget/index.ts @@ -0,0 +1,2 @@ +export * from './widget-render.js'; +export * from './widget-rendermime-contribution.js'; diff --git a/packages/libro-jupyter/src/widget/widget-render.tsx b/packages/libro-jupyter/src/widget/widget-render.tsx new file mode 100644 index 00000000..2b955b86 --- /dev/null +++ b/packages/libro-jupyter/src/widget/widget-render.tsx @@ -0,0 +1,47 @@ +import type { BaseOutputView } from '@difizen/libro-core'; +import { RenderMimeRegistry } from '@difizen/libro-rendermime'; +import type { IRenderMimeRegistry } from '@difizen/libro-rendermime'; +import { LibroWidgetManager } from '@difizen/libro-widget'; +import { getOrigin, useInject, ViewRender } from '@difizen/mana-app'; +import React from 'react'; +import './index.less'; + +import { LibroJupyterModel } from '../libro-jupyter-model.js'; + +export const WidgetRender: React.FC<{ model: BaseOutputView }> = (props: { + model: BaseOutputView; +}) => { + const { model } = props; + + const widgetManager = useInject(LibroWidgetManager); + const defaultRenderMime = useInject(RenderMimeRegistry); + const libro = model.cell.parent; + if (!(libro.model instanceof LibroJupyterModel) || !libro.model.kernelConnection) { + return null; + } + const widgets = widgetManager.getOrCreateWidgets( + getOrigin(libro.model.kernelConnection), + ); + const mimeType = defaultRenderMime.preferredMimeType(model); + if (mimeType) { + const model_id = JSON.parse(JSON.stringify(model.data[mimeType])).model_id; + if (model_id) { + const widgetView = widgets.getModel(model_id); + if (widgetView.isCommClosed) { + return null; + } + return ( +
+
+ +
+
+ ); + } + } + return ( +
+
+
+ ); +}; diff --git a/packages/libro-jupyter/src/widget/widget-rendermime-contribution.ts b/packages/libro-jupyter/src/widget/widget-rendermime-contribution.ts new file mode 100644 index 00000000..4e4310cf --- /dev/null +++ b/packages/libro-jupyter/src/widget/widget-rendermime-contribution.ts @@ -0,0 +1,35 @@ +import type { BaseOutputView } from '@difizen/libro-core'; +import { RenderMimeContribution } from '@difizen/libro-rendermime'; +import { LibroWidgetManager } from '@difizen/libro-widget'; +import { inject, singleton } from '@difizen/mana-app'; + +import { LibroJupyterModel } from '../libro-jupyter-model.js'; + +import { WidgetRender } from './widget-render.js'; + +@singleton({ contrib: RenderMimeContribution }) +export class LibroWidgetMimeContribution implements RenderMimeContribution { + @inject(LibroWidgetManager) libroWidgetManager: LibroWidgetManager; + canHandle = (model: BaseOutputView) => { + const libroModel = model.cell.parent.model; + let rank = 0; + if (libroModel instanceof LibroJupyterModel && libroModel.kernelConnection) { + const kc = libroModel.kernelConnection; + const widget = this.libroWidgetManager.getOrCreateWidgets(kc); + this.mimeTypes.forEach((mimeType) => { + const mimeData = model.data[mimeType]; + if (mimeData && mimeData !== null) { + const data = JSON.parse(JSON.stringify(mimeData)).model_id; + if (Object.keys(model.data).includes(mimeType) && widget.hasModel(data)) { + rank = 100; + } + } + }); + } + return rank; + }; + renderType = 'widgetRenderer'; + safe = true; + mimeTypes = ['application/vnd.jupyter.widget-view+json']; + render = WidgetRender; +} diff --git a/packages/libro-kernel/src/kernel/kernel-connection.ts b/packages/libro-kernel/src/kernel/kernel-connection.ts index 3b92f992..4cc51837 100644 --- a/packages/libro-kernel/src/kernel/kernel-connection.ts +++ b/packages/libro-kernel/src/kernel/kernel-connection.ts @@ -1287,7 +1287,7 @@ export class KernelConnection implements IKernelConnection { // Close the comm asynchronously. We cannot block message processing on // kernel messages to wait for another kernel message. comm.close(); - console.error('Exception opening new comm'); + console.error('Exception opening new comm', e); throw e; } }