뭐 이전과 이어지는 글이라고도 할 수 있죠…

이건 사실 개발한지는 꽤 됐는데 최근에 기능 추가를 한 번 해서.. 그것도 한 번 써보겠습니다.

아마 백준 자바로 푸시는 분들은 알고 계실텐데, 백준에 제출할 때는 다음과 같은 과정이 필요합니다.

// 원본

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으로 수정하는 것 뿐이다.

하지만 이제 인텔리제이 플러그인도 만들었는데.. 제출이 바로 됐으면 좋겠다는 생각도 들었다.

그래서 추가한 기능이 빠른 제출이다.

이 빠른 제출을 만들기 위해서 꽤나 힘든 시행착오가 있었다.

1. 백준은 제출 api를 숨겨뒀다.

그렇다보니 단순히 api 호출로 제출하는 것은 할 수 없었다.

2. 그렇다고 html에 코드 붙여넣기가 쉬운 것도 아니었다.

백준에서는 제출창에 CodeMirror라는 라이브러리를 사용했는데, 이게 querySelector로 선택하여 value값을 조작하는 방식을 막고 있었다…