@atlaskit/editor-plugin-code-block 12.1.10 → 12.1.11
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.
- package/CHANGELOG.md +8 -0
- package/dist/cjs/codeBlockPlugin.js +9 -2
- package/dist/cjs/editor-commands/index.js +56 -4
- package/dist/cjs/pm-plugins/actions.js +3 -1
- package/dist/cjs/pm-plugins/auto-detect-state.js +11 -0
- package/dist/cjs/pm-plugins/auto-detect.js +57 -0
- package/dist/cjs/pm-plugins/main.js +1 -1
- package/dist/cjs/pm-plugins/toolbar.js +47 -11
- package/dist/cjs/pm-plugins/utils.js +0 -3
- package/dist/cjs/ui/CodeBlockLanguagePicker.js +15 -8
- package/dist/cjs/ui/LanguagePicker.js +7 -15
- package/dist/cjs/ui/language-picker-options.js +2 -1
- package/dist/cjs/utils/auto-detect-state.js +185 -0
- package/dist/cjs/utils/auto-detect-view.js +127 -0
- package/dist/cjs/utils/language-detect.js +126 -0
- package/dist/es2019/codeBlockPlugin.js +5 -1
- package/dist/es2019/editor-commands/index.js +52 -2
- package/dist/es2019/pm-plugins/actions.js +3 -1
- package/dist/es2019/pm-plugins/auto-detect-state.js +3 -0
- package/dist/es2019/pm-plugins/auto-detect.js +47 -0
- package/dist/es2019/pm-plugins/main.js +1 -1
- package/dist/es2019/pm-plugins/toolbar.js +41 -3
- package/dist/es2019/pm-plugins/utils.js +0 -3
- package/dist/es2019/ui/CodeBlockLanguagePicker.js +15 -8
- package/dist/es2019/ui/LanguagePicker.js +6 -14
- package/dist/es2019/ui/language-picker-options.js +2 -1
- package/dist/es2019/utils/auto-detect-state.js +179 -0
- package/dist/es2019/utils/auto-detect-view.js +108 -0
- package/dist/es2019/utils/language-detect.js +99 -0
- package/dist/esm/codeBlockPlugin.js +9 -2
- package/dist/esm/editor-commands/index.js +55 -3
- package/dist/esm/pm-plugins/actions.js +3 -1
- package/dist/esm/pm-plugins/auto-detect-state.js +5 -0
- package/dist/esm/pm-plugins/auto-detect.js +50 -0
- package/dist/esm/pm-plugins/main.js +1 -1
- package/dist/esm/pm-plugins/toolbar.js +47 -11
- package/dist/esm/pm-plugins/utils.js +0 -3
- package/dist/esm/ui/CodeBlockLanguagePicker.js +15 -8
- package/dist/esm/ui/LanguagePicker.js +7 -15
- package/dist/esm/ui/language-picker-options.js +2 -1
- package/dist/esm/utils/auto-detect-state.js +178 -0
- package/dist/esm/utils/auto-detect-view.js +120 -0
- package/dist/esm/utils/language-detect.js +119 -0
- package/dist/types/editor-commands/index.d.ts +2 -0
- package/dist/types/pm-plugins/actions.d.ts +2 -0
- package/dist/types/pm-plugins/auto-detect-state.d.ts +16 -0
- package/dist/types/pm-plugins/auto-detect.d.ts +5 -0
- package/dist/types/pm-plugins/utils.d.ts +1 -1
- package/dist/types/ui/CodeBlockLanguagePicker.d.ts +7 -1
- package/dist/types/ui/LanguagePicker.d.ts +4 -8
- package/dist/types/utils/auto-detect-state.d.ts +11 -0
- package/dist/types/utils/auto-detect-view.d.ts +8 -0
- package/dist/types/utils/language-detect.d.ts +3 -0
- package/dist/types-ts4.5/editor-commands/index.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/actions.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/auto-detect-state.d.ts +16 -0
- package/dist/types-ts4.5/pm-plugins/auto-detect.d.ts +5 -0
- package/dist/types-ts4.5/pm-plugins/utils.d.ts +1 -1
- package/dist/types-ts4.5/ui/CodeBlockLanguagePicker.d.ts +7 -1
- package/dist/types-ts4.5/ui/LanguagePicker.d.ts +4 -8
- package/dist/types-ts4.5/utils/auto-detect-state.d.ts +11 -0
- package/dist/types-ts4.5/utils/auto-detect-view.d.ts +8 -0
- package/dist/types-ts4.5/utils/language-detect.d.ts +3 -0
- package/package.json +3 -3
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
|
+
import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
|
|
6
|
+
import { ACTIONS } from '../pm-plugins/actions';
|
|
7
|
+
import { autoDetectPluginKey } from '../pm-plugins/auto-detect-state';
|
|
8
|
+
import { createAutoDetectEntry } from './auto-detect-state';
|
|
9
|
+
import { detectLanguage } from './language-detect';
|
|
10
|
+
var AUTO_DETECT_DEBOUNCE_MS = 500;
|
|
11
|
+
|
|
12
|
+
// Stored positions are mapped through transactions; verify the localId before using them.
|
|
13
|
+
var getCodeBlockFromEntry = function getCodeBlockFromEntry(view, localId, entry) {
|
|
14
|
+
var node = view.state.doc.nodeAt(entry.pos);
|
|
15
|
+
var codeBlockType = view.state.schema.nodes.codeBlock;
|
|
16
|
+
if ((node === null || node === void 0 ? void 0 : node.type) === codeBlockType && node.attrs.localId === localId) {
|
|
17
|
+
return {
|
|
18
|
+
node: node,
|
|
19
|
+
pos: entry.pos
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Runs after debounce, so it must re-read current editor state before applying language changes.
|
|
26
|
+
var runPendingDetection = function runPendingDetection(view, localId, api) {
|
|
27
|
+
var _api$core;
|
|
28
|
+
var pluginState = autoDetectPluginKey.getState(view.state);
|
|
29
|
+
var entry = pluginState === null || pluginState === void 0 ? void 0 : pluginState.languageDetectionMap[localId];
|
|
30
|
+
if (!(entry !== null && entry !== void 0 && entry.isPending)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
var found = getCodeBlockFromEntry(view, localId, entry);
|
|
34
|
+
if (!found) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
var detectedLanguage = detectLanguage(found.node.textContent);
|
|
38
|
+
var detectionResult = detectedLanguage ? 'detected' : 'noneDetected';
|
|
39
|
+
// Keep a previous auto-detected language when the latest snippet is too weak to classify.
|
|
40
|
+
var shouldPreserveAutoDetectedLanguage = !detectedLanguage && Boolean(entry.autoDetectedLanguage) && found.node.attrs.language === entry.autoDetectedLanguage;
|
|
41
|
+
var nextEntry = _objectSpread(_objectSpread({}, createAutoDetectEntry(found.node, found.pos, false, entry)), {}, {
|
|
42
|
+
detectionResult: detectionResult,
|
|
43
|
+
autoDetectedLanguage: detectedLanguage !== null && detectedLanguage !== void 0 ? detectedLanguage : entry.autoDetectedLanguage
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// If there is no confident detection, record the result without clearing user-visible language.
|
|
47
|
+
var shouldOnlyUpdateDetectionState = !detectedLanguage && (!found.node.attrs.language || shouldPreserveAutoDetectedLanguage);
|
|
48
|
+
api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (_ref) {
|
|
49
|
+
var _api$analytics;
|
|
50
|
+
var tr = _ref.tr;
|
|
51
|
+
if (!shouldOnlyUpdateDetectionState) {
|
|
52
|
+
tr.setNodeMarkup(found.pos, undefined, _objectSpread(_objectSpread({}, found.node.attrs), {}, {
|
|
53
|
+
language: detectedLanguage
|
|
54
|
+
}), found.node.marks);
|
|
55
|
+
}
|
|
56
|
+
tr.setMeta(autoDetectPluginKey, {
|
|
57
|
+
type: ACTIONS.SET_AUTO_DETECT_ENTRY,
|
|
58
|
+
data: {
|
|
59
|
+
localId: localId,
|
|
60
|
+
entry: nextEntry
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.attachAnalyticsEvent({
|
|
64
|
+
action: ACTION.LANGUAGE_AUTO_DETECTED,
|
|
65
|
+
actionSubject: ACTION_SUBJECT.CODE_BLOCK,
|
|
66
|
+
attributes: {
|
|
67
|
+
language: detectedLanguage !== null && detectedLanguage !== void 0 ? detectedLanguage : 'none',
|
|
68
|
+
detectionResult: detectionResult
|
|
69
|
+
},
|
|
70
|
+
eventType: EVENT_TYPE.TRACK
|
|
71
|
+
})(tr);
|
|
72
|
+
return tr;
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
var clearTimer = function clearTimer(timers, localId) {
|
|
76
|
+
var scheduledDetection = timers.get(localId);
|
|
77
|
+
if (scheduledDetection) {
|
|
78
|
+
clearTimeout(scheduledDetection.timer);
|
|
79
|
+
timers.delete(localId);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// Keeps one debounce timer per pending code block and drops timers for stale entries.
|
|
84
|
+
export var syncPendingDetectionTimers = function syncPendingDetectionTimers(view, timers, api) {
|
|
85
|
+
var _pluginState$language;
|
|
86
|
+
var pluginState = autoDetectPluginKey.getState(view.state);
|
|
87
|
+
var pendingEntries = Object.entries((_pluginState$language = pluginState === null || pluginState === void 0 ? void 0 : pluginState.languageDetectionMap) !== null && _pluginState$language !== void 0 ? _pluginState$language : {}).filter(function (_ref2) {
|
|
88
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
89
|
+
entry = _ref3[1];
|
|
90
|
+
return entry.isPending;
|
|
91
|
+
});
|
|
92
|
+
var pendingLocalIds = new Set(pendingEntries.map(function (_ref4) {
|
|
93
|
+
var _ref5 = _slicedToArray(_ref4, 1),
|
|
94
|
+
localId = _ref5[0];
|
|
95
|
+
return localId;
|
|
96
|
+
}));
|
|
97
|
+
pendingEntries.forEach(function (_ref6) {
|
|
98
|
+
var _ref7 = _slicedToArray(_ref6, 2),
|
|
99
|
+
localId = _ref7[0],
|
|
100
|
+
entry = _ref7[1];
|
|
101
|
+
var scheduledDetection = timers.get(localId);
|
|
102
|
+
if ((scheduledDetection === null || scheduledDetection === void 0 ? void 0 : scheduledDetection.lastObservedText) === entry.lastObservedText) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
clearTimer(timers, localId);
|
|
106
|
+
var timer = setTimeout(function () {
|
|
107
|
+
timers.delete(localId);
|
|
108
|
+
runPendingDetection(view, localId, api);
|
|
109
|
+
}, AUTO_DETECT_DEBOUNCE_MS);
|
|
110
|
+
timers.set(localId, {
|
|
111
|
+
lastObservedText: entry.lastObservedText,
|
|
112
|
+
timer: timer
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
timers.forEach(function (_, localId) {
|
|
116
|
+
if (!pendingLocalIds.has(localId)) {
|
|
117
|
+
clearTimer(timers, localId);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import _typeof from "@babel/runtime/helpers/typeof";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
/* eslint-disable require-unicode-regexp */
|
|
4
|
+
|
|
5
|
+
// Conservative weighted-regex heuristic for common high-confidence snippets, not a full classifier.
|
|
6
|
+
// Ambiguous snippets intentionally return null so users can select the language manually.
|
|
7
|
+
var MAX_DETECTION_CHARS = 10000;
|
|
8
|
+
var MIN_DETECTION_SCORE = 3; // Require at least one medium-confidence signal before auto-selecting.
|
|
9
|
+
var MIN_SCORE_GAP = 2; // Avoid auto-selecting when top two languages are too close to distinguish.
|
|
10
|
+
|
|
11
|
+
var hasPattern = function hasPattern(code, pattern) {
|
|
12
|
+
// Reset stateful regexes so repeated tests always start at the beginning.
|
|
13
|
+
pattern.lastIndex = 0;
|
|
14
|
+
return pattern.test(code);
|
|
15
|
+
};
|
|
16
|
+
var scorePatterns = function scorePatterns(code, patterns) {
|
|
17
|
+
return patterns.reduce(function (score, _ref) {
|
|
18
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
19
|
+
pattern = _ref2[0],
|
|
20
|
+
value = _ref2[1];
|
|
21
|
+
return score + (hasPattern(code, pattern) ? value : 0);
|
|
22
|
+
}, 0);
|
|
23
|
+
};
|
|
24
|
+
var looksLikeHtmlTagPair = function looksLikeHtmlTagPair(code) {
|
|
25
|
+
var openTags = new Set();
|
|
26
|
+
var tagPattern = /<\/?([a-z][a-z0-9-]*)\b[^<>]{0,500}>/gi;
|
|
27
|
+
var match;
|
|
28
|
+
while ((match = tagPattern.exec(code)) !== null) {
|
|
29
|
+
var _match = match,
|
|
30
|
+
_match2 = _slicedToArray(_match, 2),
|
|
31
|
+
tag = _match2[0],
|
|
32
|
+
tagName = _match2[1];
|
|
33
|
+
if (tag.endsWith('/>')) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (tag.startsWith('</')) {
|
|
37
|
+
if (openTags.has(tagName.toLowerCase())) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
openTags.add(tagName.toLowerCase());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
};
|
|
46
|
+
var looksLikeJson = function looksLikeJson(code) {
|
|
47
|
+
var trimmed = code.trim();
|
|
48
|
+
if (!/^[{[]/.test(trimmed) || !/[}\]]$/.test(trimmed)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
var parsed = JSON.parse(trimmed);
|
|
53
|
+
return parsed !== null && _typeof(parsed) === 'object';
|
|
54
|
+
} catch (_unused) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var getLanguageScores = function getLanguageScores(code) {
|
|
59
|
+
return [{
|
|
60
|
+
language: 'json',
|
|
61
|
+
score: looksLikeJson(code) ? 8 : 0
|
|
62
|
+
}, {
|
|
63
|
+
language: 'html',
|
|
64
|
+
score: scorePatterns(code, [[/<!doctype\s+html/i, 5], [/<\/?(?:html|head|body|div|span|script|style|section|template)\b/i, 2]]) + (looksLikeHtmlTagPair(code) ? 3 : 0)
|
|
65
|
+
}, {
|
|
66
|
+
language: 'css',
|
|
67
|
+
score: scorePatterns(code, [[/@[\w-]+\s+[^{]+\{/, 3], [/[.#]?[-_a-zA-Z][-_a-zA-Z0-9\s,.:#>+~*\[\]='"]+\{[^}]*\b(?:color|display|margin|padding|font|background|border|width|height|grid|flex)\s*:/, 5], [/\b(?:color|display|margin|padding|font-size|background|border|width|height)\s*:\s*[^;{}]+;/, 3]])
|
|
68
|
+
}, {
|
|
69
|
+
language: 'sql',
|
|
70
|
+
score: scorePatterns(code, [[/\bSELECT\b[\s\S]+\bFROM\b/i, 5], [/\b(?:INSERT\s+INTO|UPDATE\b[\s\S]+\bSET\b|DELETE\s+FROM|CREATE\s+TABLE|ALTER\s+TABLE)\b/i, 5], [/\b(?:JOIN|WHERE|GROUP\s+BY|ORDER\s+BY|LIMIT)\b/i, 2]])
|
|
71
|
+
}, {
|
|
72
|
+
language: 'typescript',
|
|
73
|
+
score: scorePatterns(code, [[/\b(?:interface|type)\s+[A-Z_$][\w$]*(?:\s*[=<{])/, 5], [/\bimport\s+type\b|\bexport\s+type\b/, 4], [/\b(?:const|let|var)\s+[\w$]+\s*:\s*[A-Za-z_$][\w$<>|\[\],\s]*/, 4], [/\)\s*:\s*(?:Promise<)?[A-Za-z_$][\w$<>|\[\],\s]*(?:>|\s)?\s*=>?\s*[{;]/, 3], [/\b(?:as\s+const|implements\s+[A-Z_$]|enum\s+[A-Z_$])/, 3]])
|
|
74
|
+
}, {
|
|
75
|
+
language: 'javascript',
|
|
76
|
+
score: scorePatterns(code, [[/\b(?:const|let|var)\s+[\w$]+\s*=/, 3], [/\bfunction\s*[\w$]*\s*\([^)]*\)\s*\{/, 3], [/=>\s*(?:\{|[\w$'"`(])/, 3], [/\b(?:import|export)\s+(?:[\w${}*,\s]+\s+from\s+)?['"][^'"]+['"]/, 3], [/\b(?:console\.log|document\.|window\.|require\()|\bmodule\.exports\b/, 3]])
|
|
77
|
+
}, {
|
|
78
|
+
language: 'python',
|
|
79
|
+
score: scorePatterns(code, [[/^\s*def\s+[a-zA-Z_]\w*\([^)]*\)\s*:/m, 5], [/^\s*class\s+[A-Z_]\w*(?:\([^)]*\))?\s*:/m, 4], [/^\s*(?:from\s+[\w.]+\s+import\s+\w+|import\s+[\w.]+)/m, 3], [/^\s*(?:if|elif|else|for|while|try|except)\b[^\n]*:\s*$/m, 2], [/\bprint\([^)]*\)/, 2]])
|
|
80
|
+
}, {
|
|
81
|
+
language: 'java',
|
|
82
|
+
score: scorePatterns(code, [[/\bpublic\s+(?:final\s+)?class\s+[A-Z]\w*/, 5], [/\bpublic\s+static\s+void\s+main\s*\(\s*String\[\]/, 5], [/\bSystem\.out\.println\s*\(/, 4], [/\b(?:private|protected|public)\s+(?:static\s+)?(?:final\s+)?[A-Z]\w*(?:<[^>]+>)?\s+\w+\s*[;(=]/, 3]])
|
|
83
|
+
}, {
|
|
84
|
+
language: 'go',
|
|
85
|
+
score: scorePatterns(code, [[/^\s*package\s+\w+/m, 5], [/\bfunc\s+(?:\([^)]*\)\s*)?[A-Za-z_]\w*\s*\([^)]*\)\s*(?:[A-Za-z_*\[\]]+\s*)?\{/, 5], [/\bfmt\.(?:Println|Printf)\s*\(/, 3], [/\bimport\s+\(\s*[\s\S]*?\)/, 2]])
|
|
86
|
+
}, {
|
|
87
|
+
language: 'ruby',
|
|
88
|
+
score: scorePatterns(code, [[/^\s*def\s+[a-z_]\w*[!?=]?/m, 4], [/^\s*class\s+[A-Z]\w*(?:\s*<\s*[A-Z]\w*)?/m, 3], [/^\s*end\s*$/m, 3], [/\b(?:puts|require|attr_reader|attr_accessor)\b/, 3], [/\bdo\s*\|[^|]+\|/, 2]])
|
|
89
|
+
}, {
|
|
90
|
+
language: 'rust',
|
|
91
|
+
score: scorePatterns(code, [[/\bfn\s+[a-z_]\w*\s*\([^)]*\)\s*(?:->\s*[A-Za-z_:<>]+\s*)?\{/, 5], [/\blet\s+mut\s+\w+/, 3], [/\bprintln!\s*\(/, 4], [/\buse\s+(?:std|crate|super)::/, 3], [/\b(?:impl|pub\s+struct|enum)\s+[A-Z]\w*/, 3]])
|
|
92
|
+
}, {
|
|
93
|
+
language: 'shell',
|
|
94
|
+
score: scorePatterns(code, [[/^#!\/usr\/bin\/(?:env\s+)?(?:ba|z|k)?sh\b/m, 6], [/^\s*(?:if|for|while)\b[\s\S]+\b(?:then|do)\b/m, 4], [/^\s*(?:fi|done)\s*$/m, 3], [/\b(?:echo|export|cd|grep|sed|awk|curl)\b[\s\S]*(?:\$\w+|&&|\|)/, 3], [/\$\{?[A-Z_][A-Z0-9_]*\}?/, 2]])
|
|
95
|
+
}];
|
|
96
|
+
};
|
|
97
|
+
export var detectLanguage = function detectLanguage(code) {
|
|
98
|
+
var trimmedCode = code.trim();
|
|
99
|
+
if (trimmedCode.length < 8) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
var codeForDetection = trimmedCode.slice(0, MAX_DETECTION_CHARS);
|
|
103
|
+
var _getLanguageScores$fi = getLanguageScores(codeForDetection).filter(function (_ref3) {
|
|
104
|
+
var score = _ref3.score;
|
|
105
|
+
return score > 0;
|
|
106
|
+
}).sort(function (a, b) {
|
|
107
|
+
return b.score - a.score;
|
|
108
|
+
}),
|
|
109
|
+
_getLanguageScores$fi2 = _slicedToArray(_getLanguageScores$fi, 2),
|
|
110
|
+
best = _getLanguageScores$fi2[0],
|
|
111
|
+
secondBest = _getLanguageScores$fi2[1];
|
|
112
|
+
if (!best || best.score < MIN_DETECTION_SCORE) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
if (secondBest && best.score - secondBest.score < MIN_SCORE_GAP) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return best.language;
|
|
119
|
+
};
|
|
@@ -6,6 +6,8 @@ import type { LanguagePickerSelectionSource } from '../ui/language-picker-option
|
|
|
6
6
|
export declare const removeCodeBlockWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
7
7
|
export declare const removeCodeBlock: Command;
|
|
8
8
|
export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string | null, selectionSource?: LanguagePickerSelectionSource) => Command;
|
|
9
|
+
/** Queue auto-detection for selected code block. */
|
|
10
|
+
export declare const detectLanguage: () => Command;
|
|
9
11
|
export declare const copyContentToClipboardWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
10
12
|
export declare const copyContentToClipboard: Command;
|
|
11
13
|
export declare const resetCopiedState: Command;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
2
|
+
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
export type AutoDetectResult = 'detected' | 'noneDetected';
|
|
4
|
+
export type AutoDetectEntry = {
|
|
5
|
+
autoDetectedLanguage?: string;
|
|
6
|
+
detectionResult?: AutoDetectResult;
|
|
7
|
+
isPending?: boolean;
|
|
8
|
+
lastObservedFirstLine: string;
|
|
9
|
+
lastObservedText: string;
|
|
10
|
+
pos: number;
|
|
11
|
+
};
|
|
12
|
+
export type AutoDetectState = {
|
|
13
|
+
languageDetectionMap: Record<string, AutoDetectEntry>;
|
|
14
|
+
};
|
|
15
|
+
export declare const autoDetectPluginKey: PluginKey<AutoDetectState>;
|
|
16
|
+
export declare const getAutoDetectPluginState: (state: EditorState) => AutoDetectState | undefined;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
|
|
3
|
+
import type { CodeBlockPlugin } from '../index';
|
|
4
|
+
import { type AutoDetectState } from './auto-detect-state';
|
|
5
|
+
export declare const createAutoDetectPlugin: (api?: ExtractInjectionAPI<CodeBlockPlugin>) => SafePlugin<AutoDetectState>;
|
|
@@ -3,4 +3,4 @@ import type { EditorState, ReadonlyTransaction, Selection } from '@atlaskit/edit
|
|
|
3
3
|
import type { NodeWithPos } from '@atlaskit/editor-prosemirror/utils';
|
|
4
4
|
export declare function getCursor(selection: Selection): ResolvedPos | undefined;
|
|
5
5
|
export declare function getAllCodeBlockNodesInDoc(state: EditorState): NodeWithPos[];
|
|
6
|
-
export declare function getAllChangedCodeBlocksInTransaction(tr: ReadonlyTransaction): NodeWithPos[]
|
|
6
|
+
export declare function getAllChangedCodeBlocksInTransaction(tr: ReadonlyTransaction): NodeWithPos[];
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
|
|
3
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
4
|
+
import type { CodeBlockPlugin } from '../index';
|
|
2
5
|
import type { LanguagePickerProps } from './LanguagePicker';
|
|
3
|
-
type CodeBlockLanguagePickerProps = Omit<LanguagePickerProps, 'recentLanguageValues' | '
|
|
6
|
+
type CodeBlockLanguagePickerProps = Omit<LanguagePickerProps, 'recentLanguageValues' | 'onMenuOpen' | 'onSelection'> & {
|
|
7
|
+
api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
|
|
8
|
+
editorView: EditorView;
|
|
9
|
+
};
|
|
4
10
|
export declare const CodeBlockLanguagePicker: ({ api, defaultValue, editorView, filterOption, formatMessage, languagePickerOptions, }: CodeBlockLanguagePickerProps) => React.JSX.Element;
|
|
5
11
|
export {};
|
|
@@ -4,19 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import type { IntlShape } from 'react-intl';
|
|
7
|
-
import type {
|
|
8
|
-
import type
|
|
9
|
-
import type { CodeBlockPlugin } from '../index';
|
|
10
|
-
import type { LanguagePickerOption } from './language-picker-options';
|
|
7
|
+
import type { SelectOption } from '@atlaskit/editor-common/types';
|
|
8
|
+
import { type LanguagePickerOption, type LanguagePickerSelectionSource } from './language-picker-options';
|
|
11
9
|
export type LanguagePickerProps = {
|
|
12
|
-
api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
|
|
13
10
|
defaultValue?: LanguagePickerOption;
|
|
14
|
-
editorView: EditorView;
|
|
15
11
|
filterOption: (option: SelectOption<LanguagePickerOption>, rawInput: string) => boolean;
|
|
16
12
|
formatMessage: IntlShape['formatMessage'];
|
|
17
13
|
languagePickerOptions: LanguagePickerOption[];
|
|
18
|
-
onLanguageSelect?: (language: string) => void;
|
|
19
14
|
onMenuOpen?: () => void;
|
|
15
|
+
onSelection: (option: LanguagePickerOption, selectionSource: LanguagePickerSelectionSource) => void;
|
|
20
16
|
recentLanguageValues?: string[];
|
|
21
17
|
};
|
|
22
|
-
export declare const LanguagePicker: ({
|
|
18
|
+
export declare const LanguagePicker: ({ defaultValue, filterOption, formatMessage, languagePickerOptions, recentLanguageValues, onMenuOpen, onSelection, }: LanguagePickerProps) => React.JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
|
|
2
|
+
import type { ReadonlyTransaction } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import type { AutoDetectEntry, AutoDetectState } from '../pm-plugins/auto-detect-state';
|
|
4
|
+
export declare const shouldTriggerLargeChangeDetection: (lastObservedText: string, text: string) => boolean;
|
|
5
|
+
export declare const getFirstLine: (text: string) => string;
|
|
6
|
+
export declare const hasEnoughTextForAutoDetection: (text: string) => boolean;
|
|
7
|
+
export declare const getLocalId: (node: PMNode) => string | null;
|
|
8
|
+
export declare const createAutoDetectEntry: (node: PMNode, pos: number, isPending: boolean, previous?: AutoDetectEntry) => AutoDetectEntry;
|
|
9
|
+
export declare const queueAutoDetection: (languageDetectionMap: AutoDetectState["languageDetectionMap"], node: PMNode, pos: number, isPending: boolean) => AutoDetectState["languageDetectionMap"];
|
|
10
|
+
export declare const removeAutoDetection: (languageDetectionMap: AutoDetectState["languageDetectionMap"], localId: string) => AutoDetectState["languageDetectionMap"];
|
|
11
|
+
export declare const updateAutoDetectState: (tr: ReadonlyTransaction, pluginState: AutoDetectState) => AutoDetectState["languageDetectionMap"];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
|
|
2
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
3
|
+
import type { CodeBlockPlugin } from '../index';
|
|
4
|
+
export type AutoDetectTimer = {
|
|
5
|
+
lastObservedText: string;
|
|
6
|
+
timer: ReturnType<typeof setTimeout>;
|
|
7
|
+
};
|
|
8
|
+
export declare const syncPendingDetectionTimers: (view: EditorView, timers: Map<string, AutoDetectTimer>, api?: ExtractInjectionAPI<CodeBlockPlugin>) => void;
|
|
@@ -6,6 +6,8 @@ import type { LanguagePickerSelectionSource } from '../ui/language-picker-option
|
|
|
6
6
|
export declare const removeCodeBlockWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
7
7
|
export declare const removeCodeBlock: Command;
|
|
8
8
|
export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string | null, selectionSource?: LanguagePickerSelectionSource) => Command;
|
|
9
|
+
/** Queue auto-detection for selected code block. */
|
|
10
|
+
export declare const detectLanguage: () => Command;
|
|
9
11
|
export declare const copyContentToClipboardWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
10
12
|
export declare const copyContentToClipboard: Command;
|
|
11
13
|
export declare const resetCopiedState: Command;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
2
|
+
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
export type AutoDetectResult = 'detected' | 'noneDetected';
|
|
4
|
+
export type AutoDetectEntry = {
|
|
5
|
+
autoDetectedLanguage?: string;
|
|
6
|
+
detectionResult?: AutoDetectResult;
|
|
7
|
+
isPending?: boolean;
|
|
8
|
+
lastObservedFirstLine: string;
|
|
9
|
+
lastObservedText: string;
|
|
10
|
+
pos: number;
|
|
11
|
+
};
|
|
12
|
+
export type AutoDetectState = {
|
|
13
|
+
languageDetectionMap: Record<string, AutoDetectEntry>;
|
|
14
|
+
};
|
|
15
|
+
export declare const autoDetectPluginKey: PluginKey<AutoDetectState>;
|
|
16
|
+
export declare const getAutoDetectPluginState: (state: EditorState) => AutoDetectState | undefined;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
|
|
3
|
+
import type { CodeBlockPlugin } from '../index';
|
|
4
|
+
import { type AutoDetectState } from './auto-detect-state';
|
|
5
|
+
export declare const createAutoDetectPlugin: (api?: ExtractInjectionAPI<CodeBlockPlugin>) => SafePlugin<AutoDetectState>;
|
|
@@ -3,4 +3,4 @@ import type { EditorState, ReadonlyTransaction, Selection } from '@atlaskit/edit
|
|
|
3
3
|
import type { NodeWithPos } from '@atlaskit/editor-prosemirror/utils';
|
|
4
4
|
export declare function getCursor(selection: Selection): ResolvedPos | undefined;
|
|
5
5
|
export declare function getAllCodeBlockNodesInDoc(state: EditorState): NodeWithPos[];
|
|
6
|
-
export declare function getAllChangedCodeBlocksInTransaction(tr: ReadonlyTransaction): NodeWithPos[]
|
|
6
|
+
export declare function getAllChangedCodeBlocksInTransaction(tr: ReadonlyTransaction): NodeWithPos[];
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
|
|
3
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
4
|
+
import type { CodeBlockPlugin } from '../index';
|
|
2
5
|
import type { LanguagePickerProps } from './LanguagePicker';
|
|
3
|
-
type CodeBlockLanguagePickerProps = Omit<LanguagePickerProps, 'recentLanguageValues' | '
|
|
6
|
+
type CodeBlockLanguagePickerProps = Omit<LanguagePickerProps, 'recentLanguageValues' | 'onMenuOpen' | 'onSelection'> & {
|
|
7
|
+
api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
|
|
8
|
+
editorView: EditorView;
|
|
9
|
+
};
|
|
4
10
|
export declare const CodeBlockLanguagePicker: ({ api, defaultValue, editorView, filterOption, formatMessage, languagePickerOptions, }: CodeBlockLanguagePickerProps) => React.JSX.Element;
|
|
5
11
|
export {};
|
|
@@ -4,19 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import type { IntlShape } from 'react-intl';
|
|
7
|
-
import type {
|
|
8
|
-
import type
|
|
9
|
-
import type { CodeBlockPlugin } from '../index';
|
|
10
|
-
import type { LanguagePickerOption } from './language-picker-options';
|
|
7
|
+
import type { SelectOption } from '@atlaskit/editor-common/types';
|
|
8
|
+
import { type LanguagePickerOption, type LanguagePickerSelectionSource } from './language-picker-options';
|
|
11
9
|
export type LanguagePickerProps = {
|
|
12
|
-
api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
|
|
13
10
|
defaultValue?: LanguagePickerOption;
|
|
14
|
-
editorView: EditorView;
|
|
15
11
|
filterOption: (option: SelectOption<LanguagePickerOption>, rawInput: string) => boolean;
|
|
16
12
|
formatMessage: IntlShape['formatMessage'];
|
|
17
13
|
languagePickerOptions: LanguagePickerOption[];
|
|
18
|
-
onLanguageSelect?: (language: string) => void;
|
|
19
14
|
onMenuOpen?: () => void;
|
|
15
|
+
onSelection: (option: LanguagePickerOption, selectionSource: LanguagePickerSelectionSource) => void;
|
|
20
16
|
recentLanguageValues?: string[];
|
|
21
17
|
};
|
|
22
|
-
export declare const LanguagePicker: ({
|
|
18
|
+
export declare const LanguagePicker: ({ defaultValue, filterOption, formatMessage, languagePickerOptions, recentLanguageValues, onMenuOpen, onSelection, }: LanguagePickerProps) => React.JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
|
|
2
|
+
import type { ReadonlyTransaction } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import type { AutoDetectEntry, AutoDetectState } from '../pm-plugins/auto-detect-state';
|
|
4
|
+
export declare const shouldTriggerLargeChangeDetection: (lastObservedText: string, text: string) => boolean;
|
|
5
|
+
export declare const getFirstLine: (text: string) => string;
|
|
6
|
+
export declare const hasEnoughTextForAutoDetection: (text: string) => boolean;
|
|
7
|
+
export declare const getLocalId: (node: PMNode) => string | null;
|
|
8
|
+
export declare const createAutoDetectEntry: (node: PMNode, pos: number, isPending: boolean, previous?: AutoDetectEntry) => AutoDetectEntry;
|
|
9
|
+
export declare const queueAutoDetection: (languageDetectionMap: AutoDetectState["languageDetectionMap"], node: PMNode, pos: number, isPending: boolean) => AutoDetectState["languageDetectionMap"];
|
|
10
|
+
export declare const removeAutoDetection: (languageDetectionMap: AutoDetectState["languageDetectionMap"], localId: string) => AutoDetectState["languageDetectionMap"];
|
|
11
|
+
export declare const updateAutoDetectState: (tr: ReadonlyTransaction, pluginState: AutoDetectState) => AutoDetectState["languageDetectionMap"];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
|
|
2
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
3
|
+
import type { CodeBlockPlugin } from '../index';
|
|
4
|
+
export type AutoDetectTimer = {
|
|
5
|
+
lastObservedText: string;
|
|
6
|
+
timer: ReturnType<typeof setTimeout>;
|
|
7
|
+
};
|
|
8
|
+
export declare const syncPendingDetectionTimers: (view: EditorView, timers: Map<string, AutoDetectTimer>, api?: ExtractInjectionAPI<CodeBlockPlugin>) => void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-code-block",
|
|
3
|
-
"version": "12.1.
|
|
3
|
+
"version": "12.1.11",
|
|
4
4
|
"description": "Code block plugin for @atlaskit/editor-core",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
"@atlaskit/primitives": "^19.0.0",
|
|
50
50
|
"@atlaskit/prosemirror-input-rules": "^3.7.0",
|
|
51
51
|
"@atlaskit/select": "^21.12.0",
|
|
52
|
-
"@atlaskit/tmp-editor-statsig": "^
|
|
52
|
+
"@atlaskit/tmp-editor-statsig": "^87.0.0",
|
|
53
53
|
"@atlaskit/tokens": "^13.1.0",
|
|
54
54
|
"@babel/runtime": "^7.0.0",
|
|
55
55
|
"@compiled/react": "^0.20.0"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
|
-
"@atlaskit/editor-common": "^114.
|
|
58
|
+
"@atlaskit/editor-common": "^114.55.0",
|
|
59
59
|
"react": "^18.2.0",
|
|
60
60
|
"react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
|
|
61
61
|
},
|