add markdown parsing

This commit is contained in:
Tomáš Mládek 2020-04-01 19:10:35 +02:00
parent ce29e64299
commit e022981027
7 changed files with 50 additions and 6 deletions

30
poetry.lock generated
View file

@ -26,6 +26,18 @@ optional = false
python-versions = "*" python-versions = "*"
version = "0.1.0" version = "0.1.0"
[[package]]
category = "main"
description = "An easy safelist-based HTML-sanitizing tool."
name = "bleach"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "3.1.4"
[package.dependencies]
six = ">=1.9.0"
webencodings = "*"
[[package]] [[package]]
category = "main" category = "main"
description = "cffi-based cairo bindings for Python" description = "cffi-based cairo bindings for Python"
@ -234,6 +246,14 @@ parso = ">=0.5.2"
qa = ["flake8 (3.7.9)"] qa = ["flake8 (3.7.9)"]
testing = ["colorama (0.4.1)", "docopt", "pytest (>=3.9.0,<5.0.0)"] testing = ["colorama (0.4.1)", "docopt", "pytest (>=3.9.0,<5.0.0)"]
[[package]]
category = "main"
description = "A fast and complete Python implementation of Markdown"
name = "markdown2"
optional = false
python-versions = "*"
version = "2.3.8"
[[package]] [[package]]
category = "dev" category = "dev"
description = "A Python Parser" description = "A Python Parser"
@ -420,7 +440,7 @@ python-versions = "*"
version = "0.5.1" version = "0.5.1"
[metadata] [metadata]
content-hash = "56be8de37de7b07fbe5ca98c9ceea5ca22dbd2ddb2053e252bc41baf6293c373" content-hash = "aedaaacc2c26bf3618b35cd6ed67cbe4309526e18bb696cb37f81398e7cf9337"
python-versions = "^3.8" python-versions = "^3.8"
[metadata.files] [metadata.files]
@ -436,6 +456,10 @@ backcall = [
{file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"},
{file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"},
] ]
bleach = [
{file = "bleach-3.1.4-py2.py3-none-any.whl", hash = "sha256:cc8da25076a1fe56c3ac63671e2194458e0c4d9c7becfd52ca251650d517903c"},
{file = "bleach-3.1.4.tar.gz", hash = "sha256:e78e426105ac07026ba098f04de8abe9b6e3e98b5befbf89b51a5ef0a4292b03"},
]
cairocffi = [ cairocffi = [
{file = "cairocffi-1.1.0.tar.gz", hash = "sha256:f1c0c5878f74ac9ccb5d48b2601fcc75390c881ce476e79f4cfedd288b1b05db"}, {file = "cairocffi-1.1.0.tar.gz", hash = "sha256:f1c0c5878f74ac9ccb5d48b2601fcc75390c881ce476e79f4cfedd288b1b05db"},
] ]
@ -517,6 +541,10 @@ jedi = [
{file = "jedi-0.16.0-py2.py3-none-any.whl", hash = "sha256:b4f4052551025c6b0b0b193b29a6ff7bdb74c52450631206c262aef9f7159ad2"}, {file = "jedi-0.16.0-py2.py3-none-any.whl", hash = "sha256:b4f4052551025c6b0b0b193b29a6ff7bdb74c52450631206c262aef9f7159ad2"},
{file = "jedi-0.16.0.tar.gz", hash = "sha256:d5c871cb9360b414f981e7072c52c33258d598305280fef91c6cae34739d65d5"}, {file = "jedi-0.16.0.tar.gz", hash = "sha256:d5c871cb9360b414f981e7072c52c33258d598305280fef91c6cae34739d65d5"},
] ]
markdown2 = [
{file = "markdown2-2.3.8-py2.py3-none-any.whl", hash = "sha256:882d3607fc023cdea0ac2cd0e1147617fcb0361cb1133d3ff095417f995ff270"},
{file = "markdown2-2.3.8.tar.gz", hash = "sha256:7ff88e00b396c02c8e1ecd8d176cfa418fb01fe81234dcea77803e7ce4f05dbe"},
]
parso = [ parso = [
{file = "parso-0.6.2-py2.py3-none-any.whl", hash = "sha256:8515fc12cfca6ee3aa59138741fc5624d62340c97e401c74875769948d4f2995"}, {file = "parso-0.6.2-py2.py3-none-any.whl", hash = "sha256:8515fc12cfca6ee3aa59138741fc5624d62340c97e401c74875769948d4f2995"},
{file = "parso-0.6.2.tar.gz", hash = "sha256:0c5659e0c6eba20636f99a04f469798dca8da279645ce5c387315b2c23912157"}, {file = "parso-0.6.2.tar.gz", hash = "sha256:0c5659e0c6eba20636f99a04f469798dca8da279645ce5c387315b2c23912157"},

View file

@ -10,6 +10,8 @@ django = "^3.0.4"
django-model-utils = "^4.0.0" django-model-utils = "^4.0.0"
weasyprint = "^51" weasyprint = "^51"
pypdf2 = "^1.26.0" pypdf2 = "^1.26.0"
markdown2 = "^2.3.8"
bleach = "^3.1.4"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
ipython = "^7.13.0" ipython = "^7.13.0"

View file

@ -1,3 +1,5 @@
import bleach
import markdown2
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.db import models from django.db import models
@ -55,6 +57,14 @@ class Document(SoftDeletableModel):
objects = DocumentManager() objects = DocumentManager()
exclude_hidden = DocumentManager(include_hidden=False) exclude_hidden = DocumentManager(include_hidden=False)
@property
def html_description(self):
return markdown2.markdown(self.description)
@property
def plain_description(self):
return bleach.clean(self.html_description, tags=[], strip=True)
@property @property
def url(self): def url(self):
if self.is_local_pdf: if self.is_local_pdf:

View file

@ -218,6 +218,10 @@ ul > li:before {
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.index-listing-desc p {
margin-top: 0;
}
@media screen and (max-width: 64em ) { @media screen and (max-width: 64em ) {
#sidebar-head { #sidebar-head {
display: flex; display: flex;

View file

@ -32,7 +32,7 @@
<span class="doc-description-intro"> <span class="doc-description-intro">
{% if document.url %}Description{% else %}Content{% endif %}: {% if document.url %}Description{% else %}Content{% endif %}:
</span> </span>
<p> {{ document.description }} </p> <p> {{ document.html_description | safe }} </p>
</div> </div>
{% endif %} {% endif %}
@ -59,6 +59,6 @@
<title>The /-\ pile: {{ document.title }}</title> <title>The /-\ pile: {{ document.title }}</title>
<meta property="og:title" content="The /-\ Pile: {{ document.title }}"/> <meta property="og:title" content="The /-\ Pile: {{ document.title }}"/>
<meta property="og:url" content="{% url "pile:document" document.id %}"/> <meta property="og:url" content="{% url "pile:document" document.id %}"/>
<meta property="og:description" content="{{ document.description }}"/> <meta property="og:description" content="{{ document.plain_description }}"/>
<meta property="og:type" content="article"/> <meta property="og:type" content="article"/>
{% endblock %} {% endblock %}

View file

@ -22,7 +22,7 @@
{% endif %} {% endif %}
</div> </div>
<div class="index-listing-desc"> <div class="index-listing-desc">
{{ random_document.description }} {{ random_document.html_description | safe }}
</div> </div>
</a> </a>
</div> </div>
@ -40,7 +40,7 @@
{{ document.title }} {{ document.title }}
<div class="index-listing-desc"> <div class="index-listing-desc">
{{ document.description }} {{ document.html_description | safe }}
</div> </div>
</a> </a>
</li> </li>

View file

@ -118,7 +118,7 @@
<div class="label-otherinfo-date">(Published: {{ document.published }})</div> <div class="label-otherinfo-date">(Published: {{ document.published }})</div>
{% endif %} {% endif %}
</h3> </h3>
<p class="label-description">{{ document.description }}</p> <p class="label-description">{{ document.html_description | safe }}</p>
</div> </div>
</div> </div>
<div class="label-footer"> <div class="label-footer">