2 Commits

Author SHA1 Message Date
melekhin
804fc84563 ICellText rename
All checks were successful
Publish NuGet packages / publish (push) Successful in 26s
2026-06-16 12:03:56 +07:00
melekhin
282be475d5 Formula Debug
All checks were successful
Publish NuGet packages / publish (push) Successful in 27s
2026-06-15 14:37:25 +07:00
5 changed files with 75 additions and 73 deletions

View File

@@ -445,7 +445,7 @@ internal sealed class ExcelCell : ICell
// Преобразуем RunProperties в RunFormat (можно вынести в отдельный метод) // Преобразуем RunProperties в RunFormat (можно вынести в отдельный метод)
format = RunFormat.FromRunProperties(run.RunProperties); format = RunFormat.FromRunProperties(run.RunProperties);
} }
textObj.AddRun(text, format); textObj.Run(text, format);
} }
return textObj; return textObj;
} }

View File

@@ -94,7 +94,7 @@ internal sealed class ExcelCellText : ICellText
} }
/// <inheritdoc /> /// <inheritdoc />
public ICellText AddBreak() public ICellText Break()
{ {
// Добавляем символ переноса строки в последний существующий Run // Добавляем символ переноса строки в последний существующий Run
if (_runs != null && _runs.Count > 0) if (_runs != null && _runs.Count > 0)
@@ -105,13 +105,13 @@ internal sealed class ExcelCellText : ICellText
else else
{ {
// Если нет ни одного Run, создаём новый с символом переноса // Если нет ни одного Run, создаём новый с символом переноса
AddRun("\n", null); Run("\n", null);
} }
return this; return this;
} }
/// <inheritdoc /> /// <inheritdoc />
public ICellText AddRun(string text, RunFormat? format = null) public ICellText Run(string text, RunFormat? format = null)
{ {
if (string.IsNullOrEmpty(text)) if (string.IsNullOrEmpty(text))
return this; return this;
@@ -122,15 +122,15 @@ internal sealed class ExcelCellText : ICellText
} }
/// <inheritdoc /> /// <inheritdoc />
public ICellText AddRunBreak(string text, RunFormat? format = null) public ICellText RunBreak(string text, RunFormat? format = null)
{ {
AddRun(text, format); Run(text, format);
AddBreak(); Break();
return this; return this;
} }
/// <inheritdoc /> /// <inheritdoc />
public ICellText AddSubRun(string text, RunFormat? format = null) public ICellText Sub(string text, RunFormat? format = null)
{ {
var subFormat = format is { } fmt var subFormat = format is { } fmt
? new RunFormat ? new RunFormat
@@ -145,11 +145,11 @@ internal sealed class ExcelCellText : ICellText
Vertical = VerticalTextRunAlignment.Subscript Vertical = VerticalTextRunAlignment.Subscript
} }
: new RunFormat { Vertical = VerticalTextRunAlignment.Subscript }; : new RunFormat { Vertical = VerticalTextRunAlignment.Subscript };
return AddRun(text, subFormat); return Run(text, subFormat);
} }
/// <inheritdoc /> /// <inheritdoc />
public ICellText AddSupRun(string text, RunFormat? format = null) public ICellText Sup(string text, RunFormat? format = null)
{ {
var supFormat = format is { } fmt var supFormat = format is { } fmt
? new RunFormat ? new RunFormat
@@ -164,7 +164,7 @@ internal sealed class ExcelCellText : ICellText
Vertical = VerticalTextRunAlignment.Subscript Vertical = VerticalTextRunAlignment.Subscript
} }
: new RunFormat { Vertical = VerticalTextRunAlignment.Superscript }; : new RunFormat { Vertical = VerticalTextRunAlignment.Superscript };
return AddRun(text, supFormat); return Run(text, supFormat);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -186,14 +186,14 @@ internal sealed class ExcelCellText : ICellText
if (!TryInsertRun(index, text, format)) if (!TryInsertRun(index, text, format))
return false; return false;
// После вставленного run добавляем break на следующей позиции // После вставленного run добавляем break на следующей позиции
AddBreak(); Break();
// Сдвигаем? Просто добавляем break в конец неверно. Break должен быть сразу после вставленного. // Сдвигаем? Просто добавляем break в конец неверно. Break должен быть сразу после вставленного.
// Но AddBreak добавляет в конец. Нужно вставить break на index+1. // Но AddBreak добавляет в конец. Нужно вставить break на index+1.
return TryInsertRun(index + 1, "\n", null); return TryInsertRun(index + 1, "\n", null);
} }
/// <inheritdoc /> /// <inheritdoc />
public bool TryInsertSubRun(int index, string text, RunFormat? format = null) public bool TryInsertSub(int index, string text, RunFormat? format = null)
{ {
var subFormat = format is { } fmt var subFormat = format is { } fmt
? new RunFormat ? new RunFormat
@@ -212,7 +212,7 @@ internal sealed class ExcelCellText : ICellText
} }
/// <inheritdoc /> /// <inheritdoc />
public bool TryInsertSupRun(int index, string text, RunFormat? format = null) public bool TryInsertSup(int index, string text, RunFormat? format = null)
{ {
var supFormat = format is { } fmt var supFormat = format is { } fmt
? new RunFormat ? new RunFormat

View File

@@ -779,19 +779,19 @@ public interface ICellText
bool TryRemoveRun(int index, out IRun? removed); bool TryRemoveRun(int index, out IRun? removed);
/// <summary>Добавляет разрыв строки (перенос внутри ячейки).</summary> /// <summary>Добавляет разрыв строки (перенос внутри ячейки).</summary>
ICellText AddBreak(); ICellText Break();
/// <summary>Добавляет обычный текстовый фрагмент.</summary> /// <summary>Добавляет обычный текстовый фрагмент.</summary>
ICellText AddRun(string text, RunFormat? format = null); ICellText Run(string text, RunFormat? format = null);
/// <summary>Добавляет фрагмент с последующим разрывом строки.</summary> /// <summary>Добавляет фрагмент с последующим разрывом строки.</summary>
ICellText AddRunBreak(string text, RunFormat? format = null); ICellText RunBreak(string text, RunFormat? format = null);
/// <summary>Добавляет подстрочный фрагмент (эквивалентно AddRun с Vertical = Subscript).</summary> /// <summary>Добавляет подстрочный фрагмент (эквивалентно AddRun с Vertical = Subscript).</summary>
ICellText AddSubRun(string text, RunFormat? format = null); ICellText Sub(string text, RunFormat? format = null);
/// <summary>Добавляет надстрочный фрагмент.</summary> /// <summary>Добавляет надстрочный фрагмент.</summary>
ICellText AddSupRun(string text, RunFormat? format = null); ICellText Sup(string text, RunFormat? format = null);
/// <summary>Вставляет фрагмент по индексу.</summary> /// <summary>Вставляет фрагмент по индексу.</summary>
bool TryInsertRun(int index, string text, RunFormat? format = null); bool TryInsertRun(int index, string text, RunFormat? format = null);
@@ -800,10 +800,10 @@ public interface ICellText
bool TryInsertRunBreak(int index, string text, RunFormat? format = null); bool TryInsertRunBreak(int index, string text, RunFormat? format = null);
/// <summary>Вставляет подстрочный фрагмент по индексу.</summary> /// <summary>Вставляет подстрочный фрагмент по индексу.</summary>
bool TryInsertSubRun(int index, string text, RunFormat? format = null); bool TryInsertSub(int index, string text, RunFormat? format = null);
/// <summary>Вставляет надстрочный фрагмент по индексу.</summary> /// <summary>Вставляет надстрочный фрагмент по индексу.</summary>
bool TryInsertSupRun(int index, string text, RunFormat? format = null); bool TryInsertSup(int index, string text, RunFormat? format = null);
/// <summary>Применяет заданный формат ко всем существующим фрагментам (поверх их текущего форматирования, заменяя неуказанные свойства).</summary> /// <summary>Применяет заданный формат ко всем существующим фрагментам (поверх их текущего форматирования, заменяя неуказанные свойства).</summary>
void ApplyFormatToAllRuns(RunFormat format); void ApplyFormatToAllRuns(RunFormat format);

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);