使用了开源的一个ruby脚本来利用JavaDoc制作windows的CHM文档。
输出文件编码的时候一定记得选择中文,例如file.puts "Language=0x804 Chinese"。
def createProjectFile(prjname, basedir)
packages = scanPackageTree(basedir)
createContentsFile(prjname+'.hhc', basedir, packages)
createIndexFile(prjname+'.hhk', basedir, packages)
assetsexplise = /^$/
title = getIndexTitle(basedir)
file = open(prjname+'.hhp', 'w')
file.puts "[OPTIONS]"
file.puts "Compatibility=1.1 or later"
file.puts "Compiled file=#{prjname}.chm"
file.puts "Contents file=#{prjname}.hhc"
file.puts "Default Window=default"
file.puts "Display compile progress=Yes"
file.puts "Default topic=#{basedir}/overview-summary.html"
file.puts "Full-text search=Yes"
file.puts "Index file=#{prjname}.hhk"
# file.puts "Language=0x411 Japanese"
file.puts "Language=0x409 English (U.S.)"
# file.puts "Language=0x804 Chinese"
file.puts "Title=#{title}"
file.puts ""
file.puts "[WINDOWS]"
file.puts "default=\"#{title}\",\"#{prjname}.hhc\",\"#{prjname}.hhk\",\"#{basedir}/overview-summary.html\",\"#{basedir}/overview-summary.html\",,,,,0x2520,,0x384e,,,,,,,,0"
file.puts ""
file.puts ""
file.puts "[FILES]"
collectAssets(basedir, assetsexplise).each() do |path|
file.puts(path)
end
file.puts ""
file.close()
end
def getIndexTitle(basedir)
title = ""
open(basedir + '/index.html', 'r') do |fh|
fh.read() =~ /\<title\>\n*(.+?)\n*\<\/title\>/i
title = $1
end
return title
end
def collectAssets(assetsdir, assetsexplise)
assets = []
Dir.foreach(assetsdir) do |asset|
assetpath = assetsdir + '/' + asset
if File.stat(assetpath).ftype == 'file' then
assets.push(assetpath) unless assetsexplise =~ assetpath
elsif File.stat(assetpath).ftype == 'directory' and asset[0,1] != '.' then
assets.concat(collectAssets(assetpath, assetsexplise))
end
end
return assets
end
HEADER = '<HTML><HEAD><meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1"><!-- Sitemap 1.0 --></HEAD><BODY><OBJECT type="text/site properties"></OBJECT>'
FOOTER = '</BODY></HTML>'
def createContentsFile(filename, basedir, packages)
file = open(filename, 'w')
file.puts HEADER
file.puts "[list]"
file.puts "\t" + '<LI> <OBJECT type="text/sitemap">'
file.puts "\t" * 2 + '<param name="Name" value="Overview">'
file.puts "\t" * 2 + '<param name="Local" value="' + basedir + '/overview-summary.html">'
file.puts "\t" * 2 + '<param name="ImageNumber" value="21">'
file.puts "\t" * 2 + '</OBJECT>'
packages.each() do |pkg|
file.puts "\t" + formatTopicItem(pkg['name'], basedir+'/'+pkg['file'])
file.puts "\t" * 1 + "[list]"
pkg['classes'].each() do |cls|
file.puts "\t" * 2 + formatTopicItem(cls['name'], basedir+'/'+cls['file'])
file.puts "\t" * 2 + "[list]"
cls['details'].each() do |det|
file.puts "\t" * 3 + formatTopicItem(det, basedir+'/'+cls['file']+'#'+det)
end
file.puts "\t" * 2 + "[/list]"
end
file.puts "\t" * 1 + "[/list]"
end
file.puts "[/list]"
file.puts FOOTER
file.close()
end
def createIndexFile(filename, basedir, packages)
file = open(filename, 'w')
file.puts HEADER
indexes = {}
packages.each() do |pkg|
addKeywordToIndex(indexes, pkg['name'], pkg['name'], basedir+'/'+pkg['file'])
pkg['classes'].each() do |cls|
addKeywordToIndex(indexes, cls['name'], pkg['name']+'.'+cls['name'], basedir+'/'+cls['file'])
cls['details'].each() do |det|
addKeywordToIndex(indexes, det, pkg['name']+'.'+cls['name']+'.'+det, basedir+'/'+cls['file']+'#'+det)
end
end
end
file.puts "[list]"
indexes.keys.sort.each() do |keyword|
file.puts "\t" + formatIndexItem(keyword, indexes[keyword])
end
file.puts "[/list]"
file.puts FOOTER
file.close()
end
def addKeywordToIndex(indexes, keyword, detail, file)
if indexes[keyword] == nil then indexes[keyword] = {} end
indexes[keyword][detail] = file
end
def scanPackageTree(basedir)
packagelist = []
rxpkg = /\<A\s+HREF\=\"([\w\d\-\/]+?)\/package\-frame\.html\"\s+target\=\"packageFrame\"\>([\w\d\.]+)\<\/A\>/i
rxcls = /\<A\s+HREF\=\"([^\.][\w\d\-\.]+?)\"(\s+title\=\".+\")?\s+target\=\"classFrame\"\>(\<I\>)?([\w\d\.]+)(\<\/I\>)?\<\/A\>/i
IO.foreach(basedir + "/overview-frame.html") do | line |
if (line =~ rxpkg) != nil then
pkgdir = $1
pkgname = $2
print "#{pkgname}\n"
classes = []
IO.foreach(basedir + '/' + pkgdir + '/package-frame.html') do | line |
if (line =~ rxcls) != nil then
classfile = $1
classname = $4
print "#{pkgname}.#{classname}\n"
details = scanClassDocument(basedir+'/'+pkgdir+'/'+classfile)
classes.push({'name'=>classname, 'file'=>pkgdir+'/'+classfile, 'details'=>details})
end
end
pkgfile = pkgdir + '/package-summary.html'
packagelist.push({'name'=>pkgname, 'file'=>pkgfile, 'classes'=>classes})
end
end
return packagelist
end
def scanClassDocument(file)
scanstarts = false
anchors = []
IO.foreach(file) do |line|
if (line =~ /\<A\s+NAME\=\"([^\"]+)\"\>/i) != nil then
aname = $1
if (aname =~ /\w+_detail$/i) != nil then
scanstarts = true
elsif (aname =~ /^navbar_\w+/i) != nil then
scanstarts = false
else
if scanstarts then
anchors.push(aname)
end
end
end
end
return anchors
end
def formatTopicItem(name, href)
out = '<LI><OBJECT type="text/sitemap">'
out += sprintf('<param name="Name" value="%s">', name)
if href != nil then
out += sprintf('<param name="Local" value="%s">', href)
end
out += "</OBJECT>"
return out
end
def formatIndexItem(name, details)
out = '<LI><OBJECT type="text/sitemap">'
out += sprintf('<param name="Name" value="%s">', name)
details.keys.each() do |det|
out += sprintf('<param name="Name" value="%s">', det)
out += sprintf('<param name="Local" value="%s">', details[det])
end
out += "</OBJECT>"
return out
end
createProjectFile(ARGV[0], ARGV[1])
将JavaDoc的根目录拷贝到ruby脚本所在的目录下,这样会避免相对路径的问题,脚本里面处理得不好。安装好ruby环境(
因为兼容性的问题,推荐使用ruby1.8)之后,执行命令ruby createhhp.rb <help-file-basename> <javadoc-dir>,会在当前目录下生产hhc(目录)、hhk(索引)、hhp(项目)这三个文件。
记得去微软的官方站下载HTML Help Workshop。用HTML Help Workshop打开hhp文件就可以编译出正确的CHM文档。
分享到:
相关推荐
在生成HTML文档后,如果你想要将这些JavaDoc文档转化为CHM(Microsoft编译的帮助文件)格式,这是一种常见的离线帮助系统,通常在Windows环境中使用。CHM文件是压缩的,包含索引和搜索功能,使得用户能快速找到所需...
在实际应用中,转换`Javadoc`为`CHM`可以帮助Java开发团队提供更便捷的本地化帮助文档,特别是对于Windows平台的用户。`CHM`文件体积小、查找快速,使得用户能迅速定位到所需的信息,提高了工作效率。同时,`CHM`的...
本篇文章将深入探讨如何将`Javadoc`转换为`CHM`格式,以满足Windows平台用户的阅读需求。 首先,我们可以使用开源工具`jd2chm`进行转换。`jd2chm.exe`就是这个工具的执行程序,它是基于Java编写的,可以从`jd2chm_...
HTML制作CHM(Compiled Help Manual)是将HTML文件转换成Windows平台下的帮助文档格式,这种格式通常用于软件的帮助系统。CHM文件具有小巧、搜索功能强大、易于分发等特点。在本压缩包中,提供了两个关键工具:...
Eclipse,作为一款强大的Java开发集成环境,也提供了生成CHM文档的功能。本篇文章将详细讲解如何利用Eclipse来制作CHM帮助文档,同时会涉及到与源码和工具相关的知识点。 首先,我们需要了解Eclipse的JavaDoc功能。...
2. **jd2chm.exe**:这可能是一个名为“JavaDoc to CHM”的工具,它能将JavaDoc格式的API文档转换成CHM格式,方便在Windows环境中查看。JavaDoc是一种用于生成API文档的标准化工具,将注释从Java源代码中提取出来并...
在本文中,我们将深入探讨如何通过工具进行CHM文档的制作,特别是利用jd2chm.exe这个工具。 首先,了解CHM文件的结构是必要的。CHM文件由索引、目录、HTML内容和资源文件组成。这些元素共同构建了一个功能完善的...
在制作CHM文档时,首先需要确保已下载并安装了“javadoc2chm”软件,然后按照软件的使用说明,将“javaee-api-8.0-javadoc”目录作为输入源,生成的CHM文件可以方便地在开发过程中随时查阅JavaEE 8.0的API详情。...
HTMLHelp.exe 和 jd2chm....结合这个文档,你可以深入学习如何有效地利用这两个工具来创建高质量的CHM帮助文件。通过实践和研究,你将能够熟练掌握创建专业级帮助文档的技能,这对于软件开发和文档编写工作至关重要。
本文将深入探讨“doc转换工具”,重点介绍CHM文档生成和JAVADOC转换的相关知识。 首先,CHM(Compiled Help Manual)是微软推出的一种帮助文件格式,它将HTML文件编译成单一的离线文件,方便用户查阅和检索。CHM...
CHM文件是一种Windows的帮助文件格式,里面包含了丰富的文本、图像和索引,便于用户查阅Doxygen的使用方法、配置选项以及如何进行最佳实践。通过阅读这个手册,开发者可以深入理解Doxygen的各项功能,掌握如何有效地...