# Allison RDoc template
# Copyright 2006 Cloudburst LLC
class String
# fuck this stupid rdoc templater system
def if_exists (item = nil)
unless item
self unless self =~ /(%(\w+)%)/
"\nIF:#{$2}\n#{self}\nENDIF:#{$2}\n"
else
"\nIF:#{item}\n#{self}\nENDIF:#{item}\n"
end
end
def loop(item)
"\nSTART:#{item}\n#{self}\nEND:#{item}\n"
end
end
module RDoc
module Page
puts "Invoking Allison template..."
require 'pathname'
CACHE_DIR = Pathname.new(__FILE__).dirname.to_s + "/cache"
begin
require 'rubygems'
require_gem 'markaby', '>= 0.5' # how come this isn't activate_gem(), since that's what it does?
require 'markaby'
require 'base64'
module Allison
# markaby page says markaby is better in its own module...
URL = "http://blog.evanweaver.com/articles/2006/06/02/allison"
IMGPATH = 'allison.gif'
FONTS = METHOD_LIST = SRC_PAGE = FILE_PAGE = CLASS_PAGE = ""
FR_INDEX_BODY = "!INCLUDE!" # who knows
STYLE, JAVASCRIPT = ["css", "js"].map do |extension|
s = File.open(File.dirname(__FILE__) + "/allison.#{extension}").read
# programmatic css, because we're so badass
if extension == "css"
puts "Compiling CSS..."
s_lines = s.split("\n")
meths = []
s_lines.collect! do |line|
line = line.squeeze(" ").strip
if line =~ /(\w+)/ and meths.include? $1
line = instance_eval line
#puts "Called method #{$1}"
elsif line !~ /\*\/|\/\*/ and line =~ /(@.*|^def (\w+).*)/
#printf "Evalled #{$1}"
result = instance_eval $1
#puts " to #{result.inspect}"
result = (result.is_a?(Fixnum) ? result.to_s + "px" : result.to_s)
line = (line == $1 ? "" : line.gsub($1, result))
meths.push $2 if $2
elsif line =~ /\%#{IMGPATH}\%/
img = Base64.encode64(File.open(File.dirname(__FILE__) + "/#{IMGPATH}") {|f| f.read}).gsub("\n", '')
line.sub!(/\%#{IMGPATH}\%/, img)
end
line !~ /^\s*$|\s*^\/\*.*\*\/\s*$|\{|\}/ ? line + ";" : line
end
s = s_lines.join("\n")
else
puts "Inlining Javascript..."
end
s
end
puts "Compiling XHTML..."
INDEX = Markaby::Builder.new.xhtml_strict do
head do
title '%title%'
link :rel => 'stylesheet', :type => 'text/css', :href => 'rdoc-style.css', :media => 'screen'
tag! :meta, 'http-equiv' => 'refresh', 'content' => '0;url=%initial_page%'
end
body do
div.container! do
10.times {|n| div('', :class => "curve", :id => "preheader_curve_#{n}") }
div.header! do
span.title! do
p { ' ' }
h1 "Ruby Documentation"
end
end
div.clear {}
div.redirect! do
a :href => '%initial_page%' do
h1 "Redirect"
end
end
end
end
end.to_s
FILE_INDEX = METHOD_INDEX = CLASS_INDEX = Markaby::Builder.new.capture do
a :href => '%href%' do
self << '%name%'
br
end
end.loop('entries')
BODY = Markaby::Builder.new.xhtml_strict do
head do
title "%title%"
link :rel => 'stylesheet', :type => 'text/css', :href => '%style_url%', :media => 'screen'
script :type => 'text/javascript' do
JAVASCRIPT
end
end
body do
div.container! do
10.times {|n| div('', :class => "curve", :id => "preheader_curve_#{n}") }
div.header! do
p {'%full_path%'.if_exists}
span do
h1.title! '%title%'.if_exists
end
self << "!INCLUDE!" # always empty
end
div.clear {}
div.left! do
self << (div.navigation.dark.top.child_of! do
# death to you, horrible templater >:(
h3 "Child of"
self << "\n#{"".if_exists}%parent%#{"".if_exists('par_url')}"
end).if_exists('parent')
self << div.navigation.dark.top.defined_in! do
h3('Defined in')
self << a('%full_path%', :href => '%full_path_url%').if_exists.loop('infiles')
end.if_exists('infiles')
['includes', 'requires', 'methods'].each do |item|
self << div.navigation.top(:id => item) do
self << h3(item.capitalize)
self << "\n#{"".if_exists}%name%#{br}#{"".if_exists('aref')}".if_exists('name').loop(item)
end.if_exists(item)
end
div.spacer! ''
# for the javascript ajaxy includes
['class', 'file', 'method'].each do |item|
div.navigation.dark.index :id => "#{item}_wrapper" do
div.list_header do
h3 'All ' + (item == 'class' ? 'classes' : item + 's')
end
div.list_header_link do
a((item == 'method' ? 'Show...' : 'Hide...'),
:id => "#{item}_link", :href => "#",
:onclick=> "toggle('#{item}'); toggleText('#{item}_link'); return false;")
end
div.clear {}
div(:id => item) do
form do
label(:for => "filter_#{item}") { 'Filter:' + ' ' * 2 }
input '', :type => 'text', :id => "filter_#{item}",
:onKeyUp => "return filterList('#{item}', this.value, event);",
:onKeyPress => "return disableSubmit(event);"
end
end
end
end
10.times {|n| div('', :class => "curve", :id => "left_curve_#{n}") }
end
div.content! do
self << capture do
h1.item_name! '%title%'
end.if_exists('title')
self << capture do
h1 'Description'
self << '%description%'
end.if_exists('description')
self << capture do
self << h1 {a '%sectitle%', :name => '%secsequence%'}.if_exists('sectitle')
self << p {'%seccomment%'}.if_exists
self << capture do
h1 "Child modules and classes"
p '%classlist%'
end.if_exists('classlist')
['constants', 'aliases', 'attributes'].each do |item|
self << capture do
h1(item.capitalize)
p do
table do
fields = %w[name value old_name new_name rw desc a_desc]
self << tr do
# header row
th.first " "
if item == 'constants'
th 'Name'
th 'Value'
elsif item == 'aliases'
th 'Old name'
th 'New name'
elsif item == 'attributes'
th 'Name'
th 'Read/write?'
end
th.description(:colspan => 2){"Description"}
end
self << tr do
# looped item rows
td.first " "
fields.each do |field|
if field !~ /desc/
self << td('%' + field + '%', :class => field =~ /^old|^name/ ? "highlight" : "normal").if_exists
else
self << td(('%' + field+ '%').if_exists)
end
end
end.loop(item)
end
end
end.if_exists(item)
end
self << capture do
div.section_spacer ''
h1('%type% %category% methods')
self << capture do
self << a.small(:name => '%aref%') {br}.if_exists
div.a_method do
div do
h3 { "".if_exists + '%callseq%'.if_exists + '%name%'.if_exists + '%params%'.if_exists + "".if_exists('aref')}
self << '%m_desc%'.if_exists
self << capture do
p.source_link :id => '%aref%-show-link' do
a "Show source...", :id => '%aref%-link', :href => "#",
:onclick=> "toggle('%aref%-source'); toggleText('%aref%-link'); return false;"
end
div.source :id => '%aref%-source' do
pre { '%sourcecode%' }
end
end.if_exists('sourcecode')
end
end
end.loop('methods').if_exists('methods')
end.loop('method_list').if_exists('method_list')
end.loop('sections').if_exists('sections')
end
end
div.footer!.clear do
a 'Allison', :href => URL
end
end
end.to_s
end
Allison.constants.each do |c|
eval "#{c} = Allison::#{c}" # jump out of the namespace
File.open("#{CACHE_DIR}/#{c}", 'w') do |f|
f.puts eval(c) # write cache
end
end
rescue LoadError => e
# guess we don't have some dependency. hope the cache is fresh!
lib = (e.to_s[/(.*)\(/, 1] or e.to_s).split(" ").last.capitalize
puts "Loading from cache (#{lib} was missing)..."
Dir[CACHE_DIR + '/*'].each do |filename|
eval("#{filename.split("/").last} = File.open(filename) {|s| s.read}")
end
end
end
end