Support hash and space as valid tag separators

https://xetown.com/questions/1728094

- 해시(#) 문자와 공백도 태그 구분자로 사용할 수 있도록 지원
- 해시는 기본 지원하며, 공백은 기본 OFF
- tag 모듈 설정에서 커스터마이징 가능
- document 모듈 이외의 자료에서 태그 기능 구현한 경우 적용되지 않을 수 있음
This commit is contained in:
Kijin Sung 2022-12-16 01:02:42 +09:00
parent e821955129
commit 38900d4b2d
8 changed files with 242 additions and 47 deletions

View file

@ -8,12 +8,77 @@
class tagModel extends tag
{
/**
* @brief Initialization
* Separator regexp cache
*/
function init()
protected static $_separator_list = null;
protected static $_separator_regexp = null;
/**
* Generate and cache separator list and regexp.
*/
protected static function _generateSeparatorConfig()
{
$config = ModuleModel::getModuleConfig('tag');
if (isset($config->separators) && count($config->separators))
{
self::$_separator_list = $config->separators;
}
else
{
self::$_separator_list = ['comma', 'hash'];
}
$regexp = '/[';
$regexp_map = [
'comma' => ',',
'hash' => '#',
'space' => '\\s',
];
foreach (self::$_separator_list as $separator)
{
$regexp .= $regexp_map[$separator];
}
$regexp .= ']+/';
self::$_separator_regexp = $regexp;
}
/**
* Split a string of tags into an array.
*
* @param string $str
* @return array
*/
public static function splitString(string $str): array
{
if (!isset(self::$_separator_list))
{
self::_generateSeparatorConfig();
}
// Clean up the input string.
$str = trim(utf8_normalize_spaces(utf8_clean($str)));
if ($str === '')
{
return [];
}
// Split the input string and collect non-empty fragments.
$fragments = preg_split(self::$_separator_regexp, $str, -1, PREG_SPLIT_NO_EMPTY);
$tags = [];
foreach ($fragments as $fragment)
{
$fragment = trim($fragment);
if ($fragment !== '')
{
$tags[strtolower($fragment)] = $fragment;
}
}
// Return a list of valid fragments with no duplicates.
return array_values(array_unique($tags));
}
/**
* @brief Imported Tag List
* Many of the specified module in order to extract the number of tags