#!/usr/bin/ruby # # Templating program. Creates template files based on extensionm, with # keyword expansion. # # Templates should be stored in ., ~/.templates, or /usr/share/templates, # with the format template.ext, where ext is the extention the template is # used on. For example 'template.cc' would be used for 'myfile.cc'. # # Some variables are obtained automatically. For those that have to be set # specifically, like DESC, use "-s DESC=whatever". # # In templates, [%var FILE%] will be replaced with FILE, etc. # # See http://kapheine.hypa.net/archive/templates.tar.gz for example templates. require 'etc' require 'getoptlong' require 'PageTemplate' include Etc def usage() puts "template" puts "Copyright (C) 2004 Zachary P. Landau" puts "" puts "Usage: template [options] \n" puts "\t-s, --set\t\tset a variable\n" + "\t-l, --list\t\tdisplay available tags\n" + "\t-d, --templatedir\tspecify template directory\n" + "\t-t, --template\t\tspecify template to use\n" + "\t-f, --flag\t\tset boolean flag to true\n" end ext = nil flags = Hash.new templatedir = nil templatedirs = [ ".", "#{ENV['HOME']}/.templates", "/usr/share/templates" ] vars = { 'FILE_EXT' => nil, 'FILE' => nil, 'FILE_U' => nil, 'EMAIL' => nil, 'YEAR' => nil, 'NAME' => nil, 'DATE' => nil, } # define from command line cmdvars = Hash.new opts = GetoptLong.new( ['--set', '-s', GetoptLong::REQUIRED_ARGUMENT], ['--list', '-l', GetoptLong::NO_ARGUMENT], ['--templatedir', '-d', GetoptLong::REQUIRED_ARGUMENT], ['--template', '-t', GetoptLong::REQUIRED_ARGUMENT], ['--flag', '-f', GetoptLong::REQUIRED_ARGUMENT] ) opts.each do |opt, arg| case opt when '--list' || '-l' puts "Available tags:" vars.each_key do |key| puts "\t* #{key}" end exit 0 when '--set' || '-s' key, value = arg.split('=') cmdvars[key] = value when '--templatedir' || '-d' templatedir = arg when '--template' || '-t' ext = arg when '--flag' || '-f' flags[arg] = true else raise "Invalid option '#{opt}'" end end newfile = ARGV.shift if !newfile usage() exit 1 end ext = newfile.split('.').last if !ext #template = "#{templatedir}/template.#{ext}" template = nil found = false if !templatedir templatedirs.each do |dir| if File.exists?("#{dir}/template.#{ext}") template = "#{dir}/template.#{ext}" found = true break end end if !found puts "Template #{ext} does not exist, exiting" exit 1 end end # define the values we know vars['FILE_EXT'] = newfile vars['YEAR'] = Time.now.year vars['NAME'] = getpwnam(getlogin()).gecos vars['FILE'] = File.basename(newfile, '.'+ext) vars['FILE_U'] = vars['FILE'].upcase vars['DATE'] = Time.now.strftime("%m/%d/%Y") # define from environmental variables vars.each_key do |key| vars[key] = ENV[key] if ENV[key] end # update hash with command line variables vars.update(cmdvars) vars.default = '' ptemplate = PageTemplate.new() ptemplate.load(template) vars.each do |key, value| ptemplate[key] = value if value end flags.each do |key, value| ptemplate[key] = value if value end if File.exists?(newfile) print "#{newfile} exists, overwrite? [y/N] " answer = gets if answer !~ /(y|yes)/i exit 1 end end File.open(newfile, 'w') do |file| file.write(ptemplate.output) end