3 Angajamente 3274acdc2b ... 9507404d01

Autor SHA1 Permisiunea de a trimite mesaje. Dacă este dezactivată, utilizatorul nu va putea trimite nici un fel de mesaj Data
  dzp 9507404d01 feat(pkuxkx): 使用服务器表格通用解析工具来修复 walk -c,本次新增了 room 和 steps 属性 1 lună în urmă
  dzp c380dc042c feat(xtintin): 增加一个通用的解析服务器表格的工具 re.ParseServerTable 1 lună în urmă
  dzp 10bcf31c55 feat(xtintin): 增加三个新 API: str.SimpleColor/color.Trim/color.Clean 1 lună în urmă
3 a modificat fișierele cu 286 adăugiri și 79 ștergeri
  1. 43 54
      mud/pkuxkx/plugins/basic/map/node.tin
  2. 133 25
      plugins/lib/xtintin/raw.tin
  3. 110 0
      plugins/lib/xtintin/regex.tin

+ 43 - 54
mud/pkuxkx/plugins/basic/map/node.tin

@@ -3,7 +3,7 @@
 /*
 本文件属于 PaoTin++ 的一部分
 ===========
-PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+PaoTin++ © 2020~2026 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
 ===========
 */
@@ -11,20 +11,21 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 event.Define {map/GotNodeInfo}  {无参} {$MODULE} {已经获取到节点信息,并更新到 gMapRoom 全局变量。};
 
 /*
-╭───扬州─────────┬─────────────╮
-│目的地                      │拼音名称                  │
-│丐帮分舵  ◇ 土地庙         │gaibang                   │
-│濠州府  ◇ 广场             │haozhou                   │
-│长江[建康府]  ◇ 长江渡口   │jiankang                  │
-│往生堂  ◇ 往生堂广场       │shashou                   │
-│信阳  ◇ 小广场             │xinyang                   │
-│徐州  ◇ 戏马台             │xuzhou                    │
-│长江[镇江]  ◇ 扬子津       │zhenjiang                 │
-├──────────────┴─────────────┤
-│walk [拼音名]命令使用内建路径。                         │
-│walk -c [拼音名]返回具体地点的路径。                    │
-│node 命令列出玩家自建路径。                             │
-╰───────────────────北大侠客行────╯
+╭───扬州──────────────┬────────────┬─────╮
+│目的地                                │拼音名称                │步数      │
+│丐帮分舵  ◇ 土地庙                   │gaibang                 │13        │
+│濠州府  ◇ 广场                       │haozhou                 │11        │
+│建康府  ◇ 长江渡口                   │jiankang                │12        │
+│庐州  ◇ 石板桥                       │luzhou                  │11        │
+│往生堂  ◇ 往生堂广场                 │shashou                 │14        │
+│信阳  ◇ 小广场                       │xinyang                 │10        │
+│徐州  ◇ 戏马台                       │xuzhou                  │14        │
+│镇江  ◇ 扬子津                       │zhenjiang               │8         │
+├───────────────────┴────────────┴─────┤
+│walk [拼音名]命令使用内建路径。                                             │
+│walk -c [拼音名]返回具体地点的路径。                                        │
+│node 命令列出玩家自建路径。                                                 │
+╰─────────────────────────────北大侠客行────╯
 */
 
 ///=== {
@@ -69,45 +70,35 @@ event.Define {map/GotNodeInfo}  {无参} {$MODULE} {已经获取到节点信息
         };
     };
 
-    #action {{*UTF8}{^}╭─{(─)*}─{\p{Han}+}─{(─|┬)*}─╮$E} {
-        #var gMapRoom[node]         {%%4};
+    re.ParseServerTable map.GetNodeInfo.parse;
+    #alias {map.GetNodeInfo.parse} {
+        #var gMapRoom[node]         {$gServerTable[name]};
         #var gMapRoom[nodeLinks]    {};
 
-        #class map.GetNodeInfo open;
-
-        #local {E} {{?:|id=map/getnode}$};
-
-        #action {^│目的地%s│拼音名称%s│$E} {
-            #if { "%1" == "gag" } {#line gag};
-        } {4.999};
-
-        #action {^├──{(─)*}──┼──{(─)*}──┤$E} {
-            #class map.GetNodeInfo.miss open;
-            #action {^%*{|ID=map/getnode}$} {errLog 发现 BUG,$gMapRoom[node]($gMapRoom[name])下面这行内容无法识别,请报告开发者。} {5.1};
-            #class map.GetNodeInfo.miss close;
-        };
-
-        #action {^├──{(─)*}──┴──{(─)*}──┤$E} {
-            #class map.GetNodeInfo.miss kill;
-        };
-
-        #nop 旧版目标样式,无菱形,不分红绿。;
-        #action {~^%c│%+2c%S%C│%+1c%S%C│%c$E} {
-            map.room.node-link {%%%3} {@str.Plain{%%%6}} {} {@str.Color{%%%6}};
-        };
-
-        #nop 新版目标样式,有菱形,分红绿,拼音在张金鳌任务下会变色。;
-        #action {~^%c│%+2c%S%+1c %+1c ◇ %+1c%S%C│%+1c%S%C│%c$E} {
-            map.room.node-link {%%%3} {@str.Plain{%%%10}} {@str.Color{%%%5}} {@str.Color{%%%10}};
-        };
-
-        #alias {map.room.node-link} {
-            #local name         {%%%1};
-            #local pinyin       {%%%2};
-            #local markColor    {%%%3};
-            #local pinyinColor  {%%%4};
-
-            #var {gMapRoom[nodeLinks][$pinyin]} {{name}{$name}};
+        #local idx {};
+        #foreach {*gServerTable[body][]} {idx} {
+            #local body {$gServerTable[body][$idx]};
+            #local colorBody {$gServerTable[colorBody][$idx]};
+
+            #var dest {@str.Replace{{$colorBody[目的地]};{%S%!c %c ◇ %*};{
+                {dest}      {&1}
+                {markColor} {&2}
+                {colorRoom} {&3}
+                {room}      {&3}
+            }}};
+
+            #local name         {@str.Plain{$dest[dest]}};
+            #local room         {@str.Plain{$dest[room]}};
+            #local pinyin       {$body[拼音名称]};
+            #local markColor    {@str.Color{$dest[markColor]}};
+            #local pinyinColor  {@str.Color{$colorBody[拼音]}};
+            #local steps        {$body[步数]};
+
+            #var {gMapRoom[nodeLinks][$pinyin]} {
+                {name}  {$name}
+                {room}  {$room}
+                {steps} {$steps}
+            };
 
             #if { "$markColor" != "" } {
                 #var {gMapRoom[nodeLinks][$pinyin][markColor]} {$markColor};
@@ -117,8 +108,6 @@ event.Define {map/GotNodeInfo}  {无参} {$MODULE} {已经获取到节点信息
                 #var {gMapRoom[nodeLinks][$pinyin][pinyinColor]} {$pinyinColor};
             };
         };
-
-        #class map.GetNodeInfo close;
     };
 
     #action {^%*内的系统内建路径出发点在:%*,请查询localmaps获得具体方位。$E} {

+ 133 - 25
plugins/lib/xtintin/raw.tin

@@ -2,7 +2,7 @@
 
 /*
 本文件属于 PaoTin++ 的一部分。
-PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+PaoTin++ © 2020~2026 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
 */
 
@@ -16,12 +16,25 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 //
 // #@ str.Color <字符串>
 //    仅保留字符串中的颜色代码,去掉其余成分,方便比较颜色。
+//    本函数与 str.SimpleColor 的区别在于,本函数不会简化颜色。
+//
+// #@ str.SimpleColor <字符串>
+//    仅保留字符串中的颜色代码,去掉其余成分,方便比较颜色。
+//    本函数与 str.Color 的区别在于,本函数会简化颜色。
+//    所谓简化是指对颜色代码串进行了 color.Trim 和 color.Clean 操作。
+//
+// #@ color.Trim <颜色代码串>
+//    去掉颜色代码串两头的复位代码。
+//
+// #@ color.Clean <颜色代码串>
+//    压缩颜色代码串,只保留经过运算后的效果。
+//    NOTE: 注意某些情况下你可能需要先进行 color.Trim 操作。
 // };
 
 #func {str.Plain}   {#format result {%P} {%0}};
 
 #func {str.Color} {
-    #local str      {};
+    #local color    {};
     #local state    {START};
     #local ch       {};
 
@@ -31,15 +44,69 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
             #case {"START/%*"}  {#0};
             #case {"ESCAPE/["}  {#local state {INNER}};
             #case {"ESCAPE/%*"} {#local state {OUTER}};
-            #case {"INNER/m"}   {#cat str {;}; #local state {OUTER}};
-            #case {"INNER/%*"}  {#cat str {$ch}};
+            #case {"INNER/m"}   {#cat color {;}; #local state {OUTER}};
+            #case {"INNER/%*"}  {#cat color {$ch}};
             #case {"OUTER/\e"}  {#local state {ESCAPE}};
         };
     };
 
-    #replace {str} {;$} {};
+    #replace {color} {;$} {};
+
+    #return {$color};
+};
+
+#func {str.SimpleColor} {
+    #local color {@str.Color{%0}};
+    #local color {@color.Trim{$color}};
+    #local color {@color.Clean{$color}};
+    #return {$color};
+};
+
+#func {color.Trim} {
+    #local color {%0};
+    #replace color {^{(2;37;0(;|))+}} {};
+    #replace color {^{(0(;|))+}} {};
+    #replace color {{((;|)2;37;0)+}$} {};
+    #replace color {{(0(;|))+}$} {};
+
+    #return {$color};
+};
+
+#func {color.Clean} {
+    #local color {%0};
+
+    #local str {};
+    #line sub escapes #format str {%s} {@raw.ParseFragments{{\e[${color}m}}};
+    #if { &str[color][] == 0 } {
+        #return {};
+    };
+
+    #local color {$str[color]};
+    #local attr {};
+    #local output {};
+
+    #foreach {$color[attrs]} {attr} {
+        #switch {"$attr"} {
+            #case {"bold"}      {#cat output {;1}};
+            #case {"dim"}       {#cat output {;2}};
+            #case {"italic"}    {#cat output {;3}};
+            #case {"underline"} {#cat output {;4}};
+            #case {"blink"}     {#cat output {;5}};
+            #case {"reverse"}   {#cat output {;7}};
+            #case {"f16"}       {#cat output {;$color[fg]}};
+            #case {"b16"}       {#cat output {;$color[bg]}};
+            #case {"F16"}       {#cat output {;$color[fg]}};
+            #case {"B16"}       {#cat output {;$color[bg]}};
+            #case {"f256"}      {#cat output {;38;5;$color[fg]}};
+            #case {"b256"}      {#cat output {;48;5;$color[bg]}};
+            #case {"ftrue"}     {#cat output {;38;2;$color[fg]}};
+            #case {"btrue"}     {#cat output {;48;2;$color[bg]}};
+        };
+    };
+
+    #replace output {^;} {};
 
-    #return {$str};
+    #return {$output};
 };
 
 ///=== {
@@ -118,15 +185,20 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 //          - bg: 背景色,同上
 //          - attrs: 文本样式属性,是一个字符串集合(sset),包含以下可能的值:
 //              - bold
+//              - dim
 //              - italic
 //              - underline
 //              - blink
 //              - reverse
-//              - dim
+//              - f16       表示前景色是 16 色系统
+//              - b16       表示背景色是 16 色系统
+//              - F16       表示前景色是 AIXterm 16 色系统
+//              - B16       表示背景色是 AIXterm 16 色系统
 //              - f256      表示前景色是 256 色系统
 //              - b256      表示背景色是 256 色系统
 //              - ftrue     表示前景色是真彩色
 //              - btrue     表示背景色是真彩色
+//            注意以上属性承诺按照以上顺序出现,但如果未设置该属性则不出现。
 // };
 #func {raw.ParseFragments} {
     #local str      {%1};
@@ -146,7 +218,7 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 
             #if { "$str[text]" !== "" } {
                 #local fragment[text] {$str[text]};
-                #local fragment[color] {$color};
+                #local fragment[color] {@raw.ParseFragments.buildColor{$color}};
                 #list fragments add {{$fragment}};
                 #local fragment {};
             };
@@ -167,34 +239,36 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
         #list tokens delete 1;
 
         #switch {"$mode/$token"} {
-            #case {"SGR/0"}             {#local color[fg] {0}; #local color[bg] {0}; #local color[attrs] {}};
-            #case {"SGR/1"}             {#local color[attrs] {@sset.Add{{$color[attrs]};bold}}};
-            #case {"SGR/2"}             {#local color[attrs] {@sset.Add{{$color[attrs]};dim}}};
-            #case {"SGR/3"}             {#local color[attrs] {@sset.Add{{$color[attrs]};italic}}};
-            #case {"SGR/4"}             {#local color[attrs] {@sset.Add{{$color[attrs]};underline}}};
-            #case {"SGR/5"}             {#local color[attrs] {@sset.Add{{$color[attrs]};blink}}};
-            #case {"SGR/7"}             {#local color[attrs] {@sset.Add{{$color[attrs]};reverse}}};
-            #case {"SGR/3{[0-7]}"}      {#local color[fg] {$token}};
-            #case {"SGR/4{[0-7]}"}      {#local color[bg] {$token}};
-            #case {"SGR/9{[0-7]}"}      {#local color[fg] {$token}};
-            #case {"SGR/10{[0-7]}"}     {#local color[bg] {$token}};
+            #case {"SGR/0"}             {#local color[fg] {}; #local color[bg] {}; #local color[attrs] {}};
+            #case {"SGR/1"}             {#local color[attrs][bold]      {1}};
+            #case {"SGR/2"}             {#local color[attrs][dim]       {1}};
+            #case {"SGR/3"}             {#local color[attrs][italic]    {1}};
+            #case {"SGR/4"}             {#local color[attrs][underline] {1}};
+            #case {"SGR/5"}             {#local color[attrs][blink]     {1}};
+            #case {"SGR/7"}             {#local color[attrs][reverse]   {1}};
+            #case {"SGR/3{[0-7]}"}      {#local color[fg] {$token}; #local color[attrs][fcolors] {8}};
+            #case {"SGR/4{[0-7]}"}      {#local color[bg] {$token}; #local color[attrs][bcolors] {8}};
+            #case {"SGR/9{[0-7]}"}      {#local color[fg] {$token}; #local color[attrs][fcolors] {16}};
+            #case {"SGR/10{[0-7]}"}     {#local color[bg] {$token}; #local color[attrs][bcolors] {16}};
             #case {"SGR/38"}            {#local mode {SGR38}};
-            #case {"SGR38/2"}           {#local mode {SGR382}};
-            #case {"SGR382/%+1..d"}     {#local mode {SGR}; #local color[fg] {$token}; #local color[attrs] {@sset.Add{{$color[attrs]};f256}}};
-            #case {"SGR38/5"}           {#local mode {SGR385}; #local color[fg] {}; #local color[attrs] {@sset.Add{{$color[attrs]};ftrue}}};
+            #case {"SGR38/2"}           {#local mode {SGR382}; #local color[fg] {}; #local color[attrs][fcolors] {256}};
+            #case {"SGR382/%+1..d"}     {#local mode {SGR}; #local color[fg] {$token}};
+            #case {"SGR38/5"}           {#local mode {SGR385}; #local color[fg] {}; #local color[attrs][fcolors] {true}};
             #case {"SGR385/%+1..d"}     {#local mode {SGR3851}; #local color[fg] {@slist.Append{{$color[fg]};$token}}};
             #case {"SGR3851/%+1..d"}    {#local mode {SGR3852}; #local color[fg] {@slist.Append{{$color[fg]};$token}}};
             #case {"SGR3852/%+1..d"}    {#local mode {SGR};     #local color[fg] {@slist.Append{{$color[fg]};$token}}};
             #case {"SGR/48"}            {#local mode {SGR48}};
-            #case {"SGR48/2"}           {#local mode {SGR482}};
-            #case {"SGR482/%+1..d"}     {#local mode {SGR}; #local color[bg] {$token}; #local color[attrs] {@sset.Add{{$color[attrs]};b256}}};
-            #case {"SGR48/5"}           {#local mode {SGR485}; #local color[bg] {}; #local color[attrs] {@sset.Add{{$color[attrs]};btrue}}};
+            #case {"SGR48/2"}           {#local mode {SGR482}; #local color[bg] {}; #local color[attrs][bcolors] {256}};
+            #case {"SGR482/%+1..d"}     {#local mode {SGR}; #local color[bg] {$token}};
+            #case {"SGR48/5"}           {#local mode {SGR485}; #local color[bg] {}; #local color[attrs][bcolors] {true}};
             #case {"SGR485/%+1..d"}     {#local mode {SGR4851}; #local color[bg] {@slist.Append{{$color[bg]};$token}}};
             #case {"SGR4851/%+1..d"}    {#local mode {SGR4852}; #local color[bg] {@slist.Append{{$color[bg]};$token}}};
             #case {"SGR4852/%+1..d"}    {#local mode {SGR};     #local color[bg] {@slist.Append{{$color[bg]};$token}}};
         };
     };
 
+    #local color {@raw.ParseFragments.buildColor{$color}};
+
     #if { "$str[text]" !== "" } {
         #local fragment[text] {$str[text]};
         #local fragment[color] {$color};
@@ -207,6 +281,40 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
     };
 };
 
+#func {raw.ParseFragments.buildColor} {
+    #local color {%0};
+
+    #local attrs {$color[attrs]};
+    #local attr {};
+    #local newAttrs {};
+    #foreach {bold;dim;italic;underline;blink;reverse} {attr} {
+        #if { $attrs[$attr] } {
+            #cat newAttrs {;$attr};
+        };
+    };
+
+    #nop 前景色只能有一个系统,以最后出现的为准。;
+    #switch {"$color[attrs][fcolors]/@slist.Size{$color[fg]}"} {
+        #case {"8/1"}       {#cat newAttrs {;f16}};
+        #case {"16/1"}      {#cat newAttrs {;F16}};
+        #case {"256/1"}     {#cat newAttrs {;f256}};
+        #case {"true/3"}    {#cat newAttrs {;ftrue}};
+    };
+
+    #nop 背景色只能有一个系统,以最后出现的为准。;
+    #switch {"$color[attrs][bcolors]/@slist.Size{$color[bg]}"} {
+        #case {"8/1"}       {#cat newAttrs {;b16}};
+        #case {"16/1"}      {#cat newAttrs {;B16}};
+        #case {"256/1"}     {#cat newAttrs {;b256}};
+        #case {"true/3"}    {#cat newAttrs {;btrue}};
+    };
+
+    #replace newAttrs {^;} {};
+    #local color[attrs] {$newAttrs};
+
+    #return {$color};
+};
+
 #alias {raw.ParseFragments.nextToken} {
     #if { "$str" === "" } {
         #return;

+ 110 - 0
plugins/lib/xtintin/regex.tin

@@ -36,3 +36,113 @@ PaoTin++ © 2020~2026 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
     #line quiet #info classes save;
     #return {$info[CLASSES][1][arg1]};
 };
+
+VAR {服务器渲染的表格数据}  gServerTable   {};
+
+///=== {
+// ## re.ParseServerTable [<回调代码>]
+//    通用的解析服务器表格的工具。
+//    如果提供了回调代码,那么当表格解析完成后,会调用它。
+//    本工具有两个变体,分别是 re.ParseServerTable/gag 和 re.ParseServerTable/nogag
+//    如果不使用变体后缀修饰,那么默认为 nogag 模式。
+// };
+#alias {re.ParseServerTable}        {re.ParseServerTable.do {nogag} {%21}};
+#alias {re.ParseServerTable/gag}    {re.ParseServerTable.do {gag}   {%21}};
+#alias {re.ParseServerTable/nogag}  {re.ParseServerTable.do {nogag} {%21}};
+
+#alias {re.ParseServerTable.do} {
+    #local gag      {%1};
+    #local callback {%2};
+
+    #var gServerTable {};
+    #var gServerTable.helper[gag]       {$gag};
+    #var gServerTable.helper[callback]  {$callback};
+
+    #line oneshot #action {~{*UTF8}{?:^}%!c╭─{?:(?:─|┬)+}%c{\p{Han}+}%c{?:(?:─|┬)+}─╮%c{|re/ParseServerTable}$} {
+        #var gServerTable[name]         {%%2};
+        #var gServerTable[nameColor]    {@color.Trim{@str.Color{%%1}}};
+        #if { "$gServerTable.helper[gag]" == "gag" } {
+            #line gag;
+        };
+        re.ParseServerTable.body;
+    };
+};
+
+#alias {re.ParseServerTable.body} {
+    #class re.ParseServerTable open;
+
+    #if { "$gServerTable.helper[gag]" == "gag" } {
+        #gag {^%*{|re/ParseServerTable/body}$};
+    };
+
+    #local color    {(?:\e\[[0-9;:]*m)*};
+    #local color2   {(?:\e\[[0-9;:]*m|\s+)*};
+    #line oneshot #action {~^{?:$color}│{($color\S+$color2│)+}%c{|re/ParseServerTable/header}$} {
+        #local header {%%1};
+        #list header explode {│};
+        #var gServerTable[header] {$header};
+        #local idx {};
+        #foreach {*gServerTable[header][]} {idx} {
+            #local header {$gServerTable[header][$idx]};
+            #replace header {%*%C$} {&1};
+            #replace header {^{(\e\[(|0|2;37;0)m)+}} {};
+            #var gServerTable[header][$idx] {
+                {color} {@color.Trim{@str.Color{$header}}}
+                {text}  {@str.Plain{$header}}
+            };
+        };
+    } {4.9};
+
+    #action {~^{?:$color}│%*%s%c│%c{|re/ParseServerTable/body}$} {
+        #if { "%%1" != "%*│%*" } {
+            #local note {%%1};
+            #cat gServerTable[note] {$note};
+            #return;
+        };
+
+        #local line {%%1};
+        #list line explode {│};
+        #local idx {};
+        #local body {};
+        #local colorBody {};
+        #foreach {*line[]} {idx} {
+            #local b {$line[$idx]};
+            #replace b {%*%C$} {&1};
+            #replace b {^{(\e\[(|0|2;37;0)m)+}} {};
+            #local field {$gServerTable[header][$idx][text]};
+            #local body[$field] {@str.Plain{$b}};
+            #local colorBody[$field] {$b};
+        };
+
+        #local body[group] {$gServerTable.helper[group]};
+        #local colorBody[group] {$gServerTable.helper[colorGroup]};
+
+        #list gServerTable[body] add {{$body}};
+        #list gServerTable[colorBody] add {{$colorBody}};
+    } {4.95};
+
+    #action {~{*UTF8}{?:^}%!c├─{?:(?:─|┼)*}%c{\p{Han}+}%c{?:(?:─|┼)+}──┤%c{|re/ParseServerTable/group}$} {
+        #var gServerTable.helper[colorGroup] {%%1%%2};
+        #var gServerTable.helper[group] {%%2};
+    };
+
+    #action {^├──{(─|┴)+}──┤$} {
+        #var gServerTable[note] {};
+    };
+
+    #action {{*UTF8}{?:^}╰─{?:(?:─|┴)+}{\p{Han}+}{?:(?:─|┴)+}─╯{|re/ParseServerTable/body}$} {
+        #class re.ParseServerTable kill;
+
+        #if { "$gServerTable.helper[gag]" == "gag" } {
+            #line gag;
+        };
+
+        #if { "$gServerTable.helper[callback]" !== "" } {
+            #line sub {escapes;var;func} #delay 0 {
+                $gServerTable.helper[callback];
+            };
+        };
+    };
+
+    #class re.ParseServerTable close;
+};