Be more strict about type conversion:

* numbers are no longer auto converted to booleans, use to_boolean or != 0
  * booleans are no longer auto converted to numbers, use to_int
  * strings will soon no longer be auto converted to numbers, use to_int

Added version information ("since 0.3.7") to documentation

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1006 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2008-06-28 13:34:57 +00:00
parent ba2665eb49
commit fe2e3fb9c8
29 changed files with 693 additions and 33 deletions
+13 -2
View File
@@ -157,7 +157,7 @@ init script:
# Number of colors in a card_color # Number of colors in a card_color
card_color_color_count := { card_color_color_count := {
chosen(choice:"white") + chosen(choice:"blue") + chosen(choice:"black") + chosen(choice:"red") + chosen(choice:"green") + chosen(choice:"artifact") for each choice in ["white","blue","black","red","green","artifact"] do to_int(chosen())
} }
# Clean up color field # Clean up color field
card_color_filter := { card_color_filter := {
@@ -1883,7 +1883,18 @@ pack type:
name: Common name: Common
amount: 11 amount: 11
filter: card.rarity == "common" filter: card.rarity == "common"
pack type:
name: Additional rare
card type:
name: Rare
amount: 1
filter: card.rarity == "rare"
pack type:
name: Additional common
card type:
name: Rare
amount: 1
filter: card.rarity == "rare"
+4 -2
View File
@@ -1,5 +1,7 @@
Function: assert Function: assert
DOC_MSE_VERSION: since 0.3.7
--Usage-- --Usage--
> assert(condition) > assert(condition)
@@ -12,5 +14,5 @@ Note: @assert@ is a special built-in keyword, so that the error message can incl
| @input@ [[type:boolean]] Condition to check. | @input@ [[type:boolean]] Condition to check.
--Examples-- --Examples--
> assert(1 + 1 == 2) == nil # nothing happens > assert(1 + 1 == 2) # nothing happens
> assert(1 * 1 == 2) == nil # An error message is shown > assert(1 * 1 == 2) # An error message is shown
+7
View File
@@ -2,6 +2,13 @@ Script functions by category
These functions are built into the program, other [[type:function]]s can be defined using the scripting language. These functions are built into the program, other [[type:function]]s can be defined using the scripting language.
! Type conversion <<<
| [[fun:to_string]] Convert any value to a [[type:string]]
| [[fun:to_int]] Convert any value to a [[type:int]]
| [[fun:to_real]] Convert any value to a [[type:double]]
| [[fun:to_boolean]] Convert any value to a [[type:boolean]]
| [[fun:to_color]] Convert any value to a [[type:color]]
! Text manipulation <<< ! Text manipulation <<<
| [[fun:to_upper]] Convert a string to upper case, @"aBc" -> "ABC"@. | [[fun:to_upper]] Convert a string to upper case, @"aBc" -> "ABC"@.
| [[fun:to_lower]] Convert a string to lower case, @"aBc" -> "abc"@. | [[fun:to_lower]] Convert a string to lower case, @"aBc" -> "abc"@.
+20
View File
@@ -0,0 +1,20 @@
Function: to_boolean
DOC_MSE_VERSION: since 0.3.7
--Usage--
> to_boolean(any value)
Convert any value to a [[type:boolean]] representation.
Normally numbers are not converted to booleans automatically, with the to_boolean function @0@ is converted to @false@ while any other number is converted to @true@.
--Parameters--
! Parameter Type Description
| @input@ ''any type'' Value to convert to a boolean.
--Examples--
> to_boolean(true) == true
> to_boolean("true") == true
> to_boolean(1) == true
> to_boolean(0) == false
+16
View File
@@ -0,0 +1,16 @@
Function: to_color
DOC_MSE_VERSION: since 0.3.7
--Usage--
> to_color(any value)
Convert any value to a [[type:color]].
--Parameters--
! Parameter Type Description
| @input@ ''any type'' Value to convert to a color
--Examples--
> to_color("red") == rgb(255,0,0)
+24
View File
@@ -0,0 +1,24 @@
Function: to_int
DOC_MSE_VERSION: since 0.3.7
--Usage--
> to_int(any value)
Convert any value to a [[type:int]].
* Real numbers are rounded towards zero when converted to integer numbers.
* The boolean value @true@ becomes @1@, while @false@ is converted to @0@.
* For colors the grayscale value between @0@ and @255@ is returned.
--Parameters--
! Parameter Type Description
| @input@ ''any type'' Value to convert to an integer number
--Examples--
> to_int(1.5) == "1"
> to_int("15") == "15"
> to_int(true) == 1
--See also--
| [[fun:to_real]] Convert any value to a [[type:double]]
+20
View File
@@ -0,0 +1,20 @@
Function: to_real
DOC_MSE_VERSION: since 0.3.7
--Usage--
> to_real(any value)
Convert any value to a [[type:double]].
--Parameters--
! Parameter Type Description
| @input@ ''any type'' Value to convert to a real number
--Examples--
> to_real(1) == 1.0
> to_real("1.5") == "1.5"
--See also--
| [[fun:to_int]] Convert any value to a [[type:int]]
+24
View File
@@ -0,0 +1,24 @@
Function: to_string
DOC_MSE_VERSION: since 0.3.7
--Usage--
> to_string(any value)
Convert any value to a [[type:string]] representation.
The @to_string@ function should not be confused with @to_text@,
the former converts things like number to string, while the latter removes tags from a [[type:tagged string]].
--Parameters--
! Parameter Type Description
| @input@ ''any type'' Value to convert to a string
| @format@ ''optional'' Formating to apply.
--Examples--
> to_string(to_color("blue")) == "rgb(0,0,255)"
> to_string(10 + 20) == "30"
> to_string(10 + 20, format: ".3f") == "30.000"
> to_string(10 + 20, format: "x") == "1e" # hexadecimal notation
+4
View File
@@ -1,5 +1,7 @@
Default arguments Default arguments
DOC_MSE_VERSION: since 0.3.7
It is possible to declare default arguments for functions using the @@@@ operator. It is possible to declare default arguments for functions using the @@@@ operator.
> function := { "argument was: " + arg }@(arg:"default") > function := { "argument was: " + arg }@(arg:"default")
If this function is called without the @arg@ argument, then the default value @"default"@ is used instead. If this function is called without the @arg@ argument, then the default value @"default"@ is used instead.
@@ -19,6 +21,8 @@ Defaults are evaluated at the time the @@@@ operator is evaluated, they will not
--Rule functions-- --Rule functions--
DOC_MSE_VERSION: until 0.3.6
In earlier versions of MSE some functions were available in a special ''rule form''. In earlier versions of MSE some functions were available in a special ''rule form''.
A call to for example @replace_rule(match:"abc",replace:"xyz")@ is equivalent to @replace@@(match:"abc",replace:"xyz")@ . A call to for example @replace_rule(match:"abc",replace:"xyz")@ is equivalent to @replace@@(match:"abc",replace:"xyz")@ .
For backwards compatability these functions are still available, but they should not be used for new templates. For backwards compatability these functions are still available, but they should not be used for new templates.
+1
View File
@@ -16,6 +16,7 @@ See also:
* [[fun:index|Built in functions]] * [[fun:index|Built in functions]]
--Syntax index-- --Syntax index--
| @#comment@ Comments ignored by the parser
| @123@ [[type:int|A literal number]] | @123@ [[type:int|A literal number]]
| @"stuff"@ [[type:string|A literal string]] | @"stuff"@ [[type:string|A literal string]]
| @[a,b,c]@ [[type:list|A literal list]] | @[a,b,c]@ [[type:list|A literal list]]
+2
View File
@@ -22,3 +22,5 @@ The operators @or@, @and@ and @xor@ combine two booleans:
| @true@ @false@ @true@ @false@ @true@ | @true@ @false@ @true@ @false@ @true@
| @true@ @true@ @true@ @true@ @false@ | @true@ @true@ @true@ @true@ @false@
--See also--
| [[fun:to_boolean]] Convert a value to a boolean
+3
View File
@@ -27,3 +27,6 @@ For example:
| @rgba(0,0,0,0)@ transparent <div style="border:1px solid black; width:30px;height:15px;text-align:center;">over</div> | @rgba(0,0,0,0)@ transparent <div style="border:1px solid black; width:30px;height:15px;text-align:center;">over</div>
| @rgba(255,0,0,128)@ transparent red <div style="border:1px solid black; background:rgb(255,128,128);color:rgb(128,0,0);width:30px;height:15px;text-align:center;">over</div> | @rgba(255,0,0,128)@ transparent red <div style="border:1px solid black; background:rgb(255,128,128);color:rgb(128,0,0);width:30px;height:15px;text-align:center;">over</div>
| @rgba(0,0,255,192)@ transparent blue <div style="border:1px solid black; background:rgb(64,64,255);color:rgb(0,0,192);width:30px;height:15px;text-align:center;">over</div> | @rgba(0,0,255,192)@ transparent blue <div style="border:1px solid black; background:rgb(64,64,255);color:rgb(0,0,192);width:30px;height:15px;text-align:center;">over</div>
--See also--
| [[fun:to_color]] Convert any value to a color
+2 -1
View File
@@ -12,4 +12,5 @@ Conversion from integer to real numbers happens automatically in scripting.
> 123.1 + 456 * -1 > 123.1 + 456 * -1
--See also-- --See also--
* [[type:int]] | [[type:int]] Integer numbers
| [[fun:to_real]] Convert a value to a real number
+2 -1
View File
@@ -10,4 +10,5 @@ In many cases negative numbers don't make sense, but the program never complains
> 123 + 456 * -1 > 123 + 456 * -1
--See also-- --See also--
* [[type:double]] | [[type:double]] Number type that can contain fractional values.
| [[fun:to_int]] Convert a value to an integer number
+9 -2
View File
@@ -25,10 +25,17 @@ Sections between curly braces are interpreted as script code, that is concatenta
> "ab{1 + 1}c" == "ab2c" > "ab{1 + 1}c" == "ab2c"
This can be nested arbitrarily. This can be nested arbitrarily.
The @+@ operator concatenates strings. Numbers and most other values are automatically converted to strings when needed. The @+@ operator concatenates strings. Numbers and most other values are automatically converted to strings when needed. This conversion can be forced with the [[fun:to_string]] function.
Using the @[]@ or @.@ operator characters in a string can be selected. 0 is the first character: Using the @[]@ or @.@ operator characters in a string can be selected. 0 is the first character:
> "xyz"[0] == "x" > "xyz"[0] == "x"
> "xyz".0 == "x" # same thing > "xyz".0 == "x" # same thing
> "xyz".1 == "y"
> "xyz".2 == "z"
It is an error to select characters outside the string It is an error to select characters outside the string
> "xyz".10 # error > "xyz".10 # error
--See also--
| [[type:tagged string]] A string containg tags.
| [[fun:to_string]] Convert any value to a [[type:string]]
+1
View File
@@ -649,6 +649,7 @@ KeywordParamValue::operator String() const {
KeywordParamValue::operator int() const { return *to_script(value); } // a bit of a hack KeywordParamValue::operator int() const { return *to_script(value); } // a bit of a hack
KeywordParamValue::operator double() const { return *to_script(value); } KeywordParamValue::operator double() const { return *to_script(value); }
KeywordParamValue::operator bool() const { return *to_script(value); }
KeywordParamValue::operator AColor() const { return *to_script(value); } KeywordParamValue::operator AColor() const { return *to_script(value); }
int KeywordParamValue::itemCount() const { return to_script(value)->itemCount(); } int KeywordParamValue::itemCount() const { return to_script(value)->itemCount(); }
+1
View File
@@ -176,6 +176,7 @@ class KeywordParamValue : public ScriptValue {
virtual String typeName() const; virtual String typeName() const;
virtual operator String() const; virtual operator String() const;
virtual operator int() const; virtual operator int() const;
virtual operator bool() const;
virtual operator double() const; virtual operator double() const;
virtual operator AColor() const; virtual operator AColor() const;
virtual int itemCount() const; virtual int itemCount() const;
+414
View File
@@ -3399,6 +3399,420 @@
</File> </File>
</Filter> </Filter>
</Filter> </Filter>
<Filter
Name="doc"
Filter="">
<Filter
Name="about"
Filter="">
</Filter>
<Filter
Name="file"
Filter="">
<File
RelativePath="..\doc\file\format.txt">
</File>
<File
RelativePath="..\doc\file\index.txt">
</File>
<File
RelativePath="..\doc\file\package.txt">
</File>
<File
RelativePath="..\doc\file\style_triangle.txt">
</File>
</Filter>
<Filter
Name="script"
Filter="">
<File
RelativePath="..\doc\script\best_practices.txt">
</File>
<File
RelativePath="..\doc\script\control_structures.txt">
</File>
<File
RelativePath="..\doc\script\default_arguments.txt">
</File>
<File
RelativePath="..\doc\script\functions.txt">
</File>
<File
RelativePath="..\doc\script\index.txt">
</File>
<File
RelativePath="..\doc\script\introduction.txt">
</File>
<File
RelativePath="..\doc\script\operators.txt">
</File>
<File
RelativePath="..\doc\script\predefined_variables.txt">
</File>
<File
RelativePath="..\doc\script\variables.txt">
</File>
</Filter>
<Filter
Name="function"
Filter="">
<File
RelativePath="..\doc\function\assert.txt">
</File>
<File
RelativePath="..\doc\function\break_text.txt">
</File>
<File
RelativePath="..\doc\function\built_in_image.txt">
</File>
<File
RelativePath="..\doc\function\chosen.txt">
</File>
<File
RelativePath="..\doc\function\combine_blend.txt">
</File>
<File
RelativePath="..\doc\function\combined_editor.txt">
</File>
<File
RelativePath="..\doc\function\contains.txt">
</File>
<File
RelativePath="..\doc\function\copy_file.txt">
</File>
<File
RelativePath="..\doc\function\crop.txt">
</File>
<File
RelativePath="..\doc\function\curly_quotes.txt">
</File>
<File
RelativePath="..\doc\function\drop_shadow.txt">
</File>
<File
RelativePath="..\doc\function\english_number.txt">
</File>
<File
RelativePath="..\doc\function\english_plural.txt">
</File>
<File
RelativePath="..\doc\function\enlarge.txt">
</File>
<File
RelativePath="..\doc\function\exclusive_choice.txt">
</File>
<File
RelativePath="..\doc\function\expand_keywords.txt">
</File>
<File
RelativePath="..\doc\function\filter_list.txt">
</File>
<File
RelativePath="..\doc\function\filter_text.txt">
</File>
<File
RelativePath="..\doc\function\format.txt">
</File>
<File
RelativePath="..\doc\function\index.txt">
</File>
<File
RelativePath="..\doc\function\keyword_usage.txt">
</File>
<File
RelativePath="..\doc\function\length.txt">
</File>
<File
RelativePath="..\doc\function\linear_blend.txt">
</File>
<File
RelativePath="..\doc\function\masked_blend.txt">
</File>
<File
RelativePath="..\doc\function\match.txt">
</File>
<File
RelativePath="..\doc\function\number_of_items.txt">
</File>
<File
RelativePath="..\doc\function\position.txt">
</File>
<File
RelativePath="..\doc\function\primary_choice.txt">
</File>
<File
RelativePath="..\doc\function\process_english_hints.txt">
</File>
<File
RelativePath="..\doc\function\regex_escape.txt">
</File>
<File
RelativePath="..\doc\function\remove_choice.txt">
</File>
<File
RelativePath="..\doc\function\remove_tag.txt">
</File>
<File
RelativePath="..\doc\function\remove_tags.txt">
</File>
<File
RelativePath="..\doc\function\replace.txt">
</File>
<File
RelativePath="..\doc\function\require_choice.txt">
</File>
<File
RelativePath="..\doc\function\require_exclusive_choice.txt">
</File>
<File
RelativePath="..\doc\function\reverse.txt">
</File>
<File
RelativePath="..\doc\function\saturate.txt">
</File>
<File
RelativePath="..\doc\function\set_alpha.txt">
</File>
<File
RelativePath="..\doc\function\set_combine.txt">
</File>
<File
RelativePath="..\doc\function\set_mask.txt">
</File>
<File
RelativePath="..\doc\function\sort_list.txt">
</File>
<File
RelativePath="..\doc\function\sort_text.txt">
</File>
<File
RelativePath="..\doc\function\substring.txt">
</File>
<File
RelativePath="..\doc\function\symbol_variation.txt">
</File>
<File
RelativePath="..\doc\function\symbols_to_html.txt">
</File>
<File
RelativePath="..\doc\function\tag_contents.txt">
</File>
<File
RelativePath="..\doc\function\to_boolean.txt">
</File>
<File
RelativePath="..\doc\function\to_color.txt">
</File>
<File
RelativePath="..\doc\function\to_html.txt">
</File>
<File
RelativePath="..\doc\function\to_int.txt">
</File>
<File
RelativePath="..\doc\function\to_lower.txt">
</File>
<File
RelativePath="..\doc\function\to_real.txt">
</File>
<File
RelativePath="..\doc\function\to_string.txt">
</File>
<File
RelativePath="..\doc\function\to_text.txt">
</File>
<File
RelativePath="..\doc\function\to_title.txt">
</File>
<File
RelativePath="..\doc\function\to_upper.txt">
</File>
<File
RelativePath="..\doc\function\trace.txt">
</File>
<File
RelativePath="..\doc\function\trim.txt">
</File>
<File
RelativePath="..\doc\function\write_image_file.txt">
</File>
<File
RelativePath="..\doc\function\write_text_file.txt">
</File>
</Filter>
<Filter
Name="type"
Filter="">
<File
RelativePath="..\doc\type\alignment.txt">
</File>
<File
RelativePath="..\doc\type\boolean.txt">
</File>
<File
RelativePath="..\doc\type\card.txt">
</File>
<File
RelativePath="..\doc\type\choice.txt">
</File>
<File
RelativePath="..\doc\type\choice_render_style.txt">
</File>
<File
RelativePath="..\doc\type\color.txt">
</File>
<File
RelativePath="..\doc\type\color_choice.txt">
</File>
<File
RelativePath="..\doc\type\combine.txt">
</File>
<File
RelativePath="..\doc\type\control_point.txt">
</File>
<File
RelativePath="..\doc\type\dependency.txt">
</File>
<File
RelativePath="..\doc\type\direction.txt">
</File>
<File
RelativePath="..\doc\type\double.txt">
</File>
<File
RelativePath="..\doc\type\export_template.txt">
</File>
<File
RelativePath="..\doc\type\field.txt">
</File>
<File
RelativePath="..\doc\type\filename.txt">
</File>
<File
RelativePath="..\doc\type\font.txt">
</File>
<File
RelativePath="..\doc\type\function.txt">
</File>
<File
RelativePath="..\doc\type\game.txt">
</File>
<File
RelativePath="..\doc\type\graph_type.txt">
</File>
<File
RelativePath="..\doc\type\image.txt">
</File>
<File
RelativePath="..\doc\type\include.txt">
</File>
<File
RelativePath="..\doc\type\index.txt">
</File>
<File
RelativePath="..\doc\type\indexmap.txt">
</File>
<File
RelativePath="..\doc\type\insert_symbol_menu.txt">
</File>
<File
RelativePath="..\doc\type\installer.txt">
</File>
<File
RelativePath="..\doc\type\int.txt">
</File>
<File
RelativePath="..\doc\type\keyword.txt">
</File>
<File
RelativePath="..\doc\type\keyword_mode.txt">
</File>
<File
RelativePath="..\doc\type\keyword_param_reference_script.txt">
</File>
<File
RelativePath="..\doc\type\keyword_param_type.txt">
</File>
<File
RelativePath="..\doc\type\list.txt">
</File>
<File
RelativePath="..\doc\type\locale.txt">
</File>
<File
RelativePath="..\doc\type\map.txt">
</File>
<File
RelativePath="..\doc\type\regex.txt">
</File>
<File
RelativePath="..\doc\type\script.txt">
</File>
<File
RelativePath="..\doc\type\scriptable.txt">
</File>
<File
RelativePath="..\doc\type\set.txt">
</File>
<File
RelativePath="..\doc\type\settings.txt">
</File>
<File
RelativePath="..\doc\type\statistics_category.txt">
</File>
<File
RelativePath="..\doc\type\statistics_dimension.txt">
</File>
<File
RelativePath="..\doc\type\string.txt">
</File>
<File
RelativePath="..\doc\type\style.txt">
</File>
<File
RelativePath="..\doc\type\stylesheet.txt">
</File>
<File
RelativePath="..\doc\type\symbol.txt">
</File>
<File
RelativePath="..\doc\type\symbol_combine.txt">
</File>
<File
RelativePath="..\doc\type\symbol_font.txt">
</File>
<File
RelativePath="..\doc\type\symbol_font_reference.txt">
</File>
<File
RelativePath="..\doc\type\symbol_font_symbol.txt">
</File>
<File
RelativePath="..\doc\type\symbol_part.txt">
</File>
<File
RelativePath="..\doc\type\symbol_variation.txt">
</File>
<File
RelativePath="..\doc\type\tagged_string.txt">
</File>
<File
RelativePath="..\doc\type\value.txt">
</File>
<File
RelativePath="..\doc\type\vector2d.txt">
</File>
<File
RelativePath="..\doc\type\version.txt">
</File>
<File
RelativePath="..\doc\type\word_list.txt">
</File>
<File
RelativePath="..\doc\type\word_list_word.txt">
</File>
</Filter>
</Filter>
<File <File
RelativePath=".\code_template.cpp"> RelativePath=".\code_template.cpp">
<FileConfiguration <FileConfiguration
+9 -4
View File
@@ -63,7 +63,7 @@ ScriptValueP Context::eval(const Script& script, bool useScope) {
} }
// Conditional jump // Conditional jump
case I_JUMP_IF_NOT: { case I_JUMP_IF_NOT: {
int condition = *stack.back(); bool condition = *stack.back();
stack.pop_back(); stack.pop_back();
if (!condition) { if (!condition) {
instr = &script.instructions[i.data]; instr = &script.instructions[i.data];
@@ -322,6 +322,11 @@ class ScriptCompose : public ScriptValue {
a = to_script((int)*a OP (int)*b); \ a = to_script((int)*a OP (int)*b); \
break break
// operator on bools
#define OPERATOR_B(OP) \
a = to_script((bool)*a OP (bool)*b); \
break
// operator on doubles or ints // operator on doubles or ints
#define OPERATOR_DI(OP) \ #define OPERATOR_DI(OP) \
if (at == SCRIPT_DOUBLE || bt == SCRIPT_DOUBLE) { \ if (at == SCRIPT_DOUBLE || bt == SCRIPT_DOUBLE) { \
@@ -392,9 +397,9 @@ void instrBinary (BinaryInstructionType i, ScriptValueP& a, const ScriptValueP&
a = to_script((int)*a % (int)*b); a = to_script((int)*a % (int)*b);
} }
break; break;
case I_AND: OPERATOR_I(&&); case I_AND: OPERATOR_B(&&);
case I_OR: OPERATOR_I(||); case I_OR: OPERATOR_B(||);
case I_XOR: a = to_script((bool)*a != (bool)*b); break; case I_XOR: OPERATOR_B(!=);
case I_EQ: a = to_script( equal(a,b)); break; case I_EQ: a = to_script( equal(a,b)); break;
case I_NEQ: a = to_script(!equal(a,b)); break; case I_NEQ: a = to_script(!equal(a,b)); break;
case I_LT: OPERATOR_DI(<); case I_LT: OPERATOR_DI(<);
+1
View File
@@ -78,6 +78,7 @@ class ScriptMissingVariable : public ScriptValue {
virtual operator String() const { return wxEmptyString; } virtual operator String() const { return wxEmptyString; }
virtual operator double() const { return 0.0; } virtual operator double() const { return 0.0; }
virtual operator int() const { return 0; } virtual operator int() const { return 0; }
virtual operator bool() const { return false; }
virtual ScriptValueP eval(Context&) const { return script_nil; } // nil() == nil virtual ScriptValueP eval(Context&) const { return script_nil; } // nil() == nil
private: private:
String name; ///< Name of the variable String name; ///< Name of the variable
+76 -14
View File
@@ -37,6 +37,75 @@ SCRIPT_FUNCTION(warning) {
return script_nil; return script_nil;
} }
// ----------------------------------------------------------------------------- : Conversion
/// Format the input variable based on a printf like style specification
String format_input(const String& format, Context& ctx) {
String fmt = _("%") + replace_all(format, _("%"), _(""));
// determine type expected by format string
if (format.find_first_of(_("DdIiOoXx")) != String::npos) {
SCRIPT_PARAM_C(int, input);
return String::Format(fmt, input);
} else if (format.find_first_of(_("EeFfGg")) != String::npos) {
SCRIPT_PARAM_C(double, input);
return String::Format(fmt, input);
} else if (format.find_first_of(_("Ss")) != String::npos) {
SCRIPT_PARAM_C(String, input);
return format_string(fmt, input);
} else {
throw ScriptError(_ERROR_1_("unsupported format", format));
}
}
SCRIPT_FUNCTION(to_string) {
ScriptValueP format = ctx.getVariable(SCRIPT_VAR_format);
if (format && format->type() == SCRIPT_STRING) {
// format specifier. Be careful, the built in function 'format' has the same name
SCRIPT_RETURN(format_input(*format, ctx));
} else {
// simple conversion
SCRIPT_PARAM_C(String, input);
SCRIPT_RETURN(input);
}
}
SCRIPT_FUNCTION(to_int) {
ScriptValueP input = ctx.getVariable(SCRIPT_VAR_input);
ScriptType t = input->type();
int result;
if (t == SCRIPT_BOOL) {
result = (bool)*input ? 1 : 0;
} else if (t == SCRIPT_COLOR) {
AColor c = (AColor)*input;
result = (c.Red() + c.Blue() + c.Green()) / 3;
} else {
result = (int)*input;
}
SCRIPT_RETURN(result);
}
SCRIPT_FUNCTION(to_real) {
SCRIPT_PARAM_C(double, input);
SCRIPT_RETURN(input);
}
SCRIPT_FUNCTION(to_boolean) {
ScriptValueP input = ctx.getVariable(SCRIPT_VAR_input);
ScriptType t = input->type();
bool result;
if (t == SCRIPT_INT) {
result = (int)*input != 0;
} else {
result = (bool)*input;
}
SCRIPT_RETURN(result);
}
SCRIPT_FUNCTION(to_color) {
SCRIPT_PARAM_C(AColor, input);
SCRIPT_RETURN(input);
}
// ----------------------------------------------------------------------------- : String stuff // ----------------------------------------------------------------------------- : String stuff
// convert a string to upper case // convert a string to upper case
@@ -95,20 +164,7 @@ SCRIPT_FUNCTION(contains) {
SCRIPT_FUNCTION(format) { SCRIPT_FUNCTION(format) {
SCRIPT_PARAM_C(String, format); SCRIPT_PARAM_C(String, format);
String fmt = _("%") + replace_all(format, _("%"), _("")); SCRIPT_RETURN(format_input(format,ctx));
// determine type expected by format string
if (format.find_first_of(_("DdIiOoXx")) != String::npos) {
SCRIPT_PARAM_C(int, input);
SCRIPT_RETURN(String::Format(fmt, input));
} else if (format.find_first_of(_("EeFfGg")) != String::npos) {
SCRIPT_PARAM_C(double, input);
SCRIPT_RETURN(String::Format(fmt, input));
} else if (format.find_first_of(_("Ss")) != String::npos) {
SCRIPT_PARAM_C(String, input);
SCRIPT_RETURN(format_string(fmt, input));
} else {
throw ScriptError(_ERROR_1_("unsupported format", format));
}
} }
SCRIPT_FUNCTION(curly_quotes) { SCRIPT_FUNCTION(curly_quotes) {
@@ -394,6 +450,12 @@ SCRIPT_FUNCTION(rule) {
void init_script_basic_functions(Context& ctx) { void init_script_basic_functions(Context& ctx) {
// debugging // debugging
ctx.setVariable(_("trace"), script_trace); ctx.setVariable(_("trace"), script_trace);
// conversion
ctx.setVariable(_("to string"), script_to_string);
ctx.setVariable(_("to int"), script_to_int);
ctx.setVariable(_("to real"), script_to_real);
ctx.setVariable(_("to boolean"), script_to_boolean);
ctx.setVariable(_("to color"), script_to_color);
// string // string
ctx.setVariable(_("to upper"), script_to_upper); ctx.setVariable(_("to upper"), script_to_upper);
ctx.setVariable(_("to lower"), script_to_lower); ctx.setVariable(_("to lower"), script_to_lower);
+1
View File
@@ -419,4 +419,5 @@ void init_script_export_functions(Context& ctx) {
ctx.setVariable(_("copy file"), script_copy_file); ctx.setVariable(_("copy file"), script_copy_file);
ctx.setVariable(_("write text file"), script_write_text_file); ctx.setVariable(_("write text file"), script_write_text_file);
ctx.setVariable(_("write image file"), script_write_image_file); ctx.setVariable(_("write image file"), script_write_image_file);
//ctx.setVariable(_("write set file"), script_write_set_file);//TODO
} }
+6
View File
@@ -29,6 +29,11 @@ template <> inline GeneratedImageP from_script<GeneratedImageP>(const ScriptValu
return image_from_script(value); return image_from_script(value);
} }
SCRIPT_FUNCTION(to_image) {
SCRIPT_PARAM_C(GeneratedImageP, input);
return input;
}
// ----------------------------------------------------------------------------- : Image functions // ----------------------------------------------------------------------------- : Image functions
SCRIPT_FUNCTION(linear_blend) { SCRIPT_FUNCTION(linear_blend) {
@@ -181,6 +186,7 @@ SCRIPT_FUNCTION(built_in_image) {
// ----------------------------------------------------------------------------- : Init // ----------------------------------------------------------------------------- : Init
void init_script_image_functions(Context& ctx) { void init_script_image_functions(Context& ctx) {
ctx.setVariable(_("to image"), script_to_image);
ctx.setVariable(_("linear blend"), script_linear_blend); ctx.setVariable(_("linear blend"), script_linear_blend);
ctx.setVariable(_("masked blend"), script_masked_blend); ctx.setVariable(_("masked blend"), script_masked_blend);
ctx.setVariable(_("combine blend"), script_combine_blend); ctx.setVariable(_("combine blend"), script_combine_blend);
+1 -1
View File
@@ -23,7 +23,7 @@ DECLARE_TYPEOF_COLLECTION(ScriptParseError);
void store(const ScriptValueP& val, String& var) { var = val->toString(); } void store(const ScriptValueP& val, String& var) { var = val->toString(); }
void store(const ScriptValueP& val, int& var) { var = *val; } void store(const ScriptValueP& val, int& var) { var = *val; }
void store(const ScriptValueP& val, double& var) { var = *val; } void store(const ScriptValueP& val, double& var) { var = *val; }
void store(const ScriptValueP& val, bool& var) { var = static_cast<int>(*val); } void store(const ScriptValueP& val, bool& var) { var = *val; }
void store(const ScriptValueP& val, Color& var) { var = (AColor)*val; } void store(const ScriptValueP& val, Color& var) { var = (AColor)*val; }
void store(const ScriptValueP& val, AColor& var) { var = *val; } void store(const ScriptValueP& val, AColor& var) { var = *val; }
void store(const ScriptValueP& val, Defaultable<String>& var) { var.assign(*val); } void store(const ScriptValueP& val, Defaultable<String>& var) { var.assign(*val); }
+2
View File
@@ -60,6 +60,7 @@ class ScriptDelayedError : public ScriptValue {
virtual operator String() const; virtual operator String() const;
virtual operator double() const; virtual operator double() const;
virtual operator int() const; virtual operator int() const;
virtual operator bool() const;
virtual operator AColor() const; virtual operator AColor() const;
virtual int itemCount() const; virtual int itemCount() const;
virtual CompareWhat compareAs(String&, void const*&) const; virtual CompareWhat compareAs(String&, void const*&) const;
@@ -243,6 +244,7 @@ class ScriptObject : public ScriptValue {
virtual operator String() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator String(); } virtual operator String() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator String(); }
virtual operator double() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator double(); } virtual operator double() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator double(); }
virtual operator int() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator int(); } virtual operator int() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator int(); }
virtual operator bool() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator bool(); }
virtual operator AColor() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator AColor(); } virtual operator AColor() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator AColor(); }
virtual ScriptValueP getMember(const String& name) const { virtual ScriptValueP getMember(const String& name) const {
GetMember gm(name); GetMember gm(name);
+16 -5
View File
@@ -20,6 +20,7 @@ DECLARE_TYPEOF_COLLECTION(pair<Variable COMMA ScriptValueP>);
ScriptValue::operator String() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("string" ))); } ScriptValue::operator String() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("string" ))); }
ScriptValue::operator int() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("integer" ))); } ScriptValue::operator int() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("integer" ))); }
ScriptValue::operator bool() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("boolean" ))); }
ScriptValue::operator double() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("double" ))); } ScriptValue::operator double() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("double" ))); }
ScriptValue::operator AColor() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("color" ))); } ScriptValue::operator AColor() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("color" ))); }
ScriptValueP ScriptValue::eval(Context&) const { return delayError(_ERROR_2_("can't convert", typeName(), _TYPE_("function"))); } ScriptValueP ScriptValue::eval(Context&) const { return delayError(_ERROR_2_("can't convert", typeName(), _TYPE_("function"))); }
@@ -43,6 +44,8 @@ bool equal(const ScriptValueP& a, const ScriptValueP& b) {
ScriptType at = a->type(), bt = b->type(); ScriptType at = a->type(), bt = b->type();
if (at == bt && at == SCRIPT_INT) { if (at == bt && at == SCRIPT_INT) {
return (int)*a == (int)*b; return (int)*a == (int)*b;
} else if (at == bt && at == SCRIPT_BOOL) {
return (bool)*a == (bool)*b;
} else if ((at == SCRIPT_INT || at == SCRIPT_DOUBLE) && } else if ((at == SCRIPT_INT || at == SCRIPT_DOUBLE) &&
(bt == SCRIPT_INT || bt == SCRIPT_DOUBLE)) { (bt == SCRIPT_INT || bt == SCRIPT_DOUBLE)) {
return (double)*a == (double)*b; return (double)*a == (double)*b;
@@ -81,6 +84,7 @@ String ScriptDelayedError::typeName() const { throw error; }
ScriptDelayedError::operator String() const { throw error; } ScriptDelayedError::operator String() const { throw error; }
ScriptDelayedError::operator double() const { throw error; } ScriptDelayedError::operator double() const { throw error; }
ScriptDelayedError::operator int() const { throw error; } ScriptDelayedError::operator int() const { throw error; }
ScriptDelayedError::operator bool() const { throw error; }
ScriptDelayedError::operator AColor() const { throw error; } ScriptDelayedError::operator AColor() const { throw error; }
int ScriptDelayedError::itemCount() const { throw error; } int ScriptDelayedError::itemCount() const { throw error; }
CompareWhat ScriptDelayedError::compareAs(String&, void const*&) const { throw error; } CompareWhat ScriptDelayedError::compareAs(String&, void const*&) const { throw error; }
@@ -171,10 +175,11 @@ ScriptValueP to_script(int v) {
class ScriptBool : public ScriptValue { class ScriptBool : public ScriptValue {
public: public:
ScriptBool(bool v) : value(v) {} ScriptBool(bool v) : value(v) {}
virtual ScriptType type() const { return SCRIPT_INT; } virtual ScriptType type() const { return SCRIPT_BOOL; }
virtual String typeName() const { return _TYPE_("boolean"); } virtual String typeName() const { return _TYPE_("boolean"); }
virtual operator String() const { return value ? _("true") : _("false"); } virtual operator String() const { return value ? _("true") : _("false"); }
virtual operator int() const { return value; } // bools don't autoconvert to int
virtual operator bool() const { return value; }
private: private:
bool value; bool value;
}; };
@@ -227,12 +232,17 @@ class ScriptString : public ScriptValue {
long l; long l;
if (value.ToLong(&l)) { if (value.ToLong(&l)) {
return l; return l;
} else if (value == _("yes") || value == _("true")) { } else {
throw ScriptError(_ERROR_3_("can't convert value", value, typeName(), _TYPE_("integer")));
}
}
virtual operator bool() const {
if (value == _("yes") || value == _("true")) {
return true; return true;
} else if (value == _("no") || value == _("false") || value.empty()) { } else if (value == _("no") || value == _("false") || value.empty()) {
return false; return false;
} else { } else {
throw ScriptError(_ERROR_3_("can't convert value", value, typeName(), _TYPE_("integer"))); throw ScriptError(_ERROR_3_("can't convert value", value, typeName(), _TYPE_("boolean")));
} }
} }
virtual operator AColor() const { virtual operator AColor() const {
@@ -270,7 +280,7 @@ class ScriptAColor : public ScriptValue {
virtual ScriptType type() const { return SCRIPT_COLOR; } virtual ScriptType type() const { return SCRIPT_COLOR; }
virtual String typeName() const { return _TYPE_("color"); } virtual String typeName() const { return _TYPE_("color"); }
virtual operator AColor() const { return value; } virtual operator AColor() const { return value; }
virtual operator int() const { return (value.Red() + value.Blue() + value.Green()) / 3; } // colors don't auto convert to int, use to_int to force
virtual operator String() const { virtual operator String() const {
return format_acolor(value); return format_acolor(value);
} }
@@ -296,6 +306,7 @@ class ScriptNil : public ScriptValue {
virtual operator String() const { return wxEmptyString; } virtual operator String() const { return wxEmptyString; }
virtual operator double() const { return 0.0; } virtual operator double() const { return 0.0; }
virtual operator int() const { return 0; } virtual operator int() const { return 0; }
virtual operator bool() const { return false; }
virtual ScriptValueP eval(Context&) const { return script_nil; } // nil() == nil virtual ScriptValueP eval(Context&) const { return script_nil; } // nil() == nil
}; };
+2 -1
View File
@@ -22,6 +22,7 @@ DECLARE_POINTER_TYPE(ScriptValue);
enum ScriptType enum ScriptType
{ SCRIPT_NIL { SCRIPT_NIL
, SCRIPT_INT , SCRIPT_INT
, SCRIPT_BOOL
, SCRIPT_DOUBLE , SCRIPT_DOUBLE
, SCRIPT_STRING , SCRIPT_STRING
, SCRIPT_COLOR , SCRIPT_COLOR
@@ -62,7 +63,7 @@ class ScriptValue : public IntrusivePtrBaseWithDelete {
/// Convert this value to an integer /// Convert this value to an integer
virtual operator int() const; virtual operator int() const;
/// Convert this value to a boolean /// Convert this value to a boolean
inline operator bool() const { return (int)*this; } virtual operator bool() const;
/// Convert this value to a color /// Convert this value to a color
virtual operator AColor() const; virtual operator AColor() const;
@@ -161,6 +161,12 @@ function autoformat__handle(&$i, $prefix, $first, $fail_same = false) {
} elseif (preg_match("@^//@", $line)) { } elseif (preg_match("@^//@", $line)) {
// ignore // ignore
// version information block
} elseif (preg_match("@^DOC_MSE_VERSION:@", $line)) {
$line = preg_replace("@^[A-Z_]+:\s*@",'',$line);
$text .= "<div class=\"version-note\">" . $line . "</div>\n";
$state = '';
// Just text // Just text
} else if ($fail_same && $autoformat__lines[$i-1]{$len-1} != ' ' && $text != '') { } else if ($fail_same && $autoformat__lines[$i-1]{$len-1} != ' ' && $text != '') {
// consecutive * and # lines are different items // consecutive * and # lines are different items
@@ -4,6 +4,12 @@
global $built_in_functions; global $built_in_functions;
$built_in_functions = array( $built_in_functions = array(
// conversion
'to_string' =>'',
'to_int' =>'',
'to_real' =>'',
'to_boolean' =>'',
'to_color' =>'',
// text // text
'to_upper' =>'', 'to_upper' =>'',
'to_lower' =>'', 'to_lower' =>'',