showoff 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/README.txt +93 -0
  2. data/Rakefile +15 -0
  3. data/bin/showoff +5 -0
  4. data/lib/showoff.rb +141 -0
  5. data/public/css/fg.menu.css +114 -0
  6. data/public/css/sh_style.css +66 -0
  7. data/public/css/showoff.css +186 -0
  8. data/public/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png +0 -0
  9. data/public/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png +0 -0
  10. data/public/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png +0 -0
  11. data/public/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png +0 -0
  12. data/public/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png +0 -0
  13. data/public/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png +0 -0
  14. data/public/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png +0 -0
  15. data/public/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png +0 -0
  16. data/public/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png +0 -0
  17. data/public/css/theme/images/ui-icons_808080_256x240.png +0 -0
  18. data/public/css/theme/images/ui-icons_8DC262_256x240.png +0 -0
  19. data/public/css/theme/images/ui-icons_cd0a0a_256x240.png +0 -0
  20. data/public/css/theme/images/ui-icons_e7e6e4_256x240.png +0 -0
  21. data/public/css/theme/images/ui-icons_eeeeee_256x240.png +0 -0
  22. data/public/css/theme/images/ui-icons_ffffff_256x240.png +0 -0
  23. data/public/css/theme/ui.accordion.css +9 -0
  24. data/public/css/theme/ui.all.css +2 -0
  25. data/public/css/theme/ui.base.css +9 -0
  26. data/public/css/theme/ui.core.css +37 -0
  27. data/public/css/theme/ui.datepicker.css +62 -0
  28. data/public/css/theme/ui.dialog.css +13 -0
  29. data/public/css/theme/ui.progressbar.css +4 -0
  30. data/public/css/theme/ui.resizable.css +13 -0
  31. data/public/css/theme/ui.slider.css +17 -0
  32. data/public/css/theme/ui.tabs.css +9 -0
  33. data/public/css/theme/ui.theme.css +245 -0
  34. data/public/js/fg.menu.js +645 -0
  35. data/public/js/jTypeWriter.js +26 -0
  36. data/public/js/jquery-1.4.min.js +151 -0
  37. data/public/js/sh_lang/sh_ruby.min.js +1 -0
  38. data/public/js/sh_main.min.js +4 -0
  39. data/public/js/showoff.js +243 -0
  40. data/views/index.erb +57 -0
  41. metadata +123 -0
data/README.txt ADDED
@@ -0,0 +1,93 @@
1
+ ShowOff Presentation Software
2
+ =============================
3
+
4
+ ShowOff is a Sinatra web app that reads simple configuration files for a
5
+ presentation. It is sort of like a Keynote web app engine. I am using it
6
+ to do all my talks in 2010, because I have a deep hatred in my heart for
7
+ Keynote and yet it is by far the best in the field.
8
+
9
+ The idea is that you setup your slide files in section subdirectories and
10
+ then startup the showoff server in that directory. It will read in your
11
+ showoff.json file for which sections go in which order and then will give
12
+ you a URL to present from.
13
+
14
+ It can:
15
+
16
+ * show simple text
17
+ * show images
18
+ * show syntax highlighted code
19
+ * bullets with incremental advancing
20
+ * re-enact command line interactions
21
+ * call up a menu of sections/slides at any time to jump around
22
+
23
+ It might will can:
24
+
25
+ * do simple transitions (instant, fade, slide in)
26
+ * show a timer - elapsed / remaining
27
+ * perform simple animations of images moving between keyframes
28
+ * show syncronized, hidden notes on another browser (like an iphone)
29
+ * show audience questions / comments (twitter or direct)
30
+ * let audience members go back / catch up as you talk
31
+ * let audience members vote on sections (?)
32
+ * broadcast itself on Bonjour
33
+ * let audience members download slides, code samples or other supplementary material
34
+
35
+ Some of the nice things are that you can easily version control it, you
36
+ can easily move sections between presentations, and you can rearrange or
37
+ remove sections easily.
38
+
39
+ Usage
40
+ ====================
41
+
42
+ To try ShowOff, clone this repo and run ./bin/showoff, which will start
43
+ up the Sinatra server and serve the examples/ directory. Eventually this
44
+ will be gemified and you can run it in any ShowOff directory.
45
+
46
+ Real World Usage
47
+ ====================
48
+
49
+ So far, showoff has been used in the following presentations:
50
+
51
+ * LinuxConf.au 2010 - Wrangling Git - Scott Chacon
52
+ http://github.com/schacon/showoff-wrangling-git
53
+
54
+ If you use it for something, please let me know.
55
+
56
+ Future Plans
57
+ ====================
58
+
59
+ Right now it comes with an example presentation (my LinuxConf.au talk)
60
+ that will probably change or go away at some point. I would like this
61
+ to eventually be a general tool rather than having the presentation in
62
+ the showoff repo. Eventually. So you would install showoff as a gem
63
+ and then have just the presentation as your git repo (or whatever) and
64
+ run 'showoff' in the repo to start the presentation.
65
+
66
+ I really want this to evolve into a dynamic presentation software server,
67
+ that gives the audience a lot of interaction into the presentation -
68
+ helping them decide dynamically what the content of the presentation is,
69
+ ask questions without interupting the presenter, etc. I want the audience
70
+ to be able to download a dynamically generated PDF of either the actual
71
+ talk that was given, or all the available slides, plus supplementary
72
+ material. And I want the presenter (me) to be able to push each
73
+ presentation to Heroku or GitHub pages for archiving super easily.
74
+
75
+ Why Not S5 or Slidy or Slidedown?
76
+ =================================
77
+
78
+ S5 and Slidy are really cool, and I was going to use them, but mainly I wanted
79
+ something more dynamic. I wanted Slidy + Slidedown, where I could write my
80
+ slideshows in a structured format in sections, where the sections could easily
81
+ be moved around and between presentations and could be written in Markdown. I
82
+ also like the idea of having interactive presentation system and didn't need
83
+ half the features of S5/Slidy (style based print view, auto-scaling, themes,
84
+ etc).
85
+
86
+ Requirements
87
+ ============
88
+
89
+ * Ruby (duh)
90
+ * Sinatra (and thus Rack)
91
+ * BlueCloth
92
+ * Nokogiri
93
+ * Firefox or Chrome to present
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ begin
2
+ require 'mg'
3
+ rescue LoadError
4
+ abort "Please `gem install mg`"
5
+ end
6
+
7
+ class MG
8
+ # Monkey patch until http://github.com/defunkt/mg/commit/no_safe_level
9
+ # is merged and released upstream.
10
+ def spec
11
+ @spec ||= eval(File.read(gemspec))
12
+ end
13
+ end
14
+
15
+ MG.new("showoff.gemspec")
data/bin/showoff ADDED
@@ -0,0 +1,5 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
+ require 'showoff'
5
+ ShowOff.run! :host => 'localhost', :port => 9090
data/lib/showoff.rb ADDED
@@ -0,0 +1,141 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'json'
4
+ require 'nokogiri'
5
+
6
+ begin
7
+ require 'rdiscount'
8
+ rescue LoadError
9
+ require 'bluecloth'
10
+ Markdown = BlueCloth
11
+ end
12
+ require 'pp'
13
+
14
+ class ShowOff < Sinatra::Application
15
+
16
+ set :views, File.dirname(__FILE__) + '/../views'
17
+ set :public, File.dirname(__FILE__) + '/../public'
18
+ set :pres_dir, 'example'
19
+
20
+ def initialize(app=nil)
21
+ super(app)
22
+ puts dir = File.expand_path(File.join(File.dirname(__FILE__), '..'))
23
+ if Dir.pwd == dir
24
+ options.pres_dir = dir + '/example'
25
+ else
26
+ options.pres_dir = Dir.pwd
27
+ end
28
+ puts options.pres_dir
29
+ end
30
+
31
+ helpers do
32
+ def load_section_files(section)
33
+ section = File.join(options.pres_dir, section)
34
+ files = Dir.glob("#{section}/**/*").sort
35
+ pp files
36
+ files
37
+ end
38
+
39
+ def process_markdown(name, content)
40
+ slides = content.split('!SLIDE')
41
+ slides.delete('')
42
+ final = ''
43
+ if slides.size > 1
44
+ seq = 1
45
+ end
46
+ slides.each do |slide|
47
+ md = ''
48
+ lines = slide.split("\n")
49
+ classes = lines.shift
50
+ slide = lines.join("\n")
51
+ if seq
52
+ md += "<div class=\"slide #{classes}\" ref=\"#{name}/#{seq.to_s}\">\n"
53
+ seq += 1
54
+ else
55
+ md += "<div class=\"slide #{classes}\" ref=\"#{name}\">\n"
56
+ end
57
+ sl = Markdown.new(slide).to_html
58
+ sl = update_image_paths(name, sl)
59
+ md += sl
60
+ md += "</div>\n"
61
+ final += update_commandline_code(md)
62
+ end
63
+ final
64
+ end
65
+
66
+ def update_image_paths(path, slide)
67
+ paths = path.split('/')
68
+ paths.pop
69
+ path = paths.join('/')
70
+ slide.gsub(/img src=\"(.*?)\"/, 'img src="/image/' + path + '/\1"')
71
+ end
72
+
73
+ def update_commandline_code(slide)
74
+ html = Nokogiri::XML.parse(slide)
75
+
76
+ html.css('pre').each do |pre|
77
+ pre.css('code').each do |code|
78
+ out = code.text
79
+ lines = out.split("\n")
80
+ if lines.first[0, 3] == '@@@'
81
+ lang = lines.shift.gsub('@@@', '').strip
82
+ pre.set_attribute('class', 'sh_' + lang)
83
+ code.content = lines.join("\n")
84
+ end
85
+ end
86
+ end
87
+
88
+ html.css('.commandline > pre > code').each do |code|
89
+ out = code.text
90
+ lines = out.split(/^\$(.*?)$/)
91
+ lines.delete('')
92
+ code.content = ''
93
+ while(lines.size > 0) do
94
+ command = lines.shift
95
+ result = lines.shift
96
+ c = Nokogiri::XML::Node.new('code', html)
97
+ c.set_attribute('class', 'command')
98
+ c.content = '$' + command
99
+ code << c
100
+ c = Nokogiri::XML::Node.new('code', html)
101
+ c.set_attribute('class', 'result')
102
+ c.content = result
103
+ code << c
104
+ end
105
+ end
106
+ html.root.to_s
107
+ end
108
+ end
109
+
110
+ get '/' do
111
+ erb :index
112
+ end
113
+
114
+ get '/image/*' do
115
+ img_file = params[:splat].join('/')
116
+ img = File.join(options.pres_dir, img_file)
117
+ send_file img
118
+ end
119
+
120
+ get '/slides' do
121
+ index = File.join(options.pres_dir, 'showoff.json')
122
+ files = []
123
+ if File.exists?(index)
124
+ order = JSON.parse(File.read(index))
125
+ order = order.map { |s| s['section'] }
126
+ order.each do |section|
127
+ files << load_section_files(section)
128
+
129
+ end
130
+ files = files.flatten
131
+ files = files.select { |f| f =~ /.md/ }
132
+ data = ''
133
+ files.each do |f|
134
+ fname = f.gsub(options.pres_dir + '/', '').gsub('.md', '')
135
+ data += process_markdown(fname, File.read(f))
136
+ end
137
+ end
138
+ data
139
+ end
140
+
141
+ end
@@ -0,0 +1,114 @@
1
+ /* Styles for jQuery menu widget
2
+ Author: Maggie Wachs, maggie@filamentgroup.com
3
+ Date: September 2008
4
+ */
5
+
6
+
7
+ /* REQUIRED STYLES - the menus will only render correctly with these rules */
8
+
9
+ .fg-menu-container { position: absolute; top:0; left:-999px; padding: .4em; overflow: hidden; }
10
+ .fg-menu-container.fg-menu-flyout { overflow: visible; }
11
+
12
+ .fg-menu, .fg-menu ul { list-style-type:none; padding: 0; margin:0; }
13
+
14
+ .fg-menu { position:relative; }
15
+ .fg-menu-flyout .fg-menu { position:static; }
16
+
17
+ .fg-menu ul { position:absolute; top:0; }
18
+ .fg-menu ul ul { top:-1px; }
19
+
20
+ .fg-menu-container.fg-menu-ipod .fg-menu-content,
21
+ .fg-menu-container.fg-menu-ipod .fg-menu-content ul { background: none !important; }
22
+
23
+ .fg-menu.fg-menu-scroll,
24
+ .fg-menu ul.fg-menu-scroll { overflow: scroll; overflow-x: hidden; }
25
+
26
+ .fg-menu li { clear:both; float:left; width:100%; margin: 0; padding:0; border: 0; }
27
+ .fg-menu li li { font-size:1em; } /* inner li font size must be reset so that they don't blow up */
28
+
29
+ .fg-menu-flyout ul ul { padding: .4em; }
30
+ .fg-menu-flyout li { position:relative; }
31
+
32
+ .fg-menu-scroll { overflow: scroll; overflow-x: hidden; }
33
+
34
+ .fg-menu-breadcrumb { margin: 0; padding: 0; }
35
+
36
+ .fg-menu-footer { margin-top: .4em; padding: .4em; }
37
+ .fg-menu-header { margin-bottom: .4em; padding: .4em; }
38
+
39
+ .fg-menu-breadcrumb li { float: left; list-style: none; margin: 0; padding: 0 .2em; font-size: .9em; opacity: .7; }
40
+ .fg-menu-breadcrumb li.fg-menu-prev-list,
41
+ .fg-menu-breadcrumb li.fg-menu-current-crumb { clear: left; float: none; opacity: 1; }
42
+ .fg-menu-breadcrumb li.fg-menu-current-crumb { padding-top: .2em; }
43
+
44
+ .fg-menu-breadcrumb a,
45
+ .fg-menu-breadcrumb span { float: left; }
46
+
47
+ .fg-menu-footer a:link,
48
+ .fg-menu-footer a:visited { float:left; width:100%; text-decoration: none; }
49
+ .fg-menu-footer a:hover,
50
+ .fg-menu-footer a:active { }
51
+
52
+ .fg-menu-footer a span { float:left; cursor: pointer; }
53
+
54
+ .fg-menu-breadcrumb .fg-menu-prev-list a:link,
55
+ .fg-menu-breadcrumb .fg-menu-prev-list a:visited,
56
+ .fg-menu-breadcrumb .fg-menu-prev-list a:hover,
57
+ .fg-menu-breadcrumb .fg-menu-prev-list a:active { background-image: none; text-decoration:none; }
58
+
59
+ .fg-menu-breadcrumb .fg-menu-prev-list a { float: left; padding-right: .4em; }
60
+ .fg-menu-breadcrumb .fg-menu-prev-list a .ui-icon { float: left; }
61
+
62
+ .fg-menu-breadcrumb .fg-menu-current-crumb a:link,
63
+ .fg-menu-breadcrumb .fg-menu-current-crumb a:visited,
64
+ .fg-menu-breadcrumb .fg-menu-current-crumb a:hover,
65
+ .fg-menu-breadcrumb .fg-menu-current-crumb a:active { display:block; background-image:none; font-size:1.3em; text-decoration:none; }
66
+
67
+
68
+
69
+ /* REQUIRED LINK STYLES: links are "display:block" by default; if the menu options are split into
70
+ selectable node links and 'next' links, the script floats the node links left and floats the 'next' links to the right */
71
+
72
+ .fg-menu a:link,
73
+ .fg-menu a:visited,
74
+ .fg-menu a:hover,
75
+ .fg-menu a:active { float:left; width:92%; padding:.3em 3%; text-decoration:none; outline: 0 !important; }
76
+
77
+ .fg-menu a { border: 1px dashed transparent; }
78
+
79
+ .fg-menu a.ui-state-default:link,
80
+ .fg-menu a.ui-state-default:visited,
81
+ .fg-menu a.ui-state-default:hover,
82
+ .fg-menu a.ui-state-default:active,
83
+ .fg-menu a.ui-state-hover:link,
84
+ .fg-menu a.ui-state-hover:visited,
85
+ .fg-menu a.ui-state-hover:hover,
86
+ .fg-menu a.ui-state-hover:active,
87
+ .fg-menu a.ui-state-active:link,
88
+ .fg-menu a.ui-state-active:visited,
89
+ .fg-menu a.ui-state-active:hover,
90
+ .fg-menu a.ui-state-active:active { border-style: solid; font-weight: normal; }
91
+
92
+ .fg-menu a span { display:block; cursor:pointer; }
93
+
94
+
95
+ /* SUGGESTED STYLES - for use with jQuery UI Themeroller CSS */
96
+
97
+ .fg-menu-indicator span { float:left; }
98
+ .fg-menu-indicator span.ui-icon { float:right; }
99
+
100
+ .fg-menu-content.ui-widget-content,
101
+ .fg-menu-content ul.ui-widget-content { border:0; }
102
+
103
+
104
+ /* ICONS AND DIVIDERS */
105
+
106
+ .fg-menu.fg-menu-has-icons a:link,
107
+ .fg-menu.fg-menu-has-icons a:visited,
108
+ .fg-menu.fg-menu-has-icons a:hover,
109
+ .fg-menu.fg-menu-has-icons a:active { padding-left:20px; }
110
+
111
+ .fg-menu .horizontal-divider hr, .fg-menu .horizontal-divider span { padding:0; margin:5px .6em; }
112
+ .fg-menu .horizontal-divider hr { border:0; height:1px; }
113
+ .fg-menu .horizontal-divider span { font-size:.9em; text-transform: uppercase; padding-left:.2em; }
114
+
@@ -0,0 +1,66 @@
1
+ pre.sh_sourceCode {
2
+ background-color: white;
3
+ color: black;
4
+ font-style: normal;
5
+ font-weight: normal;
6
+ }
7
+
8
+ pre.sh_sourceCode .sh_keyword { color: blue; font-weight: bold; } /* language keywords */
9
+ pre.sh_sourceCode .sh_type { color: darkgreen; } /* basic types */
10
+ pre.sh_sourceCode .sh_usertype { color: teal; } /* user defined types */
11
+ pre.sh_sourceCode .sh_string { color: red; font-family: monospace; } /* strings and chars */
12
+ pre.sh_sourceCode .sh_regexp { color: orange; font-family: monospace; } /* regular expressions */
13
+ pre.sh_sourceCode .sh_specialchar { color: pink; font-family: monospace; } /* e.g., \n, \t, \\ */
14
+ pre.sh_sourceCode .sh_comment { color: brown; font-style: italic; } /* comments */
15
+ pre.sh_sourceCode .sh_number { color: purple; } /* literal numbers */
16
+ pre.sh_sourceCode .sh_preproc { color: darkblue; font-weight: bold; } /* e.g., #include, import */
17
+ pre.sh_sourceCode .sh_symbol { color: darkred; } /* e.g., <, >, + */
18
+ pre.sh_sourceCode .sh_function { color: black; font-weight: bold; } /* function calls and declarations */
19
+ pre.sh_sourceCode .sh_cbracket { color: red; } /* block brackets (e.g., {, }) */
20
+ pre.sh_sourceCode .sh_todo { font-weight: bold; background-color: cyan; } /* TODO and FIXME */
21
+
22
+ /* Predefined variables and functions (for instance glsl) */
23
+ pre.sh_sourceCode .sh_predef_var { color: darkblue; }
24
+ pre.sh_sourceCode .sh_predef_func { color: darkblue; font-weight: bold; }
25
+
26
+ /* for OOP */
27
+ pre.sh_sourceCode .sh_classname { color: teal; }
28
+
29
+ /* line numbers (not yet implemented) */
30
+ pre.sh_sourceCode .sh_linenum { color: black; font-family: monospace; }
31
+
32
+ /* Internet related */
33
+ pre.sh_sourceCode .sh_url { color: blue; text-decoration: underline; font-family: monospace; }
34
+
35
+ /* for ChangeLog and Log files */
36
+ pre.sh_sourceCode .sh_date { color: blue; font-weight: bold; }
37
+ pre.sh_sourceCode .sh_time, pre.sh_sourceCode .sh_file { color: darkblue; font-weight: bold; }
38
+ pre.sh_sourceCode .sh_ip, pre.sh_sourceCode .sh_name { color: darkgreen; }
39
+
40
+ /* for Prolog, Perl... */
41
+ pre.sh_sourceCode .sh_variable { color: darkgreen; }
42
+
43
+ /* for LaTeX */
44
+ pre.sh_sourceCode .sh_italics { color: darkgreen; font-style: italic; }
45
+ pre.sh_sourceCode .sh_bold { color: darkgreen; font-weight: bold; }
46
+ pre.sh_sourceCode .sh_underline { color: darkgreen; text-decoration: underline; }
47
+ pre.sh_sourceCode .sh_fixed { color: green; font-family: monospace; }
48
+ pre.sh_sourceCode .sh_argument { color: darkgreen; }
49
+ pre.sh_sourceCode .sh_optionalargument { color: purple; }
50
+ pre.sh_sourceCode .sh_math { color: orange; }
51
+ pre.sh_sourceCode .sh_bibtex { color: blue; }
52
+
53
+ /* for diffs */
54
+ pre.sh_sourceCode .sh_oldfile { color: orange; }
55
+ pre.sh_sourceCode .sh_newfile { color: darkgreen; }
56
+ pre.sh_sourceCode .sh_difflines { color: blue; }
57
+
58
+ /* for css */
59
+ pre.sh_sourceCode .sh_selector { color: purple; }
60
+ pre.sh_sourceCode .sh_property { color: blue; }
61
+ pre.sh_sourceCode .sh_value { color: darkgreen; font-style: italic; }
62
+
63
+ /* other */
64
+ pre.sh_sourceCode .sh_section { color: black; font-weight: bold; }
65
+ pre.sh_sourceCode .sh_paren { color: red; }
66
+ pre.sh_sourceCode .sh_attribute { color: darkgreen; }
@@ -0,0 +1,186 @@
1
+ body { font-family: "Gill Sans", Helvetica, Arial, sans-serif; }
2
+
3
+ #preso {
4
+ margin: 0;
5
+ padding: 0;
6
+ width: 1000px;
7
+ height: 730px;
8
+ margin-left:auto;
9
+ margin-right:auto;
10
+ overflow:hidden;
11
+ }
12
+ #footer {
13
+ background: #eee;
14
+ margin: 0;
15
+ padding: 3px;
16
+ width: 1000px;
17
+ height: 30px;
18
+ margin-left:auto;
19
+ margin-right:auto;
20
+ }
21
+
22
+ .slide {
23
+ border: 1px solid #fff;
24
+ }
25
+
26
+ .center img {
27
+ display:block;
28
+ margin-left:auto;
29
+ margin-right:auto;
30
+ }
31
+
32
+ .bullets ul {
33
+ display: block;
34
+ height: 600px;
35
+ font-size: 3em;
36
+ list-style: none;
37
+ margin-left: 0;
38
+ padding-left: 1em;
39
+ text-indent: -1em;
40
+ }
41
+ .bullets ul li {
42
+ text-align: center;
43
+ padding: 25px;
44
+ }
45
+
46
+ .smbullets ul {
47
+ display: block;
48
+ height: 600px;
49
+ font-size: 2em;
50
+ list-style: none;
51
+ margin-left: 0;
52
+ padding-left: 1em;
53
+ text-indent: -1em;
54
+ }
55
+ .smbullets ul li {
56
+ text-align: center;
57
+ padding: 10px;
58
+ }
59
+
60
+ .commandline pre {
61
+ font-size: 2em;
62
+ }
63
+
64
+ .commandline code.command {
65
+ color: #000;
66
+ }
67
+
68
+ .commandline code.result {
69
+ color: #444;
70
+ }
71
+
72
+ .command h1 {
73
+ white-space: pre;
74
+ font-family: monospace;
75
+ font-size: 3em;
76
+ }
77
+
78
+ .code {
79
+ white-space: pre;
80
+ font-family: monospace;
81
+ }
82
+
83
+ .subsection {
84
+ background: #008;
85
+ color: #fff;
86
+ }
87
+
88
+ .small {
89
+ font-size: 80%;
90
+ }
91
+
92
+ .smaller {
93
+ font-size: 70%;
94
+ }
95
+
96
+ h1 { font-size: 5em; font-weight: normal; text-align: center;}
97
+ h2 { font-size: 3em; font-weight: normal; text-align: center; }
98
+ h3 { font-size: 2em; font-weight: normal; text-align: center; }
99
+
100
+ pre { margin-left: 40px; font-size: 2.8em; }
101
+
102
+ .hidden { position:absolute; top:0; left:-9999px; width:1px; height:1px; overflow:hidden; }
103
+ #debugInfo { margin-left: 30px; }
104
+
105
+ #help {
106
+ background: #9f9;
107
+ position: absolute;
108
+ right: 80px;
109
+ display: none;
110
+ }
111
+ #help table tr td.key {
112
+ text-align: right;
113
+ border-right: 2px solid #8b8;
114
+ padding-right: 4px;
115
+ font-weight: bold;
116
+ }
117
+
118
+ .fg-button { clear:left; margin:0 4px 40px 20px; padding: .4em 1em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }
119
+ .fg-button .ui-icon { position: absolute; top: 50%; margin-top: -8px; left: 50%; margin-left: -8px; }
120
+ a.fg-button { float:left; }
121
+ .fg-button-icon-right { padding-right: 2.1em; }
122
+ .fg-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; }
123
+
124
+ .fg-button.ui-state-loading .ui-icon { background: url(spinner_bar.gif) no-repeat 0 0; }
125
+
126
+ #navmenu { position: absolute; top: 10px; left: 10px; width: 50px; }
127
+
128
+ .code .c { color: #999988; font-style: italic } /* Comment */
129
+ .code .err { color: #a61717; background-color: #e3d2d2 } /* Error */
130
+ .code .k { font-weight: bold } /* Keyword */
131
+ .code .o { font-weight: bold } /* Operator */
132
+ .code .cm { color: #999988; font-style: italic } /* Comment.Multiline */
133
+ .code .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
134
+ .code .c1 { color: #999988; font-style: italic } /* Comment.Single */
135
+ .code .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
136
+ .code .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
137
+ .code .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
138
+ .code .ge { font-style: italic } /* Generic.Emph */
139
+ .code .gr { color: #aa0000 } /* Generic.Error */
140
+ .code .gh { color: #999999 } /* Generic.Heading */
141
+ .code .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
142
+ .code .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
143
+ .code .go { color: #888888 } /* Generic.Output */
144
+ .code .gp { color: #555555 } /* Generic.Prompt */
145
+ .code .gs { font-weight: bold } /* Generic.Strong */
146
+ .code .gu { color: #aaaaaa } /* Generic.Subheading */
147
+ .code .gt { color: #aa0000 } /* Generic.Traceback */
148
+ .code .kc { font-weight: bold } /* Keyword.Constant */
149
+ .code .kd { font-weight: bold } /* Keyword.Declaration */
150
+ .code .kp { font-weight: bold } /* Keyword.Pseudo */
151
+ .code .kr { font-weight: bold } /* Keyword.Reserved */
152
+ .code .kt { color: #445588; font-weight: bold } /* Keyword.Type */
153
+ .code .m { color: #009999 } /* Literal.Number */
154
+ .code .s { color: #d14 } /* Literal.String */
155
+ .code .na { color: #008080 } /* Name.Attribute */
156
+ .code .nb { color: #0086B3 } /* Name.Builtin */
157
+ .code .nc { color: #445588; font-weight: bold } /* Name.Class */
158
+ .code .no { color: #008080 } /* Name.Constant */
159
+ .code .ni { color: #800080 } /* Name.Entity */
160
+ .code .ne { color: #990000; font-weight: bold } /* Name.Exception */
161
+ .code .nf { color: #990000; font-weight: bold } /* Name.Function */
162
+ .code .nn { color: #555555 } /* Name.Namespace */
163
+ .code .nt { color: #000080 } /* Name.Tag */
164
+ .code .nv { color: #008080 } /* Name.Variable */
165
+ .code .ow { font-weight: bold } /* Operator.Word */
166
+ .code .w { color: #bbbbbb } /* Text.Whitespace */
167
+ .code .mf { color: #009999 } /* Literal.Number.Float */
168
+ .code .mh { color: #009999 } /* Literal.Number.Hex */
169
+ .code .mi { color: #009999 } /* Literal.Number.Integer */
170
+ .code .mo { color: #009999 } /* Literal.Number.Oct */
171
+ .code .sb { color: #d14 } /* Literal.String.Backtick */
172
+ .code .sc { color: #d14 } /* Literal.String.Char */
173
+ .code .sd { color: #d14 } /* Literal.String.Doc */
174
+ .code .s2 { color: #d14 } /* Literal.String.Double */
175
+ .code .se { color: #d14 } /* Literal.String.Escape */
176
+ .code .sh { color: #d14 } /* Literal.String.Heredoc */
177
+ .code .si { color: #d14 } /* Literal.String.Interpol */
178
+ .code .sx { color: #d14 } /* Literal.String.Other */
179
+ .code .sr { color: #009926 } /* Literal.String.Regex */
180
+ .code .s1 { color: #d14 } /* Literal.String.Single */
181
+ .code .ss { color: #990073 } /* Literal.String.Symbol */
182
+ .code .bp { color: #999999 } /* Name.Builtin.Pseudo */
183
+ .code .vc { color: #008080 } /* Name.Variable.Class */
184
+ .code .vg { color: #008080 } /* Name.Variable.Global */
185
+ .code .vi { color: #008080 } /* Name.Variable.Instance */
186
+ .code .il { color: #009999 } /* Literal.Number.Integer.Long */