@alauda-fe/common
Version:
Alauda frontend team common codes.
147 lines • 17.4 kB
JavaScript
/**
* 自动折叠 managedFields 字段
* @param monacoEditor Monaco 编辑器实例
*/
export function foldManagedFields(monacoEditor) {
if (!monacoEditor) {
return;
}
const model = monacoEditor.getModel();
if (!model) {
return;
}
try {
// 查找所有 managedFields 字段(只在 metadata 下的)
const managedFieldsMatches = model.findMatches('^(\\s+)managedFields:', false, true, false, null, true);
if (managedFieldsMatches && managedFieldsMatches.length > 0) {
const foldingRanges = [];
for (const match of managedFieldsMatches) {
const startLine = match.range.startLineNumber;
const endLine = findManagedFieldsEndLine(model, startLine);
if (endLine > startLine) {
foldingRanges.push({
startLineNumber: startLine,
startColumn: 1,
endLineNumber: endLine,
endColumn: model.getLineMaxColumn(endLine),
});
}
}
if (foldingRanges.length > 0) {
// 递归折叠每个 managedFields 区域,确保每次折叠完成后再进行下一次
foldRangesSequentially(monacoEditor, foldingRanges?.reverse(), 0);
}
}
}
catch (error) {
console.warn('Failed to fold managedFields:', error);
}
}
/**
* 递归折叠多个区域,确保每次折叠完成后再进行下一次
* @param monacoEditor Monaco 编辑器实例
* @param foldingRanges 折叠区域数组
* @param index 当前折叠的索引
*/
async function foldRangesSequentially(monacoEditor, foldingRanges, index) {
if (index >= foldingRanges.length) {
return;
}
const range = foldingRanges[index];
monacoEditor.setSelection(range);
await Promise.resolve(monacoEditor.getAction('editor.fold')?.run());
return foldRangesSequentially(monacoEditor, foldingRanges, index + 1);
}
/**
* 查找 managedFields 字段的结束行
* @param model Monaco 编辑器模型
* @param startLine 起始行号
* @returns 结束行号
*/
function findManagedFieldsEndLine(model, startLine) {
const totalLines = model.getLineCount();
const startIndent = getLineIndentation(model, startLine);
// 从下一行开始查找
for (let line = startLine + 1; line <= totalLines; line++) {
const lineContent = model.getLineContent(line).trim();
// 跳过空行
if (!lineContent) {
continue;
}
const currentIndent = getLineIndentation(model, line);
// 如果缩进小于等于起始行,说明 managedFields 字段结束
if (currentIndent <= startIndent) {
return line - 1;
}
}
return totalLines;
}
/**
* 获取行的缩进级别
* @param model Monaco 编辑器模型
* @param lineNumber 行号
* @returns 缩进级别(空格数)
*/
function getLineIndentation(model, lineNumber) {
const lineContent = model.getLineContent(lineNumber);
const match = lineContent.match(/^(\s*)/);
return match ? match[1].length : 0;
}
/**
* ManagedFields 自动折叠器
* 用于在内容变化时自动折叠 managedFields 字段
*/
export class ManagedFieldsAutoFolder {
constructor() {
this.lastFoldedContent = '';
}
/**
* 开始监听内容变化并自动折叠
* @param editorProvider 编辑器实例提供者
* @param contentObservable 内容变化的 Observable
*/
startAutoFold(editorProvider, contentObservable) {
this.stopAutoFold();
this.subscription = contentObservable.subscribe(() => {
setTimeout(() => {
const editor = editorProvider.getEditorInstance();
if (editor) {
const model = editor.getModel();
if (model) {
const currentContent = model.getValue();
// 只有当内容真正发生变化时才执行折叠
if (currentContent.includes('managedFields:') &&
currentContent !== this.lastFoldedContent) {
foldManagedFields(editor);
this.lastFoldedContent = currentContent;
}
}
}
}, 100);
});
}
/**
* 停止自动折叠
*/
stopAutoFold() {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = undefined;
}
}
/**
* 手动执行一次折叠
* @param editorProvider 编辑器实例提供者
*/
foldOnce(editorProvider) {
const editor = editorProvider.getEditorInstance();
if (editor) {
foldManagedFields(editor);
const model = editor.getModel();
if (model) {
this.lastFoldedContent = model.getValue();
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1maWVsZHMtZm9sZGVyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29kZS9tYW5hZ2VkLWZpZWxkcy1mb2xkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLFlBQTJGO0lBRTNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQzVDLHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLGFBQWEsR0FBVSxFQUFFLENBQUM7WUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFFOUMsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUzRCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztvQkFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDakIsZUFBZSxFQUFFLFNBQVM7d0JBQzFCLFdBQVcsRUFBRSxDQUFDO3dCQUNkLGFBQWEsRUFBRSxPQUFPO3dCQUN0QixTQUFTLEVBQUUsS0FBSyxD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QUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDoh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkcyDlrZfmrrVcbiAqIEBwYXJhbSBtb25hY29FZGl0b3IgTW9uYWNvIOe8lui+keWZqOWunuS+i1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZE1hbmFnZWRGaWVsZHMoXG4gIG1vbmFjb0VkaXRvcjogaW1wb3J0KCdtb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvZWRpdG9yLmFwaScpLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3IsXG4pOiB2b2lkIHtcbiAgaWYgKCFtb25hY29FZGl0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlbCA9IG1vbmFjb0VkaXRvci5nZXRNb2RlbCgpO1xuICBpZiAoIW1vZGVsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyDmn6Xmib7miYDmnIkgbWFuYWdlZEZpZWxkcyDlrZfmrrXvvIjlj6rlnKggbWV0YWRhdGEg5LiL55qE77yJXG4gICAgY29uc3QgbWFuYWdlZEZpZWxkc01hdGNoZXMgPSBtb2RlbC5maW5kTWF0Y2hlcyhcbiAgICAgICdeKFxcXFxzKyltYW5hZ2VkRmllbGRzOicsXG4gICAgICBmYWxzZSxcbiAgICAgIHRydWUsXG4gICAgICBmYWxzZSxcbiAgICAgIG51bGwsXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBpZiAobWFuYWdlZEZpZWxkc01hdGNoZXMgJiYgbWFuYWdlZEZpZWxkc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm9sZGluZ1JhbmdlczogYW55W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYW5hZ2VkRmllbGRzTWF0Y2hlcykge1xuICAgICAgICBjb25zdCBzdGFydExpbmUgPSBtYXRjaC5yYW5nZS5zdGFydExpbmVOdW1iZXI7XG5cbiAgICAgICAgY29uc3QgZW5kTGluZSA9IGZpbmRNYW5hZ2VkRmllbGRzRW5kTGluZShtb2RlbCwgc3RhcnRMaW5lKTtcblxuICAgICAgICBpZiAoZW5kTGluZSA+IHN0YXJ0TGluZSkge1xuICAgICAgICAgIGZvbGRpbmdSYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHN0YXJ0TGluZSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogZW5kTGluZSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogbW9kZWwuZ2V0TGluZU1heENvbHVtbihlbmRMaW5lKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvbGRpbmdSYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDpgJLlvZLmipjlj6Dmr4/kuKogbWFuYWdlZEZpZWxkcyDljLrln5/vvIznoa7kv53mr4/mrKHmipjlj6DlrozmiJDlkI7lho3ov5vooYzkuIvkuIDmrKFcbiAgICAgICAgZm9sZFJhbmdlc1NlcXVlbnRpYWxseShtb25hY29FZGl0b3IsIGZvbGRpbmdSYW5nZXM/LnJldmVyc2UoKSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZvbGQgbWFuYWdlZEZpZWxkczonLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiDpgJLlvZLmipjlj6DlpJrkuKrljLrln5/vvIznoa7kv53mr4/mrKHmipjlj6DlrozmiJDlkI7lho3ov5vooYzkuIvkuIDmrKFcbiAqIEBwYXJhbSBtb25hY29FZGl0b3IgTW9uYWNvIOe8lui+keWZqOWunuS+i1xuICogQHBhcmFtIGZvbGRpbmdSYW5nZXMg5oqY5Y+g5Yy65Z+f5pWw57uEXG4gKiBAcGFyYW0gaW5kZXgg5b2T5YmN5oqY5Y+g55qE57Si5byVXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvbGRSYW5nZXNTZXF1ZW50aWFsbHkoXG4gIG1vbmFjb0VkaXRvcjogaW1wb3J0KCdtb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvZWRpdG9yLmFwaScpLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3IsXG4gIGZvbGRpbmdSYW5nZXM6IGFueVtdLFxuICBpbmRleDogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpbmRleCA+PSBmb2xkaW5nUmFuZ2VzLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJhbmdlID0gZm9sZGluZ1Jhbmdlc1tpbmRleF07XG4gIG1vbmFjb0VkaXRvci5zZXRTZWxlY3Rpb24ocmFuZ2UpO1xuICBhd2FpdCBQcm9taXNlLnJlc29sdmUobW9uYWNvRWRpdG9yLmdldEFjdGlvbignZWRpdG9yLmZvbGQnKT8ucnVuKCkpO1xuXG4gIHJldHVybiBmb2xkUmFuZ2VzU2VxdWVudGlhbGx5KG1vbmFjb0VkaXRvciwgZm9sZGluZ1JhbmdlcywgaW5kZXggKyAxKTtcbn1cblxuLyoqXG4gKiDmn6Xmib4gbWFuYWdlZEZpZWxkcyDlrZfmrrXnmoTnu5PmnZ/ooYxcbiAqIEBwYXJhbSBtb2RlbCBNb25hY28g57yW6L6R5Zmo5qih5Z6LXG4gKiBAcGFyYW0gc3RhcnRMaW5lIOi1t+Wni+ihjOWPt1xuICogQHJldHVybnMg57uT5p2f6KGM5Y+3XG4gKi9cbmZ1bmN0aW9uIGZpbmRNYW5hZ2VkRmllbGRzRW5kTGluZShcbiAgbW9kZWw6IGltcG9ydCgnbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2VkaXRvci5hcGknKS5lZGl0b3IuSVRleHRNb2RlbCxcbiAgc3RhcnRMaW5lOiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCB0b3RhbExpbmVzID0gbW9kZWwuZ2V0TGluZUNvdW50KCk7XG4gIGNvbnN0IHN0YXJ0SW5kZW50ID0gZ2V0TGluZUluZGVudGF0aW9uKG1vZGVsLCBzdGFydExpbmUpO1xuXG4gIC8vIOS7juS4i+S4gOihjOW8gOWni+afpeaJvlxuICBmb3IgKGxldCBsaW5lID0gc3RhcnRMaW5lICsgMTsgbGluZSA8PSB0b3RhbExpbmVzOyBsaW5lKyspIHtcbiAgICBjb25zdCBsaW5lQ29udGVudCA9IG1vZGVsLmdldExpbmVDb250ZW50KGxpbmUpLnRyaW0oKTtcblxuICAgIC8vIOi3s+i/h+epuuihjFxuICAgIGlmICghbGluZUNvbnRlbnQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBnZXRMaW5lSW5kZW50YXRpb24obW9kZWwsIGxpbmUpO1xuXG4gICAgLy8g5aaC5p6c57yp6L+b5bCP5LqO562J5LqO6LW35aeL6KGM77yM6K+05piOIG1hbmFnZWRGaWVsZHMg5a2X5q6157uT5p2fXG4gICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gc3RhcnRJbmRlbnQpIHtcbiAgICAgIHJldHVybiBsaW5lIC0gMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxMaW5lcztcbn1cblxuLyoqXG4gKiDojrflj5booYznmoTnvKnov5vnuqfliKtcbiAqIEBwYXJhbSBtb2RlbCBNb25hY28g57yW6L6R5Zmo5qih5Z6LXG4gKiBAcGFyYW0gbGluZU51bWJlciDooYzlj7dcbiAqIEByZXR1cm5zIOe8qei/m+e6p+WIq++8iOepuuagvOaVsO+8iVxuICovXG5mdW5jdGlvbiBnZXRMaW5lSW5kZW50YXRpb24oXG4gIG1vZGVsOiBpbXBvcnQoJ21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9lZGl0b3IuYXBpJykuZWRpdG9yLklUZXh0TW9kZWwsXG4gIGxpbmVOdW1iZXI6IG51bWJlcixcbik6IG51bWJlciB7XG4gIGNvbnN0IGxpbmVDb250ZW50ID0gbW9kZWwuZ2V0TGluZUNvbnRlbnQobGluZU51bWJlcik7XG4gIGNvbnN0IG1hdGNoID0gbGluZUNvbnRlbnQubWF0Y2goL14oXFxzKikvKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0ubGVuZ3RoIDogMDtcbn1cblxuLyoqXG4gKiDnvJbovpHlmajlrp7kvovojrflj5blmajmjqXlj6NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JJbnN0YW5jZVByb3ZpZGVyIHtcbiAgZ2V0RWRpdG9ySW5zdGFuY2UoKTpcbiAgICB8IGltcG9ydCgnbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2VkaXRvci5hcGknKS5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yXG4gICAgfCBudWxsO1xufVxuXG4vKipcbiAqIE1hbmFnZWRGaWVsZHMg6Ieq5Yqo5oqY5Y+g5ZmoXG4gKiDnlKjkuo7lnKjlhoXlrrnlj5jljJbml7boh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkcyDlrZfmrrVcbiAqL1xuZXhwb3J0IGNsYXNzIE1hbmFnZWRGaWVsZHNBdXRvRm9sZGVyIHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbGFzdEZvbGRlZENvbnRlbnQgPSAnJztcblxuICAvKipcbiAgICog5byA5aeL55uR5ZCs5YaF5a655Y+Y5YyW5bm26Ieq5Yqo5oqY5Y+gXG4gICAqIEBwYXJhbSBlZGl0b3JQcm92aWRlciDnvJbovpHlmajlrp7kvovmj5DkvpvogIVcbiAgICogQHBhcmFtIGNvbnRlbnRPYnNlcnZhYmxlIOWGheWuueWPmOWMlueahCBPYnNlcnZhYmxlXG4gICAqL1xuICBzdGFydEF1dG9Gb2xkKFxuICAgIGVkaXRvclByb3ZpZGVyOiBFZGl0b3JJbnN0YW5jZVByb3ZpZGVyLFxuICAgIGNvbnRlbnRPYnNlcnZhYmxlOiBhbnksXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3RvcEF1dG9Gb2xkKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGNvbnRlbnRPYnNlcnZhYmxlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUHJvdmlkZXIuZ2V0RWRpdG9ySW5zdGFuY2UoKTtcbiAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gZWRpdG9yLmdldE1vZGVsKCk7XG4gICAgICAgICAgaWYgKG1vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAvLyDlj6rmnInlvZPlhoXlrrnnnJ/mraPlj5HnlJ/lj5jljJbml7bmiY3miafooYzmipjlj6BcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VycmVudENvbnRlbnQuaW5jbHVkZXMoJ21hbmFnZWRGaWVsZHM6JykgJiZcbiAgICAgICAgICAgICAgY3VycmVudENvbnRlbnQgIT09IHRoaXMubGFzdEZvbGRlZENvbnRlbnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb2xkTWFuYWdlZEZpZWxkcyhlZGl0b3IpO1xuICAgICAgICAgICAgICB0aGlzLmxhc3RGb2xkZWRDb250ZW50ID0gY3VycmVudENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWBnOatouiHquWKqOaKmOWPoFxuICAgKi9cbiAgc3RvcEF1dG9Gb2xkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmiYvliqjmiafooYzkuIDmrKHmipjlj6BcbiAgICogQHBhcmFtIGVkaXRvclByb3ZpZGVyIOe8lui+keWZqOWunuS+i+aPkOS+m+iAhVxuICAgKi9cbiAgZm9sZE9uY2UoZWRpdG9yUHJvdmlkZXI6IEVkaXRvckluc3RhbmNlUHJvdmlkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JQcm92aWRlci5nZXRFZGl0b3JJbnN0YW5jZSgpO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIGZvbGRNYW5hZ2VkRmllbGRzKGVkaXRvcik7XG4gICAgICBjb25zdCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpO1xuICAgICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIHRoaXMubGFzdEZvbGRlZENvbnRlbnQgPSBtb2RlbC5nZXRWYWx1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19