AcWing Helper

优雅打印 | 显示Markdown | 自动存入剪贴板

  1. // ==UserScript==
  2. // @name AcWing Helper
  3. // @name:zh-CN AcWing Helper
  4. // @description Print elegantly | Show Markdown | Automatically save to clipboard
  5. // @description:zh-CN 优雅打印 | 显示Markdown | 自动存入剪贴板
  6. // @namespace work.pythoner
  7. // @match *://*.acwing.com/*
  8. // @require https://cdn.jsdelivr.net/npm/showdown@2.1.0/dist/showdown.min.js
  9. // @run-at document-end
  10. // @grant GM_registerMenuCommand
  11. // @grant GM_setClipboard
  12. // @version 1.2
  13. // @author Hanson Hu
  14. // @homepage https://blog.pythoner.work
  15. // @icon https://blog.pythoner.work/favicon.ico
  16. // @license MIT
  17. // ==/UserScript==
  18.  
  19. (function() {
  20.  
  21. function getToday() {
  22. // local tz
  23. let ret = new Date().toLocaleString('sv').slice(0, 10);
  24. return ret;
  25. }
  26.  
  27. function onClickPrint() {
  28. $('.navbar').remove();
  29. $('.nav').remove();
  30. $('.file-explorer-main-field-item').remove();
  31. $('.fs-gui-taskbar').remove();
  32. $('.btn-success').remove();
  33. $('.btn-default').remove();
  34. $('#code_tool_bar').remove();
  35. $('#code_editor').remove();
  36. $('#submit_code_btn').remove();
  37. $('#run_code_btn').remove();
  38. $('#acwing_footer').remove();
  39. $('#1024-activity').remove();
  40. $('br').remove();
  41. $('hr').remove();
  42.  
  43. $('.base_body').css('padding-top', '0px');
  44. $('.panel').css('border', '0px');
  45. $('.problem-content-title').css('padding-left', '1rem');
  46.  
  47. $('.problem-content-title').text(title);
  48.  
  49. let elem = $('<div style="position: absolute; top: 2px; right: 2px; ' +
  50. 'font-family: Bahnschrift, Trebuchet MS, sans-serif; ' +
  51. 'font-weight: lighter; font-stretch: condensed; ' +
  52. 'font-size: 24px;">' +
  53. getToday() +
  54. '</div>');
  55. $('body').append(elem);
  56. }
  57.  
  58. function onClickMarkdown() {
  59. let temp = '# ' + title + '\n\n' + md;
  60. GM_setClipboard(temp);
  61. let elem = $('<div style="padding: 1rem; color: red;">Copied to clipboard.' +
  62. '</div><pre style="margin: 1rem; white-space: pre-wrap; ' +
  63. 'word-wrap: break-word; font-family: Consolas, monospace; ' +
  64. 'font-size: 16px;"><code class="nohighlight">' +
  65. temp +
  66. '</code></pre>');
  67. $('.section-martor').append(elem);
  68. }
  69.  
  70. GM_registerMenuCommand('Prepare to print', onClickPrint);
  71. GM_registerMenuCommand('Show Markdown', onClickMarkdown);
  72.  
  73. let title = 'ACW' + $('.problem-content-title').text().trim(),
  74. text = $('.martor-preview').html().trim();
  75. text = text
  76. // Avoid the bug of showdown dealing with <br />
  77. // https://github.com/showdownjs/showdown/issues/649
  78. .replace(/<br[ ]?[/]?>\s*/g, '{line-break}')
  79. .replace(/[ ]class=".*?"/g, '')
  80. .replace(/<span.*?>/g, '')
  81. .replace(/<\/span>/g, '');
  82. let converter = new showdown.Converter();
  83. converter.setOption('simpleLineBreaks', true);
  84. let md = converter.makeMarkdown(text);
  85. md = md.replace(/{line-break}/g, ' \n');
  86.  
  87. })();