UNPKG

oda-framework

Version:

It's an ES Progressive Framework based on the technology of Web Components and designed especially for creating custom UI/UX of any complexity for web and cross-platform PWA mobile applications.

1,019 lines (924 loc) 814 kB
/** * pptxjs.js * Ver. : 1.21.1 * last update: 16/11/2021 * Author: meshesha , https://github.com/meshesha * LICENSE: MIT * url:https://pptx.js.org/ * fix issues: * [#16](https://github.com/meshesha/PPTXjs/issues/16) */ (function ($) { $.fn.pptxToHtml = function (options) { //var worker; var $result = $(this); var divId = $result.attr("id"); var isDone = false; var MsgQueue = new Array(); //var slideLayoutClrOvride = ""; var defaultTextStyle = null; var chartID = 0; var _order = 1; var app_verssion ; var rtl_langs_array = ["he-IL", "ar-AE", "ar-SA", "dv-MV", "fa-IR","ur-PK"] var slideFactor = 96 / 914400; var fontSizeFactor = 4 / 3.2; ////////////////////// var slideWidth = 0; var slideHeight = 0; var isSlideMode = false; var processFullTheme = true; var styleTable = {}; var settings = $.extend(true, { // These are the defaults. pptxFileUrl: "", fileInputId: "", slidesScale: "", //Change Slides scale by percent slideMode: false, /** true,false*/ slideType: "divs2slidesjs", /*'divs2slidesjs' (default) , 'revealjs'(https://revealjs.com) -TODO*/ revealjsPath: "", /*path to js file of revealjs - TODO*/ keyBoardShortCut: false, /** true,false ,condition: slideMode: true XXXXX - need to remove - this is doublcated*/ mediaProcess: true, /** true,false: if true then process video and audio files */ jsZipV2: false, themeProcess: true, /*true (default) , false, "colorsAndImageOnly"*/ incSlide:{ width: 0, height: 0 }, slideModeConfig: { first: 1, nav: true, /** true,false : show or not nav buttons*/ navTxtColor: "black", /** color */ keyBoardShortCut: true, /** true,false ,condition: */ showSlideNum: true, /** true,false */ showTotalSlideNum: true, /** true,false */ autoSlide: true, /** false or seconds , F8 to active ,keyBoardShortCut: true */ randomAutoSlide: false, /** true,false ,autoSlide:true */ loop: false, /** true,false */ background: false, /** false or color*/ transition: "default", /** transition type: "slid","fade","default","random" , to show transition efects :transitionTime > 0.5 */ transitionTime: 1 /** transition time between slides in seconds */ }, revealjsConfig: {} }, options); processFullTheme = settings.themeProcess; $("#" + divId).prepend( $("<div></div>").attr({ "class": "slides-loadnig-msg", "style": "display:block; width:100%; color:white; background-color: #ddd;" })/*.html("Loading...")*/ .html($("<div></div>").attr({ "class": "slides-loading-progress-bar", "style": "width: 1%; background-color: #4775d1;" }).html("<span style='text-align: center;'>Loading... (1%)</span>")) ); if (settings.slideMode) { if (!jQuery().divs2slides) { jQuery.getScript('./js/divs2slides.js'); } } if (settings.jsZipV2 !== false) { jQuery.getScript(settings.jsZipV2); if (localStorage.getItem('isPPTXjsReLoaded') !== 'yes') { localStorage.setItem('isPPTXjsReLoaded', 'yes'); location.reload(); } } if (settings.keyBoardShortCut) { $(document).bind("keydown", function (event) { event.preventDefault(); var key = event.keyCode; console.log(key, isDone) if (key == 116 && !isSlideMode) { //F5 isSlideMode = true; initSlideMode(divId, settings); } else if (key == 116 && isSlideMode) { //exit slide mode - TODO } }); } FileReaderJS.setSync(false); if (settings.pptxFileUrl != "") { try{ JSZipUtils.getBinaryContent(settings.pptxFileUrl, function (err, content) { var blob = new Blob([content]); var file_name = settings.pptxFileUrl; var fArry = file_name.split("."); fArry.pop(); blob.name = fArry[0]; FileReaderJS.setupBlob(blob, { readAsDefault: "ArrayBuffer", on: { load: function (e, file) { //console.log(e.target.result); convertToHtml(e.target.result); } } }); }); }catch(e){ console.error("file url error (" + settings.pptxFileUrl+ "0)") $(".slides-loadnig-msg").remove(); } } else { $(".slides-loadnig-msg").remove() } if (settings.fileInputId != "") { $("#" + settings.fileInputId).on("change", function (evt) { $result.html(""); var file = evt.target.files[0]; // var fileName = file[0].name; //var fileSize = file[0].size; var fileType = file.type; if (fileType == "application/vnd.openxmlformats-officedocument.presentationml.presentation") { FileReaderJS.setupBlob(file, { readAsDefault: "ArrayBuffer", on: { load: function (e, file) { //console.log(e.target.result); convertToHtml(e.target.result); } } }); } else { alert("This is not pptx file"); } }); } function updateProgressBar(percent) { //console.log("percent: ", percent) var progressBarElemtnt = $(".slides-loading-progress-bar") progressBarElemtnt.width(percent + "%") progressBarElemtnt.html("<span style='text-align: center;'>Loading...(" + percent + "%)</span>"); } function convertToHtml(file) { //'use strict'; //console.log("file", file, "size:", file.byteLength); if (file.byteLength < 10){ console.error("file url error (" + settings.pptxFileUrl + "0)") $(".slides-loadnig-msg").remove(); return; } var zip = new JSZip(), s; //if (typeof file === 'string') { // Load zip = zip.load(file); //zip.load(file, { base64: true }); var rslt_ary = processPPTX(zip); //s = readXmlFile(zip, 'ppt/tableStyles.xml'); //var slidesHeight = $("#" + divId + " .slide").height(); for (var i = 0; i < rslt_ary.length; i++) { switch (rslt_ary[i]["type"]) { case "slide": $result.append(rslt_ary[i]["data"]); break; case "pptx-thumb": //$("#pptx-thumb").attr("src", "data:image/jpeg;base64," +rslt_ary[i]["data"]); break; case "slideSize": slideWidth = rslt_ary[i]["data"].width; slideHeight = rslt_ary[i]["data"].height; /* $("#"+divId).css({ 'width': slideWidth + 80, 'height': slideHeight + 60 }); */ break; case "globalCSS": //console.log(rslt_ary[i]["data"]) $result.append("<style>" + rslt_ary[i]["data"] + "</style>"); break; case "ExecutionTime": processMsgQueue(MsgQueue); setNumericBullets($(".block")); setNumericBullets($("table td")); isDone = true; if (settings.slideMode && !isSlideMode) { isSlideMode = true; initSlideMode(divId, settings); } else if (!settings.slideMode) { $(".slides-loadnig-msg").remove(); } break; case "progress-update": //console.log(rslt_ary[i]["data"]); //update progress bar - TODO updateProgressBar(rslt_ary[i]["data"]) break; default: } } if (!settings.slideMode || (settings.slideMode && settings.slideType == "revealjs")) { if (document.getElementById("all_slides_warpper") === null) { $("#" + divId + " .slide").wrapAll("<div id='all_slides_warpper' class='slides'></div>"); //$("#" + divId + " .slides").wrap("<div class='reveal'></div>"); } if (settings.slideMode && settings.slideType == "revealjs") { $("#" + divId).addClass("reveal") } } var sScale = settings.slidesScale; var trnsfrmScl = ""; if (sScale != "") { var numsScale = parseInt(sScale); var scaleVal = numsScale / 100; if (settings.slideMode && settings.slideType != "revealjs") { trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top'; } } var slidesHeight = $("#" + divId + " .slide").height(); var numOfSlides = $("#" + divId + " .slide").length; var sScaleVal = (sScale != "") ? scaleVal : 1; //console.log("slidesHeight: " + slidesHeight + "\nnumOfSlides: " + numOfSlides + "\nScale: " + sScaleVal) $("#all_slides_warpper").attr({ style: trnsfrmScl + ";height: " + (numOfSlides * slidesHeight * sScaleVal) + "px" }) //} } function initSlideMode(divId, settings) { //console.log(settings.slideType) if (settings.slideType == "" || settings.slideType == "divs2slidesjs") { var slidesHeight = $("#" + divId + " .slide").height(); $("#" + divId + " .slide").hide(); setTimeout(function () { var slideConf = settings.slideModeConfig; $(".slides-loadnig-msg").remove(); $("#" + divId).divs2slides({ first: slideConf.first, nav: slideConf.nav, showPlayPauseBtn: settings.showPlayPauseBtn, navTxtColor: slideConf.navTxtColor, keyBoardShortCut: slideConf.keyBoardShortCut, showSlideNum: slideConf.showSlideNum, showTotalSlideNum: slideConf.showTotalSlideNum, autoSlide: slideConf.autoSlide, randomAutoSlide: slideConf.randomAutoSlide, loop: slideConf.loop, background: slideConf.background, transition: slideConf.transition, transitionTime: slideConf.transitionTime }); var sScale = settings.slidesScale; var trnsfrmScl = ""; if (sScale != "") { var numsScale = parseInt(sScale); var scaleVal = numsScale / 100; trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top'; } var numOfSlides = 1; var sScaleVal = (sScale != "") ? scaleVal : 1; //console.log(slidesHeight); $("#all_slides_warpper").attr({ style: trnsfrmScl + ";height: " + (numOfSlides * slidesHeight * sScaleVal) + "px" }) }, 1500); } else if (settings.slideType == "revealjs") { $(".slides-loadnig-msg").remove(); var revealjsPath = ""; if (settings.revealjsPath != "") { revealjsPath = settings.revealjsPath; } else { revealjsPath = "./revealjs/reveal.js"; } $.getScript(revealjsPath, function (response, status) { if (status == "success") { // $("section").removeClass("slide"); Reveal.initialize(settings.revealjsConfig); //revealjsConfig - TODO } }); } } function processPPTX(zip) { var post_ary = []; var dateBefore = new Date(); if (zip.file("docProps/thumbnail.jpeg") !== null) { var pptxThumbImg = base64ArrayBuffer(zip.file("docProps/thumbnail.jpeg").asArrayBuffer()); post_ary.push({ "type": "pptx-thumb", "data": pptxThumbImg, "slide_num": -1 }); } var filesInfo = getContentTypes(zip); var slideSize = getSlideSizeAndSetDefaultTextStyle(zip); tableStyles = readXmlFile(zip, "ppt/tableStyles.xml"); //console.log("slideSize: ", slideSize) post_ary.push({ "type": "slideSize", "data": slideSize, "slide_num": 0 }); var numOfSlides = filesInfo["slides"].length; for (var i = 0; i < numOfSlides; i++) { var filename = filesInfo["slides"][i]; var filename_no_path = ""; var filename_no_path_ary = []; if (filename.indexOf("/") != -1) { filename_no_path_ary = filename.split("/"); filename_no_path = filename_no_path_ary.pop(); } else { filename_no_path = filename; } var filename_no_path_no_ext = ""; if (filename_no_path.indexOf(".") != -1) { var filename_no_path_no_ext_ary = filename_no_path.split("."); var slide_ext = filename_no_path_no_ext_ary.pop(); filename_no_path_no_ext = filename_no_path_no_ext_ary.join("."); } var slide_number = 1; if (filename_no_path_no_ext != "" && filename_no_path.indexOf("slide") != -1) { slide_number = Number(filename_no_path_no_ext.substr(5)); } var slideHtml = processSingleSlide(zip, filename, i, slideSize); post_ary.push({ "type": "slide", "data": slideHtml, "slide_num": slide_number, "file_name": filename_no_path_no_ext }); post_ary.push({ "type": "progress-update", "slide_num": (numOfSlides + i + 1), "data": (i + 1) * 100 / numOfSlides }); } post_ary.sort(function (a, b) { return a.slide_num - b.slide_num; }); post_ary.push({ "type": "globalCSS", "data": genGlobalCSS() }); var dateAfter = new Date(); post_ary.push({ "type": "ExecutionTime", "data": dateAfter - dateBefore }); return post_ary; } function readXmlFile(zip, filename, isSlideContent) { try { var fileContent = zip.file(filename).asText(); if (isSlideContent && app_verssion <= 12) { //< office2007 //remove "<![CDATA[ ... ]]>" tag fileContent = fileContent.replace(/<!\[CDATA\[(.*?)\]\]>/g, '$1'); } var xmlData = tXml(fileContent, { simplify: 1 }); if (xmlData["?xml"] !== undefined) { return xmlData["?xml"]; } else { return xmlData; } } catch (e) { //console.log("error readXmlFile: the file '", filename, "' not exit") return null; } } function getContentTypes(zip) { var ContentTypesJson = readXmlFile(zip, "[Content_Types].xml"); var subObj = ContentTypesJson?.["Types"]?.["Override"] || []; var slidesLocArray = []; var slideLayoutsLocArray = []; for (var i = 0; i < subObj.length; i++) { switch (subObj[i]["attrs"]["ContentType"]) { case "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": slidesLocArray.push(subObj[i]["attrs"]["PartName"].substr(1)); break; case "application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml": slideLayoutsLocArray.push(subObj[i]["attrs"]["PartName"].substr(1)); break; default: } } return { "slides": slidesLocArray, "slideLayouts": slideLayoutsLocArray }; } function getSlideSizeAndSetDefaultTextStyle(zip) { //get app version var app = readXmlFile(zip, "docProps/app.xml"); var app_verssion_str = app?.["Properties"]?.["AppVersion"] || 0; app_verssion = parseInt(app_verssion_str); console.log("create by Office PowerPoint app verssion: ", app_verssion_str) //get slide dimensions var rtenObj = {}; var content = readXmlFile(zip, "ppt/presentation.xml"); var sldSzAttrs = content["p:presentation"]["p:sldSz"]["attrs"]; var sldSzWidth = parseInt(sldSzAttrs["cx"]); var sldSzHeight = parseInt(sldSzAttrs["cy"]); var sldSzType = sldSzAttrs["type"]; console.log("Presentation size type: ", sldSzType) //1 inches = 96px = 2.54cm // 1 EMU = 1 / 914400 inch // Pixel = EMUs * Resolution / 914400; (Resolution = 96) //var standardHeight = 6858000; //console.log("slideFactor: ", slideFactor, "standardHeight:", standardHeight, (standardHeight - sldSzHeight) / standardHeight) //slideFactor = (96 * (1 + ((standardHeight - sldSzHeight) / standardHeight))) / 914400 ; //slideFactor = slideFactor + sldSzHeight*((standardHeight - sldSzHeight) / standardHeight) ; //var ration = sldSzWidth / sldSzHeight; //Scale // var viewProps = readXmlFile(zip, "ppt/viewProps.xml"); // var scaleLoc = getTextByPathList(viewProps, ["p:viewPr", "p:slideViewPr", "p:cSldViewPr", "p:cViewPr","p:scale"]); // var scaleXnodes, scaleX = 1, scaleYnode, scaleY = 1; // if (scaleLoc !== undefined){ // scaleXnodes = scaleLoc["a:sx"]["attrs"]; // var scaleXnodesN = scaleXnodes["n"]; // var scaleXnodesD = scaleXnodes["d"]; // if (scaleXnodesN !== undefined && scaleXnodesD !== undefined && scaleXnodesN != 0){ // scaleX = parseInt(scaleXnodesD)/parseInt(scaleXnodesN); // } // scaleYnode = scaleLoc["a:sy"]["attrs"]; // var scaleYnodeN = scaleYnode["n"]; // var scaleYnodeD = scaleYnode["d"]; // if (scaleYnodeN !== undefined && scaleYnodeD !== undefined && scaleYnodeN != 0) { // scaleY = parseInt(scaleYnodeD) / parseInt(scaleYnodeN) ; // } // } //console.log("scaleX: ", scaleX, "scaleY:", scaleY) //slideFactor = slideFactor * scaleX; defaultTextStyle = content["p:presentation"]["p:defaultTextStyle"]; slideWidth = sldSzWidth * slideFactor + settings.incSlide.width|0;// * scaleX;//parseInt(sldSzAttrs["cx"]) * 96 / 914400; slideHeight = sldSzHeight * slideFactor + settings.incSlide.height|0;// * scaleY;//parseInt(sldSzAttrs["cy"]) * 96 / 914400; rtenObj = { "width": slideWidth, "height": slideHeight }; return rtenObj; } function processSingleSlide(zip, sldFileName, index, slideSize) { /* self.postMessage({ "type": "INFO", "data": "Processing slide" + (index + 1) }); */ // =====< Step 1 >===== // Read relationship filename of the slide (Get slideLayoutXX.xml) // @sldFileName: ppt/slides/slide1.xml // @resName: ppt/slides/_rels/slide1.xml.rels var resName = sldFileName.replace("slides/slide", "slides/_rels/slide") + ".rels"; var resContent = readXmlFile(zip, resName); var RelationshipArray = resContent["Relationships"]["Relationship"]; //console.log("RelationshipArray: " , RelationshipArray) var layoutFilename = ""; var diagramFilename = ""; var slideResObj = {}; if (RelationshipArray.constructor === Array) { for (var i = 0; i < RelationshipArray.length; i++) { switch (RelationshipArray[i]["attrs"]["Type"]) { case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout": layoutFilename = RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/"); break; case "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing": diagramFilename = RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/"); slideResObj[RelationshipArray[i]["attrs"]["Id"]] = { "type": RelationshipArray[i]["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/") }; break; case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide": case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image": case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart": case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink": default: slideResObj[RelationshipArray[i]["attrs"]["Id"]] = { "type": RelationshipArray[i]["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/") }; } } } else { layoutFilename = RelationshipArray["attrs"]["Target"].replace("../", "ppt/"); } //console.log(slideResObj); // Open slideLayoutXX.xml var slideLayoutContent = readXmlFile(zip, layoutFilename); var slideLayoutTables = indexNodes(slideLayoutContent); var sldLayoutClrOvr = getTextByPathList(slideLayoutContent, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping"]); //console.log(slideLayoutClrOvride); if (sldLayoutClrOvr !== undefined) { slideLayoutClrOvride = sldLayoutClrOvr["attrs"]; } // =====< Step 2 >===== // Read slide master filename of the slidelayout (Get slideMasterXX.xml) // @resName: ppt/slideLayouts/slideLayout1.xml // @masterName: ppt/slideLayouts/_rels/slideLayout1.xml.rels var slideLayoutResFilename = layoutFilename.replace("slideLayouts/slideLayout", "slideLayouts/_rels/slideLayout") + ".rels"; var slideLayoutResContent = readXmlFile(zip, slideLayoutResFilename); RelationshipArray = slideLayoutResContent["Relationships"]["Relationship"]; var masterFilename = ""; var layoutResObj = {}; if (RelationshipArray.constructor === Array) { for (var i = 0; i < RelationshipArray.length; i++) { switch (RelationshipArray[i]["attrs"]["Type"]) { case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster": masterFilename = RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/"); break; default: layoutResObj[RelationshipArray[i]["attrs"]["Id"]] = { "type": RelationshipArray[i]["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/") }; } } } else { masterFilename = RelationshipArray["attrs"]["Target"].replace("../", "ppt/"); } // Open slideMasterXX.xml var slideMasterContent = readXmlFile(zip, masterFilename); var slideMasterTextStyles = getTextByPathList(slideMasterContent, ["p:sldMaster", "p:txStyles"]); var slideMasterTables = indexNodes(slideMasterContent); /////////////////Amir///////////// //Open slideMasterXX.xml.rels var slideMasterResFilename = masterFilename.replace("slideMasters/slideMaster", "slideMasters/_rels/slideMaster") + ".rels"; var slideMasterResContent = readXmlFile(zip, slideMasterResFilename); RelationshipArray = slideMasterResContent["Relationships"]["Relationship"]; var themeFilename = ""; var masterResObj = {}; if (RelationshipArray.constructor === Array) { for (var i = 0; i < RelationshipArray.length; i++) { switch (RelationshipArray[i]["attrs"]["Type"]) { case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme": themeFilename = RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/"); break; default: masterResObj[RelationshipArray[i]["attrs"]["Id"]] = { "type": RelationshipArray[i]["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": RelationshipArray[i]["attrs"]["Target"].replace("../", "ppt/") }; } } } else { themeFilename = RelationshipArray["attrs"]["Target"].replace("../", "ppt/"); } //console.log(themeFilename) //Load Theme file var themeResObj = {}; if (themeFilename !== undefined) { var themeName = themeFilename.split("/").pop(); var themeResFileName = themeFilename.replace(themeName, "_rels/" + themeName) + ".rels"; //console.log("themeFilename: ", themeFilename, ", themeName: ", themeName, ", themeResFileName: ", themeResFileName) var themeContent = readXmlFile(zip, themeFilename); var themeResContent = readXmlFile(zip, themeResFileName); if (themeResContent !== null) { var relationshipArray = themeResContent["Relationships"]["Relationship"]; if (relationshipArray !== undefined){ var themeFilename = ""; if (relationshipArray.constructor === Array) { for (var i = 0; i < relationshipArray.length; i++) { themeResObj[relationshipArray[i]["attrs"]["Id"]] = { "type": relationshipArray[i]["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": relationshipArray[i]["attrs"]["Target"].replace("../", "ppt/") }; } } else { //console.log("theme relationshipArray : ", relationshipArray) themeResObj[relationshipArray["attrs"]["Id"]] = { "type": relationshipArray["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": relationshipArray["attrs"]["Target"].replace("../", "ppt/") }; } } } } //Load diagram file var diagramResObj = {}; var digramFileContent = {}; if (diagramFilename !== undefined) { var diagName = diagramFilename.split("/").pop(); var diagramResFileName = diagramFilename.replace(diagName, "_rels/" + diagName) + ".rels"; //console.log("diagramFilename: ", diagramFilename, ", themeName: ", themeName, ", diagramResFileName: ", diagramResFileName) digramFileContent = readXmlFile(zip, diagramFilename); if (digramFileContent !== null && digramFileContent !== undefined && digramFileContent != "") { var digramFileContentObjToStr = JSON.stringify(digramFileContent); digramFileContentObjToStr = digramFileContentObjToStr.replace(/dsp:/g, "p:"); digramFileContent = JSON.parse(digramFileContentObjToStr); } var digramResContent = readXmlFile(zip, diagramResFileName); if (digramResContent !== null) { var relationshipArray = digramResContent["Relationships"]["Relationship"]; var themeFilename = ""; if (relationshipArray.constructor === Array) { for (var i = 0; i < relationshipArray.length; i++) { diagramResObj[relationshipArray[i]["attrs"]["Id"]] = { "type": relationshipArray[i]["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": relationshipArray[i]["attrs"]["Target"].replace("../", "ppt/") }; } } else { //console.log("theme relationshipArray : ", relationshipArray) diagramResObj[relationshipArray["attrs"]["Id"]] = { "type": relationshipArray["attrs"]["Type"].replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), "target": relationshipArray["attrs"]["Target"].replace("../", "ppt/") }; } } } //console.log("diagramResObj: " , diagramResObj) // =====< Step 3 >===== var slideContent = readXmlFile(zip, sldFileName , true); var nodes = slideContent["p:sld"]["p:cSld"]["p:spTree"]; var warpObj = { "zip": zip, "slideLayoutContent": slideLayoutContent, "slideLayoutTables": slideLayoutTables, "slideMasterContent": slideMasterContent, "slideMasterTables": slideMasterTables, "slideContent": slideContent, "slideResObj": slideResObj, "slideMasterTextStyles": slideMasterTextStyles, "layoutResObj": layoutResObj, "masterResObj": masterResObj, "themeContent": themeContent, "themeResObj": themeResObj, "digramFileContent": digramFileContent, "diagramResObj": diagramResObj, "defaultTextStyle": defaultTextStyle }; var bgResult = ""; if (processFullTheme === true) { bgResult = getBackground(warpObj, slideSize, index); } var bgColor = ""; if (processFullTheme == "colorsAndImageOnly") { bgColor = getSlideBackgroundFill(warpObj, index); } if (settings.slideMode && settings.slideType == "revealjs") { var result = "<section class='slide' style='width:" + slideSize.width + "px; height:" + slideSize.height + "px;" + bgColor + "'>" } else { var result = "<div class='slide' style='width:" + slideSize.width + "px; height:" + slideSize.height + "px;" + bgColor + "'>" } result += bgResult; for (var nodeKey in nodes) { if (nodes[nodeKey].constructor === Array) { for (var i = 0; i < nodes[nodeKey].length; i++) { result += processNodesInSlide(nodeKey, nodes[nodeKey][i], nodes, warpObj, "slide"); } } else { result += processNodesInSlide(nodeKey, nodes[nodeKey], nodes, warpObj, "slide"); } } if (settings.slideMode && settings.slideType == "revealjs") { return result + "</div></section>"; } else { return result + "</div></div>"; } } function indexNodes(content) { var keys = Object.keys(content); var spTreeNode = content[keys[0]]["p:cSld"]["p:spTree"]; var idTable = {}; var idxTable = {}; var typeTable = {}; for (var key in spTreeNode) { if (key == "p:nvGrpSpPr" || key == "p:grpSpPr") { continue; } var targetNode = spTreeNode[key]; if (targetNode.constructor === Array) { for (var i = 0; i < targetNode.length; i++) { var nvSpPrNode = targetNode[i]["p:nvSpPr"]; var id = getTextByPathList(nvSpPrNode, ["p:cNvPr", "attrs", "id"]); var idx = getTextByPathList(nvSpPrNode, ["p:nvPr", "p:ph", "attrs", "idx"]); var type = getTextByPathList(nvSpPrNode, ["p:nvPr", "p:ph", "attrs", "type"]); if (id !== undefined) { idTable[id] = targetNode[i]; } if (idx !== undefined) { idxTable[idx] = targetNode[i]; } if (type !== undefined) { typeTable[type] = targetNode[i]; } } } else { var nvSpPrNode = targetNode["p:nvSpPr"]; var id = getTextByPathList(nvSpPrNode, ["p:cNvPr", "attrs", "id"]); var idx = getTextByPathList(nvSpPrNode, ["p:nvPr", "p:ph", "attrs", "idx"]); var type = getTextByPathList(nvSpPrNode, ["p:nvPr", "p:ph", "attrs", "type"]); if (id !== undefined) { idTable[id] = targetNode; } if (idx !== undefined) { idxTable[idx] = targetNode; } if (type !== undefined) { typeTable[type] = targetNode; } } } return { "idTable": idTable, "idxTable": idxTable, "typeTable": typeTable }; } function processNodesInSlide(nodeKey, nodeValue, nodes, warpObj, source, sType) { var result = ""; switch (nodeKey) { case "p:sp": // Shape, Text result = processSpNode(nodeValue, nodes, warpObj, source, sType); break; case "p:cxnSp": // Shape, Text (with connection) result = processCxnSpNode(nodeValue, nodes, warpObj, source, sType); break; case "p:pic": // Picture result = processPicNode(nodeValue, warpObj, source, sType); break; case "p:graphicFrame": // Chart, Diagram, Table result = processGraphicFrameNode(nodeValue, warpObj, source, sType); break; case "p:grpSp": result = processGroupSpNode(nodeValue, warpObj, source); break; case "mc:AlternateContent": //Equations and formulas as Image //console.log("mc:AlternateContent nodeValue:" , nodeValue , "nodes:",nodes, "sType:",sType) var mcFallbackNode = getTextByPathList(nodeValue, ["mc:Fallback"]); result = processGroupSpNode(mcFallbackNode, warpObj, source); break; default: //console.log("nodeKey: ", nodeKey) } return result; } function processGroupSpNode(node, warpObj, source) { //console.log("processGroupSpNode: node: ", node) var xfrmNode = getTextByPathList(node, ["p:grpSpPr", "a:xfrm"]); if (xfrmNode !== undefined) { var x = parseInt(xfrmNode["a:off"]["attrs"]["x"]) * slideFactor; var y = parseInt(xfrmNode["a:off"]["attrs"]["y"]) * slideFactor; var chx = parseInt(xfrmNode["a:chOff"]["attrs"]["x"]) * slideFactor; var chy = parseInt(xfrmNode["a:chOff"]["attrs"]["y"]) * slideFactor; var cx = parseInt(xfrmNode["a:ext"]["attrs"]["cx"]) * slideFactor; var cy = parseInt(xfrmNode["a:ext"]["attrs"]["cy"]) * slideFactor; var chcx = parseInt(xfrmNode["a:chExt"]["attrs"]["cx"]) * slideFactor; var chcy = parseInt(xfrmNode["a:chExt"]["attrs"]["cy"]) * slideFactor; var rotate = parseInt(xfrmNode["attrs"]["rot"]) var rotStr = ""//;" border: 3px solid black;"; // angleToDegrees(getTextByPathList(slideXfrmNode, ["attrs", "rot"])); // var rotX = 0; // var rotY = 0; var top = y - chy, left = x - chx, width = cx - chcx, height = cy - chcy; var sType = "group"; if (!isNaN(rotate)) { rotate = angleToDegrees(rotate); rotStr += "transform: rotate(" + rotate + "deg) ; transform-origin: center;"; // var cLin = Math.sqrt(Math.pow((chy), 2) + Math.pow((chx), 2)); // var rdian = degreesToRadians(rotate); // rotX = cLin * Math.cos(rdian); // rotY = cLin * Math.sin(rdian); if (rotate != 0) { top = y; left = x; width = cx; height = cy; sType = "group-rotate"; } } } var grpStyle = ""; if (rotStr !== undefined && rotStr != "") { grpStyle += rotStr; } if (top !== undefined) { grpStyle += "top: " + top + "px;"; } if (left !== undefined) { grpStyle += "left: " + left + "px;"; } if (width !== undefined) { grpStyle += "width:" + width + "px;"; } if (height !== undefined) { grpStyle += "height: " + height + "px;"; } var order = node["attrs"]["order"]; var result = "<div class='block group' style='z-index: " + order + ";" + grpStyle + " border:1px solid red;'>"; // Procsee all child nodes for (var nodeKey in node) { if (node[nodeKey].constructor === Array) { for (var i = 0; i < node[nodeKey].length; i++) { result += processNodesInSlide(nodeKey, node[nodeKey][i], node, warpObj, source, sType); } } else { result += processNodesInSlide(nodeKey, node[nodeKey], node, warpObj, source, sType); } } result += "</div>"; return result; } function processSpNode(node, pNode, warpObj, source, sType) { /* * 958 <xsd:complexType name="CT_GvmlShape"> * 959 <xsd:sequence> * 960 <xsd:element name="nvSpPr" type="CT_GvmlShapeNonVisual" minOccurs="1" maxOccurs="1"/> * 961 <xsd:element name="spPr" type="CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> * 962 <xsd:element name="txSp" type="CT_GvmlTextShape" minOccurs="0" maxOccurs="1"/> * 963 <xsd:element name="style" type="CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> * 964 <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> * 965 </xsd:sequence> * 966 </xsd:complexType> */ var id = getTextByPathList(node, ["p:nvSpPr", "p:cNvPr", "attrs", "id"]); var name = getTextByPathList(node, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]); var idx = (getTextByPathList(node, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "idx"]) === undefined) ? undefined : getTextByPathList(node, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "idx"]); var type = (getTextByPathList(node, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]) === undefined) ? undefined : getTextByPathList(node, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]); var order = getTextByPathList(node, ["attrs", "order"]); var isUserDrawnBg; if (source == "slideLayoutBg" || source == "slideMasterBg") { var userDrawn = getTextByPathList(node, ["p:nvSpPr", "p:nvPr", "attrs", "userDrawn"]); if (userDrawn == "1") { isUserDrawnBg = true; } else { isUserDrawnBg = false; } } var slideLayoutSpNode = undefined; var slideMasterSpNode = undefined; if (idx !== undefined) { slideLayoutSpNode = warpObj["slideLayoutTables"]["idxTable"][idx]; if (type !== undefined) { slideMasterSpNode = warpObj["slideMasterTables"]["typeTable"][type]; } else { slideMasterSpNode = warpObj["slideMasterTables"]["idxTable"][idx]; } } else { if (type !== undefined) { slideLayoutSpNode = warpObj["slideLayoutTables"]["typeTable"][type]; slideMasterSpNode = warpObj["slideMasterTables"]["typeTable"][type]; } } if (type === undefined) { txBoxVal = getTextByPathList(node, ["p:nvSpPr", "p:cNvSpPr", "attrs", "txBox"]); if (txBoxVal == "1") { type = "textBox"; } } if (type === undefined) { type = getTextByPathList(slideLayoutSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]); if (type === undefined) { //type = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]); if (source == "diagramBg") { type = "diagram"; } else { type = "obj"; //default type } } } //console.log("processSpNode type:", type, "idx:", idx); return genShape(node, pNode, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj, isUserDrawnBg, sType, source); } function processCxnSpNode(node, pNode, warpObj, source, sType) { var id = node["p:nvCxnSpPr"]["p:cNvPr"]["attrs"]["id"]; var name = node["p:nvCxnSpPr"]["p:cNvPr"]["attrs"]["name"]; var idx = (node["p:nvCxnSpPr"]["p:nvPr"]["p:ph"] === undefined) ? undefined : node["p:nvSpPr"]["p:nvPr"]["p:ph"]["attrs"]["idx"]; var type = (node["p:nvCxnSpPr"]["p:nvPr"]["p:ph"] === undefined) ? undefined : node["p:nvSpPr"]["p:nvPr"]["p:ph"]["attrs"]["type"]; //<p:cNvCxnSpPr>(<p:cNvCxnSpPr>, <a:endCxn>) var order = node["attrs"]["order"]; return genShape(node, pNode, undefined, undefined, id, name, idx, type, order, warpObj, undefined, sType, source); } function genShape(node, pNode, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj, isUserDrawnBg, sType, source) { //var dltX = 0; //var dltY = 0; var xfrmList = ["p:spPr", "a:xfrm"]; var slideXfrmNode = getTextByPathList(node, xfrmList); var slideLayoutXfrmNode = getTextByPathList(slideLayoutSpNode, xfrmList); var slideMasterXfrmNode = getTextByPathList(slideMasterSpNode, xfrmList); var result = ""; var shpId = getTextByPathList(node, ["attrs", "order"]); //console.log("shpId: ",shpId) var shapType = getTextByPathList(node, ["p:spPr", "a:prstGeom", "attrs", "prst"]); //custGeom - Amir var custShapType = getTextByPathList(node, ["p:spPr", "a:custGeom"]); var isFlipV = false; var isFlipH = false; var flip = ""; if (getTextByPathList(slideXfrmNode, ["attrs", "flipV"]) === "1") { isFlipV = true; } if (getTextByPathList(slideXfrmNode, ["attrs", "flipH"]) === "1") { isFlipH = true; } if (isFlipH && !isFlipV) { flip = " scale(-1,1)" } else if (!isFlipH && isFlipV) { flip = " scale(1,-1)" } else if (isFlipH && isFlipV) { flip = " scale(-1,-1)" } /////////////////////////Amir//////////////////////// //rotate var rotate = angleToDegrees(getTextByPathList(slideXfrmNode, ["attrs", "rot"])); //console.log("genShape rotate: " + rotate); var txtRotate; var txtXframeNode = getTextByPathList(node, ["p:txXfrm"]); if (txtXframeNode !== undefined) { var txtXframeRot = getTextByPathList(txtXframeNode, ["attrs", "rot"]); if (txtXframeRot !== undefined) { txtRotate = angleToDegrees(txtXframeRot) + 90; } } else { txtRotate = rotate; } ////////////////////////////////////////////////// if (shapType !== undefined || custShapType !== undefined /*&& slideXfrmNode !== undefined*/) { var off = getTextByPathList(slideXfrmNode, ["a:off"