option.tin 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. #var lib_option[META] {
  8. {NAME} {全局选项管理}
  9. {DESC} {为全局选项提供了一个储存位置,并提供一些实用的 API。}
  10. {AUTHOR} {担子炮}
  11. };
  12. VAR {全局选项字典} gOptions {};
  13. load-lib storage;
  14. #func {lib_option.Init} {
  15. #var gOptions {@storage.GetGlobal{global-options}};
  16. #return {true};
  17. };
  18. ///=== {
  19. ///// 全局选项管理。
  20. /////
  21. ///// 全局选项本质上就是一些变量,这个模块主要是为了提供一些公共 API,和一个统
  22. ///// 一的管理方式,能够把散落在各处的选项集中管理。
  23. /////
  24. // ## option.Define <名称> <数据类型> <中文含义> [<默认值>]
  25. // 定义一个全局选项。选项被定义之后有一些公共 API 可供使用。
  26. // 选项必须经过定义之后才能使用。选项的名称按照大骆驼风格命名。
  27. // 目前仅支持 Bool 型选项。
  28. // };
  29. #alias {option.Define} {
  30. #local option {%1};
  31. #local type {%2};
  32. #local meaning {%3};
  33. #local default {%4};
  34. #if { "$option" == "" || "$type" == "" || "$meaning" == "" } {
  35. xtt.Usage option.Define;
  36. #return;
  37. };
  38. #if { "$gOptions[$option]" != "" } {
  39. #if { "$gOptions[$option][name]" != "$option"
  40. || "$gOptions[$option][type]" != "$type"
  41. || "$gOptions[$option][meaning]" != "$meaning"
  42. } {
  43. errLog 选项「$option」已存在,请检查代码。;
  44. };
  45. #return;
  46. };
  47. #if { ! @option.isValidValue{$type;{$default}} } {
  48. #return;
  49. };
  50. #var gOptions[$option] {
  51. {name} {$option}
  52. {type} {$type}
  53. {meaning} {$meaning}
  54. {value} {$default}
  55. };
  56. storage.SetGlobal {global-options} {$gOptions};
  57. };
  58. ///=== {
  59. // ## option.List
  60. // 列出所有的选项。
  61. // };
  62. #alias {option.List} {
  63. #echo {};
  64. #echo { <128>%-20s%-10s %-30s %+20s} {选项名称} {选项类型} {选项含义} {选项当前值};
  65. #draw Yellow scroll line 1 1 1 90;
  66. #local option {};
  67. #foreach {*gOptions[]} {option} {
  68. #echo { %-20s %-10s %-30s %+20s}
  69. {$gOptions[$option][name]}
  70. {$gOptions[$option][type]}
  71. {$gOptions[$option][meaning]}
  72. {{$gOptions[$option][value]}};
  73. };
  74. #echo {};
  75. };
  76. ///=== {
  77. // #@ option.Get <选项名称>
  78. // 获取选项的当前值。
  79. // };
  80. #func {option.Get} {
  81. #local {option} {%1};
  82. #if { "$option" == "" } {
  83. xtt.Usage option.Get;
  84. #return {};
  85. };
  86. #if { "$gOptions[$option]" == "" } {
  87. errLog 不存在选项「$option」,请先定义后再使用。;
  88. #return {};
  89. };
  90. #return {$gOptions[$option][value]};
  91. };
  92. ///=== {
  93. // #@ option.Set <选项名称> <选项新值>
  94. // 设置选项的当前值,返回之前的旧值。
  95. // };
  96. #func {option.Set} {
  97. #local {option} {%1};
  98. #local {value} {%2};
  99. #if { "$option" == "" } {
  100. xtt.Usage option.Set;
  101. #return {};
  102. };
  103. #local old {$gOptions[$option]};
  104. #if { "$old" == "" } {
  105. errLog 不存在选项「$option」,请先定义后再使用。;
  106. #return {};
  107. };
  108. #if { ! @option.isValidValue{$gOptions[$option][type];{$value}} } {
  109. #return {};
  110. };
  111. #var {gOptions[$option][value]} {$value};
  112. storage.SetGlobal {global-options} {$gOptions};
  113. #return {$old[value]};
  114. };
  115. ///=== {
  116. // ## option.Set <选项名称> <选项值>
  117. // 设置选项的当前值。
  118. // };
  119. #alias {option.Set} {
  120. #local {option} {%1};
  121. #local {value} {%2};
  122. #local _ {@option.Set{$option;{$value}}};
  123. };
  124. ///=== {
  125. // #@ option.IsEnable <选项名称>
  126. // 检查选项是否已被开启。
  127. // };
  128. #func {option.IsEnable} {
  129. #local option {%1};
  130. #if { "$option" == "" } {
  131. xtt.Usage option.IsEnable;
  132. #return {};
  133. };
  134. #if { "$gOptions[$option]" == "" } {
  135. errLog 不存在选项「$option」,请先定义后再使用。;
  136. #return {};
  137. };
  138. #if { "$gOptions[$option][type]" != "Bool" } {
  139. errLog 只有 Bool 型变量才支持这个 API。;
  140. #return {};
  141. };
  142. #local value {@option.Get{$option}};
  143. #return @isTrue{$value};
  144. };
  145. ///=== {
  146. // #@ option.IsDisable <选项名称>
  147. // 检查选项是否已被禁用。
  148. // };
  149. #func {option.IsDisable} {
  150. #local option {%1};
  151. #if { "$option" == "" } {
  152. xtt.Usage option.IsDisable;
  153. #return {};
  154. };
  155. #if { "$gOptions[$option]" == "" } {
  156. errLog 不存在选项「$option」,请先定义后再使用。;
  157. #return {};
  158. };
  159. #if { "$gOptions[$option][type]" != "Bool" } {
  160. errLog 只有 Bool 型变量才支持这个 API。;
  161. #return {};
  162. };
  163. #local value {@option.Get{$option}};
  164. #return @isFalse{$value};
  165. };
  166. ///=== {
  167. // #@ option.Toggle <选项名称>
  168. // 翻转选项的当前值。如果是启用则改为禁用;如果是禁用则改为启用。
  169. // 本函数将返回之前的值。
  170. // };
  171. #func {option.Toggle} {
  172. #local {option} {%1};
  173. #if { "$option" == "" } {
  174. xtt.Usage option.Toggle;
  175. #return {};
  176. };
  177. #if { "$gOptions[$option]" == "" } {
  178. errLog 不存在选项「$option」,请先定义后再使用。;
  179. #return {};
  180. };
  181. #if { "$gOptions[$option][type]" != "Bool" } {
  182. errLog 只有 Bool 型变量才支持这个 API。;
  183. #return {};
  184. };
  185. #local value {@option.Get{$option}};
  186. #if { "$value" == "true" } {
  187. option.Disable $option;
  188. infoLog <169>选项「<139>$gOptions[$option][meaning]($option)<169>」 <119>已禁用。<299>;
  189. };
  190. #elseif { "$value" == "false" } {
  191. option.Enable $option;
  192. infoLog <169>选项「<139>$gOptions[$option][meaning]($option)<169>」 <129>已启用。<299>;
  193. };
  194. #return {$value};
  195. };
  196. ///=== {
  197. // ## option.Toggle <选项名称>
  198. // 翻转选项的当前值。如果是启用则改为禁用;如果是禁用则改为启用。
  199. // };
  200. #alias {option.Toggle} {
  201. #local {option} {%1};
  202. #local _ {@option.Toggle{$option}};
  203. };
  204. ///=== {
  205. // ## option.Enable <选项名称>
  206. // 启用该选项。
  207. // };
  208. #alias {option.Enable} {
  209. #local {option} {%1};
  210. option.Set $option {true};
  211. };
  212. ///=== {
  213. // ## option.Disable <选项名称>
  214. // 禁用该选项。
  215. // };
  216. #alias {option.Disable} {
  217. #local {option} {%1};
  218. option.Set $option {false};
  219. };
  220. #func {@option.isValidValue} {
  221. #local type {%2};
  222. #local value {%3};
  223. #local types {Bool|String|Number};
  224. #if { "$type" != "{$types}" } {
  225. errLog 不能识别的选项类型: 「$type」,目前仅支持选项类型:{$types};
  226. #return;
  227. };
  228. #if { "$type" == "Bool" && "$value" != "{true|false}" } {
  229. errLog Bool 型的选项值只能是 true 或者 false。;
  230. #return 0;
  231. };
  232. #else {
  233. #return 1;
  234. };
  235. };