1 |
<html> |
2 |
<head> |
3 |
<title>JavaScript sort which honors static locale settings</title> |
4 |
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> |
5 |
</head> |
6 |
<body bgcolor="white"> |
7 |
|
8 |
<p> |
9 |
This is a demo of JavaScript sort which honors static locale LC_COLLATE |
10 |
settings, embedded in one JavaScript variable which can be created from |
11 |
local system using attached perl script. |
12 |
</p><p> |
13 |
Script by Dobrica Pavlinu¹iæ, <dpavlin@rot13.org> 2004-10-24 |
14 |
</p> |
15 |
|
16 |
<tt> |
17 |
|
18 |
<script type="text/javascript"> |
19 |
|
20 |
// locale in which to sort (basically a alphabet in correct dictionary sort order) |
21 |
var _lc_locale = '_0123456789aAáÁãÃâÂäı¡bBcCçÇèÈæÆdDïÏðÐeEéÉìÌëËêÊfFgGhHiIíÍîÎjJkKlLåŵ¥³£mMnNñÑòÒoOóÓôÔöÖõÕpPqQrRàÀøØsS¶¦ºªß¹©tT»«þÞuUúÚùÙüÜûÛvVwWxXyYýÝzZ¼¬¿¯¾®'; |
22 |
|
23 |
// produce equivavlent of alphabet in native JavaScript sort order |
24 |
var _lc_native = _lc_locale.split("").sort().join(""); |
25 |
|
26 |
function lc_debug(msg) { |
27 |
// comment out to disable debug |
28 |
//return; |
29 |
document.write('<div style="color: gray; font-size: small;">'+msg+'</div>'); |
30 |
} |
31 |
|
32 |
// create character remapping array |
33 |
var _lc_l2n_arr = new Array(); |
34 |
var r = 0; |
35 |
for (var i=0; i < _lc_locale.length; i++) { |
36 |
if (_lc_locale.charAt(i) != _lc_native.charAt(i)) { |
37 |
_lc_l2n_arr[_lc_locale.charAt(i)] = _lc_native.charAt(i); |
38 |
r++; |
39 |
} |
40 |
} |
41 |
|
42 |
lc_debug( |
43 |
"_lc_native:"+_lc_native+"<br>"+ |
44 |
"_lc_locale:"+_lc_locale+"<br>"+ |
45 |
"remapped "+r+" characters from table of "+_lc_locale.length+"/"+_lc_native.length+" locale/native characters<br>" |
46 |
); |
47 |
|
48 |
// comment out following line to disable caching of locale terms |
49 |
var _lc_cache = new Array(); |
50 |
|
51 |
// convert string to correct sort order according to locale |
52 |
function _lc(str) { |
53 |
if (_lc_cache && _lc_cache[str]) { |
54 |
return _lc_cache[str]; |
55 |
} else { |
56 |
var out = ''; |
57 |
for (var i=0; i <= str.length; i++) { |
58 |
var c = str.charAt(i); |
59 |
if (_lc_l2n_arr[c]) { |
60 |
out += _lc_l2n_arr[c]; |
61 |
} else { |
62 |
out += c; |
63 |
} |
64 |
} |
65 |
if (_lc_cache) _lc_cache[str] = out; |
66 |
return out; |
67 |
} |
68 |
} |
69 |
|
70 |
// sort function with locale support |
71 |
function _lc_sort(a,b) { |
72 |
var a_l = _lc(a); |
73 |
var b_l = _lc(b); |
74 |
|
75 |
lc_debug(a+' '+( a_l < b_l ? '<' : ( a_l == b_l ? '==' : '>' ) )+' '+b+' [ '+a_l+' '+b_l+' ]'); |
76 |
|
77 |
if (a_l < b_l) { |
78 |
return -1; |
79 |
} else if (a_l == b_l) { |
80 |
return 0; |
81 |
} else { |
82 |
return 1; |
83 |
} |
84 |
} |
85 |
|
86 |
// test string array of Croatian words |
87 |
var test = [ |
88 |
'abrakadabra', |
89 |
'èevap', |
90 |
'ðak', |
91 |
'd¾amija', |
92 |
'æuk', |
93 |
'pero', |
94 |
'¾aba', |
95 |
'Ðakovo', |
96 |
'Zagreb' |
97 |
]; |
98 |
|
99 |
// create some output |
100 |
document.write( |
101 |
"<br>original: ",test.join(" * "), |
102 |
"<br>native: ",test.sort().join(" * "), |
103 |
"<br>locale: ",test.sort(_lc_sort).join(" * ") |
104 |
); |
105 |
|
106 |
</script> |
107 |
|
108 |
</tt> |
109 |
|
110 |
<br> |
111 |
<p>Sorting finished.</p> |
112 |
|
113 |
</body> |
114 |
</html> |