免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3139 | 回复: 1
打印 上一主题 下一主题

利用JavaDoc制作windows的CHM文档 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-12 21:17 |只看该作者 |倒序浏览

利用JavaDoc制作windows的CHM文档









使用了开源的一个ruby脚本来利用JavaDoc制作windows的CHM文档。

输出文件编码的时候一定记得选择中文,例如file.puts "Language=0x804 Chinese"。



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

论坛徽章:
0
2 [报告]
发表于 2012-03-12 21:18 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP