/* * (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 {jQuery} $ * @param {Window} window * @param {undefined} undefined */ function ($, window, undefined) { /* * Import * ----------------------------------------------------------------------------- */ var prot; var c_oAscBorderStyles = Asc.c_oAscBorderStyles; var c_oAscMaxCellOrCommentLength = Asc.c_oAscMaxCellOrCommentLength; var doc = window.document; var copyPasteUseBinary = true; var CopyPasteCorrectString = AscCommon.CopyPasteCorrectString; var c_oSpecialPasteProps = Asc.c_oSpecialPasteProps; var c_MaxStringLength = 536870888; var notSupportExternalReferenceFileFormat = {"csv": 1}; function number2color(n) { if (typeof (n) === "string" && n.indexOf("rgb") > -1) return n; return "rgb(" + (n >> 16 & 0xFF) + "," + (n >> 8 & 0xFF) + "," + (n & 0xFF) + ")"; } function CSpecialPasteProps() { this.cellStyle = null; this.val = null; this.numFormat = null; this.formula = null; this.font = null; this.alignVertical = null; this.alignHorizontal = null; this.fontSize = null; this.fontName = null; this.merge = null; this.borders = null; this.wrap = null; this.fill = null; this.angle = null; this.hyperlink = null; this.format = null; this.formatTable = null; this.images = null; this.width = null; this.transpose = null; this.comment = null; //for paste text as csv this.advancedOptions = null; this.operation = null; this.skipBlanks = null; this.init(); } CSpecialPasteProps.prototype = { constructor: CSpecialPasteProps, init: function () { this.setBaseOptions(); }, setBaseOptions: function (onlyMain) { this.cellStyle = true; this.val = true; this.numFormat = true; this.formula = true; this.font = true; this.alignVertical = true; this.alignHorizontal = true; this.fontSize = true; this.fontName = true; this.merge = true; this.borders = true; this.wrap = true; this.fill = true; this.angle = true; this.hyperlink = true; this.format = true; this.formatTable = true; this.images = true; this.width = null; this.transpose = null; this.comment = true; this.property = null; this.advancedOptions = null; if (!onlyMain) { this.operation = null; this.skipBlanks = null; } }, _clean: function () { this.cellStyle = null; this.val = null; this.numFormat = null; this.formula = null; this.font = null; this.alignVertical = null; this.alignHorizontal = null; this.fontSize = null; this.fontName = null; this.merge = null; this.borders = null; this.wrap = null; this.fill = null; this.angle = null; this.hyperlink = null; this.format = null; this.formatTable = null; this.images = null; this.width = null; this.transpose = null; this.comment = null; //for paste text as csv this.advancedOptions = null; //this.operation = null; this.skipBlanks = null; }, asc_setProps: function (props) { this.setBaseOptions(true); this.property = props; switch (props) { case c_oSpecialPasteProps.paste: { break; } case c_oSpecialPasteProps.pasteOnlyFormula: { //только формулы(или значения) this._clean(); this.formula = true; this.val = true; break; } case c_oSpecialPasteProps.formulaNumberFormat: { //только формулы(или значения) и числовой формат this._clean(); this.formula = true; this.numFormat = true; this.val = true; break; } case c_oSpecialPasteProps.formulaAllFormatting: { //формулы и формат break; } case c_oSpecialPasteProps.formulaWithoutBorders: { //всё кроме бордеров this.borders = null; break; } case c_oSpecialPasteProps.formulaColumnWidth: { this.width = true; break; } case c_oSpecialPasteProps.mergeConditionalFormating: { break; } case c_oSpecialPasteProps.pasteOnlyValues: { //только значения(вместо формул также вставляются значения) this._clean(); this.val = true; break; } case c_oSpecialPasteProps.valueNumberFormat: { this._clean(); this.val = true; this.numFormat = true; break; } case c_oSpecialPasteProps.valueAllFormating: { //все кроме формул this.formula = null; this.formatTable = null; break; } case c_oSpecialPasteProps.pasteOnlyFormating: { this.formula = null; this.val = null; this.formatTable = null; break; } case c_oSpecialPasteProps.transpose: { this.transpose = true; break; } case c_oSpecialPasteProps.link: { this._clean(); break; } case c_oSpecialPasteProps.picture: { break; } case c_oSpecialPasteProps.linkedPicture: { break; } case c_oSpecialPasteProps.sourceformatting: { break; } case c_oSpecialPasteProps.destinationFormatting: { //только значения(вместо формул также вставляются значения) this._clean(); this.val = true; //картинки из word сохраняем в данной ситуации if (window['AscCommon'].g_specialPasteHelper.specialPasteData.pasteFromWord) { this.images = true; } break; } case c_oSpecialPasteProps.comments: { this._clean(); this.comment = true; break; } case c_oSpecialPasteProps.columnWidth: { this._clean(); this.width = true; break; } } }, asc_getProps: function () { return this.property; }, asc_setAdvancedOptions: function (props) { this.advancedOptions = props; }, asc_getAdvancedOptions: function () { return this.advancedOptions; }, asc_setOperation: function (val) { this.operation = val; }, asc_getOperation: function () { return this.operation; }, asc_setTranspose: function (val) { this.transpose = val; }, asc_setSkipBlanks: function (val) { this.skipBlanks = val; }, asc_getTableAllowed: function () { return this.formatTable; } }; /** @constructor */ function Clipboard() { this.copyProcessor = new CopyProcessorExcel(); this.pasteProcessor = new PasteProcessorExcel(); return this; } Clipboard.prototype.checkCopyToClipboard = function (ws, _clipboard, _formats) { var _data = null; var wb = window["Asc"]["editor"].wb; window['AscCommon'].g_specialPasteHelper.SpecialPasteButton_Hide(); ws.handlers.trigger("cleanCutData", true); wb.handlers.trigger("cleanCopyData", true); if (wb.getCellEditMode())//text in cell { //only TEXT var fragments = wb.cellEditor.copySelection(); if (null !== fragments) { _data = AscCommonExcel.getFragmentsText(fragments); } if (null !== _data) { _clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Text, _data); } } else { if (!this.copyProcessor.canCopy(ws)) { var selectedDrawings = ws.objectRender.getSelectedGraphicObjects(); if (0 === selectedDrawings.length) { ws.handlers.trigger("onErrorEvent", Asc.c_oAscError.ID.CopyMultiselectAreaError, Asc.c_oAscError.Level.NoCritical); return; } } wb.model.checkProtectedValue = true; //ignore hidden rows var activeCell = ws.model.selectionRange.activeCell.clone(); var activeRange, selectionRange; if (1 !== ws.model.selectionRange.ranges.length) { selectionRange = new AscCommonExcel.MultiplyRange(ws.model.selectionRange.ranges).getUnionRange(); activeRange = ws.model.getRange3(selectionRange.r1, selectionRange.c1, selectionRange.r2, selectionRange.c2); } else { activeRange = ws.getSelectedRange(); selectionRange = ws.model.selectionRange.getLast(); } //TODO игнорировать нужно и формулы и скрытые строчки в случае, если селект их задевает + стандартные условия в bIsExcludeHiddenRows if (ws.model.autoFilters.bIsExcludeHiddenRows(selectionRange, activeCell, true)) { ws.model.excludeHiddenRows(true); ws.model.ignoreWriteFormulas(true); } // IMAGE if (_formats & AscCommon.c_oAscClipboardDataFormat.Image) { let imageData = this.drawSelectedArea(ws, true); if (imageData) { _clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Image, imageData); } } //TEXT if (AscCommon.c_oAscClipboardDataFormat.Text & _formats) { _data = this.copyProcessor.getText(activeRange, ws); if (null !== _data) { _clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Text, _data); } } //HTML if (AscCommon.c_oAscClipboardDataFormat.Html & _formats) { _data = this.copyProcessor.getHtml(activeRange, ws); if (null !== _data && "" !== _data.html) { _clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Html, _data.html) } } //INTERNAL if (AscCommon.c_oAscClipboardDataFormat.Internal & _formats) { if (window["NATIVE_EDITOR_ENJINE"]) { _data = this.copyProcessor.getBinaryForMobile(); } else { if (_data && _data.base64) { _data = _data.base64; } else { _data = this.copyProcessor.getBinaryForCopy(ws.model, ws.objectRender); } } if (null !== _data) { _clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Internal, _data); } } ws.model.excludeHiddenRows(false); ws.model.ignoreWriteFormulas(false); wb.model.checkProtectedValue = false; } if (ws && ws.workbook && !ws.workbook.getCellEditMode()) { if (AscCommon.g_clipboardBase.bCut) { //в данном случае не вырезаем, а записываем if (!ws.isNeedSelectionCut() && false === ws.isMultiSelect()) { ws.workbook.cutIdSheet = ws.model.Id; ws.setCutRange([ws.model.selectionRange.getLast()]); } } else if (!ws.objectRender.selectedGraphicObjectsExists()) { ws.setCutRange(ws.model.selectionRange.ranges); } } }; Clipboard.prototype.pasteData = function (ws, _format, data1, data2, text_data, bIsSpecialPaste, doNotShowButton, isPasteAll, callback) { var t = this; var wb = window["Asc"]["editor"].wb; //if open range dialog - return if (ws.getSelectionDialogMode() && (!wb.getCellEditMode() || wb.isWizardMode)) { if (callback) { callback(false); } return; } var cellEditor = wb.cellEditor; t.pasteProcessor.clean(); // Set the paste callback AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = callback; if (!window['AscCommon'].g_specialPasteHelper.specialPasteStart) { window['AscCommon'].g_specialPasteHelper.SpecialPasteButton_Hide(); } window['AscCommon'].g_specialPasteHelper.Paste_Process_Start(doNotShowButton); if (!bIsSpecialPaste && !wb.getCellEditMode()) { window['AscCommon'].g_specialPasteHelper.specialPasteData.activeRange = ws.model.selectionRange.clone(ws.model); window['AscCommon'].g_specialPasteHelper.specialPasteData.pasteFromWord = false; } switch (_format) { case AscCommon.c_oAscClipboardDataFormat.HtmlElement: { if (wb.getCellEditMode()) { //fragments = пока только для плагина вставка символов var fragments; if (window['AscCommon'].g_clipboardBase.bSaveFormat) { //проверяем иероглифы внутри fragments = this.pasteProcessor._getFragmentsFromHtml(data1); } if (fragments) { var pasteFragments = fragments.fragments; var newFonts = fragments.fonts; ws._loadFonts(newFonts, function () { cellEditor.paste(pasteFragments); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); //TODO пересмотреть! по возможности вызывать из меню! //при использовании рекдактора ячейки в качестве редактора HF //в функции onLongActionEnd(ф-я меню) не вызывается asc_enableKeyEvents(true) //из-за этого enableKeyEvents остаётся выставленным в false //поэтому приходится вызывать здесь, после того, как пройдет загрузка шрифтов if (cellEditor.getMenuEditorMode()) { window["Asc"]["editor"].asc_enableKeyEvents(true); } }); } else { this._pasteTextInCellEditor(text_data || data1.innerText); } } else { t.pasteProcessor.editorPasteExec(ws, data1, null, callback); } break; } case AscCommon.c_oAscClipboardDataFormat.Internal: { if (wb.getCellEditMode()) { if (null !== text_data && undefined !== text_data) { this._pasteTextInCellEditor(text_data); } else { this._pasteTextInCellEditor(this.pasteProcessor.pasteFromBinary(ws, data1, true)); } } else { t.pasteProcessor.pasteFromBinary(ws, data1, null, isPasteAll); } break; } case AscCommon.c_oAscClipboardDataFormat.Text: { if (wb.getCellEditMode()) { this._pasteTextInCellEditor(data1); } else { //не показываем иконку с/в если вставляется только текст //window['AscCommon'].g_specialPasteHelper.Special_Paste_Hide_Button(); t.pasteProcessor.pasteTextOnSheet(ws, data1); } wb.handlers.trigger("cleanCopyData", true); break; } } //ws.handlers.trigger("cleanCutData", true); if (!bIsSpecialPaste) { 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; } }; Clipboard.prototype._pasteTextInCellEditor = function (text) { if (!text) { return; } var editor = window["Asc"]["editor"]; AscFonts.FontPickerByCharacter.getFontsByString(text); editor._loadFonts([], function () { editor.wb.skipHelpSelector = true; editor.wb.cellEditor.pasteText(text); AscCommon.g_specialPasteHelper.Paste_Process_End(); editor.wb.skipHelpSelector = false; if (editor.wb.cellEditor.getMenuEditorMode()) { editor.asc_enableKeyEvents(true); } }); }; Clipboard.prototype.drawSelectedArea = function (ws, opt_get_bytes) { let activeRange = ws.model.selectionRange.getLast(); // Canvas limitations for different browsers: // Chrome/Edge: 32767px x 32767px // Firefox: 32767px x 32767px // Safari: 4096px x 4096px (most restrictive) // IE9+: 8192px x 8192px // IE8: 4096px x 4096px let maxCanvasHeight, maxCanvasWidth, maxCanvasArea; if (AscCommon.AscBrowser.isIE) { maxCanvasHeight = 8192; maxCanvasWidth = 8192; maxCanvasArea = 8192 * 8192; } else if (AscCommon.AscBrowser.isSafariMacOs) { // Safari (not Chrome) maxCanvasHeight = 4096; maxCanvasWidth = 4096; maxCanvasArea = 4096 * 4096; } else { // Chrome, Firefox, Edge and other modern browsers // Reducing limits. Experimentally determined that when height exceeds 16383px, text rendering speed (fillText) drops by tens of times // Setting limits with safety margin maxCanvasHeight = 8192; maxCanvasWidth = 8192; maxCanvasArea = 8192 * 8192; } let estimatedHeight = ws._getRowTop(activeRange.r2 + 1) - ws._getRowTop(activeRange.r1); let estimatedWidth = ws._getColLeft(activeRange.c2 + 1) - ws._getColLeft(activeRange.c1); // Check height limitations if (estimatedHeight > maxCanvasHeight) { let currentHeight = 0; let maxRow = activeRange.r1; for (let row = activeRange.r1; row <= activeRange.r2; row++) { let rowHeight = ws._getRowHeight(row); if (currentHeight + rowHeight > maxCanvasHeight) { break; } currentHeight += rowHeight; maxRow = row; } activeRange = new Asc.Range(activeRange.c1, activeRange.r1, activeRange.c2, maxRow); estimatedHeight = ws._getRowTop(activeRange.r2 + 1) - ws._getRowTop(activeRange.r1); } // Check width limitations if (estimatedWidth > maxCanvasWidth) { let currentWidth = 0; let maxCol = activeRange.c1; for (let col = activeRange.c1; col <= activeRange.c2; col++) { let colWidth = ws._getColLeft(col + 1) - ws._getColLeft(col); if (currentWidth + colWidth > maxCanvasWidth) { break; } currentWidth += colWidth; maxCol = col; } activeRange = new Asc.Range(activeRange.c1, activeRange.r1, maxCol, activeRange.r2); estimatedWidth = ws._getColLeft(activeRange.c2 + 1) - ws._getColLeft(activeRange.c1); } //TODO cut by max size if (estimatedHeight * estimatedWidth >= maxCanvasArea) { return; } let base64; let ctx = ws.workbook.printForCopyPaste(ws, activeRange, true); if (ctx && ctx.canvas) { base64 = ctx.canvas.toDataURL("image/png"); } if (opt_get_bytes && base64) { // Get base64 data without header let base64Data = base64.split(',')[1]; // Convert base64 to binary let byteCharacters = atob(base64Data); let byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += 512) { let slice = byteCharacters.slice(offset, offset + 512); let byteNumbers = new Array(slice.length); for (let i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } let byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } return byteArrays; } // Get image data return base64; }; function CCopyPasteExcelOptions() { this.isExcel = true; this.wb = null; this.cachedWbBinaryData = null; this.oldWorkbookCoreParameters = {}; } CCopyPasteExcelOptions.prototype.setOldWorkbookCoreParameters = function (oldCreator, oldIdentifier, oldLanguage, oldTitle, oldCategory, oldContentStatus) { this.oldWorkbookCoreParameters.oldCreator = oldCreator; this.oldWorkbookCoreParameters.oldIdentifier = oldIdentifier; this.oldWorkbookCoreParameters.oldLanguage = oldLanguage; this.oldWorkbookCoreParameters.oldTitle = oldTitle; this.oldWorkbookCoreParameters.oldCategory = oldCategory; this.oldWorkbookCoreParameters.oldContentStatus = oldContentStatus; }; CCopyPasteExcelOptions.prototype.getCachedWorkbookBinaryData = function () { if (!this.cachedWbBinaryData) { if (this.wb) { const oOldPPTXWriter = AscCommon.pptx_content_writer; AscCommon.pptx_content_writer = new AscCommon.CPPTXContentWriter(); const newCreator = this.wb.Core.creator; const newIdentifier = this.wb.Core.identifier; const newLanguage = this.wb.Core.language; const newTitle = this.wb.Core.title; const newCategory = this.wb.Core.category; const newContentStatus = this.wb.Core.contentStatus; this.wb.Core.creator = this.oldWorkbookCoreParameters.oldCreator; this.wb.Core.identifier = this.oldWorkbookCoreParameters.oldIdentifier; this.wb.Core.language = this.oldWorkbookCoreParameters.oldLanguage; this.wb.Core.title = this.oldWorkbookCoreParameters.oldTitle; this.wb.Core.category = this.oldWorkbookCoreParameters.oldCategory; this.wb.Core.contentStatus = this.oldWorkbookCoreParameters.oldContentStatus; var oBinaryFileWriter = new AscCommonExcel.BinaryFileWriter(this.wb); this.cachedWbBinaryData = oBinaryFileWriter.Write(true, false, true); this.wb.Core.creator = newCreator; this.wb.Core.identifier = newIdentifier; this.wb.Core.language = newLanguage; this.wb.Core.title = newTitle; this.wb.Core.category = newCategory; this.wb.Core.contentStatus = newContentStatus; AscCommon.pptx_content_writer = oOldPPTXWriter; } } return this.cachedWbBinaryData; }; CCopyPasteExcelOptions.prototype.getChartRangeWithReplaceDefinedName = function(sRange) { const wb = this.wb; if (wb && sRange && sRange.includes("_xlchart")) { const definedName = wb.getDefinesNames(sRange); return definedName ? definedName.ref : sRange; } return sRange; }; function CopyProcessorExcel() { } CopyProcessorExcel.prototype = { constructor: CopyProcessorExcel, getHtml: function (range, worksheet) { var t = this; var sBase64 = null; var objectRender = worksheet.objectRender; var isIntoShape = objectRender.controller.getTargetDocContent(); History.TurnOff(); //use binary strings if (copyPasteUseBinary) { sBase64 = this.getBinaryForCopy(worksheet.model, worksheet.objectRender); } History.TurnOn(); var innerHtml = t._generateHtml(range, worksheet, isIntoShape, sBase64); if (innerHtml === false) { return null; } return {base64: sBase64, html: innerHtml}; }, getBinaryForCopy: function (wsModel, objectRender, activeRange, selectAll, ignoreCopyPaste, allSelectedTabs) { let isIntoShape = !selectAll && objectRender && objectRender.controller ? objectRender.controller.getTargetDocContent() : null; let sBase64 = null; if (isIntoShape) { //в данному случае пишем бинарник с меткой pptData - с префиксом xlsData отдельно параграфы записать не получится sBase64 = this._getBinaryShapeContent(isIntoShape); } else { AscFormat.ExecuteNoHistory(function () { pptx_content_writer.Start_UseFullUrl(); let unselectedIndexes = []; if (selectAll) { activeRange = new Asc.Range(0, 0, AscCommon.gc_nMaxCol - 1, AscCommon.gc_nMaxRow - 1); for (let i = 0; i < wsModel.Drawings.length; i++) { if (!wsModel.Drawings[i].graphicObject.selected) { unselectedIndexes[i] = true; wsModel.Drawings[i].graphicObject.selected = true; } } } let selectionRange; if (activeRange) { selectionRange = activeRange; } else { if (1 !== wsModel.selectionRange.ranges.length) { selectionRange = new AscCommonExcel.MultiplyRange(wsModel.selectionRange.ranges).getUnionRange(); } else { selectionRange = wsModel.selectionRange.getLast(); } } let maxRowCol = this._getRangeMaxRowCol(wsModel, selectionRange); if (null !== maxRowCol) { if (maxRowCol.col < selectionRange.c1) { maxRowCol.col = selectionRange.c1; } if (maxRowCol.row < selectionRange.r1) { maxRowCol.row = selectionRange.r1; } selectionRange = new Asc.Range(selectionRange.c1, selectionRange.r1, maxRowCol.col, maxRowCol.row); } let wb = wsModel.workbook; let isNullCore = false; if (!wb.Core) { isNullCore = true; wb.Core = new window['AscCommon'].CCore(); } //подменяем identifier/creator для того, чтобы протащить id let oldCreator = wb.Core.creator; let oldIdentifier = wb.Core.identifier; let oldLanguage = wb.Core.language; let oldTitle = wb.Core.title; let oldCategory = wb.Core.category; let oldContentStatus = wb.Core.contentStatus; wb.Core.creator = wb.oApi && wb.oApi.CoAuthoringApi ? wb.oApi.CoAuthoringApi.getUserConnectionId() : null; wb.Core.identifier = wb.oApi && wb.oApi.DocInfo ? wb.oApi.DocInfo.Id : null; //для внешних данных необходимо протащить docInfo->ReferenceData //пока беру данные поля, поскольку для копипаста они не используются. по названию не особо совпадают - пересмотреть let isLocalDesktop = window["AscDesktopEditor"] && window["AscDesktopEditor"]["IsLocalFile"](); if (isLocalDesktop && window["AscDesktopEditor"]["LocalFileGetSaved"]()) { wb.Core.contentStatus = window["AscDesktopEditor"]["LocalFileGetSourcePath"](); wb.Core.category = null; } else if (wb.oApi && wb.oApi.DocInfo && !notSupportExternalReferenceFileFormat[wb.oApi.DocInfo.Format]) { wb.Core.contentStatus = wb.oApi.DocInfo.ReferenceData ? wb.oApi.DocInfo.ReferenceData["fileKey"] : null; wb.Core.category = wb.oApi.DocInfo.ReferenceData ? wb.oApi.DocInfo.ReferenceData["instanceId"] : null; } wb.Core.title = wb.oApi && wb.oApi.DocInfo && wb.oApi.DocInfo.Title ? wb.oApi.DocInfo.Title : null; //записываю изображение выделенного фрагмента. пока только для изоюражений //выбрал для этого поле subject let oldSubject = wb.Core.subject; let objectRender = Asc.editor.wb.getWorksheet().objectRender; let _imgProperty = objectRender && objectRender.controller && objectRender.controller.getSelectionImage(); if (_imgProperty) { let _base64 = _imgProperty.asc_getImageUrl(); let _width = _imgProperty.Width; let _height = _imgProperty.Height; wb.Core.subject = _width + ";" + _height + ";" + _base64; } //так же необходимо протащить локаль, для этого использую поля language //и записываю туда номер локали, предварительно конвертируя его в строку //пока буду использовать его только при вставке в документы, а в документах устанавливать -> AscCommon.setCurrentCultureInfo(val) let locale = wb.oApi ? wb.oApi.asc_getLocale() : null; wb.Core.language = (undefined !== locale && null !== locale) ? locale.toString() : null; //WRITE const oCopyPaste = !ignoreCopyPaste ? selectionRange : false; const oBinaryFileWriter = new AscCommonExcel.BinaryFileWriter(wb, !ignoreCopyPaste ? selectionRange : false); if (oCopyPaste) { const oCopyPasteOptions = new CCopyPasteExcelOptions(); oCopyPasteOptions.wb = wb; oCopyPasteOptions.setOldWorkbookCoreParameters(oldCreator, oldIdentifier, oldLanguage, oldTitle, oldCategory, oldContentStatus); pptx_content_writer.Start_CopyPaste(oCopyPasteOptions); } sBase64 = "xslData;" + oBinaryFileWriter.Write(); pptx_content_writer.End_UseFullUrl(); if (oCopyPaste) { pptx_content_writer.End_CopyPaste(); } if (selectAll) { for (let i in unselectedIndexes) { wsModel.Drawings[i].graphicObject.selected = false; } } if (isNullCore) { wb.Core = null; } else { wb.Core.creator = oldCreator; wb.Core.identifier = oldIdentifier; wb.Core.language = oldLanguage; wb.Core.subject = oldSubject; wb.Core.title = oldTitle; wb.Core.category = oldCategory; wb.Core.contentStatus = oldContentStatus; } }, this, []); } return sBase64; }, _getRangeMaxRowCol: function (worksheet, selectionRange, range3) { var res = null; //при выделенных столбцах ищем последнюю непустую ячейку //ограничиваемся последней пустой строкой/столбцом var type = selectionRange.getType(); var oType = Asc.c_oAscSelectionType; if (type === oType.RangeCol || type === oType.RangeRow || type === oType.RangeMax) { if (!range3) { range3 = worksheet.getRange3(selectionRange.r1, selectionRange.c1, selectionRange.r2, selectionRange.c2); } //нужно вычислить последнюю ячейку в столбце, где есть данные var maxRow = 0; var maxCol = 0; range3._foreachNoEmpty(function (cell) { if (cell.nCol > maxCol && !cell.ws.getColHidden(cell.nCol)) { maxCol = cell.nCol; } if (cell.nRow > maxRow && !cell.ws.getRowHidden(cell.nRow)) { maxRow = cell.nRow; } }); res = {col: maxCol, row: maxRow}; } return res; }, _getBinaryShapeContent: function (isIntoShape) { var sBase64; var selectedContent = new AscCommonWord.CSelectedContent(); AscFormat.ExecuteNoHistory(function () { isIntoShape.GetSelectedContent(selectedContent); }, this, []); if (!selectedContent || !selectedContent.Elements || !selectedContent.Elements.length) { return null; } var oPresentationWriter = new AscCommon.CBinaryFileWriter(); //начало записи oPresentationWriter.WriteString2(""); oPresentationWriter.WriteString2(""); oPresentationWriter.WriteDouble(1); oPresentationWriter.WriteDouble(1); oPresentationWriter.WriteBool(true); oPresentationWriter.WriteULong(1); if (selectedContent)//пишем контент { var docContent = selectedContent; if (docContent.Elements) { var elements = docContent.Elements; //пишем метку и длины oPresentationWriter.WriteString2("SelectedContent"); oPresentationWriter.WriteULong(1); oPresentationWriter.WriteULong(1); oPresentationWriter.WriteULong(1); oPresentationWriter.WriteString2("DocContent"); 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()) { oPresentationWriter.StartRecord(0); oPresentationWriter.WriteParagraph(Item); oPresentationWriter.EndRecord(); } } sBase64 = oPresentationWriter.GetBase64Memory(); } if (null !== sBase64) { sBase64 = "pptData;" + oPresentationWriter.pos + ";" + sBase64; } } return sBase64; }, getText: function (range, worksheet) { var t = this; var res = null; var objectRender = worksheet.objectRender; var isIntoShape = objectRender.controller.getTargetDocContent(); if (isIntoShape) { res = t._getTextFromShape(isIntoShape); } else { res = t._getTextFromSheet(range, worksheet); } return res; }, getBinaryForMobile: function () { var api = window["Asc"]["editor"]; if (!api || !api.wb) { return false; } var worksheetView = api.wb.getWorksheet(); var objectRender = worksheetView.objectRender; var isIntoShape = objectRender.controller.getTargetDocContent(); History.TurnOff(); var sBase64 = null; if (!isIntoShape) { sBase64 = this.getBinaryForCopy(worksheetView.model, worksheetView.objectRender); } History.TurnOn(); var selectedImages = objectRender.getSelectedGraphicObjects(); var drawingUrls = []; if (selectedImages && selectedImages.length) { var correctUrl, graphicObj; for (var i = 0; i < selectedImages.length; i++) { graphicObj = selectedImages[i]; if (graphicObj.isImage()) { if (window["NativeCorrectImageUrlOnCopy"]) { correctUrl = window["NativeCorrectImageUrlOnCopy"](graphicObj.getImageUrl()); drawingUrls[i] = correctUrl; } else { drawingUrls[i] = graphicObj.getBase64Img(); } } } } return {sBase64: sBase64, drawingUrls: drawingUrls}; }, canCopy: function (ws) { var res = true; if (1 !== ws.model.selectionRange.ranges.length) { if (AscCommon.g_clipboardBase.bCut) { return false; } var firstRange = ws.model.selectionRange.ranges[0]; var byCol = null; for (var i = 1; i < ws.model.selectionRange.ranges.length; i++) { var nextRange = ws.model.selectionRange.ranges[i]; if (nextRange.isIntersectWithRanges(ws.model.selectionRange.ranges, i)) { res = false; break; } if (byCol === null && firstRange.r1 === nextRange.r1 && firstRange.r2 === nextRange.r2) { byCol = false; } else if (byCol === null && firstRange.c1 === nextRange.c1 && firstRange.c2 === nextRange.c2) { byCol = true; } else if ((byCol && firstRange.c1 === nextRange.c1 && firstRange.c2 === nextRange.c2) || (byCol === false && firstRange.r1 === nextRange.r1 && firstRange.r2 === nextRange.r2)) { continue; } else { res = false; break; } } } return res; }, //TODO пересмотреть функцию _generateHtml: function (range, worksheet, isIntoShape, sBase64) { var isSelectedImages = this._getSelectedDrawingIndex(worksheet); var htmlObj, container; if (isIntoShape)//если курсор находится внутри шейпа { var selectedContent = new AscCommonWord.CSelectedContent(); AscFormat.ExecuteNoHistory(function () { isIntoShape.GetSelectedContent(selectedContent); }, this, []); var oCopyProcessor = new AscCommon.CopyProcessor({WordControl: {m_oLogicDocument: isIntoShape}}); oCopyProcessor.CopyDocument2(oCopyProcessor.oRoot, isIntoShape, selectedContent.Elements, true); if (sBase64) { if (oCopyProcessor.oRoot && oCopyProcessor.oRoot.aChildren && oCopyProcessor.oRoot.aChildren.length > 0) { oCopyProcessor.oRoot.aChildren[0].oAttributes["class"] = sBase64; } } return oCopyProcessor.getInnerHtml(); } else if (isSelectedImages && isSelectedImages !== -1) {//графические объекты htmlObj = this._generateHtmlImg(isSelectedImages, worksheet); if (!htmlObj) { return false; } container = doc.createElement("DIV"); container.appendChild(htmlObj); if (sBase64 && container.children[0]) { container.children[0].setAttribute("class", sBase64); } return container.innerHTML; } else { return this._generateHtmlDocStr(range, worksheet, sBase64); } }, _generateHtmlImg: function (isSelectedImages, worksheet) { let objectRender = worksheet.objectRender; objectRender.preCopy(); let res = document.createElement('span'); let drawings = worksheet.model.Drawings; for (let j = 0; j < isSelectedImages.length; ++j) { let oDrawing = drawings[isSelectedImages[j]]; if (oDrawing) { let oGraphicObj = oDrawing.graphicObject; if (oGraphicObj) { let oHtmlImage = new Image(); oHtmlImage.src = oGraphicObj.getBase64Img(); if (oGraphicObj.cachedPixW && oGraphicObj.cachedPixH) { oHtmlImage.width = oGraphicObj.cachedPixW; oHtmlImage.height = oGraphicObj.cachedPixH; } else { oHtmlImage.width = oDrawing.getWidthFromTo(); oHtmlImage.height = oDrawing.getHeightFromTo(); } res.appendChild(oHtmlImage); } } } return res; }, _generateHtmlDoc: function (range, worksheet) { function skipMerged() { for (var i = 0; i < merged.length; i++) { var e = merged[i]; if (row >= e.r1 && row <= e.r2 && col >= e.c1 && col <= e.c2) { col = e.c2; return true; } } return false; } function makeBorder(border) { if (!border || border.s === c_oAscBorderStyles.None) { return ""; } var style = ""; switch (border.s) { case c_oAscBorderStyles.Thin: style = "solid"; break; case c_oAscBorderStyles.Medium: style = "solid"; break; case c_oAscBorderStyles.Thick: style = "solid"; break; case c_oAscBorderStyles.DashDot: case c_oAscBorderStyles.DashDotDot: case c_oAscBorderStyles.Dashed: style = "dashed"; break; case c_oAscBorderStyles.Double: style = "double"; break; case c_oAscBorderStyles.Hair: case c_oAscBorderStyles.Dotted: style = "dotted"; break; case c_oAscBorderStyles.MediumDashDot: case c_oAscBorderStyles.MediumDashDotDot: case c_oAscBorderStyles.MediumDashed: case c_oAscBorderStyles.SlantDashDot: style = "dashed"; break; } return border.w + "px " + style + " " + number2color(border.getRgbOrNull()); } var fn = worksheet.model.workbook.getDefaultFont(); var fs = worksheet.model.workbook.getDefaultSize(); var bbox = range.getBBox0(); var merged = []; var t = this; var table, tr, td, cell, j, row, col, mbbox, h, w, b; table = document.createElement("TABLE"); table.style.display = 'none'; table.cellPadding = "0"; table.cellSpacing = "0"; table.style.borderCollapse = "collapse"; table.style.fontFamily = fn; table.style.fontSize = fs + "pt"; table.style.color = "#000"; table.style.backgroundColor = "transparent"; var maxRow = bbox.r2; var maxCol = bbox.c2; var maxRowCol = this._getRangeMaxRowCol(worksheet, bbox, range); if (null !== maxRowCol) { maxRow = maxRowCol.row; maxCol = maxRowCol.col; } for (row = bbox.r1; row <= maxRow; ++row) { if (worksheet.model.bExcludeHiddenRows && worksheet.model.getRowHidden(row)) { continue; } tr = document.createElement("TR"); h = worksheet.model.getRowHeight(row); if (h > 0) { tr.style.height = h + "pt"; } for (col = bbox.c1; col <= maxCol; ++col) { if (skipMerged()) { continue; } cell = worksheet.model.getCell3(row, col); td = document.createElement("TD"); var style = ""; mbbox = cell.hasMerged(); if (mbbox) { merged.push(mbbox); td.colSpan = mbbox.c2 - mbbox.c1 + 1; td.rowSpan = mbbox.r2 - mbbox.r1 + 1; for (w = 0, j = mbbox.c1; j <= mbbox.c2; ++j) { w += worksheet.getColumnWidth(j, 1/*pt*/); } style += "width:" + w + "pt" + ";"; } else { style += "width:" + worksheet.getColumnWidth(col, 1/*pt*/) + "pt" + ";"; } if (cell.getType() !== null) { var align = cell.getAlign(); if (!align.getWrap()) { style += "white-space:" + "nowrap" + ";"; } else { style += "white-space:" + "normal" + ";"; } switch (align.getAlignHorizontal()) { case AscCommon.align_Left: style += "text-align:" + "left" + ";"; break; case AscCommon.align_Right: style += "text-align:" + "right" + ";"; break; case AscCommon.align_Center: style += "text-align:" + "center" + ";"; break; case AscCommon.align_Justify: style += "text-align:" + "justify" + ";"; break; } switch (align.getAlignVertical()) { case Asc.c_oAscVAlign.Bottom: style += "vertical-align:" + "bottom" + ";"; break; case Asc.c_oAscVAlign.Center: case Asc.c_oAscVAlign.Dist: case Asc.c_oAscVAlign.Just: style += "vertical-align:" + "middle" + ";"; break; case Asc.c_oAscVAlign.Top: style += "vertical-align:" + "top" + ";"; break; } //borders b = cell.getBorderFull(); var _border; if (mbbox) { var cellMergeFinish = worksheet.model.getCell3(mbbox.r2, mbbox.c2); var borderMergeCell = cellMergeFinish.getBorderFull(); _border = makeBorder(borderMergeCell.r); style += _border ? "border-right:" + _border + ";" : ""; _border = makeBorder(borderMergeCell.b); style += _border ? "border-bottom:" + makeBorder(borderMergeCell.b) + ";" : ""; } else { _border = makeBorder(b.r); style += _border ? "border-right:" + makeBorder(b.r) + ";" : ""; _border = makeBorder(b.b); style += _border ? "border-bottom:" + makeBorder(b.b) + ";" : ""; } _border = makeBorder(b.l); style += _border ? "border-left:" + makeBorder(b.l) + ";" : ""; _border = makeBorder(b.t); style += _border ? "border-top:" + makeBorder(b.t) + ";" : ""; b = cell.getFillColor(); // если b==0 мы не зайдем в if, хотя b==0 это ни что иное, как черный цвет заливки. if (b != null) { style += "background-color:" + number2color(b.getRgb()) + ";"; } td.setAttribute("style", style); this._makeNodesFromCellValue(cell.getValue2(), fn, fs, cell).forEach(function (node) { td.appendChild(node); }); } tr.appendChild(td); } table.appendChild(tr); } return table; }, _generateHtmlDocStr: function (range, worksheet, sBase64) { function skipMerged() { for (var i = 0; i < merged.length; i++) { var e = merged[i]; if (row >= e.r1 && row <= e.r2 && col >= e.c1 && col <= e.c2) { col = e.c2; return true; } } return false; } function makeBorder(border) { if (!border || border.s === c_oAscBorderStyles.None) { return ""; } var _style = ""; switch (border.s) { case c_oAscBorderStyles.Thin: _style = "solid"; break; case c_oAscBorderStyles.Medium: _style = "solid"; break; case c_oAscBorderStyles.Thick: _style = "solid"; break; case c_oAscBorderStyles.DashDot: case c_oAscBorderStyles.DashDotDot: case c_oAscBorderStyles.Dashed: _style = "dashed"; break; case c_oAscBorderStyles.Double: _style = "double"; break; case c_oAscBorderStyles.Hair: case c_oAscBorderStyles.Dotted: _style = "dotted"; break; case c_oAscBorderStyles.MediumDashDot: case c_oAscBorderStyles.MediumDashDotDot: case c_oAscBorderStyles.MediumDashed: case c_oAscBorderStyles.SlantDashDot: _style = "dashed"; break; } return border.w + "px " + _style + " " + number2color(border.getRgbOrNull()); } var fn = worksheet.model.workbook.getDefaultFont(); var fs = worksheet.model.workbook.getDefaultSize(); var bbox = range.getBBox0(); var merged = []; var t = this; var table, tr, td, cell, j, row, col, mbbox, h, w, b; var str = ""; var addByStr = function (_str) { //исследования по максимальной длине строки: //Edge/chrome 96.0.4664 -> 536870888 символов(1073741776 байта) //FF 95.0.2 -> 1073741822 символов(2147483644 байта) if (str.length + _str.length > c_MaxStringLength) { return false; } str += _str; return true; }; if (!addByStr('')) { return false; } var maxRow = bbox.r2; var maxCol = bbox.c2; var maxRowCol = this._getRangeMaxRowCol(worksheet, bbox, range); if (null !== maxRowCol) { maxRow = maxRowCol.row; maxCol = maxRowCol.col; } for (row = bbox.r1; row <= maxRow; ++row) { if (worksheet.model.bExcludeHiddenRows && worksheet.model.getRowHidden(row)) { continue; } if (!addByStr('")) { return false; } for (col = bbox.c1; col <= maxCol; ++col) { if (skipMerged()) { continue; } if (!addByStr('')) { return false; } if (!addByStr(this._makeNodesFromCellValueStr(cell.getValue2(), fn, fs, cell))) { return false; } } else { if (!addByStr('>')) { return false; } } if (!addByStr('')) { return false; } } if (!addByStr("")) { return false; } } if (!addByStr("
")) { return false; } return str; }, _getSelectedDrawingIndex: function (worksheet) { if (!worksheet) { return false; } var images = worksheet.model.Drawings; var n = 0; var arrImages = []; if (images) { for (var i = 0; i < images.length; i++) { if ((images[i].graphicObject && images[i].graphicObject.selected === true)) { arrImages[n] = i; n++; } } } if (n === 0) { return -1; } else { return arrImages; } }, _makeNodesFromCellValue: function (val, defFN, defFS, cell) { var i, res, span, f; function getTextDecoration(format) { var res = []; if (Asc.EUnderline.underlineNone !== format.getUnderline()) { res.push("underline"); } if (format.getStrikeout()) { res.push("line-through"); } return res.length > 0 ? res.join(",") : ""; } var hyperlink; if (cell) { hyperlink = cell.getHyperlink(); } for (res = [], i = 0; i < val.length; ++i) { if (val[i] && val[i].format && val[i].format.getSkip()) { continue; } if (cell == undefined || (cell != undefined && (hyperlink == null || (hyperlink != null && hyperlink.getLocation() != null)))) { span = doc.createElement("SPAN"); } else { span = doc.createElement("A"); if (hyperlink.Hyperlink != null) { span.href = hyperlink.Hyperlink; } else if (hyperlink.getLocation() != null) { span.href = "#" + hyperlink.getLocation(); } if (hyperlink.Tooltip != null) { span.title = hyperlink.Tooltip; } } var text = val[i].getFragmentText(); var isBr = val[i].getFragmentText().indexOf("\n"); span.textContent = text; f = val[i].format; var fn = f.getName(); var fs = f.getSize(); var fc = f.getColor(); var va = f.getVerticalAlign(); var style = ""; if (fc && fc.rgb !== 0) { style += "color:" + number2color(fc.getRgb()) + ";"; } if (fn !== defFN) { style += "font-family:" + fn + ";"; } if (fs !== defFS) { style += "font-size:" + fs + 'pt' + ";"; } if (f.getBold()) { style += "font-weight:" + "bold" + ";"; } if (f.getItalic()) { style += "font-style:" + "italic" + ";"; } var textDecoration = getTextDecoration(f); if (textDecoration) { style += "text-decoration:" + textDecoration + ";"; } var verticalAlign = va === AscCommon.vertalign_SubScript ? 'sub' : va === AscCommon.vertalign_SuperScript ? 'super' : 'baseline'; style += "vertical-align:" + verticalAlign + ";"; span.setAttribute('style', style); if (isBr !== -1) { span.innerHTML = span.innerHTML.replace(/\n/g, '
'); } res.push(span); } return res; }, _makeNodesFromCellValueStr: function (val, defFN, defFS, cell) { var i, res, span, f; function getTextDecoration(format) { var res = []; if (Asc.EUnderline.underlineNone !== format.getUnderline()) { res.push("underline"); } if (format.getStrikeout()) { res.push("line-through"); } return res.length > 0 ? res.join(",") : ""; } var str = ""; var hyperlink; if (cell) { hyperlink = cell.getHyperlink(); } for (res = [], i = 0; i < val.length; ++i) { if (val[i] && val[i].format && val[i].format.getSkip()) { continue; } if (cell == undefined || (cell != undefined && (hyperlink == null || (hyperlink != null && hyperlink.getLocation() != null)))) { str += ''); f = val[i].format; var fn = f.getName(); var fs = f.getSize(); var fc = f.getColor(); var va = f.getVerticalAlign(); var style = ""; if (fc && fc.rgb !== 0) { style += "color:" + number2color(fc.getRgb()) + ";"; } if (fn !== defFN) { style += "font-family:" + fn + ";"; } if (fs !== defFS) { style += "font-size:" + fs + 'pt' + ";"; } if (f.getBold()) { style += "font-weight:" + "bold" + ";"; } if (f.getItalic()) { style += "font-style:" + "italic" + ";"; } var textDecoration = getTextDecoration(f); if (textDecoration) { style += "text-decoration:" + textDecoration + ";"; } var verticalAlign = va === AscCommon.vertalign_SubScript ? 'sub' : va === AscCommon.vertalign_SuperScript ? 'super' : 'baseline'; style += "vertical-align:" + verticalAlign + ";"; str += ' style="' + style + '">'; str += text + ''; } return str; }, _getTextFromShape: function (documentContent) { var res = null; var addByStr = function (_str) { if (res && res.length + _str.length > c_MaxStringLength) { return false; } if (!res) { res = ""; } res += _str; return true; }; if (documentContent && documentContent.Content && documentContent.Content.length) { for (var i = 0; i < documentContent.Content.length; i++) { if (documentContent.Content[i]) { var paraText = documentContent.Content[i].GetSelectedText(); if (paraText) { if (i !== 0) { if (!addByStr('\r\n')) { return null; } } if (!addByStr(paraText)) { return null; } } } } } return res; }, _getTextFromSheet: function (range, worksheet) { var res = null; var addByStr = function (_str) { if (res && res.length + _str.length > c_MaxStringLength) { return false; } if (!res) { res = ""; } res += _str; return true; }; if (range) { var bbox = range.bbox; var maxRow = bbox.r2; var maxCol = bbox.c2; var maxRowCol = this._getRangeMaxRowCol(worksheet.model, bbox, range); if (null !== maxRowCol) { maxRow = maxRowCol.row; maxCol = maxRowCol.col; } res = ''; for (var row = bbox.r1; row <= maxRow; ++row) { if (worksheet.model.bExcludeHiddenRows && worksheet.model.getRowHidden(row)) { continue; } if (row !== bbox.r1) { if (!addByStr('\r\n')) { return null; } } for (var col = bbox.c1; col <= maxCol; ++col) { if (col !== bbox.c1) { if (!addByStr('\t')) { return null; } } var currentRange = worksheet.model.getCell3(row, col); var textRange = currentRange.getValueWithFormat(); if (textRange !== '' && textRange !== undefined) { if (!addByStr(textRange)) { return null; } } } } } return res; } }; function PasteProcessorExcel() { this.activeRange = null; this.alreadyLoadImagesOnServer = false; this.fontsNew = {}; this.oImages = {}; this.multipleSettings = null; this.pasteCallBack = null; } PasteProcessorExcel.prototype = { constructor: PasteProcessorExcel, clean: function () { this.activeRange = null; this.alreadyLoadImagesOnServer = false; this.fontsNew = {}; this.oImages = {}; this.multipleSettings = null; }, pasteFromBinary: function (worksheet, binary, isCellEditMode, isPasteAll) { var base64 = null, base64FromWord = null, base64FromPresentation = null, base64FromPDF = null, t = this; if (binary.indexOf("xslData;") > -1) { base64 = binary.split('xslData;')[1]; } else if (binary.indexOf("docData;") > -1) { base64FromWord = binary.split('docData;')[1]; } else if (binary.indexOf("pptData;") > -1) { base64FromPresentation = binary.split('pptData;')[1]; } else if (binary.indexOf("pdfData;") > -1) { base64FromPDF = binary.split('pdfData;')[1]; } var result = false; var objectRender = worksheet.objectRender; var isIntoShape = objectRender && objectRender.controller && objectRender.controller.getTargetDocContent(); if (base64 != null)//from excel { result = this._pasteFromBinaryExcel(worksheet, base64, isIntoShape, isCellEditMode, isPasteAll); } else if (base64FromWord)//from word { this.activeRange = worksheet.model.selectionRange.getLast().clone(true); result = this._pasteFromBinaryWord(worksheet, base64FromWord, isIntoShape, isCellEditMode); window['AscCommon'].g_specialPasteHelper.specialPasteData.pasteFromWord = true; worksheet.workbook.handlers.trigger("cleanCopyData", true); } else if (base64FromPresentation) { result = this._pasteFromBinaryPresentation(worksheet, base64FromPresentation, isIntoShape, isCellEditMode); worksheet.workbook.handlers.trigger("cleanCopyData", true); } else if (base64FromPDF) { result = this._pasteFromBinaryPDF(worksheet, base64FromPDF, isIntoShape, isCellEditMode); worksheet.workbook.handlers.trigger("cleanCopyData", true); } return result; }, _pasteFromBinaryExcel: function (worksheet, base64, isIntoShape, isCellEditMode, isPasteAll) { var t = this; var newFonts; var tempWorkbook = new AscCommonExcel.Workbook(undefined, undefined, false); tempWorkbook.DrawingDocument = Asc.editor.wbModel.DrawingDocument; var aPastedImages = this._readExcelBinary(base64, tempWorkbook); if (!isIntoShape && this._checkCutBefore(worksheet, tempWorkbook)) { return true; } var pasteData = null; if (tempWorkbook) { pasteData = tempWorkbook.aWorksheets[0]; } if (isPasteAll) { History.Create_NewPoint(); History.StartTransaction(); } var doPasteData = function () { newFonts = {}; newFonts = tempWorkbook.generateFontMap2(); newFonts = t._convertFonts(newFonts); if (isPasteAll) { window['AscCommon'].g_specialPasteHelper.Special_Paste_Hide_Button(); } //закрываем общую транзакцию _loadDataBeforePaste после загрузки шрифтов worksheet.setSelectionInfo('paste', { data: pasteData, fromBinary: true, fontsNew: newFonts, pasteAllSheet: isPasteAll, wb: tempWorkbook }); }; var doPasteIntoShape = function () { History.TurnOff(); var docContent = t._convertTableFromExcelToDocument(worksheet, pasteData, isIntoShape); History.TurnOn(); var callback = function (isSuccess) { if (isSuccess) { t._insertBinaryIntoShapeContent(worksheet, [docContent]); } window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); }; worksheet.objectRender.controller.checkPasteInText(callback); }; let getFontsFromDrawings = function (_drawings) { let _fonts = {}; if (_drawings) { for (var i = 0; i < _drawings.length; i++) { _drawings[i].graphicObject.getAllFonts(_fonts); } } return _fonts; }; var res = false; if (isCellEditMode) { res = this._getTextFromWorksheet(pasteData); } else if (pasteData) { if (pasteData.Drawings && pasteData.Drawings.length) { if (window["IS_NATIVE_EDITOR"]) { t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook); if (isPasteAll) { doPasteData(); } } else if (window["NativeCorrectImageUrlOnPaste"]) { newFonts = getFontsFromDrawings(pasteData.Drawings); worksheet._loadFonts(newFonts, function () { var url; for (var i = 0, length = aPastedImages.length; i < length; ++i) { url = window["NativeCorrectImageUrlOnPaste"](aPastedImages[i].Url); aPastedImages[i].Url = url; var imageElem = aPastedImages[i]; if (null != imageElem) { imageElem.SetUrl(url); } } t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook); if (isPasteAll) { doPasteData(); } }); } else { newFonts = getFontsFromDrawings(pasteData.Drawings); worksheet._loadFonts(newFonts, function () { if (aPastedImages && aPastedImages.length) { t._loadImagesOnServer(aPastedImages, function () { t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook); if (isPasteAll) { doPasteData(); } }); } else { t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook); if (isPasteAll) { doPasteData(); } } }); } } else { if (isIntoShape) { doPasteIntoShape(); } else if (this._checkPasteFromBinaryExcel(worksheet, true, pasteData)) { doPasteData(); } } res = true; } return res; }, _readExcelBinary: function (base64, tempWorkbook, selectAllSheet) { let oBinaryFileReader = new AscCommonExcel.BinaryFileReader(true); oBinaryFileReader.InitOpenManager.copyPasteObj.selectAllSheet = selectAllSheet; let t = this; let aPastedImages; AscFormat.ExecuteNoHistory(function () { pptx_content_loader.Start_UseFullUrl(); pptx_content_loader.Reader.ClearConnectedObjects(); oBinaryFileReader.Read(base64, tempWorkbook); //paste multiselect //TODO if paste multiselect into multiselect - we must show error let pastedWorksheet = tempWorkbook.aWorksheets && tempWorkbook.aWorksheets[0]; let _ranges = pastedWorksheet && pastedWorksheet.selectionRange && pastedWorksheet.selectionRange.ranges; if (_ranges && _ranges.length > 1) { //paste - should only be with an equal number of rows/columns //there should be only rows/columns between the ranges, then -> delete the extra rows/columns let byCol = null; if (_ranges[0].r1 === _ranges[1].r1 && _ranges[0].r2 === _ranges[1].r2) { byCol = false; } else if (_ranges[0].c1 === _ranges[1].c1 && _ranges[0].c2 === _ranges[1].c2) { byCol = true; } _ranges.sort(function sortArr(a, b) { if (!byCol) { return a.c1 > b.c1 ? 1 : -1; } else { return a.r1 > b.r1 ? 1 : -1; } }); let diff = 0; for (let i = 1; i < _ranges.length; i++) { if (byCol) { if (_ranges[i - 1].r2 + 1 !== _ranges[i].r1) { pastedWorksheet.removeRows(_ranges[i - 1].r2 + 1 - diff, _ranges[i].r1 - 1 - diff); diff += _ranges[i].r1 - _ranges[i - 1].r2 - 1; } } else { if (_ranges[i - 1].c2 + 1 !== _ranges[i].c1) { pastedWorksheet.removeCols(_ranges[i - 1].c2 + 1 - diff, _ranges[i].c1 - 1 - diff); diff += _ranges[i].c1 - _ranges[i - 1].c2 - 1; } } } if (diff !== 0) { AscCommonExcel.executeInR1C1Mode(false, function () { let pasteRange = AscCommonExcel.g_oRangeCache.getAscRange(oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange); if (pasteRange) { pasteRange = pasteRange.clone(); if (byCol) { pasteRange.r2 -= diff; } else { pasteRange.c2 -= diff; } oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange = pasteRange.getName(); } }); } } t.activeRange = oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange; aPastedImages = pptx_content_loader.End_UseFullUrl(); pptx_content_loader.Reader.AssignConnectedObjects(); }, this, []); return aPastedImages; }, _checkCutBefore: function (ws, pastedWb) { var res = false; //***MOVE*** //проверяем, может это вырезанный фрагмент пытаемся вставить в пределах одного документа //чтобы не передавать изменения на сервер, даже в случае одного пользователя в разных вкладках //вырезать и вставить будут работать независимо, поэтому при вставке сравнивем ещё и id юзера var pasteInOriginalDoc = this._checkPastedInOriginalDoc(pastedWb); if (pasteInOriginalDoc && null !== window["Asc"]["editor"].wb.cutIdSheet) { var wsFrom = window["Asc"]["editor"].wb.getWorksheetById(window["Asc"]["editor"].wb.cutIdSheet); var fromRange = wsFrom ? wsFrom.getCutRange() : null; if (fromRange) { fromRange = fromRange[0]; var aRange = ws.model.selectionRange.getLast(); var toRange = new Asc.Range(aRange.c1, aRange.r1, aRange.c1 + (fromRange.c2 - fromRange.c1), aRange.r1 + (fromRange.r2 - fromRange.r1)); if (ws.model.getSheetProtection() && ws.model.isIntersectLockedRanges([toRange])) { ws.model.workbook.handlers.trigger("asc_onError", c_oAscError.ID.ChangeOnProtectedSheet, c_oAscError.Level.NoCritical); ws.handlers.trigger("cleanCutData", true); return true; } if (ws.model.isUserProtectedRangesIntersection(toRange)) { ws.model.workbook.handlers.trigger("asc_onError", c_oAscError.ID.ProtectedRangeByOtherUser, c_oAscError.Level.NoCritical); ws.handlers.trigger("cleanCutData", true); return; } var wsTo = ws.model.Id !== wsFrom.model.Id ? ws : null; wsFrom.applyCutRange(fromRange, toRange, wsTo); ws.handlers.trigger("cleanCutData", true); res = true; AscCommon.g_clipboardBase.needClearBuffer = true; } } else if (!pasteInOriginalDoc) { ws.workbook.handlers.trigger("cleanCopyData", true); } return res; }, _checkPastedInOriginalDoc: function (pastedWb, notCheckUser) { var res = false; var api = window["Asc"]["editor"]; var curDocId = api.DocInfo && api.DocInfo.Id; var curUserId = api.CoAuthoringApi && api.CoAuthoringApi.getUserConnectionId(); if (pastedWb && pastedWb.Core && pastedWb.Core.identifier === curDocId) { if (notCheckUser) { res = true; } else if (pastedWb.Core.creator === curUserId) { res = true; } } return res; }, _pasteFromBinaryWord: function (worksheet, base64, isIntoShape, isCellEditMode) { var res = true; var t = this; var pasteData = this.ReadFromBinaryWord(base64, worksheet); if (isCellEditMode) { res = this._getTextFromWord(pasteData.content); } //insert binary from word into SHAPE else if (isIntoShape) { var callback = function (isSuccess) { if (isSuccess) { t._insertBinaryIntoShapeContent(worksheet, pasteData.content, true); } window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } }; worksheet.objectRender.controller.checkPasteInText(callback); } else { var oPasteFromBinaryWord = new pasteFromBinaryWord(this, worksheet); oPasteFromBinaryWord._paste(worksheet, pasteData); } return res; }, _pasteFromBinaryPresentation: function (worksheet, base64, isIntoShape, isCellEditMode) { 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 t = this; var bIsMultipleContent = stream.GetBool(); var selectedContent2 = [], i; if (true === bIsMultipleContent) { var multipleParamsCount = stream.GetULong(); for (i = 0; i < multipleParamsCount; i++) { selectedContent2.push(this._readPresentationSelectedContent(stream, worksheet)); } } var specialOptionsArr = []; var specialProps = Asc.c_oSpecialPasteProps; if (2 === multipleParamsCount) { specialOptionsArr = [specialProps.sourceformatting]; } else if (3 === multipleParamsCount) { specialOptionsArr = [specialProps.sourceformatting, specialProps.picture]; } var defaultSelectedContent = selectedContent2[0] ? selectedContent2[0] : selectedContent2[1]; var bSlideObjects = defaultSelectedContent && defaultSelectedContent.content.SlideObjects && defaultSelectedContent.content.SlideObjects.length > 0; var pasteObj = bSlideObjects ? selectedContent2[2] : defaultSelectedContent; if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) { var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps.property; switch (props) { case Asc.c_oSpecialPasteProps.picture: { if (selectedContent2[2]) { pasteObj = selectedContent2[2]; } break; } } } var arr_Images, fonts, content = null; if (pasteObj) { arr_Images = pasteObj.images; fonts = pasteObj.fonts; content = pasteObj.content; } if (null === content) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return; } if (content.DocContent) { var docContent = content.DocContent.Elements; if (isCellEditMode) { var text = this._getTextFromWord(docContent); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(text !== false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return text; } else if (isIntoShape) { var callback = function (isSuccess) { if (isSuccess) { t._insertBinaryIntoShapeContent(worksheet, docContent); } window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } }; worksheet.objectRender.controller.checkPasteInText(callback); return true; } else { History.TurnOff(); var oPasteFromBinaryWord = new pasteFromBinaryWord(this, worksheet, true); var oTempDrawingDocument = window["Asc"]["editor"].wbModel.getDrawingDocument(); var newCDocument = new CDocument(oTempDrawingDocument, false); newCDocument.bFromDocument = true; newCDocument.theme = window["Asc"]["editor"].wbModel.theme; var newContent = []; for (i = 0; i < docContent.length; i++) { if (type_Paragraph === docContent[i].GetType())//paragraph { docContent[i] = AscFormat.ConvertParagraphToWord(docContent[i], newCDocument); docContent[i].bFromDocument = true; newContent.push(docContent[i]); } else if (type_Table === docContent[i].GetType())//table { //TODO вырезать из таблицы параграфы } } docContent = newContent; History.TurnOn(); oPasteFromBinaryWord._paste(worksheet, {content: docContent}); } } else if (content.Drawings) { if (isCellEditMode) { return ""; } if (!bSlideObjects) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); specialProps = window['AscCommon'].g_specialPasteHelper.buttonInfo; if (specialOptionsArr.length > 1) { specialProps.asc_setOptions(specialOptionsArr); } } var arr_shapes = content.Drawings; if (arr_shapes && arr_shapes.length) { if (!bSlideObjects && content.Drawings.length === selectedContent2[1].content.Drawings.length) { var oEndContent = { Drawings: [] }; var oSourceContent = { Drawings: [] }; for (i = 0; i < content.Drawings.length; ++i) { oEndContent.Drawings.push({Drawing: content.Drawings[i].graphicObject}); oSourceContent.Drawings.push({Drawing: selectedContent2[1].content.Drawings[i].graphicObject}); } AscFormat.checkDrawingsTransformBeforePaste(oEndContent, oSourceContent, null); } var newFonts = {}; for (i = 0; i < arr_shapes.length; i++) { arr_shapes[i].graphicObject.getAllFonts(newFonts); } var aPastedImages = arr_Images; worksheet._loadFonts(newFonts, function () { if (aPastedImages && aPastedImages.length) { t._loadImagesOnServer(aPastedImages, function () { t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true); }); } else { t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true); } }); } else { window['AscCommon'].g_specialPasteHelper.buttonInfo.clean(); } return true; } }, _readPresentationSelectedContent: function (stream, worksheet) { var presentationSelectedContent = null; var fonts = []; var arr_Images = {}; var oThis = this; var loader = new AscCommon.BinaryPPTYLoader(); loader.presentation = worksheet.model; loader.DrawingDocument = worksheet.getDrawingDocument(); loader.stream = stream; var readContent = function () { History.TurnOff(); var docContent = AscCommon.PasteProcessor.prototype.ReadPresentationText.call(this, stream, worksheet); History.TurnOn(); if (docContent.length === 0) { return; } presentationSelectedContent.DocContent = new AscCommonWord.CSelectedContent(); presentationSelectedContent.DocContent.Elements = docContent; //перебираем шрифты for (var i in oThis.oFonts) { fonts.push(new AscFonts.CFont(i)); } }; var readDrawings = function () { var objects = oThis.ReadPresentationShapes(stream, worksheet); presentationSelectedContent.Drawings = objects.arrShapes; var arr_shapes = objects.arrShapes; var font_map = {}, i; for (i = 0; i < arr_shapes.length; ++i) { if (arr_shapes[i].graphicObject.getAllFonts) { arr_shapes[i].graphicObject.getAllFonts(font_map); } } for (i in font_map) { fonts.push(new AscFonts.CFont(i)); } arr_Images = objects.arrImages; }; var skipIndexes = function () { var count = stream.GetULong(); var array = []; for (var i = 0; i < count; ++i) { stream.GetULong(); } }; var skip1 = function () { var selected_objs = loader.stream.GetULong(); for (var i = 0; i < selected_objs; ++i) { loader.stream.GetUChar(); loader.stream.SkipRecord(); } }; 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() : {}; } var first_string = stream.GetString2(); switch (first_string) { case "DocContent": { readContent(stream, worksheet); break; } case "Drawings": { readDrawings(); break; } case "SlideObjects": { presentationSelectedContent.SlideObjects = [null]; skip1(); break; } case "LayoutsIndexes": { skipIndexes(); break; } case "MastersIndexes": { skipIndexes(); break; } case "NotesMastersIndexes": { skipIndexes(); break; } case "ThemeIndexes": { skipIndexes(); break; } default: { skip1(); } } } } return {content: presentationSelectedContent, fonts: fonts, images: arr_Images}; }, _pasteFromBinaryPDF: function (worksheet, base64, isIntoShape, isCellEditMode) { 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 t = this; let bIsMultipleContent = stream.GetBool(); let selectedContent2 = [], i; let multipleParamsCount = stream.GetULong(); for (i = 0; i < multipleParamsCount; i++) { selectedContent2.push(this._readPDFSelectedContent(stream, worksheet)); } let specialOptionsArr = []; let specialProps = Asc.c_oSpecialPasteProps; if (2 === multipleParamsCount) { specialOptionsArr = [specialProps.sourceformatting]; } else if (3 === multipleParamsCount) { specialOptionsArr = [specialProps.sourceformatting, specialProps.picture]; } let pasteObj = selectedContent2[0] ? selectedContent2[0] : selectedContent2[1]; if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) { let props = window['AscCommon'].g_specialPasteHelper.specialPasteProps.property; switch (props) { case Asc.c_oSpecialPasteProps.picture: { if (selectedContent2[2]) { pasteObj = selectedContent2[2]; } break; } } } let arr_Images, fonts, content = null; if (pasteObj) { arr_Images = pasteObj.images; fonts = pasteObj.fonts; content = pasteObj.content; } if (null === content) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return; } if (content.DocContent) { let docContent = content.DocContent.Elements; if (isCellEditMode) { let text = this._getTextFromWord(docContent); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(text !== false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return text; } else if (isIntoShape) { let callback = function (isSuccess) { if (isSuccess) { t._insertBinaryIntoShapeContent(worksheet, docContent); } window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } }; worksheet.objectRender.controller.checkPasteInText(callback); return true; } else { History.TurnOff(); let oPasteFromBinaryWord = new pasteFromBinaryWord(this, worksheet, true); let oTempDrawingDocument = window["Asc"]["editor"].wbModel.getDrawingDocument(); let newCDocument = new CDocument(oTempDrawingDocument, false); newCDocument.bFromDocument = true; newCDocument.theme = window["Asc"]["editor"].wbModel.theme; let newContent = []; for (i = 0; i < docContent.length; i++) { if (type_Paragraph === docContent[i].GetType())//paragraph { docContent[i] = AscFormat.ConvertParagraphToWord(docContent[i], newCDocument); docContent[i].bFromDocument = true; newContent.push(docContent[i]); } else if (type_Table === docContent[i].GetType())//table { //TODO вырезать из таблицы параграфы } } docContent = newContent; History.TurnOn(); oPasteFromBinaryWord._paste(worksheet, {content: docContent}); } } else if (content.Drawings) { if (isCellEditMode) { return ""; } window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); specialProps = window['AscCommon'].g_specialPasteHelper.buttonInfo; if (specialOptionsArr.length > 1) { specialProps.asc_setOptions(specialOptionsArr); } let arr_shapes = content.Drawings; if (arr_shapes && arr_shapes.length && !(window["Asc"]["editor"] && window["Asc"]["editor"].isChartEditor)) { if (content.Drawings.length === pasteObj.content.Drawings.length) { let oEndContent = { Drawings: [] }; let oSourceContent = { Drawings: [] }; for (i = 0; i < content.Drawings.length; ++i) { oEndContent.Drawings.push({Drawing: content.Drawings[i].graphicObject}); oSourceContent.Drawings.push({Drawing: pasteObj.content.Drawings[i].graphicObject}); } AscFormat.checkDrawingsTransformBeforePaste(oEndContent, oSourceContent, null); } let newFonts = {}; for (i = 0; i < arr_shapes.length; i++) { arr_shapes[i].graphicObject.getAllFonts(newFonts); } let aPastedImages = arr_Images; worksheet._loadFonts(newFonts, function () { if (aPastedImages && aPastedImages.length) { t._loadImagesOnServer(aPastedImages, function () { t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true); }); } else { t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true); } }); } else { window['AscCommon'].g_specialPasteHelper.buttonInfo.clean(); } return true; } }, _readPDFSelectedContent: function (stream, worksheet) { var oPdfSelContent = null; var fonts = []; var arr_Images = {}; var oThis = this; var loader = new AscCommon.BinaryPPTYLoader(); loader.presentation = worksheet.model; loader.DrawingDocument = worksheet.getDrawingDocument(); loader.stream = stream; var readContent = function () { History.TurnOff(); var docContent = AscCommon.PasteProcessor.prototype.ReadPresentationText.call(this, stream, worksheet); History.TurnOn(); if (docContent.length === 0) { return; } oPdfSelContent.DocContent = new AscCommonWord.CSelectedContent(); oPdfSelContent.DocContent.Elements = docContent; //перебираем шрифты for (var i in oThis.oFonts) { fonts.push(new AscFonts.CFont(i)); } }; var readDrawings = function () { var objects = oThis.ReadPresentationShapes(stream, worksheet); oPdfSelContent.Drawings = objects.arrShapes; var arr_shapes = objects.arrShapes; var font_map = {}, i; for (i = 0; i < arr_shapes.length; ++i) { if (arr_shapes[i].graphicObject.getAllFonts) { arr_shapes[i].graphicObject.getAllFonts(font_map); } } for (i in font_map) { fonts.push(new AscFonts.CFont(i)); } arr_Images = objects.arrImages; }; var skip1 = function () { var selected_objs = loader.stream.GetULong(); for (var i = 0; i < selected_objs; ++i) { loader.stream.GetUChar(); loader.stream.SkipRecord(); } }; 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(); switch (first_string) { case "DocContent": { readContent(stream, worksheet); break; } case "Drawings": { readDrawings(); break; } default: { skip1(); } } } } return {content: oPdfSelContent, fonts: fonts, images: arr_Images}; }, _insertBinaryIntoShapeContent: function (worksheet, content, isConvertToPPTX) { if (!content || !content.length) { return; } History.Create_NewPoint(); History.StartTransaction(); //ещё раз вызваем getTargetDocContent с флагом true после создания точки в истории(getTargetDocContent добавляет данные в историю) var isIntoShape = worksheet.objectRender.controller.getTargetDocContent(true); isIntoShape.Remove(1, true, true); var insertContent = new AscCommonWord.CSelectedContent(); var target_doc_content = isIntoShape; insertContent.Elements = this._convertBeforeInsertIntoShapeContent(worksheet, content, isConvertToPPTX, target_doc_content); //TODO конвертирую в текст без форматирую. пеесмотреть! var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps; if (specialPasteProps && !specialPasteProps.format) { for (var i = 0; i < insertContent.Elements.length; i++) { insertContent.Elements[i].Element.Clear_TextFormatting(); } } this._insertSelectedContentIntoShapeContent(worksheet, insertContent, target_doc_content); History.EndTransaction(); worksheet.objectRender.controller.startRecalculate(); //for special paste this._setShapeSpecialPasteProperties(worksheet, isIntoShape); }, _setShapeSpecialPasteProperties: function (worksheet, isIntoShape) { //TODO пока выключаю специальную ставку внутри math, позже доработать и включить var oInfo = new CSelectedElementsInfo(); //var selectedElementsInfo = isIntoShape.GetSelectedElementsInfo(oInfo); var mathObj = oInfo.GetMath(); if (/*!window['AscCommon'].g_specialPasteHelper.specialPasteStart && */null === mathObj) { var sProps = Asc.c_oSpecialPasteProps; var curShape = isIntoShape.Parent.parent; var asc_getcvt = Asc.getCvtRatio; var mmToPx = asc_getcvt(3/*px*/, 0/*pt*/, worksheet._getPPIX()); var cellsLeft = worksheet.cellsLeft; var cellsTop = worksheet.cellsTop; var cursorPos = isIntoShape.GetCursorPosXY(); var offsetX = worksheet._getColLeft(worksheet.visibleRange.c1) - cellsLeft; var offsetY = worksheet._getRowTop(worksheet.visibleRange.r1) - cellsTop; var posX = curShape.transformText.TransformPointX(cursorPos.X, cursorPos.Y) * mmToPx - offsetX + cellsLeft; var posY = curShape.transformText.TransformPointY(cursorPos.X, cursorPos.Y) * mmToPx - offsetY + cellsTop; posX = AscCommon.AscBrowser.convertToRetinaValue(posX); posY = AscCommon.AscBrowser.convertToRetinaValue(posY); var position = {x: posX, y: posY}; var allowedSpecialPasteProps = [sProps.sourceformatting, sProps.destinationFormatting]; window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); window['AscCommon'].g_specialPasteHelper.buttonInfo.asc_setOptions(allowedSpecialPasteProps); window['AscCommon'].g_specialPasteHelper.buttonInfo.setPosition(position); window['AscCommon'].g_specialPasteHelper.buttonInfo.setRange(cursorPos); window['AscCommon'].g_specialPasteHelper.buttonInfo.setShapeId(isIntoShape.Id); } }, _convertBeforeInsertIntoShapeContent: function (worksheet, content, isConvertToPPTX, target_doc_content) { var elements = [], selectedElement, element; var bRemoveHyperlink = false; if (target_doc_content && target_doc_content.Is_ChartTitleContent && target_doc_content.Is_ChartTitleContent()) { bRemoveHyperlink = true; } for (var i = 0; i < content.length; i++) { selectedElement = new AscCommonWord.CSelectedElement(); element = content[i]; if (type_Paragraph === element.GetType())//paragraph { selectedElement.Element = AscFormat.ConvertParagraphToPPTX(element, worksheet.getDrawingDocument(), target_doc_content, true, bRemoveHyperlink); elements.push(selectedElement); } else if (type_Table === element.GetType())//table { //excel (извне и из word) вставляет в шейпы аналогично, а вот из excel в excel вставляет в одну строку(?). мы сделаем для всех случаев одинаково. var paragraphs = []; element.GetAllParagraphs({All: true}, paragraphs); for (var j = 0; j < paragraphs.length; j++) { selectedElement = new AscCommonWord.CSelectedElement(); selectedElement.Element = AscFormat.ConvertParagraphToPPTX(paragraphs[j], worksheet.getDrawingDocument(), target_doc_content, true, bRemoveHyperlink); elements.push(selectedElement); } } } return elements; }, _insertSelectedContentIntoShapeContent: function (worksheet, selectedContent, target_doc_content) { var paragraph = target_doc_content.Content[target_doc_content.CurPos.ContentPos]; if (null != paragraph && type_Paragraph === paragraph.GetType() && selectedContent.Elements && selectedContent.Elements.length) { selectedContent.EndCollect(target_doc_content); let NearPos = {Paragraph: paragraph, ContentPos: paragraph.Get_ParaContentPos(false, false)}; paragraph.Check_NearestPos(NearPos); selectedContent.Insert(NearPos, false); var oTargetTextObject = AscFormat.getTargetTextObject(worksheet.objectRender.controller); oTargetTextObject && oTargetTextObject.checkExtentsByDocContent && oTargetTextObject.checkExtentsByDocContent(); worksheet.objectRender.controller.startRecalculate(); } }, _insertImagesFromBinary: function (ws, data, isIntoShape, needShowSpecialProps, savePosition, pastedWb) { var activeCell = ws.model.selectionRange.activeCell; var curCol, drawingObject, curRow, startCol, startRow, xfrm, aImagesSync = [], activeRow, activeCol, offX, offY, rot; //отдельная обработка для вставки одной таблички из презентаций drawingObject = data.Drawings[0]; if (data.Drawings.length === 1 && typeof AscFormat.CGraphicFrame !== "undefined" && drawingObject.graphicObject instanceof AscFormat.CGraphicFrame) { this._insertTableFromPresentation(ws, data.Drawings[0]); return; } if (window["Asc"]["editor"].collaborativeEditing.getGlobalLock() || !window["Asc"]["editor"].canEdit()) { return; } History.Create_NewPoint(); History.StartTransaction(); var _abortPaste = function (_error) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (_error) { ws.handlers.trigger("onErrorEvent", Asc.c_oAscError.ID.PasteSlicerError, Asc.c_oAscError.Level.NoCritical); } History.EndTransaction(); }; var callback = function (success, slicersNames) { if (!success) { _abortPaste(); return; } //определяем стартовую позицию, если изображений несколько вставляется var graphicObject, i; for (i = 0; i < data.Drawings.length; i++) { drawingObject = data.Drawings[i]; graphicObject = drawingObject.graphicObject; xfrm = graphicObject.spPr.xfrm; if (xfrm) { offX = 0; offY = 0; rot = AscFormat.isRealNumber(xfrm.rot) ? xfrm.rot : 0; rot = AscFormat.normalizeRotate(rot); if (AscFormat.checkNormalRotate(rot)) { if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY)) { offX = xfrm.offX; offY = xfrm.offY; } } else { if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY) && AscFormat.isRealNumber(xfrm.extX) && AscFormat.isRealNumber(xfrm.extY)) { offX = xfrm.offX + xfrm.extX / 2 - xfrm.extY / 2; offY = xfrm.offY + xfrm.extY / 2 - xfrm.extX / 2; } } if (i === 0) { startCol = offX; startRow = offY; } else { if (startCol > offX) { startCol = offX; } if (startRow > offY) { startRow = offY; } } } else { if (i === 0) { startCol = drawingObject.from.col; startRow = drawingObject.from.row; } else { if (startCol > drawingObject.from.col) { startCol = drawingObject.from.col; } if (startRow > drawingObject.from.row) { startRow = drawingObject.from.row; } } } } var aCopies = []; var oIdMap = {}; var _slicerCounter = 0; var oCopyPr = new AscFormat.CCopyObjectProperties(); oCopyPr.idMap = oIdMap; ws.objectRender.controller.resetSelection(); let aDrawings = []; for (i = 0; i < data.Drawings.length; i++) { if (slicersNames && data.Drawings[i].graphicObject.getObjectType() === AscDFH.historyitem_type_SlicerView) { if (slicersNames[_slicerCounter]) { data.Drawings[i].graphicObject.setName(slicersNames[_slicerCounter]); } else { continue; } _slicerCounter++; } var _copy = data.Drawings[i].graphicObject.copy(oCopyPr); _copy.applySpecialPasteProps(pastedWb); if (_copy.convertFromSmartArt) { _copy.convertFromSmartArt(true); } _copy.clearChartDataCache(); oIdMap[data.Drawings[i].graphicObject.Id] = _copy.Id; data.Drawings[i].graphicObject = _copy; aCopies.push(data.Drawings[i].graphicObject); drawingObject = data.Drawings[i]; AscFormat.CheckSpPrXfrm2(drawingObject.graphicObject); xfrm = drawingObject.graphicObject.spPr.xfrm; activeRow = activeCell.row; activeCol = activeCell.col; if (isIntoShape && isIntoShape.Parent && isIntoShape.Parent.parent && isIntoShape.Parent.parent.drawingBase && isIntoShape.Parent.parent.drawingBase.from) { activeRow = isIntoShape.Parent.parent.drawingBase.from.row; activeCol = isIntoShape.Parent.parent.drawingBase.from.col; } if (savePosition) { curCol = xfrm.offX; curRow = xfrm.offY; } else { curCol = xfrm.offX - startCol + ws.objectRender.convertMetric(ws._getColLeft(activeCol + 1*ws.getRightToLeft()) - ws._getColLeft(0), 0, 3); curRow = xfrm.offY - startRow + ws.objectRender.convertMetric(ws._getRowTop(activeRow) - ws._getRowTop(0), 0, 3); } drawingObject = ws.objectRender.cloneDrawingObject(drawingObject); drawingObject.graphicObject.setDrawingBase(drawingObject); drawingObject.graphicObject.setDrawingObjects(ws.objectRender); drawingObject.graphicObject.setWorksheet(ws.model); let _left = ws.checkRtl(curCol, null, 3); if (ws.getRightToLeft()) { let mmToPx = Asc.getCvtRatio(3/*px*/, 0/*pt*/, ws._getPPIX()); let _widthDrawing = drawingObject.getWidthFromTo() / mmToPx; let _widthCtx = ws.getCtxWidth() / mmToPx; if (_left + _widthDrawing > _widthCtx) { _left -= _left + _widthDrawing - _widthCtx; } } xfrm.setOffX( _left); xfrm.setOffY(curRow); aDrawings.push(drawingObject.graphicObject); drawingObject.graphicObject.getAllRasterImages(aImagesSync); } let dShift = ws.objectRender.controller.getDrawingsPasteShift(aDrawings); for (let nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing) { let oDrawing = aDrawings[nDrawing]; if (dShift > 0) { oDrawing.shiftXfrm(dShift, dShift); } oDrawing.addToDrawingObjects(); oDrawing.checkDrawingBaseCoords(); oDrawing.generateSmartArtDrawingPart(); oDrawing.recalculate(); oDrawing.select(ws.objectRender.controller, 0); } AscFormat.fResetConnectorsIds(aCopies, oIdMap); if (aImagesSync.length > 0) { window["Asc"]["editor"].ImageLoader.LoadDocumentImages(aImagesSync); } ws.objectRender.controller.updateSelectionState(); ws.objectRender.controller.updatePlaceholders(); ws.objectRender.showDrawingObjects(); if (needShowSpecialProps) { if (!window['AscCommon'].g_specialPasteHelper.buttonInfo.options) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); } else { var lastAddedImg = ws.model.Drawings[ws.model.Drawings.length - 1]; if (drawingObject && lastAddedImg) { window['AscCommon'].g_specialPasteHelper.buttonInfo.setRange({ r1: lastAddedImg.from.row, c1: lastAddedImg.from.col, r2: lastAddedImg.to.row, c2: lastAddedImg.to.col }); } } } ws.objectRender.controller.updateOverlay(); ws.setSelectionShape(true); History.EndTransaction(); if (!needShowSpecialProps) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); } window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); }; //вставляем срезы следующим образом: проверяем что вставлем в оригинальный документ //далее смотрим, есть ли такой внутренний объект этого кэша - для таблиц проверяем //соответствие имени таблицы и имени колонки //если все объекты внутренние имеются, проверяем локи, если нет - ошибка var pastedInOriginalDoc = this._checkPastedInOriginalDoc(pastedWb) var pastedSlicers = []; for (var i = 0; i < data.Drawings.length; i++) { if (data.Drawings[i].graphicObject.getObjectType() === AscDFH.historyitem_type_SlicerView) { if (pastedInOriginalDoc) { var pastedSlicer = data.getSlicerByName(data.Drawings[i].graphicObject.name); if (pastedSlicer) { if (pastedSlicer.checkModelContent(ws.model)) { pastedSlicers.push(pastedSlicer); } else { //error _abortPaste(true); return; } } } else { //error _abortPaste(true); return; } } } if (pastedSlicers && pastedSlicers.length) { ws.tryPasteSlicers(pastedSlicers, callback); } else { callback(true); } }, _insertImagesFromBinaryWord: function (ws, data, aImagesSync) { var activeRange = ws.model.selectionRange.getLast().clone(); var curCol, drawingObject, curRow, startCol = 0, startRow = 0, xfrm, drawingBase, graphicObject, offX, offY, rot; History.Create_NewPoint(); History.StartTransaction(); var api = window["Asc"]["editor"]; var addImagesFromWord = data.props.addImagesFromWord; //определяем стартовую позицию, если изображений несколько вставляется let aDrawings = []; for (var i = 0; i < addImagesFromWord.length; i++) { if (para_Math === addImagesFromWord[i].image.Type) { graphicObject = ws.objectRender.createShapeAndInsertContent(addImagesFromWord[i].image); } else { graphicObject = addImagesFromWord[i].image.GraphicObj; //convert from word if (graphicObject.setBDeleted2) { graphicObject.setBDeleted2(true); } else { graphicObject.bDeleted = true; } graphicObject = graphicObject.convertToPPTX(ws.getDrawingDocument(), ws.model, true); } //create new drawingBase drawingObject = ws.objectRender.createDrawingObject(); drawingObject.graphicObject = graphicObject; if (graphicObject.spPr && graphicObject.spPr.xfrm) { xfrm = graphicObject.spPr.xfrm; offX = 0; offY = 0; rot = AscFormat.isRealNumber(xfrm.rot) ? xfrm.rot : 0; rot = AscFormat.normalizeRotate(rot); if (AscFormat.checkNormalRotate(rot)) { if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY)) { offX = xfrm.offX; offY = xfrm.offY; } } else { if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY) && AscFormat.isRealNumber(xfrm.extX) && AscFormat.isRealNumber(xfrm.extY)) { offX = xfrm.offX + xfrm.extX / 2 - xfrm.extY / 2; offY = xfrm.offY + xfrm.extY / 2 - xfrm.extX / 2; } } if (i === 0) { startCol = offX; startRow = offY; } else { if (startCol > offX) { startCol = offX; } if (startRow > offY) { startRow = offY; } } } else { if (i === 0) { startCol = drawingObject.from.col; startRow = drawingObject.from.row; } else { if (startCol > drawingObject.from.col) { startCol = drawingObject.from.col; } if (startRow > drawingObject.from.row) { startRow = drawingObject.from.row; } } } AscFormat.CheckSpPrXfrm2(graphicObject); xfrm = graphicObject.spPr.xfrm; curCol = xfrm.offX - startCol + ws.objectRender.convertMetric(ws._getColLeft(addImagesFromWord[i].col + activeRange.c1, true) - (ws.getRightToLeft() ? - ws._getColLeft(0) : ws._getColLeft(0)), 0, 3); curRow = xfrm.offY - startRow + ws.objectRender.convertMetric(ws._getRowTop(addImagesFromWord[i].row + activeRange.r1) - ws._getRowTop(0), 0, 3); xfrm.setOffX(curCol); xfrm.setOffY(curRow); drawingObject = ws.objectRender.cloneDrawingObject(drawingObject); if (graphicObject.convertFromSmartArt) { graphicObject.convertFromSmartArt(true); } graphicObject.clearChartDataCache(); graphicObject.setDrawingBase(drawingObject); graphicObject.setDrawingObjects(ws.objectRender); graphicObject.setWorksheet(ws.model); var nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorTwoCell; if (graphicObject.getObjectType() === AscDFH.historyitem_type_ImageShape) { nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorOneCell; } graphicObject.setDrawingBaseType(nAnchorType); if (graphicObject.checkExtentsByDocContent) { graphicObject.checkDrawingBaseCoords(); graphicObject.generateSmartArtDrawingPart(); graphicObject.checkExtentsByDocContent(); } aDrawings.push(graphicObject); } let dShift = ws.objectRender.controller.getDrawingsPasteShift(aDrawings); ws.objectRender.controller.resetSelection(); for (let nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing) { let oDrawing = aDrawings[nDrawing]; if (dShift > 0) { oDrawing.shiftXfrm(dShift, dShift); } oDrawing.addToDrawingObjects(); oDrawing.checkDrawingBaseCoords(); oDrawing.recalculate(); oDrawing.select(ws.objectRender.controller, 0); } var old_val = api.ImageLoader.bIsAsyncLoadDocumentImages; api.ImageLoader.bIsAsyncLoadDocumentImages = true; api.ImageLoader.LoadDocumentImages(aImagesSync); api.ImageLoader.bIsAsyncLoadDocumentImages = old_val; ws.objectRender.showDrawingObjects(); ws.setSelectionShape(true); ws.objectRender.controller.updatePlaceholders(); ws.objectRender.controller.updateOverlay(); History.EndTransaction(); }, _loadImagesOnServer: function (aPastedImages, callback) { var api = Asc["editor"]; var oObjectsForDownload = AscCommon.GetObjectsForImageDownload(aPastedImages); AscCommon.sendImgUrls(api, oObjectsForDownload.aUrls, function (data) { var oImageMap = {}; History.TurnOff(); AscCommon.ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap); History.TurnOn(); callback(); }); }, _insertTableFromPresentation: function (ws, graphicFrame) { History.TurnOff(); //из-за данной строки падение при вставке таблицы pe->se //graphicFrame.graphicObject = graphicFrame.graphicObject.copy(); var drawingObject = graphicFrame; //вставляем табличку из презентаций var oPasteFromBinaryWord = new pasteFromBinaryWord(this, ws, true); var oTempDrawingDocument = ws.getDrawingDocument(); var newCDocument = new CDocument(oTempDrawingDocument, false); newCDocument.bFromDocument = true; newCDocument.theme = window["Asc"]["editor"].wbModel.theme; drawingObject.graphicObject.setBDeleted(true); drawingObject.graphicObject.setWordFlag(false, newCDocument); var oldLogicDocument = oTempDrawingDocument.m_oLogicDocument; oTempDrawingDocument.m_oLogicDocument = newCDocument; drawingObject.graphicObject.graphicObject.Set_Parent(newCDocument); oTempDrawingDocument.m_oLogicDocument = oldLogicDocument; History.TurnOn(); oPasteFromBinaryWord._paste(ws, {content: [drawingObject.graphicObject.graphicObject]}); }, editorPasteExec: function (worksheet, node, isText, cb) { if (node === undefined) { return; } var binaryResult, t = this; t.alreadyLoadImagesOnServer = false; //если находимся внутри шейпа var isIntoShape = worksheet.objectRender.controller.getTargetDocContent(); if (isIntoShape) { var callback = function (isSuccess) { if (isSuccess) { t._pasteInShape(worksheet, node, isIntoShape); } else { window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); } if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } }; worksheet.objectRender.controller.checkPasteInText(callback); return; } //****binary**** if (copyPasteUseBinary) { this.activeRange = worksheet.model.selectionRange.getLast().clone(); binaryResult = this._pasteFromBinaryClassHtml(worksheet, node, isIntoShape); if (binaryResult === true) { return; } else if (binaryResult !== false && binaryResult !== undefined) { node = binaryResult; } } AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = cb; this.activeRange = worksheet.model.selectionRange.getLast().clone(); worksheet.workbook.handlers.trigger("cleanCopyData", true); var callBackAfterLoadImages = function () { History.TurnOff(); var oTempDrawingDocument = worksheet.getDrawingDocument(); var newCDocument = new CDocument(oTempDrawingDocument, false); newCDocument.bFromDocument = true; //TODo!!!!!! newCDocument.Content[0].bFromDocument = true; newCDocument.theme = window["Asc"]["editor"].wbModel.theme; var oOldLogicDocument = oTempDrawingDocument.m_oLogicDocument; oTempDrawingDocument.m_oLogicDocument = newCDocument; var oOldEditor = undefined; if ("undefined" !== typeof editor) { oOldEditor = editor; } editor = {WordControl: oTempDrawingDocument, isDocumentEditor: true}; var oPasteProcessor = new AscCommon.PasteProcessor({ WordControl: {m_oLogicDocument: newCDocument}, FontLoader: {} }, false, false, null, true); oPasteProcessor._Prepeare_recursive(node, true, true); //при специальной вставке в firefox _getComputedStyle возвращает null //TODO пересмотреть функцию _getComputedStyle let specialPasteHelper = window['AscCommon'].g_specialPasteHelper; let specialPasteProps = specialPasteHelper.specialPasteProps; let props = specialPasteProps ? specialPasteProps.property : null; if (window['AscCommon'].g_specialPasteHelper.specialPasteStart && window['AscCommon'].g_specialPasteHelper.specialPasteData.aContent && props !== Asc.c_oSpecialPasteProps.picture) { oPasteProcessor.aContent = window['AscCommon'].g_specialPasteHelper.specialPasteData.aContent; } else { oPasteProcessor._Execute(node, {}, true, true, false); if (props !== Asc.c_oSpecialPasteProps.picture) { window['AscCommon'].g_specialPasteHelper.specialPasteData.aContent = oPasteProcessor.aContent; } } editor = oOldEditor; oTempDrawingDocument.m_oLogicDocument = oOldLogicDocument; History.TurnOn(); var oPasteFromBinaryWord = new pasteFromBinaryWord(t, worksheet); oPasteFromBinaryWord._paste(worksheet, {content: oPasteProcessor.aContent}); }; var aImagesToDownload = this._getImageFromHtml(node, true); var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps; var api = Asc["editor"]; if (aImagesToDownload !== null && (!specialPasteProps || (specialPasteProps && specialPasteProps.images)))//load to server { AscCommon.sendImgUrls(api, aImagesToDownload, function (data) { for (var i = 0, length = Math.min(data.length, aImagesToDownload.length); i < length; ++i) { var elem = data[i]; var sFrom = aImagesToDownload[i]; if (null != elem.url) { t.oImages[sFrom] = AscCommon.g_oDocumentUrls.imagePath2Local(elem.path); } else { t.oImages[sFrom] = sFrom; } } t.alreadyLoadImagesOnServer = true; callBackAfterLoadImages(); }); } else { callBackAfterLoadImages(); } }, _pasteFromBinaryClassHtml: function (worksheet, node, isIntoShape) { //find class xslData or docData var returnBinary = this._getClassBinaryFromHtml(node); var base64 = returnBinary.base64; var base64FromWord = returnBinary.base64FromWord; var base64FromPresentation = returnBinary.base64FromPresentation; var base64FromPDF = returnBinary.base64FromPDF; var result = false; if (base64 != null)//from excel { result = this._pasteFromBinaryExcel(worksheet, base64, isIntoShape); } else if (base64FromWord)//from word { result = this._pasteFromBinaryWord(worksheet, base64FromWord, isIntoShape); worksheet.workbook.handlers.trigger("cleanCopyData", true); } else if (base64FromPresentation) { result = this._pasteFromBinaryPresentation(worksheet, base64FromPresentation, isIntoShape); worksheet.workbook.handlers.trigger("cleanCopyData", true); } else if (base64FromPDF) { result = this._pasteFromBinaryPDF(worksheet, base64FromPDF, isIntoShape); worksheet.workbook.handlers.trigger("cleanCopyData", true); } return result; }, _getClassBinaryFromHtml: function (node) { var base64 = null, base64FromWord = null, base64FromPresentation = null, base64FromPDF; var classNode = AscCommon.searchBinaryClass(node); if (classNode != null) { var cL = classNode.split(" "); for (var i = 0; i < cL.length; i++) { if (cL[i].indexOf("xslData;") > -1) { base64 = 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 {base64: base64, base64FromWord: base64FromWord, base64FromPresentation: base64FromPresentation, base64FromPDF: base64FromPDF}; }, _getImageFromHtml: function (html, isGetUrlsArray) { var res = null; if (html) { var allImages = html.getElementsByTagName('img'); if (allImages && allImages.length) { if (isGetUrlsArray) { var arrayImages = []; for (var i = 0; i < allImages.length; i++) { arrayImages[i] = allImages[i].src; } res = arrayImages; } else { res = allImages; } } } return res; }, _getBinaryColor: function (c) { var bin, m, x, type, r, g, b, a, s; var reColor = /^\s*(?:#?([0-9a-f]{6})|#?([0-9a-f]{3})|rgba?\s*\(\s*((?:\d*\.?\d+)(?:\s*,\s*(?:\d*\.?\d+)){2,3})\s*\))\s*$/i; if (typeof c === "number") { bin = c; } else { m = reColor.exec(c); if (!m) { return null; } if (m[1]) { x = [m[1].slice(0, 2), m[1].slice(2, 4), m[1].slice(4)]; type = 1; } else if (m[2]) { x = [m[2].slice(0, 1), m[2].slice(1, 2), m[2].slice(2)]; type = 0; } else { x = m[3].split(/\s*,\s*/i); type = x.length === 3 ? 2 : 3; } r = parseInt(type !== 0 ? x[0] : x[0] + x[0], type < 2 ? 16 : 10); g = parseInt(type !== 0 ? x[1] : x[1] + x[1], type < 2 ? 16 : 10); b = parseInt(type !== 0 ? x[2] : x[2] + x[2], type < 2 ? 16 : 10); a = type === 3 ? (Math.round(parseFloat(x[3]) * 100) * 0.01) : 1; bin = (r << 16) | (g << 8) | b; } return bin; }, _checkMaxTextLength: function (aResult, r, c) { var result = false; var isChange = false; var currentCellData = aResult.content[r][c]; if (currentCellData && currentCellData.content) { currentCellData = currentCellData.content; for (var i = 0; i < currentCellData.length; i++) { if (currentCellData[i] && currentCellData[i].text && currentCellData[i].text.length > c_oAscMaxCellOrCommentLength) { isChange = true; var text = currentCellData[i].text; var format = currentCellData[i].format; var lengthOfText = text.length; var iterCount = Math.ceil(lengthOfText / c_oAscMaxCellOrCommentLength); var splitText; for (var j = 0; j < iterCount; j++) { splitText = text.substr(c_oAscMaxCellOrCommentLength * j, c_oAscMaxCellOrCommentLength * (j + 1)); if (!aResult.content[r]) { aResult.content[r] = []; } if (!aResult.content[r][c]) { aResult.content[r][c] = []; } if (!aResult.content[r][c].content) { aResult.content[r][c].content = []; } aResult.content[r][c].content[0] = {format: format, text: splitText}; if (iterCount !== j + 1) { r++; } } } } if (isChange) { result = {aResult: aResult, r: r, c: c}; } } return result; }, _getBorderStyleName: function (borderStyle, borderWidth) { var res = null; var nBorderWidth = parseFloat(borderWidth); if (isNaN(nBorderWidth)) { return res; } if (typeof borderWidth === "string" && -1 !== borderWidth.indexOf("pt")) { nBorderWidth = nBorderWidth * 96 / 72; } switch (borderStyle) { case "solid": if (0 < nBorderWidth && nBorderWidth <= 1) { res = c_oAscBorderStyles.Thin; } else if (1 < nBorderWidth && nBorderWidth <= 2) { res = c_oAscBorderStyles.Medium; } else if (2 < nBorderWidth && nBorderWidth <= 6) { res = c_oAscBorderStyles.Thick; } else { res = c_oAscBorderStyles.None; } break; case "dashed": if (0 < nBorderWidth && nBorderWidth <= 1) { res = c_oAscBorderStyles.DashDot; } else { res = c_oAscBorderStyles.MediumDashDot; } break; case "double": res = c_oAscBorderStyles.Double; break; case "dotted": res = c_oAscBorderStyles.Hair; break; } return res; }, ReadPresentationShapes: function (stream, worksheet) { History.TurnOff(); var loader = new AscCommon.BinaryPPTYLoader(); loader.presentation = worksheet.model; loader.DrawingDocument = worksheet.getDrawingDocument(); loader.Start_UseFullUrl(); loader.ClearConnectedObjects(); loader.stream = stream; var count = stream.GetULong(); var arr_shapes = []; var arr_transforms = []; var arrBase64Img = []; var cStyle; for (var i = 0; i < count; ++i) { var style_index = null; //читаем флаг о наличии табличного стиля if (!loader.stream.GetBool()) { if (loader.stream.GetBool()) { loader.stream.Skip2(1); cStyle = loader.ReadTableStyle(); loader.stream.GetBool(); style_index = stream.GetString2(); } } var drawing = loader.ReadGraphicObject(); var isGraphicFrame = typeof AscFormat.CGraphicFrame !== "undefined" && drawing instanceof AscFormat.CGraphicFrame; //для случая, когда копируем 1 таблицу из презентаций, в бинарник заносим ещё одну такую же табличку, но со скомпиоированными стилями(для вставки в word / excel) if (count === 1 && isGraphicFrame) { 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 (count !== 1 && isGraphicFrame) { drawing = AscFormat.DrawingObjectsController.prototype.createImage(base64, x, y, extX, extY); arrBase64Img.push( new AscCommon.CBuilderImages(drawing.blipFill, base64, drawing, drawing.spPr, null)); } var oDrawingBase = worksheet.objectRender.createDrawingObject(); oDrawingBase.graphicObject = drawing; var nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorTwoCell; if (drawing.getObjectType() === AscDFH.historyitem_type_ImageShape) { nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorOneCell; } oDrawingBase.Type = nAnchorType; arr_shapes[i] = oDrawingBase; } loader.AssignConnectedObjects(); History.TurnOn(); var arrImages = arrBase64Img.concat(loader.End_UseFullUrl()); return {arrShapes: arr_shapes, arrImages: arrImages, arrTransforms: arr_transforms}; }, ReadFromBinaryWord: function (sBase64, worksheet) { History.TurnOff(); AscCommon.g_oIdCounter.m_bRead = true; //передавать CDrawingDocument текущего worksheet var oTempDrawingDocument = worksheet.getDrawingDocument(); var newCDocument = new CDocument(oTempDrawingDocument, false); newCDocument.bFromDocument = true; newCDocument.theme = window["Asc"]["editor"].wbModel.theme; var old_m_oLogicDocument = oTempDrawingDocument.m_oLogicDocument; oTempDrawingDocument.m_oLogicDocument = newCDocument; var oOldEditor = undefined; if ("undefined" !== typeof editor) { oOldEditor = editor; } //создается глобальная переменная editor = {isDocumentEditor: true, WordControl: {m_oLogicDocument: newCDocument}}; pptx_content_loader.Clear(); pptx_content_loader.Start_UseFullUrl(); var openParams = {checkFileSize: false, charCount: 0, parCount: 0, bCopyPaste: true}; var oBinaryFileReader = new AscCommonWord.BinaryFileReader(newCDocument, openParams); var oRes = oBinaryFileReader.ReadFromString(sBase64, {excelCopyPaste: true}); //check parents if (oRes.content) { for (let i = 0; i < oRes.content.length; i++) { if (oRes.content[i] && oRes.content[i].Parent == null) { oRes.content[i].Parent = newCDocument; } } } var defrPr = oBinaryFileReader.oReadResult && oBinaryFileReader.oReadResult.DefrPr; if (defrPr && newCDocument.Styles && newCDocument.Styles.Default && newCDocument.Styles.Default.TextPr) { newCDocument.Styles.Default.TextPr.FontSize = defrPr.FontSize; if (defrPr.RFonts && defrPr.RFonts.Ascii !== undefined) { newCDocument.Styles.Default.TextPr.RFonts = defrPr.RFonts; } } pptx_content_loader.End_UseFullUrl(); oTempDrawingDocument.m_oLogicDocument = old_m_oLogicDocument; History.TurnOn(); AscCommon.g_oIdCounter.m_bRead = false; editor = oOldEditor; return oRes; }, _checkPasteFromBinaryExcel: function (worksheet, isWriteError, insertWorksheet) { var t = this; var activeCellsPasteFragment = false; AscCommonExcel.executeInR1C1Mode(false, function () { activeCellsPasteFragment = AscCommonExcel.g_oRangeCache.getAscRange(t.activeRange); }); var lastRange = worksheet.model.selectionRange.getLast(); var rMax = (activeCellsPasteFragment.r2 - activeCellsPasteFragment.r1) + lastRange.r1; var cMax = (activeCellsPasteFragment.c2 - activeCellsPasteFragment.c1) + lastRange.c1; var res = true; //если область вставки выходит за пределы доступной области if (cMax > AscCommon.gc_nMaxCol0 || rMax > AscCommon.gc_nMaxRow0) { if (isWriteError) { worksheet.handlers.trigger("onErrorEvent", Asc.c_oAscError.ID.PasteMaxRangeError, Asc.c_oAscError.Level.NoCritical); } res = false; } else if (worksheet.handlers && !worksheet.handlers.trigger("getLockDefNameManagerStatus") && insertWorksheet && insertWorksheet.TableParts && insertWorksheet.TableParts.length) { //если пытаемся вставить вторым пользователем форматированную таблицу, когда первый уже добавил другую форматированную таблицу worksheet.handlers.trigger("onErrorEvent", c_oAscError.ID.LockCreateDefName, c_oAscError.Level.NoCritical); res = false; } return res; }, _pasteInShape: function (worksheet, node, targetDocContent) { var t = this; targetDocContent.DrawingDocument.m_oLogicDocument = null; var oPasteProcessor = new AscCommon.PasteProcessor({ WordControl: {m_oLogicDocument: targetDocContent}, FontLoader: {} }, false, false, true, true); oPasteProcessor.map_font_index = window["Asc"]["editor"].FontLoader.map_font_index; oPasteProcessor.bIsDoublePx = false; oPasteProcessor.pasteInPresentationShape = true; var newFonts; //если находимся внутри диаграммы убираем ссылки if (targetDocContent && targetDocContent.Parent && targetDocContent.Parent.parent && targetDocContent.Parent.parent.chart) { var changeTag = $(node).find("a"); this._changeHtmlTag(changeTag); } oPasteProcessor._Prepeare_recursive(node, true, true); oPasteProcessor.aContent = []; newFonts = this._convertFonts(oPasteProcessor.oFonts); History.StartTransaction(); oPasteProcessor._Execute(node, {}, true, true, false); if (!oPasteProcessor.aContent || !oPasteProcessor.aContent.length) { History.EndTransaction(); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); return false; } var targetContent = worksheet.objectRender.controller.getTargetDocContent(true);//нужно для заголовков диаграмм targetContent.Remove(1, true, true); worksheet._loadFonts(newFonts, function () { //TODO конвертирую в текст без форматирую. пеесмотреть! var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps; if (specialPasteProps && !specialPasteProps.format) { for (var i = 0; i < oPasteProcessor.aContent.length; i++) { oPasteProcessor.aContent[i].Clear_TextFormatting(); } } oPasteProcessor.InsertInPlace(targetContent, oPasteProcessor.aContent); var oTargetTextObject = AscFormat.getTargetTextObject(worksheet.objectRender.controller); oTargetTextObject && oTargetTextObject.checkExtentsByDocContent && oTargetTextObject.checkExtentsByDocContent(); worksheet.objectRender.controller.startRecalculate(); History.EndTransaction(); t._setShapeSpecialPasteProperties(worksheet, targetContent); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); }); return true; }, _convertFonts: function (oFonts) { var newFonts = {}; var fontName; for (var i in oFonts) { fontName = oFonts[i] ? (oFonts[i].Name || oFonts[i].name) : undefined; if (undefined !== fontName) { newFonts[fontName] = 1; } } return newFonts; }, _convertTableFromExcelToDocument: function (worksheet, aContentExcel, documentContent) { var oCurPar = new AscWord.Paragraph(documentContent); var getElem = function (text, format, isAddSpace, isHyperLink) { var result = null; var value = text; if (isAddSpace) { value += " "; } if ("" === value) { return result; } if (isHyperLink) { var oCurHyperlink = new ParaHyperlink(); oCurHyperlink.SetParagraph(oCurPar); var sHValue = ""; if (typeof isHyperLink.Hyperlink === "string") { sHValue = isHyperLink.Hyperlink; } oCurHyperlink.Set_Value(sHValue); if (isHyperLink.Tooltip) { oCurHyperlink.SetToolTip(isHyperLink.Tooltip); } } var oCurRun = new ParaRun(oCurPar); //***text property*** if (format) { oCurRun.Pr.Bold = format.getBold(); oCurRun.Pr.Italic = format.getItalic(); oCurRun.Pr.Strikeout = format.getStrikeout(); oCurRun.Pr.Underline = format.getUnderline() !== 2; } for (var k = 0, length = value.length; k < length; k++) { var nUnicode = null; var nCharCode = value.charCodeAt(k); if (AscCommon.isLeadingSurrogateChar(nCharCode)) { if (k + 1 < length) { k++; var nTrailingChar = value.charCodeAt(k); nUnicode = AscCommon.decodeSurrogateChar(nCharCode, nTrailingChar); } } else { nUnicode = nCharCode; } if (null != nUnicode) { var Item; if (0x20 !== nUnicode && 0xA0 !== nUnicode && 0x2009 !== nUnicode) { Item = new AscWord.CRunText(nUnicode); } else { Item = new AscWord.CRunSpace(); } //add text oCurRun.Add_ToContent(k, Item, false); } } //add run if (oCurHyperlink) { oCurHyperlink.Add_ToContent(0, oCurRun, false); result = oCurHyperlink; } else { result = oCurRun; } return result; }; var n = 0; aContentExcel._forEachCell(function (cell) { var isHyperlink = aContentExcel.getCell3(cell.nRow, cell.nCol).getHyperlink(); var multiText = cell.getValueMultiText(), format, elem; if (multiText) { for (var m = 0; m < multiText.length; m++) { var curMultiText = multiText[m]; format = curMultiText.format; elem = getElem(curMultiText.text, format); if (null !== elem) { oCurPar.Internal_Content_Add(n, elem, false); n++; } } } else { format = cell.xfs && cell.xfs.font ? cell.xfs.font : null; elem = getElem(cell.getValue(), format, null, isHyperlink); if (null !== elem) { oCurPar.Internal_Content_Add(n, elem, false); n++; } } //add space elem = getElem("", null, true); oCurPar.Internal_Content_Add(n, elem, false); n++; }); return oCurPar; }, //TODO сделать при получаении структуры. игнорировать размер шрифта и тп _changeHtmlTag: function (arr) { var oldElem, value, style, bold, underline, italic; for (var i = 0; i < arr.length; i++) { oldElem = arr[i]; value = oldElem.innerText; underline = "none"; if (oldElem.style.textDecoration && oldElem.style.textDecoration != "") { underline = oldElem.style.textDecoration; } italic = "normal"; if (oldElem.style.textDecoration && oldElem.style.textDecoration != "") { italic = oldElem.style.fontStyle; } bold = "normal"; if (oldElem.style.fontWeight && oldElem.style.fontWeight != "") { bold = oldElem.style.fontWeight; } style = ' style = "text-decoration:' + underline + ";" + "font-style:" + italic + ";" + "font-weight:" + bold + ";" + '"'; $(oldElem).replaceWith("" + value + ""); } }, pasteTextOnSheet: function (worksheet, text) { var t = this; if (!text || (text && !text.length)) { window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return; } //TEXT IMPORT WITH OPTIONS var specialPasteHelper = window['AscCommon'].g_specialPasteHelper; var specialPasteProps = specialPasteHelper.specialPasteProps; var textImport; var props = specialPasteProps ? specialPasteProps.property : null; textImport = props === c_oSpecialPasteProps.useTextImport; //TODO сделать вставку текста всегда через эту функцию this.activeRange = worksheet.model.selectionRange.getLast().clone(true); //если находимся внутри шейпа var isIntoShape = worksheet.objectRender.controller.getTargetDocContent(); if (isIntoShape) { var callback = function (isSuccess) { if (isSuccess === false) { window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return false; } isIntoShape = worksheet.objectRender.controller.getTargetDocContent(true); if (!isIntoShape) { return false; } isIntoShape.Remove(1, true, true); var Count = text.length; var newParagraph = new AscWord.Paragraph(isIntoShape); var selectedElements = new AscCommonWord.CSelectedContent(); var insertText = ""; for (var Index = 0; Index < Count; Index++) { var _char = text.charAt(Index); var _charCode = text.charCodeAt(Index); if (_charCode !== 0x0A) { insertText += _char; } if (_charCode === 0x0A || Index === Count - 1) { var newParaRun = new ParaRun(); window['AscCommon'].addTextIntoRun(newParaRun, insertText); newParagraph.Internal_Content_Add(newParagraph.Content.length - 1, newParaRun, false); var selectedElement = new AscCommonWord.CSelectedElement(); selectedElement.Element = newParagraph; selectedElements.Elements.push(selectedElement); insertText = ""; newParagraph = new AscWord.Paragraph(isIntoShape); } } t._insertSelectedContentIntoShapeContent(worksheet, selectedElements, isIntoShape); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(true); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } window['AscCommon'].g_specialPasteHelper.CleanButtonInfo(); window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); //for special paste if (!window['AscCommon'].g_specialPasteHelper.specialPasteStart) { var sProps = Asc.c_oSpecialPasteProps; var allowedSpecialPasteProps = [sProps.sourceformatting, sProps.destinationFormatting]; } }; //check text AscFonts.FontPickerByCharacter.getFontsByString(text); worksheet._loadFonts([], function () { worksheet.objectRender.controller.checkPasteInText(callback); }); return; } if (textImport) { var advancedOptions = specialPasteProps.asc_getAdvancedOptions(); if (Asc.typeOf(text) !== "array") { text = AscCommon.parseText(text, advancedOptions, true); } } var aResult = this._getTableFromText(text, textImport); if (aResult) { if (textImport) { var arn = worksheet.model.selectionRange.getLast().clone(); var width = aResult.content && aResult.content[0] ? aResult.content[0].length - 1 : 0; var height = aResult.content ? aResult.content.length - 1 : 0; var arnTo = new Asc.Range(arn.c1, arn.r1, arn.c1 + width, arn.r1 + height); var resmove = worksheet.model._prepareMoveRange(arn, arnTo); if (resmove === -2) { window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); worksheet.handlers.trigger("onErrorEvent", c_oAscError.ID.CannotMoveRange, c_oAscError.Level.NoCritical); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } } else if (resmove === -1) { worksheet.model.workbook.handlers.trigger("asc_onConfirmAction", Asc.c_oAscConfirm.ConfirmReplaceRange, function (can) { if (can) { worksheet.setSelectionInfo('paste', {data: aResult, bText: true}); } else { window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } } }); } else { worksheet.setSelectionInfo('paste', {data: aResult, bText: true}); } } else { worksheet.setSelectionInfo('paste', {data: aResult, bText: true}); } } }, _getTextFromWorksheet: function (worksheet) { var res = ""; var curRow = -1; worksheet._forEachCell(function (cell) { if (curRow !== cell.nRow) { if (-1 !== curRow) { res += '\r\n'; } curRow = cell.nRow; } else { res += " "; } res += cell.getValue(); }); return res; }, _getTextFromWord: function (data) { var res = ""; var getTextFromCell = function (cell) { if (cell.Content && cell.Content.Content) { getTextFromDocumentContent(cell.Content.Content, true); } }; var getTextFromTable = function (table) { for (var i = 0; i < table.Content.length; i++) { var row = table.Content[i]; for (var j = 0; j < row.Content.length; j++) { res += " "; var cell = row.Content[j]; getTextFromCell(cell); } res += '\r\n'; } }; var getTextFromDocumentContent = function (documentContent, isNAddNewLine) { for (var i = 0; i < documentContent.length; i++) { var item = documentContent[i]; if (type_Paragraph === item.GetType()) { if (!isNAddNewLine) { res += '\r\n'; } getTextFromParagraph(item); } else if (type_Table === item.GetType()) { res += '\r\n'; getTextFromTable(item); } } }; var getTextFromParagraph = function (paragraph) { for (var j = 0; j < paragraph.Content.length; j++) { if (para_Math === paragraph.Content[j].GetType() && paragraph.Content[j].Root) { var mathTextContent = paragraph.Content[j].Root.GetTextContent(); if (mathTextContent) { res += mathTextContent.str; } } else { res += paragraph.Content[j].GetSelectedText(true); } } }; getTextFromDocumentContent(data); return res; }, _getTableFromText: function (text, bPastedArray) { var addTextIntoCell = function (row, col, sText) { var cell = aResult.getCell(rowCounter, colCounter); //check text AscFonts.FontPickerByCharacter.getFontsByString(sText); cell.content[0] = {text: sText, format: new AscCommonExcel.Font()}; return cell; }; var aResult = new excelPasteContent(); var width = 0; var colCounter = 0; var rowCounter = 0; var sCurChar = ""; var _parseText = function (sText, ignoreTab) { if (bPastedArray && sText === "") { if (colCounter > width) { width = colCounter; } addTextIntoCell(rowCounter, colCounter, sText); sCurChar = ""; } for (var i = 0, length = sText.length; i < length; i++) { var Char = sText.charAt(i); var Code = sText.charCodeAt(i); if (colCounter > width) { width = colCounter; } if (13 === Code || '\n' === Char || sCurChar.length >= Asc.c_oAscMaxCellOrCommentLength) { if ("" === sCurChar) { addTextIntoCell(rowCounter, colCounter, sCurChar); colCounter = 0; rowCounter++; } else { addTextIntoCell(rowCounter, colCounter, sCurChar); colCounter = 0; rowCounter++; sCurChar = ""; } } else { if (32 === Code || 160 === Code) {//160 - nbsp sCurChar += " "; } else if (9 === Code) {//tab if (!ignoreTab) { addTextIntoCell(rowCounter, colCounter, sCurChar); colCounter++; sCurChar = ""; } } else { sCurChar += Char; } if (i === length - 1) { addTextIntoCell(rowCounter, colCounter, sCurChar); sCurChar = ""; } } } }; if (!bPastedArray) { text = text.replace(/\r\n/g, '\n'); _parseText(text); } else { for (var i = 0; i < text.length; i++) { colCounter = 0; if (text[i]) { for (var j = 0; j < text[i].length; j++) { _parseText(text[i][j], true); colCounter++; } } rowCounter++; } } aResult.props.cellCount = width + 1; aResult.props.rowSpanSpCount = 0; return aResult; }, _getFragmentsFromHtml: function (html) { //даная функция рассчитана только на вставку символа из плагина //TODO для вставки полноценной html нужно писать обработку var res = null; if (html && html.children) { for (var i = 0; i < html.children.length; i++) { if (html.children[i] && html.children[i].nodeName) { var sChildNodeName = html.children[i].nodeName.toLowerCase(); if (sChildNodeName === "style" || sChildNodeName === "#comment" || sChildNodeName === "script") { continue; } } if (!res) { res = {fragments: [], fonts: {}}; } var children = html.children[i]; var computedStyle = this._getComputedStyle(children); var fragment = new AscCommonExcel.Fragment(); var format = new AscCommonExcel.Font(); if (computedStyle) { var bold = computedStyle.getPropertyValue("font-weight"); if ("bold" === bold) { format.setBold(true); } /*var color = computedStyle.getPropertyValue("color"); if(color){ format.setColor(color); }*/ var italic = computedStyle.getPropertyValue("font-style"); if ("italic" === italic) { format.setItalic(true); } var fontFamily = window["AscCommon"].CheckDefaultFontFamily(computedStyle.getPropertyValue("font-family"), window["Asc"]["editor"]); fontFamily = g_fontApplication.GetFontNameDictionary(fontFamily, true); if (fontFamily) { format.setName(fontFamily); res.fonts[fontFamily] = 1; } /*var fontSize = computedStyle.getPropertyValue("font-size"); if(fontSize){ format.setSize(fontSize); }*/ var text_decoration = computedStyle.getPropertyValue("text-decoration"); if (text_decoration) { var underline, Strikeout; if (-1 !== text_decoration.indexOf("underline")) { underline = true; } else if (-1 !== text_decoration.indexOf("none")) { underline = false; } if (-1 !== text_decoration.indexOf("line-through")) { Strikeout = true; } if (underline) { format.setUnderline(true); } if (Strikeout) { format.setUnderline(true); } } } fragment.setFragmentText(children.innerText); AscFonts.FontPickerByCharacter.getFontsByString(fragment.getFragmentText()); fragment.format = format; res.fragments.push(fragment); } } return res; }, _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; } }; /** @constructor */ function excelPasteContent() { this.content = []; this.props = {}; return this; } excelPasteContent.prototype = { constructor: excelPasteContent, setCellContent: function (row, col, data) { if (!this.content[row]) { this.content[row] = []; } if (!this.content[row][col]) { this.content[row][col] = []; } this.content[row][col] = data; }, getCell: function (row, col) { if (!this.content[row]) { this.content[row] = []; } if (!this.content[row][col]) { this.content[row][col] = new pasteCell(); } return this.content[row][col]; }, deleteCell: function (row, col) { delete this.content[row][col]; } }; /** @constructor */ function pasteCell() { this.content = []; this.rowSpan = null; this.colSpan = null; this.bc = null; this.borders = null; this.toolTip = null; this.hyperLink = null; this.location = null; this.indent = null; this.props = null; return this; } pasteCell.prototype = { constructor: pasteCell, addContentItem: function (item) { this.content.push(item); }, clone: function () { var result = new pasteCell(); for (var item = 0; item < this.content.length; item++) { result.content[item] = {text: this.content[item].text, format: this.content[item].format}; } result.borders = this.borders; result.rowSpan = this.rowSpan; result.colSpan = this.colSpan; result.toolTip = this.toolTip; result.bc = this.bc; result.hyperLink = this.hyperLink; result.location = this.location; result.alignVertical = this.alignVertical; result.alignHorizontal = this.alignHorizontal; return result; } }; /** @constructor */ function pasteFromBinaryWord(clipboard, ws, bFromPresentation) { this.aResult = new excelPasteContent(); this.fontsNew = {}; this.clipboard = clipboard; this.ws = ws; this.isUsuallyPutImages = null; this.maxLengthRowCount = 0; //для этого сделал функцию _getParagraphMeasure у DocumentContentBoundsElement //this.rowDiff = 0;//для обработки данных в ране, разделенных shift+enter this.paragraphText = ""; this.bFromPresentation = bFromPresentation; this.prevTextPr = null; //работает когда есть внутренние табы //TODO в дальнейшем учитывать внутреннии табы в DocumentContentBounds this.maxCellCount = 0; this.footnotesCount = 0; return this; } pasteFromBinaryWord.prototype = { constructor: pasteFromBinaryWord, _paste: function (worksheet, pasteData) { var documentContent = pasteData.content; var t = this; //у родителя(CDocument) проставляю контент. нужно для вставки извне нумерованного списка. ф-ия CalculateNumberingValues требует наличие этих параграфов в родителе. var cDocument = documentContent && documentContent[0] && documentContent[0].Parent instanceof CDocument ? documentContent[0].Parent : null; if (cDocument && cDocument.Content && 1 === cDocument.Content.length) { cDocument.Content = documentContent; } if (pasteData.images && pasteData.images.length) { this.isUsuallyPutImages = true; } if (!documentContent || (documentContent && !documentContent.length)) { window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return; } var documentContentBounds = new DocumentContentBounds(); var coverDocument = documentContentBounds.getBounds(0, 0, documentContent); AscFormat.ExecuteNoHistory(this._parseChildren, this, [coverDocument]); //не вставляем графику в редактор диаграмм //если кроме графики есть ещё данные, то убираем только графику if (window["Asc"]["editor"] && window["Asc"]["editor"].isChartEditor) { if (this.aResult.props && this.aResult.props.addImagesFromWord && this.aResult.props.addImagesFromWord.length === 1 && this.aResult.content) { if (1 === this.aResult.content.length && 1 === this.aResult.content[0].length && this.aResult.content[0][0].content && this.aResult.content[0][0].content.length === 0) { window['AscCommon'].g_specialPasteHelper.Paste_Process_End(); if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) { AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false); AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null; } return; } else { this.aResult.props.addImagesFromWord = []; this.clipboard.alreadyLoadImagesOnServer = true; } } } var newFonts = this.fontsNew; if (pasteData.fonts && pasteData.fonts.length) { newFonts = {}; for (var i = 0; i < pasteData.fonts.length; i++) { newFonts[pasteData.fonts[i].name] = 1; } } this.aResult.props.fontsNew = newFonts; this.aResult.props.rowSpanSpCount = 0; this.aResult.props.cellCount = this.maxCellCount + 1 > coverDocument.width ? this.maxCellCount + 1 : coverDocument.width; this.aResult.props._images = pasteData.images && pasteData.images.length ? pasteData.images : this.aResult.props._images; this.aResult.props._aPastedImages = pasteData.aPastedImages && pasteData.aPastedImages.length ? pasteData.aPastedImages : this.aResult.props._aPastedImages; //TODO alreadyLoadImagesOnServer - пересмотреть //alreadyLoadImagesOnServer - флаг используется для загрузки изображений из html //грузим картинки для вствки из документов(если это необходимо) //в данный момент в worksheetView не грузятся изображения var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps; var aImagesToDownload = this.aResult.props._images; if (!this.clipboard.alreadyLoadImagesOnServer && aImagesToDownload && (!specialPasteProps || (specialPasteProps && specialPasteProps.images)))//load to server { var oObjectsForDownload = AscCommon.GetObjectsForImageDownload(t.aResult.props._aPastedImages); var api = window["Asc"]["editor"]; var oImageMap = {}; AscCommon.sendImgUrls(api, oObjectsForDownload.aUrls, function (data) { History.TurnOff(); AscCommon.ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap); History.TurnOn(); t.aResult.props.oImageMap = oImageMap; t.aResult.props.data = data; worksheet.setSelectionInfo('paste', {data: t.aResult}); }); } else { worksheet.setSelectionInfo('paste', {data: t.aResult}); } }, _parseChildren: function (children) { var childrens = children.children; var colSpan, rowSpan; for (var i = 0; i < childrens.length; i++) { if (childrens[i].type === c_oAscBoundsElementType.Cell) { for (var row = childrens[i].top; row < childrens[i].top + childrens[i].height; row++) { for (var col = childrens[i].left; col < childrens[i].left + childrens[i].width; col++) { var isCtable = false; var tempChildren = childrens[i].children[0].children; colSpan = null; rowSpan = null; for (var temp = 0; temp < tempChildren.length; temp++) { if (tempChildren[temp].type === c_oAscBoundsElementType.Table) { isCtable = true; } } if (childrens[i].width > 1 && isCtable && col === childrens[i].left) { colSpan = childrens[i].width; rowSpan = 1; } else if (!isCtable && tempChildren.length === 1) { rowSpan = childrens[i].height; colSpan = childrens[i].width; } var newCell = this.aResult.getCell(row /*+ this.rowDiff*/, col); newCell.rowSpan = rowSpan; newCell.colSpan = colSpan; //backgroundColor var backgroundColor = this.getBackgroundColorTCell(childrens[i]); if (backgroundColor) { newCell.bc = backgroundColor; } newCell.borders = this._getBorders(childrens[i], row, col, newCell.borders); var alignVertical = childrens[i].elem.Get_VAlign(); switch (alignVertical) { case vertalignjc_Bottom: newCell.alignVertical = Asc.c_oAscVAlign.Bottom; break; case vertalignjc_Center: newCell.alignVertical = Asc.c_oAscVAlign.Center; break; case vertalignjc_Top: newCell.alignVertical = Asc.c_oAscVAlign.Top; break; } } } } if (childrens[i].children.length === 0) { //if parent - cell of table colSpan = null; rowSpan = null; this._parseParagraph(childrens[i], childrens[i].top /*+ this.rowDiff*/, childrens[i].left); } else { this._parseChildren(childrens[i]); } } }, _parseParagraph: function (paragraph, row, col) { this.paragraphText = ""; var t = this; var content = paragraph.elem.Content; var fontFamily = "Arial"; var text = null; var oNewItem = new pasteCell(); var aResult = this.aResult; if (row === undefined) { if (aResult.content.length === 0) { row = 0; } else { row = aResult.length; } } var cell = this.aResult.getCell(row + this.maxLengthRowCount, col); if (cell && cell.content && cell.content.length === 0 && (cell.borders || cell.rowSpan != null)) { if (cell.borders) { oNewItem.borders = cell.borders; } if (undefined !== cell.alignVertical) { oNewItem.alignVertical = cell.alignVertical; } if (cell.rowSpan != null) { oNewItem.rowSpan = cell.rowSpan; oNewItem.colSpan = cell.colSpan; } this.aResult.deleteCell(row + this.maxLengthRowCount, col) } var startRow = row; var innerCol = 0; if (col === undefined) { col = 0; } //backgroundColor var backgroundColor = this.getBackgroundColorTCell(paragraph); if (backgroundColor) { oNewItem.bc = backgroundColor; } //настройки параграфа paragraph.elem.CompiledPr.NeedRecalc = true; var paraPr = paragraph.elem.Get_CompiledPr(); var firstLine = paraPr && paraPr.ParaPr && paraPr.ParaPr.Ind && paraPr.ParaPr.Ind.Left; if (firstLine) { oNewItem.indent = parseInt(firstLine / AscCommon.koef_mm_to_indent); if (oNewItem.indent < 0) { oNewItem.indent = null; } } //горизонтальное выравнивание var horisontalAlign = this._getAlignHorisontal(paraPr); if (horisontalAlign == null) { oNewItem.wrap = true; } oNewItem.alignHorizontal = horisontalAlign; //вертикальное выравнивание //oNewItem.alignVertical = Asc.c_oAscVAlign.Center; //так же wrap выставляем у параграфа, чьим родителем является ячейка таблицы var cellParent = this._getParentByTag(paragraph, c_oAscBoundsElementType.Cell); if (cellParent) { oNewItem.wrap = !(cellParent.elem && cellParent.elem.Pr && true === cellParent.elem.Pr.NoWrap); } //Numbering var LvlPr = null; var Lvl = null; var oNumPr = paragraph.elem.GetNumPr ? paragraph.elem.GetNumPr() : null; var numberingText = null; var formatText; if (oNumPr != null) { var oNum = paragraph.elem.Parent.GetNumbering().GetNum(oNumPr.NumId); if (oNum) { LvlPr = oNum.GetLvl(oNumPr.Lvl); Lvl = oNumPr.Lvl; } numberingText = this._parseNumbering(paragraph.elem); if (text == null) { text = ""; } text += this._getAllNumberingText(Lvl, numberingText); formatText = this._getPrParaRun(paraPr, LvlPr.GetTextPr()); fontFamily = formatText.format.getName(); this.fontsNew[fontFamily] = 1; oNewItem.content.push(formatText); if (text !== null) { oNewItem.content[oNewItem.content.length - 1].text = text; this.paragraphText += text; } text = ""; } //проходимся по контенту paragraph var paraRunObj; //получае общий шрифт для ячейки для случая когда вставляем нумерованный список //общего может не быть в том случае, если шрифты внутри ячейки разные var allParaFont, textPr; for (var n = 0; n < content.length; n++) { this.aResult.getCell(row + this.maxLengthRowCount, innerCol + col); if (text == null) { text = ""; } switch (content[n].Type) { case para_Run://*paraRun* { paraRunObj = this._parseParaRun(content[n], oNewItem, paraPr, innerCol, row, col, text); if (null !== allParaFont) { textPr = content[n].Get_CompiledPr(); if (textPr && textPr.FontFamily && textPr.FontFamily.Name) { if (undefined === allParaFont) { allParaFont = textPr.FontFamily.Name; } } else if (textPr.FontFamily.Name !== allParaFont) { allParaFont = null; } } innerCol = paraRunObj.col; row = paraRunObj.row; oNewItem = paraRunObj.oNewItem; break; } case para_Hyperlink://*hyperLink* { //если несколько ссылок в одном параграфе, то отменяем ссылки if (!oNewItem.doNotApplyHyperlink) { if (!oNewItem.hyperLink) { oNewItem.hyperLink = content[n].Value; oNewItem.toolTip = content[n].ToolTip; oNewItem.location = content[n].Anchor; } else { oNewItem.hyperLink = null; oNewItem.toolTip = null; oNewItem.doNotApplyHyperlink = true; } } var lastTab; for (var h = 0; h < content[n].Content.length; h++) { switch (content[n].Content[h].Type) { case para_Run://*paraRun* { paraRunObj = this._parseParaRun(content[n].Content[h], oNewItem, paraPr, innerCol, row, col, text); oNewItem = paraRunObj.oNewItem; innerCol = paraRunObj.col; row = paraRunObj.row; if (lastTab) { oNewItem.hyperLink = content[n].Value; oNewItem.toolTip = content[n].ToolTip; oNewItem.location = content[n].Anchor; } lastTab = paraRunObj.lastTab; break; } } } allParaFont = null; break; } case para_Math://*para_Math* { if (this.bFromPresentation) { var mathTextContent = content[n].Root.GetTextContent(); if (mathTextContent) { var newParaRun = new ParaRun(); window['AscCommon'].addTextIntoRun(newParaRun, mathTextContent.str); var objTemp = t._parseParaRun(newParaRun, oNewItem, paraPr, innerCol, row, col, text); innerCol = objTemp.col; row = objTemp.row; } } else { var tempFonts = []; content[n].Get_AllFontNames(tempFonts); for (var i in tempFonts) { this.fontsNew[i] = 1; } if (!aResult.props.addImagesFromWord) { aResult.props.addImagesFromWord = []; } aResult.props.addImagesFromWord.push( {image: content[n], col: innerCol + col, row: row}); if (null === this.isUsuallyPutImages) { this._addImageToMap(content[n]); } } allParaFont = null; break; } case para_InlineLevelSdt://*InlineLevelSdt* { //TODO allParaFont ? for (h = 0; h < content[n].Content.length; h++) { switch (content[n].Content[h].Type) { case para_Run://*paraRun* { paraRunObj = this._parseParaRun(content[n].Content[h], oNewItem, paraPr, innerCol, row, col, text); oNewItem = paraRunObj.oNewItem; innerCol = paraRunObj.col; row = paraRunObj.row; break; } } } break; } } } if (null !== numberingText && allParaFont) { oNewItem.props = {fontName: allParaFont}; } oNewItem.textVal = this.paragraphText; //this.rowDiff += row - startRow; }, _parseParaRun: function (paraRun, oNewItem, paraPr, innerCol, row, col, text, prevTextPr) { var t = this; var paraRunContent = paraRun.Content; var aResult = this.aResult; var paragraphFontFamily = paraPr.TextPr.FontFamily.Name; var cloneNewItem, formatText; var newLine = "\n"; var cTextPr = prevTextPr ? prevTextPr : paraRun.Get_CompiledPr(); if (cTextPr && !(paraRunContent.length === 1 && paraRunContent[0] instanceof AscWord.CRunParagraphMark))//settings for text { formatText = this._getPrParaRun(paraPr, cTextPr); } else if (!formatText) { formatText = this._getPrParaRun(paraPr, cTextPr); } this.prevTextPr = cTextPr; var pushData = function () { t.fontsNew[paragraphFontFamily] = 1; oNewItem.content.push(formatText); if (text !== null) { oNewItem.content[oNewItem.content.length - 1].text = text; } cloneNewItem = oNewItem.clone(); cloneNewItem.rowSpan = null; cloneNewItem.colSpan = null; //переходим в следующую ячейку cell = aResult.getCell(row + t.maxLengthRowCount, innerCol + col); aResult.setCellContent(row + t.maxLengthRowCount, innerCol + col, cloneNewItem); text = ""; oNewItem = new pasteCell(); }; //проходимся по контенту paraRun var cell; var lastTab; for (var pR = 0; pR < paraRunContent.length; pR++) { lastTab = false; switch (paraRunContent[pR].Type) { case para_Math_BreakOperator: case para_Math_Text: { text += AscCommon.encodeSurrogateChar(paraRunContent[pR].value); break; } case para_Text: { text += AscCommon.encodeSurrogateChar(paraRunContent[pR].Value); break; } case para_NewLine: { //on feature: read ms style comments and use only sameCell flag if (AscCommon.g_clipboardBase.pastedFrom === AscCommon.c_oClipboardPastedFrom.Excel || (paraRunContent[pR].Flags && paraRunContent[pR].Flags.sameCell)) { text += newLine; } else { pushData(); row++; innerCol = 0; } break; } case para_Space: { text += " "; break; } case para_Tab: { pushData(); lastTab = true; innerCol++; if (innerCol > this.maxCellCount) { this.maxCellCount = innerCol; } break; } case para_Drawing: { if (!aResult.props.addImagesFromWord) { aResult.props.addImagesFromWord = []; } var drawing = this._checkDrawingList(paraRunContent[pR]); aResult.props.addImagesFromWord.push({image: drawing, col: innerCol + col, row: row}); if (null === this.isUsuallyPutImages) { this._addImageToMap(drawing); } break; } case para_FootnoteReference: { if (1 === paraRunContent.length) { var footnotesNumber = this.footnotesCount + 1; text += "[" + footnotesNumber + "]"; this.footnotesCount++; } break; } case para_End: { cell = aResult.getCell(row, innerCol + col); aResult.setCellContent(row, innerCol + col, oNewItem); var checkMaxTextLength = this.clipboard._checkMaxTextLength(this.aResult, row + this.maxLengthRowCount, innerCol + col); if (checkMaxTextLength) { aResult.content = checkMaxTextLength.aResult.content; this.maxLengthRowCount += checkMaxTextLength.r - row; } break; } } } if (text !== "") { this.fontsNew[paragraphFontFamily] = 1; oNewItem.content.push(formatText); if (text !== null) { oNewItem.content[oNewItem.content.length - 1].text = text; this.paragraphText += text; } } return {col: innerCol, row: row, prevTextPr: cTextPr, oNewItem: oNewItem, lastTab: lastTab}; }, _addImageToMap: function (paraDrawing) { var aResult = this.aResult; if (!aResult.props._aPastedImages) { aResult.props._aPastedImages = []; } if (!aResult.props._images) { aResult.props._images = []; } var oGraphicObj = paraDrawing.GraphicObj; if (!oGraphicObj || (oGraphicObj && !oGraphicObj.blipFill) || (oGraphicObj && oGraphicObj.blipFill && !oGraphicObj.blipFill.RasterImageId)) { return; } var sImageUrl = oGraphicObj.blipFill.RasterImageId; aResult.props._aPastedImages.push(new AscCommon.CBuilderImages(oGraphicObj.blipFill, sImageUrl, oGraphicObj, oGraphicObj.spPr, null)); aResult.props._images.push(sImageUrl); }, _checkDrawingList: function (drawing) { var t = this; var checkParagraph = function (paragraph) { //TODO не могу получить в данном случае GetNumPr /*var LvlPr = null; var Lvl = null; var oNumPr = paragraph.GetNumPr ? paragraph.GetNumPr() : null; var numberingText = null; var formatText; if (oNumPr != null) { var oNum = paragraph.Parent.GetNumbering().GetNum(oNumPr.NumId); if (oNum) { LvlPr = oNum.GetLvl(oNumPr.Lvl); Lvl = oNumPr.Lvl; } numberingText = t._parseNumbering(paragraph); var text = t._getAllNumberingText(Lvl, numberingText); formatText = this._getPrParaRun(paraPr, LvlPr.GetTextPr()); }*/ }; if (drawing.GraphicObj && drawing.GraphicObj.textBoxContent && drawing.GraphicObj.textBoxContent.Content) { var content = drawing.GraphicObj.textBoxContent.Content; for (var i = 0; i < content.length; i++) { checkParagraph(content[i]); } } return drawing; }, _getBorders: function (cellTable, top, left, oldBorders) { var borders = cellTable.elem.Get_Borders(); var widthCell = cellTable.width; var heightCell = cellTable.height; var defaultStyle = "solid"; var borderStyleName; var t = this; var getBorderColor = function (curBorder) { var color = null; var backgroundColor = null; var unifill = curBorder.Unifill && curBorder.Unifill.fill && curBorder.Unifill.fill.color ? curBorder.Unifill.fill.color : null; if (unifill && unifill.color && unifill.color.type !== Asc.c_oAscColor.COLOR_TYPE_SCHEME && unifill.color.RGBA) { color = unifill.color.RGBA; backgroundColor = new AscCommonExcel.RgbColor(t.clipboard._getBinaryColor("rgb(" + color.R + "," + color.G + "," + color.B + ")")); } else { color = curBorder.Color; backgroundColor = new AscCommonExcel.RgbColor(t.clipboard._getBinaryColor("rgb(" + color.r + "," + color.g + "," + color.b + ")")); } return backgroundColor; }; var formatBorders; if (oldBorders) { formatBorders = oldBorders; } else { formatBorders = new AscCommonExcel.Border(); formatBorders.initDefault(); } //top border for cell if (top === cellTable.top && (!formatBorders.t || formatBorders.t.isEmpty()) && borders.Top.Value !== AscWord.BorderType.none) { borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Top.Size, 3, 1)); if (null !== borderStyleName) { formatBorders.t = new AscCommonExcel.BorderProp(); formatBorders.t.setStyle(borderStyleName); formatBorders.t.c = getBorderColor(borders.Top); } } //left border for cell if (left === cellTable.left && (!formatBorders.l || formatBorders.l.isEmpty()) && borders.Left.Value !== AscWord.BorderType.none) { borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Left.Size, 3, 1)); if (null !== borderStyleName) { formatBorders.l = new AscCommonExcel.BorderProp(); formatBorders.l.setStyle(borderStyleName); formatBorders.l.c = getBorderColor(borders.Left); } } //bottom border for cell if (top === cellTable.top + heightCell - 1 && (!formatBorders.b || formatBorders.b.isEmpty()) && borders.Bottom.Value !== AscWord.BorderType.none) { borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Bottom.Size, 3, 1)); if (null !== borderStyleName) { formatBorders.b = new AscCommonExcel.BorderProp(); formatBorders.b.setStyle(borderStyleName); formatBorders.b.c = getBorderColor(borders.Bottom); } } //right border for cell if (left === cellTable.left + widthCell - 1 && (!formatBorders.r || formatBorders.r.isEmpty()) && borders.Right.Value !== AscWord.BorderType.none) { borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Right.Size, 3, 1)); if (null !== borderStyleName) { formatBorders.r = new AscCommonExcel.BorderProp(); formatBorders.r.setStyle(borderStyleName); formatBorders.r.c = getBorderColor(borders.Right); } } return formatBorders; }, _getAlignHorisontal: function (paraPr) { var result; var settings = paraPr.ParaPr; if (!settings) { return; } switch (settings.Jc) { case 0: { result = AscCommon.align_Right; break; } case 1: { result = AscCommon.align_Left; break; } case 2: { result = AscCommon.align_Center; break; } case 3: { result = null; break; } } return result; }, getBackgroundColorTCell: function (elem) { var compiledPrCell, color; var backgroundColor = null; //TODO внутреннии таблицы без стиля - цвет фона белый var tableCell = this._getParentByTag(elem, c_oAscBoundsElementType.Cell); if (tableCell) { compiledPrCell = tableCell.elem.Get_CompiledPr(); if (compiledPrCell && compiledPrCell.Shd.Value !== 1/*shd_Nil*/) { var shd = compiledPrCell.Shd; if (shd.Unifill && shd.Unifill.fill && shd.Unifill.fill.color && shd.Unifill.fill.color.color && shd.Unifill.fill.color.color.RGBA) { color = shd.Unifill.fill.color.color.RGBA; backgroundColor = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + color.R + "," + color.G + "," + color.B + ")")); } else { color = shd.Color; backgroundColor = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + color.r + "," + color.g + "," + color.b + ")")); } } } return backgroundColor; }, _getParentByTag: function (elem, tag) { var result; if (!elem) { return null; } if (elem.type === tag) { result = elem; } else if (elem.parent) { result = this._getParentByTag(elem.parent, tag); } else if (!elem.parent) { result = null; } return result; }, _getAllNumberingText: function (Lvl, numberingText) { var preSpace, result; if (Lvl === 0) { preSpace = " "; } else if (Lvl === 1) { preSpace = " "; } else if (Lvl >= 2) { preSpace = " "; } var betweenSpace = " "; result = preSpace + numberingText + betweenSpace; return result; }, _parseNumbering: function (paragraph) { var Pr = paragraph.Get_CompiledPr(); if (paragraph.Numbering) { var NumberingItem = paragraph.Numbering; if (para_Numbering === NumberingItem.Type) { var NumPr = Pr.ParaPr.NumPr; if (undefined === NumPr || undefined === NumPr.NumId || 0 === NumPr.NumId || "0" === NumPr.NumId) { // Ничего не делаем } else { var Numbering = paragraph.Parent.GetNumbering(); var NumLvl = Numbering.GetNum(NumPr.NumId).GetLvl(NumPr.Lvl); //var NumSuff = NumLvl.GetSuff(); //var NumJc = NumLvl.GetJc(); var NumTextPr = paragraph.Get_CompiledPr2(false).TextPr.Copy(); // Word не рисует подчеркивание у символа списка, если оно пришло из настроек для // символа параграфа. var TextPr_temp = paragraph.TextPr.Value.Copy(); TextPr_temp.Underline = undefined; NumTextPr.Merge(TextPr_temp); NumTextPr.Merge(NumLvl.GetTextPr()); var text = null; var oNumPr = paragraph.GetNumPr(); var Lvl; if (oNumPr != null) { var oNum = paragraph.Parent.GetNumbering().GetNum(oNumPr.NumId); if (null != oNum) { Lvl = oNumPr.Lvl; text = oNum.GetText(Lvl, paragraph.Parent.CalculateNumberingValues(paragraph, NumPr)); } } return text; } } } }, _getPrParaRun: function (paraPr, cTextPr) { var formatText, fontFamily, colorText; var paragraphFontSize = paraPr.TextPr.FontSize; var paragraphFontFamily = paraPr.TextPr && paraPr.TextPr.FontFamily ? paraPr.TextPr.FontFamily.Name : "Arial"; var paragraphBold = paraPr.TextPr.Bold; var paragraphItalic = paraPr.TextPr.Italic; var paragraphStrikeout = paraPr.TextPr.Strikeout; var paragraphUnderline = paraPr.TextPr.Underline ? Asc.EUnderline.underlineSingle : Asc.EUnderline.underlineNone; var paragraphVertAlign = null; if (paraPr.TextPr.VertAlign === 1) { paragraphVertAlign = AscCommon.vertalign_SuperScript; } else if (paraPr.TextPr.VertAlign === 2) { paragraphVertAlign = AscCommon.vertalign_SubScript; } var colorParagraph = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + paraPr.TextPr.Color.r + "," + paraPr.TextPr.Color.g + "," + paraPr.TextPr.Color.b + ")")); if (cTextPr.Color) { colorText = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + cTextPr.Color.r + "," + cTextPr.Color.g + "," + cTextPr.Color.b + ")")); } else { colorText = null; } fontFamily = cTextPr.FontFamily ? cTextPr.FontFamily.Name : cTextPr.RFonts.CS ? cTextPr.RFonts.CS.Name : paragraphFontFamily; this.fontsNew[fontFamily] = 1; var verticalAlign; if (cTextPr.VertAlign === 2) { verticalAlign = AscCommon.vertalign_SubScript; } else if (cTextPr.VertAlign === 1) { verticalAlign = AscCommon.vertalign_SuperScript; } var font = new AscCommonExcel.Font(); font.assignFromObject({ fn: fontFamily, fs: cTextPr.FontSize ? cTextPr.FontSize : paragraphFontSize, c: colorText ? colorText : colorParagraph, b: cTextPr.Bold ? cTextPr.Bold : paragraphBold, i: cTextPr.Italic ? cTextPr.Italic : paragraphItalic, u: cTextPr.Underline ? Asc.EUnderline.underlineSingle : paragraphUnderline, s: cTextPr.Strikeout ? cTextPr.Strikeout : cTextPr.DStrikeout ? cTextPr.DStrikeout : paragraphStrikeout, va: verticalAlign ? verticalAlign : paragraphVertAlign }); formatText = { format: font }; return formatText; } }; var c_oAscBoundsElementType = { Content: 0, Paragraph: 1, Table: 2, Row: 3, Cell: 4 }; function DocumentContentBoundsElement(elem, type, parent) { this.elem = elem; this.type = type; this.parent = parent; this.children = []; this.left = 0; this.top = 0; this.width = 0; this.height = 0; } function DocumentContentBounds() { } DocumentContentBounds.prototype = { constructor: DocumentContentBounds, getBounds: function (nLeft, nTop, aDocumentContent) { //в первный проход заполняем размеры //и могут заноситься относительные сдвиги при небходимости var oRes = this._getMeasure(aDocumentContent, null); //заполняем абсолютные сдвиги this._getOffset(nLeft, nTop, oRes); return oRes; }, _getOffset: function (nLeft, nTop, elem) { elem.left += nLeft; elem.top += nTop; var nCurLeft = elem.left; var nCurTop = elem.top; var bIsRow = elem.elem instanceof CTableRow; for (var i = 0, length = elem.children.length; i < length; i++) { var child = elem.children[i]; this._getOffset(nCurLeft, nCurTop, child); if (bIsRow) nCurLeft += child.width; else nCurTop += child.height; } }, _getMeasure: function (aDocumentContent, oParent) { var oRes = new DocumentContentBoundsElement(aDocumentContent, c_oAscBoundsElementType.Content, oParent); for (var i = 0, length = aDocumentContent.length; i < length; i++) { var elem = aDocumentContent[i]; var oNewElem = null; if (type_Paragraph === elem.GetType()) { oNewElem = this._getParagraphMeasure(elem, oRes); } else if (type_Table === elem.GetType()) { elem.ReIndexing(0); oNewElem = this._getTableMeasure(elem, oRes); } else if (type_BlockLevelSdt === elem.GetType()) { oNewElem = this._getMeasure(elem.Content.Content, oRes); } if (null != oNewElem) { oRes.children.push(oNewElem); if (oNewElem.width && oNewElem.width > oRes.width) oRes.width = oNewElem.width; oRes.height += oNewElem.height; } } return oRes; }, _getParagraphMeasure: function (elem, oParent) { var oNewElem = new DocumentContentBoundsElement(elem, c_oAscBoundsElementType.Paragraph, oParent); oNewElem.width = 1; oNewElem.height = 1; for (var i = 0, length = elem.Content.length; i < length; i++) { if (elem.Content[i] && elem.Content[i].Content) { for (var j = 0; j < elem.Content[i].Content.length; j++) { let innerElem = elem.Content[i].Content[j]; if (innerElem && para_NewLine === innerElem.GetType()) { //on feature: read ms style comments and use only sameCell flag if (AscCommon.g_clipboardBase.pastedFrom !== AscCommon.c_oClipboardPastedFrom.Excel && !(innerElem.Flags && innerElem.Flags.sameCell === true)) { oNewElem.height++; } } } } } return oNewElem; }, _getTableMeasure: function (table, oParent) { var oRes = new DocumentContentBoundsElement(table, c_oAscBoundsElementType.Table, oParent); //надо рассчитать сколько ячеек приходится на tableGrid, по умолчанию по одной //todo надо оптимизировать размер var aGridWidth = [], i, length; for (i = 0, length = table.TableGrid.length; i < length; i++) aGridWidth.push(1); //заполняем aGridWidth for (i = 0, length = table.Content.length; i < length; i++) { var row = table.Content[i]; var oNewElem = this._setRowGridWidth(row, oRes, aGridWidth); if (null != oNewElem) oRes.children.push(oNewElem); } var aSumGridWidth = []; var nTempSum = 0; for (i = 0, length = aGridWidth.length; i < length + 1; i++) { aSumGridWidth[i] = nTempSum; var nCurValue = aGridWidth[i]; if (nCurValue) nTempSum += nCurValue; } //заполняем размеры for (i = 0, length = oRes.children.length; i < length; i++) { var rowWrapped = oRes.children[i]; this._getRowMeasure(rowWrapped, aSumGridWidth, oRes.children, i); oRes.height += rowWrapped.height; //в left временно занесен относительный сдвиг if (rowWrapped.width + rowWrapped.left > oRes.width) oRes.width = rowWrapped.width + rowWrapped.left; } return oRes; }, _setRowGridWidth: function (row, oParent, aGridWidth) { var oRes = new DocumentContentBoundsElement(row, c_oAscBoundsElementType.Row, oParent); var nSumGrid = 0; var BeforeInfo = row.Get_Before(); if (BeforeInfo && BeforeInfo.GridBefore) nSumGrid += BeforeInfo.GridBefore; for (var i = 0, length = row.Content.length; i < length; i++) { var cell = row.Content[i]; var oNewCell = new DocumentContentBoundsElement(cell, c_oAscBoundsElementType.Cell, oRes); oRes.children.push(oNewCell); var oNewElem = this._getMeasure(cell.Content.Content, oNewCell); oNewCell.children.push(oNewElem); oNewCell.width = oNewElem.width; oNewCell.height = oNewElem.height; if (oNewCell.height > oRes.height) oRes.height = oNewCell.height; var nCellGrid = cell.Get_GridSpan(); if (oNewElem.width > nCellGrid) { var nFirstGridWidth = oNewElem.width - nCellGrid + 1; var nCurValue = aGridWidth[nSumGrid]; if (null != nCurValue && nCurValue < nFirstGridWidth) aGridWidth[nSumGrid] = nFirstGridWidth; } nSumGrid += nCellGrid; } return oRes; }, _getRowMeasure: function (rowWrapped, aSumGridWidth, rows, index) { var getNotMergedPreviousCell = function (i) { var res = null; if (rows && index > 0) { for (var j = index; j >= 0; j--) { if (rows[j] && rows[j].children && rows[j].children[i]) { var vMerge = rows[j].children[i].elem.GetVMerge(); if (1 === vMerge) { res = rows[j].children[i]; break; } } } } return res; }; var nSumGrid = 0; var BeforeInfo = rowWrapped.elem.Get_Before(); if (BeforeInfo && BeforeInfo.GridBefore) { //временно заносим относительный сдвиг rowWrapped.left = aSumGridWidth[nSumGrid + BeforeInfo.GridBefore] - aSumGridWidth[nSumGrid]; nSumGrid += BeforeInfo.GridBefore; } for (var i = 0, length = rowWrapped.children.length; i < length; i++) { var cellWrapped = rowWrapped.children[i]; var nCellGrid = cellWrapped.elem.Get_GridSpan(); cellWrapped.width = aSumGridWidth[nSumGrid + nCellGrid] - aSumGridWidth[nSumGrid]; //выравниваем высоту ячеек по-максимому cellWrapped.height = rowWrapped.height; rowWrapped.width += cellWrapped.width; nSumGrid += nCellGrid; //vertical merge var previousCell = getNotMergedPreviousCell(i); if (previousCell) { var vMerge = cellWrapped.elem.GetVMerge(); if (vMerge > 1) { previousCell.height += vMerge - 1; } } } } }; //---------------------------------------------------------export--------------------------------------------------- var g_clipboardExcel = new Clipboard(); window['AscCommonExcel'] = window['AscCommonExcel'] || {}; window['AscCommonExcel'].g_clipboardExcel = g_clipboardExcel; window["Asc"]["SpecialPasteProps"] = window["Asc"].SpecialPasteProps = CSpecialPasteProps; prot = CSpecialPasteProps.prototype; prot["asc_setProps"] = prot.asc_setProps; prot["asc_getProps"] = prot.asc_getProps; prot["asc_setAdvancedOptions"] = prot.asc_setAdvancedOptions; prot["asc_setOperation"] = prot.asc_setOperation; prot["asc_getOperation"] = prot.asc_getOperation; prot["asc_setTranspose"] = prot.asc_setTranspose; prot["asc_setSkipBlanks"] = prot.asc_setSkipBlanks; prot["asc_getTableAllowed"] = prot.asc_getTableAllowed; } )(jQuery, window);