doc.tin 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. #nop ############################ 系统工具-帮助文档和参数类型检查 #################################;
  8. #alias {xtt.PrintHelpDoc} {
  9. #local aliasList {%1};
  10. #local funcList {%2};
  11. #local what {%3};
  12. #echo {%c%h} {light cyan};
  13. #if { "$what" == "" } {
  14. #echo {%c%s} {light yellow} {别名:};
  15. #foreach {$aliasList} {alias} {
  16. #if { "$alias" == "" } {
  17. #continue;
  18. };
  19. #var __XTinTinAPIDoc__ {};
  20. $alias 'XTinTinAPI;
  21. #if { "$__XTinTinAPIDoc__" == "" } {
  22. #echo { %c%-20s --- %s} {light cyan} {$alias} {(没有文档)};
  23. };
  24. #else {
  25. #echo { %c%-20s --- %s} {light cyan} {$alias} {$__XTinTinAPIDoc__[desc]};
  26. };
  27. };
  28. #echo {%c%s} {light yellow} {函数:};
  29. #local func {};
  30. #foreach {$funcList} {func} {
  31. #if { "$func" == "" } {
  32. #continue;
  33. };
  34. #var __XTinTinAPIDoc__ {};
  35. #local {funcCall} {#local _ {@$func{'XTinTinAPI}}};
  36. $funcCall;
  37. #if { "$__XTinTinAPIDoc__" == "" } {
  38. #echo { %c%-20s --- %s} {light cyan} {$func} {(没有文档)};
  39. };
  40. #else {
  41. #echo { %c%-20s --- %s} {light cyan} {$func} {$__XTinTinAPIDoc__[desc]};
  42. };
  43. };
  44. };
  45. #elseif { @indexOfStrList{{$aliasList}; $what} > 0 } {
  46. #var __XTinTinAPIDoc__ {};
  47. $what 'XTinTinAPI;
  48. #if { "$__XTinTinAPIDoc__" == "" } {
  49. #echo {%c%%s} {light cyan} {没有关于 $alias 的文档。};
  50. };
  51. #else {
  52. #local _ @xtt.GenHelpDoc{{$__XTinTinAPIDoc__}};
  53. };
  54. };
  55. #elseif { @indexOfStrList{{$funcList}; $what} > 0 } {
  56. #var __XTinTinAPIDoc__ {};
  57. #local {funcCall} {#local _ {@$what{'XTinTinAPI}}};
  58. $funcCall;
  59. #if { "$__XTinTinAPIDoc__" == "" } {
  60. #echo { %c%-20s --- %s} {light cyan} {$func} {(没有文档)};
  61. };
  62. #else {
  63. #local _ @xtt.GenHelpDoc{{$__XTinTinAPIDoc__}};
  64. };
  65. };
  66. #echo {%c%h} {light cyan};
  67. };
  68. #func {xtt.GenHelpDoc} {
  69. #local args {%1};
  70. #if { "$args[check]" == "'XTinTinAPI" } {
  71. #return {
  72. {name}{$args[name]}
  73. {type}{$args[type]}
  74. {desc}{$args[desc]}
  75. {args}{$args[args]}
  76. {check}{}
  77. };
  78. };
  79. #if { "$args[type]" == "alias" } {
  80. #echo {%c别名用法: %c%s 参数1 参数2...} {light cyan} {light yellow} {$args[name]};
  81. };
  82. #elseif { "$args[type]" == "function" } {
  83. #echo {%c函数用法: %c@%s{ {参数1}{值1} {参数2}{值2}... }} {light cyan} {light yellow} {$args[name]};
  84. };
  85. #else {
  86. #echo {%c不明类型的标识符: %c%s} {light red} {light yellow} {$args[name]};
  87. #echo {%c%h} {light cyan};
  88. #return;
  89. };
  90. #echo {%c说明:%s} {light cyan} {$args[desc]};
  91. #echo {%c参数列表(!必选,?可选):} {light cyan};
  92. #foreach *args[args][] {idx} {
  93. #local key {};
  94. #local desc {};
  95. #nop 注意别名和函数收集参数名称的方法不同;
  96. #if { "$args[type]" == "alias" } {
  97. #list tmp create $args[args][$idx];
  98. #format key {%s} {$tmp[1]};
  99. #format desc {%s} {$tmp[2]};
  100. };
  101. #else {
  102. #format key {%s} {$idx};
  103. #format desc {%s} $args[args][$idx];
  104. };
  105. #echo {%c %-16s -- %s} {light cyan} {$key} {$desc};
  106. };
  107. };
  108. /*
  109. 用法:将下面这段代码作为模版,插入到想要生成文档的别名或者函数开头,就可以了。
  110. #local ok @xtt.HelpDoc{{
  111. {type}{function}
  112. {name}{helpDoc}
  113. {desc}{为函数或别名提供代码注释,生成帮助文档,进行参数检查}
  114. {check}{%0}
  115. {args}{
  116. {!name}{函数或别名的名称}
  117. {!desc}{函数或别名的一句话说明}
  118. {!check}{需要检查的变量,别名用 %0,函数建议用 %1}
  119. {!args}{函数或别名的参数说明。}
  120. }
  121. }}
  122. #if { "$ok" != "true" } {
  123. #return "$ok"
  124. }
  125. 以上,截止到此处为止。
  126. 你可能已经注意到了,上面的代码调用了 xtt.HelpDoc 函数来检查参数并生成文档。
  127. 而 xtt.HelpDoc 本身就支持用以上语法来检查并生成文档。因此上面的代码本身也演示了如何调用函数。
  128. 注意第二个 args 有两种写法,如果是函数就用键值对,如果是别名就用列表(前面加{1}{2}{3})。
  129. 其中参数名用感叹号打头表示必选,问号打头表示可选,默认必选。
  130. */
  131. #func {xtt.HelpDoc} {
  132. #local args {%1};
  133. #if { "$args[check]" == "'XTinTinAPI" } {
  134. #return @XTinTinGenHelpDoc{{$args}};
  135. };
  136. #if { "$XTinTin[debug]" != "true" } {
  137. #return {true};
  138. };
  139. #local ok {true};
  140. #local realArgs {};
  141. #list realArgs create {$args[check]};
  142. #foreach {*args[args][]} {idx} {
  143. #nop 这个 key 必须要用 var,因为后面 regex 里面不支持 local;
  144. #var key {};
  145. #nop 注意别名和函数收集参数名称的方法不同;
  146. #if { "$args[type]" == "alias" } {
  147. #list tmp create $args[args][$idx];
  148. #format key {%s} {$tmp[1]};
  149. };
  150. #else {
  151. #format key {%s} {$idx};
  152. };
  153. #var optional {false};
  154. #regex {$key} {{!|\?}%%2} {
  155. #format key {%s} {&2};
  156. #if { "&1" == "?" } {
  157. #var optional {true};
  158. };
  159. }{};
  160. #nop 注意别名和函数收集参数值的方法不同;
  161. #local value {};
  162. #if { "$args[type]" == "alias" } {
  163. #format value {%s} {$realArgs[$idx]};
  164. };
  165. #else {
  166. #format value {%s} {$check[$key]};
  167. };
  168. #if { "$optional" == "false" && "$value" == "" } {
  169. #echo {%c函数或别名在调用时缺少必要的参数: %s} {light red} $key;
  170. #format ok {false};
  171. };
  172. };
  173. #unvar key;
  174. #if { "$ok" != "true" } {
  175. #echo {%c%h} {light cyan};
  176. #var _ @XTinTinGenHelpDoc{{$args}};
  177. #echo {%c-----\n%s} {light cyan} {实际传递的参数信息: \n$args[check]};
  178. #echo {%c%h} {light cyan};
  179. };
  180. #return $ok;
  181. };