showoff 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 */