Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions examples/search.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src='http://code.jquery.com/jquery-latest.min.js'></script>
<script type="text/javascript" src='../hangul.js'></script>
<script type="text/javascript">
function doDisassemble(){
var r = Hangul.disassemble($('#hangul_text').val().trim(), false);
$('#hangul_disassembled').text(r.join(''));
return r;
}
function doDisassembleCho(){
var r = Hangul.disassemble($('#hangul_text').val().trim(), true).map(function(t){return t[0];});
$('#hangul_disassembled').text(r.join(''));
return r;
}
function doSearch(){
var t = $('#hangul_text').val();
var r1 = Hangul.rangeSearch(t, $('#hangul_search').val(), $(":input:radio[name=hangul_searchCho]:checked").val() == 'on' );
var r2 = r1.map(function(a){return t.substr(a[0], a[1]-a[0]+1);})
$('#hangul_searched').text(r2);
return r1;
}
</script>
</head>
<body>
<div>
<textarea id="hangul_text" rows="10" cols="100">세종어제 훈민정음나라 말이 중국과 달라문자와는 서로 맞지 아니해서이런 까닭으로 어리석은 백성이 이르고자 할 바 있어도마침내 제 뜻을 능히 펴지 못한 사람이 많으니라내 이를 위하여 가엾이 여겨새로 스물여덟 자를 만드노니사람마다 하여 쉬이 익혀 날로 쓰며 편안케 하고자 할 따름이니라</textarea>
<a href="javascript:doDisassemble()">disassemble</a>
<a href="javascript:doDisassembleCho()">초성</a>
<div id="hangul_disassembled"></div>
</div>
<div>
<input id="hangul_search" type="text" value="ㅂㅅ"/>
초성검색 :
<input name="hangul_searchCho" type="radio" value="on" checked/>On
<input name="hangul_searchCho" type="radio" value="off" />Off
<br/>
<a href="javascript:doSearch()">search</a>
<div id="hangul_searched"></div>
</div>
</body>
</html>
111 changes: 92 additions & 19 deletions hangul.js
Original file line number Diff line number Diff line change
Expand Up @@ -377,24 +377,37 @@
return result.join('');
};

var search = function(a, b){
var _search = function(a, b){
var ad = disassemble(a).join(''),
bd = disassemble(b).join('')
;

return ad.indexOf(bd);
};

var rangeSearch = function(haystack, needle){
var _searchCho = function(a, b){
var adc = disassemble(a, true).map(function(t){return t[0]}).join(''),
bd = disassemble(b).join('')
;
return adc.indexOf(bd);
}

var search = function(a, b, cho){
if(cho && _checkString(_isConsonantB, b, 'ALL')){
return _searchCho(a,b);
} else {
return _search(a,b);
}
};

var _rangeSearch = function(haystack, needle){
var hex = disassemble(haystack).join(''),
nex = disassemble(needle).join(''),
grouped = disassemble(haystack, true),
re = new RegExp(nex, 'gi'),
indices = [],
result;

if(!needle.length) return [];

while((result = re.exec(hex))) {
indices.push(result.index);
}
Expand All @@ -417,14 +430,42 @@
return [findStart(i), findEnd(i)];
});
};

var _rangeSearchCho = function(a, b){
var adc = disassemble(a, true).map(function(t){return t[0]}).join(''),
bd = disassemble(b).join(''),
re = new RegExp(bd, 'gi'),
indices = [],
result;
while((result = re.exec(adc))) {
indices.push(result.index);
}
return indices.map(function(i) {
return [i, i+bd.length-1]
});
};

function Searcher(string) {
var rangeSearch = function(haystack, needle, cho){
if(!needle.length) return [];
if(cho && _checkString(_isConsonantB, needle, 'ALL')){
return _rangeSearchCho(haystack,needle);
} else {
return _rangeSearch(haystack,needle);
}
};

function Searcher(string, cho) {
this.string = string;
this.disassembled = disassemble(string).join('');
this.cho = cho && _checkString(_isConsonantB, string, 'ALL');
}

Searcher.prototype.search = function(string) {
return disassemble(string).join('').indexOf(this.disassembled);
if(this.cho){
return disassemble(string, true).map(function(t){return t[0]}).join('').indexOf(this.disassembled);
} else {
return disassemble(string).join('').indexOf(this.disassembled);
}
};

var endsWithConsonant = function (string) {
Expand All @@ -446,6 +487,38 @@
return false;
};

var _option = function(o){
return (typeof o === 'string')?o.replace(/[-_ ]/,'').toUpperCase():o;
};

var _checkStringAll = function(f, c){
for(var i=0; i<c.length; i++){
if(!f(c.charCodeAt(i))) return false;
}
return true;
};

var _checkStringOneOrMore = function(f, c){
for(var i=0; i<c.length; i++){
if(f(c.charCodeAt(i))) return true;
}
return false;
}

var _checkString = function(f, c, o){
o = _option(o);
if(o == 'ALL'){
return _checkStringAll(f, c);
} else if(o == 'ONE'){
return _checkStringOneOrMore(f, c);
}
return f(c.charCodeAt(0));
};

var _isConsonantB = function(c){
return (typeof _isConsonant(c)) !== 'undefined';
}

var hangul = {
disassemble: disassemble,
d: disassemble, // alias for disassemble
Expand All @@ -455,35 +528,35 @@
rangeSearch: rangeSearch,
Searcher: Searcher,
endsWithConsonant: endsWithConsonant,
isHangul: function(c){
isHangul: function(c, o){
if (typeof c === 'string')
c = c.charCodeAt(0);
return _checkString(_isHangul, c, o)
return _isHangul(c);
},
isComplete: function(c){
isComplete: function(c, o){
if (typeof c === 'string')
c = c.charCodeAt(0);
return _checkString(_isHangul, c, o)
return _isHangul(c);
},
isConsonant: function(c){
isConsonant: function(c, o){
if (typeof c === 'string')
c = c.charCodeAt(0);
return (typeof _isConsonant(c)) !== 'undefined';
return _checkString(_isConsonantB, c, o);
return _isConsonantB(c);
},
isVowel: function(c){
isVowel: function(c, o){
if (typeof c === 'string')
c = c.charCodeAt(0);
return _checkString(_isJung, c, o);
return _isJung(c);
},
isCho: function(c){
isCho: function(c, o){
if (typeof c === 'string')
c = c.charCodeAt(0);
return _checkString(_isCho, c, o);
return _isCho(c);

},
isJong: function(c){
isJong: function(c, o){
if (typeof c === 'string')
c = c.charCodeAt(0);
return _checkString(_isJong, c, o);
return _isJong(c);
}
};
Expand Down