Просмотр исходного кода

Lua html doc generation from xml, generate lua docs automatically on install, copy lua docs into Lua Standalone, IDE menu option for documentation opens bundled html

Ivan Safrin 13 лет назад
Родитель
Сommit
244d7d6716

+ 5 - 0
.gitignore

@@ -107,3 +107,8 @@ Player/Build/Mac OS X/Polycode Player.xcodeproj/project.xcworkspace/xcuserdata/i
 Player/Build/Mac OS X/Polycode Player.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate
 
 /Documentation/Lua/xml/*.xml
+
+/Documentation/Lua/html/*
+!/Documentation/Lua/html/css
+!/Documentation/Lua/html/images
+!/Documentation/Lua/html/js

+ 1 - 1
Bindings/Contents/LUA/CMakeLists.txt

@@ -29,7 +29,7 @@ ADD_LIBRARY(PolycodeLua ${polycodeLua_SRCS} ${polycodeLua_HDRS})
 SET_SOURCE_FILES_PROPERTIES(Source/PolycodeLUA.cpp PROPERTIES GENERATED 1) 
 SET_SOURCE_FILES_PROPERTIES(Include/PolycodeLUAWrappers.h PROPERTIES GENERATED 1)
 SET_SOURCE_FILES_PROPERTIES(Include/PolycodeLUA.h PROPERTIES GENERATED 1) 
-ADD_DEPENDENCIES(PolycodeLua PolycodeLuaGenerate)
+ADD_DEPENDENCIES(PolycodeLua PolycodeLuaGenerate PolycodeLuaGenerateDocs)
 #ENDIF(POLYCODE_BUILD_STATIC)
 
 IF(POLYCODE_INSTALL_FRAMEWORK)

+ 22 - 6
Bindings/Scripts/create_lua_library/create_lua_library.py

@@ -37,7 +37,10 @@ def template_quote(str):
 	return "\"%s\"" % str;
 
 def cleanDocs(docs):
-	return docs.replace("/*", "").replace("*/", "").replace("*", "").replace("\n", "")
+	return docs.replace("/*", "").replace("*/", "").replace("*", "").replace("\n", "").replace("\r", "").replace("::", ".")
+
+def toLuaType(t):
+	return t.replace("void", "nil").replace("int", "Integer").replace("bool", "Boolean")
 
 # FIXME: Some "unsigned int *" functions are still being generated on the polycode API?
 def typeFilter(ty):
@@ -45,6 +48,8 @@ def typeFilter(ty):
 	ty = ty.replace("std::", "")
 	ty = ty.replace("const", "")
 	ty = ty.replace("inline", "")
+	ty = ty.replace("static", "")
+	ty = ty.replace("virtual", "")
 	ty = ty.replace("&", "")
 	ty = re.sub(r'^.*\sint\s*$', 'int', ty) # eg "unsigned int"
 	ty = re.sub(r'^.*\slong\s*$', 'int', ty)
@@ -87,6 +92,7 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 
 	luaDocOut += "<?xml version=\"1.0\" ?>\n"
 	luaDocOut += "<docs>\n"
+	luaDocOut += "<classes>\n"
 
 
 	# Get list of headers to create bindings from
@@ -103,7 +109,7 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 		if inputPathIsDir:
 			fileName = "%s/%s" % (inputPath, fileName)
 		head, tail = os.path.split(fileName)
-		ignore = ["PolyGLSLProgram", "PolyGLSLShader", "PolyGLSLShaderModule", "PolyWinCore", "PolyCocoaCore", "PolyAGLCore", "PolySDLCore", "Poly_iPhone", "PolyGLES1Renderer", "PolyGLRenderer", "tinyxml", "tinystr", "OpenGLCubemap", "PolyiPhoneCore", "PolyGLES1Texture", "PolyGLTexture", "PolyGLVertexBuffer", "PolyThreaded", "PolyGLHeaders", "GLee", "PolyPeer", "PolySocket", "PolyClient", "PolyServer", "PolyServerWorld"]
+		ignore = ["PolyGLSLProgram", "PolyGLSLShader", "PolyGLSLShaderModule", "PolyWinCore", "PolyCocoaCore", "PolyAGLCore", "PolySDLCore", "Poly_iPhone", "PolyGLES1Renderer", "PolyGLRenderer", "tinyxml", "tinystr", "OpenGLCubemap", "PolyiPhoneCore", "PolyGLES1Texture", "PolyGLTexture", "PolyGLVertexBuffer", "PolyThreaded", "PolyGLHeaders", "GLee", "PolyPeer", "PolySocket", "PolyClient", "PolyServer", "PolyServerWorld", "OSFILE", "OSFileEntry", "OSBasics", "PolyLogger"]
 		if tail.split(".")[1] == "h" and tail.split(".")[0] not in ignore:
 			filteredFiles.append(fileName)
 			wrappersHeaderOut += "#include \"%s\"\n" % (tail)
@@ -249,7 +255,7 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 							luaClassBindingOut += template_returnPtrLookup("\t\t", template_quote(pp["type"]), "retVal")
 
 						
-						luaDocOut += "\t\t\t<member name=\"%s\" type=\"%s\">\n" % (pp["name"],  typeFilter(pp["type"]))
+						luaDocOut += "\t\t\t<member name=\"%s\" type=\"%s\">\n" % (pp["name"],  toLuaType(typeFilter(pp["type"])))
 						if 'doxygen' in pp:
 							luaDocOut += "\t\t\t\t<desc><![CDATA[%s]]></desc>\n" % (cleanDocs(pp['doxygen']))
 						
@@ -364,7 +370,12 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 					if pm["name"] == "~"+ckey:
 						continue
 					
-					luaDocOut += "\t\t\t<method name=\"%s\" return_type=\"%s\">\n" % (pm["name"],  typeFilter(pm["rtnType"].replace("*", "")))
+					if pm["rtnType"].find("std : : vector") > -1:
+						vectorReturnClass = pm["rtnType"].replace("std : : vector <", "").replace(">","").replace(" ", "")
+						luaDocOut += "\t\t\t<method name=\"%s\" return_array=\"true\" return_type=\"%s\">\n" % (pm["name"],  toLuaType(typeFilter(vectorReturnClass).replace("*", "")))
+					else:
+						luaDocOut += "\t\t\t<method name=\"%s\" return_type=\"%s\">\n" % (pm["name"],  toLuaType(typeFilter(pm["rtnType"].replace("*", ""))))
+
 					docs = None
 					if 'doxygen' in pm:
 						docs = cleanDocs(pm['doxygen']).split("@return")[0].split("@param")
@@ -380,12 +391,16 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 									continue
 								if param["type"] == "0":
 									continue
-								luaDocOut += "\t\t\t\t\t<param name=\"%s\" type=\"%s\">\n" % (param["name"], typeFilter(param["type"]).replace("*",""))
+								if param["type"].find("vector<") != -1:
+									vectorClass = param["type"].replace("std::vector<", "").replace(">","").replace(" ", "")
+									luaDocOut += "\t\t\t\t\t<param name=\"%s\" param_array=\"true\" type=\"%s\">\n" % (param["name"], toLuaType(vectorClass.replace("*","")))
+								else:
+									luaDocOut += "\t\t\t\t\t<param name=\"%s\" type=\"%s\">\n" % (param["name"], toLuaType(typeFilter(param["type"]).replace("*","")))
 								if docs != None:
 									if len(docs) > paramIndex+1:
 										cdoc = docs[paramIndex+1].split()
 										cdoc.pop(0)
-										luaDocOut += "\t\t\t\t\t\t<desc><![CDATA[%s]]></desc>\n" % (" ".join(cdoc))
+										luaDocOut += "\t\t\t\t\t\t<desc><![CDATA[%s]]></desc>\n" % (" ".join(cdoc).replace("\n", ""))
 								luaDocOut += "\t\t\t\t\t</param>\n"
 								paramIndex = paramIndex + 1
 						luaDocOut += "\t\t\t\t</params>\n"
@@ -700,6 +715,7 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 			print e
 			sys.exit(1)
 
+	luaDocOut += "</classes>\n"
 	luaDocOut += "</docs>\n"
 
 	# Footer boilerplate for wrappersHeaderOut and cppRegisterOut.

+ 1 - 0
CMakeLists.txt

@@ -91,6 +91,7 @@ ADD_SUBDIRECTORY("Assets/Templates")
 ADD_SUBDIRECTORY("Documentation")
 
 IF(POLYCODE_BUILD_BINDINGS)
+    ADD_SUBDIRECTORY(Documentation/Lua/scripts)
     ADD_SUBDIRECTORY(Bindings)
 ENDIF(POLYCODE_BUILD_BINDINGS)
 

+ 137 - 0
Documentation/Lua/html/css/docs.css

@@ -0,0 +1,137 @@
+
+body, html {
+	background-color: #222222;
+	color: white;
+	font-family: Helvetica, Arial, sans;
+	margin: 0px;
+	padding: 0px;
+	font-size: 14px;
+}
+
+a {
+	color: white;
+}
+
+#global_header {
+	width: 100%;
+	height: 64px;
+	background: black url('../images/docs_header.png') no-repeat left top;
+	margin: 0px 0px 0px 0px;
+}
+
+#module_links, #class_list {
+	float: left;
+	width: 160px;
+	padding: 30px;
+	background: #141414;
+	margin: 0px 0px 0px 0px;
+}
+
+#class_list a {
+	color: #757575;
+	text-decoration: none;
+}
+
+.module_link {
+	margin: 20px 0px 0px 0px;
+	font-size: 24px;
+}
+
+.class_entry {
+	font-size: 14px;
+	margin: 3px 0px 0px 0px;
+}
+
+.class_main {
+	margin: 0px 0px 0px 220px;
+	padding: 20px;
+}
+
+.class_name {
+	font-size: 32px;
+	margin: 0px 0px 30px 0px;
+}
+
+.class_desc {
+	font-size: 18px;
+	color: #545454;
+	margin: 0px 0px 20px 0px;
+}
+
+.class_properies_list, .class_methods_list {
+	padding: 10px;
+	background-color: #1a1a1a;
+}
+
+.class_property, .class_method {
+	padding: 5px;
+	margin: 0px 0px 10px 0px;
+}
+
+.class_properies_title, .class_methods_title {
+	margin: 10px 0px 10px 0px;
+	color: #363636;
+	font-size: 24px;
+}
+
+.class_property_name {
+	color: #70bd38;
+}
+
+.class_property_type {
+	color: #925381;
+}
+
+.class_property_desc {
+	color: #545454;
+}
+
+.class_method_name {
+	color: #4e87c8;
+	font-size: 16px;
+}
+
+.class_method_type {
+	color: #925381;
+	font-size: 12px;
+}
+
+.class_method_desc {
+	color: #545454;
+}
+
+.class_method_params {
+	padding: 10px;
+}
+
+.class_method_param {
+	padding: 0px 0px 5px 10px;
+}
+
+.class_method_param_name {
+	color: #70bd38;
+}
+
+.class_method_param_type {
+	color: #925381;
+	font-size: 12px;
+}
+
+.class_method_param_desc {
+	color: #545454;
+}
+
+.class_method_params_title {
+	margin: 0px 0px 10px 0px;
+	color: #363636;
+	font-size: 16px;
+}
+
+.inline_param {
+	color: #70bd38;
+}
+
+.inline_type {
+	color: #925381;
+	font-size: 12px;
+}

BIN
Documentation/Lua/html/images/docs_header.png


+ 0 - 0
Documentation/Lua/html/js/docs.js


+ 15 - 0
Documentation/Lua/scripts/CMakeLists.txt

@@ -0,0 +1,15 @@
+INCLUDE(FindPythonModule)
+
+FIND_PACKAGE(PythonInterp REQUIRED)
+
+ADD_CUSTOM_COMMAND(
+OUTPUT luaGenerateDocsCmd
+COMMAND ${PYTHON_EXECUTABLE} make_html.py
+WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+)
+
+ADD_CUSTOM_TARGET(PolycodeLuaGenerateDocs
+	DEPENDS Polycore PolycodeLuaGenerate luaGenerateDocsCmd
+	COMMENT "Generating Lua Documentation"
+	SOURCES make_html.py)
+

+ 156 - 0
Documentation/Lua/scripts/make_html.py

@@ -0,0 +1,156 @@
+import os
+from xml.dom.minidom import parse
+
+globalHeaderMain = ""
+
+globalHeaderMain += "<html>\n"
+globalHeaderMain += "\t<head>\n"
+globalHeaderMain += "\t\t<title>Polycode Documentation</title>\n"
+globalHeaderMain += "\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"css/docs.css\" />\n"
+globalHeaderMain += "\t\t<script type=\"text/javascript\" src=\"js/docs.js\"></script>"
+globalHeaderMain += "\t</head>\n"
+globalHeaderMain += "\t<body>\n"
+globalHeaderMain += "\t\t<div id=\"global_header\"></div>\n"
+globalHeaderMain += "\t\t<div id=\"content\">\n"
+
+globalHeader = ""
+globalFooter = ""
+
+globalHeader += "<html>\n"
+globalHeader += "\t<head>\n"
+globalHeader += "\t\t<title>Polycode Documentation</title>\n"
+globalHeader += "\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../css/docs.css\" />\n"
+globalHeader += "\t\t<script type=\"text/javascript\" src=\"js/docs.js\"></script>"
+globalHeader += "\t</head>\n"
+globalHeader += "\t<body>\n"
+globalHeader += "\t\t<div id=\"global_header\"></div>\n"
+globalHeader += "\t\t<div id=\"content\">\n"
+
+
+globalFooter += "\t\t</div>\n"
+globalFooter += "\t</body>\n"
+globalFooter += "\t</html>\n"
+
+def makePage(item, classList):
+	html = globalHeader
+	html += classList
+
+	html += "\t\t\t\t<div class=\"class_main\">\n"
+	
+	html += "\t\t\t\t\t<div class=\"class_name\">%s</div>\n" % (item.attributes["name"].value)
+	desc = item.getElementsByTagName('desc')
+	descText = "No description."
+	if len(desc) > 0:
+		descText = desc[0].childNodes[0].data
+	html += "\t\t\t\t\t<div class=\"class_desc\">%s</div>\n" % descText
+
+	html += "\t\t\t\t\t<div class=\"class_properies\">\n"
+	html += "\t\t\t\t\t\t<div class=\"class_properies_title\">Properties</div>\n"
+	html += "\t\t\t\t\t\t<div class=\"class_properies_list\">\n"
+	for subitem in item.getElementsByTagName('member'):
+		html += "\t\t\t\t\t\t\t<div class=\"class_property\">\n"
+		html += "\t\t\t\t\t\t\t\t<div class=\"class_property_name\">%s</div>\n" % (subitem.attributes["name"].value)
+		html += "\t\t\t\t\t\t\t\t<div class=\"class_property_type\">%s</div>\n" % (subitem.attributes["type"].value)
+		desc = subitem.getElementsByTagName('desc')
+		descText = "No description."
+		if len(desc) > 0:
+			descText = desc[0].childNodes[0].data
+		html += "\t\t\t\t\t\t\t\t<div class=\"class_property_desc\">%s</div>\n" % (descText)
+		html += "\t\t\t\t\t\t\t</div>\n"
+	html += "\t\t\t\t\t\t</div>\n"
+	html += "\t\t\t\t\t</div>\n"
+
+	html += "\t\t\t\t\t<div class=\"class_methods\">\n"
+	html += "\t\t\t\t\t\t<div class=\"class_methods_title\">Functions</div>\n"
+	html += "\t\t\t\t\t\t<div class=\"class_methods_list\">\n"
+	for subitem in item.getElementsByTagName('method'):
+		html += "\t\t\t\t\t\t\t<div class=\"class_method\">\n"
+		paramList = ""
+		paramIndex = 0
+		if len(subitem.getElementsByTagName('param')) > 0:
+			for param in subitem.getElementsByTagName('param'):
+				if paramIndex != 0:
+					paramList += ", "
+				paramList += " <span class=\"inline_type\">%s</span> <span class=\"inline_param\">%s</span> " % (param.attributes["type"].value, param.attributes["name"].value)
+				paramIndex = paramIndex + 1
+		html += "\t\t\t\t\t\t\t\t<div class=\"class_method_name\">%s (%s) </div>\n" % (subitem.attributes["name"].value, paramList)
+
+		html += "\t\t\t\t\t\t\t\t<div class=\"class_method_type\">%s</div>\n" % (subitem.attributes["return_type"].value)
+		desc = subitem.getElementsByTagName('desc')
+		descText = "No description."
+		if len(desc) > 0:
+			descText = desc[0].childNodes[0].data
+		html += "\t\t\t\t\t\t\t\t<div class=\"class_method_desc\">%s</div>\n" % (descText)
+		
+		if len(subitem.getElementsByTagName('param')) > 0:
+			html += "\t\t\t\t\t\t\t\t<div class=\"class_method_params\">\n"
+			html += "\t\t\t\t\t\t\t\t<div class=\"class_method_params_title\">Parameters</div>\n"
+			for param in subitem.getElementsByTagName('param'):
+				html += "\t\t\t\t\t\t\t\t<div class=\"class_method_param\">\n"
+				html += "\t\t\t\t\t\t\t\t\t<div class=\"class_method_param_name\">%s</div>\n" % (param.attributes["name"].value)
+				html += "\t\t\t\t\t\t\t\t\t<div class=\"class_method_param_type\">%s</div>\n" % (param.attributes["type"].value)
+				desc = subitem.getElementsByTagName('desc')
+				descText = "No description."
+				if len(desc) > 0:
+					descText = desc[0].childNodes[0].data
+				html += "\t\t\t\t\t\t\t\t\t<div class=\"class_method_param_desc\">%s</div>\n" % (descText)
+				html += "\t\t\t\t\t\t\t\t</div>\n"
+
+			html += "\t\t\t\t\t\t\t\t</div>\n"
+		html += "\t\t\t\t\t\t\t</div>\n"
+
+	html += "\t\t\t\t\t\t</div>\n"
+	html += "\t\t\t\t\t</div>\n"
+
+	html += "\t\t\t\t</div>\n"
+	return html
+
+def makeHTML(fileName, moduleName):
+	print ("Parsing %s\n" % fileName)
+
+	sourceXML = open(fileName)
+	dom = parse(sourceXML)
+	sourceXML.close()
+
+	classList = ""
+	classList += "\t\t\t<div id=\"class_list\">\n"
+	for item in dom.documentElement.getElementsByTagName('class'):
+		classList += "\t\t\t\t<div class=\"class_entry\"><a href=\"%s.html\">%s</a></div>\n" % (item.attributes["name"].value, item.attributes["name"].value)
+	classList += "\t\t\t</div>\n"
+	classList += "\n"
+
+	directory = "../html/%s" % (moduleName)
+	if not os.path.exists(directory):
+		os.makedirs(directory)	
+
+	html = globalHeader
+	html += classList
+	html += globalFooter
+	f = open("../html/%s/index.html" % (moduleName), 'w')
+	f.write(html)
+	f.close()
+
+	for item in dom.documentElement.getElementsByTagName('class'):
+		f = open("../html/%s/%s.html" % (moduleName, item.attributes["name"].value), 'w')
+		html = makePage(item, classList)
+		f.write(html)
+		f.close()
+
+dirList = os.listdir("../xml")
+
+indexhtml = globalHeaderMain
+indexhtml += "\t<div id=\"module_links\">\n"
+
+for fname in dirList:
+	if len(fname.split(".")) > 1:
+		if fname.split(".")[1] == "xml":
+			moduleName = fname.split(".")[0]
+			makeHTML("../xml/%s" % (fname), moduleName)
+			indexhtml += "\t\t\t<div class=\"module_link\"><a href=\"%s/index.html\">%s</a></div>\n" % (moduleName, moduleName)
+
+indexhtml += "\t</div>\n"
+
+f = open("../html/index.html", 'w')
+f.write(indexhtml)
+f.close()
+indexhtml += globalFooter

+ 188 - 11
IDE/Build/Mac OS X/English.lproj/MainMenu.xib

@@ -641,7 +641,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="105068016">
 									<reference key="NSMenu" ref="992780483"/>
-									<string key="NSTitle">Polycode Help</string>
+									<string key="NSTitle">Polycode API Reference</string>
 									<string key="NSKeyEquiv">?</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -676,6 +676,7 @@
 							<object class="NSPSMatrix" key="NSDrawMatrix"/>
 							<string key="NSFrameSize">{800, 600}</string>
 							<reference key="NSSuperview" ref="439893737"/>
+							<reference key="NSWindow"/>
 							<object class="NSOpenGLPixelFormat" key="NSPixelFormat">
 								<object class="NSMutableData" key="NSPixelAttributes">
 									<bytes key="NS.bytes">AAAAYAAAAAA</bytes>
@@ -685,6 +686,7 @@
 					</object>
 					<string key="NSFrameSize">{800, 600}</string>
 					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
 					<reference key="NSNextKeyView" ref="633009941"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
@@ -945,14 +947,6 @@
 					</object>
 					<int key="connectionID">489</int>
 				</object>
-				<object class="IBConnectionRecord">
-					<object class="IBActionConnection" key="connection">
-						<string key="label">showHelp:</string>
-						<reference key="source" ref="1014"/>
-						<reference key="destination" ref="105068016"/>
-					</object>
-					<int key="connectionID">493</int>
-				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBOutletConnection" key="connection">
 						<string key="label">window</string>
@@ -1129,6 +1123,14 @@
 					</object>
 					<int key="connectionID">591</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBActionConnection" key="connection">
+						<string key="label">openDocs:</string>
+						<reference key="source" ref="976324537"/>
+						<reference key="destination" ref="105068016"/>
+					</object>
+					<int key="connectionID">592</int>
+				</object>
 			</object>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<object class="NSArray" key="orderedObjects">
@@ -1894,9 +1896,184 @@
 				<reference key="dict.values" ref="0"/>
 			</object>
 			<nil key="sourceID"/>
-			<int key="maxID">591</int>
+			<int key="maxID">592</int>
+		</object>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<bool key="EncodedWithXMLCoder">YES</bool>
+				<object class="IBPartialClassDescription">
+					<string key="className">PolycodeAppDelegate</string>
+					<string key="superclassName">NSObject</string>
+					<object class="NSMutableDictionary" key="actions">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>browseExamples:</string>
+							<string>closeProject:</string>
+							<string>exportProject:</string>
+							<string>findText:</string>
+							<string>newFile:</string>
+							<string>newGroup:</string>
+							<string>newProject:</string>
+							<string>openDocs:</string>
+							<string>openProject:</string>
+							<string>refreshProject:</string>
+							<string>removeFile:</string>
+							<string>renameFile:</string>
+							<string>runProject:</string>
+							<string>saveFile:</string>
+						</object>
+						<object class="NSArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+						</object>
+					</object>
+					<object class="NSMutableDictionary" key="actionInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>browseExamples:</string>
+							<string>closeProject:</string>
+							<string>exportProject:</string>
+							<string>findText:</string>
+							<string>newFile:</string>
+							<string>newGroup:</string>
+							<string>newProject:</string>
+							<string>openDocs:</string>
+							<string>openProject:</string>
+							<string>refreshProject:</string>
+							<string>removeFile:</string>
+							<string>renameFile:</string>
+							<string>runProject:</string>
+							<string>saveFile:</string>
+						</object>
+						<object class="NSArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBActionInfo">
+								<string key="name">browseExamples:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">closeProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">exportProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">findText:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">newFile:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">newGroup:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">newProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">openDocs:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">openProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">refreshProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">removeFile:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">renameFile:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">runProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveFile:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+						</object>
+					</object>
+					<object class="NSMutableDictionary" key="outlets">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>polycodeView</string>
+							<string>projectMenu</string>
+							<string>window</string>
+						</object>
+						<object class="NSArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>PolycodeView</string>
+							<string>NSMenu</string>
+							<string>NSWindow</string>
+						</object>
+					</object>
+					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>polycodeView</string>
+							<string>projectMenu</string>
+							<string>window</string>
+						</object>
+						<object class="NSArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBToOneOutletInfo">
+								<string key="name">polycodeView</string>
+								<string key="candidateClassName">PolycodeView</string>
+							</object>
+							<object class="IBToOneOutletInfo">
+								<string key="name">projectMenu</string>
+								<string key="candidateClassName">NSMenu</string>
+							</object>
+							<object class="IBToOneOutletInfo">
+								<string key="name">window</string>
+								<string key="candidateClassName">NSWindow</string>
+							</object>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/PolycodeAppDelegate.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">PolycodeView</string>
+					<string key="superclassName">NSOpenGLView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/PolycodeView.h</string>
+					</object>
+				</object>
+			</object>
 		</object>
-		<object class="IBClassDescriber" key="IBDocument.Classes"/>
 		<int key="IBDocument.localizationMode">0</int>
 		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">

+ 1 - 1
IDE/Build/Mac OS X/PolycodeAppDelegate.h

@@ -66,5 +66,5 @@ public:
 -(IBAction) openProject: (id) sender;
 -(IBAction) saveFile: (id) sender;
 -(IBAction) findText: (id) sender;
-
+-(IBAction) openDocs: (id) sender;
 @end

+ 3 - 0
IDE/Build/Mac OS X/PolycodeAppDelegate.m

@@ -146,5 +146,8 @@
 	app->findText();
 }
 
+-(IBAction) openDocs: (id) sender {
+	app->openDocs();
+}
 
 @end

+ 2 - 0
IDE/Contents/Include/PolycodeIDEApp.h

@@ -69,6 +69,8 @@ public:
 	void newProject();
 	void newFile();
 	
+	void openDocs();
+	
 	void addFiles();
 	
 	void newGroup();

+ 7 - 0
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -259,6 +259,13 @@ void PolycodeIDEApp::openProject(String projectFile) {
 	projectManager->openProject(projectFile);
 }
 
+void PolycodeIDEApp::openDocs() {
+
+	String polycodeBasePath = CoreServices::getInstance()->getCore()->getDefaultWorkingDirectory();
+	String docsURL = "file://localhost"+polycodeBasePath+"/Standalone/Docs/html/index.html";
+	core->openURL(docsURL);
+}
+
 void PolycodeIDEApp::openFileInProject(PolycodeProject *project, String filePath) {
 	OSFileEntry fileEntry = OSFileEntry(project->getRootFolder()+"/"+filePath, OSFileEntry::TYPE_FILE);	
 	OSFILE *file = OSBasics::open(project->getRootFolder()+"/"+filePath,"r");

+ 2 - 0
Standalone/CMakeLists.txt

@@ -13,6 +13,8 @@ INSTALL(DIRECTORY ${PolycodeStandalone_SOURCE_DIR}/../Modules/Bindings/3DPhysics
 
 INSTALL(DIRECTORY ${PolycodeStandalone_SOURCE_DIR}/../Examples/Lua DESTINATION Examples)
 
+INSTALL(DIRECTORY ${PolycodeStandalone_SOURCE_DIR}/../Documentation/Lua/html DESTINATION Docs)
+
 IF(MSVC OR MINGW)
 
   INSTALL(FILES ${POLYCODE_RELEASE_DIR}/Framework/Core/Dependencies/bin/OpenAL32.dll DESTINATION Player)