/*
* (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";
(/**
* @param {Window} window
* @param {undefined} undefined
*/
function(window, undefined) {
// Import
var prot;
var g_fontApplication = AscFonts.g_fontApplication;
var CFont = AscFonts.CFont;
var AscBrowser = AscCommon.AscBrowser;
var align_Right = AscCommon.align_Right;
var align_Left = AscCommon.align_Left;
var align_Center = AscCommon.align_Center;
var align_Justify = AscCommon.align_Justify;
var g_oDocumentUrls = AscCommon.g_oDocumentUrls;
var History = AscCommon.History;
var pptx_content_loader = AscCommon.pptx_content_loader;
var pptx_content_writer = AscCommon.pptx_content_writer;
var g_dKoef_pix_to_mm = AscCommon.g_dKoef_pix_to_mm;
var g_dKoef_mm_to_pix = AscCommon.g_dKoef_mm_to_pix;
var CShape = AscFormat.CShape;
var CGraphicFrame = AscFormat.CGraphicFrame;
var c_oAscError = Asc.c_oAscError;
var c_oAscShdClear = Asc.c_oAscShdClear;
var c_oAscShdNil = Asc.c_oAscShdNil;
var c_oAscXAlign = Asc.c_oAscXAlign;
function CDocumentReaderMode()
{
this.DefaultFontSize = 12;
this.CorrectDefaultFontSize = function(size)
{
if (size < 6)
return;
this.DefaultFontSize = size;
};
this.CorrectFontSize = function(size)
{
var dRes = size / this.DefaultFontSize;
dRes = (1 + dRes) / 2;
dRes = (100 * dRes) >> 0;
dRes /= 100;
return "" + dRes + "em";
};
}
function GetObjectsForImageDownload(aBuilderImages, bSameDoc)
{
var oMapImages = {}, aBuilderImagesByUrl = [], aUrls =[];
for(var i = 0; i < aBuilderImages.length; ++i)
{
let oBuilderImg = aBuilderImages[i];
let sUrl = oBuilderImg.Url;
if(sUrl && !g_oDocumentUrls.getImageLocal(sUrl) && !g_oDocumentUrls.isThemeUrl(sUrl))
{
aUrls.push(sUrl);
aBuilderImagesByUrl.push([oBuilderImg]);
}
}
if(bSameDoc !== true){
//в конце добавляем ссылки на wmf, ole
for(var i = 0; i < aBuilderImages.length; ++i)
{
var oBuilderImage = aBuilderImages[i];
if (!g_oDocumentUrls.getImageLocal(oBuilderImage.Url))
{
if (oBuilderImage.AdditionalUrls) {
for (var j = 0; j < oBuilderImage.AdditionalUrls.length; ++j) {
if(oBuilderImage.AdditionalUrls[j])
{
aUrls.push(oBuilderImage.AdditionalUrls[j]);
}
}
}
}
}
}
return {aUrls: aUrls, aBuilderImagesByUrl: aBuilderImagesByUrl};
}
function ResetNewUrls(data, aUrls, aBuilderImagesByUrl, oImageMap)
{
for (var i = 0, length = Math.min(data.length, aBuilderImagesByUrl.length); i < length; ++i)
{
var elem = data[i];
if (null != elem.url)
{
var name = g_oDocumentUrls.imagePath2Local(elem.path);
var aImageElem = aBuilderImagesByUrl[i];
if(Array.isArray(aImageElem))
{
for(var j = 0; j < aImageElem.length; ++j)
{
var imageElem = aImageElem[j];
if (null != imageElem)
{
imageElem.SetUrl(name);
}
}
}
oImageMap[i] = name;
}
else
{
oImageMap[i] = aUrls[i];
}
}
}
//TODO на счёт коэффициэнта не нахожу подходящего преобразования. пересмотреть.
var koef_mm_to_indent = 3.88;
var PasteElementsId = {
copyPasteUseBinary : true,
g_bIsDocumentCopyPaste : true,
g_bIsPDFCopyPaste : false
};
function CopyElement(sName, bText){
this.sName = sName;
this.oAttributes = {};
this.aChildren = [];
this.bText = bText;
}
CopyElement.prototype.addChild = function(child){
if(child.bText && this.aChildren.length > 0 && this.aChildren[this.aChildren.length - 1].bText)
this.aChildren[this.aChildren.length - 1].sName += child.sName;//обьединяем текст, потому что есть места где мы определяем количество child и будет неправильное значение, потому на getOuterHtml тест обьединится в один
else
this.aChildren.push(child);
};
CopyElement.prototype.wrapChild = function(child){
for(var i = 0; i < this.aChildren.length; ++i)
child.addChild(this.aChildren[i]);
this.aChildren = [child];
};
CopyElement.prototype.isEmptyChild = function(){
return 0 === this.aChildren.length;
};
CopyElement.prototype.getInnerText = function(){
if(this.bText)
return this.sName;
else{
var sRes = "";
for(var i = 0; i < this.aChildren.length; ++i)
sRes += this.aChildren[i].getInnerText();
return sRes;
}
};
CopyElement.prototype.getInnerHtml = function(){
if(this.bText)
return this.sName;
else{
var sRes = "";
for(var i = 0; i < this.aChildren.length; ++i)
sRes += this.aChildren[i].getOuterHtml();
return sRes;
}
};
CopyElement.prototype.getOuterHtml = function(){
if(this.bText)
return this.sName;
else{
var sRes = "<" + this.sName;
for(var i in this.oAttributes)
sRes += " " + i + "=\"" + this.oAttributes[i] + "\"";
var sInner = this.getInnerHtml();
if(sInner.length > 0)
sRes += ">" + sInner + "" + this.sName + ">";
else
sRes += "/>";
return sRes;
}
};
CopyElement.prototype.moveChildTo = function (container) {
for (let i = 0; i < this.aChildren.length; i++) {
container.addChild && container.addChild(this.aChildren[i]);
}
};
function CopyProcessor(api, onlyBinaryCopy)
{
this.api = api;
this.oDocument = api.WordControl.m_oLogicDocument;
this.onlyBinaryCopy = onlyBinaryCopy;
this.oBinaryFileWriter = new AscCommonWord.BinaryFileWriter(this.oDocument);
this.oPresentationWriter = new AscCommon.CBinaryFileWriter();
this.oPDFWriter = new AscCommon.CBinaryFileWriter();
this.oPresentationWriter.Start_UseFullUrl();
if (this.api.ThemeLoader) {
this.oPresentationWriter.Start_UseDocumentOrigin(this.api.ThemeLoader.ThemesUrlAbs);
}
this.aFootnoteReference = [];
this.oRoot = new CopyElement("root");
this.listNextNumMap = [];
this.instructionHyperlinkStart = null;
}
CopyProcessor.prototype =
{
getInnerHtml : function()
{
return this.oRoot.getInnerHtml();
},
getInnerText : function()
{
return this.oRoot.getInnerText();
},
RGBToCSS : function(rgb, unifill)
{
if (null == rgb && null != unifill) {
unifill.check(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
var RGBA = unifill.getRGBAColor();
rgb = new CDocumentColor(RGBA.R, RGBA.G, RGBA.B);
}
var sResult = "#";
var sR = rgb.r.toString(16);
if(sR.length === 1)
sR = "0" + sR;
var sG = rgb.g.toString(16);
if(sG.length === 1)
sG = "0" + sG;
var sB = rgb.b.toString(16);
if(sB.length === 1)
sB = "0" + sB;
return "#" + sR + sG + sB;
},
Commit_pPr : function(Item, Para, nextElem)
{
//pPr
var apPr = [];
var Def_pPr = this.oDocument.Styles ? this.oDocument.Styles.Default.ParaPr : null;
var Item_pPr = Item.CompiledPr && Item.CompiledPr.Pr && Item.CompiledPr.Pr.ParaPr ? Item.CompiledPr.Pr.ParaPr : Item.Pr;
if(Item_pPr && Def_pPr)
{
//Ind
if(Def_pPr.Ind.Left !== Item_pPr.Ind.Left)
apPr.push("margin-left:" + (Item_pPr.Ind.Left * g_dKoef_mm_to_pt) + "pt");
if(Def_pPr.Ind.Right !== Item_pPr.Ind.Right)
apPr.push("margin-right:" + ( Item_pPr.Ind.Right * g_dKoef_mm_to_pt) + "pt");
if(Def_pPr.Ind.FirstLine !== Item_pPr.Ind.FirstLine)
apPr.push("text-indent:" + (Item_pPr.Ind.FirstLine * g_dKoef_mm_to_pt) + "pt");
//Jc
if(Def_pPr.Jc !== Item_pPr.Jc){
switch(Item_pPr.Jc)
{
case align_Left: apPr.push("text-align:left");break;
case align_Center: apPr.push("text-align:center");break;
case align_Right: apPr.push("text-align:right");break;
case align_Justify: apPr.push("text-align:justify");break;
}
}
//KeepLines , WidowControl
if(Def_pPr.KeepLines !== Item_pPr.KeepLines || Def_pPr.WidowControl !== Item_pPr.WidowControl)
{
if(Def_pPr.KeepLines !== Item_pPr.KeepLines && Def_pPr.WidowControl !== Item_pPr.WidowControl)
apPr.push("mso-pagination:none lines-together");
else if(Def_pPr.KeepLines !== Item_pPr.KeepLines)
apPr.push("mso-pagination:widow-orphan lines-together");
else if(Def_pPr.WidowControl !== Item_pPr.WidowControl)
apPr.push("mso-pagination:none");
}
//KeepNext
if(Def_pPr.KeepNext !== Item_pPr.KeepNext)
apPr.push("page-break-after:avoid");
//PageBreakBefore
if(Def_pPr.PageBreakBefore !== Item_pPr.PageBreakBefore)
apPr.push("page-break-before:always");
//Spacing
if(Def_pPr.Spacing.Line !== Item_pPr.Spacing.Line)
{
if(Asc.linerule_AtLeast === Item_pPr.Spacing.LineRule)
apPr.push("line-height:"+(Item_pPr.Spacing.Line * g_dKoef_mm_to_pt)+"pt");
else if( Asc.linerule_Auto === Item_pPr.Spacing.LineRule)
{
if(1 === Item_pPr.Spacing.Line)
apPr.push("line-height:normal");
else
apPr.push("line-height:"+parseInt(Item_pPr.Spacing.Line * 100)+"%");
}
}
if(Def_pPr.Spacing.LineRule !== Item_pPr.Spacing.LineRule)
{
if(Asc.linerule_Exact === Item_pPr.Spacing.LineRule)
apPr.push("mso-line-height-rule:exactly");
}
//TODO при вставке в EXCEL(внутрь ячейки) появляются лишние пустые строки из-за того, что в HTML пишутся отступы - BUG #14663
//При вставке в word лучше чтобы эти значения выставлялись всегда
//if(Def_pPr.Spacing.Before != Item_pPr.Spacing.Before)
apPr.push("margin-top:" + (Item_pPr.Spacing.Before * g_dKoef_mm_to_pt) + "pt");
//if(Def_pPr.Spacing.After != Item_pPr.Spacing.After)
apPr.push("margin-bottom:" + (Item_pPr.Spacing.After * g_dKoef_mm_to_pt) + "pt");
//Shd
if (null != Item_pPr.Shd && c_oAscShdNil !== Item_pPr.Shd.Value && (null != Item_pPr.Shd.Color || null != Item_pPr.Shd.Unifill)){
var _shdColor = Item_pPr.Shd.GetSimpleColor && Item_pPr.Shd.GetSimpleColor(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
//TODO проверить сохранение в epub
//todo проверить и убрать else, всегда использовать GetSimpleColor
if (_shdColor) {
_shdColor = this.RGBToCSS(_shdColor);
} else {
_shdColor = this.RGBToCSS(Item_pPr.Shd.Color, Item_pPr.Shd.Unifill);
}
apPr.push("background-color:" + _shdColor);
}
//Tabs
if(Item_pPr.Tabs.Get_Count() > 0)
{
var sTabs = "";
//tab-stops:1.0cm 3.0cm 5.0cm
for(var i = 0, length = Item_pPr.Tabs.Get_Count(); i < length; i++)
{
if(0 !== i)
sTabs += " ";
sTabs += Item_pPr.Tabs.Get(i).Pos / 10 + "cm";
}
apPr.push("tab-stops:" + sTabs);
}
//Border
if(null != Item_pPr.Brd)
{
apPr.push("border:none");
//сравниваю бордеры со следующим параграфом
var isNeedPrefix = true;
if (Item && type_Paragraph === Item.GetType() && Item.IsTableCellContent && !Item.IsTableCellContent()) {
isNeedPrefix = false;
if (nextElem && type_Paragraph === nextElem.GetType()) {
isNeedPrefix = true;
var Item_pPrCompile = Item.CompiledPr && Item.CompiledPr.Pr && Item.CompiledPr.Pr.ParaPr;
var Next_pPrCompile = nextElem.Get_CompiledPr2 && nextElem.Get_CompiledPr2(false);
Next_pPrCompile = Next_pPrCompile && Next_pPrCompile.ParaPr;
if (Next_pPrCompile && Item_pPrCompile && !nextElem.private_CompareBorderSettings(Next_pPrCompile, Item_pPrCompile)) {
isNeedPrefix = false;
}
}
}
var borderStyle = this._BordersToStyle(Item_pPr.Brd, false, true, isNeedPrefix ? "mso-" : null, isNeedPrefix ? "-alt" : null);
if(null != borderStyle)
{
var nborderStyleLength = borderStyle.length;
if(nborderStyleLength> 0)
borderStyle = borderStyle.substring(0, nborderStyleLength - 1);
apPr.push(borderStyle);
}
}
}
if(apPr.length > 0)
Para.oAttributes["style"] = apPr.join(';');
},
parse_para_TextPr : function(Value, oTarget)
{
var aProp = [];
if (null != Value.RFonts) {
var sFontName = null;
if (null != Value.RFonts.Ascii)
sFontName = Value.RFonts.Ascii.Name;
else if (null != Value.RFonts.HAnsi)
sFontName = Value.RFonts.HAnsi.Name;
else if (null != Value.RFonts.EastAsia)
sFontName = Value.RFonts.EastAsia.Name;
else if (null != Value.RFonts.CS)
sFontName = Value.RFonts.CS.Name;
if (null != sFontName){
var oTheme = this.oDocument && this.oDocument.Get_Theme && this.oDocument.Get_Theme();
if(oTheme && oTheme.themeElements && oTheme.themeElements.fontScheme){
sFontName = oTheme.themeElements.fontScheme.checkFont(sFontName)
}
aProp.push("font-family:" + "'" + CopyPasteCorrectString(sFontName) + "'");
}
}
if (null != Value.FontSize) {
if (!this.api.DocumentReaderMode)
aProp.push("font-size:" + Value.FontSize + "pt");//font-size в pt все остальные метрики в mm
else
aProp.push("font-size:" + this.api.DocumentReaderMode.CorrectFontSize(Value.FontSize));
}
if (true == Value.Bold)
oTarget.wrapChild(new CopyElement("b"));
if (true == Value.Italic)
oTarget.wrapChild(new CopyElement("i"));
if (true == Value.Underline)
oTarget.wrapChild(new CopyElement("u"));
if (true == Value.Strikeout)
oTarget.wrapChild(new CopyElement("s"));
if (true == Value.DStrikeout)
oTarget.wrapChild(new CopyElement("s"));
if (null != Value.Shd && c_oAscShdNil !== Value.Shd.Value && (null != Value.Shd.Color || null != Value.Shd.Unifill))
aProp.push("background-color:" + this.RGBToCSS(Value.Shd.Color, Value.Shd.Unifill));
else if (null != Value.HighLight && highlight_None !== Value.HighLight)
aProp.push("background-color:" + this.RGBToCSS(Value.HighLight, null));
if (null != Value.Color || null != Value.Unifill) {
var color;
//TODO правка того, что в полученной html цвет текста всегда чёрный. стоит пересмотреть.
if(null != Value.Unifill)
color = this.RGBToCSS(null, Value.Unifill);
else
color = this.RGBToCSS(Value.Color, Value.Unifill);
aProp.push("color:" + color);
aProp.push("mso-style-textfill-fill-color:" + color);
}
if (null != Value.VertAlign) {
if(AscCommon.vertalign_SuperScript === Value.VertAlign)
aProp.push("vertical-align:super");
else if(AscCommon.vertalign_SubScript === Value.VertAlign)
aProp.push("vertical-align:sub");
}
if(aProp.length > 0)
oTarget.oAttributes["style"] = aProp.join(';');
},
ParseItem : function(ParaItem, oTarget, nextParaItem, lengthContent)
{
let oSpan;
switch ( ParaItem.Type )
{
case para_Text:
//экранируем спецсимволы
let sValue = AscCommon.encodeSurrogateChar(ParaItem.Value);
if(sValue)
oTarget.addChild(new CopyElement(CopyPasteCorrectString(sValue), true));
break;
case para_Space:
//TODO пересмотреть обработку пробелов - возможно стоит всегда копировать неразрывный пробел!!!!!
//в случае нескольких пробелов друг за другом добавляю неразрывный пробел, иначе добавиться только один
//lengthContent - если в элемент добавляется только один пробел, этот элемент не записывается в буфер, поэтому добавляем неразрывный пробел
if((nextParaItem && nextParaItem.Type === para_Space) || lengthContent === 1)
oTarget.addChild(new CopyElement(" ", true));
else
oTarget.addChild(new CopyElement(" ", true));
break;
case para_Tab:
oSpan = new CopyElement("span");
oSpan.oAttributes["style"] = "white-space:pre;";
oSpan.oAttributes["style"] = "mso-tab-count:1;";
oSpan.addChild(new CopyElement(String.fromCharCode(0x09), true));
oTarget.addChild(oSpan);
break;
case para_NewLine:
//page break ->
//column break ->
//section break(next page) ->
//section break(even page) ->
//section break(odd page) ->
let oBr = new CopyElement("br");
if (ParaItem.BreakType === window['AscWord'].break_Page) {
oBr.oAttributes["clear"] = "all";
oBr.oAttributes["style"] = "mso-special-character:line-break;page-break-before:always;";
} else if (ParaItem.BreakType === window['AscWord'].break_Column) {
oBr.oAttributes["clear"] = "all";
oBr.oAttributes["style"] = "mso-column-break-before:always;";
} /*else if (ParaItem.BreakType === window['AscWord'].break_Line) {
if (ParaItem.Clear === AscWord.break_Clear_All) {
oBr.oAttributes["clear"] = "all";
oBr.oAttributes["style"] = "page-break-before:always;mso-break-type:section-break;";
} else if (ParaItem.Clear === AscWord.break_Clear_Left) {
oBr.oAttributes["clear"] = "all";
oBr.oAttributes["style"] = "page-break-before:left;mso-break-type:section-break;";
} else if (ParaItem.Clear === AscWord.break_Clear_Right) {
oBr.oAttributes["clear"] = "all";
oBr.oAttributes["style"] = "page-break-before:right;mso-break-type:section-break;";
}
}*/ else {
oBr.oAttributes["style"] = "mso-special-character:line-break;";
}
oTarget.addChild(oBr);
//todo закончить этот параграф и начать новый
//добавил неразрвной пробел для того, чтобы информация попадала в буфер обмена
oSpan = new CopyElement("span");
oSpan.addChild(new CopyElement(" ", true));
oTarget.addChild(oSpan);
break;
case para_Drawing:
let oGraphicObj = ParaItem.GraphicObj;
let sSrc = oGraphicObj.getBase64Img();
if(sSrc.length > 0)
{
let _h, _w;
if(oGraphicObj.cachedPixH)
_h = oGraphicObj.cachedPixH;
else
_h = ParaItem.Extent.H * g_dKoef_mm_to_pix;
if(oGraphicObj.cachedPixW)
_w = oGraphicObj.cachedPixW;
else
_w = ParaItem.Extent.W * g_dKoef_mm_to_pix;
let oImg = new CopyElement("img");
oImg.oAttributes["style"] = "max-width:100%;";
oImg.oAttributes["width"] = Math.round(_w);
oImg.oAttributes["height"] = Math.round(_h);
oImg.oAttributes["src"] = sSrc;
oTarget.addChild(oImg);
break;
}
break;
case para_PageNum:
if(null != ParaItem.String && "string" === typeof(ParaItem.String))
oTarget.addChild(new CopyElement(CopyPasteCorrectString(ParaItem.String), true));
break;
case para_FootnoteReference:
let oLink = new CopyElement("a");
let index = this.aFootnoteReference.length + 1;
let prefix = "ftn";
oLink.oAttributes["style"] = "mso-footnote-id:" + prefix + index;
oLink.oAttributes["href"] = "#_" + prefix + index;
oLink.oAttributes["name"] = "_" + prefix + "ref" + index;
oLink.oAttributes["title"] = "";
oSpan = new CopyElement("span");
oSpan.oAttributes["class"] = "MsoFootnoteReference";
let _oSpan2 = new CopyElement("span");
_oSpan2.addChild(new CopyElement(CopyPasteCorrectString("[" + index + "]"), true));
if (_oSpan2.oAttributes["style"]) {
_oSpan2.oAttributes["style"] += ";"
} else {
_oSpan2.oAttributes["style"] = "";
}
_oSpan2.oAttributes["style"] += "mso-special-character:footnote";
oSpan.addChild(_oSpan2);
this.parse_para_TextPr(ParaItem.Run.Get_CompiledTextPr(), oSpan);
oLink.addChild(oSpan);
oTarget.addChild(oLink);
this.aFootnoteReference.push(ParaItem.Footnote);
break;
case para_FieldChar:
if (ParaItem.ComplexField && ParaItem.ComplexField.Instruction && ParaItem.ComplexField.Instruction instanceof CFieldInstructionHYPERLINK) {
if (fldchartype_Begin === ParaItem.CharType && ParaItem.ComplexField.Instruction.BookmarkName) {
this.instructionHyperlinkStart = "#" + ParaItem.ComplexField.Instruction.BookmarkName;
} else if (fldchartype_End === ParaItem.CharType) {
this.instructionHyperlinkStart = null;
}
}
break;
}
},
CopyRun: function (Item, oTarget) {
for (var i = 0; i < Item.Content.length; i++) {
this.ParseItem(Item.Content[i], oTarget, Item.Content[i + 1], Item.Content.length);
}
},
CopyRunContent: function (Container, oTarget, bOmitHyperlink) {
var bookmarksStartMap = {};
var bookmarkPrviousTargetMap = {};
var bookmarkLevel = 0;
var closeBookmarks = function (_level) {
var tempTarget = bookmarkPrviousTargetMap[_level];
if (tempTarget) {
if (oTarget && !oTarget.isEmptyChild()) {
tempTarget.addChild(oTarget);
}
oTarget = tempTarget;
}
};
var realTarget;
var oHyperlink;
for (var i = 0; i < Container.Content.length; i++) {
var item = Container.Content[i];
if (para_Run === item.Type) {
//отдельная обработка для сносок, добавляем внутри данные
if (item.Content && item.Content.length === 1 && item.Content[0] && item.Content[0].Type === para_FootnoteReference) {
this.CopyRun(item, oTarget);
} else {
var oSpan = new CopyElement("span");
this.CopyRun(item, oSpan);
if (this.instructionHyperlinkStart && !realTarget) {
oHyperlink = new CopyElement("a");
oHyperlink.oAttributes["href"] = CopyPasteCorrectString(this.instructionHyperlinkStart);
oTarget.addChild(oHyperlink);
realTarget = oTarget;
oTarget = oHyperlink;
bOmitHyperlink = true;
} else if (realTarget && !this.instructionHyperlinkStart) {
//TODO close all bookmarks before change content. need to reconsider
if (bookmarkLevel > 0) {
while(bookmarkLevel > 0) {
closeBookmarks(bookmarkLevel);
bookmarkLevel--;
}
}
oTarget = realTarget;
bOmitHyperlink = false;
realTarget = null;
}
if (!oSpan.isEmptyChild()) {
this.parse_para_TextPr(item.Get_CompiledTextPr(), oSpan);
oTarget.addChild(oSpan);
}
}
} else if (para_Hyperlink === item.Type) {
if (!bOmitHyperlink) {
oHyperlink = new CopyElement("a");
var sValue = item.IsAnchor() ? "#" + item.Anchor : item.GetValue();
var sToolTip = item.GetToolTip();
oHyperlink.oAttributes["href"] = CopyPasteCorrectString(sValue);
oHyperlink.oAttributes["title"] = CopyPasteCorrectString(sToolTip);
//вложенные ссылки в html запрещены.
this.CopyRunContent(item, oHyperlink, true);
oTarget.addChild(oHyperlink);
} else {
this.CopyRunContent(item, oTarget, true);
}
} else if (para_Math === item.Type) {
var sSrc = item.MathToImageConverter();
if (null != sSrc && null != sSrc.ImageUrl) {
var oImg = new CopyElement("img");
if (sSrc.w_px > 0) {
oImg.oAttributes["width"] = sSrc.w_px;
}
if (sSrc.h_px > 0) {
oImg.oAttributes["height"] = sSrc.h_px;
}
oImg.oAttributes["src"] = sSrc.ImageUrl;
oTarget.addChild(oImg);
}
} else if (para_InlineLevelSdt === item.Type) {
this.CopyRunContent(item, oTarget);
} else if (para_Field === item.Type) {
this.CopyRunContent(item, oTarget);
} else if (para_Bookmark === item.Type) {
//для внутренних ссылок
//если конец ссылки находится в тепкущем параграфе, то закрываем тэг ссылки здесь
//если он находится в следующем параграфе, то закрываем после того, как прошлись по всему содержимому данного параграфа
//ms в данном случае берёт только первый элемент
//чтобы заранее не проходиться по всему контенту параграфа в поисках закрытия bookmark - закрываю его после всего цикла
//на следующий параграф не переносим
if (item.Start) {
bookmarkLevel++;
bookmarksStartMap[item.BookmarkId] = 1;
var oBookmark = new CopyElement("a");
var name = item.GetBookmarkName();
oBookmark.oAttributes["name"] = CopyPasteCorrectString(name);
bookmarkPrviousTargetMap[bookmarkLevel] = oTarget;
oTarget = oBookmark;
} else if (bookmarksStartMap[item.BookmarkId]) {
bookmarksStartMap[item.BookmarkId] = 0;
closeBookmarks(bookmarkLevel);
bookmarkLevel--;
}
}
}
if (bookmarkLevel > 0) {
while(bookmarkLevel > 0) {
closeBookmarks(bookmarkLevel);
bookmarkLevel--;
}
}
if (this.instructionHyperlinkStart) {
this.instructionHyperlinkStart = null;
}
},
CopyParagraph : function(oDomTarget, Item, selectedAll, nextElem)
{
var oDocument = this.oDocument;
var Para = null;
//Для heading пишем в h1
var styleId = Item.Style_Get();
if(styleId)
{
var styleName = oDocument.Styles.Get_Name( styleId ).toLowerCase();
//шаблон "heading n" (n=1:6)
if(0 === styleName.indexOf("heading"))
{
var nLevel = parseInt(styleName.substring("heading".length));
if(1 <= nLevel && nLevel <= 6)
Para = new CopyElement("h" + nLevel);
}
}
if(null == Para)
Para = new CopyElement("p");
var oNumPr;
var bIsNullNumPr = false;
if(PasteElementsId.g_bIsDocumentCopyPaste)
{
oNumPr = Item.GetNumPr();
bIsNullNumPr = (null == oNumPr || 0 == oNumPr.NumId);
}
else
{
oNumPr = Item.PresentationPr.Bullet;
bIsNullNumPr = (0 == oNumPr.m_nType);
}
var bBullet = false;
var sListStyle = "";
if(!bIsNullNumPr)
{
if(PasteElementsId.g_bIsDocumentCopyPaste)
{
var oNum = this.oDocument.GetNumbering().GetNum(oNumPr.NumId);
if (oNum)
{
var oNumberingLvl = oNum.GetLvl(oNumPr.Lvl);
if (oNumberingLvl)
{
switch (oNumberingLvl.GetFormat())
{
case Asc.c_oAscNumberingFormat.Decimal:
sListStyle = "decimal";
break;
case Asc.c_oAscNumberingFormat.LowerRoman:
sListStyle = "lower-roman";
break;
case Asc.c_oAscNumberingFormat.UpperRoman:
sListStyle = "upper-roman";
break;
case Asc.c_oAscNumberingFormat.LowerLetter:
sListStyle = "lower-alpha";
break;
case Asc.c_oAscNumberingFormat.UpperLetter:
sListStyle = "upper-alpha";
break;
default:
sListStyle = "disc";
bBullet = true;
break;
}
}
}
}
else
{
var _presentation_bullet = Item.PresentationPr.Bullet;
switch(_presentation_bullet.m_nType)
{
case AscFormat.numbering_presentationnumfrmt_ArabicParenBoth:
case AscFormat.numbering_presentationnumfrmt_ArabicParenR:
case AscFormat.numbering_presentationnumfrmt_ArabicPeriod:
case AscFormat.numbering_presentationnumfrmt_ArabicPlain:
{
sListStyle = "decimal";
break;
}
case AscFormat.numbering_presentationnumfrmt_RomanLcParenBoth:
case AscFormat.numbering_presentationnumfrmt_RomanLcParenR:
case AscFormat.numbering_presentationnumfrmt_RomanLcPeriod:
{
sListStyle = "lower-roman";
break;
}
case AscFormat.numbering_presentationnumfrmt_RomanUcParenBoth:
case AscFormat.numbering_presentationnumfrmt_RomanUcParenR:
case AscFormat.numbering_presentationnumfrmt_RomanUcPeriod:
{
sListStyle = "upper-roman";
break;
}
case AscFormat.numbering_presentationnumfrmt_AlphaLcParenBoth:
case AscFormat.numbering_presentationnumfrmt_AlphaLcParenR:
case AscFormat.numbering_presentationnumfrmt_AlphaLcPeriod:
{
sListStyle = "lower-alpha";
break;
}
case AscFormat.numbering_presentationnumfrmt_AlphaUcParenR:
case AscFormat.numbering_presentationnumfrmt_AlphaUcPeriod:
case AscFormat.numbering_presentationnumfrmt_AlphaUcParenBoth:
{
sListStyle = "upper-alpha";
break;
}
default:
sListStyle = "disc";
bBullet = true;
break;
}
}
}
//pPr
this.Commit_pPr(Item, Para, nextElem);
if(false === selectedAll)
{
//если последний элемент в выделении неполностью выделенный параграф, то он копируется как обычный текст без настроек параграфа и списков
this.CopyRunContent(Item, oDomTarget, false);
}
else
{
this.CopyRunContent(Item, Para, false);
//добавляем потому что параграфы без содержимого не копируются
if(Para.isEmptyChild())
Para.addChild(new CopyElement(" ", true));
if(bIsNullNumPr)
oDomTarget.addChild( Para );
else{
var Li = new CopyElement( "li" );
Li.oAttributes["style"] = "list-style-type: " + sListStyle;
Li.addChild( Para );
//пробуем добавить в предыдущий список
var oTargetList = null;
if(oDomTarget.aChildren.length > 0){
var oPrevElem = oDomTarget.aChildren[oDomTarget.aChildren.length - 1];
if((bBullet && "ul" === oPrevElem.sName) || (!bBullet && "ol" === oPrevElem.sName))
oTargetList = oPrevElem;
}
if (!bBullet) {
if (!this.listNextNumMap[oNumPr.NumId]) {
this.listNextNumMap[oNumPr.NumId] = 1;
} else {
this.listNextNumMap[oNumPr.NumId]++;
}
}
if (null == oTargetList) {
if (bBullet) {
oTargetList = new CopyElement("ul");
} else {
oTargetList = new CopyElement("ol");
}
oTargetList.oAttributes["style"] = "padding-left:40px";
//если список идёт с промежуточными элементами, добавляем аттрибут start
if (!bBullet && this.listNextNumMap[oNumPr.NumId] > 1) {
oTargetList.oAttributes["start"] = this.listNextNumMap[oNumPr.NumId];
}
oDomTarget.addChild(oTargetList);
}
oTargetList.addChild(Li);
}
}
},
_BorderToStyle : function(border, name)
{
var res = "";
if(border_None === border.Value)
res += name + ":none;";
else
{
//TODO получение цвета рассмотреть аналогично получению фону у ячейки с ипользованием функции GetSimpleColor
var size = 0.5;
var color = border.Color;
var unifill = border.Unifill;
if(null != border.Size)
size = border.Size * g_dKoef_mm_to_pt;
if (null == color)
color = { r: 0, g: 0, b: 0 };
res += name + ":" + size + "pt solid " + this.RGBToCSS(color, unifill) + ";";
}
return res;
},
_MarginToStyle : function(margins, styleName)
{
var res = "";
var nMarginLeft = 1.9;
var nMarginTop = 0;
var nMarginRight = 1.9;
var nMarginBottom = 0;
if(null != margins.Left && tblwidth_Mm === margins.Left.Type && null != margins.Left.W)
nMarginLeft = margins.Left.W;
if(null != margins.Top && tblwidth_Mm === margins.Top.Type && null != margins.Top.W)
nMarginTop = margins.Top.W;
if(null != margins.Right && tblwidth_Mm === margins.Right.Type && null != margins.Right.W)
nMarginRight = margins.Right.W;
if(null != margins.Bottom && tblwidth_Mm === margins.Bottom.Type && null != margins.Bottom.W)
nMarginBottom = margins.Bottom.W;
res = styleName + ":"+(nMarginTop * g_dKoef_mm_to_pt)+"pt "+(nMarginRight * g_dKoef_mm_to_pt)+"pt "+(nMarginBottom * g_dKoef_mm_to_pt)+"pt "+(nMarginLeft * g_dKoef_mm_to_pt)+"pt;";
return res;
},
_BordersToStyle : function(borders, bUseInner, bUseBetween, mso, alt)
{
var res = "";
if(null == mso)
mso = "";
if(null == alt)
alt = "";
if(null != borders.Left)
res += this._BorderToStyle(borders.Left, mso + "border-left" + alt);
if(null != borders.Top)
res += this._BorderToStyle(borders.Top, mso + "border-top" + alt);
if(null != borders.Right)
res += this._BorderToStyle(borders.Right, mso + "border-right" + alt);
if(null != borders.Bottom)
res += this._BorderToStyle(borders.Bottom, mso + "border-bottom" + alt);
if(bUseInner)
{
if(null != borders.InsideV)
res += this._BorderToStyle(borders.InsideV, "mso-border-insidev");
if(null != borders.InsideH)
res += this._BorderToStyle(borders.InsideH, "mso-border-insideh");
}
if(bUseBetween)
{
if(null != borders.Between)
res += this._BorderToStyle(borders.Between, "mso-border-between");
}
return res;
},
_MergeProp : function(elem1, elem2)
{
if( !elem1 || !elem2 )
{
return;
}
var p, v;
for(p in elem2)
{
if(elem2.hasOwnProperty(p) && !elem1.hasOwnProperty(p))
{
v = elem2[p];
if(null != v)
elem1[p] = v;
}
}
},
CopyCell : function(tr, cell, tablePr, width, rowspan)
{
var tc = new CopyElement("td");
//Pr
var tcStyle = "";
if(width > 0)
{
tc.oAttributes["width"] = Math.round(width * g_dKoef_mm_to_pix);
tcStyle += "width:"+(width * g_dKoef_mm_to_pt)+"pt;";
}
if(rowspan > 1)
tc.oAttributes["rowspan"] = rowspan;
var cellPr = null;
var tablePr = null;
if(!PasteElementsId.g_bIsPDFCopyPaste && !PasteElementsId.g_bIsDocumentCopyPaste && editor.WordControl.m_oLogicDocument && null != cell.CompiledPr && null != cell.CompiledPr.Pr)
{
var presentation = editor.WordControl.m_oLogicDocument;
var curSlide = presentation.Slides[presentation.CurPage];
if(presentation && curSlide && curSlide.Layout && curSlide.Layout.Master && curSlide.Layout.Master.Theme)
AscFormat.checkTableCellPr(cell.CompiledPr.Pr, curSlide, curSlide.Layout, curSlide.Layout.Master, curSlide.Layout.Master.Theme);
}
if(null != cell.CompiledPr && null != cell.CompiledPr.Pr)
{
cellPr = cell.CompiledPr.Pr;
//Для первых и послених ячеек выставляются margin а не colspan
if(null != cellPr.GridSpan && cellPr.GridSpan > 1)
tc.oAttributes["colspan"] = cellPr.GridSpan;
}
if(null != cellPr && null != cellPr.Shd)
{
if (c_oAscShdNil !== cellPr.Shd.Value && (null != cellPr.Shd.Color || null != cellPr.Shd.Unifill)) {
var _shdColor = cellPr.Shd.GetSimpleColor(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
//todo проверить и убрать else, всегда использовать GetSimpleColor
if (_shdColor) {
_shdColor = this.RGBToCSS(_shdColor);
} else {
_shdColor = this.RGBToCSS(cellPr.Shd.Color, cellPr.Shd.Unifill);
}
tcStyle += "background-color:" + _shdColor + ";";
}
}
else if(null != tablePr && null != tablePr.Shd)
{
if (c_oAscShdNil !== tablePr.Shd.Value && (null != tablePr.Shd.Color || null != tablePr.Shd.Unifill))
tcStyle += "background-color:" + this.RGBToCSS(tablePr.Shd.Color, tablePr.Shd.Unifill) + ";";
}
var oCellMar = {};
if(null != cellPr && null != cellPr.TableCellMar)
this._MergeProp(oCellMar, cellPr.TableCellMar);
if(null != tablePr && null != tablePr.TableCellMar)
this._MergeProp(oCellMar, tablePr.TableCellMar);
tcStyle += this._MarginToStyle(oCellMar, "padding");
var oCellBorder = cell.Get_Borders();
tcStyle += this._BordersToStyle(oCellBorder, false, false);
if("" != tcStyle)
tc.oAttributes["style"] = tcStyle;
//Content
this.CopyDocument2(tc, cell.Content);
tr.addChild(tc);
},
CopyRow : function(oDomTarget, table, nCurRow, elems, nMaxRow)
{
var row = table.Content[nCurRow];
if(null == elems)
elems = {gridStart: 0, gridEnd: table.TableGrid.length - 1, indexStart: null, indexEnd: null, after: null, before: null, cells: row.Content};
var tr = new CopyElement("tr");
//Pr
var gridSum = table.TableSumGrid;
var trStyle = "";
var nGridBefore = 0;
var rowPr = null;
var CompiledPr = row.Get_CompiledPr();
if(null != CompiledPr)
rowPr = CompiledPr;
if(null != rowPr)
{
if(null == elems.before && null != rowPr.GridBefore && rowPr.GridBefore > 0)
{
elems.before = rowPr.GridBefore;
elems.gridStart += rowPr.GridBefore;
}
if(null == elems.after && null != rowPr.GridAfter && rowPr.GridAfter > 0)
{
elems.after = rowPr.GridAfter;
elems.gridEnd -= rowPr.GridAfter;
}
//height
if(null != rowPr.Height && Asc.linerule_Auto != rowPr.Height.HRule && null != rowPr.Height.Value)
{
trStyle += "height:"+(rowPr.Height.Value * g_dKoef_mm_to_pt)+"pt;";
}
}
//WBefore
if(null != elems.before)
{
if(elems.before > 0)
{
nGridBefore = elems.before;
var nWBefore = gridSum[elems.gridStart - 1] - gridSum[elems.gridStart - nGridBefore - 1];
//Записываем margin
trStyle += "mso-row-margin-left:"+(nWBefore * g_dKoef_mm_to_pt)+"pt;";
//добавляем td для тех кто не понимает mso-row-margin-left
var oNewTd = new CopyElement("td");
oNewTd.oAttributes["style"] = "mso-cell-special:placeholder;border:none;padding:0cm 0cm 0cm 0cm";
oNewTd.oAttributes["width"] = Math.round(nWBefore * g_dKoef_mm_to_pix);
if(nGridBefore > 1)
oNewTd.oAttributes["colspan"] = nGridBefore;
var oNewP = new CopyElement("p");
oNewP.oAttributes["style"] = "margin:0cm";
oNewP.addChild(new CopyElement(" ", true));
oNewTd.addChild(oNewP);
tr.addChild(oNewTd);
}
}
var tablePr = null;
var compiledTablePr = table.Get_CompiledPr();
if(null != compiledTablePr && null != compiledTablePr.TablePr)
tablePr = compiledTablePr.TablePr;
//tc
for(var i in elems.cells)
{
var cell = row.Content[i];
if(vmerge_Continue !== cell.GetVMerge())
{
var StartGridCol = cell.Metrics.StartGridCol;
var GridSpan = cell.Get_GridSpan();
var width = gridSum[StartGridCol + GridSpan - 1] - gridSum[StartGridCol - 1];
//вычисляем rowspan
var nRowSpan = table.Internal_GetVertMergeCount(nCurRow, StartGridCol, GridSpan);
if(nCurRow + nRowSpan - 1 > nMaxRow)
{
nRowSpan = nMaxRow - nCurRow + 1;
if(nRowSpan <= 0)
nRowSpan = 1;
}
this.CopyCell(tr, cell, tablePr, width, nRowSpan);
}
}
//WAfter
if(null != elems.after)
{
if(elems.after > 0)
{
var nGridAfter = elems.after;
var nWAfter = gridSum[elems.gridEnd + nGridAfter] - gridSum[elems.gridEnd];
//Записываем margin
trStyle += "mso-row-margin-right:"+(nWAfter * g_dKoef_mm_to_pt)+"pt;";
//добавляем td для тех кто не понимает mso-row-margin-left
var oNewTd = new CopyElement("td");
oNewTd.oAttributes["style"] = "mso-cell-special:placeholder;border:none;padding:0cm 0cm 0cm 0cm";
oNewTd.oAttributes["width"] = Math.round(nWAfter * g_dKoef_mm_to_pix);
if(nGridAfter > 1)
oNewTd.oAttributes["colspan"] = nGridAfter;
var oNewP = new CopyElement("p");
oNewP.oAttributes["style"] = "margin:0cm";
oNewP.addChild(new CopyElement(" ", true));
oNewTd.addChild(oNewP);
tr.addChild(oNewTd);
}
}
if("" != trStyle)
tr.oAttributes["style"] = trStyle;
oDomTarget.addChild(tr);
},
CopyTable : function(oDomTarget, table, aRowElems)
{
var DomTable = new CopyElement("table");
var compiledPr = table.Get_CompiledPr();
var Pr = null;
if(compiledPr && null != compiledPr.TablePr)
Pr = compiledPr.TablePr;
var tblStyle = "";
var bBorder = false;
if(null != Pr)
{
var align = "";
if(true != table.Inline && null != table.PositionH)
{
var PositionH = table.PositionH;
if(true === PositionH.Align)
{
switch(PositionH.Value)
{
case c_oAscXAlign.Outside:
case c_oAscXAlign.Right: align = "right";break;
case c_oAscXAlign.Center: align = "center";break;
}
}
else if(table.TableSumGrid)
{
var TableWidth = table.TableSumGrid[ table.TableSumGrid.length - 1 ];
var nLeft = PositionH.Value;
var nRight = nLeft + TableWidth;
var nFromLeft = Math.abs(nLeft - X_Left_Margin);
var nFromCenter = Math.abs((Page_Width - X_Right_Margin + X_Left_Margin) / 2 - (nLeft + nRight) / 2);
var nFromRight = Math.abs(Page_Width - nRight - X_Right_Margin);
if(nFromRight < nFromLeft || nFromCenter < nFromLeft)
{
if(nFromRight < nFromCenter)
align = "right";
else
align = "center";
}
}
}
else if(null != Pr.Jc)
{
switch(Pr.Jc)
{
case align_Center:align = "center";break;
case align_Right:align = "right";break;
}
}
if("" != align)
DomTable.oAttributes["align"] = align;
if(null != Pr.TableInd && Pr.Jc !== align_Center)
tblStyle += "margin-left:"+(Pr.TableInd * g_dKoef_mm_to_pt)+"pt;";
if (null != Pr.Shd && c_oAscShdNil !== Pr.Shd.Value && (null != Pr.Shd.Color || null != Pr.Shd.Unifill))
tblStyle += "background:" + this.RGBToCSS(Pr.Shd.Color, Pr.Shd.Unifill) + ";";
if(null != Pr.TableCellMar)
tblStyle += this._MarginToStyle(Pr.TableCellMar, "mso-padding-alt");
if(null != Pr.TableBorders)
tblStyle += this._BordersToStyle(Pr.TableBorders, true, false);
}
//ищем cellSpacing
var bAddSpacing = false;
if(table.Content.length > 0)
{
var firstRow = table.Content[0];
var rowPr = firstRow.Get_CompiledPr();
if(null != rowPr && null != rowPr.TableCellSpacing)
{
bAddSpacing = true;
var cellSpacingMM = rowPr.TableCellSpacing;
tblStyle += "mso-cellspacing:"+(cellSpacingMM * g_dKoef_mm_to_pt)+"pt;";
DomTable.oAttributes["cellspacing"] = Math.round(cellSpacingMM * g_dKoef_mm_to_pix);
}
}
if(!bAddSpacing)
DomTable.oAttributes["cellspacing"] = 0;
DomTable.oAttributes["border"] = false == bBorder ? 0 : 1;
DomTable.oAttributes["cellpadding"] = 0;
if("" != tblStyle)
DomTable.oAttributes["style"] = tblStyle;
//rows
table.Recalculate_Grid();
if(null == aRowElems)
{
for(var i = 0, length = table.Content.length; i < length; i++)
this.CopyRow(DomTable, table, i , null, table.Content.length - 1);
}
else
{
var nMaxRow = 0;
for(var i = 0, length = aRowElems.length; i < length; ++i)
{
var elem = aRowElems[i];
if(elem.row > nMaxRow)
nMaxRow = elem.row;
}
for(var i = 0, length = aRowElems.length; i < length; ++i)
{
var elem = aRowElems[i];
this.CopyRow(DomTable, table, elem.row, elem, nMaxRow);
}
}
oDomTarget.addChild(DomTable);
},
CopyDocument2 : function(oDomTarget, oDocument, elementsContent, dNotGetBinary)
{
if(PasteElementsId.g_bIsDocumentCopyPaste)
{
if(!elementsContent && oDocument && oDocument.Content)
elementsContent = oDocument.Content;
for ( var Index = 0; Index < elementsContent.length; Index++ )
{
var Item;
if(elementsContent[Index].Element)
Item = elementsContent[Index].Element;
else
Item = elementsContent[Index];
if(type_Table === Item.GetType() )
{
this.oBinaryFileWriter.copyParams.bLockCopyElems++;
if(!this.onlyBinaryCopy)
this.CopyTable(oDomTarget, Item, null);
this.oBinaryFileWriter.copyParams.bLockCopyElems--;
if(!dNotGetBinary)
this.oBinaryFileWriter.CopyTable(Item, null);
}
else if ( type_Paragraph === Item.GetType() )
{
var SelectedAll = Index === elementsContent.length - 1 ? elementsContent[Index].SelectedAll : true;
//todo может только для верхнего уровня надо Index == End
if (!dNotGetBinary) {
this.oBinaryFileWriter.CopyParagraph(Item, SelectedAll);
}
if (!this.onlyBinaryCopy) {
var _nextElem;
if (elementsContent[Index + 1] && elementsContent[Index + 1].Element) {
_nextElem = elementsContent[Index + 1].Element;
} else {
_nextElem = elementsContent[Index + 1];
}
this.CopyParagraph(oDomTarget, Item, SelectedAll, _nextElem);
}
}
else if(type_BlockLevelSdt === Item.GetType() )
{
this.oBinaryFileWriter.copyParams.bLockCopyElems++;
if(!this.onlyBinaryCopy)
{
this.CopyDocument2(oDomTarget, oDocument, Item.Content.Content, true);
}
this.oBinaryFileWriter.copyParams.bLockCopyElems--;
if(!dNotGetBinary)
this.oBinaryFileWriter.CopySdt(Item);
}
}
}
else if (PasteElementsId.g_bIsPDFCopyPaste)
{
this.copyPDF(oDomTarget, oDocument, elementsContent);
}
else//presentation
{
this.copyPresentation2(oDomTarget, oDocument, elementsContent);
}
},
copyPDF: function(oDomTarget, oDocument, elementsContent) {
//DocContent/ Drawings
if (elementsContent && elementsContent.length) {
if (elementsContent[0].DocContent
|| (elementsContent[0].Drawings && elementsContent[0].Drawings.length)
|| (elementsContent[0].Annots && elementsContent[0].Annots.length)
|| (elementsContent[0].Fields && elementsContent[0].Fields.length)
|| elementsContent[0].Pages.length) {
this.oPDFWriter.WriteString2(this.api.documentId);
//флаг о том, что множественный контент в буфере
this.oPDFWriter.WriteBool(true);
}
//записываем все варианты контента
//в html записываем первый вариант - конечное форматирование
//в банарник пишем: 1)конечное форматирование 2)исходное форматирование 3)картинка
this.oPDFWriter.WriteULong(elementsContent.length);
for (var i = 0; i < elementsContent.length; i++) {
if (i === 0) {
this.copyPDFContent(elementsContent[i], oDomTarget);
}
}
}
},
copyPresentation2: function(oDomTarget, oDocument, elementsContent){
//DocContent/ Drawings/ SlideObjects
var presentation = this.oDocument;
if(elementsContent && elementsContent.length){
if(elementsContent[0].isValid())
{
var themeName = elementsContent[0].ThemeName ? elementsContent[0].ThemeName : "";
this.oPresentationWriter.WriteString2(this.api.documentId);
this.oPresentationWriter.WriteString2(themeName);
this.oPresentationWriter.WriteDouble(presentation.GetWidthMM());
this.oPresentationWriter.WriteDouble(presentation.GetHeightMM());
//флаг о том, что множественный контент в буфере
this.oPresentationWriter.WriteBool(true);
}
//записываем все варианты контента
//в html записываем первый вариант - конечное форматирование
//в банарник пишем: 1)конечное форматирование 2)исходное форматирование 3)картинка
this.oPresentationWriter.WriteULong(elementsContent.length);
for(var i = 0; i < elementsContent.length; i++)
{
if(i === 0)
{
this.copyPresentationContent(elementsContent[i], oDomTarget);
}
else
{
this.copyPresentationContent(elementsContent[i]);
}
}
}
/*else if(elementsContent)
{
//эту ветку оставляю для записи едиственного варианта контента, который используется функцией getSelectedBinary
if(elementsContent.DocContent || (elementsContent.Drawings && elementsContent.Drawings.length) || (elementsContent.SlideObjects && elementsContent.SlideObjects.length))
{
this.oPresentationWriter.WriteString2(this.api.documentId);
this.oPresentationWriter.WriteDouble(presentation.GetWidth());
this.oPresentationWriter.WriteDouble(presentation.GetHeight());
}
this.copyPresentationContent(elementsContent, oDomTarget);
}*/
else
{
//для записи внутреннего контента таблицы
this.copyPresentationContent(oDocument, oDomTarget);
}
},
copyPDFContent: function (elementsContent, oDomTarget) {
if(elementsContent instanceof AscPDF.PDFSelectedContent) {
this._writePDFSelectedContent(elementsContent, oDomTarget);
}
else {
//inner recursive call CopyDocument2 function
if (elementsContent && elementsContent.Content && elementsContent.Content.length) {//пишем таблицу в html
for (var Index = 0; Index < elementsContent.Content.length; Index++) {
var Item = elementsContent.Content[Index];
if (type_Table === Item.GetType()) {
this.CopyTable(oDomTarget, Item, null);
} else if (type_Paragraph === Item.GetType()) {
this.CopyParagraph(oDomTarget, Item, true);
}
}
}
}
},
_writePDFSelectedContent: function(elementsContent, oDomTarget){
let oThis = this;
let oDoc = Asc.editor.getPDFDoc();
let copyDocContent = function(){
let docContent = elementsContent.DocContent;
if (docContent.Elements) {
let elements = docContent.Elements;
//пишем метку и длины
oThis.oPDFWriter.WriteString2("DocContent");
oThis.oPDFWriter.WriteDouble(elements.length);
//пишем контент
for (let Index = 0; Index < elements.length; Index++) {
let Item;
if (elements[Index].Element) {
Item = elements[Index].Element;
} else {
Item = elements[Index];
}
if (type_Paragraph === Item.GetType()) {
oThis.oPDFWriter.StartRecord(elements[Index].SelectedAll ? 1 : 0);
oThis.oPDFWriter.WriteParagraph(Item);
oThis.oPDFWriter.EndRecord();
if (oDomTarget) {
oThis.CopyParagraph(oDomTarget, Item, true);
}
}
}
}
};
let copyDrawings = function(elements){
//пишем метку и длины
oThis.oPDFWriter.WriteString2("Drawings");
oThis.oPDFWriter.WriteULong(elements.length);
oThis.oPDFWriter.Start_UseFullUrl();
for (let i = 0; i < elements.length; ++i) {
if (!elements[i].Drawing.isTable()) {
oThis.oPDFWriter.WriteBool(true);
oThis.CopyPDFGraphicObject(oDomTarget, elements[i].Drawing, elements[i]);
oThis.oPDFWriter.WriteDouble(elements[i].X);
oThis.oPDFWriter.WriteDouble(elements[i].Y);
oThis.oPDFWriter.WriteDouble(elements[i].ExtX);
oThis.oPDFWriter.WriteDouble(elements[i].ExtY);
//TODO записывать base64 у картинок для разных контентов в единственном экземпляре
if(elements[i].Drawing.isImage()) {
oThis.oPDFWriter.WriteString2("");
} else {
oThis.oPDFWriter.WriteString2(elements[i].ImageUrl);
}
} else {
let isOnlyTable = elements.length === 1;
oThis.CopyPDFTableFull(oDomTarget, elements[i].Drawing, isOnlyTable);
oThis.oPDFWriter.WriteDouble(elements[i].X);
oThis.oPDFWriter.WriteDouble(elements[i].Y);
oThis.oPDFWriter.WriteDouble(elements[i].ExtX);
oThis.oPDFWriter.WriteDouble(elements[i].ExtY);
oThis.oPDFWriter.WriteString2(elements[i].ImageUrl);
}
}
oThis.oPDFWriter.End_UseFullUrl();
};
let copyAnnots = function(){
if (oDomTarget) {
let oAnnots = new CopyElement("div");
oDomTarget.addChild(oAnnots);
}
let elements = elementsContent.Annots;
//пишем метку и длину
oThis.oPDFWriter.WriteString2("Annots");
oThis.oPDFWriter.WriteULong(elements.length);
oThis.oPDFWriter.Start_UseFullUrl();
for (let i = 0; i < elements.length; ++i) {
oThis.CopyPDFAnnotObject(elements[i]);
}
oThis.oPDFWriter.End_UseFullUrl();
};
let copyFields = function(){
if (oDomTarget) {
let oFields = new CopyElement("div");
oDomTarget.addChild(oFields);
}
let elements = elementsContent.Fields;
//пишем метку и длину
oThis.oPDFWriter.WriteString2("Fields");
oThis.oPDFWriter.WriteULong(elements.length);
oThis.oPDFWriter.Start_UseFullUrl();
for (let i = 0; i < elements.length; ++i) {
oThis.CopyPDFFieldObject(elements[i]);
}
oThis.oPDFWriter.WriteFieldsAdditionalInfo();
oThis.oPDFWriter.End_UseFullUrl();
};
let copyPages = function() {
if (oDomTarget) {
let oPages = new CopyElement("div");
oDomTarget.addChild(oPages);
}
let selected_pages = elementsContent.Pages;
oThis.oPDFWriter.WriteString2("Pages");
let aIndexes = selected_pages.map(function(page) {
return page.GetIndex();
});
// writing pages binary
let aUint8Array = oDoc.GetPagesBinary(aIndexes, false);
oThis.oPDFWriter.WriteULong(aUint8Array.length);
oThis.oPDFWriter.WriteBuffer(aUint8Array, 0, aUint8Array.length);
// pages count
oThis.oPDFWriter.WriteULong(selected_pages.length);
// write pages drawings
for (let i = 0; i < selected_pages.length; i++) {
copyDrawings(selected_pages[i].drawings.map(function(drawing) {
return new AscPDF.DrawingCopyObject(drawing, drawing.x, drawing.y, drawing.extX, drawing.extY, drawing.getBase64Img())
}));
}
};
// пишем количество
let contentCount = 0;
for(let i in elementsContent){
if(elementsContent[i] && typeof elementsContent[i] === "object" && elementsContent[i].length){
contentCount++;
} else if(null !== elementsContent[i] && elementsContent[i] instanceof AscCommonWord.CSelectedContent){
contentCount++;
}
}
oThis.oPDFWriter.WriteString2("SelectedContent");
oThis.oPDFWriter.WriteULong(contentCount);
//Pages
if (elementsContent.Pages.length > 0) {
copyPages();
}
//DocContent
if (elementsContent.DocContent) {
copyDocContent();
}
//Drawings
if (elementsContent.Drawings.length > 0) {
copyDrawings(elementsContent.Drawings);
}
//Annots
if (elementsContent.Annots.length) {
copyAnnots();
}
//Fields
if (elementsContent.Fields.length) {
copyFields();
}
},
CopyPDFTableFull: function (oDomTarget, graphicFrame, isOnlyTable) {
var Item = graphicFrame.graphicObject;
var b_style_index = false;
var oDoc = Asc.editor.getPDFDoc();
if (Item.TableStyle && oDoc.globalTableStyles.Style[Item.TableStyle]) {
b_style_index = true;
}
for (var key in oDoc.TableStylesIdMap) {
if (oDoc.TableStylesIdMap.hasOwnProperty(key)) {
this.oPDFWriter.tableStylesGuides[key] = "{" + AscCommon.GUID() + "}"
}
}
this.oPDFWriter.WriteBool(!b_style_index);
if (b_style_index) {
var tableStyle = oDoc.globalTableStyles.Style[Item.TableStyle];
this.oPDFWriter.WriteBool(true);
this.oPDFWriter.WriteTableStyle(Item.TableStyle, tableStyle);
this.oPDFWriter.WriteBool(true);
this.oPDFWriter.WriteString2(Item.TableStyle);
}
History.TurnOff();
this.oPDFWriter.WriteGrFrame(graphicFrame);
//для случая, когда копируем 1 таблицу из презентаций, в бинарник заносим ещё одну такую же табличку, но со скомпиоированными стилями(для вставки в word / excel)
if (isOnlyTable) {
this.convertToCompileStylesTable(Item);
this.oPDFWriter.WriteGrFrame(graphicFrame);
}
History.TurnOn();
if (oDomTarget) {
this.CopyTable(oDomTarget, Item, null);
}
},
copyPresentationContent: function (elementsContent, oDomTarget) {
if(elementsContent instanceof PresentationSelectedContent){
this._writePresentationSelectedContent(elementsContent, oDomTarget);
}
else
{
//inner recursive call CopyDocument2 function
if (elementsContent && elementsContent.Content && elementsContent.Content.length) {//пишем таблицу в html
for (var Index = 0; Index < elementsContent.Content.length; Index++) {
var Item = elementsContent.Content[Index];
if (type_Table === Item.GetType()) {
this.CopyTable(oDomTarget, Item, null);
} else if (type_Paragraph === Item.GetType()) {
this.CopyParagraph(oDomTarget, Item, true);
}
}
}
}
},
_writePresentationSelectedContent: function(elementsContent, oDomTarget){
var oThis = this;
var copyDocContent = function(){
var docContent = elementsContent.DocContent;
if (docContent.Elements) {
var elements = docContent.Elements;
//пишем метку и длины
oThis.oPresentationWriter.WriteString2("DocContent");
oThis.oPresentationWriter.WriteDouble(elements.length);
//пишем контент
for (var Index = 0; Index < elements.length; Index++) {
var Item;
if (elements[Index].Element) {
Item = elements[Index].Element;
} else {
Item = elements[Index];
}
if (type_Paragraph === Item.GetType()) {
oThis.oPresentationWriter.StartRecord(elements[Index].SelectedAll ? 1 : 0);
oThis.oPresentationWriter.WriteParagraph(Item);
oThis.oPresentationWriter.EndRecord();
if (oDomTarget) {
oThis.CopyParagraph(oDomTarget, Item, true);
}
}
}
}
};
var copyDrawings = function(){
var elements = elementsContent.Drawings;
//var selected_objects = graphicObjects.State.id === STATES_ID_GROUP ? graphicObjects.State.group.selectedObjects : graphicObjects.selectedObjects;
//пишем метку и длины
oThis.oPresentationWriter.WriteString2("Drawings");
oThis.oPresentationWriter.WriteULong(elements.length);
pptx_content_writer.Start_UseFullUrl();
for (var i = 0; i < elements.length; ++i) {
if (!elements[i].Drawing.isTable()) {
oThis.oPresentationWriter.WriteBool(true);
oThis.CopyGraphicObject(oDomTarget, elements[i].Drawing, elements[i]);
oThis.oPresentationWriter.WriteDouble(elements[i].X);
oThis.oPresentationWriter.WriteDouble(elements[i].Y);
oThis.oPresentationWriter.WriteDouble(elements[i].ExtX);
oThis.oPresentationWriter.WriteDouble(elements[i].ExtY);
//TODO записывать base64 у картинок для разных контентов в единственном экземпляре
if(elements[i].Drawing.isImage()) {
oThis.oPresentationWriter.WriteString2("");
} else {
oThis.oPresentationWriter.WriteString2(elements[i].ImageUrl);
}
} else {
var isOnlyTable = elements.length === 1;
oThis.CopyPresentationTableFull(oDomTarget, elements[i].Drawing, isOnlyTable);
oThis.oPresentationWriter.WriteDouble(elements[i].X);
oThis.oPresentationWriter.WriteDouble(elements[i].Y);
oThis.oPresentationWriter.WriteDouble(elements[i].ExtX);
oThis.oPresentationWriter.WriteDouble(elements[i].ExtY);
oThis.oPresentationWriter.WriteString2(elements[i].ImageUrl);
}
}
pptx_content_writer.End_UseFullUrl();
};
var copySlideObjects = function(){
var selected_slides = elementsContent.SlideObjects;
oThis.oPresentationWriter.WriteString2("SlideObjects");
oThis.oPresentationWriter.WriteULong(selected_slides.length);
var layouts_map = {};
var layout_count = 0;
editor.WordControl.m_oLogicDocument.CalculateComments();
//пишем слайд
var slide;
for (var i = 0; i < selected_slides.length; ++i) {
slide = selected_slides[i];
if(i === 0){
oThis.CopySlide(oDomTarget, slide);
} else{
oThis.CopySlide(null, slide);
}
}
};
var copyLayouts = function(){
var selected_layouts = elementsContent.Layouts;
oThis.oPresentationWriter.WriteString2("Layouts");
oThis.oPresentationWriter.WriteULong(selected_layouts.length);
for (var i = 0; i < selected_layouts.length; ++i) {
oThis.CopyLayout(selected_layouts[i]);
}
};
var copyMasters = function(){
var selected_masters = elementsContent.Masters;
oThis.oPresentationWriter.WriteString2("Masters");
oThis.oPresentationWriter.WriteULong(selected_masters.length);
for (var i = 0; i < selected_masters.length; ++i) {
oThis.oPresentationWriter.WriteSlideMaster(selected_masters[i]);
}
};
var copyNotes = function(){
var selected_notes = elementsContent.Notes;
oThis.oPresentationWriter.WriteString2("Notes");
oThis.oPresentationWriter.WriteULong(selected_notes.length);
for (var i = 0; i < selected_notes.length; ++i) {
oThis.oPresentationWriter.WriteSlideNote(selected_notes[i]);
}
};
var copyNoteMasters = function(){
var selected_note_master = elementsContent.NotesMasters;
oThis.oPresentationWriter.WriteString2("NotesMasters");
oThis.oPresentationWriter.WriteULong(selected_note_master.length);
for (var i = 0; i < selected_note_master.length; ++i) {
oThis.oPresentationWriter.WriteNoteMaster(selected_note_master[i]);
}
};
var copyNoteTheme = function(){
var selected_themes = elementsContent.NotesThemes;
oThis.oPresentationWriter.WriteString2("NotesThemes");
oThis.oPresentationWriter.WriteULong(selected_themes.length);
for (var i = 0; i < selected_themes.length; ++i) {
oThis.oPresentationWriter.WriteTheme(selected_themes[i]);
}
};
var copyTheme = function(){
var selected_themes = elementsContent.Themes;
oThis.oPresentationWriter.WriteString2("Themes");
oThis.oPresentationWriter.WriteULong(selected_themes.length);
for (var i = 0; i < selected_themes.length; ++i) {
oThis.oPresentationWriter.WriteTheme(selected_themes[i]);
}
};
var copyIndexes = function(selected_indexes){
oThis.oPresentationWriter.WriteULong(selected_indexes.length);
for (var i = 0; i < selected_indexes.length; ++i) {
oThis.oPresentationWriter.WriteULong(selected_indexes[i]);
}
};
//получаем пишем количество
var contentCount = 0;
for(var i in elementsContent){
if(elementsContent[i] && typeof elementsContent[i] === "object" && elementsContent[i].length){
contentCount++;
} else if(null !== elementsContent[i] && elementsContent[i] instanceof AscCommonWord.CSelectedContent){
contentCount++;
}
}
oThis.oPresentationWriter.WriteString2("SelectedContent");
oThis.oPresentationWriter.WriteULong((elementsContent.PresentationWidth * 100000) >> 0);
oThis.oPresentationWriter.WriteULong((elementsContent.PresentationHeight * 100000) >> 0);
oThis.oPresentationWriter.WriteULong(contentCount);
//DocContent
if (elementsContent.DocContent) {//пишем контент
copyDocContent();
}
//Drawings
if (elementsContent.Drawings && elementsContent.Drawings.length) {
copyDrawings();
}
//SlideObjects
if (elementsContent.SlideObjects && elementsContent.SlideObjects.length) {
copySlideObjects();
}
//Layouts
if (elementsContent.Layouts && elementsContent.Layouts.length) {
copyLayouts();
}
//LayoutsIndexes
if (elementsContent.LayoutsIndexes && elementsContent.LayoutsIndexes.length) {
oThis.oPresentationWriter.WriteString2("LayoutsIndexes");
copyIndexes(elementsContent.LayoutsIndexes);
}
//Masters
if (elementsContent.Masters && elementsContent.Masters.length) {
copyMasters();
}
//MastersIndexes
if (elementsContent.MastersIndexes && elementsContent.MastersIndexes.length) {
oThis.oPresentationWriter.WriteString2("MastersIndexes");
copyIndexes(elementsContent.MastersIndexes);
}
//Notes
if (elementsContent.Notes && elementsContent.Notes.length) {
//TODO если нет Notes, то Notes должен быть равен null. вместо этого приходится проверять 1 элемент массива
if(!(elementsContent.Notes.length === 1 && null === elementsContent.Notes[0])){
copyNotes();
}
}
//NotesMasters
if (elementsContent.NotesMasters && elementsContent.NotesMasters.length) {
copyNoteMasters();
}
//NotesMastersIndexes
if (elementsContent.NotesMastersIndexes && elementsContent.NotesMastersIndexes.length) {
oThis.oPresentationWriter.WriteString2("NotesMastersIndexes");
copyIndexes(elementsContent.NotesMastersIndexes);
}
//NotesThemes
if (elementsContent.NotesThemes && elementsContent.NotesThemes.length) {
copyNoteTheme();
}
//Themes
if (elementsContent.Themes && elementsContent.Themes.length) {
copyTheme();
}
//ThemesIndexes
if (elementsContent.ThemesIndexes && elementsContent.ThemesIndexes.length) {
oThis.oPresentationWriter.WriteString2("ThemeIndexes");
copyIndexes(elementsContent.ThemesIndexes);
}
},
getSelectedBinary : function()
{
var oDocument = this.oDocument;
if(PasteElementsId.g_bIsDocumentCopyPaste)
{
var selectedContent = oDocument.GetSelectedContent();
var elementsContent;
if(selectedContent && selectedContent.Elements && selectedContent.Elements[0] && selectedContent.Elements[0].Element)
elementsContent = selectedContent.Elements;
else
return false;
var drawingUrls = [];
if(selectedContent.DrawingObjects && selectedContent.DrawingObjects.length)
{
var url, correctUrl, graphicObj;
for(var i = 0; i < selectedContent.DrawingObjects.length; i++)
{
graphicObj = selectedContent.DrawingObjects[i].GraphicObj;
if(graphicObj.isImage())
{
url = graphicObj.getImageUrl();
if(window["NativeCorrectImageUrlOnCopy"])
{
correctUrl = window["NativeCorrectImageUrlOnCopy"](url);
drawingUrls[i] = correctUrl;
}
}
}
}
//подменяем Document для копирования(если не подменить, то commentId будет не соответствовать)
this.oBinaryFileWriter.Document = elementsContent[0].Element.LogicDocument;
if (!this.oBinaryFileWriter.Document)
this.oBinaryFileWriter.Document = this.oDocument;
this.oBinaryFileWriter.CopyStart();
this.CopyDocument2(null, oDocument, elementsContent);
this.oBinaryFileWriter.CopyEnd();
var sBase64 = this.oBinaryFileWriter.GetResult();
var text = "";
if (oDocument.GetSelectedText)
text = oDocument.GetSelectedText();
return {sBase64: "docData;" + sBase64, text: text, drawingUrls: drawingUrls};
}
},
Start : function () {
var oDocument = this.oDocument;
var bFromPresentation;
window['AscCommon'].g_specialPasteHelper.SpecialPasteButton_Hide();
var sBase64, oElem, sStyle;
var selectedContent;
if (PasteElementsId.g_bIsDocumentCopyPaste) {
selectedContent = oDocument.GetSelectedContent();
var elementsContent;
if (selectedContent && selectedContent.Elements && selectedContent.Elements[0] && selectedContent.Elements[0].Element) {
elementsContent = selectedContent.Elements;
} else {
return "";
}
//TODO заглушка для презентационных параграфов(выделен текст внутри диаграммы) - пока не пишем в бинарник
if (selectedContent.Elements[0].Element && selectedContent.Elements[0].Element.bFromDocument === false) {
this.oBinaryFileWriter.Document = this.oDocument;
} else {
//подменяем Document для копирования(если не подменить, то commentId будет не соответствовать)
this.oBinaryFileWriter.Document = elementsContent[0].Element.LogicDocument;
}
if (!this.oBinaryFileWriter.Document) {
this.oBinaryFileWriter.Document = this.oDocument;
}
this.oBinaryFileWriter.CopyStart();
this.CopyDocument2(this.oRoot, oDocument, elementsContent, bFromPresentation);
this.CopyFootnotes(this.oRoot, this.aFootnoteReference);
this.oBinaryFileWriter.CopyEnd();
} else if (PasteElementsId.g_bIsPDFCopyPaste) {
selectedContent = oDocument.GetSelectedContent2();
if (!selectedContent[0].DocContent && (!selectedContent[0].Drawings ||
(selectedContent[0].Drawings && !selectedContent[0].Drawings.length))
&& (!selectedContent[0].Annots || (selectedContent[0].Annots && !selectedContent[0].Annots.length))
&& (!selectedContent[0].Fields || (selectedContent[0].Fields && !selectedContent[0].Fields.length))
&& selectedContent[0].Pages.length == 0) {
return false;
}
this.CopyDocument2(this.oRoot, oDocument, selectedContent);
sBase64 = this.oPDFWriter.GetBase64Memory();
sBase64 = "pdfData;" + this.oPDFWriter.pos + ";" + sBase64;
if (this.oRoot.aChildren && this.oRoot.aChildren.length === 1 && AscBrowser.isSafariMacOs) {
oElem = this.oRoot.aChildren[0];
sStyle = oElem.oAttributes["style"];
if (null == sStyle) {
oElem.oAttributes["style"] = "font-weight:normal";
} else {
oElem.oAttributes["style"] = sStyle + ";font-weight:normal";
}//просто добавляем потому что в sStyle не могло быть font-weight, мы всегда пишем
this.oRoot.wrapChild(new CopyElement("b"));
}
if (this.oRoot.aChildren && this.oRoot.aChildren.length > 0) {
this.oRoot.aChildren[0].oAttributes["class"] = sBase64;
}
} else {
selectedContent = oDocument.GetSelectedContent2();
if (!selectedContent[0].isValid || !selectedContent[0].isValid()) {
return false;
}
this.CopyDocument2(this.oRoot, oDocument, selectedContent);
sBase64 = this.oPresentationWriter.GetBase64Memory();
sBase64 = "pptData;" + this.oPresentationWriter.pos + ";" + sBase64;
if (this.oRoot.aChildren && this.oRoot.aChildren.length === 1 && AscBrowser.isSafariMacOs) {
oElem = this.oRoot.aChildren[0];
sStyle = oElem.oAttributes["style"];
if (null == sStyle) {
oElem.oAttributes["style"] = "font-weight:normal";
} else {
oElem.oAttributes["style"] = sStyle + ";font-weight:normal";
}//просто добавляем потому что в sStyle не могло быть font-weight, мы всегда пишем
this.oRoot.wrapChild(new CopyElement("b"));
}
if (this.oRoot.aChildren && this.oRoot.aChildren.length > 0) {
this.oRoot.aChildren[0].oAttributes["class"] = sBase64;
}
}
if (PasteElementsId.g_bIsDocumentCopyPaste && PasteElementsId.copyPasteUseBinary && this.oBinaryFileWriter.copyParams.itemCount > 0 && !bFromPresentation) {
sBase64 = "docData;" + this.oBinaryFileWriter.GetResult();
if (this.oRoot.aChildren && this.oRoot.aChildren.length == 1 && AscBrowser.isSafariMacOs) {
oElem = this.oRoot.aChildren[0];
sStyle = oElem.oAttributes["style"];
if (null == sStyle) {
oElem.oAttributes["style"] = "font-weight:normal";
} else {
oElem.oAttributes["style"] = sStyle + ";font-weight:normal";
}//просто добавляем потому что в sStyle не могло быть font-weight, мы всегда пишем
this.oRoot.wrapChild(new CopyElement("b"));
}
if (this.oRoot.aChildren && this.oRoot.aChildren.length > 0) {
this.oRoot.aChildren[0].oAttributes["class"] = sBase64;
}
}
return sBase64;
},
CopySlide: function (oDomTarget, slide) {
if (oDomTarget) {
var sSrc = slide.getBase64Img();
var _bounds_cheker = new AscFormat.CSlideBoundsChecker();
slide.draw(_bounds_cheker, 0);
var oImg = new CopyElement("img");
oImg.oAttributes["width"] = Math.round((_bounds_cheker.Bounds.max_x - _bounds_cheker.Bounds.min_x + 1) * g_dKoef_mm_to_pix);
oImg.oAttributes["height"] = Math.round((_bounds_cheker.Bounds.max_y - _bounds_cheker.Bounds.min_y + 1) * g_dKoef_mm_to_pix);
oImg.oAttributes["src"] = sSrc;
oDomTarget.addChild(oImg);
}
//пока записываю для копирования/вставки ссылку на стиль
//TODO в дальнейшем необходимо пересмотреть и писать стили вместе со слайдом
// - аналогично тому как это реализовано при записи таблицы
var presentation = editor.WordControl.m_oLogicDocument;
for(var key in presentation.TableStylesIdMap)
{
if(presentation.TableStylesIdMap.hasOwnProperty(key))
{
this.oPresentationWriter.tableStylesGuides[key] = key;
}
}
//записываем slide
this.oPresentationWriter.WriteSlide(slide);
},
CopyLayout: function (layout) {
this.oPresentationWriter.WriteSlideLayout(layout);
},
CopyPresentationTableCells: function (oDomTarget, graphicFrame) {
var aSelectedRows = [];
var oRowElems = {};
var Item = graphicFrame.graphicObject;
if (Item.Selection.Data.length > 0) {
for (var i = 0, length = Item.Selection.Data.length; i < length; ++i) {
var elem = Item.Selection.Data[i];
var rowElem = oRowElems[elem.Row];
if (null == rowElem) {
rowElem = {
row: elem.Row,
gridStart: null,
gridEnd: null,
indexStart: null,
indexEnd: null,
after: null,
before: null,
cells: {}
};
oRowElems[elem.Row] = rowElem;
aSelectedRows.push(rowElem);
}
if (null == rowElem.indexEnd || elem.Cell > rowElem.indexEnd)
rowElem.indexEnd = elem.Cell;
if (null == rowElem.indexStart || elem.Cell < rowElem.indexStart)
rowElem.indexStart = elem.Cell;
rowElem.cells[elem.Cell] = 1;
}
}
aSelectedRows.sort(function (a, b) {
return a.row - b.row;
});
var nMinGrid = null;
var nMaxGrid = null;
var nPrevStartGrid = null;
var nPrevEndGrid = null;
var nPrevRowIndex = null;
for (var i = 0, length = aSelectedRows.length; i < length; ++i) {
var elem = aSelectedRows[i];
var nRowIndex = elem.row;
if (null != nPrevRowIndex) {
if (nPrevRowIndex + 1 !== nRowIndex) {
nMinGrid = null;
nMaxGrid = null;
break;
}
}
nPrevRowIndex = nRowIndex;
var row = Item.Content[nRowIndex];
var cellFirst = row.Get_Cell(elem.indexStart);
var cellLast = row.Get_Cell(elem.indexEnd);
var nCurStartGrid = cellFirst.Metrics.StartGridCol;
var nCurEndGrid = cellLast.Metrics.StartGridCol + cellLast.Get_GridSpan() - 1;
if (null != nPrevStartGrid && null != nPrevEndGrid) {
//учитываем вертикальный merge, раздвигаем границы
if (nCurStartGrid > nPrevStartGrid) {
for (var j = elem.indexStart - 1; j >= 0; --j) {
var cellCur = row.Get_Cell(j);
if (vmerge_Continue === cellCur.GetVMerge()) {
var nCurGridCol = cellCur.Metrics.StartGridCol;
if (nCurGridCol >= nPrevStartGrid) {
nCurStartGrid = nCurGridCol;
elem.indexStart = j;
} else
break;
} else
break;
}
}
if (nCurEndGrid < nPrevEndGrid) {
for (var j = elem.indexEnd + 1; j < row.Get_CellsCount(); ++j) {
var cellCur = row.Get_Cell(j);
if (vmerge_Continue === cellCur.GetVMerge()) {
var nCurGridCol = cellCur.Metrics.StartGridCol + cellCur.Get_GridSpan() - 1;
if (nCurGridCol <= nPrevEndGrid) {
nCurEndGrid = nCurGridCol;
elem.indexEnd = j;
} else
break;
} else
break;
}
}
}
elem.gridStart = nPrevStartGrid = nCurStartGrid;
elem.gridEnd = nPrevEndGrid = nCurEndGrid;
if (null == nMinGrid || nMinGrid > nCurStartGrid)
nMinGrid = nCurStartGrid;
if (null == nMaxGrid || nMaxGrid < nCurEndGrid)
nMaxGrid = nCurEndGrid;
}
if (null != nMinGrid && null != nMaxGrid) {
//выставляем after, before
for (var i = 0, length = aSelectedRows.length; i < length; ++i) {
var elem = aSelectedRows[i];
elem.before = elem.gridStart - nMinGrid;
elem.after = nMaxGrid - elem.gridEnd;
}
this.CopyTable(oDomTarget, Item, aSelectedRows);
}
History.TurnOff();
var graphic_frame = new AscFormat.CGraphicFrame(graphicFrame.parent);
var grid = [];
for (var i = nMinGrid; i <= nMaxGrid; ++i) {
grid.push(graphicFrame.graphicObject.TableGrid[i]);
}
var table = new CTable(editor.WordControl.m_oDrawingDocument, graphicFrame, false, aSelectedRows.length, nMaxGrid - nMinGrid + 1, grid);
table.setStyleIndex(graphicFrame.graphicObject.styleIndex);
graphic_frame.setGraphicObject(table);
graphic_frame.setXfrm(0, 0, 20, 30, 0, false, false);
var b_style_index = false;
if (AscFormat.isRealNumber(graphic_frame.graphicObject.styleIndex) && graphic_frame.graphicObject.styleIndex > -1) {
b_style_index = true;
}
this.oPresentationWriter.WriteULong(1);
this.oPresentationWriter.WriteBool(false);
this.oPresentationWriter.WriteBool(b_style_index);
if (b_style_index) {
this.oPresentationWriter.WriteULong(graphic_frame.graphicObject.styleIndex);
}
var old_style_index = graphic_frame.graphicObject.styleIndex;
graphic_frame.graphicObject.styleIndex = -1;
this.oPresentationWriter.WriteGrFrame(graphic_frame);
graphic_frame.graphicObject.styleIndex = old_style_index;
History.TurnOn();
this.oBinaryFileWriter.copyParams.itemCount = 0;
},
CopyPresentationTableFull: function (oDomTarget, graphicFrame, isOnlyTable) {
var aSelectedRows = [];
var oRowElems = {};
var Item = graphicFrame.graphicObject;
var b_style_index = false;
var presentation = editor.WordControl.m_oLogicDocument;
if (Item.TableStyle && presentation.globalTableStyles.Style[Item.TableStyle]) {
b_style_index = true;
}
for (var key in presentation.TableStylesIdMap) {
if (presentation.TableStylesIdMap.hasOwnProperty(key)) {
this.oPresentationWriter.tableStylesGuides[key] = "{" + AscCommon.GUID() + "}"
}
}
this.oPresentationWriter.WriteBool(!b_style_index);
if (b_style_index) {
var tableStyle = presentation.globalTableStyles.Style[Item.TableStyle];
this.oPresentationWriter.WriteBool(true);
this.oPresentationWriter.WriteTableStyle(Item.TableStyle, tableStyle);
this.oPresentationWriter.WriteBool(true);
this.oPresentationWriter.WriteString2(Item.TableStyle);
}
History.TurnOff();
this.oPresentationWriter.WriteGrFrame(graphicFrame);
//для случая, когда копируем 1 таблицу из презентаций, в бинарник заносим ещё одну такую же табличку, но со скомпиоированными стилями(для вставки в word / excel)
if (isOnlyTable) {
this.convertToCompileStylesTable(Item);
this.oPresentationWriter.WriteGrFrame(graphicFrame);
}
History.TurnOn();
if (oDomTarget) {
this.CopyTable(oDomTarget, Item, null);
}
},
convertToCompileStylesTable: function (table) {
var t = this;
for (var i = 0; i < table.Content.length; i++) {
var row = table.Content[i];
for (var j = 0; j < row.Content.length; j++) {
var cell = row.Content[j];
var compilePr = cell.Get_CompiledPr();
cell.Pr = compilePr;
var shd = compilePr.Shd;
var color = shd.Get_Color2(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
if(color) {
cell.Pr.Shd.Unifill = AscFormat.CreateSolidFillRGB(color.r, color.g, color.b);
}
if (compilePr.TableCellBorders.Bottom) {
color = compilePr.TableCellBorders.Bottom.Get_Color2(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
if(color) {
cell.Pr.TableCellBorders.Bottom.Unifill = AscFormat.CreateSolidFillRGB(color.r, color.g, color.b);
}
}
if (compilePr.TableCellBorders.Top) {
color = compilePr.TableCellBorders.Top.Get_Color2(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
if(color) {
cell.Pr.TableCellBorders.Top.Unifill = AscFormat.CreateSolidFillRGB(color.r, color.g, color.b);
}
}
if (compilePr.TableCellBorders.Left) {
color = compilePr.TableCellBorders.Left.Get_Color2(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
if(color) {
cell.Pr.TableCellBorders.Left.Unifill = AscFormat.CreateSolidFillRGB(color.r, color.g, color.b);
}
}
if (compilePr.TableCellBorders.Right) {
color = compilePr.TableCellBorders.Right.Get_Color2(this.oDocument.Get_Theme(), this.oDocument.Get_ColorMap());
if(color) {
cell.Pr.TableCellBorders.Right.Unifill = AscFormat.CreateSolidFillRGB(color.r, color.g, color.b);
}
}
}
}
},
CopyGraphicObject: function (oDomTarget, oGraphicObj, drawingCopyObject) {
var sSrc = drawingCopyObject.ImageUrl;
if (oDomTarget && sSrc.length > 0) {
var _bounds_cheker = new AscFormat.CSlideBoundsChecker();
oGraphicObj.draw(_bounds_cheker, 0);
var width, height;
if (drawingCopyObject && drawingCopyObject.ExtX)
width = Math.round(drawingCopyObject.ExtX * g_dKoef_mm_to_pix);
else
width = Math.round((_bounds_cheker.Bounds.max_x - _bounds_cheker.Bounds.min_x + 1) * g_dKoef_mm_to_pix);
if (drawingCopyObject && drawingCopyObject.ExtY)
height = Math.round(drawingCopyObject.ExtY * g_dKoef_mm_to_pix);
else
height = Math.round((_bounds_cheker.Bounds.max_y - _bounds_cheker.Bounds.min_y + 1) * g_dKoef_mm_to_pix);
var oImg = new CopyElement("img");
oImg.oAttributes["width"] = width;
oImg.oAttributes["height"] = height;
oImg.oAttributes["src"] = sSrc;
if (this.api.DocumentReaderMode)
oImg.oAttributes["style"] = "max-width:100%;";
oDomTarget.addChild(oImg);
}
this.oPresentationWriter.WriteSpTreeElem(oGraphicObj);
},
CopyPDFGraphicObject: function (oDomTarget, oGraphicObj, drawingCopyObject) {
var sSrc = drawingCopyObject.ImageUrl;
if (oDomTarget && sSrc.length > 0) {
var _bounds_cheker = new AscFormat.CSlideBoundsChecker();
oGraphicObj.draw(_bounds_cheker, 0);
var width, height;
if (drawingCopyObject && drawingCopyObject.ExtX)
width = Math.round(drawingCopyObject.ExtX * g_dKoef_mm_to_pix);
else
width = Math.round((_bounds_cheker.Bounds.max_x - _bounds_cheker.Bounds.min_x + 1) * g_dKoef_mm_to_pix);
if (drawingCopyObject && drawingCopyObject.ExtY)
height = Math.round(drawingCopyObject.ExtY * g_dKoef_mm_to_pix);
else
height = Math.round((_bounds_cheker.Bounds.max_y - _bounds_cheker.Bounds.min_y + 1) * g_dKoef_mm_to_pix);
var oImg = new CopyElement("img");
oImg.oAttributes["width"] = width;
oImg.oAttributes["height"] = height;
oImg.oAttributes["src"] = sSrc;
if (this.api.DocumentReaderMode)
oImg.oAttributes["style"] = "max-width:100%;";
oDomTarget.addChild(oImg);
}
this.oPDFWriter.WriteSpTreeElem(oGraphicObj);
},
CopyPDFAnnotObject: function (oAnnotCopyObject) {
this.oPDFWriter.WriteAnnotTreeElem(oAnnotCopyObject.Annot);
},
CopyPDFFieldObject: function (oFieldCopyObject) {
this.oPDFWriter.WriteFieldTreeElem(oFieldCopyObject.Field);
},
CopyFootnotes: function (oDomTarget, aFootnotes) {
if (aFootnotes && aFootnotes.length) {
/**/
let _mainDiv = new CopyElement("div");
_mainDiv.oAttributes["style"] = "mso-element:footnote-list";
let _br = new CopyElement("br");
_br.oAttributes["clear"] = "all";
_mainDiv.addChild(_br);
let _hr = new CopyElement("hr");
_hr.oAttributes["align"] = "left";
_hr.oAttributes["size"] = "1";
_hr.oAttributes["width"] = "33%";
_mainDiv.addChild(_hr);
for (let i = 0; i < aFootnotes.length; i++) {
let prefix = "ftn";
let index = i + 1;
let _div = new CopyElement("div");
_div.oAttributes["style"] = "mso-element:footnote";
_div.oAttributes["id"] = prefix + index;
if (!aFootnotes[i] || !aFootnotes[i].Content) {
continue;
}
//in first paragraph put link and paragraphs contents
for (let j = 0; j < aFootnotes[i].Content.length; j++) {
let _p = new CopyElement("p");
_p.oAttributes["class"] = "MsoFootnoteText";
let _link;
if (j === 0) {
/*
[2]
*/
_link = new CopyElement("a");
_link.oAttributes["style"] = "mso-footnote-id:" + prefix + index;
_link.oAttributes["href"] = "#_" + prefix + "ref" + index;
_link.oAttributes["name"] = "_" + prefix + index;
_link.oAttributes["title"] = "";
//skip 2 inner spans(MsoFootnoteReference + last)
let spanMsoFootnoteReference = new CopyElement("span");
spanMsoFootnoteReference.oAttributes["class"] = "MsoFootnoteReference";
let spanMsoSpecialCharacter = new CopyElement("span");
spanMsoSpecialCharacter.oAttributes["style"] = "mso-special-character:footnote";
spanMsoFootnoteReference.addChild(spanMsoSpecialCharacter);
spanMsoFootnoteReference.addChild(new CopyElement(CopyPasteCorrectString("[" + index + "]"), true));
_link.addChild(spanMsoFootnoteReference);
}
if (_link) {
_p.addChild(_link);
//add spans from aFootnotes[0]
let container = new CopyElement("div");
this.CopyDocument2(container, null, [aFootnotes[i].Content[j]], true);
for (let i = 0; i < container.aChildren.length; i++) {
container.aChildren[i].moveChildTo(_p);
}
} else {
this.CopyDocument2(_p, null, [aFootnotes[i].Content[j]], true);
}
_div.addChild(_p);
}
_mainDiv.addChild(_div);
}
oDomTarget.addChild(_mainDiv);
}
}
};
function CopyPasteCorrectString(str)
{
/*
// эта реализация на порядок быстрее. Перед выпуском не меняю ничего
var _ret = "";
var _len = str.length;
for (var i = 0; i < _len; i++)
{
var _symbol = str[i];
if (_symbol == "&")
_ret += "&";
else if (_symbol == "<")
_ret += "<";
else if (_symbol == ">")
_ret += ">";
else if (_symbol == "'")
_ret += "'";
else if (_symbol == "\"")
_ret += """;
else
_ret += _symbol;
}
return _ret;
*/
if (!str)
return "";
var res = str;
res = res.replace(/&/g,'&');
res = res.replace(//g,'>');
res = res.replace(/'/g,''');
res = res.replace(/"/g,'"');
return res;
}
function GetContentFromHtml(api, html, callback) {
if (!html) {
callback && callback(null);
return;
}
//need document -> write, because some props not compile if use innerHTML(sub/sup tags give only "baseline")
//TODO use iframe from clipboard_base
AscCommon.g_clipboardBase.CommonIframe_PasteStart(html, null, function (oHtmlElem) {
if (oHtmlElem) {
var oPasteProcessor = new PasteProcessor(api, true, true, false, undefined, function (selectedContent) {
if (selectedContent) {
callback(selectedContent);
}
});
oPasteProcessor.doNotInsertInDoc = true;
oHtmlElem && oPasteProcessor.Start(oHtmlElem);
}
});
}
function Editor_Paste_Exec(api, _format, data1, data2, text_data, specialPasteProps, callback, rejectCallback)
{
var oPasteProcessor = new PasteProcessor(api, true, true, false, undefined, callback, rejectCallback);
window['AscCommon'].g_specialPasteHelper.endRecalcDocument = false;
if(undefined === specialPasteProps)
{
window['AscCommon'].g_specialPasteHelper.SpecialPasteButton_Hide();
window['AscCommon'].g_specialPasteHelper.specialPasteData._format = _format;
window['AscCommon'].g_specialPasteHelper.specialPasteData.data1 = data1;
window['AscCommon'].g_specialPasteHelper.specialPasteData.data2 = data2;
window['AscCommon'].g_specialPasteHelper.specialPasteData.text_data = text_data;
if (_format !== AscCommon.c_oAscClipboardDataFormat.Text) {
text_data = null;
}
}
else
{
window['AscCommon'].g_specialPasteHelper.specialPasteProps = specialPasteProps;
_format = window['AscCommon'].g_specialPasteHelper.specialPasteData._format;
data1 = window['AscCommon'].g_specialPasteHelper.specialPasteData.data1;
data2 = window['AscCommon'].g_specialPasteHelper.specialPasteData.data2;
text_data = window['AscCommon'].g_specialPasteHelper.specialPasteData.text_data;
if(!(specialPasteProps === Asc.c_oSpecialPasteProps.keepTextOnly && _format !== AscCommon.c_oAscClipboardDataFormat.Text && text_data))
{
text_data = null;
}
}
switch (_format)
{
case AscCommon.c_oAscClipboardDataFormat.HtmlElement:
{
oPasteProcessor.Start(data1, data2, null, null, text_data);
break;
}
case AscCommon.c_oAscClipboardDataFormat.Internal:
{
oPasteProcessor.Start(null, null, null, data1, text_data);
break;
}
case AscCommon.c_oAscClipboardDataFormat.Text:
{
oPasteProcessor.Start(null, null, null, null, data1);
break;
}
case AscCommon.c_oAscClipboardDataFormat.Rtf:
{
//convert rtf string to binary
var reader = new FileReader();
reader.onload = function () {
let document = {data: new Uint8Array(reader.result), format: "rtf"}
api.getConvertedBinFileFromRtf(document, Asc.c_oAscFileType.CANVAS_WORD, function (sFileUrlAfterConvert) {
AscCommon.loadFileContent(sFileUrlAfterConvert, function(httpRequest) {
let stream;
if (null === httpRequest || !(stream = AscCommon.initStreamFromResponse(httpRequest)))
{
api.endInsertDocumentUrls();
api.sendEvent("asc_onError", c_oAscError.ID.DirectUrl,
c_oAscError.Level.NoCritical);
callback && callback(false);
return;
}
api.endInsertDocumentUrls();
oPasteProcessor.Start(null, null, null, stream);
}, "arraybuffer");
});
};
reader.onerror = function () {
api.sendEvent("asc_onError", Asc.c_oAscError.ID.Unknown, Asc.c_oAscError.Level.NoCritical);
callback && callback(false);
};
reader.readAsArrayBuffer(new Blob([data1]));
break;
}
default:
{
rejectCallback && rejectCallback();
callback && callback(false);
break;
}
}
}
function trimString( str ){
return str.replace(/^\s+|\s+$/g, '') ;
}
function sendImgUrls(api, images, callback, bNotShowError, token) {
if (window["NATIVE_EDITOR_ENJINE"] === true && window["IS_NATIVE_EDITOR"] !== true)
{
var _data = [];
for (var i = 0; i < images.length; i++)
{
var _url = window["native"]["GetImageUrl"](images[i]);
var _full_path = window["native"]["GetImagesPath"]() + "/" + _url;
var _local_url = "media/" + _url;
AscCommon.g_oDocumentUrls.addUrls({_local_url:_full_path});
_data[i] = {url:_full_path, path:_local_url};
}
callback(_data);
return;
}
if (window["AscDesktopEditor"])
{
// correct local images
for (var nIndex = images.length - 1; nIndex >= 0; nIndex--)
{
if (0 == images[nIndex].indexOf("file:/"))
images[nIndex] = window["AscDesktopEditor"]["GetImageBase64"](images[nIndex]);
}
}
if (AscCommon.EncryptionWorker && AscCommon.EncryptionWorker.isCryptoImages())
{
return AscCommon.EncryptionWorker.addCryproImagesFromUrls(images, callback);
}
if(window["IS_NATIVE_EDITOR"])
{
callback([]);
return;
}
var rData = {
"id": api.documentId, "c": "imgurls", "userid": api.documentUserId, "saveindex": g_oDocumentUrls.getMaxIndex(),
"tokenDownload": token, "data": images
};
if (!api.isOpenedFrameEditor) {
api.sync_StartAction(Asc.c_oAscAsyncActionType.BlockInteraction, Asc.c_oAscAsyncAction.LoadImage);
}
api.fCurCallback = function (input) {
if (!api.isOpenedFrameEditor) {
api.sync_EndAction(Asc.c_oAscAsyncActionType.BlockInteraction, Asc.c_oAscAsyncAction.LoadImage);
}
var nError = c_oAscError.ID.No;
var data;
if (null != input && "imgurls" == input["type"]) {
if ("ok" == input["status"]) {
data = input["data"]["urls"];
nError = AscCommon.mapAscServerErrorToAscError(input["data"]["error"]);
var urls = {};
for (var i = 0, length = data.length; i < length; ++i) {
var elem = data[i];
if (null != elem.url) {
urls[elem.path] = elem.url;
}
}
g_oDocumentUrls.addUrls(urls);
} else {
nError = AscCommon.mapAscServerErrorToAscError(parseInt(input["data"]));
}
} else {
nError = c_oAscError.ID.Unknown;
}
if ( c_oAscError.ID.No !== nError && !bNotShowError) {
api.sendEvent("asc_onError", nError, c_oAscError.Level.NoCritical);
}
if (!data) {
//todo сделать функцию очистки, чтобы можно было оборвать paste и показать error
data = [];
for ( var i = 0; i < images.length; ++i) {
data.push({'url': 'error', 'path': 'error'});
}
}
callback(data);
};
if (api.frameManager.isFrameEditor()) {
api.frameManager.sendLoadImages(images, token, bNotShowError);
return;
}
AscCommon.sendCommand(api, null, rData);
}
function PasteProcessor(api, bUploadImage, bUploadFonts, bNested, pasteInExcel, pasteCallback, rejectCallback)
{
this.oRootNode = null;
this.api = api;
this.bIsDoublePx = api.WordControl.bIsDoublePx;
this.oDocument = api.WordControl.m_oLogicDocument;
this.oLogicDocument = this.oDocument;
this.oRecalcDocument = this.oDocument;
this.map_font_index = api.FontLoader && api.FontLoader.map_font_index;
this.bUploadImage = bUploadImage;
this.bUploadFonts = bUploadFonts;
this.bNested = bNested;//для параграфов в таблицах
this.oFonts = {};
this.oImages = {};
this.aContent = [];
this.AddedFootEndNotes = {};
this.aContentForNotes = [];
this.bIsForFootEndnote = false;
this.pasteInExcel = pasteInExcel;
this.pasteInPresentationShape = null;
this.pasteCallback = pasteCallback;
this.rejectCallback = rejectCallback;
this.maxTableCell = null;
//для вставки текста в ячейку, при копировании из word в chrome появляются лишние пробелы вне
this.bIgnoreNoBlockText = false;
this.oCurRun = null;
this.oCurRunContentPos = 0;
this.oCurPar = null;
this.oCurParContentPos = 0;
this.oCurHyperlink = null;
this.oCurHyperlinkContentPos = 0;
this.oCur_rPr = new CTextPr();
this._lastCommitedRunId = null;
//Br копятся потомы что есть случаи когда не надо вывобить br, хотя он и присутствует.
this.nBrCount = 0;
//bInBlock указывает блочный ли элемент(рассматриваются только элементы дочерние от child)
//Если после окончания вставки true != this.bInBlock значит последний элемент не параграф и не надо добавлять новый параграф
this.bInBlock = null;
//ширина элемента в который вставляем страница или ячейка
this.dMaxWidth = getPageWidth();
//коэфициент сжатия(например при вставке таблица сжалась, значит при вставке содержимого ячейки к картинкам и таблице будет применен этот коэффициент)
this.dScaleKoef = 1;
this.bUseScaleKoef = false;
this.bIsPlainText = false;
this.defaultImgWidth = 50;
this.defaultImgHeight = 50;
this.MsoStyles = {"mso-style-type": 1, "mso-pagination": 1, "mso-line-height-rule": 1, "mso-style-textfill-fill-color": 1, "mso-tab-count": 1,
"tab-stops": 1, "list-style-type": 1, "mso-special-character": 1, "mso-column-break-before": 1, "mso-break-type": 1, "mso-padding-alt": 1, "mso-border-insidev": 1,
"mso-border-insideh": 1, "mso-row-margin-left": 1, "mso-row-margin-right": 1, "mso-cellspacing": 1, "mso-border-alt": 1,
"mso-border-left-alt": 1, "mso-border-top-alt": 1, "mso-border-right-alt": 1, "mso-border-bottom-alt": 1, "mso-border-between": 1, "mso-list": 1,
"mso-comment-reference": 1, "mso-comment-date": 1, "mso-comment-continuation": 1, "mso-data-placement": 1, "mso-table-layout-alt": 1, "mso-table-left": 1,
"mso-table-top": 1, "mso-ignore": 1};
this.OnlyOfficeStyles = {"oo-latex": 1}
this.oBorderCache = {};
this.msoListMap = [];
//пока ввожу эти параметры для специальной вставки. возможно, нужно будет пересмотреть и убрать их
this.pasteTypeContent = undefined;
this.pasteList = undefined;
this.pasteIntoElem = undefined;//ссылка на элемент контента, который был выделен до вставки
this.apiEditor = window["Asc"]["editor"] ? window["Asc"]["editor"] : window["editor"];
this.msoComments = [];
this.startMsoAnnotation = undefined;
this.needAddCommentStart = null;
this.needAddCommentEnd = null;
this.aMsoHeadStylesStr = null;
this.oMsoHeadStylesListMap = [];
this.oMsoStylesParser = null;
this.pasteTextIntoList = null;
this.rtfImages = null;
this.aNeedRecalcImgSize = null;
this.doNotInsertInDoc = null;
this.arrDrawingsPasteOrder = [];
}
PasteProcessor.prototype =
{
_GetTargetDocument : function(oDocument)
{
if(PasteElementsId.g_bIsDocumentCopyPaste)
{
var nDocPosType = oDocument.GetDocPosType();
if (docpostype_HdrFtr === nDocPosType)
{
if (null != oDocument.HdrFtr && null != oDocument.HdrFtr.CurHdrFtr && null != oDocument.HdrFtr.CurHdrFtr.Content)
{
oDocument = oDocument.HdrFtr.CurHdrFtr.Content;
this.oRecalcDocument = oDocument;
}
}
else if (nDocPosType === docpostype_DrawingObjects)
{
var content = oDocument.DrawingObjects.getTargetDocContent(true);
if (content)
{
oDocument = content;
}
}
else if (nDocPosType === docpostype_Footnotes)
{
if (oDocument.Footnotes && oDocument.Footnotes.CurFootnote)
oDocument = oDocument.Footnotes.CurFootnote
}
else if (nDocPosType === docpostype_Endnotes)
{
if (oDocument.Endnotes && oDocument.Endnotes.CurEndnote)
oDocument = oDocument.Endnotes.CurEndnote
}
// Отдельно обрабатываем случай, когда курсор находится внутри таблицы
var Item = oDocument.Content[oDocument.CurPos.ContentPos];
if (type_Table === Item.GetType() && null != Item.CurCell)
{
this.dMaxWidth = this._CalcMaxWidthByCell(Item.CurCell);
oDocument = this._GetTargetDocument(Item.CurCell.Content);
}
}
else
{
}
return oDocument;
},
_CalcMaxWidthByCell: function(cell) {
const row = cell.Row;
const table = row.Table;
const grid = table.TableGrid;
let nGridBefore = 0;
if (row.Pr != null && row.Pr.GridBefore != null) {
nGridBefore = row.Pr.GridBefore;
}
const nCellIndex = cell.Index;
let nCellGrid = 1;
if (cell.Pr && undefined !== cell.Pr.GridSpan) {
nCellGrid = cell.Pr.GridSpan;
}
let nMarginLeft = 0;
if (cell.Pr
&& cell.Pr.TableCellMar
&& cell.Pr.TableCellMar.Left
&& tblwidth_Mm === cell.Pr.TableCellMar.Left.Type
&& undefined !== cell.Pr.TableCellMar.Left.W) {
nMarginLeft = cell.Pr.TableCellMar.Left.W;
} else if (table.Pr
&& table.Pr.TableCellMar
&& table.Pr.TableCellMar.Left
&& tblwidth_Mm === table.Pr.TableCellMar.Left.Type
&& undefined !== table.Pr.TableCellMar.Left.W) {
nMarginLeft = table.Pr.TableCellMar.Left.W;
}
let nMarginRight = 0;
if (cell.Pr
&& cell.Pr.TableCellMar
&& cell.Pr.TableCellMar.Right
&& tblwidth_Mm === cell.Pr.TableCellMar.Right.Type
&& undefined !== cell.Pr.TableCellMar.Right.W) {
nMarginRight = cell.Pr.TableCellMar.Right.W;
} else if (table.Pr
&& table.Pr.TableCellMar
&& table.Pr.TableCellMar.Right
&& tblwidth_Mm === table.Pr.TableCellMar.Right.Type
&& undefined !== table.Pr.TableCellMar.Right.W) {
nMarginRight = table.Pr.TableCellMar.Right.W;
}
let nPrevSumGrid = nGridBefore;
for (let i = 0; i < nCellIndex; ++i) {
const oTmpCell = row.Content[i];
let nGridSpan = 1;
if (oTmpCell && oTmpCell.Pr && undefined !== oTmpCell.Pr.GridSpan) {
nGridSpan = oTmpCell.Pr.GridSpan;
}
nPrevSumGrid += nGridSpan;
}
let dCellWidth = 0;
for (let i = nPrevSumGrid, length = grid.length; i < nPrevSumGrid + nCellGrid && i < length; ++i) {
dCellWidth += grid[i];
}
if (dCellWidth - nMarginLeft - nMarginRight <= 0) {
dCellWidth = 4;
} else {
dCellWidth -= nMarginLeft + nMarginRight;
}
return dCellWidth;
},
CheckCopyDrawingsBeforePaste: function () {
const allDrawings = [];
for (let i = 0; i < this.aContent.length; i += 1) {
this.aContent[i].GetAllDrawingObjects(allDrawings);
}
for (let i = 0; i < allDrawings.length; i += 1) {
const drawing = allDrawings[i];
if (drawing.GraphicObj) {
drawing.GraphicObj.generateSmartArtDrawingPart();
}
}
},
InsertInDocument : function(dNotShowOptions)
{
var oDocument = this.oDocument;
//TODO ориентируюсь при специальной вставке на SelectionState. возможно стоит пересмотреть.
this._initSelectedElem();
var nInsertLength = this.aContent.length;
if(nInsertLength > 0)
{
this.CheckCopyDrawingsBeforePaste();
this.InsertInPlace(oDocument, this.aContent);
if(false === PasteElementsId.g_bIsDocumentCopyPaste)
{
oDocument.Recalculate();
if(oDocument.Parent != null && oDocument.Parent.txBody != null)
{
oDocument.Parent.txBody.recalculate();
}
}
}
var bNeedRecalculate = (false === this.bNested && nInsertLength > 0);
//for special paste
if(dNotShowOptions && !window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
} else {
this._specialPasteSetShowOptions();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End(true);
if(bNeedRecalculate)
{
this.oRecalcDocument.Recalculate();
this.oLogicDocument.Document_UpdateInterfaceState();
this.oLogicDocument.Document_UpdateSelectionState();
}
},
InsertInPlace : function(oDoc, aNewContent)
{
if (!PasteElementsId.g_bIsDocumentCopyPaste)
return;
var specialPasteHelper = window['AscCommon'].g_specialPasteHelper;
var bIsSpecialPaste = specialPasteHelper.specialPasteStart;
var paragraph = oDoc.GetCurrentParagraph();
var oTable = oDoc.IsInTable() ? oDoc.GetParent().GetTable() : null;
//pasteTypeContent - если все содержимое одного типа
//TODO пересмотреть pasteTypeContent
this.pasteTypeContent = null;
var oSelectedContent = new AscCommonWord.CSelectedContent();
//by section
//oSelectedContent.LastSection = this.getLastSectionPr();
var tableSpecialPaste = false;
let pasteHelperElement = null;
this.specificPasteProps = null;
let bCheckOneGraphicObjectSpecialProps = false;
if (aNewContent.length === 1)
{
bCheckOneGraphicObjectSpecialProps = this._specialPasteGetElemType(aNewContent[0]) === para_Drawing;
}
if (oTable && !aNewContent[0].IsTable() && oTable.IsCellSelection())
{
var arrSelectedCells = oTable.GetSelectionArray(true);
var nPrevRow = -1;
var nElementIndex = -1;
var nRowIndex = -1;
var arrNewContent = [];
for (var i = aNewContent.length - 1; i >= 0; i--)
{
arrNewContent.unshift([]);
var oElem = aNewContent[i].Copy();
if (oElem.IsParagraph())
{
for (var j = oElem.Content.length - 1; j >= 0; j--)
{
var oNestedElem = oElem.Content[j];
if (oNestedElem.Type === para_Run && oNestedElem.Content.length)
{
for (var k = oNestedElem.Content.length - 1; k >= 0; k--)
{
var oThirdElem = oNestedElem.Content[k];
if (oThirdElem.Type === para_Tab)
{
var oPar = new AscWord.Paragraph();
arrNewContent[0].unshift(oPar);
var oRun = oNestedElem.Split2(k);
oRun.RemoveFromContent(0, 1);
oPar.AddToContent(0, oRun);
}
}
}
}
}
arrNewContent[0].unshift(oElem);
}
for (var nIndex = 0, nCount = arrSelectedCells.length; nIndex < nCount; ++nIndex)
{
var oPos = arrSelectedCells[nIndex];
var oRow = oTable.GetRow(oPos.Row);
if (!oRow)
continue;
var oCell = oRow.GetCell(oPos.Cell);
if (!oCell)
continue;
var isMerged = oCell.GetVMerge() === vmerge_Continue;
if (isMerged)
oCell = oTable.GetStartMergedCell(oPos.Cell, oPos.Row);
var oCellContent = oCell.GetContent();
var oPara;
if (isMerged) {
oPara = new AscWord.Paragraph();
oCellContent.AddToContent(oCellContent.Content.length, oPara, true);
oPara.Document_SetThisElementCurrent(false);
}
else
{
oCellContent.ClearContent(true);
oPara = oCellContent.GetElement(0);
}
if (!oPara || !oPara.IsParagraph())
continue;
if (oPos.Row !== nPrevRow)
{
nPrevRow = oPos.Row;
nRowIndex++;
nElementIndex = -1;
if (nRowIndex > arrNewContent.length - 1)
nRowIndex = 0;
}
nElementIndex++;
if (nElementIndex > arrNewContent[nRowIndex].length - 1)
nElementIndex = 0;
if (nRowIndex < 0 || nElementIndex < 0)
break;
oSelectedContent.Reset();
var NewElem = arrNewContent[nRowIndex][nElementIndex].Copy();
var NearPos = oPara.GetCurrentAnchorPosition();
if (bIsSpecialPaste)
{
if (Asc.c_oSpecialPasteProps.insertAsNestedTable === specialPasteHelper.specialPasteProps ||
Asc.c_oSpecialPasteProps.overwriteCells === specialPasteHelper.specialPasteProps)
{
tableSpecialPaste = true;
oSelectedContent.SetInsertOptionForTable(specialPasteHelper.specialPasteProps);
}
}
else
{
oSelectedContent.SetInsertOptionForTable(Asc.c_oSpecialPasteProps.insertAsNestedTable);
}
if (bIsSpecialPaste && !tableSpecialPaste)
{
var parseItem = this._specialPasteItemConvert(NewElem);
if (parseItem && parseItem.length)
{
for (var j = 0; j < parseItem.length; j++)
{
if (j === 0)
{
arrNewContent.splice(nRowIndex + j, 1, parseItem[j]);
}
else
{
arrNewContent.splice(nRowIndex + j, 0, parseItem[j]);
}
}
}
}
var oSelectedElement = new AscCommonWord.CSelectedElement();
oSelectedElement.Element = NewElem;
var type = this._specialPasteGetElemType(NewElem);
if (0 === nIndex)
{
this.pasteTypeContent = type;
}
else if (type !== this.pasteTypeContent)
{
this.pasteTypeContent = null;
bCheckOneGraphicObjectSpecialProps = false;
}
this.checkWordGraphicSpecialPasteProps(NewElem, bCheckOneGraphicObjectSpecialProps);
oSelectedElement.SelectedAll = false;
oSelectedContent.Add(oSelectedElement);
oSelectedContent.EndCollect(this.oLogicDocument);
oSelectedContent.SetCopyComments(false);
if (!this.pasteInExcel && !oSelectedContent.CanInsert(NearPos))
{
this.oLogicDocument.Document_Undo();
History.Clear_Redo();
return;
}
oSelectedContent.Insert(NearPos, false);
}
}
else
{
oTable = null;
var paragraph = oDoc.GetCurrentParagraph();
if (!paragraph)
{
this.oLogicDocument.Document_Undo();
History.Clear_Redo();
this.pasteCallback && this.pasteCallback(false);
return;
}
var NearPos = paragraph.GetCurrentAnchorPosition();
//делаем небольшой сдвиг по y, потому что сама точка TargetPos для двухстрочного параграфа определяется как верхняя
//var NearPos = oDoc.Get_NearestPos(this.oLogicDocument.TargetPos.PageNum, this.oLogicDocument.TargetPos.X, this.oLogicDocument.TargetPos.Y + 0.05);//0.05 == 2pix
if(bIsSpecialPaste){
if (Asc.c_oSpecialPasteProps.insertAsNestedTable === specialPasteHelper.specialPasteProps ||
Asc.c_oSpecialPasteProps.overwriteCells === specialPasteHelper.specialPasteProps)
{
tableSpecialPaste = true;
oSelectedContent.SetInsertOptionForTable(specialPasteHelper.specialPasteProps);
}
}
for (var i = 0; i < aNewContent.length; ++i) {
if(bIsSpecialPaste && !tableSpecialPaste)
{
var parseItem = this._specialPasteItemConvert(aNewContent[i]);
if(parseItem && parseItem.length)
{
for(var j = 0; j < parseItem.length; j++)
{
if(j === 0)
{
aNewContent.splice(i + j, 1, parseItem[j]);
}
else
{
aNewContent.splice(i + j, 0, parseItem[j]);
}
}
}
}
var oSelectedElement = new AscCommonWord.CSelectedElement();
oSelectedElement.Element = aNewContent[i];
var type = this._specialPasteGetElemType(aNewContent[i]);
if(0 === i)
{
this.pasteTypeContent = type;
}
else if(type !== this.pasteTypeContent)
{
this.pasteTypeContent = null;
bCheckOneGraphicObjectSpecialProps = false;
}
this.checkWordGraphicSpecialPasteProps(aNewContent[i], bCheckOneGraphicObjectSpecialProps);
if (i === aNewContent.length - 1 && true != this.bInBlock && type_Paragraph === oSelectedElement.Element.GetType())
oSelectedElement.SelectedAll = false;
else
oSelectedElement.SelectedAll = true;
oSelectedContent.Add(oSelectedElement);
}
//проверка на возможность втавки в формулу
//TODO проверку на excel пеерсмотреть!!!!
oSelectedContent.EndCollect(this.oLogicDocument);
oSelectedContent.SetCopyComments(false);
if (this.doNotInsertInDoc) {
this.pasteCallback && this.pasteCallback(oSelectedContent, true);
return;
}
if(!this.pasteInExcel && !oSelectedContent.CanInsert(NearPos))
{
this.oLogicDocument.Document_Undo();
History.Clear_Redo();
this.pasteCallback && this.pasteCallback(false);
return;
}
oSelectedContent.Insert(NearPos, false);
paragraph.Clear_NearestPosArray(aNewContent);
pasteHelperElement = oSelectedContent.GetPasteHelperElement();
}
//если вставляем таблицу в ячейку таблицы
if (this.pasteIntoElem && 1 === this.aContent.length && type_Table === this.aContent[0].GetType() &&
this.pasteIntoElem.Parent && this.pasteIntoElem.Parent.IsInTable() && (!bIsSpecialPaste || (bIsSpecialPaste &&
Asc.c_oSpecialPasteProps.overwriteCells === specialPasteHelper.specialPasteProps))) {
//TODO пересмотреть положение кнопки специальной вставки при вставке в таблицу
var table;
var tableCell = paragraph && paragraph.Parent && paragraph.Parent.Parent;
if (tableCell && tableCell.GetTable) {
table = tableCell.GetTable()
} else {
table = this.pasteIntoElem.Parent.Parent.Get_Table();
}
specialPasteHelper.showButtonIdParagraph = table.Id;
} else {
if (pasteHelperElement)
{
specialPasteHelper.showButtonIdParagraph = pasteHelperElement.GetId();
}
else if (oSelectedContent.Elements.length === 1 && !oTable)
{
let currentParagraph = this.oDocument.GetCurrentParagraph();
if (currentParagraph)
specialPasteHelper.showButtonIdParagraph = currentParagraph.GetId();
}
else
{
specialPasteHelper.showButtonIdParagraph = oSelectedContent.Elements[oSelectedContent.Elements.length - 1].Element.Id;
}
}
if(this.oLogicDocument && this.oLogicDocument.DrawingObjects)
{
var oTargetTextObject = AscFormat.getTargetTextObject(this.oLogicDocument.DrawingObjects);
oTargetTextObject && oTargetTextObject.checkExtentsByDocContent && oTargetTextObject.checkExtentsByDocContent();
}
this._selectShapesBeforeInsert(aNewContent, oDoc);
},
checkWordGraphicSpecialPasteProps: function (oNewContent, bCheckGettingPasteProps)
{
const arrDrawings = [];
oNewContent.GetAllDrawingObjects(arrDrawings);
if (bCheckGettingPasteProps && (arrDrawings.length === 1))
{
const oGraphicObj = arrDrawings[0].GraphicObj;
this.specificPasteProps = oGraphicObj.getSpecialPasteProps();
}
for (let nDrawingIndex = 0; nDrawingIndex < arrDrawings.length; nDrawingIndex += 1)
{
const oGraphicObj = arrDrawings[nDrawingIndex].GraphicObj;
if (oGraphicObj)
{
oGraphicObj.applySpecialPasteProps();
}
}
},
//***functions for special paste***
_specialPasteGetElemType: function(elem)
{
var type = elem.GetType();
if(type_Paragraph === type)
{
//проверяем, возможно это графический объект
for(var i = 0; i < elem.Content.length; i++)
{
if(elem.Content[i] && elem.Content[i].Content)
{
for(var j = 0; j < elem.Content[i].Content.length; j++)
{
var contentElem = elem.Content[i].Content[j];
if(!(contentElem instanceof AscWord.CRunParagraphMark))
{
var typeElem = contentElem.GetType ? contentElem.GetType() : null;
if(para_Drawing === typeElem)
{
type = para_Drawing;
}
else
{
if(para_Drawing !== type)
{
type = type_Paragraph;
}
else
{
type = null;
}
break;
}
}
}
}
if(type_Paragraph === type)
{
if(elem.Pr && elem.Pr.NumPr)
{
if(undefined === this.pasteList)
{
this.pasteList = elem.Pr.NumPr;
}
else if(this.pasteList && !elem.Pr.NumPr.Is_Equal(this.pasteList))
{
this.pasteList = null;
}
}
}
}
}
return type;
},
_specialPasteSetShowOptions: function()
{
//специальная вставка:
//выдаем стандартные параметры всавки(paste, merge, value) во всех ситуация, за исключением:
//если вставляем единственную таблицу в таблицу - особые параметры вставки(как извне, так и внутри)
//если вставляем список - должны совпадать типы с уже существующими(как извне, так и внутри)
//изображения / шейпы
//отдельно диаграммы - для них есть отдельный пункт. посмотреть, нужно ли это добавлять
//для формул параметры как и при обычной вставке. но нужно уметь их преобразовывать в текст при вставке только текста
//особые параметры при вставке таблиц из EXCEL
let specialPasteHelper = window['AscCommon'].g_specialPasteHelper;
//если вставляются только изображения, пока не показываем параметры специальной
if(para_Drawing === this.pasteTypeContent && !(this.aContent.length === 1 && this.specificPasteProps) && !specialPasteHelper.specialPasteStart)
{
specialPasteHelper.SpecialPasteButton_Hide();
if(specialPasteHelper.buttonInfo)
{
specialPasteHelper.showButtonIdParagraph = null;
specialPasteHelper.CleanButtonInfo();
}
return;
}
var specialPasteShowOptions = !specialPasteHelper.buttonInfo.isClean() ? specialPasteHelper.buttonInfo : null;
if(!specialPasteHelper.specialPasteStart)
{
specialPasteShowOptions = specialPasteHelper.buttonInfo;
var sProps = Asc.c_oSpecialPasteProps;
var aContent = this.aContent;
var props = null;
//table into table
//this.pasteTypeContent и this.pasteList нужны для вставки таблиц/списков и тд
//TODO пока вставка будет работать только с текстом(форматированный/не форматированный)
/*if(insertToElem && 1 === aContent.length && type_Table === this.aContent[0].GetType() && type_Table === insertToElem.GetType())
{
props = [sProps.paste, sProps.insertAsNestedTable, sProps.uniteIntoTable, sProps.insertAsNewRows, sProps.pasteOnlyValues];
}
else if(this.pasteList && insertToElem && type_Paragraph === insertToElem.GetType() && insertToElem.Pr && insertToElem.Pr.NumPr && insertToElem.Pr.NumPr.Is_Equal(this.pasteList))
{
//вставка нумерованного списка в нумерованный список
props = [sProps.paste, sProps.uniteList, sProps.doNotUniteList];
}*/
//если вставляем одну таблицу в ячейку другой таблицы
if (this.pasteIntoElem && 1 === aContent.length && type_Table === this.aContent[0].GetType() &&
this.pasteIntoElem.Parent && this.pasteIntoElem.Parent.IsInTable())
{
props = [sProps.overwriteCells, sProps.insertAsNestedTable, sProps.keepTextOnly];
} else if (this.specificPasteProps)
{
props = [].concat(this.specificPasteProps[sProps.sourceformatting]);
}
else
{
props = [sProps.sourceformatting/*, sProps.mergeFormatting*/, sProps.keepTextOnly];
}
if (specialPasteHelper.specialPasteData && specialPasteHelper.specialPasteData.images && specialPasteHelper.specialPasteData.images.length && !(window["Asc"]["editor"] && window["Asc"]["editor"].isChartEditor)) {
if (!props) {
props = [];
}
props.push(sProps.picture);
}
if(null !== props)
{
specialPasteShowOptions.asc_setOptions(props);
}
else
{
specialPasteHelper.showButtonIdParagraph = null;
specialPasteHelper.CleanButtonInfo();
}
}
if(specialPasteShowOptions)
{
//SpecialPasteButtonById_Show вызываю здесь, если пересчет документа завершился раньше, чем мы попали сюда и сгенерировали параметры вставки
//в противном случае вызываю SpecialPasteButtonById_Show в drawingDocument->OnEndRecalculate
if (specialPasteHelper.endRecalcDocument) {
specialPasteHelper.SpecialPasteButtonById_Show();
}
}
},
_specialPasteItemConvert: function(item)
{
//TODO рассмотреть вариант вставки текста ("text/plain")
//для вставки простого текста, можно было бы использовать ("text/plain")
//но в данном случае вставка текста будет работать не совсем корретно внутри приложения, поскольку
//когда мы пишем в буфер текст, функция GetSelectedText отдаёт вместо табуляции пробелы
//так же некорректно будут вставляться таблицы, поскольку табуляции между ячейками мы потеряем
//внутренние таблицы мы вообще теряем
//для реализации необходимо менять функцию GetSelectedText
//посмотреть, какие браузер могут заменить табуляцию на пробел при занесении текста в буфер обмена
var res = item;
var type = item.GetType();
switch(type)
{
case type_Paragraph:
{
res = this._specialPasteParagraphConvert(item);
break;
}
case type_Table:
{
res = this._specialPasteTableConvert(item);
break;
}
}
return res;
},
_specialPasteTableConvert: function(table)
{
//TODO временная функция
var res = table;
var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
if(props === Asc.c_oSpecialPasteProps.keepTextOnly)
{
res = this._convertTableToText(table);
}
else
{
for(var i = 0; i < table.Content.length; i++)
{
for(var j = 0; j < table.Content[i].Content.length; j++)
{
var cDocumentContent = table.Content[i].Content[j].Content;
for(var n = 0; n < cDocumentContent.Content.length; n++)
{
if(cDocumentContent.Content[n] instanceof Paragraph)
{
this._specialPasteParagraphConvert(cDocumentContent.Content[n]);
}
else if(cDocumentContent.Content[n] instanceof CTable)
{
this._specialPasteTableConvert(cDocumentContent.Content[n]);
}
}
}
}
}
return res;
},
_specialPasteParagraphConvert: function(paragraph)
{
var res = paragraph;
var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
//стиль текущего параграфа/рана, в который вставляем
var pasteIntoParagraphPr = this.oDocument.GetDirectParaPr();
var pasteIntoParaRunPr = this.oDocument.GetDirectTextPr();
switch(props)
{
case Asc.c_oSpecialPasteProps.paste:
{
break;
}
case Asc.c_oSpecialPasteProps.keepTextOnly:
{
//TODO check it and remove/modify this code
var numbering = paragraph.GetNumPr();
if(numbering)
{
//проставляем параграфам NumInfo
var parentContent = paragraph.Parent instanceof CDocument ? this.aContent : paragraph.Parent.Content;
for(var i = 0; i < parentContent.length; i++)
{
var tempParagraph = parentContent[i];
var numbering2 = tempParagraph.GetNumPr ? tempParagraph.GetNumPr() : null;
if(numbering2)
{
var NumberingEngine = new CDocumentNumberingInfoEngine(tempParagraph.Id, numbering2, this.oLogicDocument.Get_Numbering());
var numInfo2 = tempParagraph.Numbering.Internal.NumInfo;
if(!numInfo2 || (numInfo2 && !numInfo2[numbering.Lvl]))
{
for (var nIndex = 0, nCount = parentContent.length; nIndex < nCount; ++nIndex)
{
parentContent[nIndex].GetNumberingInfo(NumberingEngine);
}
if (NumberingEngine.NumInfo.length && NumberingEngine.NumInfo[0] !== undefined) {
tempParagraph.Numbering.Internal.NumInfo = NumberingEngine.NumInfo;
}
}
}
}
this._checkNumberingText(paragraph, paragraph.Numbering.Internal.NumInfo, numbering);
}
if(pasteIntoParagraphPr)
{
paragraph.Set_Pr(pasteIntoParagraphPr.Copy());
if(paragraph.TextPr && pasteIntoParaRunPr)
{
paragraph.TextPr.Value = pasteIntoParaRunPr.Copy();
}
}
this._specialPasteParagraphContentConvert(paragraph.Content, pasteIntoParaRunPr);
break;
}
case Asc.c_oSpecialPasteProps.mergeFormatting:
{
//ms почему-то при merge игнорирует заливку текста
if(pasteIntoParagraphPr)
{
paragraph.Pr.Merge(pasteIntoParagraphPr);
if(paragraph.TextPr)
{
paragraph.TextPr.Value.Merge(pasteIntoParaRunPr);
}
}
this._specialPasteParagraphContentConvert(paragraph.Content, pasteIntoParaRunPr);
break;
}
}
return res;
},
_specialPasteParagraphContentConvert: function(paragraphContent, pasteIntoParaRunPr)
{
var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
var checkInsideDrawings = function(runContent)
{
for(var j = 0; j < runContent.length; j++)
{
var item = runContent[j];
switch(item.Type)
{
case para_Run:
{
checkInsideDrawings(item.Content);
break;
}
case para_Drawing:
{
runContent.splice(j, 1);
break;
}
}
}
};
switch(props)
{
case Asc.c_oSpecialPasteProps.paste:
{
break;
}
case Asc.c_oSpecialPasteProps.keepTextOnly:
{
//в данному случае мы должны применить к вставленному фрагменту стиль paraRun, в который вставляем
if(pasteIntoParaRunPr)
{
for(var i = 0; i < paragraphContent.length; i++)
{
var elem = paragraphContent[i];
var type = elem.Type;
switch(type)
{
case para_Run:
{
//проверить, есть ли внутри изображение
if(pasteIntoParaRunPr && elem.Set_Pr)
{
elem.Set_Pr( pasteIntoParaRunPr.Copy() );
}
checkInsideDrawings(elem.Content);
break;
}
case para_Field:
case para_InlineLevelSdt:
case para_Hyperlink:
{
//изменить hyperlink на pararun
//проверить, есть ли внутри изображение
paragraphContent.splice(i, 1);
for(var n = 0; n < elem.Content.length; n++)
{
paragraphContent.splice(i + n, 0, elem.Content[n]);
}
i--;
break;
}
case para_Math:
{
//преобразуем в текст
var mathToParaRun = this._convertParaMathToText(elem);
if(mathToParaRun)
{
paragraphContent.splice(i, 1, mathToParaRun);
i--;
}
break;
}
case para_Comment:
{
//TODO в дальнейшем лучше удалять коммент а не заменять его
paragraphContent.splice(i, 1, new ParaRun());
i--;
break;
}
}
}
}
break;
}
case Asc.c_oSpecialPasteProps.mergeFormatting:
{
//ms почему-то при merge игнорирует заливку текста
if(pasteIntoParaRunPr)
{
for(var i = 0; i < paragraphContent.length; i++)
{
var elem = paragraphContent[i];
if(pasteIntoParaRunPr && elem.Pr)
{
elem.Pr.Merge(pasteIntoParaRunPr);
}
}
}
break;
}
}
},
_convertParaMathToText: function(paraMath)
{
var res = null;
var oDoc = this.oLogicDocument;
var mathText = paraMath.Root.GetTextContent();
if(mathText && mathText.str)
{
var newParaRun = new ParaRun();
addTextIntoRun(newParaRun, mathText.str);
res = newParaRun;
}
return res;
},
_convertTableToText: function(table, obj, newParagraph)
{
var oDoc = this.oLogicDocument;
var t = this;
if(!obj)
{
obj = [];
}
//row
for(var i = 0; i < table.Content.length; i++)
{
if(!newParagraph)
{
newParagraph = new AscWord.Paragraph(oDoc);
}
//col
for(var j = 0; j < table.Content[i].Content.length; j++)
{
//content
var cDocumentContent = table.Content[i].Content[j].Content;
var createNewParagraph = false;
var previousTableAdd = false;
for(var n = 0; n < cDocumentContent.Content.length; n++)
{
previousTableAdd = false;
if(createNewParagraph)
{
newParagraph = new AscWord.Paragraph(oDoc);
createNewParagraph = false;
}
if(cDocumentContent.Content[n] instanceof AscWord.Paragraph)
{
//TODO пересмотреть обработку. получаем текст из контента, затем делаем контент из текста!
this._specialPasteParagraphConvert(cDocumentContent.Content[n]);
var value = cDocumentContent.Content[n].GetText();
var newParaRun = new ParaRun();
var bIsAddTabBefore = false;
if(newParagraph.Content.length > 1)
{
bIsAddTabBefore = true;
}
addTextIntoRun(newParaRun, value, bIsAddTabBefore, true);
newParagraph.Internal_Content_Add(newParagraph.Content.length - 1, newParaRun, false);
}
else if(cDocumentContent.Content[n] instanceof CTable)
{
t._convertTableToText(cDocumentContent.Content[n], obj, newParagraph);
createNewParagraph = true;
previousTableAdd = true;
}
if(!previousTableAdd && cDocumentContent.Content.length > 1 && n !== cDocumentContent.Content.length - 1)
{
obj.push(newParagraph);
createNewParagraph = true;
}
}
}
obj.push(newParagraph);
newParagraph = null;
}
return obj;
},
_checkNumberingText: function (paragraph, oNumInfo, oNumPr) {
if (oNumPr && oNumInfo) {
var oNum = this.oLogicDocument.GetNumbering().GetNum(oNumPr.NumId);
if (oNum) {
var sNumberingText = oNum.GetText(oNumPr.Lvl, oNumInfo);
var newParaRun = new ParaRun();
addTextIntoRun(newParaRun, sNumberingText, false, true, true);
paragraph.Internal_Content_Add(0, newParaRun, false);
}
}
},
_initSelectedElem: function () {
this.curDocSelection = this.oDocument.GetSelectionState();
if (this.curDocSelection && this.curDocSelection[1] && this.curDocSelection[1].CurPos) {
this.pasteIntoElem = this.oDocument.Content[this.curDocSelection[1].CurPos.ContentPos];
}
},
//***end special paste***
InsertInPlacePresentation: function(aNewContent, isText)
{
var presentation = editor.WordControl.m_oLogicDocument;
var presentationSelectedContent = new PresentationSelectedContent();
presentationSelectedContent.DocContent = new AscCommonWord.CSelectedContent();
for (var i = 0, length = aNewContent.length; i < length; ++i) {
var oSelectedElement = new AscCommonWord.CSelectedElement();
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart && !isText) {
aNewContent[i]= this._specialPasteItemConvert(aNewContent[i]);
}
oSelectedElement.Element = aNewContent[i];
presentationSelectedContent.DocContent.Elements[i] = oSelectedElement;
}
const oPaste = presentation.InsertContent(presentationSelectedContent);
presentation.FinalizeAction();
presentation.UpdateInterface();
if(oPaste.insert) {
this._setSpecialPasteShowOptionsPresentation();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
return oPaste.insert;
},
_setSpecialPasteShowOptionsPresentation: function(props){
let presentation = editor.WordControl.m_oLogicDocument;
if(presentation.IsMasterMode()) return;
let stateSelection = presentation.GetSelectionState();
let curPage = stateSelection.CurPage;
let pos = presentation.GetTargetPosition();
props = !props ? [Asc.c_oSpecialPasteProps.sourceformatting, Asc.c_oSpecialPasteProps.keepTextOnly] : props;
let x, y, w, h;
if (null === pos) {
pos = presentation.GetSelectedBounds();
w = pos.w;
h = pos.h;
x = pos.x + w;
y = pos.y + h;
} else {
x = pos.X;
y = pos.Y;
}
let screenPos;
let bThumbnals = presentation.IsFocusOnThumbnails();
let sSlideId = null;
let aSelectedSlides = presentation.GetSelectedSlides();
if(bThumbnals && aSelectedSlides.length > 0) {
let nSlideIndex = aSelectedSlides[aSelectedSlides.length - 1];
let oSlide = presentation.GetSlide(nSlideIndex);
sSlideId = oSlide.Get_Id();
}
if(sSlideId) {
screenPos = editor.WordControl.Thumbnails.getSpecialPasteButtonCoords(sSlideId);
w = 1;
h = 1;
}
else {
screenPos = presentation.DrawingDocument.ConvertCoordsToCursorWR(x, y, curPage);
}
let specialPasteShowOptions = window['AscCommon'].g_specialPasteHelper.buttonInfo;
specialPasteShowOptions.asc_setOptions(props);
let targetDocContent = presentation.Get_TargetDocContent();
if(targetDocContent && targetDocContent.Id) {
specialPasteShowOptions.setShapeId(targetDocContent.Id);
} else {
specialPasteShowOptions.setShapeId(null);
}
let curCoord = new AscCommon.asc_CRect( screenPos.X, screenPos.Y, 0, 0 );
specialPasteShowOptions.asc_setCellCoord(curCoord);
specialPasteShowOptions.setFixPosition({x: x, y: y, pageNum: curPage, w: w, h: h, slideId: sSlideId});
},
insertInPlace2: function(oDoc, aNewContent)
{
var nNewContentLength = aNewContent.length;
//Часть кода из Document.Add_NewParagraph
for(var i = 0; i < aNewContent.length; ++i)
{
aNewContent[i].Clear_TextFormatting();
aNewContent[i].Clear_Formatting(true);
}
oDoc.Remove(1, true, true);
var Item = oDoc.Content[oDoc.CurPos.ContentPos];
if( type_Paragraph === Item.GetType() )
{
if(/*true != this.bInBlock &&*/ 1 === nNewContentLength && type_Paragraph === aNewContent[0].GetType() && Item.CurPos.ContentPos !== 1)
{
//Вставка строки в параграф
var oInsertPar = aNewContent[0];
var nContentLength = oInsertPar.Content.length;
if(nContentLength > 2)
{
var oFindObj = Item.Internal_FindBackward(Item.CurPos.ContentPos, [para_TextPr]);
var TextPr = null;
if ( true === oFindObj.Found && para_TextPr === oFindObj.Type )
TextPr = Item.Content[oFindObj.LetterPos].Copy();
else
TextPr = new ParaTextPr();
var nContentPos = Item.CurPos.ContentPos;
for(var i = 0; i < nContentLength - 2; ++i)// -2 на спецсимволы конца параграфа
{
var oCurInsItem = oInsertPar.Content[i];
if(para_Numbering !== oCurInsItem.Type)
{
Item.Internal_Content_Add(nContentPos, oCurInsItem);
nContentPos++;
}
}
Item.Internal_Content_Add(nContentPos, TextPr);
}
Item.RecalcInfo.Set_Type_0(pararecalc_0_All);
Item.RecalcInfo.NeedSpellCheck();
}
else
{
var LastPos = this.oRecalcDocument.CurPos.ContentPos;
var LastPosCurDoc = oDoc.CurPos.ContentPos;
//Нужно разрывать параграф
var oSourceFirstPar = Item;
var oSourceLastPar = new AscWord.Paragraph(oDoc);
if(true !== oSourceFirstPar.IsCursorAtEnd() || oSourceFirstPar.IsEmpty())
oSourceFirstPar.Split(oSourceLastPar);
var oInsFirstPar = aNewContent[0];
var oInsLastPar = null;
if(nNewContentLength > 1)
oInsLastPar = aNewContent[nNewContentLength - 1];
var nStartIndex = 0;
var nEndIndex = nNewContentLength - 1;
if(type_Paragraph === oInsFirstPar.GetType())
{
//копируем свойства первого вставляемого параграфа в первый исходный параграф
//CopyPr_Open - заносим в историю, т.к. этот параграф уже в документе
oInsFirstPar.CopyPr_Open( oSourceFirstPar );
//Копируем содержимое вставляемого параграфа
oSourceFirstPar.Concat(oInsFirstPar);
if(AscCommon.isRealObject(oInsFirstPar.bullet))
{
oSourceFirstPar.setPresentationBullet(oInsFirstPar.bullet.createDuplicate());
}
//Сдвигаем стартовый индекс чтобы больше не учитывать этот параграф
nStartIndex++;
}
else if(type_Table === oInsFirstPar.GetType())
{
//если вставляем таблицу в пустой параграф, то не разрываем его
if(oSourceFirstPar.IsEmpty())
{
oSourceFirstPar = null;
}
}
//Если не скопирован символ конца параграфа, то добавляем содержимое последнего параграфа в начело второй половины разбитого параграфа
if(null != oInsLastPar && type_Paragraph == oInsLastPar.GetType() && true != this.bInBlock)
{
var nNewContentPos = oInsLastPar.Content.length - 2;
//копируем свойства последнего исходного параграфа в последний вставляемый параграф
//CopyPr - не заносим в историю, т.к. в историю добавится вставка этого параграфа в документ
var ind = oInsLastPar.Pr.Ind;
if(null != oInsLastPar)
oSourceLastPar.CopyPr( oInsLastPar );
if(oInsLastPar.bullet)
{
oInsLastPar.Set_Ind(ind);
}
oInsLastPar.Concat(oSourceLastPar);
oInsLastPar.CurPos.ContentPos = nNewContentPos;
oSourceLastPar = oInsLastPar;
nEndIndex--;
}
//вставляем
for(var i = nStartIndex; i <= nEndIndex; ++i )
{
var oElemToAdd = aNewContent[i];
LastPosCurDoc++;
oDoc.Internal_Content_Add(LastPosCurDoc, oElemToAdd);
}
if(null != oSourceLastPar)
{
//вставляем последний параграф
LastPosCurDoc++;
oDoc.Internal_Content_Add(LastPosCurDoc, oSourceLastPar);
}
if(null == oSourceFirstPar)
{
//Удаляем первый параграф, потому что будут ошибки если в документе не будет ни одного параграфа
oDoc.Internal_Content_Remove(LastPosCurDoc, 1);
LastPosCurDoc--;
}
Item.RecalcInfo.Set_Type_0(pararecalc_0_All);
Item.RecalcInfo.NeedSpellCheck();
oDoc.CurPos.ContentPos = LastPosCurDoc;
}
}
var content = oDoc.Content;
for(var i = 0; i < content.length; ++i)
{
content[i].Recalc_CompiledPr();
content[i].RecalcInfo.Set_Type_0(pararecalc_0_All);
}
},
ReadFromBinary : function(sBase64, oDocument)
{
var oDocumentParams = PasteElementsId.g_bIsDocumentCopyPaste ? this.oDocument : null;
var openParams = { checkFileSize: false, charCount: 0, parCount: 0, bCopyPaste: true, oDocument: oDocumentParams };
var doc = oDocument ? oDocument : this.oLogicDocument;
var oBinaryFileReader = new AscCommonWord.BinaryFileReader(doc, openParams);
var oRes = oBinaryFileReader.ReadFromString(sBase64, {wordCopyPaste: true});
this.bInBlock = oRes.bInBlock;
if(!oRes.content.length && !oRes.aPastedImages.length && !oRes.images.length) {
oRes = null;
}
return oRes;
},
SetShortImageId: function(aPastedImages)
{
if(!aPastedImages)
return;
for(var i = 0, length = aPastedImages.length; i < length; ++i)
{
var imageElem = aPastedImages[i];
if(null != imageElem)
{
imageElem.SetUrl(imageElem.Url);
}
}
},
getRtfImages: function(rtf, html) {
var getRtfImg = function (sRtf) {
var res = [];
var rg_rtf = /\{\\pict[\s\S]+?\\bliptag\-?\d+(\\blipupi\-?\d+)?(\{\\\*\\blipuid\s?[\da-fA-F]+)?[\s\}]*?/, d;
var rg_rtf_all = new RegExp("(?:(" + rg_rtf.source + "))([\\da-fA-F\\s]+)\\}", "g");
var pngStr = "\\pngblip";
var jpegStr = "\\jpegblip";
var pngTypeStr = "image/png";
var jpegTypeStr = "image/jpeg";
var type;
sRtf = sRtf.match(rg_rtf_all);
if (!sRtf) {
return res;
}
for (var i = 0; i < sRtf.length; i++) {
if (rg_rtf.test(sRtf[i])) {
if (-1 !== sRtf[i].indexOf(jpegStr)) {
type = pngTypeStr;
} else if (-1 !== sRtf[i].indexOf(pngStr)) {
type = jpegTypeStr;
} else {
continue;
}
res.push({
data: sRtf[i].replace(rg_rtf, "").replace(/[^\da-fA-F]/g, ""), type: type
})
}
}
return res
};
var getHtmlImg = function (sHtml) {
var rg_html = /]+src="([^"]+)[^>]+/g;
var res = [];
var img;
while (true) {
img = rg_html.exec(sHtml);
if (!img) {
break;
}
res.push(img[1]);
}
return res;
};
function hexToBytes(hex) {
var res = [];
for (var i = 0; i < hex.length; i += 2) {
res.push(parseInt(hex.substr(i, 2), 16));
}
return res;
}
function bytesToBase64(val) {
var res = "";
var bytes = new Uint8Array(val);
for (var i = 0; i < bytes.byteLength; i++) {
res += String.fromCharCode(bytes[i]);
}
//TODO проверить данный метод на разных браузерах и системах
return window.btoa(res);
}
var rtfImages = getRtfImg(rtf);
var htmlImages = getHtmlImg(html);
var map = {};
if(rtfImages.length === htmlImages.length) {
for(var i = 0; i < rtfImages.length; i++) {
var a = rtfImages[i];
if(a.type) {
var bytes = hexToBytes(a.data);
map[htmlImages[i]] = "data:" + a.type + ";base64," + bytesToBase64(bytes);
}
}
}
return map;
},
Start : function (node, nodeDisplay, bDuplicate, fromBinary, text, callback) {
//PASTE
var tempPresentation = !PasteElementsId.g_bIsDocumentCopyPaste && editor && editor.WordControl ? editor.WordControl.m_oLogicDocument : null;
var insertToPresentationWithoutSlides = tempPresentation && tempPresentation.Slides && !tempPresentation.Slides.length;
//this.oDocument.Remove(1, false, false, false, false, true);
var base64FromExcel, base64FromWord, base64FromPresentation, base64FromPDF;
if (PasteElementsId.copyPasteUseBinary) {
//get binary
var binaryObj = this._getClassBinaryFromHtml(node, fromBinary);
base64FromExcel = binaryObj.base64FromExcel;
base64FromWord = binaryObj.base64FromWord;
base64FromPresentation = binaryObj.base64FromPresentation;
base64FromPDF = binaryObj.base64FromPDF;
}
if (text) {
if (insertToPresentationWithoutSlides) {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
this.rejectCallback && this.rejectCallback();
this.pasteCallback && this.pasteCallback(false);
return;
}
//при вставке списка в список, ms вставляет именно html и фильтрует текст(убирает всё, что относится к списку)
//идея такая, если видим, что вставляем в список, то здесь не делаем pasteText, смотрим на функции prepeare есть ли внутри html списки
//причём в любом виде - стандартные списки/mso-list
//если есть, то парсим стандратно html, далее переводим в текст её без элементов списка и вставляем
//+ если из нас в нас вставляем, тоже отсекам всё что связано со списками
//TODO pasteTextIntoList - ввожу временно, искючение для вставки текста в список. позже сделать общую отдельную обработку для подобных исключений
if (PasteElementsId.g_bIsDocumentCopyPaste && (node || ("" !== fromBinary && base64FromWord))) {
this._initSelectedElem();
if (this.pasteIntoElem && this.pasteIntoElem.GetNumPr && this.pasteIntoElem.GetNumPr()) {
this.pasteTextIntoList = text;
}
}
if (!this.pasteTextIntoList) {
this.oLogicDocument.RemoveBeforePaste();
this.oDocument = this._GetTargetDocument(this.oDocument);
this._pasteText(text);
return;
}
}
var bInsertFromBinary = false;
if (!node && "" === fromBinary) {
this.pasteCallback && this.pasteCallback(false);
return;
}
if (PasteElementsId.copyPasteUseBinary) {
var bTurnOffTrackRevisions = false;
if (PasteElementsId.g_bIsDocumentCopyPaste)//document
{
var oThis = this;
//удаляем в начале, иначе может получиться что будем вставлять в элементы, которое потом удалим.
//todo с удалением в начале есть проблема, что удаляем элементы даже при пустом буфере
// Для вставки текста по выделению ячеек таблицы, мы должны сохранить выделенные ячейки
var oDocState = null;
if (this.oDocument instanceof CDocument && this.oDocument.IsTableCellSelection())
oDocState = this.oDocument.SaveDocumentState(false);
this.oLogicDocument.RemoveBeforePaste();
if (oDocState)
this.oDocument.LoadDocumentState(oDocState);
this.oDocument = this._GetTargetDocument(this.oDocument);
if (this.oDocument && this.oDocument.bPresentation) {
if (oThis.api.WordControl.m_oLogicDocument.IsTrackRevisions()) {
bTurnOffTrackRevisions = oThis.api.WordControl.m_oLogicDocument.GetLocalTrackRevisions();
oThis.api.WordControl.m_oLogicDocument.SetLocalTrackRevisions(false);
}
}
}
//paste form word/excel/html into empty presentation without slides
if (insertToPresentationWithoutSlides && !base64FromPresentation) {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
this.pasteCallback && this.pasteCallback(false);
return;
}
//insert from binary
if (base64FromExcel)//вставка из редактора таблиц
{
if (PasteElementsId.g_bIsPDFCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromExcelToPDF(base64FromExcel, !!(fromBinary));
} else if (PasteElementsId.g_bIsDocumentCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromExcelToWord(base64FromExcel);
} else {
bInsertFromBinary = null !== this._pasteBinaryFromExcelToPresentation(base64FromExcel);
}
} else if (base64FromWord)//вставка из редактора документов
{
if (PasteElementsId.g_bIsPDFCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromWordToPDF(base64FromWord, !!(fromBinary));
} else if (PasteElementsId.g_bIsDocumentCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromWordToWord(base64FromWord, !!(fromBinary));
} else {
bInsertFromBinary = null !== this._pasteBinaryFromWordToPresentation(base64FromWord, !!(fromBinary));
}
} else if (base64FromPresentation)//вставка из редактора презентаций
{
if (PasteElementsId.g_bIsPDFCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromPresentationToPDF(base64FromPresentation, bDuplicate);
} else if (PasteElementsId.g_bIsDocumentCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromPresentationToWord(base64FromPresentation, bDuplicate);
} else {
bInsertFromBinary = null !== this._pasteBinaryFromPresentationToPresentation(base64FromPresentation);
}
} else if (base64FromPDF)//вставка из pdf редактора
{
PasteElementsId.g_bIsPdfBinary = true;
if (PasteElementsId.g_bIsPDFCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromPDFToPDF(base64FromPDF);
} else if (PasteElementsId.g_bIsDocumentCopyPaste) {
bInsertFromBinary = null !== this._pasteBinaryFromPDFToWord(base64FromPDF);
} else {
bInsertFromBinary = null !== this._pasteBinaryFromPDFToPresentation(base64FromPDF);
}
PasteElementsId.g_bIsPdfBinary = false;
}
}
if (true === bInsertFromBinary) {
if (false !== bTurnOffTrackRevisions) {
oThis.api.WordControl.m_oLogicDocument.SetLocalTrackRevisions(bTurnOffTrackRevisions);
}
} else if (node) {
this._pasteFromHtml(node, bTurnOffTrackRevisions);
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
this.rejectCallback && this.rejectCallback();
this.pasteCallback && this.pasteCallback(false);
}
},
//from EXCEL to WORD
_pasteBinaryFromExcelToWord: function (base64FromExcel) {
var oThis = this;
var fPrepasteCallback = function () {
if (false === oThis.bNested) {
oThis.InsertInDocument();
if (oThis.aContent.bAddNewStyles) {
oThis.api.GenerateStyles();
}
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
}
};
History.TurnOff();
var aContentExcel = this._readFromBinaryExcel(base64FromExcel);
History.TurnOn();
if (null === aContentExcel) {
return null;
}
var oldLocale = AscCommon.g_oDefaultCultureInfo ? AscCommon.g_oDefaultCultureInfo.LCID : AscCommon.g_oDefaultCultureInfo;
AscCommon.setCurrentCultureInfo(aContentExcel.workbook.Core.language);
var revertLocale = function () {
if (oldLocale) {
AscCommon.setCurrentCultureInfo(oldLocale);
} else {
AscCommon.g_oDefaultCultureInfo = oldLocale;
}
};
var aContent;
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart &&
Asc.c_oSpecialPasteProps.keepTextOnly === window['AscCommon'].g_specialPasteHelper.specialPasteProps) {
aContent = oThis._convertExcelBinary(aContentExcel);
revertLocale();
oThis.aContent = aContent.content;
fPrepasteCallback();
} else {
let oObjectsForDownload = null;
if(aContentExcel.arrImages && aContentExcel.arrImages.length) {
oObjectsForDownload = GetObjectsForImageDownload(aContentExcel.arrImages);
}
if (oObjectsForDownload && oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
var oImageMap = {};
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
var aContent = oThis._convertExcelBinary(aContentExcel, aContentExcel ? aContentExcel.pDrawings : null);
revertLocale();
oThis.aContent = aContent.content;
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, aContentExcel.arrImages);
oThis.api.pre_Paste(aContent.fonts, oImageMap, fPrepasteCallback);
}, true);
} else {
aContent = oThis._convertExcelBinary(aContentExcel);
revertLocale();
oThis.aContent = aContent.content;
oThis.api.pre_Paste(aContent.fonts, aContent.images, fPrepasteCallback);
}
}
},
//from EXCEL to PRESENTATION
_pasteBinaryFromExcelToPresentation: function (base64FromExcel) {
var oThis = this;
var presentation = editor.WordControl.m_oLogicDocument;
var excelContent = AscFormat.ExecuteNoHistory(this._readFromBinaryExcel, this, [base64FromExcel]);
if (null === excelContent) {
return null;
}
var aContentExcel = excelContent.workbook;
var aPastedImages = excelContent.arrImages;
//если есть шейпы, то вставляем их из excel
var aContent;
var _sheet = aContentExcel && aContentExcel.aWorksheets && aContentExcel.aWorksheets[0];
var drawings = excelContent.pDrawings ? excelContent.pDrawings : _sheet && _sheet.Drawings;
if (drawings && drawings.length) {
var paste_callback = function () {
if (false === oThis.bNested) {
var oIdMap = {};
var aCopies = [];
var oCopyPr = new AscFormat.CCopyObjectProperties();
oCopyPr.idMap = oIdMap;
var l = null, t = null, r = null, b = null, oXfrm;
for (var i = 0; i < arr_shapes.length; ++i) {
shape = arr_shapes[i].graphicObject.copy(oCopyPr);
aCopies.push(shape);
oIdMap[arr_shapes[i].graphicObject.Id] = shape.Id;
shape.worksheet = null;
shape.drawingBase = null;
arr_shapes[i] = new DrawingCopyObject(shape, 0, 0, 0, 0);
if (shape.spPr && shape.spPr.xfrm && AscFormat.isRealNumber(shape.spPr.xfrm.offX) && AscFormat.isRealNumber(shape.spPr.xfrm.offY)
&& AscFormat.isRealNumber(shape.spPr.xfrm.extX) && AscFormat.isRealNumber(shape.spPr.xfrm.extY)) {
oXfrm = shape.spPr.xfrm;
if (l === null) {
l = oXfrm.offX;
} else {
if (oXfrm.offX < l) {
l = oXfrm.offX;
}
}
if (t === null) {
t = oXfrm.offY;
} else {
if (oXfrm.offY < t) {
t = oXfrm.offY;
}
}
if (r === null) {
r = oXfrm.offX + oXfrm.extX;
} else {
if (oXfrm.offX + oXfrm.extX > r) {
r = oXfrm.offX + oXfrm.extX;
}
}
if (b === null) {
b = oXfrm.offY + oXfrm.extY;
} else {
if (oXfrm.offY + oXfrm.extY > b) {
b = oXfrm.offY + oXfrm.extY;
}
}
}
}
if (AscFormat.isRealNumber(l) && AscFormat.isRealNumber(t)
&& AscFormat.isRealNumber(r) && AscFormat.isRealNumber(b)) {
var fSlideCX = presentation.GetWidthMM() / 2.0;
var fSlideCY = presentation.GetHeightMM() / 2.0;
var fBoundsCX = (r + l) / 2.0;
var fBoundsCY = (t + b) / 2.0;
var fDiffX = fBoundsCX - fSlideCX;
var fDiffY = fBoundsCY - fSlideCY;
if (!AscFormat.fApproxEqual(fDiffX, 0) || !AscFormat.fApproxEqual(fDiffY, 0)) {
for (var i = 0; i < arr_shapes.length; ++i) {
shape = arr_shapes[i].Drawing;
if (shape.spPr && shape.spPr.xfrm && AscFormat.isRealNumber(shape.spPr.xfrm.offX) && AscFormat.isRealNumber(shape.spPr.xfrm.offY)
&& AscFormat.isRealNumber(shape.spPr.xfrm.extX) && AscFormat.isRealNumber(shape.spPr.xfrm.extY)) {
shape.spPr.xfrm.setOffX(shape.spPr.xfrm.offX - fDiffX);
shape.spPr.xfrm.setOffY(shape.spPr.xfrm.offY - fDiffY);
}
}
}
}
AscFormat.fResetConnectorsIds(aCopies, oIdMap);
var presentationSelectedContent = new PresentationSelectedContent();
presentationSelectedContent.Drawings = arr_shapes;
const oInsertResult = presentation.InsertContent(presentationSelectedContent);
presentation.FinalizeAction();
presentation.UpdateInterface();
if (oInsertResult.insert) {
let arrProps = [];
if (oInsertResult.specialPasteProps) {
arrProps = [].concat(oInsertResult.specialPasteProps[Asc.c_oSpecialPasteProps.destinationFormatting]);
}
oThis._setSpecialPasteShowOptionsPresentation(arrProps);
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(oInsertResult.insert);
}
};
var arr_shapes = drawings;
var aImagesToDownload = [];
for (var i = 0; i < aPastedImages.length; i++) {
aImagesToDownload.push(aPastedImages[i].Url);
}
aContent = {aPastedImages: aPastedImages, images: aImagesToDownload};
//fonts
var font_map = {};
for (var i = 0; i < arr_shapes.length; ++i) {
var shape = arr_shapes[i].graphicObject;
if (shape) {
shape.getAllFonts(font_map);
}
}
var fonts = [];
//грузим картинки и фонты
for (var i in font_map) {
fonts.push(new CFont(i));
}
//images
var images = aContent.images;
var arrImages = aContent.aPastedImages;
var oObjectsForDownload = GetObjectsForImageDownload(arrImages);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
var oImageMap = {};
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, arrImages);
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
this.SetShortImageId(arrImages);
this.api.pre_Paste(fonts, images, paste_callback);
}
} else {
var presentationSelectedContent = new PresentationSelectedContent();
presentationSelectedContent.DocContent = new AscCommonWord.CSelectedContent();
aContent = AscFormat.ExecuteNoHistory(this._convertExcelBinary, this, [excelContent]);
var selectedElement, element, pDrawings = [], drawingCopyObject;
//var defaultTableStyleId = presentation.DefaultTableStyleId;
for (var i = 0; i < aContent.content.length; ++i) {
selectedElement = new AscCommonWord.CSelectedElement();
element = aContent.content[i];
if (type_Table === element.GetType())//table
{
//TODO переделать количество строк и ширину
var W = 100;
var Rows = 3;
var graphic_frame = new AscFormat.CGraphicFrame();
graphic_frame.setSpPr(new AscFormat.CSpPr());
graphic_frame.spPr.setParent(graphic_frame);
graphic_frame.spPr.setXfrm(new AscFormat.CXfrm());
graphic_frame.spPr.xfrm.setParent(graphic_frame.spPr);
graphic_frame.spPr.xfrm.setOffX((this.oDocument.GetWidthMM() - W) / 2);
graphic_frame.spPr.xfrm.setOffY(this.oDocument.GetHeightMM() / 5);
graphic_frame.spPr.xfrm.setExtX(W);
graphic_frame.spPr.xfrm.setExtY(7.478268771701388 * Rows);
graphic_frame.setNvSpPr(new AscFormat.UniNvPr());
element = this._convertTableToPPTX(element);
graphic_frame.setGraphicObject(element.Copy(graphic_frame));
//graphic_frame.graphicObject.Set_TableStyle(presentation.DefaultTableStyleId);
drawingCopyObject = new DrawingCopyObject();
drawingCopyObject.Drawing = graphic_frame;
pDrawings.push(drawingCopyObject);
}
}
presentationSelectedContent.Drawings = pDrawings;
//вставка
var paste_callback_presentation = function () {
if (false == oThis.bNested) {
const oPaste = presentation.InsertContent(presentationSelectedContent);
presentation.FinalizeAction();
presentation.UpdateInterface();
if (oPaste.insert) {
let props = [Asc.c_oSpecialPasteProps.destinationFormatting, Asc.c_oSpecialPasteProps.keepTextOnly];
oThis._setSpecialPasteShowOptionsPresentation(props);
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(oPaste.insert);
}
};
oThis.api.pre_Paste(aContent.fonts, null, paste_callback_presentation);
}
},
//from EXCEL to PDF
_pasteBinaryFromExcelToPDF: function (base64FromExcel) {
let oThis = this;
let oDoc = Asc.editor.getPDFDoc();
let nPageW = oDoc.GetPageWidthMM(oDoc.GetCurPage());
let nPageH = oDoc.GetPageHeight(oDoc.GetCurPage());
let excelContent = AscFormat.ExecuteNoHistory(this._readFromBinaryExcel, this, [base64FromExcel]);
if (null === excelContent) {
return null;
}
let aContentExcel = excelContent.workbook;
let aPastedImages = excelContent.arrImages;
//если есть шейпы, то вставляем их из excel
let aContent;
let _sheet = aContentExcel && aContentExcel.aWorksheets && aContentExcel.aWorksheets[0];
let drawings = excelContent.pDrawings ? excelContent.pDrawings : _sheet && _sheet.Drawings;
if (drawings && drawings.length) {
let paste_callback = function () {
if (false === oThis.bNested) {
arr_shapes = arr_shapes.map(function(drawing) {
return new AscPDF.DrawingCopyObject(drawing.graphicObject, 0, 0, 0, 0);
});
let oPDFSelContent = new AscPDF.PDFSelectedContent();
oPDFSelContent.Drawings = arr_shapes;
for (let i = 0; i < oPDFSelContent.Drawings.length; i++) {
let drawing = oPDFSelContent.Drawings[i].Drawing;
if (!drawing.IsPdfDrawing) {
oPDFSelContent.Drawings.splice(i, 1);
i--;
}
else {
drawing.bDeleted = false;
}
}
let bInsert = oDoc.InsertContent2([oPDFSelContent], 0);
if (!bInsert) {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo()
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(bInsert);
}
};
let arr_shapes = drawings;
let aImagesToDownload = [];
for (let i = 0; i < aPastedImages.length; i++) {
aImagesToDownload.push(aPastedImages[i].Url);
}
aContent = {aPastedImages: aPastedImages, images: aImagesToDownload};
//fonts
let font_map = {};
for (let i = 0; i < arr_shapes.length; ++i) {
let shape = arr_shapes[i].graphicObject;
if (shape) {
shape.getAllFonts(font_map);
}
}
let fonts = [];
//грузим картинки и фонты
for (let i in font_map) {
fonts.push(new CFont(i));
}
//images
let images = aContent.images;
let arrImages = aContent.aPastedImages;
let oObjectsForDownload = GetObjectsForImageDownload(arrImages);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
let oImageMap = {};
AscCommon.ExecuteNoHistory(function() {
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, arrImages);
});
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
this.SetShortImageId(arrImages);
this.api.pre_Paste(fonts, images, paste_callback);
}
} else {
let oPDFSelContent = new AscPDF.PDFSelectedContent();
oPDFSelContent.DocContent = new AscCommonWord.CSelectedContent();
aContent = AscFormat.ExecuteNoHistory(this._convertExcelBinary, this, [excelContent]);
let selectedElement, element, pDrawings = [], drawingCopyObject;
AscCommon.ExecuteNoHistory(function() {
for (let i = 0; i < aContent.content.length; ++i) {
selectedElement = new AscCommonWord.CSelectedElement();
element = aContent.content[i];
if (type_Table === element.GetType())//table
{
element = oThis._convertTableToPPTX(element, true);
let W = nPageW * 2 / 3;
let Rows = element.GetRowsCount();
let H = Rows * 7.478268771701388;
let graphic_frame = new AscPDF.CPdfGraphicFrame();
graphic_frame.setSpPr(new AscFormat.CSpPr());
graphic_frame.spPr.setParent(graphic_frame);
graphic_frame.spPr.setXfrm(new AscFormat.CXfrm());
graphic_frame.spPr.xfrm.setParent(graphic_frame.spPr);
graphic_frame.spPr.xfrm.setOffX(nPageW / 2 - W / 2);
graphic_frame.spPr.xfrm.setOffY(nPageH / 2 - H / 2);
graphic_frame.spPr.xfrm.setExtX(W);
graphic_frame.spPr.xfrm.setExtY(H);
graphic_frame.setNvSpPr(new AscFormat.UniNvPr());
graphic_frame.setGraphicObject(element.Copy(graphic_frame));
drawingCopyObject = new AscPDF.DrawingCopyObject();
drawingCopyObject.Drawing = graphic_frame;
pDrawings.push(drawingCopyObject);
}
}
});
oPDFSelContent.Drawings = pDrawings;
//вставка
let paste_callback_pdf = function () {
if (false == oThis.bNested) {
for (let i = 0; i < oPDFSelContent.Drawings.length; i++) {
let drawing = oPDFSelContent.Drawings[i].Drawing;
if (!drawing.IsPdfDrawing) {
oPDFSelContent.Drawings.splice(i, 1);
i--;
}
else {
drawing.bDeleted = false;
}
}
let bInsert = oDoc.InsertContent2([oPDFSelContent], 0);
if (bInsert) {
let props = [Asc.c_oSpecialPasteProps.destinationFormatting, Asc.c_oSpecialPasteProps.keepTextOnly];
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(bInsert);
}
};
oThis.api.pre_Paste(aContent.fonts, null, paste_callback_pdf);
}
},
//from WORD to WORD
_pasteBinaryFromWordToWord: function (base64FromWord, bIsOnlyFromBinary) {
var oThis = this;
//при чтении документа создаётся новый DocPart, который добавляется в DocParts, но не добавляется в g_oTableId
//чтобы он добавлялся в g_oTableId и соответсвенно в историю, делаю ему Copy()
//но далее вызывается функция InsertInDocument-> ... -> CheckDocPartNames, где берутся все СС во вставляемом фрагменте
//смотрится есть ли плесйхолдер и если он есть, то переименовывается плейсходер и DocPart->Name
//поскольку в DocParts уже есть несколько DocPart с одинаковым именем(один при чтении, второй и при Copy)
//то при попытке переименования берётся первый DocPart(который добавлен в DocParts, но не в g_oTableId)-> и переименовывается
//соответсвенно далее при накатывании изменений в g_oTableId отсутвует DocPart с нужным именем
//чтобы от этой проблемы уйти - удаляю тот первый, который был создан при чтении - delete glossaryDoc.DocParts[aDelIndexes[i]];
//но появляется другая проблема - при повтроном копировании делается CDocPart-> Copy и снова создаётся DocPart с таким именем
//и добавляется в DocParts. далее при вставке снова всё повторяется...
var aContent = this.ReadFromBinary(base64FromWord);
if (null === aContent) {
return null;
}
if (Asc.c_oSpecialPasteProps.keepTextOnly === window['AscCommon'].g_specialPasteHelper.specialPasteProps) {
this.oLogicDocument.RemoveBeforePaste();
this.oDocument = this._GetTargetDocument(this.oDocument);
var oPr = {Numbering: true};
this._initSelectedElem();
if (this.pasteIntoElem && this.pasteIntoElem.GetNumPr && this.pasteIntoElem.GetNumPr()) {
oPr.Numbering = false;
}
this._pasteText(this._getTextFromContent(aContent.content, oPr));
return;
}
//вставляем в заголовок диаграммы, предварительно конвертируем все параграфы в презентационный формат
if (aContent && aContent.content && this.oDocument.bPresentation && oThis.oDocument && oThis.oDocument.Parent &&
oThis.oDocument.Parent.parent && oThis.oDocument.Parent.parent.parent &&
oThis.oDocument.Parent.parent.parent.getObjectType &&
oThis.oDocument.Parent.parent.parent.getObjectType() === AscDFH.historyitem_type_Chart) {
//не грузим изображения при вставке в заголовок диаграммы
aContent.images = [];
aContent.aPastedImages = [];
var newContent = [];
for (var i = 0; i < aContent.content.length; i++) {
if (type_Paragraph === aContent.content[i].Get_Type()) {
newContent.push(
AscFormat.ConvertParagraphToPPTX(aContent.content[i], this.oDocument.DrawingDocument,
this.oDocument, false, true));
}
}
aContent.content = newContent;
}
var fPrepasteCallback = function () {
if (false === oThis.bNested) {
oThis.InsertInDocument();
if (aContent.bAddNewStyles) {
oThis.api.GenerateStyles();
}
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
}
};
this.aContent = aContent.content;
//проверяем список фонтов
aContent.fonts = oThis._checkFontsOnLoad(aContent.fonts);
var oObjectsForDownload = GetObjectsForImageDownload(aContent.aPastedImages);
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart &&
Asc.c_oSpecialPasteProps.keepTextOnly === window['AscCommon'].g_specialPasteHelper.specialPasteProps) {
oThis.api.pre_Paste([], [], fPrepasteCallback);
} else if (oObjectsForDownload.aUrls.length > 0) {
if (window["IS_NATIVE_EDITOR"]) {
oThis.api.pre_Paste(aContent.fonts, aContent.images, fPrepasteCallback);
} else if (bIsOnlyFromBinary && window["NativeCorrectImageUrlOnPaste"]) {
var url;
for (var i = 0; i < aContent.aPastedImages.length; ++i) {
url = window["NativeCorrectImageUrlOnPaste"](aContent.aPastedImages[i].Url);
aContent.images[i] = url;
var imageElem = aContent.aPastedImages[i];
if (null != imageElem) {
imageElem.SetUrl(url);
}
}
oThis.api.pre_Paste(aContent.fonts, aContent.images, fPrepasteCallback);
} else {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl,
aContent.images);
oThis.api.pre_Paste(aContent.fonts, aContent.images, fPrepasteCallback);
}, true);
}
} else {
oThis.SetShortImageId(aContent.aPastedImages);
oThis.api.pre_Paste(aContent.fonts, aContent.images, fPrepasteCallback);
}
},
//from WORD to PRESENTATION
_pasteBinaryFromWordToPresentation: function (base64FromWord) {
var oThis = this;
var presentation = editor.WordControl.m_oLogicDocument;
var trueDocument = this.oDocument;
var tempCDocument = function () {
return new CDocument(oThis.oDocument.DrawingDocument, false);
};
//создаём темповый CDocument
this.oDocument = AscFormat.ExecuteNoHistory(tempCDocument, this, []);
AscCommon.g_oIdCounter.m_bRead = true;
var aContent = AscFormat.ExecuteNoHistory(this.ReadFromBinary, this, [base64FromWord, this.oDocument]);
AscCommon.g_oIdCounter.m_bRead = false;
if (null === aContent) {
return null;
}
//возврщаем обратно переменные и историю, документ которой заменяется при создании CDocument
this.oDocument = trueDocument;
History.Document = trueDocument;
var presentationSelectedContent = new PresentationSelectedContent();
presentationSelectedContent.DocContent = new AscCommonWord.CSelectedContent();
var parseContent = function (content) {
for (var i = 0; i < content.length; ++i) {
selectedElement = new AscCommonWord.CSelectedElement();
element = content[i];
//drawings
element.GetAllDrawingObjects(drawings);
if (type_Paragraph === element.GetType())//paragraph
{
selectedElement.Element = AscFormat.ConvertParagraphToPPTX(element, null, null, true, false);
elements.push(selectedElement);
} else if (type_Table === element.GetType())//table
{
element = oThis._convertTableToPPTX(element, true);
//TODO переделать количество строк и ширину
var W = oThis.oDocument.GetWidthMM() / 1.45;
var Rows = element.GetRowsCount();
var H = Rows * 7.478268771701388;
var graphic_frame = new AscFormat.CGraphicFrame();
graphic_frame.setSpPr(new AscFormat.CSpPr());
graphic_frame.spPr.setParent(graphic_frame);
graphic_frame.spPr.setXfrm(new AscFormat.CXfrm());
graphic_frame.spPr.xfrm.setParent(graphic_frame.spPr);
graphic_frame.spPr.xfrm.setOffX(oThis.oDocument.GetWidthMM() / 2 - W / 2);
graphic_frame.spPr.xfrm.setOffY(oThis.oDocument.GetHeightMM() / 2 - H / 2);
graphic_frame.spPr.xfrm.setExtX(W);
graphic_frame.spPr.xfrm.setExtY(H);
graphic_frame.setNvSpPr(new AscFormat.UniNvPr());
graphic_frame.setGraphicObject(element.Copy(graphic_frame));
graphic_frame.graphicObject.Set_TableStyle(defaultTableStyleId);
drawingCopyObject = new DrawingCopyObject();
drawingCopyObject.Drawing = graphic_frame;
pDrawings.push(drawingCopyObject);
} else if (type_BlockLevelSdt === element.GetType())//TOC
{
parseContent(element.Content.Content);
}
}
};
var elements = [], selectedElement, element, drawings = [], pDrawings = [], drawingCopyObject;
var defaultTableStyleId = presentation.DefaultTableStyleId;
parseContent(aContent.content);
var onlyImages = false;
if (drawings && drawings.length) {
//если массив содержит только изображения
if (elements && 1 === elements.length && elements[0].Element && type_Paragraph === elements[0].Element.Get_Type()) {
if (true === this._isParagraphContainsOnlyDrawing(elements[0].Element)) {
elements = [];
onlyImages = true;
}
}
for (var j = 0; j < drawings.length; j++) {
drawingCopyObject = new DrawingCopyObject();
drawingCopyObject.Drawing = drawings[j].GraphicObj;
pDrawings.push(drawingCopyObject);
}
}
presentationSelectedContent.DocContent.Elements = elements;
presentationSelectedContent.Drawings = pDrawings;
//вставка
var paste_callback = function () {
if (false === oThis.bNested) {
//для таблиц необходимо рассчитать их размер, чтобы разместить в центре
var slide = presentation.Slides[0];
for (var i = 0; i < presentationSelectedContent.Drawings.length; i++) {
if (presentationSelectedContent.Drawings[i].Drawing instanceof AscFormat.CGraphicFrame) {
var drawing = presentationSelectedContent.Drawings[i].Drawing;
var oldParent = drawing.parent;
var bDeleted = drawing.bDeleted;
drawing.parent = slide;
drawing.bDeleted = false;
drawing.recalculate();
drawing.parent = oldParent;
drawing.bDeleted = bDeleted;
drawing.spPr.xfrm.setOffX(oThis.oDocument.GetWidthMM() / 2 - drawing.extX / 2);
drawing.spPr.xfrm.setOffY(oThis.oDocument.GetHeightMM() / 2 - drawing.extY / 2);
}
}
const oPaste = presentation.InsertContent(presentationSelectedContent)
presentation.FinalizeAction();
presentation.UpdateInterface();
if (oPaste.insert) {
if (oPaste.specialPasteProps) {
const props = [].concat(oPaste.specialPasteProps[Asc.c_oSpecialPasteProps.destinationFormatting]);
oThis._setSpecialPasteShowOptionsPresentation(props);
} else if (!onlyImages) {
let props = [Asc.c_oSpecialPasteProps.destinationFormatting, Asc.c_oSpecialPasteProps.keepTextOnly];
oThis._setSpecialPasteShowOptionsPresentation(props);
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(oPaste.insert);
}
};
var font_map = {};
var images = [];
//shape.getAllFonts(font_map);
//перебираем шрифты
var fonts = [];
for (var i in font_map)
fonts.push(new CFont(i));
var oObjectsForDownload = GetObjectsForImageDownload(aContent.aPastedImages);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
var oImageMap = {};
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
//ковертим изображения в презентационный формат
for (var i = 0; i < presentationSelectedContent.Drawings.length; i++) {
if (!(presentationSelectedContent.Drawings[i].Drawing instanceof AscFormat.CGraphicFrame)) {
AscFormat.ExecuteNoHistory(function () {
if (presentationSelectedContent.Drawings[i].Drawing.setBDeleted2) {
presentationSelectedContent.Drawings[i].Drawing.setBDeleted2(true);
} else {
presentationSelectedContent.Drawings[i].Drawing.setBDeleted(true);
}
}, this, []);
presentationSelectedContent.Drawings[i].Drawing = presentationSelectedContent.Drawings[i].Drawing.convertToPPTX(oThis.oDocument.DrawingDocument, undefined, true);
AscFormat.checkBlipFillRasterImages(presentationSelectedContent.Drawings[i].Drawing);
}
}
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, aContent.aPastedImages);
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
//ковертим изображения в презентационный формат
for (var i = 0; i < presentationSelectedContent.Drawings.length; i++) {
if (!(presentationSelectedContent.Drawings[i].Drawing instanceof AscFormat.CGraphicFrame)) {
presentationSelectedContent.Drawings[i].Drawing = presentationSelectedContent.Drawings[i].Drawing.convertToPPTX(oThis.oDocument.DrawingDocument, undefined, true);
AscFormat.checkBlipFillRasterImages(presentationSelectedContent.Drawings[i].Drawing);
}
}
oThis.api.pre_Paste(aContent.fonts, aContent.images, paste_callback);
}
},
//from PRESENTATION to WORD
_pasteBinaryFromPresentationToWord: function (base64) {
var oThis = this;
var fPrepasteCallback = function () {
if (false === oThis.bNested) {
oThis.InsertInDocument();
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
}
};
var oSelectedContent2 = this._readPresentationSelectedContent2(base64);
var selectedContent2 = oSelectedContent2.content;
var defaultSelectedContent = selectedContent2[0] ? selectedContent2[0] : selectedContent2[1];
var bSlideObjects = defaultSelectedContent && defaultSelectedContent.content && defaultSelectedContent.content.SlideObjects && defaultSelectedContent.content.SlideObjects.length > 0;
var pasteObj = bSlideObjects && PasteElementsId.g_bIsDocumentCopyPaste ? selectedContent2[2] : defaultSelectedContent;
var arr_Images, fonts, content = null, font_map = {};
if (pasteObj) {
arr_Images = pasteObj.images;
fonts = pasteObj.fonts;
content = pasteObj.content;
}
if (null === content) {
return null;
}
if (content && content.DocContent) {
let aElements = content.DocContent.Elements;
let aContent = [];
let bNeedDocElement = !this.oDocument.bPresentation;
let oNewParent = this.oDocument;
for (let nElement = 0; nElement < aElements.length; nElement++) {
let oContentElement = aElements[nElement].Element;
if(bNeedDocElement) {
aContent.push(AscFormat.ConvertParagraphToWord(oContentElement, oNewParent));
} else {
aContent.push(oContentElement.Copy(oNewParent, oNewParent.DrawingDocument));
}
}
this.aContent = aContent;
oThis.api.pre_Paste(fonts, arr_Images, fPrepasteCallback);
} else if (content && content.Drawings) {
var arr_shapes = content.Drawings;
var arrImages = pasteObj.images;
if (!bSlideObjects && content.Drawings.length === selectedContent2[1].content.Drawings.length) {
AscFormat.checkDrawingsTransformBeforePaste(content, selectedContent2[1].content, null);
}
//****если записана одна табличка, то вставляем html и поддерживаем все цвета и стили****
if (!arrImages.length && arr_shapes.length === 1 && arr_shapes[0] && arr_shapes[0].Drawing &&
arr_shapes[0].Drawing.graphicObject) {
var drawing = arr_shapes[0].Drawing;
if (typeof CGraphicFrame !== "undefined" && drawing instanceof CGraphicFrame) {
var aContent = [];
var table = AscFormat.ConvertGraphicFrameToWordTable(drawing, this.oLogicDocument);
table.Document_Get_AllFontNames(font_map);
//перебираем шрифты
for (var i in font_map) {
fonts.push(new CFont(i));
}
//TODO стиль не прокидывается. в будущем нужно реализовать
table.TableStyle = null;
aContent.push(table);
this.aContent = aContent;
oThis.api.pre_Paste(fonts, aContent.images, fPrepasteCallback);
return;
}
}
//если несколько графических объектов, то собираем base64 у таблиц(graphicFrame)
if (arr_shapes.length > 1) {
for (var i = 0; i < arr_shapes.length; i++) {
if (arr_shapes[i].Drawing && arr_shapes[i].Drawing.isTable()) {
arrImages.push(new AscCommon.CBuilderImages(null, arr_shapes[i].base64, arr_shapes[i], null, null));
}
}
}
var oObjectsForDownload = GetObjectsForImageDownload(arrImages);
var aImagesToDownload = oObjectsForDownload.aUrls;
AscCommon.sendImgUrls(oThis.api, aImagesToDownload, function (data) {
var image_map = {};
for (var i = 0, length = Math.min(data.length, arrImages.length); i < length; ++i) {
var elem = data[i];
if (null != elem.url) {
var name = g_oDocumentUrls.imagePath2Local(elem.path);
var imageElem = oObjectsForDownload.aBuilderImagesByUrl[i];
if (null != imageElem) {
if (Array.isArray(imageElem)) {
for (var j = 0; j < imageElem.length; ++j) {
var curImageElem = imageElem[j];
if (null != curImageElem) {
if (curImageElem.ImageShape && curImageElem.ImageShape.base64) {
curImageElem.ImageShape.base64 = name;
} else {
curImageElem.SetUrl(name);
}
}
}
} else {
//для вставки graphicFrame в виде картинки(если было при копировании выделено несколько графических объектов)
if (imageElem.ImageShape && imageElem.ImageShape.base64) {
imageElem.ImageShape.base64 = name;
} else {
imageElem.SetUrl(name);
}
}
}
image_map[i] = name;
} else {
image_map[i] = aImagesToDownload[i];
}
}
aContent = oThis._convertExcelBinary(null, arr_shapes);
oThis.aContent = aContent.content;
oThis.api.pre_Paste(fonts, image_map, fPrepasteCallback);
}, true);
}
},
//from WORD to PDF
_pasteBinaryFromWordToPDF: function (base64FromWord) {
let oThis = this;
let oDoc = Asc.editor.getPDFDoc();
let nPageW = oDoc.GetPageWidthMM(oDoc.GetCurPage());
let nPageH = oDoc.GetPageHeight(oDoc.GetCurPage());
let trueDocument = this.oDocument;
let tempCDocument = function () {
return new CDocument(oThis.oDocument.DrawingDocument, false);
};
//создаём темповый CDocument
this.oDocument = AscFormat.ExecuteNoHistory(tempCDocument, this, []);
AscCommon.g_oIdCounter.m_bRead = true;
let aContent = AscFormat.ExecuteNoHistory(this.ReadFromBinary, this, [base64FromWord, this.oDocument]);
AscCommon.g_oIdCounter.m_bRead = false;
if (null === aContent) {
return null;
}
//возврщаем обратно переменные и историю, документ которой заменяется при создании CDocument
this.oDocument = trueDocument;
History.Document = trueDocument;
let oPDFSelContent = new AscPDF.PDFSelectedContent();
oPDFSelContent.DocContent = new AscCommonWord.CSelectedContent();
let parseContent = function (content) {
AscFormat.ExecuteNoHistory(function() {
for (let i = 0; i < content.length; ++i) {
selectedElement = new AscCommonWord.CSelectedElement();
element = content[i];
//drawings
element.GetAllDrawingObjects(drawings);
if (type_Paragraph === element.GetType())//paragraph
{
selectedElement.Element = AscFormat.ConvertParagraphToPPTX(element, null, null, true, false);
elements.push(selectedElement);
} else if (type_Table === element.GetType())//table
{
element = oThis._convertTableToPPTX(element, true);
let W = nPageW * 2 / 3;
let Rows = element.GetRowsCount();
let H = Rows * 7.478268771701388;
let graphic_frame = new AscPDF.CPdfGraphicFrame();
graphic_frame.setSpPr(new AscFormat.CSpPr());
graphic_frame.spPr.setParent(graphic_frame);
graphic_frame.spPr.setXfrm(new AscFormat.CXfrm());
graphic_frame.spPr.xfrm.setParent(graphic_frame.spPr);
graphic_frame.spPr.xfrm.setOffX(nPageW / 2 - W / 2);
graphic_frame.spPr.xfrm.setOffY(nPageH / 2 - H / 2);
graphic_frame.spPr.xfrm.setExtX(W);
graphic_frame.spPr.xfrm.setExtY(H);
graphic_frame.setNvSpPr(new AscFormat.UniNvPr());
graphic_frame.setGraphicObject(element.Copy(graphic_frame));
graphic_frame.graphicObject.Set_TableStyle(defaultTableStyleId);
drawingCopyObject = new AscPDF.DrawingCopyObject();
drawingCopyObject.Drawing = graphic_frame;
pDrawings.push(drawingCopyObject);
} else if (type_BlockLevelSdt === element.GetType())//TOC
{
parseContent(element.Content.Content);
}
}
});
};
var elements = [], selectedElement, element, drawings = [], pDrawings = [], drawingCopyObject;
var defaultTableStyleId = oDoc.DefaultTableStyleId;
parseContent(aContent.content);
var onlyImages = false;
if (drawings && drawings.length) {
//если массив содержит только изображения
if (elements && 1 === elements.length && elements[0].Element && type_Paragraph === elements[0].Element.Get_Type()) {
if (true === this._isParagraphContainsOnlyDrawing(elements[0].Element)) {
elements = [];
onlyImages = true;
}
}
for (var j = 0; j < drawings.length; j++) {
drawingCopyObject = new AscPDF.DrawingCopyObject();
drawingCopyObject.Drawing = drawings[j].GraphicObj;
pDrawings.push(drawingCopyObject);
}
}
oPDFSelContent.DocContent.Elements = elements;
oPDFSelContent.Drawings = pDrawings;
//вставка
let paste_callback = function () {
if (false === oThis.bNested) {
//для таблиц необходимо рассчитать их размер, чтобы разместить в центре
for (let i = 0; i < oPDFSelContent.Drawings.length; i++) {
if (oPDFSelContent.Drawings[i].Drawing instanceof AscFormat.CGraphicFrame) {
let drawing = oPDFSelContent.Drawings[i].Drawing;
let oldParent = drawing.parent;
drawing.bDeleted = false;
drawing.recalculate();
drawing.parent = oldParent;
}
}
let bInsert = oDoc.InsertContent2([oPDFSelContent], 0);
if (bInsert) {
if (!onlyImages) {
let props = [Asc.c_oSpecialPasteProps.destinationFormatting, Asc.c_oSpecialPasteProps.keepTextOnly];
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(bInsert);
}
};
var font_map = {};
var images = [];
//shape.getAllFonts(font_map);
//перебираем шрифты
var fonts = [];
for (var i in font_map)
fonts.push(new CFont(i));
function correctDrawingsForPdf(drawings, document) {
AscFormat.ExecuteNoHistory(function () {
for (var i = 0; i < drawings.length; i++) {
let drawing = drawings[i].Drawing;
if (drawing.convertToPdf) {
drawings[i].Drawing = drawing.convertToPdf(document, undefined, true);
AscFormat.checkBlipFillRasterImages(drawings[i].Drawing);
}
if (!drawings[i].Drawing.IsPdfDrawing) {
drawings.splice(i, 1);
i--;
}
}
}, this, []);
}
var oObjectsForDownload = GetObjectsForImageDownload(aContent.aPastedImages);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
var oImageMap = {};
AscCommon.ExecuteNoHistory(function() {
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
});
correctDrawingsForPdf(oPDFSelContent.Drawings, oThis.oDocument.DrawingDocument);
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, aContent.aPastedImages);
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
correctDrawingsForPdf(oPDFSelContent.Drawings, oThis.oDocument.DrawingDocument);
oThis.api.pre_Paste(aContent.fonts, aContent.images, paste_callback);
}
},
// from PDF to PDF
_pasteBinaryFromPDFToPDF: function (base64, bDuplicate) {
let oThis = this;
let oDoc = Asc.editor.getPDFDoc();
let oSelectedContent2 = AscCommon.ExecuteNoHistory(this._readPDFSelectedContent2, null, this, [base64, bDuplicate]);
let p_url = oSelectedContent2.p_url;
let selectedContent2 = oSelectedContent2.content;
let multipleParamsCount = selectedContent2 ? selectedContent2.length : 0;
if (multipleParamsCount) {
let aContents = [];
for (let i = 0; i < multipleParamsCount; i++) {
let curContent = selectedContent2[i];
aContents.push(curContent.content);
}
let specialOptionsArr = [];
let specialProps = Asc.c_oSpecialPasteProps;
if (1 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting];
} else if (2 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting];
} else if (3 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting, specialProps.picture];
}
let pasteObj = selectedContent2[0];
let nIndex = 0;
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
let props = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
switch (props) {
case Asc.c_oSpecialPasteProps.destinationFormatting: {
break;
}
case Asc.c_oSpecialPasteProps.sourceformatting: {
if (selectedContent2[1]) {
pasteObj = selectedContent2[1];
nIndex = 1;
}
break;
}
case Asc.c_oSpecialPasteProps.picture: {
if (selectedContent2[2]) {
pasteObj = selectedContent2[2];
nIndex = 2;
}
break;
}
case Asc.c_oSpecialPasteProps.keepTextOnly: {
//в идеале у этом случае нужно использовать данные plain text из буфера обмена
//pasteObj = selectedContent2[2];
break;
}
}
}
let arr_Images = pasteObj.images;
let fonts = pasteObj.fonts;
let oPDFSelContent = pasteObj.content;
if (null === oPDFSelContent) {
return null;
}
let paste_callback = function () {
if (false === oThis.bNested) {
let bPaste = oDoc.InsertContent2(aContents, nIndex);
if (specialOptionsArr.length >= 1 && bPaste) {
if (oPDFSelContent && oPDFSelContent.DocContent) {
specialOptionsArr.push(Asc.c_oSpecialPasteProps.keepTextOnly);
}
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(bPaste);
}
};
let oObjectsForDownload = GetObjectsForImageDownload(arr_Images, p_url === this.api.documentId);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
let oImageMap = {};
AscCommon.ExecuteNoHistory(function() {
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
});
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, arr_Images);
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
let oImageMap = {};
for(let nImg = 0; nImg < arr_Images.length; ++nImg) {
oImageMap[nImg] = arr_Images[nImg].Url
}
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}
} else {
return null;
}
},
//from PDF to WORD
_pasteBinaryFromPDFToWord: function (base64) {
var oThis = this;
var fPrepasteCallback = function () {
if (false === oThis.bNested) {
oThis.InsertInDocument();
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
}
};
var oSelectedContent2 = this._readPDFSelectedContent2(base64);
var selectedContent2 = oSelectedContent2.content;
var pasteObj = selectedContent2[0] ? selectedContent2[0] : selectedContent2[1];
var arr_Images, fonts, content = null, font_map = {};
if (pasteObj) {
arr_Images = pasteObj.images;
fonts = pasteObj.fonts;
content = pasteObj.content;
}
// if page copy -> skip
if (null === content || content.MergePagesInfo.binaryData) {
return null;
}
if (content && content.DocContent) {
let aElements = content.DocContent.Elements;
let aContent = [];
let bNeedDocElement = !this.oDocument.bPresentation;
let oNewParent = this.oDocument;
for (let nElement = 0; nElement < aElements.length; nElement++) {
let oContentElement = aElements[nElement].Element;
if(bNeedDocElement) {
aContent.push(AscFormat.ConvertParagraphToWord(oContentElement, oNewParent));
} else {
aContent.push(oContentElement.Copy(oNewParent, oNewParent.DrawingDocument));
}
}
this.aContent = aContent;
oThis.api.pre_Paste(fonts, arr_Images, fPrepasteCallback);
} else if (content && content.Drawings.length > 0) {
var arr_shapes = content.Drawings;
var arrImages = pasteObj.images;
//****если записана одна табличка, то вставляем html и поддерживаем все цвета и стили****
if (!arrImages.length && arr_shapes.length === 1 && arr_shapes[0] && arr_shapes[0].Drawing &&
arr_shapes[0].Drawing.graphicObject) {
var drawing = arr_shapes[0].Drawing;
if (typeof CGraphicFrame !== "undefined" && drawing instanceof CGraphicFrame) {
var aContent = [];
var table = AscFormat.ConvertGraphicFrameToWordTable(drawing, this.oLogicDocument);
table.Document_Get_AllFontNames(font_map);
//перебираем шрифты
for (var i in font_map) {
fonts.push(new CFont(i));
}
//TODO стиль не прокидывается. в будущем нужно реализовать
table.TableStyle = null;
aContent.push(table);
this.aContent = aContent;
oThis.api.pre_Paste(fonts, aContent.images, fPrepasteCallback);
return;
}
}
//если несколько графических объектов, то собираем base64 у таблиц(graphicFrame)
if (arr_shapes.length > 1) {
for (var i = 0; i < arr_shapes.length; i++) {
if (arr_shapes[i].Drawing && arr_shapes[i].Drawing.isTable()) {
arrImages.push(new AscCommon.CBuilderImages(null, arr_shapes[i].base64, arr_shapes[i], null, null));
}
}
}
var oObjectsForDownload = GetObjectsForImageDownload(arrImages);
var aImagesToDownload = oObjectsForDownload.aUrls;
AscCommon.sendImgUrls(oThis.api, aImagesToDownload, function (data) {
var image_map = {};
for (var i = 0, length = Math.min(data.length, arrImages.length); i < length; ++i) {
var elem = data[i];
if (null != elem.url) {
var name = g_oDocumentUrls.imagePath2Local(elem.path);
var imageElem = oObjectsForDownload.aBuilderImagesByUrl[i];
if (null != imageElem) {
if (Array.isArray(imageElem)) {
for (var j = 0; j < imageElem.length; ++j) {
var curImageElem = imageElem[j];
if (null != curImageElem) {
if (curImageElem.ImageShape && curImageElem.ImageShape.base64) {
curImageElem.ImageShape.base64 = name;
} else {
curImageElem.SetUrl(name);
}
}
}
} else {
//для вставки graphicFrame в виде картинки(если было при копировании выделено несколько графических объектов)
if (imageElem.ImageShape && imageElem.ImageShape.base64) {
imageElem.ImageShape.base64 = name;
} else {
imageElem.SetUrl(name);
}
}
}
image_map[i] = name;
} else {
image_map[i] = aImagesToDownload[i];
}
}
aContent = oThis._convertExcelBinary(null, arr_shapes);
oThis.aContent = aContent.content;
oThis.api.pre_Paste(fonts, image_map, fPrepasteCallback);
}, true);
}
else {
window['AscCommon'].g_specialPasteHelper.Paste_Process_End(true);
}
},
//from PDF to PRESENTATION
_pasteBinaryFromPDFToPresentation: function (base64, bDuplicate) {
var oThis = this;
var presentation = editor.WordControl.m_oLogicDocument;
var oSelectedContent2 = this._readPDFSelectedContent2(base64, bDuplicate);
var p_url = oSelectedContent2.p_url;
var p_theme = oSelectedContent2.p_theme;
var selectedContent2 = oSelectedContent2.content;
var multipleParamsCount = selectedContent2 ? selectedContent2.length : 0;
for (let i = 0; i < selectedContent2.length; i++) {
let oPdfContent = selectedContent2[i].content;
selectedContent2[i].content = oPdfContent ? new PresentationSelectedContent(): null;
if (oPdfContent) {
selectedContent2[i].content.Drawings = oPdfContent.Drawings || [];
selectedContent2[i].content.DocContent = oPdfContent.DocContent;
}
}
if (multipleParamsCount) {
var aContents = [];
for (var i = 0; i < multipleParamsCount; i++) {
var curContent = selectedContent2[i];
aContents.push(curContent.content);
}
var specialOptionsArr = [];
var specialProps = Asc.c_oSpecialPasteProps;
if (1 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting];
} else if (2 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting];
} else if (3 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting, specialProps.picture];
}
var pasteObj = selectedContent2[0];
var nIndex = 0;
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
switch (props) {
case Asc.c_oSpecialPasteProps.destinationFormatting: {
break;
}
case Asc.c_oSpecialPasteProps.sourceformatting: {
if (selectedContent2[1]) {
pasteObj = selectedContent2[1];
nIndex = 1;
}
break;
}
case Asc.c_oSpecialPasteProps.picture: {
if (selectedContent2[2]) {
pasteObj = selectedContent2[2];
nIndex = 2;
}
break;
}
case Asc.c_oSpecialPasteProps.keepTextOnly: {
//в идеале у этом случае нужно использовать данные plain text из буфера обмена
//pasteObj = selectedContent2[2];
break;
}
}
}
var arr_Images = pasteObj.images;
var fonts = pasteObj.fonts;
var presentationSelectedContent = pasteObj.content;
if (null === presentationSelectedContent) {
return null;
}
if (presentationSelectedContent.Drawings && presentationSelectedContent.Drawings.length > 0) {
var controller = this.oDocument.GetCurrentController();
var curTheme = controller ? controller.getTheme() : null;
if (curTheme && curTheme.name === p_theme) {
specialOptionsArr.splice(1, 1);
}
}
var paste_callback = function () {
if (false === oThis.bNested) {
let res = presentation.InsertContent2(aContents, nIndex);
presentation.FinalizeAction();
presentation.UpdateInterface();
if (specialOptionsArr.length >= 1 && res.insert) {
if (presentationSelectedContent && presentationSelectedContent.DocContent) {
specialOptionsArr.push(Asc.c_oSpecialPasteProps.keepTextOnly);
}
oThis._setSpecialPasteShowOptionsPresentation(specialOptionsArr);
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(res);
}
};
var oObjectsForDownload = GetObjectsForImageDownload(arr_Images, p_url === this.api.documentId);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
let oImageMap = {};
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, arr_Images);
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
let oImageMap = {};
for(let nImg = 0; nImg < arr_Images.length; ++nImg) {
oImageMap[nImg] = arr_Images[nImg].Url
}
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}
} else {
return null;
}
},
//from PRESENTATION to PDF
_pasteBinaryFromPresentationToPDF: function (base64, bDuplicate) {
let oThis = this;
let oDoc = Asc.editor.getPDFDoc();
let nPageW = oDoc.GetPageWidthMM(oDoc.GetCurPage());
let nPageH = oDoc.GetPageHeight(oDoc.GetCurPage());
let oSelectedContent2 = this._readPresentationSelectedContent2(base64, bDuplicate);
let p_url = oSelectedContent2.p_url;
let selectedContent2 = oSelectedContent2.content;
let multipleParamsCount = selectedContent2 ? selectedContent2.length : 0;
let aContents = [];
if (multipleParamsCount) {
for (let i = 0; i < multipleParamsCount; i++) {
let curContent = selectedContent2[i];
aContents.push(curContent.content);
}
let specialOptionsArr = [];
let specialProps = Asc.c_oSpecialPasteProps;
if (1 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting];
} else if (2 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting];
} else if (3 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting, specialProps.picture];
}
let bSlideObjects = selectedContent2[0] && selectedContent2[0].content && selectedContent2[0].content.SlideObjects && selectedContent2[0].content.SlideObjects.length > 0;
let pasteObj = bSlideObjects ? selectedContent2[2] : selectedContent2[0];
let nIndex = bSlideObjects ? 2 : 0;
let arr_Images = pasteObj.images;
let fonts = pasteObj.fonts;
let presentationSelectedContent = pasteObj.content;
if (null === presentationSelectedContent) {
return null;
}
if (!presentationSelectedContent.Drawings) {
presentationSelectedContent.Drawings = [];
}
let paste_callback = function () {
if (false === oThis.bNested) {
for (let i = 0; i < aContents.length; i++) {
let oPDFSelContent = new AscPDF.PDFSelectedContent();
oPDFSelContent.Drawings = aContents[i].Drawings;
oPDFSelContent.DocContent = aContents[i].DocContent;
aContents[i] = oPDFSelContent;
}
let bPaste = oDoc.InsertContent2(aContents, nIndex);
if (specialOptionsArr.length >= 1 && bPaste) {
if (presentationSelectedContent && presentationSelectedContent.DocContent) {
specialOptionsArr.push(Asc.c_oSpecialPasteProps.keepTextOnly);
}
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(bPaste);
}
};
AscCommon.ExecuteNoHistory(function() {
for (var i = 0; i < presentationSelectedContent.Drawings.length; i++) {
AscFormat.checkBlipFillRasterImages(presentationSelectedContent.Drawings[i].Drawing);
if (presentationSelectedContent.Drawings[i].Drawing.IsPdfDrawing && presentationSelectedContent.Drawings[i].Drawing.IsGraphicFrame()) {
let oGrFrame = presentationSelectedContent.Drawings[i].Drawing;
oGrFrame.applyDrawingSize({Width: nPageW * 2 / 3});
oGrFrame.graphicObject.Set_TableW(tblwidth_Mm, nPageW * 2 / 3);
}
if (!presentationSelectedContent.Drawings[i].Drawing.IsPdfDrawing) {
presentationSelectedContent.Drawings.splice(i, 1);
i--;
}
}
});
let oObjectsForDownload = GetObjectsForImageDownload(arr_Images, p_url === this.api.documentId);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
let oImageMap = {};
AscCommon.ExecuteNoHistory(function() {
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, arr_Images);
});
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
let oImageMap = {};
for(let nImg = 0; nImg < arr_Images.length; ++nImg) {
oImageMap[nImg] = arr_Images[nImg].Url
}
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}
} else {
return null;
}
},
_readPDFSelectedContent2: function (base64, bDuplicate) {
pptx_content_loader.Clear();
let _stream = AscFormat.CreateBinaryReader(base64, 0, base64.length);
let stream = new AscCommon.FileStream(_stream.data, _stream.size);
let p_url = stream.GetString2();
let bIsMultipleContent = stream.GetBool();
let selectedContent2 = [];
if (true === bIsMultipleContent) {
let multipleParamsCount = stream.GetULong();
for (let i = 0; i < multipleParamsCount; i++) {
selectedContent2.push(this._readPDFSelectedContent(stream, bDuplicate));
}
}
return {content: selectedContent2, p_url: p_url};
},
_readPDFSelectedContent: function (stream, bDuplicate) {
let oPDFSelContent = null;
let fonts = [];
let arr_Images = [];
let oThis = this;
let oFontMap = {};
let readContent = function () {
let docContent = oThis.ReadPresentationText(stream);
if (docContent.length === 0) {
return;
}
oPDFSelContent.DocContent = new AscCommonWord.CSelectedContent();
oPDFSelContent.DocContent.Elements = docContent;
//перебираем шрифты
for (let i in oThis.oFonts) {
oFontMap[i] = 1;
}
bIsEmptyContent = false;
};
let readDrawings = function () {
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOff();
}
// шейпы из презентаций, поэтому чтение то же самое
let objects = oThis.ReadPresentationShapes(stream);
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOn();
}
oPDFSelContent.Drawings = objects.arrShapes;
let arr_shapes = objects.arrShapes;
for (let i = 0; i < arr_shapes.length; ++i) {
if (arr_shapes[i].Drawing.getAllFonts) {
arr_shapes[i].Drawing.getAllFonts(oFontMap);
}
}
arr_Images = arr_Images.concat(objects.arrImages);
};
let readAnnots = function () {
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOff();
}
let objects = oThis.ReadPDFAnnots(stream);
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOn();
}
oPDFSelContent.Annots = objects.arrAnnots;
for (let i = 0; i < objects.arrAnnots.length; ++i) {
if (objects.arrAnnots[i].Annot.getAllFonts) {
objects.arrAnnots[i].Annot.getAllFonts(oFontMap);
}
}
};
let readFields = function () {
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOff();
}
let objects = oThis.ReadPDFFields(stream);
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOn();
}
oPDFSelContent.Fields = objects.arrFields;
};
let readPageDrawings = function () {
stream.GetString2(); // drawings
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOff();
}
// шейпы из презентаций, поэтому чтение то же самое
let objects = oThis.ReadPresentationShapes(stream);
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOn();
}
oPDFSelContent.MergePagesInfo.pagesDrawings.push(objects.arrShapes);
let arr_shapes = objects.arrShapes;
for (let i = 0; i < arr_shapes.length; ++i) {
if (arr_shapes[i].Drawing.getAllFonts) {
arr_shapes[i].Drawing.getAllFonts(oFontMap);
}
}
arr_Images = arr_Images.concat(objects.arrImages);
};
let readPages = function () {
// skip for slide editor
if (!oPDFSelContent.MergePagesInfo) {
return;
}
let nBinaryLength = stream.GetULong();
let nCurPos = stream.GetCurPos();
let aUint8Array = stream.data.subarray(nCurPos, nCurPos + nBinaryLength);
oPDFSelContent.MergePagesInfo.binaryData = aUint8Array;
stream.Seek2(nCurPos + nBinaryLength);
let nPagesCount = stream.GetULong();
for (let i = 0; i < nPagesCount; i++) {
readPageDrawings();
}
};
var bIsEmptyContent = true;
var first_content = stream.GetString2();
if (first_content === "SelectedContent") {
var countContent = stream.GetULong();
for (var i = 0; i < countContent; i++) {
if (null === oPDFSelContent) {
oPDFSelContent = window["AscPDF"] && window["AscPDF"].PDFSelectedContent ? new window["AscPDF"].PDFSelectedContent() : {};
}
var first_string = stream.GetString2();
if ("DocContent" !== first_string) {
bIsEmptyContent = false;
}
switch (first_string) {
case "Pages": {
readPages();
break;
}
case "DocContent": {
readContent();
break;
}
case "Drawings": {
readDrawings();
break;
}
case "Annots": {
readAnnots();
break;
}
case "Fields": {
readFields();
break;
}
}
}
}
if (bIsEmptyContent) {
oPDFSelContent = null;
}
for (var key in oFontMap) {
fonts.push(new CFont(key));
}
return {content: oPDFSelContent, fonts: fonts, images: arr_Images};
},
ReadPDFAnnots: function (stream) {
let nCountAnnots = stream.GetULong();
let oDoc = Asc.editor.getPDFDoc && Asc.editor.getPDFDoc();
if (!oDoc) {
return {arrAnnots: []};
}
let oNativeFile = Asc.editor.getDocumentRenderer().file.nativeFile;
let oAnnotsInfo = oNativeFile["readAnnotationsInfoFromBinary"](stream.data.slice(stream.cur));
let oAnnotsMap = {};
let aAnnots = [];
for (let i = 0; i < oAnnotsInfo["annots"].length; i++) {
let oAnnotInfo = oAnnotsInfo["annots"][i];
if (oAnnotInfo["RefTo"] == null || oAnnotInfo["type"] != AscPDF.ANNOTATIONS_TYPES.Text) {
let oAnnot = AscPDF.ReadAnnotFromJSON(oAnnotInfo, oDoc);
if (oAnnotInfo["RefTo"] == null)
oAnnotsMap[oAnnotInfo["AP"]["i"]] = oAnnot;
aAnnots.push(new AscPDF.AnnotCopyObject(oAnnot));
}
else {
if (oAnnotInfo["StateModel"] != AscPDF.TEXT_ANNOT_STATE_MODEL.Review && oAnnotsMap[oAnnotInfo["RefTo"]])
AscPDF.ReadAnnotReplyJSON(oAnnotsMap[oAnnotInfo["RefTo"]], oAnnotInfo);
}
}
return {arrAnnots: aAnnots};
},
ReadPDFFields: function (stream) {
let nCountFields = stream.GetULong();
let oDoc = Asc.editor.getPDFDoc && Asc.editor.getPDFDoc();
if (!oDoc) {
return {arrFields: []};
}
let oViewer = Asc.editor.getDocumentRenderer();
let oNativeFile = oViewer.file.nativeFile;
let oFieldsInfo = oNativeFile["readAnnotationsInfoFromBinary"](stream.data.slice(stream.cur));
oViewer.IsOpenFormsInProgress = true;
let aFields = [];
for (let i = 0; i < oFieldsInfo["annots"].length; i++) {
let oFieldInfo = oFieldsInfo["annots"][i];
let oField = AscPDF.ReadFieldFromJSON(oFieldInfo, oDoc, true);
if (AscPDF.FIELD_TYPES.button == oField.GetType()) {
oField.SetImageRasterId(oFieldsInfo['imgs'][oFieldInfo['I']], AscPDF.APPEARANCE_TYPES.normal);
oField.SetImageRasterId(oFieldsInfo['imgs'][oFieldInfo['RI']], AscPDF.APPEARANCE_TYPES.rollover);
oField.SetImageRasterId(oFieldsInfo['imgs'][oFieldInfo['IX']], AscPDF.APPEARANCE_TYPES.mouseDown);
}
aFields.push(new AscPDF.FieldCopyObject(oField));
}
Asc.editor.ImageLoader._LoadImages(oFieldsInfo['imgs']);
oViewer.IsOpenFormsInProgress = false;
return {arrFields: aFields};
},
//from PRESENTATION to PRESENTATION
_pasteBinaryFromPresentationToPresentation: function (base64, bDuplicate) {
var oThis = this;
var presentation = editor.WordControl.m_oLogicDocument;
var oSelectedContent2 = this._readPresentationSelectedContent2(base64, bDuplicate);
var p_url = oSelectedContent2.p_url;
var p_theme = oSelectedContent2.p_theme;
var selectedContent2 = oSelectedContent2.content;
var multipleParamsCount = selectedContent2 ? selectedContent2.length : 0;
if (multipleParamsCount) {
var aContents = [];
for (var i = 0; i < multipleParamsCount; i++) {
var curContent = selectedContent2[i];
aContents.push(curContent.content);
}
var pasteObj = selectedContent2[0];
var nIndex = 0;
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
switch (props) {
case Asc.c_oSpecialPasteProps.destinationFormattingLink:
case Asc.c_oSpecialPasteProps.destinationFormattingEmbedding:
case Asc.c_oSpecialPasteProps.destinationFormatting: {
break;
}
case Asc.c_oSpecialPasteProps.sourceFormattingLink:
case Asc.c_oSpecialPasteProps.sourceFormattingEmbedding:
case Asc.c_oSpecialPasteProps.sourceformatting: {
if (selectedContent2[1]) {
pasteObj = selectedContent2[1];
nIndex = 1;
}
break;
}
case Asc.c_oSpecialPasteProps.picture: {
if (selectedContent2[2]) {
pasteObj = selectedContent2[2];
nIndex = 2;
}
break;
}
case Asc.c_oSpecialPasteProps.keepTextOnly: {
//в идеале у этом случае нужно использовать данные plain text из буфера обмена
//pasteObj = selectedContent2[2];
break;
}
}
}
var arr_Images = pasteObj.images;
var fonts = pasteObj.fonts;
var presentationSelectedContent = pasteObj.content;
if (null === presentationSelectedContent) {
return null;
}
var paste_callback = function () {
if (false === oThis.bNested) {
var oPaste = presentation.InsertContent2(aContents, nIndex);
var specialOptionsArr = [];
var specialProps = Asc.c_oSpecialPasteProps;
let nSliceCount = 1;
if (oPaste.specialPasteProps) {
nSliceCount = oPaste.specialPasteProps[specialProps.destinationFormatting].length;
if (multipleParamsCount === 1) {
specialOptionsArr = oPaste.specialPasteProps[specialProps.destinationFormatting];
} else if (multipleParamsCount === 2) {
specialOptionsArr = oPaste.specialPasteProps[specialProps.destinationFormatting].concat(
oPaste.specialPasteProps[specialProps.sourceformatting]
);
} else if (multipleParamsCount === 3) {
specialOptionsArr = oPaste.specialPasteProps[specialProps.destinationFormatting].concat(
oPaste.specialPasteProps[specialProps.sourceformatting],
oPaste.specialPasteProps[specialProps.picture]
);
}
} else {
if (1 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting];
} else if (2 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting];
} else if (3 === multipleParamsCount) {
specialOptionsArr = [specialProps.destinationFormatting, specialProps.sourceformatting, specialProps.picture];
}
}
if (presentationSelectedContent.Drawings && presentationSelectedContent.Drawings.length > 0) {
var controller = oThis.oDocument.GetCurrentController();
var curTheme = controller ? controller.getTheme() : null;
if (curTheme && curTheme.name === p_theme) {
specialOptionsArr.splice(1, nSliceCount);
}
}
presentation.FinalizeAction();
presentation.UpdateInterface();
//пока не показываю значок специальной вставки после copy/paste слайдов
var bSlideObjects = aContents[nIndex] && aContents[nIndex].SlideObjects && aContents[nIndex].SlideObjects.length > 0;
if (specialOptionsArr.length >= 1 /*&& !bSlideObjects*/ && oPaste.insert) {
if (presentationSelectedContent && presentationSelectedContent.DocContent) {
specialOptionsArr.push(Asc.c_oSpecialPasteProps.keepTextOnly);
}
oThis._setSpecialPasteShowOptionsPresentation(specialOptionsArr);
} else {
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
}
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.pasteCallback && oThis.pasteCallback(oPaste.insert);
}
};
var oObjectsForDownload = GetObjectsForImageDownload(arr_Images, p_url === this.api.documentId);
if (oObjectsForDownload.aUrls.length > 0) {
AscCommon.sendImgUrls(oThis.api, oObjectsForDownload.aUrls, function (data) {
let oImageMap = {};
ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
addThemeImagesToMap(oImageMap, oObjectsForDownload.aUrls, arr_Images);
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}, true);
} else {
let oImageMap = {};
for(let nImg = 0; nImg < arr_Images.length; ++nImg) {
oImageMap[nImg] = arr_Images[nImg].Url
}
oThis.api.pre_Paste(fonts, oImageMap, paste_callback);
}
} else {
return null;
}
},
_readPresentationSelectedContent2: function (base64, bDuplicate) {
pptx_content_loader.Clear();
var _stream = AscFormat.CreateBinaryReader(base64, 0, base64.length);
var stream = new AscCommon.FileStream(_stream.data, _stream.size);
var p_url = stream.GetString2();
var p_theme = stream.GetString2();
var p_width = stream.GetULong() / 100000;
var p_height = stream.GetULong() / 100000;
var bIsMultipleContent = stream.GetBool();
var selectedContent2 = [];
if (true === bIsMultipleContent) {
var multipleParamsCount = stream.GetULong();
for (var i = 0; i < multipleParamsCount; i++) {
selectedContent2.push(this._readPresentationSelectedContent(stream, bDuplicate));
}
}
return {content: selectedContent2, p_url: p_url, p_theme: p_theme};
},
_readPresentationSelectedContent: function (stream, bDuplicate) {
return AscFormat.ExecuteNoHistory(function () {
var presentationSelectedContent = null;
var fonts = [];
var arr_Images = [];
var oThis = this;
var oFontMap = {};
var readContent = function () {
var docContent = oThis.ReadPresentationText(stream);
if (docContent.length === 0) {
return;
}
presentationSelectedContent.DocContent = new AscCommonWord.CSelectedContent();
presentationSelectedContent.DocContent.Elements = docContent;
//перебираем шрифты
for (var i in oThis.oFonts) {
oFontMap[i] = 1;
}
bIsEmptyContent = false;
};
var readDrawings = function () {
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOff();
}
var objects = oThis.ReadPresentationShapes(stream);
if (PasteElementsId.g_bIsDocumentCopyPaste) {
History.TurnOn();
}
presentationSelectedContent.Drawings = objects.arrShapes;
var arr_shapes = objects.arrShapes;
for (var i = 0; i < arr_shapes.length; ++i) {
if (arr_shapes[i].Drawing.getAllFonts) {
arr_shapes[i].Drawing.getAllFonts(oFontMap);
}
}
arr_Images = arr_Images.concat(objects.arrImages);
};
var readSlideObjects = function () {
var arr_slides = [];
var loader = new AscCommon.BinaryPPTYLoader();
if (!(bDuplicate === true)) {
loader.Start_UseFullUrl();
}
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
//для вставки таблицы со стилем
//TODO в дальнейшем необходимо пересмотреть и писать стили вместе со слайдом
var _globalTableStyles = editor.WordControl.m_oLogicDocument.globalTableStyles;
if (_globalTableStyles) {
for (var key in _globalTableStyles.Style) {
if (_globalTableStyles.Style.hasOwnProperty(key)) {
loader.map_table_styles[_globalTableStyles.Style[key].Id] =_globalTableStyles.Style[key];
}
}
}
//read slides
var slide_count = stream.GetULong();
//var arr_arrTransforms = [];
for (var i = 0; i < slide_count; ++i) {
if (PasteElementsId.g_bIsDocumentCopyPaste || PasteElementsId.g_bIsPDFCopyPaste) {
loader.stream.GetUChar();
loader.stream.SkipRecord();
arr_slides[i] = null;
} else {
arr_slides[i] = loader.ReadSlide(0);
}
}
//images and fonts
var font_map = {};
var slideCopyObjects = [];
for (var i = 0; i < arr_slides.length; ++i) {
if (arr_slides[i] && arr_slides[i].getAllFonts) {
arr_slides[i].fontMap = {};
arr_slides[i].getAllFonts(arr_slides[i].fontMap);
}
slideCopyObjects[i] = arr_slides[i];
}
arr_Images = arr_Images.concat(loader.End_UseFullUrl());
presentationSelectedContent.SlideObjects = slideCopyObjects;
};
var readLayouts = function () {
var loader = new AscCommon.BinaryPPTYLoader();
if (!(bDuplicate === true)) {
loader.Start_UseFullUrl();
}
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var selected_layouts = stream.GetULong();
var layouts = [];
for (var i = 0; i < selected_layouts; ++i) {
if (PasteElementsId.g_bIsDocumentCopyPaste || PasteElementsId.g_bIsPDFCopyPaste) {
loader.stream.GetUChar();
loader.stream.SkipRecord();
} else {
let oLayout = loader.ReadSlideLayout();
layouts.push(oLayout);
oLayout.getAllFonts(oFontMap);
}
}
arr_Images = arr_Images.concat(loader.End_UseFullUrl());
presentationSelectedContent.Layouts = layouts;
};
var readMasters = function () {
var loader = new AscCommon.BinaryPPTYLoader();
if (!(bDuplicate === true)) {
loader.Start_UseFullUrl();
}
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var count = stream.GetULong();
var array = [];
for (var i = 0; i < count; ++i) {
if (PasteElementsId.g_bIsDocumentCopyPaste || PasteElementsId.g_bIsPDFCopyPaste) {
loader.stream.GetUChar();
loader.stream.SkipRecord();
} else {
let oMaster = loader.ReadSlideMaster();
array.push(oMaster);
oMaster.getAllFonts(oFontMap);
}
}
arr_Images = arr_Images.concat(loader.End_UseFullUrl());
presentationSelectedContent.Masters = array;
};
var readNotes = function () {
var loader = new AscCommon.BinaryPPTYLoader();
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var selected_notes = stream.GetULong();
var notes = [];
for (var i = 0; i < selected_notes; ++i) {
if (PasteElementsId.g_bIsDocumentCopyPaste || PasteElementsId.g_bIsPDFCopyPaste) {
loader.stream.GetUChar();
loader.stream.SkipRecord();
} else {
let oNotes = loader.ReadNote();
notes.push(oNotes);
oNotes.getAllFonts(oFontMap);
}
}
presentationSelectedContent.Notes = notes;
};
var readNotesMasters = function () {
var loader = new AscCommon.BinaryPPTYLoader();
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var count = stream.GetULong();
var array = [];
for (var i = 0; i < count; ++i) {
if (PasteElementsId.g_bIsDocumentCopyPaste || PasteElementsId.g_bIsPDFCopyPaste) {
loader.stream.GetUChar();
loader.stream.SkipRecord();
} else {
let oNotesMaster = loader.ReadNoteMaster();
array.push(oNotesMaster);
oNotesMaster.getAllFonts(oFontMap);
}
}
presentationSelectedContent.NotesMasters = array;
};
var readNotesThemes = function () {
var loader = new AscCommon.BinaryPPTYLoader();
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var count = stream.GetULong();
//TODO возможно стоит пропустить при чтении в документах
var array = [];
for (var i = 0; i < count; ++i) {
let oTheme = loader.ReadTheme();
array.push(oTheme);
oTheme.Document_Get_AllFontNames(oFontMap);
}
presentationSelectedContent.NotesThemes = array;
};
var readThemes = function () {
var loader = new AscCommon.BinaryPPTYLoader();
if (!(bDuplicate === true)) {
loader.Start_UseFullUrl();
}
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var count = stream.GetULong();
//TODO возможно стоит пропустить при чтении в документах
var array = [];
for (var i = 0; i < count; ++i) {
let oTheme = loader.ReadTheme();
oTheme.Document_Get_AllFontNames(oFontMap);
array.push(oTheme);
}
arr_Images = arr_Images.concat(loader.End_UseFullUrl());
presentationSelectedContent.Themes = array;
};
var readIndexes = function () {
var count = stream.GetULong();
var array = [];
for (var i = 0; i < count; ++i) {
array.push(stream.GetULong());
}
return array;
};
var bIsEmptyContent = true;
var first_content = stream.GetString2();
if (first_content === "SelectedContent") {
var PresentationWidth = stream.GetULong() / 100000.0;
var PresentationHeight = stream.GetULong() / 100000.0;
var countContent = stream.GetULong();
for (var i = 0; i < countContent; i++) {
if (null === presentationSelectedContent) {
presentationSelectedContent = typeof PresentationSelectedContent !== "undefined" ? new PresentationSelectedContent() : {};
presentationSelectedContent.PresentationWidth = PresentationWidth;
presentationSelectedContent.PresentationHeight = PresentationHeight;
}
var first_string = stream.GetString2();
if ("DocContent" !== first_string) {
bIsEmptyContent = false;
}
switch (first_string) {
case "DocContent": {
readContent();
break;
}
case "Drawings": {
readDrawings();
break;
}
case "SlideObjects": {
readSlideObjects();
break;
}
case "Layouts": {
History.TurnOff();
readLayouts();
History.TurnOn();
break;
}
case "LayoutsIndexes": {
presentationSelectedContent.LayoutsIndexes = readIndexes();
break;
}
case "Masters": {
readMasters();
break;
}
case "MastersIndexes": {
presentationSelectedContent.MastersIndexes = readIndexes();
break;
}
case "Notes": {
readNotes();
break;
}
case "NotesMasters": {
History.TurnOff();
readNotesMasters();
History.TurnOn();
break;
}
case "NotesMastersIndexes": {
presentationSelectedContent.NotesMastersIndexes = readIndexes();
break;
}
case "NotesThemes": {
readNotesThemes();
break;
}
case "Themes": {
readThemes();
break;
}
case "ThemeIndexes": {
presentationSelectedContent.ThemesIndexes = readIndexes();
break;
}
}
}
}
if (presentationSelectedContent) {
var aSlides = presentationSelectedContent.SlideObjects;
if (Array.isArray(aSlides)) {
for (var i = 0; i < aSlides.length; ++i) {
var oCurSlide = aSlides[i];
var oSlideFontMap = oCurSlide ? oCurSlide.fontMap : null;
if (oSlideFontMap) {
var oTheme = null;
if (Array.isArray(presentationSelectedContent.LayoutsIndexes)) {
var nLayoutIndex = presentationSelectedContent.LayoutsIndexes[i];
if (AscFormat.isRealNumber(nLayoutIndex)) {
if (Array.isArray(presentationSelectedContent.MastersIndexes)) {
var nMasterIndex = presentationSelectedContent.MastersIndexes[nLayoutIndex];
if (AscFormat.isRealNumber(nMasterIndex)) {
if (Array.isArray(presentationSelectedContent.ThemesIndexes)) {
var nThemeIndex = presentationSelectedContent.ThemesIndexes[nMasterIndex];
if (AscFormat.isRealNumber(nThemeIndex)) {
if (Array.isArray(presentationSelectedContent.Themes)) {
oTheme = presentationSelectedContent.Themes[nThemeIndex];
}
}
}
}
}
}
}
if (oTheme) {
AscFormat.checkThemeFonts(oSlideFontMap, oTheme.themeElements.fontScheme);
}
for (var key in oSlideFontMap) {
if (oSlideFontMap.hasOwnProperty(key)) {
oFontMap[key] = 1;
}
}
AscFormat.checkThemeFonts(oFontMap, {});
delete oCurSlide.fontMap;
}
}
}
for (var key in oFontMap) {
fonts.push(new CFont(key));
}
let dPresW = presentationSelectedContent.PresentationWidth;
let dPresH = presentationSelectedContent.PresentationHeight;
if(AscFormat.isRealNumber(dPresW) && AscFormat.isRealNumber(dPresH)) {
let aMasters = presentationSelectedContent.Masters;
if(Array.isArray(aMasters)) {
for(let nIdx = 0; nIdx < aMasters.length; ++nIdx) {
aMasters[nIdx].setSlideSize(dPresW, dPresH);
}
}
let aLayouts = presentationSelectedContent.Layouts;
if(Array.isArray(aLayouts)) {
for(let nIdx = 0; nIdx < aLayouts.length; ++nIdx) {
aLayouts[nIdx].setSlideSize(dPresW, dPresH);
}
}
}
}
if (bIsEmptyContent) {
presentationSelectedContent = null;
}
return {content: presentationSelectedContent, fonts: fonts, images: arr_Images};
}, this, []);
},
_pasteFromHtml: function (node, bTurnOffTrackRevisions) {
let oThis = this;
let isPasteTextIntoList = !!this.pasteTextIntoList;
let oAPI = oThis.api;
if (oAPI.isPdfEditor()) {
let oDoc = oAPI.getPDFDoc();
oDoc.Action.PasteHtmlAction = true;
}
let fPasteHtmlPresentationCallback = function (fonts, images) {
oThis.aContent = [];
let aShapes = [], aImages = [], aTables = [];
let aCopyObjects = [];
let oPresentation = oAPI.WordControl.m_oLogicDocument;
let fExecutePastePresentation = function () {
//prepare content
//remove single shape with empty content
if (aShapes.length === 1) {
let oFirstShape = aShapes[0];
let oTxBody = oFirstShape.txBody;
if(oTxBody) {
let oDocContent = oTxBody.content;
if(!oDocContent || oDocContent.IsEmpty()) {
aShapes.length = 0;
}
}
}
for (let nSp = 0; nSp < aShapes.length; ++nSp) {
let oSp = aShapes[nSp];
let oTxBody = oSp.txBody;
let oTxContent = oTxBody.content;
let aTxContent = oTxContent.Content;
if (aTxContent.length > 1) {
let oFirstElement = aTxContent[0];
if(oFirstElement.IsEmpty()) {
oTxContent.Internal_Content_Remove(0, 1);
}
}
let dWidth, dHeight;
dWidth = oTxBody.getRectWidth(oPresentation.GetWidthMM() * 2 / 3);
dHeight = oTxContent.GetSummaryHeight();
AscFormat.CheckSpPrXfrm(oSp);
let oXfrm = oSp.spPr.xfrm;
oXfrm.setExtX(dWidth);
oXfrm.setExtY(dHeight);
oXfrm.setOffX((oPresentation.GetWidthMM() - dWidth) / 2.0);
oXfrm.setOffY((oPresentation.GetHeightMM() - dHeight) / 2.0);
let oBodyPr = oSp.getBodyPr().createDuplicate();
oBodyPr.rot = 0;
oBodyPr.spcFirstLastPara = false;
oBodyPr.vertOverflow = AscFormat.nVOTOverflow;
oBodyPr.horzOverflow = AscFormat.nHOTOverflow;
oBodyPr.vert = AscFormat.nVertTThorz;
oBodyPr.setDefaultInsets();
oBodyPr.numCol = 1;
oBodyPr.spcCol = 0;
oBodyPr.rtlCol = 0;
oBodyPr.fromWordArt = false;
oBodyPr.anchor = 4;
oBodyPr.anchorCtr = false;
oBodyPr.forceAA = false;
oBodyPr.compatLnSpc = true;
oBodyPr.prstTxWarp = AscFormat.CreatePrstTxWarpGeometry("textNoShape");
oBodyPr.textFit = new AscFormat.CTextFit();
oBodyPr.textFit.type = AscFormat.text_fit_Auto;
oSp.txBody.setBodyPr(oBodyPr);
oSp.txBody.content.MoveCursorToEndPos();
aCopyObjects.push(new DrawingCopyObject(oSp, 0, 0, dWidth, dHeight));
}
for (let nTable = 0; nTable < aTables.length; ++nTable) {
let oTableFrame = aTables[nTable];
//Todo: to think about width and height of inserted graphic frame with table
let dWidth = 100;
let dHeight = 100;
//----------------
AscFormat.CheckSpPrXfrm(oTableFrame);
let oXfrm = oTableFrame.spPr.xfrm;
oXfrm.setExtX(dWidth);
oXfrm.setExtY(dHeight);
oXfrm.setOffX(0);
oXfrm.setOffY(0);
aCopyObjects.push(new DrawingCopyObject(oTableFrame, 0, 0, dWidth, dHeight));
}
for (let nImage = 0; nImage < aImages.length; ++nImage) {
let oImage = aImages[nImage];
AscFormat.CheckSpPrXfrm(oImage);
let oXfrm = oImage.spPr.xfrm;
let dWidth = oXfrm.extX;
let dHeight = oXfrm.extY;
oXfrm.setOffX(0);
oXfrm.setOffY(0);
aCopyObjects.push(new DrawingCopyObject(oImage, 0, 0, dWidth, dHeight));
}
//INSERT CONTENT
let oController = oPresentation.GetCurrentController();
let oTargetContent = oController && oController.getTargetDocContent();
if (oTargetContent && aCopyObjects.length === 1 && aImages.length === 0 && aTables.length === 0) {
//не проверяем на лок т. к. это делается в asc_docs_api.prototype.asc_PasteData.
// При двух последовательных проверках в совместном редактировании вторая проверка всегда будет возвращать лок
let aNewContent = aCopyObjects[0].Drawing.txBody.content.Content;
oThis.InsertInPlacePresentation(aNewContent);
} else {
let oSelectedContent = new PresentationSelectedContent();
oSelectedContent.Drawings = aCopyObjects;
let oPaste = oPresentation.InsertContent(oSelectedContent);
oPresentation.FinalizeAction();
oPresentation.UpdateInterface();
//check only images
let bOnlyImg = false;
if (oSelectedContent.isDrawingsContent()) {
bOnlyImg = true;
let aDrawingCopyObjects = oSelectedContent.Drawings;
for (let nDrawing = 0; nDrawing < aDrawingCopyObjects.length; nDrawing++) {
let oSp = aDrawingCopyObjects[nDrawing].Drawing;
if (oSp.getObjectType() !== AscDFH.historyitem_type_ImageShape) {
bOnlyImg = false;
break;
}
}
}
let oPasteHelper = window['AscCommon'].g_specialPasteHelper;
if (bOnlyImg || !oPaste.insert) {
oPasteHelper.SpecialPasteButton_Hide();
if (oPasteHelper.buttonInfo) {
oPasteHelper.showButtonIdParagraph = null;
oPasteHelper.CleanButtonInfo();
}
} else {
oThis._setSpecialPasteShowOptionsPresentation([Asc.c_oSpecialPasteProps.sourceformatting, Asc.c_oSpecialPasteProps.keepTextOnly]);
}
oPasteHelper.Paste_Process_End();
}
if (false === oThis.bNested) {
if (oThis.pasteCallback) {
oThis.pasteCallback();
}
}
};
if (oPresentation.GetSlidesCount() === 0) {
oPresentation.addNextSlide();
}
let oShape = new CShape();
oShape.setParent(oPresentation.GetCurrentSlide());
oShape.setTxBody(AscFormat.CreateTextBodyFromString("", oPresentation.DrawingDocument, oShape));
aShapes.push(oShape);
oThis._Execute(node, {}, true, true, false, aShapes, aImages, aTables);
if (!fonts) {
fonts = [];
}
if (!images) {
images = [];
}
oAPI.pre_Paste(fonts, images, fExecutePastePresentation);
};
let fPasteHtmlPDFCallback = function (fonts, images) {
oThis.aContent = [];
let aCopyObjects = [];
let oDoc = oAPI.getPDFDoc();
let nPage = oDoc.GetCurPage();
let nPageW = oDoc.GetPageWidthMM(nPage);
let nPageH = oDoc.GetPageHeightMM(nPage);
let aShapes = [], aImages = [], aTables = [];
let fExecutePastePDF = function () {
//prepare content
AscCommon.ExecuteNoHistory(function() {
//remove single shape with empty content
if (aShapes.length === 1) {
let oFirstShape = aShapes[0];
let oTxBody = oFirstShape.txBody;
if(oTxBody) {
let oDocContent = oTxBody.content;
if(!oDocContent || oDocContent.IsEmpty()) {
aShapes.length = 0;
oThis.arrDrawingsPasteOrder.splice(oThis.arrDrawingsPasteOrder.indexOf(oFirstShape), 1);
}
}
}
for (let i = 0; i < oThis.arrDrawingsPasteOrder.length; i++) {
if (oThis.arrDrawingsPasteOrder[i].IsShape()) {
let oSp = oThis.arrDrawingsPasteOrder[i];
oSp.bDeleted = false;
let oTxBody = oSp.txBody;
let oTxContent = oTxBody.content;
let aTxContent = oTxContent.Content;
if (aTxContent.length > 1) {
let oFirstElement = aTxContent[0];
if(oFirstElement.IsEmpty()) {
oTxContent.Internal_Content_Remove(0, 1);
}
}
let dWidth, dHeight;
dWidth = oTxBody.getRectWidth(nPageW * 2 / 3);
dHeight = oTxContent.GetSummaryHeight();
AscFormat.CheckSpPrXfrm(oSp);
let oXfrm = oSp.spPr.xfrm;
oXfrm.setExtX(dWidth);
oXfrm.setExtY(dHeight);
oXfrm.setOffX(0);
oXfrm.setOffY(0);
let oBodyPr = oSp.getBodyPr().createDuplicate();
oBodyPr.rot = 0;
oBodyPr.spcFirstLastPara = false;
oBodyPr.vertOverflow = AscFormat.nVOTOverflow;
oBodyPr.horzOverflow = AscFormat.nHOTOverflow;
oBodyPr.vert = AscFormat.nVertTThorz;
oBodyPr.setDefaultInsets();
oBodyPr.numCol = 1;
oBodyPr.spcCol = 0;
oBodyPr.rtlCol = 0;
oBodyPr.fromWordArt = false;
oBodyPr.anchor = 4;
oBodyPr.anchorCtr = false;
oBodyPr.forceAA = false;
oBodyPr.compatLnSpc = true;
oBodyPr.prstTxWarp = AscFormat.CreatePrstTxWarpGeometry("textNoShape");
oBodyPr.textFit = new AscFormat.CTextFit();
oBodyPr.textFit.type = AscFormat.text_fit_Auto;
oSp.txBody.setBodyPr(oBodyPr);
oSp.txBody.content.MoveCursorToEndPos();
aCopyObjects.push(new AscPDF.DrawingCopyObject(oSp, 0, 0, dWidth, dHeight));
}
if (oThis.arrDrawingsPasteOrder[i].IsGraphicFrame()) {
let oTableFrame = oThis.arrDrawingsPasteOrder[i];
oTableFrame.bDeleted = false;
let dWidth = nPageW * 2 / 3;
let dHeight = 100;
//----------------
AscFormat.CheckSpPrXfrm(oTableFrame);
let oXfrm = oTableFrame.spPr.xfrm;
oTableFrame.applyDrawingSize({Width: nPageW * 2 / 3, Height: dHeight});
oTableFrame.graphicObject.Set_TableW(tblwidth_Mm, nPageW * 2 / 3);
oXfrm.setOffX(0);
oXfrm.setOffY(0);
aCopyObjects.push(new AscPDF.DrawingCopyObject(oTableFrame, 0, 0, dWidth, dHeight));
}
if (oThis.arrDrawingsPasteOrder[i].IsImage()) {
let oImage = oThis.arrDrawingsPasteOrder[i];
oImage.bDeleted = false;
AscFormat.CheckSpPrXfrm(oImage);
let oXfrm = oImage.spPr.xfrm;
let dWidth = oXfrm.extX;
let dHeight = oXfrm.extY;
oXfrm.setOffX(0);
oXfrm.setOffY(0);
aCopyObjects.push(new AscPDF.DrawingCopyObject(oImage, 0, 0, dWidth, dHeight));
}
}
});
//INSERT CONTENT
let oController = oDoc.GetController();
let oTargetContent = oController && oController.getTargetDocContent();
let oSelectedContent = new AscPDF.PDFSelectedContent();
let oPasteHelper = window['AscCommon'].g_specialPasteHelper;
if (oTargetContent && aCopyObjects.length === 1 && aImages.length === 0 && aTables.length === 0) {
oSelectedContent.DocContent = new AscCommonWord.CSelectedContent();
aCopyObjects[0].Drawing.txBody.content.Content.forEach(function(element) {
let oSelElement = new AscCommonWord.CSelectedElement();
oSelElement.Element = element;
oSelectedContent.DocContent.Elements.push(oSelElement);
});
let bPaste = oDoc.InsertContent2([oSelectedContent], 0);
oPasteHelper.Paste_Process_End();
if (false === oThis.bNested) {
if (oThis.pasteCallback) {
oThis.pasteCallback(bPaste);
}
}
} else {
oSelectedContent.Drawings = aCopyObjects;
let bPaste = oDoc.InsertContent2([oSelectedContent], 0);
//check only images
let bOnlyImg = false;
if (oSelectedContent.isDrawingsContent()) {
bOnlyImg = true;
let aDrawingCopyObjects = oSelectedContent.Drawings;
for (let nDrawing = 0; nDrawing < aDrawingCopyObjects.length; nDrawing++) {
let oSp = aDrawingCopyObjects[nDrawing].Drawing;
if (oSp.getObjectType() !== AscDFH.historyitem_type_ImageShape) {
bOnlyImg = false;
break;
}
}
}
oPasteHelper.Paste_Process_End();
if (false === oThis.bNested) {
if (oThis.pasteCallback) {
oThis.pasteCallback(bPaste);
}
}
}
};
AscCommon.ExecuteNoHistory(function() {
let oShape = new AscPDF.CPdfShape();
oShape.setParent(oDoc);
oShape.setTxBody(AscFormat.CreateTextBodyFromString("", oDoc.DrawingDocument, oShape));
aShapes.push(oShape);
oThis.arrDrawingsPasteOrder.push(oShape);
oThis._Execute(node, {}, true, true, false, aShapes, aImages, aTables);
});
if (!fonts) {
fonts = [];
}
if (!images) {
images = [];
}
oAPI.pre_Paste(fonts, images, fExecutePastePDF);
};
var fPasteHtmlWordCallback = function (fonts, images) {
var executePasteWord = function () {
if (false === oThis.bNested) {
if (oThis.aNeedRecalcImgSize) {
for (var i = 0; i < oThis.aNeedRecalcImgSize.length; i++) {
if (PasteElementsId.g_bIsDocumentCopyPaste) {
var drawing = oThis.aNeedRecalcImgSize[i].drawing;
var img = oThis.aNeedRecalcImgSize[i].img;
if (drawing && img) {
var imgSize = oThis._getImgSize(img);
let fitPagePictureSize = oThis.fitPictureSizeToPage(imgSize.width, imgSize.height);
let nWidth = fitPagePictureSize.nWidth;
let nHeight = fitPagePictureSize.nHeight;
if (imgSize && drawing.Extent && (drawing.Extent.H !== nHeight || drawing.Extent.W !== nWidth)) {
drawing.setExtent(nWidth, nHeight);
drawing.GraphicObj.spPr.xfrm.setExtX(nWidth);
drawing.GraphicObj.spPr.xfrm.setExtY(nHeight);
}
}
} else {
}
}
}
oThis.InsertInDocument();
}
if (false !== bTurnOffTrackRevisions) {
oThis.api.WordControl.m_oLogicDocument.SetLocalTrackRevisions(bTurnOffTrackRevisions);
}
if (false === oThis.bNested) {
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
}
};
//если в итоге во вставляемом контенте нет следов списков, тогда вставляем просто текст, в противном случае - чистим списки
if (oThis.pasteTextIntoList) {
oThis._pasteText(oThis.pasteTextIntoList);
return;
}
oThis.aContent = [];
//если находимся внутри текстовой области диаграммы, то не вставляем ссылки
if (oThis.oDocument && oThis.oDocument.Parent && oThis.oDocument.Parent.parent && oThis.oDocument.Parent.parent.parent && oThis.oDocument.Parent.parent.parent.getObjectType && oThis.oDocument.Parent.parent.parent.getObjectType() == AscDFH.historyitem_type_Chart) {
var hyperlinks = node.getElementsByTagName("a");
if (hyperlinks && hyperlinks.length) {
var newElement;
for (var i = 0; i < hyperlinks.length; i++) {
newElement = document.createElement("span");
var cssText = hyperlinks[i].getAttribute('style');
if (cssText)
newElement.getAttribute('style', cssText);
$(newElement).append(hyperlinks[i].children);
hyperlinks[i].parentNode.replaceChild(newElement, hyperlinks[i]);
}
}
//Todo пока сделал так, чтобы не вставлялись графические объекты в название диаграммы, потом нужно будет сделать так же запутанно, как в MS
var htmlImages = node.getElementsByTagName("img");
if (htmlImages && htmlImages.length) {
for (var i = 0; i < htmlImages.length; i++) {
htmlImages[i].parentNode.removeChild(htmlImages[i]);
}
}
}
if (false !== bTurnOffTrackRevisions) {
oThis.api.WordControl.m_oLogicDocument.SetLocalTrackRevisions(bTurnOffTrackRevisions);
}
//на время заполнения контента для вставки отключаем историю
oThis._Execute(node, {}, true, true, false);
//by section
//oThis._applyMsoSections(oThis.aContent, oThis.oMsoSections);
oThis._AddNextPrevToContent(oThis.oDocument);
if (isPasteTextIntoList) {
oThis._pasteText(oThis._getTextFromContent(oThis.aContent, {Numbering: false}));
return;
}
oThis.api.pre_Paste(fonts, images, executePasteWord);
};
this.oRootNode = node;
if (AscCommon.g_clipboardBase.pastedFrom === AscCommon.c_oClipboardPastedFrom.Word) {
this.aMsoHeadStylesStr = this._findMsoHeadStyle(node.parentElement);
}
if (PasteElementsId.g_bIsDocumentCopyPaste) {
this.bIsPlainText = this._CheckIsPlainText(node);
var specialPasteOnlyText = Asc.c_oSpecialPasteProps.keepTextOnly === window['AscCommon'].g_specialPasteHelper.specialPasteProps;
if (specialPasteOnlyText && !this.pasteTextIntoList) {
fPasteHtmlWordCallback();
} else {
this._Prepeare(node, fPasteHtmlWordCallback);
}
if (false !== bTurnOffTrackRevisions) {
oThis.api.WordControl.m_oLogicDocument.SetLocalTrackRevisions(bTurnOffTrackRevisions);
}
} else if (PasteElementsId.g_bIsPDFCopyPaste) {
this.oRootNode = node;
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart && Asc.c_oSpecialPasteProps.keepTextOnly === window['AscCommon'].g_specialPasteHelper.specialPasteProps) {
fPasteHtmlPDFCallback();
} else {
this._Prepeare(node, fPasteHtmlPDFCallback);
}
} else {
this.oRootNode = node;
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart && Asc.c_oSpecialPasteProps.keepTextOnly === window['AscCommon'].g_specialPasteHelper.specialPasteProps) {
fPasteHtmlPresentationCallback();
} else {
this._Prepeare(node, fPasteHtmlPresentationCallback);
}
}
},
_getClassBinaryFromHtml: function (node, onlyBinary) {
var classNode, base64FromExcel = null, base64FromWord = null, base64FromPresentation = null, base64FromPDF = null;
if (onlyBinary) {
if (typeof onlyBinary === "object") {
var prefix = String.fromCharCode(onlyBinary[0], onlyBinary[1], onlyBinary[2], onlyBinary[3]);
if ("PPTY" === prefix) {
base64FromPresentation = onlyBinary;
} else if ("DOCY" === prefix) {
base64FromWord = onlyBinary;
} else if ("XLSY" === prefix) {
base64FromExcel = onlyBinary;
}
} else {
if (onlyBinary.indexOf("pptData;") > -1) {
base64FromPresentation = onlyBinary.split('pptData;')[1];
} else if (onlyBinary.indexOf("docData;") > -1) {
base64FromWord = onlyBinary.split('docData;')[1];
} else if (onlyBinary.indexOf("xslData;") > -1) {
base64FromExcel = onlyBinary.split('xslData;')[1];
} else if (onlyBinary.indexOf("pdfData;") > -1) {
base64FromPDF = onlyBinary.split('pdfData;')[1];
}
}
} else if (node) {
classNode = searchBinaryClass(node);
if (classNode != null) {
var cL = classNode.split(" ");
for (var i = 0; i < cL.length; i++) {
if (cL[i].indexOf("xslData;") > -1) {
base64FromExcel = cL[i].split('xslData;')[1];
} else if (cL[i].indexOf("docData;") > -1) {
base64FromWord = cL[i].split('docData;')[1];
} else if (cL[i].indexOf("pptData;") > -1) {
base64FromPresentation = cL[i].split('pptData;')[1];
} else if (cL[i].indexOf("pdfData;") > -1) {
base64FromPDF = cL[i].split('pdfData;')[1];
}
}
}
}
return {
base64FromExcel: base64FromExcel,
base64FromWord: base64FromWord,
base64FromPresentation: base64FromPresentation,
base64FromPDF: base64FromPDF
};
},
_pasteText: function (text) {
var oThis = this;
var fPasteTextWordCallback = function () {
var executePasteWord = function () {
if (false === oThis.bNested) {
oThis.InsertInDocument(!window['AscCommon'].g_specialPasteHelper.specialPasteStart);
if (oThis.pasteCallback)
oThis.pasteCallback(true);
}
};
oThis.aContent = [];
oThis._getContentFromText(text, true);
oThis._AddNextPrevToContent(oThis.oDocument);
oThis.api.pre_Paste([], [], executePasteWord);
};
let textToPDFContent = function(text) {
text = text.replace(/^(\r|\t)+|(\r|\t)+$/g, '');
if (!text || !text.length)
return;
let addParagraph = false;
let paragraph = new AscWord.Paragraph(null, true);
oThis.aContent.push(paragraph);
let run = new AscWord.Run();
let inRunPos = 0;
paragraph.AddToContent(0, run);
for (let oIterator = text.getUnicodeIterator(); oIterator.check(); oIterator.next()) {
if (addParagraph) {
paragraph = new AscWord.Paragraph(null, true);
oThis.aContent.push(paragraph);
run = new AscWord.Run();
paragraph.AddToContent(0, run);
addParagraph = false;
inRunPos = 0;
}
let codePoint = oIterator.value();
if (null === codePoint || 0x0D === codePoint)
continue;
if (0x0A === codePoint)
addParagraph = true;
else
run.AddToContent(inRunPos++, AscWord.codePointToRunElement(codePoint), true);
}
}
let textToPresentationContent = function(text, docContent) {
text = text.replace(/^(\r|\t)+|(\r|\t)+$/g, '');
if (!text || !text.length)
return;
oThis.oDocument = docContent;
let addParagraph = false;
let paragraph = docContent.GetElement(0);
let run = new AscWord.Run();
let inRunPos = 0;
paragraph.AddToContent(0, run);
for (var oIterator = text.getUnicodeIterator(); oIterator.check(); oIterator.next()) {
if (addParagraph) {
paragraph = new AscWord.Paragraph(null, docContent.bPresentation === true);
docContent.PushToContent(paragraph);
run = new AscWord.Run();
paragraph.AddToContent(0, run);
addParagraph = false;
inRunPos = 0;
}
let codePoint = oIterator.value();
if (null === codePoint || 0x0D === codePoint)
continue;
if (0x0A === codePoint)
addParagraph = true;
else
run.AddToContent(inRunPos++, AscWord.codePointToRunElement(codePoint), true);
}
}
var fPasteTextPresentationCallback = function () {
var executePastePresentation = function () {
oThis.InsertInPlacePresentation(oThis.aContent, true);
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
};
var presentation = editor.WordControl.m_oLogicDocument;
if (presentation.Slides.length === 0) {
presentation.addNextSlide();
}
var shape = new CShape();
shape.setParent(presentation.Slides[presentation.CurPage]);
shape.setTxBody(AscFormat.CreateTextBodyFromString("", presentation.DrawingDocument, shape));
oThis.aContent = shape.txBody.content.Content;
textToPresentationContent(text, shape.txBody.content);
var oTextPr = presentation.GetCalculatedTextPr();
shape.txBody.content.SetApplyToAll(true);
var paraTextPr = new AscCommonWord.ParaTextPr(oTextPr);
shape.txBody.content.AddToParagraph(paraTextPr);
shape.txBody.content.SetApplyToAll(false);
oThis.api.pre_Paste([], [], executePastePresentation);
};
let fPasteTextPDFCallback = function () {
let oDoc = Asc.editor.getPDFDoc();
let executePastePDF = function () {
let oPDFSelContent = new AscPDF.PDFSelectedContent();
oPDFSelContent.DocContent = new AscCommonWord.CSelectedContent();
for (let i = 0, length = oThis.aContent.length; i < length; ++i) {
let oSelectedElement = new AscCommonWord.CSelectedElement();
oSelectedElement.Element = oThis.aContent[i];
oPDFSelContent.DocContent.Elements[i] = oSelectedElement;
}
oDoc.InsertContent2([oPDFSelContent], 0);
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
oThis.aContent = [];
if (oThis.pasteCallback) {
oThis.pasteCallback(true);
}
};
oThis.aContent = [];
AscCommon.ExecuteNoHistory(function() {
textToPDFContent(text);
let oParaTextPr = new AscCommonWord.ParaTextPr(oDoc.GetCalculatedTextPr());
oThis.aContent.forEach(function(para) {
para.Add(oParaTextPr);
});
});
oThis.api.pre_Paste([], [], executePastePDF);
};
if (PasteElementsId.g_bIsDocumentCopyPaste) {
fPasteTextWordCallback();
} else if (PasteElementsId.g_bIsPDFCopyPaste) {
fPasteTextPDFCallback();
} else {
fPasteTextPresentationCallback();
}
},
_getContentFromText: function (text, getStyleCurSelection) {
var t = this;
var Count = text.length;
var pasteIntoParagraphPr = this.oDocument.GetDirectParaPr();
var pasteIntoParaRunPr = this.oDocument.GetDirectTextPr();
var bPresentation = false;
var oCurParagraph = this.oDocument.GetCurrentParagraph();
var Parent = t.oDocument;
if (oCurParagraph && !oCurParagraph.bFromDocument) {
bPresentation = true;
Parent = oCurParagraph.Parent;
}
var getNewParagraph = function () {
var paragraph = new AscWord.Paragraph(Parent, bPresentation);
var copyParaPr;
if (getStyleCurSelection) {
if (pasteIntoParagraphPr) {
copyParaPr = pasteIntoParagraphPr.Copy();
copyParaPr.NumPr = undefined;
paragraph.Set_Pr(copyParaPr);
if (paragraph.TextPr && pasteIntoParaRunPr) {
paragraph.TextPr.Value = pasteIntoParaRunPr.Copy();
}
}
}
return paragraph;
};
var getNewParaRun = function () {
var paraRun = new ParaRun();
if (getStyleCurSelection) {
if (pasteIntoParaRunPr && paraRun.Set_Pr) {
paraRun.Set_Pr(pasteIntoParaRunPr.Copy());
}
}
return paraRun;
};
var _addToRun = function (_nUnicode) {
var Item;
if (0x2009 === _nUnicode || 9 === _nUnicode) {
Item = new AscWord.CRunTab();
} else if (0x20 !== _nUnicode && 0xA0 !== _nUnicode) {
Item = new AscWord.CRunText(_nUnicode);
} else {
Item = new AscWord.CRunSpace();
}
//add text
newParaRun.AddToContent(-1, Item, false);
};
var newParagraph = getNewParagraph();
var partTextCount = 0;
var newParaRun = getNewParaRun();
for (var oIterator = text.getUnicodeIterator(); oIterator.check(); oIterator.next()) {
var pos = oIterator.position();
var nUnicode = oIterator.value();
if (0x0A === nUnicode || pos === Count - 1) {
if (pos === Count - 1 && 0x0A !== nUnicode) {
_addToRun(nUnicode);
}
newParagraph.Internal_Content_Add(newParagraph.Content.length - 1, newParaRun, false);
this.aContent.push(newParagraph);
newParagraph = getNewParagraph();
newParaRun = getNewParaRun();
partTextCount = 0;
} else if (partTextCount === Asc.c_dMaxParaRunContentLength) {//max run length
_addToRun(nUnicode);
newParagraph.Internal_Content_Add(newParagraph.Content.length - 1, newParaRun, false);
newParaRun = getNewParaRun();
partTextCount = 0;
} else if (13 === nUnicode) {
continue;
} else {
partTextCount++;
_addToRun(nUnicode);
}
}
if (partTextCount) {
newParagraph.Internal_Content_Add(newParagraph.Content.length - 1, newParaRun, false);
this.aContent.push(newParagraph);
}
},
_getTextFromContent: function (aContent, oPr) {
var ResultText = "";
if (aContent) {
for (var Index = 0; Index < aContent.length; Index++)
{
aContent[Index].SelectAll();
aContent[Index].ApplyToAll = true;
ResultText += aContent[Index].GetSelectedText(false, oPr);
}
}
return ResultText;
},
_isParagraphContainsOnlyDrawing: function (par) {
var res = true;
if (par.Content) {
for (var i = 0; i < par.Content.length; i++) {
if (par.Content[i] && par.Content[i].Content && par.Content[i].Content.length) {
for (var j = 0; j < par.Content[i].Content.length; j++) {
var elem = par.Content[i].Content[j];
if (!(para_Drawing === elem.Get_Type() || para_End === elem.Get_Type())) {
res = false;
}
}
}
}
}
return res;
},
_convertExcelBinary: function (aContentExcel, pDrawings) {
//пока только распознаём только графические объекты
var aContent = null, tempParagraph = null;
var imageUrl, isGraphicFrame, extX, extY;
var fonts = null;
var drawings = pDrawings ? pDrawings : aContentExcel.workbook.aWorksheets[0].Drawings;
if (drawings && drawings.length) {
var drawing, graphicObj, paraRun, tempParaRun;
aContent = [];
var font_map = {};
//из excel в word они вставляются в один параграф
for (var i = 0; i < drawings.length; i++) {
drawing = drawings[i] && drawings[i].Drawing ? drawings[i].Drawing : drawings[i];
//TODO нужна отдельная обработка для таблиц из презентаций
isGraphicFrame = typeof CTable !== "undefined" && drawing.graphicObject instanceof CTable;
if (isGraphicFrame && drawings.length > 1 && drawings[i].base64)//если кроме таблички(при вставке из презентаций) содержатся ещё данные, вставляем в виде base64
{
if (!tempParagraph)
tempParagraph = new AscWord.Paragraph(this.oDocument);
extX = drawings[i].ExtX;
extY = drawings[i].ExtY;
imageUrl = drawings[i].base64;
graphicObj = AscFormat.DrawingObjectsController.prototype.createImage(imageUrl, 0, 0, extX, extY);
tempParaRun = new ParaRun();
tempParaRun.Paragraph = null;
tempParaRun.Add_ToContent(0, new ParaDrawing(), false);
tempParaRun.Content[0].Set_GraphicObject(graphicObj);
tempParaRun.Content[0].GraphicObj.setParent(tempParaRun.Content[0]);
tempParaRun.Content[0].CheckWH();
tempParagraph.Content.splice(tempParagraph.Content.length - 1, 0, tempParaRun);
} else if (isGraphicFrame) {
var copyObj = drawing.getWordTable();
if(copyObj) {
copyObj.Set_Inline && copyObj.Set_Inline(true);
copyObj.Set_Parent(this.oDocument);
aContent[aContent.length] = copyObj;
drawing.getAllFonts(font_map);
}
} else {
if (!tempParagraph)
tempParagraph = new AscWord.Paragraph(this.oDocument);
extX = drawings[i].ExtX;
extY = drawings[i].ExtY;
drawing.getAllFonts(font_map);
graphicObj = drawing.graphicObject ? drawing.graphicObject.convertToWord(this.oLogicDocument) : drawing.convertToWord(this.oLogicDocument);
tempParaRun = new ParaRun();
tempParaRun.Paragraph = null;
var newParaDrawing = new ParaDrawing();
//newParaDrawing.Set_DrawingType(drawing_Anchor);
tempParaRun.Add_ToContent(0, newParaDrawing, false);
tempParaRun.Content[0].Set_GraphicObject(graphicObj);
tempParaRun.Content[0].GraphicObj.setParent2(tempParaRun.Content[0]);
var oGraphicObj = tempParaRun.Content[0].GraphicObj;
if (oGraphicObj.spPr && oGraphicObj.spPr.xfrm) {
oGraphicObj.spPr.xfrm.setOffX(0);
oGraphicObj.spPr.xfrm.setOffY(0);
}
tempParaRun.Content[0].CheckWH();
tempParagraph.Content.splice(tempParagraph.Content.length - 1, 0, tempParaRun);
}
}
fonts = [];
for (var i in font_map) {
fonts.push(new CFont(i));
}
if (tempParagraph)
aContent[aContent.length] = tempParagraph;
} else {
if (!this.oDocument.bPresentation) {
fonts = this._convertTableFromExcel(aContentExcel);
if (PasteElementsId.g_bIsDocumentCopyPaste && this.aContent && this.aContent.length === 1 && 1 === this.aContent[0].Rows && this.aContent[0].Content[0]) {
var _content = this.aContent[0].Content[0];
if (_content && _content.Content && 1 === _content.Content.length && _content.Content[0].Content &&
_content.Content[0].Content.Content[0]) {
this.aContent[0] = _content.Content[0].Content.Content[0];
}
}
} else {
fonts = this._convertTableFromExcelForChartTitle(aContentExcel);
}
aContent = this.aContent;
}
return {content: aContent, fonts: fonts};
},
_convertTableFromExcel: function (aContentExcel) {
var worksheet = aContentExcel.workbook.aWorksheets[0];
var range;
var tempActiveRef = aContentExcel.activeRange;
var activeRange = AscCommonExcel.g_oRangeCache.getAscRange(tempActiveRef);
var t = this;
var fonts = [];
var charToMM = function (mcw) {
var maxDigitWidth = 7;
var px = Asc.floor(((256 * mcw + Asc.floor(128 / maxDigitWidth)) / 256) * maxDigitWidth);
return px * g_dKoef_pix_to_mm;
};
var convertBorder = function (border) {
var res = new CDocumentBorder();
if (border.w) {
res.Value = border_Single;
res.Size = border.w * g_dKoef_pix_to_mm;
}
var bc = border.getColorOrDefault();
res.Color = new CDocumentColor(bc.getR(), bc.getG(), bc.getB());
return res;
};
var addFont = function (fontFamily) {
if (!t.aContent.fonts) {
t.aContent.fonts = [];
}
if (!t.oFonts) {
t.oFonts = [];
}
if (!t.oFonts[fontFamily]) {
t.oFonts[fontFamily] = {Name: fontFamily, Index: -1};
fonts.push(new CFont(fontFamily));
}
};
//grid
var grid = [];
var standardWidth = 9;
for (var i = activeRange.c1; i <= activeRange.c2; i++) {
if (worksheet.aCols[i]) {
grid[i - activeRange.c1] = charToMM(worksheet.aCols[i].width);
} else {
grid[i - activeRange.c1] = charToMM(standardWidth);
}
}
var table;
if (PasteElementsId.g_bIsPDFCopyPaste) {
table = this._createNewPDFTable(grid);
table.Set_TableStyle(editor.WordControl.m_oLogicDocument.DefaultTableStyleId)
} else if (editor.WordControl.m_oLogicDocument && editor.WordControl.m_oLogicDocument.Slides) {
table = this._createNewPresentationTable(grid);
table.Set_TableStyle(editor.WordControl.m_oLogicDocument.DefaultTableStyleId)
} else {
table = new CTable(this.oDocument.DrawingDocument, this.oDocument, true, 0, 0, grid);
}
this.aContent.push(table);
var diffRow = activeRange.r2 - activeRange.r1;
var diffCol = activeRange.c2 - activeRange.c1;
for (var i = 0; i <= diffRow; i++) {
var row = table.private_AddRow(table.Content.length, 0);
var heightRowPt = worksheet.getRowHeight(i + activeRange.r1);
row.SetHeight(heightRowPt * g_dKoef_pt_to_mm, linerule_AtLeast);
for (var j = 0; j <= diffCol; j++) {
if (!table.Selection.Data) {
table.Selection.Data = [];
}
table.Selection.Data[table.Selection.Data.length] = {Cell: j, Row: i};
range = worksheet.getCell3(i + activeRange.r1, j + activeRange.c1);
var oCurCell = row.Add_Cell(row.Get_CellsCount(), row, null, false);
table.CurCell = oCurCell;
var isMergedCell = range.hasMerged();
var gridSpan = 1;
var vMerge = 1;
if (isMergedCell) {
gridSpan = isMergedCell.c2 - isMergedCell.c1 + 1;
vMerge = isMergedCell.r2 - isMergedCell.r1 + 1;
}
//***cell property***
//set grid
var sumWidthGrid = 0;
for (var l = 0; l < gridSpan; l++) {
sumWidthGrid += grid[j + l];
}
oCurCell.Set_W(new CTableMeasurement(tblwidth_Mm, sumWidthGrid));
//margins
//left
oCurCell.Set_Margins({W: 0, Type: tblwidth_Mm}, 3);
//right
oCurCell.Set_Margins({W: 0, Type: tblwidth_Mm}, 1);
//top
oCurCell.Set_Margins({W: 0, Type: tblwidth_Mm}, 0);
//bottom
oCurCell.Set_Margins({W: 0, Type: tblwidth_Mm}, 2);
//background color
var background_color = range.getFillColor();
if (null != background_color) {
var Shd = new CDocumentShd();
Shd.Value = c_oAscShdClear;
Shd.Color = new CDocumentColor(background_color.getR(), background_color.getG(), background_color.getB());
if (PasteElementsId.g_bIsDocumentCopyPaste) {
Shd.Fill = new CDocumentColor(background_color.getR(), background_color.getG(), background_color.getB());
}
else {
Shd.Unifill = AscFormat.CreateSolidFillRGBA(background_color.getR(), background_color.getG(), background_color.getB(), 255);
}
oCurCell.Set_Shd(Shd);
}
//borders
var borders = range.getBorderFull();
//left
var border = convertBorder(borders.l);
if (null != border) {
oCurCell.Set_Border(border, 3);
}
//top
border = convertBorder(borders.t);
if (null != border) {
oCurCell.Set_Border(border, 0);
}
//right
border = convertBorder(borders.r);
if (null != border) {
oCurCell.Set_Border(border, 1);
}
//bottom
border = convertBorder(borders.b);
if (null != border) {
oCurCell.Set_Border(border, 2);
}
//merge
oCurCell.Set_GridSpan(gridSpan);
if (vMerge != 1) {
if (isMergedCell.r1 === i + activeRange.r1) {
oCurCell.SetVMerge(vmerge_Restart);
} else {
oCurCell.SetVMerge(vmerge_Continue);
}
}
var align = range.getAlign();
var textAngle = align ? align.getAngle() : null;
if (textAngle === 90) {
oCurCell.Set_TextDirection(c_oAscCellTextDirection.BTLR);
} else if (textAngle === -90) {
oCurCell.Set_TextDirection(c_oAscCellTextDirection.TBRL);
}
var vAlign = align ? align.getAlignVertical() : null;
switch (vAlign) {
case Asc.c_oAscVAlign.Bottom:
oCurCell.Set_VAlign(vertalignjc_Bottom);
break;
case Asc.c_oAscVAlign.Center:
case Asc.c_oAscVAlign.Dist:
case Asc.c_oAscVAlign.Just:
oCurCell.Set_VAlign(vertalignjc_Center);
break;
case Asc.c_oAscVAlign.Top:
oCurCell.Set_VAlign(vertalignjc_Top);
break;
}
var oCurPar = oCurCell.GetContent().GetElement(0);
if (!oCurPar || !oCurPar.IsParagraph())
continue;
if (align) {
var type = range.getType();
if (null != align.hor) {
oCurPar.SetParagraphAlign(align.hor);
} else if (AscCommon.CellValueType.Number === type) {
//для пустого текста, даже если тип соответсвующий, не проставляю выравнивание
if (!range.isEmptyTextString()) {
oCurPar.SetParagraphAlign(AscCommon.align_Right);
}
}
}
var hyperLink = range.getHyperlink();
var oCurHyperlink = null;
if (hyperLink) {
oCurHyperlink = new ParaHyperlink();
oCurHyperlink.SetValue(hyperLink.Hyperlink);
if (hyperLink.Tooltip) {
oCurHyperlink.SetToolTip(hyperLink.Tooltip);
}
}
var value2 = range.getValue2();
for (var n = 0; n < value2.length; n++) {
const oCurRun = new AscWord.CRun(oCurPar);
var format = value2[n].format;
//***text property***
oCurRun.SetBold(format.getBold());
var fc = format.getColor();
if (fc) {
oCurRun.SetColor(new CDocumentColor(fc.getR(), fc.getG(), fc.getB()));
}
//font
var font_family = format.getName();
addFont(font_family);
oCurRun.Pr.FontFamily = font_family;
var oFontItem = this.oFonts[font_family];
if (null != oFontItem && null != oFontItem.Name) {
oCurRun.SetRFontsAscii({Name: oFontItem.Name, Index: oFontItem.Index});
oCurRun.SetRFontsHAnsi({Name: oFontItem.Name, Index: oFontItem.Index});
oCurRun.SetRFontsCS({Name: oFontItem.Name, Index: oFontItem.Index});
oCurRun.SetRFontsEastAsia({Name: oFontItem.Name, Index: oFontItem.Index});
}
oCurRun.SetFontSize(format.getSize());
oCurRun.SetItalic(format.getItalic());
oCurRun.SetStrikeout(format.getStrikeout());
oCurRun.SetUnderline(format.getUnderline() !== 2);
oCurRun.SetVertAlign(format.va);
//text
if (true === format.skip || true === format.repeat) {
oCurRun.AddToContent(-1, new AscWord.CRunSpace(), false);
} else {
AscWord.TextToRunElements(value2[n].text, function(runElement) {
oCurRun.AddToContent(-1, runElement, false);
});
}
//add run
if (oCurHyperlink) {
oCurHyperlink.AddToContent(n, oCurRun, false);
} else {
oCurPar.AddToContent(n, oCurRun, false);
}
}
if (oCurHyperlink) {
oCurPar.AddToContent(n, oCurHyperlink, false);
}
j = j + gridSpan - 1;
}
}
return fonts;
},
_convertTableFromExcelForChartTitle: function (aContentExcel) {
var worksheet = aContentExcel.workbook.aWorksheets[0];
var range;
var tempActiveRef = aContentExcel.activeRange;
var activeRange = AscCommonExcel.g_oRangeCache.getAscRange(tempActiveRef);
var t = this;
var fonts = [];
var addFont = function (fontFamily) {
if (!t.aContent.fonts) {
t.aContent.fonts = [];
}
if (!t.oFonts) {
t.oFonts = [];
}
if (!t.oFonts[fontFamily]) {
t.oFonts[fontFamily] = {Name: fontFamily, Index: -1};
fonts.push(new CFont(fontFamily));
}
};
var paragraph = new AscWord.Paragraph(this.oDocument, true);
this.aContent.push(paragraph);
var diffRow = activeRange.r2 - activeRange.r1;
var diffCol = activeRange.c2 - activeRange.c1;
for (var i = 0; i <= diffRow; i++) {
for (var j = 0; j <= diffCol; j++) {
range = worksheet.getCell3(i + activeRange.r1, j + activeRange.c1);
var isMergedCell = range.hasMerged();
var gridSpan = 1;
var vMerge = 1;
if (isMergedCell) {
gridSpan = isMergedCell.c2 - isMergedCell.c1 + 1;
vMerge = isMergedCell.r2 - isMergedCell.r1 + 1;
}
var hyperLink = range.getHyperlink();
var oCurHyperlink = null;
if (hyperLink) {
oCurHyperlink = new ParaHyperlink();
oCurHyperlink.SetParagraph(paragraph);
oCurHyperlink.Set_Value(hyperLink.Hyperlink);
if (hyperLink.Tooltip) {
oCurHyperlink.SetToolTip(hyperLink.Tooltip);
}
}
var value2 = range.getValue2();
for (var n = 0; n < value2.length; n++) {
var oCurRun = new ParaRun(paragraph);
var format = value2[n].format;
//***text property***
oCurRun.Pr.Bold = format.getBold();
var fc = format.getColor();
if (fc) {
oCurRun.Set_Unifill(AscFormat.CreateUnfilFromRGB(fc.getR(), fc.getG(), fc.getB()), true);
}
//font
var font_family = format.getName();
addFont(font_family);
var oFontItem = this.oFonts[font_family];
if (null != oFontItem && null != oFontItem.Name) {
oCurRun.SetRFontsAscii({Name: oFontItem.Name, Index: oFontItem.Index});
oCurRun.SetRFontsHAnsi({Name: oFontItem.Name, Index: oFontItem.Index});
oCurRun.SetRFontsCS({Name: oFontItem.Name, Index: oFontItem.Index});
oCurRun.SetRFontsEastAsia({Name: oFontItem.Name, Index: oFontItem.Index});
}
oCurRun.SetFontSize(format.getSize());
oCurRun.SetItalic(format.getItalic());
oCurRun.SetStrikeout(format.getStrikeout());
oCurRun.SetUnderline(format.getUnderline() !== 2);
//text
var value = value2[n].text;
for (var oIterator = value.getUnicodeIterator(); oIterator.check(); oIterator.next()) {
var nUnicode = oIterator.value();
var Item;
if (0x20 !== nUnicode && 0xA0 !== nUnicode && 0x2009 !== nUnicode) {
Item = new AscWord.CRunText(nUnicode);
} else {
Item = new AscWord.CRunSpace();
}
//add text
oCurRun.AddToContent(-1, Item, false);
}
if (i !== diffRow || j !== diffCol) {
oCurRun.Add_ToContent(oIterator.position(), new AscWord.CRunSpace(), false);
}
//add run
if (oCurHyperlink) {
oCurHyperlink.Add_ToContent(n, oCurRun, false);
} else {
paragraph.Internal_Content_Add(paragraph.Content.length - 1, oCurRun, false);
}
}
if (oCurHyperlink) {
paragraph.Internal_Content_Add(paragraph.Content.length - 1, oCurHyperlink, false);
}
j = j + gridSpan - 1;
}
}
return fonts;
},
_convertTableToPPTX: function (table, isFromWord) {
//TODO пересмотреть обработку для вложенных таблиц(можно сделать так, как при копировании из документов в таблицы)
var oTable = AscFormat.ExecuteNoHistory(function () {
var allRows = [];
this.maxTableCell = 0;
if (isFromWord) {
table = this._replaceInnerTables(table, allRows, true);
}
//convert internal paragraphs
table.bPresentation = true;
for (let nRow = 0; nRow < table.Content.length; nRow++) {
let oRow = table.Content[nRow];
let aCells = oRow.Content;
for (let nCell = 0; nCell < aCells.length; nCell++) {
let oDocContent = aCells[nCell].Content;
oDocContent.bPresentation = true;
let aElements = [].concat(oDocContent.Content);
oDocContent.Content.length = 0;
let nPos = 0;
for(let nElement = 0; nElement < aElements.length; ++nElement) {
let oElement = aElements[nElement];
if(oElement instanceof AscWord.Paragraph) {
let oNewParagraph = AscFormat.ConvertParagraphToPPTX(oElement, null, null, true, false);
oDocContent.Internal_Content_Add(nPos++, oNewParagraph, false);
}
}
if(nPos === 0) {
let oNewParagraph = new AscWord.Paragraph(oDocContent, true);
oDocContent.Internal_Content_Add(0, oNewParagraph, true);
}
}
}
table.SetTableLayout(tbllayout_Fixed);
return table;
}, this, []);
return oTable;
},
_replaceInnerTables: function (table, allRows, isRoot) {
//заменяем внутренние таблички
for (var i = 0; i < table.Content.length; i++) {
allRows[allRows.length] = table.Content[i];
if (this.maxTableCell < table.Content[i].Content.length)
this.maxTableCell = table.Content[i].Content.length;
for (var j = 0; j < table.Content[i].Content.length; j++) {
var cDocumentContent = table.Content[i].Content[j].Content;
cDocumentContent.bPresentation = true;
var k = 0;
for (var n = 0; n < cDocumentContent.Content.length; n++) {
//если нашли внутреннюю табличку
if (cDocumentContent.Content[n] instanceof CTable) {
this._replaceInnerTables(cDocumentContent.Content[n], allRows);
cDocumentContent.Content.splice(n, 1);
n--;
}
}
}
}
//дополняем пустыми ячейками, строки, где ячеек меньше
if (isRoot === true) {
for (var row = 0; row < allRows.length; row++) {
var cells = allRows[row].Content;
var cellsLength = 0;
for (var m = 0; m < cells.length; m++) {
cellsLength += cells[m].GetGridSpan();
}
if (cellsLength < this.maxTableCell) {
for (var cell = cellsLength; cell < this.maxTableCell; cell++) {
allRows[row].Add_Cell(allRows[row].Get_CellsCount(), allRows[row], null, false);
}
}
}
table.Content = allRows;
table.Rows = allRows.length;
}
return table;
},
_createNewPresentationTable: function (grid) {
var presentation = editor.WordControl.m_oLogicDocument;
var graphicFrame = new CGraphicFrame(presentation.Slides[presentation.CurPage]);
var table = new CTable(this.oDocument.DrawingDocument, graphicFrame, false, 0, 0, grid, true);
table.SetTableLayout(tbllayout_Fixed);
graphicFrame.setGraphicObject(table);
graphicFrame.setNvSpPr(new AscFormat.UniNvPr());
return table;
},
_createNewPDFTable: function (grid) {
let oDoc = Asc.editor.getPDFDoc();
let graphicFrame = new AscPDF.CPdfGraphicFrame();
let table = new CTable(oDoc.GetDrawingDocument(), graphicFrame, false, 0, 0, grid, true);
table.SetTableLayout(tbllayout_Fixed);
graphicFrame.setGraphicObject(table);
graphicFrame.setNvSpPr(new AscFormat.UniNvPr());
return table;
},
_getImagesFromExcelShapes: function (aDrawings, aSpTree, aPastedImages, aUrls) {
//пока только распознаём только графические объекты
var sImageUrl, nDrawingsCount, oGraphicObj, bDrawings;
if (Array.isArray(aDrawings)) {
nDrawingsCount = aDrawings.length;
bDrawings = true;
} else if (Array.isArray(aSpTree)) {
nDrawingsCount = aSpTree.length;
bDrawings = false;
} else {
return;
}
for (var i = 0; i < nDrawingsCount; i++) {
if (bDrawings) {
oGraphicObj = aDrawings[i].graphicObject;
} else {
oGraphicObj = aSpTree[i];
}
if (oGraphicObj) {
if (oGraphicObj.spPr) {
if (oGraphicObj.spPr.Fill && oGraphicObj.spPr.Fill.fill && typeof oGraphicObj.spPr.Fill.fill.RasterImageId === "string" && oGraphicObj.spPr.Fill.fill.RasterImageId.length > 0) {
sImageUrl = oGraphicObj.spPr.Fill.fill.RasterImageId;
aPastedImages[aPastedImages.length] = new AscCommon.CBuilderImages(oGraphicObj.spPr.Fill.fill, sImageUrl, null, oGraphicObj.spPr, null);
aUrls[aUrls.length] = sImageUrl;
}
if (oGraphicObj.spPr.ln && oGraphicObj.spPr.ln.Fill && oGraphicObj.spPr.ln.Fill.fill && typeof oGraphicObj.spPr.ln.Fill.fill.RasterImageId === "string" && oGraphicObj.spPr.ln.Fill.fill.RasterImageId.length > 0) {
sImageUrl = oGraphicObj.spPr.ln.Fill.fill.RasterImageId;
aPastedImages[aPastedImages.length] = new AscCommon.CBuilderImages(oGraphicObj.spPr.ln.Fill.fill, sImageUrl, null, oGraphicObj.spPr, oGraphicObj.spPr.ln.Fill.fill.RasterImageId);
aUrls[aUrls.length] = sImageUrl;
}
}
switch (oGraphicObj.getObjectType()) {
case AscDFH.historyitem_type_ImageShape: {
sImageUrl = oGraphicObj.getImageUrl();
if (typeof sImageUrl === "string" && sImageUrl.length > 0) {
aPastedImages[aPastedImages.length] = new AscCommon.CBuilderImages(oGraphicObj.blipFill, sImageUrl, oGraphicObj, null, null);
aUrls[aUrls.length] = sImageUrl;
}
break;
}
case AscDFH.historyitem_type_Shape: {
break;
}
case AscDFH.historyitem_type_ChartSpace: {
break;
}
case AscDFH.historyitem_type_GroupShape: {
this._getImagesFromExcelShapes(null, oGraphicObj.spTree, aPastedImages, aUrls);
break;
}
}
}
}
},
_selectShapesBeforeInsert: function (aNewContent, oDoc) {
var content, drawingObj, allDrawingObj = [];
for (var i = 0; i < aNewContent.length; i++) {
content = aNewContent[i];
drawingObj = content.GetAllDrawingObjects();
if (!drawingObj || (drawingObj && !drawingObj.length) || content.GetType() === type_Table) {
allDrawingObj = null;
break;
}
for (var n = 0; n < drawingObj.length; n++) {
allDrawingObj[allDrawingObj.length] = drawingObj[n];
}
}
if (allDrawingObj && allDrawingObj.length)
this.oLogicDocument.SelectDrawings(allDrawingObj, oDoc);
},
_readFromBinaryExcel: function (base64) {
var oBinaryFileReader = new AscCommonExcel.BinaryFileReader(true);
var tempWorkbook = new AscCommonExcel.Workbook(undefined, undefined, false);
tempWorkbook.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
tempWorkbook.theme = this.oDocument.theme ? this.oDocument.theme : this.oLogicDocument.theme;
if (!tempWorkbook.theme && this.oLogicDocument.Get_Theme)
tempWorkbook.theme = this.oLogicDocument.Get_Theme();
Asc.getBinaryOtherTableGVar(tempWorkbook);
pptx_content_loader.Start_UseFullUrl();
pptx_content_loader.Reader.ClearConnectedObjects();
oBinaryFileReader.Read(base64, tempWorkbook);
pptx_content_loader.Reader.AssignConnectedObjects();
if (!tempWorkbook.aWorksheets.length) {
return null;
}
var arrImages;
//если есть срез в контенте - вставляем только картинку
var _sheet = tempWorkbook.aWorksheets[0];
var pDrawings;
let arrSlicers = null;
let arrControls = null;
if (_sheet) {
arrSlicers = _sheet.aSlicers;
arrControls = _sheet.getDrawingControls();
}
if (arrSlicers && arrSlicers.length || arrControls && arrControls.length) {
if (tempWorkbook.Core && tempWorkbook.Core.subject) {
var _str = tempWorkbook.Core.subject;
var _parseStr = _str.split(";");
var _width = _parseStr[0];
var _height = _parseStr[1];
var _base64 = _str.substring(_width.length + _height.length + 2);
if (_base64 && _width && _height) {
//var drawing = CreateImageFromBinary(_base64, parseFloat(_width), parseFloat(_height));
var drawing = AscFormat.DrawingObjectsController.prototype.createImage(_base64, 0, 0, parseFloat(_width), parseFloat(_height));
arrImages = [new AscCommon.CBuilderImages(new AscFormat.CBlipFill(), _base64, drawing, null, null)];
var objectRender = new AscFormat.DrawingObjects();
var oFlags = {
from: false,
to: false,
pos: false,
ext: false,
editAs: window["AscCommon"].c_oAscCellAnchorType.cellanchorTwoCell
};
var oNewDrawing = objectRender.createDrawingObject();
oNewDrawing.graphicObject = drawing;
pDrawings = [oNewDrawing];
}
}
} else {
arrImages = pptx_content_loader.End_UseFullUrl();
}
return {
workbook: tempWorkbook,
activeRange: oBinaryFileReader.InitOpenManager && oBinaryFileReader.InitOpenManager.copyPasteObj && oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange,
arrImages: arrImages,
pDrawings: pDrawings
};
},
ReadPresentationText: function (stream, worksheet) {
var loader = new AscCommon.BinaryPPTYLoader();
loader.Start_UseFullUrl();
loader.DrawingDocument = worksheet ? worksheet.getDrawingDocument() : editor.WordControl.m_oLogicDocument.DrawingDocument;
loader.stream = stream;
loader.presentation = worksheet ? worksheet.model : editor.WordControl.m_oLogicDocument;
var cDocumentContent;
var isExcel = !!worksheet;
if (!isExcel) {
var presentation = editor.WordControl.m_oLogicDocument;
var shape;
if (presentation.Slides) {
shape = new CShape(presentation.Slides[presentation.CurPage]);
} else {
shape = new CShape(presentation);
}
shape.setTxBody(new AscFormat.CTextBody(shape));
//читаем контент, здесь только параграфы
cDocumentContent = new AscFormat.CDrawingDocContent(shape.txBody, editor.WordControl.m_oDrawingDocument, 0, 0, 0, 0, false, false);
} else {
cDocumentContent = worksheet;
}
var elements = [], paragraph, selectedElement;
var count = stream.GetULong() / 100000;
for (var i = 0; i < count; ++i) {
//loader.stream.Skip2(1); // must be 0
var selectedAll = stream.GetUChar();
paragraph = loader.ReadParagraph(cDocumentContent);
if (isExcel) {
elements.push(paragraph);
} else {
//FONTS
paragraph.Document_Get_AllFontNames(this.oFonts);
selectedElement = new AscCommonWord.CSelectedElement();
selectedElement.Element = paragraph;
if (selectedAll === 1) {
selectedElement.SelectedAll = true;
}
elements.push(selectedElement);
}
}
return elements;
},
ReadPresentationShapes: function (stream) {
var loader = new AscCommon.BinaryPPTYLoader();
loader.Start_UseFullUrl();
loader.ClearConnectedObjects();
pptx_content_loader.Reader.Start_UseFullUrl();
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var presentation = editor.WordControl.m_oLogicDocument;
var count = stream.GetULong();
var arr_shapes = [];
var arr_transforms = [];
var cStyle;
var foundTableStylesIdMap = {};
for (var i = 0; i < count; ++i) {
loader.TempMainObject = presentation && presentation.Slides ? presentation.Slides[presentation.CurPage] : presentation;
var style_index = null;
//читаем флаг о наличии табличного стиля
if (!loader.stream.GetBool()) {
if (loader.stream.GetBool()) {
loader.stream.Skip2(1);
cStyle = loader.ReadTableStyle(true);
loader.stream.GetBool();
style_index = stream.GetString2();
}
}
var drawing = loader.ReadGraphicObject();
//для случая, когда копируем 1 таблицу из презентаций, в бинарник заносим ещё одну такую же табличку, но со скомпилированными стилями(для вставки в word/excel)
if (count === 1 && typeof AscFormat.CGraphicFrame !== "undefined" && drawing instanceof AscFormat.CGraphicFrame) {
//в презентациях пропускаю чтение ещё раз графического объекта
if (presentation.Slides) {
loader.stream.Skip2(1);
loader.stream.SkipRecord();
} else {
drawing = loader.ReadGraphicObject();
}
}
var x = stream.GetULong() / 100000;
var y = stream.GetULong() / 100000;
var extX = stream.GetULong() / 100000;
var extY = stream.GetULong() / 100000;
var base64 = stream.GetString2();
if (presentation.Slides)
arr_shapes[i] = new DrawingCopyObject();
else
arr_shapes[i] = {};
arr_shapes[i].Drawing = drawing;
arr_shapes[i].X = x;
arr_shapes[i].Y = y;
arr_shapes[i].ExtX = extX;
arr_shapes[i].ExtY = extY;
if (!presentation.Slides)
arr_shapes[i].base64 = base64;
if (style_index != null && arr_shapes[i].Drawing.graphicObject && arr_shapes[i].Drawing.graphicObject.Set_TableStyle) {
if (!PasteElementsId.g_bIsDocumentCopyPaste) {
//TODO продумать добавления нового стиля(ReadTableStyle->получуть id нового стиля, сравнить новый стиль со всеми присутвующими.если нет - добавить и сделать Set_TableStyle(id))
if (foundTableStylesIdMap[style_index]) {
arr_shapes[i].Drawing.graphicObject.Set_TableStyle(foundTableStylesIdMap[style_index], true);
} else if (cStyle && presentation.globalTableStyles && presentation.globalTableStyles.Style) {
var isFoundStyle = false;
for (var j in presentation.globalTableStyles.Style) {
//TODO isEqual - сравнивает ещё и имя стиля. для случая, когда одинаковый контент, но имя стиля разное, не подойдет это сравнение
if (presentation.globalTableStyles.Style[j].isEqual(cStyle)) {
arr_shapes[i].Drawing.graphicObject.Set_TableStyle(j, true);
foundTableStylesIdMap[style_index] = j;
isFoundStyle = true;
break;
}
}
//в данном случае добавляем новый стиль
if (!isFoundStyle) {
//TODO при добавлении нового стиля - падение. пересмотреть!
/*var newIndexStyle = presentation.globalTableStyles.Add(cStyle);
presentation.TableStylesIdMap[newIndexStyle] = true;
arr_shapes[i].Drawing.graphicObject.Set_TableStyle(newIndexStyle, true);
foundTableStylesIdMap[style_index] = newIndexStyle;*/
}
} else if (presentation.TableStylesIdMap[style_index]) {
arr_shapes[i].Drawing.graphicObject.Set_TableStyle(style_index, true);
}
} else if (cStyle) {
//пока не применяем стили, посольку они отличаются
//this._applyStylesToTable(arr_shapes[i].Drawing.graphicObject, cStyle);
}
}
}
var chartImages = pptx_content_loader.Reader.End_UseFullUrl();
var images = loader.End_UseFullUrl();
loader.AssignConnectedObjects();
var allImages = chartImages.concat(images);
return {arrShapes: arr_shapes, arrImages: allImages, arrTransforms: arr_transforms};
},
ReadPresentationSlides: function (stream) {
var loader = new AscCommon.BinaryPPTYLoader();
loader.Start_UseFullUrl();
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var presentation = editor.WordControl.m_oLogicDocument;
var count = stream.GetULong();
var arr_slides = [];
var slide;
for (var i = 0; i < count; ++i) {
loader.ClearConnectedObjects();
slide = loader.ReadSlide(0);
loader.AssignConnectedObjects();
arr_slides.push(slide);
}
return arr_slides;
},
ReadSlide: function (stream) {
var loader = new AscCommon.BinaryPPTYLoader();
loader.Start_UseFullUrl();
loader.stream = stream;
loader.presentation = editor.WordControl.m_oLogicDocument;
loader.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var presentation = editor.WordControl.m_oLogicDocument;
return loader.ReadSlide(0);
},
_Prepeare: function (node, fCallback) {
var oThis = this;
if (true === this.bUploadImage || true === this.bUploadFonts || this.pasteTextIntoList) {
//Пробегаемся по документу собираем список шрифтов и картинок.
var aPrepeareFonts;
if (this.pasteTextIntoList) {
this._Prepeare_recursive(node, true);
fCallback();
return;
} else {
aPrepeareFonts = this._Prepeare_recursive(node, true, true);
}
//TODO пересмотреть все "local" и сделать одинаковые проверки во всех редакторах
var aImagesToDownload = [];
var _mapLocal = {};
var originalSrcArr = [];
for (var image in this.oImages) {
var src = this.oImages[image];
if (undefined !== window["native"] && undefined !== window["native"]["GetImageUrl"]) {
this.oImages[image] = window["native"]["GetImageUrl"](this.oImages[image]);
} else if (!g_oDocumentUrls.getImageLocal(src)) {
if (oThis.rtfImages && oThis.rtfImages[src]) {
aImagesToDownload.push(oThis.rtfImages[src]);
originalSrcArr.push(src);
} else {
aImagesToDownload.push(src);
originalSrcArr.push(src);
}
}
}
if (aImagesToDownload.length > 0) {
AscCommon.sendImgUrls(oThis.api, aImagesToDownload, function (data) {
var image_map = {};
var isError = false;
for (var i = 0, length = Math.min(data.length, aImagesToDownload.length); i < length; ++i) {
var elem = data[i];
var sFrom = originalSrcArr[i] ? originalSrcArr[i] : aImagesToDownload[i];
if ("error" === elem.url) {
isError = true;
}
if (null != elem.url) {
var name = g_oDocumentUrls.imagePath2Local(elem.path);
oThis.oImages[sFrom] = name;
image_map[i] = name;
} else {
image_map[i] = sFrom;
}
}
if (isError && PasteElementsId.g_bIsDocumentCopyPaste) {
oThis.api.sendEvent("asc_onError", c_oAscError.ID.CanNotPasteImage, c_oAscError.Level.NoCritical);
}
fCallback(aPrepeareFonts, image_map);
}, true);
} else {
fCallback(aPrepeareFonts, this.oImages);
}
} else {
fCallback();
}
},
_Prepeare_recursive: function (node, bIgnoreStyle, isCheckFonts) {
//пробегаемся по всему дереву, собираем все шрифты и картинки
var nodeName = node.nodeName.toLowerCase();
var nodeType = node.nodeType;
if (!bIgnoreStyle) {
if (Node.TEXT_NODE === nodeType) {
var computedStyle = this._getComputedStyle(node.parentNode);
var fontFamily = CheckDefaultFontFamily(this._getStyle(node.parentNode, computedStyle, "font-family"), this.apiEditor);
if (fontFamily) {
this.oFonts[fontFamily] = {
Name: g_fontApplication.GetFontNameDictionary(fontFamily, true),
Index: -1
};
}
} else if ("w:sdt" === nodeName && node.getAttribute && node.getAttribute("checkbox")) {
let isForm = node && node.attributes && "t" === node.getAttribute("form");
let checkedFont = node.getAttribute("checkboxfontchecked");
if (!checkedFont) {
checkedFont = isForm ? Asc.c_oAscSdtCheckBoxDefaults.FormCheckedFont : Asc.c_oAscSdtCheckBoxDefaults.CheckedFont;
}
this.oFonts[checkedFont] = {
Name: g_fontApplication.GetFontNameDictionary(checkedFont, true),
Index: -1
};
let uncheckedFont = node.getAttribute("checkboxfontunchecked");
if (!uncheckedFont) {
uncheckedFont = isForm ? Asc.c_oAscSdtCheckBoxDefaults.FormUncheckedFont : Asc.c_oAscSdtCheckBoxDefaults.UncheckedFont;
}
this.oFonts[uncheckedFont] = {
Name: g_fontApplication.GetFontNameDictionary(uncheckedFont, true),
Index: -1
};
} else {
var src = node.getAttribute("src");
if (src && !this._checkSkipMath(node))
this.oImages[src] = src;
}
}
for (var i = 0, length = node.childNodes.length; i < length; i++) {
var child = node.childNodes[i];
//get comment
var style = child.getAttribute ? child.getAttribute("style") : null;
if (style && -1 !== style.indexOf("mso-element:comment") && -1 === style.indexOf("mso-element:comment-list")) {
this._parseMsoElementComment(child);
}
if (this.pasteTextIntoList && (nodeName === "li" || nodeName === "ol" || nodeName === "ul" || (style && -1 !== style.indexOf("mso-list")))) {
this.pasteTextIntoList = null;
}
//принудительно добавляю для математики шрифт Cambria Math
if ((child && (child.nodeName.toLowerCase() === "#comment" && this.isSupportPasteMathContent(child.nodeValue, true)
&& this.apiEditor["asc_isSupportFeature"]("ooxml")) || child.nodeName.toLowerCase() === "math" ||
(child.className && child.className.indexOf && -1 !== child.className.indexOf("oo-latex")) ||
(style && -1 !== style.indexOf("oo-latex"))) && !this.pasteInExcel) {
//TODO пока только в документы разрешаю вставку математики математику
var mathFont = "Cambria Math";
this.oFonts[mathFont] = {
Name: g_fontApplication.GetFontNameDictionary(mathFont, true),
Index: -1
};
}
var child_nodeType = child.nodeType;
if (!(Node.ELEMENT_NODE === child_nodeType || Node.TEXT_NODE === child_nodeType))
continue;
//попускам элеметы состоящие только из \t,\n,\r
if (Node.TEXT_NODE === child.nodeType) {
var value = child.nodeValue;
if (!value)
continue;
value = value.replace(/(\r|\t|\n)/g, '');
if ("" == value)
continue;
}
this._Prepeare_recursive(child, false);
}
if (isCheckFonts) {
var aPrepeareFonts = [];
for (var font_family in this.oFonts) {
//todo подбирать шрифт, хотябы по регистру
var oFontItem = this.oFonts[font_family];
//Ищем среди наших шрифтов
this.oFonts[font_family].Index = -1;
aPrepeareFonts.push(new CFont(oFontItem.Name));
}
return aPrepeareFonts;
}
},
_parseMsoElementComment: function (node) {
var msoTextNode = node.getElementsByClassName("MsoCommentText");
if (msoTextNode && msoTextNode[0]) {
var msoComment = this._getMsoCommentText(msoTextNode[0]);
var msoCommentId = msoTextNode[0].parentElement.id;
//в качестве id использую индекс из id у родительского элемента
//id вида _com_1
if (msoCommentId) {
var id = msoCommentId.split("_com_");
if (id && undefined !== id[1]) {
this.msoComments[id[1]] = {text: msoComment, start: false};
}
}
}
},
_checkSkipMath: function (node) {
if (!this.pasteInExcel && this.apiEditor["asc_isSupportFeature"]("ooxml")) {
let parent = node && node.parentNode;
if (parent && parent.nodeName.toLowerCase() === "span") {
parent = parent && parent.parentNode;
}
if (parent && (parent.nodeName.toLowerCase() === "p" || parent.nodeName.toLowerCase() === "body")) {
for (let i = 0; i < parent.childNodes.length; i++) {
let child = parent.childNodes[i];
if (child && child.nodeName.toLowerCase() === "#comment" && this.isSupportPasteMathContent(child.nodeValue, true)) {
return true;
}
}
}
}
return false;
},
_getMsoCommentText: function (node) {
var res = "";
var bMsoAnnotation = false;
var elems = node.childNodes;
if (elems && elems.length) {
for (var i = 0; i < elems.length; i++) {
var child = elems[i];
//нужно исключить
//пока собираем только текст(не форматированный), в дальнейшем, когда будет полная поддержка отображения
//коментариев, можно преобразовывать уже в структуру и вставлять в комм. форматированный текст
if (child.nodeName === "#comment") {
if (child.nodeValue === "[if !supportAnnotations]") {
bMsoAnnotation = true;
} else if (bMsoAnnotation && child.nodeValue === "[endif]") {
bMsoAnnotation = false;
}
}
if (bMsoAnnotation) {
continue;
}
if (Node.TEXT_NODE === child.nodeType) {
var value = child.nodeValue;
//пропускаем неразрывный пробел перед комментарием
if (value === " " && child.parentElement && child.parentElement.getAttribute("style") === "mso-special-character:comment") {
continue;
}
if (!value) {
continue;
}
value = value.replace(/(\r|\t|\n)/g, '');
if ("" === value) {
continue;
}
res += value;
} else {
res += this._getMsoCommentText(child);
}
}
}
return res;
},
_checkFontsOnLoad: function (fonts) {
if (!fonts)
return;
return fonts;
},
_IsBlockElem: function (name) {
if ("p" === name || "div" === name || "ul" === name || "ol" === name || "li" === name || "table" === name || "tbody" === name || "tr" === name || "td" === name || "th" === name ||
"h1" === name || "h2" === name || "h3" === name || "h4" === name || "h5" === name || "h6" === name || "center" === name || "dd" === name || "dt" === name)
return true;
return false;
},
_getComputedStyle: function (node) {
var computedStyle = null;
if (null != node && Node.ELEMENT_NODE === node.nodeType) {
var defaultView = node.ownerDocument.defaultView;
computedStyle = defaultView.getComputedStyle(node, null);
}
return computedStyle;
},
_getStyle: function (node, computedStyle, styleProp) {
var getStyle = function () {
var style = null;
if (computedStyle) {
style = computedStyle.getPropertyValue(styleProp);
}
if (!style) {
if (node && node.currentStyle) {
style = node.currentStyle[styleProp];
}
}
return style;
};
var res = getStyle();
var sNodeName = node.nodeName.toLowerCase();
if (!res) {
switch (styleProp) {
case "font-family": {
res = node.fontFamily;
break;
}
case "background-color": {
res = node.style.backgroundColor;
if ("td" === sNodeName && !res) {
res = node.bgColor;
}
break;
}
case "font-weight": {
res = node.style.fontWeight;
}
}
}
return res;
},
_ParseColor: function (color) {
if (!color || color.length == 0) {
return null;
}
if ("transparent" === color) {
return null;
}
if ("aqua" === color) {
return new CDocumentColor(0, 255, 255);
} else if ("black" === color) {
return new CDocumentColor(0, 0, 0);
} else if ("blue" === color) {
return new CDocumentColor(0, 0, 255);
} else if ("fuchsia" === color) {
return new CDocumentColor(255, 0, 255);
} else if ("gray" === color) {
return new CDocumentColor(128, 128, 128);
} else if ("green" === color) {
return new CDocumentColor(0, 128, 0);
} else if ("lime" === color) {
return new CDocumentColor(0, 255, 0);
} else if ("maroon" === color) {
return new CDocumentColor(128, 0, 0);
} else if ("navy" === color) {
return new CDocumentColor(0, 0, 128);
} else if ("olive" === color) {
return new CDocumentColor(128, 128, 0);
} else if ("purple" === color) {
return new CDocumentColor(128, 0, 128);
} else if ("red" === color) {
return new CDocumentColor(255, 0, 0);
} else if ("silver" === color) {
return new CDocumentColor(192, 192, 192);
} else if ("teal" === color) {
return new CDocumentColor(0, 128, 128);
} else if ("white" === color) {
return new CDocumentColor(255, 255, 255);
} else if ("yellow" === color) {
return new CDocumentColor(255, 255, 0);
} else if ("cyan" === color) {
return new CDocumentColor(0, 255, 255);
} else if ("magenta" === color) {
return new CDocumentColor(255, 0, 255);
} else if ("darkblue" === color) {
return new CDocumentColor(0, 0, 139);
} else if ("darkcyan" === color) {
return new CDocumentColor(0, 139, 139);
} else if ("darkGreen" === color) {
return new CDocumentColor(0, 100, 0);
} else if ("darkmagenta" === color) {
return new CDocumentColor(128, 0, 128);
} else if ("darkRed" === color) {
return new CDocumentColor(139, 0, 0);
} else if ("darkyellow" === color) {
return new CDocumentColor(128, 128, 0);
} else if ("darkgray" === color) {
return new CDocumentColor(169, 169, 169);
} else if ("lightgray" === color) {
return new CDocumentColor(211, 211, 211);
} else {
var r, g, b;
if (0 === color.indexOf("#")) {
var hex = color.substring(1);
if (hex.length === 3) {
hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
}
if (hex.length === 6) {
r = parseInt("0x" + hex.substring(0, 2));
g = parseInt("0x" + hex.substring(2, 4));
b = parseInt("0x" + hex.substring(4, 6));
return new CDocumentColor(r, g, b);
}
}
if (0 === color.indexOf("rgb")) {
var nStart = color.indexOf('(');
var nEnd = color.indexOf(')');
if (-1 !== nStart && -1 !== nEnd && nStart < nEnd) {
var temp = color.substring(nStart + 1, nEnd);
var aParems = temp.split(',');
if (aParems.length >= 3) {
if (aParems.length >= 4) {
var oA = AscCommon.valueToMmType(aParems[3]);
if (0 == oA.val)//полностью прозрачный
{
return null;
}
}
var oR = AscCommon.valueToMmType(aParems[0]);
var oG = AscCommon.valueToMmType(aParems[1]);
var oB = AscCommon.valueToMmType(aParems[2]);
if (oR && "%" === oR.type) {
r = parseInt(255 * oR.val / 100);
} else {
r = oR.val;
}
if (oG && "%" === oG.type) {
g = parseInt(255 * oG.val / 100);
} else {
g = oG.val;
}
if (oB && "%" === oB.type) {
b = parseInt(255 * oB.val / 100);
} else {
b = oB.val;
}
return new CDocumentColor(r, g, b);
}
}
}
}
return null;
}, _isEmptyProperty: function (prop) {
var bIsEmpty = true;
for (var i in prop) {
if (null != prop[i]) {
bIsEmpty = false;
break;
}
}
return bIsEmpty;
},
_set_pPr: function (node, Para, pNoHtmlPr) {
//Пробегаемся вверх по дереву в поисках блочного элемента
var t = this;
var sNodeName = node.nodeName.toLowerCase();
if (node !== this.oRootNode) {
while (false === this._IsBlockElem(sNodeName)) {
if (this.oRootNode !== node.parentNode) {
node = node.parentNode;
sNodeName = node.nodeName.toLowerCase();
} else {
break;
}
}
}
var _applyTextAlign = function () {
let text_align;
if (node.style && node.align && !node.style.textAlign) {
//some editors(LO) put old attr -> align, and skip text-align
text_align = node.align;
} else {
text_align = t._getStyle(node, computedStyle, "text-align");
}
if (text_align) {
//Может приходить -webkit-right
let Jc = null;
if (-1 !== text_align.indexOf('center')) {
Jc = align_Center;
} else if (-1 !== text_align.indexOf('right')) {
Jc = align_Right;
} else if (-1 !== text_align.indexOf('justify')) {
Jc = align_Justify;
}
if (null != Jc) {
Para.Set_Align(Jc, false);
}
}
};
var computedStyle = this._getComputedStyle(node);
if ("td" === sNodeName || "th" === sNodeName) {
_applyTextAlign();
//для случая
Rich plain textf
//
//
//
//
//
//
//