TemplateDesigner: Redesign des TemplateSkripts

This commit is contained in:
2026-09-01 10:07:25 +02:00
parent 95e3f677e4
commit b2d0ccd30d
12 changed files with 807 additions and 55 deletions
@@ -70,4 +70,40 @@ public sealed class OverlayEditorTests
Assert.Equal(200, viewModel.OverlayPageHeight);
Assert.Equal("pt", viewModel.OverlayPageUnit);
}
[Fact]
public void FlowSlotVerschieben_AendertNurDasPragmaDerAusgewaehltenSeite()
{
var viewModel = new DesignerViewModel();
var layout = new LehrerApp.Templating.LayoutParser().Parse(viewModel.LayoutSource);
var firstSlot = layout.PageTemplates.Single(x => x.Name == "first").FlowSlots.Single();
var continuationSlot = layout.PageTemplates.Single(x => x.Name == "continuation").FlowSlots.Single();
viewModel.ApplyElementGeometry(new(firstSlot.Line, "FLOW", 25, 95, 160, 165));
var updated = new LehrerApp.Templating.LayoutParser().Parse(viewModel.LayoutSource);
var updatedFirst = updated.PageTemplates.Single(x => x.Name == "first").FlowSlots.Single();
var updatedContinuation = updated.PageTemplates.Single(x => x.Name == "continuation").FlowSlots.Single();
Assert.Equal(25, updatedFirst.X);
Assert.Equal(95, updatedFirst.Y);
Assert.Equal(continuationSlot.X, updatedContinuation.X);
Assert.Equal(continuationSlot.Y, updatedContinuation.Y);
}
[Fact]
public void ElementKannGezieltInContentFlowEingefuegtWerden()
{
var viewModel = new DesignerViewModel
{
NewElementScope = "Content-Flow", SelectedContentFlow = "body",
NewElementType = "TEXT", NewContent = "Nachsatz", NewAttributes = "gap=5",
};
viewModel.AddElement();
var flow = new LehrerApp.Templating.LayoutParser().Parse(viewModel.LayoutSource).ContentFlows.Single();
var text = Assert.IsType<LehrerApp.Templating.TextElement>(flow.Elements.Last());
Assert.Equal("Nachsatz", text.Content);
Assert.Equal("5", text.Attributes["gap"]);
}
}
@@ -17,7 +17,9 @@ public sealed class ProjectLifecycleTests
viewModel.Reset();
Assert.Equal("neue-vorlage", viewModel.TemplateId);
Assert.Equal("PAGE 210 297 mm\n", viewModel.LayoutSource);
Assert.Contains("#pragma page-template first", viewModel.LayoutSource);
Assert.Contains("#pragma page-template continuation", viewModel.LayoutSource);
Assert.Contains("#pragma content-flow body", viewModel.LayoutSource);
Assert.Empty(viewModel.Placeholders);
Assert.Empty(viewModel.Assets);
Assert.Empty(viewModel.AssetItems);
@@ -91,6 +93,21 @@ public sealed class ProjectLifecycleTests
Assert.Contains("mehrfach", exception.Message);
}
[Fact]
public void AlteAbsoluteLayouts_WerdenBeimOeffnenVerlustfreiInSeitentypEingebettet()
{
const string source = "PAGE 210 297 mm\nTEXT 20 30 \"Altbestand\" size=12\n";
var layout = new LehrerApp.Templating.LayoutParser().Parse(source);
var migrated = DesignerViewModel.MigrateLegacyLayout(source, layout);
var parsed = new LehrerApp.Templating.LayoutParser().Parse(migrated);
Assert.True(parsed.UsesPageTemplates);
Assert.Equal("Altbestand", Assert.IsType<LehrerApp.Templating.TextElement>(
parsed.PageTemplates.Single(x => x.Name == "first").Elements.Single()).Content);
Assert.Empty(parsed.ContentFlows.Single().Elements);
}
private static readonly byte[] OnePixelPng = Convert.FromBase64String(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=");
}