뭐 이전과 이어지는 글이라고도 할 수 있죠…
이건 사실 개발한지는 꽤 됐는데 최근에 기능 추가를 한 번 해서.. 그것도 한 번 써보겠습니다.
아마 백준 자바로 푸시는 분들은 알고 계실텐데, 백준에 제출할 때는 다음과 같은 과정이 필요합니다.
// 원본
package baekjoon_etc;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.TreeMap;
public class baekjoon2910 {
public static void main(String[] args) throws IOException {
// some codes here
}
}
// 백준 제출용
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) throws IOException {
// some codes here
}
}
즉 package 삭제와 클래스명을 Main으로 바꿔야한다는 것이다.
이게 매번 하는게 사실 좀 많이 귀찮은 일이라서.. 이걸 자동으로 해주는 chrome extension을 만들었었다.
document.addEventListener("paste", function (e) {
e.preventDefault();
var pastedText = undefined;
if (window.clipboardData && window.clipboardData.getData) { // IE
pastedText = window.clipboardData.getData('Text');
} else if (e.clipboardData && e.clipboardData.getData) {
pastedText = e.clipboardData.getData('text/plain');
}
pastedText = pastedText.replace(/package (.*?);/g, '')
pastedText = pastedText.replace(/public class (.*?) {/g, 'public class Main {')
e.target.value = pastedText;
}, true);
간단한 코드이다.
paste event에 interceptor를 추가하여 패키지를 삭제하고 클래스명을 Main으로 수정하는 것 뿐이다.
하지만 이제 인텔리제이 플러그인도 만들었는데.. 제출이 바로 됐으면 좋겠다는 생각도 들었다.
그래서 추가한 기능이 빠른 제출이다.
이 빠른 제출을 만들기 위해서 꽤나 힘든 시행착오가 있었다.
그렇다보니 단순히 api 호출로 제출하는 것은 할 수 없었다.
백준에서는 제출창에 CodeMirror라는 라이브러리를 사용했는데, 이게 querySelector로 선택하여 value값을 조작하는 방식을 막고 있었다…