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);
}
};