From fa1b95982a05ca860ada827b9fbdc9def1ac8952 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Wed, 21 Sep 2011 00:15:45 +0200 Subject: Added documentation, an example program and fixed some bugs... --- docu/index.html | 37 ++ docu/language_definition.html | 535 ++++++++++++++++ docu/nd/Data/ClassHierarchy.nd | Bin 0 -> 385 bytes docu/nd/Data/ConfigFileInfo.nd | Bin 0 -> 26 bytes docu/nd/Data/FileInfo.nd | 3 + docu/nd/Data/ImageFileInfo.nd | Bin 0 -> 8 bytes docu/nd/Data/ImageReferenceTable.nd | Bin 0 -> 165 bytes docu/nd/Data/IndexInfo.nd | Bin 0 -> 226 bytes docu/nd/Data/PreviousMenuState.nd | Bin 0 -> 239 bytes docu/nd/Data/PreviousSettings.nd | Bin 0 -> 127 bytes docu/nd/Data/SymbolTable.nd | Bin 0 -> 6457 bytes docu/nd/Languages.txt | 113 ++++ docu/nd/Menu.txt | 60 ++ docu/nd/Topics.txt | 81 +++ docu/nd/files/stupid_template_engine-php.html | 88 +++ docu/nd/index.html | 1 + docu/nd/index/Classes.html | 37 ++ docu/nd/index/Constants.html | 37 ++ docu/nd/index/Files.html | 33 + docu/nd/index/Functions.html | 65 ++ docu/nd/index/General.html | 81 +++ docu/nd/index/Variables.html | 41 ++ docu/nd/javascript/main.js | 836 ++++++++++++++++++++++++++ docu/nd/javascript/searchdata.js | 182 ++++++ docu/nd/search/ClassesF.html | 20 + docu/nd/search/ClassesS.html | 20 + docu/nd/search/ConstantsM.html | 20 + docu/nd/search/ConstantsT.html | 20 + docu/nd/search/FilesS.html | 20 + docu/nd/search/FunctionsC.html | 20 + docu/nd/search/FunctionsE.html | 20 + docu/nd/search/FunctionsG.html | 20 + docu/nd/search/FunctionsL.html | 20 + docu/nd/search/FunctionsP.html | 20 + docu/nd/search/FunctionsR.html | 20 + docu/nd/search/FunctionsS.html | 20 + docu/nd/search/FunctionsSymbols.html | 20 + docu/nd/search/FunctionsT.html | 20 + docu/nd/search/GeneralB.html | 20 + docu/nd/search/GeneralC.html | 20 + docu/nd/search/GeneralE.html | 20 + docu/nd/search/GeneralF.html | 20 + docu/nd/search/GeneralG.html | 20 + docu/nd/search/GeneralL.html | 20 + docu/nd/search/GeneralM.html | 20 + docu/nd/search/GeneralP.html | 20 + docu/nd/search/GeneralR.html | 20 + docu/nd/search/GeneralS.html | 20 + docu/nd/search/GeneralSymbols.html | 20 + docu/nd/search/GeneralT.html | 20 + docu/nd/search/GeneralV.html | 20 + docu/nd/search/NoResults.html | 15 + docu/nd/search/VariablesB.html | 20 + docu/nd/search/VariablesP.html | 20 + docu/nd/search/VariablesV.html | 20 + docu/nd/styles/main.css | 767 +++++++++++++++++++++++ example/index.php | 58 ++ example/templates/src/articles.html | 49 ++ example/templates/src/custom_tags.tpl | 19 + example/templates/src/master.html | 41 ++ language_definition.html | 491 --------------- mkdocu.sh | 4 + stupid_template_engine.php | 382 +++++++++--- 63 files changed, 4071 insertions(+), 585 deletions(-) create mode 100644 docu/index.html create mode 100644 docu/language_definition.html create mode 100644 docu/nd/Data/ClassHierarchy.nd create mode 100644 docu/nd/Data/ConfigFileInfo.nd create mode 100644 docu/nd/Data/FileInfo.nd create mode 100644 docu/nd/Data/ImageFileInfo.nd create mode 100644 docu/nd/Data/ImageReferenceTable.nd create mode 100644 docu/nd/Data/IndexInfo.nd create mode 100644 docu/nd/Data/PreviousMenuState.nd create mode 100644 docu/nd/Data/PreviousSettings.nd create mode 100644 docu/nd/Data/SymbolTable.nd create mode 100644 docu/nd/Languages.txt create mode 100644 docu/nd/Menu.txt create mode 100644 docu/nd/Topics.txt create mode 100644 docu/nd/files/stupid_template_engine-php.html create mode 100644 docu/nd/index.html create mode 100644 docu/nd/index/Classes.html create mode 100644 docu/nd/index/Constants.html create mode 100644 docu/nd/index/Files.html create mode 100644 docu/nd/index/Functions.html create mode 100644 docu/nd/index/General.html create mode 100644 docu/nd/index/Variables.html create mode 100644 docu/nd/javascript/main.js create mode 100644 docu/nd/javascript/searchdata.js create mode 100644 docu/nd/search/ClassesF.html create mode 100644 docu/nd/search/ClassesS.html create mode 100644 docu/nd/search/ConstantsM.html create mode 100644 docu/nd/search/ConstantsT.html create mode 100644 docu/nd/search/FilesS.html create mode 100644 docu/nd/search/FunctionsC.html create mode 100644 docu/nd/search/FunctionsE.html create mode 100644 docu/nd/search/FunctionsG.html create mode 100644 docu/nd/search/FunctionsL.html create mode 100644 docu/nd/search/FunctionsP.html create mode 100644 docu/nd/search/FunctionsR.html create mode 100644 docu/nd/search/FunctionsS.html create mode 100644 docu/nd/search/FunctionsSymbols.html create mode 100644 docu/nd/search/FunctionsT.html create mode 100644 docu/nd/search/GeneralB.html create mode 100644 docu/nd/search/GeneralC.html create mode 100644 docu/nd/search/GeneralE.html create mode 100644 docu/nd/search/GeneralF.html create mode 100644 docu/nd/search/GeneralG.html create mode 100644 docu/nd/search/GeneralL.html create mode 100644 docu/nd/search/GeneralM.html create mode 100644 docu/nd/search/GeneralP.html create mode 100644 docu/nd/search/GeneralR.html create mode 100644 docu/nd/search/GeneralS.html create mode 100644 docu/nd/search/GeneralSymbols.html create mode 100644 docu/nd/search/GeneralT.html create mode 100644 docu/nd/search/GeneralV.html create mode 100644 docu/nd/search/NoResults.html create mode 100644 docu/nd/search/VariablesB.html create mode 100644 docu/nd/search/VariablesP.html create mode 100644 docu/nd/search/VariablesV.html create mode 100644 docu/nd/styles/main.css create mode 100644 example/index.php create mode 100644 example/templates/src/articles.html create mode 100644 example/templates/src/custom_tags.tpl create mode 100644 example/templates/src/master.html delete mode 100644 language_definition.html create mode 100755 mkdocu.sh diff --git a/docu/index.html b/docu/index.html new file mode 100644 index 0000000..f1e0f86 --- /dev/null +++ b/docu/index.html @@ -0,0 +1,37 @@ + + + + Stupid Template Engine + + + +

Stupid Template Engine

+

This documentation is splitted in two parts:

+
    +
  1. The definition of the STE Template/Programming language, including the documentation of the builtin tags and the standard library
  2. +
  3. The documentation of the PHP implementation
  4. +
+

It could also be helpful to take a look at the example program (the "example" directory).

+ + diff --git a/docu/language_definition.html b/docu/language_definition.html new file mode 100644 index 0000000..58d2abd --- /dev/null +++ b/docu/language_definition.html @@ -0,0 +1,535 @@ + + + + Language definition - Stupid Template Engine + + + + +

The STE Template/Programming Language

+

This is the documentation of the Template/Programming Language of the Stupid Template Engine, or STE T/PL

+ +

TOC

+
    +
  1. + Basic elements +
      +
    1. Text
    2. +
    3. Variable
    4. +
    5. Tag
    6. +
    7. + Pseudotag +
        +
      1. ste:comment
      2. +
      3. ste:rawtext
      4. +
      +
    8. +
    +
  2. +
  3. Escaping special chars
  4. +
  5. + Builtin tags +
      +
    1. ste:if
    2. +
    3. ste:cmp
    4. +
    5. ste:not
    6. +
    7. ste:even
    8. +
    9. ste:for
    10. +
    11. ste:foreach
    12. +
    13. ste:infloop
    14. +
    15. ste:break
    16. +
    17. ste:continue
    18. +
    19. ste:load
    20. +
    21. ste:block
    22. +
    23. ste:set
    24. +
    25. ste:calc
    26. +
    27. ste:mktag
    28. +
    +
  6. +
  7. + Standard Library +
      +
    1. ste:escape
    2. +
    3. ste:strlen
    4. +
    5. ste:arraylen
    6. +
    7. ste:inc
    8. +
    9. ste:dec
    10. +
    11. ste:date
    12. +
    +
  8. +
+ +

Basic Elements

+

The STE T/PL consists of four basic elements:

+ +

Text

+

Everything that is not a Variable, a Tag or a Pseudotag is Text.

+

Also everything that is wrapped in the ste:rawtext pseudotag will be Text, whereby all Tags and Variables will not be parsed.

+

Example:

+

+

Foo $baz[herpdederp]]]>
+ Will result in one text-element, but +
$baz[herpdederp]]]>
+ will result in one text-element and one tag-element containing one variable-element. +

+ +

Variable

+

Variables start with a $ or can be wrapped within ${ and }, so vou can write this: ${foo}ish

+

Variable have names, these names can consist of letters (english alphabet; upper and lower case), numbers and underscores (_). As a regex: [a-zA-Z0-9_]+

+

A variable can also be an array. To access an array, wrap the desired fieldname within [ and ]. A fieldname can be constructed of Text and othe Variables. So you can dynamically access fields: $foo[$bar]. These fieldnames can also be nested or concatenated: $foo[$bar[baz]][herp][$de[derp]]

+

If you want a literal $ char, you can escape it: \$

+

Variables in STE T/PL are typeless, everything ist text. In a boolean context, empty text usually represents false, else true.

+ +

Tag

+

A Tag can be compared to a function. A Tag can have parameters and children elements.

+

+ A Tag looks like a XML-Tag with the ste-Namespace. + Just like their XML counterparts, they can wrap other elements (barherpdederp]]>) or can be self-closing (]]>). + And they can have additional parameters (or "attributes", using the XML terminology): ]]> +

+

A Tag is wrapped in < and >. The tag's name always start with ste: and can then consist of letters, numbers and underscores (Regex: [a-zA-Z0-9_]+).

+

If the tag is self-closing, the last char is a / (e.g.: ]]>).

+

If the tag is a closing one, the first char is a /. An opening Tag does not have a /.An example of an opening-closing Tag pair wrapping the text bar: bar]]>

+

+ Parameters of a tag consists of a name and the corresponding value (wrapped in " or ') seperated by an = .
+ Parameters are seperated by any whitespace (space, tab or newline) char.
+ Parameter values can consist of Text and Variable elements but not of Tags!
+ If you need a literal " or ' in a parameter value, you can escape them: \" or \' .
+ When using variables in paramter values, they will be "replaced" by their value. Because many tags need the variable and not its content, they expect only the variable's name. If you then write foo="$bar", the tag will not operate on the bar variable but on the Variable with the name stored in $bar! So read the instructions to the tag carefully! +

+

Example: de ]]>

+ +

Pseudotag

+

Pseudotags look like normal tags, but they perform special tasks. There are currently two pseudotags:

+

ste:comment

+

With the ste:comment pseudotag you can comment your template/code. Everything between <ste:comment> and </ste:comment> will be ignored, before the real tokenization of the code starts.

+

ste:rawtext

+

The ste:rawtext pseudotag will output a Text element with its wrapped content. It will prevent parsing of the content. Useful if you are embedding another script language, which uses the $ char or also has a XML-Like syntax. No escape sequences will be translated! Can not be used in Tag parameter values!

+ +

Escaping special chars

+

To get a literal $, " or other special chars, STE T/PL gives you the following escape sequences:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Escape SequenceResultCan be used inNotes
\$$Text elements
\""Tag parameter values
\''Tag parameter values
\??Text elementsMore info: short if-clause
\{{Text elementsMore info: short if-clause
\}}Text elementsMore info: short if-clause
\||Text elementsMore info: short if-clause
\\\Everywhere, where the other escape sequences are valid
+

Escape sequences are not translated in Pseudotags

+ +

Builtin Tags

+

STE has some builtin Tags, that makes programming in STE T/PL possible.

+ +

ste:if

+

The ste:if Tag provides an if-clause to STE T/PL.

+

ste:if can have the subtags ste:then and ste:else. Everything between <ste:if> and </ste:if>, that is not an ste:then or ste:else tag, will be used as the condition.

+

Because STE T/PL is typeless, every empty string (trailing whitespaces will be ignored) is considered as false, everything else is true.

+

If the condition is true (i.e. not empty), the content of the ste:then block will be executed. Otherwise the ste:else tag (if present) will be executed.

+

The ste:then Tag is mandatory, the ste:else tag is optional.

+

+ Example:
+


+	$foo
+	Bar
+	Baz
+]]>
+ If $foo is not empty, then Bar will be executed, otherwise Baz. +

+

Short syntax for if-clause

+

Because if-clauses are used often, there is an short syntax:

+

?{condition|then|else}

+

This is equavilent to:

+

conditionthenelse]]>

+

?, {, | and } can be escaped

+

In this variant, the else part is not optional!

+

WARNING: short if-clauses can not be nested!

+ +

ste:cmp

+

With the ste:cmp tag you can compare two values.

+

ste:cmp is selfclosing, the compared values are passed by parameters.

+

It compares two values, a and b using an operator.

+

+ a and b can be passed in two ways: +

+ (where x is either a or b). +

+

+ The operator is passed wth the op parameter. Following parameters are available: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
op valueDescription
eqa and b are equal
neqa and b are not equal
lta is less than b
ltea is less or equal b
gta is greater than b
gtea is greater or equal b
+

+

If the comparasion was true, a non-empty text will be returned, otherwise an empty text, so you can use ste:cmp with ste:if

+

+ Example:
+


+	
+	:-)
+	:-(
+]]>
+ If the variable foo has the content bar, :-) will be returned, :-( otherwise. +

+ +

ste:not

+

The ste:not Tag will logically invert its content. If it is an empty text (i.e. false), it will return a non-empty text (i.e. true) and vice versa.

+

+ Example:
+


+	$foo
+	:-)
+	:-(
+]]>
+ If the variable foo is empty (i.e. false), :-) will be returned, :-( otherwise. +

+ +

ste:even

+

If the enclosed text is a number, and the number is even, this tag will return a non-empty text (i.e. true), an empty text (i.e. false) otherwise.

+ +

ste:for

+

ste:for provides a counter loop.

+

+ ste:for has these parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
parameter nameMandatory?Description
startYesBegin counting at this number.
stopYesStop counting at this number (inclusive).
stepNoWhat amount should be added to the counter at each round? (Default: 1)
counterNoThe current number will be stored in this variable (expects a variable name).
+

+

+ Example:
+


+	$i
+]]>
+ Will count from 10 down to 0 and output the number followed by an HTML line break. +

+ +

ste:foreach

+

ste:foreach will loop through an array.

+

+ ste:foreach has these parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
parameter nameMandatory?Description
arrayYesThe array to be looped through.
keyNoThe array key will be stored in this variable (expects variable name).
valueYesThe value of the current element will be stored in this variable (expects variable name).
counterNoExpects a variable name. If given, the current number of iterations will be stored in this variable. Starts with 0.
+

+

+ Example:
+


+	Number: $i
+ Key: $k
+ Value: $v
+
+]]>
+ This code will loop through the array foo and return the counter $i, the key $k and the value $v of the current iteration. +

+ +

ste:infloop

+

Create an infinitive loop. You can get out of the loop using the ste:break tag. Can be used to emulate othe loop constructs like while loops.

+

+ Example:
+


+	
+		
+		
+	
+	...
+]]>
+ This code will return ... while <ste:foo /> returns an empty text (i.e. false). +

+ +

ste:break

+

When this self-closing tag is called, the current loop (ste:for, ste:foreach, ste:infloop) will be aborted.

+ +

ste:continue

+

When this self-closing tag is called, the current loop(ste:for, ste:foreach, ste:infloop) will go to the next iteration, aborting the current iteration.

+ +

ste:load

+

This self-closing tag loads and executes anoter template. The name parameter (mandatory) defines the template to load.

+

Because each template must be parseable and transcompilable by itself, this is not a inclusion of another template. So you can not do this:

+

+ slave.tpl:
+


+	bla]]>
+ master.tpl
+

+]]>
+

+

But you can do this:

+

+ slave.tpl:
+

$bar]]>
+ master.tpl
+

+	
+]]>
+

+ +

ste:block

+

ste:block provides an easy way for writing master templates. Every block has a name. When a block is defined twice, the second will overwrite the first one.

+

The name can be set with the name parameter.

+

+ Example:
+ master.tpl +

Content:
+
+	Default content
+
+]]>
+ slave.tpl:
+

+
+	Much cooler content :-)
+]]>
+ When executing slave.tpl, master.tpl will be loaded and its content block will be replaced with the new one (Much cooler content :-)) but leave the original sidebar block. +

+

Blocks can not be nested.

+ +

ste:set

+

ste:set will set a variable. The parameter var takes the name of the variable to set. The content of the Tag will be the new content of the variable.

+

+ Example:
+

bar]]>
+ This will set the variable foo to bar. +

+

+ Tag parameter values can not contain Tags. ste:set can be used to bypass this:
+


+]]>
+

+ +

ste:calc

+

To perform mathematical calculations, you can use ste:math. ste:math calculates the mathematical formula it is wrapped around and returns the result. The formula is in the usual infix-notation [ext. Link] and has these operators: +, -, *, / and ^. Numbers are always decimal, the decimal mark is . and numbers can be prefixed with an - to indicate a negative number. It is a good idea to wrap a negative number in brackets to prevent wrong evaluation (because - is also an operator). Calculations can be grouped with brackets: ( and ).

+

Real numbers are supported, complex numbers not.

+

Formulas are evaluated at runtime, not during transcompilation.

+

+ Example:
+ (2+3+4) * (1.5 - (-0.5))]]> will return 18. +

+

This Tag is pretty slow, because the formula is not transcompiled and only evaluated at runtime. For some simple increment and decrement operations it is better to use the ste:inc and ste:dec Tags from the standard library.

+ +

ste:mktag

+

ste:mktag allows you to define own Tags using STE T/PL.

+

The parameter name (mandatory) expects the name of the new tag. If your tag requires some parameters, you can specify them using the optional mandatory parameter. Names of the mandatory parameters are seperated by |.

+

The Variable _tag_parameters (associative array) will hold all given parameters and their values.

+

With the ste:tagcontent tag you can execute the tags content.

+

ste:mktag will be transcompiled like any other code. So your custom tag will be almost as fast as a plugin coded in PHP.

+

+ Example: +


+	
+		
+	
+
+
+	 * 2
+
+
+	$i
+
]]>
+ Will output:
+

+8
+6
+4
+2
+0
]]>
+

+ +

Standard Library

+

The Standard Library contains some useful tags, which are not builtin but still always available.

+

ste:escape

+

Escapes characters that are reserved for HTML (e.g. <, >, ", &). The text to escape ist the tag's content. +

+ Example:
+

Foo & bar...]]>
+ Result:
+
Foo & bar...]]>
+

+ +

ste:strlen

+

Returns the length of then content.

+ +

ste:arraylen

+

Returns the number of elements in the array (variable name given by parameter array).

+ +

ste:inc

+

Increments (i.e. add 1) a variable (variable name given by parameter var).

+ +

ste:dec

+

Decrements (i.e. substract 1) a variable (variable name given by parameter var).

+ +

ste:date

+

Formats a time using PHPs date format [ext. Link]. The format is given in the tag's content. You can specify a time (unix timestamp) using the timestamp parameter (defaults to the current time).

+

+ Example:
+

d. M. Y, H:i:s]]>
+ Result:
+
+

+ + diff --git a/docu/nd/Data/ClassHierarchy.nd b/docu/nd/Data/ClassHierarchy.nd new file mode 100644 index 0000000..2e0591a Binary files /dev/null and b/docu/nd/Data/ClassHierarchy.nd differ diff --git a/docu/nd/Data/ConfigFileInfo.nd b/docu/nd/Data/ConfigFileInfo.nd new file mode 100644 index 0000000..36e0d8c Binary files /dev/null and b/docu/nd/Data/ConfigFileInfo.nd differ diff --git a/docu/nd/Data/FileInfo.nd b/docu/nd/Data/FileInfo.nd new file mode 100644 index 0000000..b0f91a4 --- /dev/null +++ b/docu/nd/Data/FileInfo.nd @@ -0,0 +1,3 @@ +1.4 +PHP +/home/skadu/public_html/stupid_template_engine/stupid_template_engine.php 1316548283 1 stupid_template_engine.php diff --git a/docu/nd/Data/ImageFileInfo.nd b/docu/nd/Data/ImageFileInfo.nd new file mode 100644 index 0000000..e6ccf0d Binary files /dev/null and b/docu/nd/Data/ImageFileInfo.nd differ diff --git a/docu/nd/Data/ImageReferenceTable.nd b/docu/nd/Data/ImageReferenceTable.nd new file mode 100644 index 0000000..ad9b847 Binary files /dev/null and b/docu/nd/Data/ImageReferenceTable.nd differ diff --git a/docu/nd/Data/IndexInfo.nd b/docu/nd/Data/IndexInfo.nd new file mode 100644 index 0000000..bd66e34 Binary files /dev/null and b/docu/nd/Data/IndexInfo.nd differ diff --git a/docu/nd/Data/PreviousMenuState.nd b/docu/nd/Data/PreviousMenuState.nd new file mode 100644 index 0000000..7c0aeba Binary files /dev/null and b/docu/nd/Data/PreviousMenuState.nd differ diff --git a/docu/nd/Data/PreviousSettings.nd b/docu/nd/Data/PreviousSettings.nd new file mode 100644 index 0000000..d319ede Binary files /dev/null and b/docu/nd/Data/PreviousSettings.nd differ diff --git a/docu/nd/Data/SymbolTable.nd b/docu/nd/Data/SymbolTable.nd new file mode 100644 index 0000000..00e4146 Binary files /dev/null and b/docu/nd/Data/SymbolTable.nd differ diff --git a/docu/nd/Languages.txt b/docu/nd/Languages.txt new file mode 100644 index 0000000..be96913 --- /dev/null +++ b/docu/nd/Languages.txt @@ -0,0 +1,113 @@ +Format: 1.4 + +# This is the Natural Docs languages file for this project. If you change +# anything here, it will apply to THIS PROJECT ONLY. If you'd like to change +# something for all your projects, edit the Languages.txt in Natural Docs' +# Config directory instead. + + +# You can prevent certain file extensions from being scanned like this: +# Ignore Extensions: [extension] [extension] ... + + +#------------------------------------------------------------------------------- +# SYNTAX: +# +# Unlike other Natural Docs configuration files, in this file all comments +# MUST be alone on a line. Some languages deal with the # character, so you +# cannot put comments on the same line as content. +# +# Also, all lists are separated with spaces, not commas, again because some +# languages may need to use them. +# +# Language: [name] +# Alter Language: [name] +# Defines a new language or alters an existing one. Its name can use any +# characters. If any of the properties below have an add/replace form, you +# must use that when using Alter Language. +# +# The language Shebang Script is special. It's entry is only used for +# extensions, and files with those extensions have their shebang (#!) lines +# read to determine the real language of the file. Extensionless files are +# always treated this way. +# +# The language Text File is also special. It's treated as one big comment +# so you can put Natural Docs content in them without special symbols. Also, +# if you don't specify a package separator, ignored prefixes, or enum value +# behavior, it will copy those settings from the language that is used most +# in the source tree. +# +# Extensions: [extension] [extension] ... +# [Add/Replace] Extensions: [extension] [extension] ... +# Defines the file extensions of the language's source files. You can +# redefine extensions found in the main languages file. You can use * to +# mean any undefined extension. +# +# Shebang Strings: [string] [string] ... +# [Add/Replace] Shebang Strings: [string] [string] ... +# Defines a list of strings that can appear in the shebang (#!) line to +# designate that it's part of the language. You can redefine strings found +# in the main languages file. +# +# Ignore Prefixes in Index: [prefix] [prefix] ... +# [Add/Replace] Ignored Prefixes in Index: [prefix] [prefix] ... +# +# Ignore [Topic Type] Prefixes in Index: [prefix] [prefix] ... +# [Add/Replace] Ignored [Topic Type] Prefixes in Index: [prefix] [prefix] ... +# Specifies prefixes that should be ignored when sorting symbols in an +# index. Can be specified in general or for a specific topic type. +# +#------------------------------------------------------------------------------ +# For basic language support only: +# +# Line Comments: [symbol] [symbol] ... +# Defines a space-separated list of symbols that are used for line comments, +# if any. +# +# Block Comments: [opening sym] [closing sym] [opening sym] [closing sym] ... +# Defines a space-separated list of symbol pairs that are used for block +# comments, if any. +# +# Package Separator: [symbol] +# Defines the default package separator symbol. The default is a dot. +# +# [Topic Type] Prototype Enders: [symbol] [symbol] ... +# When defined, Natural Docs will attempt to get a prototype from the code +# immediately following the topic type. It stops when it reaches one of +# these symbols. Use \n for line breaks. +# +# Line Extender: [symbol] +# Defines the symbol that allows a prototype to span multiple lines if +# normally a line break would end it. +# +# Enum Values: [global|under type|under parent] +# Defines how enum values are referenced. The default is global. +# global - Values are always global, referenced as 'value'. +# under type - Values are under the enum type, referenced as +# 'package.enum.value'. +# under parent - Values are under the enum's parent, referenced as +# 'package.value'. +# +# Perl Package: [perl package] +# Specifies the Perl package used to fine-tune the language behavior in ways +# too complex to do in this file. +# +#------------------------------------------------------------------------------ +# For full language support only: +# +# Full Language Support: [perl package] +# Specifies the Perl package that has the parsing routines necessary for full +# language support. +# +#------------------------------------------------------------------------------- + +# The following languages are defined in the main file, if you'd like to alter +# them: +# +# Text File, Shebang Script, C/C++, C#, Java, JavaScript, Perl, Python, +# PHP, SQL, Visual Basic, Pascal, Assembly, Ada, Tcl, Ruby, Makefile, +# ActionScript, ColdFusion, R, Fortran + +# If you add a language that you think would be useful to other developers +# and should be included in Natural Docs by default, please e-mail it to +# languages [at] naturaldocs [dot] org. diff --git a/docu/nd/Menu.txt b/docu/nd/Menu.txt new file mode 100644 index 0000000..85c51af --- /dev/null +++ b/docu/nd/Menu.txt @@ -0,0 +1,60 @@ +Format: 1.4 + + +# You can add a title and sub-title to your menu like this: +# Title: [project name] +# SubTitle: [subtitle] + +# You can add a footer to your documentation like this: +# Footer: [text] +# If you want to add a copyright notice, this would be the place to do it. + +# You can add a timestamp to your documentation like one of these: +# Timestamp: Generated on month day, year +# Timestamp: Updated mm/dd/yyyy +# Timestamp: Last updated mon day +# +# m - One or two digit month. January is "1" +# mm - Always two digit month. January is "01" +# mon - Short month word. January is "Jan" +# month - Long month word. January is "January" +# d - One or two digit day. 1 is "1" +# dd - Always two digit day. 1 is "01" +# day - Day with letter extension. 1 is "1st" +# yy - Two digit year. 2006 is "06" +# yyyy - Four digit year. 2006 is "2006" +# year - Four digit year. 2006 is "2006" + + +# -------------------------------------------------------------------------- +# +# Cut and paste the lines below to change the order in which your files +# appear on the menu. Don't worry about adding or removing files, Natural +# Docs will take care of that. +# +# You can further organize the menu by grouping the entries. Add a +# "Group: [name] {" line to start a group, and add a "}" to end it. +# +# You can add text and web links to the menu by adding "Text: [text]" and +# "Link: [name] ([URL])" lines, respectively. +# +# The formatting and comments are auto-generated, so don't worry about +# neatness when editing the file. Natural Docs will clean it up the next +# time it is run. When working with groups, just deal with the braces and +# forget about the indentation and comments. +# +# -------------------------------------------------------------------------- + + +File: stupid_template_engine.php (stupid_template_engine.php) + +Group: Index { + + Index: Everything + Class Index: Classes + Constant Index: Constants + File Index: Files + Function Index: Functions + Variable Index: Variables + } # Group: Index + diff --git a/docu/nd/Topics.txt b/docu/nd/Topics.txt new file mode 100644 index 0000000..b1a9b93 --- /dev/null +++ b/docu/nd/Topics.txt @@ -0,0 +1,81 @@ +Format: 1.4 + +# This is the Natural Docs topics file for this project. If you change anything +# here, it will apply to THIS PROJECT ONLY. If you'd like to change something +# for all your projects, edit the Topics.txt in Natural Docs' Config directory +# instead. + + +# If you'd like to prevent keywords from being recognized by Natural Docs, you +# can do it like this: +# Ignore Keywords: [keyword], [keyword], ... +# +# Or you can use the list syntax like how they are defined: +# Ignore Keywords: +# [keyword] +# [keyword], [plural keyword] +# ... + + +#------------------------------------------------------------------------------- +# SYNTAX: +# +# Topic Type: [name] +# Alter Topic Type: [name] +# Creates a new topic type or alters one from the main file. Each type gets +# its own index and behavior settings. Its name can have letters, numbers, +# spaces, and these charaters: - / . ' +# +# Plural: [name] +# Sets the plural name of the topic type, if different. +# +# Keywords: +# [keyword] +# [keyword], [plural keyword] +# ... +# Defines or adds to the list of keywords for the topic type. They may only +# contain letters, numbers, and spaces and are not case sensitive. Plural +# keywords are used for list topics. You can redefine keywords found in the +# main topics file. +# +# Index: [yes|no] +# Whether the topics get their own index. Defaults to yes. Everything is +# included in the general index regardless of this setting. +# +# Scope: [normal|start|end|always global] +# How the topics affects scope. Defaults to normal. +# normal - Topics stay within the current scope. +# start - Topics start a new scope for all the topics beneath it, +# like class topics. +# end - Topics reset the scope back to global for all the topics +# beneath it. +# always global - Topics are defined as global, but do not change the scope +# for any other topics. +# +# Class Hierarchy: [yes|no] +# Whether the topics are part of the class hierarchy. Defaults to no. +# +# Page Title If First: [yes|no] +# Whether the topic's title becomes the page title if it's the first one in +# a file. Defaults to no. +# +# Break Lists: [yes|no] +# Whether list topics should be broken into individual topics in the output. +# Defaults to no. +# +# Can Group With: [type], [type], ... +# Defines a list of topic types that this one can possibly be grouped with. +# Defaults to none. +#------------------------------------------------------------------------------- + +# The following topics are defined in the main file, if you'd like to alter +# their behavior or add keywords: +# +# Generic, Class, Interface, Section, File, Group, Function, Variable, +# Property, Type, Constant, Enumeration, Event, Delegate, Macro, +# Database, Database Table, Database View, Database Index, Database +# Cursor, Database Trigger, Cookie, Build Target + +# If you add something that you think would be useful to other developers +# and should be included in Natural Docs by default, please e-mail it to +# topics [at] naturaldocs [dot] org. diff --git a/docu/nd/files/stupid_template_engine-php.html b/docu/nd/files/stupid_template_engine-php.html new file mode 100644 index 0000000..025f28b --- /dev/null +++ b/docu/nd/files/stupid_template_engine-php.html @@ -0,0 +1,88 @@ + + +stupid_template_engine.php + + + + + + + + + +

stupid_template_engine.php

The implementation of the Stupid Template Engine.

Summary
stupid_template_engine.phpThe implementation of the Stupid Template Engine.
steEverything in this file is in this namespace.
Functions
parseParsing a STE T/PL template.
transcompileTranscompiles an abstract syntax tree to PHP.
Constants
Template modes
StorageAccessAn interface.
Functions
loadLoading a template.
saveSaves a template.
FilesystemStorageAccessThe default StorageAccess implementation for loading / saving templates into a directory structure.
Functions
__construct
STECoreThe Core of STE
Variables
Public variables
Functions
__construct
register_tagRegister a custom tag.
call_tagCalling a custom tag (builtin ones can not be called)
exectemplateExecutes a template and returns the result.
get_var_referenceGet a reference to a template variable using a variable name.
get_var_by_nameGet a template variable by its name.
loadLoad a template and return its result (blocks not included, use exectemplate for this).
evalboolTest, if a text represents false (an empty / only whitespace text) or true (everything else).
+ +

ste

Everything in this file is in this namespace.

Summary
Functions
parseParsing a STE T/PL template.
transcompileTranscompiles an abstract syntax tree to PHP.
Constants
Template modes
+ +

Functions

+ +

parse

function parse($code)

Parsing a STE T/PL template.  You only need this function, if you want to manually transcompile a template.

Parameters

$codeThe STE T/PL code.

Returns

An abstract syntax tree, whic can be used with transcompile.

+ +

transcompile

function transcompile($ast) /* Transcompile and add some boilerplate code. */

Transcompiles an abstract syntax tree to PHP.

Parameters

$astThe abstract syntax tree to transcompile.

Returns

PHP code.  The PHP code is an anonymous function expecting a STECore instance as its parameter and returns a string (everything that was not pached into a section).

+ +

Constants

+ +

Template modes

MODE_SOURCEThe Templates source
MODE_TRANSCOMPILEDThe transcompiled template
+ +

StorageAccess

An interface.  A StorageAccess implementation is used to access the templates from any storage.  This means, that you are not limited to store the Templates inside directories, you can also use a database or something else.

Summary
Functions
loadLoading a template.
saveSaves a template.
+ +

Functions

+ +

load

public function load($tpl,
&$mode)

Loading a template.

Parameters

$tplThe name of the template.
&$modeWhich mode is preferred?  One of the <Template modes>.  If <MODE_SOURCE>, the raw sourcecode is expected, if <MODE_TRANSCOMPILED> the transcompiled template as a callable function (expecting an STECore instance as first parameter) is expected.  If the transcompiled version is not available or older than the source, you can set this parameter to <MODE_SOURCE> and return the source.

Returns

Either the sourcecode or a callable function (first, and only parameter: an STECore instance).

+ +

save

public function save($tpl,
$data,
$mode)

Saves a template.

Parameters

$tpl -The name of the template.  $data - The data to be saved.  $mode - A <Template mode> constant.

+ +

FilesystemStorageAccess

The default StorageAccess implementation for loading / saving templates into a directory structure.

+ +

Functions

+ +

__construct

public function __construct($src,
$transc)

Parameters

$srcThe directory with the sources (Writing permissions are not mandatory, because STE does not save template sources).
$transcThe directory with the transcompiled templates (the PHP instance / the HTTP Server needs writing permissions to this directory).
+ +

STECore

The Core of STE

Summary
Variables
Public variables
Functions
__construct
register_tagRegister a custom tag.
call_tagCalling a custom tag (builtin ones can not be called)
exectemplateExecutes a template and returns the result.
get_var_referenceGet a reference to a template variable using a variable name.
get_var_by_nameGet a template variable by its name.
loadLoad a template and return its result (blocks not included, use exectemplate for this).
evalboolTest, if a text represents false (an empty / only whitespace text) or true (everything else).
+ +

Variables

+ +

Public variables

$blocksAssociative array of blocks (see the language definition).
$blockorderThe order of the blocks (an array)
$varsAssociative array of all template variables.  Use this to pass data to your templates.
+ +

Functions

+ +

__construct

public function __construct($storage_access)

Parameters

$storage_accessAn Instance of a StorageAccess implementation.
+ +

register_tag

public function register_tag($name,
$callback)

Register a custom tag.

Parameters

$nameThe name of the tag.
$callbackA callable function (This must tage three parameters: The STECore instance, an associative array of parameters, and a function representing the tags content(This expects the STECore instance as its only parameter and returns its text result, i.e to get the text, you neeed to call this function with the STECore instance as a parameter)).
+ +

call_tag

public function call_tag($name,
$params,
$sub)

Calling a custom tag (builtin ones can not be called)

Parameters

$nameThe Tag’s name
$paramsAssociative array of parameters
$subA callable function (expecting an STECore instance as it’s parameter) that represents the tag’s content.

Returns

The output of the tag.

+ +

exectemplate

public function exectemplate($tpl)

Executes a template and returns the result.  The huge difference to load is that this function will also output all blocks.

Parameters

$tplThe name of the template to execute.

Returns

The output of the template.

+ +

get_var_reference

public function &get_var_reference($name,
$create_if_not_exist)

Get a reference to a template variable using a variable name.  This can be used,if your custom tag takes a variable name as a parameter.

Parameters

$nameThe variables name.
$create_if_not_existShould the variable be created, if it does not exist?  Otherwise NULL will be returned, if the variable does not exist.

Returns

A Reference to the variable.

+ +

get_var_by_name

public function get_var_by_name($name)

Get a template variable by its name.  This can be used,if your custom tag takes a variable name as a parameter.

Parameters

$nameThe variables name.

Returns

The variables value.

+ +

load

public function load($tpl,  
$quiet = False)

Load a template and return its result (blocks not included, use exectemplate for this).

Parameters

$tplThe name of the template to be loaded.
$quietIf true, do not output anything and do notmodify the blocks.  This can be useful to load custom tags that are programmed in STE T/PL.  Default: false.

Returns

The result of the template (if $quiet == false).

+ +

evalbool

public function evalbool($txt)

Test, if a text represents false (an empty / only whitespace text) or true (everything else).

Parameters

$txtThe text to test.

Returns

true/false.

+ +
+ + + + + + + + + + +
function parse($code)
Parsing a STE T/PL template.
function transcompile($ast) /* Transcompile and add some boilerplate code. */
Transcompiles an abstract syntax tree to PHP.
public function load($tpl,
&$mode)
Loading a template.
public function save($tpl,
$data,
$mode)
Saves a template.
An interface.
public function __construct($src,
$transc)
public function __construct($storage_access)
public function register_tag($name,
$callback)
Register a custom tag.
public function call_tag($name,
$params,
$sub)
Calling a custom tag (builtin ones can not be called)
public function exectemplate($tpl)
Executes a template and returns the result.
public function &get_var_reference($name,
$create_if_not_exist)
Get a reference to a template variable using a variable name.
public function get_var_by_name($name)
Get a template variable by its name.
public function load($tpl,  
$quiet = False)
Load a template and return its result (blocks not included, use exectemplate for this).
public function evalbool($txt)
Test, if a text represents false (an empty / only whitespace text) or true (everything else).
The Core of STE
+ + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/index.html b/docu/nd/index.html new file mode 100644 index 0000000..4427f51 --- /dev/null +++ b/docu/nd/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docu/nd/index/Classes.html b/docu/nd/index/Classes.html new file mode 100644 index 0000000..e61de72 --- /dev/null +++ b/docu/nd/index/Classes.html @@ -0,0 +1,37 @@ + + +Class Index + + + + + + + + + +
Class Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
F
 FilesystemStorageAccess
S
 ste
 STECore
 StorageAccess
+ +
The default StorageAccess implementation for loading / saving templates into a directory structure.
+ + + +
Everything in this file is in this namespace.
The Core of STE
An interface.
+ +
+ + + + + + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/index/Constants.html b/docu/nd/index/Constants.html new file mode 100644 index 0000000..3e2d330 --- /dev/null +++ b/docu/nd/index/Constants.html @@ -0,0 +1,37 @@ + + +Constant Index + + + + + + + + + +
Constant Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
M
 MODE_SOURCE, ste
 MODE_TRANSCOMPILED, ste
T
 Template modes, ste
+ +
The Templates source
The transcompiled template
+ + + + + +
+ + + + + + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/index/Files.html b/docu/nd/index/Files.html new file mode 100644 index 0000000..59196fe --- /dev/null +++ b/docu/nd/index/Files.html @@ -0,0 +1,33 @@ + + +File Index + + + + + + + + + +
File Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 stupid_template_engine.php
+ +
The implementation of the Stupid Template Engine.
+ +
+ + + + + + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/index/Functions.html b/docu/nd/index/Functions.html new file mode 100644 index 0000000..0420685 --- /dev/null +++ b/docu/nd/index/Functions.html @@ -0,0 +1,65 @@ + + +Function Index + + + + + + + + + +
Function Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
$#!
 __construct
C
 call_tag, STECore
E
 evalbool, STECore
 exectemplate, STECore
G
 get_var_by_name, STECore
 get_var_reference, STECore
L
 load
P
 parse, ste
R
 register_tag, STECore
S
 save, StorageAccess
T
 transcompile, ste
+ +
public function __construct($src,
$transc)
public function __construct($storage_access)
+ + + +
public function call_tag($name,
$params,
$sub)
Calling a custom tag (builtin ones can not be called)
+ + + +
public function evalbool($txt)
Test, if a text represents false (an empty / only whitespace text) or true (everything else).
public function exectemplate($tpl)
Executes a template and returns the result.
+ + + +
public function get_var_by_name($name)
Get a template variable by its name.
public function &get_var_reference($name,
$create_if_not_exist)
Get a reference to a template variable using a variable name.
+ + + +
public function load($tpl,  
$quiet = False)
Load a template and return its result (blocks not included, use exectemplate for this).
public function load($tpl,
&$mode)
Loading a template.
+ + + +
function parse($code)
Parsing a STE T/PL template.
+ + + +
public function register_tag($name,
$callback)
Register a custom tag.
+ + + +
public function save($tpl,
$data,
$mode)
Saves a template.
+ + + +
function transcompile($ast) /* Transcompile and add some boilerplate code. */
Transcompiles an abstract syntax tree to PHP.
+ +
+ + + + + + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/index/General.html b/docu/nd/index/General.html new file mode 100644 index 0000000..5760937 --- /dev/null +++ b/docu/nd/index/General.html @@ -0,0 +1,81 @@ + + +Index + + + + + + + + + +
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
$#!
 __construct
B
$blockorder, STECore
$blocks, STECore
C
 call_tag, STECore
 Constants, ste
E
 evalbool, STECore
 exectemplate, STECore
F
 FilesystemStorageAccess
 Functions
G
 get_var_by_name, STECore
 get_var_reference, STECore
L
 load
M
 MODE_SOURCE, ste
 MODE_TRANSCOMPILED, ste
P
 parse, ste
 Public variables, STECore
R
 register_tag, STECore
S
 save, StorageAccess
 ste
 STECore
 StorageAccess
 stupid_template_engine.php
T
 Template modes, ste
 transcompile, ste
V
 Variables, STECore
$vars, STECore
+ +
public function __construct($src,
$transc)
public function __construct($storage_access)
+ + + +
The order of the blocks (an array)
Associative array of blocks (see the language definition).
+ + + +
public function call_tag($name,
$params,
$sub)
Calling a custom tag (builtin ones can not be called)
+ + + +
public function evalbool($txt)
Test, if a text represents false (an empty / only whitespace text) or true (everything else).
public function exectemplate($tpl)
Executes a template and returns the result.
+ + + +
The default StorageAccess implementation for loading / saving templates into a directory structure.
+ + + +
public function get_var_by_name($name)
Get a template variable by its name.
public function &get_var_reference($name,
$create_if_not_exist)
Get a reference to a template variable using a variable name.
+ + + +
public function load($tpl,  
$quiet = False)
Load a template and return its result (blocks not included, use exectemplate for this).
public function load($tpl,
&$mode)
Loading a template.
+ + + +
The Templates source
The transcompiled template
+ + + +
function parse($code)
Parsing a STE T/PL template.
+ + + +
public function register_tag($name,
$callback)
Register a custom tag.
+ + + +
public function save($tpl,
$data,
$mode)
Saves a template.
Everything in this file is in this namespace.
The Core of STE
An interface.
The implementation of the Stupid Template Engine.
+ + + +
function transcompile($ast) /* Transcompile and add some boilerplate code. */
Transcompiles an abstract syntax tree to PHP.
+ + + +
Associative array of all template variables.
+ +
+ + + + + + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/index/Variables.html b/docu/nd/index/Variables.html new file mode 100644 index 0000000..96ac427 --- /dev/null +++ b/docu/nd/index/Variables.html @@ -0,0 +1,41 @@ + + +Variable Index + + + + + + + + + +
Variable Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
B
$blockorder, STECore
$blocks, STECore
P
 Public variables, STECore
V
$vars, STECore
+ +
The order of the blocks (an array)
Associative array of blocks (see the language definition).
+ + + + + + + +
Associative array of all template variables.
+ +
+ + + + + + + + +
Close
+ + + \ No newline at end of file diff --git a/docu/nd/javascript/main.js b/docu/nd/javascript/main.js new file mode 100644 index 0000000..91991f5 --- /dev/null +++ b/docu/nd/javascript/main.js @@ -0,0 +1,836 @@ +// This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL + + +// +// Browser Styles +// ____________________________________________________________________________ + +var agt=navigator.userAgent.toLowerCase(); +var browserType; +var browserVer; + +if (agt.indexOf("opera") != -1) + { + browserType = "Opera"; + + if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1) + { browserVer = "Opera7"; } + else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1) + { browserVer = "Opera8"; } + else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1) + { browserVer = "Opera9"; } + } + +else if (agt.indexOf("applewebkit") != -1) + { + browserType = "Safari"; + + if (agt.indexOf("version/3") != -1) + { browserVer = "Safari3"; } + else if (agt.indexOf("safari/4") != -1) + { browserVer = "Safari2"; } + } + +else if (agt.indexOf("khtml") != -1) + { + browserType = "Konqueror"; + } + +else if (agt.indexOf("msie") != -1) + { + browserType = "IE"; + + if (agt.indexOf("msie 6") != -1) + { browserVer = "IE6"; } + else if (agt.indexOf("msie 7") != -1) + { browserVer = "IE7"; } + } + +else if (agt.indexOf("gecko") != -1) + { + browserType = "Firefox"; + + if (agt.indexOf("rv:1.7") != -1) + { browserVer = "Firefox1"; } + else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1) + { browserVer = "Firefox15"; } + else if (agt.indexOf("rv:1.8.1") != -1) + { browserVer = "Firefox2"; } + } + + +// +// Support Functions +// ____________________________________________________________________________ + + +function GetXPosition(item) + { + var position = 0; + + if (item.offsetWidth != null) + { + while (item != document.body && item != null) + { + position += item.offsetLeft; + item = item.offsetParent; + }; + }; + + return position; + }; + + +function GetYPosition(item) + { + var position = 0; + + if (item.offsetWidth != null) + { + while (item != document.body && item != null) + { + position += item.offsetTop; + item = item.offsetParent; + }; + }; + + return position; + }; + + +function MoveToPosition(item, x, y) + { + // Opera 5 chokes on the px extension, so it can use the Microsoft one instead. + + if (item.style.left != null) + { + item.style.left = x + "px"; + item.style.top = y + "px"; + } + else if (item.style.pixelLeft != null) + { + item.style.pixelLeft = x; + item.style.pixelTop = y; + }; + }; + + +// +// Menu +// ____________________________________________________________________________ + + +function ToggleMenu(id) + { + if (!window.document.getElementById) + { return; }; + + var display = window.document.getElementById(id).style.display; + + if (display == "none") + { display = "block"; } + else + { display = "none"; } + + window.document.getElementById(id).style.display = display; + } + +function HideAllBut(ids, max) + { + if (document.getElementById) + { + ids.sort( function(a,b) { return a - b; } ); + var number = 1; + + while (number < max) + { + if (ids.length > 0 && number == ids[0]) + { ids.shift(); } + else + { + document.getElementById("MGroupContent" + number).style.display = "none"; + }; + + number++; + }; + }; + } + + +// +// Tooltips +// ____________________________________________________________________________ + + +var tooltipTimer = 0; + +function ShowTip(event, tooltipID, linkID) + { + if (tooltipTimer) + { clearTimeout(tooltipTimer); }; + + var docX = event.clientX + window.pageXOffset; + var docY = event.clientY + window.pageYOffset; + + var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")"; + + tooltipTimer = setTimeout(showCommand, 1000); + } + +function ReallyShowTip(tooltipID, linkID, docX, docY) + { + tooltipTimer = 0; + + var tooltip; + var link; + + if (document.getElementById) + { + tooltip = document.getElementById(tooltipID); + link = document.getElementById(linkID); + } +/* else if (document.all) + { + tooltip = eval("document.all['" + tooltipID + "']"); + link = eval("document.all['" + linkID + "']"); + } +*/ + if (tooltip) + { + var left = GetXPosition(link); + var top = GetYPosition(link); + top += link.offsetHeight; + + + // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number + // in case some browser snuck through the above if statement but didn't support everything. + + if (!isFinite(top) || top == 0) + { + left = docX; + top = docY; + } + + // Some spacing to get it out from under the cursor. + + top += 10; + + // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the + // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right. + + if (tooltip.offsetWidth != null) + { + var width = tooltip.offsetWidth; + var docWidth = document.body.clientWidth; + + if (left + width > docWidth) + { left = docWidth - width - 1; } + + // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width. + if (left < 0) + { left = 0; }; + } + + MoveToPosition(tooltip, left, top); + tooltip.style.visibility = "visible"; + } + } + +function HideTip(tooltipID) + { + if (tooltipTimer) + { + clearTimeout(tooltipTimer); + tooltipTimer = 0; + } + + var tooltip; + + if (document.getElementById) + { tooltip = document.getElementById(tooltipID); } + else if (document.all) + { tooltip = eval("document.all['" + tooltipID + "']"); } + + if (tooltip) + { tooltip.style.visibility = "hidden"; } + } + + +// +// Blockquote fix for IE +// ____________________________________________________________________________ + + +function NDOnLoad() + { + if (browserVer == "IE6") + { + var scrollboxes = document.getElementsByTagName('blockquote'); + + if (scrollboxes.item(0)) + { + NDDoResize(); + window.onresize=NDOnResize; + }; + }; + }; + + +var resizeTimer = 0; + +function NDOnResize() + { + if (resizeTimer != 0) + { clearTimeout(resizeTimer); }; + + resizeTimer = setTimeout(NDDoResize, 250); + }; + + +function NDDoResize() + { + var scrollboxes = document.getElementsByTagName('blockquote'); + + var i; + var item; + + i = 0; + while (item = scrollboxes.item(i)) + { + item.style.width = 100; + i++; + }; + + i = 0; + while (item = scrollboxes.item(i)) + { + item.style.width = item.parentNode.offsetWidth; + i++; + }; + + clearTimeout(resizeTimer); + resizeTimer = 0; + } + + + +/* ________________________________________________________________________________________________________ + + Class: SearchPanel + ________________________________________________________________________________________________________ + + A class handling everything associated with the search panel. + + Parameters: + + name - The name of the global variable that will be storing this instance. Is needed to be able to set timeouts. + mode - The mode the search is going to work in. Pass CommandLineOption()>, so the + value will be something like "HTML" or "FramedHTML". + + ________________________________________________________________________________________________________ +*/ + + +function SearchPanel(name, mode, resultsPath) + { + if (!name || !mode || !resultsPath) + { alert("Incorrect parameters to SearchPanel."); }; + + + // Group: Variables + // ________________________________________________________________________ + + /* + var: name + The name of the global variable that will be storing this instance of the class. + */ + this.name = name; + + /* + var: mode + The mode the search is going to work in, such as "HTML" or "FramedHTML". + */ + this.mode = mode; + + /* + var: resultsPath + The relative path from the current HTML page to the results page directory. + */ + this.resultsPath = resultsPath; + + /* + var: keyTimeout + The timeout used between a keystroke and when a search is performed. + */ + this.keyTimeout = 0; + + /* + var: keyTimeoutLength + The length of in thousandths of a second. + */ + this.keyTimeoutLength = 500; + + /* + var: lastSearchValue + The last search string executed, or an empty string if none. + */ + this.lastSearchValue = ""; + + /* + var: lastResultsPage + The last results page. The value is only relevant if is set. + */ + this.lastResultsPage = ""; + + /* + var: deactivateTimeout + + The timeout used between when a control is deactivated and when the entire panel is deactivated. Is necessary + because a control may be deactivated in favor of another control in the same panel, in which case it should stay + active. + */ + this.deactivateTimout = 0; + + /* + var: deactivateTimeoutLength + The length of in thousandths of a second. + */ + this.deactivateTimeoutLength = 200; + + + + + // Group: DOM Elements + // ________________________________________________________________________ + + + // Function: DOMSearchField + this.DOMSearchField = function() + { return document.getElementById("MSearchField"); }; + + // Function: DOMSearchType + this.DOMSearchType = function() + { return document.getElementById("MSearchType"); }; + + // Function: DOMPopupSearchResults + this.DOMPopupSearchResults = function() + { return document.getElementById("MSearchResults"); }; + + // Function: DOMPopupSearchResultsWindow + this.DOMPopupSearchResultsWindow = function() + { return document.getElementById("MSearchResultsWindow"); }; + + // Function: DOMSearchPanel + this.DOMSearchPanel = function() + { return document.getElementById("MSearchPanel"); }; + + + + + // Group: Event Handlers + // ________________________________________________________________________ + + + /* + Function: OnSearchFieldFocus + Called when focus is added or removed from the search field. + */ + this.OnSearchFieldFocus = function(isActive) + { + this.Activate(isActive); + }; + + + /* + Function: OnSearchFieldChange + Called when the content of the search field is changed. + */ + this.OnSearchFieldChange = function() + { + if (this.keyTimeout) + { + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + }; + + var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + + if (searchValue != this.lastSearchValue) + { + if (searchValue != "") + { + this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength); + } + else + { + if (this.mode == "HTML") + { this.DOMPopupSearchResultsWindow().style.display = "none"; }; + this.lastSearchValue = ""; + }; + }; + }; + + + /* + Function: OnSearchTypeFocus + Called when focus is added or removed from the search type. + */ + this.OnSearchTypeFocus = function(isActive) + { + this.Activate(isActive); + }; + + + /* + Function: OnSearchTypeChange + Called when the search type is changed. + */ + this.OnSearchTypeChange = function() + { + var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + + if (searchValue != "") + { + this.Search(); + }; + }; + + + + // Group: Action Functions + // ________________________________________________________________________ + + + /* + Function: CloseResultsWindow + Closes the results window. + */ + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = "none"; + this.Activate(false, true); + }; + + + /* + Function: Search + Performs a search. + */ + this.Search = function() + { + this.keyTimeout = 0; + + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + var searchTopic = this.DOMSearchType().value; + + var pageExtension = searchValue.substr(0,1); + + if (pageExtension.match(/^[a-z]/i)) + { pageExtension = pageExtension.toUpperCase(); } + else if (pageExtension.match(/^[0-9]/)) + { pageExtension = 'Numbers'; } + else + { pageExtension = "Symbols"; }; + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + // indexSectionsWithContent is defined in searchdata.js + if (indexSectionsWithContent[searchTopic][pageExtension] == true) + { + resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else + { + resultsPage = this.resultsPath + '/NoResults.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + }; + + var resultsFrame; + if (this.mode == "HTML") + { resultsFrame = window.frames.MSearchResults; } + else if (this.mode == "FramedHTML") + { resultsFrame = window.top.frames['Content']; }; + + + if (resultsPage != this.lastResultsPage || + + // Bug in IE. If everything becomes hidden in a run, none of them will be able to be reshown in the next for some + // reason. It counts the right number of results, and you can even read the display as "block" after setting it, but it + // just doesn't work in IE 6 or IE 7. So if we're on the right page but the previous search had no results, reload the + // page anyway to get around the bug. + (browserType == "IE" && hasResultsPage && + (!resultsFrame.searchResults || resultsFrame.searchResults.lastMatchCount == 0)) ) + + { + resultsFrame.location.href = resultsPageWithSearch; + } + + // So if the results page is right and there's no IE bug, reperform the search on the existing page. We have to check if there + // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even + // if it did. + else if (hasResultsPage) + { + // We need to check if this exists in case the frame is present but didn't finish loading. + if (resultsFrame.searchResults) + { resultsFrame.searchResults.Search(searchValue); } + + // Otherwise just reload instead of waiting. + else + { resultsFrame.location.href = resultsPageWithSearch; }; + }; + + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block") + { + var domSearchType = this.DOMSearchType(); + + var left = GetXPosition(domSearchType); + var top = GetYPosition(domSearchType) + domSearchType.offsetHeight; + + MoveToPosition(domPopupSearchResultsWindow, left, top); + domPopupSearchResultsWindow.style.display = 'block'; + }; + + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + }; + + + + // Group: Activation Functions + // Functions that handle whether the entire panel is active or not. + // ________________________________________________________________________ + + + /* + Function: Activate + + Activates or deactivates the search panel, resetting things to their default values if necessary. You can call this on every + control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently. + + Parameters: + + isActive - Whether you're activating or deactivating the panel. + ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay. + */ + this.Activate = function(isActive, ignoreDeactivateDelay) + { + // We want to ignore isActive being false while the results window is open. + if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block")) + { + if (this.inactivateTimeout) + { + clearTimeout(this.inactivateTimeout); + this.inactivateTimeout = 0; + }; + + this.DOMSearchPanel().className = 'MSearchPanelActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == 'Search') + { searchField.value = ""; } + } + else if (!ignoreDeactivateDelay) + { + this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength); + } + else + { + this.InactivateAfterTimeout(); + }; + }; + + + /* + Function: InactivateAfterTimeout + + Called by , which is set by . Inactivation occurs on a timeout because a control may + receive OnBlur() when focus is really transferring to another control in the search panel. In this case we don't want to + actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value. + So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation. + */ + this.InactivateAfterTimeout = function() + { + this.inactivateTimeout = 0; + + this.DOMSearchPanel().className = 'MSearchPanelInactive'; + this.DOMSearchField().value = "Search"; + + this.lastSearchValue = ""; + this.lastResultsPage = ""; + }; + }; + + + + +/* ________________________________________________________________________________________________________ + + Class: SearchResults + _________________________________________________________________________________________________________ + + The class that handles everything on the search results page. + _________________________________________________________________________________________________________ +*/ + + +function SearchResults(name, mode) + { + /* + var: mode + The mode the search is going to work in, such as "HTML" or "FramedHTML". + */ + this.mode = mode; + + /* + var: lastMatchCount + The number of matches from the last run of . + */ + this.lastMatchCount = 0; + + + /* + Function: Toggle + Toggles the visibility of the passed element ID. + */ + this.Toggle = function(id) + { + if (this.mode == "FramedHTML") + { return; }; + + var parentElement = document.getElementById(id); + + var element = parentElement.firstChild; + + while (element && element != parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'ISubIndex') + { + if (element.style.display == 'block') + { element.style.display = "none"; } + else + { element.style.display = 'block'; } + }; + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { element = element.firstChild; } + else if (element.nextSibling) + { element = element.nextSibling; } + else + { + do + { + element = element.parentNode; + } + while (element && element != parentElement && !element.nextSibling); + + if (element && element != parentElement) + { element = element.nextSibling; }; + }; + }; + }; + + + /* + Function: Search + + Searches for the passed string. If there is no parameter, it takes it from the URL query. + + Always returns true, since other documents may try to call it and that may or may not be possible. + */ + this.Search = function(search) + { + if (!search) + { + search = window.location.search; + search = search.substring(1); // Remove the leading ? + search = unescape(search); + }; + + search = search.replace(/^ +/, ""); + search = search.replace(/ +$/, ""); + search = search.toLowerCase(); + + if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily. + { + search = search.replace(/\_/g, "_und"); + search = search.replace(/\ +/gi, "_spc"); + search = search.replace(/\~/g, "_til"); + search = search.replace(/\!/g, "_exc"); + search = search.replace(/\@/g, "_att"); + search = search.replace(/\#/g, "_num"); + search = search.replace(/\$/g, "_dol"); + search = search.replace(/\%/g, "_pct"); + search = search.replace(/\^/g, "_car"); + search = search.replace(/\&/g, "_amp"); + search = search.replace(/\*/g, "_ast"); + search = search.replace(/\(/g, "_lpa"); + search = search.replace(/\)/g, "_rpa"); + search = search.replace(/\-/g, "_min"); + search = search.replace(/\+/g, "_plu"); + search = search.replace(/\=/g, "_equ"); + search = search.replace(/\{/g, "_lbc"); + search = search.replace(/\}/g, "_rbc"); + search = search.replace(/\[/g, "_lbk"); + search = search.replace(/\]/g, "_rbk"); + search = search.replace(/\:/g, "_col"); + search = search.replace(/\;/g, "_sco"); + search = search.replace(/\"/g, "_quo"); + search = search.replace(/\'/g, "_apo"); + search = search.replace(/\/g, "_ran"); + search = search.replace(/\,/g, "_com"); + search = search.replace(/\./g, "_per"); + search = search.replace(/\?/g, "_que"); + search = search.replace(/\//g, "_sla"); + search = search.replace(/[^a-z0-9\_]i/gi, "_zzz"); + }; + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); + + if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search) + { + row.style.display = "block"; + matches++; + } + else + { row.style.display = "none"; }; + }; + + i++; + }; + + document.getElementById("Searching").style.display="none"; + + if (matches == 0) + { document.getElementById("NoMatches").style.display="block"; } + else + { document.getElementById("NoMatches").style.display="none"; } + + this.lastMatchCount = matches; + + return true; + }; + }; + diff --git a/docu/nd/javascript/searchdata.js b/docu/nd/javascript/searchdata.js new file mode 100644 index 0000000..985032f --- /dev/null +++ b/docu/nd/javascript/searchdata.js @@ -0,0 +1,182 @@ +var indexSectionsWithContent = { + "General": { + "Symbols": true, + "Numbers": false, + "A": false, + "B": true, + "C": true, + "D": false, + "E": true, + "F": true, + "G": true, + "H": false, + "I": false, + "J": false, + "K": false, + "L": true, + "M": true, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": true, + "S": true, + "T": true, + "U": false, + "V": true, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Variables": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": true, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": false, + "S": false, + "T": false, + "U": false, + "V": true, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Functions": { + "Symbols": true, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": true, + "F": false, + "G": true, + "H": false, + "I": false, + "J": false, + "K": false, + "L": true, + "M": false, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": true, + "S": true, + "T": true, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Files": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Classes": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": true, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Constants": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": false, + "T": true, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + } + } \ No newline at end of file diff --git a/docu/nd/search/ClassesF.html b/docu/nd/search/ClassesF.html new file mode 100644 index 0000000..9c33ca5 --- /dev/null +++ b/docu/nd/search/ClassesF.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/ClassesS.html b/docu/nd/search/ClassesS.html new file mode 100644 index 0000000..15e616d --- /dev/null +++ b/docu/nd/search/ClassesS.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/ConstantsM.html b/docu/nd/search/ConstantsM.html new file mode 100644 index 0000000..da4b5f8 --- /dev/null +++ b/docu/nd/search/ConstantsM.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/ConstantsT.html b/docu/nd/search/ConstantsT.html new file mode 100644 index 0000000..4211788 --- /dev/null +++ b/docu/nd/search/ConstantsT.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FilesS.html b/docu/nd/search/FilesS.html new file mode 100644 index 0000000..b33f2d3 --- /dev/null +++ b/docu/nd/search/FilesS.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsC.html b/docu/nd/search/FunctionsC.html new file mode 100644 index 0000000..c5d0804 --- /dev/null +++ b/docu/nd/search/FunctionsC.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
call_tag, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsE.html b/docu/nd/search/FunctionsE.html new file mode 100644 index 0000000..053e88f --- /dev/null +++ b/docu/nd/search/FunctionsE.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
evalbool, STECore
exectemplate, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsG.html b/docu/nd/search/FunctionsG.html new file mode 100644 index 0000000..1dd94fa --- /dev/null +++ b/docu/nd/search/FunctionsG.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsL.html b/docu/nd/search/FunctionsL.html new file mode 100644 index 0000000..6dd84af --- /dev/null +++ b/docu/nd/search/FunctionsL.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsP.html b/docu/nd/search/FunctionsP.html new file mode 100644 index 0000000..c4b218e --- /dev/null +++ b/docu/nd/search/FunctionsP.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
parse, ste
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsR.html b/docu/nd/search/FunctionsR.html new file mode 100644 index 0000000..5a8fa29 --- /dev/null +++ b/docu/nd/search/FunctionsR.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
register_tag, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsS.html b/docu/nd/search/FunctionsS.html new file mode 100644 index 0000000..4e0fc1d --- /dev/null +++ b/docu/nd/search/FunctionsS.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
save, StorageAccess
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsSymbols.html b/docu/nd/search/FunctionsSymbols.html new file mode 100644 index 0000000..06ae917 --- /dev/null +++ b/docu/nd/search/FunctionsSymbols.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/FunctionsT.html b/docu/nd/search/FunctionsT.html new file mode 100644 index 0000000..0930a4e --- /dev/null +++ b/docu/nd/search/FunctionsT.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralB.html b/docu/nd/search/GeneralB.html new file mode 100644 index 0000000..2c27dd5 --- /dev/null +++ b/docu/nd/search/GeneralB.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
$blockorder, STECore
$blocks, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralC.html b/docu/nd/search/GeneralC.html new file mode 100644 index 0000000..35cc684 --- /dev/null +++ b/docu/nd/search/GeneralC.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
call_tag, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralE.html b/docu/nd/search/GeneralE.html new file mode 100644 index 0000000..053e88f --- /dev/null +++ b/docu/nd/search/GeneralE.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
evalbool, STECore
exectemplate, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralF.html b/docu/nd/search/GeneralF.html new file mode 100644 index 0000000..6f68074 --- /dev/null +++ b/docu/nd/search/GeneralF.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralG.html b/docu/nd/search/GeneralG.html new file mode 100644 index 0000000..1dd94fa --- /dev/null +++ b/docu/nd/search/GeneralG.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralL.html b/docu/nd/search/GeneralL.html new file mode 100644 index 0000000..6dd84af --- /dev/null +++ b/docu/nd/search/GeneralL.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralM.html b/docu/nd/search/GeneralM.html new file mode 100644 index 0000000..da4b5f8 --- /dev/null +++ b/docu/nd/search/GeneralM.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralP.html b/docu/nd/search/GeneralP.html new file mode 100644 index 0000000..964ae42 --- /dev/null +++ b/docu/nd/search/GeneralP.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
parse, ste
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralR.html b/docu/nd/search/GeneralR.html new file mode 100644 index 0000000..5a8fa29 --- /dev/null +++ b/docu/nd/search/GeneralR.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
register_tag, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralS.html b/docu/nd/search/GeneralS.html new file mode 100644 index 0000000..27694c7 --- /dev/null +++ b/docu/nd/search/GeneralS.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
save, StorageAccess
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralSymbols.html b/docu/nd/search/GeneralSymbols.html new file mode 100644 index 0000000..06ae917 --- /dev/null +++ b/docu/nd/search/GeneralSymbols.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralT.html b/docu/nd/search/GeneralT.html new file mode 100644 index 0000000..6ee71ba --- /dev/null +++ b/docu/nd/search/GeneralT.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/GeneralV.html b/docu/nd/search/GeneralV.html new file mode 100644 index 0000000..1610bac --- /dev/null +++ b/docu/nd/search/GeneralV.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Variables, STECore
$vars, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/NoResults.html b/docu/nd/search/NoResults.html new file mode 100644 index 0000000..02ce888 --- /dev/null +++ b/docu/nd/search/NoResults.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + +
No Matches
\ No newline at end of file diff --git a/docu/nd/search/VariablesB.html b/docu/nd/search/VariablesB.html new file mode 100644 index 0000000..2c27dd5 --- /dev/null +++ b/docu/nd/search/VariablesB.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
$blockorder, STECore
$blocks, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/VariablesP.html b/docu/nd/search/VariablesP.html new file mode 100644 index 0000000..63d4304 --- /dev/null +++ b/docu/nd/search/VariablesP.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/search/VariablesV.html b/docu/nd/search/VariablesV.html new file mode 100644 index 0000000..5461292 --- /dev/null +++ b/docu/nd/search/VariablesV.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
$vars, STECore
Searching...
No Matches
\ No newline at end of file diff --git a/docu/nd/styles/main.css b/docu/nd/styles/main.css new file mode 100644 index 0000000..134199a --- /dev/null +++ b/docu/nd/styles/main.css @@ -0,0 +1,767 @@ +/* + IMPORTANT: If you're editing this file in the output directory of one of + your projects, your changes will be overwritten the next time you run + Natural Docs. Instead, copy this file to your project directory, make your + changes, and you can use it with -s. Even better would be to make a CSS + file in your project directory with only your changes, which you can then + use with -s [original style] [your changes]. + + On the other hand, if you're editing this file in the Natural Docs styles + directory, the changes will automatically be applied to all your projects + that use this style the next time Natural Docs is run on them. + + This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure + Natural Docs is licensed under the GPL +*/ + +body { + font: 10pt Verdana, Arial, sans-serif; + color: #000000; + margin: 0; padding: 0; + } + +.ContentPage, +.IndexPage, +.FramedMenuPage { + background-color: #E8E8E8; + } +.FramedContentPage, +.FramedIndexPage, +.FramedSearchResultsPage, +.PopupSearchResultsPage { + background-color: #FFFFFF; + } + + +a:link, +a:visited { color: #900000; text-decoration: none } +a:hover { color: #900000; text-decoration: underline } +a:active { color: #FF0000; text-decoration: underline } + +td { + vertical-align: top } + +img { border: 0; } + + +/* + Comment out this line to use web-style paragraphs (blank line between + paragraphs, no indent) instead of print-style paragraphs (no blank line, + indented.) +*/ +p { + text-indent: 5ex; margin: 0 } + + +/* Opera doesn't break with just wbr, but will if you add this. */ +.Opera wbr:after { + content: "\00200B"; + } + + +/* Blockquotes are used as containers for things that may need to scroll. */ +blockquote { + padding: 0; + margin: 0; + overflow: auto; + } + + +.Firefox1 blockquote { + padding-bottom: .5em; + } + +/* Turn off scrolling when printing. */ +@media print { + blockquote { + overflow: visible; + } + .IE blockquote { + width: auto; + } + } + + + +#Menu { + font-size: 9pt; + padding: 10px 0 0 0; + } +.ContentPage #Menu, +.IndexPage #Menu { + position: absolute; + top: 0; + left: 0; + width: 31ex; + overflow: hidden; + } +.ContentPage .Firefox #Menu, +.IndexPage .Firefox #Menu { + width: 27ex; + } + + + .MTitle { + font-size: 16pt; font-weight: bold; font-variant: small-caps; + text-align: center; + padding: 5px 10px 15px 10px; + border-bottom: 1px dotted #000000; + margin-bottom: 15px } + + .MSubTitle { + font-size: 9pt; font-weight: normal; font-variant: normal; + margin-top: 1ex; margin-bottom: 5px } + + + .MEntry a:link, + .MEntry a:hover, + .MEntry a:visited { color: #606060; margin-right: 0 } + .MEntry a:active { color: #A00000; margin-right: 0 } + + + .MGroup { + font-variant: small-caps; font-weight: bold; + margin: 1em 0 1em 10px; + } + + .MGroupContent { + font-variant: normal; font-weight: normal } + + .MGroup a:link, + .MGroup a:hover, + .MGroup a:visited { color: #545454; margin-right: 10px } + .MGroup a:active { color: #A00000; margin-right: 10px } + + + .MFile, + .MText, + .MLink, + .MIndex { + padding: 1px 17px 2px 10px; + margin: .25em 0 .25em 0; + } + + .MText { + font-size: 8pt; font-style: italic } + + .MLink { + font-style: italic } + + #MSelected { + color: #000000; background-color: #FFFFFF; + /* Replace padding with border. */ + padding: 0 10px 0 10px; + border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000; + margin-right: 5px; + } + + /* Close off the left side when its in a group. */ + .MGroup #MSelected { + padding-left: 9px; border-left-width: 1px } + + /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ + .Firefox #MSelected { + -moz-border-radius-topright: 10px; + -moz-border-radius-bottomright: 10px } + .Firefox .MGroup #MSelected { + -moz-border-radius-topleft: 10px; + -moz-border-radius-bottomleft: 10px } + + + #MSearchPanel { + padding: 0px 6px; + margin: .25em 0; + } + + + #MSearchField { + font: italic 9pt Verdana, sans-serif; + color: #606060; + background-color: #E8E8E8; + border: none; + padding: 2px 4px; + width: 100%; + } + /* Only Opera gets it right. */ + .Firefox #MSearchField, + .IE #MSearchField, + .Safari #MSearchField { + width: 94%; + } + .Opera9 #MSearchField, + .Konqueror #MSearchField { + width: 97%; + } + .FramedMenuPage .Firefox #MSearchField, + .FramedMenuPage .Safari #MSearchField, + .FramedMenuPage .Konqueror #MSearchField { + width: 98%; + } + + /* Firefox doesn't do this right in frames without #MSearchPanel added on. + It's presence doesn't hurt anything other browsers. */ + #MSearchPanel.MSearchPanelInactive:hover #MSearchField { + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + padding: 1px 3px; + } + .MSearchPanelActive #MSearchField { + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + font-style: normal; + padding: 1px 3px; + } + + #MSearchType { + visibility: hidden; + font: 8pt Verdana, sans-serif; + width: 98%; + padding: 0; + border: 1px solid #C0C0C0; + } + .MSearchPanelActive #MSearchType, + /* As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */ + #MSearchPanel.MSearchPanelInactive:hover #MSearchType, + #MSearchType:focus { + visibility: visible; + color: #606060; + } + #MSearchType option#MSearchEverything { + font-weight: bold; + } + + .Opera8 .MSearchPanelInactive:hover, + .Opera8 .MSearchPanelActive { + margin-left: -1px; + } + + + iframe#MSearchResults { + width: 60ex; + height: 15em; + } + #MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000000; + background-color: #E8E8E8; + } + #MSearchResultsWindowClose { + font-weight: bold; + font-size: 8pt; + display: block; + padding: 2px 5px; + } + #MSearchResultsWindowClose:link, + #MSearchResultsWindowClose:visited { + color: #000000; + text-decoration: none; + } + #MSearchResultsWindowClose:active, + #MSearchResultsWindowClose:hover { + color: #800000; + text-decoration: none; + background-color: #F4F4F4; + } + + + + +#Content { + padding-bottom: 15px; + } + +.ContentPage #Content { + border-width: 0 0 1px 1px; + border-style: solid; + border-color: #000000; + background-color: #FFFFFF; + font-size: 9pt; /* To make 31ex match the menu's 31ex. */ + margin-left: 31ex; + } +.ContentPage .Firefox #Content { + margin-left: 27ex; + } + + + + .CTopic { + font-size: 10pt; + margin-bottom: 3em; + } + + + .CTitle { + font-size: 12pt; font-weight: bold; + border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0; + margin: 0 15px .5em 15px } + + .CGroup .CTitle { + font-size: 16pt; font-variant: small-caps; + padding-left: 15px; padding-right: 15px; + border-width: 0 0 2px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + .CClass .CTitle, + .CInterface .CTitle, + .CDatabase .CTitle, + .CDatabaseTable .CTitle, + .CSection .CTitle { + font-size: 18pt; + color: #FFFFFF; background-color: #A0A0A0; + padding: 10px 15px 10px 15px; + border-width: 2px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + #MainTopic .CTitle { + font-size: 20pt; + color: #FFFFFF; background-color: #7070C0; + padding: 10px 15px 10px 15px; + border-width: 0 0 3px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + .CBody { + margin-left: 15px; margin-right: 15px } + + + .CToolTip { + position: absolute; visibility: hidden; + left: 0; top: 0; + background-color: #FFFFE0; + padding: 5px; + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000; + font-size: 8pt; + } + + .Opera .CToolTip { + max-width: 98%; + } + + /* Scrollbars would be useless. */ + .CToolTip blockquote { + overflow: hidden; + } + .IE6 .CToolTip blockquote { + overflow: visible; + } + + .CHeading { + font-weight: bold; font-size: 10pt; + margin: 1.5em 0 .5em 0; + } + + .CBody pre { + font: 10pt "Courier New", Courier, monospace; + margin: 1em 0; + } + + .CBody ul { + /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever. + Reapply it here as padding. */ + padding-left: 15px; padding-right: 15px; + margin: .5em 5ex .5em 5ex; + } + + .CDescriptionList { + margin: .5em 5ex 0 5ex } + + .CDLEntry { + font: 10pt "Courier New", Courier, monospace; color: #808080; + padding-bottom: .25em; + white-space: nowrap } + + .CDLDescription { + font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */ + padding-bottom: .5em; padding-left: 5ex } + + + .CTopic img { + text-align: center; + display: block; + margin: 1em auto; + } + .CImageCaption { + font-variant: small-caps; + font-size: 8pt; + color: #808080; + text-align: center; + position: relative; + top: 1em; + } + + .CImageLink { + color: #808080; + font-style: italic; + } + a.CImageLink:link, + a.CImageLink:visited, + a.CImageLink:hover { color: #808080 } + + + + + +.Prototype { + font: 10pt "Courier New", Courier, monospace; + padding: 5px 3ex; + border-width: 1px; border-style: solid; + margin: 0 5ex 1.5em 5ex; + } + + .Prototype td { + font-size: 10pt; + } + + .PDefaultValue, + .PDefaultValuePrefix, + .PTypePrefix { + color: #8F8F8F; + } + .PTypePrefix { + text-align: right; + } + .PAfterParameters { + vertical-align: bottom; + } + + .IE .Prototype table { + padding: 0; + } + + .CFunction .Prototype { + background-color: #F4F4F4; border-color: #D0D0D0 } + .CProperty .Prototype { + background-color: #F4F4FF; border-color: #C0C0E8 } + .CVariable .Prototype { + background-color: #FFFFF0; border-color: #E0E0A0 } + + .CClass .Prototype { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; + background-color: #F4F4F4; + } + .CInterface .Prototype { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0D0; + background-color: #F4F4FF; + } + + .CDatabaseIndex .Prototype, + .CConstant .Prototype { + background-color: #D0D0D0; border-color: #000000 } + .CType .Prototype, + .CEnumeration .Prototype { + background-color: #FAF0F0; border-color: #E0B0B0; + } + .CDatabaseTrigger .Prototype, + .CEvent .Prototype, + .CDelegate .Prototype { + background-color: #F0FCF0; border-color: #B8E4B8 } + + .CToolTip .Prototype { + margin: 0 0 .5em 0; + white-space: nowrap; + } + + + + + +.Summary { + margin: 1.5em 5ex 0 5ex } + + .STitle { + font-size: 12pt; font-weight: bold; + margin-bottom: .5em } + + + .SBorder { + background-color: #FFFFF0; + padding: 15px; + border: 1px solid #C0C060 } + + /* In a frame IE 6 will make them too long unless you set the width to 100%. Without frames it will be correct without a width + or slightly too long (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. IE 7 has the same + problem with frames, haven't tested it without. */ + .FramedContentPage .IE .SBorder { + width: 100% } + + /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ + .Firefox .SBorder { + -moz-border-radius: 20px } + + + .STable { + font-size: 9pt; width: 100% } + + .SEntry { + width: 30% } + .SDescription { + width: 70% } + + + .SMarked { + background-color: #F8F8D8 } + + .SDescription { padding-left: 2ex } + .SIndent1 .SEntry { padding-left: 1.5ex } .SIndent1 .SDescription { padding-left: 3.5ex } + .SIndent2 .SEntry { padding-left: 3.0ex } .SIndent2 .SDescription { padding-left: 5.0ex } + .SIndent3 .SEntry { padding-left: 4.5ex } .SIndent3 .SDescription { padding-left: 6.5ex } + .SIndent4 .SEntry { padding-left: 6.0ex } .SIndent4 .SDescription { padding-left: 8.0ex } + .SIndent5 .SEntry { padding-left: 7.5ex } .SIndent5 .SDescription { padding-left: 9.5ex } + + .SDescription a { color: #800000} + .SDescription a:active { color: #A00000 } + + .SGroup td { + padding-top: .5em; padding-bottom: .25em } + + .SGroup .SEntry { + font-weight: bold; font-variant: small-caps } + + .SGroup .SEntry a { color: #800000 } + .SGroup .SEntry a:active { color: #F00000 } + + + .SMain td, + .SClass td, + .SDatabase td, + .SDatabaseTable td, + .SSection td { + font-size: 10pt; + padding-bottom: .25em } + + .SClass td, + .SDatabase td, + .SDatabaseTable td, + .SSection td { + padding-top: 1em } + + .SMain .SEntry, + .SClass .SEntry, + .SDatabase .SEntry, + .SDatabaseTable .SEntry, + .SSection .SEntry { + font-weight: bold; + } + + .SMain .SEntry a, + .SClass .SEntry a, + .SDatabase .SEntry a, + .SDatabaseTable .SEntry a, + .SSection .SEntry a { color: #000000 } + + .SMain .SEntry a:active, + .SClass .SEntry a:active, + .SDatabase .SEntry a:active, + .SDatabaseTable .SEntry a:active, + .SSection .SEntry a:active { color: #A00000 } + + + + + +.ClassHierarchy { + margin: 0 15px 1em 15px } + + .CHEntry { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; + margin-bottom: 3px; + padding: 2px 2ex; + font-size: 10pt; + background-color: #F4F4F4; color: #606060; + } + + .Firefox .CHEntry { + -moz-border-radius: 4px; + } + + .CHCurrent .CHEntry { + font-weight: bold; + border-color: #000000; + color: #000000; + } + + .CHChildNote .CHEntry { + font-style: italic; + font-size: 8pt; + } + + .CHIndent { + margin-left: 3ex; + } + + .CHEntry a:link, + .CHEntry a:visited, + .CHEntry a:hover { + color: #606060; + } + .CHEntry a:active { + color: #800000; + } + + + + + +#Index { + background-color: #FFFFFF; + } + +/* As opposed to .PopupSearchResultsPage #Index */ +.IndexPage #Index, +.FramedIndexPage #Index, +.FramedSearchResultsPage #Index { + padding: 15px; + } + +.IndexPage #Index { + border-width: 0 0 1px 1px; + border-style: solid; + border-color: #000000; + font-size: 9pt; /* To make 27ex match the menu's 27ex. */ + margin-left: 27ex; + } + + + .IPageTitle { + font-size: 20pt; font-weight: bold; + color: #FFFFFF; background-color: #7070C0; + padding: 10px 15px 10px 15px; + border-width: 0 0 3px 0; border-color: #000000; border-style: solid; + margin: -15px -15px 0 -15px } + + .FramedSearchResultsPage .IPageTitle { + margin-bottom: 15px; + } + + .INavigationBar { + font-size: 10pt; + text-align: center; + background-color: #FFFFF0; + padding: 5px; + border-bottom: solid 1px black; + margin: 0 -15px 15px -15px; + } + + .INavigationBar a { + font-weight: bold } + + .IHeading { + font-size: 16pt; font-weight: bold; + padding: 2.5em 0 .5em 0; + text-align: center; + width: 3.5ex; + } + #IFirstHeading { + padding-top: 0; + } + + .IEntry { + font-size: 10pt; + padding-left: 1ex; + } + .PopupSearchResultsPage .IEntry { + font-size: 8pt; + padding: 1px 5px; + } + .PopupSearchResultsPage .Opera9 .IEntry, + .FramedSearchResultsPage .Opera9 .IEntry { + text-align: left; + } + .FramedSearchResultsPage .IEntry { + padding: 0; + } + + .ISubIndex { + padding-left: 3ex; padding-bottom: .5em } + .PopupSearchResultsPage .ISubIndex { + display: none; + } + + /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the + index if everything's the same color. */ + .ISymbol { + font-weight: bold; color: #900000 } + + .IndexPage .ISymbolPrefix, + .FramedIndexPage .ISymbolPrefix { + font-size: 10pt; + text-align: right; + color: #C47C7C; + background-color: #F8F8F8; + border-right: 3px solid #E0E0E0; + border-left: 1px solid #E0E0E0; + padding: 0 1px 0 2px; + } + .PopupSearchResultsPage .ISymbolPrefix, + .FramedSearchResultsPage .ISymbolPrefix { + color: #900000; + } + .PopupSearchResultsPage .ISymbolPrefix { + font-size: 8pt; + } + + .IndexPage #IFirstSymbolPrefix, + .FramedIndexPage #IFirstSymbolPrefix { + border-top: 1px solid #E0E0E0; + } + .IndexPage #ILastSymbolPrefix, + .FramedIndexPage #ILastSymbolPrefix { + border-bottom: 1px solid #E0E0E0; + } + .IndexPage #IOnlySymbolPrefix, + .FramedIndexPage #IOnlySymbolPrefix { + border-top: 1px solid #E0E0E0; + border-bottom: 1px solid #E0E0E0; + } + + a.IParent, + a.IFile { + display: block; + } + + .PopupSearchResultsPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + } + .FramedSearchResultsPage .SRStatus { + font-size: 10pt; + font-style: italic; + } + + .SRResult { + display: none; + } + + + +#Footer { + font-size: 8pt; + color: #989898; + text-align: right; + } + +#Footer p { + text-indent: 0; + margin-bottom: .5em; + } + +.ContentPage #Footer, +.IndexPage #Footer { + text-align: right; + margin: 2px; + } + +.FramedMenuPage #Footer { + text-align: center; + margin: 5em 10px 10px 10px; + padding-top: 1em; + border-top: 1px solid #C8C8C8; + } + + #Footer a:link, + #Footer a:hover, + #Footer a:visited { color: #989898 } + #Footer a:active { color: #A00000 } + diff --git a/example/index.php b/example/index.php new file mode 100644 index 0000000..3d2b1ca --- /dev/null +++ b/example/index.php @@ -0,0 +1,58 @@ + will exchange all letters with their uppercase complement +$ste->register_tag("uppercase", + function($ste, $params, $sub) + { + $text = $sub($ste); # Get the tags content + return strtoupper($text); # Return the new text. + } +); + +# will repeat its content n times ( could be used too, but i needed more examples :-P ) +$ste->register_tag("repeat", + function($ste, $params, $sub) + { + $output = ""; + if(!is_numeric($params["n"])) + throw new Exception("Sorry, but parameter n must be a number..."); + + for($i = 0; $i < $params["n"]; ++$i) + $output .= $sub($ste); + + return $output; + } +); + +# assign some data +$ste->vars["users"] = array( + array("name" => "Foo", "username" => "foo", "online" => true), + array("name" => "Bar", "username" => "bar", "online" => false), + array("name" => "Baz", "username" => "baz", "online" => true) +); +$ste->vars["title"] = "cool"; +$ste->vars["articles"] = array( + array("author" => "foo", "title" => "cool article", "timestamp" => 1316553353, "excerpt" => "bla", "full" => "blablabla"), + array("author" => "bar", "title" => "awesome", "timestamp" => 1316552000, "excerpt" => "...", "full" => ".........."), + array("author" => "baz", "title" => " 1316551000, "excerpt" => "...", "full" => ".........."), + array("author" => "baz", "title" => "whatever...", "timestamp" => 1316550000, "excerpt" => "...", "full" => "..........") +); + +# Execute the template and output the result +echo $ste->exectemplate("articles.html"); + +?> diff --git a/example/templates/src/articles.html b/example/templates/src/articles.html new file mode 100644 index 0000000..e007f3e --- /dev/null +++ b/example/templates/src/articles.html @@ -0,0 +1,49 @@ + + +Lets overwrite the content section + +

Some Articles

+ +

$article[title]

+
Author: $article[author]
+
d. M. Y, H:i:s
+
+ + + + First entry, lets show the whole text + $article[full] + + + $article[excerpt] + + +
+
+
+ There are more than 3 articles? + + + + +

There are more articles.

+
+
+ +

Some more useless demo stuff...

+

Counting from 10 to 0...

+

but take only the even ones and multiply by 5...

+ + + $i + + $i * 5
+
+
+
+ +

Repeat some text...

+ +

Bla

+
+
diff --git a/example/templates/src/custom_tags.tpl b/example/templates/src/custom_tags.tpl new file mode 100644 index 0000000..7e821c5 --- /dev/null +++ b/example/templates/src/custom_tags.tpl @@ -0,0 +1,19 @@ +A foreach that will break after 'max' iterations + + + + + + + + + + + $_tag_parameters[counter] + + $i + + + + + diff --git a/example/templates/src/master.html b/example/templates/src/master.html new file mode 100644 index 0000000..fe6b1e6 --- /dev/null +++ b/example/templates/src/master.html @@ -0,0 +1,41 @@ + + + + ?{$title|$title - example|example}If $title given, set title to "$title - example", else "example" + + + + +

example

+ +
+ + Default content. + +
+
+ +

List of users

+ Lets loop through the users... +
    + +
  • $user[name] ($user[username])
  • +
    +
+
+
+ + diff --git a/language_definition.html b/language_definition.html deleted file mode 100644 index b1964a9..0000000 --- a/language_definition.html +++ /dev/null @@ -1,491 +0,0 @@ - - - - Language definition - Stupid Template Engine - - - - -

The STE Template/Programming Language

-

This is the documentation of the Template/Programming Language of the Stupid Template Engine, or STE T/PL

- -

TOC

-
    -
  1. - Basic elements -
      -
    1. Text
    2. -
    3. Variable
    4. -
    5. Tag
    6. -
    7. - Pseudotag -
        -
      1. ste:comment
      2. -
      3. ste:rawtext
      4. -
      -
    8. -
    -
  2. -
  3. Escaping special chars
  4. -
  5. - Builtin tags -
      -
    1. ste:if
    2. -
    3. ste:cmp
    4. -
    5. ste:not
    6. -
    7. ste:even
    8. -
    9. ste:for
    10. -
    11. ste:foreach
    12. -
    13. ste:infloop
    14. -
    15. ste:break
    16. -
    17. ste:continue
    18. -
    19. ste:load
    20. -
    21. ste:block
    22. -
    23. ste:set
    24. -
    25. ste:calc
    26. -
    27. ste:mktag
    28. -
    -
  6. -
- -

Basic Elements

-

The STE T/PL consists of four basic elements:

- -

Text

-

Everything that is not a Variable, a Tag or a Pseudotag is Text.

-

Also everything that is wrapped in the ste:rawtext pseudotag will be Text, whereby all Tags and Variables will not be parsed.

-

Example:

-

-

Foo $baz[herpdederp]]]>
- Will result in one text-element, but -
$baz[herpdederp]]]>
- will result in one text-element and one tag-element containing one variable-element. -

- -

Variable

-

Variables start with a $ or can be wrapped within ${ and }, so vou can write this: ${foo}ish

-

Variable have names, these names can consist of letters (english alphabet; upper and lower case), numbers and underscores (_). As a regex: [a-zA-Z0-9_]+

-

A variable can also be an array. To access an array, wrap the desired fieldname within [ and ]. A fieldname can be constructed of Text and othe Variables. So you can dynamically access fields: $foo[$bar]. These fieldnames can also be nested or concatenated: $foo[$bar[baz]][herp][$de[derp]]

-

If you want a literal $ char, you can escape it: \$

-

Variables in STE T/PL are typeless, everything ist text. In a boolean context, empty text usually represents false, else true.

- -

Tag

-

A Tag can be compared to a function. A Tag can have parameters and children elements.

-

- A Tag looks like a XML-Tag with the ste-Namespace. - Just like their XML counterparts, they can wrap other elements (barherpdederp]]>) or can be self-closing (]]>). - And they can have additional parameters (or "attributes", using the XML terminology): ]]> -

-

A Tag is wrapped in < and >. The tag's name always start with ste: and can then consist of letters, numbers and underscores (Regex: [a-zA-Z0-9_]+).

-

If the tag is self-closing, the last char is a / (e.g.: ]]>).

-

If the tag is a closing one, the first char is a /. An opening Tag does not have a /.An example of an opening-closing Tag pair wrapping the text bar: bar]]>

-

- Parameters of a tag consists of a name and the corresponding value (wrapped in " or ') seperated by an = .
- Parameters are seperated by any whitespace (space, tab or newline) char.
- Parameter values can consist of Text and Variable elements but not of Tags!
- If you need a literal " or ' in a parameter value, you can escape them: \" or \' .
- When using variables in paramter values, they will be "replaced" by their value. Because many tags need the variable and not its content, they expect only the variable's name. If you then write foo="$bar", the tag will not operate on the bar variable but on the Variable with the name stored in $bar! So read the instructions to the tag carefully! -

-

Example: de ]]>

- -

Pseudotag

-

Pseudotags look like normal tags, but they perform special tasks. There are currently two pseudotags:

-

ste:comment

-

With the ste:comment pseudotag you can comment your template/code. Everything between <ste:comment> and </ste:comment> will be ignored, before the real tokenization of the code starts.

-

ste:rawtext

-

The ste:rawtext pseudotag will output a Text element with its wrapped content. It will prevent parsing of the content. Useful if you are embedding another script language, which uses the $ char or also has a XML-Like syntax. No escape sequences will be translated! Can not be used in Tag parameter values!

- -

Escaping special chars

-

To get a literal $, " or other special chars, STE T/PL gives you the following escape sequences:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Escape SequenceResultCan be used inNotes
\$$Text elements
\""Tag parameter values
\''Tag parameter values
\??Text elementsMore info: short if-clause
\{{Text elementsMore info: short if-clause
\}}Text elementsMore info: short if-clause
\||Text elementsMore info: short if-clause
\\\Everywhere, where the other escape sequences are valid
-

Escape sequences are not translated in Pseudotags

- -

Builtin Tags

-

STE has some builtin Tags, that makes programming in STE T/PL possible.

- -

ste:if

-

The ste:if Tag provides an if-clause to STE T/PL.

-

ste:if can have the subtags ste:then and ste:else. Everything between <ste:if> and </ste:if>, that is not an ste:then or ste:else tag, will be used as the condition.

-

Because STE T/PL is typeless, every empty string (trailing whitespaces will be ignored) is considered as false, everything else is true.

-

If the condition is true (i.e. not empty), the content of the ste:then block will be executed. Otherwise the ste:else tag (if present) will be executed.

-

The ste:then Tag is mandatory, the ste:else tag is optional.

-

- Example:
-


-	$foo
-	Bar
-	Baz
-]]>
- If $foo is not empty, then Bar will be executed, otherwise Baz. -

-

Short syntax for if-clause

-

Because if-clauses are used often, there is an short syntax:

-

?{condition|then|else}

-

This is equavilent to:

-

conditionthenelse]]>

-

?, {, | and } can be escaped

-

In this variant, the else part is not optional!

-

WARNING: short if-clauses can not be nested!

- -

ste:cmp

-

With the ste:cmp tag you can compare two values.

-

ste:cmp is selfclosing, the compared values are passed by parameters.

-

It compares two values, a and b using an operator.

-

- a and b can be passed in two ways: -

    -
  • With the var_x parameter. The parameter value is a variable name.
  • -
  • With the text_x parameter. The parameter value is a text.
  • -
- (where x is either a or b). -

-

- The operator is passed wth the op parameter. Following parameters are available: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
op valueDescription
eqa and b are equal
neqa and b are not equal
lta is less than b
ltea is less or equal b
gta is greater than b
gtea is greater or equal b
-

-

If the comparasion was true, a non-empty text will be returned, otherwise an empty text, so you can use ste:cmp with ste:if

-

- Example:
-


-	
-	:-)
-	:-(
-]]>
- If the variable foo has the content bar, :-) will be returned, :-( otherwise. -

- -

ste:not

-

The ste:not Tag will logically invert its content. If it is an empty text (i.e. false), it will return a non-empty text (i.e. true) and vice versa.

-

- Example:
-


-	$foo
-	:-)
-	:-(
-]]>
- If the variable foo is empty (i.e. false), :-) will be returned, :-( otherwise. -

- -

ste:even

-

If the enclosed text is a number, and the number is even, this tag will return a non-empty text (i.e. true), an empty text (i.e. false) otherwise.

- -

ste:for

-

ste:for provides a counter loop.

-

- ste:for has these parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
parameter nameMandatory?Description
startYesBegin counting at this number.
stopYesStop counting at this number (inclusive).
stepNoWhat amount should be added to the counter at each round? (Default: 1)
counterNoThe current number will be stored in this variable (expects a variable name).
-

-

- Example:
-


-	$i
-]]>
- Will count from 10 down to 0 and output the number followed by an HTML line break. -

- -

ste:foreach

-

ste:foreach will loop through an array.

-

- ste:foreach has these parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
parameter nameMandatory?Description
arrayYesThe array to be looped through.
keyNoThe array key will be stored in this variable (expects variable name).
valueYesThe value of the current element will be stored in this variable (expects variable name).
counterNoExpects a variable name. If given, the current number of iterations will be stored in this variable. Starts with 0.
-

-

- Example:
-


-	Number: $i
- Key: $k
- Value: $v
-
-]]>
- This code will loop through the array foo and return the counter $i, the key $k and the value $v of the current iteration. -

- -

ste:infloop

-

Create an infinitive loop. You can get out of the loop using the ste:break tag. Can be used to emulate othe loop constructs like while loops.

-

- Example:
-


-	
-		
-		
-	
-	...
-]]>
- This code will return ... while <ste:foo /> returns an empty text (i.e. false). -

- -

ste:break

-

When this self-closing tag is called, the current loop (ste:for, ste:foreach, ste:infloop) will be aborted.

- -

ste:continue

-

When this self-closing tag is called, the current loop(ste:for, ste:foreach, ste:infloop) will go to the next iteration, aborting the current iteration.

- -

ste:load

-

This self-closing tag loads and executes anoter template. The name parameter (mandatory) defines the template to load.

-

Because each template must be parseable and transcompilable by itself, this is not a inclusion of another template. So you can not do this:

-

- slave.tpl:
-


-	bla]]>
- master.tpl
-

-]]>
-

-

But you can do this:

-

- slave.tpl:
-

$bar]]>
- master.tpl
-

-	
-]]>
-

- -

ste:block

-

ste:block provides an easy way for writing master templates. Every block has a name. When a block is defined twice, the second will overwrite the first one.

-

The name can be set with the name parameter.

-

- Example:
- master.tpl -

Content:
-
-	Default content
-
-]]>
- slave.tpl:
-

-
-	Much cooler content :-)
-]]>
- When executing slave.tpl, master.tpl will be loaded and its content block will be replaced with the new one (Much cooler content :-)) but leave the original sidebar block. -

-

Blocks can not be nested.

- -

ste:set

-

ste:set will set a variable. The parameter var takes the name of the variable to set. The content of the Tag will be the new content of the variable.

-

- Example:
-

bar]]>
- This will set the variable foo to bar. -

-

- Tag parameter values can not contain Tags. ste:set can be used to bypass this:
-


-]]>
-

- -

ste:calc

-

To perform mathematical calculations, you can use ste:math. ste:math calculates the mathematical formula it is wrapped around and returns the result. The formula is in the usual infix-notation [ext. Link] and has these operators: +, -, *, / and ^. Numbers are always decimal, the decimal mark is . and numbers can be prefixed with an - to indicate a negative number. It is a good idea to wrap a negative number in brackets to prevent wrong evaluation (because - is also an operator). Calculations can be grouped with brackets: ( and ).

-

Real numbers are supported, complex numbers not.

-

Formulas are evaluated at runtime, not during transcompilation.

-

- Example:
- (2+3+4) * (1.5 - (-0.5))]]> will return 18. -

- -

ste:mktag

-

ste:mktag allows you to define own Tags using STE T/PL.

-

The parameter name (mandatory) expects the name of the new tag. If your tag requires some parameters, you can specify them using the optional mandatory parameter. Names of the mandatory parameters are seperated by |.

-

The Variable _tag_parameters (associative array) will hold all given parameters and their values.

-

With the ste:tagcontent tag you can execute the tags content.

-

ste:mktag will be transcompiled like any other code. So your custom tag will be almost as fast as a plugin coded in PHP.

-

- Example: -


-	
-		
-	
-
-
-	 * 2
-
-
-	$i
-
]]>
- Will output:
-

-8
-6
-4
-2
-0
]]>
-

- - diff --git a/mkdocu.sh b/mkdocu.sh new file mode 100755 index 0000000..36d0c7c --- /dev/null +++ b/mkdocu.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +if [ ! -d docu/nd ]; then mkdir docu/nd; fi +NaturalDocs -i . -o html docu/nd -p docu/nd diff --git a/stupid_template_engine.php b/stupid_template_engine.php index bd6efea..2e9162f 100644 --- a/stupid_template_engine.php +++ b/stupid_template_engine.php @@ -1,5 +1,14 @@ 0 ? mk_ast($code) : array()); } +/* + * Function: parse + * Parsing a STE T/PL template. + * You only need this function, if you want to manually transcompile a template. + * + * Parameters: + * $code - The STE T/PL code. + * + * Returns: + * An abstract syntax tree, whic can be used with . + */ function parse($code) { /* Precompiling... */ @@ -224,78 +244,6 @@ function parse($code) return mk_ast($code); } -define("MODE_SOURCE", 0); -define("MODE_TRANSCOMPILED", 1); - -interface StorageAccess -{ - public function load($tpl, &$mode); - public function save($tpl, $data, $mode); -} - -class FilesystemStorageAccess implements StorageAccess -{ - protected $sourcedir; - protected $transcompileddir; - - public function __construct($src, $transc) - { - $this->sourcedir = $src; - $this->transcompileddir = $transc; - } - - public function load($tpl, &$mode) - { - $src_fn = $this->sourcedir . "/" . $tpl; - $transc_fn = $this->transcompileddir . "/" . $tpl . ".php"; - - if($mode == MODE_SOURCE) - { - $content = @file_get_contents($src_fn); - if($content === False) - throw new \Exception("Template not found."); - return $content; - } - - $src_stat = @stat($src_fn); - $transc_stat = @stat($transc_fn); - - if(($src_stat === False) and ($transc_stat === False)) - throw new \Exception("Template not found."); - else if($transc_stat === False) - { - $mode = MODE_SOURCE; - return file_get_contents($src_fn); - } - else if($src_stat === False) - { - include($transc_fn); - return $transcompile_fx; - } - else - { - if($src_stat["mtime"] > $transc_stat["mtime"]) - { - $mode = MODE_SOURCE; - return file_get_contents($src_fn); - } - else - { - include($transc_fn); - return $transcompile_fx; - } - } - } - - public function save($tpl, $data, $mode) - { - $fn = (($mode == MODE_SOURCE) ? $this->sourcedir : $this->transcompileddir) . "/" . $tpl . (($mode == MODE_TRANSCOMPILED) ? ".php" : ""); - @mkdir(dirname($fn), 0777, True); - file_put_contents($fn, ""); - chmod($fn, 0777); /* FIXME: Remove this line after debugging... */ - } -} - function indent_code($code) { return implode( @@ -630,7 +578,7 @@ $ste_builtins = array( $code .= "\$${loopname}_array = \$ste->get_var_by_name(\$${loopname}_arrayvar);\n"; $code .= "if(!is_array(\$${loopname}_array))\n\t\$${loopname}_array = array();\n"; - $code .= "\$${loopname}_counter = 0;\n"; + $code .= "\$${loopname}_counter = -1;\n"; $loopbody = "\$${loopname}_counter++;\n\$ste->set_var_by_name(\$${loopname}_valuevar, \$${loopname}_value);\n"; if(!empty($ast->params["key"])) @@ -651,11 +599,11 @@ $ste_builtins = array( }, "break" => function($ast) { - return "\$ste->break_loop();\n"; + return "throw new \\ste\\BreakException();\n"; }, "continue" => function($ast) { - return "\$ste->continue_loop();\n"; + return "throw new \\ste\\ContinueException();\n"; }, "block" => function($ast) { @@ -749,7 +697,7 @@ $ste_builtins = array( function escape_text($text) { - return addcslashes($text, "\r\n\t\$\0..\x1f\\'\x7f..\xff"); + return addcslashes($text, "\r\n\t\$\0..\x1f\\'\"\x7f..\xff"); } function _transcompile($ast) /* The real transcompile function, does not add boilerplate code. */ @@ -789,24 +737,169 @@ function _transcompile($ast) /* The real transcompile function, does not add boi $ste_transc_boilerplate = "\$outputstack = array('');\n\$outputstack_i = 0;\n"; +/* + * Function: transcompile + * Transcompiles an abstract syntax tree to PHP. + * + * Parameters: + * $ast - The abstract syntax tree to transcompile. + * + * Returns: + * PHP code. The PHP code is an anonymous function expecting a instance as its parameter and returns a string (everything that was not pached into a section). + */ function transcompile($ast) /* Transcompile and add some boilerplate code. */ { global $ste_transc_boilerplate; return "function(\$ste)\n{\n" . indent_code($ste_transc_boilerplate . _transcompile($ast) . "return array_pop(\$outputstack);") . "\n}"; } +/* + * Constants: Template modes + * + * MODE_SOURCE - The Templates source + * MODE_TRANSCOMPILED - The transcompiled template + */ +const MODE_SOURCE = 0; +const MODE_TRANSCOMPILED = 1; + +/* + * Class: StorageAccess + * An interface. + * A StorageAccess implementation is used to access the templates from any storage. + * This means, that you are not limited to store the Templates inside directories, you can also use a database or something else. + */ +interface StorageAccess +{ + /* + * Function: load + * Loading a template. + * + * Parameters: + * $tpl - The name of the template. + * &$mode - Which mode is preferred? One of the