UNPKG

ng-revealjs

Version:

Angular Directive wrapper for Revealjs presentation library.

118 lines (113 loc) 3.72 kB
angular.module('reveal', []) .constant('revealConfig', {}) .directive('ng-reveal', ['revealConfig', function(revealConfig) { if (angular.isUndefined(window.Reveal)) { throw new Error('ng-reveal needs Revealjs to work'); } var initReveal = function(reveal){ //Set default values var optionsObj = {transition:Reveal.getQueryHash().transition || 'none'}; if(angular.isDefined(opts.slides)){ optionsObj.slides = opts.slides; } if(angular.isDefined(opts.transition)){ optionsObj.transition = opts.transition } //Boolean options if(angular.isDefined(opts.loop)){ optionsObj.loop = opts.loop; // reveal.configure({}); } if(angular.isDefined(opts.controls)){ optionsObj.controls = opts.controls; } //Initialize reveal with options reveal.initialize(optionsObj); if(angular.isDefined(opts.onLoad)){ scope.$evalAsync(function () { if (angular.isFunction(opts.onLoad)) { reveal.addEventListener('ready', function( event ) { opts.onLoad(); }); } else { throw new Error('ui-ace use a function as callback.'); } }); } // [TODO] Return current slide when slidechanged if(angular.isDefined(opts.onChange)){ scope.$evalAsync(function () { if (angular.isFunction(opts.onChange)) { reveal.addEventListener('slidechanged', function( event ) { opts.onChange(); }); } else { throw new Error('ui-ace use a function as callback.'); } }); } }; return { restrict:'AE', replace:'true', template:'<div class="slides"></div>', //[TODO] Use compile function link: function(scope, elem, attrs) { /** * Reveal Object */ var reveal = window.Reveal; for (var i = 0; i < attrs.slides.length; i++) { var slide = attrs.slides[i]; var section = angular.element("<slide>"); section.attr('content', slide); //if there is only one step if (slide.hasOwnProperty('pages') && slide.pages.length == 1) { var content = angular.element("<h2>").html(slide.name); section.append(content); } else if(slide.hasOwnProperty('pages') && slide.pages.length > 1) { for (var j = 0; j < slide.pages.length; j++) { var subSection = angular.element('<slide>'); subSection.attr('content', slide.pages[j]); section.append(subSection); } } elem.append(section); } initReveal(reveal); } }; }]).directive('slide', function(){ return { restrict: 'AE', template:'<section class="reveal_section">', scope:{ content:'=content' }, link:function(scope, elem, attrs){ if(angular.isDefined(attrs.content)){ var slide = attrs.content; if(slide.hasOwnProperty('background')){ elem.attr('data-background', slide.background); } if (slide.hasOwnProperty('pages') && slide.pages.length == 1) { var content = angular.element("<h2>").html(slide.name); elem.append(content); } if(slide.hasOwnProperty('image')){ var img = angular.element('<img>'); img.attr('src', slide.image.url); if(slide.image.hasOwnProperty('style')){ img.attr('style', slide.image.style); } elem.append(img); } // Project contains content // if(slide.hasOwnProperty('content') && !slide.hasOwnProperty('pages')){ // var content = angular.element(slide.content); // section.append(content); // } } } } });