Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

First shot at a demonstration of the S5 slide functionality.

  • Loading branch information...
commit 71aeba1b1f80f36f85e1f14dfbadda04004a64cb 1 parent abe2e32
Tim Pease TwP authored

Showing 26 changed files with 1,279 additions and 0 deletions. Show diff stats Hide diff stats

  1. +14 0 examples/presentation/Rakefile
  2. +12 0 examples/presentation/content/_sample_code.txt
  3. +137 0 examples/presentation/content/css/uv/twilight.css
  4. +63 0 examples/presentation/content/index.txt
  5. BIN  examples/presentation/content/s5/blank.gif
  6. BIN  examples/presentation/content/s5/bodybg.gif
  7. +23 0 examples/presentation/content/s5/framing.css
  8. +42 0 examples/presentation/content/s5/iepngfix.htc
  9. +7 0 examples/presentation/content/s5/opera.css
  10. +15 0 examples/presentation/content/s5/outline.css
  11. +86 0 examples/presentation/content/s5/pretty.css
  12. +1 0  examples/presentation/content/s5/print.css
  13. +9 0 examples/presentation/content/s5/s5-core.css
  14. +3 0  examples/presentation/content/s5/slides.css
  15. +553 0 examples/presentation/content/s5/slides.js
  16. +43 0 examples/presentation/layouts/presentation.rhtml
  17. +71 0 examples/presentation/tasks/blog.rake
  18. +27 0 examples/presentation/tasks/build.rake
  19. +22 0 examples/presentation/tasks/create.rake
  20. +22 0 examples/presentation/tasks/deploy.rake
  21. +12 0 examples/presentation/tasks/growl.rake
  22. +28 0 examples/presentation/tasks/heel.rake
  23. +17 0 examples/presentation/tasks/setup.rb
  24. +19 0 examples/presentation/tasks/validate.rake
  25. +13 0 examples/presentation/templates/_partial.erb
  26. +40 0 examples/presentation/templates/presentation.erb
14 examples/presentation/Rakefile
... ... @@ -0,0 +1,14 @@
  1 +
  2 +load 'tasks/setup.rb'
  3 +
  4 +task :default => :build
  5 +
  6 +desc 'deploy the site to the webserver'
  7 +task :deploy => [:build, 'deploy:rsync']
  8 +
  9 +task :autobuild => :growl
  10 +
  11 +SITE.uv[:theme] = 'twilight'
  12 +SITE.uv[:line_numbers] = false
  13 +
  14 +# EOF
12 examples/presentation/content/_sample_code.txt
... ... @@ -0,0 +1,12 @@
  1 +---
  2 +filter: erb
  3 +---
  4 +<notextile>
  5 +<% uv :lang => "ruby", :theme => 'twilight' do -%>
  6 +class A
  7 + def method()
  8 + puts "in class #{self.class.name}"
  9 + end
  10 +end
  11 +<% end -%>
  12 +</notextile>
137 examples/presentation/content/css/uv/twilight.css
... ... @@ -0,0 +1,137 @@
  1 +pre.twilight .DiffInserted {
  2 + background-color: #253B22;
  3 + color: #F8F8F8;
  4 +}
  5 +pre.twilight .DiffHeader {
  6 + background-color: #0E2231;
  7 + color: #F8F8F8;
  8 + font-style: italic;
  9 +}
  10 +pre.twilight .CssPropertyValue {
  11 + color: #F9EE98;
  12 +}
  13 +pre.twilight .CCCPreprocessorDirective {
  14 + color: #AFC4DB;
  15 +}
  16 +pre.twilight .Constant {
  17 + color: #CF6A4C;
  18 +}
  19 +pre.twilight .DiffChanged {
  20 + background-color: #4A410D;
  21 + color: #F8F8F8;
  22 +}
  23 +pre.twilight .EmbeddedSource {
  24 + background-color: #A3A6AD;
  25 +}
  26 +pre.twilight .Support {
  27 + color: #9B859D;
  28 +}
  29 +pre.twilight .MarkupList {
  30 + color: #F9EE98;
  31 +}
  32 +pre.twilight .CssConstructorArgument {
  33 + color: #8F9D6A;
  34 +}
  35 +pre.twilight .Storage {
  36 + color: #F9EE98;
  37 +}
  38 +pre.twilight .line-numbers {
  39 + background-color: inherit;
  40 + color: #999999;
  41 +}
  42 +pre.twilight .CssClass {
  43 + color: #9B703F;
  44 +}
  45 +pre.twilight .StringConstant {
  46 + color: #DDF2A4;
  47 +}
  48 +pre.twilight .CssAtRule {
  49 + color: #8693A5;
  50 +}
  51 +pre.twilight .MetaTagInline {
  52 + color: #E0C589;
  53 +}
  54 +pre.twilight .MarkupHeading {
  55 + color: #CF6A4C;
  56 +}
  57 +pre.twilight .CssTagName {
  58 + color: #CDA869;
  59 +}
  60 +pre.twilight .SupportConstant {
  61 + color: #CF6A4C;
  62 +}
  63 +pre.twilight .DiffDeleted {
  64 + background-color: #420E09;
  65 + color: #F8F8F8;
  66 +}
  67 +pre.twilight .CCCPreprocessorLine {
  68 + color: #8996A8;
  69 +}
  70 +pre.twilight .StringRegexpSpecial {
  71 + color: #CF7D34;
  72 +}
  73 +pre.twilight .EmbeddedSourceBright {
  74 + background-color: #9C9EA4;
  75 +}
  76 +pre.twilight .InvalidIllegal {
  77 + background-color: #241A24;
  78 + color: #F8F8F8;
  79 +}
  80 +pre.twilight .SupportFunction {
  81 + color: #DAD085;
  82 +}
  83 +pre.twilight .CssAdditionalConstants {
  84 + color: #CA7840;
  85 +}
  86 +pre.twilight .MetaTagAll {
  87 + color: #AC885B;
  88 +}
  89 +pre.twilight .StringRegexp {
  90 + color: #E9C062;
  91 +}
  92 +pre.twilight .StringEmbeddedSource {
  93 + color: #DAEFA3;
  94 +}
  95 +pre.twilight .EntityInheritedClass {
  96 + color: #9B5C2E;
  97 + font-style: italic;
  98 +}
  99 +pre.twilight .CssId {
  100 + color: #8B98AB;
  101 +}
  102 +pre.twilight .CssPseudoClass {
  103 + color: #8F9D6A;
  104 +}
  105 +pre.twilight .StringVariable {
  106 + color: #8A9A95;
  107 +}
  108 +pre.twilight .String {
  109 + color: #8F9D6A;
  110 +}
  111 +pre.twilight .Keyword {
  112 + color: #CDA869;
  113 +}
  114 +pre.twilight {
  115 + background-color: #141414;
  116 + color: #F8F8F8;
  117 +}
  118 +pre.twilight .CssPropertyName {
  119 + color: #C5AF75;
  120 +}
  121 +pre.twilight .DoctypeXmlProcessing {
  122 + color: #494949;
  123 +}
  124 +pre.twilight .InvalidDeprecated {
  125 + color: #D2A8A1;
  126 + font-style: italic;
  127 +}
  128 +pre.twilight .Variable {
  129 + color: #7587A6;
  130 +}
  131 +pre.twilight .Entity {
  132 + color: #9B703F;
  133 +}
  134 +pre.twilight .Comment {
  135 + color: #5F5A60;
  136 + font-style: italic;
  137 +}
63 examples/presentation/content/index.txt
... ... @@ -0,0 +1,63 @@
  1 +---
  2 +title: Webby S5
  3 +created_at: 2008-05-18 22:10:21.995012 -06:00
  4 +author: You
  5 +company: Company
  6 +copyright: Creative Commons
  7 +filter:
  8 + - erb
  9 + - textile
  10 + - slides
  11 +layout: presentation
  12 +---
  13 +h1. Webby S5 Generator
  14 +
  15 +Clever introductory text that will grab the audience's attention.
  16 +
  17 +
  18 +h1. Title of the First Slide
  19 +
  20 +A little more build up before really getting into the meat of it.
  21 +
  22 +
  23 +h1. Title of the Second Slide
  24 +
  25 +Finally, some code!
  26 +
  27 +<% uv :lang => "ragel", :theme => 'twilight' do -%>
  28 +action dgt { printf("DGT: %c\n", fc); }
  29 +action dec { printf("DEC: .\n"); }
  30 +action exp { printf("EXP: %c\n", fc); }
  31 +action exp_sign { printf("SGN: %c\n", fc); }
  32 +action number { /*NUMBER*/ }
  33 +
  34 +number = (
  35 + [0-9]+ $dgt ( '.' @dec [0-9]+ $dgt )?
  36 + ( [eE] ( [+\-] $exp_sign )? [0-9]+ $exp )?
  37 +) %number;
  38 +
  39 +main := ( number '\n' )*;
  40 +<% end -%>
  41 +
  42 +
  43 +h1. Title of the Third Slide
  44 +
  45 +This code comes from a partial
  46 +
  47 +<%= render_partial('sample_code') %>
  48 +
  49 +
  50 +h1. Title of the Fourth Slide
  51 +
  52 +The quadratic equation is used to solve for the two roots of the quadratic formula.
  53 +
  54 +<% tex2img 'quadratic', :path => 'images', :alt => 'quadratic', :resolution => '300x300' do -%>
  55 +x = \frac{-b\pm\sqrt[]{b^2-4ac}}{2a}
  56 +<% end -%>
  57 +
  58 +
  59 +h1. The Final Slide
  60 +
  61 +And that about sums it up!
  62 +
  63 +Thanks for visiting
BIN  examples/presentation/content/s5/blank.gif
BIN  examples/presentation/content/s5/bodybg.gif
23 examples/presentation/content/s5/framing.css
... ... @@ -0,0 +1,23 @@
  1 +/* The following styles size, place, and layer the slide components.
  2 + Edit these if you want to change the overall slide layout.
  3 + The commented lines can be uncommented (and modified, if necessary)
  4 + to help you with the rearrangement process. */
  5 +
  6 +/* target = 1024x768 */
  7 +
  8 +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
  9 +div#header {top: 0; height: 3em; z-index: 1;}
  10 +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
  11 +.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;}
  12 +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
  13 +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
  14 + margin: 0;}
  15 +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;}
  16 +html>body #currentSlide {position: fixed;}
  17 +
  18 +/*
  19 +div#header {background: #FCC;}
  20 +div#footer {background: #CCF;}
  21 +div#controls {background: #BBD;}
  22 +div#currentSlide {background: #FFC;}
  23 +*/
42 examples/presentation/content/s5/iepngfix.htc
... ... @@ -0,0 +1,42 @@
  1 +<public:component>
  2 +<public:attach event="onpropertychange" onevent="doFix()" />
  3 +
  4 +<script>
  5 +
  6 +// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
  7 +// Free usage permitted as long as this notice remains intact.
  8 +
  9 +// This must be a path to a blank image. That's all the configuration you need here.
  10 +var blankImg = 'ui/default/blank.gif';
  11 +
  12 +var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
  13 +
  14 +function filt(s, m) {
  15 + if (filters[f]) {
  16 + filters[f].enabled = s ? true : false;
  17 + if (s) with (filters[f]) { src = s; sizingMethod = m }
  18 + } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
  19 +}
  20 +
  21 +function doFix() {
  22 + if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
  23 + (event && !/(background|src)/.test(event.propertyName))) return;
  24 +
  25 + if (tagName == 'IMG') {
  26 + if ((/\.png$/i).test(src)) {
  27 + filt(src, 'image'); // was 'scale'
  28 + src = blankImg;
  29 + } else if (src.indexOf(blankImg) < 0) filt();
  30 + } else if (style.backgroundImage) {
  31 + if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
  32 + var s = RegExp.$1;
  33 + style.backgroundImage = '';
  34 + filt(s, 'crop');
  35 + } else filt();
  36 + }
  37 +}
  38 +
  39 +doFix();
  40 +
  41 +</script>
  42 +</public:component>
7 examples/presentation/content/s5/opera.css
... ... @@ -0,0 +1,7 @@
  1 +/* DO NOT CHANGE THESE unless you really want to break Opera Show */
  2 +.slide {
  3 + visibility: visible !important;
  4 + position: static !important;
  5 + page-break-before: always;
  6 +}
  7 +#slide0 {page-break-before: avoid;}
15 examples/presentation/content/s5/outline.css
... ... @@ -0,0 +1,15 @@
  1 +/* don't change this unless you want the layout stuff to show up in the outline view! */
  2 +
  3 +.layout div, #footer *, #controlForm * {display: none;}
  4 +#footer, #controls, #controlForm, #navLinks, #toggle {
  5 + display: block; visibility: visible; margin: 0; padding: 0;}
  6 +#toggle {float: right; padding: 0.5em;}
  7 +html>body #toggle {position: fixed; top: 0; right: 0;}
  8 +
  9 +/* making the outline look pretty-ish */
  10 +
  11 +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
  12 +#slide0 h1 {padding-top: 1.5em;}
  13 +.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
  14 + border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
  15 +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
86 examples/presentation/content/s5/pretty.css
... ... @@ -0,0 +1,86 @@
  1 +/* Following are the presentation styles -- edit away! */
  2 +
  3 +body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;}
  4 +:link, :visited {text-decoration: none; color: #00C;}
  5 +#controls :active {color: #88A !important;}
  6 +#controls :focus {outline: 1px dotted #227;}
  7 +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
  8 +ul, pre {margin: 0; line-height: 1em;}
  9 +html, body {margin: 0; padding: 0;}
  10 +
  11 +blockquote, q {font-style: italic;}
  12 +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;}
  13 +blockquote p {margin: 0;}
  14 +blockquote i {font-style: normal;}
  15 +blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;}
  16 +blockquote b i {font-style: italic;}
  17 +
  18 +kbd {font-weight: bold; font-size: 1em;}
  19 +sup {font-size: smaller; line-height: 1px;}
  20 +
  21 +.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;}
  22 +.slide code.bad, code del {color: red;}
  23 +.slide code.old {color: silver;}
  24 +.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;}
  25 +.slide pre code {display: block;}
  26 +.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;}
  27 +.slide li {margin-top: 0.75em; margin-right: 0;}
  28 +.slide ul ul {line-height: 1;}
  29 +.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;}
  30 +.slide img.leader {display: block; margin: 0 auto;}
  31 +
  32 +div#header, div#footer {background: #005; color: #AAB;
  33 + font-family: Verdana, Helvetica, sans-serif;}
  34 +div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat;
  35 + line-height: 1px;}
  36 +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
  37 +#footer h1, #footer h2 {display: block; padding: 0 1em;}
  38 +#footer h2 {font-style: italic;}
  39 +
  40 +div.long {font-size: 0.75em;}
  41 +.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1;
  42 + margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap;
  43 + font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize;
  44 + color: #DDE; background: #005;}
  45 +.slide h3 {font-size: 130%;}
  46 +h1 abbr {font-variant: small-caps;}
  47 +
  48 +div#controls {position: absolute; left: 50%; bottom: 0;
  49 + width: 50%;
  50 + text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;}
  51 +html>body div#controls {position: fixed; padding: 0 0 1em 0;
  52 + top: auto;}
  53 +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
  54 + margin: 0; padding: 0;}
  55 +#controls #navLinks a {padding: 0; margin: 0 0.5em;
  56 + background: #005; border: none; color: #779;
  57 + cursor: pointer;}
  58 +#controls #navList {height: 1em;}
  59 +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;}
  60 +
  61 +#currentSlide {text-align: center; font-size: 0.5em; color: #449;}
  62 +
  63 +#slide0 {padding-top: 3.5em; font-size: 90%;}
  64 +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
  65 + font: bold 2em Helvetica, sans-serif; white-space: normal;
  66 + color: #000; background: transparent;}
  67 +#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;}
  68 +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
  69 +#slide0 h4 {margin-top: 0; font-size: 1em;}
  70 +
  71 +ul.urls {list-style: none; display: inline; margin: 0;}
  72 +.urls li {display: inline; margin: 0;}
  73 +.note {display: none;}
  74 +.external {border-bottom: 1px dotted gray;}
  75 +html>body .external {border-bottom: none;}
  76 +.external:after {content: " \274F"; font-size: smaller; color: #77B;}
  77 +
  78 +.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;}
  79 +img.incremental {visibility: hidden;}
  80 +.slide .current {color: #B02;}
  81 +
  82 +
  83 +/* diagnostics
  84 +
  85 +li:after {content: " [" attr(class) "]"; color: #F88;}
  86 + */
1  examples/presentation/content/s5/print.css
... ... @@ -0,0 +1 @@
  1 +/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .layout, .layout * {display: none !important;}
9 examples/presentation/content/s5/s5-core.css
... ... @@ -0,0 +1,9 @@
  1 +/* Do not edit or override these styles! The system will likely break if you do. */
  2 +
  3 +div#header, div#footer, div#controls, .slide {position: absolute;}
  4 +html>body div#header, html>body div#footer,
  5 + html>body div#controls, html>body .slide {position: fixed;}
  6 +.handout {display: none;}
  7 +.layout {display: block;}
  8 +.slide, .hideme, .incremental {visibility: hidden;}
  9 +#slide0 {visibility: visible;}
3  examples/presentation/content/s5/slides.css
... ... @@ -0,0 +1,3 @@
  1 +@import url(s5-core.css); /* required to make the slide show run at all */
  2 +@import url(framing.css); /* sets basic placement and size of slide components */
  3 +@import url(pretty.css); /* stuff that makes the slides look better than blah */
553 examples/presentation/content/s5/slides.js
... ... @@ -0,0 +1,553 @@
  1 +// S5 v1.1 slides.js -- released into the Public Domain
  2 +//
  3 +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
  4 +// about all the wonderful and talented contributors to this code!
  5 +
  6 +var undef;
  7 +var slideCSS = '';
  8 +var snum = 0;
  9 +var smax = 1;
  10 +var incpos = 0;
  11 +var number = undef;
  12 +var s5mode = true;
  13 +var defaultView = 'slideshow';
  14 +var controlVis = 'visible';
  15 +
  16 +var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
  17 +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
  18 +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
  19 +
  20 +function hasClass(object, className) {
  21 + if (!object.className) return false;
  22 + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
  23 +}
  24 +
  25 +function hasValue(object, value) {
  26 + if (!object) return false;
  27 + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
  28 +}
  29 +
  30 +function removeClass(object,className) {
  31 + if (!object) return;
  32 + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
  33 +}
  34 +
  35 +function addClass(object,className) {
  36 + if (!object || hasClass(object, className)) return;
  37 + if (object.className) {
  38 + object.className += ' '+className;
  39 + } else {
  40 + object.className = className;
  41 + }
  42 +}
  43 +
  44 +function GetElementsWithClassName(elementName,className) {
  45 + var allElements = document.getElementsByTagName(elementName);
  46 + var elemColl = new Array();
  47 + for (var i = 0; i< allElements.length; i++) {
  48 + if (hasClass(allElements[i], className)) {
  49 + elemColl[elemColl.length] = allElements[i];
  50 + }
  51 + }
  52 + return elemColl;
  53 +}
  54 +
  55 +function isParentOrSelf(element, id) {
  56 + if (element == null || element.nodeName=='BODY') return false;
  57 + else if (element.id == id) return true;
  58 + else return isParentOrSelf(element.parentNode, id);
  59 +}
  60 +
  61 +function nodeValue(node) {
  62 + var result = "";
  63 + if (node.nodeType == 1) {
  64 + var children = node.childNodes;
  65 + for (var i = 0; i < children.length; ++i) {
  66 + result += nodeValue(children[i]);
  67 + }
  68 + }
  69 + else if (node.nodeType == 3) {
  70 + result = node.nodeValue;
  71 + }
  72 + return(result);
  73 +}
  74 +
  75 +function slideLabel() {
  76 + var slideColl = GetElementsWithClassName('*','slide');
  77 + var list = document.getElementById('jumplist');
  78 + smax = slideColl.length;
  79 + for (var n = 0; n < smax; n++) {
  80 + var obj = slideColl[n];
  81 +
  82 + var did = 'slide' + n.toString();
  83 + obj.setAttribute('id',did);
  84 + if (isOp) continue;
  85 +
  86 + var otext = '';
  87 + var menu = obj.firstChild;
  88 + if (!menu) continue; // to cope with empty slides
  89 + while (menu && menu.nodeType == 3) {
  90 + menu = menu.nextSibling;
  91 + }
  92 + if (!menu) continue; // to cope with slides with only text nodes
  93 +
  94 + var menunodes = menu.childNodes;
  95 + for (var o = 0; o < menunodes.length; o++) {
  96 + otext += nodeValue(menunodes[o]);
  97 + }
  98 + list.options[list.length] = new Option(n + ' : ' + otext, n);
  99 + }
  100 +}
  101 +
  102 +function currentSlide() {
  103 + var cs;
  104 + if (document.getElementById) {
  105 + cs = document.getElementById('currentSlide');
  106 + } else {
  107 + cs = document.currentSlide;
  108 + }
  109 + cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
  110 + '<span id="csSep">\/<\/span> ' +
  111 + '<span id="csTotal">' + (smax-1) + '<\/span>';
  112 + if (snum == 0) {
  113 + cs.style.visibility = 'hidden';
  114 + } else {
  115 + cs.style.visibility = 'visible';
  116 + }
  117 +}
  118 +
  119 +function go(step) {
  120 + if (document.getElementById('slideProj').disabled || step == 0) return;
  121 + var jl = document.getElementById('jumplist');
  122 + var cid = 'slide' + snum;
  123 + var ce = document.getElementById(cid);
  124 + if (incrementals[snum].length > 0) {
  125 + for (var i = 0; i < incrementals[snum].length; i++) {
  126 + removeClass(incrementals[snum][i], 'current');
  127 + removeClass(incrementals[snum][i], 'incremental');
  128 + }
  129 + }
  130 + if (step != 'j') {
  131 + snum += step;
  132 + lmax = smax - 1;
  133 + if (snum > lmax) snum = lmax;
  134 + if (snum < 0) snum = 0;
  135 + } else
  136 + snum = parseInt(jl.value);
  137 + var nid = 'slide' + snum;
  138 + var ne = document.getElementById(nid);
  139 + if (!ne) {
  140 + ne = document.getElementById('slide0');
  141 + snum = 0;
  142 + }
  143 + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
  144 + if (incrementals[snum].length > 0 && incpos == 0) {
  145 + for (var i = 0; i < incrementals[snum].length; i++) {
  146 + if (hasClass(incrementals[snum][i], 'current'))
  147 + incpos = i + 1;
  148 + else
  149 + addClass(incrementals[snum][i], 'incremental');
  150 + }
  151 + }
  152 + if (incrementals[snum].length > 0 && incpos > 0)
  153 + addClass(incrementals[snum][incpos - 1], 'current');
  154 + ce.style.visibility = 'hidden';
  155 + ne.style.visibility = 'visible';
  156 + jl.selectedIndex = snum;
  157 + currentSlide();
  158 + number = 0;
  159 +}
  160 +
  161 +function goTo(target) {
  162 + if (target >= smax || target == snum) return;
  163 + go(target - snum);
  164 +}
  165 +
  166 +function subgo(step) {
  167 + if (step > 0) {
  168 + removeClass(incrementals[snum][incpos - 1],'current');
  169 + removeClass(incrementals[snum][incpos], 'incremental');
  170 + addClass(incrementals[snum][incpos],'current');
  171 + incpos++;
  172 + } else {
  173 + incpos--;
  174 + removeClass(incrementals[snum][incpos],'current');
  175 + addClass(incrementals[snum][incpos], 'incremental');
  176 + addClass(incrementals[snum][incpos - 1],'current');
  177 + }
  178 +}
  179 +
  180 +function toggle() {
  181 + var slideColl = GetElementsWithClassName('*','slide');
  182 + var slides = document.getElementById('slideProj');
  183 + var outline = document.getElementById('outlineStyle');
  184 + if (!slides.disabled) {
  185 + slides.disabled = true;
  186 + outline.disabled = false;
  187 + s5mode = false;
  188 + fontSize('1em');
  189 + for (var n = 0; n < smax; n++) {
  190 + var slide = slideColl[n];
  191 + slide.style.visibility = 'visible';
  192 + }
  193 + } else {
  194 + slides.disabled = false;
  195 + outline.disabled = true;
  196 + s5mode = true;
  197 + fontScale();
  198 + for (var n = 0; n < smax; n++) {
  199 + var slide = slideColl[n];
  200 + slide.style.visibility = 'hidden';
  201 + }
  202 + slideColl[snum].style.visibility = 'visible';
  203 + }
  204 +}
  205 +
  206 +function showHide(action) {
  207 + var obj = GetElementsWithClassName('*','hideme')[0];
  208 + switch (action) {
  209 + case 's': obj.style.visibility = 'visible'; break;
  210 + case 'h': obj.style.visibility = 'hidden'; break;
  211 + case 'k':
  212 + if (obj.style.visibility != 'visible') {
  213 + obj.style.visibility = 'visible';
  214 + } else {
  215 + obj.style.visibility = 'hidden';
  216 + }
  217 + break;
  218 + }
  219 +}
  220 +
  221 +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
  222 +function keys(key) {
  223 + if (!key) {
  224 + key = event;
  225 + key.which = key.keyCode;
  226 + }
  227 + if (key.which == 84) {
  228 + toggle();
  229 + return;
  230 + }
  231 + if (s5mode) {
  232 + switch (key.which) {
  233 + case 10: // return
  234 + case 13: // enter
  235 + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
  236 + if (key.target && isParentOrSelf(key.target, 'controls')) return;
  237 + if(number != undef) {
  238 + goTo(number);
  239 + break;
  240 + }
  241 + case 32: // spacebar
  242 + case 34: // page down
  243 + case 39: // rightkey
  244 + case 40: // downkey
  245 + if(number != undef) {
  246 + go(number);
  247 + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
  248 + go(1);
  249 + } else {
  250 + subgo(1);
  251 + }
  252 + break;
  253 + case 33: // page up
  254 + case 37: // leftkey
  255 + case 38: // upkey
  256 + if(number != undef) {
  257 + go(-1 * number);
  258 + } else if (!incrementals[snum] || incpos <= 0) {
  259 + go(-1);
  260 + } else {
  261 + subgo(-1);
  262 + }
  263 + break;
  264 + case 36: // home
  265 + goTo(0);
  266 + break;
  267 + case 35: // end
  268 + goTo(smax-1);
  269 + break;
  270 + case 67: // c
  271 + showHide('k');
  272 + break;
  273 + }
  274 + if (key.which < 48 || key.which > 57) {
  275 + number = undef;
  276 + } else {
  277 + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
  278 + if (key.target && isParentOrSelf(key.target, 'controls')) return;
  279 + number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
  280 + }
  281 + }
  282 + return false;
  283 +}
  284 +
  285 +function clicker(e) {
  286 + number = undef;
  287 + var target;
  288 + if (window.event) {
  289 + target = window.event.srcElement;
  290 + e = window.event;
  291 + } else target = e.target;
  292 + if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
  293 + if (!e.which || e.which == 1) {
  294 + if (!incrementals[snum] || incpos >= incrementals[snum].length) {
  295 + go(1);
  296 + } else {
  297 + subgo(1);
  298 + }
  299 + }
  300 +}
  301 +
  302 +function findSlide(hash) {
  303 + var target = null;
  304 + var slides = GetElementsWithClassName('*','slide');
  305 + for (var i = 0; i < slides.length; i++) {
  306 + var targetSlide = slides[i];
  307 + if ( (targetSlide.name && targetSlide.name == hash)
  308 + || (targetSlide.id && targetSlide.id == hash) ) {
  309 + target = targetSlide;
  310 + break;
  311 + }
  312 + }
  313 + while(target != null && target.nodeName != 'BODY') {
  314 + if (hasClass(target, 'slide')) {
  315 + return parseInt(target.id.slice(5));
  316 + }
  317 + target = target.parentNode;
  318 + }
  319 + return null;
  320 +}
  321 +
  322 +function slideJump() {
  323 + if (window.location.hash == null) return;
  324 + var sregex = /^#slide(\d+)$/;
  325 + var matches = sregex.exec(window.location.hash);
  326 + var dest = null;
  327 + if (matches != null) {
  328 + dest = parseInt(matches[1]);
  329 + } else {
  330 + dest = findSlide(window.location.hash.slice(1));
  331 + }
  332 + if (dest != null)
  333 + go(dest - snum);
  334 +}
  335 +
  336 +function fixLinks() {
  337 + var thisUri = window.location.href;
  338 + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
  339 + var aelements = document.getElementsByTagName('A');
  340 + for (var i = 0; i < aelements.length; i++) {
  341 + var a = aelements[i].href;
  342 + var slideID = a.match('\#slide[0-9]{1,2}');
  343 + if ((slideID) && (slideID[0].slice(0,1) == '#')) {
  344 + var dest = findSlide(slideID[0].slice(1));
  345 + if (dest != null) {
  346 + if (aelements[i].addEventListener) {
  347 + aelements[i].addEventListener("click", new Function("e",
  348 + "if (document.getElementById('slideProj').disabled) return;" +
  349 + "go("+dest+" - snum); " +
  350 + "if (e.preventDefault) e.preventDefault();"), true);
  351 + } else if (aelements[i].attachEvent) {
  352 + aelements[i].attachEvent("onclick", new Function("",
  353 + "if (document.getElementById('slideProj').disabled) return;" +
  354 + "go("+dest+" - snum); " +
  355 + "event.returnValue = false;"));
  356 + }
  357 + }
  358 + }
  359 + }
  360 +}
  361 +
  362 +function externalLinks() {
  363 + if (!document.getElementsByTagName) return;
  364 + var anchors = document.getElementsByTagName('a');
  365 + for (var i=0; i<anchors.length; i++) {
  366 + var anchor = anchors[i];
  367 + if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
  368 + anchor.target = '_blank';
  369 + addClass(anchor,'external');
  370 + }
  371 + }
  372 +}
  373 +
  374 +function createControls() {
  375 + var controlsDiv = document.getElementById("controls");
  376 + if (!controlsDiv) return;
  377 + var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
  378 + var hideDiv, hideList = '';
  379 + if (controlVis == 'hidden') {
  380 + hideDiv = hider;
  381 + } else {
  382 + hideList = hider;
  383 + }
  384 + controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
  385 + '<div id="navLinks">' +
  386 + '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
  387 + '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
  388 + '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
  389 + '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
  390 + '<\/div><\/form>';
  391 + if (controlVis == 'hidden') {
  392 + var hidden = document.getElementById('navLinks');
  393 + } else {
  394 + var hidden = document.getElementById('jumplist');
  395 + }
  396 + addClass(hidden,'hideme');
  397 +}
  398 +
  399 +function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
  400 + if (!s5mode) return false;
  401 + var vScale = 22; // both yield 32 (after rounding) at 1024x768
  402 + var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
  403 + if (window.innerHeight) {
  404 + var vSize = window.innerHeight;
  405 + var hSize = window.innerWidth;
  406 + } else if (document.documentElement.clientHeight) {
  407 + var vSize = document.documentElement.clientHeight;
  408 + var hSize = document.documentElement.clientWidth;
  409 + } else if (document.body.clientHeight) {
  410 + var vSize = document.body.clientHeight;
  411 + var hSize = document.body.clientWidth;
  412 + } else {
  413 + var vSize = 700; // assuming 1024x768, minus chrome and such
  414 + var hSize = 1024; // these do not account for kiosk mode or Opera Show
  415 + }
  416 + var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
  417 + fontSize(newSize + 'px');
  418 + if (isGe) { // hack to counter incremental reflow bugs
  419 + var obj = document.getElementsByTagName('body')[0];
  420 + obj.style.display = 'none';
  421 + obj.style.display = 'block';
  422 + }
  423 +}
  424 +
  425 +function fontSize(value) {
  426 + if (!(s5ss = document.getElementById('s5ss'))) {
  427 + if (!isIE) {
  428 + document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
  429 + s5ss.setAttribute('media','screen, projection');
  430 + s5ss.setAttribute('id','s5ss');
  431 + } else {
  432 + document.createStyleSheet();
  433 + document.s5ss = document.styleSheets[document.styleSheets.length - 1];
  434 + }
  435 + }
  436 + if (!isIE) {
  437 + while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
  438 + s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
  439 + } else {
  440 + document.s5ss.addRule('body','font-size: ' + value + ' !important;');
  441 + }
  442 +}
  443 +
  444 +function notOperaFix() {
  445 + slideCSS = document.getElementById('slideProj').href;
  446 + var slides = document.getElementById('slideProj');
  447 + var outline = document.getElementById('outlineStyle');
  448 + slides.setAttribute('media','screen');
  449 + outline.disabled = true;
  450 + if (isGe) {
  451 + slides.setAttribute('href','null'); // Gecko fix
  452 + slides.setAttribute('href',slideCSS); // Gecko fix
  453 + }
  454 + if (isIE && document.styleSheets && document.styleSheets[0]) {
  455 + document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
  456 + document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
  457 + document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
  458 + }
  459 +}
  460 +
  461 +function getIncrementals(obj) {
  462 + var incrementals = new Array();
  463 + if (!obj)
  464 + return incrementals;
  465 + var children = obj.childNodes;
  466 + for (var i = 0; i < children.length; i++) {
  467 + var child = children[i];
  468 + if (hasClass(child, 'incremental')) {
  469 + if (child.nodeName == 'OL' || child.nodeName == 'UL') {
  470 + removeClass(child, 'incremental');
  471 + for (var j = 0; j < child.childNodes.length; j++) {
  472 + if (child.childNodes[j].nodeType == 1) {
  473 + addClass(child.childNodes[j], 'incremental');
  474 + }
  475 + }
  476 + } else {
  477 + incrementals[incrementals.length] = child;
  478 + removeClass(child,'incremental');
  479 + }
  480 + }
  481 + if (hasClass(child, 'show-first')) {
  482 + if (child.nodeName == 'OL' || child.nodeName == 'UL') {
  483 + removeClass(child, 'show-first');
  484 + if (child.childNodes[isGe].nodeType == 1) {
  485 + removeClass(child.childNodes[isGe], 'incremental');
  486 + }
  487 + } else {
  488 + incrementals[incrementals.length] = child;
  489 + }
  490 + }
  491 + incrementals = incrementals.concat(getIncrementals(child));
  492 + }
  493 + return incrementals;
  494 +}
  495 +
  496 +function createIncrementals() {
  497 + var incrementals = new Array();
  498 + for (var i = 0; i < smax; i++) {
  499 + incrementals[i] = getIncrementals(document.getElementById('slide'+i));
  500 + }
  501 + return incrementals;
  502 +}
  503 +
  504 +function defaultCheck() {
  505 + var allMetas = document.getElementsByTagName('meta');
  506 + for (var i = 0; i< allMetas.length; i++) {
  507 + if (allMetas[i].name == 'defaultView') {
  508 + defaultView = allMetas[i].content;
  509 + }
  510 + if (allMetas[i].name == 'controlVis') {
  511 + controlVis = allMetas[i].content;
  512 + }
  513 + }
  514 +}
  515 +
  516 +// Key trap fix, new function body for trap()
  517 +function trap(e) {
  518 + if (!e) {
  519 + e = event;
  520 + e.which = e.keyCode;
  521 + }
  522 + try {
  523 + modifierKey = e.ctrlKey || e.altKey || e.metaKey;
  524 + }
  525 + catch(e) {
  526 + modifierKey = false;
  527 + }
  528 + return modifierKey || e.which == 0;
  529 +}
  530 +
  531 +function startup() {
  532 + defaultCheck();
  533 + if (!isOp)
  534 + createControls();
  535 + slideLabel();
  536 + fixLinks();
  537 + externalLinks();
  538 + fontScale();
  539 + if (!isOp) {
  540 + notOperaFix();
  541 + incrementals = createIncrementals();
  542 + slideJump();
  543 + if (defaultView == 'outline') {
  544 + toggle();
  545 + }
  546 + document.onkeyup = keys;
  547 + document.onkeypress = trap;
  548 + document.onclick = clicker;
  549 + }
  550 +}
  551 +
  552 +window.onload = startup;
  553 +window.onresize = function(){setTimeout('fontScale()', 50);}
43 examples/presentation/layouts/presentation.rhtml
... ... @@ -0,0 +1,43 @@
  1 +---
  2 +extension: html
  3 +filter:
  4 + - erb
  5 +---
  6 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  7 + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  8 +
  9 +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
  10 +<head>
  11 + <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  12 + <title><%= h(@page.title) %></title>
  13 + <meta name="author" content="<%= h(@page.author) %>" />
  14 + <meta name="company" content="<%= h(@page.company) %>" />
  15 +
  16 + <!-- configuration parameters -->
  17 + <meta name="defaultView" content="slideshow" />
  18 + <meta name="controlVis" content="hidden" />
  19 +
  20 + <link rel="stylesheet" href="s5/slides.css" type="text/css" media="projection" id="slideProj" />
  21 + <link rel="stylesheet" href="s5/outline.css" type="text/css" media="screen" id="outlineStyle" />
  22 + <link rel="stylesheet" href="/css/uv/twilight.css" type="text/css" media="screen, projection" />
  23 +
  24 + <!-- S5 JS -->
  25 + <script src="s5/slides.js" type="text/javascript"></script>
  26 +</head>
  27 +<body>
  28 +
  29 +<div class="layout">
  30 + <div id="controls"><!-- DO NOT EDIT --></div>
  31 + <div id="currentSlide"><!-- DO NOT EDIT --></div>
  32 + <div id="header"></div>
  33 + <div id="footer">
  34 + <h2>Copyright &copy; <%= h(@page.copyright) %></h2>
  35 + </div>
  36 +</div>
  37 +
  38 +<div class="presentation">
  39 + <%= @content %>
  40 +</div>
  41 +
  42 +</body>
  43 +</html>
71 examples/presentation/tasks/blog.rake
... ... @@ -0,0 +1,71 @@
  1 +
  2 +namespace :blog do
  3 +
  4 + # iterate over all the files in the "templates/blog" folder and create a
  5 + # rake task corresponding to each file found
  6 + FileList["#{Webby.site.template_dir}/blog/*"].each do |template|
  7 + next unless test(?f, template)
  8 + name = template.pathmap('%n')
  9 + next if name =~ %r/^(month|year)$/ # skip month/year blog entries
  10 +
  11 + desc "Create a new blog #{name}"
  12 + task name => [:create_year_index, :create_month_index] do |t|
  13 + page, title, dir = Webby::Builder.new_page_info(t)
  14 +
  15 + # if no directory was given use the default blog directory (underneath
  16 + # the content directory)
  17 + dir = Webby.site.blog_dir if dir.empty?
  18 + dir = File.join(dir, Time.now.strftime('%Y/%m/%d'))
  19 +
  20 + page = File.join(dir, File.basename(page))
  21 + page = Webby::Builder.create(page, :from => template,
  22 + :locals => {:title => title, :directory => dir})
  23 + exec(::Webby.editor, page) unless ::Webby.editor.nil?
  24 + end
  25 + end # each
  26 +
  27 + # this task is used to create the year index file (blog/2008/index.txt)
  28 + task :create_year_index do |t|
  29 + # parse out information about the page to create
  30 + _, _, dir = Webby::Builder.new_page_info(t)
  31 + year = Time.now.strftime '%Y'
  32 +
  33 + # if no directory was given use the default blog directory (underneath
  34 + # the content directory)
  35 + dir = Webby.site.blog_dir if dir.empty?
  36 + dir = File.join(dir, year)
  37 +
  38 + # determine the filename and template name
  39 + fn = File.join(dir, 'index.txt')
  40 + tmpl = Dir.glob(File.join(Webby.site.template_dir, 'blog/year.*')).first.to_s
  41 +
  42 + if test(?f, tmpl) and not test(?f, File.join(Webby.site.content_dir, fn))
  43 + Webby::Builder.create(fn, :from => tmpl,
  44 + :locals => {:title => year, :directory => dir})
  45 + end
  46 + end
  47 +
  48 + # this task is used to create the month index file (blog/2008/04/index.txt)
  49 + task :create_month_index do |t|
  50 + # parse out information about the page to create
  51 + _, _, dir = Webby::Builder.new_page_info(t)
  52 + now = Time.now
  53 +
  54 + # if no directory was given use the default blog directory (underneath
  55 + # the content directory)
  56 + dir = Webby.site.blog_dir if dir.empty?
  57 + dir = File.join(dir, now.strftime('%Y/%m'))
  58 +
  59 + # determine the filename and template name
  60 + fn = File.join(dir, 'index.txt')
  61 + tmpl = Dir.glob(File.join(Webby.site.template_dir, 'blog/month.*')).first.to_s
  62 +
  63 + if test(?f, tmpl) and not test(?f, File.join(Webby.site.content_dir, fn))
  64 + Webby::Builder.create(fn, :from => tmpl,
  65 + :locals => {:title => year, :directory => dir})
  66 + end
  67 + end
  68 +
  69 +end # namespace :blog
  70 +
  71 +# EOF
27 examples/presentation/tasks/build.rake
... ... @@ -0,0 +1,27 @@
  1 +
  2 +task :configure_basepath do
  3 + Webby.site.base = ENV['BASE'] if ENV.has_key?('BASE')
  4 +end
  5 +
  6