`
cutesunshineriver
  • 浏览: 200492 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

利用JavaDoc制作windows的CHM文档

阅读更多
使用了开源的一个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&reg; 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文档。
0
0
分享到:
评论
1 楼 winse 2012-03-16  

相关推荐

    javadoc制作chm的两个工具

    在生成HTML文档后,如果你想要将这些JavaDoc文档转化为CHM(Microsoft编译的帮助文件)格式,这是一种常见的离线帮助系统,通常在Windows环境中使用。CHM文件是压缩的,包含索引和搜索功能,使得用户能快速找到所需...

    javadoc转换chm帮助文档

    在实际应用中,转换`Javadoc`为`CHM`可以帮助Java开发团队提供更便捷的本地化帮助文档,特别是对于Windows平台的用户。`CHM`文件体积小、查找快速,使得用户能迅速定位到所需的信息,提高了工作效率。同时,`CHM`的...

    Javadoc转换chm帮助文档的四种方法总结

    本篇文章将深入探讨如何将`Javadoc`转换为`CHM`格式,以满足Windows平台用户的阅读需求。 首先,我们可以使用开源工具`jd2chm`进行转换。`jd2chm.exe`就是这个工具的执行程序,它是基于Java编写的,可以从`jd2chm_...

    html制作chm

    HTML制作CHM(Compiled Help Manual)是将HTML文件转换成Windows平台下的帮助文档格式,这种格式通常用于软件的帮助系统。CHM文件具有小巧、搜索功能强大、易于分发等特点。在本压缩包中,提供了两个关键工具:...

    使用Eclipse生成CHM帮助文档(图解)

    Eclipse,作为一款强大的Java开发集成环境,也提供了生成CHM文档的功能。本篇文章将详细讲解如何利用Eclipse来制作CHM帮助文档,同时会涉及到与源码和工具相关的知识点。 首先,我们需要了解Eclipse的JavaDoc功能。...

    chm

    2. **jd2chm.exe**:这可能是一个名为“JavaDoc to CHM”的工具,它能将JavaDoc格式的API文档转换成CHM格式,方便在Windows环境中查看。JavaDoc是一种用于生成API文档的标准化工具,将注释从Java源代码中提取出来并...

    DIY CHM文档

    在本文中,我们将深入探讨如何通过工具进行CHM文档的制作,特别是利用jd2chm.exe这个工具。 首先,了解CHM文件的结构是必要的。CHM文件由索引、目录、HTML内容和资源文件组成。这些元素共同构建了一个功能完善的...

    javaee-api-8.0-javadoc.zip

    在制作CHM文档时,首先需要确保已下载并安装了“javadoc2chm”软件,然后按照软件的使用说明,将“javaee-api-8.0-javadoc”目录作为输入源,生成的CHM文件可以方便地在开发过程中随时查阅JavaEE 8.0的API详情。...

    htmlhelp.exe

    HTMLHelp.exe 和 jd2chm....结合这个文档,你可以深入学习如何有效地利用这两个工具来创建高质量的CHM帮助文件。通过实践和研究,你将能够熟练掌握创建专业级帮助文档的技能,这对于软件开发和文档编写工作至关重要。

    doc转换工具!!!!

    本文将深入探讨“doc转换工具”,重点介绍CHM文档生成和JAVADOC转换的相关知识。 首先,CHM(Compiled Help Manual)是微软推出的一种帮助文件格式,它将HTML文件编译成单一的离线文件,方便用户查阅和检索。CHM...

    程序文档自动生成工具Doxygen使用手册

    CHM文件是一种Windows的帮助文件格式,里面包含了丰富的文本、图像和索引,便于用户查阅Doxygen的使用方法、配置选项以及如何进行最佳实践。通过阅读这个手册,开发者可以深入理解Doxygen的各项功能,掌握如何有效地...

Global site tag (gtag.js) - Google Analytics