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