投打數據轉換
- 直接用滑鼠複製官網投打數據並貼於本頁面裡的編輯區塊,即可轉換成 wiki 語法。
- 貼進編輯區塊的第一列必須是欄位名稱,第二列開始每一欄便是它們的對應值(順序正確即可,不必如範例般對齊)。
- 一列是一筆記錄,欄位間以空格隔開。
- 各官網使用的欄位名稱可能不同,例如投手犯規可能叫做 BK 或 BLK 或 BULK,遇上述情況需更改其名稱以符合此處欲產生的欄位(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] 建立頁面。先具備大致功能,之後實際應用時再邊用邊改,走一步算一步。