#!/usr/bin/env nush
#
# @file nuapp
# Creates a Nu application shell
#
# @copyright Copyright (c) 2008 Matt McCray, Elucidata unLTD.
(load "nu")
(load "cocoa")
(load "doc")
(load "template")
(function sh (command)
(puts command)
(set result (system command))
(if result
(puts "nuapp: error #{result})")
(exit result)))
(function create-project (projectName)
(set projectName (projectName capitalizedString))
(set projectShortName (projectName replaceString:" " withString:""))
(puts "Creating Nu App Project: #{projectName}")
;; Create folders...
(sh "mkdir '#{projectShortName}'")
(sh "mkdir '#{projectShortName}/nu'")
(sh "mkdir '#{projectShortName}/objc'")
(sh "mkdir '#{projectShortName}/resources'")
(sh "mkdir '#{projectShortName}/resources/English.lproj'")
(sh "mkdir '#{projectShortName}/resources/content'")
(sh "mkdir '#{projectShortName}/resources/content/#{projectShortName}Help'")
(sh "mkdir '#{projectShortName}/resources/content/#{projectShortName}Help/styles'")
(sh "mkdir '#{projectShortName}/resources/content/#{projectShortName}Help/images'")
;; Create initial main.nu, Nukefile, Credits.html, and Help index.html
(set main-nu (eval (NuTemplate codeForString:main-entry)))
(main-nu writeToFile:"#{projectShortName}/nu/main.nu")
(set nukefile (eval (NuTemplate codeForString:nuke-file)))
(nukefile writeToFile:"#{projectShortName}/Nukefile")
(set credits-file (eval (NuTemplate codeForString:credits)))
(credits-file writeToFile:"#{projectShortName}/resources/content/Credits.html")
(set help-file (eval (NuTemplate codeForString:swtitle-help)))
(help-file writeToFile:"#{projectShortName}/resources/content/#{projectShortName}Help/swtitle.html")
(set layout-file (eval (NuTemplate codeForString:layout-css)))
(layout-file writeToFile:"#{projectShortName}/resources/content/#{projectShortName}Help/styles/layout.css")
(puts "Done."))
(set main-entry <<-EONU
;; @file main.nu
;; @discussion Entry point for <%= projectName %>.
;;
;; @copyright Copyright (c ) 2008
(load "Nu:nu") ;; basics
(load "Nu:cocoa") ;; cocoa definitions
(load "Nu:menu") ;; menu generation
;; define the application delegate class
(class ApplicationDelegate is NSObject
(- applicationDidFinishLaunching:sender is
(build-menu default-application-menu "<%= projectName %>")))
;; install the delegate and keep a reference to it since the application won't retain it.
((NSApplication sharedApplication) setDelegate:(set delegate ((ApplicationDelegate alloc) init)))
;; this makes the application window take focus when we've started it from the terminal
((NSApplication sharedApplication) activateIgnoringOtherApps:YES)
;; run the main Cocoa event loop
(NSApplicationMain 0 nil)
EONU)
(set nuke-file <<-EONU
;; Nukefile for <%= projectName %>
;; source files
(set @nu_files (filelist "^nu/.*nu$"))
(set @c_files (filelist "^objc/.*.c$"))
(set @m_files (filelist "^objc/.*.m$"))
(set @icon_files (filelist "^resources/content/.*icns$"))
(set @resources (filelist "^resources/content/[^/]*$"))
;(set @nib_files (filelist "^resources/.*\.lproj/[^/]*\.nib$"))
;; application description
(set @application "<%= projectShortName %>")
(set @application_identifier "nu.programming.<%= projectShortName %>")
(set @application_icon_file "app-icon.icns")
(set @application_help_folder "<%= projectShortName %>Help")
;; tasks
(compilation-tasks)
(application-tasks)
(task "default" => "application")
EONU)
(set credits <<-EONU
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title><%= projectName %> Credits</title>
<style>
BODY { font-family: Lucida Grande; }
H1 { font-size: 110%; }
DT { font-weight: normal; }
DT SPAN { color: gray; }
DD { margin-left: 0px; padding-left: 10px; margin-bottom: 25px; }
</style>
</head>
<body>
<h1>Requisite Beta Disclaimer</h1>
<p>
<%= projectName %> is BETA software! It might violently explode thereby
taking out your computer, you, your neighbors, and three square blocks
of your neighborhood. Use at your own risk.
</p>
</body>
</html>
EONU)
(set swtitle-help <<-EONU
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<META NAME="AppleTitle" CONTENT="<%= projectName %> Help">
<META NAME="AppleIcon" CONTENT="../../app-icon.icns">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><%= projectName %> Help</title>
<link rel="Stylesheet" type="text/css" href="styles/layout.css">
</head>
<body>
<h3><%= projectName %></h3>
<h4>Requisite Beta Disclaimer</h4>
<p>
This is BETA software! It might violently explode thereby taking out
your computer, you, your neighbors, and three square blocks of your
neighborhood. Use at your own risk.
</p>
<h3>Known Issues</h3>
<ul>
<li>...</li>
</ul>
</body>
</html>
EONU)
(set layout-css <<-EONU
/* Help Styles for <%= projectName %> */
BODY {
font-family: lucida grande;
font-size: 12px;
}
EONU)
(set argv ((NuApplication sharedApplication) arguments))
(if (== 0 (argv count))
(then
(puts "You must supply a project name"))
(else
(create-project (argv 0))))