Skip to content

Commit 5f7fc5a

Browse files
committed
Ship the messages using an independent JSON blob
1 parent 88fa608 commit 5f7fc5a

File tree

7 files changed

+91
-41
lines changed

7 files changed

+91
-41
lines changed

django_prose_editor/static/django_prose_editor/editor.js

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_prose_editor/static/django_prose_editor/init.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_prose_editor/widgets.py

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,52 @@
22

33
from django import forms
44
from django.conf import settings
5+
from django.forms.utils import flatatt
6+
from django.templatetags.static import static
7+
from django.utils.html import format_html, json_script, mark_safe
58
from django.utils.translation import gettext
6-
from js_asset.js import JS
9+
10+
11+
class JS:
12+
def __init__(self, src, attrs):
13+
self.src = src
14+
self.attrs = attrs
15+
16+
def __html__(self):
17+
return format_html(
18+
'<script src="{}"{}></script>',
19+
self.src
20+
if self.src.startswith(("http://", "https://", "/"))
21+
else static(self.src),
22+
mark_safe(flatatt(self.attrs)),
23+
)
24+
25+
def __eq__(self, other):
26+
return (
27+
isinstance(other, JS)
28+
and self.src == other.src
29+
and self.attrs == other.attrs
30+
)
31+
32+
def __hash__(self):
33+
return hash(self.__str__())
34+
35+
36+
class JSON:
37+
def __init__(self, id, data):
38+
self.id = id
39+
self.data = data
40+
41+
def __html__(self):
42+
return json_script(self.data, self.id)
43+
44+
def __eq__(self, other):
45+
return (
46+
isinstance(other, JSON) and self.id == other.id and self.data == other.data
47+
)
48+
49+
def __hash__(self):
50+
return hash(self.__str__())
751

852

953
def _get_presets():
@@ -35,22 +79,21 @@ def media(self):
3579
"django_prose_editor/editor.js",
3680
{"defer": True},
3781
),
82+
JSON(
83+
"django-prose-editor-settings",
84+
{
85+
"messages": {
86+
"url": gettext("URL"),
87+
"title": gettext("Title"),
88+
"update": gettext("Update"),
89+
"cancel": gettext("Cancel"),
90+
},
91+
},
92+
),
3893
*(
3994
JS(
4095
preset["script"],
41-
{
42-
"defer": True,
43-
"data-config": json.dumps(
44-
{
45-
"messages": {
46-
"url": gettext("URL"),
47-
"title": gettext("Title"),
48-
"update": gettext("Update"),
49-
"cancel": gettext("Cancel"),
50-
},
51-
}
52-
),
53-
},
96+
{"defer": True},
5497
)
5598
for key, preset in _get_presets().items()
5699
),

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ dynamic = [
3636
]
3737
dependencies = [
3838
"django>=4.2",
39-
"django-js-asset",
4039
]
4140

4241
optional-dependencies.sanitize = [

src/commands.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import { getMarkRange } from "./extendMarkRange.js"
2-
import { getHTML, parseHTML, trimmedRangeFromSelection } from "./utils.js"
2+
import {
3+
getHTML,
4+
parseHTML,
5+
settings,
6+
trimmedRangeFromSelection,
7+
} from "./utils.js"
38

49
const linkDialog = (attrs) => {
5-
const { messages } = window.__proseEditor
10+
const { messages } = settings()
611
return new Promise((resolve) => {
712
const div = document.createElement("div")
813
div.innerHTML = `
@@ -87,7 +92,7 @@ export const removeLink = (state, dispatch) => {
8792
}
8893

8994
const htmlDialog = (html) => {
90-
const { messages } = window.__proseEditor
95+
const { messages } = settings()
9196
return new Promise((resolve) => {
9297
const div = document.createElement("div")
9398
div.innerHTML = `

src/init.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
window.__proseEditor = JSON.parse(document.currentScript.dataset.config)
2-
31
const marker = "data-django-prose-editor-default"
42

53
function createEditor(textarea) {

src/utils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,8 @@ export function markActive(state, type) {
4646
if (empty) return type.isInSet(state.storedMarks || $from.marks())
4747
return state.doc.rangeHasMark(from, to, type)
4848
}
49+
50+
export function settings() {
51+
const el = document.querySelector("#django-prose-editor-settings")
52+
return el ? JSON.parse(el.textContent) : {}
53+
}

0 commit comments

Comments
 (0)