Exemple #1
0
        public IEnumerable <FilePath> Visit(WorkbookPage page)
        {
            if (page == null)
            {
                throw new ArgumentNullException(nameof(page));
            }

            foreach (var cell in page.Contents)
            {
                switch (cell)
                {
                case MarkdownCell markdownCell:
                    foreach (var dependency in Visit(markdownCell))
                    {
                        yield return(dependency);
                    }
                    break;

                case CodeCell codeCell:
                    foreach (var dependency in Visit(codeCell))
                    {
                        yield return(dependency);
                    }
                    break;
                }
            }
        }
Exemple #2
0
        public void TestWritingNewPackages()
        {
            var page           = new WorkbookPage(new WorkbookPackage());
            var packageVersion = "9.0.1";
            var package        = new InteractivePackageDescription("Fake.Package1", versionRange: packageVersion);

            page.Manifest.Packages = page.Manifest.Packages.Add(package);

            var writer = new StringWriter();

            page.Write(writer, null);
            var serializedPage = writer.ToString();

            var deserializedPage = new WorkbookPage(new WorkbookPackage());

            deserializedPage.Read(new StringReader(serializedPage));

            deserializedPage.Packages.Length.ShouldEqual(1);

            var deserializedPackage = deserializedPage.Packages [0];

            deserializedPackage.PackageId.ShouldEqual(package.PackageId);
            // Make sure this doesn't serialize as [9.0.1, )
            deserializedPackage.VersionRange.ShouldEqual(packageVersion);
        }
Exemple #3
0
        ReadResult ReadWorkbookPage(string resourceName)
        {
            var source = new StreamReader(TestHelpers.GetResource(resourceName)).ReadToEnd();

            var workbook = new WorkbookPage(new WorkbookPackage());

            workbook.Read(new StringReader(source));

            return(new ReadResult {
                Source = source, Page = workbook
            });
        }
        public void AppendCellToEmptyWorkbook()
        {
            var page = new WorkbookPage(new WorkbookPackage());

            page.Read(new StringReader(emptyWorkbookSource));
            page.Contents.AppendCell(new CodeCell("csharp", "2 + 2"));
            var writer = new StringWriter();

            page.Write(writer, null);
            writer.ToString().ShouldEqual(
                emptyWorkbookSource + "\n\n```csharp\n2 + 2\n```",
                ShouldEqualOptions.LineDiff);
        }
Exemple #5
0
        public XcbWorkbookPageView(
            XcbWebView webView,
            ClientSession clientSession,
            WorkbookPage workbookPage)
            : base(clientSession, workbookPage)
        {
            this.webView = webView
                           ?? throw new ArgumentNullException(nameof(webView));

            void ObserveWorkbookMutationModelChanges(dynamic self, dynamic args)
            => TableOfContentsNodeExtensions.RebuildFromJavaScript(workbookPage.TableOfContents, args [0]);

            webView.Document.Context.GlobalObject.xiexports.WorkbookMutationObserver.observeModelChanges(
                (ScriptAction)ObserveWorkbookMutationModelChanges);

            rendererContext = new RendererContext(clientSession, webView.Document);
            rendererContext.MemberReferenceRequested += OnRendererContextMemberReferenceRequested;
            rendererContext.AsyncRenderComplete      += (sender, e) => {
                var view = focusedCellState?.View;
                // Image rendering can happen asynchronously. If the last cell is evaluated, and
                // the focus has shifted to a new last cell, make sure the new last cell's
                // input doesn't get pushed out of the view by the image load.
                if (view != null && focusedWorkbookCell != null && focusedWorkbookCell.NextCell == null)
                {
                    SynchronizationContext.Current.Post(o => view.Focus(), null);
                }
            };

            clientSession.Workbook.EditorHub.Events.Subscribe(
                new Observer <EditorEvent> (HandleEditorEvent));

            var document = webView.Document;

            xiexports = document.Context.GlobalObject.xiexports;

            outputElement = document.CreateElement("main");
            outputElement.AddCssClass("interactive-workspace");
            outputElement.AddCssClass(HostEnvironment.OS == HostOS.macOS ? "is-mac" : "is-windows");
            outputElement.AddCssClass(
                $"session-kind-{clientSession.SessionKind.ToString ().ToLowerInvariant ()}");

            document.Body.AppendChild(outputElement);

            AppendFirstCellActions(outputElement);
        }
        public void SaveEmptyWorkbook(bool readEmptyWorkbookSource)
        {
            var writer = new StringWriter();
            var page   = new WorkbookPage(new WorkbookPackage());

            if (readEmptyWorkbookSource)
            {
                page.Read(new StringReader(emptyWorkbookSource));
            }
            else
            {
                page.Manifest.Guid = Guid.Parse(emptyWorkbookGuid);
            }
            page.Write(writer, null);
            writer.ToString().ShouldEqual(
                emptyWorkbookSource,
                ShouldEqualOptions.LineDiff);
        }
        public void InsertNewHeadCellInWorkbookWithManifest()
        {
            var page = new WorkbookPage(new WorkbookPackage());

            page.Read(new StringReader(emptyWorkbookSource + "\n\n# Head Cell"));
            // page.Contents =>
            //   [0]: MarkdownWorkbookEntry
            //
            // Simulate the first save with no changes: the issue here was that
            // the write left the manifest in the model, so subsequent writes
            // would insert a new manifest and write the previous one.
            page.Write(new StringWriter(), null);
            // page.Contents =>
            //   [0]: YamlMetadataWorkbookEntry (!! this was the bug)
            //   [1]: MarkdownWorkbookEntry
            //
            // Now insert a new head cell:
            page.Contents.InsertCellBefore(
                page.Contents.FirstCell,
                new CodeCell("csharp", "2 + 2"));
            // page.Contents =>
            //   [0]: CodeWorkbookEntry
            //   [1]: YamlMetadataWorkbookEntry
            //   [2]: MarkdownWorkbookEntry
            //
            // Now save again, and we'll get a new manifest entry at the head
            // since the previous one was left in the model and had a new cell
            // inserted before it.
            var writer = new StringWriter();

            page.Write(writer, null);
            // page.Contents =>
            //   [0]: YamlMetadataWorkbookEntry
            //   [1]: CodeWorkbookEntry
            //   [2]: YamlMetadataWorkbookEntry
            //   [3]: MarkdownWorkbookEntry
            writer.ToString().ShouldEqual(
                emptyWorkbookSource + "\n\n```csharp\n2 + 2\n```\n\n# Head Cell",
                ShouldEqualOptions.LineDiff);
        }
 public ConsoleWorkbookPageViewModel(ClientSession clientSession, WorkbookPage workbookPage)
     : base(clientSession, workbookPage)
 {
 }
Exemple #9
0
 public WorkbookPageViewModel CreatePageViewModel(
     ClientSession clientSession,
     WorkbookPage workbookPage)
 => new ConsoleWorkbookPageViewModel(clientSession, workbookPage);