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 CompressCssFiles (inputFiles, outputFile): parameters = ['-o', outputFile] for inputFile in inputFiles: extension = os.path.splitext (inputFile)[1] if extension == '.css': parameters.append (inputFile) result = Tools.RunCommand ('cleancss', parameters) if result != 0: return False return True def CompressJavascriptFiles (inputFiles, outputFile): parameters = [] for inputFile in inputFiles: extension = os.path.splitext (inputFile)[1] if extension == '.js': parameters.append ('--js=' + 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.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', 'o3dv', 'css', 'Quicksand'), os.path.join (websiteDir, 'o3dv', 'Quicksand')) shutil.copytree (os.path.join (rootDir, 'website', 'o3dv', 'css', 'O3DVIcons'), os.path.join (websiteDir, 'o3dv', 'O3DVIcons')) shutil.copytree (os.path.join (rootDir, 'website', 'info'), os.path.join (websiteDir, 'info')) websiteLibFiles = config['website_lib_files'] embedLibFiles = config['embed_lib_files'] importerFiles = ['o3dv/o3dv.min.js'] websiteFiles = [ 'o3dv/o3dv.website.min.css', 'o3dv/o3dv.website.min.js' ] htmlFileNames = [ 'index.html', 'embed.html', os.path.join ('info', 'index.html'), os.path.join ('info', 'cookies.html'), os.path.join ('info', 'faq.html') ] for htmlFileName in htmlFileNames: htmlFilePath = os.path.join (websiteDir, htmlFileName) replacer = Tools.TokenReplacer (htmlFilePath, False) replacer.ReplaceTokenFileLinks ('', '', websiteLibFiles, version) replacer.ReplaceTokenFileLinks ('', '', embedLibFiles, version) 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) zipPath = os.path.join (packageDir, 'o3dv_' + version + '.zip') zip = zipfile.ZipFile (zipPath, mode = 'w', compression = zipfile.ZIP_DEFLATED) for lib in os.listdir (os.path.join (websiteDir, 'libs', 'loaders')): zip.write (os.path.join (websiteDir, 'libs', 'loaders', lib), 'libs/loaders/' + lib) for lib in os.listdir (os.path.join (websiteDir, 'libs', 'three_loaders')): zip.write (os.path.join (websiteDir, 'libs', 'three_loaders', lib), 'libs/three_loaders/' + lib) zip.write (os.path.join (websiteDir, 'libs', 'three.min.js'), 'three.min.js') zip.write (os.path.join (websiteDir, 'libs', 'three.license.md'), 'three.license.md') zip.write (os.path.join (websiteDir, 'o3dv', 'o3dv.min.js'), 'o3dv.min.js') zip.write (os.path.join (rootDir, 'LICENSE.md'), 'o3dv.license.md') zip.close () return True def Main (argv): toolsDir = os.path.dirname (os.path.abspath (__file__)) rootDir = os.path.dirname (toolsDir) os.chdir (rootDir) 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 (os.path.join (toolsDir, 'config.json')) as configJson: config = json.load (configJson) version = GetVersion (rootDir) PrintInfo ('Create build directory') CreateDestinationDir (config, rootDir, websiteDir, version, testBuild) PrintInfo ('Compress importer sources.') compressResult = CompressJavascriptFiles (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 = CompressJavascriptFiles (config['website_files_js'], os.path.join (websiteDir, 'o3dv', 'o3dv.website.min.js')) if not compressResult: PrintError ('Compress website sources failed.') return 1 PrintInfo ('Compress website css sources.') compressResult = CompressCssFiles (config['website_files_css'], os.path.join (websiteDir, 'o3dv', 'o3dv.website.min.css')) if not compressResult: PrintError ('Compress website css 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))