# Equivalent to a header guard in C/C++
# Used to prevent the spec helper from being loaded more than once
unless defined? ::Webby
require 'rubygems'
require 'logging'
require 'ostruct'
require 'date'
module Webby
# :stopdoc:
VERSION = '0.9.4' # :nodoc:
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
YAML_SEP = '---'
# :startdoc:
class Error < StandardError; end # :nodoc:
# call-seq:
# Webby.site => struct
#
# Returns a struct containing the configuration parameters for the
# Webby site. These defaults should be overridden as needed in the
# site specific Rakefile.
#
def self.site
return @site if defined? @site
@site = OpenStruct.new(
:output_dir => 'output',
:content_dir => 'content',
:layout_dir => 'layouts',
:template_dir => 'templates',
:exclude => %w(tmp$ bak$ ~$ CVS \.svn),
:page_defaults => {
'layout' => 'default'
},
:find_by => 'title',
:base => nil,
:create_mode => 'page',
:blog_dir => 'blog',
:tumblog_dir => 'tumblog',
# Items for running the embedded webserver
:use_web_server => true,
:web_port => 4331,
# Items used to deploy the website
:user => ENV['USER'] || ENV['USERNAME'],
:host => 'example.com',
:remote_dir => '/not/a/valid/dir',
:rsync_args => %w(-av),
# Global options for HAML and SASS
:haml_options => {},
:sass_options => {},
# Options passed to the 'tidy' program when the tidy filter is used
:tidy_options => '-indent -wrap 80',
# List of valid URIs (these automatically pass validation)
:valid_uris => [],
# Options for coderay processing
:coderay => {
:lang => :ruby,
:line_numbers => nil,
:line_number_start => 1,
:bold_every => 10,
:tab_width => 8
},
# Options for graphviz processing
:graphviz => {
:path => nil,
:cmd => 'dot',
:type => 'png'
},
# Options for tex2img processing
:tex2img => {
:path => nil,
:type => 'png',
:bg => 'white',
:fg => 'black',
:resolution => '150x150'
},
# Options for ultraviolet syntax highlighting
:uv => {
:lang => 'ruby',
:line_numbers => false,
:theme => 'mac_classic'
},
# XPath identifiers used by the basepath filter
:xpaths => %w(
/html/head//base[@href]
/html/head//link[@href]
//script[@src]
/html/body[@background]
/html/body//a[@href]
/html/body//object[@data]
/html/body//img[@src]
/html/body//area[@href]
/html/body//form[@action]
/html/body//input[@src]
)
# other possible XPaths to include for base path substitution
# /html/body//object[@usemap]
# /html/body//img[@usemap]
# /html/body//input[@usemap]
)
end
# call-seq
# Webby.exclude => regexp
#
# Returns a regular expression used to exclude resources from the content
# directory from being processed by Webby. This same regular expression is
# also used to exclude layouts.
#
def self.exclude
@exclude ||= Regexp.new(site.exclude.join('|'))
end
# call-seq:
# Webby.editor => string or nil
#
# Returns the default editor to use when creating new pages. This editor
# will be spawned to allow the user to edit the newly created page.
#
def self.editor
return @editor if defined? @editor
@editor = if ENV['EDITOR'].nil? or ENV['EDITOR'].empty? then nil
else ENV['EDITOR'] end
end
# call-seq:
# cairn => filename
#
# The Webby _cairn_ file is used to mark the last time the content was
# built into the output directory. It is an empty file; only the
# modification time of the file is important.
#
def self.cairn
@cairn ||= ::File.join(site.output_dir, '.cairn')
end
# Returns the library path for Webby. If any arguments are given,
# they will be joined to the end of the libray path using
# File.join.
#
def self.libpath( *args )
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
end
# Returns the path for Webby. If any arguments are given,
# they will be joined to the end of the path using
# File.join.
#
def self.path( *args )
args.empty? ? PATH : ::File.join(PATH, args.flatten)
end
# call-seq:
# Webby.require_all_libs_relative_to( filename, directory = nil )
#
# Utility method used to rquire all files ending in .rb that lie in the
# directory below this file that has the same name as the filename passed
# in. Optionally, a specific _directory_ name can be passed in such that
# the _filename_ does not have to be equivalent to the directory.
#
def self.require_all_libs_relative_to( fname, dir = nil )
dir ||= ::File.basename(fname, '.*')
search_me = ::File.expand_path(
::File.join(::File.dirname(fname), dir, '*.rb'))
Dir.glob(search_me).sort.each {|rb| require rb}
end
# Prints a deprecation warning using the logger. The message states that
# the given method is being deprecated. An optional message can be give to
# -- somthing nice and fuzzy about a new method or why this one has to go
# away; sniff, we'll miss you little buddy.
#
def self.deprecated( method, message = nil )
msg = "'#{method}' has been deprecated"
msg << "\n\t#{message}" unless message.nil?
Logging::Logger['Webby'].warn msg
end
# Scan the layouts/
folder and the content/
# folder and create a new Resource object for each file found there.
#
def self.load_files
::Find.find(site.layout_dir, site.content_dir) do |path|
next unless test ?f, path
next if path =~ ::Webby.exclude
Resources.new path
end
end
end # module Webby
# call-seq:
# try_require( library, gemname = nil ) => true or false
#
# Try to laod the given _library_ using the built-in require, but do not
# raise a LoadError if unsuccessful. Returns +true+ if the _library_ was
# successfully loaded; returns +false+ otherwise.
#
# If a _gemname_ is given, then the "gem gemname" command will be called
# before the library is loaded.
#
def try_require( lib, gemname = nil )
gem gemname unless gemname.nil?
require lib
true
rescue LoadError
false
end
Webby.require_all_libs_relative_to(__FILE__, ::File.join(%w[webby core_ext]))
Webby.require_all_libs_relative_to(__FILE__)
end # unless defined?
# EOF