{% trans "Nothing to preview" %}
+diff --git a/.flake8 b/.flake8 index 55650c87fe..2d885a8b50 100644 --- a/.flake8 +++ b/.flake8 @@ -1,6 +1,6 @@ [flake8] max-line-length = 120 -application-import-names = dmoj,judge,django_ace +application-import-names = dmoj,judge,django_ace,martor import-order-style = pycharm enable-extensions = G ignore = @@ -18,9 +18,6 @@ per-file-ignores = ./judge/management/commands/runmoss.py:F403,F405 # E501: line too long, ignore in migrations ./judge/migrations/*.py:E501 - # E303: too many blank lines - # PyCharm likes to have double lines between class/def in an if statement. - ./judge/widgets/pagedown.py:E303 exclude = # belongs to the user ./dmoj/local_settings.py, diff --git a/.gitignore b/.gitignore index f2ca1efc45..8f5b9159b0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,9 @@ *~ *.swp dmoj/local_settings.py +resources/ace-dmoj.css resources/dark +resources/featherlight.css resources/martor-description.css resources/select2-dmoj.css resources/style.css diff --git a/.gitmodules b/.gitmodules index 0bea662553..655fd766d9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ -[submodule "resources/pagedown"] - path = resources/pagedown - url = https://github.com/DMOJ/dmoj-pagedown.git - branch = master [submodule "resources/libs"] path = resources/libs url = https://github.com/DMOJ/site-assets.git diff --git a/django_ace/__init__.py b/django_ace/__init__.py index dac946cca1..7347d70879 100644 --- a/django_ace/__init__.py +++ b/django_ace/__init__.py @@ -1,5 +1,5 @@ """ -Django-ace originally from https://github.com/bradleyayers/django-ace. +Django-ace originally from https://github.com/django-ace/django-ace. """ from .widgets import AceWidget diff --git a/django_ace/static/django_ace/widget.css b/django_ace/static/django_ace/widget.css deleted file mode 100644 index 09ad9468be..0000000000 --- a/django_ace/static/django_ace/widget.css +++ /dev/null @@ -1,58 +0,0 @@ -.django-ace-widget { - display: inline-block; - position: relative; -} - -.django-ace-widget > div { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.django-ace-widget.loading { - display: none; -} - -.django-ace-toolbar { - font-size: 12px; - text-align: left; - color: #555; - text-shadow: 0 1px 0 #fff; - border-bottom: 1px solid #d8d8d8; - background-color: #eaeaea; - background-image: -moz-linear-gradient(#fafafa, #eaeaea); - background-image: -webkit-linear-gradient(#fafafa, #eaeaea); - background-image: linear-gradient(#fafafa, #eaeaea); - background-repeat: repeat-x; - clear: both; - overflow: hidden; -} - -.django-ace-max_min { - float: right; - padding: 5px; - - background: url(img/expand.png) no-repeat 5px 5px; - display: block; - height: 16px; - width: 16px; -} - -.django-ace-editor { - position: relative; -} - -.django-ace-editor-fullscreen { - position: fixed; - top: 0; - left: 0; - bottom: 0; - right: 0; - z-index: 1000; -} - -.django-ace-editor-fullscreen .django-ace-max_min { - background-image: url(img/contract.png); -} \ No newline at end of file diff --git a/django_ace/widgets.py b/django_ace/widgets.py index 2f521bf7f7..f9eb57f0ba 100644 --- a/django_ace/widgets.py +++ b/django_ace/widgets.py @@ -1,5 +1,5 @@ """ -Django-ace originally from https://github.com/bradleyayers/django-ace. +Django-ace originally from https://github.com/django-ace/django-ace. """ from urllib.parse import urljoin @@ -25,10 +25,7 @@ def __init__(self, mode=None, theme=None, wordwrap=False, width='100%', height=' def media(self): js = [urljoin(settings.ACE_URL, 'ace.js')] if self.ace_media else [] js.append('django_ace/widget.js') - css = { - 'screen': ['django_ace/widget.css'], - } - return forms.Media(js=js, css=css) + return forms.Media(js=js) def render(self, name, value, attrs=None, renderer=None): attrs = attrs or {} @@ -53,7 +50,8 @@ def render(self, name, value, attrs=None, renderer=None): html = '
Nothing to preview
'); + } + }, + error: function (response) { + console.log("error", response); + } + }); + }; + + // Refresh the preview unconditionally on first load. + refreshPreview(); + + if (editorConfig.living !== 'true') { + previewTabButton.click(function () { + // hide the `.martor-toolbar` for this current editor if under preview. + $(this).closest('.tab-martor-menu').find('.martor-toolbar').hide(); + refreshPreview(); + }); + } else { + editor.on('change', refreshPreview); + } + + var editorTabButton = $('.item[data-tab=editor-tab-' + field_name + ']'); + editorTabButton.click(function () { + // show the `.martor-toolbar` for this current editor if under preview. + $(this).closest('.tab-martor-menu').find('.martor-toolbar').show(); + }); + + // win/linux: Ctrl+B, mac: Command+B + var markdownToBold = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, ' **** '); + editor.focus(); + editor.selection.moveTo(curpos.row, curpos.column + 3); + } else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '**' + text + '**'); + originalRange.end.column += 4; // this because injected from 4 `*` characters. + editor.focus(); + editor.selection.setSelectionRange(originalRange); + } + }; + // win/linux: Ctrl+I, mac: Command+I + var markdownToItalic = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, ' ** '); + editor.focus(); + editor.selection.moveTo(curpos.row, curpos.column + 2); + } else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '*' + text + '*'); + originalRange.end.column += 2; // this because injected from 2 `*` characters. + editor.focus(); + editor.selection.setSelectionRange(originalRange); + } + }; + // win/linux: Ctrl+Shift+S + var markdownToStrikethrough = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, ' ~~~~ '); + editor.focus(); + editor.selection.moveTo(curpos.row, curpos.column + 3); + } else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '~~' + text + '~~'); + originalRange.end.column += 4; // this because injected from 4 `*` characters. + editor.focus(); + editor.selection.setSelectionRange(originalRange); + } + }; + // win/linux: Ctrl+H, mac: Command+H + var markdownToHorizontal = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '\n\n----------\n\n'); + editor.focus(); + editor.selection.moveTo(curpos.row + 4, curpos.column + 10); + } + else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '\n\n----------\n\n' + text); + editor.focus(); + editor.selection.moveTo( + originalRange.end.row + 4, + originalRange.end.column + 10 + ); + } + }; + // win/linux: Ctrl+Alt+1, mac: Command+Option+1 + var markdownToH1 = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '\n\n# '); + editor.focus(); + editor.selection.moveTo(curpos.row + 2, curpos.column + 2); + } + else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '\n\n# ' + text + '\n'); + editor.focus(); + editor.selection.moveTo( + originalRange.end.row + 2, + originalRange.end.column + 2 + ); + } + }; + // win/linux: Ctrl+Alt+2, mac: Command+Option+2 + var markdownToH2 = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '\n\n## '); + editor.focus(); + editor.selection.moveTo(curpos.row + 2, curpos.column + 3); + } + else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '\n\n## ' + text + '\n'); + editor.focus(); + editor.selection.moveTo( + originalRange.end.row + 2, + originalRange.end.column + 3 + ); + } + }; + // win/linux: Ctrl+Alt+3, mac: Command+Option+3 + var markdownToH3 = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '\n\n### '); + editor.focus(); + editor.selection.moveTo(curpos.row + 2, curpos.column + 4); + } + else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '\n\n### ' + text + '\n'); + editor.focus(); + editor.selection.moveTo( + originalRange.end.row + 2, + originalRange.end.column + 4 + ); + } + }; + // win/linux: Ctrl+Alt+P, mac: Command+Option+P + var markdownToPre = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '\n\n```\n\n```\n'); + editor.focus(); + editor.selection.moveTo(curpos.row + 3, curpos.column); + } + else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '\n\n```\n' + text + '\n```\n'); + editor.focus(); + editor.selection.moveTo( + originalRange.end.row + 3, + originalRange.end.column + 3 + ); + } + }; + // win/linux: Ctrl+Alt+C, mac: Command+Option+C + var markdownToCode = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, ' `` '); + editor.focus(); + editor.selection.moveTo(curpos.row, curpos.column + 2); + } else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '`' + text + '`'); + originalRange.end.column += 2; // this because injected from 2 `_` characters. + editor.focus(); + editor.selection.setSelectionRange(originalRange); + } + }; + // win/linux: Ctrl+Alt+I, mac: Command+Option+I + var markdownToInlineMath = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '~~'); + editor.focus(); + editor.selection.moveTo(curpos.row, curpos.column + 1); + } else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '~' + text + '~'); + originalRange.end.column += 2; + editor.focus(); + editor.selection.setSelectionRange(originalRange); + } + } + // win/linux: Ctrl+Alt+D, mac: Command+Option+D + var markdownToDisplayMath = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '$$$$'); + editor.focus(); + editor.selection.moveTo(curpos.row, curpos.column + 2); + } else { + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + editor.session.replace(range, '$$' + text + '$$'); + originalRange.end.column += 4; + editor.focus(); + editor.selection.setSelectionRange(originalRange); + } + } + // win/linux: Ctrl+Alt+L, mac: Command+Option+L + var markdownToLatex = function (editor) { + var originalRange = editor.getSelectionRange(); + if (editor.selection.isEmpty()) { + var curpos = editor.getCursorPosition(); + editor.session.insert(curpos, '\n\n{% trans "Nothing to preview" %}
+{% blocktrans with doc_url='https://commonmark.org/help/' %}This site is powered by Markdown. For full documentation, click here.{% endblocktrans %}
+{% trans "Code" %} | +{% trans "Or" %} | +Linux/Windows | +Mac OS | +{% trans "... to Get" %} | +
---|---|---|---|---|
[user:username] | +— | +Ctrl+M | +Command+M | +username | +
*Italic* | +— | +Ctrl+I | +Command+I | +Italic | +
**Bold** | +— | +Ctrl+B | +Command+B | +Bold | +
~~Strikethrough~~ | +— | +Shift+S | +Option+S | +|
# Heading 3 | +Heading 3 ========= |
+ Ctrl+Alt+1 | +Command+Option+1 | +Heading 3 |
+
## Heading 4 | +Heading 4 ----------- |
+ Ctrl+Alt+2 | +Command+Option+2 | +Heading 4 |
+
[Link](https://a.com) | +[Link][1] ⁝ [1]: https://b.org |
+ Ctrl+L | +Command+L | +Link | +
 | +![Image][1] ⁝ [1]: https://url/b.jpg |
+ Ctrl+Shift+I | +Command+Option+I | +![]() |
+
> Blockquote | +— | +Ctrl+Q | +Command+Q | +Blockquote |
+
A paragraph. A paragraph after 1 blank line. |
+ — | +— | +— | +A paragraph. A paragraph after 1 blank line. |
+
* List |
+ - List |
+ Ctrl+U | +Command+U | +
|
+
1. One |
+ — | +Ctrl+Shift+O | +Command+Option+O | +
|
+
Horizontal Rule ----------- |
+ Horizontal Rule *********** |
+ Ctrl+H | +Command+H | +Horizontal Rule |
+
`Inline code` with backticks | +— | +Ctrl+Alt+C | +Command+Option+C | +Inline code with backticks |
+
``` def whatever(foo): return foo ``` |
+ with tab / 4 spaces ....def whatever(foo): .... return foo |
+ Ctrl+Alt+P | +Command+Option+P | +def whatever(foo): |
+
~x^2~ | +— | +Ctrl+Alt+I | +Command+Option+I | +~x^2~ | +