oda-framework
Version:
1,019 lines (924 loc) • 814 kB
JavaScript
/**
* 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"