punkweb-bb 0.4.1__py3-none-any.whl → 0.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
punkweb_bb/bbcode.py CHANGED
@@ -1,71 +1,127 @@
1
1
  import bbcode
2
2
 
3
3
 
4
- def render_color(name, value, options, parent, context):
5
- if "color" in options:
6
- color = options["color"].strip()
7
- return f'<span style="color: {color}">{value}</span>'
8
- return value
4
+ def add_font_tag(parser):
5
+ def _render_font(name, value, options, parent, context):
6
+ if "font" in options:
7
+ font = options["font"].strip()
8
+ return f'<span style="font-family:{font};">{value}</span>'
9
+ return value
10
+
11
+ parser.add_formatter("font", _render_font)
12
+
13
+
14
+ def add_size_tag(parser):
15
+ def _render_size(name, value, options, parent, context):
16
+ if "size" in options:
17
+ size = options["size"].strip()
18
+ return f'<font size="{size}">{value}</font>'
19
+ return value
20
+
21
+ parser.add_formatter("size", _render_size)
22
+
23
+
24
+ def add_color_tag(parser):
25
+ def _render_color(name, value, options, parent, context):
26
+ if "color" in options:
27
+ color = options["color"].strip()
28
+ return f'<span style="color: {color}">{value}</span>'
29
+ return value
30
+
31
+ parser.add_formatter("color", _render_color)
32
+
33
+
34
+ def add_shadow_tag(parser):
35
+ def _render_shadow(name, value, options, parent, context):
36
+ if "shadow" in options:
37
+ shadow = options["shadow"].strip()
38
+ return f'<span id="bbcode-shadow" style="text-shadow: 0px 0px 1em {shadow}">{value}</span>'
39
+ return value
40
+
41
+ parser.add_formatter("shadow", _render_shadow)
42
+
43
+
44
+ def add_url_tag(parser):
45
+ def _render_url(name, value, options, parent, context):
46
+ if "url" in options:
47
+ url = options["url"]
48
+ return f'<a href="{url}">{value}</a>'
49
+ return f'<a href="{value}">{value}</a>'
50
+
51
+ parser.add_formatter(
52
+ "url", _render_url, replace_links=False, replace_cosmetic=False
53
+ )
54
+
55
+
56
+ def add_quote_tag(parser):
57
+ def _render_quote(name, value, options, parent, context):
58
+ if "quote" in options:
59
+ return f'<blockquote><cite>{options["quote"]} said: </cite>{value}</blockquote>'
60
+ return f"<blockquote>{value}</blockquote>"
61
+
62
+ parser.add_formatter(
63
+ "quote", _render_quote, strip=True, swallow_trailing_newline=True
64
+ )
65
+
66
+
67
+ def add_code_tag(parser):
68
+ def _render_code(name, value, options, parent, context):
69
+ if "code" in options:
70
+ language = options["code"].strip()
71
+ return f'<pre><code class="language-{language}">{value}</code></pre>'
72
+ return f"<pre><code>{value}</code></pre>"
73
+
74
+ parser.add_formatter(
75
+ "code",
76
+ _render_code,
77
+ render_embedded=False,
78
+ transform_newlines=False,
79
+ replace_links=False,
80
+ replace_cosmetic=False,
81
+ strip=True,
82
+ swallow_trailing_newline=True,
83
+ )
84
+
85
+
86
+ def add_img_tag(parser):
87
+ def _render_img(name, value, options, parent, context):
88
+ if "width" in options:
89
+ width = options["width"]
90
+ if "height" in options:
91
+ height = options["height"]
92
+
93
+ if "width" in options and "height" in options:
94
+ return (
95
+ f'<img src="{value}" alt="{value}" width="{width}" height="{height}" />'
96
+ )
97
+ elif "width" in options:
98
+ return f'<img src="{value}" alt="{value}" width="{width}" />'
99
+ elif "height" in options:
100
+ return f'<img src="{value}" alt="{value}" height="{height}" />'
101
+
102
+ return f'<img src="{value}" alt="{value}" />'
103
+
104
+ parser.add_formatter(
105
+ "img",
106
+ _render_img,
107
+ render_embedded=False,
108
+ replace_links=False,
109
+ replace_cosmetic=False,
110
+ )
9
111
 
10
112
 
11
- def render_shadow(name, value, options, parent, context):
12
- if "shadow" in options:
13
- shadow = options["shadow"].strip()
14
- return f'<span id="bbcode-shadow" style="text-shadow: 0px 0px 1em {shadow}">{value}</span>'
15
- return value
113
+ def add_spoiler_tag(parser):
114
+ def _render_spoiler(name, value, options, parent, context):
115
+ if "spoiler" in options:
116
+ summary = options["spoiler"]
117
+ return f"<details><summary>{summary}</summary>{value}</details>"
16
118
 
119
+ parser.add_formatter(
120
+ "spoiler", _render_spoiler, strip=True, swallow_trailing_newline=True
121
+ )
17
122
 
18
- def render_font(name, value, options, parent, context):
19
- if "font" in options:
20
- font = options["font"].strip()
21
- return f'<span style="font-family:{font};">{value}</span>'
22
- return value
23
-
24
-
25
- def render_quote(name, value, options, parent, context):
26
- if "quote" in options:
27
- return f'<blockquote><cite>{options["quote"]} said: </cite>{value}</blockquote>'
28
- return f"<blockquote>{value}</blockquote>"
29
-
30
-
31
- def render_code(name, value, options, parent, context):
32
- if "code" in options:
33
- language = options["code"].strip()
34
- return f'<pre><code class="language-{language}">{value}</code></pre>'
35
- return f"<pre><code>{value}</code></pre>"
36
-
37
-
38
- def render_img(name, value, options, parent, context):
39
- if "width" in options:
40
- width = options["width"]
41
- if "height" in options:
42
- height = options["height"]
43
-
44
- if "width" in options and "height" in options:
45
- return f'<img src="{value}" alt="{value}" width="{width}" height="{height}" />'
46
- elif "width" in options:
47
- return f'<img src="{value}" alt="{value}" width="{width}" />'
48
- elif "height" in options:
49
- return f'<img src="{value}" alt="{value}" height="{height}" />'
50
-
51
- return f'<img src="{value}" alt="{value}" />'
52
-
53
-
54
- def render_url(name, value, options, parent, context):
55
- if "url" in options:
56
- url = options["url"]
57
- return f'<a href="{url}">{value}</a>'
58
- return f'<a href="{value}">{value}</a>'
59
-
60
-
61
- def render_size(name, value, options, parent, context):
62
- if "size" in options:
63
- size = options["size"].strip()
64
- return f'<font size="{size}">{value}</font>'
65
- return value
66
-
67
-
68
- def init_default_tags(parser):
123
+
124
+ def init_text_tags(parser):
69
125
  parser.add_simple_formatter("b", "<strong>%(value)s</strong>")
70
126
  parser.add_simple_formatter("i", "<em>%(value)s</em>")
71
127
  parser.add_simple_formatter("u", "<u>%(value)s</u>")
@@ -74,82 +130,97 @@ def init_default_tags(parser):
74
130
  parser.add_simple_formatter("sup", "<sup>%(value)s</sup>")
75
131
  parser.add_simple_formatter("escape", "%(value)s", render_embedded=False)
76
132
 
77
- parser.add_formatter("font", render_font)
78
- parser.add_formatter("color", render_color)
79
- parser.add_formatter("shadow", render_shadow)
80
- parser.add_formatter("url", render_url, replace_links=False, replace_cosmetic=False)
133
+ add_color_tag(parser)
134
+ add_shadow_tag(parser)
135
+ add_font_tag(parser)
136
+ add_url_tag(parser)
137
+
138
+
139
+ def init_alignment_tags(parser):
140
+ parser.add_simple_formatter(
141
+ "center", '<div style="text-align: center">%(value)s</div>'
142
+ )
143
+ parser.add_simple_formatter("left", '<div style="text-align: left">%(value)s</div>')
144
+ parser.add_simple_formatter(
145
+ "right", '<div style="text-align: right">%(value)s</div>'
146
+ )
147
+
148
+
149
+ def init_list_tags(parser):
150
+ parser.add_simple_formatter(
151
+ "ol",
152
+ "<ol>%(value)s</ol>",
153
+ transform_newlines=False,
154
+ strip=True,
155
+ swallow_trailing_newline=True,
156
+ )
157
+ parser.add_simple_formatter(
158
+ "ul",
159
+ "<ul>%(value)s</ul>",
160
+ transform_newlines=False,
161
+ strip=True,
162
+ swallow_trailing_newline=True,
163
+ )
164
+ parser.add_simple_formatter(
165
+ "li",
166
+ "<li>%(value)s</li>",
167
+ newline_closes=True,
168
+ transform_newlines=False,
169
+ same_tag_closes=True,
170
+ strip=True,
171
+ )
172
+
173
+
174
+ def init_default_tags(parser):
175
+ init_text_tags(parser)
176
+ init_alignment_tags(parser)
177
+ init_list_tags(parser)
178
+
179
+ parser.add_simple_formatter("hr", "<hr />", standalone=True)
180
+ add_size_tag(parser)
181
+ add_img_tag(parser)
182
+ add_quote_tag(parser)
183
+ add_code_tag(parser)
184
+ add_spoiler_tag(parser)
81
185
 
82
186
 
83
187
  _parser = None
188
+ _mix_parser = None
84
189
  _shoutbox_parser = None
85
190
 
86
191
 
87
192
  def get_parser():
88
193
  global _parser
89
194
  if _parser is None:
90
- _parser = bbcode.Parser(install_defaults=False)
91
- init_default_tags(_parser)
92
-
93
- _parser.add_simple_formatter("hr", "<hr />", standalone=True)
94
- _parser.add_simple_formatter(
95
- "center", '<div style="text-align: center">%(value)s</div>'
96
- )
97
- _parser.add_simple_formatter(
98
- "left", '<div style="text-align: left">%(value)s</div>'
99
- )
100
- _parser.add_simple_formatter(
101
- "right", '<div style="text-align: right">%(value)s</div>'
102
- )
103
- _parser.add_simple_formatter(
104
- "ol",
105
- "<ol>%(value)s</ol>",
106
- transform_newlines=False,
107
- strip=True,
108
- swallow_trailing_newline=True,
109
- )
110
- _parser.add_simple_formatter(
111
- "ul",
112
- "<ul>%(value)s</ul>",
113
- transform_newlines=False,
114
- strip=True,
115
- swallow_trailing_newline=True,
116
- )
117
- _parser.add_simple_formatter(
118
- "li",
119
- "<li>%(value)s</li>",
120
- newline_closes=True,
121
- transform_newlines=False,
122
- same_tag_closes=True,
123
- strip=True,
124
- )
125
-
126
- _parser.add_formatter("size", render_size)
127
- _parser.add_formatter(
128
- "img",
129
- render_img,
130
- render_embedded=False,
131
- replace_links=False,
132
- replace_cosmetic=False,
133
- )
134
- _parser.add_formatter(
135
- "quote", render_quote, strip=True, swallow_trailing_newline=True
136
- )
137
- _parser.add_formatter(
138
- "code",
139
- render_code,
140
- render_embedded=False,
141
- transform_newlines=False,
195
+ _parser = bbcode.Parser(
196
+ install_defaults=False,
142
197
  replace_links=False,
143
198
  replace_cosmetic=False,
144
- strip=True,
145
- swallow_trailing_newline=True,
146
199
  )
200
+ init_default_tags(_parser)
147
201
  return _parser
148
202
 
149
203
 
150
204
  def get_shoutbox_parser():
151
205
  global _shoutbox_parser
152
206
  if _shoutbox_parser is None:
153
- _shoutbox_parser = bbcode.Parser(install_defaults=False)
154
- init_default_tags(_shoutbox_parser)
207
+ _shoutbox_parser = bbcode.Parser(
208
+ install_defaults=False, replace_links=False, replace_cosmetic=False
209
+ )
210
+ init_text_tags(_shoutbox_parser)
155
211
  return _shoutbox_parser
212
+
213
+
214
+ def get_mix_parser():
215
+ global _mix_parser
216
+ if _mix_parser is None:
217
+ _mix_parser = bbcode.Parser(
218
+ install_defaults=False,
219
+ newline="\n",
220
+ replace_links=False,
221
+ replace_cosmetic=False,
222
+ escape_html=False,
223
+ )
224
+ init_default_tags(_mix_parser)
225
+
226
+ return _mix_parser
@@ -3,7 +3,6 @@
3
3
  from django.conf import settings
4
4
  from django.db import migrations, models
5
5
  import django.db.models.deletion
6
- import precise_bbcode.fields
7
6
  import punkweb_bb.models
8
7
  import uuid
9
8
 
@@ -57,15 +56,9 @@ class Migration(migrations.Migration):
57
56
  ("updated_at", models.DateTimeField(auto_now=True)),
58
57
  ("name", models.CharField(max_length=255)),
59
58
  ("slug", models.SlugField(max_length=1024, unique=True)),
60
- (
61
- "_description_rendered",
62
- models.TextField(blank=True, editable=False, null=True),
63
- ),
64
59
  (
65
60
  "description",
66
- precise_bbcode.fields.BBCodeTextField(
67
- blank=True, no_rendered_field=True, null=True
68
- ),
61
+ models.TextField(blank=True, null=True),
69
62
  ),
70
63
  ("order", models.PositiveIntegerField(default=0)),
71
64
  ("staff_post_only", models.BooleanField(default=False)),
@@ -99,13 +92,9 @@ class Migration(migrations.Migration):
99
92
  ("created_at", models.DateTimeField(auto_now_add=True)),
100
93
  ("updated_at", models.DateTimeField(auto_now=True)),
101
94
  ("title", models.CharField(max_length=255)),
102
- (
103
- "_content_rendered",
104
- models.TextField(blank=True, editable=False, null=True),
105
- ),
106
95
  (
107
96
  "content",
108
- precise_bbcode.fields.BBCodeTextField(no_rendered_field=True),
97
+ models.TextField(),
109
98
  ),
110
99
  ("is_pinned", models.BooleanField(default=False)),
111
100
  ("is_closed", models.BooleanField(default=False)),
@@ -173,13 +162,9 @@ class Migration(migrations.Migration):
173
162
  ),
174
163
  ("created_at", models.DateTimeField(auto_now_add=True)),
175
164
  ("updated_at", models.DateTimeField(auto_now=True)),
176
- (
177
- "_content_rendered",
178
- models.TextField(blank=True, editable=False, null=True),
179
- ),
180
165
  (
181
166
  "content",
182
- precise_bbcode.fields.BBCodeTextField(no_rendered_field=True),
167
+ models.TextField(),
183
168
  ),
184
169
  (
185
170
  "thread",
@@ -224,15 +209,9 @@ class Migration(migrations.Migration):
224
209
  upload_to=punkweb_bb.models.profile_image_upload_to,
225
210
  ),
226
211
  ),
227
- (
228
- "_signature_rendered",
229
- models.TextField(blank=True, editable=False, null=True),
230
- ),
231
212
  (
232
213
  "signature",
233
- precise_bbcode.fields.BBCodeTextField(
234
- blank=True, max_length=1024, no_rendered_field=True, null=True
235
- ),
214
+ models.TextField(blank=True, max_length=1024, null=True),
236
215
  ),
237
216
  (
238
217
  "user",
@@ -2,7 +2,6 @@
2
2
 
3
3
  from django.db import migrations, models
4
4
  import django.db.models.deletion
5
- import precise_bbcode.fields
6
5
  import uuid
7
6
 
8
7
 
@@ -34,13 +33,9 @@ class Migration(migrations.Migration):
34
33
  default=0, help_text="Highest priority is displayed"
35
34
  ),
36
35
  ),
37
- (
38
- "_username_style_rendered",
39
- models.TextField(blank=True, editable=False, null=True),
40
- ),
41
36
  (
42
37
  "username_style",
43
- precise_bbcode.fields.BBCodeTextField(no_rendered_field=True),
38
+ models.TextField(),
44
39
  ),
45
40
  (
46
41
  "group",
@@ -10,26 +10,6 @@ class Migration(migrations.Migration):
10
10
  ]
11
11
 
12
12
  operations = [
13
- migrations.RemoveField(
14
- model_name="boardprofile",
15
- name="_signature_rendered",
16
- ),
17
- migrations.RemoveField(
18
- model_name="groupstyle",
19
- name="_username_style_rendered",
20
- ),
21
- migrations.RemoveField(
22
- model_name="post",
23
- name="_content_rendered",
24
- ),
25
- migrations.RemoveField(
26
- model_name="subcategory",
27
- name="_description_rendered",
28
- ),
29
- migrations.RemoveField(
30
- model_name="thread",
31
- name="_content_rendered",
32
- ),
33
13
  migrations.AlterField(
34
14
  model_name="boardprofile",
35
15
  name="signature",
@@ -26,6 +26,7 @@
26
26
  .profile__thread__list {
27
27
  list-style: none;
28
28
  padding: 0;
29
+ margin: 0;
29
30
  }
30
31
 
31
32
  .profile__thread {
@@ -1,32 +1,29 @@
1
1
  /*! SCEditor | (C) 2011-2013, Sam Clarke | sceditor.com/license */
2
2
  html,
3
- body {
3
+ body,
4
+ p,
5
+ code:before,
6
+ table {
4
7
  color: #212529;
5
8
  font-family: Arial, Helvetica sans-serif;
6
9
  font-size: 16px;
7
10
  font-weight: 400;
8
11
  line-height: 1.5;
9
- overflow: visible;
10
- }
11
-
12
- html {
13
- height: 100%;
14
- }
15
-
16
- * {
17
- box-sizing: border-box;
18
- }
19
-
20
- body {
21
12
  margin: 0;
13
+ overflow: visible;
22
14
  padding: 0;
23
15
  }
24
16
 
17
+ *,
25
18
  *:before,
26
19
  *:after {
27
20
  box-sizing: border-box;
28
21
  }
29
22
 
23
+ html {
24
+ height: 100%;
25
+ }
26
+
30
27
  .ios {
31
28
  /* Needed for iOS scrolling bug fix */
32
29
  overflow: auto;
@@ -50,10 +47,14 @@ body.placeholder::before {
50
47
  font-style: italic;
51
48
  }
52
49
 
53
- hr {
54
- border: none;
55
- border-top: 1px solid #ced4da;
56
- margin: 1rem 0;
50
+ table,
51
+ td {
52
+ border: 1px dotted #000;
53
+ empty-cells: show;
54
+ }
55
+
56
+ table td {
57
+ min-width: 5px;
57
58
  }
58
59
 
59
60
  a {
@@ -84,6 +85,22 @@ blockquote cite {
84
85
  font-size: 1rem;
85
86
  }
86
87
 
88
+ hr {
89
+ border: none;
90
+ border-top: 1px solid #ced4da;
91
+ margin: 1rem 0;
92
+ }
93
+
94
+ h1,
95
+ h2,
96
+ h3,
97
+ h4,
98
+ h5,
99
+ h6 {
100
+ padding: 0;
101
+ margin: 0;
102
+ }
103
+
87
104
  /* Prevent empty paragraphs from collapsing */
88
105
  div,
89
106
  p {
@@ -1,11 +1,11 @@
1
1
  {% extends 'punkweb_bb/base_modal.html' %}
2
2
 
3
3
  {% block content %}
4
- <p>
4
+ <div>
5
5
  Are you sure you want to delete this {% block object_type %}{% endblock %}?
6
6
  <br />
7
7
  <b>This action cannot be undone!</b>
8
- </p>
8
+ </div>
9
9
  <div class="modal__actions">
10
10
  <button class="modal__cancel pw-button default">Cancel</button>
11
11
  <button class="pw-button raised danger" hx-delete="{% block delete_url %}{% endblock %}">Delete</button>
@@ -65,7 +65,7 @@
65
65
  </div>
66
66
  {% if user.threads.count == 0 %}
67
67
  <div class="pw-card-content">
68
- <p>{{ user.username }} has not created any threads.</p>
68
+ <div>{{ user.username }} has not created any threads.</div>
69
69
  </div>
70
70
  {% else %}
71
71
  <ul class="profile__thread__list">
@@ -75,9 +75,9 @@
75
75
  <div class="profile__thread__title">
76
76
  <a href="{% url 'punkweb_bb:thread' thread.id %}">{{ thread.title }}</a>
77
77
  </div>
78
- <p class="profile__thread__preview">
78
+ <div class="profile__thread__preview">
79
79
  {{ thread.content|render|striptags|truncatechars:120 }}
80
- </p>
80
+ </div>
81
81
  <div class="profile__thread__date">
82
82
  <time datetime="{{thread.created_at|date:'c'}}">
83
83
  {{thread.created_at|date:'M j, Y'}} at
@@ -320,7 +320,7 @@
320
320
  <div class="pw-card fluid margin">
321
321
  <div class="pw-card-header">Thread closed</div>
322
322
  <div class="pw-card-content">
323
- <p>This thread is closed and you cannot reply to it.</p>
323
+ <div>This thread is closed and you cannot reply to it.</div>
324
324
  </div>
325
325
  </div>
326
326
  {% endif %}
@@ -5,7 +5,7 @@ from django import template
5
5
  from django.template.defaultfilters import stringfilter
6
6
  from django.utils.safestring import mark_safe
7
7
 
8
- from punkweb_bb.bbcode import get_parser, get_shoutbox_parser
8
+ from punkweb_bb.bbcode import get_mix_parser, get_parser, get_shoutbox_parser
9
9
  from punkweb_bb.settings import PARSER
10
10
 
11
11
  register = template.Library()
@@ -22,6 +22,12 @@ def render(value):
22
22
  escaped = html.escape(value, quote=False)
23
23
  rendered = md.markdown(escaped, extensions=["markdown.extensions.fenced_code"])
24
24
  return mark_safe(rendered)
25
+ elif PARSER == "mix":
26
+ parser = get_mix_parser()
27
+ escaped = html.escape(value, quote=False)
28
+ rendered = parser.format(escaped)
29
+ rendered = md.markdown(rendered, extensions=["markdown.extensions.fenced_code"])
30
+ return mark_safe(rendered)
25
31
  return value
26
32
 
27
33
 
@@ -32,4 +38,8 @@ def render_shout(value):
32
38
  parser = get_shoutbox_parser()
33
39
  rendered = parser.format(value)
34
40
  return mark_safe(rendered)
41
+ if PARSER == "mix":
42
+ parser = get_shoutbox_parser()
43
+ rendered = parser.format(value)
44
+ return mark_safe(rendered)
35
45
  return value
punkweb_bb/utils.py CHANGED
@@ -11,6 +11,8 @@ def get_editor_widget():
11
11
  return BBCodeEditorWidget()
12
12
  elif PARSER == "markdown":
13
13
  return MarkdownEditorWidget()
14
+ elif PARSER == "mix":
15
+ return MarkdownEditorWidget()
14
16
  return Textarea(attrs={"class": "pw-input"})
15
17
 
16
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: punkweb-bb
3
- Version: 0.4.1
3
+ Version: 0.4.3
4
4
  Summary: Django application that provides a simple and modern forum board software for your Django website.
5
5
  Home-page: https://github.com/Punkweb/PunkwebBB
6
6
  Author: Punkweb
@@ -2,7 +2,7 @@ punkweb_bb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  punkweb_bb/admin.py,sha256=W8f91MenKxds6RUOxL0OkXuoHTGL76zZ-nqZEATPONU,2640
3
3
  punkweb_bb/admin_forms.py,sha256=nvHKaqJx6rJv5G8yzaDcWYU9gsytg9gMJkz79v8bdUc,1414
4
4
  punkweb_bb/apps.py,sha256=GCDLy9B9vumeCsaauQ7LN4FOqE02mXWXECIz8G6KZCQ,207
5
- punkweb_bb/bbcode.py,sha256=AH8x-X4xst0S8Xlyiv18X_RuPAyCGGHEm4H4ChccjM8,4983
5
+ punkweb_bb/bbcode.py,sha256=r0PDZF6L6VoKOm1r-JA9wgi1iKWrjJ9QPcvVZuYOrs0,6499
6
6
  punkweb_bb/context_processors.py,sha256=BEOGvWVukvxJUxWZBIc32ioB-mGqImSEBuhhZjqI2G0,146
7
7
  punkweb_bb/forms.py,sha256=jFW7VDV2tAuHymt_3F20TyWXNq_3ZJ-_KQdeZOk2Sbo,3130
8
8
  punkweb_bb/guests.py,sha256=Nvn4ZVJvQSQs_f-GeSwNn79Qp8ap_CAoXpYfRTqSbxg,467
@@ -15,14 +15,14 @@ punkweb_bb/settings.py,sha256=7ySSAgNiefcdNWtGBPhMh2V8FVnrY7cpdeVIZ5Om7NM,605
15
15
  punkweb_bb/signals.py,sha256=bVdfg942Mwq-fYDZ1Z52Q0V2BCk1lgzGz8JVZFPnzJ8,365
16
16
  punkweb_bb/tests.py,sha256=puvvh789RvK5UxPzol7dFmQPU1dfGPjzjuQ5vka6oT0,26298
17
17
  punkweb_bb/urls.py,sha256=AkTP3VTb6mr0eQU2Wr7C4ZEKvrRDj9mRUFveWOgdE28,2673
18
- punkweb_bb/utils.py,sha256=qxfs8sgWVI55MbAiwfuZ-Ln-v3hRGj_4XhpMbjNCnH0,1568
18
+ punkweb_bb/utils.py,sha256=dtSBMds4xXg_jWxumUfKBXcz_uocDJDtSMnvoBDW_kM,1632
19
19
  punkweb_bb/views.py,sha256=hVys3rHUswD9NS4hL-RN3gIo2SnqY52NKyEoiC2lhOw,18010
20
20
  punkweb_bb/widgets.py,sha256=uIkXnIvYLNncWWyQV069Y2YgeB1m_YG8r5y2ztkdrO8,1502
21
21
  punkweb_bb/__pycache__/__init__.cpython-311.pyc,sha256=3PyxCxoznfadaGt0a7re4j0Ky9z9hblufpcwPB85kK8,161
22
22
  punkweb_bb/__pycache__/admin.cpython-311.pyc,sha256=dNdyvl0j28dlAhcN7nE1KezjP4786itp9rQ3Jq_mooc,3810
23
23
  punkweb_bb/__pycache__/admin_forms.cpython-311.pyc,sha256=ggTP4ngqAlyR1z91zjxh2s5AwzcmRV1EtxTuttZ5aq4,3605
24
24
  punkweb_bb/__pycache__/apps.cpython-311.pyc,sha256=lw328DOwOp1F8FWTFYb3qV1EoBNgRr_Tc4J8DXfIl-I,730
25
- punkweb_bb/__pycache__/bbcode.cpython-311.pyc,sha256=dwVCqvevfi93vv5ROEniMOpcrxjPOnhvsCDnox1gbEQ,6638
25
+ punkweb_bb/__pycache__/bbcode.cpython-311.pyc,sha256=d3buFSe305P1oQU5WCp6j2KWHW2ecwS8TMFTDN2TZNI,9624
26
26
  punkweb_bb/__pycache__/bbcode_tags.cpython-311.pyc,sha256=QI4BJt5plqLMiAvlVAxibuNONi69PJFQpotpS50olro,8534
27
27
  punkweb_bb/__pycache__/context_processors.cpython-311.pyc,sha256=P7rEsodXonYexbS5vUaUKVJ9tIx1pOVk6NQWVvWNvS8,392
28
28
  punkweb_bb/__pycache__/forms.cpython-311.pyc,sha256=GYifujT3WNioRq9FBFyhNpVpOOYIUJC2u9o4CFidfk8,6735
@@ -39,22 +39,22 @@ punkweb_bb/__pycache__/sitemap.cpython-311.pyc,sha256=GFjuUD20_ikJWj7IFT1Cn7Od-r
39
39
  punkweb_bb/__pycache__/tags.cpython-311.pyc,sha256=nr_Va9Nz8H6kUjxx8mDJi3D4gGo31K92BZKRXHgBFuw,1052
40
40
  punkweb_bb/__pycache__/tests.cpython-311.pyc,sha256=5PSZQVuRWikAHkjKPxn69XWLSHO5PXxzmzSWqG0dOPQ,51701
41
41
  punkweb_bb/__pycache__/urls.cpython-311.pyc,sha256=enGd9gcLCxN77wcy6a7v_WCTut0OWwURscNptONTzPk,3686
42
- punkweb_bb/__pycache__/utils.cpython-311.pyc,sha256=zFY5S4BmYPoiWMVrvaxsvtuabYVjz7cPMZQ4PpKvD0s,2823
42
+ punkweb_bb/__pycache__/utils.cpython-311.pyc,sha256=KlAzhCzyXMiVWZplwzIo4VR9O7KETgR-yjobFhrAecU,2899
43
43
  punkweb_bb/__pycache__/views.cpython-311.pyc,sha256=aA95XS49Ab4c8R6ia_JUqELT03QNsRh-ftkMMLpQVv8,26263
44
- punkweb_bb/__pycache__/widgets.cpython-311.pyc,sha256=gqOCVpoOMIpedui0OQX7kMUnY4Vs2wFt3TLbtUWvkzY,2640
45
- punkweb_bb/migrations/0001_initial.py,sha256=3RGsylygBcWx1kIPhSzOb9v_2yvowsxKfxuSinKKuS0,8950
44
+ punkweb_bb/__pycache__/widgets.cpython-311.pyc,sha256=GRDHKCHqMnsUQJez-enP34Dayw0AR0TUPYPrij6QhmM,2640
45
+ punkweb_bb/migrations/0001_initial.py,sha256=q3NxJpRSnBWtY0ZPVlV957krfs3pF_ec7K2G5llYPZs,8027
46
46
  punkweb_bb/migrations/0002_thread_view_count.py,sha256=JJZT53Mp8Ofht3oIi67s-0wzCdpYyu8wOeCi_B8q8Yo,388
47
47
  punkweb_bb/migrations/0003_alter_thread_options.py,sha256=0xwVfSMWs28akDMhMwOdyyuC7JZ47JekkphT8fUCpcA,589
48
- punkweb_bb/migrations/0004_groupstyle.py,sha256=DKcTMFkAj903MvrSheMKquCVIOzanZoFakZLIE63nLo,1821
48
+ punkweb_bb/migrations/0004_groupstyle.py,sha256=J7k0WVvEJ6kgRUiIVK0gvnzX-GafXGApY2EVfksjICU,1587
49
49
  punkweb_bb/migrations/0005_alter_thread_options.py,sha256=00gO0a45aTqnLfF4i_KZ7xJFk_wbz78FgUBtEzn_9GA,638
50
- punkweb_bb/migrations/0006_remove_boardprofile__signature_rendered_and_more.py,sha256=jof8vd_LPnknWaEky2jqNHQFlJgke76Dy_tfZtafCRE,1699
50
+ punkweb_bb/migrations/0006_remove_boardprofile__signature_rendered_and_more.py,sha256=qY9pTMM00Ornd6tCEUtgo6chbgsiR-yiYCWOqtAQH6w,1103
51
51
  punkweb_bb/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- punkweb_bb/migrations/__pycache__/0001_initial.cpython-311.pyc,sha256=koi_VflndmTKzSXWstWBXuVEZgEeueId5NE4kOAlA4Q,6456
52
+ punkweb_bb/migrations/__pycache__/0001_initial.cpython-311.pyc,sha256=5A89XuMpiV3_UbK7PScNkaLLauzEAMUUYfwPE3GIc0s,5827
53
53
  punkweb_bb/migrations/__pycache__/0002_thread_view_count.cpython-311.pyc,sha256=9HRllkD8LHPXadyurYvp2UcmRFEywalUVQjiOGWizgc,815
54
54
  punkweb_bb/migrations/__pycache__/0003_alter_thread_options.cpython-311.pyc,sha256=zK9keYR8PU92_sP5M78xmFJeLGwSnM5tIo09bU-IpOU,860
55
- punkweb_bb/migrations/__pycache__/0004_groupstyle.cpython-311.pyc,sha256=5wYwjAe30bSea8PswtRkIw8vrxIVk9tUZmUWXanJ2dk,2000
55
+ punkweb_bb/migrations/__pycache__/0004_groupstyle.cpython-311.pyc,sha256=vJ0ybv72N8ZuCJTtPLs51LJTekf7EDBsiJshhX9wTT0,1741
56
56
  punkweb_bb/migrations/__pycache__/0005_alter_thread_options.cpython-311.pyc,sha256=O4FHKUuzw7PXt5SwJXLEtL0Hdfkj2uDkVNSDP25vWHw,885
57
- punkweb_bb/migrations/__pycache__/0006_remove_boardprofile__signature_rendered_and_more.cpython-311.pyc,sha256=mmIZb-1Eq32wS0WQdC7xXvOcbvnjZaHFiPqnB1biXYY,1901
57
+ punkweb_bb/migrations/__pycache__/0006_remove_boardprofile__signature_rendered_and_more.cpython-311.pyc,sha256=GKU0aIqZMZ2hlzle0RnNBDm7DNLTHstXTtd8gsFfqnw,1461
58
58
  punkweb_bb/migrations/__pycache__/__init__.cpython-311.pyc,sha256=sTbC1AXnh0V4BJwjcjs1ckdeYjG01I348hZwLE2HI4Y,172
59
59
  punkweb_bb/static/punkweb_bb/favicon.ico,sha256=lEfX--R9wEGPkkXgLYCsGmHuAGajigiqBXAoonxq8ZM,318
60
60
  punkweb_bb/static/punkweb_bb/css/category-form.css,sha256=lvG7Lh2GGBVplKk46JAIHF1cmFLve2JT32BswmudIF8,359
@@ -63,7 +63,7 @@ punkweb_bb/static/punkweb_bb/css/index.css,sha256=Jr4P0uLQ0lhM1ujycNVYYnu6tFmFXV
63
63
  punkweb_bb/static/punkweb_bb/css/login.css,sha256=pt5ul4ycZsVB-No3c5gsQa1zVS1iAZgteN1CcllS26k,234
64
64
  punkweb_bb/static/punkweb_bb/css/members.css,sha256=1Fz0uVDbs3RnuXNjOtnGnK2jok3LEQBoPhjRYp7gNwE,395
65
65
  punkweb_bb/static/punkweb_bb/css/post-form.css,sha256=rEiYplAobLjjUYAcnjNqIjyIVhe9O5hAlPJ3STW-K14,321
66
- punkweb_bb/static/punkweb_bb/css/profile.css,sha256=yfNJT_D-05deqiBrdIgPeCSO_DFSL8-fGEEHnGrCIYM,916
66
+ punkweb_bb/static/punkweb_bb/css/profile.css,sha256=QdsO8qHxOuCq0jz4tH64Hr9k5_E6T4bRaau5m2QnO5Y,929
67
67
  punkweb_bb/static/punkweb_bb/css/punkweb-modal.css,sha256=5iT8bVOmC2fhgx1YCgD6IOvUiWTT1LXV0bo_FU2MEzE,1331
68
68
  punkweb_bb/static/punkweb_bb/css/punkweb.css,sha256=Rtkz917V0ZjI9vIslBVesyexwi1WYQW92BuoVqbIBJ4,14557
69
69
  punkweb_bb/static/punkweb_bb/css/settings.css,sha256=ulQQFTu8slk2rYOmhvci5v-AVnguUuDhKQDhyQOsQNU,308
@@ -74,7 +74,7 @@ punkweb_bb/static/punkweb_bb/css/thread-form.css,sha256=9MfqocnamNMjeNJ-w6YTwYbm
74
74
  punkweb_bb/static/punkweb_bb/css/thread.css,sha256=1E7FPNCmvLyOC6xSYmslVho6vde3-t1ex_Hz8GA1k6s,2032
75
75
  punkweb_bb/static/punkweb_bb/css/typography.css,sha256=qbFGBcU-OOe7r41xeW0Gc_9x6yHxhh81XtswmFxgavc,448
76
76
  punkweb_bb/static/punkweb_bb/css/variables.css,sha256=WphZPeJgeqMYy4JYaSTX0gX-JiZh8EJlhieGOGk75DA,1193
77
- punkweb_bb/static/punkweb_bb/editor/bbcode-editor-content.css,sha256=qAjglfH5ePgwlY0an6eC8yvasjKpCjf0KUoeCNg2aZg,1435
77
+ punkweb_bb/static/punkweb_bb/editor/bbcode-editor-content.css,sha256=kVycBvZMkoKFBx9V7f3eOhflK0QbEqpPtsZA_S8Fm6M,1568
78
78
  punkweb_bb/static/punkweb_bb/editor/bbcode-editor-tags.js,sha256=pLgF7lIJnPQXpfqQnkTHBU5tjcvICDHpn2nhvzxwUqA,1624
79
79
  punkweb_bb/static/punkweb_bb/editor/bbcode-editor.css,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  punkweb_bb/static/punkweb_bb/editor/bbcode-editor.js,sha256=_8McMObUj-Uj37awYk7dc4IQGfGCVYvhfdSFzwohRQU,473
@@ -261,7 +261,7 @@ punkweb_bb/static/punkweb_bb/vendor/tiny-markdown-editor/src/svg/strikethrough.s
261
261
  punkweb_bb/static/punkweb_bb/vendor/tiny-markdown-editor/src/svg/svg.js,sha256=obYUuT3e93tEEo55Km8pIxTwTv0QG-iOPFzDIJANSz0,4350
262
262
  punkweb_bb/static/punkweb_bb/vendor/tiny-markdown-editor/src/svg/ul.svg,sha256=3W6IEbK__WiV-VsUQZV4GnBy_6uKkwVEnbzLjksPbbc,495
263
263
  punkweb_bb/templates/punkweb_bb/base.html,sha256=-swjri5cx547vuLVApepf8AchoAVrK2TjwtV7lmxdZc,4426
264
- punkweb_bb/templates/punkweb_bb/base_delete_modal.html,sha256=Od6qBPgnY9-6JvUHAlsXcEbXzo39qc5YC-omfaN7Nnk,422
264
+ punkweb_bb/templates/punkweb_bb/base_delete_modal.html,sha256=S2UkzKETArEUWLgSYtC5cD2l5WLNH0z1SwtRkUkCMoE,426
265
265
  punkweb_bb/templates/punkweb_bb/base_modal.html,sha256=OCbtsMWeNCO0Tl1PmHCcGkwoi1OZjeIK_VhNTzMor7M,460
266
266
  punkweb_bb/templates/punkweb_bb/bbcode.html,sha256=r65rMEAtbB4TXDBD9wIht8w8kqNxetMsNNGR5hY62QQ,390
267
267
  punkweb_bb/templates/punkweb_bb/category_create.html,sha256=773uJzxVvuPmWVrW87EoQTBNoo6cyi3UBp_PZn6JY5A,1369
@@ -269,13 +269,13 @@ punkweb_bb/templates/punkweb_bb/category_update.html,sha256=GUFo19BXY8JVvxP7cWAy
269
269
  punkweb_bb/templates/punkweb_bb/index.html,sha256=p2Lzw8DhjawebN0iGaDvMQPFZupOCebGwvBv5uXltEk,10519
270
270
  punkweb_bb/templates/punkweb_bb/login.html,sha256=Hsmt_Y50nTOEv7hBjACXMSEmIVCl-IqDv15iE-wo2cY,1137
271
271
  punkweb_bb/templates/punkweb_bb/members.html,sha256=QiG7VllECM4iE5-rIIyterepJ-O51o9NtIsjLvKrwGs,2886
272
- punkweb_bb/templates/punkweb_bb/profile.html,sha256=-a0Liyp2vJ8uQedlCIIEdPWog0fnnSYRdtDddbxb_Vg,3203
272
+ punkweb_bb/templates/punkweb_bb/profile.html,sha256=ZW5J88BrHcnFHI9h_1zj7t3k3eVn3vMaRZUerHfc6k8,3211
273
273
  punkweb_bb/templates/punkweb_bb/settings.html,sha256=pxEgQQxK1lk2UKL1W3YL-liAERo2mFgUNAJtshe13xk,2047
274
274
  punkweb_bb/templates/punkweb_bb/signup.html,sha256=LMs_EwdEbBmFt4zXPt_LmtUujmBJVt0zE0LldgfhrY0,1219
275
275
  punkweb_bb/templates/punkweb_bb/subcategory.html,sha256=QDZCLtKZqEgNjHlVeJVwEqUCWYEal3X3JoKlqQY9Zzc,5893
276
276
  punkweb_bb/templates/punkweb_bb/subcategory_create.html,sha256=8FhcWKiaYGIulrOaBzQ6qFMpDvsAnX_q-XJ5mKwBLW8,1521
277
277
  punkweb_bb/templates/punkweb_bb/subcategory_update.html,sha256=kOq6tuhNBSMVQkBSpHpU06JuQ3h008fOKqLcxe9PgCg,1638
278
- punkweb_bb/templates/punkweb_bb/thread.html,sha256=l6C04NiqLHdvJ9MEblfvcyabXo3pbkC5mK_lSCYnN8I,11201
278
+ punkweb_bb/templates/punkweb_bb/thread.html,sha256=lXSnYXI7-jGQaWep1X-jf3Wc5IpAKpsyKdBRDLGzUy0,11205
279
279
  punkweb_bb/templates/punkweb_bb/thread_create.html,sha256=vCwU8GNBwy7pJ2X-jSTgqvAuqgQ_NeSvRDyieBWhP_g,1697
280
280
  punkweb_bb/templates/punkweb_bb/thread_update.html,sha256=SLL_5tceZ8ZiPbWCO9eOe_aeMgV5lQ-p6eun1_XvKwE,1730
281
281
  punkweb_bb/templates/punkweb_bb/partials/category_delete.html,sha256=WmZho6dr9IHww1vL_MvENvnGL63wOgMjZHlip6McYxE,234
@@ -293,7 +293,7 @@ punkweb_bb/templatetags/can_delete.py,sha256=NiFi_VH3KKaAYxdu9cZXR9gT9SNEeLAxnbx
293
293
  punkweb_bb/templatetags/can_edit.py,sha256=CbnbCcmJkeHZbWbsMn5OmCXMBEa6N1KW6W1dHLQvdWM,133
294
294
  punkweb_bb/templatetags/can_post.py,sha256=6J1ojqqyNX99DBZM30jQiirQxAyY5rMi05QXXQjJB7I,133
295
295
  punkweb_bb/templatetags/humanize_int.py,sha256=C4KmDG0Jv6o8rwT1RXLdWoGLddJxMxgOoRV9I2598AM,248
296
- punkweb_bb/templatetags/render.py,sha256=aiT8zUdQEL9w9bIW7m4-RczSaUluUoeh2ZucEf2iryI,947
296
+ punkweb_bb/templatetags/render.py,sha256=0uhYuB-FWTzIqgVXMdzVb_CS_e68pzrJ1xtMFvhVYeQ,1377
297
297
  punkweb_bb/templatetags/styled_group_name.py,sha256=ybg2SnrXg8nyfZBZOW4L_IV-BlTPrs3EKZ48GsKd-3A,257
298
298
  punkweb_bb/templatetags/styled_username.py,sha256=1bv6_ss8elDtuJosAYBlKagUciUXb_WlA5X8O4mKtLI,202
299
299
  punkweb_bb/templatetags/__pycache__/__init__.cpython-311.pyc,sha256=VEPKwaIhqpKpSSJiotDYngAUdidDzR9PpPiHtKEl1jA,174
@@ -303,14 +303,14 @@ punkweb_bb/templatetags/__pycache__/can_post.cpython-311.pyc,sha256=1IU4-Ar-kwjn
303
303
  punkweb_bb/templatetags/__pycache__/humanize_count.cpython-311.pyc,sha256=UKD6_5RX8YpYpg-LPrgGxBkW56THsbYY51cKTYdKwRY,621
304
304
  punkweb_bb/templatetags/__pycache__/humanize_int.cpython-311.pyc,sha256=csY5ek-bevYVeM91hYFKozuKWXCTXb7M-7Bokwdxhrk,619
305
305
  punkweb_bb/templatetags/__pycache__/markdown.cpython-311.pyc,sha256=gVou8LgnZCf7b5_D52rimaEICsav98nb1YJic10nQyA,1858
306
- punkweb_bb/templatetags/__pycache__/render.cpython-311.pyc,sha256=ZHNy-xp7zeBsVcai7qRvU_PeICLnAO5rPPJKNGYIu18,1899
306
+ punkweb_bb/templatetags/__pycache__/render.cpython-311.pyc,sha256=sHK8W5o8-aXEmh_fyscHwmDMO0YUGb8gWmWw0-_xSCE,2425
307
307
  punkweb_bb/templatetags/__pycache__/shoutbox_bbcode.cpython-311.pyc,sha256=h5Md024xXjG3N574GjQWR8u4c8UsCsiBWP_usQiJUdE,945
308
308
  punkweb_bb/templatetags/__pycache__/shoutbox_render.cpython-311.pyc,sha256=FT-Y3-st8ZLrLNiWWlR308lMi7bmu57YyBpdmF_JEKQ,810
309
309
  punkweb_bb/templatetags/__pycache__/styled_group_name.cpython-311.pyc,sha256=1rXkWaqTzivl0uvVs-UiPHOfvx7rOO4Kce6Elhoer_I,712
310
310
  punkweb_bb/templatetags/__pycache__/styled_username.cpython-311.pyc,sha256=a91ogyUeLdHS9rEU28FWEYeVqcJopjbvPPdnGkmlHKI,628
311
311
  punkweb_bb/templatetags/__pycache__/username.cpython-311.pyc,sha256=GvZkwtrFvkRr1RbxoejyKMmJXr01ABz3lVEwPNq4wxk,626
312
- punkweb_bb-0.4.1.dist-info/LICENSE,sha256=YYysF07B-kyXSO7IWFB9f49ZXa6LIFUTVsR1Ogmhp8s,1507
313
- punkweb_bb-0.4.1.dist-info/METADATA,sha256=W9eOgKixNUN4VigO7cXThoykN11tgT4zFcTRYtCm9Do,5888
314
- punkweb_bb-0.4.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
315
- punkweb_bb-0.4.1.dist-info/top_level.txt,sha256=sWuGdGnk0ejOXiFDzlBqrNs2VbPEx0_i8UwWXn4SuHU,11
316
- punkweb_bb-0.4.1.dist-info/RECORD,,
312
+ punkweb_bb-0.4.3.dist-info/LICENSE,sha256=YYysF07B-kyXSO7IWFB9f49ZXa6LIFUTVsR1Ogmhp8s,1507
313
+ punkweb_bb-0.4.3.dist-info/METADATA,sha256=xoQNbjkYl1Kuj41sT1O3nESku465DodIQr6HVMet_aQ,5888
314
+ punkweb_bb-0.4.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
315
+ punkweb_bb-0.4.3.dist-info/top_level.txt,sha256=sWuGdGnk0ejOXiFDzlBqrNs2VbPEx0_i8UwWXn4SuHU,11
316
+ punkweb_bb-0.4.3.dist-info/RECORD,,