prism.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. var fs = require('fs')
  2. var path = require('path')
  3. var vm = require('vm')
  4. var terser = require('terser')
  5. var csso = require('csso')
  6. var _config = () => {
  7. // load prism languages
  8. var include = (file) => {
  9. var fpath = path.resolve(__dirname, `node_modules/prismjs/${file}.js`)
  10. var source = fs.readFileSync(fpath, 'utf8')
  11. var ctx = vm.createContext()
  12. vm.runInContext(source, ctx)
  13. return ctx
  14. }
  15. var {components: {languages}} = include('components')
  16. delete languages.meta
  17. // update prism languages config
  18. var config = require('./prism.json')
  19. // sort the included ones
  20. config.included = config.included.sort()
  21. // update excluded
  22. config.excluded = Object.keys(languages)
  23. .filter((lang) => !config.included.includes(lang))
  24. .sort()
  25. // update config
  26. fs.writeFileSync(
  27. path.resolve(__dirname, 'prism.json'),
  28. JSON.stringify(config, null, 2),
  29. 'utf8'
  30. )
  31. return config
  32. }
  33. // prism.min.js
  34. var js = async (config) => {
  35. var core = fs.readFileSync(
  36. path.resolve(__dirname, 'node_modules/prismjs/prism.js'), 'utf8'
  37. )
  38. var source =
  39. // core
  40. (await terser.minify(core, {format: {comments: false}})).code +
  41. // components
  42. config.included.reduce((all, key) => (
  43. all += fs.readFileSync(path.resolve(__dirname,
  44. `node_modules/prismjs/components/prism-${key}.min.js`), 'utf8') + '\n',
  45. all
  46. ), '')
  47. fs.writeFileSync(path.resolve(__dirname, 'tmp/prism.min.js'), source, 'utf8')
  48. }
  49. // prism.min.css
  50. var css = () => {
  51. var source = fs.readFileSync(
  52. path.resolve(__dirname, 'node_modules/prismjs/themes/prism.css'),
  53. 'utf8'
  54. )
  55. fs.writeFileSync(
  56. path.resolve(__dirname, 'tmp/prism.min.css'),
  57. csso.minify(source).css
  58. .replace('background:0 0;', '')
  59. .replace('background:#f5f2f0', '')
  60. .replace('border-radius:.3em', '')
  61. .replace('padding:1em;', '')
  62. .replace('margin:.5em 0;', '')
  63. .replace('background:rgba(255,255,255,.5)', ''),
  64. 'utf8'
  65. )
  66. var source = fs.readFileSync(
  67. path.resolve(__dirname, 'node_modules/prismjs/themes/prism-okaidia.css'),
  68. 'utf8'
  69. )
  70. fs.writeFileSync(
  71. path.resolve(__dirname, 'tmp/prism-okaidia.min.css'),
  72. csso.minify(source).css
  73. .replace('background:0 0;', '')
  74. .replace('background:#272822', '')
  75. .replace('border-radius:.3em', '')
  76. .replace('padding:1em;', '')
  77. .replace('margin:.5em 0;', ''),
  78. 'utf8'
  79. )
  80. }
  81. var stats = (config) => {
  82. var included = config.included
  83. .map((name) => ({
  84. name,
  85. size: fs.lstatSync(path.resolve(__dirname,
  86. `node_modules/prismjs/components/prism-${name}.min.js`)).size
  87. }))
  88. var excluded = config.excluded
  89. .map((name) => ({
  90. name,
  91. size: fs.lstatSync(path.resolve(__dirname,
  92. `node_modules/prismjs/components/prism-${name}.min.js`)).size
  93. }))
  94. console.log('Excluded:')
  95. excluded // sorted by name
  96. // .sort((a, b) => b.size - a.size) // sorted by size
  97. .forEach(({name, size}) => console.log(name, '\t\t\t', size))
  98. console.log('Included:', included.length, included.reduce((total, {size}) => total += size, 0))
  99. console.log('Excluded:', excluded.length, excluded.reduce((total, {size}) => total += size, 0))
  100. }
  101. ;(async () => {
  102. var config = _config()
  103. // prism.min.js
  104. await js(config)
  105. // prism.min.css
  106. css()
  107. // print stats
  108. stats(config)
  109. })()