You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

42 lines
2.0 KiB

// 最终验证:从 Axure 页面 HTML 提取全部文本(解码 &#xHHHH; 实体),按控件类型分组
import fs from 'node:fs';
const html = fs.readFileSync('e:/code/crm-backend-matt/.scratch/lanhu-latest/team-page.html', 'utf8');
// 解码 HTML 实体
const decode = (s) => s
.replace(/&#x([0-9A-Fa-f]+);/g, (_, h) => String.fromCodePoint(parseInt(h, 16)))
.replace(/&#(\d+);/g, (_, d) => String.fromCodePoint(parseInt(d, 10)))
.replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"');
// 按 Axure 控件注释分组提取:<!-- 名称 (类型) --> 后跟 <div id="uNNN"...>...<div id="uNNN_text"...><p><span>文本</span></p>
const re = /<!--\s*(.*?)\s*-->\s*<div id="(u\d+)"[^>]*>/g;
const items = [];
let m;
while ((m = re.exec(html)) !== null) {
const [full, comment, id] = m;
const typeMatch = comment.match(/^(.*?)\s*[((](.+?)[))]$/);
const name = typeMatch ? typeMatch[1] : comment;
const type = typeMatch ? typeMatch[2] : '其他';
// 在该控件开始的后续 600 字符里找 uNNN_text 的内容
const after = html.slice(m.index, m.index + 700);
const textRe = new RegExp(`id="${id}_text"[^>]*>[\\s\\S]*?</div>`);
const tm = after.match(textRe);
let text = '';
if (tm) {
text = (tm[0].match(/<p><span>([\s\S]*?)<\/span><\/p>/g) || [])
.map(p => decode(p.replace(/<\/?p>/g, '').replace(/<\/?span>/g, '')))
.join(' | ');
}
items.push({ id, name: decode(name), type: decode(type), text: text.trim() });
}
console.log('总控件数:', items.length);
console.log('有文本的控件:', items.filter(i => i.text).length);
console.log('\n=== 全部有文本的控件(id | 类型 | 名称 | 文本)===');
for (const i of items) {
if (i.text) console.log(`${i.id.padEnd(7)} ${i.type.padEnd(6)} ${i.name.slice(0, 12).padEnd(12)} ${i.text.slice(0, 70)}`);
}
console.log('\n=== 类型分布 ===');
const dist = {};
items.forEach(i => dist[i.type] = (dist[i.type] || 0) + 1);
console.log(JSON.stringify(dist, null, 0));