classlist.class.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <?php
  2. /**
  3. * The classlist file of zin of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2023 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
  6. * @author Hao Sun <sunhao@easycorp.ltd>
  7. * @package zin
  8. * @version $Id
  9. * @link https://www.zentao.net
  10. */
  11. namespace zin\utils;
  12. /**
  13. * Manage classname list for html element and widgets
  14. */
  15. class classlist
  16. {
  17. /**
  18. * Store classname list, key => value
  19. *
  20. * @access private
  21. * @var array
  22. */
  23. private $list = array();
  24. /**
  25. * Create classname instance
  26. *
  27. * @access public
  28. * @param array ...$list - A string or a class name list
  29. */
  30. public function __construct(/* ...$list */)
  31. {
  32. $list = func_get_args();
  33. if(!empty($list)) $this->set($list);
  34. }
  35. /**
  36. * Convert classnames to string
  37. *
  38. * @access public
  39. * @return string
  40. */
  41. public function __toString()
  42. {
  43. return $this->toStr();
  44. }
  45. /**
  46. * Create classname instance
  47. *
  48. * Example:
  49. *
  50. * // Set class names
  51. * $classlist = new classlist();
  52. * $classlist->set('btn primary rounded');
  53. *
  54. * // Set multiple classnames by string list
  55. * $classlist->set(array('btn', 'primary', 'rounded'));
  56. *
  57. * // Set multiple classnames by a mapped array
  58. * $classlist->set(array('btn' => true, 'primary' => true, 'rounded' => $isRounded));
  59. *
  60. * @access public
  61. * @param string|array|null $list - A string or a class name list
  62. * @param bool $reset
  63. * @return classlist
  64. */
  65. public function set($list, $reset = false)
  66. {
  67. $this->list = static::parse($list, $reset ? array() : $this->list);
  68. return $this;
  69. }
  70. /**
  71. * Add classnames
  72. *
  73. * Example:
  74. *
  75. * $classlist = new classlist();
  76. * $classlist->add('btn primary rounded');
  77. *
  78. * // Add multiple classnames by string list
  79. * $classlist->add('btn', 'primary', 'rounded');
  80. *
  81. * @access public
  82. * @param array ...$list - classname string joined by space or string array
  83. * @return classlist
  84. */
  85. public function add(/* ...$list */)
  86. {
  87. return $this->set(func_get_args());
  88. }
  89. /**
  90. * Remove classnames
  91. *
  92. * Example:
  93. *
  94. * $classlist = new classlist('btn primary rounded');
  95. * $classlist->remove('btn primary');
  96. *
  97. * // Add multiple classnames by string list
  98. * $classlist->remove('btn', 'primary');
  99. *
  100. * @access public
  101. * @param array|string $list - classname string joined by space or string array
  102. * @return classlist
  103. */
  104. public function remove($list)
  105. {
  106. if(is_string($list)) $list = explode(' ', $list);
  107. foreach($list as $name)
  108. {
  109. if(!is_string($name)) continue;
  110. $name = trim($name);
  111. if(!strlen($name)) continue;
  112. $this->list[$name] = false;
  113. }
  114. return $this;
  115. }
  116. /**
  117. * Toggle classname
  118. *
  119. * Example:
  120. *
  121. * $classlist = new classlist('btn');
  122. * $classlist->toggle('btn'); // class list is ""
  123. *
  124. * // Toggle class name by flag
  125. * $classlist->toggle('primary', true); // class list is "primary"
  126. *
  127. * @access public
  128. * @param string $name - classname string
  129. * @return classlist
  130. * @param bool|null $toggle
  131. */
  132. public function toggle($name, $toggle = null)
  133. {
  134. $name = trim($name);
  135. if(strlen($name))
  136. {
  137. if($toggle === null) $toggle = !$this->has($name);
  138. $this->list[$name] = $toggle;
  139. }
  140. return $this;
  141. }
  142. /**
  143. * Check whether has specific class name
  144. *
  145. * Example:
  146. *
  147. * $classlist = new classlist('btn primary rounded');
  148. * echo $classlist->has('btn'); // Output true
  149. *
  150. * // Check multiple names
  151. * echo $classlist->has('btn primary'); // Output true
  152. * @param mixed[]|string $list
  153. */
  154. public function has($list)
  155. {
  156. if(is_string($list)) $list = explode(' ', $list);
  157. foreach($list as $name)
  158. {
  159. if(!is_string($name)) continue;
  160. $name = trim($name);
  161. if(!strlen($name)) continue;
  162. if(!isset($this->list[$name]) || !$this->list[$name]) return false;
  163. }
  164. return true;
  165. }
  166. public function clear()
  167. {
  168. $this->list = array();
  169. }
  170. /**
  171. * Convert classnames to string
  172. *
  173. * @access public
  174. * @return string
  175. */
  176. public function toStr()
  177. {
  178. $names = array();
  179. foreach($this->list as $name => $toggle)
  180. {
  181. if(!$toggle) continue;
  182. $name = trim($name);
  183. if(!strlen($name)) continue;
  184. $names[] = $name;
  185. }
  186. return implode(' ', $names);
  187. }
  188. /**
  189. * Get class names count
  190. *
  191. * @access public
  192. * @return int
  193. */
  194. public function count()
  195. {
  196. return count($this->list);
  197. }
  198. public function toJSON()
  199. {
  200. return $this->list;
  201. }
  202. /**
  203. * @param mixed ...$classList
  204. */
  205. public static function format(...$classList)
  206. {
  207. return implode(' ', array_keys(static::parse($classList)));
  208. }
  209. /**
  210. * @param mixed ...$classList
  211. */
  212. public static function parseList(...$classList)
  213. {
  214. $map = static::parse($classList);
  215. return array_keys($map);
  216. }
  217. /**
  218. * @param mixed[]|string|object|null $currenMap
  219. * @param mixed $classList
  220. */
  221. public static function parse($classList, $currenMap = null)
  222. {
  223. $currenMap = is_null($currenMap) ? array() : static::parse($currenMap);
  224. if(is_string($classList))
  225. {
  226. $classList = explode(' ', $classList);
  227. foreach($classList as $name)
  228. {
  229. $name = trim($name);
  230. if(!strlen($name)) continue;
  231. $currenMap[$name] = true;
  232. }
  233. return $currenMap;
  234. }
  235. if(is_object($classList)) $classList = get_object_vars($classList);
  236. if(!is_array($classList)) return $currenMap;
  237. foreach($classList as $key => $value)
  238. {
  239. if(is_string($key))
  240. {
  241. if($value && !isset($currenMap[$key])) $currenMap[$key] = true;
  242. else if(!$value && isset($currenMap[$key])) unset($currenMap[$key]);
  243. continue;
  244. }
  245. $currenMap = static::parse($value, $currenMap);
  246. }
  247. return $currenMap;
  248. }
  249. }