kiran-menu/0001-feature-menu-Add-pinyin-search-method-for-applicatio.patch

265 lines
130 KiB
Diff
Raw Normal View History

From bf67f7afe2194b9dc474e66dc965aa94a90a9600 Mon Sep 17 00:00:00 2001
From: wangxiaoqing <wangxiaoqing@kylinsec.com.cn>
Date: Wed, 15 Mar 2023 09:45:29 +0800
Subject: [PATCH 1/2] feature(menu):Add pinyin search method for application
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加应用程序的拼音搜索方式,先将应用程序的汉字名称转为拼音, 再根据用户输入的拼音关键词进行查找
Related #67099
Signed-off-by: wangxiaoqing <wangxiaoqing@kylinsec.com.cn>
---
lib/app.cpp | 1 +
lib/app.h | 2 ++
lib/common.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++
lib/common.h | 1 +
lib/menu-search.cpp | 48 ++++++++++++++++++++++++++-
lib/pinyin.h | 24 ++++++++++++++
6 files changed, 154 insertions(+), 1 deletion(-)
create mode 100644 lib/pinyin.h
diff --git a/lib/app.cpp b/lib/app.cpp
index d8a9ea0..8ccae72 100644
--- a/lib/app.cpp
+++ b/lib/app.cpp
@@ -83,6 +83,7 @@ void App::update_from_desktop_file(bool force)
this->name_ = GET_STRING("Name");
this->locale_name_ = GET_LOCALE_STRING("Name");
+ this->locale_name_pinyin_list_ = convert_chinese_characters_to_pinyin(this->locale_name_);
this->comment_ = GET_STRING("Comment");
this->locale_comment_ = GET_LOCALE_STRING("Comment");
diff --git a/lib/app.h b/lib/app.h
index 3e6db60..a7a1275 100644
--- a/lib/app.h
+++ b/lib/app.h
@@ -83,6 +83,7 @@ public:
const std::string &get_name() { return this->name_; }
// 获取desktop文件中的Name[locale]字段值
const std::string &get_locale_name() { return this->locale_name_; }
+ const std::list<std::string> &get_locale_name_pinyin_list() { return this->locale_name_pinyin_list_; }
// 获取desktop文件中的Comment字段值
const std::string &get_comment() { return this->comment_; }
// 获取desktop文件中的Comment[locale]字段值
@@ -164,6 +165,7 @@ private:
std::string name_;
std::string locale_name_;
+ std::list<std::string> locale_name_pinyin_list_;
std::string comment_;
std::string locale_comment_;
diff --git a/lib/common.cpp b/lib/common.cpp
index 3e296f4..117c10b 100644
--- a/lib/common.cpp
+++ b/lib/common.cpp
@@ -13,6 +13,7 @@
*/
#include "lib/common.h"
+#include "lib/pinyin.h"
namespace Kiran
{
@@ -46,4 +47,82 @@ bool write_list_quark_to_as(Glib::RefPtr<Gio::Settings> settings,
return settings->set_string_array(key, new_value);
}
+static wchar_t *
+convert_chars_to_wchars(const std::string &contents)
+{
+ size_t mbs_len;
+ wchar_t *wcs;
+
+ mbs_len = mbstowcs(NULL, contents.c_str(), 0);
+ if (mbs_len == (size_t)-1)
+ {
+ return NULL;
+ }
+
+ wcs = (wchar_t *)calloc(mbs_len + 1, sizeof(wchar_t));
+ if (wcs == NULL)
+ {
+ return NULL;
+ }
+
+ if (mbstowcs(wcs, contents.c_str(), mbs_len + 1) == (size_t)-1)
+ {
+ free(wcs);
+ return NULL;
+ }
+
+ return wcs;
+}
+
+static void
+clear_space(char *pinyin)
+{
+ for (; *pinyin != '\0'; pinyin++)
+ {
+ if (*pinyin == ' ')
+ {
+ *pinyin = '\0';
+ }
+ }
+}
+
+std::list<std::string> convert_chinese_characters_to_pinyin(const std::string &contents)
+{
+ std::list<std::string> pinyin_list;
+ wchar_t *wcs;
+ int unicode;
+
+ wcs = convert_chars_to_wchars(contents);
+
+ if (wcs == NULL)
+ {
+ return pinyin_list;
+ }
+
+ for (auto wp = wcs; *wp != '\0'; wp++)
+ {
+ int unicode = *wp;
+
+ if (unicode >= CHINESE_UNICODE_START &&
+ unicode <= CHINESE_UNICODE_END)
+ {
+ char pinyin[CHINESE_UNICODE_MAX_LENGTH + 1] = {'\0'};
+ int offset = 0;
+
+ offset = (unicode - CHINESE_UNICODE_START) * CHINESE_UNICODE_MAX_LENGTH;
+
+ if (offset + CHINESE_UNICODE_MAX_LENGTH <= sizeof(chinese_basic_dict))
+ {
+ memcpy(pinyin, chinese_basic_dict + offset, CHINESE_UNICODE_MAX_LENGTH);
+ clear_space(pinyin);
+ pinyin_list.push_back(pinyin);
+ }
+ }
+ }
+
+ free(wcs);
+
+ return pinyin_list;
+}
+
} // namespace Kiran
\ No newline at end of file
diff --git a/lib/common.h b/lib/common.h
index 862966f..c234dee 100644
--- a/lib/common.h
+++ b/lib/common.h
@@ -38,4 +38,5 @@ bool write_list_quark_to_as(Glib::RefPtr<Gio::Settings> settings,
const std::string &key,
const std::list<int32_t> &value);
+std::list<std::string> convert_chinese_characters_to_pinyin(const std::string &contents);
} // namespace Kiran
\ No newline at end of file
diff --git a/lib/menu-search.cpp b/lib/menu-search.cpp
index c5dc949..03f7d08 100644
--- a/lib/menu-search.cpp
+++ b/lib/menu-search.cpp
@@ -36,6 +36,50 @@ void MenuSearch::flush(const AppVec &apps)
{
}
+static int calculate_equal_position(const std::string &keyword,
+ const std::string &pinyin)
+{
+ int i = 0;
+
+ for (; i < keyword.length() && i < pinyin.length(); i++)
+ {
+ if (keyword[i] != pinyin[i])
+ {
+ break;
+ }
+ }
+
+ return i;
+}
+
+static bool contain_with_pinyin(const std::string &keyword,
+ std::list<std::string> pinyin_list)
+{
+ int length = keyword.length();
+ int offset = 0;
+ auto sub_keyword = keyword.substr(0, length);
+
+ for (auto iter_string = pinyin_list.begin(); iter_string != pinyin_list.end(); iter_string++)
+ {
+ auto pinyin = *iter_string;
+ int position;
+
+ position = calculate_equal_position(sub_keyword, pinyin);
+ if (position > 0)
+ {
+ offset += position;
+ if (offset >= length)
+ {
+ return true;
+ }
+
+ sub_keyword = keyword.substr(offset, length);
+ }
+ }
+
+ return false;
+}
+
AppVec MenuSearch::search_by_keyword(const std::string &keyword,
bool ignore_case,
AppKind kind,
@@ -54,11 +98,13 @@ AppVec MenuSearch::search_by_keyword(const std::string &keyword,
auto &locale_comment = app->get_locale_comment();
auto &name = app->get_name();
auto &locale_name = app->get_locale_name();
+ auto &locale_name_pinyin_list = app->get_locale_name_pinyin_list();
#define STRSTR_KEYWORD(a) (strstr_with_case(a, keyword, ignore_case))
if (STRSTR_KEYWORD(name) || STRSTR_KEYWORD(locale_name) ||
- STRSTR_KEYWORD(comment) || STRSTR_KEYWORD(locale_comment))
+ STRSTR_KEYWORD(comment) || STRSTR_KEYWORD(locale_comment) ||
+ contain_with_pinyin(keyword, locale_name_pinyin_list))
{
match_apps.push_back(app);
}
diff --git a/lib/pinyin.h b/lib/pinyin.h
new file mode 100644
index 0000000..faa3661
--- /dev/null
+++ b/lib/pinyin.h
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-cc-daemon is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: tangjie02 <tangjie02@kylinos.com.cn>
+ */
+
+#pragma once
+
+namespace Kiran
+{
+#define CHINESE_UNICODE_START 0x4E00
+#define CHINESE_UNICODE_END 0x9FA5
+#define CHINESE_UNICODE_MAX_LENGTH 6
+
+const char chinese_basic_dict[] = "yi ding kao qi shang xia mu wan zhang san shang xia ji bu yu mian gai chou chou zhuan qie pi shi shi qiu bing ye cong dong si cheng diu qiu liang diu you liang yan bing sang gun jiu ge ya zhuangzhong ji jie feng guan chuan chan lin zhuo zhu ha wan dan wei zhu jing li ju pie fu yi yi nai wu jiu jiu tuo me yi ho zhi wu zha hu fa le yin ping pang qiao hu guai cheng cheng yi yin wan mie jiu qi ye xi xiang gai jiu hai ho shu dou shi ji nang kai keng ting mo ou mai luan cai ru xue yan peng sha na qian si er cui ceng qian zhi gui gan luan lin yi jue liao ma yu zheng shi shi er chu yu kui yu yun hu qi wu jing si sui gen geng ya xie ya qi ya ji tou wang kang da jiao hai yi chan heng mu ye xiang jing ting liang xiang jing ye qin bo you xie dan lian duo wei ren ren ji ra wang yi shi ren le ding ze jin pu chou ba zhang jin jie bing reng cong fo tao lun er cang zai shi ta zhang fu xian xian duo hong tong ren qian gan yi bo dai ling yi chao chang sa shang yi mu men ren fan chao yang qian zhong pi wo wu jian jia yao feng cang ren wang fen di fang zhong qi pei yu diao dun wu yi xin kang yi ji ai wu ji fu fa xiu jin pi dan fu nu zhong you huo hui yu cui yun san wei chuan che ya qian shang chang lun cang xun xin wei zhu ze xian nu bo gu ni ni xie ban xu ling zhou shen qu si beng si ga pi yi si yi zheng dian han mai dan zhu bu qu bi zhao ci wei di zhu zuo you yang ti zhan he bi tuo she yu yi fo zuo gou ning tong ni xian qu yong wa qian shi ka bao pei hui he lao xiang ge yang bai fa ming jia er bing ji hen huo gui quan tiao jiao ci yi shi xing shen tuo kan zhi gai lai yi chi kua guang li yin shi mi zhu xu you an lu mou er lun dong cha chi xun gong zhou yi ru jian xia si dai lv ta jiao zhen ce qiao kuai chai ning nong jin wu hou jiong cheng zhen zuo chou qin lv ju shu ting shen tuo bo nan xiao bian tui yu xi cu e qiu xu guang ku wu jun yi fu liang zu qiao li yong hun jing qian san pei su fu xi li mian ping bao yu si xia xin xiu yu di che chou zhi yan lia li lai si jian xiu fu huo ju xiao pai jian biao chu fei feng ya an bei yu xin bi chi chang zhi bing jiu yao cui lia wan lai cang zong ge guan bei tian shu shu men dao tan jue chui xing peng tang hou yi qi ti gan jing jie sui chang jie fang zhi kong juan zong ju qian ni lun zhuo wo luo song leng hun dong zi ben wu ju nai cai jian zhai ye zhi sha qing qie ying cheng qian yan ruan zhong chun jia ji wei yu bing ruo ti wei pian yan feng tang wo e xie che sheng kan di zuo cha ting bei ye huang yao zhan chou yan you jian xu zha ci fu bi zhi zong mian ji yi xie xun cai duan ce zhen ou tou tou bei zan lou jie wei fen chang kui sou zhi su xia fu yuan rong li nu yun jiang ma bang dian tang hao jie xi shan qian jue cang chu san bei xiao yong yao tan suo yang fa bing jia dai zai
+} // namespace Kiran
--
2.33.0