modularize.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. var fs = require( 'fs' );
  5. var srcFolder = '../examples/js/';
  6. var dstFolder = '../examples/jsm/';
  7. var files = [
  8. { path: 'controls/OrbitControls.js', ignoreList: [] },
  9. { path: 'controls/MapControls.js', ignoreList: [] },
  10. { path: 'controls/TrackballControls.js', ignoreList: [] },
  11. // { path: 'controls/TransformControls.js', ignoreList: [] },
  12. { path: 'exporters/GLTFExporter.js', ignoreList: ['AnimationClip', 'Camera', 'Geometry', 'Material', 'Mesh', 'Object3D', 'RGBFormat', 'Scenes', 'ShaderMaterial', 'VertexColors' ] },
  13. { path: 'exporters/MMDExporter.js', ignoreList: [] },
  14. { path: 'exporters/OBJExporter.js', ignoreList: [] },
  15. { path: 'exporters/PLYExporter.js', ignoreList: [] },
  16. { path: 'exporters/STLExporter.js', ignoreList: [] },
  17. { path: 'exporters/TypedGeometryExporter.js', ignoreList: [] },
  18. { path: 'loaders/GLTFLoader.js', ignoreList: [ 'NoSide', 'Matrix2', 'DDSLoader' ] },
  19. { path: 'loaders/OBJLoader.js', ignoreList: [] },
  20. { path: 'loaders/MTLLoader.js', ignoreList: [] }
  21. ];
  22. for ( var i = 0; i < files.length; i ++ ) {
  23. var file = files[ i ];
  24. convert( file.path, file.ignoreList );
  25. }
  26. //
  27. function convert( path, ignoreList ) {
  28. var contents = fs.readFileSync( srcFolder + path, 'utf8' );
  29. var className = '';
  30. var dependencies = {};
  31. // class name
  32. contents = contents.replace( /THREE\.([a-zA-Z0-9]+) = /g, function ( match, p1 ) {
  33. className = p1;
  34. console.log( className );
  35. return `_IMPORTS_\n\nvar ${p1} = `;
  36. } );
  37. contents = contents.replace( /(\'?)THREE\.([a-zA-Z0-9]+)(\.{0,1})/g, function ( match, p1, p2, p3 ) {
  38. if ( p1 === '\'' ) return match; // Inside a string
  39. if ( p2 === className ) return `${p2}${p3}`;
  40. if ( p1 === 'Math' ) {
  41. dependencies[ '_Math' ] = true;
  42. return '_Math.';
  43. }
  44. return match;
  45. } );
  46. // methods
  47. contents = contents.replace( /new THREE\.([a-zA-Z0-9]+)\(/g, function ( match, p1 ) {
  48. if ( ignoreList.includes( p1 ) ) return match;
  49. dependencies[ p1 ] = true;
  50. return `new ${p1}(`;
  51. } );
  52. // constants
  53. contents = contents.replace( /THREE\.([a-zA-Z0-9]+)/g, function ( match, p1 ) {
  54. if ( ignoreList.includes( p1 ) ) return match;
  55. if ( p1 === className ) return p1;
  56. if ( p1 === 'Math' || p1 === '_Math' ) {
  57. dependencies[ '_Math' ] = true;
  58. return '_Math';
  59. }
  60. dependencies[ p1 ] = true;
  61. // console.log( match, p1 );
  62. return `${p1}`;
  63. } );
  64. //
  65. var keys = Object.keys( dependencies )
  66. .filter( value => value !== className )
  67. .map( value => value === '_Math' ? 'Math as _Math' : value )
  68. .map( value => '\n\t' + value )
  69. .sort()
  70. .toString();
  71. var imports = `import {${keys}\n} from "../../../build/three.module.js";`;
  72. var exports = `export { ${className} };\n`;
  73. var output = contents.replace( '_IMPORTS_', keys ? imports : '' ) + '\n' + exports;
  74. // console.log( output );
  75. fs.writeFileSync( dstFolder + path, output, 'utf-8' );
  76. };