From 6d66d0d55074f502ba659fc440ed7fda702a0c69 Mon Sep 17 00:00:00 2001 From: Stefano Maffulli Date: Wed, 18 Jun 2014 12:10:04 -0700 Subject: [PATCH] First try at adding Upstream Training material Work in progress Implements Blueprint: merge-upstream-university-training Change-Id: I4d4c7f08d8c599178df2cbcf3969bc739ca6784c --- doc/upstream-training/01-release-cycle.rst | 124 ++++ doc/upstream-training/README | 18 + .../_assets/01-01-release.png | Bin 0 -> 55293 bytes doc/upstream-training/theme/base.html | 182 ++++++ doc/upstream-training/theme/css/print.css | 94 +++ doc/upstream-training/theme/css/screen.css | 563 +++++++++++++++++ doc/upstream-training/theme/js/slides.js | 580 ++++++++++++++++++ 7 files changed, 1561 insertions(+) create mode 100644 doc/upstream-training/01-release-cycle.rst create mode 100644 doc/upstream-training/README create mode 100644 doc/upstream-training/_assets/01-01-release.png create mode 100644 doc/upstream-training/theme/base.html create mode 100644 doc/upstream-training/theme/css/print.css create mode 100644 doc/upstream-training/theme/css/screen.css create mode 100644 doc/upstream-training/theme/js/slides.js diff --git a/doc/upstream-training/01-release-cycle.rst b/doc/upstream-training/01-release-cycle.rst new file mode 100644 index 00000000..382c5fcd --- /dev/null +++ b/doc/upstream-training/01-release-cycle.rst @@ -0,0 +1,124 @@ +OpenStack Release Cycle +======================= + +OpenStack Upstream Training +--------------------------- + + + + +---- + +Planning : Design +================= + +- Planning stage is at the start of a cycle +- take a step back +- focus on what we want to do for the next one + +.. image:: ./_assets/01-01-release.png + +---- + +Planning : Discuss +================== + +- With our peers +- feedback and comments +- create the corresponding blueprint +- 4 weeks, Design Summit on the third week + +.. image:: ./_assets/01-01-release.png + +---- + +Planning : Target +================= + +- file new blueprints +- set a target milestone +- when in the cycle they intend to complete it +- PTLs triage the submitted blueprints and sets Priority + +.. image:: ./_assets/01-01-release.png + +---- + +Implementation : Milestone +========================== + +- pushed to our Gerrit review +- weeks before the milestone publication date. +- milestone-proposed branch +- feature-frozen + +.. image:: ./_assets/01-01-release.png + +---- + +Implementation : freezes +======================== + +- Feature proposal freeze +- String freeze +- Feature freeze + +.. image:: ./_assets/01-01-release.png + + +---- + +Release Candidates +================== + +- After the last milestone +- file bugs about everything you find +- prioritize bugs / bug triage +- write documentation +- fix as many bugs as you can + +.. image:: ./_assets/01-01-release.png + +---- + +Release candidate 1 +=================== + +- Between the last milestone and the RC1 +- stop adding features and concentrate on bugfixes +- Once all the release-critical bugs are fixed, we produce the first - - - release candidate for that project (RC1) +- used as-is as the final release + +.. image:: ./_assets/01-01-release.png + +---- + +Other release candidates +======================== + +- regressions and integration issues +- new release-critical bugs +- (RC2), with bugs targeted to it +- merged in the master branch first +- repeated as many times as necessary + +.. image:: ./_assets/01-01-release.png + +---- + +Release day +=========== + +- last published Release Candidate +- published collectively as the OpenStack release + +.. image:: ./_assets/01-01-release.png + +---- + +Exercise +======== + + +Based on the Icehouse release schedule find the URL of a document or a patch that belongs to each of the steps. + diff --git a/doc/upstream-training/README b/doc/upstream-training/README new file mode 100644 index 00000000..26f7daf0 --- /dev/null +++ b/doc/upstream-training/README @@ -0,0 +1,18 @@ +Slides for Upstream Training +============================ + +The files are based on teaching material provided originally by Loic Dachary as ODP files. Converted to RST text in order to be converted by landslide in convenient html5 slides. + +Documentation for landslide on https://github.com/adamzap/landslide + +Install landslide +----------------- + +Install the latest stable version of Landslide with a python package manager like pip: + + $ pip install landslide + +To build the presentations +-------------------------- + + $ landslide diff --git a/doc/upstream-training/_assets/01-01-release.png b/doc/upstream-training/_assets/01-01-release.png new file mode 100644 index 0000000000000000000000000000000000000000..7dfc054cdac9fff7759121398110a739b03c6019 GIT binary patch literal 55293 zcmbTd1yo#J8l`=a00|o0-GT;p2oM~CL+}K5cMl;D+&#FvySuwnSa5eO?5}*?J<~nY z{ZG%VRV<2Hbq}X*9og@G_6bt>B!T<}{|x{D$WoFYl>h*05ddJE5TGHiv>0OVLw>!s zmDF$m07Q&GKTtsOFI>or@QzY)V(_c5NUxcoE3H!zATQxLihXtzwXw1?vUUVS?Tx-V z8X1zhm^qq~N=V5msDDGj0RU1!>Z7oV>(bGRi}v�sI-weg>n$jc(OP!Ul5kH=i)E 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 + + + + + + {{ head_title }} + + {% if embed %} + + + {% else %} + + + {% endif %} + {% for css in user_css %} + {% if embed %} + + {% else %} + + {% endif %} + {% endfor %} + + + {% if embed %} + + {% else %} + + {% endif %} + {% for js in user_js %} + {% if embed %} + + {% else %} + + {% endif %} + {% endfor %} + + + +
+
+
+
+
+
+ {% for slide in slides %} + +
+
+
+ {% if slide.header %} +
{{ slide.header }}
+ {% endif %} + {% if slide.content %} +
{{ slide.content }}
+ {% endif %} +
+
+

Presenter Notes

+
+ {% if slide.presenter_notes %} + {{ slide.presenter_notes }} + {% endif %} +
+
+ +
+
+ {% endfor %} +
+
+ {% if toc %} + + {% endif %} + + + + diff --git a/doc/upstream-training/theme/css/print.css b/doc/upstream-training/theme/css/print.css new file mode 100644 index 00000000..41b5f8f7 --- /dev/null +++ b/doc/upstream-training/theme/css/print.css @@ -0,0 +1,94 @@ +* { + margin: 0; + padding: 0; +} + +@page { + size: landscape; +} + +body { + font: 100% "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; + padding: 0; + margin: 0; +} + +div.slide { + min-width: 800px; + min-height: 600px; + padding: 1em; + overflow: hidden; + page-break-after: always; + border: 1px solid black; + border-radius: 20px; +} + +div.slide div.inner { + width: 800px; + height: 600px; + margin: auto; + display: table-cell; +} + +h1 { + font-size: 2.4em; +} + +h2 { + font-size: 1.4em; +} + +h3 { + margin: 1em 0; +} + +ul { + margin: 0; + padding: 0; +} + +p, li, pre { + margin: 1em 0; +} + +li { + margin-left: 2em; +} + +a { + color: #000000; +} + +pre, code { + max-width: 800px; + background: #eee; + font-family: Monaco, monospace; + font-size: 90%; +} + +pre { + padding: .2em .5em; + overflow: hidden; + border-radius: .8em; +} + +code { + padding: 0 .2em; +} + +.slide header:only-child h1 { + line-height: 180%; + text-align: center; + display: table-cell; + vertical-align: middle; + height: 600px; + width: 800px; + font-size: 48px; + margin-top:100px; + margin-bottom:100px; +} + +#toc, #help, .slide aside, .slide footer, .slide .notes, +.presenter_notes, #current_presenter_notes, #presenter_note { + display: none; +} diff --git a/doc/upstream-training/theme/css/screen.css b/doc/upstream-training/theme/css/screen.css new file mode 100644 index 00000000..8b4024e7 --- /dev/null +++ b/doc/upstream-training/theme/css/screen.css @@ -0,0 +1,563 @@ +body { + font: 14px "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; + background: #778; + padding: 0; + margin: 0; + overflow: hidden; +} + +div.presentation { + position: absolute; + width: 100%; + display: table-cell; + vertical-align: middle; + height: 100%; + background: inherit; +} + +div.presentation > h1 { + display: none; +} + +div.slides, body.expose div.slides.nocontext { + width: 100%; + height: 100%; + left: 0; + top: 0; + position: absolute; + display: block; +} + +div.slides.nocontext { + width: 900px; + margin: 0 auto; + overflow: hidden; + position: relative; + left: auto; + top: auto; +} + +div.slide { + display: inline; + position: absolute; + overflow: hidden; + width: 900px; + height: 700px; + margin-top: -350px; + margin-left: -400px; + left: 50%; + top: 50%; + background: -webkit-gradient(linear, left bottom, left top, from(#bbd), to(#fff)); + background-color: #eee; + background: -moz-linear-gradient(bottom, #bbd, #fff); + -webkit-transition: margin 0.25s ease-in-out; + -moz-transition: margin 0.25s ease-in-out; + -o-transition: margin 0.25s ease-in-out; + border-top-left-radius: 20px; + -moz-border-radius-topleft: 20px; + -webkit-border-top-left-radius: 20px; + border-top-right-radius: 20px; + -moz-border-radius-topright: 20px; + -webkit-border-top-right-radius: 20px; + border-bottom-right-radius: 20px; + -moz-border-radius-bottomright: 20px; + -webkit-border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -moz-border-radius-bottomleft: 20px; + -webkit-border-bottom-left-radius: 20px; +} + +/* Expose */ + +body.expose div.slides { + float: left; + position: relative; + overflow: auto; + margin-bottom: 10px; +} + +body.expose div.slide { + display: block; + float: left; + position: relative; + left: auto !important; + top: auto !important; + margin: 10px !important; + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + -moz-transform: scale(.33, .33); + -moz-transform-origin: 0 0; + -webkit-transform: scale(.33, .33); + -webkit-transform-origin: 0 0; + -o-transform: scale(.33, .33); + -o-transform-origin: 0 0; + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + cursor: pointer; +} + +body.expose div.slide:hover { + background: -webkit-gradient(linear, left bottom, left top, from(#bdd), to(#fff)); + background-color: #eee; + background: -moz-linear-gradient(bottom, #bdd, #fff); +} + +body.expose .slide-wrapper { + float: left; + position: relative; + margin: .5%; + width: 300px; + height: 233px; +} + +body.expose .slide footer { +} + +body.expose .slide .inner { +} + +body.expose .slide.far-past, +body.expose .slide.past, +body.expose .slide.future, +body.expose .slide.far-future { + margin-left: 0; +} + +body.expose .slide.current { + background: -webkit-gradient(linear, left bottom, left top, from(#ddb), to(#fff)); + background-color: #eee; + background: -moz-linear-gradient(bottom, #ddb, #fff); + border: 16px solid #fff; + -moz-transform: scale(.315, .315); + -moz-transform-origin: 0 0; + -webkit-transform: scale(.315, .315); + -webkit-transform-origin: 0 0; + -o-transform: scale(.315, .315); + -o-transform-origin: 0 0; +} + +/* Presenter Mode */ + +body.presenter_view div.slide { + display: inline; + position: absolute; + overflow: hidden; + -moz-transform: scale(.5, .5); + -moz-transform-origin: 0 0; + -webkit-transform: scale(.5, .5); + -webkit-transform-origin: 0 0; + -o-transform: scale(.5, .5); + -o-transform-origin: 0 0; + margin-top: -300px; +} + +body.presenter_view .slide.far-past { + display: block; + margin-left: -1500px; +} + +body.presenter_view .slide.past { + display: block; + margin-left: -975px; +} + +body.presenter_view .slide.current { + display: block; + margin-left: -475px; + border: 8px solid maroon; + z-index: 2; +} + +body.presenter_view .slide.future { + display: block; + margin-left: 25px; + z-index: 1; +} + +body.presenter_view .slide.far-future { + display: block; + margin-left: 525px; +} + +body.presenter_view div#current_presenter_notes { + visibility: visible; + display: block; + position: absolute; + overflow: auto; + vertical-align: middle; + left: 50%; + top: 50%; + margin-left: -475px; + margin-top: 100px; + z-index: 2; + width: 950px; + border-style: solid; + height: 30%; + background-color: silver; +} + +body.presenter_view div#current_presenter_notes section { + font-family: "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; + color: black; + text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px; + display: block; + overflow: visible; + position: relative; + background-color: #fffeff; + height: 120px; + margin-right: 30px; + margin-top: 60px; + margin-left: 30px; + padding-right: 10px; + padding-left: 10px; + padding-top: 10px; +} + +body.presenter_view div#current_presenter_notes section p { + margin: 0; +} + +body.presenter_view div#current_presenter_notes h1 { + font-size: 50%; + display: block; +} + +div#current_presenter_notes { + display: none; +} + +div.slide div.presenter_notes, div.slides div.presenter_notes { + display: none; +} + +/* Slide styles */ + +div.slide p { + font-size: 20px; +} + +.slide.far-past { + display: block; + margin-left: -2400px; +} + +.slide.past { + display: block; + margin-left: -1400px; +} + +.slide.current { + display: block; + margin-left: -450px; +} + +.slide.future { + display: block; + margin-left: 500px; +} + +.slide.far-future { + display: block; + margin-left: 1500px; +} + +body.three-d div.slides { + -webkit-transform: translateX(50px) scale(0.8) rotateY(10deg); + -moz-transform: translateX(50px) scale(0.8) rotateY(10deg); + -o-transform: translateX(50px) scale(0.8) rotateY(10deg); +} + + +/* Content */ + +header:not(:only-child) { + font-family: "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; + font-weight: normal; + font-size: 50px; + letter-spacing: -.05em; + color: black; + text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px; + position: absolute; + left: 30px; + top: 25px; + margin: 0; + padding: 0; +} + +header h1, header h2, header h3, header h4, header h5, header h6 { + display: inline; + font-size: 100%; + font-weight: normal; + padding: 0; + margin: 0; +} + +header h2:first-child { + margin-top: 0; +} + +section, .slide header:only-child h1 { + font-family: "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; + color: #3f3f3f; + text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px; + margin-left: 30px; + margin-right: 30px; + margin-top: 100px; + display: block; + overflow: hidden; +} + +img { display: block; margin: auto; } + +section img.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +section img.align-right { + display: block; + margin-left: auto; + margin-right: 0; +} + +section img.align-left { + display: block; + margin-right: auto; + margin-left: 0; +} + +a { + color: inherit; + display: inline-block; + text-decoration: none; + line-height: 110%; + border-bottom: 2px solid #3f3f3f; +} + +pre, code, tt { + font-family: Monaco, Consolas, 'Bitstream Vera Sans Mono', 'Lucida Console', FreeMono, Courier, monospace; +} + +pre, .gist .gist-file .gist-data { + font-size: 18px; + max-height: 485px; + padding-top: 0.25em !important; + padding-right: 0.5em !important; + padding-left: 0.5em !important; + overflow: auto; +} + +/* render a nice scrollbar in overflowed pre area's */ +::-webkit-scrollbar { + height: 8px; + width: 8px; +} +::-webkit-scrollbar-thumb { + background: -webkit-gradient(linear, left bottom, left top, from(#777), to(#bbd)); + -webkit-border-radius: 1ex; +} +::-webkit-scrollbar-corner { + background: #dedede; +} + +blockquote { + border-left: solid 8px #778; + padding: .1ex 1ex; + font-style: italic; +} + +li { + padding: 10px 0; + font-size: 20px; +} + +li pre { margin-left: 0em; } + +.slide header:only-child h1 { + line-height: 180%; + text-align: center; + display: table-cell; + vertical-align: middle; + height: 700px; + width: 900px; + font-size: 50px; + margin-top:100px; + margin-bottom:100px; +} + +.sidebar { + clear: both; + background: -webkit-gradient(linear, top right, bottom right, from(#dde), to(#fff)); + -webkit-transition: margin 0.25s ease-in-out; + background-color: #eee; + background: -moz-linear-gradient(right, #dde, #fff); + border-right: 5px solid #ccd; + z-index: 9999999; + height: 100%; + overflow: hidden; + top: 0; + position: absolute; + display: block; + margin: 0; + margin-left: -400px; + padding: 10px 16px; + overflow: auto; + -webkit-transition: margin 0.2s ease-in-out; + -moz-transition: margin 0.2s ease-in-out; + -o-transition: margin 0.2s ease-in-out; +} + +.sidebar h2 { + text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px; + margin: 0 0 16px; + padding: 0; +} + +.sidebar table { + width: 100%; + margin: 0; + padding: 0; + border-collapse: collapse; +} + +.sidebar table caption { + display: none; +} + +.sidebar tr { + margin: 2px 0; + border-bottom: 1px solid #ccc; +} + +.sidebar th { + text-align: left; + font-weight: normal; + max-width: 300px; + overflow: hidden; +} + +.sidebar tr.sub th { + text-indent: 20px; +} + +.sidebar td { + text-align: right; + min-width: 20px; +} + +.sidebar a { + display: block; + text-decoration: none; + border-bottom: none; + padding: 4px 0; +} + +.sidebar tr.active { + background: #ff0; +} + +aside { + display: none; +} + aside.source { + position: absolute; + bottom: 6px; + left: 10px; + text-indent: 10px; + } + aside.page_number { + position: absolute; + bottom: 6px; + right: 10px; + text-indent: 10px; + } + +.notes { + display: none; + padding: 10px; + background: #ccc; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + div.slide p.notes { + font-size: 90%; +} + +/* Pygments default theme */ +.hll { background-color: #ffffcc } +.c { color: #408080; font-style: italic } /* Comment */ +.err { border: 1px solid #FF0000 } /* Error */ +.k { color: #008000; font-weight: bold } /* Keyword */ +.o { color: #666666 } /* Operator */ +.cm { color: #408080; font-style: italic } /* Comment.Multiline */ +.cp { color: #BC7A00 } /* Comment.Preproc */ +.c1 { color: #408080; font-style: italic } /* Comment.Single */ +.cs { color: #408080; font-style: italic } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #808080 } /* Generic.Output */ +.gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0040D0 } /* Generic.Traceback */ +.kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #008000 } /* Keyword.Pseudo */ +.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #B00040 } /* Keyword.Type */ +.m { color: #666666 } /* Literal.Number */ +.s { color: #BA2121 } /* Literal.String */ +.na { color: #7D9029 } /* Name.Attribute */ +.nb { color: #008000 } /* Name.Builtin */ +.nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.no { color: #880000 } /* Name.Constant */ +.nd { color: #AA22FF } /* Name.Decorator */ +.ni { color: #999999; font-weight: bold } /* Name.Entity */ +.ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.nf { color: #0000FF } /* Name.Function */ +.nl { color: #A0A000 } /* Name.Label */ +.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.nt { color: #008000; font-weight: bold } /* Name.Tag */ +.nv { color: #19177C } /* Name.Variable */ +.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #666666 } /* Literal.Number.Float */ +.mh { color: #666666 } /* Literal.Number.Hex */ +.mi { color: #666666 } /* Literal.Number.Integer */ +.mo { color: #666666 } /* Literal.Number.Oct */ +.sb { color: #BA2121 } /* Literal.String.Backtick */ +.sc { color: #BA2121 } /* Literal.String.Char */ +.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #BA2121 } /* Literal.String.Double */ +.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.sh { color: #BA2121 } /* Literal.String.Heredoc */ +.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.sx { color: #008000 } /* Literal.String.Other */ +.sr { color: #BB6688 } /* Literal.String.Regex */ +.s1 { color: #BA2121 } /* Literal.String.Single */ +.ss { color: #19177C } /* Literal.String.Symbol */ +.bp { color: #008000 } /* Name.Builtin.Pseudo */ +.vc { color: #19177C } /* Name.Variable.Class */ +.vg { color: #19177C } /* Name.Variable.Global */ +.vi { color: #19177C } /* Name.Variable.Instance */ +.il { color: #666666 } /* Literal.Number.Integer.Long */ +.lineno { padding-right: 10px } /* A few space after linenos */ + +#blank { + position: absolute; + top: 0; + left: 0; + background-color: black; + width: 100%; + height: 100%; + z-index: 64; + display: none; +} diff --git a/doc/upstream-training/theme/js/slides.js b/doc/upstream-training/theme/js/slides.js new file mode 100644 index 00000000..e7ae40c5 --- /dev/null +++ b/doc/upstream-training/theme/js/slides.js @@ -0,0 +1,580 @@ +function main() { + // Since we don't have the fallback of attachEvent and + // other IE only stuff we won't try to run JS for IE. + // It will run though when using Google Chrome Frame + if (document.all) { return; } + + var currentSlideNo; + var notesOn = false; + var expanded = false; + var hiddenContext = false; + var blanked = false; + var slides = document.getElementsByClassName('slide'); + var touchStartX = 0; + var spaces = /\s+/, a1 = ['']; + var tocOpened = false; + var helpOpened = false; + var overviewActive = false; + var modifierKeyDown = false; + var scale = 1; + var showingPresenterView = false; + var presenterViewWin = null; + var isPresenterView = false; + + var str2array = function(s) { + if (typeof s == 'string' || s instanceof String) { + if (s.indexOf(' ') < 0) { + a1[0] = s; + return a1; + } else { + return s.split(spaces); + } + } + return s; + }; + + var trim = function(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + }; + + var addClass = function(node, classStr) { + classStr = str2array(classStr); + var cls = ' ' + node.className + ' '; + for (var i = 0, len = classStr.length, c; i < len; ++i) { + c = classStr[i]; + if (c && cls.indexOf(' ' + c + ' ') < 0) { + cls += c + ' '; + } + } + node.className = trim(cls); + }; + + var removeClass = function(node, classStr) { + var cls; + if (!node) { + throw 'no node provided'; + } + if (classStr !== undefined) { + classStr = str2array(classStr); + cls = ' ' + node.className + ' '; + for (var i = 0, len = classStr.length; i < len; ++i) { + cls = cls.replace(' ' + classStr[i] + ' ', ' '); + } + cls = trim(cls); + } else { + cls = ''; + } + if (node.className != cls) { + node.className = cls; + } + }; + + var getSlideEl = function(slideNo) { + if (slideNo > 0) { + return slides[slideNo - 1]; + } else { + return null; + } + }; + + var getSlideTitle = function(slideNo) { + var el = getSlideEl(slideNo); + if (el) { + var headers = el.getElementsByTagName('header'); + if (headers.length > 0) { + return el.getElementsByTagName('header')[0].innerText; + } + } + return null; + }; + + var getSlidePresenterNote = function(slideNo) { + var el = getSlideEl(slideNo); + if (el) { + var n = el.getElementsByClassName('presenter_notes'); + if (n.length > 0) { + return n[0]; + } + } + return null; + }; + + var changeSlideElClass = function(slideNo, className) { + var el = getSlideEl(slideNo); + if (el) { + removeClass(el, 'far-past past current future far-future'); + addClass(el, className); + } + }; + + var updateSlideClasses = function(updateOther) { + window.location.hash = (isPresenterView ? "presenter" : "slide") + currentSlideNo; + + for (var i=1; i 1) { + currentSlideNo--; + } + updateSlideClasses(true); + }; + + var showNotes = function() { + var notes = getSlideEl(currentSlideNo).getElementsByClassName('notes'); + for (var i = 0, len = notes.length; i < len; i++) { + notes.item(i).style.display = (notesOn) ? 'none':'block'; + } + notesOn = !notesOn; + }; + + var showSlideNumbers = function() { + var asides = document.getElementsByClassName('page_number'); + var hidden = asides[0].style.display != 'block'; + for (var i = 0; i < asides.length; i++) { + asides.item(i).style.display = hidden ? 'block' : 'none'; + } + }; + + var showSlideSources = function() { + var asides = document.getElementsByClassName('source'); + var hidden = asides[0].style.display != 'block'; + for (var i = 0; i < asides.length; i++) { + asides.item(i).style.display = hidden ? 'block' : 'none'; + } + }; + + var showToc = function() { + if (helpOpened) { + showHelp(); + } + var toc = document.getElementById('toc'); + if (toc) { + toc.style.marginLeft = tocOpened ? '-' + (toc.clientWidth + 20) + 'px' : '0px'; + tocOpened = !tocOpened; + } + updateOverview(); + }; + + var showHelp = function() { + if (tocOpened) { + showToc(); + } + + var help = document.getElementById('help'); + + if (help) { + help.style.marginLeft = helpOpened ? '-' + (help.clientWidth + 20) + 'px' : '0px'; + helpOpened = !helpOpened; + } + }; + + var showPresenterView = function() { + if (isPresenterView) { return; } + + if (showingPresenterView) { + presenterViewWin.close(); + presenterViewWin = null; + showingPresenterView = false; + } else { + presenterViewWin = open(window.location.pathname + "#presenter" + currentSlideNo, 'presenter_notes', + 'directories=no,location=no,toolbar=no,menubar=no,copyhistory=no'); + showingPresenterView = true; + } + }; + + var switch3D = function() { + if (document.body.className.indexOf('three-d') == -1) { + document.getElementsByClassName('presentation')[0].style.webkitPerspective = '1000px'; + document.body.className += ' three-d'; + } else { + window.setTimeout('document.getElementsByClassName(\'presentation\')[0].style.webkitPerspective = \'0\';', 2000); + document.body.className = document.body.className.replace(/three-d/, ''); + } + }; + + var toggleOverview = function() { + if (!overviewActive) { + addClass(document.body, 'expose'); + overviewActive = true; + setScale(1); + } else { + removeClass(document.body, 'expose'); + overviewActive = false; + if (expanded) { + setScale(scale); // restore scale + } + } + processContext(); + updateOverview(); + }; + + var updateOverview = function() { + try { + var presentation = document.getElementsByClassName('presentation')[0]; + } catch (e) { + return; + } + + if (isPresenterView) { + var action = overviewActive ? removeClass : addClass; + action(document.body, 'presenter_view'); + } + + var toc = document.getElementById('toc'); + + if (!toc) { + return; + } + + if (!tocOpened || !overviewActive) { + presentation.style.marginLeft = '0px'; + presentation.style.width = '100%'; + } else { + presentation.style.marginLeft = toc.clientWidth + 'px'; + presentation.style.width = (presentation.clientWidth - toc.clientWidth) + 'px'; + } + }; + + var computeScale = function() { + var cSlide = document.getElementsByClassName('current')[0]; + var sx = cSlide.clientWidth / window.innerWidth; + var sy = cSlide.clientHeight / window.innerHeight; + return 1 / Math.max(sx, sy); + }; + + var setScale = function(scale) { + var presentation = document.getElementsByClassName('slides')[0]; + var transform = 'scale(' + scale + ')'; + presentation.style.MozTransform = transform; + presentation.style.WebkitTransform = transform; + presentation.style.OTransform = transform; + presentation.style.msTransform = transform; + presentation.style.transform = transform; + }; + + var expandSlides = function() { + if (overviewActive) { + return; + } + if (expanded) { + setScale(1); + expanded = false; + } else { + scale = computeScale(); + setScale(scale); + expanded = true; + } + }; + + var showContext = function() { + try { + var presentation = document.getElementsByClassName('slides')[0]; + removeClass(presentation, 'nocontext'); + } catch (e) {} + }; + + var hideContext = function() { + try { + var presentation = document.getElementsByClassName('slides')[0]; + addClass(presentation, 'nocontext'); + } catch (e) {} + }; + + var processContext = function() { + if (hiddenContext) { + hideContext(); + } else { + showContext(); + } + }; + + var toggleContext = function() { + hiddenContext = !hiddenContext; + processContext(); + }; + + var toggleBlank = function() { + blank_elem = document.getElementById('blank'); + + blank_elem.style.display = blanked ? 'none' : 'block'; + + blanked = !blanked; + }; + + var isModifierKey = function(keyCode) { + switch (keyCode) { + case 16: // shift + case 17: // ctrl + case 18: // alt + case 91: // command + return true; + break; + default: + return false; + break; + } + }; + + var checkModifierKeyUp = function(event) { + if (isModifierKey(event.keyCode)) { + modifierKeyDown = false; + } + }; + + var checkModifierKeyDown = function(event) { + if (isModifierKey(event.keyCode)) { + modifierKeyDown = true; + } + }; + + var handleBodyKeyDown = function(event) { + switch (event.keyCode) { + case 13: // Enter + if (overviewActive) { + toggleOverview(); + } + break; + case 27: // ESC + toggleOverview(); + break; + case 37: // left arrow + case 33: // page up + event.preventDefault(); + prevSlide(); + break; + case 39: // right arrow + case 32: // space + case 34: // page down + event.preventDefault(); + nextSlide(); + break; + case 50: // 2 + if (!modifierKeyDown) { + showNotes(); + } + break; + case 51: // 3 + if (!modifierKeyDown && !overviewActive) { + switch3D(); + } + break; + case 190: // . + case 48: // 0 + case 66: // b + if (!modifierKeyDown && !overviewActive) { + toggleBlank(); + } + break; + case 67: // c + if (!modifierKeyDown && !overviewActive) { + toggleContext(); + } + break; + case 69: // e + if (!modifierKeyDown && !overviewActive) { + expandSlides(); + } + break; + case 72: // h + showHelp(); + break; + case 78: // n + if (!modifierKeyDown && !overviewActive) { + showSlideNumbers(); + } + break; + case 80: // p + if (!modifierKeyDown && !overviewActive) { + showPresenterView(); + } + break; + case 83: // s + if (!modifierKeyDown && !overviewActive) { + showSlideSources(); + } + break; + case 84: // t + showToc(); + break; + } + }; + + var handleWheel = function(event) { + if (tocOpened || helpOpened || overviewActive) { + return; + } + + var delta = 0; + + if (!event) { + event = window.event; + } + + if (event.wheelDelta) { + delta = event.wheelDelta/120; + if (window.opera) delta = -delta; + } else if (event.detail) { + delta = -event.detail/3; + } + + if (delta && delta <0) { + nextSlide(); + } else if (delta) { + prevSlide(); + } + }; + + var addSlideClickListeners = function() { + for (var i=0; i < slides.length; i++) { + var slide = slides.item(i); + slide.num = i + 1; + slide.addEventListener('click', function(e) { + if (overviewActive) { + currentSlideNo = this.num; + toggleOverview(); + updateSlideClasses(true); + e.preventDefault(); + } + return false; + }, true); + } + }; + + var addRemoteWindowControls = function() { + window.addEventListener("message", function(e) { + if (e.data.indexOf("slide#") != -1) { + currentSlideNo = Number(e.data.replace('slide#', '')); + updateSlideClasses(false); + } + }, false); + }; + + var addTouchListeners = function() { + document.addEventListener('touchstart', function(e) { + touchStartX = e.touches[0].pageX; + }, false); + document.addEventListener('touchend', function(e) { + var pixelsMoved = touchStartX - e.changedTouches[0].pageX; + var SWIPE_SIZE = 150; + if (pixelsMoved > SWIPE_SIZE) { + nextSlide(); + } + else if (pixelsMoved < -SWIPE_SIZE) { + prevSlide(); + } + }, false); + }; + + var addTocLinksListeners = function() { + var toc = document.getElementById('toc'); + if (toc) { + var tocLinks = toc.getElementsByTagName('a'); + for (var i=0; i < tocLinks.length; i++) { + tocLinks.item(i).addEventListener('click', function(e) { + currentSlideNo = Number(this.attributes['href'].value.replace('#slide', '')); + updateSlideClasses(true); + e.preventDefault(); + }, true); + } + } + }; + + // initialize + + (function() { + if (window.location.hash == "") { + currentSlideNo = 1; + } else if (window.location.hash.indexOf("#presenter") != -1) { + currentSlideNo = Number(window.location.hash.replace('#presenter', '')); + isPresenterView = true; + showingPresenterView = true; + presenterViewWin = window; + addClass(document.body, 'presenter_view'); + } else { + currentSlideNo = Number(window.location.hash.replace('#slide', '')); + } + + document.addEventListener('keyup', checkModifierKeyUp, false); + document.addEventListener('keydown', handleBodyKeyDown, false); + document.addEventListener('keydown', checkModifierKeyDown, false); + document.addEventListener('DOMMouseScroll', handleWheel, false); + + window.onmousewheel = document.onmousewheel = handleWheel; + window.onresize = expandSlides; + + for (var i = 0, el; el = slides[i]; i++) { + addClass(el, 'slide far-future'); + } + updateSlideClasses(false); + + // add support for finger events (filter it by property detection?) + addTouchListeners(); + + addTocLinksListeners(); + + addSlideClickListeners(); + + addRemoteWindowControls(); + })(); +}