Skip to content

Commit af6f33c

Browse files
committed
Limiting custom lesson styles to a specific div
1 parent 288028a commit af6f33c

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

naucse/models.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections import OrderedDict
22
import datetime
33

4+
import cssutils
45
import dateutil.tz
56
import jinja2
67

@@ -71,7 +72,28 @@ def latex(self):
7172

7273
@reify
7374
def css(self):
74-
return self.info.get('css')
75+
""" Returns lesson-specific extra CSS.
76+
77+
If the lesson defines extra css, the scope of the styles is limited to ``.lesson-content``,
78+
a div which contains the actual lesson content.
79+
80+
This doesn't protect against malicious input.
81+
"""
82+
css = self.info.get("css")
83+
84+
if css is None:
85+
return None
86+
87+
parser = cssutils.CSSParser(raiseExceptions=True)
88+
parsed = parser.parseString(css)
89+
90+
for rule in parsed.cssRules:
91+
for selector in rule.selectorList:
92+
# the space is important - there's a difference between for example
93+
# ``.lesson-content:hover`` and ``.lesson-content :hover``
94+
selector.selectorText = ".lesson-content " + selector.selectorText
95+
96+
return parsed.cssText.decode("utf-8")
7597

7698
@reify
7799
def edit_path(self):

naucse/static/css/nausce.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ a:hover {
9191
text-decoration: none;
9292
}
9393

94+
.lesson-content {
95+
/* So elements inside with `position: absolute` are positioned absolutely just inside this div. */
96+
position: relative;
97+
}
98+
9499

95100
.lesson-header {
96101
line-height: 1.5rem;

naucse/templates/lesson.html

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
</header>
3030
{% endif %}
3131

32-
{% block lesson_content %}
33-
{{ content }}
34-
{% endblock %}
32+
<div class="lesson-content">
33+
{% block lesson_content %}
34+
{{ content }}
35+
{% endblock %}
36+
</div>
3537

3638
{% if (prv is defined and prv != None) or (nxt is defined and nxt != None) %}
3739
<hr class="lesson-end">

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ pygments
1313
python-dateutil
1414
traitlets
1515
werkzeug
16+
cssutils

0 commit comments

Comments
 (0)