codex 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/History.txt +8 -0
  2. data/LICENSE.txt +29 -0
  3. data/Manifest.txt +95 -0
  4. data/PostInstall.txt +5 -0
  5. data/README.txt +31 -0
  6. data/Rakefile +4 -0
  7. data/app_generators/codex/USAGE +5 -0
  8. data/app_generators/codex/codex_generator.rb +106 -0
  9. data/app_generators/codex/templates/Rakefile +54 -0
  10. data/app_generators/codex/templates/bin/build_all.rb +47 -0
  11. data/app_generators/codex/templates/bin/postprocess_all.rb +5 -0
  12. data/app_generators/codex/templates/bin/pressie.rb +7 -0
  13. data/app_generators/codex/templates/code/control/basic_continuation.rb +11 -0
  14. data/app_generators/codex/templates/code/control/cc_throw_catch.rb +59 -0
  15. data/app_generators/codex/templates/code/control/closure_continuation.rb +8 -0
  16. data/app_generators/codex/templates/code/control/closure_continuation_2.rb +12 -0
  17. data/app_generators/codex/templates/dp.SyntaxHighlighter/CSS.html +115 -0
  18. data/app_generators/codex/templates/dp.SyntaxHighlighter/CSharp.html +134 -0
  19. data/app_generators/codex/templates/dp.SyntaxHighlighter/CollapseCode.html +90 -0
  20. data/app_generators/codex/templates/dp.SyntaxHighlighter/Cpp.html +190 -0
  21. data/app_generators/codex/templates/dp.SyntaxHighlighter/CrashTest.html +108 -0
  22. data/app_generators/codex/templates/dp.SyntaxHighlighter/Delphi.html +112 -0
  23. data/app_generators/codex/templates/dp.SyntaxHighlighter/FirstLine.html +90 -0
  24. data/app_generators/codex/templates/dp.SyntaxHighlighter/Index.html +80 -0
  25. data/app_generators/codex/templates/dp.SyntaxHighlighter/Java.html +122 -0
  26. data/app_generators/codex/templates/dp.SyntaxHighlighter/JavaScript.html +112 -0
  27. data/app_generators/codex/templates/dp.SyntaxHighlighter/NoControls.html +89 -0
  28. data/app_generators/codex/templates/dp.SyntaxHighlighter/NoGutter.html +89 -0
  29. data/app_generators/codex/templates/dp.SyntaxHighlighter/PHP.html +102 -0
  30. data/app_generators/codex/templates/dp.SyntaxHighlighter/Python.html +121 -0
  31. data/app_generators/codex/templates/dp.SyntaxHighlighter/Ruby.html +131 -0
  32. data/app_generators/codex/templates/dp.SyntaxHighlighter/SQL.html +98 -0
  33. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/clipboard.swf +0 -0
  34. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCSharp.js +32 -0
  35. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCpp.js +73 -0
  36. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCss.js +52 -0
  37. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushDelphi.js +34 -0
  38. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushJScript.js +22 -0
  39. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushJava.js +28 -0
  40. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushPhp.js +60 -0
  41. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushPython.js +30 -0
  42. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushRuby.js +28 -0
  43. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushSql.js +42 -0
  44. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushVb.js +29 -0
  45. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushXml.js +70 -0
  46. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shCore.js +414 -0
  47. data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shCore.uncompressed.js +674 -0
  48. data/app_generators/codex/templates/dp.SyntaxHighlighter/ShowColumns.html +89 -0
  49. data/app_generators/codex/templates/dp.SyntaxHighlighter/SmartTabs.html +88 -0
  50. data/app_generators/codex/templates/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css +158 -0
  51. data/app_generators/codex/templates/dp.SyntaxHighlighter/Styles/TestPages.css +63 -0
  52. data/app_generators/codex/templates/dp.SyntaxHighlighter/Templates/Test.dwt +80 -0
  53. data/app_generators/codex/templates/dp.SyntaxHighlighter/VB.html +115 -0
  54. data/app_generators/codex/templates/dp.SyntaxHighlighter/XML.html +136 -0
  55. data/app_generators/codex/templates/html/all.html +0 -0
  56. data/app_generators/codex/templates/readme.txt +4 -0
  57. data/app_generators/codex/templates/slides/basics.slides +37 -0
  58. data/app_generators/codex/templates/slides/building.slides +27 -0
  59. data/app_generators/codex/templates/slides/example.slides +80 -0
  60. data/app_generators/codex/templates/slides/including_code.slides +80 -0
  61. data/app_generators/codex/templates/slides/metadata.yml +4 -0
  62. data/app_generators/codex/templates/slides/table_of_contents.slides +14 -0
  63. data/app_generators/codex/templates/ui/default/blank.gif +0 -0
  64. data/app_generators/codex/templates/ui/default/bodybg.gif +0 -0
  65. data/app_generators/codex/templates/ui/default/framing.css +23 -0
  66. data/app_generators/codex/templates/ui/default/iepngfix.htc +42 -0
  67. data/app_generators/codex/templates/ui/default/opera.css +7 -0
  68. data/app_generators/codex/templates/ui/default/outline.css +15 -0
  69. data/app_generators/codex/templates/ui/default/pretty.css +86 -0
  70. data/app_generators/codex/templates/ui/default/print.css +1 -0
  71. data/app_generators/codex/templates/ui/default/s5-core.css +9 -0
  72. data/app_generators/codex/templates/ui/default/slides.css +3 -0
  73. data/app_generators/codex/templates/ui/default/slides.js +553 -0
  74. data/bin/codex +17 -0
  75. data/codex.gemspec +30 -0
  76. data/config/hoe.rb +75 -0
  77. data/config/requirements.rb +15 -0
  78. data/lib/codex.rb +7 -0
  79. data/lib/codex/content.rb +160 -0
  80. data/lib/codex/pressie.rb +108 -0
  81. data/lib/codex/version.rb +9 -0
  82. data/lib/stylesheets/pressie.css +196 -0
  83. data/lib/stylesheets/print.css +149 -0
  84. data/lib/stylesheets/ruby.png +0 -0
  85. data/script/console +10 -0
  86. data/script/destroy +14 -0
  87. data/script/generate +14 -0
  88. data/setup.rb +1585 -0
  89. data/tasks/deployment.rake +34 -0
  90. data/tasks/environment.rake +7 -0
  91. data/tasks/website.rake +9 -0
  92. data/test/test_codex.rb +11 -0
  93. data/test/test_codex_generator.rb +78 -0
  94. data/test/test_generator_helper.rb +29 -0
  95. data/test/test_helper.rb +2 -0
  96. metadata +163 -0
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'rubigen'
5
+
6
+ if %w(-v --version).include? ARGV.first
7
+ require 'codex/version'
8
+ puts "#{File.basename($0)} #{Codex::VERSION::STRING}"
9
+ exit(0)
10
+ end
11
+
12
+ require 'rubigen/scripts/generate'
13
+ source = RubiGen::PathSource.new(:application,
14
+ File.join(File.dirname(__FILE__), "../app_generators"))
15
+ RubiGen::Base.reset_sources
16
+ RubiGen::Base.append_sources source
17
+ RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'codex')
@@ -0,0 +1,30 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{codex}
3
+ s.version = "1.0.2"
4
+
5
+ s.specification_version = 2 if s.respond_to? :specification_version=
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Dave Thomas"]
9
+ s.date = %q{2008-05-19}
10
+ s.default_executable = %q{codex}
11
+ s.description = %q{Simple tool for creating source-code intensive presentations and courses}
12
+ s.email = ["dave@pragprog.com"]
13
+ s.executables = ["codex"]
14
+ s.extra_rdoc_files = ["History.txt", "LICENSE.txt", "Manifest.txt", "PostInstall.txt", "README.txt", "app_generators/codex/templates/readme.txt"]
15
+ s.files = ["History.txt", "LICENSE.txt", "Manifest.txt", "PostInstall.txt", "README.txt", "Rakefile", "app_generators/codex/USAGE", "app_generators/codex/codex_generator.rb", "app_generators/codex/templates/Rakefile", "app_generators/codex/templates/bin/build_all.rb", "app_generators/codex/templates/bin/postprocess_all.rb", "app_generators/codex/templates/bin/pressie.rb", "app_generators/codex/templates/code/control/basic_continuation.rb", "app_generators/codex/templates/code/control/cc_throw_catch.rb", "app_generators/codex/templates/code/control/closure_continuation.rb", "app_generators/codex/templates/code/control/closure_continuation_2.rb", "app_generators/codex/templates/dp.SyntaxHighlighter/CSS.html", "app_generators/codex/templates/dp.SyntaxHighlighter/CSharp.html", "app_generators/codex/templates/dp.SyntaxHighlighter/CollapseCode.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Cpp.html", "app_generators/codex/templates/dp.SyntaxHighlighter/CrashTest.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Delphi.html", "app_generators/codex/templates/dp.SyntaxHighlighter/FirstLine.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Index.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Java.html", "app_generators/codex/templates/dp.SyntaxHighlighter/JavaScript.html", "app_generators/codex/templates/dp.SyntaxHighlighter/NoControls.html", "app_generators/codex/templates/dp.SyntaxHighlighter/NoGutter.html", "app_generators/codex/templates/dp.SyntaxHighlighter/PHP.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Python.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Ruby.html", "app_generators/codex/templates/dp.SyntaxHighlighter/SQL.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/clipboard.swf", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCSharp.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCpp.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCss.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushDelphi.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushJScript.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushJava.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushPhp.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushPython.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushRuby.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushSql.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushVb.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushXml.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shCore.js", "app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shCore.uncompressed.js", "app_generators/codex/templates/dp.SyntaxHighlighter/ShowColumns.html", "app_generators/codex/templates/dp.SyntaxHighlighter/SmartTabs.html", "app_generators/codex/templates/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css", "app_generators/codex/templates/dp.SyntaxHighlighter/Styles/TestPages.css", "app_generators/codex/templates/dp.SyntaxHighlighter/Templates/Test.dwt", "app_generators/codex/templates/dp.SyntaxHighlighter/VB.html", "app_generators/codex/templates/dp.SyntaxHighlighter/XML.html", "app_generators/codex/templates/html/all.html", "app_generators/codex/templates/readme.txt", "app_generators/codex/templates/slides/basics.slides", "app_generators/codex/templates/slides/building.slides", "app_generators/codex/templates/slides/example.slides", "app_generators/codex/templates/slides/including_code.slides", "app_generators/codex/templates/slides/metadata.yml", "app_generators/codex/templates/slides/table_of_contents.slides", "app_generators/codex/templates/ui/default/blank.gif", "app_generators/codex/templates/ui/default/bodybg.gif", "app_generators/codex/templates/ui/default/framing.css", "app_generators/codex/templates/ui/default/iepngfix.htc", "app_generators/codex/templates/ui/default/opera.css", "app_generators/codex/templates/ui/default/outline.css", "app_generators/codex/templates/ui/default/pretty.css", "app_generators/codex/templates/ui/default/print.css", "app_generators/codex/templates/ui/default/s5-core.css", "app_generators/codex/templates/ui/default/slides.css", "app_generators/codex/templates/ui/default/slides.js", "bin/codex", "codex.gemspec", "config/hoe.rb", "config/requirements.rb", "lib/codex.rb", "lib/codex/content.rb", "lib/codex/pressie.rb", "lib/codex/version.rb", "lib/stylesheets/pressie.css", "lib/stylesheets/print.css", "lib/stylesheets/ruby.png", "script/console", "script/destroy", "script/generate", "setup.rb", "tasks/deployment.rake", "tasks/environment.rake", "tasks/website.rake", "test/test_codex.rb", "test/test_codex_generator.rb", "test/test_generator_helper.rb", "test/test_helper.rb"]
16
+ s.has_rdoc = true
17
+ s.homepage = %q{http://codex.rubyforge.org}
18
+ s.post_install_message = %q{
19
+ To create new presentations:
20
+
21
+ codex path/to/presentation/folder
22
+
23
+ }
24
+ s.rdoc_options = ["--main", "README.txt"]
25
+ s.require_paths = ["lib"]
26
+ s.rubyforge_project = %q{codex}
27
+ s.rubygems_version = %q{1.1.1}
28
+ s.summary = %q{Simple tool for creating source-code intensive presentations and courses}
29
+ s.test_files = ["test/test_codex.rb", "test/test_codex_generator.rb", "test/test_generator_helper.rb", "test/test_helper.rb"]
30
+ end
@@ -0,0 +1,75 @@
1
+ require 'codex/version'
2
+
3
+ AUTHOR = 'Dave Thomas' # can also be an array of Authors
4
+ EMAIL = "dave@pragprog.com"
5
+ DESCRIPTION = "Simple tool for creating source-code intensive presentations and courses"
6
+ GEM_NAME = 'codex' # what ppl will type to install your gem
7
+ RUBYFORGE_PROJECT = 'codex' # The unix name for your project
8
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+ EXTRA_DEPENDENCIES = [
11
+ ['rake', '>= 0.8.1'],
12
+ ['RedCloth', '>= 3.0.4'],
13
+ ['rubigen', '>=1.3.2']
14
+ ] # An array of rubygem dependencies [name, version]
15
+
16
+ @config_file = "~/.rubyforge/user-config.yml"
17
+ @config = nil
18
+ RUBYFORGE_USERNAME = "unknown"
19
+ def rubyforge_username
20
+ unless @config
21
+ begin
22
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
23
+ rescue
24
+ puts <<-EOS
25
+ ERROR: No rubyforge config file found: #{@config_file}
26
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
27
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
28
+ EOS
29
+ exit
30
+ end
31
+ end
32
+ RUBYFORGE_USERNAME.replace @config["username"]
33
+ end
34
+
35
+
36
+ REV = nil
37
+ # UNCOMMENT IF REQUIRED:
38
+ # REV = YAML.load(`svn info`)['Revision']
39
+ VERS = Codex::VERSION::STRING + (REV ? ".#{REV}" : "")
40
+ RDOC_OPTS = ['--quiet', '--title', 'codex documentation',
41
+ "--opname", "index.html",
42
+ "--line-numbers",
43
+ "--main", "README",
44
+ "--inline-source"]
45
+
46
+ class Hoe
47
+ def extra_deps
48
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
49
+ @extra_deps
50
+ end
51
+ end
52
+
53
+ # Generate all the Rake tasks
54
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
55
+ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
56
+ p.developer(AUTHOR, EMAIL)
57
+ p.description = DESCRIPTION
58
+ p.summary = DESCRIPTION
59
+ p.url = HOMEPATH
60
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
61
+ p.test_globs = ["test/**/test_*.rb"]
62
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
63
+
64
+ # == Optional
65
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
66
+ #p.extra_deps = EXTRA_DEPENDENCIES
67
+
68
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
69
+ end
70
+
71
+ CHANGES = $hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
72
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
73
+ $hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
74
+ $hoe.rsync_args = '-av --delete --ignore-errors'
75
+ $hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
@@ -0,0 +1,7 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module Codex; end
5
+
6
+ require 'codex/content'
7
+ require 'codex/pressie'
@@ -0,0 +1,160 @@
1
+ require 'redcloth'
2
+
3
+ class Codex::Content
4
+
5
+ # Wrap the parameters to :code
6
+ #
7
+ # :code file.rb[:part class=xxx]
8
+ class Descriptor
9
+ attr_reader :file_name, :part
10
+ attr_reader :css_class
11
+ attr_reader :lang
12
+
13
+ def initialize(string)
14
+ @css_class = "code-normal"
15
+ @lang = "ruby"
16
+
17
+ if string && string =~ /(.*?)\[(.*)\]/
18
+ @file_name = $1
19
+ parse_params($2.dup)
20
+ else
21
+ @file_name = string
22
+ end
23
+ end
24
+
25
+ def parse_params(params)
26
+ params.split.each do |param|
27
+ if param =~ /(.*?)=(.*)/
28
+ case $1
29
+ when "class"
30
+ @css_class = $2
31
+ when "lang"
32
+ @lang = $2
33
+ else
34
+ fail "Unknown parameter #{$1} in '#{params}'"
35
+ end
36
+ else
37
+ @part = param
38
+ end
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ START_SLIDE = %{<div class="slide">\n}
45
+ END_SLIDE = %{</div>\n}
46
+ BETWEEN_SLIDES = END_SLIDE + "\n" + START_SLIDE
47
+
48
+ CODE_PATTERN = /^:code\s+(.+)/
49
+
50
+ # Temporarily prepended to lines of incldued code to stop them being processed
51
+ # as Textfile
52
+
53
+ INCLUDED_CODE_PREFIX = "XXX\001"
54
+ INCLUDED_CODE_PREFIX_REGEXP = /#{INCLUDED_CODE_PREFIX}/mo
55
+
56
+
57
+ def initialize(original)
58
+ @original = original.sub(/__END__.*/m, '').gsub(/__SKIP__.*?__ENDSKIP__/m, '')
59
+ end
60
+
61
+ def to_html
62
+ textile = preprocess_inlinecode(@original)
63
+ textile = preprocess_code(textile)
64
+ content = split_into_slides(textile)
65
+ html = RedCloth.new(content).to_html
66
+ remove_code_escaping_from(html)
67
+ end
68
+
69
+ # look for :code filename[part] and substitute in the appropriate part
70
+ # of the given file. Do in two steps because the regexp engine isn;t reentrant
71
+ def preprocess_code(text)
72
+ chunks = {}
73
+ text.scan(CODE_PATTERN) do |file,|
74
+ desc = Descriptor.new(file)
75
+ chunks[file] = find_content_from(desc)
76
+ end
77
+ text.gsub(CODE_PATTERN) { file = $1.dup; format_code(Descriptor.new(file), chunks[file]) }
78
+ end
79
+
80
+ # Look for :inlinecode /.../:endinlinecode and substitute in as if it came from a file
81
+ def preprocess_inlinecode(text)
82
+ state = :copying
83
+ result = []
84
+ text.split(/\n/).each do |line|
85
+ case state
86
+ when :copying
87
+ if line =~ /^:inlinecode(.*)/
88
+ args = $1.strip
89
+ desc = Descriptor.new("--[#{args}]")
90
+ result << %{<div class="#{desc.css_class}">\n}
91
+ result << %{\n<pre name="code" class="#{desc.lang}:nogutter:nocontrols">\n}
92
+ state = :incode
93
+ else
94
+ result << line
95
+ end
96
+ when :incode
97
+ if line =~ /^:endinlinecode/
98
+ result << "</pre></div>\n\n"
99
+ state = :copying
100
+ else
101
+ result << INCLUDED_CODE_PREFIX + line
102
+ end
103
+ end
104
+ end
105
+
106
+ result.join("\n")
107
+ end
108
+
109
+ def split_into_slides(textile)
110
+ result = []
111
+ slides = textile.split(/^h1/).each do |slide|
112
+ unless slide.empty?
113
+ result << START_SLIDE << "\nh1" << slide << END_SLIDE
114
+ end
115
+ end
116
+ result.join
117
+ end
118
+
119
+ def find_content_from(desc)
120
+ begin
121
+ content = File.read(desc.file_name)
122
+ rescue Exception => e
123
+ STDERR.puts e.message
124
+ exit 2
125
+ end
126
+
127
+ find_part_in(content, desc.part)
128
+ end
129
+
130
+ def find_part_in(content, part_name)
131
+ result = []
132
+ state = part_name ? :skipping : :normal
133
+ content.each_line do |line|
134
+ if line.sub!(/(START|END):(\w+)/, '')
135
+ if $2 == part_name
136
+ if $1 == "START"
137
+ state = :normal
138
+ else
139
+ state = :skipping
140
+ end
141
+ end
142
+ next
143
+ end
144
+ result << line unless state == :skipping
145
+ end
146
+ result.join
147
+ end
148
+
149
+ def format_code(desc, code)
150
+ code = code.gsub(/^/m, INCLUDED_CODE_PREFIX)
151
+ %{<div class="#{desc.css_class}">\n} +
152
+ %{\n<pre name="code" class="#{desc.lang}:nogutter:nocontrols">#{code}} +
153
+ %{</pre></div>} +
154
+ %{<div class="codeurl"><a href="txmt://open?url=file://#{File.expand_path(desc.file_name)}">#{desc.file_name}</a></div>\n\n}
155
+ end
156
+
157
+ def remove_code_escaping_from(html)
158
+ html.gsub(INCLUDED_CODE_PREFIX_REGEXP, '')
159
+ end
160
+ end
@@ -0,0 +1,108 @@
1
+ require 'yaml'
2
+
3
+ S5_HEAD = %{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml">
7
+
8
+ <head>
9
+ <title>&title;</title>
10
+ <!-- metadata -->
11
+ <meta name="generator" content="S5" />
12
+ <meta name="version" content="S5 1.1" />
13
+ <meta name="presdate" content="&date" />
14
+ <meta name="author" content="&author;" />
15
+ <meta name="organization" content="&organization;" />
16
+ <meta name="company" content="&company;" />
17
+ <!-- configuration parameters -->
18
+ <meta name="defaultView" content="slideshow" />
19
+ <meta name="controlVis" content="hidden" />
20
+ <!-- style sheet links -->
21
+ <link rel="stylesheet" href="../ui/default/slides.css" type="text/css" media="projection" id="slideProj" />
22
+ <link rel="stylesheet" href="../ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" />
23
+ <link rel="stylesheet" href="../lib/stylesheets/print.css" type="text/css" media="print" id="slidePrint" />
24
+ <link rel="stylesheet" href="../ui/default/opera.css" type="text/css" media="projection" id="operaFix" />
25
+
26
+ <link rel="stylesheet" href="../lib/stylesheets/pressie.css" type="text/css" />
27
+
28
+ <!-- S5 JS -->
29
+ <script src="../ui/default/slides.js" type="text/javascript"></script>
30
+
31
+ <!-- Syntax Highlighter -->
32
+ <link rel="stylesheet" href="../dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css"></link>
33
+
34
+ </head>
35
+ <body>
36
+
37
+ <div class="layout">
38
+ <div id="controls"><!-- DO NOT EDIT --></div>
39
+ <div id="currentSlide"><!-- DO NOT EDIT --></div>
40
+ <div id="header"></div>
41
+ <div id="footer">
42
+ <h2>Copyright &copy; &copyright;</h2>
43
+ </div>
44
+
45
+ </div>
46
+
47
+
48
+ <div class="presentation">
49
+ }
50
+
51
+ S5_TAIL = %{
52
+ <!-- Syntax Highlighter -->
53
+ <script language="javascript" src="../dp.SyntaxHighlighter/Scripts/shCore.js"></script>
54
+ <script language="javascript" src="../dp.SyntaxHighlighter/Scripts/shBrushCpp.js"></script>
55
+ <script language="javascript" src="../dp.SyntaxHighlighter/Scripts/shBrushRuby.js"></script>
56
+ <script language="javascript" src="../dp.SyntaxHighlighter/Scripts/shBrushXml.js"></script>
57
+ <script language="javascript">
58
+ dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';
59
+ dp.SyntaxHighlighter.HighlightAll('code');
60
+ </script>
61
+ </div>
62
+ </body>
63
+ </html>
64
+ }
65
+
66
+
67
+ module Codex
68
+ class Pressie
69
+
70
+ def self.process
71
+ new.process
72
+ end
73
+
74
+ def process
75
+ metadata_name = ARGV.shift || usage("Missing metadata file name")
76
+ load_metadata(metadata_name)
77
+ input_name = ARGV.shift || usage("Missing input file name")
78
+ content = Content.new(File.read(input_name)) rescue usage($!.message)
79
+ header = substitute_metadata_into(S5_HEAD)
80
+ puts header, content.to_html, S5_TAIL
81
+ end
82
+
83
+
84
+ private
85
+
86
+ def usage(msg = nil)
87
+ STDERR.puts "pressie.rb <metadatafile> <inputfile>"
88
+ if msg
89
+ STDERR.puts
90
+ STDERR.puts msg
91
+ end
92
+ exit 1
93
+ end
94
+
95
+ def load_metadata(file_name)
96
+ @metadata = YAML.load_file(file_name)
97
+ end
98
+
99
+ def substitute_metadata_into(text)
100
+ text = text.dup
101
+ %w{author company organization date copyright title}.each do |key|
102
+ text.gsub!(/&#{key};/, @metadata[key]) if @metadata.has_key?(key)
103
+ end
104
+ text
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,9 @@
1
+ module Codex #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ TINY = 2
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,196 @@
1
+ code {
2
+ font-family: Monaco;
3
+ }
4
+
5
+
6
+ div.slide code {
7
+ font-weight: normal;
8
+ font-size: 85%;
9
+ color: #228;
10
+ }
11
+
12
+ div.dp-highlighter
13
+ {
14
+ font-family: "Gill Sans", "Consolas", "Courier New", Courier, mono;
15
+ font-size: 100%;
16
+ background-color: white;
17
+ overflow: auto;
18
+ /* margin: 18px 0px 18px 0px; */
19
+ padding-top: 1px; /* adds a little border on top when controls are hidden */
20
+ margin-bottom: 0px;
21
+ border: 2px solid;
22
+ }
23
+
24
+ div.dp-highlighter ol
25
+ {
26
+ margin-top: 1px;
27
+ margin-bottom: 10px;
28
+ padding: 0px;
29
+ }
30
+
31
+ div.dp-highlighter ol li
32
+ {
33
+ background-color: white;
34
+ }
35
+
36
+ div.dp-highlighter .keyword {
37
+ font-weight: normal;
38
+ color: #33b;
39
+ }
40
+
41
+ div.dp-highlighter .variable {
42
+ font-weight: normal;
43
+ }
44
+
45
+ div.dp-highlighter .string {
46
+ color: #22c;
47
+ font-style: italic;
48
+ }
49
+
50
+ .dp-cpp span.datatypes {
51
+ font-weight: normal;
52
+ }
53
+
54
+ div.codeurl {
55
+ margin-top: 0.5em;
56
+ margin-bottom: 1.5em;
57
+ padding-right: 1em;
58
+ text-align: right;
59
+ font-size: 50%;
60
+ }
61
+
62
+ div.slide ul {
63
+ margin-left: 0pt;
64
+ }
65
+
66
+ div.slide td {
67
+ padding: 0.3em 1em;
68
+ }
69
+
70
+ div.slide th {
71
+ background: #337;
72
+ color: white;
73
+ font-weight: bold;
74
+ padding: 0.2em 0em 0.2em 0em;
75
+ }
76
+
77
+
78
+ body {
79
+ background: white;
80
+ }
81
+
82
+
83
+
84
+
85
+ div#header {
86
+ background: white;
87
+ display: none;
88
+ }
89
+
90
+ div#footer {
91
+ background: white;
92
+ font-size: 50%;
93
+ height: 1em;
94
+ }
95
+
96
+ div#footer h2 {
97
+ font-weight: normal;
98
+ font-size: 60%;
99
+ }
100
+
101
+ div.slide h1 {
102
+ background: white;
103
+ color: #993333;
104
+ left: 1em;
105
+ top: 0.5em;
106
+ width: 95%;
107
+ padding: 0em 0em 0em 0em;
108
+ border-bottom: 6px solid #ffaaaa;
109
+ text-transform: none;
110
+ }
111
+
112
+
113
+ div.slide h1.exercise {
114
+ background: white;
115
+ color: #339933;
116
+ left: 1em;
117
+ top: 0.5em;
118
+ width: 95%;
119
+ padding: 0em 0em 0em 0em;
120
+ border-bottom: 6px solid #aaffaa;
121
+ }
122
+
123
+
124
+ div#slide0, div.title {
125
+ height: 100%;
126
+ background-image: url(ruby.png);
127
+ background-repeat: no-repeat;
128
+ background-position: bottom right;
129
+ }
130
+
131
+ div#slide0 h1, div.title h1 {
132
+ color: #993333;
133
+ background:transparent none repeat scroll 0%;
134
+ font-family:Helvetica,sans-serif;
135
+ font-size:2em;
136
+ font-size-adjust:none;
137
+ font-stretch:normal;
138
+ font-style:normal;
139
+ font-variant:normal;
140
+ font-weight:bold;
141
+ line-height:normal;
142
+ margin:10% 0pt 0pt;
143
+ padding:0pt;
144
+ position:static;
145
+ white-space:normal;
146
+ }
147
+ }
148
+
149
+ /* code layout */
150
+ div.code-large {
151
+ font-size: 150% !important;
152
+ line-height: 1.6em !important;
153
+ }
154
+
155
+
156
+ div.code-normal {
157
+ font-size: 90% !important;
158
+ line-height: 2em !important;
159
+ }
160
+
161
+ div.code-normal li {
162
+ margin-top: 0.6em;
163
+ }
164
+
165
+ div.code-small {
166
+ font-size: 75% !important;
167
+ line-height: 2em !important;
168
+ }
169
+
170
+ div.code-small li {
171
+ margin-top: 0.6em;
172
+ }
173
+
174
+ div.code-tiny {
175
+ font-size: 50% !important;
176
+ line-height: 2em !important;
177
+ }
178
+
179
+ div.code-tiny li {
180
+ margin-top: 0.6em;
181
+ }
182
+
183
+ div.code-supertiny {
184
+ font-size: 33% !important;
185
+ line-height: 2em !important;
186
+ }
187
+
188
+ div.code-supertiny li {
189
+ margin-top: 0.6em;
190
+ }
191
+
192
+ .caption {
193
+ color: #448;
194
+ font-family: Gil Sans;
195
+ font-size: 70%;
196
+ }