hangul-search
Advanced tools
Comparing version 1.3.0 to 1.4.0
{ | ||
"name": "hangul-search", | ||
"version": "1.3.0", | ||
"version": "1.4.0", | ||
"description": "Json객체에서 한글 검색을 수행. 한글 초성 검색을 지원. Korean search within JSON objects. Supports Korean initial consonant search.", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
@@ -120,3 +120,3 @@ ## hansearch | ||
3번째 인자에 검색 대상 키 컬럼을 지정할 수 있습니다. | ||
3번째 인자에 검색 대상 키 컬럼을 지정할 수 있습니다. 값을 지정하지 않으면 모든 키를 대상으로 검색을 수행합니다. | ||
@@ -136,2 +136,29 @@ ```js | ||
hansearch 의 3번째 인자에는 json 형태로 옵션값을 전달할 수도 있습니다. | ||
```js | ||
var options = { | ||
"mode" : "exact", | ||
"keys" : ["key1", "key2"] | ||
} | ||
var result = hansearch(json, "ㅈ렬화", options); | ||
``` | ||
`mode` string "exact" : 정확히 일치하는 검색을 수행합니다. default 는 자음 분해 검색을 수행합니다. | ||
| exact 모드인 경우 "파라미터"를 검색하기 위해 "ㅍㄻㅌ" 와 같이 입력한 경우 검색이 되지 않습니다. default 모드에서는 ㄻ 을 ㄹㅁ 으로 분해하여 검색을 수행합니다. 특별히 값을 지정하지 않으면 분해 검색을 수행합니다. | ||
`keys` string[] : 검색 대상 키값을 지정합니다. 값을 지정하지 않으면 모든 키를 대상으로 검색을 수행합니다. | ||
| 다음 두 코드는 동일한 동작을 수행합니다. | ||
```js | ||
var keys = ["title", "users"]; | ||
var options = { "keys" : ["title", "users"] }; | ||
var result = hansearch(json, "ㅈ렬화", keys); | ||
var result = hansearch(json, "ㅈ렬화", options); | ||
``` | ||
## References | ||
@@ -141,4 +168,6 @@ | ||
https://github.com/hwahyeon/korean-unpacker/issues/1 | ||
## LICENSE | ||
MIT |
@@ -6,4 +6,5 @@ /** | ||
* @param {Object} [options] - 옵션 객체 | ||
* @param {string[]} [options.keys] - 검색할 특정 키(들)를 선택할 수 있음 | ||
* @returns {Record<string, any>[]} - 검색 결과를 담은 JSON 객체 배열 | ||
* @param {Options string[]} [options.keys] - 검색할 특정 키(들)를 선택할 수 있습니다. 문자열 배열로 전달합니다. | ||
* @param {Options Record<string, any>[]} [options.keys] - 검색 모드 지정 및 검색할 특정 키(들)를 선택할 수 있습니다. JSON 객체 배열로 전달합니다. | ||
* @returns {Record<string, any>[]} - 검색 결과를 포함한 JSON 객체 배열을 반환합니다. | ||
* @example | ||
@@ -14,15 +15,15 @@ * const result = hansearch(jsonArray, "키워드"); // jsonArray의 모든 키값을 탐색 | ||
* const result = hansearch(jsonArray, "키워드").mark("my-tag"); // 결과 값 <my-tag></my-tag> 태그 치환 | ||
* const result = hansearch(jsonArray, "키워드", {'mode':'exact'}); // 정확히 일치하는 검색을 수행 | ||
* const result = hansearch(jsonArray, "키워드", {'mode':'exact', 'keys' : ["key1", "key2"]}); // 정확히 일치하는 검색을 수행하며, key1 및 key2 값만 탐색 | ||
**/ | ||
interface MarkedResult { | ||
mark: (tag?: string) => Record<string, any>[]; | ||
mark: (tag?: string) => Record<string, any>[]; | ||
} | ||
declare module 'hansearch' { | ||
const hansearch: ( | ||
jsonObj: Record<string, any>[], | ||
keyWord: string, | ||
options?: string[] | ||
) => MarkedResult; | ||
type Options = Record<string, any> | string[]; | ||
export = hansearch; | ||
} | ||
declare module "hansearch" { | ||
const hansearch: (jsonObj: Record<string, any>[], keyWord: string, options?: Options) => MarkedResult; | ||
export = hansearch; | ||
} |
@@ -20,3 +20,3 @@ /*! | ||
const JONG_HANGUL = ["", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]; | ||
const MAP_DOUBLE_JONG = { ㄳ: "ㄱㅅ", ㄵ: "ㄴㅈ", ㄶ: "ㄴㅎ", ㄺ: "ㄹㄱ", ㄻ: "ㄹㅁ", ㄼ: "ㄹㅂ", ㄽ: "ㄹㅅ", ㄾ: "ㄹㅌ", ㄿ: "ㄹㅍ", ㅀ: "ㄹㅎ", ㅄ: "ㅂㅅ" }; | ||
const MAP_DOUBLE_MOUM = { ㄳ: "ㄱㅅ", ㄵ: "ㄴㅈ", ㄶ: "ㄴㅎ", ㄺ: "ㄹㄱ", ㄻ: "ㄹㅁ", ㄼ: "ㄹㅂ", ㄽ: "ㄹㅅ", ㄾ: "ㄹㅌ", ㄿ: "ㄹㅍ", ㅀ: "ㄹㅎ", ㅄ: "ㅂㅅ" }; | ||
@@ -34,3 +34,3 @@ const HAN_START_CHAR = "가".charCodeAt(); | ||
const makeRegexByCho = (keyWord = "") => { | ||
const escapedSearch = keyWord.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); | ||
const escapedSearch = keyWord.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); // 특수문자 검색 지원 | ||
const regex = CHO_HANGUL.reduce((acc, cho, index) => acc.replace(new RegExp(cho, "g"), `[${combineHangul(index, 0, 0)}-${combineHangul(index + 1, 0, -1)}]`), escapedSearch); | ||
@@ -48,4 +48,17 @@ return new RegExp(`(${regex})`, "ig"); | ||
let keywords = [keyWord]; | ||
const preCharacters = keyWord.slice(0, keyWord.length - 1); // 마지막 문자를 제외한 모든 문자열 | ||
let preCharacters = keyWord.slice(0, keyWord.length - 1); // 마지막 문자를 제외한 모든 문자열 | ||
preCharacters = preCharacters | ||
.split("") | ||
.map((currentChar) => { | ||
if (MAP_DOUBLE_MOUM.hasOwnProperty(currentChar)) { | ||
// 앞 문자열에 겹초성만 있는 문자는 분해해서 조립 | ||
return MAP_DOUBLE_MOUM[currentChar]; | ||
} else { | ||
return currentChar; | ||
} | ||
}) | ||
.join(""); | ||
//keywords.push(preCharacters); | ||
const lastCharacter = keyWord.charAt(keyWord.length - 1); // 마지막 문자 | ||
@@ -63,7 +76,7 @@ | ||
if (jong > 0) { | ||
if (MAP_DOUBLE_JONG.hasOwnProperty(jong_char)) { | ||
if (MAP_DOUBLE_MOUM.hasOwnProperty(jong_char)) { | ||
// 겹받침인 경우 | ||
let result = johapHangul(cho_char, jung_char, MAP_DOUBLE_JONG[jong_char][0]); | ||
let result = johapHangul(cho_char, jung_char, MAP_DOUBLE_MOUM[jong_char][0]); | ||
keywords.push(preCharacters + result); | ||
keywords.push(preCharacters + result + MAP_DOUBLE_JONG[jong_char][1]); | ||
keywords.push(preCharacters + result + MAP_DOUBLE_MOUM[jong_char][1]); | ||
} else { | ||
@@ -77,4 +90,6 @@ // 홑받침인 경우 | ||
// 초성만 있는 경우 | ||
if (MAP_DOUBLE_JONG.hasOwnProperty(lastCharacter)) { | ||
keywords.push(preCharacters + MAP_DOUBLE_JONG[lastCharacter]); | ||
if (MAP_DOUBLE_MOUM.hasOwnProperty(lastCharacter)) { | ||
keywords.push(preCharacters + MAP_DOUBLE_MOUM[lastCharacter]); | ||
} else { | ||
keywords.push(preCharacters + lastCharacter); | ||
} | ||
@@ -85,6 +100,27 @@ } | ||
const hansearch = (jsonObj, keyWord, keys = []) => { | ||
const searchWords = makeSearchWords(keyWord); | ||
const hansearch = (jsonObj, keyWord, options) => { | ||
let keys = []; | ||
let searchWords = null; | ||
// check option keys | ||
if (Array.isArray(options)) { | ||
keys = options; // support minor version | ||
} else if (typeof options === "object" && options !== null && "keys" in options) { | ||
keys = options.keys; | ||
} else { | ||
keys = []; | ||
} | ||
// check option values | ||
if (typeof options === "object" && options !== null && "mode" in options) { | ||
if (options.mode === "exact") { | ||
searchWords = [keyWord]; // exact matching | ||
} else { | ||
searchWords = makeSearchWords(keyWord); // deassemble matching | ||
} | ||
} else { | ||
searchWords = makeSearchWords(keyWord); // default deassemble matching | ||
} | ||
const regexArray = searchWords.map((word) => makeRegexByCho(word)).filter((regex) => regex); | ||
//console.log(searchWords, regexArray); | ||
let searchResult = jsonObj.filter((obj) => { | ||
@@ -91,0 +127,0 @@ for (const key in obj) { |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
19579
169
171