index.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. const Puppeteer = require('puppeteer');
  2. const sleep = (ms) => { return new Promise((resolve) => { setTimeout(resolve, ms) }) };
  3. const { components, unit } = require(process.cwd() + '/config.js');
  4. const fs = require('fs');
  5. // main
  6. (async () => {
  7. try {
  8. console.log('start px2rem...');
  9. // init
  10. const browser = await Puppeteer.launch({
  11. headless: true,
  12. timeout: 0,
  13. devtools: false,
  14. executablePath: process.cwd() + '/chrome/chrome.exe'
  15. });
  16. // 打开naive 官网
  17. const page = await browser.newPage();
  18. await page.goto(`https://www.naiveui.com/zh-CN/os-theme/docs/installation`);
  19. await sleep(1000);
  20. await page.click('div.n-element');
  21. const newArr = components.map(el => {
  22. const N = el.indexOf('N');
  23. if (N !== -1) el = el.substring(N + 1);
  24. return el
  25. })
  26. // 需要导出组件配置
  27. await sleep(1000)
  28. const objs = {}
  29. for (let zd = 0; zd < newArr.length; zd++) {
  30. const cname = newArr[zd];
  31. const input = await page.$('.n-popover__content>.n-space>div:nth-child(3) input');
  32. await input.click({ clickCount: 2 }); // 双击清空
  33. await input.type(cname, { delay: 100 });
  34. await page.keyboard.press('Enter');
  35. const keys = await page.$$eval('.n-collapse-item--left-arrow-placement', async (divs, prams) => {
  36. const obj = {}
  37. for (let k = 0; k < divs.length; k++) {
  38. const child = divs[k];
  39. const clickDiv = child.children[0].children[0];
  40. const { unit, cname } = prams;
  41. try {
  42. if (cname === clickDiv.textContent) {
  43. clickDiv.click();
  44. await new Promise((resolve) => { setTimeout(resolve, 1000) });
  45. const list = child.children[1].children[0].children[0].children;
  46. for (let j = 0; j < list.length; j++) {
  47. const es = list[j];
  48. const key = es.children[0].textContent;
  49. const value = es.children[1].children[0].children[0].children[0].getAttribute('placeholder');
  50. if (value && value.includes('px')) {
  51. const arr = value.split(' ');
  52. const newValue = arr.map(el => el.includes('px') ? el = parseInt(el) / unit + 'rem' : el);
  53. obj[key] = newValue.join(' ');
  54. }
  55. }
  56. clickDiv.click();
  57. }
  58. } catch (error) {
  59. continue
  60. }
  61. }
  62. return obj
  63. }, { unit: unit, cname: cname })
  64. if (!Object.keys(keys).length) { console.log(cname + ' - error'); continue };
  65. console.log(cname + ' - done');
  66. objs[cname] = keys;
  67. }
  68. // 输出json 数据
  69. const jsonContent = JSON.stringify(objs);
  70. fs.writeFile(process.cwd() + "/output.json", jsonContent, 'utf8', (err) => {
  71. if (err) return console.log("out data error");
  72. console.log("JSON file has been saved.");
  73. page.close();
  74. browser.close();
  75. process.exit(1);
  76. });
  77. } catch (error) {
  78. console.error(error)
  79. process.exit(1)
  80. }
  81. })()