1 Commits

Author SHA1 Message Date
melekhin
282be475d5 Formula Debug
All checks were successful
Publish NuGet packages / publish (push) Successful in 27s
2026-06-15 14:37:25 +07:00
2 changed files with 54 additions and 52 deletions

View File

@@ -1,21 +1,21 @@
using Base = DocumentFormat.OpenXml.Math.Base; using MathBase = DocumentFormat.OpenXml.Math.Base;
using ControlProperties = DocumentFormat.OpenXml.Math.ControlProperties; using MathControlProperties = DocumentFormat.OpenXml.Math.ControlProperties;
using Degree = DocumentFormat.OpenXml.Math.Degree; using MathDegree = DocumentFormat.OpenXml.Math.Degree;
using Denominator = DocumentFormat.OpenXml.Math.Denominator; using MathDenominator = DocumentFormat.OpenXml.Math.Denominator;
using Fraction = DocumentFormat.OpenXml.Math.Fraction; using MathFraction = DocumentFormat.OpenXml.Math.Fraction;
using FractionProperties = DocumentFormat.OpenXml.Math.FractionProperties; using MathFractionProperties = DocumentFormat.OpenXml.Math.FractionProperties;
using HideDegree = DocumentFormat.OpenXml.Math.HideDegree; using MathHideDegree = DocumentFormat.OpenXml.Math.HideDegree;
using MathRun = DocumentFormat.OpenXml.Math.Run; using MathRun = DocumentFormat.OpenXml.Math.Run;
using MathRunProperties = DocumentFormat.OpenXml.Math.RunProperties; using MathRunProperties = DocumentFormat.OpenXml.Math.RunProperties;
using MathText = DocumentFormat.OpenXml.Math.Text; using MathText = DocumentFormat.OpenXml.Math.Text;
using Numerator = DocumentFormat.OpenXml.Math.Numerator; using MathNumerator = DocumentFormat.OpenXml.Math.Numerator;
using Radical = DocumentFormat.OpenXml.Math.Radical; using MathRadical = DocumentFormat.OpenXml.Math.Radical;
using RadicalProperties = DocumentFormat.OpenXml.Math.RadicalProperties; using MathRadicalProperties = DocumentFormat.OpenXml.Math.RadicalProperties;
using SubArgument = DocumentFormat.OpenXml.Math.SubArgument; using MathSubArgument = DocumentFormat.OpenXml.Math.SubArgument;
using Subscript = DocumentFormat.OpenXml.Math.Subscript; using MathSubscript = DocumentFormat.OpenXml.Math.Subscript;
using SubSuperscript = DocumentFormat.OpenXml.Math.SubSuperscript; using MathSubSuperscript = DocumentFormat.OpenXml.Math.SubSuperscript;
using SuperArgument = DocumentFormat.OpenXml.Math.SuperArgument; using MathSuperArgument = DocumentFormat.OpenXml.Math.SuperArgument;
using Superscript = DocumentFormat.OpenXml.Math.Superscript; using MathSuperscript = DocumentFormat.OpenXml.Math.Superscript;
namespace QWERTYkez.WordProcessor; namespace QWERTYkez.WordProcessor;
@@ -59,19 +59,19 @@ internal static class FormulaHelper
} }
} }
public static Fraction CreateFraction( public static MathFraction CreateFraction(
Action<IFormula> numeratorBuilder, Action<IFormula> numeratorBuilder,
Action<IFormula> denominatorBuilder, Action<IFormula> denominatorBuilder,
IFormula builder) IFormula builder)
{ {
var fraction = new Fraction(); var fraction = new MathFraction();
var font = builder.BaseFont; var font = builder.BaseFont;
// Добавляем свойства дроби с форматированием (для черты дроби) // Добавляем свойства дроби с форматированием (для черты дроби)
var fPr = new FractionProperties(); var fPr = new MathFractionProperties();
if (font.TryExtractWithoutFamily(out var wordElements)) if (font.TryExtractWithoutFamily(out var wordElements))
{ {
var ctrlPr = new ControlProperties(); var ctrlPr = new MathControlProperties();
var rPr = new RunProperties(); var rPr = new RunProperties();
foreach (var elem in wordElements) foreach (var elem in wordElements)
rPr.AppendChild(elem.CloneNode(true)); rPr.AppendChild(elem.CloneNode(true));
@@ -82,14 +82,14 @@ internal static class FormulaHelper
fraction.AppendChild(fPr); fraction.AppendChild(fPr);
// Числитель // Числитель
var numeratorElem = new Numerator(); var numeratorElem = new MathNumerator();
fraction.AppendChild(numeratorElem); fraction.AppendChild(numeratorElem);
builder.PushContext(numeratorElem); builder.PushContext(numeratorElem);
numeratorBuilder(builder); numeratorBuilder(builder);
builder.PopContext(); builder.PopContext();
// Знаменатель // Знаменатель
var denominatorElem = new Denominator(); var denominatorElem = new MathDenominator();
fraction.AppendChild(denominatorElem); fraction.AppendChild(denominatorElem);
builder.PushContext(denominatorElem); builder.PushContext(denominatorElem);
denominatorBuilder(builder); denominatorBuilder(builder);
@@ -98,20 +98,20 @@ internal static class FormulaHelper
return fraction; return fraction;
} }
public static Radical CreateRadical( public static MathRadical CreateRadical(
Action<IFormula> radicandBuilder, Action<IFormula> radicandBuilder,
Action<IFormula>? degreeBuilder, Action<IFormula>? degreeBuilder,
IFormula builder) IFormula builder)
{ {
var radical = new Radical(); var radical = new MathRadical();
var font = builder.BaseFont; var font = builder.BaseFont;
var radPr = new RadicalProperties(); var radPr = new MathRadicalProperties();
// Цвет, размер и подчёркивание для знака корня (ControlProperties) // Цвет, размер и подчёркивание для знака корня (ControlProperties)
if (font is not null && font.TryExtractWithoutFamily(out var wordElements)) if (font is not null && font.TryExtractWithoutFamily(out var wordElements))
{ {
var ctrlPr = new ControlProperties(); var ctrlPr = new MathControlProperties();
var rPr = new RunProperties(); var rPr = new RunProperties();
foreach (var elem in wordElements) foreach (var elem in wordElements)
rPr.AppendChild(elem.CloneNode(true)); rPr.AppendChild(elem.CloneNode(true));
@@ -123,7 +123,7 @@ internal static class FormulaHelper
// Если степень не задана, скрываем её // Если степень не задана, скрываем её
if (degreeBuilder is null) if (degreeBuilder is null)
{ {
radPr.HideDegree = new HideDegree { Val = DocumentFormat.OpenXml.Math.BooleanValues.One }; radPr.HideDegree = new MathHideDegree { Val = DocumentFormat.OpenXml.Math.BooleanValues.One };
} }
// Добавляем свойства радикала (с цветом) // Добавляем свойства радикала (с цветом)
@@ -132,7 +132,7 @@ internal static class FormulaHelper
// Степень (если есть) // Степень (если есть)
if (degreeBuilder is not null) if (degreeBuilder is not null)
{ {
var degree = new Degree(); var degree = new MathDegree();
radical.AppendChild(degree); radical.AppendChild(degree);
builder.PushContext(degree); builder.PushContext(degree);
degreeBuilder(builder); degreeBuilder(builder);
@@ -140,7 +140,7 @@ internal static class FormulaHelper
} }
// Подкоренное выражение // Подкоренное выражение
var radicand = new Base(); var radicand = new MathBase();
radical.AppendChild(radicand); radical.AppendChild(radicand);
builder.PushContext(radicand); builder.PushContext(radicand);
radicandBuilder(builder); radicandBuilder(builder);
@@ -179,10 +179,10 @@ internal static class FormulaHelper
} }
else else
{ {
var integralWithLimits = new SubSuperscript(); var integralWithLimits = new MathSubSuperscript();
currentContext.AppendChild(integralWithLimits); currentContext.AppendChild(integralWithLimits);
var baseElem = new Base(); var baseElem = new MathBase();
var integralRun = CreateMathRun(font); var integralRun = CreateMathRun(font);
integralRun.AppendChild(new MathText("∫")); integralRun.AppendChild(new MathText("∫"));
baseElem.AppendChild(integralRun); baseElem.AppendChild(integralRun);
@@ -190,7 +190,7 @@ internal static class FormulaHelper
if (lowerLimitBuilder is not null) if (lowerLimitBuilder is not null)
{ {
var subArg = new SubArgument(); var subArg = new MathSubArgument();
integralWithLimits.AppendChild(subArg); integralWithLimits.AppendChild(subArg);
builder.PushContext(subArg); builder.PushContext(subArg);
lowerLimitBuilder(builder); lowerLimitBuilder(builder);
@@ -198,7 +198,7 @@ internal static class FormulaHelper
} }
if (upperLimitBuilder is not null) if (upperLimitBuilder is not null)
{ {
var superArg = new SuperArgument(); var superArg = new MathSuperArgument();
integralWithLimits.AppendChild(superArg); integralWithLimits.AppendChild(superArg);
builder.PushContext(superArg); builder.PushContext(superArg);
upperLimitBuilder(builder); upperLimitBuilder(builder);
@@ -242,10 +242,10 @@ internal static class FormulaHelper
} }
else else
{ {
var sumWithLimits = new SubSuperscript(); var sumWithLimits = new MathSubSuperscript();
currentContext.AppendChild(sumWithLimits); currentContext.AppendChild(sumWithLimits);
var baseElem = new Base(); var baseElem = new MathBase();
var sumRun = CreateMathRun(font); var sumRun = CreateMathRun(font);
sumRun.AppendChild(new MathText("∑")); sumRun.AppendChild(new MathText("∑"));
baseElem.AppendChild(sumRun); baseElem.AppendChild(sumRun);
@@ -253,7 +253,7 @@ internal static class FormulaHelper
if (lowerLimitBuilder is not null) if (lowerLimitBuilder is not null)
{ {
var subArg = new SubArgument(); var subArg = new MathSubArgument();
sumWithLimits.AppendChild(subArg); sumWithLimits.AppendChild(subArg);
builder.PushContext(subArg); builder.PushContext(subArg);
lowerLimitBuilder(builder); lowerLimitBuilder(builder);
@@ -261,7 +261,7 @@ internal static class FormulaHelper
} }
if (upperLimitBuilder is not null) if (upperLimitBuilder is not null)
{ {
var superArg = new SuperArgument(); var superArg = new MathSuperArgument();
sumWithLimits.AppendChild(superArg); sumWithLimits.AppendChild(superArg);
builder.PushContext(superArg); builder.PushContext(superArg);
upperLimitBuilder(builder); upperLimitBuilder(builder);
@@ -278,22 +278,22 @@ internal static class FormulaHelper
/// <summary>Создаёт степень.</summary> /// <summary>Создаёт степень.</summary>
public static Superscript CreateSuperscript( public static MathSuperscript CreateSuperscript(
Action<IFormula> baseBuilder, Action<IFormula> baseBuilder,
Action<IFormula> supBuilder, Action<IFormula> supBuilder,
IFormula builder) IFormula builder)
{ {
var superscript = new Superscript(); var superscript = new MathSuperscript();
// Основание // Основание
var baseElem = new Base(); var baseElem = new MathBase();
superscript.AppendChild(baseElem); superscript.AppendChild(baseElem);
builder.PushContext(baseElem); builder.PushContext(baseElem);
baseBuilder(builder); baseBuilder(builder);
builder.PopContext(); builder.PopContext();
// Показатель // Показатель
var superArg = new SuperArgument(); var superArg = new MathSuperArgument();
superscript.AppendChild(superArg); superscript.AppendChild(superArg);
builder.PushContext(superArg); builder.PushContext(superArg);
supBuilder(builder); supBuilder(builder);
@@ -303,20 +303,20 @@ internal static class FormulaHelper
} }
/// <summary>Создаёт нижний индекс.</summary> /// <summary>Создаёт нижний индекс.</summary>
public static Subscript CreateSubscript( public static MathSubscript CreateSubscript(
Action<IFormula> baseBuilder, Action<IFormula> baseBuilder,
Action<IFormula> subBuilder, Action<IFormula> subBuilder,
IFormula builder) IFormula builder)
{ {
var subscript = new Subscript(); var subscript = new MathSubscript();
var baseElem = new Base(); var baseElem = new MathBase();
subscript.AppendChild(baseElem); subscript.AppendChild(baseElem);
builder.PushContext(baseElem); builder.PushContext(baseElem);
baseBuilder(builder); baseBuilder(builder);
builder.PopContext(); builder.PopContext();
var subArg = new SubArgument(); var subArg = new MathSubArgument();
subscript.AppendChild(subArg); subscript.AppendChild(subArg);
builder.PushContext(subArg); builder.PushContext(subArg);
subBuilder(builder); subBuilder(builder);
@@ -326,27 +326,27 @@ internal static class FormulaHelper
} }
/// <summary>Создаёт одновременные нижний и верхний индексы.</summary> /// <summary>Создаёт одновременные нижний и верхний индексы.</summary>
public static SubSuperscript CreateSubSuperscript( public static MathSubSuperscript CreateSubSuperscript(
Action<IFormula> baseBuilder, Action<IFormula> baseBuilder,
Action<IFormula> subBuilder, Action<IFormula> subBuilder,
Action<IFormula> supBuilder, Action<IFormula> supBuilder,
IFormula builder) IFormula builder)
{ {
var subSup = new SubSuperscript(); var subSup = new MathSubSuperscript();
var baseElem = new Base(); var baseElem = new MathBase();
subSup.AppendChild(baseElem); subSup.AppendChild(baseElem);
builder.PushContext(baseElem); builder.PushContext(baseElem);
baseBuilder(builder); baseBuilder(builder);
builder.PopContext(); builder.PopContext();
var subArg = new SubArgument(); var subArg = new MathSubArgument();
subSup.AppendChild(subArg); subSup.AppendChild(subArg);
builder.PushContext(subArg); builder.PushContext(subArg);
subBuilder(builder); subBuilder(builder);
builder.PopContext(); builder.PopContext();
var superArg = new SuperArgument(); var superArg = new MathSuperArgument();
subSup.AppendChild(superArg); subSup.AppendChild(superArg);
builder.PushContext(superArg); builder.PushContext(superArg);
supBuilder(builder); supBuilder(builder);

View File

@@ -1,4 +1,6 @@
namespace QWERTYkez.WordProcessor; using MathOfficeMath = DocumentFormat.OpenXml.Math.OfficeMath;
namespace QWERTYkez.WordProcessor;
abstract class ParagraphBuilderBase : IParagraph, IFormula abstract class ParagraphBuilderBase : IParagraph, IFormula
{ {
@@ -176,7 +178,7 @@ abstract class ParagraphBuilderBase : IParagraph, IFormula
// Метод AddFormula для IParagraphBuilder // Метод AddFormula для IParagraphBuilder
IParagraph IParagraph.AddFormula(Action<IFormula> configure) IParagraph IParagraph.AddFormula(Action<IFormula> configure)
{ {
var math = new OfficeMath(); var math = new MathOfficeMath();
try try
{ {
_mathContextStack.Push(math); _mathContextStack.Push(math);
@@ -196,7 +198,7 @@ abstract class ParagraphBuilderBase : IParagraph, IFormula
// Метод AddFormula для IParagraphBuilder // Метод AddFormula для IParagraphBuilder
IParagraph IParagraph.AddFormulaBreak(Action<IFormula> configure) IParagraph IParagraph.AddFormulaBreak(Action<IFormula> configure)
{ {
var math = new OfficeMath(); var math = new MathOfficeMath();
try try
{ {
_mathContextStack.Push(math); _mathContextStack.Push(math);