mirror of
https://gitlab.com/SIGBUS/nyaa.git
synced 2024-12-22 14:40:00 +00:00
Merge branch 'master' into focus-report-field
This commit is contained in:
commit
b5e70ba0b0
|
@ -168,7 +168,7 @@ class EditForm(FlaskForm):
|
||||||
information = StringField('Information', [
|
information = StringField('Information', [
|
||||||
Length(max=255, message='Information must be at most %(max)d characters long.')
|
Length(max=255, message='Information must be at most %(max)d characters long.')
|
||||||
])
|
])
|
||||||
description = TextAreaField('Description (markdown supported)', [
|
description = TextAreaField('Description', [
|
||||||
Length(max=10 * 1024, message='Description must be at most %(max)d characters long.')
|
Length(max=10 * 1024, message='Description must be at most %(max)d characters long.')
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -222,7 +222,7 @@ class UploadForm(FlaskForm):
|
||||||
information = StringField('Information', [
|
information = StringField('Information', [
|
||||||
Length(max=255, message='Information must be at most %(max)d characters long.')
|
Length(max=255, message='Information must be at most %(max)d characters long.')
|
||||||
])
|
])
|
||||||
description = TextAreaField('Description (markdown supported)', [
|
description = TextAreaField('Description', [
|
||||||
Length(max=10 * 1024, message='Description must be at most %(max)d characters long.')
|
Length(max=10 * 1024, message='Description must be at most %(max)d characters long.')
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
@ -349,3 +349,19 @@ a.text-purple:hover, a.text-purple:active, a.text-purple:focus { color: #a760e0;
|
||||||
.torrent-file-list .file-size {
|
.torrent-file-list .file-size {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-anchor {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
visibility: hidden;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1:hover .header-anchor,
|
||||||
|
h2:hover .header-anchor,
|
||||||
|
h3:hover .header-anchor,
|
||||||
|
h4:hover .header-anchor,
|
||||||
|
h5:hover .header-anchor,
|
||||||
|
h6:hover .header-anchor {
|
||||||
|
visibility: visible;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
|
@ -145,28 +145,46 @@ document.addEventListener("DOMContentLoaded", function(event) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var markdownOptions = {
|
||||||
|
html : false,
|
||||||
|
breaks : true,
|
||||||
|
typographer: true
|
||||||
|
}
|
||||||
|
var markdown = window.markdownit(markdownOptions);
|
||||||
|
markdown.renderer.rules.table_open = function (tokens, idx) {
|
||||||
|
// Format tables nicer (bootstrap). Force auto-width (default is 100%)
|
||||||
|
return '<table class="table table-striped table-bordered" style="width: auto;">';
|
||||||
|
}
|
||||||
|
|
||||||
// Initialise markdown editors on page
|
// Initialise markdown editors on page
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
var markdownEditors = Array.prototype.slice.call(document.querySelectorAll('.markdown-editor'));
|
var markdownEditors = Array.prototype.slice.call(document.querySelectorAll('.markdown-editor'));
|
||||||
|
|
||||||
markdownEditors.forEach(function (markdownEditor) {
|
markdownEditors.forEach(function (markdownEditor) {
|
||||||
var fieldName = markdownEditor.getAttribute('data-field-name');
|
var fieldName = markdownEditor.getAttribute('data-field-name');
|
||||||
|
|
||||||
var previewTabSelector = '#' + fieldName + '-preview-tab';
|
var previewTabSelector = '#' + fieldName + '-preview-tab';
|
||||||
var targetSelector = '#' + fieldName + '-markdown-target';
|
var targetSelector = '#' + fieldName + '-markdown-target';
|
||||||
var sourceSelector = markdownEditor.querySelector('.markdown-source');
|
var sourceSelector = markdownEditor.querySelector('.markdown-source');
|
||||||
|
|
||||||
var previewTabEl = markdownEditor.querySelector(previewTabSelector);
|
var previewTabEl = markdownEditor.querySelector(previewTabSelector);
|
||||||
var targetEl = markdownEditor.querySelector(targetSelector);
|
var targetEl = markdownEditor.querySelector(targetSelector);
|
||||||
|
|
||||||
var reader = new commonmark.Parser({safe: true});
|
previewTabEl.addEventListener('click', function () {
|
||||||
var writer = new commonmark.HtmlRenderer({safe: true, softbreak: '<br />'});
|
var rendered = markdown.render(sourceSelector.value.trim());
|
||||||
|
targetEl.innerHTML = rendered;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
previewTabEl.addEventListener('click', function () {
|
// Render markdown from elements with "markdown-text" attribute
|
||||||
var parsed = reader.parse(sourceSelector.value.trim());
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
targetEl.innerHTML = writer.render(parsed);
|
|
||||||
});
|
var markdownTargets = document.querySelectorAll('[markdown-text]');
|
||||||
});
|
for (var target of markdownTargets) {
|
||||||
|
var rendered = markdown.render(target.innerHTML);
|
||||||
|
target.innerHTML = rendered;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="markdown-editor" id="{{ field_name }}-markdown-editor" data-field-name="{{ field_name }}">
|
<div class="markdown-editor" id="{{ field_name }}-markdown-editor" data-field-name="{{ field_name }}">
|
||||||
{{ field.label(class='control-label') }}
|
{{ field.label(class='control-label') }}
|
||||||
|
<a href="https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet" class="small">Markdown supported</a>
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li role="presentation" class="active">
|
<li role="presentation" class="active">
|
||||||
<a href="#{{ field_name }}-tab" role="tab" data-toggle="tab">
|
<a href="#{{ field_name }}-tab" role="tab" data-toggle="tab">
|
||||||
|
@ -49,7 +50,25 @@
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div role="tabpanel" class="tab-pane active" id="{{ field_name }}-tab" data-markdown-target="#{{ field_name }}-markdown-target">
|
<div role="tabpanel" class="tab-pane active" id="{{ field_name }}-tab" data-markdown-target="#{{ field_name }}-markdown-target">
|
||||||
{{ render_field(field, False, class_='form-control markdown-source') }}
|
{# Render this field manually, because we need to escape the inner text #}
|
||||||
|
<textarea class="form-control markdown-source" id="{{ field.id }}" name="{{ field.name }}">
|
||||||
|
{{- (field.data or "") | escape | replace('\r\n', '\n') | replace('\n', ' '|safe) -}}
|
||||||
|
</textarea>
|
||||||
|
{% if field.errors %}
|
||||||
|
<div class="help-block">
|
||||||
|
{% if field.errors|length < 2 %}
|
||||||
|
{% for error in field.errors %}
|
||||||
|
{{ error }}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<ul>
|
||||||
|
{% for error in field.errors %}
|
||||||
|
<li>{{ error }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div role="tabpanel" class="tab-pane" id="{{ field_name }}-preview">
|
<div role="tabpanel" class="tab-pane" id="{{ field_name }}-preview">
|
||||||
<div class="well" id="{{ field_name }}-markdown-target"></div>
|
<div class="well" id="{{ field_name }}-markdown-target"></div>
|
||||||
|
|
|
@ -89,7 +89,7 @@
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<input type="submit" value="Edit" class="btn btn-primary">
|
<input type="submit" value="Save Changes" class="btn btn-primary">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -2,7 +2,64 @@
|
||||||
{% block title %}Help :: {{ config.SITE_NAME }}{% endblock %}
|
{% block title %}Help :: {{ config.SITE_NAME }}{% endblock %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
|
||||||
<h1>Coming soon (tm)</h1>
|
{% macro linkable_header(heading, label) %}
|
||||||
|
<h3 id="{{ label }}">{{ heading }}<a class="header-anchor" href="#{{ label }}"><i class="fa fa-link" aria-hidden="true"></i></a></h3>
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
<h1>Help</h1>
|
||||||
|
|
||||||
|
<h2>Using the Site</h2>
|
||||||
|
|
||||||
|
{{ linkable_header("How to Download", "how-to-dl") }}
|
||||||
|
<p>
|
||||||
|
This site only offers torrent files and magnet links. To download the content of
|
||||||
|
the torrents, you will have to use a BitTorrent client such as qBitTorrent,
|
||||||
|
µTorrent, Transmission or Deluge.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{ linkable_header("Using the Search Function", "using-search") }}
|
||||||
|
<p>
|
||||||
|
You can combine search terms with the <kbd>|</kbd> operator, such as
|
||||||
|
<kbd>horrible|cartel</kbd>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To exclude results matching a certain word, prefix them with <kbd>-</kbd>,
|
||||||
|
e.g. <kbd>FFF -memesubs</kbd>, which will return torrents with <em>FFF</em> in the
|
||||||
|
name, but not those which have <em>memesubs</em> in the name as well.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If you want to search for a several-word expression in its entirety, you can
|
||||||
|
surround searches with <kbd>"</kbd> (double quotes), such as
|
||||||
|
<kbd>"foo bar"</kbd>, which would match torrents named <em>foo bar</em> but not
|
||||||
|
those named <em>bar foo</em>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{ linkable_header("Reporting Torrents", "reporting") }}
|
||||||
|
<p>
|
||||||
|
If you find a torrent that breaks the rules, click the
|
||||||
|
<button type="button" class="btn btn-danger">Report</button> button to the right
|
||||||
|
of the torrent's information page. Then, enter a reason for your report in the
|
||||||
|
dialog that opens, and hit the <button type="button" class="btn btn-danger">
|
||||||
|
Report</button> button to confirm.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{ linkable_header("Styling Descriptions and Comments", "styling") }}
|
||||||
|
<p>
|
||||||
|
You can style your comments and your torrent's description using
|
||||||
|
<a href="https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet">Markdown
|
||||||
|
</a>. This includes adding images or linking to external websites.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To link to an external site, use <kbd>[label of link](https://example.com)</kbd>
|
||||||
|
where the text in the <kbd>[]</kbd> square brackets is the shown text of your
|
||||||
|
link, and the URL in the <kbd>()</kbd> parentheses is the URL your link will
|
||||||
|
point to.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Embedding an image is similar. Use <kbd>![alt text](https://example.com/image.jpg)</kbd>
|
||||||
|
to have an image embedded in your comment or description. Note the <kbd>!</kbd>
|
||||||
|
exclamation mark at the beginning, denoting that this link is an image.
|
||||||
|
</p>
|
||||||
{# <div class="content">
|
{# <div class="content">
|
||||||
<h1>Help</h1>
|
<h1>Help</h1>
|
||||||
<p><b>The search engine</b> is located at the top right, and it allows users to search through the torrent titles available on the site. Results matching either word A or B can be included by typing a vertical bar between them (|). Results matching a certain word can be excluded by prefixing that word with a hyphen-minus (-). Phrases can be matched by surrounding them with double-quotes (). Search results can be filtered by category, remake, trusted, and/or A+ status, and then narrowed down further by age and size ranges as well as excluding specific users. Sorting can be done in ascending or descending order by date, amount of seeders/leechers/downloads, size, or name. The search engine adapts to the current view and makes it possible to search for specific torrents in a specific subcategory from a specific user.</p>
|
<p><b>The search engine</b> is located at the top right, and it allows users to search through the torrent titles available on the site. Results matching either word A or B can be included by typing a vertical bar between them (|). Results matching a certain word can be excluded by prefixing that word with a hyphen-minus (-). Phrases can be matched by surrounding them with double-quotes (). Search results can be filtered by category, remake, trusted, and/or A+ status, and then narrowed down further by age and size ranges as well as excluding specific users. Sorting can be done in ascending or descending order by date, amount of seeders/leechers/downloads, size, or name. The search engine adapts to the current view and makes it possible to search for specific torrents in a specific subcategory from a specific user.</p>
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
<!-- Core JavaScript -->
|
<!-- Core JavaScript -->
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/commonmark/0.27.0/commonmark.min.js" integrity="sha256-10JreQhQG80GtKuzsioj0K46DlaB/CK/EG+NuG0q97E=" crossorigin="anonymous"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/8.3.1/markdown-it.min.js" integrity="sha256-3WZyZQOe+ql3pLo90lrkRtALrlniGdnf//gRpW0UQks=" crossorigin="anonymous"></script>
|
||||||
<!-- Modified to not apply border-radius to selectpickers and stuff so our navbar looks cool -->
|
<!-- Modified to not apply border-radius to selectpickers and stuff so our navbar looks cool -->
|
||||||
<script src="{{ static_cachebuster('js/bootstrap-select.js') }}"></script>
|
<script src="{{ static_cachebuster('js/bootstrap-select.js') }}"></script>
|
||||||
<script src="{{ static_cachebuster('js/main.js') }}"></script>
|
<script src="{{ static_cachebuster('js/main.js') }}"></script>
|
||||||
|
|
|
@ -81,13 +81,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-body" id="torrent-description">
|
<div markdown-text class="panel-body" id="torrent-description">
|
||||||
{% if torrent.description %}
|
{%- if torrent.description -%}
|
||||||
{# Escape newlines into html entities because CF strips blank newlines #}
|
{# Escape newlines into html entities because CF strips blank newlines #}
|
||||||
{{ torrent.description | escape | replace('\r\n', '\n') | replace('\n', ' '|safe) }}
|
{{- torrent.description | escape | replace('\r\n', '\n') | replace('\n', ' '|safe) -}}
|
||||||
{% else %}
|
{%- else -%}
|
||||||
#### No description.
|
#### No description.
|
||||||
{% endif%}
|
{%- endif -%}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -161,19 +161,12 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{# Escape newlines into html entities because CF strips blank newlines #}
|
{# Escape newlines into html entities because CF strips blank newlines #}
|
||||||
<div class="comment-content" id="torrent-comment{{ comment.id }}">{{ comment.text }}</div>
|
<div markdown-text class="comment-content" id="torrent-comment{{ comment.id }}">{{ comment.text }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
|
||||||
var target = document.getElementById('torrent-comment{{ comment.id }}');
|
|
||||||
var text = target.innerHTML;
|
|
||||||
var reader = new commonmark.Parser({safe: true});
|
|
||||||
var writer = new commonmark.HtmlRenderer({safe: true, softbreak: '<br />'});
|
|
||||||
var parsed = reader.parse(text.trim());
|
|
||||||
target.innerHTML = writer.render(parsed);
|
|
||||||
</script>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if comment_form %}
|
{% if comment_form %}
|
||||||
<form class="comment-box" method="POST">
|
<form class="comment-box" method="POST">
|
||||||
|
@ -207,7 +200,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script type="text/javascript">
|
||||||
var target = document.getElementById('torrent-description');
|
var target = document.getElementById('torrent-description');
|
||||||
var text = target.innerHTML;
|
var text = target.innerHTML;
|
||||||
var reader = new commonmark.Parser({safe: true});
|
var reader = new commonmark.Parser({safe: true});
|
||||||
|
|
Loading…
Reference in a new issue