109 lines
4.2 KiB
Ruby
109 lines
4.2 KiB
Ruby
$: << File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
|
require 'fileutils'
|
|
require 'compass'
|
|
|
|
class Generate < Thor
|
|
desc "example IDENTIFIER [../frameworks/fmwk/stylesheets/path/to/_module.sass]", "Generate a new example."
|
|
method_options :title => :string, :framework => :string, :stylesheet => :string, :mixin => :string
|
|
def example(identifier, stylesheet = nil)
|
|
identifier = identifier.dup
|
|
identifier << "/" unless identifier[identifier.length - 1] == ?/
|
|
identifier = identifier[1..-1] if identifier[0] == ?/
|
|
stylesheet = stylesheet && dereference(stylesheet) || {}
|
|
options = @options.merge(stylesheet)
|
|
puts "Generating /examples/#{identifier}"
|
|
puts "DIRECTORY content/examples/#{identifier}"
|
|
FileUtils.mkdir_p("content/examples/#{identifier}")
|
|
puts " CREATE content/examples/#{identifier[0..-2]}.haml"
|
|
open("content/examples/#{identifier[0..-2]}.haml", "w") do |example_file|
|
|
mixin = "mixin: #{options[:mixin]}\n" if options[:mixin]
|
|
example_contents = <<-EXAMPLE
|
|
| ---
|
|
| title: #{options[:framework].capitalize} #{options[:mixin].capitalize if options[:mixin]} Example
|
|
| description: How to do X with Y
|
|
| framework: #{options[:framework]}
|
|
| stylesheet: #{options[:stylesheet]}
|
|
| #{mixin}example: true
|
|
| ---
|
|
| = render "partials/example"
|
|
EXAMPLE
|
|
example_file.puts example_contents.gsub(/^ +\| /, '')
|
|
end
|
|
puts " CREATE content/examples/#{identifier[0..-2]}/markup.haml"
|
|
open("content/examples/#{identifier[0..-2]}/markup.haml", "w") do |example_file|
|
|
example_contents = <<-EXAMPLE
|
|
| .example
|
|
| %h1.markup In Haml
|
|
| %p This file gets included into the example.
|
|
| %p And the source is shown to the user as HTML.
|
|
EXAMPLE
|
|
example_file.puts example_contents.gsub(/^ +\| /, '')
|
|
end
|
|
puts " CREATE content/examples/#{identifier[0..-2]}/stylesheet.sass"
|
|
open("content/examples/#{identifier[0..-2]}/stylesheet.sass", "w") do |example_file|
|
|
example_contents = <<-EXAMPLE
|
|
| .example
|
|
| h1.markup
|
|
| /* This file is used to style the example markup. */
|
|
| p
|
|
| /* And the source is shown to the user as Sass and as CSS. */
|
|
EXAMPLE
|
|
example_file.puts example_contents.gsub(/^ +\| /, '')
|
|
puts "bundle exec nanoc3 co && open http://localhost:3000/docs/examples/#{identifier} && bundle exec nanoc3 aco"
|
|
end
|
|
end
|
|
|
|
desc "reference ../frameworks/fmwk/stylesheets/path/to/_module.sass", "Generate a reference page for the given stylesheet."
|
|
method_options :title => :string
|
|
def reference(stylesheet)
|
|
stylesheet = dereference(stylesheet)
|
|
identifier = "reference/#{stylesheet[:framework]}/#{stylesheet[:stylesheet]}"
|
|
identifier.gsub!(%r{/_},'/')
|
|
identifier.gsub!(/\.s[ac]ss/,'')
|
|
identifier.gsub!(%r{/#{stylesheet[:framework]}/#{stylesheet[:framework]}/},"/#{stylesheet[:framework]}/")
|
|
|
|
module_name = File.basename(identifier).gsub(/\.[^.]+$/,'').capitalize
|
|
framework_name = stylesheet[:framework].capitalize
|
|
|
|
title = @options[:title] || "#{framework_name} #{module_name}"
|
|
crumb = @options[:title] || module_name
|
|
|
|
file_name = "content/#{identifier}.haml"
|
|
directory = File.dirname(file_name)
|
|
|
|
puts "DIRECTORY #{directory}"
|
|
FileUtils.mkdir_p directory
|
|
|
|
puts " CREATE #{file_name}"
|
|
open(file_name, "w") do |reference_file|
|
|
contents = <<-CONTENTS
|
|
| ---
|
|
| title: #{title}
|
|
| crumb: #{crumb}
|
|
| framework: #{stylesheet[:framework]}
|
|
| stylesheet: #{stylesheet[:stylesheet]}
|
|
| classnames:
|
|
| - reference
|
|
| ---
|
|
| - render 'reference' do
|
|
| %p
|
|
| Lorem ipsum dolor sit amet.
|
|
CONTENTS
|
|
reference_file.puts contents.gsub(/^ +\| /, '')
|
|
|
|
puts " ITEM /#{identifier}/"
|
|
end
|
|
end
|
|
|
|
private
|
|
def dereference(stylesheet)
|
|
stylesheet = File.expand_path(stylesheet)
|
|
framework = Compass::Frameworks::ALL.find{|f| stylesheet.index(f.stylesheets_directory) == 0}
|
|
raise "No Framework found for #{stylesheet}" unless framework
|
|
{
|
|
:framework => framework.name,
|
|
:stylesheet => stylesheet[framework.stylesheets_directory.length+1..-1]
|
|
}
|
|
end
|
|
end
|