mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-11 05:23:42 +03:00
94 lines
3.9 KiB
JavaScript
94 lines
3.9 KiB
JavaScript
// web-test dom/nav v1.0 — sections panel, tabs bar, function panel commands
|
||
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||
|
||
/** Read sections panel (left sidebar). */
|
||
export function readSectionsScript() {
|
||
return `(() => {
|
||
const sections = [];
|
||
document.querySelectorAll('[id^="themesCell_theme_"]').forEach(el => {
|
||
const entry = { name: el.innerText?.trim() || '' };
|
||
if (el.classList.contains('select')) entry.active = true;
|
||
sections.push(entry);
|
||
});
|
||
return sections;
|
||
})()`;
|
||
}
|
||
|
||
/** Read open tabs bar. */
|
||
export function readTabsScript() {
|
||
return `(() => {
|
||
const norm = s => (s?.trim().replace(/\\u00a0/g, ' ') || '').replace(/ё/gi, 'е');
|
||
const tabs = [];
|
||
document.querySelectorAll('[id^="openedCell_cmd_"]').forEach(el => {
|
||
const text = norm(el.innerText);
|
||
if (!text) return;
|
||
const entry = { name: text };
|
||
if (el.classList.contains('select')) entry.active = true;
|
||
tabs.push(entry);
|
||
});
|
||
return tabs;
|
||
})()`;
|
||
}
|
||
|
||
/** Switch to a tab by name (fuzzy match). Returns matched name or { error, available }. */
|
||
export function switchTabScript(name) {
|
||
return `(() => {
|
||
const norm = s => (s?.trim().replace(/\\u00a0/g, ' ') || '').replace(/ё/gi, 'е');
|
||
const target = ${JSON.stringify(name.toLowerCase().replace(/ё/g, 'е'))};
|
||
const tabs = [...document.querySelectorAll('[id^="openedCell_cmd_"]')].filter(el => el.offsetWidth > 0 && norm(el.innerText));
|
||
let best = tabs.find(el => norm(el.innerText).toLowerCase() === target);
|
||
if (!best) best = tabs.find(el => norm(el.innerText).toLowerCase().includes(target));
|
||
if (best) { best.click(); return norm(best.innerText); }
|
||
return { error: 'not_found', available: tabs.map(el => norm(el.innerText)) };
|
||
})()`;
|
||
}
|
||
|
||
/** Read commands in the function panel (current section). */
|
||
export function readCommandsScript() {
|
||
return `(() => {
|
||
const groups = [];
|
||
const container = document.querySelector('#funcPanel_container table tr');
|
||
if (!container) return groups;
|
||
for (const td of container.children) {
|
||
const commands = [];
|
||
td.querySelectorAll('[id^="cmd_"][id$="_txt"]').forEach(el => {
|
||
if (el.offsetWidth === 0) return;
|
||
commands.push(el.innerText?.trim() || '');
|
||
});
|
||
if (commands.length > 0) groups.push(commands);
|
||
}
|
||
return groups;
|
||
})()`;
|
||
}
|
||
|
||
/**
|
||
* Navigate to a section by name (fuzzy match).
|
||
* Returns the matched section name, or { error, available }.
|
||
*/
|
||
export function navigateSectionScript(name) {
|
||
return `(() => {
|
||
const norm = s => (s?.trim().replace(/\\u00a0/g, ' ').replace(/[\\r\\n]+/g, ' ').replace(/ +/g, ' ') || '').replace(/ё/gi, 'е');
|
||
const target = ${JSON.stringify(name.toLowerCase().replace(/ё/g, 'е').replace(/[\r\n]+/g, ' ').replace(/ +/g, ' '))};
|
||
const els = [...document.querySelectorAll('[id^="themesCell_theme_"]')];
|
||
let bestEl = els.find(el => norm(el.innerText).toLowerCase() === target);
|
||
if (!bestEl) bestEl = els.find(el => norm(el.innerText).toLowerCase().includes(target));
|
||
if (bestEl) { bestEl.click(); return norm(bestEl.innerText); }
|
||
return { error: 'not_found', available: els.map(el => norm(el.innerText)).filter(Boolean) };
|
||
})()`;
|
||
}
|
||
|
||
/**
|
||
* Open a command from function panel by name (fuzzy match).
|
||
*/
|
||
export function openCommandScript(name) {
|
||
return `(() => {
|
||
const norm = s => (s?.trim().replace(/\\u00a0/g, ' ') || '').replace(/ё/gi, 'е');
|
||
const target = ${JSON.stringify(name.toLowerCase().replace(/ё/g, 'е'))};
|
||
const els = [...document.querySelectorAll('[id^="cmd_"][id$="_txt"]')].filter(el => el.offsetWidth > 0);
|
||
let bestEl = els.find(el => norm(el.innerText).toLowerCase() === target);
|
||
if (!bestEl) bestEl = els.find(el => norm(el.innerText).toLowerCase().includes(target));
|
||
if (bestEl) { bestEl.click(); return norm(bestEl.innerText); }
|
||
return { error: 'not_found', available: els.map(el => norm(el.innerText)).filter(Boolean) };
|
||
})()`;
|
||
}
|