本館粉絲專頁

使用者:Digipunk/團隊及個人投打統計:轉換工具

分享此網頁到Facebook
分享此網頁到Plurk
分享此網頁到百度搜藏
分享此網頁到Twitter
分享此網頁到Del.icio.us
台灣棒球維基館
< 使用者:Digipunk
在2018年8月21日 (二) 17:07由Digipunk對話 | 貢獻所做的修訂版本

跳轉到: 導覽搜尋

目次

投打數據轉換

  • 直接用滑鼠複製官網投打數據並貼於本頁面裡的編輯區塊,即可轉換成 wiki 語法。
  • 貼進編輯區塊的第一列必須是欄位名稱,第二列開始每一欄便是它們的對應值(順序正確即可,不必如範例般對齊)。
  • 一列是一筆記錄,欄位間以空格隔開。
  • 各官網使用的欄位名稱可能不同,例如投手犯規可能叫做 BKBLKBULK,遇上述情況需更改其名稱以符合此處欲產生的欄位(BK)。
  • 僅轉換所需欄位,用不到的欄位皆自動忽略。
  • 由於根據空格判斷欄位順序,遇人名包括空格時需手動拿掉空格或以暫時填入其它字元(例如 _)再進行轉換。

團隊打擊數據

▼顯示範例
▼維基語法

團隊投球數據

▼顯示範例
▼維基語法

CSS & JS

DIV.dgpk-textarea {background:#FFD;font:normal 8pt/1.1 Consolas,monospace,'Courier New';padding:4px;border:1px solid black;white-space:pre-wrap} SPAN.dgpk-btn {display:inline-block;padding:1px 4px;border-radius:3px;border:1px solid black;background:#EEE;cursor:pointer;white-space:nowrap;margin:1px 0} SPAN.dgpk-btn:hover {background:#888;color:white} .checkboxes INPUT {margin:2px 0}
var xkeys = { 'b': ['TEAM', 'G/W', 'AB', 'R', 'RBI', 'H', 'HR', 'TB', 'SO', 'BB', 'SB/CS', 'OBP', 'SLG', 'AVG'], 'p': ['TEAM', 'IP', 'AB', 'R', 'ER', 'H', 'HR', 'SO', 'BB', 'HBP', 'WP', 'BK', 'ERA', 'FLD'] }; var xidx = { 'b': {}, 'p': {}, }; var xbest = { 'b': { 'desc' : ['G/W', 'AB', 'R', 'RBI', 'H', 'HR', 'TB', 'BB', 'SB/CS', 'OBP', 'SLG', 'AVG'], 'asc' : ['SO'] }, 'p': { 'desc' : ['SO', 'FLD'], 'asc' : ['R', 'ER', 'H', 'HR', 'BB', 'HBP', 'WP', 'BK', 'ERA'] } }; for (var i = 0; i < 2; i++) { var x = i == 0 ? 'b' : 'p'; for (var z = 0, zz = xkeys[x].length; z < zz; z++) { var key = xkeys[x][z]; xidx[x][key] = -1; } document.getElementById(x + 'data').setAttribute('contenteditable', true); document.getElementById(x + 'dscr').innerHTML = 'TEAM: | ' + xkeys[x].slice(1).join(' || '); document.getElementById('c-' + x + 'best').innerHTML = '<TABLE CELLSPACING="0" CELLPADDING="0"><TR><TD><INPUT TYPE="checkbox" ID="' + x + 'best" checked></TD><TD><LABEL FOR="' + x + 'best">標示最佳值</TD></TR></TABLE></LABEL>'; // event handlers document.getElementById(x + 'exam').onclick = dgpk_exam; document.getElementById(x + 'conv').onclick = dgpk_conv; document.getElementById(x + 'data').onpaste = dgpk_pastedata; } //-------------------------- // functions //-------------------------- function dgpk_pastedata(ev) { var txt = (ev.originalEvent || ev).clipboardData.getData('text/html').trim(); txt = txt.replace(/<(\/?(html|body)|!--(Start|End)Fragment--)>/ig, ''); if (txt.indexOf('<') < 0 || txt.indexOf('>') < 0) { // plain text return true; } ev.preventDefault(); txt = txt.replace(/<\/tr>/ig, '~~~~').replace(/<\/t(h|d)>/ig, ' ').replace(/<\/?[^>]+>/g, '').replace(/\r?\n/g, '').replace(/(\s*~~~~\s*)+/g, '\n'); window.document.execCommand('insertText', false, txt); } function dgpk_conv(event) { var o = event.srcElement || event.target; var x = o.id.substr(0, 1); var num_cols = xkeys[x].length; // normalize document.getElementById(x + 'data').innerText = document.getElementById(x + 'data').innerText.replace(/\r/g, '').replace(/\s*\n+\s*/g, '\n').replace(/TPE/g, 'ROC').trim().toUpperCase().replace(/(\s+)(BULK|BLK)(\s+)/g, '$1BK$3').replace(/(\s+)HP(\s+)/g, '$1HBP$2').replace(/(\s+)SLG%(\s+)/g, '$1SLG$2').replace(/(\s+)B\/AVG%(\s+)/g, '$1AVG$2').replace(/(\s+)FLD%(\s+)/g, '$1FLD$2').replace(/(\s+)OB%(\s+)/g, '$1OBP$2').replace(/\s*\/\s*/g, '/'); // explode lines var LINES = document.getElementById(x + 'data').innerText.split('\n'); if (LINES.length < 2 || LINES[0] == '' || LINES[1] == '') return false; // build the index var colnames = LINES[0].split(/\s+/); for (var col in xidx[x]) { var COL = col.split('/'); var IDX = []; for (var z = 0, zz = COL.length; z < zz; z++) { IDX[z] = -1; for (var j = 0, jj = colnames.length; j < jj; j++) { if (COL[z] == colnames[j]) { IDX[z] = j; break; } } } xidx[x][col] = IDX.join('/'); } // collect the values var total_line = -1; var RESULT = []; for (var i = 1, ii = LINES.length; i < ii; i++) { var colval = LINES[i].split(/\s+/); var result = []; if (colval[0].toUpperCase() == 'TOTALS' || colval[1].toUpperCase() == 'TOTALS') { total_line = i; } for (var col in xidx[x]) { var IDX = xidx[x][col].split('/'); var VAL = []; for (var z = 0, zz = IDX.length; z < zz; z++) { var idx = IDX[z]; if (idx < 0) { VAL.push('-'); } else { if (col == 'ERA' || col == 'IP') { VAL.push(colval[idx] || '-'); } else { VAL.push((colval[idx] || '-').replace(/^0\./, '.')); } } } result.push(VAL.join('/')); } RESULT.push(result); } //------------------ // post process //------------------ var idx, key, val; var BEST_VAL = {}; var BEST_CNT = {}; if (document.getElementById(x + 'best').checked) { // phase 1 - find the best values for (var z = 0; z < num_cols; z++) { key = xkeys[x][z]; if (xbest[x].desc.indexOf(key) >= 0) { for (var i = 0, ii = RESULT.length; i < ii; i++) { if (i == total_line - 1) { continue; } val = RESULT[i][z].split('/')[0]; if (!isNaN(val)) { if (BEST_VAL[key] == null || parseFloat(val) > parseFloat(BEST_VAL[key])) { BEST_VAL[key] = val; BEST_CNT[key] = 1; } else if (parseFloat(val) == parseFloat(BEST_VAL[key])) { BEST_VAL[key] = val; BEST_CNT[key]++; } } } } else if (xbest[x].asc.indexOf(key) >= 0) { for (var i = 0, ii = RESULT.length; i < ii; i++) { if (RESULT[i][0] == 'Totals' || RESULT[i][1] == 'Totals') continue; val = RESULT[i][z].split('/')[0]; if (!isNaN(val)) { if (BEST_VAL[key] == null || parseFloat(val) < parseFloat(BEST_VAL[key])) { BEST_VAL[key] = val; BEST_CNT[key] = 1; } else if (parseFloat(val) == parseFloat(BEST_VAL[key])) { BEST_VAL[key] = val; BEST_CNT[key]++; } } } } } // phase 2 - class for best values and deal with the hidden values for SB/CS var cls = null; for (var z = 0; z < num_cols; z++) { key = xkeys[x][z]; for (var i = 0, ii = RESULT.length; i < ii; i++) { if (RESULT[i][0] == 'Totals' || RESULT[i][1] == 'Totals') continue; cls = ''; val = RESULT[i][z].split('/')[0]; if (!isNaN(val)) { if (parseFloat(val) == parseFloat(BEST_VAL[key])) { if (BEST_CNT[key] > 1) { cls = 'CLASS="best2"| '; } else { cls = 'CLASS="best"| '; } } if (key == 'SB/CS') { val = '<S>' + (parseInt(val) < 10 ? '0' : '') + val + '</S>'; RESULT[i][z] = val + RESULT[i][z]; } RESULT[i][z] = cls + RESULT[i][z]; } } } } else { // !checked for (var z = 0; z < num_cols; z++) { key = xkeys[x][z]; if (key == 'SB/CS') { for (var i = 0, ii = RESULT.length; i < ii; i++) { if (RESULT[i][0] == 'Totals' || RESULT[i][1] == 'Totals') continue; val = RESULT[i][z].split('/')[0]; if (!isNaN(val)) { val = '<S>' + (parseInt(val) < 10 ? '0' : '') + val + '</S>'; RESULT[i][z] = val + RESULT[i][z]; } } } } } // output result = ''; for (var i = 0, ii = RESULT.length; i < ii; i++) { if (xidx[x].TEAM >= 0) { result += RESULT[i][0] == '-' ? '' : '{{TeamX|' + RESULT[i][0] + '|X|pr=4}}'; result += '\n'; } result += (i == total_line - 1 ? '!' : '|') + ' '; result += RESULT[i].slice(1).join(' || '); result += '\n'; } result = result.replace(/\| CLASS="/g, '|CLASS="'); document.getElementById(x + 'wiki').innerText = result; return false; } function dgpk_exam(event) { var o = event.srcElement || event.target; var x = o.id.substr(0, 1); var exam; if (x == 'b') { exam = 'Player Team AB R H 2B 3B HR RBI TB AVG SLG OBP OPS BB HBP SO GDP SF SH SB CS\n' + '- USA 303 61 83 15 5 6 50 126 .274 .416 .377 .793 47 4 81 1 1 1 27 3\n' + '- KOR 290 68 73 15 3 6 64 112 .252 .386 .372 .758 53 4 64 3 2 9 12 7\n' + '- JPN 299 52 75 13 0 3 41 97 .251 .324 .350 .674 43 6 69 5 6 9 16 6\n' + '- CAN 295 56 68 15 3 9 51 116 .231 .393 .367 .760 58 8 110 8 4 1 14 3\n' + '- AUS 260 39 64 10 4 2 31 88 .246 .338 .350 .688 37 6 63 3 3 3 12 3\n' + '- CUB 261 35 68 8 3 0 28 82 .261 .314 .340 .654 28 5 54 4 3 4 5 3\n' + '- TPE 254 44 70 7 4 1 37 88 .276 .346 .409 .755 50 10 41 8 4 7 8 9\n' + '- NED 248 39 54 13 1 2 29 75 .218 .302 .340 .642 41 5 75 4 0 3 4 0\n' + '- ITA 246 26 50 7 2 3 23 70 .203 .285 .303 .588 29 7 72 2 2 2 9 6\n' + '- NCA 272 44 77 7 4 3 39 101 .283 .371 .367 .738 26 12 56 10 3 1 8 2\n' + '- MEX 237 25 53 15 1 2 22 76 .224 .321 .311 .632 25 6 55 5 2 7 9 4\n' + '- RSA 195 9 32 4 0 0 6 36 .164 .185 .249 .434 20 2 82 2 0 7 4 5\n' + 'Totals - 3160 498 767 129 30 37 421 1067 .243 .338 .349 .687 457 75 822 55 30 54 128 51\n'; } else { exam = 'Player Team W L ERA APP GS SV CG SHO IP H R ER BB SO 2B 3B HR AB B/AVG WP HBP BK SFA SHA GO FO\n' + '- USA 9 0 0.35 26 9 1 1 1 77.0 34 5 3 29 101 8 0 0 251 .135 3 2 0 1 3 82 35\n' + '- KOR 7 2 3.30 29 9 3 0 0 79.0 70 36 29 28 100 13 1 4 306 .229 2 6 0 3 1 72 56\n' + '- JPN 6 3 1.69 26 9 1 0 0 80.0 47 24 15 48 119 9 1 1 276 .170 11 4 2 1 7 65 45\n' + '- CAN 5 4 4.33 26 9 3 0 0 79.0 72 50 38 53 63 7 1 6 300 .240 9 5 0 3 11 88 74\n' + '- AUS 4 4 2.67 25 8 1 2 1 67.1 74 32 20 23 56 13 0 5 268 .276 6 2 1 2 6 87 50\n' + '- CUB 3 5 4.66 21 8 1 0 0 65.2 72 42 34 28 70 10 3 0 262 .275 4 4 2 2 2 67 48\n' + '- TPE 6 2 2.96 24 8 2 0 0 73.0 51 26 24 35 84 10 2 7 261 .195 4 4 0 2 2 63 62\n' + '- NED 4 4 2.87 21 8 1 1 1 62.2 61 28 20 21 55 11 3 2 242 .252 4 3 0 0 5 54 65\n' + '- ITA 2 6 5.75 22 7 1 1 0 61.0 72 50 39 38 40 14 6 0 249 .289 10 6 0 4 8 74 60\n' + '- NCA 2 6 7.48 22 8 0 0 0 65.0 61 65 54 53 52 11 6 5 250 .244 9 7 5 3 5 79 55\n' + '- MEX 2 6 5.43 24 8 0 0 0 64.2 66 49 39 50 50 5 2 1 246 .268 15 15 0 4 5 72 57\n' + '- RSA 0 8 10.59 19 8 0 2 0 52.2 86 88 62 43 32 18 5 5 245 .351 17 6 6 5 0 52 66\n' + 'Totals - 50 50 4.20 285 99 14 7 3 808.1 766 495 377 449 822 129 30 36 3156 .243 94 64 16 30 55 855 673\n'; } document.getElementById(x + 'data').innerHTML = exam; return false; }

開發記錄

  • [2018-08-14] 建立頁面。先具備大致功能,之後實際應用時再邊用邊改,走一步算一步。