officegen-2
Version:
Office Open XML Generator using Node.js streams. Supporting Microsoft Office 2007 and later Word (docx), PowerPoint (pptx,ppsx) and Excel (xlsx). This module is for all frameworks and environments. No need for any commandline tool - this module is doing everything inside it.
974 lines (795 loc) • 73.1 kB
JavaScript
//
// officegen: All the code to generate PPTX/PPTS files.
//
// Please refer to README.md for this module's documentations.
//
// NOTE:
// - Before changing this code please refer to the hacking the code section on README.md.
//
// Copyright (c) 2013 Ziv Barber;
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// 'Software'), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
var baseobj = require("./basicgen.js");
var officeChart = require("./genofficechart.js");
var msdoc = require("./msofficegen.js");
var pptxShapes = require("./pptxshapes.js");
var path = require('path');
var fast_image_size = require('fast-image-size');
var excelbuilder = require('./msexcel-builder.js');
if ( !String.prototype.encodeHTML ) {
String.prototype.encodeHTML = function () {
return this.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
};
}
var GLOBAL_CHART_COUNT = 0;
///
/// @brief Extend officegen object with PPTX/PPSX support.
///
/// This method extending the given officegen object to create PPTX/PPSX document.
///
/// @param[in] genobj The object to extend.
/// @param[in] new_type The type of object to create.
/// @param[in] options The object's options.
/// @param[in] gen_private Access to the internals of this object.
/// @param[in] type_info Additional information about this type.
///
function makePptx ( genobj, new_type, options, gen_private, type_info ) {
///
/// @brief Convert shape name to shape information.
///
/// This method convert the shape information reseived from the user to the real shape information object.
///
/// @param[in] shapeName Either the name of the shape or the shape information.
/// @return Information about this shape.
///
function getShapeInfo ( shapeName ) {
if ( !shapeName ) {
return pptxShapes.RECTANGLE;
} // Endif.
if ( (typeof shapeName == 'object') && shapeName.name && shapeName.displayName && shapeName.avLst ) {
return shapeName;
} // Endif.
if ( pptxShapes[shapeName] ) {
return pptxShapes[shapeName];
} // Endif.
for ( var shapeIntName in pptxShapes ) {
if ( pptxShapes[shapeIntName].name == shapeName ) {
return pptxShapes[shapeIntName];
} // Endif.
if ( pptxShapes[shapeIntName].displayName == shapeName ) {
return pptxShapes[shapeIntName];
} // Endif.
} // End of for loop.
return pptxShapes.RECTANGLE;
}
genobj.shapes = pptxShapes;
///
/// @brief Create the 'presProps.xml' resource.
///
/// ???.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxPresProps ( data ) {
return gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) +
'<p:presentationPr xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">\
<p:extLst>\
<p:ext uri="{E76CE94A-603C-4142-B9EB-6D1370010A27}">\
<p14:discardImageEditData xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="0"/>\
</p:ext>\
<p:ext uri="{D31A062A-798A-4329-ABDD-BBA856620510}">\
<p14:defaultImageDpi xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="220"/>\
</p:ext>\
<p:ext uri="{FD5EFAAD-0ECE-453E-9831-46B23BE46B34}">\
<p15:chartTrackingRefBased xmlns:p15="http://schemas.microsoft.com/office/powerpoint/2012/main" val="1"/>\
</p:ext>\
</p:extLst>\
</p:presentationPr>';
}
///
/// @brief Create the 'tableStyles.xml' resource.
///
/// ???.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxStyles ( data ) {
return gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<a:tblStyleLst xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" def="{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}"/>';
}
///
/// @brief Create the 'viewProps.xml' resource.
///
/// ???.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxViewProps ( data ) {
return gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<p:viewPr xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:normalViewPr><p:restoredLeft sz="15620"/><p:restoredTop sz="94660"/></p:normalViewPr><p:slideViewPr><p:cSldViewPr><p:cViewPr varScale="1"><p:scale><a:sx n="64" d="100"/><a:sy n="64" d="100"/></p:scale><p:origin x="-1392" y="-96"/></p:cViewPr><p:guideLst><p:guide orient="horz" pos="2160"/><p:guide pos="2880"/></p:guideLst></p:cSldViewPr></p:slideViewPr><p:notesTextViewPr><p:cViewPr><p:scale><a:sx n="100" d="100"/><a:sy n="100" d="100"/></p:scale><p:origin x="0" y="0"/></p:cViewPr></p:notesTextViewPr><p:gridSpacing cx="78028800" cy="78028800"/></p:viewPr>';
}
///
/// @brief Create the 'slideLayout1.xml' resource.
///
/// ???.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxLayout ( data ) {
return gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="title" preserve="1"><p:cSld name="Title Slide"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ctrTitle"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="2130425"/><a:ext cx="7772400" cy="1470025"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Subtitle 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="subTitle" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1371600" y="3886200"/><a:ext cx="6400800" cy="1752600"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl9pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master subtitle style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{F8166F1F-CE9B-4651-A6AA-CD717754106B}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>6/13/2013</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{F7021451-1387-4CA6-816F-3879F97B5CBC}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>�#�</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>';
}
///
/// @brief Create the main presentation resource.
///
/// This resource is the main resource of any PowerPoint document.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxPresentation ( data ) {
var outString = gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" saveSubsetFonts="1"><p:sldMasterIdLst><p:sldMasterId id="2147483648" r:id="rId1"/></p:sldMasterIdLst><p:sldIdLst>';
for ( var i = 0, total_size = gen_private.pages.length; i < total_size; i++ ) {
outString += '<p:sldId id="' + (i + 256) + '" r:id="rId' + (i + 2) + '"/>';
} // End of for loop.
outString += '</p:sldIdLst><p:sldSz cx="9144000" cy="6858000" type="screen4x3"/><p:notesSz cx="6858000" cy="9144000"/><p:defaultTextStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr>';
var curPos = 0;
for ( var i = 1; i < 10; i++ )
{
outString += '<a:lvl' + i + 'pPr marL="' + curPos + '" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl' + i + 'pPr>';
curPos += 457200;
} // End of for loop.
outString += '</p:defaultTextStyle>';
outString += '<p:extLst>\
<p:ext uri="{EFAFB233-063F-42B5-8137-9DF3F51BA10A}">\
<p15:sldGuideLst xmlns:p15="http://schemas.microsoft.com/office/powerpoint/2012/main"/>\
</p:ext>\
</p:extLst></p:presentation>';
return outString;
}
///
/// @brief Create the slides masters resource.
///
/// ???.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxSlideMasters ( data ) {
return gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<p:sldMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:bg><p:bgRef idx="1001"><a:schemeClr val="bg1"/></p:bgRef></p:bg><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="274638"/><a:ext cx="8229600" cy="1143000"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1600200"/><a:ext cx="8229600" cy="4525963"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="6356350"/><a:ext cx="2133600" cy="365125"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{F8166F1F-CE9B-4651-A6AA-CD717754106B}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>6/13/2013</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3124200" y="6356350"/><a:ext cx="2895600" cy="365125"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="ctr"><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="6553200" y="6356350"/><a:ext cx="2133600" cy="365125"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{F7021451-1387-4CA6-816F-3879F97B5CBC}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>�#�</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree></p:cSld><p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/><p:sldLayoutIdLst><p:sldLayoutId id="2147483649" r:id="rId1"/></p:sldLayoutIdLst><p:txStyles><p:titleStyle><a:lvl1pPr algn="ctr" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="0"/></a:spcBef><a:buNone/><a:defRPr sz="4400" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mj-lt"/><a:ea typeface="+mj-ea"/><a:cs typeface="+mj-cs"/></a:defRPr></a:lvl1pPr></p:titleStyle><p:bodyStyle><a:lvl1pPr marL="342900" indent="-342900" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="3200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="742950" indent="-285750" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="1143000" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2400" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1600200" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="2057400" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2514600" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2971800" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3429000" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3886200" indent="-228600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial" pitchFamily="34" charset="0"/><a:buChar char="�"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:bodyStyle><p:otherStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr><a:lvl1pPr marL="0" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:otherStyle></p:txStyles></p:sldMaster>';
}
///
/// @brief Generate the XML code to describe colors.
///
/// ???.
///
/// @param[in] color_info Foreground color information.
/// @param[in] back_info Background color information.
///
function cMakePptxColorSelection ( color_info, back_info )
{
var outText = '';
var colorVal;
var fillType = 'solid';
var internalElements = '';
if ( back_info ) {
outText += '<p:bg><p:bgPr>';
outText += cMakePptxColorSelection ( back_info, false );
outText += '<a:effectLst/>';
// BMK_TODO: (add support for effects)
outText += '</p:bgPr></p:bg>';
} // Endif.
if ( color_info ) {
if ( typeof color_info == 'string' ) {
colorVal = color_info;
} else {
if ( color_info.type ) {
fillType = color_info.type;
} // Endif.
if ( color_info.color ) {
colorVal = color_info.color;
} // Endif.
if ( color_info.alpha ) {
internalElements += '<a:alpha val="' + (100 - color_info.alpha) + '000"/>';
} // Endif.
} // Endif.
switch ( fillType )
{
case 'solid':
outText += '<a:solidFill><a:srgbClr val="' + colorVal + '">' + internalElements + '</a:srgbClr></a:solidFill>';
break;
} // End of switch.
} // Endif.
return outText;
}
///
/// @brief ???.
///
/// ???.
///
/// @param[in] text_info Information how to display the text.
/// @param[in] slide_obj The object of this slider.
/// @return Text string.
///
function cMakePptxOutTextData ( text_info, slide_obj ) {
var out_obj = {};
out_obj.font_size = '';
out_obj.bold = '';
out_obj.underline = '';
out_obj.rpr_info = '';
if ( typeof text_info == 'object' )
{
if ( text_info.bold ) {
out_obj.bold = ' b="1"';
} // Endif.
if ( text_info.underline ) {
out_obj.underline = ' u="sng"';
} // Endif.
if ( text_info.font_size ) {
out_obj.font_size = ' sz="' + text_info.font_size + '00"';
} // Endif.
if ( text_info.color ) {
out_obj.rpr_info += cMakePptxColorSelection ( text_info.color );
} else if ( slide_obj && slide_obj.color )
{
out_obj.rpr_info += cMakePptxColorSelection ( slide_obj.color );
} // Endif.
if ( text_info.font_face ) {
out_obj.rpr_info += '<a:latin typeface="' + text_info.font_face + '" pitchFamily="34" charset="0"/><a:cs typeface="' + text_info.font_face + '" pitchFamily="34" charset="0"/>';
} // Endif.
} else {
if ( slide_obj && slide_obj.color )
{
out_obj.rpr_info += cMakePptxColorSelection ( slide_obj.color );
} // Endif.
} // Endif.
if ( out_obj.rpr_info != '' )
out_obj.rpr_info += '</a:rPr>';
return out_obj;
}
///
/// @brief ???.
///
/// ???.
///
/// @param[in] text_info Information how to display the text.
/// @param[in] text_string The text string.
/// @param[in] slide_obj The object of this slider.
/// @return The PPTX code.
///
function cMakePptxOutTextCommand ( text_info, text_string, slide_obj ) {
var area_opt_data = cMakePptxOutTextData ( text_info, slide_obj );
var outData = '<a:r><a:rPr lang="en-US"' + area_opt_data.font_size + area_opt_data.bold + area_opt_data.underline + ' dirty="0" smtClean="0"' + (area_opt_data.rpr_info != '' ? ('>' + area_opt_data.rpr_info) : '/>') + '<a:t>';
// Automatic support for newline - split it into multi-p:
var parsedText = text_string.split ( "\n" );
if ( parsedText.length > 1 ) {
var outTextData = '';
for ( var i = 0, total_size_i = parsedText.length; i < total_size_i; i++ ) {
outTextData += outData + parsedText[i].encodeHTML ();
if ( (i + 1) < total_size_i ) {
outTextData += '</a:t></a:r></a:p><a:p>';
} // Endif.
} // End of for loop.
outData = outTextData;
} else {
outData += text_string.encodeHTML ();
} // Endif.
var outBreakP = '';
if ( text_info.breakLine ) {
outBreakP += '</a:p><a:p>';
} // Endif.
return outData + '</a:t></a:r>' + outBreakP;
}
///
/// @brief ???.
///
/// ???.
///
/// @param[in] in_data_val Input value as passed by the user.
/// @param[in] max_value Maximum value allowed.
/// @param[in] def_value Default value.
/// @param[in] auto_val ???.
/// @param[in] mul_val ???.
/// @return ???.
///
function parseSmartNumber ( in_data_val, max_value, def_value, auto_val, mul_val ) {
if ( typeof in_data_val == 'undefined' ) {
return (typeof def_value == 'number') ? def_value : 0;
} // Endif.
if ( in_data_val == '' ) {
in_data_val = 0;
} // Endif.
if ( typeof in_data_val == 'string' && !isNaN ( in_data_val ) ) {
in_data_val = parseInt ( in_data_val, 10 );
} // Endif.
var realNum = mul_val ? in_data_val * mul_val : in_data_val;
if ( typeof in_data_val == 'string' ) {
if ( in_data_val.indexOf ( '%' ) != -1 ) {
var realMax = (typeof max_value == 'number') ? max_value : 0;
if ( realMax <= 0 ) return 0;
var realVal = parseInt ( in_data_val, 10 );
return (realMax / 100) * realVal;
} // Endif.
if ( in_data_val.indexOf ( '#' ) != -1 ) {
var realVal = parseInt ( in_data_val, 10 );
return realMax;
} // Endif.
var realAuto = (typeof auto_val == 'number') ? auto_val : 0;
if ( in_data_val == '*' ) {
return realAuto;
} // Endif.
if ( in_data_val == 'c' ) {
return realAuto / 2;
} // Endif.
return (typeof def_value == 'number') ? def_value : 0;
} // Endif.
if ( typeof in_data_val == 'number' ) {
return realNum;
} // Endif.
return (typeof def_value == 'number') ? def_value : 0;
}
///
/// @brief Create the XML code of a single effect.
///
/// This method creating the effect XML code for a single object.
///
/// @param[in] effectData Effect data.
/// @param[in] effectName The name of the effect.
///
function cbGenerateEffects ( effectData, effectName ) {
var outData = '<a:' + effectName + ' ';
var color = effectData.color || 'black';
var alphaPer = 60;
var algnData = '';
var blurRad = 50800;
var dist = 38100;
var dir = 13500000;
if ( typeof effectData.transparency == 'number' ) {
alphaPer = effectData.transparency;
} // Endif.
if ( (alphaPer > 100) || (alphaPer < 0) )
alphaPer = 60;
alphaPer = (100 - alphaPer) * 1000;
if ( effectData.align ) {
if ( effectData.align.top )
algnData += 't';
if ( effectData.align.bottom )
algnData += 'b';
if ( effectData.align.left )
algnData += 'l';
if ( effectData.align.right )
algnData += 'r';
} // Endif.
if ( algnData == '' )
algnData = 'br';
// Size
// Blur
// Angle
// Distance
// BMK_TODO:
outData += ' blurRad="' + blurRad + '" dist="' + dist + '" dir="' + dir + '" algn="' + algnData + '" rotWithShape="0"';
// sx="24000" sy="24000"
// BMK_TODO:
outData += '><a:prstClr val="' + color + '"><a:alpha val="' + alphaPer + '"/></a:prstClr>';
return outData + '</a:' + effectName + '>';
}
///
/// @brief Create the body properties code for text.
///
/// This method creating the XML code of the body properties of a text.
///
/// @return The body properties XML code.
///
function createBodyProperties ( objOptions ) {
var bodyProperties = '<a:bodyPr';
if ( objOptions && objOptions.bodyProp ) {
// Set anchorPoints bottom, center or top:
if ( objOptions.bodyProp.anchor ) {
bodyProperties += ' anchor="' + objOptions.bodyProp.anchor + '"';
} // Endif.
if ( objOptions.bodyProp.anchorCtr ) {
bodyProperties += ' anchorCtr="' + objOptions.bodyProp.anchorCtr + '"';
} // Endif.
// Enable or disable textwrapping none or square:
if ( objOptions.bodyProp.wrap ) {
bodyProperties += ' wrap="' + objOptions.bodyProp.wrap + '"';
} else {
bodyProperties += ' wrap="square"';
} // Endif.
// Box margins(padding):
// BMK_TODO: I should pass a better value as the auto_val parameter of parseSmartNumber().
if ( objOptions.bodyProp.bIns ) {
bodyProperties += ' bIns="' + parseSmartNumber ( objOptions.bodyProp.bIns, 6858000, 369332, 6858000, 10000 ) + '"';
} // Endif.
if ( objOptions.bodyProp.lIns ) {
bodyProperties += ' lIns="' + parseSmartNumber ( objOptions.bodyProp.lIns, 9144000, 2819400, 9144000, 10000 ) + '"';
} // Endif.
if ( objOptions.bodyProp.rIns ) {
bodyProperties += ' rIns="' + parseSmartNumber ( objOptions.bodyProp.rIns, 9144000, 2819400, 9144000, 10000 ) + '"';
} // Endif.
if ( objOptions.bodyProp.tIns ) {
bodyProperties += ' tIns="' + parseSmartNumber ( objOptions.bodyProp.tIns, 6858000, 369332, 6858000, 10000 ) + '"';
} // Endif.
bodyProperties += ' rtlCol="0">';
if ( objOptions.bodyProp.autoFit !== false ) {
bodyProperties += '<a:spAutoFit/>';
} // Endif.
bodyProperties += '</a:bodyPr>';
// Default:
} else {
bodyProperties += ' wrap="square" rtlCol="0"></a:bodyPr>';
} // Endif.
return bodyProperties;
}
///
/// @brief Generate a slider resource.
///
/// This function generating a slider XML resource.
///
/// @param[in] data The main slide object.
/// @return Text string.
///
function cbMakePptxSlide ( data ) {
var outString = gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"';
var objs_list = data.data;
var timingData = '';
if ( !data.slide.show ) {
outString += ' show="0"';
} // Endif.
outString += '><p:cSld>';
if ( data.slide.back ) {
outString += cMakePptxColorSelection ( false, data.slide.back );
} // Endif.
outString += '<p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr>';
// Loop on all the objects inside the slide to add it into the slide:
for ( var i = 0, total_size = objs_list.length; i < total_size; i++ ) {
var x = 0;
var y = 0;
var cx = 2819400;
var cy = 369332;
var moreStyles = '';
var moreStylesAttr = '';
var outStyles = '';
var styleData = '';
var shapeType = null;
var locationAttr = '';
if ( objs_list[i].options ) {
if ( typeof objs_list[i].options.cx != 'undefined' ) {
if ( objs_list[i].options.cx ) {
cx = parseSmartNumber ( objs_list[i].options.cx, 9144000, 2819400, 9144000, 10000 );
} else {
cx = 1;
} // Endif.
} // Endif.
if ( typeof objs_list[i].options.cy != 'undefined' ) {
if ( objs_list[i].options.cy ) {
cy = parseSmartNumber ( objs_list[i].options.cy, 6858000, 369332, 6858000, 10000 );
} else {
cy = 1;
} // Endif.
} // Endif.
if ( objs_list[i].options.x ) {
x = parseSmartNumber ( objs_list[i].options.x, 9144000, 0, 9144000 - cx, 10000 );
} // Endif.
if ( objs_list[i].options.y ) {
y = parseSmartNumber ( objs_list[i].options.y, 6858000, 0, 6858000 - cy, 10000 );
} // Endif.
if ( objs_list[i].options.shape ) {
shapeType = getShapeInfo ( objs_list[i].options.shape );
} // Endif.
if ( objs_list[i].options.flip_vertical ) {
locationAttr += ' flipV="1"';
} // Endif.
if ( objs_list[i].options.rotate ) {
var rotateVal = objs_list[i].options.rotate > 360 ? (objs_list[i].options.rotate - 360) : objs_list[i].options.rotate;
rotateVal *= 60000;
locationAttr += ' rot="' + rotateVal + '"';
} // Endif.
} // Endif.
switch ( objs_list[i].type ) {
// TODO: remove hard code here
case 'chart':
// loop through the charts
//
if( objs_list[i].renderType === 'pie' )
{
outString += '<p:graphicFrame>\
<p:nvGraphicFramePr>\
<p:cNvPr id="20" name="Chart 19"/>\
<p:cNvGraphicFramePr/>\
<p:nvPr>\
<p:extLst>\
<p:ext uri="{D42A27DB-BD31-4B8C-83A1-F6EECF244321}">\
<p14:modId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="4198609065"/>\
</p:ext>\
</p:extLst>\
</p:nvPr>\
</p:nvGraphicFramePr>\
<p:xfrm>\
<a:off x="1524000" y="1397000"/>\
<a:ext cx="6096000" cy="4064000"/>\
</p:xfrm>\
<a:graphic>\
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart">\
<c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId2"/>\
</a:graphicData>\
</a:graphic>\
</p:graphicFrame>'
}
else if( objs_list[i].renderType === 'column' )
{
outString += '\
\
<p:graphicFrame>\
<p:nvGraphicFramePr>\
<p:cNvPr id="4" name="Chart 3"/>\
<p:cNvGraphicFramePr/>\
<p:nvPr>\
<p:extLst>\
<p:ext uri="{D42A27DB-BD31-4B8C-83A1-F6EECF244321}">\
<p14:modId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1256887135"/>\
</p:ext>\
</p:extLst>\
</p:nvPr>\
</p:nvGraphicFramePr>\
<p:xfrm>\
<a:off x="1524000" y="1397000"/>\
<a:ext cx="6096000" cy="4064000"/>\
</p:xfrm>\
<a:graphic>\
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart">\
<c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId2"/>\
</a:graphicData>\
</a:graphic>\
</p:graphicFrame>\
'
}
break;
case 'text':
case 'cxn':
var effectsList = '';
if ( shapeType == null ) shapeType = getShapeInfo ( null );
// if ( objs_list[i].type == 'text' ) {
// if ( !objs_list[i].options || (!objs_list[i].options.cx && !objs_list[i].options.cx) ) {
// objs_list[i].options = objs_list[i].options ? objs_list[i].options : {};
// objs_list[i].options.bodyProp = objs_list[i].options.bodyProp ? objs_list[i].options.bodyProp : {};
// objs_list[i].options.bodyProp.autoFit = true;
// cx = 9144000 - x;
// cy = 6858000 - y;
// } // Endif.
// } // Endif.
if ( objs_list[i].type == 'cxn' ) {
outString += '<p:cxnSp><p:nvCxnSpPr>';
outString += '<p:cNvPr id="' + (i + 2) + '" name="Object ' + (i + 1) + '"/><p:nvPr/></p:nvCxnSpPr>';
} else {
outString += '<p:sp><p:nvSpPr>';
outString += '<p:cNvPr id="' + (i + 2) + '" name="Object ' + (i + 1) + '"/><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr>';
} // Endif.
outString += '<p:spPr>';
outString += '<a:xfrm' + locationAttr + '>';
outString += '<a:off x="' + x + '" y="' + y + '"/><a:ext cx="' + cx + '" cy="' + cy + '"/></a:xfrm><a:prstGeom prst="' + shapeType.name + '"><a:avLst/></a:prstGeom>';
if ( objs_list[i].options ) {
if ( objs_list[i].options.fill ) {
outString += cMakePptxColorSelection ( objs_list[i].options.fill );
} else {
outString += '<a:noFill/>';
} // Endif.
if ( objs_list[i].options.line ) {
var lineAttr = '';
if ( objs_list[i].options.line_size ) {
lineAttr += ' w="' + (objs_list[i].options.line_size * 12700) + '"';
} // Endif.
// cmpd="dbl"
outString += '<a:ln' + lineAttr + '>';
outString += cMakePptxColorSelection ( objs_list[i].options.line );
if ( objs_list[i].options.line_head ) {
outString += '<a:headEnd type="' + objs_list[i].options.line_head + '"/>';
} // Endif.
if ( objs_list[i].options.line_tail ) {
outString += '<a:tailEnd type="' + objs_list[i].options.line_tail + '"/>';
} // Endif.
outString += '</a:ln>';
} // Endif.
} else {
outString += '<a:noFill/>';
} // Endif.
if ( objs_list[i].options.effects ) {
for ( var ii = 0, total_size_ii = objs_list[i].options.effects.length; ii < total_size_ii; ii++ ) {
switch ( objs_list[i].options.effects[ii].type ) {
case 'outerShadow':
effectsList += cbGenerateEffects ( objs_list[i].options.effects[ii], 'outerShdw' );
break;
case 'innerShadow':
effectsList += cbGenerateEffects ( objs_list[i].options.effects[ii], 'innerShdw' );
break;
} // End of switch.
} // End of for loop.
} // Endif.
if ( effectsList != '' ) {
outString += '<a:effectLst>' + effectsList + '</a:effectLst>';
} // Endif.
outString += '</p:spPr>';
if ( objs_list[i].options ) {
if ( objs_list[i].options.align ) {
switch ( objs_list[i].options.align )
{
case 'right':
moreStylesAttr += ' algn="r"';
break;
case 'center':
moreStylesAttr += ' algn="ctr"';
break;
case 'justify':
moreStylesAttr += ' algn="just"';
break;
} // End of switch.
} // Endif.
if ( objs_list[i].options.indentLevel > 0 ) {
moreStylesAttr += ' lvl="' + objs_list[i].options.indentLevel + '"';
} // Endif.
} // Endif.
if ( moreStyles != '' ) {
outStyles = '<a:pPr' + moreStylesAttr + '>' + moreStyles + '</a:pPr>';
} else if ( moreStylesAttr != '' ) {
outStyles = '<a:pPr' + moreStylesAttr + '/>';
} // Endif.
if ( styleData != '' ) {
outString += '<p:style>' + styleData + '</p:style>';
} // Endif.
if ( typeof objs_list[i].text == 'string' ) {
outString += '<p:txBody>' + createBodyProperties ( objs_list[i].options ) + '<a:lstStyle/><a:p>' + outStyles;
outString += cMakePptxOutTextCommand ( objs_list[i].options, objs_list[i].text, data.slide );
} else if ( objs_list[i].text ) {
var outBodyOpt = createBodyProperties ( objs_list[i].options );
outString += '<p:txBody>' + outBodyOpt + '<a:lstStyle/><a:p>' + outStyles;
for ( var j = 0, total_size_j = objs_list[i].text.length; j < total_size_j; j++ ) {
if ( objs_list[i].text[j] ) {
outString += cMakePptxOutTextCommand ( objs_list[i].text[j].options, objs_list[i].text[j].text, data.slide, outBodyOpt, outStyles );
} // Endif.
} // Endif.
} // Endif.
if ( typeof objs_list[i].text != 'undefined' ) {
var font_size = '';
if ( objs_list[i].options && objs_list[i].options.font_size ) {
font_size = ' sz="' + objs_list[i].options.font_size + '00"';
} // Endif.
outString += '<a:endParaRPr lang="en-US"' + font_size + ' dirty="0"/></a:p></p:txBody>';
} // Endif.
outString += objs_list[i].type == 'cxn' ? '</p:cxnSp>' : '</p:sp>';
break;
// Table:
case 'table':
outString += '<p:graphicFrame><p:nvGraphicFramePr><p:cNvPr id="' + (i + 2) + '" name="Object ' + (i + 1) + '"/><p:cNvGraphicFramePr><a:graphicFrameLocks noGrp="1"/></p:cNvGraphicFramePr><p:nvPr/></p:nvGraphicFramePr>';
outString += '<p:xfrm><a:off x="' + x + '" y="' + y + '"/><a:ext cx="' + cx + '" cy="' + cy + '"/></p:xfrm>';
outString += '<a:graphic><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/table"><a:tbl><a:tblPr firstRow="1" bandRow="1"><a:tableStyleId>{073A0DAA-6AF3-43AB-8588-CEC1D06C72B9}</a:tableStyleId></a:tblPr><a:tblGrid>';
// <a:gridCol w="3276600"/>
outString += '</a:tblGrid>';
// objs_list[i].options
// objs_list[i].rows[][].text
// BMK_TODO:
break;
// Image:
case 'image':
outString += '<p:pic><p:nvPicPr><p:cNvPr id="' + (i + 2) + '" name="Object ' + (i + 1) + '"/><p:cNvPicPr><a:picLocks noChangeAspect="1"/></p:cNvPicPr><p:nvPr/></p:nvPicPr><p:blipFill><a:blip r:embed="rId' + objs_list[i].rel_id + '" cstate="print"/><a:stretch><a:fillRect/></a:stretch></p:blipFill><p:spPr><a:xfrm' + locationAttr + '><a:off x="' + x + '" y="' + y + '"/><a:ext cx="' + cx + '" cy="' + cy + '"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr></p:pic>';
break;
// Paragraph:
case 'p':
if ( shapeType == null ) shapeType = getShapeInfo ( null );
outString += '<p:sp><p:nvSpPr>';
outString += '<p:cNvPr id="' + (i + 2) + '" name="Object ' + (i + 1) + '"/><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr>';
outString += '<p:spPr>';
outString += '<a:xfrm' + locationAttr + '>';
outString += '<a:off x="' + x + '" y="' + y + '"/><a:ext cx="' + cx + '" cy="' + cy + '"/></a:xfrm><a:prstGeom prst="' + shapeType.name + '"><a:avLst/></a:prstGeom>';
if ( objs_list[i].options ) {
if ( objs_list[i].options.fill ) {
outString += cMakePptxColorSelection ( objs_list[i].options.fill );
} else {
outString += '<a:noFill/>';
} // Endif.
if ( objs_list[i].options.line ) {
outString += '<a:ln>';
outString += cMakePptxColorSelection ( objs_list[i].options.line );
if ( objs_list[i].options.line_head ) {
outString += '<a:headEnd type="' + objs_list[i].options.line_head + '"/>';
} // Endif.
if ( objs_list[i].options.line_tail ) {
outString += '<a:tailEnd type="' + objs_list[i].options.line_tail + '"/>';
} // Endif.
outString += '</a:ln>';
} // Endif.
} else {
outString += '<a:noFill/>';
} // Endif.
outString += '</p:spPr>';
if ( styleData != '' ) {
outString += '<p:style>' + styleData + '</p:style>';
} // Endif.
outString += '<p:txBody><a:bodyPr wrap="square" rtlCol="0"><a:spAutoFit/></a:bodyPr><a:lstStyle/>';
for ( var j = 0, total_size_j = objs_list[i].data.length; j < total_size_j; j++ ) {
if ( objs_list[i].data[j] ) {
moreStylesAttr = '';
moreStyles = '';
if ( objs_list[i].data[j].options ) {
if ( objs_list[i].data[j].options.align ) {
switch ( objs_list[i].data[j].options.align )
{
case 'right':
moreStylesAttr += ' algn="r"';
break;
case 'center':
moreStylesAttr += ' algn="ctr"';
break;
case 'justify':
moreStylesAttr += ' algn="just"';
break;
} // End of switch.
} // Endif.
if ( objs_list[i].data[j].options.indentLevel > 0 ) {
moreStylesAttr += ' lvl="' + objs_list[i].data[j].options.indentLevel + '"';
} // Endif.
if ( objs_list[i].data[j].options.listType == 'number' ) {
moreStyles += '<a:buFont typeface="+mj-lt"/><a:buAutoNum type="arabicPeriod"/>';
} // Endif.
} // Endif.
if ( moreStyles != '' ) {
outStyles = '<a:pPr' + moreStylesAttr + '>' + moreStyles + '</a:pPr>';
} else if ( moreStylesAttr != '' ) {
outStyles = '<a:pPr' + moreStylesAttr + '/>';
} // Endif.
outString += '<a:p>' + outStyles;
// if ( typeof objs_list[i].data[j].text == 'string' ) {
outString += cMakePptxOutTextCommand ( objs_list[i].data[j].options, objs_list[i].data[j].text, data.slide );
// BMK_TODO:
} // Endif.
} // Endif.
var font_size = '';
if ( objs_list[i].options && objs_list[i].options.font_size ) {
font_size = ' sz="' + objs_list[i].options.font_size + '00"';
} // Endif.
outString += '<a:endParaRPr lang="en-US"' + font_size + ' dirty="0"/></a:p>';
outString += '</p:txBody>';
outString += '</p:sp>';
break;
} // End of switch.
} // End of for loop.
outString += '</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>';
if ( timingData != '' ) {
outString += '<p:timing>' + timingData + '</p:timing>';
} // Endif.
outString += '</p:sld>';
return outString;
}
///
/// @brief Generate the extended attributes file (app) for PPTX/PPSX documents.
///
/// ???.
///
/// @param[in] data Ignored by this callback function.
/// @return Text string.
///
function cbMakePptxApp ( data ) {
var slidesCount = gen_private.pages.length;
var userName = genobj.options.creator || 'officegen';
var outString = gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><TotalTime>0</TotalTime><Words>0</Words><Application>Microsoft Office PowerPoint</Application><PresentationFormat>On-screen Show (4:3)</PresentationFormat><Paragraphs>0</Paragraphs><Slides>' + slidesCount + '</Slides><Notes>0</Notes><HiddenSlides>0</HiddenSlides><MMClips>0</MMClips><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="4" baseType="variant"><vt:variant><vt:lpstr>Theme</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant><vt:variant><vt:lpstr>Slide Titles</vt:lpstr></vt:variant><vt:variant><vt:i4>' + slidesCount + '</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="' + (slidesCount + 1) + '" baseType="lpstr"><vt:lpst