path.tin 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. #nop 本文件是 xtintin 的一部分,实现了一些方向和路径运算函数;
  8. ///=== {
  9. ///// 方向和路径运算函数:
  10. //
  11. // #@ dir.Name <方向全拼|方向缩写> [<严格模式>]
  12. // 给出指定方向的中文名称。方向可以通过英文单词或者英文单词的缩写给出。
  13. //
  14. // #@ dir.Short <方向全拼> [<严格模式>]
  15. // 给出方向对应的英文单词缩写。
  16. //
  17. // #@ dir.Long <方向缩写> [<严格模式>]
  18. // 给出方向对应的英文单词全拼。
  19. //
  20. // #@ dir.Reverse <方向> [<严格模式>]
  21. // 给出方向对应的相反方向。
  22. //
  23. ///// 以上函数中,凡是支持严格模式参数的,如果严格模式为 true,则给错误方向给出空字符串结果。
  24. // };
  25. #func {dir.Name} { #return @__dir_convert_dir__{name; %1; %2}; };
  26. #func {dir.Short} { #return @__dir_convert_dir__{short; %1; %2}; };
  27. #func {dir.Long} { #return @__dir_convert_dir__{long; %1; %2}; };
  28. #func {dir.Reverse} {
  29. #if { "%1" == "enter{| .*}" } {
  30. #return {out};
  31. };
  32. #else {
  33. #return @__dir_convert_dir__{reverse; %1; %2};
  34. };
  35. };
  36. ///=== {
  37. // #@ dir.IsDir <方向全拼|方向缩写>
  38. // 检查参数是否是一个合格的方向指令。
  39. // };
  40. #func {dir.IsDir} {
  41. #local cmd {%0};
  42. #if { "@dir.Name{$cmd}" == "" } {
  43. #return 0;
  44. };
  45. #else {
  46. #return 1;
  47. };
  48. };
  49. ///=== {
  50. // #@ path.Reverse <路径>
  51. // 给出路径对应的反向路径。
  52. // };
  53. #func {path.Reverse} {
  54. #local path {%0};
  55. #local newPath {};
  56. #local step {};
  57. #foreach {$path} {step} {
  58. #list newPath insert {1} {@dir.Reverse{$step}};
  59. };
  60. #return {@slist.FromList{$newPath}};
  61. };
  62. #var xtt.dir.table {
  63. {east} {{name}{正东} {short}{e} {long}{east} {reverse}{west} }
  64. {west} {{name}{正西} {short}{w} {long}{west} {reverse}{east} }
  65. {south} {{name}{正南} {short}{s} {long}{south} {reverse}{north} }
  66. {north} {{name}{正北} {short}{n} {long}{north} {reverse}{south} }
  67. {e} {{name}{正东} {short}{e} {long}{east} {reverse}{w} }
  68. {w} {{name}{正西} {short}{w} {long}{west} {reverse}{e} }
  69. {s} {{name}{正南} {short}{s} {long}{south} {reverse}{n} }
  70. {n} {{name}{正北} {short}{n} {long}{north} {reverse}{s} }
  71. {northeast} {{name}{东北} {short}{ne} {long}{northeast} {reverse}{southwest}}
  72. {southeast} {{name}{东南} {short}{se} {long}{southeast} {reverse}{northwest}}
  73. {northwest} {{name}{西北} {short}{nw} {long}{northwest} {reverse}{southeast}}
  74. {southwest} {{name}{西南} {short}{sw} {long}{southwest} {reverse}{northeast}}
  75. {ne} {{name}{东北} {short}{ne} {long}{northeast} {reverse}{sw} }
  76. {se} {{name}{东南} {short}{se} {long}{southeast} {reverse}{nw} }
  77. {nw} {{name}{西北} {short}{nw} {long}{northwest} {reverse}{se} }
  78. {sw} {{name}{西南} {short}{sw} {long}{southwest} {reverse}{ne} }
  79. {up} {{name}{正上} {short}{u} {long}{up} {reverse}{down} }
  80. {down} {{name}{正下} {short}{d} {long}{down} {reverse}{up} }
  81. {u} {{name}{正上} {short}{u} {long}{up} {reverse}{d} }
  82. {d} {{name}{正下} {short}{d} {long}{down} {reverse}{u} }
  83. {eastup} {{name}{东上} {short}{eu} {long}{eastup} {reverse}{westdown} }
  84. {westup} {{name}{西上} {short}{wu} {long}{westup} {reverse}{eastdown} }
  85. {southup} {{name}{南上} {short}{su} {long}{southup} {reverse}{northdown}}
  86. {northup} {{name}{北上} {short}{nu} {long}{northup} {reverse}{southdown}}
  87. {eu} {{name}{东上} {short}{eu} {long}{eastup} {reverse}{wd} }
  88. {wu} {{name}{西上} {short}{wu} {long}{westup} {reverse}{ed} }
  89. {su} {{name}{南上} {short}{su} {long}{southup} {reverse}{nd} }
  90. {nu} {{name}{北上} {short}{nu} {long}{northup} {reverse}{sd} }
  91. {eastdown} {{name}{东下} {short}{ed} {long}{eastdown} {reverse}{westup} }
  92. {westdown} {{name}{西下} {short}{wd} {long}{westdown} {reverse}{eastup} }
  93. {southdown} {{name}{南下} {short}{sd} {long}{southdown} {reverse}{northup} }
  94. {northdown} {{name}{北下} {short}{nd} {long}{northdown} {reverse}{southup} }
  95. {ed} {{name}{东下} {short}{ed} {long}{eastdown} {reverse}{wu} }
  96. {wd} {{name}{西下} {short}{wd} {long}{westdown} {reverse}{eu} }
  97. {sd} {{name}{南下} {short}{sd} {long}{southdown} {reverse}{nu} }
  98. {nd} {{name}{北下} {short}{nd} {long}{northdown} {reverse}{su} }
  99. {out} {{name}{出去} {short}{out} {long}{out} {reverse}{enter} }
  100. {enter} {{name}{进去} {short}{enter} {long}{enter} {reverse}{out} }
  101. };
  102. #func {__dir_convert_dir__} {
  103. #local field {%1};
  104. #local dir {%2};
  105. #local restricted {%2};
  106. #if { "$dir" == "" } {
  107. #return {};
  108. };
  109. #local entry ${xtt.dir.table[$dir]};
  110. #if { "$entry" == "" } {
  111. #if { @isTrue{$restricted} } {
  112. #return {};
  113. };
  114. #else {
  115. #return {$dir};
  116. };
  117. };
  118. #else {
  119. #return {$entry[$field]};
  120. };
  121. };
  122. ///=== {
  123. // #@ path.Compact <路径>
  124. // 压缩路径。返回压缩后的新路径。
  125. // };
  126. #func {path.Compact} {
  127. #local path {@list.FromSlist{%0}};
  128. #local count {&path[]};
  129. #if { $count == 0 } {
  130. #return {};
  131. };
  132. #local idx {1};
  133. #while { $idx < $count } {
  134. #local current {$path[$idx]};
  135. #local next {$path[@math.Eval{$idx + 1}]};
  136. #if { "@dir.Long{$current}" !== "@dir.Reverse{@dir.Long{$next}}" } {
  137. #math idx {$idx + 1};
  138. #continue;
  139. };
  140. #list path delete $idx 2;
  141. #local idx {@math.Max{1;@math.Eval{$idx - 2}}};
  142. #local count {@math.Eval{$count - 2}};
  143. };
  144. #return {@slist.FromList{$path}};
  145. };
  146. ///=== {
  147. // #@ path.Long <路径>
  148. // 返回长版本的路径。路径中的每个方向命令都会被扩展成完整的单词。
  149. // };
  150. #func {path.Long} {
  151. #return {@fp.Transform{{%0};{\@dir.Long{VALUE}}}};
  152. };
  153. ///=== {
  154. // #@ path.Short <路径>
  155. // 返回长版本的路径。路径中的每个方向命令都会被简化。
  156. // };
  157. #func {path.Short} {
  158. #return {@fp.Transform{{%0};{\@dir.Short{VALUE}}}};
  159. };