officegen-dbb
Version:
Modification of Ziv Barber's officegen, to provide a reasonable way to have line breaks in table cells.
970 lines (805 loc) • 94.7 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.
//
/**
* Basicgen plugin to create pptx files (Microsoft PowerPoint).
*/
var baseobj = require("./basicgen.js");
var OfficeChart = require("./officechart.js");
var msdoc = require("./msofficegen.js");
var pptxShapes = require("./pptxshapes.js");
var pptxFields = require("./pptxfields.js");
var fs = require('fs');
var officeTable = require('./genofficetable');
var path = require('path');
var fast_image_size = require('fast-image-size');
var excelbuilder = require('./msexcel-builder.js');
var xmlBuilder = require('xmlbuilder');
var docplugman = require('./docplug');
// Officegen pptx plugins:
var plugWidescreen = require('./pptxplg-widescreen');
var plugSpeakernotes = require('./pptxplg-speakernotes');
var plugLayouts = require('./pptxplg-layouts');
// BMK_PPTX_PLUG:
if ( !String.prototype.encodeHTML ) {
String.prototype.encodeHTML = function () {
return this.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
};
}
var GLOBAL_CHART_COUNT = 0;
/**
* Extend officegen object with PPTX/PPSX support.
*
* This method extending the given officegen object to create PPTX/PPSX document.
*
* @param {object} genobj The object to extend.
* @param {string} new_type The type of object to create.
* @param {object} options The object's options.
* @param {object} gen_private Access to the internals of this object.
* @param {object} type_info Additional information about this type.
* @constructor
* @name makePptx
*/
function makePptx ( genobj, new_type, options, gen_private, type_info ) {
/**
* Prepare the default data.
* @param {object} docpluginman Access to the document plugins manager.
*/
function setDefaultDocValues ( docpluginman ) {
var pptxData = docpluginman.getDataStorage ();
// Please put any setting that API can override here:
pptxData.EMUS_PER_PT = 12700;
pptxData.pptWidth = 720 * pptxData.EMUS_PER_PT;
pptxData.pptHeight = 540 * pptxData.EMUS_PER_PT;
pptxData.pptType = 'screen4x3';
// Rels im the main rels file that depended on the data and must be added after the slides:
pptxData.extraMainRelList = [];
}
/**
* Convert shape name to shape information.
*
* This method convert the shape information reseived from the user to the real shape information object.
*
* @param {object} 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;
genobj.fields = pptxFields;
genobj.options = (options && typeof options == 'object') ? options : {};
// Temporary, I'll create a new code without the need to create a temp file (Ziv Barber, 2016-06-23):
if ( !genobj.options.tempDir ) {
genobj.options.tempDir = './';
} // Endif.
/**
* Prepare everything to generate PPTX files.
*
* This method checking for extra resources needed to add by the generator engine.
*/
function cbPreparePptxToGenerate () {
genobj.generate_data = {};
// Tell all the features (plugins) that we are about to generate a new document zip:
gen_private.features.type.pptx.emitEvent ( 'beforeGen', genobj );
// Allow some plugins to do more stuff after all the plugins added their data:
gen_private.features.type.pptx.emitEvent ( 'beforeGenFinal', genobj );
// Apple Keynote requires these added *after* all slides:
gen_private.type.msoffice.rels_app.push (
{
type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/presProps',
target: 'presProps.xml',
clear: 'type'
},
{
type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/viewProps',
target: 'viewProps.xml',
clear: 'type'
},
{
type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
target: 'theme/theme1.xml',
clear: 'type'
}
);
// This event allow the plugins to add permanent rels that must be at the end:
var extraMainRelList = [];
gen_private.features.type.pptx.emitEvent ( 'addMainRels', { genobj: genobj, relsList: extraMainRelList } );
extraMainRelList.forEach ( function ( value ) {
gen_private.type.msoffice.rels_app.push ( value );
});
// Add any extra rels needed by the plugins and depended on the data:
if ( gen_private.type.pptx.extraMainRelList && typeof gen_private.type.pptx.extraMainRelList === 'object' && gen_private.type.pptx.extraMainRelList.forEach ) {
gen_private.type.pptx.extraMainRelList.forEach ( function ( value ) {
gen_private.type.msoffice.rels_app.push ( value );
});
};
gen_private.type.msoffice.rels_app.push (
{
type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableStyles',
target: 'tableStyles.xml',
clear: 'type'
}
);
}
/**
* Create the 'presProps.xml' resource.
*
* @param {object} 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>';
}
/**
* Create the 'tableStyles.xml' resource.
*
* @param {object} 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}"/>';
}
/**
* Create the 'viewProps.xml' resource.
*
* @param {object} 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>';
}
/**
* Create the 'slideLayout1.xml' resource.
*
* @param {object} data Ignored by this callback function.
* @return Text string.
*/
function cbMakePptxLayout1 ( data ) {
if ( !data || typeof data !== 'object' ) {
data = {};
} // Endif.
// You can place here the title:
var ph1 = '<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>';
if ( data.ph1 && data.slide && data.ph1.length ) {
ph1 = cMakePptxOutTextP ( '', data.ph1, {}, data.slide );
} // Endif.
// The sub-title:
var ph2 = '<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>';
if ( data.ph2 && data.slide && data.ph2.length ) {
ph2 = cMakePptxOutTextP ( '', data.ph2, {}, data.slide );
} // Endif.
var ph3 = createFieldText ( 'DATE_TIME', 1, data.useDate );
var footFull = '';
var ft = '';
var curElNum = 4;
if ( data.isDate || !data.isRealSlide ) {
footFull += '<p:sp><p:nvSpPr><p:cNvPr id="' + curElNum + '" 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>' + ph3 + '</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp>';
curElNum++;
} // Endif.
if ( data.isFooter && data.ft && data.slide && data.ft.length ) {
ft = cMakePptxOutTextP ( '', data.ft, {}, data.slide );
footFull += '<p:sp><p:nvSpPr><p:cNvPr id="' + curElNum + '" 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/>' + ft + '</p:txBody></p:sp>';
curElNum++;
} else if ( !data.isRealSlide ) {
footFull += '<p:sp><p:nvSpPr><p:cNvPr id="' + curElNum + '" 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>';
curElNum++;
} // Endif.
if ( data.isSlideNum || !data.isRealSlide ) {
footFull += '<p:sp><p:nvSpPr><p:cNvPr id="' + curElNum + '" 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="{B1393E5F-521B-4CAD-9D3A-AE923D912DCE}" 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>';
curElNum++;
} // Endif.
return gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml ( data ) + '<p:sld' + (data.isRealSlide ? '' : 'Layout') + ' 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"' + (data.isRealSlide ? '' : ' 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/>' + ph1 + '</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>' + ph2 + '</p:txBody></p:sp>' + footFull + '</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld' + (data.isRealSlide ? '' : 'Layout') + '>';
}
/**
* Create the main presentation resource.
*
* This resource is the main resource of any PowerPoint document.
*
* @param {object} 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>';
// Signal to the plugins to add any extra xml needed for this file:
var dataToPlugs = {
data: outString
};
gen_private.features.type.pptx.emitEvent ( 'presentationGen', dataToPlugs );
outString = dataToPlugs.data + '<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="' + gen_private.type.pptx.pptWidth + '" cy="'+gen_private.type.pptx.pptHeight+'" type="' + gen_private.type.pptx.pptType + '"/><p:notesSz cx="'+gen_private.type.pptx.pptHeight+'" cy="'+gen_private.type.pptx.pptWidth+'"/><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;
}
/**
* Create the slides masters resource.
*
* @param {object} data Ignored by this callback function.
* @return Text string.
*/
function cbMakePptxSlideMasters ( data ) {
var outData = 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>';
var curRelId = 1;
var curId = 2147483649;
var getDocData = plugsmanObj.getDataStorage ();
// Add all the slide layouts needed:
outData += '<p:sldLayoutId id="' + curId + '" r:id="rId' + curRelId + '"/>';
curRelId++;
curId++;
if ( getDocData.slideLayouts && typeof getDocData.slideLayouts === 'object' ) {
for ( var item in getDocData.slideLayouts ) {
if ( getDocData.slideLayouts[item] ) {
outData += '<p:sldLayoutId id="' + curId + '" r:id="rId' + getDocData.slideLayouts[item].relIdMaster + '"/>';
curRelId++;
curId++;
} // Endif.
} // End of for loop.
} // Endif.
outData += '</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>';
return outData;
}
/**
* Generate the XML code to describe colors.
*
* @param {object} color_info Foreground color information.
* @param {object} 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;
case 'gradient':
outText += '<a:gradFill flip="none" rotWithShape="1"><a:gsLst>';
for ( var item in colorVal ) {
if ( typeof colorVal[item] == 'string' ) {
// Positions are inverted because they start with 100000:
outText += '<a:gs pos="' + (100000 - Math.round(100000 / (colorVal.length - 1) * item)) + '"><a:srgbClr val="' + colorVal[item] + '">' + internalElements + '</a:srgbClr></a:gs>';
} else {
outText += '<a:gs pos="' + colorVal[item].position*1000 + '"><a:srgbClr val="' + colorVal[item].color + '">' + internalElements + '</a:srgbClr></a:gs>';
} // Endif.
} // End of for loop.
if ( typeof color_info.angle != 'undefined' ) {
outText += '</a:gsLst><a:lin ang="'+color_info.angle*100000+'" scaled="1"/><a:tileRect/></a:gradFill>';
} else {
outText += '</a:gsLst><a:path path="circle"><a:fillToRect l="100000" t="100000"/></a:path><a:tileRect r="-100000" b="-100000"/></a:gradFill>';
} // Endif.
break;
} // End of switch.
} // Endif.
return outText;
}
/**
* Translate field_name into the text real value.
*
* This method creating the text to display for the given field.
*
* @param {string} field_name the name of the field.
* @param {number} slide_num current slide number.
* @param {Date} useDate Optional date to use instead of the current date.
* @return The text string data.
*/
function createFieldText ( field_name, slide_num, useDate ) {
var curDateTime = useDate ? new Date ( useDate ) : new Date ();
var dayInWeek = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
var monthsList = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
var monthsShortList = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
var outValue = '';
// curDateTime.getDate () Returns the day of the month (from 1-31)
// curDateTime.getDay () Returns the day of the week (from 0-6)
// curDateTime.getFullYear () Returns the year (four digits)
// curDateTime.getHours () Returns the hour (from 0-23)
// curDateTime.getMinutes () Returns the minutes (from 0-59)
// curDateTime.getMonth () Returns the month (from 0-11)
// curDateTime.getSeconds () Returns the seconds (from 0-59)
switch ( field_name ) {
// presentation slide number:
case 'SLIDE_NUM':
case 'slidenum':
outValue += slide_num;
break;
// default date time format for the rendering application:
case 'DATE_TIME':
case 'datetime':
outValue += (curDateTime.getMonth () + 1) + '/' + curDateTime.getDate () + '/' + curDateTime.getFullYear ();
break;
// MM/DD/YYYY date time format (Example: 10/12/2007):
case 'DATE_MM_DD_YYYY':
case 'datetime1':
outValue += (curDateTime.getMonth () + 1) + '/' + curDateTime.getDate () + '/' + curDateTime.getFullYear ();
break;
// Day, Month DD, YYYY date time format (Example: Friday, October 12, 2007):
case 'DATE_WD_MN_DD_YYYY':
case 'datetime2':
outValue += dayInWeek[curDateTime.getDay ()] + ', ' + monthsList[curDateTime.getMonth ()] + ' ' + curDateTime.getDate () + ', ' + curDateTime.getFullYear ();
break;
// DD Month YYYY date time format (Example: 12 October 2007):
case 'DATE_DD_MN_YYYY':
case 'datetime3':
outValue += curDateTime.getDate () + ' ' + monthsList[curDateTime.getMonth ()] + ' ' + curDateTime.getFullYear ();
break;
// Month DD, YYYY date time format (Example: October 12, 2007):
case 'DATE_MN_DD_YYYY':
case 'datetime4':
outValue += monthsList[curDateTime.getMonth ()] + ' ' + curDateTime.getDate () + ', ' + curDateTime.getFullYear ();
break;
// DD-Mon-YY date time format (Example: 12-Oct-07):
case 'DATE_DD_SMN_YY':
case 'datetime5':
outValue += curDateTime.getDate () + '-' + monthsShortList[curDateTime.getMonth ()] + '-' + (curDateTime.getFullYear () % 100);
break;
// Month YY date time format (Example: October 07):
case 'DATE_MM_YY':
case 'datetime6':
outValue += monthsList[curDateTime.getMonth ()] + ' ' + (curDateTime.getFullYear () % 100);
break;
// Mon-YY date time format (Example: Oct-07):
case 'DATE_SMN_YY':
case 'datetime7':
outValue += monthsShortList[curDateTime.getMonth ()] + '-' + (curDateTime.getFullYear () % 100);
break;
// MM/DD/YYYY hh:mm AM/PM date time format (Example: 10/12/2007 4:28 PM):
case 'DATE_TIME_DD_MM_YYYY_HH_MM_PM':
case 'datetime8':
outValue += curDateTime.getMonth () + '/' + curDateTime.getDate () + '/' + curDateTime.getFullYear ();
outValue += (curDateTime.getHours () % 12) + ':' + curDateTime.getMinutes ();
outValue += (curDateTime.getHours () > 11) ? ' PM' : ' AM';
break;
// MM/DD/YYYY hh:mm:ss AM/PM date time format (Example: 10/12/2007 4:28:34 PM):
case 'DATE_TIME_DD_MM_YYYY_HH_MM_SC_PM':
case 'datetime9':
outValue += curDateTime.getMonth () + '/' + curDateTime.getDate () + '/' + curDateTime.getFullYear ();
outValue += (curDateTime.getHours () % 12) + ':' + curDateTime.getMinutes () + ':' + curDateTime.getSeconds ();
outValue += (curDateTime.getHours () > 11) ? ' PM' : ' AM';
break;
// hh:mm date time format (Example: 16:28):
case 'TIME_HH_MM':
case 'datetime10':
outValue += curDateTime.getHours () + ':' + curDateTime.getMinutes ();
break;
// hh:mm:ss date time format (Example: 16:28:34):
case 'TIME_HH_MM_SC':
case 'datetime11':
outValue += curDateTime.getHours () + ':' + curDateTime.getMinutes () + ':' + curDateTime.getSeconds ();
break;
// hh:mm AM/PM date time format (Example: 4:28 PM):
case 'TIME_HH_MM_PM':
case 'datetime12':
outValue += (curDateTime.getHours () % 12) + ':' + curDateTime.getMinutes ();
outValue += (curDateTime.getHours () > 11) ? ' PM' : ' AM';
break;
// hh:mm:ss: AM/PM date time format (Example: 4:28:34 PM):
case 'TIME_HH_MM_SC_PM':
case 'datetime13':
outValue += (curDateTime.getHours () % 12) + ':' + curDateTime.getMinutes () + ':' + curDateTime.getSeconds ();
outValue += (curDateTime.getHours () > 11) ? ' PM' : ' AM';
break;
default:
return null;
} // End of switch.
return outValue;
}
/**
* ???.
*
* @param {object} text_info Information how to display the text.
* @param {object} 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.italic = '';
out_obj.strike = '';
out_obj.underline = '';
out_obj.rpr_info = '';
out_obj.char_spacing = '';
if ( typeof text_info == 'object' )
{
if ( text_info.bold ) {
out_obj.bold = ' b="1"';
} // Endif.
if ( text_info.italic ) {
out_obj.italic = ' i="1"';
} // Endif.
if ( text_info.strike ) {
out_obj.strike = ' strike="sngStrike"';
} // 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.
// psv 2015-01-21 Manually copied in from https://github.com/Ziv-Barber/officegen/pull/41/files
if ( text_info.char_spacing ) {
out_obj.char_spacing = ' spc="' + (text_info.char_spacing * 100) + '"';
// Must also disable kerning; otherwise text won't actually expand:
out_obj.char_spacing += ' kern="0"';
} // 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>';
} // Endif.
return out_obj;
}
/**
* Create a text object for adding into a slide.
*
* @param {object} text_info Information how to display the text.
* @param {object} text_string The text string or requested field.
* @param {object} slide_obj The object of this slider.
* @param {object} slide_num Current slide number.
* @param {string} out_styles Paragraph style used to style paragraphs generated by newlines
* @return The PPTX code.
*/
function cMakePptxOutTextCommand ( text_info, text_string, slide_obj, slide_num, out_styles ) {
text_info = text_info || {};
var area_opt_data = cMakePptxOutTextData ( text_info, slide_obj );
var textStyles = ['font_size', 'strike', 'italic', 'bold', 'underline', 'char_spacing'].reduce(function(acc, attr) {
return acc + area_opt_data[attr]
}, '');
var parsedText;
var startInfo = '<a:rPr lang="en-US"' + textStyles + ' dirty="0" smtClean="0"' +
(area_opt_data.rpr_info != '' ? ('>' + area_opt_data.rpr_info) : '/>') + '<a:t>';
var endTag = '</a:r>';
var outData = '<a:r>' + startInfo;
if ( text_string.field ) {
endTag = '</a:fld>';
var outTextField = pptxFields[text_string.field];
if ( outTextField === null ) {
for ( var fieldIntName in pptxFields ) {
if ( pptxFields[fieldIntName] === text_string.field ) {
outTextField = text_string.field;
break;
} // Endif.
} // End of for loop.
if ( outTextField === null ) {
outTextField = 'datetime';
} // Endif.
} // Endif.
outData = '<a:fld id="{' + gen_private.plugs.type.msoffice.makeUniqueID ( '5C7A2A3D' ) + '}" type="' + outTextField + '">' + startInfo;
outData += createFieldText ( outTextField, slide_num );
} else {
// Automatic support for newline - split it into multi-p:
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>';
if (out_styles) outTextData += out_styles;
} // Endif.
} // End of for loop.
outData = outTextData;
} else {
outData += text_string.encodeHTML ();
} // Endif.
} // Endif.
var outBreakP = '';
if ( text_info.breakLine ) {
outBreakP += '</a:p><a:p>';
} // Endif.
return outData + '</a:t>' + endTag + outBreakP;
}
/**
* Create all the objects inside a single paragraph.
* @param {string} outString The string to add the output xml to it.
* @param {Array} pData Array with all the parts of this paragraph.
* @param {object} pOptions Paragraph options.
* @param {object} slideObj The object of this slider.
*/
function cMakePptxOutTextP ( outString, pData, pOptions, slideObj ) {
var outStyles = '';
var moreStylesAttr;
var moreStyles;
// Work on all the parts of this paragraph:
for ( var j = 0, total_size_j = pData.length; j < total_size_j; j++ ) {
if ( pData[j] ) {
moreStylesAttr = '';
moreStyles = '';
if ( pData[j].options ) {
if ( pData[j].options.align ) {
switch ( pData[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 ( pData[j].options.indentLevel > 0 ) {
moreStylesAttr += ' lvl="' + pData[j].options.indentLevel + '"';
} // Endif.
if ( pData[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.
if ( outStyles || !j ) {
if ( j ) {
outString += '<a:p>';
} // Endif.
outString += '<a:p>' + outStyles;
} // Endif.
outString += cMakePptxOutTextCommand ( pData[j].options, pData[j].text, slideObj, slideObj.getPageNumber (), outStyles );
} // Endif.
} // End of for loop - adding all the objects inside the paragraph.
var font_size = '';
if ( pOptions && pOptions.font_size ) {
font_size = ' sz="' + pOptions.font_size + '00"';
} // Endif.
outString += '<a:endParaRPr lang="en-US"' + font_size + ' dirty="0"/></a:p>';
return outString;
}
/**
* ???.
*
* @param {object} in_data_val Input value as passed by the user.
* @param {number} max_value Maximum value allowed.
* @param {number} def_value Default value.
* @param {number} auto_val ???.
* @param {number} 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 = Math.round ( 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 Math.round ( (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 Math.round ( realAuto / 2 );
} // Endif.
} // Endif.
if ( typeof in_data_val == 'number' ) {
return realNum;
} // Endif.
return (typeof def_value == 'number') ? def_value : 0;
}
/**
* Create the XML code of a single effect.
*
* This method creating the effect XML code for a single object.
*
* @param {object} effectData Effect data.
* @param {string} 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 + '>';
}
/**
* 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, gen_private.type.pptx.pptHeight, 369332, gen_private.type.pptx.pptHeight, 10000 ) + '"';
} // Endif.
if ( objOptions.bodyProp.lIns ) {
bodyProperties += ' lIns="' + parseSmartNumber ( objOptions.bodyProp.lIns, gen_private.type.pptx.pptWidth, 2819400, gen_private.type.pptx.pptWidth, 10000 ) + '"';
} // Endif.
if ( objOptions.bodyProp.rIns ) {
bodyProperties += ' rIns="' + parseSmartNumber ( objOptions.bodyProp.rIns, gen_private.type.pptx.pptWidth, 2819400, gen_private.type.pptx.pptWidth, 10000 ) + '"';
} // Endif.
if ( objOptions.bodyProp.tIns ) {
bodyProperties += ' tIns="' + parseSmartNumber ( objOptions.bodyProp.tIns, gen_private.type.pptx.pptHeight, 369332, gen_private.type.pptx.pptHeight, 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;
}
/**
* Generate a slider resource.
*
* This function generating a slider XML resource.
*
* @param {object} data The main slide object.
* @param {boolean} makeOnlyObjects is true to turn this method to make only the objects in data.data.
* @return Text string.
*/
function cbMakePptxS