diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..a46ebba --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: https://github.com/rtts/djhtml + rev: 'main' # replace with the latest tag on GitHub + hooks: + - id: djhtml + entry: djhtml -i -t 2 + files: templates/. + - id: djcss + types: [scss] diff --git a/requirements.txt b/requirements.txt index 5000705..82f5384 100644 --- a/requirements.txt +++ b/requirements.txt @@ -41,4 +41,5 @@ markdown bleach pymdown-extensions mdx-breakless-lists -beautifulsoup4 \ No newline at end of file +beautifulsoup4 +pre-commit \ No newline at end of file diff --git a/templates/about/about.html b/templates/about/about.html index 9547ce1..7924c6e 100644 --- a/templates/about/about.html +++ b/templates/about/about.html @@ -1,19 +1,19 @@ {% extends "base.html" %} {% block body %} -{% if request.organization %} + {% if request.organization %} {% cache 3600 'organization_html' request.organization.id MATH_ENGINE %} - {{ request.organization.about|markdown|reference|str|safe }} + {{ request.organization.about|markdown|reference|str|safe }} {% endcache %} -{% else %} + {% else %}

- LQDOJ (Le Quy Don Online Judge) là một trang web chấm bài tự động được phát triển dựa trên nền tảng mã nguồn mở DMOJ. Được xây dựng với mục đích ban đầu là tạo ra một môi trường học tập cho học sinh khối chuyên Tin trường THPT chuyên Lê Quý Đôn (TP Đà Nẵng), hiện nay LQDOJ đã cho phép đăng ký tự do để trở thành một sân chơi rộng mở cho toàn bộ cộng đồng học sinh yêu Tin học. Trang web cung cấp lượng bài luyện tập đồ sộ từ các kỳ thi HSG Quốc Gia, ACM ICPC, Olympic Duyên Hải Bắc Bộ, etc. cho đến các contest định kỳ để xếp loại khả năng (rating) giúp các bạn có thêm động lực cạnh tranh và khí thế phấn đấu rèn luyện nâng cao trình độ lập trình. Các bạn có thể tham khảo mã nguồn của trang web tại Github repo chính thức. Mọi ý kiến đóng góp và thắc mắc xin gửi về: -

-{% endif %} + {% endif %} {% endblock %} \ No newline at end of file diff --git a/templates/about/custom-checker-sample.html b/templates/about/custom-checker-sample.html index 486e8bd..b6497df 100644 --- a/templates/about/custom-checker-sample.html +++ b/templates/about/custom-checker-sample.html @@ -1,62 +1,62 @@ {% extends "common-content.html" %} {% block description %} - -
-

1. Custom checker (PY)

-
-

- Đây là checker mặc định của website, cho phép người dùng cập nhật được nhiều thông tin nhất (chi tiết xem ở bên dưới). Chúng ta cần hoàn thành hàm check dưới đây: -

+ +
+

1. Custom checker (PY)

+
+

+ Đây là checker mặc định của website, cho phép người dùng cập nhật được nhiều thông tin nhất (chi tiết xem ở bên dưới). Chúng ta cần hoàn thành hàm check dưới đây: +

-{{ -""" -def check(process_output, judge_output, **kwargs): + {{ + """ + def check(process_output, judge_output, **kwargs): # return True/False -"""|highlight('py')}} - -

- Trong đó, **kwargs có thể chứa các biến sau: -

- -

Return:

- + """|highlight('py')}} -

Ví dụ:

-

Dưới đây là ví dụ cho bài toán: Input gồm 1 số nguyên n. In ra 2 số nguyên a, b sao cho a + b = n. -

-{{ -""" -from dmoj.result import CheckerResult +

+ Trong đó, **kwargs có thể chứa các biến sau: +

+ +

Return:

+ + +

Ví dụ:

+

Dưới đây là ví dụ cho bài toán: Input gồm 1 số nguyên n. In ra 2 số nguyên a, b sao cho a + b = n. +

+ {{ + """ + from dmoj.result import CheckerResult -def wa(feedback): + def wa(feedback): return CheckerResult(False, 0, feedback) -def check(process_output, judge_output, judge_input, **kwargs): + def check(process_output, judge_output, judge_input, **kwargs): # process the input input_arr = judge_input.split() assert(len(input_arr) == 1) @@ -66,143 +66,143 @@ def check(process_output, judge_output, judge_input, **kwargs): output_arr = process_output.split() if (len(output_arr) != 2): - return wa('Wrong output format') + return wa('Wrong output format') try: - a, b = int(output_arr[0]), int(output_arr[1]) + a, b = int(output_arr[0]), int(output_arr[1]) except: - return wa('Wrong output format') + return wa('Wrong output format') if (n == a + b): - return True + return True return wa('a + b != n') -"""| highlight('py')}} -
-
-

2. Custom validator (CPP)

-
-

- Để sử dụng chức năng này, cần viết một chương trình C++ pass vào 3 arguments theo thứ tự input_file, output_file, ans_file tương ứng với các file input, output, đáp án. -

-

- Để test chương trình trên máy tính, có thể dùng lệnh như sau (Windows): -

+    """| highlight('py')}}
+  
+
+

2. Custom validator (CPP)

+
+

+ Để sử dụng chức năng này, cần viết một chương trình C++ pass vào 3 arguments theo thứ tự input_file, output_file, ans_file tương ứng với các file input, output, đáp án. +

+

+ Để test chương trình trên máy tính, có thể dùng lệnh như sau (Windows): +

 main.exe [input_file] [output_file] [ans_file]
- hoặc thay bằng ./main trên Linux/MacOS. -

-

Return:

-

- Chương trình trả về giá trị: -

- Những thông tin được viết ra stdout (bằng cout) sẽ được in ra màn hình cho người nộp bài(feedback) -

+ hoặc thay bằng ./main trên Linux/MacOS. +

+

Return:

+

+ Chương trình trả về giá trị: +

+ Những thông tin được viết ra stdout (bằng cout) sẽ được in ra màn hình cho người nộp bài(feedback) +

-

Ví dụ:

-

Chương trình sau dùng để chấm bài toán: Cho n là một số nguyên dương. In ra hai số tự nhiên a, b sao cho a + b = n.

-

Nếu in ra a + b = n và a, b >= 0 thì được 100% số điểm, nếu a + b = n nhưng một trong 2 số a, b âm thì được 50% số điểm.

-{{ -""" -#include -using namespace std; +

Ví dụ:

+

Chương trình sau dùng để chấm bài toán: Cho n là một số nguyên dương. In ra hai số tự nhiên a, b sao cho a + b = n.

+

Nếu in ra a + b = n và a, b >= 0 thì được 100% số điểm, nếu a + b = n nhưng một trong 2 số a, b âm thì được 50% số điểm.

+ {{ + """ + #include + using namespace std; -int main(int argc, char** argv) { - ifstream inp(argv[1]); - ifstream out(argv[2]); - ifstream ans(argv[3]); + int main(int argc, char** argv) { + ifstream inp(argv[1]); + ifstream out(argv[2]); + ifstream ans(argv[3]); - int n, a, b, c, d; - - inp >> n; - out >> a >> b; - ans >> c >> d; + int n, a, b, c, d; - if (a + b == c + d) { - cout << a << \" + \" << b << \" = \" << c << \" + \" << d << endl; - - if (a >= 0 && b >= 0) { - return 0; // AC - } - else { - cerr << 0.5; - return 2; // PARTIAL - } - } - else { - cout << \"a + b = \" << a + b << \" != \" << n << endl; - return 1; // WA - } -} -""" | highlight('cpp')}} + inp >> n; + out >> a >> b; + ans >> c >> d; + + if (a + b == c + d) { + cout << a << \" + \" << b << \" = \" << c << \" + \" << d << endl; + + if (a >= 0 && b >= 0) { + return 0; // AC + } + else { + cerr << 0.5; + return 2; // PARTIAL + } + } + else { + cout << \"a + b = \" << a + b << \" != \" << n << endl; + return 1; // WA + } + } + """ | highlight('cpp')}}
-

3. Interactive (CPP)

-
-

+

3. Interactive (CPP)

+
+

Để sử dụng chức năng này, cần viết một chương trình C++ pass vào 2 arguments input_file answer_file tương ứng file input và đáp án (nếu cần thiết). -

-

- Để test chương trình trên máy tính với tư cách thí sinh, có thể dùng lệnh như sau (Windows): -

+      

+

+ Để test chương trình trên máy tính với tư cách thí sinh, có thể dùng lệnh như sau (Windows): +

 main.exe [input_file] [answer_file]
- hoặc thay bằng ./main trên Linux/MacOS. -

-

Return:

-

- Chương trình trả về giá trị: -

    -
  • 0 nếu AC (100% điểm)
  • -
  • 1 nếu WA (0 điểm)
  • -
  • 2 nếu điểm thành phần. Khi đó cần in ra stderr một số thực trong đoạn [0, 1] thể hiện cho tỷ lệ điểm. Nếu điểm < 1 thì hiển thị WA, điểm = 1 thì hiển thị AC.
  • -
- Thông tin được in ra trong stderr (bằng cerr) sẽ là feedback hiển thị cho người dùng. -

+ hoặc thay bằng ./main trên Linux/MacOS. +

+

Return:

+

+ Chương trình trả về giá trị: +

    +
  • 0 nếu AC (100% điểm)
  • +
  • 1 nếu WA (0 điểm)
  • +
  • 2 nếu điểm thành phần. Khi đó cần in ra stderr một số thực trong đoạn [0, 1] thể hiện cho tỷ lệ điểm. Nếu điểm < 1 thì hiển thị WA, điểm = 1 thì hiển thị AC.
  • +
+ Thông tin được in ra trong stderr (bằng cerr) sẽ là feedback hiển thị cho người dùng. +

-

Ví dụ:

-

Chương trình sau dùng để chấm bài toán guessgame: Người chơi phải tìm 1 số bí mật n (n chứa trong file input). Mỗi lần họ được hỏi một số x, và chương trình sẽ trả về "SMALLER", "BIGGER" hoặc "HOLA" dựa trên giá trị của n và x. Cần tìm ra n sau không quá 31 câu hỏi.

-{{ -""" -#include -using namespace std; +

Ví dụ:

+

Chương trình sau dùng để chấm bài toán guessgame: Người chơi phải tìm 1 số bí mật n (n chứa trong file input). Mỗi lần họ được hỏi một số x, và chương trình sẽ trả về "SMALLER", "BIGGER" hoặc "HOLA" dựa trên giá trị của n và x. Cần tìm ra n sau không quá 31 câu hỏi.

+ {{ + """ + #include + using namespace std; -void quit(string reason) { - cerr << reason << endl; - exit(1); -} + void quit(string reason) { + cerr << reason << endl; + exit(1); + } -void read(long long& guess) { - if (!(cin >> guess)) exit(1); // Nếu không có dòng này, chương trình sẽ chờ vô hạn - if (guess < 1 || guess > 2e9) exit(1); -} + void read(long long& guess) { + if (!(cin >> guess)) exit(1); // Nếu không có dòng này, chương trình sẽ chờ vô hạn + if (guess < 1 || guess > 2e9) exit(1); + } -int main(int argc, char *argv[]) { - ifstream inp(argv[1]); - int N, guesses = 0; - long long guess; - inp >> N; + int main(int argc, char *argv[]) { + ifstream inp(argv[1]); + int N, guesses = 0; + long long guess; + inp >> N; - while (guess != N && guesses <= 31) { + while (guess != N && guesses <= 31) { read(guess); if (guess == N) { - cout << \"HOLA\" << endl; + cout << \"HOLA\" << endl; } else if (guess > N) { - cout << \"SMALLER\" << endl; + cout << \"SMALLER\" << endl; } else { - cout << \"BIGGER\" << endl; + cout << \"BIGGER\" << endl; } guesses++; - } - cerr << \"Number of used guesses: \" << guesses << endl; - if (guesses <= 31) + } + cerr << \"Number of used guesses: \" << guesses << endl; + if (guesses <= 31) return 0; // AC - else { + else { cerr << \"Used too many guesses\" << endl; return 1; // WA - } -} -""" | highlight('cpp')}} -
+ } + } + """ | highlight('cpp')}} +
{% endblock %} \ No newline at end of file diff --git a/templates/actionbar/list.html b/templates/actionbar/list.html index 06d6e29..24d07dc 100644 --- a/templates/actionbar/list.html +++ b/templates/actionbar/list.html @@ -1,51 +1,51 @@ {% set logged_in = request.user.is_authenticated %} {% set profile = request.profile if logged_in else None %} {% if logged_in %} -{% if include_hr %}
{% endif %} -
+ {% if include_hr %}
{% endif %} +
- - - - + + + + {% if not hide_actionbar_comment %} - + - - {{_("Comment")}} {% if comment_list.count() %} ({{comment_list.count()}}) {% endif %} + + {{_("Comment")}} {% if comment_list.count() %} ({{comment_list.count()}}) {% endif %} - + {% endif %} - - - {{_("Bookmark")}} - + + + {{_("Bookmark")}} + - - - {{_("Share")}} - + + + {{_("Share")}} + {% if actionbar_report_url %} - - - - {{_("Report")}} - - + + + + {{_("Report")}} + + {% endif %} -
+
{% endif %} \ No newline at end of file diff --git a/templates/actionbar/media-css.html b/templates/actionbar/media-css.html index 7e56f59..0ad2a51 100644 --- a/templates/actionbar/media-css.html +++ b/templates/actionbar/media-css.html @@ -1,7 +1,7 @@ diff --git a/templates/actionbar/media-js.html b/templates/actionbar/media-js.html index 1e3b083..78397e4 100644 --- a/templates/actionbar/media-js.html +++ b/templates/actionbar/media-js.html @@ -1,124 +1,124 @@ {% compress js %} - + } + + function ajax_bookmark(url, id, on_success) { + return $.ajax({ + url: url, + type: 'POST', + data: { + id: id + }, + success: function (data, textStatus, jqXHR) { + if (typeof on_success !== 'undefined') + on_success(); + }, + error: function (data, textStatus, jqXHR) { + alert('Could not bookmark: ' + data.responseText); + } + }); + } + + window.bookmark = function(id) { + var $bookmark = $('#bookmark-button-' + id); + if ($bookmark.hasClass('bookmarked')) { + ajax_bookmark('{{ url('undobookmark') }}', id, function () { + $bookmark.removeClass('bookmarked'); + }); + } else { + ajax_bookmark('{{ url('dobookmark') }}', id, function () { + if ($bookmark.hasClass('bookmarked')) + $bookmark.removeClass('bookmarked'); + $bookmark.addClass('bookmarked'); + }); + } + } + + + var get_$votes = function (id) { + var $post = $('#page-vote-' + id); + return { + upvote: $('#like-button-' + id), + downvote: $('#dislike-button-' + id), + }; + }; + + window.pagevote_upvote = function (id) { + var $votes = get_$votes(id); + if ($votes.upvote.hasClass('voted')) { + ajax_vote('{{ url('pagevote_downvote') }}', id, -1, function () { + $votes.upvote.removeClass('voted'); + }); + } + else { + var delta = 1; + if ($votes.downvote.hasClass('voted')) { + delta = 2; + } + for (let i = 0; i < delta; i++) { + ajax_vote('{{ url('pagevote_upvote') }}', id, 1, function () { + if ($votes.downvote.hasClass('voted')) + $votes.downvote.removeClass('voted'); + $votes.upvote.addClass('voted'); + }); + } + } + }; + + window.pagevote_downvote = function (id) { + var $votes = get_$votes(id); + if ($votes.downvote.hasClass('voted')) { + ajax_vote('{{ url('pagevote_upvote') }}', id, 1, function () { + $votes.downvote.removeClass('voted'); + }); + } + else { + var delta = -1; + if ($votes.upvote.hasClass('voted')) { + delta = -2; + } + for (let i = 0; i > delta; i--) { + ajax_vote('{{ url('pagevote_downvote') }}', id, -1, function () { + if ($votes.upvote.hasClass('voted')) + $votes.upvote.removeClass('voted'); + $votes.downvote.addClass('voted'); + }); + } + } + }; + $(".actionbar-share").click( function() { + link = $(this).attr("share-url") || window.location.href; + navigator.clipboard + .writeText(link) + .then(() => { + showTooltip(this, "Copied link", 'n'); + }); + }); + + $('.actionbar-comment').on('click', function() { + if ($('#comment-announcement').length) { + $('#comment-announcement').click(); + } + $('#write-comment').click(); + }) + }); + {% endcompress %} \ No newline at end of file diff --git a/templates/admin/auth/user/change_form.html b/templates/admin/auth/user/change_form.html index 207ab84..d5e581e 100644 --- a/templates/admin/auth/user/change_form.html +++ b/templates/admin/auth/user/change_form.html @@ -2,19 +2,19 @@ {% load i18n %} {% block extrahead %}{{ block.super }} - + {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} - {% if original %} - - {% endif %} + {% if original %} + + {% endif %} {% endblock %} diff --git a/templates/admin/judge/contest/change_form.html b/templates/admin/judge/contest/change_form.html index 7f540f6..5c94aa4 100644 --- a/templates/admin/judge/contest/change_form.html +++ b/templates/admin/judge/contest/change_form.html @@ -2,22 +2,22 @@ {% load i18n %} {% block extrahead %}{{ block.super }} - + {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} - {% if original and original.is_rated and original.ended and perms.judge.contest_rating %} - - {% endif %} + {% if original and original.is_rated and original.ended and perms.judge.contest_rating %} + + {% endif %} {% endblock %} diff --git a/templates/admin/judge/contest/change_list.html b/templates/admin/judge/contest/change_list.html index ae409fc..ec5c05d 100644 --- a/templates/admin/judge/contest/change_list.html +++ b/templates/admin/judge/contest/change_list.html @@ -2,12 +2,12 @@ {% load i18n %} {% block object-tools-items %} - {{ block.super }} - {% if not is_popup and perms.judge.contest_rating %} -
  • - - {% trans "Rate all ratable contests" %} - -
  • - {% endif %} + {{ block.super }} + {% if not is_popup and perms.judge.contest_rating %} +
  • + + {% trans "Rate all ratable contests" %} + +
  • + {% endif %} {% endblock %} diff --git a/templates/admin/judge/judge/change_form.html b/templates/admin/judge/judge/change_form.html index f477768..754c31d 100644 --- a/templates/admin/judge/judge/change_form.html +++ b/templates/admin/judge/judge/change_form.html @@ -2,25 +2,25 @@ {% load i18n %} {% block extrahead %}{{ block.super }} - + {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} - {% if original %} - - - {% endif %} + {% if original %} + + + {% endif %} {% endblock %} diff --git a/templates/admin/judge/problem/change_form.html b/templates/admin/judge/problem/change_form.html index 8731e7f..c5792c1 100644 --- a/templates/admin/judge/problem/change_form.html +++ b/templates/admin/judge/problem/change_form.html @@ -2,24 +2,24 @@ {% load i18n %} {% block extrahead %}{{ block.super }} - + {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} - {% if original %} - - {% endif %} + {% if original %} + + {% endif %} {% endblock %} diff --git a/templates/admin/judge/profile/change_form.html b/templates/admin/judge/profile/change_form.html index 9372383..0ac5f56 100644 --- a/templates/admin/judge/profile/change_form.html +++ b/templates/admin/judge/profile/change_form.html @@ -2,19 +2,19 @@ {% load i18n %} {% block extrahead %}{{ block.super }} - + {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} - {% if original %} - - {% endif %} + {% if original %} + + {% endif %} {% endblock %} diff --git a/templates/admin/judge/submission/change_form.html b/templates/admin/judge/submission/change_form.html index 6f3c5b7..dcb49c8 100644 --- a/templates/admin/judge/submission/change_form.html +++ b/templates/admin/judge/submission/change_form.html @@ -2,19 +2,19 @@ {% load i18n %} {% block extrahead %}{{ block.super }} - + {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} - {% if original %} - - {% endif %} + {% if original %} + + {% endif %} {% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 34b6cc9..f3e23bc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,13 +1,13 @@ - + {% block title %}{{ title }} - {{ SITE_LONG_NAME }}{% endblock %} {% if misc_config.meta_keywords %} - + {% endif %} {% if meta_description %} - + {% endif %} @@ -30,14 +30,14 @@ {# Chrome 39 for Android colour #} {% if og_image %} - + {% endif %} {% block og_title %}{% endblock %} + content="{{ DMOJ_SCHEME }}://{{ DMOJ_CANONICAL|default(site.domain) }}{{ request.get_full_path() }}"> {% if meta_description %} - + {% endif %} {% block meta %}{% endblock %} {% if not INLINE_FONTAWESOME %} - + {% endif %} {% compress css %} - - {% if PYGMENT_THEME %} - - {% endif %}{% if INLINE_FONTAWESOME %} + + {% if PYGMENT_THEME %} + + {% endif %}{% if INLINE_FONTAWESOME %} {% endif %} - - - - + + + + {% endcompress %} + href="{{ DMOJ_SCHEME }}://{{ DMOJ_CANONICAL|default(site.domain) }}{{ request.get_full_path() }}"> {% if request.user.is_impersonate %} - + {% endif %} {% block media %}{% endblock %} {% if use_darkmode %} - {% compress css %} - - - {% endcompress %} + {% compress css %} + + + {% endcompress %} {% endif %} {% if not INLINE_JQUERY %} - + {% endif %} {% compress js %} - - {% if INLINE_JQUERY %} - - {% endif %} - - - - - - {% include "extra_js.html" %} - - - + + {% if INLINE_JQUERY %} + + {% endif %} + + + + + + {% include "extra_js.html" %} + + + {% endcompress %} {% block js_media %}{% endblock %} {% if request.in_contest %} - + + if (localStorage.getItem("contest_timer_position")) { + data = localStorage.getItem("contest_timer_position").split(":"); + $("#contest-info").css({ + left: data[0], + top: data[1] + }); + } + + $("#contest-info").show(); + + $("#contest-info-toggle").on('click', function() { + $.post("{{url('contest_mode_ajax')}}", function() { + window.location.reload(); + }) + }); + + $(document).mousemove(function (e) { + x_pos = e.screenX; + y_pos = e.screenY; + + if (selected !== null) { + left_px = (x_pos - x_elem); + top_px = (y_pos - y_elem); + left_px = Math.max(Math.min(left_px, window.innerWidth), 0) / window.innerWidth * 100 + '%'; + top_px = Math.max(Math.min(top_px, window.innerHeight), 0) / window.innerHeight * 100 + '%'; + localStorage.setItem("contest_timer_position", left_px + ":" + top_px); + + selected.css({ + left: left_px, + top: top_px + }); + } + }); + + $(document).mouseup(function () { + selected = null; + }) + }); + {% endif %} {% if request.user.is_authenticated %} - + {% else %} - + {% endif %} {% if misc_config.analytics %} - {{ misc_config.analytics|safe }} + {{ misc_config.analytics|safe }} {% endif %} {# Don't run userscript since it may be malicious #} {% if request.user.is_authenticated and request.profile.user_script and not request.user.is_impersonate %} - + {% endif %} - - - - + + + + - - - + {% if request.in_contest %} +
    - - {{ request.participation.contest.name }} - - {% if request.participation.spectate %} - {{ _('spectating') }} - {% elif request.participation.end_time %} -
    - {{ request.participation.time_remaining|timedelta("localized") }} -
    - {% else %} - {{ _('virtual') }} - {% endif %} -
    + + {{ request.participation.contest.name }} - + {% if request.participation.spectate %} + {{ _('spectating') }} + {% elif request.participation.end_time %} +
    + {{ request.participation.time_remaining|timedelta("localized") }} +
    + {% else %} + {{ _('virtual') }} + {% endif %} +
    - {% if request.contest_mode %} - {{_('Compete')}} - {% else %} - {{_('General')}} - {% endif %} + {% if request.contest_mode %} + {{_('Compete')}} + {% else %} + {{_('General')}} + {% endif %}
    -
    -{% endif %} -
    -
    + {% endif %} +
    + -
    -
    + +
    +
    {% block title_row %} -

    - {% block content_title %} - {% if content_title %}{{ content_title }}{% else %}{{ title }}{% endif %} - {% endblock %} -

    +

    + {% block content_title %} + {% if content_title %}{{ content_title }}{% else %}{{ title }}{% endif %} + {% endblock %} +

    {% endblock %} {% block header %}{% endblock %} {% block title_ruler %} -
    +
    {% endblock %}
    {% block body %}{% endblock %}
    -
    +
    - {% if i18n_config.announcement %} + {% if i18n_config.announcement %}
    {{ i18n_config.announcement|safe }}
    - {% endif %} + {% endif %} - {% block bodyend %}{% endblock %} - {% block footer %} -
    + + + + + {% endblock %} + - + diff --git a/templates/blog/blog.html b/templates/blog/blog.html index 4b1abcd..fa97dac 100644 --- a/templates/blog/blog.html +++ b/templates/blog/blog.html @@ -1,13 +1,13 @@ {% extends "base.html" %} {% block js_media %} - {% include "comments/media-js.html" %} - {% include "actionbar/media-js.html" %} + {% include "comments/media-js.html" %} + {% include "actionbar/media-js.html" %} {% endblock %} {% block media %} - {% include "comments/media-css.html" %} - {% include "actionbar/media-css.html" %} + {% include "comments/media-css.html" %} + {% include "actionbar/media-css.html" %} {% endblock %} {% block title_row %} @@ -17,41 +17,41 @@ {% endblock %} {% block body %} -
    -
    {{ title }}
    -
    - {% with authors=post.authors.all() %} - {% if authors %} - - {% endif %} - {% endwith %} - - {% trans time=post.publish_on|date(_("N j, Y, g:i a")) %} posted on {{ time }}{% endtrans %} - - {% if post.is_editable_by(request.user) %} - [{{ _('Edit') }}] - {% endif %} - {% if valid_user_to_show_edit %} - {% for org in valid_org_to_show_edit %} - [{{ _('Edit in') }} {{org.slug}}] - {% endfor %} - {% endif %} -
    -
    - {% cache 86400 'post_content' post.id MATH_ENGINE %} - {{ post.content|markdown|reference|str|safe}} - {% endcache %} -
    - {% include "actionbar/list.html" %} +
    +
    {{ title }}
    +
    + {% with authors=post.authors.all() %} + {% if authors %} + + {% endif %} + {% endwith %} + + {% trans time=post.publish_on|date(_("N j, Y, g:i a")) %} posted on {{ time }}{% endtrans %} + + {% if post.is_editable_by(request.user) %} + [{{ _('Edit') }}] + {% endif %} + {% if valid_user_to_show_edit %} + {% for org in valid_org_to_show_edit %} + [{{ _('Edit in') }} {{org.slug}}] + {% endfor %} + {% endif %}
    -
    - {% include "comments/list.html" %} +
    + {% cache 86400 'post_content' post.id MATH_ENGINE %} + {{ post.content|markdown|reference|str|safe}} + {% endcache %} +
    + {% include "actionbar/list.html" %} +
    +
    + {% include "comments/list.html" %} {% endblock %} {% block bodyend %} - {{ super() }} - {% if REQUIRE_JAX %} - {% include "mathjax-load.html" %} - {% endif %} - {% include "comments/math.html" %} + {{ super() }} + {% if REQUIRE_JAX %} + {% include "mathjax-load.html" %} + {% endif %} + {% include "comments/math.html" %} {% endblock %} \ No newline at end of file diff --git a/templates/blog/content.html b/templates/blog/content.html index 506271e..b9a23fa 100644 --- a/templates/blog/content.html +++ b/templates/blog/content.html @@ -1,52 +1,52 @@
    -
    - - {% with authors=post.authors.all() %} - {%- if authors -%} - - - {%- endif -%} - {% endwith %} - • - {{ relative_time(post.publish_on, abs=_('on {time}'), rel=_('{time}')) -}} - {%- if post.sticky %} • - {% endif -%} - {% if post.is_organization_private and show_organization_private_icon %} - • - - {% for org in post.organizations.all() %} - - - {{ org.name }} - - - {% endfor %} - - {% endif %} +
    + + {% with authors=post.authors.all() %} + {%- if authors -%} + + + {%- endif -%} + {% endwith %} + • + {{ relative_time(post.publish_on, abs=_('on {time}'), rel=_('{time}')) -}} + {%- if post.sticky %} • + {% endif -%} + {% if post.is_organization_private and show_organization_private_icon %} + • + + {% for org in post.organizations.all() %} + + + {{ org.name }} + + + {% endfor %} - - - - - {{- post_comment_counts[post.id] or 0 -}} - - + {% endif %} + + + + + + {{- post_comment_counts[post.id] or 0 -}} + + +
    +

    + {{ post.title }} +

    +
    +
    + {% cache 86400 'post_summary' post.id %} + {{ post.summary|default(post.content, true)|markdown(lazy_load=True)|reference|str|safe }} + {% endcache %}
    -

    - {{ post.title }} -

    -
    -
    - {% cache 86400 'post_summary' post.id %} - {{ post.summary|default(post.content, true)|markdown(lazy_load=True)|reference|str|safe }} - {% endcache %} -
    - {% set pagevote = post.pagevote %} - {% set bookmark = post.bookmark %} - {% set hide_actionbar_comment = True %} - {% set include_hr = True %} - {% set share_url = request.build_absolute_uri(post.get_absolute_url()) %} - {% include "actionbar/list.html" %} -
    + {% set pagevote = post.pagevote %} + {% set bookmark = post.bookmark %} + {% set hide_actionbar_comment = True %} + {% set include_hr = True %} + {% set share_url = request.build_absolute_uri(post.get_absolute_url()) %} + {% include "actionbar/list.html" %} +
    \ No newline at end of file diff --git a/templates/blog/dashboard.html b/templates/blog/dashboard.html index 7ec50e4..b34d406 100644 --- a/templates/blog/dashboard.html +++ b/templates/blog/dashboard.html @@ -1,34 +1,34 @@