Skip to content

Commit a852d7a

Browse files
committed
fix (intentionally) bad merge
1 parent 0702776 commit a852d7a

File tree

1 file changed

+67
-71
lines changed

1 file changed

+67
-71
lines changed

src/rich-text/node-views/code-block.ts

Lines changed: 67 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,7 @@ export class CodeBlockView implements NodeView {
2727
) {
2828
this.dom = document.createElement("div");
2929
this.dom.classList.add("ps-relative", "p0", "ws-normal", "ow-normal");
30-
31-
const rawLanguage = this.getLanguageFromBlock(node);
32-
this.language = rawLanguage;
33-
34-
this.dom.innerHTML = escapeHTML`
35-
<div class="ps-absolute t2 r4 fs-fine pe-none us-none fc-black-300 js-language-indicator" contenteditable=false>${rawLanguage}</div>
36-
<pre class="s-code-block"><code class="content-dom"></code></pre>
37-
`;
38-
30+
this.render(view, getPos);
3931
this.contentDOM = this.dom.querySelector(".content-dom");
4032
this.update(node);
4133
}
@@ -49,7 +41,7 @@ export class CodeBlockView implements NodeView {
4941
const rawLanguage = this.getLanguageFromBlock(node);
5042

5143
const processorApplies = this.getValidProcessorResult(
52-
rawLanguage,
44+
rawLanguage.raw,
5345
node
5446
);
5547

@@ -68,7 +60,6 @@ export class CodeBlockView implements NodeView {
6860
const randomId = generateRandomId();
6961

7062
this.dom.innerHTML = escapeHTML`
71-
<div class="ps-absolute t2 r4 fs-fine pe-none us-none fc-black-300 js-language-indicator" contenteditable=false></div>
7263
<div class="d-flex ps-absolute t0 r0 js-processor-toggle">
7364
<label class="flex--item mr4" for="js-editor-toggle-${randomId}">
7465
Edit
@@ -79,7 +70,8 @@ export class CodeBlockView implements NodeView {
7970
</div>
8071
</div>
8172
<div class="d-none js-processor-view"></div>
82-
<pre class="s-code-block js-code-view js-code-mode"><code class="content-dom"></code></pre>`;
73+
<pre class="s-code-block js-code-view js-code-mode"><code class="content-dom"></code></pre>
74+
<div class="s-select s-select__sm ps-absolute t6 r6 js-language-indicator"><select class="js-lang-select"></select></div>`;
8375

8476
this.contentDOM = this.dom.querySelector(".content-dom");
8577

@@ -102,6 +94,8 @@ export class CodeBlockView implements NodeView {
10294
})
10395
);
10496
});
97+
98+
this.initializeLanguageSelect(view, getPos);
10599
}
106100

107101
/** Switches the view between editor mode and processor mode */
@@ -116,61 +110,6 @@ export class CodeBlockView implements NodeView {
116110
}
117111

118112
/** Gets the codeblock language from the node */
119-
private getLanguageFromBlock(node: ProsemirrorNode) {
120-
let autodetectedLanguage = node.attrs
121-
.detectedHighlightLanguage as string;
122-
123-
// add an "auto" dropdown that we can target via JS
124-
const autoOpt = document.createElement("option");
125-
autoOpt.textContent = "auto";
126-
autoOpt.value = "auto";
127-
autoOpt.className = "js-auto-option";
128-
$sel.appendChild(autoOpt);
129-
130-
getLoadedLanguages().forEach((lang) => {
131-
const opt = document.createElement("option");
132-
opt.value = lang;
133-
opt.textContent = lang;
134-
opt.defaultSelected = lang === this.language.raw;
135-
$sel.appendChild(opt);
136-
});
137-
138-
if (typeof getPos !== "function") {
139-
return;
140-
}
141-
142-
// when the dropdown is changed, update the language on the node
143-
$sel.addEventListener("change", (e) => {
144-
e.stopPropagation();
145-
146-
const newLang = $sel.value;
147-
148-
view.dispatch(
149-
view.state.tr.setNodeMarkup(getPos(), null, {
150-
params: newLang === "auto" ? null : newLang,
151-
detectedHighlightLanguage: null,
152-
})
153-
);
154-
});
155-
}
156-
157-
private updateDisplayedLanguage() {
158-
const lang = this.language.raw;
159-
const $sel =
160-
this.dom.querySelector<HTMLSelectElement>(".js-lang-select");
161-
const $auto = $sel.querySelector(".js-auto-option");
162-
163-
if (this.language.autodetected) {
164-
$sel.value = "auto";
165-
$auto.textContent = _t("nodes.codeblock_lang_auto", {
166-
lang,
167-
});
168-
} else {
169-
$sel.value = lang;
170-
$auto.textContent = _t("nodes.codeblock_auto");
171-
}
172-
}
173-
174113
private getLanguageFromBlock(node: ProsemirrorNode) {
175114
const autodetectedLanguage = node.attrs
176115
.detectedHighlightLanguage as string;
@@ -182,11 +121,13 @@ export class CodeBlockView implements NodeView {
182121
}
183122

184123
/** Updates the edit/code view */
185-
private updateCodeBlock(rawLanguage: string) {
186-
if (this.language !== rawLanguage) {
187-
this.dom.querySelector(".js-language-indicator").textContent =
188-
rawLanguage;
124+
private updateCodeBlock(rawLanguage: CodeBlockView["language"]) {
125+
if (this.language?.raw !== rawLanguage.raw) {
126+
this.dom.querySelector<HTMLSelectElement>(
127+
".js-language-indicator"
128+
).value = rawLanguage.raw;
189129
this.language = rawLanguage;
130+
this.updateDisplayedLanguage();
190131
}
191132
}
192133

@@ -245,4 +186,59 @@ export class CodeBlockView implements NodeView {
245186

246187
return processors;
247188
}
189+
190+
private initializeLanguageSelect(view: EditorView, getPos: getPosParam) {
191+
const $sel =
192+
this.dom.querySelector<HTMLSelectElement>(".js-lang-select");
193+
194+
// add an "auto" dropdown that we can target via JS
195+
const autoOpt = document.createElement("option");
196+
autoOpt.textContent = "auto";
197+
autoOpt.value = "auto";
198+
autoOpt.className = "js-auto-option";
199+
$sel.appendChild(autoOpt);
200+
201+
getLoadedLanguages().forEach((lang) => {
202+
const opt = document.createElement("option");
203+
opt.value = lang;
204+
opt.textContent = lang;
205+
opt.defaultSelected = lang === this.language?.raw;
206+
$sel.appendChild(opt);
207+
});
208+
209+
if (typeof getPos !== "function") {
210+
return;
211+
}
212+
213+
// when the dropdown is changed, update the language on the node
214+
$sel.addEventListener("change", (e) => {
215+
e.stopPropagation();
216+
217+
const newLang = $sel.value;
218+
219+
view.dispatch(
220+
view.state.tr.setNodeMarkup(getPos(), null, {
221+
params: newLang === "auto" ? null : newLang,
222+
detectedHighlightLanguage: null,
223+
})
224+
);
225+
});
226+
}
227+
228+
private updateDisplayedLanguage() {
229+
const lang = this.language?.raw;
230+
const $sel =
231+
this.dom.querySelector<HTMLSelectElement>(".js-lang-select");
232+
const $auto = $sel.querySelector(".js-auto-option");
233+
234+
if (this.language?.autodetected) {
235+
$sel.value = "auto";
236+
$auto.textContent = _t("nodes.codeblock_lang_auto", {
237+
lang,
238+
});
239+
} else {
240+
$sel.value = lang;
241+
$auto.textContent = _t("nodes.codeblock_auto");
242+
}
243+
}
248244
}

0 commit comments

Comments
 (0)