UNPKG

spider-officegen

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 e

995 lines (825 loc) 93.3 kB
// // 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, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/"/g, '&quot;'); }; } 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 = ''; out_obj.baseline = ''; 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.baseline ) { out_obj.baseline = ' baseline="' + text_info.baseline * 1000 + '"'; } // 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', 'baseline'].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"/>'; } else if ( pData[j].options.listType == 'dot' ) { moreStyles += '<a:buChar char="•"/>'; } // 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 cbMakePptxSlide ( data, makeOnlyObjects ) { var outString = ''; var objs_list = data.data; var timingData = ''; // Slide with layout support: if ( data.slide.useLayout && typeof data.slide.useLayout == 'object' && data.slide.useLayout.mkResCb ) { data.slide.useLayout.slide = data.slide; return data.slide.useLayout.mkResCb ( data.slide.useLayout ); } // Endif. // Allow you to turn this method into layout generator: var slideElement = data.slide.layoutName ? 'Layout' : ''; var slideElementA = data.slide.layoutName ? ' type="' + data.slide.layoutName + '" preserve="1"' : ''; // Create the header of the slide (only if we need that): if ( !makeOnlyObjects ) { outStri