import os import sys import shutil import zipfile import json from lib import tools_lib as Tools def PrintInfo (message): print ('INFO: ' + message) def PrintError (message): print ('ERROR: ' + message) def GetVersion (rootDir): packageJson = None with open (os.path.join (rootDir, 'package.json')) as packageJsonFile: packageJson = json.load (packageJsonFile) return packageJson['version'] def ESLintFolder (folder): result = Tools.RunCommand ('eslint', [folder]) if result != 0: return False return True def CompressFiles (inputFiles, outputFile): parameters = [] for inputFile in inputFiles: extension = os.path.splitext (inputFile)[1] if extension == '.js': parameters.append ('--js=' + os.path.join ('..', inputFile)) parameters.append ('--js_output_file=' + outputFile) result = Tools.RunCommand ('google-closure-compiler', parameters) if result != 0: return False return True def CreateDestinationDir (config, rootDir, websiteDir, version, testBuild): if not os.path.exists (websiteDir): os.makedirs (websiteDir) webSourcesDir = os.path.join (websiteDir, 'o3dv') if not os.path.exists (webSourcesDir): os.makedirs (webSourcesDir) shutil.copy2 (os.path.join (rootDir, 'website', 'index.html'), websiteDir) shutil.copy2 (os.path.join (rootDir, 'website', 'embed.html'), websiteDir) shutil.copy2 (os.path.join (rootDir, 'website', 'robots.txt'), websiteDir) shutil.copy2 (os.path.join (rootDir, 'website', 'o3dv', 'website.css'), os.path.join (webSourcesDir, 'o3dv.website.css')) shutil.copytree (os.path.join (rootDir, 'libs'), os.path.join (websiteDir, 'libs')) shutil.copytree (os.path.join (rootDir, 'website', 'assets'), os.path.join (websiteDir, 'assets')) shutil.copytree (os.path.join (rootDir, 'website', 'info'), os.path.join (websiteDir, 'info')) libFiles = config['lib_files'] importerFiles = ['o3dv/o3dv.min.js'] websiteFiles = [ 'o3dv/o3dv.website.css', 'o3dv/o3dv.website.min.js' ] htmlFileNames = [ 'index.html', 'embed.html', os.path.join ('info', 'index.html'), os.path.join ('info', 'cookies.html') ] for htmlFileName in htmlFileNames: htmlFilePath = os.path.join (websiteDir, htmlFileName) replacer = Tools.TokenReplacer (htmlFilePath, False) replacer.ReplaceTokenFileLinks ('', '', libFiles, None) replacer.ReplaceTokenFileLinks ('', '', importerFiles, version) replacer.ReplaceTokenFileLinks ('', '', websiteFiles, version) externalScriptContent = '' externalScriptContent += '' replacer.ReplaceTokenContent ('', '', externalScriptContent) metaFile = os.path.join (rootDir, 'tools', 'website_meta_data.txt') if os.path.exists (metaFile): metaContent = Tools.GetFileContent (metaFile) replacer.ReplaceTokenContent ('', '', metaContent) analyticsFile = os.path.join (rootDir, 'tools', 'website_analytics_data.txt') if os.path.exists (analyticsFile) and not testBuild: analyticsContent = Tools.GetFileContent (analyticsFile) replacer.ReplaceTokenContent ('', '', analyticsContent) scriptFile = os.path.join (rootDir, 'tools', 'website_script_data.txt') if os.path.exists (scriptFile): scriptContent = Tools.GetFileContent (scriptFile) replacer.ReplaceTokenContent ('', '', scriptContent) replacer.WriteToFile (htmlFilePath) def CreatePackage (rootDir, websiteDir, packageDir, version): if not os.path.exists (packageDir): os.makedirs (packageDir) libs = [ 'three.min-129.js', 'three.license.md' ] externalLibs = [ 'draco_decoder.js', 'draco_decoder.wasm', 'draco.license.md', 'rhino3dm.min.js', 'rhino3dm.wasm', 'rhino3dm.license.md' ] zipPath = os.path.join (packageDir, 'o3dv_' + version + '.zip') zip = zipfile.ZipFile (zipPath, mode = 'w', compression = zipfile.ZIP_DEFLATED) for lib in libs: zip.write (os.path.join (websiteDir, 'libs', lib), lib) for lib in externalLibs: zip.write (os.path.join (websiteDir, 'libs', lib), 'libs/' + lib) zip.write (os.path.join (websiteDir, 'o3dv', 'o3dv.min.js'), 'o3dv.min-' + version + '.js') zip.write (os.path.join (rootDir, 'LICENSE.md'), 'o3dv.license.md') zip.close () return True def Main (argv): currentDir = os.path.dirname (os.path.abspath (__file__)) os.chdir (currentDir) rootDir = os.path.abspath ('..') testBuild = False buildDir = os.path.join (rootDir, 'build', 'final') if len (argv) >= 2 and argv[1] == 'test': testBuild = True buildDir = os.path.join (rootDir, 'build', 'test') PrintInfo ('Creating test build.') websiteDir = os.path.join (buildDir, 'website') packageDir = os.path.join (buildDir, 'package') if os.path.exists (buildDir): shutil.rmtree (buildDir) config = None with open ('config.json') as configJson: config = json.load (configJson) PrintInfo ('ESLint importer sources.') esLintResult = ESLintFolder (os.path.join (rootDir, 'source')) if not esLintResult: PrintError ('ESLint importer sources failed.') return 1 PrintInfo ('ESLint website sources.') esLintResult = ESLintFolder (os.path.join (rootDir, 'website', 'o3dv')) if not esLintResult: PrintError ('ESLint website sources failed.') return 1 version = GetVersion (rootDir) PrintInfo ('Create build directory') CreateDestinationDir (config, rootDir, websiteDir, version, testBuild) PrintInfo ('Compress importer sources.') compressResult = CompressFiles (config['engine_files'], os.path.join (websiteDir, 'o3dv', 'o3dv.min.js')) if not compressResult: PrintError ('Compress importer sources failed.') return 1 PrintInfo ('Compress website sources.') compressResult = CompressFiles (config['website_files'], os.path.join (websiteDir, 'o3dv', 'o3dv.website.min.js')) if not compressResult: PrintError ('Compress website sources failed.') return 1 PrintInfo ('Create package.') packageResult = CreatePackage (rootDir, websiteDir, packageDir, version) if not packageResult: PrintError ('Create package failed.') return 1 return 0 sys.exit (Main (sys.argv))