import os import shutil import time import sys import argparse import re import zipfile import opengl import glsl import shared import shared_glsl import subprocess import platform ########################## Command Line Arguments ########################## parser = argparse.ArgumentParser(description="Compile OpenGL documentation, generate a static webpage.") parser.add_argument('--full', dest='buildmode', action='store_const', const='full', default='fast', help='Full build (Default: fast build)') ########################## Print ########################## args = parser.parse_args() if args.buildmode == 'full': print "FULL BUILD" sys.path.append("htmlmin") import htmlmin else: print "FAST BUILD" def create_directory(dir): if not os.path.exists(dir): os.makedirs(dir) ########################## Output Directory Selection ########################## output_dir = "htdocs/" print "Resetting output dir..." while os.path.exists(output_dir): try: shutil.rmtree(output_dir); except: pass # It gives an error sometimes. If it didn't work try again. while not os.path.exists(output_dir): try: create_directory(output_dir) except: pass # It gives an error sometimes. If it didn't work try again. #################### Copy "html/copy" Files To Output Directory #################### f = [] d = [] for (dirpath, dirnames, filenames) in os.walk("html/copy"): dirpath = dirpath[10:] if "test" in dirpath: continue d.append(dirpath) for file in filenames: if file[-3:] != '.js' and file[-4:] != '.css' and file[-4:] != '.png' and file[-5:] != '.html': continue if file == 'Gruntfile.js': continue f.append(dirpath + "/" + file) for directory in d: create_directory(output_dir + directory) for file in f: shutil.copy("html/copy/" + file, output_dir + file) print "Copied " + str(len(f)) + " files" print "Reading templates..." ########################## Select Index.html Template ########################## #Todo: use one index only #the header and index is different for each build index_path = "html/index.html" ################### Open Header, Footer and Search.js template ##################### #Open Header , Footer and Search.js template files header_fp = open("html/header.html") header = header_fp.read() header_fp.close() footer_fp = open("html/footer.html") footer = footer_fp.read() footer_fp.close() search_fp = open("html/docs.gl.search.js") search = search_fp.read() search_fp.close() index_fp = open(index_path) index = index_fp.read() index_fp.close() print "Done." if os.path.exists('html/copy/jquery.min.js'): index = index.replace("{$jquery}", "") else: index = index.replace("{$jquery}", "") if os.path.exists('html/copy/jquery-ui.min.js'): index = index.replace("{$jqueryui}", "") else: index = index.replace("{$jqueryui}", '') ######################## Get Versions for Index.html ########################## #OpenGL index_commands_version = opengl.commands_version_flat.keys() index_commands_version.sort() index_versions_commands = "" #GLSL glsl_index_commands_version = glsl.commands_version_flat.keys() glsl_index_commands_version.sort() glsl_index_versions_commands = "" #OpenGL Loop for command in index_commands_version: major_versions = opengl.get_major_versions_available(command) aliases = {} # Add aliases to this command. Need to do this because ES has glClearDepthf while GL has glClearDepth for alias in opengl.aliased_functions[command]: if alias == command: continue if alias in index_commands_version: for version in opengl.get_major_versions_available(alias): if not version in major_versions: major_versions.append(version) aliases[version] = alias # If the command is an alias we've already done it, skip if command in opengl.function_aliases and command != opengl.function_aliases[command] and opengl.function_aliases[command] in index_commands_version: continue latest_version = '' all_major_versions_available = [] for version in major_versions: if len(latest_version) == 0 or (latest_version[:2] == 'es' and version[:2] == 'gl') or (latest_version[:2] == version[:2] and float(version[2:]) > float(latest_version[2:])): latest_version = version all_major_versions_available.append(version) index_versions_commands += "" + command + "" index_versions_commands += "" index_versions_commands += command for alias in opengl.aliased_functions[command]: if alias == command: continue index_versions_commands += " " + alias index_versions_commands += "" all_major_versions = opengl.get_major_versions(opengl.version_commands_flat.keys()) for version in all_major_versions: if int(version[2:3]) < 2: continue alias = command if version in aliases: alias = aliases[version] if version in all_major_versions_available: index_versions_commands += "" + version + "" else: index_versions_commands += "" + version + "" index_versions_commands += "\n" #GLSL Loop for command in glsl_index_commands_version: major_versions = glsl.get_major_versions_available(command) aliases = {} # Add aliases to this command. Need to do this because ES has glClearDepthf while GL has glClearDepth for alias in glsl.aliased_functions[command]: if alias == command: continue if alias in index_commands_version: for version in glsl.get_major_versions_available(alias): if not version in major_versions: major_versions.append(version) aliases[version] = alias # If the command is an alias we've already done it, skip if command in glsl.function_aliases and command != glsl.function_aliases[command] and glsl.function_aliases[command] in glsl_index_commands_version: continue latest_version = '' all_major_versions_available = [] for version in major_versions: if len(latest_version) == 0 or (latest_version[:2] == 'el' and version[:2] == 'sl') or (latest_version[:2] == version[:2] and float(version[2:]) > float(latest_version[2:])): latest_version = version all_major_versions_available.append(version) glsl_index_versions_commands += "" + command + "" glsl_index_versions_commands += "" glsl_index_versions_commands += command for alias in glsl.aliased_functions[command]: if alias == command: continue glsl_index_versions_commands += " " + alias glsl_index_versions_commands += "" all_major_versions = glsl.get_major_versions(glsl.version_commands_flat.keys()) for version in all_major_versions: if int(version[2:3]) < 3: continue if version == "sl3": continue alias = command if version in aliases: alias = aliases[version] if version in all_major_versions_available: if version[0:2] == "sl": glsl_index_versions_commands += "glsl" + version[2:3] + "" else: glsl_index_versions_commands += "glsl-es" + version[2:3] + "" else: if version[0:2] == "sl": glsl_index_versions_commands += "glsl" + version[2:3] + "" else: glsl_index_versions_commands += "glsl-es" + version[2:3] + "" glsl_index_versions_commands += "\n" index = index.replace("{$commandlist}", index_versions_commands+glsl_index_versions_commands) index_fp = open(output_dir + "/index.html", "w") index_fp.write(index) index_fp.close() ######################## Get Versions for search.js ########################## #OpenGL search_versions_commands = "var search_versions = {" search_function_aliases = {} #GLSL #Append glsl_search_versions_commands to search_versions_commands glsl_search_versions_commands = "" glsl_search_function_aliases = {} #OpenGL Loop for version in opengl.version_commands: if version[0:2] == "gl" and float(version[2:]) < 2.1: continue if version[0:2] == "es" and float(version[2:]) < 2.0: continue search_versions_commands += "'" + version + "':[" if not version[:2] in search_function_aliases: search_function_aliases[version[:2]] = {} included_commands = [] for command in opengl.version_commands[version]: if not command in included_commands: included_commands.append(command) if command != opengl.version_commands[version][command]: search_function_aliases[version[:2]][command] = opengl.version_commands[version][command] for command in opengl.version_commands_flat[version]: if not command in opengl.version_commands[version] and not command in included_commands: included_commands.append(command) included_commands.sort() for command in included_commands: search_versions_commands += "'" + command + "'," search_versions_commands += "]," #GLSL Loop for version in glsl.version_commands: if version[0:2] == "sl" and float(version[2:]) < 4.0: continue if version[0:2] == "el" and float(version[2:]) < 3.0: continue glsl_search_versions_commands += "'" + version + "':[" if not version[:2] in glsl_search_function_aliases: glsl_search_function_aliases[version[:2]] = {} included_commands = [] for command in glsl.version_commands[version]: if not command in included_commands: included_commands.append(command) if command != glsl.version_commands[version][command]: glsl_search_function_aliases[version[:2]][command] = glsl.version_commands[version][command] for command in glsl.version_commands_flat[version]: if not command in glsl.version_commands[version] and not command in included_commands: included_commands.append(command) included_commands.sort() for command in included_commands: glsl_search_versions_commands += "'" + command + "'," glsl_search_versions_commands += "]," #Merge OpenGL & GLSL commands search_versions_commands += glsl_search_versions_commands #All commands for both GLSL and GL search_versions_commands += "'all': [" #OpenGL Loop for command in opengl.commands_version: major_versions = opengl.get_major_versions(opengl.commands_version[command]) for version in major_versions: if int(version[2]) < 2: continue search_versions_commands += "'" + version[:3] + "/" + command + "'," #GLSL Loop for command in glsl.commands_version: major_versions = glsl.get_major_versions(glsl.commands_version[command]) for version in major_versions: if int(version[2]) < 3: continue if version == 'sl3': continue search_versions_commands += "'" + version[:3] + "/" + command + "'," #OpenGL Loop for command in opengl.commands_version_flat: if command in opengl.commands_version: continue major_versions = opengl.get_major_versions(opengl.commands_version_flat[command]) for version in major_versions: if int(version[2]) < 2: continue search_versions_commands += "'" + version[:3] + "/" + command + "'," #GLSL Loop for command in glsl.commands_version_flat: if command in glsl.commands_version: continue major_versions = glsl.get_major_versions(glsl.commands_version_flat[command]) for version in major_versions: if int(version[2]) < 3: continue if version == 'sl3': continue search_versions_commands += "'" + version[:3] + "/" + command + "'," #Close search_versions_commands += "]};" #Start Aliases search_versions_commands += "var function_aliases = {" #OpenGL Aliases for version in search_function_aliases: search_versions_commands += "'" + version + "':{" for alias in search_function_aliases[version]: search_versions_commands += alias + ":'" + search_function_aliases[version][alias] + "'," search_versions_commands += "}," #GLSL Aliases for version in glsl_search_function_aliases: if version == 'sl3': continue glsl_search_versions_commands += "'" + version + "':{" for alias in glsl_search_function_aliases[version]: glsl_search_versions_commands += alias + ":'" + glsl_search_function_aliases[version][alias] + "'," glsl_search_versions_commands += "}," search_versions_commands += glsl_search_versions_commands+ "};" search = search.replace("{$search_versions_commands}", search_versions_commands) search_fp = open(output_dir + "/docs.gl.search.js", "w") search_fp.write(search) search_fp.close() ######################## API Display for Header ########################## search_versions_options = "" #GLSL Loop for version_option in glsl.version_commands.keys(): if version_option[0:2] == "sl" and float(version_option[2:]) < 4.0: continue if version_option[0:2] == "el" and float(version_option[2:]) < 3.0: continue if version_option[:2] == 'sl': search_versions_options += "" elif version_option[:2] == 'el': search_versions_options += "" #OpenGL Loop for version_option in opengl.version_commands.keys(): if version_option[0:2] == "gl" and float(version_option[2:]) < 2.1: continue if version_option[0:2] == "es" and float(version_option[2:]) < 2.0: continue if version_option[:2] == 'gl': search_versions_options += "" elif version_option[:2] == 'es': search_versions_options += "" search_versions_options += "" header = header.replace("{$search_versions}", search_versions_options) unhandled_commands = opengl.commands_version_flat.keys() glsl_unhandled_commands = glsl.commands_version_flat.keys() #Ignore unhandled in glsl #unhandled_commands += glsl_unhandled_commands ######################## Category Function ########################## def spew_category(name, commands, current_command, api): commands.sort() api_commands = "" commands_list = "" category_versions = [] found_current_command = False for command in commands: versions_available ={} if api == "gl": versions_available = opengl.commands_version_flat[command] versions_available.sort() if api == "sl": versions_available = glsl.commands_version_flat[command] versions_available.sort() if command == current_command: found_current_command = True classes = "command" if command == current_command: classes += " current" for v in versions_available: classes += " " + v.replace(".", "") if not v in category_versions: category_versions.append(v) latest_present = versions_available[-1][0:3] commands_list += "
" examples += code examples += "" examples += "
"
tutorials_done = []
tutorial_list={}
if API_type =="gl":
tutorial_list = opengl.tutorial_functions[command]
tutorial_list = sorted(tutorial_list, key=lambda tutorial: opengl.tutorials[tutorial['tutorial']]['name'])
if API_type =="sl":
tutorial_list = glsl.tutorial_functions[command]
tutorial_list = sorted(tutorial_list, key=lambda tutorial: glsl.tutorials[tutorial['tutorial']]['name'])
for tutorial in tutorial_list:
if not version[:3] in tutorial['versions']:
continue
if tutorial['tutorial'] in examples_done:
continue
examples_done.append(tutorial['tutorial'])
if API_type =="gl":
tutorials += '' + opengl.tutorials[tutorial['tutorial']]['name'] + "
"
if API_type =="sl":
tutorials += '' + glsl.tutorials[tutorial['tutorial']]['name'] + "
"
tutorials += "