From cad354117ca1e0f28dfa95114d95e534345865c1 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Wed, 13 Feb 2008 10:33:11 +0000
Subject: [PATCH] doclib: Add helper script to build image map from dia files
 doclib: Introduce an intermediate doxygen-compatible image map format Update
 all image maps to the new format

---
 HowTos/NewPacket/Mainpage.dox |  13 +++---
 PPI/Connectors.hh             |   8 ++++
 PPI/Mainpage.dox              |  23 +++++++++-
 Socket/FileHandle.hh          |  22 ++++-----
 Socket/Mainpage.dox           |  43 +++++++++++++++++-
 Socket/Protocols.dia          | Bin 2869 -> 2840 bytes
 Socket/SocketPolicy.hh        |  21 +++++----
 Socket/SocketProtocol.hh      |  28 ++++++------
 Utils/Externals.dox           |  16 +++++++
 doclib/Doxyfile.global        |   6 +--
 doclib/dot                    |   1 +
 doclib/dot-munge.pl           |   2 +-
 doclib/filter.pl              |  11 ++++-
 doclib/html-munge.xsl         |  27 +++++++++++-
 doclib/makeDiaImageMap.py     |  81 ++++++++++++++++++++++++++++++++++
 doclib/senf.css               |  10 ++++-
 16 files changed, 258 insertions(+), 54 deletions(-)
 create mode 100644 Utils/Externals.dox
 create mode 100755 doclib/makeDiaImageMap.py

diff --git a/HowTos/NewPacket/Mainpage.dox b/HowTos/NewPacket/Mainpage.dox
index 8769831a..436a4286 100644
--- a/HowTos/NewPacket/Mainpage.dox
+++ b/HowTos/NewPacket/Mainpage.dox
@@ -405,7 +405,8 @@
     senf::PacketTypeMixin. senf::PacketTypeBase must be inherited by every packet type class. the
     senf::PacketTypeMixin provides default implementations for some members which are useful for
     most kinds of packets. If a packet type is very complex and these defaults don't work, the mixin
-    class can and should be left out.
+    class can and should be left out. More on this (what the default members do exactly and when the
+    mixin can be used) can be found in the senf::PacketTypeMixin documentation.
 
     Of the typedefs, only \a parser is mandatory. It defines the packet parser to use to interpret
     this type of packet. \a mixin and \a packet are defined to simplify the following
@@ -626,10 +627,12 @@
     \endcode
 
     We have added an additional private bitfield \a reserved0_5bits_() and we made the \a version_()
-    field private since we do not want the user to change the value. We could have used a read-only
-    field in this special case (since the valid value is 0) but generally in a case like this since
-    the field will be initialized by the parser (see next section on how). the field should be
-    private with an additional public read-only accessor.
+    field private since we do not want the user to change the value (0 is the only valid value, any
+    other value is not supported by this parser anyways). In this special case, a read-only field
+    would do. But more generally, if there are fields which must have a fixed value, they must be
+    defined as private fields so they can be initialized by the parser to their correct value (see
+    next section on how). An additional public read-only accessor allows users of the parser to read
+    out the value (but not change it).
 
     We will now add two additional simple members to the parser
 
diff --git a/PPI/Connectors.hh b/PPI/Connectors.hh
index 68a0ea4c..a69c3d8f 100644
--- a/PPI/Connectors.hh
+++ b/PPI/Connectors.hh
@@ -479,6 +479,8 @@ namespace connector {
 #else
 
     /** \brief Connector actively reading packets
+        
+        \tparam PacketType Type of packet to read. Defaults to senf::Packet
 
         The ActiveInput connector template reads data actively from a connected module. This class
         is completely implemented via it's base-class, GenericActiveInput, the only difference is
@@ -500,6 +502,8 @@ namespace connector {
 
     /** \brief Connector passively receiving packets
 
+        \tparam PacketType Type of packet to read. Defaults to senf::Packet
+
         The PassiveInput connector template receives packets sent to it from a connected
         module. This class is completely implemented via it's base-class, GenericPassiveInput, the
         only difference is that read packets are returned as \a PacketType instead of generic
@@ -521,6 +525,8 @@ namespace connector {
 
     /** \brief Connector actively sending packets
 
+        \tparam PacketType Type of packet to send. Defaults to senf::Packet
+
         The ActiveOutput connector template sends data actively to a connected module. This class is
         completely implemented via it's base-class, GenericActiveOutput, the only difference is that
         it only sends packets of type \a PacketType.
@@ -538,6 +544,8 @@ namespace connector {
 
     /** \brief Connector passively providing packets
 
+        \tparam PacketType Type of packet to send. Defaults to senf::Packet
+
         The PassiveOutput connector template provides data passively to a connected module whenever
         signaled. This class is completely implemented via it's base-class, GenericPassiveOutput, the
         only difference is that it only sends packets of type \a PacketType.
diff --git a/PPI/Mainpage.dox b/PPI/Mainpage.dox
index 2491f501..17aa545a 100644
--- a/PPI/Mainpage.dox
+++ b/PPI/Mainpage.dox
@@ -461,7 +461,28 @@
 
     \section ppi_classdiagram Class Diagram
 
-    \image html classes.png
+    <div class="diamap" name="classes">
+    <span coords="652,428,796,455">\ref senf::ppi::connector::PassiveConnector</span>
+    <span coords="198,381,316,408">\ref senf::ppi::EventManager</span>
+    <span coords="462,543,571,570">\ref senf::ppi::connector::ActiveOutput</span>
+    <span coords="468,494,564,521">\ref senf::ppi::connector::ActiveInput</span>
+    <span coords="414,36,505,63">\ref senf::ppi::RouteBase</span>
+    <span coords="432,325,529,379">\ref senf::ppi::Route</span>
+    <span coords="194,154,319,181">\ref (some module)</span>
+    <span coords="19,293,252,333">\ref senf::ppi::EventImplementation</span>
+    <span coords="225,36,289,63">\ref senf::ppi::module::Module</span>
+    <span coords="309,331,397,358">\ref senf::ppi::connector::Connector</span>
+    <span coords="597,543,717,570">\ref senf::ppi::connector::PassiveOutput</span>
+    <span coords="66,432,210,459">\ref senf::ppi::detail::EventBindingBase</span>
+    <span coords="378,428,505,455">\ref senf::ppi::connector::InputConnector</span>
+    <span coords="491,124,694,210">\ref senf::ppi::RouteImplementation</span>
+    <span coords="283,464,423,491">\ref senf::ppi::connector::OutputConnector</span>
+    <span coords="512,428,645,455">\ref senf::ppi::connector::ActiveConnector</span>
+    <span coords="85,487,259,527">\ref senf::ppi::detail::EventBinding</span>
+    <span coords="39,216,170,243">\ref senf::ppi::EventDescriptor</span>
+    <span coords="604,494,710,521">\ref senf::ppi::connector::PassiveInput</span>
+    </div>
+    \htmlonly <img src="classes.png" border="0" alt="classes" usemap="#classes"> \endhtmlonly
  */
 
 
diff --git a/Socket/FileHandle.hh b/Socket/FileHandle.hh
index 5b0e34db..f5786355 100644
--- a/Socket/FileHandle.hh
+++ b/Socket/FileHandle.hh
@@ -26,19 +26,15 @@
 
 /** \defgroup handle_group The Handle Hierarchy
 
-    \htmlonly 
-    <map name="FhHierarchy">
-      <area shape="rect" alt="FileHandle" href="classsenf_1_1FileHandle.html" title="FileHandle" coords="247,1,345,27" />
-      <area shape="rect" alt="SocketHandle" href="classsenf_1_1SocketHandle.html" title="SocketHandle" coords="235,61,355,87" />
-      <area shape="rect" alt="ClientSocketHandle" href="classsenf_1_1ClientSocketHandle.html" title="ClientSocketHandle" coords="32,140,198,167" />
-      <area shape="rect" alt="ServerSocketHandle" href="classsenf_1_1ServerSocketHandle.html" title="ServerSocketHandle" coords="386,140,558,168" />
-      <area shape="rect" alt="ProtocolServerSocketHandle" href="classsenf_1_1ProtocolServerSocketHandle.html" title="ProtocolServerSocketHandle" coords="354,202,590,228" />
-      <area shape="rect" alt="ProtocolClientSocketHandle" href="classsenf_1_1ProtocolClientSocketHandle.html" title="ProtocolClientSocketHandle" coords="1,202,230,228" />
-    </map>
-    <center>
-      <img src="FhHierarchy.png" border="0" alt="FhHierarchy" usemap="#FhHierarchy">
-    </center>
-    \endhtmlonly
+    <div class="diamap" name="FhHierarchy">
+    <span coords="233,47,438,89">\ref SocketHandle</span>
+    <span coords="32,126,281,168">\ref ClientSocketHandle</span>
+    <span coords="0,187,326,229">\ref ProtocolClientSocketHandle</span>
+    <span coords="350,187,684,229">\ref ProtocolServerSocketHandle</span>
+    <span coords="243,0,343,28">\ref FileHandle</span>
+    <span coords="382,126,638,168">\ref ServerSocketHandle</span>
+    </div>
+    \htmlonly <img src="FhHierarchy.png" border="0" alt="FhHierarchy" usemap="#FhHierarchy"> \endhtmlonly
 
     The senf::FileHandle class is the base of a hierarchy of socket handle classes (realized as
     templates). These classes provide an interface to the complete socket API. While going down the
diff --git a/Socket/Mainpage.dox b/Socket/Mainpage.dox
index c473505c..9a0c847f 100644
--- a/Socket/Mainpage.dox
+++ b/Socket/Mainpage.dox
@@ -247,7 +247,48 @@ namespace senf {
 
     \section class_diagram Class Diagram
 
-    \image html SocketLibrary-classes.png
+    <div class="diamap" name="SocketLibrary-classes">
+    <span coords="472,667,559,689">\ref IPv4Protocol</span>
+    <span coords="29,773,139,794">\ref WritePolicyBase</span>
+    <span coords="97,939,238,960">\ref SocketBufferingPolicy</span>
+    <span coords="97,390,223,411">\ref NoAddressingPolicy</span>
+    <span coords="97,736,217,758">\ref NotReadablePolicy</span>
+    <span coords="418,609,613,631">\ref AdressableBSDSocketProtocol</span>
+    <span coords="18,895,153,917">\ref BufferingPolicyBase</span>
+    <span coords="22,426,148,447">\ref FramingPolicyBase</span>
+    <span coords="409,0,495,36">\ref FileBody</span>
+    <span coords="97,469,249,491">\ref DatagramFramingPolicy</span>
+    <span coords="97,317,240,339">\ref INet6AddressingPolicy</span>
+    <span coords="453,544,578,566">\ref BSDSocketProtocol</span>
+    <span coords="97,281,240,303">\ref INet4AddressingPolicy</span>
+    <span coords="452,177,706,209">\ref ProtocolServerSocketHandle</span>
+    <span coords="412,259,486,281">\ref PolicyBase</span>
+    <span coords="474,768,557,790">\ref TCPProtocol</span>
+    <span coords="97,700,197,722">\ref ReadablePolicy</span>
+    <span coords="342,249,654,411">\ref SocketPolicy</span>
+    <span coords="0,541,173,563">\ref CommunicationPolicyBase</span>
+    <span coords="640,859,736,881">\ref TCPv6Protocol</span>
+    <span coords="353,428,453,465">\ref SocketProtocol</span>
+    <span coords="97,585,297,606">\ref ConnectedCommunicationPolicy</span>
+    <span coords="172,177,420,209">\ref ProtocolClientSocketHandle</span>
+    <span coords="472,718,559,739">\ref IPv6Protocol</span>
+    <span coords="97,816,192,838">\ref WritablePolicy</span>
+    <span coords="383,62,520,98">\ref SocketBody</span>
+    <span coords="698,888,798,910">\ref PacketProtocol</span>
+    <span coords="97,852,213,874">\ref NotWritablePolicy</span>
+    <span coords="31,657,138,679">\ref ReadPolicyBase</span>
+    <span coords="213,60,369,91">\ref SocketHandle</span>
+    <span coords="197,126,385,158">\ref ClientSocketHandle</span>
+    <span coords="97,621,311,642">\ref UnconnectedCommunicationPolicy</span>
+    <span coords="567,480,786,526">\ref ConcreteSocketProtocol</span>
+    <span coords="582,830,678,852">\ref TCPv4Protocol</span>
+    <span coords="97,505,234,527">\ref StreamFramingPolicy</span>
+    <span coords="13,238,161,259">\ref AddressingPolicyBase</span>
+    <span coords="224,0,294,36">\ref FileHandle</span>
+    <span coords="97,353,222,375">\ref LLAddressingPolicy</span>
+    <span coords="476,126,671,158">\ref ServerSocketHandle</span>
+    </div>
+    \htmlonly <img src="SocketLibrary-classes.png" border="0" alt="SocketLibrary-classes" usemap="#SocketLibrary-classes"> \endhtmlonly
 
     \section impl_notes Arbitrary Implementation Notes
 
diff --git a/Socket/Protocols.dia b/Socket/Protocols.dia
index 9cd03fab03d038282d11f90cc1ba77c73b28c0dd..58c9910916cd25abe60b8256942fa88ecc6c0b8d 100644
GIT binary patch
literal 2840
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
Y#}vMyk1UK$H0=nV*zu!(5#7D(KamH2W&i*H

literal 2869
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
CHk||j

diff --git a/Socket/SocketPolicy.hh b/Socket/SocketPolicy.hh
index 440a9cf4..209c374b 100644
--- a/Socket/SocketPolicy.hh
+++ b/Socket/SocketPolicy.hh
@@ -32,17 +32,16 @@
 
 /** \defgroup policy_group The Policy Framework
 
-    \htmlonly
-        <map name="socketPolicy">
-          <area shape="rect" alt="SocketPolicy" href="structsenf_1_1SocketPolicy.html" title="SocketPolicy" coords="276,90,558,213" />
-          <area shape="rect" alt="WritePolicyBase" href="structsenf_1_1WritePolicyBase.html" title="WritePolicyBase" coords="39,243,174,268" />
-          <area shape="rect" alt="ReadPolicyBase" href="structsenf_1_1ReadPolicyBase.html" title="ReadPolicyBase" coords="42,204,174,231" />
-          <area shape="rect" alt="CommunicationPolicyBase" href="structsenf_1_1CommunicationPolicyBase.html" title="CommunicationPolicyBase" coords="0,166,215,193" />
-          <area shape="rect" alt="FramingPolicyBase" href="structsenf_1_1FramingPolicyBase.html" title="FramingPolicyBase" coords="30,129,185,155" />
-          <area shape="rect" alt="AddressingPolicyBase" href="structsenf_1_1AddressingPolicyBase.html" title="AddressingPolicyBase" coords="17,90,200,116" />
-        </map>
-        <img src="SocketPolicy.png" border="0" alt="Socket Policy" usemap="#socketPolicy">
-    \endhtmlonly
+    <div class="diamap" name="SocketPolicy">
+    <span coords="39,229,182,257">\ref WritePolicyBase</span>
+    <span coords="17,76,210,105">\ref AddressingPolicyBase</span>
+    <span coords="29,114,194,143">\ref FramingPolicyBase</span>
+    <span coords="368,0,463,28">\ref PolicyBase</span>
+    <span coords="275,2,691,185">\ref SocketPolicy</span>
+    <span coords="0,152,227,181">\ref CommunicationPolicyBase</span>
+    <span coords="41,191,180,219">\ref ReadPolicyBase</span>
+    </div>
+    \htmlonly <img src="SocketPolicy.png" border="0" alt="SocketPolicy" usemap="#SocketPolicy"> \endhtmlonly
         
     \section policy_group_introduction Introduction to the Policy Framework
 
diff --git a/Socket/SocketProtocol.hh b/Socket/SocketProtocol.hh
index 587970ad..012b857d 100644
--- a/Socket/SocketProtocol.hh
+++ b/Socket/SocketProtocol.hh
@@ -32,21 +32,19 @@
 
 /** \defgroup protocol_group The Protocol Classes
 
-    \htmlonly
-    <map name="Protocols">
-    <area shape="rect" alt="SocketProtocol" href="classsenf_1_1SocketProtocol.html" title="SocketProtocol" coords="0,0,118,25"/>
-    <area shape="rect" alt="UNSocketProtocol" href="classsenf_1_1UNSocketProtocol.html" title="UNSocketProtocol" coords="139,392,279,418"/>
-    <area shape="rect" alt="PacketSocketProtocol" href="classsenf_1_1PacketSocketProtocol.html" title="PacketSocketProtocol" coords="527,412,693,438"/>
-    <area shape="rect" alt="ConcreteSocketProtocol" href="classsenf_1_1ConcreteSocketProtocol.html" title="ConcreteSocketProtocol" coords="214,49,471,86"/>
-    <area shape="rect" alt="BSDSocketProtocol" href="classsenf_1_1BSDSocketProtocol.html" title="BSDSocketProtocol" coords="135,112,283,137"/>
-    <area shape="rect" alt="DatagramSocketProtocol" href="classsenf_1_1DatagramSocketProtocol.html" title="DatagramSocketProtocol" coords="114,258,304,284"/>
-    <area shape="rect" alt="TCPSocketProtocol" href="classsenf_1_1TCPSocketProtocol.html" title="TCPSocketProtocol" coords="136,320,281,346"/>
-    <area shape="rect" alt="UNDatagramSocketProtocol" href="classsenf_1_1UNDatagramSocketProtocol.html" title="UNDatagramSocketProtocol" coords="395,446,604,472"/>
-    <area shape="rect" alt="AddressableBSDSocketProtocol" href="classsenf_1_1AddressableBSDSocketProtocol.html" title="AddressableBSDSocketProtocol" coords="89,189,329,215"/>
-    <area shape="rect" alt="TCPv4SocketProtocol" href="classsenf_1_1TCPv4SocketProtocol.html" title="TCPv4SocketProtocol" coords="282,481,444,507"/>
-    </map>
-    <img src="Protocols.png" border="0" alt="Protocols" usemap="#Protocols">
-    \endhtmlonly
+     <div class="diamap" name="Protocols">
+     <span coords="0,0,118,25">\ref SocketProtocol</span>
+     <span coords="139,381,279,407">\ref UNSocketProtocol</span>
+     <span coords="527,412,693,438">\ref PacketSocketProtocol</span>
+     <span coords="214,49,471,86">\ref ConcreteSocketProtocol</span>
+     <span coords="135,112,283,137">\ref BSDSocketProtocol</span>
+     <span coords="114,258,304,284">\ref DatagramSocketProtocol</span>
+     <span coords="136,320,281,346">\ref TCPSocketProtocol</span>
+     <span coords="395,446,604,472">\ref UNDatagramSocketProtocol</span>
+     <span coords="89,189,329,215">\ref AddressableBSDSocketProtocol</span>
+     <span coords="282,481,444,507">\ref TCPv4SocketProtocol</span>
+     </div>
+     \htmlonly <img src="Protocols.png" border="0" alt="Protocols" usemap="#Protocols"> \endhtmlonly
 
     The socket handle classes and templates only implement the most important socket API methods
     using the policy framework. To access the complete API, the protocol interface is
diff --git a/Utils/Externals.dox b/Utils/Externals.dox
new file mode 100644
index 00000000..f517454d
--- /dev/null
+++ b/Utils/Externals.dox
@@ -0,0 +1,16 @@
+/**\defgroup externals External objects referenced from within SENF */
+///\addtogroup externals
+///\{
+namespace boost { class array {}; }
+namespace boost { class base_from_member {}; }
+namespace boost { class enable_if {}; }
+namespace boost { class equality_comparable {}; }
+namespace boost { class false_type {}; }
+namespace boost { class iterator_facade {}; }
+namespace boost { class noncopyable {}; }
+namespace boost { class singleton_pool {}; }
+namespace boost { class totally_ordered {}; }
+namespace boost { class true_type {}; }
+namespace std { class exception {}; }
+namespace std { class string {}; }
+///\}
diff --git a/doclib/Doxyfile.global b/doclib/Doxyfile.global
index fab9b0a9..ddf11b9b 100644
--- a/doclib/Doxyfile.global
+++ b/doclib/Doxyfile.global
@@ -1325,14 +1325,14 @@ CALLER_GRAPH           = NO
 # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
 # will graphical hierarchy of all classes instead of a textual one.
 
-GRAPHICAL_HIERARCHY    = YES
+GRAPHICAL_HIERARCHY    = NO
 
 # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
 # then doxygen will show the dependencies a directory has on other directories 
 # in a graphical way. The dependency relations are determined by the #include
 # relations between the files in the directories.
 
-DIRECTORY_GRAPH        = YES
+DIRECTORY_GRAPH        = NO
 
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
 # generated by dot. Possible values are png, jpg, or gif
@@ -1369,7 +1369,7 @@ DOT_GRAPH_MAX_NODES    = 10
 # code bases. Also note that the size of a graph can be further restricted by 
 # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
 
-MAX_DOT_GRAPH_DEPTH    = 3
+MAX_DOT_GRAPH_DEPTH    = 5
 
 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
 # background. This is enabled by default, which results in a transparent 
diff --git a/doclib/dot b/doclib/dot
index ba316924..d0ccf869 100755
--- a/doclib/dot
+++ b/doclib/dot
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 topdir="`dirname "$0"`"; topdir="`cd "$topdir/.."; pwd`"
+sed -i -e 's/rankdir=LR/rankdir=TB/' "$1"
 "$topdir/doclib/dot-munge.pl" "$1"
 
 case "$2" in
diff --git a/doclib/dot-munge.pl b/doclib/dot-munge.pl
index dd0d8f9b..6214e48b 100755
--- a/doclib/dot-munge.pl
+++ b/doclib/dot-munge.pl
@@ -5,7 +5,7 @@ s/fontsize=10/fontsize=8/g;
 s/fontname="FreeSans.ttf"/fontname="Verdana"/g;
 
 # Wrap long labels (templates and pathnames)
-if (/label=\"([^"]*)\"/) {                                  #"])){ # To make emacs happy ...
+if (/label=\"([^"]{48,})\"/) {                              #"])){ # To make emacs happy ...
     $pre=$`; 
     $post=$';                                               #';    # To make emacs happy ...
     $label=$1;
diff --git a/doclib/filter.pl b/doclib/filter.pl
index dd192c8e..6a022e2f 100755
--- a/doclib/filter.pl
+++ b/doclib/filter.pl
@@ -1,14 +1,21 @@
 #!/usr/bin/perl -n
 
+BEGIN {
+    ($topdir=$0) =~ s{doclib/.*$}{};
+		      print $topdir,"\n";
+}
+
 s/\s*$//;
 while (s/\t/' 'x(8-length($`)%8)/e) {}
 
 if (/^\s*\\code$/ .. /\\endcode/ && !/^$/) {
     $i=length($1) if /^(\s*)\\code$/;
     print substr($_,$i),"\n";
-} elsif (s/^(\s*)<pre>$/$1<pre class="fragment">/ .. /<\/pre>/ && !/^$/) {
+} 
+elsif (s/^(\s*)<pre>$/$1<pre class="fragment">/ .. /<\/pre>/ && !/^$/) {
     $i=length($1) if /^(\s*)<pre class="fragment">$/;
     print substr($_,$i),"\n";
-} else {
+} 
+else {
     print $_,"\n";
 }
diff --git a/doclib/html-munge.xsl b/doclib/html-munge.xsl
index 4579003d..734ca8be 100644
--- a/doclib/html-munge.xsl
+++ b/doclib/html-munge.xsl
@@ -147,10 +147,35 @@
       <xsl:apply-templates/>
     </xsl:copy>
   </xsl:template>
+  
+  <!-- Build dia image-map from special div/span elements -->
+  <xsl:template match="div[@class='diamap']">
+    <xsl:element name="map">
+      <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
+      <xsl:for-each select="span">
+        <xsl:if test="a">
+          <xsl:variable name="name" select="string(a[1])"/>
+          <xsl:element name="area">
+            <xsl:attribute name="shape">rect</xsl:attribute>
+            <xsl:attribute name="alt"><xsl:value-of select="$name"/></xsl:attribute>
+            <xsl:attribute name="title"><xsl:value-of select="$name"/></xsl:attribute>
+            <xsl:attribute name="href"><xsl:value-of select="a[1]/@href"/></xsl:attribute>
+            <xsl:attribute name="coords"><xsl:value-of select="@coords"/></xsl:attribute>
+          </xsl:element>
+        </xsl:if>
+      </xsl:for-each>
+    </xsl:element>
+  </xsl:template>
 
   <!-- Remove the automatically inserted search form (we build our own) -->
   <xsl:template match="li[form]"> 
   </xsl:template>
+
+  <xsl:template match="table[preceding-sibling::*[1][self::div][@class='qindex']]">
+    <xsl:call-template name="add-class">
+      <xsl:with-param name="class">qindextable</xsl:with-param>
+    </xsl:call-template>
+  </xsl:template>
   
   <xsl:template match="dl[dt/b/a/text()='Bug:']">
     <xsl:call-template name="add-class">
@@ -176,7 +201,7 @@
     </xsl:call-template>
   </xsl:template>
 
-  <xsl:template match="dl[dt/b/text()='Parameters:']">
+  <xsl:template match="dl[dt/b/text()='Parameters:']|dl[dt/b/text()='Template Parameters:']">
     <xsl:call-template name="add-class">
       <xsl:with-param name="class">parameters</xsl:with-param>
     </xsl:call-template>
diff --git a/doclib/makeDiaImageMap.py b/doclib/makeDiaImageMap.py
new file mode 100755
index 00000000..db9a9ce1
--- /dev/null
+++ b/doclib/makeDiaImageMap.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+
+import sys, os, gzip
+import Ft.Xml.Xslt.Processor
+import Ft.Xml.Domlette
+from Ft.Xml.InputSource import DefaultFactory as InputFactory
+import cStringIO
+
+stylesheet=u"""
+<?xml version="1.0" encoding="utf-8"?>
+<xsl:stylesheet 
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:dia="http://www.lysator.liu.se/~alla/dia/"
+  version="1.0">
+
+  <xsl:output method="text"/>
+
+  <xsl:template match="text()"/>
+
+  <xsl:template match="dia:object[@type='UML - Class']">
+    <xsl:value-of select="dia:attribute[@name='name']/dia:string"/>
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="dia:attribute[@name='obj_bb']/dia:rectangle/@val"/>
+    <xsl:text>&#x0a;</xsl:text>
+  </xsl:template>
+
+  <xsl:template match="dia:attribute[@name='obj_bb']/dia:rectangle">
+    <xsl:text>## </xsl:text>
+    <xsl:value-of select="@val"/>
+    <xsl:text>&#x0a;</xsl:text>
+  </xsl:template>
+
+</xsl:stylesheet>
+""".strip().encode('utf-8')
+
+def xsltproc(source, stylesheet):
+    processor = Ft.Xml.Xslt.Processor.Processor()
+    processor.setDocumentReader(Ft.Xml.Domlette.NonvalidatingReader)
+    processor.appendStylesheet(stylesheet)
+    output = cStringIO.StringIO()
+    processor.run(source, outputStream = output)
+    return output.getvalue()
+
+minx = miny = maxx = maxy = None
+classes = {}
+
+basename = sys.argv[1].rsplit('.',1)[0]
+png = os.popen("pngtopnm %s.png 2>/dev/null" % basename)
+png.readline()
+size = map(int, png.readline().strip().split(' '))
+png.read()
+
+for line in xsltproc(InputFactory.fromStream(gzip.open(sys.argv[1]), sys.argv[1]),
+                     InputFactory.fromString(stylesheet, '<string>')).strip().split("\n"):
+    name,box = line.rsplit(' ',1)
+    tlx, tly, brx, bry = (float(val)
+                          for point in box.split(';')
+                          for val in point.split(','))
+    name = name[1:-1]
+    if minx is None or tlx<minx : minx = tlx
+    if maxx is None or tlx>maxx : maxx = tlx
+    if minx is None or brx<minx : minx = brx
+    if maxx is None or brx>maxx : maxx = brx
+    if miny is None or tly<miny : miny = tly
+    if maxy is None or tly>maxy : maxy = tly
+    if miny is None or bry<miny : miny = bry
+    if maxy is None or bry>maxy : maxy = bry 
+    if name:
+        classes[name] = (tlx, tly, brx, bry)
+
+print '<div class="diamap" name="%s">' % basename
+for name,box in classes.iteritems():
+    print '<span coords="%d,%d,%d,%d">\\ref %s</span>' % (
+        (box[0]-minx)*size[0]/(maxx-minx),
+        (box[1]-miny)*size[1]/(maxy-miny),
+        (box[2]-minx)*size[0]/(maxx-minx),
+        (box[3]-miny)*size[1]/(maxy-miny),
+        name)
+print '</div>'
+print '\\htmlonly <img src="%s.png" border="0" alt="%s" usemap="#%s"> \\endhtmlonly' % (
+    basename,basename,basename)
diff --git a/doclib/senf.css b/doclib/senf.css
index 1e4697d2..c11bc75b 100644
--- a/doclib/senf.css
+++ b/doclib/senf.css
@@ -430,7 +430,7 @@ div.ah {
         margin-right: 10px;
 }
 
-div.nav {
+div.nav, div.navpath {
         width: auto;
         background-color: white;
         border: none;
@@ -449,6 +449,14 @@ div.qindex {
         line-height: 140%;
 }
 
+table.qindextable {
+        font-size: 90%;
+}
+
+table.qindextable td {
+        width: 33%;
+}
+
 dl.parameters dd table {
         width: auto;
 }
-- 
GitLab