1/* âââââââââââââââââââââââââââââââââââââââââââââââââââ 2 stat-format.js â íµê³ í¬ë§· í¬í¼ ë¨ì¼ ì¶ì² 3 4 ì 본 ì ì: application/config/stat_defs.php 5 ë¡ë© ìì¹: data.js ì§í (ë¤ë¥¸ 모ë JS íì¼ì´ ìì¡´) 6 7 기존 fmtIp ê° game.js / render.js / beeswarm.js 3 ê³³ì ì¤ë³µ 8 ì ìëì´ ìë 문ì 를 í´ì. window.VBStat.* ë¤ìì¤íì´ì¤ + íì 9 í¸íì ìí window.fmtIp / window.fmtRate2 alias ëì ë ¸ì¶. 10 âââââââââââââââââââââââââââââââââââââââââââââââââââ */ 11(function (root) { 12 'use strict'; 13 14 // ââ ì´ë(IP) ââââââââââââââââââââââââââââââââââââââ 15 // outs ì ìê° ì 본. í기 3 ì¢ ì 모ë outs ëë KBO í기 string("5.1") 16 // ì ë ¥ì¼ë¡ ë°ìì ë¶ì/KBO/ìì§ì¼ë¡ ë³ííë¤. 17 function ipInputToOuts(v) { 18 if (v == null || v === '') return null; 19 if (typeof v === 'number' && isFinite(v)) { 20 // ìì§ ëë KBO í기 모ë *3 í round ê° ì í 21 // - "5.0" â 5.0 â 15 (5 * 3) 22 // - "5.1" â 5.1 â 15.3 â 15 (ì¤ë¥! KBO í기를 ìì§ì¼ë¡ ë°ì¼ë©´ ë¶ì¼ì¹) 23 // ë°ë¼ì number ë ìì§(ì´ë 1.667 ê°ì raw)ì¼ ëë§ ì¬ì©. KBO í기ë ë°ëì string. 24 return Math.round(v * 3); 25 } 26 var s = String(v).trim(); 27 if (s === '' || s === '-' || s === 'â') return null; 28 // ë¶ì í기 "5 1/3" ê°ì ì ë ¥ 29 var m = s.match(/^(\d+)\s+(\d)\/3$/); 30 if (m) return parseInt(m[1], 10) * 3 + parseInt(m[2], 10); 31 // KBO í기 "5.1" / "5.2" / "5" 32 var dot = s.indexOf('.'); 33 if (dot < 0) { 34 var n = parseInt(s, 10); 35 return isNaN(n) ? null : n * 3; 36 } 37 var full = parseInt(s.substring(0, dot), 10); 38 var rem = s.charAt(dot + 1); 39 if (isNaN(full)) return null; 40 if (rem === '0') return full * 3; 41 if (rem === '1') return full * 3 + 1; 42 if (rem === '2') return full * 3 + 2; 43 // "5.5" ê°ì ì§ì§ ìì§ì number ë¡ ë¤ì´ìì¼ í¨. ì¬ê¸° ëë¬íë©´ fallback. 44 var f = parseFloat(s); 45 return isNaN(f) ? null : Math.round(f * 3); 46 } 47 48 // outs(ì ì) â KBO í기 "5.1" 49 function ipKbo(outs) { 50 if (outs == null || outs === '') return '-'; 51 var n = parseInt(outs, 10); 52 if (isNaN(n)) return '-'; 53 var full = Math.floor(n / 3); 54 var rem = n % 3; 55 return rem === 0 ? String(full) : (full + '.' + rem); 56 } 57 58 // outs(ì ì) â HTML ë¶ì "5<sup>1</sup>/<sub>3</sub>" 59 function ipFraction(outs) { 60 if (outs == null || outs === '') return '-'; 61 var n = parseInt(outs, 10); 62 if (isNaN(n)) return '-'; 63 var full = Math.floor(n / 3); 64 var rem = n % 3; 65 if (rem === 0) return String(full); 66 var frac = rem === 1 67 ? '<sup>1</sup>/<sub>3</sub>' 68 : '<sup>2</sup>/<sub>3</sub>'; 69 return (full === 0 ? '' : full) + frac; 70 } 71 72 // outs(ì ì) â ì ëì½ë ë¶ì "5â " (SVG/text ì©) 73 function ipFractionText(outs) { 74 if (outs == null || outs === '') return '-'; 75 var n = parseInt(outs, 10); 76 if (isNaN(n)) return '-'; 77 var full = Math.floor(n / 3); 78 var rem = n % 3; 79 if (rem === 0) return String(full); 80 var frac = rem === 1 ? 'â ' : 'â '; 81 return (full === 0 ? '' : full) + frac; 82 } 83 84 // outs(ì ì) â ìì§ 1.667 íí (ì ë ¬Â·ë¹êµì©) 85 function ipDecimal(outs) { 86 if (outs == null || outs === '') return null; 87 var n = parseInt(outs, 10); 88 if (isNaN(n)) return null; 89 return Math.round(n / 3 * 1000) / 1000; 90 } 91 92 // ââ í¸íì©: 기존 fmtIp("5.1") ìê·¸ëì² ê·¸ëë¡ ë°ì ââ 93 // 기존 game.js / render.js / beeswarm.js ì fmtIp ê° 94 // `String("5.1")` ëë `Number(5.1)` ë± ë¤ìí ì ë ¥ì ë°ìëë°, 95 // 모ë outs ë¡ íì° í ë¶ì HTML ë°í. 96 function fmtIp(v) { 97 if (v == null) return '-'; 98 var outs; 99 if (typeof v === 'number') { 100 // beeswarm ì ipNum ì²ë¼ ìì§ ì´ë(36.667) ì¼ë¡ ë¤ì´ì¤ë ì¼ì´ì¤ 101 outs = Math.round(v * 3); 102 } else { 103 outs = ipInputToOuts(v); 104 } 105 if (outs == null) return String(v); 106 return ipFraction(outs); 107 } 108 109 // ââ ë¹ì¨ í¬ë§· âââââââââââââââââââââââââââââââââââââ 110 function rate2(v) { 111 if (v == null || v === '' || v === '-') return '-'; 112 var n = parseFloat(v); 113 return isNaN(n) ? String(v) : n.toFixed(2); 114 } 115 116 function rate3(v) { 117 if (v == null || v === '' || v === '-') return '-'; 118 var n = parseFloat(v); 119 return isNaN(n) ? String(v) : n.toFixed(3); 120 } 121 122 function pct1(v) { 123 if (v == null || v === '' || v === '-') return '-'; 124 var n = parseFloat(v); 125 return isNaN(n) ? String(v) : n.toFixed(1) + '%'; 126 } 127 128 // 0.391 â ".391", 1.049 â "1.049" 129 function avg3(v) { 130 if (v == null || v === '' || v === '-') return '-'; 131 var n = parseFloat(v); 132 if (isNaN(n)) return String(v); 133 var s = n.toFixed(3); 134 return Math.abs(n) < 1
135 ? s.replace(/^-?0/, function (m) { return m === '-0' ? '-' : ''; }) 136 : s; 137 } 138 139 function intFmt(v) { 140 if (v == null || v === '' || v === '-') return '-'; 141 var n = parseFloat(v); 142 return isNaN(n) ? String(v) : String(Math.round(n)); 143 } 144 145 // ââ outs ê¸°ë° ìì í©ì° (parseFloat("5.1") ì¬ê³ ì°¨ë¨) ââ 146 // rows: ê° row ê° .outs ëë .ip íë를 ê°ì§ ë°°ì´ 147 function sumIpOuts(rows, outsKey) { 148 outsKey = outsKey || 'outs'; 149 var total = 0; 150 for (var i = 0; i < rows.length; i++) { 151 var r = rows[i]; 152 if (r == null) continue; 153 var o = parseInt(r[outsKey], 10); 154 if (!isNaN(o)) { 155 total += o; 156 continue; 157 } 158 // outs íë ìì¼ë©´ ip 문ìì´ë¡ í´ë°± 159 var fromIp = ipInputToOuts(r.ip); 160 if (fromIp != null) total += fromIp; 161 } 162 return total; 163 } 164 165 // ââ ë ¸ì¶ ââââââââââââââââââââââââââââââââââââââââââ 166 var VBStat = { 167 // IP 168 ipInputToOuts: ipInputToOuts, 169 ipKbo: ipKbo, 170 ipFraction: ipFraction, 171 ipFractionText: ipFractionText, 172 ipDecimal: ipDecimal, 173 fmtIp: fmtIp, // í¸íì© ë³ì¹ 174 sumIpOuts: sumIpOuts, 175 // ë¹ì¨ 176 rate2: rate2, 177 rate3: rate3, 178 pct1: pct1, 179 avg3: avg3, 180 intFmt: intFmt, 181 fmtRate2: rate2 // í¸íì© ë³ì¹ 182 }; 183 184 root.VBStat = VBStat; 185 186 // 기존 ì½ë íì í¸í â game.js / render.js / beeswarm.js ì 187 // ìì²´ fmtIp ì ì를 ì ê±°íê³ alias ë§ ë¨ê¸¸ ì ìëë¡ ë¯¸ë¦¬ ë ¸ì¶. 188 if (typeof root.fmtIp !== 'function') root.fmtIp = fmtIp; 189 if (typeof root.fmtIpText !== 'function') root.fmtIpText = function (v) { 190 var outs = (typeof v === 'number') ? Math.round(v * 3) : ipInputToOuts(v); 191 return outs == null ? String(v) : ipFractionText(outs); 192 }; 193 if (typeof root.fmtRate2 !== 'function') root.fmtRate2 = rate2; 194})(typeof window !== 'undefined' ? window : this);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.