@techie_doubts/editor-plugin-code-syntax-highlight 3.1.0

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.
@@ -0,0 +1,803 @@
1
+ /*!
2
+ * TOAST UI Editor : Code Syntax Highlight Plugin
3
+ * @version 3.1.0 | Fri Feb 20 2026
4
+ * @author NHN Cloud FE Development Lab <dl_javascript@nhn.com>
5
+ * @license MIT
6
+ */
7
+ /******/ (function() { // webpackBootstrap
8
+ /******/ "use strict";
9
+ /******/ // The require scope
10
+ /******/ var __webpack_require__ = {};
11
+ /******/
12
+ /************************************************************************/
13
+ /******/ /* webpack/runtime/define property getters */
14
+ /******/ !function() {
15
+ /******/ // define getter functions for harmony exports
16
+ /******/ __webpack_require__.d = function(exports, definition) {
17
+ /******/ for(var key in definition) {
18
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
19
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
20
+ /******/ }
21
+ /******/ }
22
+ /******/ };
23
+ /******/ }();
24
+ /******/
25
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
26
+ /******/ !function() {
27
+ /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
28
+ /******/ }();
29
+ /******/
30
+ /************************************************************************/
31
+ var __webpack_exports__ = {};
32
+
33
+ // EXPORTS
34
+ __webpack_require__.d(__webpack_exports__, {
35
+ "default": function() { return /* binding */ src; }
36
+ });
37
+
38
+ ;// ./src/renderers/toHTMLRenderers.ts
39
+ var BACKTICK_COUNT = 3;
40
+ var LINE_NUM_RE = /^(.+?)=(\d*)$/;
41
+ function parseInfoString(raw) {
42
+ var match = raw.match(LINE_NUM_RE);
43
+ if (match) {
44
+ return { lang: match[1], lineNumber: match[2] ? Number(match[2]) : 1 };
45
+ }
46
+ return { lang: raw, lineNumber: null };
47
+ }
48
+ function buildGutterHTML(lineNumber, lineCount) {
49
+ var nums = [];
50
+ for (var i = 0; i < lineCount; i += 1) {
51
+ nums.push(String(lineNumber + i));
52
+ }
53
+ return nums.join('\n');
54
+ }
55
+ function getHTMLRenderers(prism) {
56
+ return {
57
+ codeBlock: function (node) {
58
+ var _a = node, fenceLength = _a.fenceLength, info = _a.info;
59
+ var infoWords = info ? info.split(/\s+/) : [];
60
+ var preClasses = [];
61
+ var codeAttrs = {};
62
+ var preAttrs = {};
63
+ var lineNumber = null;
64
+ if (fenceLength > BACKTICK_COUNT) {
65
+ codeAttrs['data-backticks'] = fenceLength;
66
+ }
67
+ var content = node.literal;
68
+ if (infoWords.length && infoWords[0].length) {
69
+ var parsed = parseInfoString(infoWords[0]);
70
+ var lang = parsed.lang;
71
+ lineNumber = parsed.lineNumber;
72
+ preClasses.push("lang-" + lang);
73
+ codeAttrs['data-language'] = lang;
74
+ var registeredLang = prism.languages[lang];
75
+ if (registeredLang) {
76
+ content = prism.highlight(node.literal, registeredLang, lang);
77
+ }
78
+ }
79
+ if (lineNumber !== null) {
80
+ var lineCount = (node.literal || '').replace(/\n$/, '').split('\n').length;
81
+ var gutterText = buildGutterHTML(lineNumber, lineCount);
82
+ preClasses.push('line-numbers');
83
+ preAttrs['data-line-numbers'] = gutterText;
84
+ }
85
+ return [
86
+ { type: 'openTag', tagName: 'pre', classNames: preClasses, attributes: preAttrs },
87
+ { type: 'openTag', tagName: 'code', attributes: codeAttrs },
88
+ { type: 'html', content: content },
89
+ { type: 'closeTag', tagName: 'code' },
90
+ { type: 'closeTag', tagName: 'pre' },
91
+ ];
92
+ },
93
+ };
94
+ }
95
+
96
+ ;// ./src/utils/common.ts
97
+ function flatten(arr) {
98
+ return arr.reduce(function (a, b) { return a.concat(Array.isArray(b) ? flatten(b) : b); }, []);
99
+ }
100
+
101
+ ;// ./src/plugins/codeSyntaxHighlighting.ts
102
+ var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {
103
+ for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
104
+ to[j] = from[i];
105
+ return to;
106
+ };
107
+
108
+ var NODE_TYPE = 'codeBlock';
109
+ function findCodeBlocks(doc) {
110
+ var descendants = [];
111
+ doc.descendants(function (node, pos) {
112
+ if (node.isBlock && node.type.name === NODE_TYPE) {
113
+ descendants.push({ node: node, pos: pos });
114
+ }
115
+ });
116
+ return descendants;
117
+ }
118
+ function parseTokens(tokens, classNames) {
119
+ if (classNames === void 0) { classNames = []; }
120
+ if (typeof tokens === 'string') {
121
+ return [{ text: tokens, classes: classNames }];
122
+ }
123
+ return tokens.map(function (token) {
124
+ var _a = token, type = _a.type, alias = _a.alias;
125
+ var typeClassNames = [];
126
+ var aliasClassNames = [];
127
+ if (type) {
128
+ typeClassNames = ['token', type];
129
+ }
130
+ if (alias) {
131
+ aliasClassNames = typeof alias === 'string' ? [alias] : alias;
132
+ }
133
+ var classes = __spreadArray(__spreadArray(__spreadArray([], classNames), typeClassNames), aliasClassNames);
134
+ return typeof token === 'string'
135
+ ? {
136
+ text: token,
137
+ classes: classes,
138
+ }
139
+ : parseTokens(token.content, classes);
140
+ });
141
+ }
142
+ function getDecorations(doc, context, prism) {
143
+ var pmView = context.pmView;
144
+ var decorations = [];
145
+ var codeBlocks = findCodeBlocks(doc);
146
+ codeBlocks.forEach(function (_a) {
147
+ var pos = _a.pos, node = _a.node;
148
+ var language = node.attrs.language;
149
+ var registeredLang = prism.languages[language];
150
+ var prismTokens = registeredLang ? prism.tokenize(node.textContent, registeredLang) : [];
151
+ var nodeInfos = flatten(parseTokens(prismTokens));
152
+ var startPos = pos + 1;
153
+ nodeInfos.forEach(function (_a) {
154
+ var text = _a.text, classes = _a.classes;
155
+ var from = startPos;
156
+ var to = from + text.length;
157
+ startPos = to;
158
+ var classNames = classes.join(' ');
159
+ var decoration = pmView.Decoration.inline(from, to, {
160
+ class: classNames,
161
+ });
162
+ if (classNames.length) {
163
+ decorations.push(decoration);
164
+ }
165
+ });
166
+ });
167
+ return pmView.DecorationSet.create(doc, decorations);
168
+ }
169
+ function codeSyntaxHighlighting(context, prism) {
170
+ return new context.pmState.Plugin({
171
+ state: {
172
+ init: function (_, _a) {
173
+ var doc = _a.doc;
174
+ return getDecorations(doc, context, prism);
175
+ },
176
+ apply: function (tr, set) {
177
+ if (!tr.docChanged) {
178
+ return set.map(tr.mapping, tr.doc);
179
+ }
180
+ return getDecorations(tr.doc, context, prism);
181
+ },
182
+ },
183
+ props: {
184
+ decorations: function (state) {
185
+ return this.getState(state);
186
+ },
187
+ },
188
+ });
189
+ }
190
+
191
+ ;// external "prosemirror-state"
192
+ var external_prosemirror_state_namespaceObject = require("prosemirror-state");
193
+ ;// ./src/utils/dom.ts
194
+ function stringToNumber(value) {
195
+ return parseInt(value, 10);
196
+ }
197
+ function isPositionInBox(style, offsetX, offsetY) {
198
+ var left = stringToNumber(style.left);
199
+ var top = stringToNumber(style.top);
200
+ var width = stringToNumber(style.width) +
201
+ stringToNumber(style.paddingLeft) +
202
+ stringToNumber(style.paddingRight);
203
+ var height = stringToNumber(style.height) +
204
+ stringToNumber(style.paddingTop) +
205
+ stringToNumber(style.paddingBottom);
206
+ return offsetX >= left && offsetX <= left + width && offsetY >= top && offsetY <= top + height;
207
+ }
208
+ function removeNode(node) {
209
+ if (node.parentNode) {
210
+ node.parentNode.removeChild(node);
211
+ }
212
+ }
213
+ var CLS_PREFIX = 'toastui-editor-';
214
+ function cls() {
215
+ var names = [];
216
+ for (var _i = 0; _i < arguments.length; _i++) {
217
+ names[_i] = arguments[_i];
218
+ }
219
+ return names.map(function (className) { return "" + CLS_PREFIX + className; }).join(' ');
220
+ }
221
+
222
+ ;// ./src/nodeViews/languageSelectBox.ts
223
+
224
+ function css(element, key, value) {
225
+ if (typeof key === 'string') {
226
+ element.style[key] = value;
227
+ return;
228
+ }
229
+ Object.keys(key).forEach(function (k) {
230
+ element.style[k] = key[k];
231
+ });
232
+ }
233
+ var WRAPPER_CLASS_NAME = 'code-block-language';
234
+ var INPUT_CLASS_NANE = 'code-block-language-input';
235
+ var LIST_CLASS_NAME = 'code-block-language-list';
236
+ var LANG_ATTR = 'data-language';
237
+ var CODE_BLOCK_PADDING = 10;
238
+ function getButtonsHTML(languages) {
239
+ return languages
240
+ .map(function (language) { return "<button type=\"button\" data-language=\"" + language + "\">" + language + "</button>"; })
241
+ .join('');
242
+ }
243
+ var LanguageSelectBox = /** @class */ (function () {
244
+ function LanguageSelectBox(rootEl, eventEmitter, languages) {
245
+ var _this = this;
246
+ this.buttons = [];
247
+ this.prevStoredLanguage = '';
248
+ this.onSelectToggleButton = function (ev) {
249
+ var target = ev.target;
250
+ var style = getComputedStyle(target, ':after');
251
+ var offsetX = ev.offsetX, offsetY = ev.offsetY;
252
+ if (isPositionInBox(style, offsetX, offsetY)) {
253
+ ev.preventDefault();
254
+ _this.toggleFocus();
255
+ }
256
+ };
257
+ this.onSelectLanguageButtons = function (ev) {
258
+ var target = ev.target;
259
+ var language = target.getAttribute(LANG_ATTR);
260
+ if (language) {
261
+ _this.selectLanguage(language);
262
+ }
263
+ };
264
+ this.handleKeydown = function (ev) {
265
+ var key = ev.key;
266
+ if (key === 'ArrowUp') {
267
+ _this.selectPrevLanguage();
268
+ ev.preventDefault();
269
+ }
270
+ else if (key === 'ArrowDown') {
271
+ _this.selectNextLanguage();
272
+ ev.preventDefault();
273
+ }
274
+ else if (key === 'Enter' || key === 'Tab') {
275
+ _this.storeInputLanguage();
276
+ ev.preventDefault();
277
+ }
278
+ else {
279
+ _this.hideList();
280
+ }
281
+ };
282
+ this.showLangugaeSelectBox = function (_a, language) {
283
+ var top = _a.top, right = _a.right;
284
+ if (language) {
285
+ _this.setLanguage(language);
286
+ }
287
+ _this.show();
288
+ var width = _this.input.parentElement.getBoundingClientRect().width;
289
+ css(_this.wrapper, {
290
+ top: top + CODE_BLOCK_PADDING + "px",
291
+ left: right - width - CODE_BLOCK_PADDING + "px",
292
+ });
293
+ _this.toggleFocus();
294
+ };
295
+ this.rootEl = rootEl;
296
+ this.eventEmitter = eventEmitter;
297
+ this.languages = languages;
298
+ this.createElement();
299
+ this.bindDOMEvent();
300
+ this.bindEvent();
301
+ }
302
+ LanguageSelectBox.prototype.createElement = function () {
303
+ this.wrapper = document.createElement('div');
304
+ this.wrapper.classList.add(cls(WRAPPER_CLASS_NAME));
305
+ this.createInputElement();
306
+ this.createLanguageListElement();
307
+ this.rootEl.appendChild(this.wrapper);
308
+ this.hide();
309
+ };
310
+ LanguageSelectBox.prototype.createInputElement = function () {
311
+ var wrapper = document.createElement('span');
312
+ wrapper.classList.add(cls(INPUT_CLASS_NANE));
313
+ var input = document.createElement('input');
314
+ input.type = 'text';
315
+ input.setAttribute('maxlength', '20');
316
+ this.input = input;
317
+ wrapper.appendChild(this.input);
318
+ this.wrapper.appendChild(wrapper);
319
+ };
320
+ LanguageSelectBox.prototype.createLanguageListElement = function () {
321
+ this.list = document.createElement('div');
322
+ this.list.classList.add(cls(LIST_CLASS_NAME));
323
+ var buttonsContainer = document.createElement('div');
324
+ buttonsContainer.classList.add('buttons');
325
+ buttonsContainer.innerHTML = getButtonsHTML(this.languages);
326
+ this.buttons = Array.from(buttonsContainer.children);
327
+ this.list.appendChild(buttonsContainer);
328
+ this.wrapper.appendChild(this.list);
329
+ this.activateButtonByIndex(0);
330
+ this.hideList();
331
+ };
332
+ LanguageSelectBox.prototype.bindDOMEvent = function () {
333
+ var _this = this;
334
+ this.wrapper.addEventListener('mousedown', this.onSelectToggleButton);
335
+ this.input.addEventListener('keydown', this.handleKeydown);
336
+ this.input.addEventListener('focus', function () { return _this.activateSelectBox(); });
337
+ this.input.addEventListener('blur', function () { return _this.inactivateSelectBox(); });
338
+ this.list.addEventListener('mousedown', this.onSelectLanguageButtons);
339
+ };
340
+ LanguageSelectBox.prototype.bindEvent = function () {
341
+ this.eventEmitter.listen('showCodeBlockLanguages', this.showLangugaeSelectBox);
342
+ };
343
+ LanguageSelectBox.prototype.activateSelectBox = function () {
344
+ this.wrapper.classList.add('active');
345
+ css(this.list, { display: 'block' });
346
+ };
347
+ LanguageSelectBox.prototype.inactivateSelectBox = function () {
348
+ this.input.value = this.prevStoredLanguage;
349
+ this.wrapper.classList.remove('active');
350
+ this.hideList();
351
+ };
352
+ LanguageSelectBox.prototype.toggleFocus = function () {
353
+ if (this.wrapper.classList.contains('active')) {
354
+ this.input.blur();
355
+ }
356
+ else {
357
+ this.input.focus();
358
+ }
359
+ };
360
+ LanguageSelectBox.prototype.storeInputLanguage = function () {
361
+ var selectedLanguage = this.input.value;
362
+ this.setLanguage(selectedLanguage);
363
+ this.hideList();
364
+ this.eventEmitter.emit('selectLanguage', selectedLanguage);
365
+ };
366
+ LanguageSelectBox.prototype.activateButtonByIndex = function (index) {
367
+ if (this.currentButton) {
368
+ this.currentButton.classList.remove('active');
369
+ }
370
+ if (this.buttons.length) {
371
+ this.currentButton = this.buttons[index];
372
+ this.input.value = this.currentButton.getAttribute(LANG_ATTR);
373
+ this.currentButton.classList.add('active');
374
+ this.currentButton.scrollIntoView();
375
+ }
376
+ };
377
+ LanguageSelectBox.prototype.selectLanguage = function (selectedLanguage) {
378
+ this.input.value = selectedLanguage;
379
+ this.storeInputLanguage();
380
+ };
381
+ LanguageSelectBox.prototype.selectPrevLanguage = function () {
382
+ var index = this.buttons.indexOf(this.currentButton) - 1;
383
+ if (index < 0) {
384
+ index = this.buttons.length - 1;
385
+ }
386
+ this.activateButtonByIndex(index);
387
+ };
388
+ LanguageSelectBox.prototype.selectNextLanguage = function () {
389
+ var index = this.buttons.indexOf(this.currentButton) + 1;
390
+ if (index >= this.buttons.length) {
391
+ index = 0;
392
+ }
393
+ this.activateButtonByIndex(index);
394
+ };
395
+ LanguageSelectBox.prototype.hideList = function () {
396
+ css(this.list, { display: 'none' });
397
+ };
398
+ LanguageSelectBox.prototype.show = function () {
399
+ css(this.wrapper, { display: 'inline-block' });
400
+ };
401
+ LanguageSelectBox.prototype.hide = function () {
402
+ css(this.wrapper, { display: 'none' });
403
+ };
404
+ LanguageSelectBox.prototype.setLanguage = function (language) {
405
+ this.prevStoredLanguage = language;
406
+ this.input.value = language;
407
+ var item = this.buttons.filter(function (button) { return button.getAttribute(LANG_ATTR) === language; });
408
+ if (item.length) {
409
+ var index = this.buttons.indexOf(item[0]);
410
+ this.activateButtonByIndex(index);
411
+ }
412
+ };
413
+ LanguageSelectBox.prototype.destroy = function () {
414
+ removeNode(this.wrapper);
415
+ this.eventEmitter.removeEventHandler('showCodeBlockLanguages', this.showLangugaeSelectBox);
416
+ };
417
+ return LanguageSelectBox;
418
+ }());
419
+
420
+
421
+ ;// ./src/nodeViews/codeSyntaxHighlightView.ts
422
+ var __assign = (undefined && undefined.__assign) || function () {
423
+ __assign = Object.assign || function(t) {
424
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
425
+ s = arguments[i];
426
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
427
+ t[p] = s[p];
428
+ }
429
+ return t;
430
+ };
431
+ return __assign.apply(this, arguments);
432
+ };
433
+
434
+
435
+
436
+ var codeSyntaxHighlightView_WRAPPER_CLASS_NAME = 'ww-code-block-highlighting';
437
+ var GUTTER_CLASS_NAME = 'toastui-editor-ww-code-block-gutter';
438
+ var TOOLBAR_CLASS = 'toastui-editor-code-block-toolbar';
439
+ var LANG_LABEL_CLASS = 'toastui-editor-code-block-lang-label';
440
+ var LINE_NUM_BADGE_CLASS = 'toastui-editor-line-number-badge';
441
+ var LINE_NUM_INPUT_CLASS = 'toastui-editor-line-number-input';
442
+ var COPY_BTN_CLASS = 'toastui-editor-code-block-copy';
443
+ function getCustomAttrs(attrs) {
444
+ var htmlAttrs = attrs.htmlAttrs, classNames = attrs.classNames;
445
+ return __assign(__assign({}, htmlAttrs), { class: classNames ? classNames.join(' ') : null });
446
+ }
447
+ var CodeSyntaxHighlightView = /** @class */ (function () {
448
+ // eslint-disable-next-line max-params
449
+ function CodeSyntaxHighlightView(node, view, getPos, eventEmitter, languages) {
450
+ var _this = this;
451
+ this.node = node;
452
+ this.view = view;
453
+ this.getPos = getPos;
454
+ this.eventEmitter = eventEmitter;
455
+ this.languages = languages;
456
+ this.contentDOM = null;
457
+ this.languageSelectBox = null;
458
+ this.languageEditing = false;
459
+ this.gutter = null;
460
+ this.toolbar = null;
461
+ this.languageBadge = null;
462
+ this.lineNumberBadge = null;
463
+ this.lineNumberInput = null;
464
+ this.copyBtn = null;
465
+ this.onCopyClick = function () {
466
+ var text = _this.node.textContent;
467
+ navigator.clipboard.writeText(text).then(function () {
468
+ if (_this.copyBtn) {
469
+ _this.copyBtn.classList.add('copied');
470
+ setTimeout(function () {
471
+ if (_this.copyBtn) {
472
+ _this.copyBtn.classList.remove('copied');
473
+ }
474
+ }, 1500);
475
+ }
476
+ });
477
+ };
478
+ this.commitLineNumber = function () {
479
+ if (!_this.lineNumberInput || typeof _this.getPos !== 'function') {
480
+ return;
481
+ }
482
+ var raw = _this.lineNumberInput.value.trim();
483
+ var parsed = parseInt(raw, 10);
484
+ var newLineNumber = Number.isNaN(parsed) || parsed < 0 ? null : parsed;
485
+ var current = _this.node.attrs.lineNumber;
486
+ if (newLineNumber === current) {
487
+ _this.lineNumberInput.value = current !== null ? String(current) : 'off';
488
+ return;
489
+ }
490
+ var pos = _this.getPos();
491
+ var tr = _this.view.state.tr;
492
+ tr.setNodeMarkup(pos, null, __assign(__assign({}, _this.node.attrs), { lineNumber: newLineNumber }));
493
+ _this.view.dispatch(tr);
494
+ };
495
+ this.onLineNumberKeyDown = function (e) {
496
+ if (e.key === 'Enter') {
497
+ e.preventDefault();
498
+ _this.commitLineNumber();
499
+ }
500
+ else if (e.key === 'Escape' && _this.lineNumberInput) {
501
+ var lineNumber = _this.node.attrs.lineNumber;
502
+ _this.lineNumberInput.value = lineNumber !== null ? String(lineNumber) : 'off';
503
+ _this.lineNumberInput.blur();
504
+ }
505
+ };
506
+ this.onToolbarMouseDown = function (ev) {
507
+ var tag = ev.target.tagName;
508
+ if (tag !== 'INPUT' && tag !== 'BUTTON') {
509
+ ev.preventDefault();
510
+ }
511
+ ev.stopPropagation();
512
+ };
513
+ this.onClickLanguageBadge = function (ev) {
514
+ ev.stopPropagation();
515
+ if (typeof _this.getPos === 'function') {
516
+ var pos = _this.view.coordsAtPos(_this.getPos());
517
+ _this.openLanguageSelectBox(pos);
518
+ }
519
+ };
520
+ this.onCodeBlockKeyDown = function (ev) {
521
+ var isSelectAllShortcut = (ev.metaKey || ev.ctrlKey) && !ev.shiftKey && !ev.altKey && ev.key.toLowerCase() === 'a';
522
+ if (!isSelectAllShortcut || typeof _this.getPos !== 'function') {
523
+ return;
524
+ }
525
+ if (_this.toolbar && ev.target instanceof Node && _this.toolbar.contains(ev.target)) {
526
+ return;
527
+ }
528
+ var pos = _this.getPos();
529
+ var state = _this.view.state;
530
+ var from = pos + 1;
531
+ var to = pos + _this.node.nodeSize - 1;
532
+ var maxPos = state.doc.content.size;
533
+ var safeFrom = Math.max(1, Math.min(from, maxPos));
534
+ var safeTo = Math.max(safeFrom, Math.min(to, maxPos));
535
+ _this.view.focus();
536
+ _this.view.dispatch(state.tr.setSelection(external_prosemirror_state_namespaceObject.TextSelection.create(state.doc, safeFrom, safeTo)));
537
+ ev.preventDefault();
538
+ };
539
+ this.onSelectLanguage = function (language) {
540
+ if (_this.languageEditing) {
541
+ _this.changeLanguage(language);
542
+ }
543
+ };
544
+ this.finishLanguageEditing = function () {
545
+ if (_this.languageEditing) {
546
+ _this.reset();
547
+ }
548
+ };
549
+ this.node = node;
550
+ this.view = view;
551
+ this.getPos = getPos;
552
+ this.eventEmitter = eventEmitter;
553
+ this.languages = languages;
554
+ this.createElement();
555
+ this.bindDOMEvent();
556
+ this.bindEvent();
557
+ }
558
+ CodeSyntaxHighlightView.prototype.createElement = function () {
559
+ var _a = this.node.attrs, language = _a.language, lineNumber = _a.lineNumber;
560
+ var wrapper = document.createElement('div');
561
+ wrapper.setAttribute('data-language', language || 'text');
562
+ wrapper.classList.add(cls(codeSyntaxHighlightView_WRAPPER_CLASS_NAME));
563
+ wrapper.classList.add('has-toolbar');
564
+ if (lineNumber !== null) {
565
+ wrapper.classList.add('has-line-numbers');
566
+ }
567
+ var pre = this.createCodeBlockElement();
568
+ var code = pre.firstChild;
569
+ if (language) {
570
+ pre.classList.add("language-" + language);
571
+ code.classList.add("language-" + language);
572
+ }
573
+ if (lineNumber !== null) {
574
+ this.gutter = this.createGutter();
575
+ wrapper.appendChild(this.gutter);
576
+ }
577
+ wrapper.appendChild(pre);
578
+ this.toolbar = document.createElement('div');
579
+ this.toolbar.className = TOOLBAR_CLASS;
580
+ this.toolbar.contentEditable = 'false';
581
+ this.copyBtn = this.createCopyButton();
582
+ this.toolbar.appendChild(this.copyBtn);
583
+ this.lineNumberBadge = this.createLineNumberBadge();
584
+ this.toolbar.appendChild(this.lineNumberBadge);
585
+ this.languageBadge = document.createElement('div');
586
+ this.languageBadge.className = LANG_LABEL_CLASS;
587
+ this.languageBadge.textContent = language || 'text';
588
+ this.toolbar.appendChild(this.languageBadge);
589
+ wrapper.appendChild(this.toolbar);
590
+ this.dom = wrapper;
591
+ this.contentDOM = code;
592
+ };
593
+ CodeSyntaxHighlightView.prototype.createCodeBlockElement = function () {
594
+ var pre = document.createElement('pre');
595
+ var code = document.createElement('code');
596
+ var language = this.node.attrs.language;
597
+ var attrs = getCustomAttrs(this.node.attrs);
598
+ if (language) {
599
+ code.setAttribute('data-language', language);
600
+ }
601
+ Object.keys(attrs).forEach(function (attrName) {
602
+ if (attrs[attrName]) {
603
+ pre.setAttribute(attrName, attrs[attrName]);
604
+ }
605
+ });
606
+ pre.appendChild(code);
607
+ return pre;
608
+ };
609
+ CodeSyntaxHighlightView.prototype.createGutter = function () {
610
+ var el = document.createElement('div');
611
+ el.className = GUTTER_CLASS_NAME;
612
+ el.contentEditable = 'false';
613
+ this.fillGutter(el);
614
+ return el;
615
+ };
616
+ CodeSyntaxHighlightView.prototype.fillGutter = function (el) {
617
+ var lineNumber = this.node.attrs.lineNumber;
618
+ if (lineNumber === null) {
619
+ return;
620
+ }
621
+ var text = this.node.textContent;
622
+ var lineCount = text.split('\n').length;
623
+ var lines = [];
624
+ for (var i = 0; i < lineCount; i += 1) {
625
+ lines.push(String(lineNumber + i));
626
+ }
627
+ el.textContent = lines.join('\n');
628
+ };
629
+ CodeSyntaxHighlightView.prototype.updateGutter = function () {
630
+ var lineNumber = this.node.attrs.lineNumber;
631
+ if (lineNumber === null) {
632
+ if (this.gutter && this.gutter.parentElement) {
633
+ this.gutter.parentElement.removeChild(this.gutter);
634
+ this.gutter = null;
635
+ this.dom.classList.remove('has-line-numbers');
636
+ }
637
+ return;
638
+ }
639
+ if (!this.gutter) {
640
+ this.gutter = this.createGutter();
641
+ this.dom.insertBefore(this.gutter, this.dom.firstChild);
642
+ this.dom.classList.add('has-line-numbers');
643
+ }
644
+ else {
645
+ this.fillGutter(this.gutter);
646
+ }
647
+ };
648
+ CodeSyntaxHighlightView.prototype.createLineNumberBadge = function () {
649
+ var badge = document.createElement('div');
650
+ badge.className = LINE_NUM_BADGE_CLASS;
651
+ var label = document.createElement('span');
652
+ label.textContent = '#';
653
+ badge.appendChild(label);
654
+ var input = document.createElement('input');
655
+ var lineNumber = this.node.attrs.lineNumber;
656
+ input.type = 'text';
657
+ input.className = LINE_NUM_INPUT_CLASS;
658
+ input.value = lineNumber !== null ? String(lineNumber) : 'off';
659
+ input.placeholder = 'off';
660
+ badge.appendChild(input);
661
+ this.lineNumberInput = input;
662
+ return badge;
663
+ };
664
+ CodeSyntaxHighlightView.prototype.createCopyButton = function () {
665
+ var btn = document.createElement('button');
666
+ btn.className = COPY_BTN_CLASS;
667
+ btn.type = 'button';
668
+ btn.title = 'Copy code';
669
+ var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
670
+ svg.setAttribute('viewBox', '0 0 24 24');
671
+ svg.setAttribute('width', '14');
672
+ svg.setAttribute('height', '14');
673
+ var p = document.createElementNS('http://www.w3.org/2000/svg', 'path');
674
+ p.setAttribute('fill', 'currentColor');
675
+ p.setAttribute('d', 'M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z');
676
+ svg.appendChild(p);
677
+ btn.appendChild(svg);
678
+ return btn;
679
+ };
680
+ CodeSyntaxHighlightView.prototype.bindDOMEvent = function () {
681
+ if (this.toolbar) {
682
+ this.toolbar.addEventListener('mousedown', this.onToolbarMouseDown);
683
+ }
684
+ if (this.languageBadge) {
685
+ this.languageBadge.addEventListener('click', this.onClickLanguageBadge);
686
+ }
687
+ if (this.copyBtn) {
688
+ this.copyBtn.addEventListener('click', this.onCopyClick);
689
+ }
690
+ if (this.lineNumberInput) {
691
+ this.lineNumberInput.addEventListener('blur', this.commitLineNumber);
692
+ this.lineNumberInput.addEventListener('keydown', this.onLineNumberKeyDown);
693
+ }
694
+ this.dom.addEventListener('keydown', this.onCodeBlockKeyDown);
695
+ this.view.dom.addEventListener('mousedown', this.finishLanguageEditing);
696
+ window.addEventListener('resize', this.finishLanguageEditing);
697
+ };
698
+ CodeSyntaxHighlightView.prototype.bindEvent = function () {
699
+ this.eventEmitter.listen('selectLanguage', this.onSelectLanguage);
700
+ this.eventEmitter.listen('scroll', this.finishLanguageEditing);
701
+ this.eventEmitter.listen('finishLanguageEditing', this.finishLanguageEditing);
702
+ };
703
+ CodeSyntaxHighlightView.prototype.openLanguageSelectBox = function (pos) {
704
+ this.languageSelectBox = new LanguageSelectBox(this.view.dom.parentElement, this.eventEmitter, this.languages);
705
+ this.eventEmitter.emit('showCodeBlockLanguages', pos, this.node.attrs.language);
706
+ this.languageEditing = true;
707
+ };
708
+ CodeSyntaxHighlightView.prototype.changeLanguage = function (language) {
709
+ if (typeof this.getPos === 'function') {
710
+ this.reset();
711
+ var pos = this.getPos();
712
+ var tr = this.view.state.tr;
713
+ tr.setNodeMarkup(pos, null, __assign(__assign({}, this.node.attrs), { language: language }));
714
+ this.view.dispatch(tr);
715
+ }
716
+ };
717
+ CodeSyntaxHighlightView.prototype.reset = function () {
718
+ if (this.languageSelectBox) {
719
+ this.languageSelectBox.destroy();
720
+ this.languageSelectBox = null;
721
+ }
722
+ this.languageEditing = false;
723
+ };
724
+ CodeSyntaxHighlightView.prototype.stopEvent = function () {
725
+ return true;
726
+ };
727
+ CodeSyntaxHighlightView.prototype.update = function (node) {
728
+ if (!node.sameMarkup(this.node)) {
729
+ return false;
730
+ }
731
+ this.node = node;
732
+ this.updateGutter();
733
+ return true;
734
+ };
735
+ CodeSyntaxHighlightView.prototype.destroy = function () {
736
+ this.reset();
737
+ if (this.toolbar) {
738
+ this.toolbar.removeEventListener('mousedown', this.onToolbarMouseDown);
739
+ }
740
+ if (this.languageBadge) {
741
+ this.languageBadge.removeEventListener('click', this.onClickLanguageBadge);
742
+ }
743
+ if (this.copyBtn) {
744
+ this.copyBtn.removeEventListener('click', this.onCopyClick);
745
+ }
746
+ if (this.lineNumberInput) {
747
+ this.lineNumberInput.removeEventListener('blur', this.commitLineNumber);
748
+ this.lineNumberInput.removeEventListener('keydown', this.onLineNumberKeyDown);
749
+ }
750
+ this.dom.removeEventListener('keydown', this.onCodeBlockKeyDown);
751
+ this.view.dom.removeEventListener('mousedown', this.finishLanguageEditing);
752
+ window.removeEventListener('resize', this.finishLanguageEditing);
753
+ this.eventEmitter.removeEventHandler('selectLanguage', this.onSelectLanguage);
754
+ this.eventEmitter.removeEventHandler('scroll', this.finishLanguageEditing);
755
+ this.eventEmitter.removeEventHandler('finishLanguageEditing', this.finishLanguageEditing);
756
+ };
757
+ return CodeSyntaxHighlightView;
758
+ }());
759
+ function createCodeSyntaxHighlightView(languages) {
760
+ return function (node, view, getPos, emitter) {
761
+ return new CodeSyntaxHighlightView(node, view, getPos, emitter, languages);
762
+ };
763
+ }
764
+
765
+ ;// ./src/plugin.ts
766
+
767
+
768
+
769
+ function codeSyntaxHighlightPlugin(context, options) {
770
+ if (options) {
771
+ var eventEmitter = context.eventEmitter;
772
+ var prism_1 = options.highlighter;
773
+ eventEmitter.addEventType('showCodeBlockLanguages');
774
+ eventEmitter.addEventType('selectLanguage');
775
+ eventEmitter.addEventType('finishLanguageEditing');
776
+ var languages_1 = prism_1.languages;
777
+ var registerdlanguages = Object.keys(languages_1).filter(function (language) { return typeof languages_1[language] !== 'function'; });
778
+ return {
779
+ toHTMLRenderers: getHTMLRenderers(prism_1),
780
+ wysiwygPlugins: [function () { return codeSyntaxHighlighting(context, prism_1); }],
781
+ wysiwygNodeViews: {
782
+ codeBlock: createCodeSyntaxHighlightView(registerdlanguages),
783
+ },
784
+ };
785
+ }
786
+ return {};
787
+ }
788
+
789
+ ;// ./src/index.ts
790
+
791
+
792
+ // Prevent to highlight all code elements automatically.
793
+ // @link https://prismjs.com/docs/Prism.html#.manual
794
+ // eslint-disable-next-line no-undefined
795
+ if (typeof window !== 'undefined') {
796
+ window.Prism = window.Prism || {};
797
+ window.Prism.manual = true;
798
+ }
799
+ /* harmony default export */ var src = (codeSyntaxHighlightPlugin);
800
+
801
+ module.exports = __webpack_exports__["default"];
802
+ /******/ })()
803
+ ;