pinyin-match

This commit is contained in:
fofolee 2020-06-29 20:55:53 +08:00
parent 9798688496
commit 45bc1b7afd
9 changed files with 419 additions and 0 deletions

21
src/node_modules/pinyin-match/LICENSE generated vendored Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 All contributors to pinyin-match
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

72
src/node_modules/pinyin-match/README.md generated vendored Normal file
View File

@ -0,0 +1,72 @@
# pinyin-match
能够使用拼音快速检索目标。
1. 28.5KB (gzip => 20.3KB)
2. 支持多音字、拼音首字母匹配,具备分词功能
3. 覆盖 6763 个汉字
4. 返回位置信息,可用于高亮匹配字符
5. 在长多音字串下依然有高性能
在线演示:<http://139.199.181.200:8686>;
## 安装
```shell
npm install pinyin-match --save
```
也支持`<script>`引入
`<script src="pinyin-match/dist/main.js"></script>`
`PinyinMatch.match('xxx', 'x')`
## API
### .match(input, keyword)
查询匹配拼音的数据。
参数:
1. input `{string}` 目标字符串
2. keyword `{string}` 输入的拼音或其他关键词
返回:
`{[Array]|{Boolean}}`
## 使用范例
列表项为字符串:
```js
const PinyinMatch = require('pinyin-match');
let test = '123曾经沧海难为水除却巫山不是云'
PinyinMatch.match(test, '23曾'); // [1, 3]
PinyinMatch.match(test, 'cjc') // [3, 5]
PinyinMatch.match(test, 'cengjingcanghai') // [3, 6]
PinyinMatch.match(test, 'cengjingcangha') // [3, 6]
PinyinMatch.match(test, 'engjingcanghai') // false
PinyinMatch.match(test, 'zengjingcang') // [3, 5]
PinyinMatch.match(test, 'sdjkelwqf') // false
PinyinMatch.match(text, 'zengji ng cang') // [3, 5]
PinyinMatch.match(text, 'zengji ng cangsdjfkl') // false
PinyinMatch.match(' 我 爱你 中 国 ', 'nzg') // [6, 12]
PinyinMatch.match(' 我 爱你 中 国 ', '爱你中') // [5, 8]
```
**如果对你项目有帮助请给个Star**

1
src/node_modules/pinyin-match/dist/main.js generated vendored Normal file

File diff suppressed because one or more lines are too long

6
src/node_modules/pinyin-match/index.d.ts generated vendored Normal file
View File

@ -0,0 +1,6 @@
declare namespace Pinyin {
export function match(input: string, keys: string): [number, number] | boolean;
}
export as namespace Pinyin;
export = Pinyin;

63
src/node_modules/pinyin-match/package.json generated vendored Normal file
View File

@ -0,0 +1,63 @@
{
"_from": "pinyin-match",
"_id": "pinyin-match@1.1.1",
"_inBundle": false,
"_integrity": "sha512-stJVNJGHOEl3B3qXgeXJhWk3xfYQ3X7VaHBIIQHI2/9E1hNK9cmkigei0F+1l+uBM2XPVgxtmzg08AuY7n5Rnw==",
"_location": "/pinyin-match",
"_phantomChildren": {},
"_requested": {
"type": "tag",
"registry": true,
"raw": "pinyin-match",
"name": "pinyin-match",
"escapedName": "pinyin-match",
"rawSpec": "",
"saveSpec": null,
"fetchSpec": "latest"
},
"_requiredBy": [
"#USER",
"/"
],
"_resolved": "https://registry.npmjs.org/pinyin-match/-/pinyin-match-1.1.1.tgz",
"_shasum": "b13000800e4c0c2f22904ecf4a07423ddf9c1023",
"_spec": "pinyin-match",
"_where": "C:\\Users\\fofol\\OneDrive\\Configs\\uTools\\QuickerCommand\\src",
"author": {
"name": "774898896@qq.com"
},
"bugs": {
"url": "https://github.com/xmflswood/pinyin-match/issues"
},
"bundleDependencies": false,
"deprecated": false,
"description": "支持多音字,首字母缩写的拼音搜索引擎",
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-preset-env": "^1.7.0",
"mocha": "^5.2.0",
"webpack": "^4.16.1",
"webpack-cli": "^3.1.2"
},
"homepage": "https://github.com/xmflswood/pinyin-match#readme",
"keywords": [
"拼音",
"chinese",
"pinyin",
"match"
],
"license": "ISC",
"main": "dist/main.js",
"name": "pinyin-match",
"repository": {
"type": "git",
"url": "git+https://github.com/xmflswood/pinyin-match.git"
},
"scripts": {
"build": "webpack",
"test": "mocha"
},
"typings": "index.d.ts",
"version": "1.1.1"
}

169
src/node_modules/pinyin-match/src/index.js generated vendored Normal file
View File

@ -0,0 +1,169 @@
const dict = require('./pinyin_dict_notone').pinyin_dict_notone
const allPinyin = require('./pinyin_dict_notone').allPinyin
const notone = parseDict()
let storage = {}
function parseDict() {
let parseDict = {}
for (let i in dict) {
let temp = dict[i]
for (let j = 0, len = temp.length; j < len; j++) {
if (!parseDict[temp[j]]) {
parseDict[temp[j]] = i
} else {
parseDict[temp[j]] = parseDict[temp[j]] + ' ' + i
}
}
}
return parseDict
}
function getPinyin(cn) {
let result = []
for (let i = 0, len = cn.length; i < len; i ++) {
let temp = cn.charAt(i)
result.push(notone[temp] || temp)
}
return result
}
// 对输入拼音进行切分
function wordBreak(s) {
let result = []
let solutions = []
let len = s.length
let possible = []
for (let i = 0; i <= s.length; i++) {
possible.push(true)
}
getAllSolutions(0, s, result, solutions, possible)
return solutions
}
function getAllSolutions(start, s, result, solutions, possible) {
if (start === s.length) {
solutions.push(result.join(' '))
return
}
for (let i = start; i < s.length; i++) {
let piece = s.substring(start, i + 1)
let match = false
// 最后一个音特殊处理,不需要全部打完整
if (allPinyin.some(i => i.indexOf(piece) === 0) && !s[i + 1] && possible[i + 1]) {
if (piece.length === 1) {
result.push(piece)
} else {
let s = []
allPinyin.forEach(i => {
if (i.indexOf(piece) === 0) {
s.push(i)
}
})
result.push(s)
}
match = true
} else {
if (allPinyin.indexOf(piece) !== -1 && possible[i + 1]) {
result.push(piece)
match = true
}
}
if (match) {
let beforeChange = solutions.length
getAllSolutions(i + 1, s, result, solutions, possible)
if (solutions.length === beforeChange) {
possible[i + 1] = false
}
result.pop()
}
}
}
// 获取输入拼音的所有组合(切分 + 首字母)
function getFullKey(key) {
let result = []
wordBreak(key).forEach(i => {
let item = i.split(' ')
let last = item.length - 1
if (item[last].indexOf(',')) {
let keys = item[last].split(',')
keys.forEach(j => {
item.splice(last, 1, j)
result.push(JSON.parse(JSON.stringify(item)))
})
} else {
result.push(item)
}
})
if (result.length === 0 || (result[0].length !== key.length)) {
result.push(key.split(''))
}
// 缓存当前结果 避免重复计算
storage = {[key]: result}
return result
}
function point2point(test, key, last, extend) {
if (!test) return false
let a = test.split(' ')
a.forEach(i => {
if (i.length > 0 && extend) {
a.push(i.charAt(0))
}
})
if (!last) {
return a.indexOf(key) !== -1
}
return a.some((i) => i.indexOf(key) === 0)
}
function match(input, keys) {
input = input.toLowerCase()
keys = keys.replace(/\s+/g, '').toLowerCase()
let indexOf = input.indexOf(keys)
if (indexOf !== -1) {
return [indexOf, indexOf + keys.length - 1]
}
// 原文匹配(带空格)
let noPyIndex = getIndex(input.split(''), [keys.split('')], keys)
if (noPyIndex) return noPyIndex
// pinyin匹配
let py = getPinyin(input)
let fullString = storage[keys] || getFullKey(keys)
return getIndex(py, fullString, keys)
}
function getIndex(py, fullString, keys) {
for (let p = 0; p < py.length; p++) {
for (let k = 0; k < fullString.length; k++) {
let key = fullString[k]
let keyLength = key.length
let extend = (keyLength === keys.length)
let isMatch = true
let i = 0
let preSpaceNum = 0
let spaceNum = 0
if (keyLength <= py.length) {
for (; i < key.length; i++) {
if (i === 0 && py[p + i + preSpaceNum] === ' ') {
preSpaceNum += 1
i -= 1
} else {
if (py[p + i + spaceNum] === ' ') {
spaceNum += 1
i -= 1
} else {
if (!point2point(py[p + i + spaceNum], key[i], (py[p + i + 1] && key[i + 1]) ? false : true, extend)) {
isMatch = false
break
}
}
}
}
if (isMatch) {
return [p + preSpaceNum, spaceNum + p + i - 1]
}
}
}
}
return false
}
const pinyin = {
match
}
module.exports = pinyin

File diff suppressed because one or more lines are too long

50
src/node_modules/pinyin-match/test/index.test.js generated vendored Normal file
View File

@ -0,0 +1,50 @@
const assert = require('assert')
const PinyinMatch = require('../src/index')
let text = '123曾经沧海难为水除却巫山不是云'
describe('PinyinMatch', () => {
describe('#match', () => {
it('精准匹配', () => {
assert.deepEqual([1, 3], PinyinMatch.match(text, '23曾'))
})
it('首字母匹配', () => {
assert.deepEqual([3, 5], PinyinMatch.match(text, 'cjc'))
})
it('完整拼音匹配', () => {
assert.deepEqual([3, 6], PinyinMatch.match(text, 'cengjingcanghai'))
})
it('最后一个拼音不完整', () => {
assert.deepEqual([3, 6], PinyinMatch.match(text, 'cengjingcangha'))
})
it('分词功能', () => {
assert.equal(false, PinyinMatch.match(text, 'engjing'))
})
it('多音字', () => {
assert.deepEqual([3, 5], PinyinMatch.match(text, 'zengjingcang'))
})
it('忽略空格', () => {
assert.deepEqual([3, 5], PinyinMatch.match(text, 'zengji ng cang'))
})
it('超出', () => {
assert.deepEqual(false, PinyinMatch.match(text, 'zengji ng cangsdjfkl'))
})
it('忽略空格', () => {
assert.deepEqual([6, 12], PinyinMatch.match(' 我 爱你 中 国 ', 'nzg'))
})
it('忽略空格原文', () => {
assert.deepEqual([5, 8], PinyinMatch.match(' 我 爱你 中 国s ', '爱你中'))
})
it('忽略空格原文', () => {
assert.deepEqual([5, 13], PinyinMatch.match(' 我 爱你 中 国s ', '爱你中国s'))
})
it('超出原文', () => {
assert.deepEqual(false, PinyinMatch.match(' 我 爱你 中 国s ', '爱你中国sj'))
})
it('bao', () => {
assert.deepEqual([1, 1], PinyinMatch.match('淘宝', 'bao'))
})
it('issues 7', () => {
assert.deepEqual([0, 0], PinyinMatch.match('卡号打开', 'ka'))
})
})
})

29
src/node_modules/pinyin-match/webpack.config.js generated vendored Normal file
View File

@ -0,0 +1,29 @@
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: path.resolve(__dirname, 'src', 'index.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'main.js',
library: 'PinyinMatch',
globalObject: 'typeof self !== \'undefined\' ? self : this',
libraryTarget: 'umd'
},
module: {
rules: [{
test: /\.js$/,
use: [{
loader: 'babel-loader',
options: {
presets: [
'env'
]
}
}]
}]
},
plugins: [
new webpack.optimize.ModuleConcatenationPlugin()
]
}