December 09, 2011
Dear,
In first i do not know where put this message i hope here is good.
I have wrote a little python script for add D doc into devhelp
why python, because it is a little script and like is not need to be
build for use it. it is most easier for add this little tools to your
build system. why not a new target devehelp into your makefile :-)


-------------------------------------------------
#!/usr/bin/env python

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import getopt
import os
import sys
from subprocess import Popen, PIPE, STDOUT
from BeautifulSoup import BeautifulSoup, Tag

project_name        = ""
project_source_dir  = ""
author              = ""
prefix              = "/usr/share" # could be ~/.local/share
install_dir         = ""
name                = ""
keywords_content    = ""
index_html          = ""
devhelp_file        = ""
keywords_content    = ""
d_compiler          = "ldc2"
d_files             = ()
keywords            = []

def basename( file_path , with_extention = False):
    result = ""
    if( with_extention ):
        result = "".join( file_path.split( os.sep )[-1] )
    else:
        result = ".".join( file_path.split( os.sep )[-1].split( "."
)[0:-1] )
    return result

def finder( directory = "/", extentions = [] ):
    file_list  = []
    for dirname, dirnames, filenames in os.walk( directory ):
        for filename in filenames:
            f = os.path.join(dirname, filename)
            if f.split('.')[-1] in extentions:
                file_list.append( f )
    return tuple( file_list )

def usage():
    print "-h --help                        Display this message"
    print "-a --name=<author name>          Set author name"
    print "-c --compiler=<compiler name>    Set compiler default: ldc2"
    print "-n --name=<project name>         Set project name"
    print "-s --source=<source dir>         Set source dir to scan"
    print "-p --prefix=<prefix dir>         Set prefix path for to write
devhelp book default: /usr/share"

def main(argv):
    global author
    global d_compiler
    global project_name
    global project_source_dir
    global prefix
    try:
        opts, args = getopt.getopt(argv, "ha:c:n:s:p", ["help",
"--author=", "--compiler=", "name=", "source=", "prefix="])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-a", "--author="):
            author = arg
        elif opt in ("-c", "--compiler="):
            d_compiler = arg
        elif opt in ("-n", "--name="):
            project_name = arg
        elif opt in ("-s", "--source="):
            project_source_dir = arg
        elif opt in ("-p", "--prefix="):
            prefix = arg

def keyword_maker( doc_html_file ):
    global keywords
    html_content = []
    with open( doc_html_file, "r" ) as in_html:
        html_content = in_html.read()
    mySoup          = BeautifulSoup( html_content )
    dts             = mySoup.findAll( "dt" )
    for dt in dts:
        type_name = ""
        decl_name = ""
        if( dt.big is not None ):
            if( isinstance( dt.big.contents[0], Tag) ):
                type_name = dt.big.contents[0].text
            else:
                type_name = dt.big.contents[0]
            if( dt.big.u is not None ):
                decl_name =  dt.big.u.text
                link_html = basename( doc_html_file, with_extention =
True )
                keywords.append( [type_name, decl_name, link_html ] ) #
global burk



if __name__ == "__main__":
    # Parse command line
    main( sys.argv[1:] )
    # Use initialized var for set file and dir
    install_dir = os.path.join( prefix, "devhelp/books/", project_name )
    index_html  = os.path.join( install_dir, "index.html" )
    devhelp_file= os.path.join( install_dir, project_name + ".devhelp2"
)
    d_files     = finder( "/usr/include/d/std", ["d", "di"] )
    # create dir if do no exist
    if( not os.path.exists( install_dir ) ):
        os.mkdir( install_dir )
    with open( index_html, "w" ) as out_html,  open( devhelp_file, "w" )
as out_xml:
        # Add html header
        out_html.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">\n")
        out_html.write("\t<html>\n")
        out_html.write("\t<meta http-equiv=\"Content-Type\" content=
\"text/html; charset=UTF-8\">\n\n")
        out_html.write("\t\t<title>"+ project_name +"</title>\n")
        out_html.write("\t</meta>\n")
        out_html.write("\t<body>\n")
        # Add xml header
        out_xml.write("<?xml version=\"1.0\" encoding=\"utf-8\"
standalone=\"no\"?>\n")
        out_xml.write("<!DOCTYPE book PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\" \"\">\n")
        out_xml.write("<book xmlns=\"http://www.devhelp.net/book\"
title=\"%s\" link=\"index.html\" author=\"%s\" name=\"%s\" version=\"2\"
language=\"d\">\n" % (project_name, author, project_name) )
        out_xml.write("\t<chapters>\n")
        # Create doc file from source and in same time complete
index.html <project>.devhelp2 file
        for f in d_files:
            try:
                dc = Popen( [ d_compiler, "-o-", f, "-Dd=" + install_dir
], stdout=PIPE, stderr=STDOUT )
                dc.communicate()
            except Exception as e:
                print e
            base_name = basename( f ) # take file name without his path
and without extention
            html_file = os.path.join( install_dir, base_name +".html" )
            if( os.path.exists( html_file ) ):
                out_html.write("\t\t<a href=\"" + base_name +".html\">"
+ base_name + "</a><br>\n")
                out_xml.write("\t\t<sub name=\""+ base_name +"\" link=
\""+ base_name + ".html\"/>\n")
                keyword_maker( html_file )
        # Add html footer
        out_html.write("\t</body>\n")
        out_html.write("</html>\n")
        # Add xml footer
        out_xml.write("\t</chapters>\n")
        out_xml.write("\t<functions>\n")
        for item in keywords:
            out_xml.write("\t\t<keyword type=\"%s\" name=\"%s\" link=\"%
s\"/>\n" % ( item[0], item[1], item[2] ) )
        out_xml.write("\t</functions>\n")
        out_xml.write("</book>\n")


December 09, 2011
Le vendredi 09 décembre 2011 à 05:31 +0100, bioinfornatics a écrit :
> Dear,
> In first i do not know where put this message i hope here is good.
> I have wrote a little python script for add D doc into devhelp
> why python, because it is a little script and like is not need to be
> build for use it. it is most easier for add this little tools to your
> build system. why not a new target devehelp into your makefile :-)
> 
> 
> -------------------------------------------------

I have put this tool into github: https://github.com/bioinfornatics/DdocToDevhelp

Example of use: DdocToDevhelp -n Phobos -s /usr/include/d/std/