- 论坛徽章:
- 0
|
利用JavaDoc制作windows的CHM文档
使用了开源的一个ruby脚本来利用JavaDoc制作windows的CHM文档。
输出文件编码的时候一定记得选择中文,例如file.puts "Language=0x804 Chinese"。
Ruby代码- 1.def createProjectFile(prjname, basedir)
- 2.
- 3. packages = scanPackageTree(basedir)
- 4.
- 5. createContentsFile(prjname+'.hhc', basedir, packages)
- 6. createIndexFile(prjname+'.hhk', basedir, packages)
- 7.
- 8. assetsexplise = /^$/
- 9. title = getIndexTitle(basedir)
- 10.
- 11. file = open(prjname+'.hhp', 'w')
- 12. file.puts "[OPTIONS]"
- 13. file.puts "Compatibility=1.1 or later"
- 14. file.puts "Compiled file=#{prjname}.chm"
- 15. file.puts "Contents file=#{prjname}.hhc"
- 16. file.puts "Default Window=default"
- 17. file.puts "Display compile progress=Yes"
- 18. file.puts "Default topic=#{basedir}/overview-summary.html"
- 19. file.puts "Full-text search=Yes"
- 20. file.puts "Index file=#{prjname}.hhk"
- 21. # file.puts "Language=0x411 Japanese"
- 22. file.puts "Language=0x409 English (U.S.)"
- 23. # file.puts "Language=0x804 Chinese"
- 24. file.puts "Title=#{title}"
- 25. file.puts ""
- 26. file.puts "[WINDOWS]"
- 27. file.puts "default=\"#{title}\",\"#{prjname}.hhc\",\"#{prjname}.hhk\",\"#{basedir}/overview-summary.html\",\"#{basedir}/overview-summary.html\",,,,,0x2520,,0x384e,,,,,,,,0"
- 28. file.puts ""
- 29. file.puts ""
- 30. file.puts "[FILES]"
- 31. collectAssets(basedir, assetsexplise).each() do |path|
- 32. file.puts(path)
- 33. end
- 34. file.puts ""
- 35. file.close()
- 36.end
- 37.
- 38.def getIndexTitle(basedir)
- 39. title = ""
- 40. open(basedir + '/index.html', 'r') do |fh|
- 41. fh.read() =~ /\<title\>\n*(.+?)\n*\<\/title\>/i
- 42. title = $1
- 43. end
- 44. return title
- 45.end
- 46.
- 47.def collectAssets(assetsdir, assetsexplise)
- 48. assets = []
- 49. Dir.foreach(assetsdir) do |asset|
- 50. assetpath = assetsdir + '/' + asset
- 51. if File.stat(assetpath).ftype == 'file' then
- 52. assets.push(assetpath) unless assetsexplise =~ assetpath
- 53. elsif File.stat(assetpath).ftype == 'directory' and asset[0,1] != '.' then
- 54. assets.concat(collectAssets(assetpath, assetsexplise))
- 55. end
- 56. end
- 57. return assets
- 58.end
- 59.
- 60.HEADER = '<HTML><HEAD><meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1"><!-- Sitemap 1.0 --></HEAD><BODY><OBJECT type="text/site properties"></OBJECT>'
- 61.FOOTER = '</BODY></HTML>'
- 62.
- 63.def createContentsFile(filename, basedir, packages)
- 64.
- 65. file = open(filename, 'w')
- 66. file.puts HEADER
- 67.
- 68. file.puts "[list]"
- 69. file.puts "\t" + '<LI> <OBJECT type="text/sitemap">'
- 70. file.puts "\t" * 2 + '<param name="Name" value="Overview">'
- 71. file.puts "\t" * 2 + '<param name="Local" value="' + basedir + '/overview-summary.html">'
- 72. file.puts "\t" * 2 + '<param name="ImageNumber" value="21">'
- 73. file.puts "\t" * 2 + '</OBJECT>'
- 74.
- 75. packages.each() do |pkg|
- 76. file.puts "\t" + formatTopicItem(pkg['name'], basedir+'/'+pkg['file'])
- 77. file.puts "\t" * 1 + "[list]"
- 78. pkg['classes'].each() do |cls|
- 79. file.puts "\t" * 2 + formatTopicItem(cls['name'], basedir+'/'+cls['file'])
- 80. file.puts "\t" * 2 + "[list]"
- 81. cls['details'].each() do |det|
- 82. file.puts "\t" * 3 + formatTopicItem(det, basedir+'/'+cls['file']+'#'+det)
- 83. end
- 84. file.puts "\t" * 2 + "[/list]"
- 85. end
- 86. file.puts "\t" * 1 + "[/list]"
- 87. end
- 88. file.puts "[/list]"
- 89.
- 90. file.puts FOOTER
- 91. file.close()
- 92.end
- 93.
- 94.def createIndexFile(filename, basedir, packages)
- 95.
- 96. file = open(filename, 'w')
- 97. file.puts HEADER
- 98.
- 99. indexes = {}
- 100. packages.each() do |pkg|
- 101. addKeywordToIndex(indexes, pkg['name'], pkg['name'], basedir+'/'+pkg['file'])
- 102. pkg['classes'].each() do |cls|
- 103. addKeywordToIndex(indexes, cls['name'], pkg['name']+'.'+cls['name'], basedir+'/'+cls['file'])
- 104. cls['details'].each() do |det|
- 105. addKeywordToIndex(indexes, det, pkg['name']+'.'+cls['name']+'.'+det, basedir+'/'+cls['file']+'#'+det)
- 106. end
- 107. end
- 108. end
- 109.
- 110. file.puts "[list]"
- 111. indexes.keys.sort.each() do |keyword|
- 112. file.puts "\t" + formatIndexItem(keyword, indexes[keyword])
- 113. end
- 114. file.puts "[/list]"
- 115.
- 116. file.puts FOOTER
- 117. file.close()
- 118.end
- 119.
- 120.def addKeywordToIndex(indexes, keyword, detail, file)
- 121. if indexes[keyword] == nil then indexes[keyword] = {} end
- 122. indexes[keyword][detail] = file
- 123.end
- 124.
- 125.
- 126.def scanPackageTree(basedir)
- 127. packagelist = []
- 128. rxpkg = /\<A\s+HREF\=\"([\w\d\-\/]+?)\/package\-frame\.html\"\s+target\=\"packageFrame\"\>([\w\d\.]+)\<\/A\>/i
- 129. rxcls = /\<A\s+HREF\=\"([^\.][\w\d\-\.]+?)\"(\s+title\=\".+\")?\s+target\=\"classFrame\"\>(\<I\>)?([\w\d\.]+)(\<\/I\>)?\<\/A\>/i
- 130.
- 131. IO.foreach(basedir + "/overview-frame.html") do | line |
- 132. if (line =~ rxpkg) != nil then
- 133. pkgdir = $1
- 134. pkgname = $2
- 135. print "#{pkgname}\n"
- 136. classes = []
- 137. IO.foreach(basedir + '/' + pkgdir + '/package-frame.html') do | line |
- 138. if (line =~ rxcls) != nil then
- 139. classfile = $1
- 140. classname = $4
- 141. print "#{pkgname}.#{classname}\n"
- 142. details = scanClassDocument(basedir+'/'+pkgdir+'/'+classfile)
- 143. classes.push({'name'=>classname, 'file'=>pkgdir+'/'+classfile, 'details'=>details})
- 144. end
- 145. end
- 146. pkgfile = pkgdir + '/package-summary.html'
- 147. packagelist.push({'name'=>pkgname, 'file'=>pkgfile, 'classes'=>classes})
- 148. end
- 149. end
- 150. return packagelist
- 151.end
- 152.
- 153.def scanClassDocument(file)
- 154. scanstarts = false
- 155. anchors = []
- 156. IO.foreach(file) do |line|
- 157. if (line =~ /\<A\s+NAME\=\"([^\"]+)\"\>/i) != nil then
- 158. aname = $1
- 159. if (aname =~ /\w+_detail$/i) != nil then
- 160. scanstarts = true
- 161. elsif (aname =~ /^navbar_\w+/i) != nil then
- 162. scanstarts = false
- 163. else
- 164. if scanstarts then
- 165. anchors.push(aname)
- 166. end
- 167. end
- 168. end
- 169. end
- 170. return anchors
- 171.end
- 172.
- 173.def formatTopicItem(name, href)
- 174. out = '<LI><OBJECT type="text/sitemap">'
- 175. out += sprintf('<param name="Name" value="%s">', name)
- 176. if href != nil then
- 177. out += sprintf('<param name="Local" value="%s">', href)
- 178. end
- 179. out += "</OBJECT>"
- 180. return out
- 181.end
- 182.
- 183.def formatIndexItem(name, details)
- 184. out = '<LI><OBJECT type="text/sitemap">'
- 185. out += sprintf('<param name="Name" value="%s">', name)
- 186. details.keys.each() do |det|
- 187. out += sprintf('<param name="Name" value="%s">', det)
- 188. out += sprintf('<param name="Local" value="%s">', details[det])
- 189. end
- 190. out += "</OBJECT>"
- 191. return out
- 192.end
- 193.
- 194.createProjectFile(ARGV[0], ARGV[1])
复制代码 将JavaDoc的根目录拷贝到ruby脚本所在的目录下,这样会避免相对路径的问题,脚本里面处理得不好。安装好ruby环境(因为兼容性的问题,推荐使用ruby1.8)之后,执行命令ruby createhhp.rb <help-file-basename> <javadoc-dir>,会在当前目录下生产hhc(目录)、hhk(索引)、hhp(项目)这三个文件。
|
|