diff --git a/LANGUAGE.md b/LANGUAGE.md index b342ded..f28d1ee 100644 --- a/LANGUAGE.md +++ b/LANGUAGE.md @@ -100,7 +100,7 @@ If an unescaped `~`, `~?` or `#` appears in the line, the associated operator is not tagged ``` -* regular text, i.e. any line that doesn't start with a special line type caracter: write some text into the [event buffer](#event-buffer). Support [text interpolation](#text-interpolation). Support [escape codes](#escape-codes). Don't accept children lines. +* regular text, i.e. any line that doesn't start with a special line type character: write some text into the [event buffer](#event-buffer). Support [text interpolation](#text-interpolation). Support [escape codes](#escape-codes). Don't accept children lines. ``` Hello, @@ -522,14 +522,14 @@ Text By default, some processing is done on the event buffer before sending it to your game. You can disable these by disabling the associated features flages using `vm:disable` (see #api-reference). -* strip trailing spaces: will remove any space caracters at the end of the text (for text event), or at the end of each choice (for choice event). +* strip trailing spaces: will remove any space characters at the end of the text (for text event), or at the end of each choice (for choice event). ``` (There is a space between the text and the tag expression that would be included in the text event otherwise.) Some text # tag ``` -* strip duplicate spaces: will remove any duplicated space caracters between each element that constitute the text (for text event), or for each choice (for choice event). +* strip duplicate spaces: will remove any duplicated space characters between each element that constitute the text (for text event), or for each choice (for choice event). ``` (There is a space between the text and the tag expression; but there is a space as well after the text interpolation in the last line. The two spaces are converted into a single space (the space will belong to the first text element, i.e. the "text " element).) @@ -543,7 +543,7 @@ TODO: check if spacing rules are language-specific and move this to language fil ### Identifiers -Valid identifiers must be at least 1 caracters long and can contain anything except the caracters ``~`^+-=<>/[]*{}|\_!?,;:()"@&$#%`` (that is, every special caracter on a US keyboard except '). They can contain spaces. They can not start with a number. +Valid identifiers must be at least 1 characters long and can contain anything except the characters ``~`^+-=<>/[]*{}|\_!?,;:()"@&$#%`` (that is, every special character on a US keyboard except '). They can contain spaces. They can not start with a number. When defining an identifier (using a function, checkpoint or variable delcaration line), it will be defined into the current namespace (defined by the parent function/checkpoint). When evaluating an expression, Anselme will look for variables into the current line's namespace, then go up a level if it isn't found, and so on. Note that the namespace of functions with arguments are not accessible from outside the function. @@ -665,23 +665,15 @@ How conservions are handled from Lua to Anselme: #### Escape codes -These can be used to represent some caracters in string and other text elements that would otherwise be difficult to express due to conflicts with Anselme syntax. +These can be used to represent some character in string and other text elements that would otherwise be difficult to express due to conflicts with Anselme syntax; for example to avoid a character at the start of a text line to be interpreted as another line type. -* `\\` for `\` -* `\"` for `"` * `\n` for a newline * `\t` for a tabulation -* `\{` and `\}` for `{` and `}` -* `\[` and `\]` for `[` and `]` -* `\~` for `~` -* `\#` for `#` -* `\$` for `$` -* `\(` for `(` -* `\>` for `>` -* `\%` for `%` -* `\§` for `§` -* `\@` for `@` -* `\:` for `:` +* `\\` for `\` +* `\"` for `"` to escape string delimiters +* `\{` and `\}` for `{` and `}` to escape text interpolation +* `\[` and `\]` for `[` and `]` to escape subtexts +* and, in general, for any character X we can get it by prefixing it with an `\`: `\X` for `X` #### Truethness diff --git a/parser/common.lua b/parser/common.lua index ca5a252..1311e30 100644 --- a/parser/common.lua +++ b/parser/common.lua @@ -53,31 +53,12 @@ common = { "{}" }, -- escapement code and their value in strings + -- only includes the "special" escape codes, as the generic \. -> . is handled by default in parse_text -- I don't think there's a point in supporting form feed, carriage return, and other printer and terminal related codes string_escapes = { - -- usual escape codes ["\\\\"] = "\\", - ["\\\""] = "\"", ["\\n"] = "\n", ["\\t"] = "\t", - -- string interpolation - ["\\{"] = "{", - ["\\}"] = "}", - -- subtext - ["\\["] = "[", - ["\\]"] = "]", - -- end of text line expressions - ["\\~"] = "~", - ["\\#"] = "#", - -- decorators - ["\\$"] = "$", - -- line types - ["\\("] = "(", - ["\\>"] = ">", - ["\\%"] = "%", - ["\\§"] = "§", - ["\\@"] = "@", - ["\\:"] = ":", }, -- list of possible injections and their associated name in vm.state.inject injections = { @@ -192,7 +173,9 @@ common = { r = r2 end -- replace escape codes - local escaped = t:gsub("\\.", common.string_escapes) + local escaped = t:gsub("\\.", function(escape) + return common.string_escapes[escape] or escape:match("^\\(.)$") + end) table.insert(l, escaped) end -- expr diff --git a/test/tests/string escaping.ans b/test/tests/string escaping.ans index d515e07..20179e1 100644 --- a/test/tests/string escaping.ans +++ b/test/tests/string escaping.ans @@ -5,3 +5,5 @@ quote {"\""} other codes {"\n"} {"\\"} {"\t"} \{braces} {"escaping expressions {"a"+"bc"} and \{stuff} \\ and quotes \""} + +generic symbol {"\£"} diff --git a/test/tests/string escaping.lua b/test/tests/string escaping.lua index 46bd988..83c8aec 100644 --- a/test/tests/string escaping.lua +++ b/test/tests/string escaping.lua @@ -1,70 +1,91 @@ local _={} -_[25]={} -_[24]={} -_[23]={} -_[22]={} -_[21]={text="escaping expressions abc and {stuff} \\ and quotes \"",tags=_[25]} -_[20]={text=" {braces}",tags=_[24]} -_[19]={text="\9",tags=_[24]} -_[18]={text=" ",tags=_[24]} -_[17]={text="\\",tags=_[24]} -_[16]={text=" ",tags=_[24]} -_[15]={text="\n",tags=_[24]} -_[14]={text="other codes ",tags=_[24]} -_[13]={text="\"",tags=_[23]} -_[12]={text="quote ",tags=_[23]} -_[11]={text="a",tags=_[22]} -_[10]={text="expression ",tags=_[22]} -_[9]={_[21]} -_[8]={_[14],_[15],_[16],_[17],_[18],_[19],_[20]} +_[39]={} +_[38]={} +_[37]={} +_[36]={} +_[35]={} +_[34]={} +_[33]={} +_[32]={} +_[31]={} +_[30]={} +_[29]={} +_[28]={} +_[27]={} +_[26]={} +_[25]={tags=_[39],text="\194\163"} +_[24]={tags=_[38],text="generic symbol "} +_[23]={tags=_[37],text="escaping expressions abc and {stuff} \\ and quotes \""} +_[22]={tags=_[36],text=" {braces}"} +_[21]={tags=_[35],text="\9"} +_[20]={tags=_[34],text=" "} +_[19]={tags=_[33],text="\\"} +_[18]={tags=_[32],text=" "} +_[17]={tags=_[31],text="\n"} +_[16]={tags=_[30],text="other codes "} +_[15]={tags=_[29],text="\""} +_[14]={tags=_[28],text="quote "} +_[13]={tags=_[27],text="a"} +_[12]={tags=_[26],text="expression "} +_[11]={_[24],_[25]} +_[10]={_[23]} +_[9]={_[16],_[17],_[18],_[19],_[20],_[21],_[22]} +_[8]={_[14],_[15]} _[7]={_[12],_[13]} -_[6]={_[10],_[11]} -_[5]={"return"} -_[4]={"text",_[9]} -_[3]={"text",_[8]} -_[2]={"text",_[7]} -_[1]={"text",_[6]} -return {_[1],_[2],_[3],_[4],_[5]} +_[6]={"return"} +_[5]={"text",_[11]} +_[4]={"text",_[10]} +_[3]={"text",_[9]} +_[2]={"text",_[8]} +_[1]={"text",_[7]} +return {_[1],_[2],_[3],_[4],_[5],_[6]} --[[ { "text", { { - tags = <1>{}, + tags = {}, text = "expression " }, { - tags =