Difference between revisions of "Wizard Engine Service"

(Template Files)
Line 3: Line 3:
 
The service makes use of an internal core engine called the '''Code Templates Engine''', which performs actual rendering and is vastly more structured and verbose to work with. This same engine is also used by the [[Code Templates Catalog Service]], ensuring all manner of templates are defined and rendered in the same fashion though out [[:Category:EiffelStudio|EiffelStudio]]. The purpose of the Wizard Engine Service is to facilitate quick and easy translation of code templates without the overhead involved when using the Code Template Engine directly.
 
The service makes use of an internal core engine called the '''Code Templates Engine''', which performs actual rendering and is vastly more structured and verbose to work with. This same engine is also used by the [[Code Templates Catalog Service]], ensuring all manner of templates are defined and rendered in the same fashion though out [[:Category:EiffelStudio|EiffelStudio]]. The purpose of the Wizard Engine Service is to facilitate quick and easy translation of code templates without the overhead involved when using the Code Template Engine directly.
  
== Template Files ==
+
== Template Text ==
Template files are simple files tokenized with variable declarations. The variables will be expanded with those specified in a table passed to the service's rendering functions.
+
Template are simple text blobs tokenized with variable declarations. The variables will be expanded with those specified in a table passed to the service's rendering functions.
  
 
A variable is tokenized with a <code>$</code> specified followed by an Eiffel-like identifier. By convention all variables are specified in uppercase characters in the template. Variables are not actual case-sensitive so this is by convention only. For example, here is the simplest form of a variable declaration:
 
A variable is tokenized with a <code>$</code> specified followed by an Eiffel-like identifier. By convention all variables are specified in uppercase characters in the template. Variables are not actual case-sensitive so this is by convention only. For example, here is the simplest form of a variable declaration:
Line 20: Line 20:
 
Due to the special meaning of <code>$</code> it might be necessary to escape it to use in the template text itself. To escape the token specifier use <code>$$</code>, which will be expanded (or shrunk) to <code>$</code> in the rendered template.
 
Due to the special meaning of <code>$</code> it might be necessary to escape it to use in the template text itself. To escape the token specifier use <code>$$</code>, which will be expanded (or shrunk) to <code>$</code> in the rendered template.
  
 +
== Service API ==
 +
 +
=== Examples ===
 +
 +
<e>
 +
feature {NONE} -- Helpers
 +
 +
    wizard_engine: !SERVICE_CONSUMER [WIZARD_ENGINE_S]
 +
            -- Access to the wizard engine service.
 +
        once
 +
            create Result
 +
        end
 +
 +
feature -- Basic operation
 +
 +
    example (a_name: !READABLE_STRING_32; a_index: NATURAL_8)
 +
            -- Example code.
 +
        require
 +
            not_a_name_is_empty: not a_name.is_empty
 +
        local
 +
            l_text: !STRING_32
 +
            l_params: DS_HASH_TABLE [!ANY, !STRING]
 +
        do
 +
            if wizard_engine.is_service_available then
 +
                create l_params.make (2)
 +
                l_params.force_last (a_name, name_variable)
 +
                l_params.force_last (a_index, var_variable)
 +
           
 +
                    -- Render text.
 +
                l_text := wizard_engine.service.render_template (
 +
                    template,
 +
                    l_params)
 +
 +
                    -- Print rendered text.
 +
                print (l_text)
 +
            end
 +
       
 +
feature {NONE} -- Constants
 +
 +
    template: !STRING =
 +
        "Hello $NAME!%N%
 +
        %You passed the index no${VAR}."
 +
   
 +
    name_variable: !STRING = "NAME"
 +
    var_variable: !STRING = "VAR"
 +
</e>
 +
 +
Execute the following
 +
<e>
 +
example ("Eiffel User", 10)
 +
</e>
 +
 +
to produce
 +
<code>
 +
Hello Eiffel User
 +
You passed the index no10.
 +
</code>
 +
 +
Notice the Wizard Engine Service's rendering functions can use variable values of any type, not just string representations. In the above example a <e>STRING</e> and a <e>NATURAL_8</e> objects were passed to the <e>render_template</e> function.
 +
 +
== Template Files ==
 
=== Common Locations ===
 
=== Common Locations ===
 
When working with templates in EiffelStudio, most templates are located under a common ''template'' folder, in the [[:Category:EiffelStudio|EiffelStudio]] installation.
 
When working with templates in EiffelStudio, most templates are located under a common ''template'' folder, in the [[:Category:EiffelStudio|EiffelStudio]] installation.
  
 
If using template files, and installing the template files under the [[:Category:EiffelStudio|EiffelStudio]] ''templates'' folder, you are encouraged to support [[Replaceable User Files|User Replaceable Files]], so end-users are free to redefine the templates in their own way. Extra precaution needs to be taken however because user files are more susceptible to changes and updates which may result in erroneous rendering.
 
If using template files, and installing the template files under the [[:Category:EiffelStudio|EiffelStudio]] ''templates'' folder, you are encouraged to support [[Replaceable User Files|User Replaceable Files]], so end-users are free to redefine the templates in their own way. Extra precaution needs to be taken however because user files are more susceptible to changes and updates which may result in erroneous rendering.

Revision as of 14:50, 17 October 2008

The Wizard Engine Service is currently in it's nascency but provides a full template rendering engine for consuming tokenized templates (either from files or in-memory) and rendering them using a variable table. The results are just as flexible as the consumption, the rendered text may be generated into a in-memory representation or stored into a file.

The service makes use of an internal core engine called the Code Templates Engine, which performs actual rendering and is vastly more structured and verbose to work with. This same engine is also used by the Code Templates Catalog Service, ensuring all manner of templates are defined and rendered in the same fashion though out EiffelStudio. The purpose of the Wizard Engine Service is to facilitate quick and easy translation of code templates without the overhead involved when using the Code Template Engine directly.

Template Text

Template are simple text blobs tokenized with variable declarations. The variables will be expanded with those specified in a table passed to the service's rendering functions.

A variable is tokenized with a $ specified followed by an Eiffel-like identifier. By convention all variables are specified in uppercase characters in the template. Variables are not actual case-sensitive so this is by convention only. For example, here is the simplest form of a variable declaration:

$VARIABLE_NAME

When inserting variables adjacent to template text the variable declaration name may be blurred. To be more explicit with variable declarations, wrapped the variable name in curly braces ({...}). The token specifier $ must remain before the opening {:

${VARIABLE_NAME}

Due to the special meaning of $ it might be necessary to escape it to use in the template text itself. To escape the token specifier use $$, which will be expanded (or shrunk) to $ in the rendered template.

Service API

Examples

feature {NONE} -- Helpers
 
    wizard_engine: !SERVICE_CONSUMER [WIZARD_ENGINE_S]
            -- Access to the wizard engine service.
        once
            create Result
        end
 
feature -- Basic operation
 
    example (a_name: !READABLE_STRING_32; a_index: NATURAL_8)
            -- Example code.
        require
            not_a_name_is_empty: not a_name.is_empty
        local
            l_text: !STRING_32
            l_params: DS_HASH_TABLE [!ANY, !STRING]
        do
            if wizard_engine.is_service_available then
                create l_params.make (2)
                l_params.force_last (a_name, name_variable)
                l_params.force_last (a_index, var_variable)
 
                    -- Render text.
                l_text := wizard_engine.service.render_template (
                    template,
                    l_params)
 
                    -- Print rendered text.
                print (l_text)
            end
 
feature {NONE} -- Constants
 
    template: !STRING = 
        "Hello $NAME!%N%
        %You passed the index no${VAR}."
 
    name_variable: !STRING = "NAME"
    var_variable: !STRING = "VAR"

Execute the following

example ("Eiffel User", 10)

to produce

Hello Eiffel User
You passed the index no10.

Notice the Wizard Engine Service's rendering functions can use variable values of any type, not just string representations. In the above example a STRING and a NATURAL_8 objects were passed to the render_template function.

Template Files

Common Locations

When working with templates in EiffelStudio, most templates are located under a common template folder, in the EiffelStudio installation.

If using template files, and installing the template files under the EiffelStudio templates folder, you are encouraged to support User Replaceable Files, so end-users are free to redefine the templates in their own way. Extra precaution needs to be taken however because user files are more susceptible to changes and updates which may result in erroneous rendering.