Files
Yajbir Singh f1b860b25c
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

522 lines
14 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
// TODO: Избавиться от использования TEXTWIDTH_DIVIDER константы вне данного модуля
const TEXTWIDTH_DIVIDER = 16384;
/**
* Базовый класс для элементов, лежащих внутри рана
* @constructor
*/
function CRunElementBase()
{
this.Width = 0x00000000 | 0;
}
CRunElementBase.prototype.Type = para_RunBase;
CRunElementBase.prototype.Get_Type = function()
{
return this.Type;
};
CRunElementBase.prototype.GetType = function()
{
return this.Type;
};
CRunElementBase.prototype.Draw = function(nX, nY, oGraphics, PDSE)
{
};
CRunElementBase.prototype.Measure = function(oGraphics, oTextPr)
{
this.Width = 0x00000000 | 0;
};
CRunElementBase.prototype.GetWidth = function()
{
return (this.Width > 0 ? this.Width / TEXTWIDTH_DIVIDER : 0);
};
CRunElementBase.prototype.Set_Width = function(nWidth)
{
this.Width = (nWidth * TEXTWIDTH_DIVIDER) | 0;
};
CRunElementBase.prototype.SetWidth = function(nWidth)
{
this.Width = (nWidth * TEXTWIDTH_DIVIDER) | 0;
};
/**
* Функция GetWidth возвращает ширину объекта, данная функция возвращает ширину объекта, которую он занимает
* внутри строки. Фактически, разница только для плавающих автофигур
* @returns {number}
*/
CRunElementBase.prototype.GetInlineWidth = function()
{
return this.GetWidth();
};
CRunElementBase.prototype.GetWidthVisible = function()
{
if (undefined !== this.WidthVisible)
return (this.WidthVisible > 0 ? this.WidthVisible / TEXTWIDTH_DIVIDER : 0);
return (this.Width > 0 ? this.Width / TEXTWIDTH_DIVIDER : 0);
};
CRunElementBase.prototype.SetWidthVisible = function(nWidthVisible)
{
this.WidthVisible = (nWidthVisible * TEXTWIDTH_DIVIDER) | 0;
};
CRunElementBase.prototype.CanAddNumbering = function()
{
return true;
};
CRunElementBase.prototype.SetParent = function(oParent)
{
};
CRunElementBase.prototype.GetRun = function()
{
return null;
};
CRunElementBase.prototype.GetInRunPos = function()
{
let run = this.GetRun();
if (!run)
return -1;
return run.GetElementPosition(this);
};
CRunElementBase.prototype.GetInParagraphPos = function()
{
let run = this.GetRun();
if (!run)
return null;
let paragraph = run.GetParagraph();
if (!paragraph)
return null;
let inRunPos = this.GetInRunPos();
if (-1 === inRunPos)
return null;
let paraPos = paragraph.GetPosByElement(run);
if (!paraPos)
return null;
paraPos.Add(inRunPos);
return paraPos;
};
CRunElementBase.prototype.SetParagraph = function(oParagraph)
{
};
CRunElementBase.prototype.GetParagraph = function()
{
let run = this.GetRun();
return run ? run.GetParagraph() : null;
};
CRunElementBase.prototype.IsInPermRange = function()
{
let paragraph = this.GetParagraph();
if (!paragraph)
return false;
let paraPos = this.GetInParagraphPos();
if (!paraPos)
return null;
return paragraph.GetPermRangesByPos(paraPos).length > 0;
};
CRunElementBase.prototype.Copy = function()
{
return new this.constructor();
};
CRunElementBase.prototype.Write_ToBinary = function(Writer)
{
// Long : Type
Writer.WriteLong(this.Type);
};
CRunElementBase.prototype.Read_FromBinary = function(Reader)
{
};
CRunElementBase.prototype.RemoveThisFromDocument = function()
{
let run = this.GetRun();
if (!run)
return false;
let inRunPos = run.GetElementPosition(this);
if (-1 === inRunPos)
return false;
run.RemoveFromContent(inRunPos, 1, true);
return true;
};
/**
* Может ли строка начинаться с данного элемента
* @returns {boolean}
*/
CRunElementBase.prototype.CanBeAtBeginOfLine = function()
{
return true;
};
/**
* Может ли строка заканчиваться данным элементом
* @returns {boolean}
*/
CRunElementBase.prototype.CanBeAtEndOfLine = function()
{
return true;
};
/**
* Какие мы можем выполнять автозамены на вводе данного элемента
* @returns {number}
*/
CRunElementBase.prototype.GetAutoCorrectFlags = function()
{
return AscWord.AUTOCORRECT_FLAGS_NONE;
};
/**
* Является ли данный элемент символом пунктуации
* @returns {boolean}
*/
CRunElementBase.prototype.IsPunctuation = function()
{
return false;
};
/**
* Проверяем является ли элемент символом точки
* @returns {boolean}
*/
CRunElementBase.prototype.IsDot = function()
{
return false;
};
/**
* Проверяем является ли элемент символом знака восклицания
* @returns {boolean}
*/
CRunElementBase.prototype.IsExclamationMark = function()
{
return false;
};
/**
* Проверяем является ли элемент символом знака вопроса
* @returns {boolean}
*/
CRunElementBase.prototype.IsQuestionMark = function()
{
return false;
};
/**
* Проверяем является ли элемент символом конца предложения
* @returns {boolean}
*/
CRunElementBase.prototype.IsSentenceEndMark = function()
{
return (this.IsDot() ||this.IsQuestionMark() || this.IsExclamationMark());
};
/**
* Является ли данный элемент символом дефиса
* @returns {boolean}
*/
CRunElementBase.prototype.IsHyphen = function()
{
return false;
};
/**
* @param {CRunElementBase} oElement
* @returns {boolean}
*/
CRunElementBase.prototype.IsEqual = function(oElement)
{
return (this.Type === oElement.Type)
};
/**
* Нужно ли ставить разрыв слова после данного элемента
* @returns {boolean}
*/
CRunElementBase.prototype.IsSpaceAfter = function()
{
return false;
};
/**
* Можно ли ставить разрыв слова перед данным элементом
* @returns {boolean}
*/
CRunElementBase.prototype.IsSpaceBefore = function()
{
return false;
};
/**
* Нужно ли ставить дефис для автоматического переноса
* @returns {boolean}
*/
CRunElementBase.prototype.isHyphenAfter = function()
{
return false;
};
/**
* Является ли данный элемент буквой (не цифрой, не знаком пунктуации и т.д.)
* @returns {boolean}
*/
CRunElementBase.prototype.IsLetter = function()
{
return false;
};
/**
* Нужно ли сохранять данные этого элемента при сохранении состояния пересчета
* @returns {boolean}
*/
CRunElementBase.prototype.IsNeedSaveRecalculateObject = function()
{
return false;
};
/**
* Является ли данный элемент цифрой
* @returns {boolean}
*/
CRunElementBase.prototype.IsDigit = function()
{
return false;
};
/**
* Является ли данный элемент пробельным символом
* @returns {boolean}
*/
CRunElementBase.prototype.IsSpace = function()
{
return false;
};
/**
* Преобразуем в элемент для поиска
* @returns {?CSearchTextItemBase}
*/
CRunElementBase.prototype.ToSearchElement = function(oProps)
{
return null;
};
/**
* Преобразуем в элемент матиматического рана
* @returns {?CMathBaseText}
*/
CRunElementBase.prototype.ToMathElement = function()
{
return null;
};
/**
* Является ли данный элемент автофигурой
* @returns {boolean}
*/
CRunElementBase.prototype.IsDrawing = function()
{
return false;
};
/**
* Является ли данный элемент текстовым элементом (но не пробелом и не табом)
* @returns {boolean}
*/
CRunElementBase.prototype.IsText = function()
{
return false;
};
/**
* Является ли данный элемент текстовым элементом внутри математического выражения
* @returns {boolean}
*/
CRunElementBase.prototype.IsMathText = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsTab = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsParaEnd = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsReference = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsFieldChar = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsInstrText = function()
{
return false;
};
/**
* @returns {AscWord.fontslot_Unknown}
*/
CRunElementBase.prototype.GetFontSlot = function(oTextPr)
{
return AscWord.fontslot_Unknown;
};
/**
* Является ли элемент текстом из ComplexScript
* @returns {boolean}
*/
CRunElementBase.prototype.IsCS = function()
{
return this.GetFontSlot() === AscWord.fontslot_CS;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsBreak = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsLigature = function()
{
return false;
};
/**
* @returns {boolean}
*/
CRunElementBase.prototype.IsCombiningMark = function()
{
return false;
};
/**
* return {AscBidi.TYPE}
*/
CRunElementBase.prototype.getBidiType = function()
{
return AscBidi.TYPE.ON;
};
/**
* @returns {AscBidi.DIRECTION_FLAG}
*/
CRunElementBase.prototype.GetDirectionFlag = function()
{
return AscBidi.DIRECTION_FLAG.Other;
};
/**
* @return {number}
*/
CRunElementBase.prototype.GetCombWidth = function()
{
return this.GetWidth();
};
CRunElementBase.prototype.SetGaps = function(nLeftGap, nRightGap, nCellWidth)
{
};
CRunElementBase.prototype.ResetGapBackground = function()
{
this.RGapCount = undefined;
this.RGapCharCode = undefined;
this.RGapCharWidth = undefined;
this.RGapShift = undefined;
this.RGapFontSlot = undefined;
this.RGapFont = undefined;
};
CRunElementBase.prototype.SetGapBackground = function(nCount, nCharCode, nCombWidth, oContext, sFont, oTextPr, oTheme, nCombBorderW)
{
this.RGapCount = nCount;
this.RGapCharCode = nCharCode;
this.RGapFontSlot = AscWord.GetFontSlotByTextPr(nCharCode, oTextPr);
if (sFont)
{
this.RGapFont = sFont;
var oCurTextPr = oTextPr.Copy();
oCurTextPr.SetFontFamily(sFont);
oContext.SetTextPr(oCurTextPr, oTheme);
oContext.SetFontSlot(this.RGapFontSlot, oTextPr.getFontCoef());
}
this.RGapCharWidth = !nCharCode ? nCombBorderW : Math.max(oContext.MeasureCode(nCharCode).Width + oTextPr.Spacing + nCombBorderW, nCombBorderW);
this.RGapShift = Math.max(nCombWidth, this.RGapCharWidth);
if (sFont)
oContext.SetTextPr(oTextPr, oTheme);
};
CRunElementBase.prototype.DrawGapsBackground = function(X, Y, oGraphics, PDSE, oTextPr)
{
if (!this.RGapCharCode)
return;
if (this.RGapFont)
{
let oCurTextPr = oTextPr.Copy();
oCurTextPr.SetFontFamily(this.RGapFont);
oGraphics.SetTextPr(oCurTextPr, PDSE.Theme);
oGraphics.SetFontSlot(this.RGapFontSlot, oTextPr.getFontCoef());
}
if (this.RGap && this.RGapCount)
{
X += this.GetWidth();
let nShift = (this.RGapShift - this.RGapCharWidth) / 2;
for (let nIndex = 0; nIndex < this.RGapCount; ++nIndex)
{
X -= nShift + this.RGapCharWidth;
oGraphics.FillTextCode(X, Y, this.RGapCharCode);
X -= nShift;
}
}
if (this.RGapFont)
oGraphics.SetTextPr(oTextPr, PDSE.Theme);
};
//--------------------------------------------------------export----------------------------------------------------
window['AscWord'] = window['AscWord'] || {};
window['AscWord'].CRunElementBase = CRunElementBase;
window['AscWord'].TEXTWIDTH_DIVIDER = TEXTWIDTH_DIVIDER;
})(window);