From 7bda6aaf99c1c6e33aaa25e76978b60cb8d3a728 Mon Sep 17 00:00:00 2001 From: g0dil <g0dil@wiback.org> Date: Tue, 24 Apr 2007 12:45:53 +0000 Subject: [PATCH] Autogenerate search.php from the html templates autogenerate list of search indices replace @TOPDIR@ in html templates with relative path to project root --- SConstruct | 4 +- doclib/SConscript | 19 ++++++++++ doclib/doxy-header-overview.html | 27 +++++++------- doclib/doxy-header.html | 21 ++++++----- doclib/html-munge.xsl | 30 ++++++++++++++- doclib/search.php | 64 -------------------------------- doclib/search_functions.php | 10 +---- senfscons/Doxygen.py | 7 +++- senfscons/SENFSCons.py | 23 +++++++++++- 9 files changed, 102 insertions(+), 103 deletions(-) create mode 100644 doclib/SConscript delete mode 100644 doclib/search.php diff --git a/SConstruct b/SConstruct index 807596ac5..5ce43a238 100644 --- a/SConstruct +++ b/SConstruct @@ -38,12 +38,10 @@ SENFSCons.StandardTargets(env) SENFSCons.GlobalTargets(env) SENFSCons.Doxygen(env) -#, extra_sources = [ -# 'Examples/Sniffer/Sniffer.cc', -#]) SENFSCons.DoxyXRef(env, HTML_HEADER = '#/doclib/doxy-header-overview.html', HTML_FOOTER = '#/doclib/doxy-footer.html') +SENFSCons.DoxySearch(env) # Create Doxyfile.local if not cleaning and the file does not exist # otherwise doxygen will barf on this non-existent file diff --git a/doclib/SConscript b/doclib/SConscript new file mode 100644 index 000000000..0d93b9338 --- /dev/null +++ b/doclib/SConscript @@ -0,0 +1,19 @@ +# -*- python -*- + +Import('env') +import SENFSCons + +########################################################################### + +# This is not nice .. really ... +env.Alias( + 'all_docs', + env.Command('search.php', + [ 'doxy-header-overview.html', 'doxy-footer.html', 'html-munge.xsl' ], + [ "sed -e 's/\\$$title/Search results/g' -e 's/\\$$projectname/Overview/g' ${SOURCES[0]} > ${TARGET}.tmp", + 'echo "PHPSEARCH" >> ${TARGET}.tmp', + 'cat ${SOURCES[1]} >> ${TARGET}.tmp', + 'xsltproc --nonet --html --stringparam topdir .. -o - ${SOURCES[2]} ${TARGET}.tmp 2>/dev/null' + + '| sed -e "s/PHPSEARCH/<?php include \'search_functions.php\'; ?><?php search(); ?>/" > $TARGET', + 'rm -f ${TARGET}.tmp' ])) + diff --git a/doclib/doxy-header-overview.html b/doclib/doxy-header-overview.html index 195b602e2..28f3fa320 100644 --- a/doclib/doxy-header-overview.html +++ b/doclib/doxy-header-overview.html @@ -2,8 +2,8 @@ <html> <head> <title>$title</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> -<link href="../../doclib/senf.css" rel="stylesheet" type="text/css"> +<link href="@TOPDIR@/doc/html/doxygen.css" rel="stylesheet" type="text/css"> +<link href="@TOPDIR@/doclib/senf.css" rel="stylesheet" type="text/css"> <style type="text/css"> div.tabs ul li.$projectname a { background-color: #EDE497; } </style> @@ -12,7 +12,7 @@ div.tabs ul li.$projectname a { background-color: #EDE497; } <div id="head"> <div id="search"> - <form action="../../doclib/search.php" method="get"> + <form action="@TOPDIR@/doclib/search.php" method="get"> Search: <input type="text" name="query" size="20" accesskey="s"/> </form> </div> @@ -24,21 +24,22 @@ div.tabs ul li.$projectname a { background-color: #EDE497; } <div id="content2"> <div class="tabs menu"> <ul> - <li class="Overview"><a href="../../doc/html/index.html">Overview</a></li> - <li class="libSocket"><a href="../../Socket/doc/html/index.html">libSocket</a></li> - <li class="libPackets"><a href="../../Packets/doc/html/index.html">libPackets</a></li> - <li class="libScheduler"><a href="../../Scheduler/doc/html/index.html">libScheduler</a></li> - <li class="libUtils"><a href="../../Utils/doc/html/index.html">libUtils</a></li> - <li class="Examples"><a href="../../Examples/doc/html/index.html">Examples</a></li> - <li class="SENFSCons"><a href="../../senfscons/doc/html/index.html">SENFSCons</a></li> + <li class="Overview"><a href="@TOPDIR@/doc/html/index.html">Overview</a></li> + <li class="libSocket"><a href="@TOPDIR@/Socket/doc/html/index.html">libSocket</a></li> + <li class="libPackets"><a href="@TOPDIR@/Packets/doc/html/index.html">libPackets</a></li> + <li class="libScheduler"><a href="@TOPDIR@/Scheduler/doc/html/index.html">libScheduler</a></li> + <li class="libPPI"><a href="@TOPDIR@/PPI/doc/html/index.html">libPPI</a></li> + <li class="libUtils"><a href="@TOPDIR@/Utils/doc/html/index.html">libUtils</a></li> + <li class="Examples"><a href="@TOPDIR@/Examples/doc/html/index.html">Examples</a></li> + <li class="SENFSCons"><a href="@TOPDIR@/senfscons/doc/html/index.html">SENFSCons</a></li> </ul> </div> <div class="tabs"> <ul> <li><a href="xref.html">Open Issues</a></li> - <li><a href="http://svn.berlios.de/wsvn/senf/?op=log&rev=0&sc=0&isdir=1">SVN ChangeLog</a></li> - <li><a href="http://developer.berlios.de/projects/senf">SENF @ BerliOS</a></li> - <li><a href="http://openfacts.berlios.de/index-en.phtml?title=SENF+Network+Framework">Wiki</a></li> + <li><a class="ext" href="http://svn.berlios.de/wsvn/senf/?op=log&rev=0&sc=0&isdir=1">SVN ChangeLog</a></li> + <li><a class="ext" href="http://developer.berlios.de/projects/senf">SENF @ BerliOS</a></li> + <li><a class="ext" href="http://openfacts.berlios.de/index-en.phtml?title=SENF+Network+Framework">Wiki</a></li> </ul> </div> \ No newline at end of file diff --git a/doclib/doxy-header.html b/doclib/doxy-header.html index f05fb454b..9981f18a8 100644 --- a/doclib/doxy-header.html +++ b/doclib/doxy-header.html @@ -2,8 +2,8 @@ <html> <head> <title>$title</title> -<link href="doxygen.css" rel="stylesheet" type="text/css"> -<link href="../../../doclib/senf.css" rel="stylesheet" type="text/css"> +<link href="@TOPDIR@/doc/html/doxygen.css" rel="stylesheet" type="text/css"> +<link href="@TOPDIR@/doclib/senf.css" rel="stylesheet" type="text/css"> <style type="text/css"> div.tabs ul li.$projectname a { background-color: #EDE497; } </style> @@ -12,7 +12,7 @@ div.tabs ul li.$projectname a { background-color: #EDE497; } <div id="head"> <div id="search"> - <form action="../../../doclib/search.php" method="get"> + <form action="@TOPDIR@/doclib/search.php" method="get"> Search: <input type="text" name="query" size="20" accesskey="s"/> </form> </div> @@ -24,12 +24,13 @@ div.tabs ul li.$projectname a { background-color: #EDE497; } <div id="content2"> <div class="tabs menu"> <ul> - <li class="Overview"><a href="../../../doc/html/index.html">Overview</a></li> - <li class="libSocket"><a href="../../../Socket/doc/html/index.html">libSocket</a></li> - <li class="libPackets"><a href="../../../Packets/doc/html/index.html">libPackets</a></li> - <li class="libScheduler"><a href="../../../Scheduler/doc/html/index.html">libScheduler</a></li> - <li class="libUtils"><a href="../../../Utils/doc/html/index.html">libUtils</a></li> - <li class="Examples"><a href="../../../Examples/doc/html/index.html">Examples</a></li> - <li class="SENFSCons"><a href="../../../senfscons/doc/html/index.html">SENFSCons</a></li> + <li class="Overview"><a href="@TOPDIR@/doc/html/index.html">Overview</a></li> + <li class="libSocket"><a href="@TOPDIR@/Socket/doc/html/index.html">libSocket</a></li> + <li class="libPackets"><a href="@TOPDIR@/Packets/doc/html/index.html">libPackets</a></li> + <li class="libScheduler"><a href="@TOPDIR@/Scheduler/doc/html/index.html">libScheduler</a></li> + <li class="libPPI"><a href="@TOPDIR@/PPI/doc/html/index.html">libPPI</a></li> + <li class="libUtils"><a href="@TOPDIR@/Utils/doc/html/index.html">libUtils</a></li> + <li class="Examples"><a href="@TOPDIR@/Examples/doc/html/index.html">Examples</a></li> + <li class="SENFSCons"><a href="@TOPDIR@/senfscons/doc/html/index.html">SENFSCons</a></li> </ul> </div> diff --git a/doclib/html-munge.xsl b/doclib/html-munge.xsl index e1cc7d6da..d025ef67b 100644 --- a/doclib/html-munge.xsl +++ b/doclib/html-munge.xsl @@ -6,23 +6,49 @@ encoding="html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/> + + <xsl:param name="topdir" select="''"/> <xsl:template match="*"> <xsl:copy> - <xsl:for-each select="@*"><xsl:copy/></xsl:for-each> + <xsl:call-template name="copy-attributes"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> + <xsl:template name="copy-attributes"> + <xsl:for-each select="@*"> + <xsl:attribute name="{name(current())}"> + <xsl:choose> + <xsl:when test="contains(current(),'@TOPDIR@')"> + <xsl:value-of select="substring-before(current(),'@TOPDIR@')"/> + <xsl:value-of select="$topdir"/> + <xsl:value-of select="substring-after(current(),'@TOPDIR@')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="current()"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:for-each> + </xsl:template> + <xsl:template match="li[form]"> </xsl:template> + <!-- Replace @TOPDIR@ with relative top directory path --> + <xsl:template match="@*[contains(current(),'@TOPDIR@')]"> + <xsl:value-of select="substring-before(current(),'@TOPDIR')"/> + <xsl:value-of select="$topdir"/> + <xsl:value-of select="substring-after(current(),'@TOPDIR')"/> + </xsl:template> + <!-- Add 'class' attribute to some special paragraphs/lists --> <xsl:template name="add-class"> <xsl:param name="class"/> <xsl:copy> - <xsl:for-each select="@*"><xsl:copy/></xsl:for-each> + <xsl:call-template name="copy-attributes"/> <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute> <xsl:apply-templates/> </xsl:copy> diff --git a/doclib/search.php b/doclib/search.php deleted file mode 100644 index f5842fee9..000000000 --- a/doclib/search.php +++ /dev/null @@ -1,64 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> -<title>Search</title> -<link href="../doc/html/doxygen.css" rel="stylesheet" type="text/css"> -<link href="senf.css" rel="stylesheet" type="text/css"> -<?php include 'search_functions.php'; ?> -</head> -<body> - -<div id="head"> - <div id="search"> - <form action="search.php" method="get"> - Search: <?php inputfield(); ?> - </form> - </div> - <h1>SENF Extensible Network Framework</h1> - <h2>Search Results</h2> -</div> - -<div id="content1"> - <div id="content2"> - <div class="tabs menu"> - <ul> - <li class="Overview"><a href="../doc/html/index.html">Overview</a></li> - <li class="libSocket"><a href="../Socket/doc/html/index.html">libSocket</a></li> - <li class="libPackets"><a href="../Packets/doc/html/index.html">libPackets</a></li> - <li class="libScheduler"><a href="../Scheduler/doc/html/index.html">libScheduler</a></li> - <li class="libUtils"><a href="../Utils/doc/html/index.html">libUtils</a></li> - <li class="Examples"><a href="../Examples/doc/html/index.html">Examples</a></li> - <li class="SENFSCons"><a href="../senfscons/doc/html/index.html">SENFSCons</a></li> - </ul> - </div> - - <div class="tabs"> - <ul> - <li><a href="xref.html">Open Issues</a></li> - <li><a href="http://svn.berlios.de/wsvn/senf/?op=log&rev=0&sc=0&isdir=1">SVN ChangeLog</a></li> - <li><a href="http://developer.berlios.de/projects/senf">SENF @ BerliOS</a></li> - <li><a href="http://openfacts.berlios.de/index-en.phtml?title=SENF+Network+Framework">Wiki</a></li> - </ul> - </div> - - <!-- Generated by Doxygen 1.4.7 --> - <div class="tabs"> - <ul> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="pages.html"><span>Related Pages</span></a></li> - <hr style="width:0px;border:none;clear:both;margin:0;padding:0" /> - </div> - - <?php search(); ?> - - <hr style="width:0px;border:none;clear:both;margin:0;padding:0" /> - </div> -</div> -<div id="footer"> - <span> - <a href="mailto:senf-dev@lists.berlios.de">Contact: senf-dev@lists.berlios.de</a> | - Copyright © 2006 Fraunhofer Gesellschaft, SatCom, Stefan Bund - </span> -</div> - -</body></html> diff --git a/doclib/search_functions.php b/doclib/search_functions.php index 0431d0cb9..e3205bead 100644 --- a/doclib/search_functions.php +++ b/doclib/search_functions.php @@ -1,3 +1,4 @@ +<?php include '../doc/html/search_paths.php'; ?> <?php function search_results() @@ -313,14 +314,7 @@ function search() die("Error: PHP version 4.1.0 or above required!"); } - $paths = array( - "../doc/html/", - "../Socket/doc/html/", - "../Examples/doc/html/", - "../Packets/doc/html/", - "../Utils/doc/html/", - "../Scheduler/doc/html/", - ); + $paths = paths(); $files = array(); $j=0; for ($i=0; $i<sizeof($paths); $i++) { diff --git a/senfscons/Doxygen.py b/senfscons/Doxygen.py index 562d5681a..3b52795f8 100644 --- a/senfscons/Doxygen.py +++ b/senfscons/Doxygen.py @@ -255,17 +255,22 @@ def DoxyEmitter(source, target, env): out_dir = '.' # add our output locations + html_dir = None for (k, v) in output_formats.iteritems(): if data.get("GENERATE_" + k, v[0]).upper() == "YES": dir = env.Dir( os.path.join(source[0].dir.abspath, out_dir, data.get(k + "_OUTPUT", v[1])) ) + if k == "HTML" : html_dir = dir dir.sources = source node = env.File( os.path.join(dir.abspath, k.lower()+".stamp" ) ) targets.append(node) if env.GetOption('clean'): targets.append(dir) - if data.has_key("GENERATE_TAGFILE"): + if data.has_key("GENERATE_TAGFILE") and html_dir: targets.append(env.File( os.path.join(source[0].dir.abspath, data["GENERATE_TAGFILE"]) )) + if data.get("SEARCHENGINE","NO").upper() == "YES": + targets.append(env.File( os.path.join(html_dir.abspath, "search.idx") )) + # don't clobber targets for node in targets: env.Precious(node) diff --git a/senfscons/SENFSCons.py b/senfscons/SENFSCons.py index e365e854d..623bbc7f3 100644 --- a/senfscons/SENFSCons.py +++ b/senfscons/SENFSCons.py @@ -364,6 +364,7 @@ def Doxygen(env, doxyfile = "Doxyfile", extra_sources = []): if isinstance(doc,SCons.Node.FS.Dir): continue if doc.name == 'xml.stamp' : xmlnode = doc if doc.name == 'html.stamp' : htmlnode = doc + if doc.name == 'search.idx' : continue if os.path.splitext(doc.name)[1] == '.stamp' : continue # ignore other file stamps # otherwise it must be the tag file tagnode = doc @@ -379,18 +380,21 @@ def Doxygen(env, doxyfile = "Doxyfile", extra_sources = []): if htmlnode and env.get('DOXY_HTML_XSL'): xslfile = env.File(env['DOXY_HTML_XSL']) + reltopdir = '../' * len(htmlnode.dir.abspath[len(env.Dir('#').abspath)+1:].split('/')) + if reltopdir : reltopdir = reltopdir[:-1] + else : reltopdir = '.' env.AddPostAction( docs, SCons.Action.Action(("for html in %s/*.html; do " + " echo $$html;" + " sed -e 's/id=\"current\"/class=\"current\"/' $${html}" + " | tidy -ascii -q --show-warnings no --fix-uri no" + - " | xsltproc --nonet --html -o $${html}.new %s - 2>&1" + + " | xsltproc --nonet --html --stringparam topdir %s -o $${html}.new %s - 2>&1" + " | grep '^-'" + " | grep -v 'ID .* already defined';" + " mv $${html}.new $${html}; " + "done") - % (htmlnode.dir.abspath, xslfile.abspath))) + % (htmlnode.dir.abspath, reltopdir, xslfile.abspath))) for doc in docs: env.Depends(doc,xslfile) @@ -460,6 +464,21 @@ def DoxyXRef(env, docs=None, env.Alias('all_docs',xref) return xref + +def DoxySearch(env, docs=None): + if docs is None: + docs = env.Alias('all_docs')[0].sources + indices = [ doc for doc in docs if doc.name == "search.idx" ] + commands = [ "echo '<?php function paths() { return array(' >$TARGET" ] + root = env.Dir('#').abspath + commands.extend([ "echo '\"..%s/\",' >>$TARGET" % index.dir.abspath[len(root):] + for index in indices ]) + commands.append("echo '); } ?>' >>$TARGET" ) + target = env.Command("doc/html/search_paths.php", indices, commands) + env.Alias('all_docs', target) + return target + + ## \brief Build library # # This target helper will build the given library. The library will be -- GitLab