rote 0.3.0.2 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,6 +12,7 @@ body {
12
12
  margin: 0px 0px 0px 0px;
13
13
  }
14
14
 
15
+ /* * linky links *** */
15
16
  a:link {
16
17
  color: #cc3030;
17
18
  text-decoration: none;
@@ -60,8 +61,9 @@ a.nav:visited {
60
61
  background: auto;
61
62
  }
62
63
 
63
- /* outer div top bar on pages */
64
+ /* * outer layout ** */
64
65
  table.topbar {
66
+ /* outer div top bar on pages */
65
67
  background: #f5f5f5;
66
68
  color: #000000;
67
69
  width: 100%;
@@ -92,8 +94,6 @@ img.navicon {
92
94
  height: 22px;
93
95
  }
94
96
 
95
- /* ***************** */
96
-
97
97
  div.frontcopyright {
98
98
  /* Copyright bit on front page */
99
99
  color: #909090;
@@ -120,6 +120,8 @@ div.main {
120
120
  margin: 50px 12% 50px 8%;
121
121
  }
122
122
 
123
+ /* * layout imgs *** */
124
+
123
125
  img.smallrpotlogo {
124
126
  width: 210px;
125
127
  height: 47px;
@@ -140,6 +142,8 @@ img.smalllogo {
140
142
  height: 68px;
141
143
  }
142
144
 
145
+ /* * page styles *** */
146
+
143
147
  h3 {
144
148
  border-bottom: thin #959595 solid;
145
149
  }
@@ -148,7 +152,24 @@ h4 {
148
152
  border-bottom: thin #b8c8c8 solid;
149
153
  }
150
154
 
151
- /* syntax */
155
+ h6 {
156
+ border-bottom: thin #c0c0d8 solid;
157
+ }
158
+
159
+ div.note {
160
+ background: #e8e8fa;
161
+ border: thin dashed #3e5972;
162
+ position: relative;
163
+ width: 90%;
164
+ left: 5%;
165
+ right: 5%;
166
+ text-align: right;
167
+ font-size: 10pt;
168
+ padding: 5px;
169
+ margin-bottom: 5px;
170
+ }
171
+
172
+ /* * syntax ******** */
152
173
  pre.ruby {
153
174
  background: #f5f5f5;
154
175
  border: thin dashed #3e5972;
@@ -156,6 +177,10 @@ pre.ruby {
156
177
  margin-left: 2em;
157
178
  }
158
179
 
180
+ pre.ruby span.normal {
181
+ color: #000000;
182
+ }
183
+
159
184
  pre.ruby span.comment {
160
185
  color: #789a86;
161
186
  text-decoration: oblique;
@@ -188,6 +213,15 @@ pre.ruby span.string {
188
213
  color: #2020f0;
189
214
  }
190
215
 
216
+ pre.ruby span.char {
217
+ color: #2020f0;
218
+ font-weight: bold;
219
+ }
220
+
221
+ pre.ruby span.number {
222
+ color: #aa1010;
223
+ }
224
+
191
225
  pre.ruby span.regex {
192
226
  color: #552090;
193
227
  }
@@ -210,3 +244,11 @@ pre.ruby span.method {
210
244
  color: #aa1010;
211
245
  }
212
246
 
247
+ pre.ruby span.attribute {
248
+ color: #3e5972;
249
+ }
250
+
251
+ pre.ruby span.escape {
252
+ color: #2020f0;
253
+ font-weight: bold;
254
+ }
data/lib/rote.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # rote.rb - main Rote module
2
2
  # Copyright (c) 2005 Ross Bamford (and contributors)
3
- # $Id: rote.rb,v 1.22 2005/12/14 19:19:58 roscopeco Exp $
3
+ # $Id: rote.rb 145 2005-12-14 19:19:58 +0000 (Wed, 14 Dec 2005) roscopeco $
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  # this software and associated documentation files (the "Software"), to deal in
@@ -41,7 +41,7 @@ end
41
41
  require 'rake'
42
42
 
43
43
  # Master Rote version. Manage this from the Rake release support.
44
- ROTEVERSION = '0.3.0.2'
44
+ ROTEVERSION = '0.3.2'
45
45
 
46
46
  #####
47
47
  ## *Rote* is a Rake (http://rake.rubyforge.org) based build tool for static
data/lib/rote/app.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # (c)2005 Ross Bamford (and contributors)
3
3
  #
4
4
  # See 'rote.rb' or LICENSE for licence information.
5
- # $Id: app.rb,v 1.6 2005/12/12 02:45:24 roscopeco Exp $
5
+ # $Id: app.rb 128 2005-12-12 02:45:24 +0000 (Mon, 12 Dec 2005) roscopeco $
6
6
  require 'getoptlong'
7
7
 
8
8
  module Rote
data/lib/rote/cache.rb ADDED
@@ -0,0 +1,144 @@
1
+ # Dependency caching / memoize to disk for Rake / Rote
2
+ # Contributed by Jonathan Paisley (very slightly modified)
3
+ #--
4
+ # (c)2005, 2006 Ross Bamford (and contributors)
5
+ #
6
+ # See 'rote.rb' or LICENSE for licence information.
7
+ # $Id: cache.rb 150 2006-01-02 00:39:41 +0000 (Mon, 02 Jan 2006) roscopeco $
8
+ #++
9
+ # This file adds dynamic dependency tracking and caching for
10
+ # incremental builds, by adding methods to the Rake module
11
+ # and Task class. The primary intention is to allow pages
12
+ # to register layout files, and other dynamic dependencies
13
+ # to allow them to be checked on the next incremental build.
14
+ # To use, simply require this in your Rakefile, and call
15
+ # Rake.register_dependency from your page (e.g. when applying
16
+ # layout).
17
+ #
18
+ # Eventually this registration may become implicit with layout.
19
+
20
+ require 'md5'
21
+ require 'yaml'
22
+ require 'pathname'
23
+ require 'rake'
24
+
25
+ module Rake
26
+ class << self
27
+ # Directory for storing Rake dependency cache
28
+ def cache_dir=(val); @cache_dir = val; end
29
+ def cache_dir; @cache_dir ||= ".rake_cache"; end
30
+ def dependencies_file; File.join(cache_dir,"dependencies.yaml"); end
31
+ # Hash of current cached dependencies
32
+ def cached_dependencies; @cached_dependencies ||= {}; end
33
+ # Array representing current tasks being executed
34
+ def task_stack; @tasks ||= []; end
35
+ # Reference to current task being executed
36
+ def current_task; task_stack.last; end
37
+
38
+ # Use this method to dynamically register one or more files
39
+ # as dependencies of the currently executing task.
40
+ def register_dependency(deps, t = nil)
41
+ t = (current_task.name if current_task) unless t
42
+ if t then
43
+ file t => deps
44
+ (cached_dependencies[t] ||= []) << deps
45
+ end
46
+ end
47
+ end
48
+
49
+ class Task
50
+ alias :pre_autodep_invoke :invoke
51
+
52
+ # Invoke the task, loading cached dependencies if not already
53
+ # loaded, and handling the task stack. The argument controls
54
+ # whether or not cached dependencies are loaded and should not
55
+ # be set false except in testing.
56
+ def invoke(do_cache = true)
57
+ # Invoke patched to record task stack and
58
+ # load cached dependencies on first go.
59
+ Rake.load_cached_dependencies if do_cache && !$CACHEDEPS_LOADED
60
+
61
+ begin
62
+ Rake.task_stack << self
63
+
64
+ # TODO what's going on here?
65
+ # Rake.cached_dependencies[name] = [] if Rake.cached_dependencies[name]
66
+
67
+ pre_autodep_invoke
68
+ ensure
69
+ Rake.task_stack.pop
70
+ end
71
+ end
72
+
73
+ # Memoize the result of the block with respect to the
74
+ # file-based dependencies. Specify a description and
75
+ # dependencies like a Task:
76
+ #
77
+ # Rake::Task.memoize :task_name => [fn1,fn2] { ... }
78
+ #
79
+ # If the cached result is up-to-date with respect to the
80
+ # dependencies then the block will not be executed. Instead,
81
+ # the result will be unmarshalled from disk.
82
+ def self.memoize(args, &block)
83
+ task_name, deps = resolve_args(args)
84
+ fn = File.join(Rake.cache_dir, MD5.new(deps.inspect).to_s + "." + task_name)
85
+ Rake.register_dependency(deps)
86
+
87
+ result = nil
88
+ # This file task isn't ever used other than manually below with t.invoke
89
+ t = file fn => deps do
90
+ result = block.call
91
+ mkdir_p Rake.cache_dir unless File.exists?(Rake.cache_dir)
92
+ File.open(fn,"w") { |fp| Marshal.dump(result,fp) }
93
+ end
94
+ if t.needed? then
95
+ t.invoke
96
+ result
97
+ else
98
+ Marshal.load(File.read(fn))
99
+ end
100
+ end
101
+ end
102
+
103
+ protected
104
+
105
+ # Load cached dependencies, unless they're already
106
+ # loaded. This method is called during task invocation,
107
+ # with the effect that cached deps are loaded from yaml
108
+ # on the first invoke.
109
+ #
110
+ # An at_exit handler is installed to save the dependencies
111
+ # when rake exits.
112
+ def self.load_cached_dependencies
113
+ at_exit { self.save_cached_dependencies }
114
+
115
+ return unless File.exists?(dependencies_file)
116
+ YAML.load(File.read(dependencies_file)).each do |task,deps|
117
+ deps.each do |dep|
118
+ register_dependency(dep, task)
119
+ end
120
+ end
121
+
122
+ $CACHEDEPS_LOADED = true
123
+ end
124
+
125
+ def self.save_cached_dependencies
126
+ return if cached_dependencies.empty?
127
+ mkdir_p cache_dir unless File.exists?(cache_dir)
128
+ deps = {}
129
+ cached_dependencies.each do |k,v|
130
+ deps[k] = v.flatten.uniq
131
+ end
132
+ File.open(dependencies_file,"w") { |fp| fp.write YAML.dump(deps) }
133
+ end
134
+ end
135
+
136
+ task :clean => :clean_cached_dependencies
137
+ task :clean_cached_dependencies do
138
+
139
+ # careful now...
140
+ rm_rf Rake.cache_dir unless Rake.cache_dir == '.'
141
+
142
+ Rake.cached_dependencies.clear
143
+ end
144
+
data/lib/rote/filters.rb CHANGED
@@ -1,10 +1,26 @@
1
1
  #--
2
2
  # Require all filters
3
- # (c)2005 Ross Bamford (and contributors)
3
+ # (c)2005, 2006 Ross Bamford (and contributors)
4
4
  #
5
5
  # See 'rote.rb' or LICENSE for licence information.
6
- # $Id: filters.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
6
+ # $Id: filters.rb 128 2005-12-12 02:45:24 +0000 (Mon, 12 Dec 2005) roscopeco $
7
7
  #++
8
8
 
9
- # will require 'base' but it'd get required anyway...
10
- Dir[File.join(File.dirname(__FILE__), 'filters/*.rb')].each { |f| require f }
9
+ # Everyone requires this, we need to get it loaded first.
10
+ require 'rote/filters/base'
11
+
12
+ # This now requires conservatively, ignoring any filters that
13
+ # throw a LoadError. This allows a simple 'require rote/filters' to
14
+ # be used to load all filters _for which dependencies are
15
+ # available_.
16
+ Dir[File.join(File.dirname(__FILE__), 'filters/*.rb')].each do |fn|
17
+ begin
18
+ require fn unless fn =~ /[\\\/]base.rb$/
19
+ rescue LoadError
20
+
21
+ # ignore, different filters require different library
22
+ # support.
23
+
24
+ end
25
+ end
26
+
@@ -3,7 +3,7 @@
3
3
  # (c)2005 Ross Bamford (and contributors)
4
4
  #
5
5
  # See 'rote.rb' or LICENSE for licence information.
6
- # $Id: base.rb,v 1.3 2005/12/14 19:17:21 roscopeco Exp $
6
+ # $Id: base.rb 144 2005-12-14 19:17:21 +0000 (Wed, 14 Dec 2005) roscopeco $
7
7
  #++
8
8
  module Rote
9
9
  module Filters
@@ -0,0 +1,40 @@
1
+ #--
2
+ # Rote filter for BlueCloth
3
+ # (c)2006 Ross Bamford (and contributors)
4
+ #
5
+ # See 'rote.rb' or LICENSE for licence information.
6
+ # $Id: bluecloth.rb 155 2006-01-05 00:50:32 +0000 (Thu, 05 Jan 2006) roscopeco $
7
+ #++
8
+
9
+ require 'bluecloth'
10
+ require 'rote/filters/base'
11
+
12
+ module Rote
13
+ module Filters
14
+ #####
15
+ ## Page filter that converts markdown formatting to HTML using
16
+ ## BlueCloth.
17
+ class BlueCloth < TextFilter
18
+
19
+ # Create a new filter instance. The supplied restrictions (if any)
20
+ # are passed directly to BlueCloth. See BlueCloth docs for
21
+ # details of supported restrictions.
22
+ #
23
+ # If a block is supplied, it will be passed the BlueCloth string
24
+ # at render time, along with the page being rendered. It is
25
+ # expected to return the rendered content.
26
+ # If no block is supplied, to_html is called implicitly.
27
+ def initialize(*restrictions, &blk)
28
+ super()
29
+ @restrictions = restrictions
30
+ @blk = blk || lambda { |bc, page| bc.to_html }
31
+ end
32
+
33
+ def handler(text,page)
34
+ bc = ::BlueCloth.new(text)
35
+ @blk.call(bc, page)
36
+ end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,58 @@
1
+ #--
2
+ # Rote filter that runs macro body as code.
3
+ # (c)2005, 2006 Ross Bamford (and contributors)
4
+ #
5
+ # See 'rote.rb' or LICENSE for licence information.
6
+ # $Id: syntax.rb 135 2005-12-12 15:01:07 +0000 (Mon, 12 Dec 2005) roscopeco $
7
+ #++
8
+
9
+ require 'stringio'
10
+ require 'rote/filters/base'
11
+
12
+ module Rote
13
+ module Filters
14
+
15
+ #####
16
+ ## Page filter that evaluates Ruby code in it's body in the
17
+ ## current interpreter. The code is directly evaluated, and
18
+ ## anything it writes to standard out becomes the macro
19
+ ## replacement.
20
+ ##
21
+ ## Obviously you can place Ruby code directly in your pages,
22
+ ## using ERB, and for many cases that is the route you should
23
+ ## take. There is a (somewhat) subtle difference between the
24
+ ## to alternatives however: ERB is always evaluated right
25
+ ## at the start of rendering, before any Text Filters are
26
+ ## run, whereas #:eval# code is executed during the page filter
27
+ ## stage, which happens after ERB and text filtering, but
28
+ ## before layout is applied.
29
+ ##
30
+ class Eval < MacroFilter
31
+ def initialize(macro_re = MACRO_RE)
32
+ super([],macro_re)
33
+ end
34
+
35
+ def macro_eval(cmd,body,raw)
36
+ # no need to fiddle with $SAFE here is there?
37
+
38
+ # FIXME this is a hack.
39
+
40
+ # Utility is still limited I guess, since current Page isn't
41
+ # readily available to the macro code. We can probably fix
42
+ # that though.
43
+
44
+ # If thread safety becomes an issue, this'll probably need
45
+ # to be critical sectioned.
46
+
47
+ begin
48
+ oldsio, $stdout = $stdout, StringIO.new
49
+ eval body
50
+ $stdout.rewind
51
+ $stdout.read
52
+ ensure
53
+ $stdout = oldsio
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,42 @@
1
+ #--
2
+ # Rote filter that passes body to an external command
3
+ # (c)2005, 2006 Ross Bamford (and contributors)
4
+ #
5
+ # See 'rote.rb' or LICENSE for licence information.
6
+ # $Id: syntax.rb 135 2005-12-12 15:01:07 +0000 (Mon, 12 Dec 2005) roscopeco $
7
+ #++
8
+
9
+ require 'rote/filters/base'
10
+
11
+ module Rote
12
+ module Filters
13
+
14
+ #####
15
+ ## Page filter that runs it's body through the specified
16
+ ## command, and captures the output. E.g.:
17
+ ##
18
+ ## #:exec#python#
19
+ ## print "Hello, World!"
20
+ ## #:exec#
21
+ ##
22
+ ## Although this filter can be used to execute Ruby code,
23
+ ## you must bear in mind that this will happen in a separate
24
+ ## interpreter process, so no variables or requires from the
25
+ ## current environment will be available.
26
+ ## If you wish to evaluate Ruby code in your pages, you should
27
+ ## use either ERB (evaluated at the beginning of the render),
28
+ ## or the Eval filter (evaluated near the end).
29
+ class Exec < MacroFilter
30
+ def initialize(macro_re = MACRO_RE)
31
+ super([],macro_re)
32
+ end
33
+
34
+ def macro_exec(cmd,body,raw)
35
+ res = IO.popen(cmd, 'w+') do |io|
36
+ Thread.new { io.write body; io.close_write }
37
+ io.read
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end