module.exports.updateBlocksLevels = function()

in editor/common/blockHelper.js [113:175]


module.exports.updateBlocksLevels = function (blocks, targetsMap) {
    let topLevel = 0;
    let topLevelHasPrefix = false;
    let currentLevel = 0;

    for (const block of blocks) {
        switch (block.type) {
        case 'header':
            currentLevel = block.level;

            if (topLevel === 0) {
                topLevel = currentLevel;
                // TODO Not all have prefix?
                topLevelHasPrefix = !!block.prefixCode;
            }

            if (topLevelHasPrefix !== !!block.prefixCode) {
                throw new Error(`[${block.propertyName}] Must all includes prefix or not`);
            }
            break;
        // Content and use command following header has same level.
        case 'content':
        case 'if':
        case 'elif':
        case 'else':
        case 'endif':
        case 'for':
        case 'endfor':
        case 'uicontrol':
            // Indent description content by default
            block.level = currentLevel + 1;
            break;
        case 'use':
        case 'import':
            block.level = currentLevel;
            if (targetsMap) {
                const targetObj = targetsMap[block.target];
                if (targetObj) {
                    const prefixParam = block.args && block.args.find(item => item[0] === 'prefix');
                    const prefixVal = prefixParam && prefixParam[1].replace(/['"]/g, '');
                    if (targetObj.topLevel === 0) {
                        // Target has no header if topLevel is 0.
                        // Assume it's only description
                        // Indent== by default.
                        block.level = currentLevel + 1;
                    }
                    else if (!targetObj.topLevelHasPrefix || (prefixVal && prefixVal.match(/#+/))) {
                        (block.level = targetObj.topLevel + module.exports.countLevel(prefixVal || ''));
                    }
                }
                else {
                    console.warn(`Block ${block.target} not exists`);
                }
            }
            break;
        }
    }

    return {
        topLevel,
        topLevelHasPrefix
    };
};