mirror of
https://github.com/vbatts/talks.git
synced 2024-10-31 22:26:44 +00:00
devconf.IN 2019
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
parent
20069b8965
commit
0ff34eb979
245 changed files with 10725 additions and 9066 deletions
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_AMS-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_AMS-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Caligraphic-Bold.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Caligraphic-Bold.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Caligraphic-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Caligraphic-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Fraktur-Bold.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Fraktur-Bold.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Fraktur-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Fraktur-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-Bold.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-Bold.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-BoldItalic.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-BoldItalic.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-Italic.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-Italic.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Main-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Math-BoldItalic.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Math-BoldItalic.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Math-Italic.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Math-Italic.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_SansSerif-Bold.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_SansSerif-Bold.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_SansSerif-Italic.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_SansSerif-Italic.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_SansSerif-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_SansSerif-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Script-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Script-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size1-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size1-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size2-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size2-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size3-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size3-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size4-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Size4-Regular.woff
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Typewriter-Regular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/fonts/katex/KaTeX_Typewriter-Regular.woff
|
|
@ -1,446 +0,0 @@
|
||||||
/**
|
|
||||||
* The reveal.js markdown plugin. Handles parsing of
|
|
||||||
* markdown inside of presentations as well as loading
|
|
||||||
* of external markdown documents.
|
|
||||||
*/
|
|
||||||
(function( root, factory ) {
|
|
||||||
if (typeof define === 'function' && define.amd) {
|
|
||||||
root.marked = require( './marked' );
|
|
||||||
root.RevealMarkdown = factory( root.marked );
|
|
||||||
} else if( typeof exports === 'object' ) {
|
|
||||||
module.exports = factory( require( './marked' ) );
|
|
||||||
} else {
|
|
||||||
// Browser globals (root is window)
|
|
||||||
root.RevealMarkdown = factory( root.marked );
|
|
||||||
}
|
|
||||||
}( this, function( marked ) {
|
|
||||||
|
|
||||||
var DEFAULT_SLIDE_SEPARATOR = '^\r?\n---\r?\n$',
|
|
||||||
DEFAULT_NOTES_SEPARATOR = 'notes?:',
|
|
||||||
DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
|
|
||||||
DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
|
|
||||||
|
|
||||||
var SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the markdown contents of a slide section
|
|
||||||
* element. Normalizes leading tabs/whitespace.
|
|
||||||
*/
|
|
||||||
function getMarkdownFromSlide( section ) {
|
|
||||||
|
|
||||||
// look for a <script> or <textarea data-template> wrapper
|
|
||||||
var template = section.querySelector( '[data-template]' ) || section.querySelector( 'script' );
|
|
||||||
|
|
||||||
// strip leading whitespace so it isn't evaluated as code
|
|
||||||
var text = ( template || section ).textContent;
|
|
||||||
|
|
||||||
// restore script end tags
|
|
||||||
text = text.replace( new RegExp( SCRIPT_END_PLACEHOLDER, 'g' ), '</script>' );
|
|
||||||
|
|
||||||
var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
|
|
||||||
leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
|
|
||||||
|
|
||||||
if( leadingTabs > 0 ) {
|
|
||||||
text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
|
|
||||||
}
|
|
||||||
else if( leadingWs > 1 ) {
|
|
||||||
text = text.replace( new RegExp('\\n? {' + leadingWs + '}', 'g'), '\n' );
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a markdown slide section element, this will
|
|
||||||
* return all arguments that aren't related to markdown
|
|
||||||
* parsing. Used to forward any other user-defined arguments
|
|
||||||
* to the output markdown slide.
|
|
||||||
*/
|
|
||||||
function getForwardedAttributes( section ) {
|
|
||||||
|
|
||||||
var attributes = section.attributes;
|
|
||||||
var result = [];
|
|
||||||
|
|
||||||
for( var i = 0, len = attributes.length; i < len; i++ ) {
|
|
||||||
var name = attributes[i].name,
|
|
||||||
value = attributes[i].value;
|
|
||||||
|
|
||||||
// disregard attributes that are used for markdown loading/parsing
|
|
||||||
if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
|
|
||||||
|
|
||||||
if( value ) {
|
|
||||||
result.push( name + '="' + value + '"' );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result.push( name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.join( ' ' );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inspects the given options and fills out default
|
|
||||||
* values for what's not defined.
|
|
||||||
*/
|
|
||||||
function getSlidifyOptions( options ) {
|
|
||||||
|
|
||||||
options = options || {};
|
|
||||||
options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
|
|
||||||
options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
|
|
||||||
options.attributes = options.attributes || '';
|
|
||||||
|
|
||||||
return options;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper function for constructing a markdown slide.
|
|
||||||
*/
|
|
||||||
function createMarkdownSlide( content, options ) {
|
|
||||||
|
|
||||||
options = getSlidifyOptions( options );
|
|
||||||
|
|
||||||
var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
|
|
||||||
|
|
||||||
if( notesMatch.length === 2 ) {
|
|
||||||
content = notesMatch[0] + '<aside class="notes">' + marked(notesMatch[1].trim()) + '</aside>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// prevent script end tags in the content from interfering
|
|
||||||
// with parsing
|
|
||||||
content = content.replace( /<\/script>/g, SCRIPT_END_PLACEHOLDER );
|
|
||||||
|
|
||||||
return '<script type="text/template">' + content + '</script>';
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a data string into multiple slides based
|
|
||||||
* on the passed in separator arguments.
|
|
||||||
*/
|
|
||||||
function slidify( markdown, options ) {
|
|
||||||
|
|
||||||
options = getSlidifyOptions( options );
|
|
||||||
|
|
||||||
var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
|
|
||||||
horizontalSeparatorRegex = new RegExp( options.separator );
|
|
||||||
|
|
||||||
var matches,
|
|
||||||
lastIndex = 0,
|
|
||||||
isHorizontal,
|
|
||||||
wasHorizontal = true,
|
|
||||||
content,
|
|
||||||
sectionStack = [];
|
|
||||||
|
|
||||||
// iterate until all blocks between separators are stacked up
|
|
||||||
while( matches = separatorRegex.exec( markdown ) ) {
|
|
||||||
notes = null;
|
|
||||||
|
|
||||||
// determine direction (horizontal by default)
|
|
||||||
isHorizontal = horizontalSeparatorRegex.test( matches[0] );
|
|
||||||
|
|
||||||
if( !isHorizontal && wasHorizontal ) {
|
|
||||||
// create vertical stack
|
|
||||||
sectionStack.push( [] );
|
|
||||||
}
|
|
||||||
|
|
||||||
// pluck slide content from markdown input
|
|
||||||
content = markdown.substring( lastIndex, matches.index );
|
|
||||||
|
|
||||||
if( isHorizontal && wasHorizontal ) {
|
|
||||||
// add to horizontal stack
|
|
||||||
sectionStack.push( content );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// add to vertical stack
|
|
||||||
sectionStack[sectionStack.length-1].push( content );
|
|
||||||
}
|
|
||||||
|
|
||||||
lastIndex = separatorRegex.lastIndex;
|
|
||||||
wasHorizontal = isHorizontal;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add the remaining slide
|
|
||||||
( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
|
|
||||||
|
|
||||||
var markdownSections = '';
|
|
||||||
|
|
||||||
// flatten the hierarchical stack, and insert <section data-markdown> tags
|
|
||||||
for( var i = 0, len = sectionStack.length; i < len; i++ ) {
|
|
||||||
// vertical
|
|
||||||
if( sectionStack[i] instanceof Array ) {
|
|
||||||
markdownSections += '<section '+ options.attributes +'>';
|
|
||||||
|
|
||||||
sectionStack[i].forEach( function( child ) {
|
|
||||||
markdownSections += '<section data-markdown>' + createMarkdownSlide( child, options ) + '</section>';
|
|
||||||
} );
|
|
||||||
|
|
||||||
markdownSections += '</section>';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return markdownSections;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses any current data-markdown slides, splits
|
|
||||||
* multi-slide markdown into separate sections and
|
|
||||||
* handles loading of external markdown.
|
|
||||||
*/
|
|
||||||
function processSlides() {
|
|
||||||
|
|
||||||
return new Promise( function( resolve ) {
|
|
||||||
|
|
||||||
var externalPromises = [];
|
|
||||||
|
|
||||||
[].slice.call( document.querySelectorAll( '[data-markdown]') ).forEach( function( section, i ) {
|
|
||||||
|
|
||||||
if( section.getAttribute( 'data-markdown' ).length ) {
|
|
||||||
|
|
||||||
externalPromises.push( loadExternalMarkdown( section ).then(
|
|
||||||
|
|
||||||
// Finished loading external file
|
|
||||||
function( xhr, url ) {
|
|
||||||
section.outerHTML = slidify( xhr.responseText, {
|
|
||||||
separator: section.getAttribute( 'data-separator' ),
|
|
||||||
verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
|
|
||||||
notesSeparator: section.getAttribute( 'data-separator-notes' ),
|
|
||||||
attributes: getForwardedAttributes( section )
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// Failed to load markdown
|
|
||||||
function( xhr, url ) {
|
|
||||||
section.outerHTML = '<section data-state="alert">' +
|
|
||||||
'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
|
|
||||||
'Check your browser\'s JavaScript console for more details.' +
|
|
||||||
'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
|
|
||||||
'</section>';
|
|
||||||
}
|
|
||||||
|
|
||||||
) );
|
|
||||||
|
|
||||||
}
|
|
||||||
else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-separator-vertical' ) || section.getAttribute( 'data-separator-notes' ) ) {
|
|
||||||
|
|
||||||
section.outerHTML = slidify( getMarkdownFromSlide( section ), {
|
|
||||||
separator: section.getAttribute( 'data-separator' ),
|
|
||||||
verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
|
|
||||||
notesSeparator: section.getAttribute( 'data-separator-notes' ),
|
|
||||||
attributes: getForwardedAttributes( section )
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.all( externalPromises ).then( resolve );
|
|
||||||
|
|
||||||
} );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadExternalMarkdown( section ) {
|
|
||||||
|
|
||||||
return new Promise( function( resolve, reject ) {
|
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest(),
|
|
||||||
url = section.getAttribute( 'data-markdown' );
|
|
||||||
|
|
||||||
datacharset = section.getAttribute( 'data-charset' );
|
|
||||||
|
|
||||||
// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
|
|
||||||
if( datacharset != null && datacharset != '' ) {
|
|
||||||
xhr.overrideMimeType( 'text/html; charset=' + datacharset );
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function( section, xhr ) {
|
|
||||||
if( xhr.readyState === 4 ) {
|
|
||||||
// file protocol yields status code 0 (useful for local debug, mobile applications etc.)
|
|
||||||
if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) {
|
|
||||||
|
|
||||||
resolve( xhr, url );
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
reject( xhr, url );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.bind( this, section, xhr );
|
|
||||||
|
|
||||||
xhr.open( 'GET', url, true );
|
|
||||||
|
|
||||||
try {
|
|
||||||
xhr.send();
|
|
||||||
}
|
|
||||||
catch ( e ) {
|
|
||||||
alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
|
|
||||||
resolve( xhr, url );
|
|
||||||
}
|
|
||||||
|
|
||||||
} );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a node value has the attributes pattern.
|
|
||||||
* If yes, extract it and add that value as one or several attributes
|
|
||||||
* to the target element.
|
|
||||||
*
|
|
||||||
* You need Cache Killer on Chrome to see the effect on any FOM transformation
|
|
||||||
* directly on refresh (F5)
|
|
||||||
* http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
|
|
||||||
*/
|
|
||||||
function addAttributeInElement( node, elementTarget, separator ) {
|
|
||||||
|
|
||||||
var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
|
|
||||||
var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
|
|
||||||
var nodeValue = node.nodeValue;
|
|
||||||
if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
|
|
||||||
|
|
||||||
var classes = matches[1];
|
|
||||||
nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
|
|
||||||
node.nodeValue = nodeValue;
|
|
||||||
while( matchesClass = mardownClassRegex.exec( classes ) ) {
|
|
||||||
elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add attributes to the parent element of a text node,
|
|
||||||
* or the element of an attribute node.
|
|
||||||
*/
|
|
||||||
function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
|
|
||||||
|
|
||||||
if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
|
|
||||||
previousParentElement = element;
|
|
||||||
for( var i = 0; i < element.childNodes.length; i++ ) {
|
|
||||||
childElement = element.childNodes[i];
|
|
||||||
if ( i > 0 ) {
|
|
||||||
j = i - 1;
|
|
||||||
while ( j >= 0 ) {
|
|
||||||
aPreviousChildElement = element.childNodes[j];
|
|
||||||
if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
|
|
||||||
previousParentElement = aPreviousChildElement;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
j = j - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parentSection = section;
|
|
||||||
if( childElement.nodeName == "section" ) {
|
|
||||||
parentSection = childElement ;
|
|
||||||
previousParentElement = childElement ;
|
|
||||||
}
|
|
||||||
if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
|
|
||||||
addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( element.nodeType == Node.COMMENT_NODE ) {
|
|
||||||
if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
|
|
||||||
addAttributeInElement( element, section, separatorSectionAttributes );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts any current data-markdown slides in the
|
|
||||||
* DOM to HTML.
|
|
||||||
*/
|
|
||||||
function convertSlides() {
|
|
||||||
|
|
||||||
var sections = document.querySelectorAll( '[data-markdown]:not([data-markdown-parsed])');
|
|
||||||
|
|
||||||
[].slice.call( sections ).forEach( function( section ) {
|
|
||||||
|
|
||||||
section.setAttribute( 'data-markdown-parsed', true )
|
|
||||||
|
|
||||||
var notes = section.querySelector( 'aside.notes' );
|
|
||||||
var markdown = getMarkdownFromSlide( section );
|
|
||||||
|
|
||||||
section.innerHTML = marked( markdown );
|
|
||||||
addAttributes( section, section, null, section.getAttribute( 'data-element-attributes' ) ||
|
|
||||||
section.parentNode.getAttribute( 'data-element-attributes' ) ||
|
|
||||||
DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
|
|
||||||
section.getAttribute( 'data-attributes' ) ||
|
|
||||||
section.parentNode.getAttribute( 'data-attributes' ) ||
|
|
||||||
DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
|
|
||||||
|
|
||||||
// If there were notes, we need to re-add them after
|
|
||||||
// having overwritten the section's HTML
|
|
||||||
if( notes ) {
|
|
||||||
section.appendChild( notes );
|
|
||||||
}
|
|
||||||
|
|
||||||
} );
|
|
||||||
|
|
||||||
return Promise.resolve();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// API
|
|
||||||
var RevealMarkdown = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts processing and converting Markdown within the
|
|
||||||
* current reveal.js deck.
|
|
||||||
*
|
|
||||||
* @param {function} callback function to invoke once
|
|
||||||
* we've finished loading and parsing Markdown
|
|
||||||
*/
|
|
||||||
init: function( callback ) {
|
|
||||||
|
|
||||||
if( typeof marked === 'undefined' ) {
|
|
||||||
throw 'The reveal.js Markdown plugin requires marked to be loaded';
|
|
||||||
}
|
|
||||||
|
|
||||||
if( typeof hljs !== 'undefined' ) {
|
|
||||||
marked.setOptions({
|
|
||||||
highlight: function( code, lang ) {
|
|
||||||
return hljs.highlightAuto( code, [lang] ).value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// marked can be configured via reveal.js config options
|
|
||||||
var options = Reveal.getConfig().markdown;
|
|
||||||
if( options ) {
|
|
||||||
marked.setOptions( options );
|
|
||||||
}
|
|
||||||
|
|
||||||
return processSlides().then( convertSlides );
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
// TODO: Do these belong in the API?
|
|
||||||
processSlides: processSlides,
|
|
||||||
convertSlides: convertSlides,
|
|
||||||
slidify: slidify
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// Register our plugin so that reveal.js will call our
|
|
||||||
// plugin 'init' method as part of the initialization
|
|
||||||
Reveal.registerPlugin( 'markdown', RevealMarkdown );
|
|
||||||
|
|
||||||
return RevealMarkdown;
|
|
||||||
|
|
||||||
}));
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/reveal-plugins/markdown/markdown.js
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/reveal-plugins/markdown/marked.js
|
|
@ -1,178 +0,0 @@
|
||||||
/**
|
|
||||||
* Handles opening of and synchronization with the reveal.js
|
|
||||||
* notes window.
|
|
||||||
*
|
|
||||||
* Handshake process:
|
|
||||||
* 1. This window posts 'connect' to notes window
|
|
||||||
* - Includes URL of presentation to show
|
|
||||||
* 2. Notes window responds with 'connected' when it is available
|
|
||||||
* 3. This window proceeds to send the current presentation state
|
|
||||||
* to the notes window
|
|
||||||
*/
|
|
||||||
var RevealNotes = (function() {
|
|
||||||
|
|
||||||
var notesPopup = null;
|
|
||||||
|
|
||||||
function openNotes( notesFilePath ) {
|
|
||||||
|
|
||||||
if (notesPopup && !notesPopup.closed) {
|
|
||||||
notesPopup.focus();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !notesFilePath ) {
|
|
||||||
var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path
|
|
||||||
jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path
|
|
||||||
notesFilePath = jsFileLocation + 'notes.html';
|
|
||||||
}
|
|
||||||
|
|
||||||
notesPopup = window.open( notesFilePath, 'reveal.js - Notes', 'width=1100,height=700' );
|
|
||||||
|
|
||||||
if( !notesPopup ) {
|
|
||||||
alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect to the notes window through a postmessage handshake.
|
|
||||||
* Using postmessage enables us to work in situations where the
|
|
||||||
* origins differ, such as a presentation being opened from the
|
|
||||||
* file system.
|
|
||||||
*/
|
|
||||||
function connect() {
|
|
||||||
// Keep trying to connect until we get a 'connected' message back
|
|
||||||
var connectInterval = setInterval( function() {
|
|
||||||
notesPopup.postMessage( JSON.stringify( {
|
|
||||||
namespace: 'reveal-notes',
|
|
||||||
type: 'connect',
|
|
||||||
url: window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search,
|
|
||||||
state: Reveal.getState()
|
|
||||||
} ), '*' );
|
|
||||||
}, 500 );
|
|
||||||
|
|
||||||
window.addEventListener( 'message', function( event ) {
|
|
||||||
var data = JSON.parse( event.data );
|
|
||||||
if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) {
|
|
||||||
clearInterval( connectInterval );
|
|
||||||
onConnected();
|
|
||||||
}
|
|
||||||
if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) {
|
|
||||||
callRevealApi( data.methodName, data.arguments, data.callId );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calls the specified Reveal.js method with the provided argument
|
|
||||||
* and then pushes the result to the notes frame.
|
|
||||||
*/
|
|
||||||
function callRevealApi( methodName, methodArguments, callId ) {
|
|
||||||
|
|
||||||
var result = Reveal[methodName].apply( Reveal, methodArguments );
|
|
||||||
notesPopup.postMessage( JSON.stringify( {
|
|
||||||
namespace: 'reveal-notes',
|
|
||||||
type: 'return',
|
|
||||||
result: result,
|
|
||||||
callId: callId
|
|
||||||
} ), '*' );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Posts the current slide data to the notes window
|
|
||||||
*/
|
|
||||||
function post( event ) {
|
|
||||||
|
|
||||||
var slideElement = Reveal.getCurrentSlide(),
|
|
||||||
notesElement = slideElement.querySelector( 'aside.notes' ),
|
|
||||||
fragmentElement = slideElement.querySelector( '.current-fragment' );
|
|
||||||
|
|
||||||
var messageData = {
|
|
||||||
namespace: 'reveal-notes',
|
|
||||||
type: 'state',
|
|
||||||
notes: '',
|
|
||||||
markdown: false,
|
|
||||||
whitespace: 'normal',
|
|
||||||
state: Reveal.getState()
|
|
||||||
};
|
|
||||||
|
|
||||||
// Look for notes defined in a slide attribute
|
|
||||||
if( slideElement.hasAttribute( 'data-notes' ) ) {
|
|
||||||
messageData.notes = slideElement.getAttribute( 'data-notes' );
|
|
||||||
messageData.whitespace = 'pre-wrap';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for notes defined in a fragment
|
|
||||||
if( fragmentElement ) {
|
|
||||||
var fragmentNotes = fragmentElement.querySelector( 'aside.notes' );
|
|
||||||
if( fragmentNotes ) {
|
|
||||||
notesElement = fragmentNotes;
|
|
||||||
}
|
|
||||||
else if( fragmentElement.hasAttribute( 'data-notes' ) ) {
|
|
||||||
messageData.notes = fragmentElement.getAttribute( 'data-notes' );
|
|
||||||
messageData.whitespace = 'pre-wrap';
|
|
||||||
|
|
||||||
// In case there are slide notes
|
|
||||||
notesElement = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for notes defined in an aside element
|
|
||||||
if( notesElement ) {
|
|
||||||
messageData.notes = notesElement.innerHTML;
|
|
||||||
messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
|
|
||||||
}
|
|
||||||
|
|
||||||
notesPopup.postMessage( JSON.stringify( messageData ), '*' );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called once we have established a connection to the notes
|
|
||||||
* window.
|
|
||||||
*/
|
|
||||||
function onConnected() {
|
|
||||||
|
|
||||||
// Monitor events that trigger a change in state
|
|
||||||
Reveal.addEventListener( 'slidechanged', post );
|
|
||||||
Reveal.addEventListener( 'fragmentshown', post );
|
|
||||||
Reveal.addEventListener( 'fragmenthidden', post );
|
|
||||||
Reveal.addEventListener( 'overviewhidden', post );
|
|
||||||
Reveal.addEventListener( 'overviewshown', post );
|
|
||||||
Reveal.addEventListener( 'paused', post );
|
|
||||||
Reveal.addEventListener( 'resumed', post );
|
|
||||||
|
|
||||||
// Post the initial state
|
|
||||||
post();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
connect();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
init: function() {
|
|
||||||
|
|
||||||
if( !/receiver/i.test( window.location.search ) ) {
|
|
||||||
|
|
||||||
// If the there's a 'notes' query set, open directly
|
|
||||||
if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
|
|
||||||
openNotes();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open the notes when the 's' key is hit
|
|
||||||
Reveal.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() {
|
|
||||||
openNotes();
|
|
||||||
} );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
open: openNotes
|
|
||||||
};
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|
||||||
Reveal.registerPlugin( 'notes', RevealNotes );
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/reveal-plugins/notes/notes.js
|
|
@ -1,277 +0,0 @@
|
||||||
// Custom reveal.js integration
|
|
||||||
var RevealZoom = (function(){
|
|
||||||
|
|
||||||
return {
|
|
||||||
init: function() {
|
|
||||||
|
|
||||||
Reveal.getRevealElement().addEventListener( 'mousedown', function( event ) {
|
|
||||||
var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt';
|
|
||||||
|
|
||||||
var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : defaultModifier ) + 'Key';
|
|
||||||
var zoomLevel = ( Reveal.getConfig().zoomLevel ? Reveal.getConfig().zoomLevel : 2 );
|
|
||||||
|
|
||||||
if( event[ modifier ] && !Reveal.isOverview() ) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
zoom.to({
|
|
||||||
x: event.clientX,
|
|
||||||
y: event.clientY,
|
|
||||||
scale: zoomLevel,
|
|
||||||
pan: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|
||||||
Reveal.registerPlugin( 'zoom', RevealZoom );
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* zoom.js 0.3 (modified for use with reveal.js)
|
|
||||||
* http://lab.hakim.se/zoom-js
|
|
||||||
* MIT licensed
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se
|
|
||||||
*/
|
|
||||||
var zoom = (function(){
|
|
||||||
|
|
||||||
// The current zoom level (scale)
|
|
||||||
var level = 1;
|
|
||||||
|
|
||||||
// The current mouse position, used for panning
|
|
||||||
var mouseX = 0,
|
|
||||||
mouseY = 0;
|
|
||||||
|
|
||||||
// Timeout before pan is activated
|
|
||||||
var panEngageTimeout = -1,
|
|
||||||
panUpdateInterval = -1;
|
|
||||||
|
|
||||||
// Check for transform support so that we can fallback otherwise
|
|
||||||
var supportsTransforms = 'WebkitTransform' in document.body.style ||
|
|
||||||
'MozTransform' in document.body.style ||
|
|
||||||
'msTransform' in document.body.style ||
|
|
||||||
'OTransform' in document.body.style ||
|
|
||||||
'transform' in document.body.style;
|
|
||||||
|
|
||||||
if( supportsTransforms ) {
|
|
||||||
// The easing that will be applied when we zoom in/out
|
|
||||||
document.body.style.transition = 'transform 0.8s ease';
|
|
||||||
document.body.style.OTransition = '-o-transform 0.8s ease';
|
|
||||||
document.body.style.msTransition = '-ms-transform 0.8s ease';
|
|
||||||
document.body.style.MozTransition = '-moz-transform 0.8s ease';
|
|
||||||
document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zoom out if the user hits escape
|
|
||||||
document.addEventListener( 'keyup', function( event ) {
|
|
||||||
if( level !== 1 && event.keyCode === 27 ) {
|
|
||||||
zoom.out();
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
// Monitor mouse movement for panning
|
|
||||||
document.addEventListener( 'mousemove', function( event ) {
|
|
||||||
if( level !== 1 ) {
|
|
||||||
mouseX = event.clientX;
|
|
||||||
mouseY = event.clientY;
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the CSS required to zoom in, prefers the use of CSS3
|
|
||||||
* transforms but falls back on zoom for IE.
|
|
||||||
*
|
|
||||||
* @param {Object} rect
|
|
||||||
* @param {Number} scale
|
|
||||||
*/
|
|
||||||
function magnify( rect, scale ) {
|
|
||||||
|
|
||||||
var scrollOffset = getScrollOffset();
|
|
||||||
|
|
||||||
// Ensure a width/height is set
|
|
||||||
rect.width = rect.width || 1;
|
|
||||||
rect.height = rect.height || 1;
|
|
||||||
|
|
||||||
// Center the rect within the zoomed viewport
|
|
||||||
rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2;
|
|
||||||
rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2;
|
|
||||||
|
|
||||||
if( supportsTransforms ) {
|
|
||||||
// Reset
|
|
||||||
if( scale === 1 ) {
|
|
||||||
document.body.style.transform = '';
|
|
||||||
document.body.style.OTransform = '';
|
|
||||||
document.body.style.msTransform = '';
|
|
||||||
document.body.style.MozTransform = '';
|
|
||||||
document.body.style.WebkitTransform = '';
|
|
||||||
}
|
|
||||||
// Scale
|
|
||||||
else {
|
|
||||||
var origin = scrollOffset.x +'px '+ scrollOffset.y +'px',
|
|
||||||
transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')';
|
|
||||||
|
|
||||||
document.body.style.transformOrigin = origin;
|
|
||||||
document.body.style.OTransformOrigin = origin;
|
|
||||||
document.body.style.msTransformOrigin = origin;
|
|
||||||
document.body.style.MozTransformOrigin = origin;
|
|
||||||
document.body.style.WebkitTransformOrigin = origin;
|
|
||||||
|
|
||||||
document.body.style.transform = transform;
|
|
||||||
document.body.style.OTransform = transform;
|
|
||||||
document.body.style.msTransform = transform;
|
|
||||||
document.body.style.MozTransform = transform;
|
|
||||||
document.body.style.WebkitTransform = transform;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Reset
|
|
||||||
if( scale === 1 ) {
|
|
||||||
document.body.style.position = '';
|
|
||||||
document.body.style.left = '';
|
|
||||||
document.body.style.top = '';
|
|
||||||
document.body.style.width = '';
|
|
||||||
document.body.style.height = '';
|
|
||||||
document.body.style.zoom = '';
|
|
||||||
}
|
|
||||||
// Scale
|
|
||||||
else {
|
|
||||||
document.body.style.position = 'relative';
|
|
||||||
document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px';
|
|
||||||
document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px';
|
|
||||||
document.body.style.width = ( scale * 100 ) + '%';
|
|
||||||
document.body.style.height = ( scale * 100 ) + '%';
|
|
||||||
document.body.style.zoom = scale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
level = scale;
|
|
||||||
|
|
||||||
if( document.documentElement.classList ) {
|
|
||||||
if( level !== 1 ) {
|
|
||||||
document.documentElement.classList.add( 'zoomed' );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
document.documentElement.classList.remove( 'zoomed' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pan the document when the mosue cursor approaches the edges
|
|
||||||
* of the window.
|
|
||||||
*/
|
|
||||||
function pan() {
|
|
||||||
var range = 0.12,
|
|
||||||
rangeX = window.innerWidth * range,
|
|
||||||
rangeY = window.innerHeight * range,
|
|
||||||
scrollOffset = getScrollOffset();
|
|
||||||
|
|
||||||
// Up
|
|
||||||
if( mouseY < rangeY ) {
|
|
||||||
window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
|
|
||||||
}
|
|
||||||
// Down
|
|
||||||
else if( mouseY > window.innerHeight - rangeY ) {
|
|
||||||
window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Left
|
|
||||||
if( mouseX < rangeX ) {
|
|
||||||
window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
|
|
||||||
}
|
|
||||||
// Right
|
|
||||||
else if( mouseX > window.innerWidth - rangeX ) {
|
|
||||||
window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getScrollOffset() {
|
|
||||||
return {
|
|
||||||
x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
|
|
||||||
y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
/**
|
|
||||||
* Zooms in on either a rectangle or HTML element.
|
|
||||||
*
|
|
||||||
* @param {Object} options
|
|
||||||
* - element: HTML element to zoom in on
|
|
||||||
* OR
|
|
||||||
* - x/y: coordinates in non-transformed space to zoom in on
|
|
||||||
* - width/height: the portion of the screen to zoom in on
|
|
||||||
* - scale: can be used instead of width/height to explicitly set scale
|
|
||||||
*/
|
|
||||||
to: function( options ) {
|
|
||||||
|
|
||||||
// Due to an implementation limitation we can't zoom in
|
|
||||||
// to another element without zooming out first
|
|
||||||
if( level !== 1 ) {
|
|
||||||
zoom.out();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
options.x = options.x || 0;
|
|
||||||
options.y = options.y || 0;
|
|
||||||
|
|
||||||
// If an element is set, that takes precedence
|
|
||||||
if( !!options.element ) {
|
|
||||||
// Space around the zoomed in element to leave on screen
|
|
||||||
var padding = 20;
|
|
||||||
var bounds = options.element.getBoundingClientRect();
|
|
||||||
|
|
||||||
options.x = bounds.left - padding;
|
|
||||||
options.y = bounds.top - padding;
|
|
||||||
options.width = bounds.width + ( padding * 2 );
|
|
||||||
options.height = bounds.height + ( padding * 2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// If width/height values are set, calculate scale from those values
|
|
||||||
if( options.width !== undefined && options.height !== undefined ) {
|
|
||||||
options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( options.scale > 1 ) {
|
|
||||||
options.x *= options.scale;
|
|
||||||
options.y *= options.scale;
|
|
||||||
|
|
||||||
magnify( options, options.scale );
|
|
||||||
|
|
||||||
if( options.pan !== false ) {
|
|
||||||
|
|
||||||
// Wait with engaging panning as it may conflict with the
|
|
||||||
// zoom transition
|
|
||||||
panEngageTimeout = setTimeout( function() {
|
|
||||||
panUpdateInterval = setInterval( pan, 1000 / 60 );
|
|
||||||
}, 800 );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the document zoom state to its default.
|
|
||||||
*/
|
|
||||||
out: function() {
|
|
||||||
clearTimeout( panEngageTimeout );
|
|
||||||
clearInterval( panUpdateInterval );
|
|
||||||
|
|
||||||
magnify( { x: 0, y: 0 }, 1 );
|
|
||||||
|
|
||||||
level = 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Alias
|
|
||||||
magnify: function( options ) { this.to( options ) },
|
|
||||||
reset: function() { this.out() },
|
|
||||||
|
|
||||||
zoomLevel: function() {
|
|
||||||
return level;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../devconf.in-open_its_worth_it/lib/reveal-plugins/zoom/zoom.js
|
BIN
2019/08/devconf.in-container_runtimes/container-runtimes-27.pdf
Normal file
BIN
2019/08/devconf.in-container_runtimes/container-runtimes-27.pdf
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
../../../../2018/09/asg-container_runtimes/container-runtimes/0c750f65e1f4c6b7362abbc9c5963392.png
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../2016/05-Container_past_present_future-coreosfest-de/containers-past-present-and-future/339e84e5deca8af62480a1dc3fb7af96.gif
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../2016/09-Common_container_standards_past_presnt_and_future-ContainerCon.eu/containers-past-present-and-future-3-6-7/41bdbfee7c1333d20604b26b7ed5087c.gif
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../2016/05-Container_past_present_future-coreosfest-de/containers-past-present-and-future/5e1a7c37f8b075137176a16db5edc490.svg
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../2016/05-Container_past_present_future-coreosfest-de/containers-past-present-and-future/60672f0849c5b758b11dc0905dc42c02.svg
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../2017/03-state_of_container_ecosystem_oci_pov/containers-standards-on-the-horizon-12/798496c4607c11d48ebc0056daad3a57.png
|
2453
2019/08/devconf.in-container_runtimes/index.html
Normal file
2453
2019/08/devconf.in-container_runtimes/index.html
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../2016/05-Container_past_present_future-coreosfest-de/lib/fonts/asul/asul-bold.ttf
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../2016/05-Container_past_present_future-coreosfest-de/lib/fonts/asul/asul-bold.woff
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../2016/05-Container_past_present_future-coreosfest-de/lib/fonts/asul/asul-regular.ttf
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../2016/05-Container_past_present_future-coreosfest-de/lib/fonts/asul/asul-regular.woff
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue