diff --git a/api.md b/api.md index 46d4788..1d9d840 100644 --- a/api.md +++ b/api.md @@ -26,7 +26,7 @@ modder rather than for the engine. -* [State](api-actor-State.md) +* [State](api/actor/State.md) @@ -36,15 +36,15 @@ TODO -* [Array](api-base-Array.md) -* [Color](api-base-Color.md) -* [CVar](api-base-CVar.md) -* [FixedArray](api-base-FixedArray.md) -* [Object](api-base-Object.md) -* [String](api-base-String.md) -* [StringTable](api-base-StringTable.md) -* [Thinker](api-base-Thinker.md) -* [Vector](api-base-Vector.md) +* [Array](api/base/Array.md) +* [CVar](api/base/CVar.md) +* [Color](api/base/Color.md) +* [FixedArray](api/base/FixedArray.md) +* [Object](api/base/Object.md) +* [StringTable](api/base/StringTable.md) +* [String](api/base/String.md) +* [Thinker](api/base/Thinker.md) +* [Vector](api/base/Vector.md) @@ -54,14 +54,14 @@ TODO -* [BrokenLines](api-drawing-BrokenLines.md) -* [Console](api-drawing-Console.md) -* [Font](api-drawing-Font.md) -* [GIFont](api-drawing-GIFont.md) -* [Screen](api-drawing-Screen.md) -* [Shape2D](api-drawing-Shape2D.md) -* [TexMan](api-drawing-TexMan.md) -* [TextureID](api-drawing-TextureID.md) +* [BrokenLines](api/drawing/BrokenLines.md) +* [Console](api/drawing/Console.md) +* [Font](api/drawing/Font.md) +* [GIFont](api/drawing/GIFont.md) +* [Screen](api/drawing/Screen.md) +* [Shape2D](api/drawing/Shape2D.md) +* [TexMan](api/drawing/TexMan.md) +* [TextureID](api/drawing/TextureID.md) @@ -71,11 +71,11 @@ TODO -* [ConsoleEvent](api-events-ConsoleEvent.md) -* [EventHandler](api-events-EventHandler.md) -* [RenderEvent](api-events-RenderEvent.md) -* [ReplaceEvent](api-events-ReplaceEvent.md) -* [StaticEventHandler](api-events-StaticEventHandler.md) +* [ConsoleEvent](api/events/ConsoleEvent.md) +* [EventHandler](api/events/EventHandler.md) +* [RenderEvent](api/events/RenderEvent.md) +* [ReplaceEvent](api/events/ReplaceEvent.md) +* [StaticEventHandler](api/events/StaticEventHandler.md) @@ -85,7 +85,7 @@ TODO -* [Wads](api-files-Wads.md) +* [Wads](api/files/Wads.md) @@ -95,11 +95,11 @@ TODO -* [InterBackground](api-inter-InterBackground.md) -* [PatchInfo](api-inter-PatchInfo.md) -* [StatusScreen](api-inter-StatusScreen.md) -* [WBPlayerStruct](api-inter-WBPlayerStruct.md) -* [WBStartStruct](api-inter-WBStartStruct.md) +* [InterBackground](api/inter/InterBackground.md) +* [PatchInfo](api/inter/PatchInfo.md) +* [StatusScreen](api/inter/StatusScreen.md) +* [WBPlayerStruct](api/inter/WBPlayerStruct.md) +* [WBStartStruct](api/inter/WBStartStruct.md) @@ -115,17 +115,17 @@ for [statistics drivers][1]. -* [F3DFloor](api-level-F3DFloor.md) -* [FColorMap](api-level-FColorMap.md) -* [Line](api-level-Line.md) -* [LineIdIterator](api-level-LineIdIterator.md) -* [SecPlane](api-level-SecPlane.md) -* [SecSpecial](api-level-SecSpecial.md) -* [Sector](api-level-Sector.md) -* [SectorEffect](api-level-SectorEffect.md) -* [SectorTagIterator](api-level-SectorTagIterator.md) -* [Side](api-level-Side.md) -* [Vertex](api-level-Vertex.md) +* [F3DFloor](api/level/F3DFloor.md) +* [FColorMap](api/level/FColorMap.md) +* [LineIdIterator](api/level/LineIdIterator.md) +* [Line](api/level/Line.md) +* [SecPlane](api/level/SecPlane.md) +* [SecSpecial](api/level/SecSpecial.md) +* [SectorEffect](api/level/SectorEffect.md) +* [SectorTagIterator](api/level/SectorTagIterator.md) +* [Sector](api/level/Sector.md) +* [Side](api/level/Side.md) +* [Vertex](api/level/Vertex.md) @@ -135,9 +135,9 @@ TODO -* [PlayerClass](api-player-PlayerClass.md) -* [PlayerSkin](api-player-PlayerSkin.md) -* [Team](api-player-Team.md) +* [PlayerClass](api/player/PlayerClass.md) +* [PlayerSkin](api/player/PlayerSkin.md) +* [Team](api/player/Team.md) @@ -147,7 +147,7 @@ TODO -* [SeqNode](api-sound-SeqNode.md) +* [SeqNode](api/sound/SeqNode.md) @@ -157,7 +157,7 @@ TODO -* [PSprite](api-wep-PSprite.md) + @@ -165,39 +165,39 @@ TODO # Global Objects - + -* [Client](api-global-data-Client.md) -* [Constants](api-global-data-Constants.md) -* [Game](api-global-data-Game.md) -* [Information](api-global-data-Information.md) -* [Player](api-global-data-Player.md) +* [Client](api/global/data/Client.md) +* [Constants](api/global/data/Constants.md) +* [Game](api/global/data/Game.md) +* [Information](api/global/data/Information.md) +* [Player](api/global/data/Player.md) These variables are accessible in any context and are not bound by any specific object. Generally these mirror global information within the engine itself. - + -* [Classes](api-global-func-Classes.md) -* [Game](api-global-func-Game.md) -* [Math](api-global-func-Math.md) -* [Random](api-global-func-Random.md) -* [Sound](api-global-func-Sound.md) -* [System](api-global-func-System.md) +* [Classes](api/global/func/Classes.md) +* [Game](api/global/func/Game.md) +* [Math](api/global/func/Math.md) +* [Random](api/global/func/Random.md) +* [Sound](api/global/func/Sound.md) +* [System](api/global/func/System.md) These functions are accessible in any context and are not bound by any specific object. Generally these are utility functions. - + -* [DehInfo](api-global-type-DehInfo.md) -* [FOptionMenuSettings](api-global-type-FOptionMenuSettings.md) -* [GameInfoStruct](api-global-type-GameInfoStruct.md) -* [LevelLocals](api-global-type-LevelLocals.md) +* [DehInfo](api/global/type/DehInfo.md) +* [FOptionMenuSettings](api/global/type/FOptionMenuSettings.md) +* [GameInfoStruct](api/global/type/GameInfoStruct.md) +* [LevelLocals](api/global/type/LevelLocals.md) diff --git a/api-actor-State.md b/api/actor/State.md similarity index 100% rename from api-actor-State.md rename to api/actor/State.md diff --git a/api-base-Array.md b/api/base/Array.md similarity index 100% rename from api-base-Array.md rename to api/base/Array.md diff --git a/api-base-CVar.md b/api/base/CVar.md similarity index 100% rename from api-base-CVar.md rename to api/base/CVar.md diff --git a/api-base-Color.md b/api/base/Color.md similarity index 100% rename from api-base-Color.md rename to api/base/Color.md diff --git a/api-base-FixedArray.md b/api/base/FixedArray.md similarity index 100% rename from api-base-FixedArray.md rename to api/base/FixedArray.md diff --git a/api-base-Object.md b/api/base/Object.md similarity index 100% rename from api-base-Object.md rename to api/base/Object.md diff --git a/api-base-String.md b/api/base/String.md similarity index 100% rename from api-base-String.md rename to api/base/String.md diff --git a/api-base-StringTable.md b/api/base/StringTable.md similarity index 100% rename from api-base-StringTable.md rename to api/base/StringTable.md diff --git a/api-base-Thinker.md b/api/base/Thinker.md similarity index 100% rename from api-base-Thinker.md rename to api/base/Thinker.md diff --git a/api-base-Vector.md b/api/base/Vector.md similarity index 100% rename from api-base-Vector.md rename to api/base/Vector.md diff --git a/api-drawing-BrokenLines.md b/api/drawing/BrokenLines.md similarity index 100% rename from api-drawing-BrokenLines.md rename to api/drawing/BrokenLines.md diff --git a/api-drawing-Console.md b/api/drawing/Console.md similarity index 100% rename from api-drawing-Console.md rename to api/drawing/Console.md diff --git a/api-drawing-Font.md b/api/drawing/Font.md similarity index 100% rename from api-drawing-Font.md rename to api/drawing/Font.md diff --git a/api-drawing-GIFont.md b/api/drawing/GIFont.md similarity index 100% rename from api-drawing-GIFont.md rename to api/drawing/GIFont.md diff --git a/api-drawing-Screen.md b/api/drawing/Screen.md similarity index 100% rename from api-drawing-Screen.md rename to api/drawing/Screen.md diff --git a/api-drawing-Shape2D.md b/api/drawing/Shape2D.md similarity index 100% rename from api-drawing-Shape2D.md rename to api/drawing/Shape2D.md diff --git a/api-drawing-TexMan.md b/api/drawing/TexMan.md similarity index 100% rename from api-drawing-TexMan.md rename to api/drawing/TexMan.md diff --git a/api-drawing-TextureID.md b/api/drawing/TextureID.md similarity index 100% rename from api-drawing-TextureID.md rename to api/drawing/TextureID.md diff --git a/api-events-ConsoleEvent.md b/api/events/ConsoleEvent.md similarity index 100% rename from api-events-ConsoleEvent.md rename to api/events/ConsoleEvent.md diff --git a/api-events-EventHandler.md b/api/events/EventHandler.md similarity index 100% rename from api-events-EventHandler.md rename to api/events/EventHandler.md diff --git a/api-events-RenderEvent.md b/api/events/RenderEvent.md similarity index 100% rename from api-events-RenderEvent.md rename to api/events/RenderEvent.md diff --git a/api-events-ReplaceEvent.md b/api/events/ReplaceEvent.md similarity index 100% rename from api-events-ReplaceEvent.md rename to api/events/ReplaceEvent.md diff --git a/api-events-StaticEventHandler.md b/api/events/StaticEventHandler.md similarity index 100% rename from api-events-StaticEventHandler.md rename to api/events/StaticEventHandler.md diff --git a/api-files-Wads.md b/api/files/Wads.md similarity index 100% rename from api-files-Wads.md rename to api/files/Wads.md diff --git a/api-global-data-Client.md b/api/global/data/Client.md similarity index 100% rename from api-global-data-Client.md rename to api/global/data/Client.md diff --git a/api-global-data-Constants.md b/api/global/data/Constants.md similarity index 100% rename from api-global-data-Constants.md rename to api/global/data/Constants.md diff --git a/api-global-data-Game.md b/api/global/data/Game.md similarity index 100% rename from api-global-data-Game.md rename to api/global/data/Game.md diff --git a/api-global-data-Information.md b/api/global/data/Information.md similarity index 100% rename from api-global-data-Information.md rename to api/global/data/Information.md diff --git a/api-global-data-Player.md b/api/global/data/Player.md similarity index 100% rename from api-global-data-Player.md rename to api/global/data/Player.md diff --git a/api-global-func-Classes.md b/api/global/func/Classes.md similarity index 100% rename from api-global-func-Classes.md rename to api/global/func/Classes.md diff --git a/api-global-func-Game.md b/api/global/func/Game.md similarity index 100% rename from api-global-func-Game.md rename to api/global/func/Game.md diff --git a/api-global-func-Math.md b/api/global/func/Math.md similarity index 100% rename from api-global-func-Math.md rename to api/global/func/Math.md diff --git a/api-global-func-Random.md b/api/global/func/Random.md similarity index 100% rename from api-global-func-Random.md rename to api/global/func/Random.md diff --git a/api-global-func-Sound.md b/api/global/func/Sound.md similarity index 100% rename from api-global-func-Sound.md rename to api/global/func/Sound.md diff --git a/api-global-func-System.md b/api/global/func/System.md similarity index 100% rename from api-global-func-System.md rename to api/global/func/System.md diff --git a/api-global-type-DehInfo.md b/api/global/type/DehInfo.md similarity index 100% rename from api-global-type-DehInfo.md rename to api/global/type/DehInfo.md diff --git a/api-global-type-FOptionMenuSettings.md b/api/global/type/FOptionMenuSettings.md similarity index 100% rename from api-global-type-FOptionMenuSettings.md rename to api/global/type/FOptionMenuSettings.md diff --git a/api-global-type-GameInfoStruct.md b/api/global/type/GameInfoStruct.md similarity index 100% rename from api-global-type-GameInfoStruct.md rename to api/global/type/GameInfoStruct.md diff --git a/api-global-type-LevelLocals.md b/api/global/type/LevelLocals.md similarity index 100% rename from api-global-type-LevelLocals.md rename to api/global/type/LevelLocals.md diff --git a/api-inter-InterBackground.md b/api/inter/InterBackground.md similarity index 100% rename from api-inter-InterBackground.md rename to api/inter/InterBackground.md diff --git a/api-inter-PatchInfo.md b/api/inter/PatchInfo.md similarity index 100% rename from api-inter-PatchInfo.md rename to api/inter/PatchInfo.md diff --git a/api-inter-StatusScreen.md b/api/inter/StatusScreen.md similarity index 100% rename from api-inter-StatusScreen.md rename to api/inter/StatusScreen.md diff --git a/api-inter-WBPlayerStruct.md b/api/inter/WBPlayerStruct.md similarity index 100% rename from api-inter-WBPlayerStruct.md rename to api/inter/WBPlayerStruct.md diff --git a/api-inter-WBStartStruct.md b/api/inter/WBStartStruct.md similarity index 100% rename from api-inter-WBStartStruct.md rename to api/inter/WBStartStruct.md diff --git a/api-level-F3DFloor.md b/api/level/F3DFloor.md similarity index 100% rename from api-level-F3DFloor.md rename to api/level/F3DFloor.md diff --git a/api-level-FColorMap.md b/api/level/FColorMap.md similarity index 100% rename from api-level-FColorMap.md rename to api/level/FColorMap.md diff --git a/api-level-Line.md b/api/level/Line.md similarity index 100% rename from api-level-Line.md rename to api/level/Line.md diff --git a/api-level-LineIdIterator.md b/api/level/LineIdIterator.md similarity index 100% rename from api-level-LineIdIterator.md rename to api/level/LineIdIterator.md diff --git a/api-level-SecPlane.md b/api/level/SecPlane.md similarity index 100% rename from api-level-SecPlane.md rename to api/level/SecPlane.md diff --git a/api-level-SecSpecial.md b/api/level/SecSpecial.md similarity index 100% rename from api-level-SecSpecial.md rename to api/level/SecSpecial.md diff --git a/api-level-Sector.md b/api/level/Sector.md similarity index 100% rename from api-level-Sector.md rename to api/level/Sector.md diff --git a/api-level-SectorEffect.md b/api/level/SectorEffect.md similarity index 100% rename from api-level-SectorEffect.md rename to api/level/SectorEffect.md diff --git a/api-level-SectorTagIterator.md b/api/level/SectorTagIterator.md similarity index 100% rename from api-level-SectorTagIterator.md rename to api/level/SectorTagIterator.md diff --git a/api-level-Side.md b/api/level/Side.md similarity index 100% rename from api-level-Side.md rename to api/level/Side.md diff --git a/api-level-Vertex.md b/api/level/Vertex.md similarity index 100% rename from api-level-Vertex.md rename to api/level/Vertex.md diff --git a/api-player-PlayerClass.md b/api/player/PlayerClass.md similarity index 100% rename from api-player-PlayerClass.md rename to api/player/PlayerClass.md diff --git a/api-player-PlayerSkin.md b/api/player/PlayerSkin.md similarity index 100% rename from api-player-PlayerSkin.md rename to api/player/PlayerSkin.md diff --git a/api-player-Team.md b/api/player/Team.md similarity index 100% rename from api-player-Team.md rename to api/player/Team.md diff --git a/api-sound-SeqNode.md b/api/sound/SeqNode.md similarity index 100% rename from api-sound-SeqNode.md rename to api/sound/SeqNode.md diff --git a/api-wep-PSprite.md b/api/weapon/PSprite.md similarity index 100% rename from api-wep-PSprite.md rename to api/weapon/PSprite.md diff --git a/glossary.md b/glossary.md index cadfd5c..91ac994 100644 --- a/glossary.md +++ b/glossary.md @@ -2,11 +2,11 @@ -* [Classes](glossary-Classes.md) -* [Concepts](glossary-Concepts.md) -* [Structures](glossary-Structures.md) -* [Style](glossary-Style.md) -* [Versions](glossary-Versions.md) +* [Classes](glossary/Classes.md) +* [Concepts](glossary/Concepts.md) +* [Structures](glossary/Structures.md) +* [Style](glossary/Style.md) +* [Versions](glossary/Versions.md) diff --git a/glossary-Classes.md b/glossary/Classes.md similarity index 100% rename from glossary-Classes.md rename to glossary/Classes.md diff --git a/glossary-Concepts.md b/glossary/Concepts.md similarity index 100% rename from glossary-Concepts.md rename to glossary/Concepts.md diff --git a/glossary-Structures.md b/glossary/Structures.md similarity index 100% rename from glossary-Structures.md rename to glossary/Structures.md diff --git a/glossary-Style.md b/glossary/Style.md similarity index 100% rename from glossary-Style.md rename to glossary/Style.md diff --git a/glossary-Versions.md b/glossary/Versions.md similarity index 100% rename from glossary-Versions.md rename to glossary/Versions.md diff --git a/lang.md b/language.md similarity index 94% rename from lang.md rename to language.md index 26e5895..9978e8e 100644 --- a/lang.md +++ b/language.md @@ -127,15 +127,15 @@ Finally, here is a table of contents for each language element: -* [Classes](lang-Classes.md) -* [Constants](lang-Constants.md) -* [Enumerations](lang-Enumerations.md) -* [Expressions](lang-Expressions.md) -* [Members](lang-Members.md) -* [Methods](lang-Methods.md) -* [Statements](lang-Statements.md) -* [Structures](lang-Structures.md) -* [Types](lang-Types.md) +* [Classes](language/Classes.md) +* [Constants](language/Constants.md) +* [Enumerations](language/Enumerations.md) +* [Expressions](language/Expressions.md) +* [Members](language/Members.md) +* [Methods](language/Methods.md) +* [Statements](language/Statements.md) +* [Structures](language/Structures.md) +* [Types](language/Types.md) diff --git a/lang-Classes.md b/language/Classes.md similarity index 100% rename from lang-Classes.md rename to language/Classes.md diff --git a/lang-Constants.md b/language/Constants.md similarity index 100% rename from lang-Constants.md rename to language/Constants.md diff --git a/lang-Enumerations.md b/language/Enumerations.md similarity index 100% rename from lang-Enumerations.md rename to language/Enumerations.md diff --git a/lang-Expressions.md b/language/Expressions.md similarity index 100% rename from lang-Expressions.md rename to language/Expressions.md diff --git a/lang-Members.md b/language/Members.md similarity index 100% rename from lang-Members.md rename to language/Members.md diff --git a/lang-Methods.md b/language/Methods.md similarity index 100% rename from lang-Methods.md rename to language/Methods.md diff --git a/lang-Statements.md b/language/Statements.md similarity index 100% rename from lang-Statements.md rename to language/Statements.md diff --git a/lang-Structures.md b/language/Structures.md similarity index 100% rename from lang-Structures.md rename to language/Structures.md diff --git a/lang-Types.md b/language/Types.md similarity index 100% rename from lang-Types.md rename to language/Types.md diff --git a/tools/tocgen.rb b/tools/tocgen.rb index 6b67d52..64866d5 100755 --- a/tools/tocgen.rb +++ b/tools/tocgen.rb @@ -3,55 +3,62 @@ ## By Alison Sanderson. Attribution is encouraged, though not required. ## ## 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 - res = [] - for m in $d.map{|p| p.match r}.compact - res << "* [#{m[1]}](#{m[0]})" - end - res.join ?\n + for md_file in files + links << "* [#{md_file[1]}](#{md_file[0]})" + end + + links.sort.join ?\n end -def find_toc_areas f - re = /^()(?:.|\n)*?()/i - f.to_enum(:scan, re).map{$~} +TOC_REGEX = /^()(?:.|\n)*?()/i +def find_inter_toc_areas file + file.to_enum(:scan, TOC_REGEX).map do $~ end end -def filter_toc_areas f - o = String.new - lof = 0 - for area in find_toc_areas f - of = area.offset 0 - o << f[lof...of[0]] - o << area[1] - o << "\n\n" - o << filter_emit(yield area[2]) - o << "\n\n" - o << area[3] - lof = of[1] - end - o << f[lof..-1] - o +def filter_toc_areas file + content = "" + last_offset = 0 + + for area in find_inter_toc_areas file + offset = area.offset 0 + content << file[last_offset...offset[0]] + content << area[1] + content << "\n\n" + content << emit_filtered_file_toc(yield area[2]) + content << "\n\n" + content << area[3] + last_offset = offset[1] + end + + content << file[last_offset..-1] + content end -def rewrite fnam - f = File.read fnam - o = yield f - File.write fnam, o +def rewrite filename + file = File.read filename + output = yield file + File.write filename, output end -rewrite "api.md" do |f| - filter_toc_areas f do |a| /api-#{a}-(\w+).md/ end +ALL_MD_FILES = Dir["{api,glossary,language}/**/*.md"] + +rewrite "api.md" do |file| + filter_toc_areas file do |folder| /api\/#{folder}\/(\w+).md/ end end -rewrite "glossary.md" do |f| - filter_toc_areas f do |a| /glossary-(\w+).md/ end +rewrite "glossary.md" do |file| + filter_toc_areas file do |_| /glossary\/(\w+).md/ end end -rewrite "lang.md" do |f| - filter_toc_areas f do |a| /lang-(\w+).md/ end +rewrite "language.md" do |file| + filter_toc_areas file do |_| /language\/(\w+).md/ end end ## EOF diff --git a/tools/treegen.rb b/tools/treegen.rb index 34e04e3..4516831 100755 --- a/tools/treegen.rb +++ b/tools/treegen.rb @@ -4,51 +4,51 @@ ## ## TreeGen: Generates the glossary files for classes. ## Example usage: -## tools/treegen.rb \ +## tools/treegen.rb \ ## '/mnt/g/Archive/gzdoom-g4.1.0/wadsrc/static/zscript/**/*.zs' \ ## 4.1.0 require "./tools/zsclasstree.rb" -DIR = ARGV.shift -VER = ARGV.shift +FILES = ARGV.shift +VERSION = ARGV.shift -si = ClassSiphon.new DIR +siphon = ClassSiphon.new FILES -f = open "glossary-Classes.md", "wb" -f.puts <<_end_ +file = open "glossary-Classes.md", "wb" +file.puts <<_end_ # Classes -Here is a full tree of all classes in ZScript as of GZDoom #{VER}. There are -#{si.classes.count + 1} classes total. +Here is a full tree of all classes in ZScript as of GZDoom #{VERSION}. There +are #{siphon.classes.count + 1} classes total. ``` Object _end_ -si.print_classes f +siphon.print_classes file -f.puts <<_end_ +file.puts <<_end_ ``` _end_ -f = open "glossary-Structures.md", "wb" -f.puts <<_end_ +file = open "glossary-Structures.md", "wb" +file.puts <<_end_ # Structures -Here is a full list of all structures in ZScript as of GZDoom #{VER}. There are -#{si.structs.count} structures total. Note that some of these are merely -implementation details and should not be used in code. +Here is a full list of all structures in ZScript as of GZDoom #{VERSION}. +There are #{siphon.structs.count} structures total. Note that some of these +are merely implementation details and should not be used in code. ``` Struct _end_ -si.print_structs f +siphon.print_structs file -f.puts <<_end_ +file.puts <<_end_ ``` diff --git a/tools/zsclasstree.rb b/tools/zsclasstree.rb index fb2767d..1aaf34a 100755 --- a/tools/zsclasstree.rb +++ b/tools/zsclasstree.rb @@ -11,101 +11,101 @@ require 'set' class ClassSiphon - attr_reader :structs, :classes, :clstree, :strtree, :caps + attr_reader :structs, :classes, :clstree, :strtree, :caps - def initialize dirs - @subcls = {} - @classes = Set[] - @structs = Set[] - @caps = {} + def initialize dirs + @subcls = {} + @classes = Set[] + @structs = Set[] + @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"] - @strtree = @structs.map {|type| [type, nil]} + @clstree = make_tree "OBJECT", @subcls["OBJECT"] + @strtree = @structs.map {|type| [type, nil]} - @classes.freeze - @structs.freeze - @clstree.freeze - @strtree.freeze - @caps.freeze - end + @classes.freeze + @structs.freeze + @clstree.freeze + @strtree.freeze + @caps.freeze + end - def print_classes out, filter = [] - print_tree out, filter, "OBJECT", clstree - end + def print_classes out, filter = [] + print_tree out, filter, "OBJECT", clstree + end - def print_structs out, filter = [] - print_tree out, filter, "STRUCT", strtree - end + def print_structs out, filter = [] + print_tree out, filter, "STRUCT", strtree + end - private - def add_class m - ctype = m[0] .strip - cbase = (m[1] or "Object").strip - type = ctype.upcase - base = cbase.upcase - @caps[type] = ctype - @caps[base] = cbase + private + def add_class m + ctype = m[0] .strip + cbase = (m[1] or "Object").strip + type = ctype.upcase + base = cbase.upcase + @caps[type] = ctype + @caps[base] = cbase - if base != type - if @subcls[base] - @subcls[base] << type - else - @subcls[base] = [type] - end - raise "duplicate class #{type}" if @classes === type - @classes << type - end - end + if base != type + if @subcls[base] + @subcls[base] << type + else + @subcls[base] = [type] + end + raise "duplicate class #{type}" if @classes === type + @classes << type + end + end - def add_struct m - ctype = m[0] - type = ctype.upcase - @caps[type] = ctype - @structs << type - end + def add_struct m + ctype = m[0] + type = ctype.upcase + @caps[type] = ctype + @structs << type + end - def proc_file f - f.gsub! /\/\*(?!\*\/)+\*\//m, "" - f.gsub! /\/\/.+/, "" - f.scan(/^class\s*(\w*)[\s\w]+(?::\s+(\w*))?/).each {|m| add_class m} - f.scan(/^struct\s*(\w*)/) .each {|m| add_struct m} - end + def proc_file f + f.gsub! /\/\*(?!\*\/)+\*\//m, "" + f.gsub! /\/\/.+/, "" + f.scan(/^class\s*(\w*)[\s\w]+(?::\s+(\w*))?/).each {|m| add_class m} + f.scan(/^struct\s*(\w*)/) .each {|m| add_struct m} + end - # work our way down the subclasses recursively, making them into a tree structure - def make_tree bcl, subs - return nil unless subs - node = {} - subs.each do |cl| node[cl] = make_tree cl, @subcls[cl] end - node - end + # work our way down the subclasses recursively, making them into a tree structure + def make_tree bcl, subs + return nil unless subs + node = {} + subs.each do |cl| node[cl] = make_tree cl, @subcls[cl] end + node + end - def print_tree out, filter, base, tree, tab = "" - return if !tree or filter.include? base + def print_tree out, filter, base, tree, tab = "" + return if !tree or filter.include? base - tree = tree.map do |type, base| [type, base] end - tree.sort! + tree = tree.map do |type, base| [type, base] end + tree.sort! - for type, base in tree - last = type == tree[-1][0] - sep = last ? "└ " : "├ " - nxt = last ? " " : "│ " + for type, base in tree + last = type == tree[-1][0] + sep = last ? "└ " : "├ " + nxt = last ? " " : "│ " - out.puts tab + sep + @caps[type] + out.puts tab + sep + @caps[type] - print_tree out, filter, type, base, tab + nxt - end - end + print_tree out, filter, type, base, tab + nxt + end + end end if __FILE__ == $0 - in_dirs = ARGV.shift - filters = ARGV + in_dirs = ARGV.shift + filters = ARGV - si = ClassSiphon.new in_dirs - puts "Object"; si.print_classes STDOUT, filters - puts "Struct"; si.print_structs STDOUT, filters + si = ClassSiphon.new in_dirs + puts "Object"; si.print_classes STDOUT, filters + puts "Struct"; si.print_structs STDOUT, filters end ## EOF