colorful rat Ratfactor.com > Dave's Repos

zstd-browse2

Turns the Zig standard library into an HTML mini-site.
git clone http://ratfactor.com/repos/zstd-browse2/zstd-browse2.git

zstd-browse2/makepage.rb

Download raw file: makepage.rb

1 #!/usr/bin/env ruby 2 3 fpath = ARGV[0] 4 fname_rel = ARGV[1] 5 6 # make relative link for root of "site" and shared CSS 7 root_rel_link = '../' * fname_rel.count('/') 8 9 puts <<HTML 10 <!DOCTYPE html> 11 <html lang="en"> 12 <head> 13 <meta charset="utf-8"> 14 <meta name="viewport" content="width=device-width, initial-scale=1"> 15 <title>#{fname_rel} - Zig standard library</title> 16 <link rel="stylesheet" href="#{root_rel_link}styles.css"> 17 </head> 18 <body> 19 <table><tbody> 20 <tr><td class="doc"> 21 <h1> 22 <a href="index.html"><img src="#{root_rel_link}zig-stdlib-book.svg" alt="" width="60"> zig/lib/std</a> / 23 #{fname_rel} 24 </h1> 25 HTML 26 27 # used to collect documentation comments, line-by-line 28 doc_comment = nil 29 30 # we always start the page in the documentation column 31 in_code_block = false 32 33 def new_chunk(extra_class='') 34 puts '</pre></td></tr>' # end code block 35 puts "<tr><td class=\"doc #{extra_class}\">" 36 end 37 38 File.read(fpath).each_line do |line| 39 # Doc comment (/// or //!), we must gather it! 40 if comment = line.match(/^\s*\/{2}[!\/](.*)$/) 41 comment = comment[1] 42 if comment.match?(/^\s*$/) 43 comment = "<br><br>" 44 end 45 46 # replace all `foo` with <code>foo</code> 47 comment.gsub!(/`([^`]+)`/, '<code>\1</code>') 48 49 if doc_comment 50 doc_comment += comment 51 else 52 doc_comment = comment 53 end 54 55 next 56 end 57 58 # When we encounter a special document thing, we'll store it here. 59 my_special_thing = nil 60 61 # This is will just be used as a CSS class name for formatting. Blank 62 # means default formatting. 63 my_chunk_type = "" 64 65 # Detect Special Documentation Stuff and Print 'Em! 66 # -------------------------------------------------------------------------- 67 68 # pub const 69 if name = line.match(/^pub const (\w+)/) 70 my_chunk_type = 'value' 71 72 my_special_thing = "<h2>#{name[1]}</h2>" 73 74 if fname = line.match(/@import\("(.*zig)"\)/) 75 my_special_thing += "<a href=\"#{fname[1]}.html\">#{fname[1]}</a>" 76 end 77 end 78 79 # pub fn 80 if name = line.match(/^pub( inline)? fn (\w+)/) 81 my_special_thing = "<h2>#{name[2]}()</h2>" 82 end 83 84 # struct/enum method pub fn 85 if name = line.match(/^\s+pub( inline)? fn (\w+)/) 86 my_chunk_type = 'method' 87 my_special_thing = "<h2>#{name[2]}()</h2>" 88 end 89 90 # test with "string" description 91 if name = line.match(/^\s*test "(.*)" {$/) 92 my_chunk_type = 'test-str' 93 my_special_thing = "<h2>Test:</h2><h3>#{name[1]}</h3>" 94 end 95 96 # test with Decl description 97 if name = line.match(/^\s*test (\w+) {$/) 98 my_chunk_type = 'test-decl' 99 my_special_thing = "<h2>Test: #{name[1]}</h2>" 100 end 101 102 # Print any non-comment thing detected above 103 if my_special_thing 104 if in_code_block 105 puts '</pre></td></tr>' # end code block 106 puts "<tr><td class=\"doc #{my_chunk_type}\">" 107 end 108 109 puts my_special_thing 110 111 if doc_comment 112 puts "<p>#{doc_comment}</p>" 113 doc_comment = nil 114 end 115 116 in_code_block = false 117 end 118 119 # Everything Else is Code! 120 # -------------------------------------------------------------------------- 121 if !in_code_block 122 in_code_block = true 123 124 if doc_comment 125 puts "<p>#{doc_comment}</p>" 126 doc_comment = nil 127 end 128 129 puts '</td>' #end the doc cell 130 puts '<td class="code"><pre>' 131 end 132 133 # the actual line of source! 134 puts line 135 end 136 137 # end final code block and footer it up! 138 puts <<HTML 139 </pre></td></tr> 140 <tr><td class="doc" id="footer"> 141 Generated by <a href="http://ratfactor.com/repos/zstd-browse2/">zstd-browse2</a> 142 on #{Time.now}. 143 </td><td class="code"></td></tr> 144 </tbody></table> 145 </body> 146 </html> 147 HTML