rote 0.2.4.1 → 0.3.0
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.
- data/CONTRIBUTORS +3 -2
- data/DONE +22 -0
- data/README +11 -2
- data/Rakefile +25 -4
- data/TODO +7 -9
- data/doc/layouts/page.html +3 -0
- data/doc/pages/COMMON.rb +0 -11
- data/doc/pages/guide/COMMON.rb +5 -3
- data/doc/pages/guide/index.html +373 -120
- data/doc/res/stylesheets/normal.css +63 -0
- data/lib/rote.rb +2 -3
- data/lib/rote/app.rb +1 -1
- data/lib/rote/builtin.rf +3 -33
- data/lib/rote/filters.rb +10 -0
- data/lib/rote/filters/base.rb +135 -0
- data/lib/rote/filters/rdoc.rb +25 -0
- data/lib/rote/filters/redcloth.rb +40 -0
- data/lib/rote/filters/syntax.rb +38 -0
- data/lib/rote/filters/tidy.rb +55 -0
- data/lib/rote/filters/toc.rb +74 -0
- data/lib/rote/format.rb +9 -0
- data/lib/rote/format/html.rb +49 -0
- data/lib/rote/page.rb +194 -141
- data/lib/rote/project/Rakefile +26 -5
- data/lib/rote/rotetasks.rb +133 -20
- data/test/gem_tests.rb +3 -1
- data/test/layouts/simple.rb +1 -0
- data/test/pages/markdown.txt +5 -1
- data/test/pages/rdoc.txt +4 -1
- data/test/pages/textile.rb +2 -0
- data/test/test_formatting.rb +140 -0
- data/test/test_html_page.rb +33 -0
- data/test/test_page.rb +72 -50
- metadata +15 -2
@@ -147,3 +147,66 @@ h3 {
|
|
147
147
|
h4 {
|
148
148
|
border-bottom: thin #b8c8c8 solid;
|
149
149
|
}
|
150
|
+
|
151
|
+
/* syntax */
|
152
|
+
pre.ruby {
|
153
|
+
background: #f5f5f5;
|
154
|
+
border: thin dashed #3e5972;
|
155
|
+
padding: 10px;
|
156
|
+
margin-left: 2em;
|
157
|
+
}
|
158
|
+
|
159
|
+
pre.ruby span.comment {
|
160
|
+
color: #789a86;
|
161
|
+
text-decoration: oblique;
|
162
|
+
}
|
163
|
+
|
164
|
+
pre.ruby span.ident {
|
165
|
+
color: #0b0202;
|
166
|
+
}
|
167
|
+
|
168
|
+
pre.ruby span.punct {
|
169
|
+
color: #8a7070;
|
170
|
+
}
|
171
|
+
|
172
|
+
pre.ruby span.symbol {
|
173
|
+
color: #aa1010;
|
174
|
+
font-weight: bold;
|
175
|
+
}
|
176
|
+
|
177
|
+
pre.ruby span.keyword {
|
178
|
+
color: #903030;
|
179
|
+
font-weight: bold;
|
180
|
+
}
|
181
|
+
|
182
|
+
pre.ruby span.constant {
|
183
|
+
color: #3e5972;
|
184
|
+
font-weight: bold;
|
185
|
+
}
|
186
|
+
|
187
|
+
pre.ruby span.string {
|
188
|
+
color: #2020f0;
|
189
|
+
}
|
190
|
+
|
191
|
+
pre.ruby span.regex {
|
192
|
+
color: #552090;
|
193
|
+
}
|
194
|
+
|
195
|
+
pre.ruby span.expr {
|
196
|
+
color: #101080;
|
197
|
+
font-weight: bold;
|
198
|
+
}
|
199
|
+
|
200
|
+
pre.ruby span.global {
|
201
|
+
color: #557462;
|
202
|
+
}
|
203
|
+
|
204
|
+
pre.ruby span.class {
|
205
|
+
color: #3e5972;
|
206
|
+
font-weight: bold;
|
207
|
+
}
|
208
|
+
|
209
|
+
pre.ruby span.method {
|
210
|
+
color: #aa1010;
|
211
|
+
}
|
212
|
+
|
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.
|
3
|
+
# $Id: rote.rb,v 1.21 2005/12/12 02:47:47 roscopeco Exp $
|
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
|
@@ -38,11 +38,10 @@ rescue LoadError
|
|
38
38
|
nil # just try without then...
|
39
39
|
end
|
40
40
|
|
41
|
-
require 'net/ftp'
|
42
41
|
require 'rake'
|
43
42
|
|
44
43
|
# Master Rote version. Manage this from the Rake release support.
|
45
|
-
ROTEVERSION = '0.
|
44
|
+
ROTEVERSION = '0.3.0'
|
46
45
|
|
47
46
|
#####
|
48
47
|
## *Rote* is a Rake (http://rake.rubyforge.org) based build tool for static
|
data/lib/rote/app.rb
CHANGED
data/lib/rote/builtin.rf
CHANGED
@@ -14,35 +14,8 @@ require 'rake'
|
|
14
14
|
require 'rake/clean'
|
15
15
|
require 'rote'
|
16
16
|
|
17
|
-
#
|
18
|
-
|
19
|
-
# command-line wrapper (but can be changed of course).
|
20
|
-
#
|
21
|
-
# This creates the following tasks:
|
22
|
-
#
|
23
|
-
# * doc - transform/copy all modified pages / resources
|
24
|
-
# * doc_pages - transform all modified pages
|
25
|
-
# * doc_res - copy all modified resources
|
26
|
-
# * doc_monitor - Start monitor mode, transform changed files automatically
|
27
|
-
#
|
28
|
-
# * [html/**/*] - Transform single page / resource unconditionally
|
29
|
-
#
|
30
|
-
# * clobber_doc - Remove output (hooks into main 'clobber' task)
|
31
|
-
#
|
32
|
-
# In addition to these tasks, you may also wish to define a 'doc_refresh' task
|
33
|
-
# to be run whenever modified resources are processed in monitor mode.
|
34
|
-
ws = Rote::DocTask.new(:doc) { |site|
|
35
|
-
site.output_dir = 'html'
|
36
|
-
site.layout_dir = 'doc/layouts'
|
37
|
-
|
38
|
-
site.pages.dir = 'doc/pages'
|
39
|
-
site.pages.include('**/*')
|
40
|
-
|
41
|
-
site.res.dir = 'doc/res'
|
42
|
-
site.res.include('**/*')
|
43
|
-
}
|
44
|
-
|
45
|
-
task :default => [:doc]
|
17
|
+
# Import the standard doc task
|
18
|
+
import File.join(File.dirname(__FILE__),('/project/Rakefile'))
|
46
19
|
|
47
20
|
#################### CREATE NEW PROJECT FROM TEMPLATE ###############
|
48
21
|
#
|
@@ -59,6 +32,7 @@ task :default => [:doc]
|
|
59
32
|
#
|
60
33
|
# Also need a way to display error message if the rule isn't
|
61
34
|
# invoked at least once...
|
35
|
+
desc "Bootstrap a new documentation project"
|
62
36
|
task :create do
|
63
37
|
rule '' do |t|
|
64
38
|
fail "'#{t.name}' already exists" if File.exists?(t.name)
|
@@ -73,10 +47,6 @@ task :create do
|
|
73
47
|
end
|
74
48
|
end
|
75
49
|
|
76
|
-
# import user-level tasks
|
77
|
-
import "#{ENV['HOME']}/.rotetasks.rf" if File.exists?("#{ENV['HOME']}/.rotetasks.rf")
|
78
|
-
import 'local.rf' if File.exists?('local.rf')
|
79
|
-
|
80
50
|
# DEPRECATED - publish.rf will be unsupported. vv0.2.3 v-0.5 1
|
81
51
|
import 'publish.rf' if File.exists?('publish.rf')
|
82
52
|
|
data/lib/rote/filters.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#--
|
2
|
+
# Require all filters
|
3
|
+
# (c)2005 Ross Bamford (and contributors)
|
4
|
+
#
|
5
|
+
# See 'rote.rb' or LICENSE for licence information.
|
6
|
+
# $Id: filters.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
|
7
|
+
#++
|
8
|
+
|
9
|
+
# will require 'base' but it'd get required anyway...
|
10
|
+
Dir[File.join(File.dirname(__FILE__), 'filters/*.rb')].each { |f| require f }
|
@@ -0,0 +1,135 @@
|
|
1
|
+
#--
|
2
|
+
# Baseclass for Rote filters
|
3
|
+
# (c)2005 Ross Bamford (and contributors)
|
4
|
+
#
|
5
|
+
# See 'rote.rb' or LICENSE for licence information.
|
6
|
+
# $Id: base.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
|
7
|
+
#++
|
8
|
+
module Rote
|
9
|
+
module Filters
|
10
|
+
|
11
|
+
# Match/extract
|
12
|
+
#
|
13
|
+
# #:code#args#
|
14
|
+
# ... body ...
|
15
|
+
# #code#
|
16
|
+
#
|
17
|
+
# to :code, args, body
|
18
|
+
MACRO_RE = /^\s*\#\:([a-z]+)(?:\#([a-z]*))?\#\s*^(.*?)$\s*\#\:\1\#(?:\2\#)?\s*$/m
|
19
|
+
|
20
|
+
#####
|
21
|
+
## Baseclass from which Rote filters can be derived if
|
22
|
+
## they want to process text without macros. This class
|
23
|
+
## replaces macro tags/bodies with simple placeholders,
|
24
|
+
## containing only characters [a-z0-9] before passing
|
25
|
+
## it the text to the block. On return, macro markers
|
26
|
+
## are replaced with the corresponding (numbered) original
|
27
|
+
## macro body.
|
28
|
+
class TextFilter
|
29
|
+
attr_accessor :handler_blk, :macro_data
|
30
|
+
|
31
|
+
# Create a new TextFilter. The supplied block will be called
|
32
|
+
# with the text to be rendered, with all macros replaced
|
33
|
+
# by plain-text macro markers:
|
34
|
+
#
|
35
|
+
# { |text, page| "replacement" }
|
36
|
+
def initialize(&handler)
|
37
|
+
@handler_blk = handler
|
38
|
+
@macro_data = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def filter(text, page)
|
42
|
+
# we need to remove any macros to stop them being touched
|
43
|
+
n = -1
|
44
|
+
tmp = text.gsub(MACRO_RE) do
|
45
|
+
macro_data << $&
|
46
|
+
# we need make the marker a 'paragraph'
|
47
|
+
"\nxmxmxmacro#{n += 1}orcamxmxmx\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
tmp = handler(tmp,page)
|
51
|
+
|
52
|
+
# Match the placeholder, including any (and greedily all) markup that's
|
53
|
+
# been placed before or after it, and put the macro text back.
|
54
|
+
tmp.gsub(/(?:<.*>)?xmxmxmacro(\d+)orcamxmxmx(?:<.*>)?/) { @macro_data[$1.to_i] }
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
|
59
|
+
# Calls the handler block. Subclasses may override this rather
|
60
|
+
# than use a block.
|
61
|
+
def handler(tmp,page)
|
62
|
+
handler_blk[tmp,page] if handler_blk
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
#####
|
67
|
+
## Baseclass from which Rote filters can be derived if
|
68
|
+
## you want some help with macro replacement.
|
69
|
+
class MacroFilter
|
70
|
+
|
71
|
+
# An array of macro names supported by this filter.
|
72
|
+
# This can be used to selectively disable individual
|
73
|
+
# macro support.
|
74
|
+
attr_accessor :macros
|
75
|
+
|
76
|
+
# Block that will be called for each supported macro
|
77
|
+
# in the filtered text. Like:
|
78
|
+
#
|
79
|
+
# { |macro, args, body| "replacement" }
|
80
|
+
#
|
81
|
+
# The presence of a block precludes the use of any
|
82
|
+
# +macro_xxxx+ methods on the subclass.
|
83
|
+
attr_accessor :handler_blk
|
84
|
+
|
85
|
+
# Create a new macro filter. If a three-arg block is passed,
|
86
|
+
# it will be called for each macro with a name that exists
|
87
|
+
# in the +macros+ array. Otherwise, macros will be sought
|
88
|
+
# as methods (e.g. +macro_code+). If an array of names isn't
|
89
|
+
# passed, a search such methods will be used to populate
|
90
|
+
# the names array.
|
91
|
+
def initialize(macros = nil, code_re = MACRO_RE, &handler_blk)
|
92
|
+
@handler_blk = handler_blk
|
93
|
+
@macros = macros || reflect_macro_names
|
94
|
+
@code_re = code_re
|
95
|
+
end
|
96
|
+
|
97
|
+
def filter(text,page)
|
98
|
+
# Just go through, subbing with block if this is
|
99
|
+
# our macro, or with the original match if not.
|
100
|
+
text.gsub(@code_re) do
|
101
|
+
if macros.detect { |it| it.to_s == $1 }
|
102
|
+
# Handler might refuse the macro (bad args, etc)
|
103
|
+
handler($1,$2,$3) || $&
|
104
|
+
else
|
105
|
+
$&
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
protected
|
111
|
+
|
112
|
+
# Calls the handler block, or attempts to call a method named
|
113
|
+
# 'macro_XXXX' where 'XXXX' is the name of the macro.
|
114
|
+
# Macro methods take two arguments -args and body.
|
115
|
+
# Name is implied by method that is invoked.
|
116
|
+
def handler(macro,args,body)
|
117
|
+
if handler_blk
|
118
|
+
handler_blk[macro,args,body]
|
119
|
+
elsif respond_to?(meth = "macro_#{macro}")
|
120
|
+
send(meth, args, body) # name implied by method
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
# inits the macro array from defined 'macro_' methods if no array is passed.
|
127
|
+
def reflect_macro_names
|
128
|
+
[methods, private_methods, singleton_methods, protected_methods].inject([]) do |arr,m|
|
129
|
+
arr += m.grep(/macro_([a-z0-9]+)/) { $1 }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#--
|
2
|
+
# Rote page class
|
3
|
+
# (c)2005 Ross Bamford (and contributors)
|
4
|
+
#
|
5
|
+
# See 'rote.rb' or LICENSE for licence information.
|
6
|
+
# $Id: rdoc.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'rdoc/markup/simple_markup'
|
10
|
+
require 'rdoc/markup/simple_markup/to_html'
|
11
|
+
|
12
|
+
module Rote
|
13
|
+
module Filters
|
14
|
+
|
15
|
+
#####
|
16
|
+
## Page filter supporting RDoc markup.
|
17
|
+
class RDoc < TextFilter
|
18
|
+
def initialize(markup = SM::SimpleMarkup.new, output = SM::ToHtml.new)
|
19
|
+
@markup = markup
|
20
|
+
@output = output
|
21
|
+
self.handler_blk = proc { |text,page| @markup.convert(text, @output) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Rote filter for RedCloth
|
3
|
+
# (c)2005 Ross Bamford (and contributors)
|
4
|
+
#
|
5
|
+
# See 'rote.rb' or LICENSE for licence information.
|
6
|
+
# $Id: redcloth.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'redcloth'
|
10
|
+
require 'rote/filters/base'
|
11
|
+
|
12
|
+
module Rote
|
13
|
+
module Filters
|
14
|
+
#####
|
15
|
+
## Page filter that converts plain-text formatting to HTML using
|
16
|
+
## RedCloth. This allows both Textile and Markdown formatting
|
17
|
+
## to be used with any page.
|
18
|
+
class RedCloth < TextFilter
|
19
|
+
|
20
|
+
# Create a new filter instance. The supplied options are passed
|
21
|
+
# directly to RedCloth. The most common are :textile and
|
22
|
+
# :markdown - See RedCloth docs for a full list.
|
23
|
+
#
|
24
|
+
# If no options are supplied, :textile is assumed.
|
25
|
+
def initialize(*redcloth_opts)
|
26
|
+
super()
|
27
|
+
@redcloth_opts = redcloth_opts
|
28
|
+
raise "RedCloth is not available" unless defined?(RedCloth)
|
29
|
+
end
|
30
|
+
|
31
|
+
def handler(text,page)
|
32
|
+
rc = ::RedCloth.new(text)
|
33
|
+
# hack around a RedCloth warning
|
34
|
+
rc.instance_eval { @lite_mode = false }
|
35
|
+
rc.to_html(*@redcloth_opts)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#--
|
2
|
+
# Rote filter with syntax highlighting
|
3
|
+
# (c)2005 Ross Bamford (and contributors)
|
4
|
+
#
|
5
|
+
# See 'rote.rb' or LICENSE for licence information.
|
6
|
+
# $Id: syntax.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'syntax'
|
10
|
+
require 'syntax/convertors/html'
|
11
|
+
require 'rote/filters/base'
|
12
|
+
|
13
|
+
module Rote
|
14
|
+
module Filters
|
15
|
+
|
16
|
+
#####
|
17
|
+
## Page filter that supports syntax highlighting for Ruby code
|
18
|
+
## via the +Syntax+ library. Code is expected to be in the
|
19
|
+
## following format:
|
20
|
+
##
|
21
|
+
## #:code#ruby#
|
22
|
+
## def amethod(arg)
|
23
|
+
## puts arg
|
24
|
+
## end
|
25
|
+
## #:code#
|
26
|
+
##
|
27
|
+
class Syntax < MacroFilter
|
28
|
+
def initialize(macro_re = MACRO_RE)
|
29
|
+
super([:code],macro_re)
|
30
|
+
end
|
31
|
+
|
32
|
+
def macro_code(lang,body)
|
33
|
+
converter = ::Syntax::Convertors::HTML.for_syntax(lang)
|
34
|
+
"<pre class='#{lang}'><code>#{converter.convert(body,false)}</code></pre>"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#--
|
2
|
+
# Rote filter for HTML Tidy
|
3
|
+
# (c)2005 Ross Bamford (and contributors)
|
4
|
+
#
|
5
|
+
# See 'rote.rb' or LICENSE for licence information.
|
6
|
+
# $Id: tidy.rb,v 1.2 2005/12/12 02:45:24 roscopeco Exp $
|
7
|
+
#++
|
8
|
+
|
9
|
+
module Rote
|
10
|
+
module Filters
|
11
|
+
|
12
|
+
#####
|
13
|
+
## Post filter that runs HTML Tidy on the laid-out page to correct and
|
14
|
+
## clean up HTML in the output. This filter can be used with any of
|
15
|
+
## the _asXXXX_ formats supported by Tidy.
|
16
|
+
##
|
17
|
+
## Note that this filter requires the 'tidy' command, and should be
|
18
|
+
## added to the +post_filters+ array, in contrast to most of the
|
19
|
+
## other filters which are page filters.
|
20
|
+
##
|
21
|
+
## If 'tidy' isn't in your path you'll need to specify it here or
|
22
|
+
## via a TIDYCMD environment variable.
|
23
|
+
class Tidy
|
24
|
+
|
25
|
+
# Create a new filter instance, using the specified output format,
|
26
|
+
# and optionally a custom 'tidy' command and options.
|
27
|
+
def initialize(format = :xhtml, tidycmd = nil, tidyopts = '-q')
|
28
|
+
@tidycmd = tidycmd || ENV['TIDYCMD'] || (PLATFORM =~ /mswin/ ? 'tidy.exe' : 'tidy')
|
29
|
+
# TODO windows 'tidy.exe' correct?
|
30
|
+
|
31
|
+
@tidyopts = tidyopts
|
32
|
+
@format = format
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_accessor :format, :tidyopts, :tidycmd
|
36
|
+
|
37
|
+
def filter(text, page)
|
38
|
+
# TODO need to properly capture and log warnings here
|
39
|
+
result = IO.popen("#{@tidycmd} #{self.tidyopts} -f tidy.log -as#{self.format}","r+") do |fp|
|
40
|
+
Thread.new { fp.write(text); fp.close_write }
|
41
|
+
fp.read
|
42
|
+
end
|
43
|
+
|
44
|
+
if $?.exitstatus < 2
|
45
|
+
result
|
46
|
+
else
|
47
|
+
warn 'Tidy command failed (exitstatus: $?)'
|
48
|
+
text
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|