Browse Source

finished first pass of the "how to" document page.

Charlie Patterson 12 years ago
parent
commit
37058ab325
1 changed files with 106 additions and 46 deletions
  1. 106 46
      engine/source/console/documenting_ScriptPage.md

+ 106 - 46
engine/source/console/documenting_ScriptPage.md

@@ -1,24 +1,38 @@
 # Documenting TorqueScript
 # Documenting TorqueScript
 
 
+notes
++ TDN docs expounded
++ dox must have comments
+	+ cannot be md in the open
++ md is not comments
+	+ but can have "@" codes
++ pages
+	+ can be made with markdown naturally
+	+ or with a comment block starting with @@page
+
 ## Introduction
 ## Introduction
 
 
-This references describes how to document TorqueScript.  It covers the tool used, the location of the docs, and
-the process of adding or editing docs.  The end goal is a single manual that can be referenced on-line or downloaded.
+This references describes how the TorqueScript manual is created.  It covers the tool used, the location of the docs source, and
+the process of adding or editing all the documentation types.  The end goal is a single manual that can be referenced on-line or downloaded.
 The manual created contains information about classes and functions, and also information about operators, sub-systems,
 The manual created contains information about classes and functions, and also information about operators, sub-systems,
 general information, etc.
 general information, etc.
 
 
-TorqueScript is a scripting language written specifically for Torque.  The compiling and running of the script code
-is a part of the engine itself.
+As a bit of background, TorqueScript is a scripting language written specifically for Torque.  The compiling and running
+of the script code is a part of the engine itself.  Our goal here is to extract just the internal documentation that refers
+to TorqueScript functions and classes (which are really "bindings" to C++ functions and classes), etc.
 
 
 The manual is created using [Doxygen](doxygen.org), so its helpful to get some experience with that tool and
 The manual is created using [Doxygen](doxygen.org), so its helpful to get some experience with that tool and
-to also to refer to its manual for documenting features.  This reference only covers Doxygen lightly but possibly
-enough to get started.
-
-Normally, Doxygen is used to create a cross-referenced document for a C++ code base, even though that's not
-quite what the TorqueScript manual is.  That is, you normally document the system you've built in C++, not
-a language and API bindings to an engine!  But Doxygen is so useful and capable that it was worth working out
-a way to use it for our purposes.  As a matter of fact, we can also produce a Torque2D engine document
-from the same code base!
+ also to refer to its manual for documenting features.  This reference only covers Doxygen lightly but probably
+enough to get started.  It also covers our use of its high-level features to get what we want.  For now, we'll just
+say that Doxygen is a feature-rich tool to extract documents out of a code base.  Doxygen recognized specialed comment
+sections designed for this purse.  These sections are explicity about return types from functions, code examples, and
+other features.  The end result is an organized series of pages, like an index, but with descriptions and concepts
+explained and with links to each other as a cross-reference.
+
+> Normally, Doxygen is used to create a cross-referenced document for a C++ code base.  Note that our desire here is
+to document a class and function binding library, along with the syntax, operators, types, etc. of TorqueScript.
+But Doxygen is so useful and capable that it was worth working out a way to use it for our purposes.  As a matter of fact,
+we can also produce a Torque2D engine document from the same code base!
 
 
 The docs can be output in an HTML form, among many others including pdf or chm.
 The docs can be output in an HTML form, among many others including pdf or chm.
 
 
@@ -282,49 +296,95 @@ Again, this was done for an engine subsytem, but the same *could* be done for To
 
 
 ## Documenting General Information
 ## Documenting General Information
 
 
+Our final category of document is the "page" as described above.  Two great examples page documentation are the Syntax Guide
+and the "how to" you are currently reading.  To create these, simply create a markdown file (extension .md).  The level-1 header of the file
+(the section header that starts with a single hash #), will be the name of the page in the final document.
 
 
+This markdown file should be suffixed with `_ScriptPage.*`, for instance "syntax_ScriptPage.md"
 
 
-## Appendix A: Doxygen Markup Caveats
-1. lists have trouble starting with `*` because it seems like the line is part of a long comment.  So change `*` lists to `-`
+We try to keep the pages close to the code it relates to, but rememer "pages" tend to be unrelated to particular classes,
+modules, etc.  Therefore the pages have been kept in the `Torque2D\engine\source\console` directory since it most
+represents the entire TorqueScript interpreter in general.  For example this document is `documenting_ScriptPage.md`
+within the `console` directory.
 
 
-    - if you use regular expressions, search for `^\*_` and manually replace with `-_` (where `_` represents a space).  note that a manual replace may not be necessary but I'm not sure that all lines that begin with a single * are necessarily lists!
+The content of the file requires no doxygen commands such as @@defgroup or @@param (although @@code has come in useful as will be
+described in the appendix).  It is read as pure markdown (with a few
+exceptions).  Doxygen will successfully create links for any symbols is recongizes however.  (To force the link off, put a
+percent % in front of the text.
 
 
-1. doxygen understands "fencepost" code blocks (~~~) but is confused in the case of c++.  Specifically, doxygen will eat // comments within them!
-However the form `@code{.cpp}` will work.  For consistency change all code blocks from ~~~ to @code.
+## Converting "Old" Documents to "New"
 
 
-    - if you use regular expressions, search for \`\`\`(.+) and replace it with  `@code{\1}`.  after that, you can match the end fence posts easily also.  replace \`\`\` with `@endcode`
- 
-  %variable in line dos not work.  (docs say use \% but does not work)  use %%variable to get %variable.
- -- required \--
- numbers 1.2.3. must be correct
+*If you read the appendix on how documenting TorqueScript is done with Doxygen, this may make more sense to you.*
+
+You may find, from time to time, snippets of an older form of documentation for TorqueScript in the code base.  One of the
+Appendices explains in more detail, but basically, documents used to be a "usage" string as part of a macro call like this:
+
+@code
+ConsoleFunction(myFunction, void, 4, 4, "(id) very long string of documents..."
+						"@param including parameters and other doxygen commands!")
+@endcode
+
+These macro calls appeared with the source code in the same file, for instance in `SimObject.cc`.  For readability reasons,
+these functions were mostly pulled to their own files, such as `SimObject_ScriptBinding.h`, but not all of them have made it.
+(We could use help in moving the stragglers as well!)
+
+The new documentation process takes advantage of these binding files being separate.  Additionally it needs a new macro that
+does not take the usage string, called ConsoleFunctionWithDocs, etc.  For instance this is the new form:
+
+@code
+/*! very long string of documents
+    @param which is a good thing now
+*/
+ConsoleFunctionWithDocs(myFunction, void, 3, 3, (id))
+@endcode
+
+Ultimately, when all the functions and methods are complete, the macro name may change back to not include the "WithDocs" ending.
+For now, this is what you are seeing!
+
+## Appendix A: Doxygen Command and Markup Caveats
+
+It will probably be necessary to limit yourself some when trying to grab a markdown page and move it to the source base for
+Doxygen's use.  While Doxygen claims to handle markdown, including GitHub flavored markdown, in practice we have run into a
+few edge cases.  Below are a few of them.
+
++ lists starting with `*` may not work.  This is because it seems like the line is part of a comment surrounded with *.
+If you use `+` or `-` it will work.
+
++ doxygen understands "fencepost" code blocks (~~~) or (~~~{.cpp}) but we have seen some issues.  Specifically, doxygen
+will eat double-slash `//` comments within them!  This is probably a bug.  Luckily Doxygen understands its own commands
+embedded in markdown, so you can use @@code and @@endcode around code sections.  This will preserver comments inside of those sections.
+
++ starting a word with % such as %%myVar is very common in TorqueScript, but Doxygen reserves % to mean "do not create a link here".
+For instance, if you don't want SimObject to become a link, use `%%SimObject`.  For TorqueScript variables use two percents before your
+variables to see one.  This is not necessary in code sections!  But it is necessary in in-line code and regular text.  :)
+
++ GitHub flavored markdown provides for easier numbered lists.  Simply start each item with `1.` and they will be re-numbered.
+However this does not work in Doxygen.  Number each item correctly.
  
  
 ## Appendix B.  How Documenting TorqueScript Works
 ## Appendix B.  How Documenting TorqueScript Works
 
 
-*You can skip this section unless you are curious.*
+For several years, Torque2D produced a TorqueScript manual in a different way than described in this reference.
 
 
-For several years, Torque2D produced a TorqueScript manual in a different way.  Realize, that we want to be able to produce a 
-manual for Torque2D's C++ engine as well as produce a manual for TorqueScript.  So running Doxygen on the code produced only the 
-Torque2D manual.  This is as it should be.  Doxygen simply cross-references C++ symbols like classes, namespaces, and functions.
+As a bit of back story, don't forget that we want to be able to produce a manual for Torque2D's C++ engine as well
+as produce a manual for TorqueScript.  So running Doxygen on the code produced only the Torque2D manual.  This is "as it should be."
 
 
-Then, to create a TorqueScript manual -- not actually document code mind you -- something has to give.  Remember, this is not 
-Doxygen's purpose, but since it is an excellent tool for creating cross-referenced docs a way was devised!  One would compile the 
-Torque2D, and run it.  From within the program one would call dumpConsoleFunctions() and other functions to produce a "psuedo-code" 
-output file.  The file was suspiciously like a program itself, complete with documentation of the "functions" and "classes".  This 
-file would then be run through Doxygen and viola!, a second reference manual was produced.
+Back then, to create a TorqueScript manual one would compile Torque2D, and run it.  From within the program one would call
+dumpConsoleFunctions() and other functions to produce a "psuedo-code" output file.  The file was suspiciously like a program itself,
+complete with documentation of the "functions" and "classes".  This file would then be run through Doxygen and viola!, a
+second reference manual was produced.
 
 
 The problem with using the above method had two specific drawbacks worth removing if possible.  First, it required several steps -- 
 The problem with using the above method had two specific drawbacks worth removing if possible.  First, it required several steps -- 
-compiling the code, running it with some script calls, running Doxygen on the output of the dump -- and so it was impractical to 
-add and modify new docs as easily as Doxygen is designed to do.  Second, the documents had to be hidden from Doxygen on the normal 
-pass that creates an engine reference!  To do so, the docs appeared in a string for each TorqueScript call or class.  This was also 
-harder to work with than would be nice.  A less important issue, but still a real one, was the possibility that all these strings, 
-compiled into the engine, could be expensive in space.  (Though the strings could be skipped at compile time if TORQUE_SHIPPING was 
-defined.)
-
-Now, the TorqueScript function bindings are documented just like any other code -- in comment sections with the code.  And 
-"compiling" the documents is no harder than running Doxygen on the code base with a special config file designed for TorqueScript 
-output.
-
-There are always trade-offs to slight-of-hand however.  The way we get Doxygen to pick between documenting the engine or  
-TorqueScript is that TorqueScript functions are in special files ending with _ScriptBinding.h.  These files are skipped when 
-creating docs for the engine.  Likewise, they are the only files used when creating the script reference.  There are other files 
-and cases that are specific to TorqueScript -- this is the main way we can get both manuals from one code base!
+compiling the code, running it against some script calls, running Doxygen on the output of the dump -- and so it was impractical to 
+add and modify new docs as easily as Doxygen is designed to do.
+
+Second, the script documents had to be hidden from Doxygen on the normal 
+pass lest it include confusing bits of information in the engine docs!  To do so, the docs appeared in a (large) string for each TorqueScript
+call or class.  This was harder to work with than simple comments.  A less important issue, but still a real one, was the possibility that
+all these strings, compiled into the engine, could be expensive in space.  (Though the strings could be skipped at compile time if
+TORQUE_SHIPPING was defined.)
+
+The new solution employed a different clever solution.  Now, the TorqueScript function bindings are documented just like any other code
+-- in comment sections with the code.  And "compiling" the documents is no harder than running Doxygen on the code base.
+The way we get Doxygen to pick between documenting the engine or  
+TorqueScript is that TorqueScript functions are in special files ending with `_ScriptBinding.*` or `_ScriptPage.*`.  These files are skipped when 
+creating docs for the engine.  Likewise, they are the only files used when creating the script reference.