organize into folders (why didn't i think of this sooner?)

pull/1/head
an 2019-08-14 05:27:32 -04:00
parent b7f8614ab4
commit 94e70bd557
80 changed files with 211 additions and 204 deletions

126
api.md
View File

@ -26,7 +26,7 @@ modder rather than for the engine.
<!-- inter-toc actor --> <!-- inter-toc actor -->
* [State](api-actor-State.md) * [State](api/actor/State.md)
<!-- end --> <!-- end -->
@ -36,15 +36,15 @@ TODO
<!-- inter-toc base --> <!-- inter-toc base -->
* [Array](api-base-Array.md) * [Array](api/base/Array.md)
* [Color](api-base-Color.md) * [CVar](api/base/CVar.md)
* [CVar](api-base-CVar.md) * [Color](api/base/Color.md)
* [FixedArray](api-base-FixedArray.md) * [FixedArray](api/base/FixedArray.md)
* [Object](api-base-Object.md) * [Object](api/base/Object.md)
* [String](api-base-String.md) * [StringTable](api/base/StringTable.md)
* [StringTable](api-base-StringTable.md) * [String](api/base/String.md)
* [Thinker](api-base-Thinker.md) * [Thinker](api/base/Thinker.md)
* [Vector](api-base-Vector.md) * [Vector](api/base/Vector.md)
<!-- end --> <!-- end -->
@ -54,14 +54,14 @@ TODO
<!-- inter-toc drawing --> <!-- inter-toc drawing -->
* [BrokenLines](api-drawing-BrokenLines.md) * [BrokenLines](api/drawing/BrokenLines.md)
* [Console](api-drawing-Console.md) * [Console](api/drawing/Console.md)
* [Font](api-drawing-Font.md) * [Font](api/drawing/Font.md)
* [GIFont](api-drawing-GIFont.md) * [GIFont](api/drawing/GIFont.md)
* [Screen](api-drawing-Screen.md) * [Screen](api/drawing/Screen.md)
* [Shape2D](api-drawing-Shape2D.md) * [Shape2D](api/drawing/Shape2D.md)
* [TexMan](api-drawing-TexMan.md) * [TexMan](api/drawing/TexMan.md)
* [TextureID](api-drawing-TextureID.md) * [TextureID](api/drawing/TextureID.md)
<!-- end --> <!-- end -->
@ -71,11 +71,11 @@ TODO
<!-- inter-toc events --> <!-- inter-toc events -->
* [ConsoleEvent](api-events-ConsoleEvent.md) * [ConsoleEvent](api/events/ConsoleEvent.md)
* [EventHandler](api-events-EventHandler.md) * [EventHandler](api/events/EventHandler.md)
* [RenderEvent](api-events-RenderEvent.md) * [RenderEvent](api/events/RenderEvent.md)
* [ReplaceEvent](api-events-ReplaceEvent.md) * [ReplaceEvent](api/events/ReplaceEvent.md)
* [StaticEventHandler](api-events-StaticEventHandler.md) * [StaticEventHandler](api/events/StaticEventHandler.md)
<!-- end --> <!-- end -->
@ -85,7 +85,7 @@ TODO
<!-- inter-toc files --> <!-- inter-toc files -->
* [Wads](api-files-Wads.md) * [Wads](api/files/Wads.md)
<!-- end --> <!-- end -->
@ -95,11 +95,11 @@ TODO
<!-- inter-toc inter --> <!-- inter-toc inter -->
* [InterBackground](api-inter-InterBackground.md) * [InterBackground](api/inter/InterBackground.md)
* [PatchInfo](api-inter-PatchInfo.md) * [PatchInfo](api/inter/PatchInfo.md)
* [StatusScreen](api-inter-StatusScreen.md) * [StatusScreen](api/inter/StatusScreen.md)
* [WBPlayerStruct](api-inter-WBPlayerStruct.md) * [WBPlayerStruct](api/inter/WBPlayerStruct.md)
* [WBStartStruct](api-inter-WBStartStruct.md) * [WBStartStruct](api/inter/WBStartStruct.md)
<!-- end --> <!-- end -->
@ -115,17 +115,17 @@ for [statistics drivers][1].
<!-- inter-toc level --> <!-- inter-toc level -->
* [F3DFloor](api-level-F3DFloor.md) * [F3DFloor](api/level/F3DFloor.md)
* [FColorMap](api-level-FColorMap.md) * [FColorMap](api/level/FColorMap.md)
* [Line](api-level-Line.md) * [LineIdIterator](api/level/LineIdIterator.md)
* [LineIdIterator](api-level-LineIdIterator.md) * [Line](api/level/Line.md)
* [SecPlane](api-level-SecPlane.md) * [SecPlane](api/level/SecPlane.md)
* [SecSpecial](api-level-SecSpecial.md) * [SecSpecial](api/level/SecSpecial.md)
* [Sector](api-level-Sector.md) * [SectorEffect](api/level/SectorEffect.md)
* [SectorEffect](api-level-SectorEffect.md) * [SectorTagIterator](api/level/SectorTagIterator.md)
* [SectorTagIterator](api-level-SectorTagIterator.md) * [Sector](api/level/Sector.md)
* [Side](api-level-Side.md) * [Side](api/level/Side.md)
* [Vertex](api-level-Vertex.md) * [Vertex](api/level/Vertex.md)
<!-- end --> <!-- end -->
@ -135,9 +135,9 @@ TODO
<!-- inter-toc player --> <!-- inter-toc player -->
* [PlayerClass](api-player-PlayerClass.md) * [PlayerClass](api/player/PlayerClass.md)
* [PlayerSkin](api-player-PlayerSkin.md) * [PlayerSkin](api/player/PlayerSkin.md)
* [Team](api-player-Team.md) * [Team](api/player/Team.md)
<!-- end --> <!-- end -->
@ -147,7 +147,7 @@ TODO
<!-- inter-toc sound --> <!-- inter-toc sound -->
* [SeqNode](api-sound-SeqNode.md) * [SeqNode](api/sound/SeqNode.md)
<!-- end --> <!-- end -->
@ -157,7 +157,7 @@ TODO
<!-- inter-toc wep --> <!-- inter-toc wep -->
* [PSprite](api-wep-PSprite.md)
<!-- end --> <!-- end -->
@ -165,39 +165,39 @@ TODO
# Global Objects # Global Objects
<!-- inter-toc global-data --> <!-- inter-toc global/data -->
* [Client](api-global-data-Client.md) * [Client](api/global/data/Client.md)
* [Constants](api-global-data-Constants.md) * [Constants](api/global/data/Constants.md)
* [Game](api-global-data-Game.md) * [Game](api/global/data/Game.md)
* [Information](api-global-data-Information.md) * [Information](api/global/data/Information.md)
* [Player](api-global-data-Player.md) * [Player](api/global/data/Player.md)
<!-- end --> <!-- end -->
These variables are accessible in any context and are not bound by any specific These variables are accessible in any context and are not bound by any specific
object. Generally these mirror global information within the engine itself. object. Generally these mirror global information within the engine itself.
<!-- inter-toc global-func --> <!-- inter-toc global/func -->
* [Classes](api-global-func-Classes.md) * [Classes](api/global/func/Classes.md)
* [Game](api-global-func-Game.md) * [Game](api/global/func/Game.md)
* [Math](api-global-func-Math.md) * [Math](api/global/func/Math.md)
* [Random](api-global-func-Random.md) * [Random](api/global/func/Random.md)
* [Sound](api-global-func-Sound.md) * [Sound](api/global/func/Sound.md)
* [System](api-global-func-System.md) * [System](api/global/func/System.md)
<!-- end --> <!-- end -->
These functions are accessible in any context and are not bound by any specific These functions are accessible in any context and are not bound by any specific
object. Generally these are utility functions. object. Generally these are utility functions.
<!-- inter-toc global-type --> <!-- inter-toc global/type -->
* [DehInfo](api-global-type-DehInfo.md) * [DehInfo](api/global/type/DehInfo.md)
* [FOptionMenuSettings](api-global-type-FOptionMenuSettings.md) * [FOptionMenuSettings](api/global/type/FOptionMenuSettings.md)
* [GameInfoStruct](api-global-type-GameInfoStruct.md) * [GameInfoStruct](api/global/type/GameInfoStruct.md)
* [LevelLocals](api-global-type-LevelLocals.md) * [LevelLocals](api/global/type/LevelLocals.md)
<!-- end --> <!-- end -->

View File

@ -2,11 +2,11 @@
<!-- inter-toc --> <!-- inter-toc -->
* [Classes](glossary-Classes.md) * [Classes](glossary/Classes.md)
* [Concepts](glossary-Concepts.md) * [Concepts](glossary/Concepts.md)
* [Structures](glossary-Structures.md) * [Structures](glossary/Structures.md)
* [Style](glossary-Style.md) * [Style](glossary/Style.md)
* [Versions](glossary-Versions.md) * [Versions](glossary/Versions.md)
<!-- end --> <!-- end -->

View File

@ -127,15 +127,15 @@ Finally, here is a table of contents for each language element:
<!-- inter-toc --> <!-- inter-toc -->
* [Classes](lang-Classes.md) * [Classes](language/Classes.md)
* [Constants](lang-Constants.md) * [Constants](language/Constants.md)
* [Enumerations](lang-Enumerations.md) * [Enumerations](language/Enumerations.md)
* [Expressions](lang-Expressions.md) * [Expressions](language/Expressions.md)
* [Members](lang-Members.md) * [Members](language/Members.md)
* [Methods](lang-Methods.md) * [Methods](language/Methods.md)
* [Statements](lang-Statements.md) * [Statements](language/Statements.md)
* [Structures](lang-Structures.md) * [Structures](language/Structures.md)
* [Types](lang-Types.md) * [Types](language/Types.md)
<!-- end --> <!-- end -->

View File

@ -3,55 +3,62 @@
## By Alison Sanderson. Attribution is encouraged, though not required. ## By Alison Sanderson. Attribution is encouraged, though not required.
## <https://creativecommons.org/publicdomain/zero/1.0/legalcode> ## <https://creativecommons.org/publicdomain/zero/1.0/legalcode>
## TOCGen: Generates inter-file TOCs. ## TOCGen: Generates inter-file TOCs.
## Example usage:
## tools/tocgen.rb
$d = Dir["*.md"] def emit_filtered_file_toc file_matcher
links = []
files = ALL_MD_FILES.map do |p| p.match file_matcher end.compact
def filter_emit r for md_file in files
res = [] links << "* [#{md_file[1]}](#{md_file[0]})"
for m in $d.map{|p| p.match r}.compact end
res << "* [#{m[1]}](#{m[0]})"
end links.sort.join ?\n
res.join ?\n
end end
def find_toc_areas f TOC_REGEX = /^(<!-- inter-toc\s*([^\s]+)?\s*-->)(?:.|\n)*?(<!-- end -->)/i
re = /^(<!-- inter-toc\s*([^\s]+)\s*-->)(?:.|\n)*?(<!-- end -->)/i def find_inter_toc_areas file
f.to_enum(:scan, re).map{$~} file.to_enum(:scan, TOC_REGEX).map do $~ end
end end
def filter_toc_areas f def filter_toc_areas file
o = String.new content = ""
lof = 0 last_offset = 0
for area in find_toc_areas f
of = area.offset 0 for area in find_inter_toc_areas file
o << f[lof...of[0]] offset = area.offset 0
o << area[1] content << file[last_offset...offset[0]]
o << "\n\n" content << area[1]
o << filter_emit(yield area[2]) content << "\n\n"
o << "\n\n" content << emit_filtered_file_toc(yield area[2])
o << area[3] content << "\n\n"
lof = of[1] content << area[3]
end last_offset = offset[1]
o << f[lof..-1] end
o
content << file[last_offset..-1]
content
end end
def rewrite fnam def rewrite filename
f = File.read fnam file = File.read filename
o = yield f output = yield file
File.write fnam, o File.write filename, output
end end
rewrite "api.md" do |f| ALL_MD_FILES = Dir["{api,glossary,language}/**/*.md"]
filter_toc_areas f do |a| /api-#{a}-(\w+).md/ end
rewrite "api.md" do |file|
filter_toc_areas file do |folder| /api\/#{folder}\/(\w+).md/ end
end end
rewrite "glossary.md" do |f| rewrite "glossary.md" do |file|
filter_toc_areas f do |a| /glossary-(\w+).md/ end filter_toc_areas file do |_| /glossary\/(\w+).md/ end
end end
rewrite "lang.md" do |f| rewrite "language.md" do |file|
filter_toc_areas f do |a| /lang-(\w+).md/ end filter_toc_areas file do |_| /language\/(\w+).md/ end
end end
## EOF ## EOF

View File

@ -4,51 +4,51 @@
## <https://creativecommons.org/publicdomain/zero/1.0/legalcode> ## <https://creativecommons.org/publicdomain/zero/1.0/legalcode>
## TreeGen: Generates the glossary files for classes. ## TreeGen: Generates the glossary files for classes.
## Example usage: ## Example usage:
## tools/treegen.rb \ ## tools/treegen.rb \
## '/mnt/g/Archive/gzdoom-g4.1.0/wadsrc/static/zscript/**/*.zs' \ ## '/mnt/g/Archive/gzdoom-g4.1.0/wadsrc/static/zscript/**/*.zs' \
## 4.1.0 ## 4.1.0
require "./tools/zsclasstree.rb" require "./tools/zsclasstree.rb"
DIR = ARGV.shift FILES = ARGV.shift
VER = ARGV.shift VERSION = ARGV.shift
si = ClassSiphon.new DIR siphon = ClassSiphon.new FILES
f = open "glossary-Classes.md", "wb" file = open "glossary-Classes.md", "wb"
f.puts <<_end_ file.puts <<_end_
# Classes # Classes
Here is a full tree of all classes in ZScript as of GZDoom #{VER}. There are Here is a full tree of all classes in ZScript as of GZDoom #{VERSION}. There
#{si.classes.count + 1} classes total. are #{siphon.classes.count + 1} classes total.
``` ```
Object Object
_end_ _end_
si.print_classes f siphon.print_classes file
f.puts <<_end_ file.puts <<_end_
``` ```
<!-- EOF --> <!-- EOF -->
_end_ _end_
f = open "glossary-Structures.md", "wb" file = open "glossary-Structures.md", "wb"
f.puts <<_end_ file.puts <<_end_
# Structures # Structures
Here is a full list of all structures in ZScript as of GZDoom #{VER}. There are Here is a full list of all structures in ZScript as of GZDoom #{VERSION}.
#{si.structs.count} structures total. Note that some of these are merely There are #{siphon.structs.count} structures total. Note that some of these
implementation details and should not be used in code. are merely implementation details and should not be used in code.
``` ```
Struct Struct
_end_ _end_
si.print_structs f siphon.print_structs file
f.puts <<_end_ file.puts <<_end_
``` ```
<!-- EOF --> <!-- EOF -->

View File

@ -11,101 +11,101 @@
require 'set' require 'set'
class ClassSiphon class ClassSiphon
attr_reader :structs, :classes, :clstree, :strtree, :caps attr_reader :structs, :classes, :clstree, :strtree, :caps
def initialize dirs def initialize dirs
@subcls = {} @subcls = {}
@classes = Set[] @classes = Set[]
@structs = Set[] @structs = Set[]
@caps = {} @caps = {}
Dir.glob dirs do |f| proc_file File.read f end Dir.glob dirs do |f| proc_file File.read f end
@clstree = make_tree "OBJECT", @subcls["OBJECT"] @clstree = make_tree "OBJECT", @subcls["OBJECT"]
@strtree = @structs.map {|type| [type, nil]} @strtree = @structs.map {|type| [type, nil]}
@classes.freeze @classes.freeze
@structs.freeze @structs.freeze
@clstree.freeze @clstree.freeze
@strtree.freeze @strtree.freeze
@caps.freeze @caps.freeze
end end
def print_classes out, filter = [] def print_classes out, filter = []
print_tree out, filter, "OBJECT", clstree print_tree out, filter, "OBJECT", clstree
end end
def print_structs out, filter = [] def print_structs out, filter = []
print_tree out, filter, "STRUCT", strtree print_tree out, filter, "STRUCT", strtree
end end
private private
def add_class m def add_class m
ctype = m[0] .strip ctype = m[0] .strip
cbase = (m[1] or "Object").strip cbase = (m[1] or "Object").strip
type = ctype.upcase type = ctype.upcase
base = cbase.upcase base = cbase.upcase
@caps[type] = ctype @caps[type] = ctype
@caps[base] = cbase @caps[base] = cbase
if base != type if base != type
if @subcls[base] if @subcls[base]
@subcls[base] << type @subcls[base] << type
else else
@subcls[base] = [type] @subcls[base] = [type]
end end
raise "duplicate class #{type}" if @classes === type raise "duplicate class #{type}" if @classes === type
@classes << type @classes << type
end end
end end
def add_struct m def add_struct m
ctype = m[0] ctype = m[0]
type = ctype.upcase type = ctype.upcase
@caps[type] = ctype @caps[type] = ctype
@structs << type @structs << type
end end
def proc_file f def proc_file f
f.gsub! /\/\*(?!\*\/)+\*\//m, "" f.gsub! /\/\*(?!\*\/)+\*\//m, ""
f.gsub! /\/\/.+/, "" f.gsub! /\/\/.+/, ""
f.scan(/^class\s*(\w*)[\s\w]+(?::\s+(\w*))?/).each {|m| add_class m} f.scan(/^class\s*(\w*)[\s\w]+(?::\s+(\w*))?/).each {|m| add_class m}
f.scan(/^struct\s*(\w*)/) .each {|m| add_struct m} f.scan(/^struct\s*(\w*)/) .each {|m| add_struct m}
end end
# work our way down the subclasses recursively, making them into a tree structure # work our way down the subclasses recursively, making them into a tree structure
def make_tree bcl, subs def make_tree bcl, subs
return nil unless subs return nil unless subs
node = {} node = {}
subs.each do |cl| node[cl] = make_tree cl, @subcls[cl] end subs.each do |cl| node[cl] = make_tree cl, @subcls[cl] end
node node
end end
def print_tree out, filter, base, tree, tab = "" def print_tree out, filter, base, tree, tab = ""
return if !tree or filter.include? base return if !tree or filter.include? base
tree = tree.map do |type, base| [type, base] end tree = tree.map do |type, base| [type, base] end
tree.sort! tree.sort!
for type, base in tree for type, base in tree
last = type == tree[-1][0] last = type == tree[-1][0]
sep = last ? "" : "" sep = last ? "" : ""
nxt = last ? " " : "" nxt = last ? " " : ""
out.puts tab + sep + @caps[type] out.puts tab + sep + @caps[type]
print_tree out, filter, type, base, tab + nxt print_tree out, filter, type, base, tab + nxt
end end
end end
end end
if __FILE__ == $0 if __FILE__ == $0
in_dirs = ARGV.shift in_dirs = ARGV.shift
filters = ARGV filters = ARGV
si = ClassSiphon.new in_dirs si = ClassSiphon.new in_dirs
puts "Object"; si.print_classes STDOUT, filters puts "Object"; si.print_classes STDOUT, filters
puts "Struct"; si.print_structs STDOUT, filters puts "Struct"; si.print_structs STDOUT, filters
end end
## EOF ## EOF