AtCoder dos2unix UserScript

submit code using LF instead of CRLF

Per 22-01-2019. Zie de nieuwste versie.

  1. // ==UserScript==
  2. // @name AtCoder dos2unix UserScript
  3. // @namespace https://github.com/kmyk
  4. // @version 1.7
  5. // @description submit code using LF instead of CRLF
  6. // @author Kimiyuki Onaka
  7. // @match *://atcoder.jp/contests/*/submit*
  8. // @match *://atcoder.jp/contests/*/tasks/*
  9. // @match *://beta.atcoder.jp/contests/*/submit*
  10. // @match *://beta.atcoder.jp/contests/*/tasks/*
  11. // @match *://*.contest.atcoder.jp/submit*
  12. // ==/UserScript==
  13. function post(path, payload, expectedURL) {
  14. const xhr = new XMLHttpRequest();
  15. xhr.open("POST", path, false);
  16. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  17. xhr.send(payload);
  18. console.log(xhr);
  19. if (xhr.responseURL == expectedURL) {
  20. location.href = xhr.responseURL;
  21. }
  22. else {
  23. alert("AtCoder dos2unix UserScript: something wrong / なんか変だよ ソースコードが空だったり連投制限に引っ掛かってたりしませんか");
  24. }
  25. }
  26. function addNewButton(normalButton) {
  27. const button = document.createElement("button");
  28. button.innerText = "提出 (dos2unix)";
  29. for (const value of normalButton.classList) {
  30. button.classList.add(value);
  31. }
  32. button.classList.remove("btn-primary");
  33. button.classList.add("btn-success");
  34. normalButton.parentNode.insertBefore(button, normalButton.nextSibling);
  35. const space = document.createTextNode(" ");
  36. normalButton.parentNode.insertBefore(space, button);
  37. return button;
  38. }
  39. function beta() {
  40. const taskScreenName = document.getElementsByName("data.TaskScreenName")[0];
  41. const sourceCode = document.getElementsByName("sourceCode")[0];
  42. const csrfToken = document.getElementsByName("csrf_token")[0];
  43. const normalSubmit = document.getElementById("submit");
  44. const submit = addNewButton(normalSubmit);
  45. submit.addEventListener("click", function (e) {
  46. e.preventDefault();
  47. // NOTE: I didn't know why, but the "data.LanguageId" must be gotten here. see https://github.com/kmyk/atcoder-dos2unix-userscript/issues/2
  48. const languageId = document.getElementsByName("data.LanguageId")[0];
  49. const contestId = location.pathname.split('/')[2];
  50. const data = [];
  51. for (const tag of [taskScreenName, languageId, sourceCode, csrfToken]) {
  52. var value = tag.value;
  53. if (tag === sourceCode) {
  54. value = $(sourceCode).data('editor').getValue();
  55. }
  56. data.push(tag.name + '=' + encodeURIComponent(value));
  57. console.log([tag.name, value]);
  58. }
  59. const payload = data.join('&');
  60. console.log(payload);
  61. const path = "/contests/" + contestId + "/submit";
  62. const expectedURL = location.origin + "/contests/" + contestId + "/submissions/me";
  63. post(path, payload, expectedURL);
  64. });
  65. }
  66. function alpha() {
  67. const session = document.getElementsByName("__session")[0];
  68. const taskId = document.getElementsByName("task_id")[0];
  69. const sourceCode = document.getElementsByName("source_code")[0];
  70. const languageSelectors = document.getElementsByClassName("submit-language-selector");
  71. const normalSubmit = document.getElementsByTagName("button")[0];
  72. const submit = addNewButton(normalSubmit);
  73. submit.addEventListener("click", function (e) {
  74. e.preventDefault();
  75. const data = [];
  76. for (const tag of [session, taskId, sourceCode].concat(Array.from(languageSelectors))) {
  77. data.push(tag.name + '=' + encodeURIComponent(tag.value));
  78. console.log([tag.name, tag.value]);
  79. }
  80. const payload = data.join('&');
  81. console.log(payload);
  82. const path = "/submit?task_id=" + taskId.value;
  83. const expectedURL = location.origin + "/submissions/me";
  84. post(path, payload, expectedURL);
  85. });
  86. }
  87. function main() {
  88. if (location.hostname.endsWith(".contest.atcoder.jp")) {
  89. alpha();
  90. }
  91. else {
  92. beta();
  93. }
  94. }
  95. main();