Template File Spec

This specification describes the contents of a template file, used for producing formatted output from a Collection of Notes.

Notenik will look for two sorts of special strings embedded within a template file: variables and commands. These are identified by special delimiters.

Delimiters

Notenik will recognize either of two sets of command and variable delimiters automatically. The choice of delimiters will be triggered by the first command-beginning delimiters encountered. The new delimiters are generally recommended, since they are more likely to be treated kindly by various HTML editors when creating your template files.

MeaningOriginal DelimitersNew Delimiters
Start of Command<<<?
End of Command>>?>
Start of Variable<<=$
End of Variable>>$=
Start of Variable Modifiers&&

Variables

Variables will be replaced by values taken from the corresponding fields of the current Note, or from an internal table of global variables. Variables must be enclosed in the chosen delimiters. Each variable name must match a field label from the data source, or a global name specified in a SET command. The comparison ignores case (upper or lower), embedded spaces and embedded punctuation when looking for a matching field label. So a field label of “First Name” will match with a variable of “firstname”, for example.

A variable, unlike a command, can appear anywhere within the template file, and need not be isolated on a line by itself. More than one variable can appear on the same line. Variables can be used within template commands, as well as other places within the template file.

The following special variables are predefined and available for substitution, no matter what data source is being used.

datafilename
The name of the data source being used.
dataparent
The path to the enclosing folder for the current data file. This can be used as part of an output command to specify an output file in the same folder as the data file.
nobr
Placing the variable 'nobr' anywhere on a line will cause that line to be written out without a trailing line break. The nobr variable itself will be removed from the line, without being replaced.
parentfolder
The lowest-level folder immediately enclosing the data file.
relative
If a Web Root directory has been specified, then this variable will be replaced by the relative path from the output file being created back to the root directory.
templatefilename
The name of the template file (not including the path to the template file).
templateparent
The entire parent path to the template file, excluding the file name itself.
today
The current date, at the time that template output is being generated.

Variable Modifiers

A variable can be optionally followed (before the ending variable delimiters) by a modifier indicator and one or more modifiers. The default modifier character is the ampersand (&).

The following list summarizes the primary use of various letters and characters as variable modifiers.

'Email Apostrophes
,List Punctuation
1Length Modifier
BBase File Name
CWord Demarcation
FFile Name
GLinked Tags
HHTML
IInitial Case
JLink
KHour of Day
LLowercase Modifier
MMonth or Minutes
NNo Breaks
OMarkdown to HTML
PPunctuation Purification
QQuotation Encasing
RKeep characters on the right
RReadable File Name
SSummarize
UUppercase Modifier
VVariance
XXML
_Underscore
aAM/PM
yYear
ddDay of Month
EEEDay of Week, Abbreviated
DashRemove Paragraph Tags
EEEEDay of Week

Following is a list of the variable modifiers with complete descriptions of how each works.

Email Apostrophes “’”

Placing a single apostrophe as part of the variable modifiers string will cause any HTML entities representing an apostrophe to be converted back to a normal ASCII/UTF apostrophe character: ’. This can be useful for generating HTML to use as e-mail content, since e-mail parsers seem to sometimes drop the HTML entities commonly used for apostrophes.

List Punctuation “,”

Any punctuation character, other than ones specificaly called out in this list for other purposes, will be interpreted as a separator that will be placed before the current variable, if the variable is non-blank, and if the preceding variable was also non-blank and also marked by the same variable modifier. A space will be added after the separator, and before the current variable, if the punctuation is not a forwards or backwards slash (”/” or “\”). This is an easy way to list several variables on a single line, separating non-blank ones from others with commas (or other punctuation).

Length Modifier “1”

One or more consecutive digits within the modifiers will be interpreted as the length to which the variable should be truncated or padded. If the length modifier is shorter than the variable length, then by default characters will be truncated on the right (and preserved on the left) of the variable to bring it to the specified length. If it is desired to keep characters on the right, then also use the “R” modifier and place it before the length modifier digits. If the length modifier is longer than the initial variable length, then the variable will be padded with zeroes on the left to bring it to the specified length.

Base File Name “B”

The letter “B” will cause the file extension, including the period, to be removed from a file name. This can be used, for example, to generate an output file name with the same name as the input data file (using the variable name “datafilename”), but with a different extension.

Word Demarcation “C”

The letter “C” indicates that the variable consists of a series of words, and you wish to change or standardize the way in which the words are distinguished from one another. When parsing the variable, the beginning of a new word will be indicated by either whitespace or punctuation between words, or by a transition from lowercase to uppercase (as in CamelCase usage). In other words, “two words”, “TWO_WORDS” or “twoWords” would all be parsed into two separate words.

What you want done with the word demarcation is defined by the characters following the “C” in the modifiers string. The letter “u” indicates a conversion to uppercase, the letter “l” indicates a conversion to lowercase, and the letter “a” indicates that the character should be left as-is. Anything other than these three characters (including a space) will be interpreted as a separator to be placed between the words.

Note that the u/l/a indicator can be specified three different times.

  1. The first appearance will control the case of the first letter in the entire variable;
  2. The second appearance will control the case of the first letter of each word;
  3. The third appearance will control the appearance of all other letters.

For example, if the template file contained the following:

=$name&cuul$=

And the name variable was equal to:

HERB BOWIE

Then the resulting name in the output text file would be:

Herb Bowie

File Name “F”

Converts a string to a conventional, universal file name, changing spaces to dashes, removing any odd characters, making all letters lower-case, and converting white space to hyphens.

Linked Tags “G”

Each tag found in the variable will be made into a link, linking to ‘=$relative$=yypathyy/xxtagxx.html’, where ‘xxtagxx’ is the tag, and ‘yypathyy’ is the string of characters following the ‘g’.

HTML “H”

The letter “H” will cause selected special characters to be translated to their equivalent HTML entities.

Initial Case “I”

When the letter ‘I’ immediately follows an ‘L’ or a ‘U’, then the case transformation (lower or upper) will only be applied to the initial letter of the variable.

Link “J”

Convert a URL to an HTML anchor tag with that URL as the href value.

Hour of Day “K”

Two lowercase ‘k’s will represent a 2-digit hour of the day on a 12-hour clock, within a date formatting string. Two uppercase ‘K’s will represente a 2-digit hour on a 24-hour clock.

Lowercase Modifier “L”

Converts the letters of the variable to lowercase. If immediately followed by ‘I’, then only the initial letter of the variable will be changed to lowercase.

Month or Minutes “M”

Used in a date formatting string, with the following effects:

No Breaks “N”

Remove HTML break (br) tags from the string.

Markdown to HTML “O”

The letter “O” will cause the field to be treated as Markdown, and converted to HTML.

Following this letter with a minus sign (’-’) will cause any opening and closing paragraph tags (’<p>’ and ‘</p>’ respectively) to be stripped from the resulting field (thus reducing the chance for possible conflicts with other tags).

Punctuation Purification “P”

Remove awkward punctuation characters.

Quotation Encasing “Q”

This letter will cause the value to be enclosed in quotation marks, if the value contains quotation marks, or tabs, or newline characters.

Keep characters on the right “R”

The letter “R”, in combination with a length modifier, will cause the variable to be truncated to the given length, truncating characters on the left and keeping characters on the right.

Readable File Name “R”

The letter “R”, following the letter “F”, will cause the variable to be converted to a safe file name, but preserving as much human readability as possible.

Summarize “S”

The letter “S” will pull the first few sentences from the field, within the first 250 characters. Specifying a number immediately following the “S” will override the default of 250 with the specified number.

Uppercase Modifier “U”

Converts the letters of the variable to uppercase (capital letters). If immediately followed by ‘I’, then only the initial letter of the variable will be changed to uppercase.

Variance “V”

The first character following the ‘v’ will be used as a delimiter. Everything between the delimiters will be used as a from field. Everything following the second delimiter will be used as a to field. All output lines will be scanned for occurrences of the from field, and will be replaced with the to field.

XML “X”

The letter “X” will cause selected special characters to be translated to their equivalent XML entities. This is recommended, for example, when publishing an RSS (Really Simple Syndication) feed.

Underscore “_”

An underscore character (”_”) will cause all spaces in the variable to be replaced by underscores. This can be useful when creating a file name, for example. Leading and trailing spaces will be trimmed without replacement.

AM/PM “a”

Represents an AM/PM indicator within a date formatting string.

Year “y”

Used within a formatting string, with the following effects:

Day of Month “dd”

Represents a two-digit day of month within a date formatting string.

Day of Week, Abbreviated “EEE”

Represents an abbreviated, 3-character, day of week within a date formatting string.

Remove Paragraph Tags “Dash”

When used following the letter ‘o’, indicating conversion from Markdown to HTML, a dash (’-’) indicates that leading and trailing paragraph tags should be stripped from the output.

Day of Week “EEEE”

Represents a full day of week within a date formatting string.

Formatting String

A string of characters indicating how the variable is to be formatted. The formatting string, if specified, should follow any other variable modifiers. Any character other than the modifiers listed above will cause the remainder of the variable modifiers to be treated as a formatting string. Currently, a formatting string is valid only for dates – either for the special variable today, or for any variable date in “mm/dd/yy” format.

A date formatting string follows the normal rules for Java date formatting. One or more occurrences of an upper-case “M” indicates a month, a lower-case “y” is used for a year, and a lower-case “d” is used for the day of the month. An upper-case “E” can be used for the day of the week. Generally, the number of occurrences of each letter you specify will be used to indicate the width of the field you want (“yyyy” for a 4-digit year, for example). Specifying more than two occurrences of “M” indicates you want the month represented by letters rather than numbers, with 4 or more occurrences indicating you want the month spelled out, and 3 occurrences indicating you want a three-letter abbreviation.

See below for full definition of allowable characters and their meanings.

Symbol Meaning Presentation Example
G era designator Text AD
y year Number 1996
M month in year Text & Number July & 07
d day in month Number 10
h hour in am/pm 1~12 12
H hour in day 0~23 0
m minute in hour Number 30
s second in minute Number 55
S millisecond Number 978
E day in week Text Tuesday
D day in year Number 189
F day of week in month Number 2 (2nd Wed in July)
w week in year Number 27
W week in month Number 2
a am/pm marker Text PM
k hour in day Number 24
K hour in am/pm Number 0
z time zone Text Pacific Standard Time
' escape for text Delimiter
single quote Literal

The count of pattern letters determine the format.

(Text): 4 or more pattern letters–use full form, < 4–use short or abbreviated form if one exists.

(Number): the minimum number of digits. Shorter numbers are zero-padded to this amount. Year is handled specially; that is, if the count of ‘y’ is 2, the Year will be truncated to 2 digits.

(Text & Number): 3 or over, use text, otherwise use number.

Any characters in the pattern that are not in the ranges of [‘a’..‘z’] and [‘A’..‘Z’] will be treated as quoted text. For instance, characters like ‘:’, ‘.’, ’ ’, ‘#’ and ‘@’ will appear in the resulting time text even they are not embraced within single quotes.

Commands

All commands must be enclosed in the chosen delimiters. In addition, all commands must appear on lines by themselves. Command names can be in upper- or lower-case. Each command may have zero or more operands. Operands may be separated by any of the following delimiters: space, comma (’,’), semi-colon (’;’) or colon (’:’). Operands that contain any of these delimiters must be enclosed in single or double-quotation marks.

The following commands are recognized. They are presented in the typical sequence in which they would be used.

<?delims new delimiters?>

<?output "filename.ext"?>

<?set global = 0?>

<?nextrec?>

<?include "filename.ext" ?>

<?ifchange ?>

<?if ?>

<?definegroup group-number ?>

<?ifendgroup group-number?>

<?ifendlist group-number?>

<?ifnewlist group-number?>

<?ifnewgroup group-number?>

<?else?>

<?endif?>

<?loop?>

delims Command

If used at all, this command should be the first command in the template file. This command overrides the standard delimiters used to recognize the beginnings and ends of commands and variables, for the remainder of the current template file. The command can have one to five operands. Each operand will become a new delimiter. They should be specified in the following order.

Note that, in addition to specification of the delims command, the first characters found on the first line of the template file can trigger the Notenik template processor to use an alternate set of delimiters.

set Command

This command can define a global variable and set its value. This command would normally have three operands: the name of the global variable, an operator, and a value.

One intended use for the set command is to support a line counter. By initializing the value to 0, and then adding to it whenever an output line is generated, the IF command can be used to check for page overflow (in a table column, for example), and then start a new page or column, resetting the counter to 0 again.

Another common use for the set command is to preserve record variables in global variables so that they will be available within an ifendgroup block.

output Command

This command names and opens the output file, where the results of the template merge will be stored. The single operand is the name of the output file. This command would normally be the first line in your template file. Subsequent template records will be written to the output file. Note, however, that the filename can contain a variable name. In this case, the output command would follow the nextrec command, and a new output file would be opened for each row input.

nextrec Command

This command indicates the beginning of the code that will be processed/written out once per data row. Lines prior to the nextrec command will only be processed/written out once.

definegroup Command

This is the first of five commands that define key fields and then conditionally write output when there is a break on any of those fields.

Up to ten group break fields can be defined. Each must be assigned a number from 1 to 10. Numbers should be assigned sequentially beginning with 1.

Input data should normally be sorted by the same fields used in any definegroup commands.

A definegroup command should normally follow a nextrec command. Each time that a definegroup command is encountered, Notenik stores the value of the variable, and checks for a change in the value for the specified group number.

Definegroup commands should precede ifendgroup and ifnewgroup commands, and should generally be specified in ascending order by group number.

The definegroup command has two operands.

ifendgroup Command

This is the second of the five group commands.

Lines following this command and preceding the next group or endif command will be written to the output file at the end of a group of records sharing a common value for this key field.

Ifendgroup commands should follow definegroup commands and precede ifnewgroup commands, and should generally be specified in descending order by group number.

The ifendgroup command has one operand.

ifendlist Command

This is the third of the five group commands.

Lines following this command and preceding the next group or endif command will be written to the output file at the end of a list of records containing this key field.

The end of a list will be triggered by a change in key values at the next higher level, or by a record containing blanks at the current group level.

Ifendlist commands should follow ifendgroup commands and precede ifnewlist commands, and should generally be specified in descending order by group number.

The ifendlist command has one operand. Note that the ifendlist and ifnewlist commands can generally be used to insert HTML tags to end a list and begin a list.

Note that references to record variables within an ifendlist block will retrieve the data from the record causing the break (i.e., the first record in the new group), not the last record in the group just ended. Use the set command to save data in global variables if you need to later access it when a list break has been detected.

ifnewlist Command

This is the fourth of the five group commands.

Lines following this command and preceding the next group or endif command will be written to the output file at the beginning of a new list of records at this group level.

Ifnewlist commands should follow definegroup, ifendgroup and ifendlist commands, should precede ifnewgroup commands, and should generally be specified in ascending order by group number. The ifnewlist command has one operand.

ifnewgroup Command

This is the fifth of the five group commands.

Lines following this command and preceding the next group or endif command will be written to the output file at the beginning of a group of records sharing a common value for this key field.

Ifnewgroup commands should follow all other group commands, and should generally be specified in ascending order by group number.

The ifnewgroup command has one operand.

if Command

The if command can be used to test a variable to see if it is non-blank. If the variable is non-blank, then the following lines up to the closing endif command will be subject to normal output processing. If the variable is blank, then following lines will be skipped until the closing endif command is encountered. In this case, the first and only operand would be the variable to be tested.

The if command can also be used to test a variable to compare it to a constant (or other variable). In this case, the command would have three or more operands: the name of the variable, a logical operator, and one or more values.

In this second scenario, three operands are provided: the first value (variable or constant), a comparison operator, and the second value (variable or constant).

Any of the following comparisons may be performed, and each may be invoked with the appropriate symbols, abbreviation or words. Note that slashes are used in the following list to separate alternative representations for each operator.

  1. = / == / eq / equals
  2. > / gt / greater than
  3. >= / !< | / ge / greater than or equal to
  4. < / lt / less than
  5. <= / !> / le / less than or equal to
  6. <> / != / ne / not equal to
  7. () / [] / co / contains
  8. !() / ![] / nc / does not contain
  9. (<) / [<] / st / starts with
  10. !(<) / ![<] / ns / does not start with
  11. (>) / [>] / fi / ends with
  12. !(>) / ![>] / ng / does not end with

Note that, if both values appear to be integers, then a numeric comparison will be performed for operands 1 - 6. In all other cases, strings will be compared.

else Command

The else command terminates the scope of its preceding if, ifchange, ifendgroup or ifnewgroup command, and applies the opposite logical condition to the following template lines.

endif Command

The endif command terminates the scope of its corresponding if, ifchange, ifendgroup or ifnewgroup command.

include Command

This command allows you to include text from another file into the output stream being generated by the template.

An optional operand of “copy” will ensure that the include file is included without conversion; otherwise, if the input and output file extensions are different, and are capable of conversion, the input file will be converted to the output file’s format (for example, Markdown or Textile can be converted to html).

Markdown conversion will be done using the flexmark processor, using the options for typographic conversions (as with SmartyPants), table generation and definition lists.

Textile conversion will be done using Notenik’s own Textile processor which is, admittedly, incomplete, and yet may still be useful for some users.

If converting from Markdown, then an optional operand of “nometa” will cause metadata lines to be skipped when generating the HTML output; otherwise, they will be included.

The filename may include variables, allowing you to tailor the included content based on one or more fields from your input data source. This is especially useful when you would like to include output from another template in the output generated by this template (effectively combining outputs from two separate templates into a single output). If an include file is not found, then it will simply be skipped and processing will continue, with a log message to note the event.

For any conversion resulting in HTML, a pseudo-tag of <toc> can be used to generate a table of contents based on following heading tags. An optional attribute of “from” can be used to specify the beginning of a range of heading levels to be included; an optional attribute of “through” or “thru” can be used to specify the end of a range of heading levels to be included. See the following example.

	<toc from="h2" thru="h4" />

loop Command

This command indicates the end of the code that will be processed/written out once per data row. Lines after the loop command will be processed/written out once per execution.