module.exports.updateBlocksKeys = function()

in editor/common/blockHelper.js [177:245]


module.exports.updateBlocksKeys = function (blocks) {
    let currentLevel = 0;

    const stacks = ['top'];

    let scopeKey = stacks.join('.');

    function keyNoDuplicate() {
        const keyCount = {};
        const keyMap = {};
        return function (baseKey) {
            let keyNoDuplicate = baseKey;
            keyCount[baseKey] = keyCount[baseKey] || 1;
            while (keyMap[keyNoDuplicate]) {
                keyNoDuplicate = baseKey + '-' + keyCount[baseKey]++;
            }
            keyMap[keyNoDuplicate] = true;
            return keyNoDuplicate;
        }
    }

    const contentKeyNoDuplicate = keyNoDuplicate();
    const uiControlKeyNoDuplicate = keyNoDuplicate();
    const allKeyNoDuplicate = keyNoDuplicate();

    for (const block of blocks) {
        let baseKey = '';
        switch (block.type) {
        case 'header':
            if (block.level <= currentLevel) {
                for (let i = block.level; i <= currentLevel; i++) {
                    stacks.pop();
                }
                stacks.push(block.propertyName);
            }
            else {
                stacks.push(block.propertyName);
            }

            scopeKey = stacks.join('.');
            baseKey = `header:${scopeKey}`;
            currentLevel = block.level;
            break;
            // Content and use command following header has same level.
        case 'content':
            baseKey = contentKeyNoDuplicate(`content:${scopeKey}`);
            break;
        case 'use':
        case 'import':
            baseKey = `use:${scopeKey}:${block.target}`;
            break;
        case 'if':
        case 'elif':
        case 'else':
        case 'endif':
        case 'for':
        case 'endfor':
            baseKey = `${block.type}:${scopeKey}`;
            if (block.expr) {
                baseKey = `${baseKey}:${block.expr}`
            }
            break;
        case 'uicontrol':
            baseKey = uiControlKeyNoDuplicate(`uicontrol:${scopeKey}`);
        }

        block.key = allKeyNoDuplicate(baseKey);
    }
};