index.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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) continue
  65. objs[cname] = keys;
  66. }
  67. // 输出json 数据
  68. const jsonContent = JSON.stringify(objs);
  69. fs.writeFile(process.cwd() + "/output.json", jsonContent, 'utf8', (err) => {
  70. if (err) return console.log("out data error");
  71. console.log("JSON file has been saved.");
  72. page.close()
  73. browser.close()
  74. process.exit(1)
  75. });
  76. } catch (error) {
  77. console.error(error)
  78. process.exit(1)
  79. }
  80. })()