Files
Yajbir Singh f1b860b25c
Some checks failed
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
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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);