@bhsd/codemirror-mediawiki
Version: 
Modified CodeMirror mode based on wikimedia/mediawiki-extensions-CodeMirror
52 lines (51 loc) • 1.41 kB
JavaScript
const noDetectionLangs = new Set(['plain', 'mediawiki']);
const getLines = (text) => text.children?.flatMap(getLines) ?? text.text;
/**
 * 检测文本的缩进方式
 * @param text 文本内容
 * @param defaultIndent 默认缩进方式
 * @param lang 语言
 */
export const detectIndent = (text, defaultIndent, lang) => {
    if (noDetectionLangs.has(lang)) {
        return defaultIndent;
    }
    const lineSpaces = [], lines = typeof text === 'string' ? text.split('\n') : getLines(text);
    let tabLines = 0;
    for (const line of lines) {
        if (!line.trim()) {
            continue;
        }
        let tabs = 0, spaces = 0;
        for (const char of line) {
            if (char === '\t') {
                tabs++;
            }
            else if (char === ' ') {
                spaces++;
            }
            else {
                break;
            }
        }
        if (tabs && tabs * 8 >= spaces) {
            tabLines++;
        }
        if (spaces > 1 && spaces >= tabs * 2) {
            lineSpaces.push(spaces);
        }
    }
    const { length } = lineSpaces;
    if (tabLines > length) {
        return '\t';
    }
    else if (tabLines === length) {
        return defaultIndent;
    }
    for (let i = Math.min(...lineSpaces, 8); i > 2; i--) {
        if (lineSpaces.every(s => s % i === 0)) {
            return ' '.repeat(i);
        }
    }
    return '  ';
};