slides/custom/asset/md2reveal-0.1.7/js/md2reveal.js (169 lines of code) (raw):
(function () {
var Reveal = window.Reveal;
var indexOf = uncurry([].indexOf);
var forEach = uncurry([].forEach);
var CSS_FRAGMENT = 'fragment';
var CSS_VISIBLE = 'visible';
var ATTR_SRC = 'data-md2r-src';
var ATTR_STYLE = 'data-md2r-style';
var ATTR_FRAGMENT_STACK = 'data-md2r-fragment-stack';
var ATTR_FRAGMENT_INDEX = 'data-fragment-index';
var ATTR_FRAGMENT_PARAM = 'data-fragment-param';
var ATTR_LAST_SRC_INACTIVE = 'data-last-src-inactive';
var HASH_MD2_FRAGMENT = '_md2r_fragment_';
var ABOUT_BLANK = 'about:blank';
Reveal.addEventListener('ready', function(event) {
processIFrames(event.currentSlide, activeIFrame);
});
Reveal.addEventListener('slidechanged', function(event) {
// event.previousSlide, event.currentSlide, event.indexh, event.indexv
processIFrames(event.currentSlide, activeIFrame);
processIFrames(event.previousSlide, inactiveIFrame);
});
Reveal.addEventListener('fragmentshown', function(event) {
// event.fragment = the fragment DOM element
// event.fragments = []
event.fragments.forEach(function (fragment) {
var ref = getRefFragment(fragment);
if (ref) {
pushFragmentStack(ref.targetFragment, ref);
processIFrames(ref.targetFragment, stepInfoIFrame, ref);
}
else {
var fragmentInfo = {
fragmentIndex: getFragmentIndex(fragment),
fragmentParam: getFragmentParam(fragment)
};
pushFragmentStack(fragment, fragmentInfo);
processIFrames(fragment, activeIFrame, fragmentInfo);
}
});
});
Reveal.addEventListener('fragmenthidden', function(event) {
// event.fragment = the fragment DOM element
// event.fragments = []
event.fragments.forEach(function (fragment) {
var ref = getRefFragment(fragment);
if (ref) {
popFragmentStack(ref.targetFragment);
var last = getFragmentStackLast(ref.targetFragment);
last && processIFrames(ref.targetFragment, stepInfoIFrame, last);
}
else {
popFragmentStack(fragment);
processIFrames(fragment, inactiveIFrame);
}
});
});
Reveal.addEventListener('overviewshown', function(event) {
});
Reveal.addEventListener('overviewhidden', function(event) {
});
function processIFrames(container, action, actionArg) {
if (!container) {
return;
}
if (container.tagName.toLowerCase() === 'iframe') {
action(container, actionArg);
return;
}
var iframes = container.querySelectorAll('iframe');
forEach(iframes, function (iframe) {
var ancestor = getAncestor(iframe, container, CSS_FRAGMENT);
if (!ancestor || hasClass(ancestor, CSS_VISIBLE)) {
action(iframe, actionArg);
}
});
}
function getRefFragment(currFragment) {
var refId = currFragment.getAttribute('data-fragment-ref-id');
if (refId) {
return {
fragmentIndex: getFragmentIndex(currFragment),
fragmentParam: getFragmentParam(currFragment),
targetFragment: document.getElementById(refId)
};
}
}
function getFragmentIndex(fragment) {
return fragment.getAttribute(ATTR_FRAGMENT_INDEX);
}
function getFragmentParam(fragment) {
return fragment.getAttribute(ATTR_FRAGMENT_PARAM) || '';
}
function activeIFrame(ifrEl, fragmentInfo) {
var url = ifrEl.getAttribute(ATTR_LAST_SRC_INACTIVE);
ifrEl.setAttribute(ATTR_LAST_SRC_INACTIVE, '');
stepInfoIFrame(ifrEl, fragmentInfo, url);
var style = ifrEl.getAttribute(ATTR_STYLE);
if (style) {
ifrEl.setAttribute('style', style);
}
}
function inactiveIFrame(ifrEl) {
if (ifrEl.src && ifrEl.src !== ABOUT_BLANK) {
ifrEl.setAttribute(ATTR_LAST_SRC_INACTIVE, ifrEl.src);
}
ifrEl.src = ABOUT_BLANK;
}
function pushFragmentStack(fragment, fragmentInfo) {
var fragmentStack = getFragmentStack(fragment);
fragmentStack.push(fragmentInfo.fragmentIndex + ':' + fragmentInfo.fragmentParam);
setFragmentStack(fragment, fragmentStack);
}
function popFragmentStack(fragment) {
var fragmentStack = getFragmentStack(fragment);
fragmentStack.pop();
setFragmentStack(fragment, fragmentStack);
}
function getFragmentStack(fragment) {
var str = fragment.getAttribute(ATTR_FRAGMENT_STACK);
return str ? str.split('_') : [];
}
function setFragmentStack(fragment, fragmentStack) {
fragment.setAttribute(ATTR_FRAGMENT_STACK, fragmentStack.join('_'));
}
function getFragmentStackLast(fragment) {
var fragmentStack = getFragmentStack(fragment);
if (fragmentStack.length) {
var last = fragmentStack[fragmentStack.length - 1].split(':');
return {
fragmentIndex: last[0],
fragmentParam: last[1] || ''
};
}
}
function stepInfoIFrame(ifrEl, fragmentInfo, url) {
if (!url) {
url = ifrEl.getAttribute(ATTR_SRC);
}
if (!url) {
return;
}
if (url.indexOf('#') < 0) {
url += '#';
}
if (fragmentInfo) {
var ifrFlag = HASH_MD2_FRAGMENT + '=' + fragmentInfo.fragmentParam;
if (url.indexOf(HASH_MD2_FRAGMENT + '=') < 0) {
url += ifrFlag;
}
else {
url.replace(/_md2r_fragment=\d+/, ifrFlag);
}
}
ifrEl.src = url;
}
function uncurry(method) {
return function () {
return Function.call.apply(method, arguments);
};
}
// Notice: do not check whether terminalAncestor has the className,
// and do not return terminalAncestor.
function getAncestor(el, terminalAncestor, className) {
while (el && el !== terminalAncestor) {
if (hasClass(el, className)) {
return el;
}
el = el.parentNode;
}
return null;
}
function hasClass(el, className) {
return indexOf(el.classList, className) >= 0;
}
})();