Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
NEWFILE(1)			  CommWare.NET			      NEWFILE(1)

NAME
     newfile - create new files from templates

SYNOPSIS
     This man page documents newfile v. 1.0.13.

     This is newfile v. 1.0.11.  Release: "Plastic leather, 13DDD"

     Copyright (c) 2002-2003 Alan Eldridge <alane@geeksrus.net>.  All rights re-
     served.

     usage:    newfile -h

	     newfile -V

	     newfile [options] -s|--show

	     newfile [options] -D<project>

	     newfile [options] -d<template>

	     newfile [options] -t<template> <file> ...

	     newfile [options] -p<template>.<projectname> [<dir>]
		     (note: <dir> defaults to <projectname> if omitted)

	 -h, --help			  Show this help.
	 -V, --version			  Show version and copyright.
	 -v, --verbose			  Turn on verbose messages.
	 -l, --license=LICENSE		  Set license type.
	 -t, --filetype=TEMPLATE	  Set file TEMPLATE to use.
					  Do *not* use with -p/--project.
	 -p=TEMPLATE.PROJECTNAME	  Set project TEMPLATE to use, and
					  PROJECTNAME of project being built.
					  Do *not* use with -t/--filetype.
	     --project
	 -s, --show			  Show installed file templates, project
					  templates, and license types.
	 -P, --pdoc=PROJECT		  Show embedded docs for PROJECT.
	 -T, --doc=TEMPLATE		  Show embedded docs for TEMPLATE.
	 -x, --exec-bit 		  Make the resulting file executable.
					  This option has no effect if a project
					  template is selected.
	 -a, --author=AUTHOR		  Set name of author.
	 -e, --email=EMAIL		  Set author's email address.
	 -o, --organization=ORGANIZATION  Set author's organization name.
	 -c, --owner=COPYRIGHT_OWNER	  Set copyright owner's name.
	 -I, --include=DIR		  Add DIR to search path.
	 -D, --define=VAR[=value]	  Define a variable. Value defaults to 1.

DESCRIPTION
     newfile is a program for creating starter files, or trees of files, by pro-
     cessing templates with a C-preprocessor-like syntax.

     Finding templates

     Directory searching

     Templates	and  projects  (file tree templates) are found by looking in the
     search path for a directory containing the template file(s).  For each  di-
     rectory  in  the  search  path,  three  subdirs  are  searched: "licenses",
     "projects", and "templates".

     The user can create a directory hierarchy $HOME/.newfile in which to  place
     new  or  modified templates and projects. This directory is searched before
     the system include directory. It should have the appropriate subdirectories
     for "licenses", "projects", and/or "templates", just like	the  system  in-
     clude directory.

     Other  search directories can be added with the "-I/--include" command line
     option. They will be searched before either the user's include directory or
     the system include directory, in the reverse order from that given  on  the
     command line.

     Naming template files

     Unlike  older  versions of this program, template subdirectories are always
     just 1 level deep. That is, e.g., the  "templates"  subdirectory  will  not
     have  any	subdirectories of its own. This simplifies the searching process
     immensely; in return, files must be named according to specific rules.

     For file templates, the name should be "tmpl@FILETYPE", where "FILETYPE" is
     the value given to the "-t/--template" command line option. E.g., the  tem-
     plate for ruby files ("-t rb") is "tmpl@rb". These files are all located in
     the "templates" subdirectory of each directory on the search path.

     For  license  templates, the name should be "LTYPE@REALNAME", where "LTYPE"
     is the value given to the "-l/--license" command line  option,  and  "REAL-
     NAME"  is the actual name of the file. These files are all located (by con-
     vention) in the "licenses" subdirectory of each  directory  on  the  search
     path.

     For  project  templates,  the  naming convention is similar to that for li-
     censes, with the added feature that a "!" in the filename indicates  a  "/"
     in  the final directory name. This is how subdirectories in the project are
     specified. E.g., "auto@src!Makefile.am" means the file "Makefile.am" in the
     "src" subdirectory of the project directory. These files  are  all  located
     (by  convention)  in  the	"projects" subdirectory of each directory on the
     search path.

     Variables

     Builtins

     Some variables are built into the system, and  should  always  be	defined.
     Some will get default values if not defined.

     TEMPLATE
	 The  name  of	the  template  used  to construct the current project or
	 file(s).

     NAMEThe name of the input file, minus any directory prefix.

     NAMEID
	 An identifier based on NAME.

     PROJECT
	 If a project template is being expanded, this is the name of  the  tem-
	 plate.

     PROJECTID
	 An identifier based on PROJ.

     LICENSE
	 Defined  by the command line option "-l/--license". Licenses are a spe-
	 cial case of project templates, and their files are  mixed  in  with  a
	 project template's file. In the case of a single file, the value of LI-
	 CENSE	determines which directory to search for a file called "license"
	 that is included in the generated file.

     AUTHOR
	 Defined by the command line option "-a/--author". The name of	the  au-
	 thor  of the code or document. If not given, taken from the user's full
	 name in the "/etc/passwd" file.

     EMAIL
	 Defined by the command line option "-e/--email".  If  not  given,  con-
	 structed from the user's login name and the hostname.

     ORGANIZATION
	 The  organization  to	which  the author belongs, in the context of the
	 code or document being created. If not given, defaults to the value  of
	 AUTHOR.

     OWNER
	 Defined by the command line option "-o/--owner". The owner of the copy-
	 right. May be an arbitrary string, or one of the special strings "org",
	 "organization", or "author". If not given, defaults to "author".

     BODYIf  defined,  indicates  to many templates to include extra boilerplate
	 text to define a skeleton body for the file. See  the	individual  tem-
	 plates  for  details.	The shell and ruby templates are especially good
	 examples, since these are the languages I've been using most and  these
	 templates have received the most attention to detail.

     c(omment)
	 The  value  of  a  leading  string  to be prefixed to text in a comment
	 block. This is handled entirely within the templates themselves.

     Getting a variable's value

     The syntax <:VARIABLE> will be substituted with the value of the  variable.
     If the variable does not exist, it will be replaced with the string "*UNDE-
     FINED*".

     Checking if a variable is defined

     The special function defined("VARIABLE") can be used in preprocessor condi-
     tionals (the section on "Preprocessor directives") to test if a variable is
     defined or not.

     Note: the quotes around the variable name are required.

     Files

     Checking if a file exists

     The  special function exists("filename") can be used in preprocessor condi-
     tionals (the section on "Preprocessor directives") to test if a variable is
     defined or not.

     Note: the quotes around the filename are required.

     Note: Relative paths are evaluated relative to  the  directory  from  which
     newfile was run. (newfile does not change directory in the course of execu-
     tion.)

     Line continuation

     Lines used to control the preprocessor (the section on "Preprocessor direc-
     tives")  may  be  continued by ending the line with the characters "%+". No
     spaces may appear after these characters in order for the line to	be  con-
     tinued.

     Preprocessor directives

     The  pre-processor  supports a set of directives very similar to the C pre-
     processor. The leading character for all directives in "%", and must  occur
     in the first column of the line.

     %define VAR [VALUE]
	 Define  or  redefined	a variable. One layer of quotes is stripped from
	 the optional value unless the open quote is preceded by a literal back-
	 slash ("\"). The default value is "1".

     %undef VAR
	 Undefine a variable, if it is defined.

     %license
	 Insert the contents of the currently defined license header.  This is a
	 file called, e.g., "LTYPE@license.inc",  where  LTYPE	is  the  license
	 type, such as BSD or GPL.

     %include <file>
	 Insert  the  contents	of  "file"  at	this point. The file is found by
	 searching the current search path. Variable substitution  is  performed
	 on  "file", so "%include <<:BODY>>" will include the file whose name is
	 in the variable "BODY".

     %if COND-EXPRESSION
	 Test a conditional expression. Expressions are evaluated  by  the  Ruby
	 interpreter after variable substitution. The text up to the next match-
	 ing "%elif", "%else", or "%endif" is used if the expression is true.

     %elif COND-EXPRESSION
	 Shorthand for "%else", followed by "%if", but saves an extra "%endif".

     %else
	 The  text  up to the matching "%endif" if used if the previously tested
	 condition(s) was/were false.

     %endif
	 Ends a "%if/%elif/%else" sequence.

     %metastr STR
	 Sets the string used to start preprocessor directives	to  STR.  It  is
	 initially  set  to "%". This directive remains in effect only until the
	 end of the file in which it occurs. It cannot be used	in  an	included
	 file to change the interpretation of the enclosing file.

	 Note:	If  the  template needs to include a license file, it would be a
	 good idea to wait until after that is done before using this directive.

	 Note: This directive was added specifically to allow creation of Magic-
	 Point templates, which have a "%if" statement. To avoid confusion,  try
	 to avoid its use wherever possible.

     %metapush STR
	 Sets  the  string  used  to start preprocessor directives to STR. It is
	 initially set to "%". This directive remains in effect only  until  the
	 "?metapop" directive is encountered. All "%metapush" directives are un-
	 done at the end of the file in which they were found.

     %metapop
	 Sets  the  string  used to start preprocessor directives to what it was
	 before the most recent "%metapush".

     %endCauses the preprocessor to ignore the rest of the file. You can,  e.g.,
	 put documentation about the template after a "%end".

     All  other  lines are either copied with variable substitution, or ignored,
     depending on the current conditional state.

DIAGNOSTICS
     The preprocessor attempts to issue error messages that are as  accurate  as
     possible.	Each  error  message is formatted like gcc's error messages, and
     shows the included files leading up to the point of the the error.

ENVIRONMENT
     NEWFILE
	 String containing default command line options.  Normal  shell  quoting
	 conventions apply.

FILES
     *	 $HOME/.alane-newfile/*

     *	 $PREFIX/share/alane-newfile/*

CAVEATS
     *	 Does not check before overwriting existing files.

BUGS
     *	 Doesn't always issue good error messages and exit gracefully if bad in-
	 put  is  given. Too much of the Ruby exception mechanism may be exposed
	 to the user.

RESTRICTIONS
     See the BSD License in the file "LICENSE" in the source distribution.

NOTES
     There's still room for improvement, but the basic engine is solid. What  is
     needed now are more templates, and getting all the templates documented.

     A command line option to fetch template documentation after a %end would be
     really nice, too.

AUTHOR
     AlanE@geeksrus.net

HISTORY
     This  is  the third rendition of this program, written first in shell, then
     in Python, and finally in ruby. In this case, I think  ruby  allows  easier
     transition from intent to code than Python.

3rd Berkeley Distribution	    GEEK OUT!			      NEWFILE(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=newfile&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help