├── README.md ├── inject.css ├── inject.js └── manifest.json /README.md: -------------------------------------------------------------------------------- 1 | # BOJ Stack을 정리하자 2 | 문제들이 너무 많아서 고민이었나요? 지저분한 문제들이 골칫덩어리였나요? 이제 그룹을 만들어 정리하세요! 3 | 4 | ## 설치법 5 | 아직 개발 중이기 때문에, 문제를 분류에 넣는 작업은 `inject.js`에서 해 주셔야 합니다. 6 | 7 | 압축을 해제하시고, `inject.js`의 주석을 참고하여, 비슷한 방식으로 문제 리스트를 만들어 주세요. 8 | 9 | 그 다음, 주소창에 `chrome://extensions`를 입력한 후, **압축해제된 확장 프로그램 로드**를 누릅니다. 10 | 11 | 수정한 `inject.js`가 있는 폴더를 클릭하면 설치가 완료됩니다. 12 | 13 | ## 문제를 추가/수정하고 싶은 경우 14 | 15 | `inject.js`의 해당 부분을 수정한 후, `chrome://extensions`에 있는 **Tidy up BOJ Stack**을 찾아 아래쪽에 있는 동그란 화살표를 누르세요. 16 | -------------------------------------------------------------------------------- /inject.css: -------------------------------------------------------------------------------- 1 | .kipa-heading { 2 | cursor: pointer; 3 | font-size: 15px; 4 | font-weight: bold; 5 | border: 3px solid #ccc; 6 | border-radius: 10px; 7 | background-color: #eee; 8 | padding: 5px 15px; 9 | margin: 3px; 10 | text-align: center; 11 | } 12 | 13 | .kipa-heading:hover { 14 | background-color: white; 15 | } 16 | 17 | div.kipa-tab-bar { 18 | display: flex; 19 | flex-direction: row; 20 | margin: 0 0 2px 0; 21 | flex-wrap: wrap; 22 | } 23 | -------------------------------------------------------------------------------- /inject.js: -------------------------------------------------------------------------------- 1 | // Top bar is made in order as of 'order' array 2 | // Problems are inserted in order as of original order in BOJ Stack 3 | // Unspecified problems are automatically classified as belonging to 'Unspecified' category 4 | // Usage Example: if 1000 and 1008 belong to Contest A and 1002 through 1007 belong to Contest B 5 | /* 6 | // If you swap this two, then 'Contest B' will appear earlier than 'Contest A' in top bar 7 | var order = ['Contest A', 'Contest B']; 8 | var library = { 9 | 'Contest A': [1000, 1008], 10 | 'Contest B': ['1002-1007'], 11 | }; 12 | */ 13 | 14 | var order = []; 15 | var library = {}; 16 | 17 | function new_table() { 18 | var elem = document.createElement('table'); 19 | elem.classList.add('table'); 20 | elem.classList.add('u-table--v3'); 21 | elem.classList.add('g-bg-white'); 22 | elem.classList.add('g-color-black'); 23 | elem.classList.add('table-striped'); 24 | 25 | // thead 26 | var thead = document.createElement('thead'); 27 | var head_list = [ 28 | '문제 번호', '제목', '시간', '메모리', '서브태스크', '예제', '데이터', '테스트', '공유', '편집', 'BOJ' 29 | ]; 30 | for (var i in head_list) { 31 | var subelem = document.createElement('th'); 32 | subelem.innerHTML = head_list[i]; 33 | thead.appendChild(subelem); 34 | } 35 | elem.appendChild(thead); 36 | elem.appendChild(document.createElement('tbody')); 37 | return elem; 38 | } 39 | order.push('Unspecified'); 40 | 41 | var elem = document.getElementsByTagName('table')[0].getElementsByTagName('tbody')[0]; 42 | var subelems = elem.getElementsByTagName('tr'); 43 | 44 | var prob = {}, tables = {}; 45 | for (var ki in order) { 46 | var key = order[ki]; 47 | tables[key] = new_table(); 48 | for (var i in library[key]) { 49 | if (typeof library[key][i] === 'number') { 50 | prob[library[key][i]] = key; 51 | } else { 52 | var t = library[key][i].split('-'); 53 | var ed = +t[1]; 54 | for (var i=+t[0]; i<=ed; ++i) { 55 | prob[i] = key; 56 | } 57 | } 58 | } 59 | } 60 | tables['Unspecified'] = new_table(); 61 | 62 | while (subelems.length) { 63 | var removed = elem.removeChild(subelems[0]); 64 | var category = prob[+removed.getAttribute('data-problem-id')]; 65 | if (category === undefined) { 66 | category = 'Unspecified'; 67 | } 68 | tables[category].getElementsByTagName('tbody')[0].appendChild(removed); 69 | } 70 | var push = elem.parentNode.parentNode; 71 | push.removeChild(elem.parentNode); 72 | 73 | function toggle(elem_id) { 74 | var e = document.getElementById('group-' + elem_id); 75 | if (e.getAttribute('style') !== 'display: none;') { 76 | e.setAttribute('style', 'display: none;'); 77 | return; 78 | } 79 | var p = document.getElementById('kipa-table').getElementsByTagName('table'); 80 | for (var i=0; i