Re: Embedding Doxygen Into A CMS
SmokingRope <[email protected]>
| Newsgroups | gmane.text.doxygen.devel |
|---|---|
| Message-ID | <[email protected]> |
Attached to this email is a patch which simplifies embedding doxygen generated documentation into a dynamic / template based website (CMS). I have attempted to update the manual where appropriate and there is a php example for doxygen's own documentation. Once you have applied the patch and compiled you can run Doxyfile_Embedded and access the complete doxygen documentation from a web browser using the provided embedded_docs.php file. You can apply the patch using: patch -p3 -i doxygen_1_5_5_cms_embedding.patch Please let me know if there is anything missing. ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Doxygen-develop mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/doxygen-develop
doxygen_1_5_5_cms_embedding.patch
(application/octet-stream, 64.6 KB)
Index: P:/workspace/Doxygen2/embedded_docs.php
===================================================================
--- P:/workspace/Doxygen2/embedded_docs.php (revision 0)
+++ P:/workspace/Doxygen2/embedded_docs.php (revision 0)
@@ -0,0 +1,49 @@
+<?php
+ if( isset($_GET['type']) and $_GET['type'] == 'image')
+ {
+ try {
+ $l_filename = 'doxygen_docs/embedded_html/' . $_GET['file'];
+ $l_filedata = file_get_contents($l_filename);
+ $l_fileimage = getimagesize($l_filename);
+ $l_filetype = $l_fileimage['mime'];
+ header('Content-type: ' . $l_filetype);
+ echo $l_filedata;
+ exit(0);
+ }
+ catch( Exception $eError )
+ {
+ exit(1);
+ }
+ }
+ if( isset($_GET['type']) and $_GET['type'] == 'css' )
+ {
+ header("Content-type: text/css");
+ echo file_get_contents('doxygen_docs/embedded_html/'.$_GET['file']);
+ exit(0);
+ }
+?>
+<HTML>
+ <HEAD>
+ <LINK rel="stylesheet" content-type="text/css" href="embedded_docs.php?type=css&file=doxygen.css" />
+ <LINK rel="stylesheet" content-type="text/css" href="embedded_docs.php?type=css&file=tabs.css" />
+ <TITLE>Doxygen Documentation</TITLE>
+ </HEAD>
+ <BODY>
+ <DIV style="height: 250px; width: 250px; overflow: scroll; position: fixed; float: left; right: 1em; bottom: 1em; border: thin solid #000000; margin: 1em 1em 1em 1em; padding: 1em 1em 1em 1em; background-color: #FFFFFF;">
+ <?php
+ include("doxygen_docs/embedded_html/tree.html");
+ ?>
+ </DIV>
+ <DIV>
+ <?php
+ if( isset($_GET['type']) and isset($_GET['file']) )
+ {
+ $l_type = $_GET['type'];
+ $l_file = $_GET['file'];
+ $l_filename = 'doxygen_docs/embedded_html/' . $l_file;
+ include($l_filename);
+ }
+ ?>
+ </DIV>
+ </BODY>
+</HTML>
Index: P:/workspace/Doxygen2/src/dot.cpp
===================================================================
--- P:/workspace/Doxygen2/src/dot.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/dot.cpp (working copy)
@@ -149,6 +149,10 @@
if ((dest=Doxygen::tagDestinationDict[df->ref()]))
result += *dest + "/";
}
+ else if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ result += Config_getString("HTML_CMS_PAGEPREFIX");
+ }
else if (!relPath.isEmpty())
{
result += relPath;
@@ -183,6 +187,10 @@
{
if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/";
}
+ else if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ result += Config_getString("HTML_CMS_PAGEPREFIX");
+ }
else if (!relPath.isEmpty())
{
result += relPath;
@@ -1114,7 +1122,12 @@
}
// write image and map in a table row
QCString mapLabel = convertNameToFile(n->m_label);
- out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
+ out << "<tr><td><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ out << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ out << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
<< mapLabel << "_map\">" << endl;
out << "<map name=\"" << mapLabel << "_map\">" << endl;
convertMapFile(out,mapName,"");
@@ -1901,7 +1914,12 @@
if (format==BITMAP && generateImageMap) // produce HTML to include the image
{
QCString mapLabel = convertNameToFile(m_startNode->m_label+"_"+mapName);
- out << "<p><center><img src=\"" << relPath << baseName << "."
+ out << "<p><center><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ out << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ out << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapLabel << "\" alt=\"";
switch (m_graphType)
@@ -2230,7 +2248,12 @@
if (format==BITMAP && generateImageMap)
{
- out << "<p><center><img src=\"" << relPath << baseName << "."
+ out << "<p><center><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ out << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ out << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "_map\" alt=\"";
out << "\">";
@@ -2523,7 +2546,12 @@
if (format==BITMAP && generateImageMap)
{
- out << "<p><center><img src=\"" << relPath << baseName << "."
+ out << "<p><center><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ out << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ out << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "_map\" alt=\"";
out << "\">";
@@ -2664,7 +2692,12 @@
if (format==BITMAP && generateImageMap)
{
- out << "<p><center><img src=\"" << relPath << baseName << "."
+ out << "<p><center><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ out << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ out << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "_map\" alt=\"";
out << m_dir->displayName();
@@ -3154,7 +3187,13 @@
if (writeImageMap)
{
QCString mapLabel = convertNameToFile(baseName);
- t << "<center><table><tr><td><img src=\"" << relPath << imgName
+
+ t << "<center><table><tr><td><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ t << relPath << imgName
<< "\" border=\"0\" alt=\"\" usemap=\"#"
<< mapLabel << "_map\">" << endl;
t << "<map name=\"" << mapLabel << "_map\">" << endl;
Index: P:/workspace/Doxygen2/src/diagram.cpp
===================================================================
--- P:/workspace/Doxygen2/src/diagram.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/diagram.cpp (working copy)
@@ -173,6 +173,9 @@
}
else
{
+ if( Config_getBool("HTML_CMS_EMBEDDING"))
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+
t << relPath;
}
t << cd->getOutputFileBase() << Doxygen::htmlFileExtension << "\" ";
Index: P:/workspace/Doxygen2/src/util.cpp
===================================================================
--- P:/workspace/Doxygen2/src/util.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/util.cpp (working copy)
@@ -2024,6 +2024,42 @@
return "";
}
+/*! generates a set of key value pairs representing the list of
+ * search parameters used for HTML CMS EMBEDDING
+ */
+QMap<QCString,QCString> getSearchParameters()
+{
+ QMap<QCString,QCString> l_retval;
+
+ // first look for filter pattern list
+ QStrList& l_searchParams = Config_getList("HTML_CMS_SEARCHPARAMS");
+
+ // If no parameters are specified return empty map
+ if (l_searchParams.isEmpty() || !Config_getBool("SEARCHENGINE"))
+ {
+ return l_retval;
+ }
+
+ // compare the file name to the filter pattern list
+ QStrListIterator sli(l_searchParams);
+ char* filterStr;
+ for (sli.toFirst(); (filterStr = sli.current()); ++sli)
+ {
+ QCString fs = filterStr;
+ int i_equals=fs.find('=');
+
+ if (i_equals!=-1)
+ {
+ QCString l_key = fs.left(i_equals);
+ QCString l_value = fs.mid(i_equals+1);
+ l_retval.insert(l_key, l_value);
+ }
+ }
+
+ // no match
+ return l_retval;
+}
+
QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding)
{
QCString inputEncoding = fromEncoding;
@@ -4751,7 +4787,7 @@
QCString relativePathToRoot(const char *name)
{
QCString result;
- if (Config_getBool("CREATE_SUBDIRS"))
+ if (Config_getBool("CREATE_SUBDIRS") && !Config_getBool("HTML_CMS_EMBEDDING"))
{
if (name==0)
{
Index: P:/workspace/Doxygen2/src/dirdef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/dirdef.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/dirdef.cpp (working copy)
@@ -755,7 +755,14 @@
path+=dir->getOutputFileBase();
path+="_dep.dot";
out << "<h4>" << dir->displayName() << "</h4>" << endl;
- out << "<img src=\"" << dir->getOutputFileBase() << "_dep.gif\">" << endl;
+ out << "<img src=\"";
+
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ out << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+
+ out << dir->getOutputFileBase() << "_dep.gif\">" << endl;
QFile f(path);
if (f.open(IO_WriteOnly))
{
Index: P:/workspace/Doxygen2/src/ftvhelp.h
===================================================================
--- P:/workspace/Doxygen2/src/ftvhelp.h (revision 629)
+++ P:/workspace/Doxygen2/src/ftvhelp.h (working copy)
@@ -27,6 +27,7 @@
#include "qtbc.h"
#include <qtextstream.h>
#include <qlist.h>
+#include <qcstring.h>
#include "index.h"
class QFile;
@@ -57,11 +58,13 @@
#define FTVIMG_vertline 11
#define FTV_S(name) #name
-#define FTV_ICON_FILE(name) "ftv2" FTV_S(name) ".png"
+#define FTV_ICON_FILE(name) QCString((Config_getBool("HTML_CMS_EMBEDDING")? \
+ Config_getString("HTML_CMS_IMAGEPREFIX"):QCString("")) + \
+ QCString("ftv2" FTV_S(name) ".png"))
#define FTVIMG_INDEX(name) FTVIMG_ ## name
#define FTV_INFO(name) ( image_info[FTVIMG_INDEX(name)] )
#define FTV_IMGATTRIBS(name) \
- "src=\"" FTV_ICON_FILE(name) "\" " \
+ "src=\"" << FTV_ICON_FILE(name) << "\" " \
"alt=\"" << FTV_INFO(name).alt << "\" " \
"width=" << FTV_INFO(name).width << " " \
"height=" << FTV_INFO(name).height << " "
Index: P:/workspace/Doxygen2/src/filedef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/filedef.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/filedef.cpp (working copy)
@@ -605,7 +605,7 @@
void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
{
static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
+
ol.writeString(" <div class=\"navtab\">\n");
ol.writeString(" <table>\n");
Index: P:/workspace/Doxygen2/src/config.l
===================================================================
--- P:/workspace/Doxygen2/src/config.l (revision 629)
+++ P:/workspace/Doxygen2/src/config.l (working copy)
@@ -3165,6 +3165,88 @@
"used. If set to NO the values of all tags below this one will be ignored. \n",
FALSE
);
+
+ //-----------------------------------------------------------------------------------------------
+ addInfo( "CMS_EMBEDDING","Configuration::additions related to the cms embedding features ");
+ //-----------------------------------------------------------------------------------------------
+ cb = addBool(
+ "HTML_CMS_EMBEDDING",
+ "The HTML_CMS_EMBEDDING option performs some processing on \n"
+ "the doxygen generated html documentation making it easier. \n"
+ "to embed doxygen into a CMS. This processing includes adding. \n"
+ "custom preficies to image and page references and removal of \n"
+ "the header and footer of the generated output. \n",
+ FALSE
+ );
+
+ cs = addString( "HTML_CMS_PAGEPREFIX",
+ "The value of HTML_CMS_PAGEPREFIX is added to each link in \n"
+ "the documentation which references other documented members. \n"
+ "The resulting string will contain the text of this variable followed \n"
+ "by the filename which the link refers to. This can be used to \n"
+ "create nonstandard methods for accessing pages from the documentation \n"
+ "through the HTTP GET request method. \n"
+ "Consider a HTML_CMS_PAGEPREFIX of: index.php?page= \n"
+ "This will cause the generated documentation to generate all links to \n"
+ "the main page as: index.php?page=index.html"
+ );
+ cs->setDefaultValue("");
+ cs->addDependency("HTML_CMS_EMBEDDING");
+
+ cs = addString( "HTML_CMS_IMAGEPREFIX",
+ "The value of HTML_CMS_IMAGEPREFIX is added to each link in \n"
+ "the documentation which references images local to the documentation. \n"
+ "The resulting string will contain the text of this variable followed \n"
+ "by the filename of the image being referenced. This can be used to \n"
+ "create nonstandard methods for accessing pages from the documentation \n"
+ "through the HTTP GET request method. \n"
+ "Consider a HTML_CMS_PAGEPREFIX of: index.php?image= \n"
+ "This will cause the generated documentation to generate all links to \n"
+ "the doxygen logo as: index.php?image=doxygen.png"
+ );
+ cs->setDefaultValue("");
+ cs->addDependency("HTML_CMS_EMBEDDING");
+
+ cl = addList( "HTML_CMS_SEARCHPARAMS",
+ "A list of key value pairs in the form 'key=value'. Each key\n"
+ "will be included as a hidden field in the search engine form\n"
+ "with the associated value. This configuration option will only\n"
+ "be used if the SEARCHENGINE configuration is set to YES."
+ );
+ cl->addDependency("SEARCHENGINE");
+ cl->addDependency("HTML_CMS_EMBEDDING");
+
+ cs = addString( "HTML_CMS_SEARCHPAGE",
+ "The page to be used for processing search results. This will\n"
+ "only be used if both the SEARCHENGINE and HTML_CMS_EMBEDDING\n"
+ "configuration options are set to YES."
+ );
+ cs->addDependency("SEARCHENGINE");
+ cs->addDependency("HTML_CMS_EMBEDDING");
+
+ ce = addEnum(
+ "HTML_CMS_SEARCHMETHOD",
+ "This option controls the html request method used when performing \n"
+ "a search query. This option will only be used if both the SEARCHENGINE\n"
+ "and HTML_CMS_EMBEDDING configuration options are set to YES. The \n"
+ "available options are post and get. 'get' is used by default.",
+ "get"
+ );
+ ce->addValue("get");
+ ce->addValue("post");
+ ce->addDependency("SEARCHENGINE");
+ ce->addDependency("HTML_CMS_EMBEDDING");
+
+ cs = addString( "HTML_CMS_SEARCHFIELD",
+ "The form field name to use for the text of the search query.\n"
+ "This option will only be used if both the SEARCHENGINE and \n"
+ "HTML_CMS_EMBEDDING configuration options are set to YES.\n"
+ "By default the field will be named 'query'."
+ );
+ cs->setDefaultValue("query");
+ cs->addDependency("SEARCHENGINE");
+ cs->addDependency("HTML_CMS_EMBEDDING");
+
addObsolete("CGI_NAME");
addObsolete("CGI_URL");
addObsolete("DOC_URL");
Index: P:/workspace/Doxygen2/src/util.h
===================================================================
--- P:/workspace/Doxygen2/src/util.h (revision 629)
+++ P:/workspace/Doxygen2/src/util.h (working copy)
@@ -25,6 +25,7 @@
#include "qtbc.h"
#include <qlist.h>
#include <qtextstream.h>
+#include <qmap.h>
#include <ctype.h>
#include "sortdict.h"
@@ -130,6 +131,7 @@
);
QCString getFileFilter(const char* name);
+QMap<QCString,QCString> getSearchParameters();
bool resolveRef(/* in */ const char *scName,
/* in */ const char *name,
Index: P:/workspace/Doxygen2/src/ftvhelp.cpp
===================================================================
--- P:/workspace/Doxygen2/src/ftvhelp.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/ftvhelp.cpp (working copy)
@@ -493,6 +493,10 @@
{
if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
}
+ else if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
t << n->file << Doxygen::htmlFileExtension;
if (!n->anchor.isEmpty()) t << "#" << n->anchor;
if (m_topLevelIndex)
@@ -651,10 +655,10 @@
t << " var folder = document.getElementById(id);\n";
t << " var l = imageNode.src.length;\n";
/* If the user clicks on the book icon, we move left one image so
- * the code (below) will also adjust the '+' icon.
+ * the code (below) will also adjust the '+' icon.
*/
- t << " if (imageNode.src.substring(l-20,l)==\"" FTV_ICON_FILE(folderclosed) "\" || \n";
- t << " imageNode.src.substring(l-18,l)==\"" FTV_ICON_FILE(folderopen) "\")\n";
+ t << " if (imageNode.src.substring(l-20,l)==\"" << FTV_ICON_FILE(folderclosed) << "\" || \n";
+ t << " imageNode.src.substring(l-18,l)==\"" << FTV_ICON_FILE(folderopen) << "\")\n";
t << " {\n";
t << " imageNode = imageNode.previousSibling;\n";
t << " l = imageNode.src.length;\n";
@@ -667,14 +671,14 @@
t << " {\n";
t << " if (imageNode != null) \n";
t << " {\n";
- t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderclosed) "\";\n";
- t << " if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(mnode) "\")\n";
+ t << " imageNode.nextSibling.src = \"" << FTV_ICON_FILE(folderclosed) << "\";\n";
+ t << " if (imageNode.src.substring(l-13,l) == \"" << FTV_ICON_FILE(mnode) << "\")\n";
t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(pnode) "\";\n";
+ t << " imageNode.src = \"" << FTV_ICON_FILE(pnode) << "\";\n";
t << " }\n";
- t << " else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(mlastnode) "\")\n";
+ t << " else if (imageNode.src.substring(l-17,l) == \"" << FTV_ICON_FILE(mlastnode) << "\")\n";
t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(plastnode) "\";\n";
+ t << " imageNode.src = \"" << FTV_ICON_FILE(plastnode) << "\";\n";
t << " }\n";
t << " }\n";
t << " folder.style.display = \"none\";\n";
@@ -683,14 +687,14 @@
t << " {\n";
t << " if (imageNode != null) \n";
t << " {\n";
- t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderopen) "\";\n";
- t << " if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(pnode) "\")\n";
+ t << " imageNode.nextSibling.src = \"" << FTV_ICON_FILE(folderopen) << "\";\n";
+ t << " if (imageNode.src.substring(l-13,l) == \"" << FTV_ICON_FILE(pnode) << "\")\n";
t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(mnode) "\";\n";
+ t << " imageNode.src = \"" << FTV_ICON_FILE(mnode) << "\";\n";
t << " }\n";
- t << " else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(plastnode) "\")\n";
+ t << " else if (imageNode.src.substring(l-17,l) == \"" << FTV_ICON_FILE(plastnode) << "\")\n";
t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(mlastnode) "\";\n";
+ t << " imageNode.src = \"" << FTV_ICON_FILE(mlastnode) << "\";\n";
t << " }\n";
t << " }\n";
t << " folder.style.display = \"block\";\n";
Index: P:/workspace/Doxygen2/src/classdef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/classdef.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/classdef.cpp (working copy)
@@ -1588,7 +1588,7 @@
void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
{
static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
+
ol.writeString(" <div class=\"navtab\">\n");
ol.writeString(" <table>\n");
Index: P:/workspace/Doxygen2/src/searchindex.cpp
===================================================================
--- P:/workspace/Doxygen2/src/searchindex.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/searchindex.cpp (working copy)
@@ -72,7 +72,12 @@
{
if (name==0 || baseName==0) return;
//printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
+
QCString url=baseName+Config_getString("HTML_FILE_EXTENSION");
+
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ url = Config_getString("HTML_CMS_PAGEPREFIX") + url;
+
if (anchor) url+=(QCString)"#"+anchor;
m_urlIndex++;
m_urls.insert(m_urlIndex,new URL(name,url));
Index: P:/workspace/Doxygen2/src/htmlgen.cpp
===================================================================
--- P:/workspace/Doxygen2/src/htmlgen.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/htmlgen.cpp (working copy)
@@ -347,110 +347,6 @@
static unsigned int tab_r_gif_len = 2585;
-static const char tabs_css[] =
-"/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */\n"
-"\n"
-"DIV.tabs\n"
-"{\n"
-" float : left;\n"
-" width : 100%;\n"
-" background : url(\"tab_b.gif\") repeat-x bottom;\n"
-" margin-bottom : 4px;\n"
-"}\n"
-"\n"
-"DIV.tabs UL\n"
-"{\n"
-" margin : 0px;\n"
-" padding-left : 10px;\n"
-" list-style : none;\n"
-"}\n"
-"\n"
-"DIV.tabs LI, DIV.tabs FORM\n"
-"{\n"
-" display : inline;\n"
-" margin : 0px;\n"
-" padding : 0px;\n"
-"}\n"
-"\n"
-"DIV.tabs FORM\n"
-"{\n"
-" float : right;\n"
-"}\n"
-"\n"
-"DIV.tabs A\n"
-"{\n"
-" float : left;\n"
-" background : url(\"tab_r.gif\") no-repeat right top;\n"
-" border-bottom : 1px solid #84B0C7;\n"
-" font-size : x-small;\n"
-" font-weight : bold;\n"
-" text-decoration : none;\n"
-"}\n"
-"\n"
-"DIV.tabs A:hover\n"
-"{\n"
-" background-position: 100% -150px;\n"
-"}\n"
-"\n"
-"DIV.tabs A:link, DIV.tabs A:visited,\n"
-"DIV.tabs A:active, DIV.tabs A:hover\n"
-"{\n"
-" color: #1A419D;\n"
-"}\n"
-"\n"
-"DIV.tabs SPAN\n"
-"{\n"
-" float : left;\n"
-" display : block;\n"
-" background : url(\"tab_l.gif\") no-repeat left top;\n"
-" padding : 5px 9px;\n"
-" white-space : nowrap;\n"
-"}\n"
-"\n"
-"DIV.tabs INPUT\n"
-"{\n"
-" float : right;\n"
-" display : inline;\n"
-" font-size : 1em;\n"
-"}\n"
-"\n"
-"DIV.tabs TD\n"
-"{\n"
-" font-size : x-small;\n"
-" font-weight : bold;\n"
-" text-decoration : none;\n"
-"}\n"
-"\n"
-"\n"
-"\n"
-"/* Commented Backslash Hack hides rule from IE5-Mac \\*/\n"
-"DIV.tabs SPAN {float : none;}\n"
-"/* End IE5-Mac hack */\n"
-"\n"
-"DIV.tabs A:hover SPAN\n"
-"{\n"
-" background-position: 0% -150px;\n"
-"}\n"
-"\n"
-"DIV.tabs LI.current A\n"
-"{\n"
-" background-position: 100% -150px;\n"
-" border-width : 0px;\n"
-"}\n"
-"\n"
-"DIV.tabs LI.current SPAN\n"
-"{\n"
-" background-position: 0% -150px;\n"
-" padding-bottom : 6px;\n"
-"}\n"
-"\n"
-"DIV.navpath\n"
-"{\n"
-" background : none;\n"
-" border : none;\n"
-" border-bottom : 1px solid #84B0C7;\n"
-"}\n"
-;
struct tab_data_item
{
@@ -464,7 +360,6 @@
{ "tab_b.gif", tab_b_gif, tab_b_gif_len },
{ "tab_l.gif", tab_l_gif, tab_l_gif_len },
{ "tab_r.gif", tab_r_gif, tab_r_gif_len },
- { "tabs.css", (unsigned char *)tabs_css, 0 },
{ 0, 0, 0 }
};
@@ -487,6 +382,144 @@
}
data++;
}
+
+ // write tabs.css file manually so we can replace some image names
+ // where applicable
+ QCString fileName;
+ fileName = (QCString)dir + "/tabs.css";
+ QFile f(fileName);
+ if( f.open(IO_WriteOnly))
+ {
+ QTextStream s(&f);
+
+ s << "/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */\n";
+ s << "\n";
+ s << "DIV.tabs\n";
+ s << "{\n";
+ s << " float : left;\n";
+ s << " width : 100%;\n";
+ s << " background : url(\"";
+
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ s << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+
+ s << "tab_b.gif\") repeat-x bottom;\n";
+ s << " margin-bottom : 4px;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs UL\n";
+ s << "{\n";
+ s << " margin : 0px;\n";
+ s << " padding-left : 10px;\n";
+ s << " list-style : none;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs LI, DIV.tabs FORM\n";
+ s << "{\n";
+ s << " display : inline;\n";
+ s << " margin : 0px;\n";
+ s << " padding : 0px;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs FORM\n";
+ s << "{\n";
+ s << " float : right;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs A\n";
+ s << "{\n";
+ s << " float : left;\n";
+ s << " background : url(\"";
+
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ s << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+
+ s << "tab_r.gif\") no-repeat right top;\n";
+ s << " border-bottom : 1px solid #84B0C7;\n";
+ s << " font-size : x-small;\n";
+ s << " font-weight : bold;\n";
+ s << " text-decoration : none;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs A:hover\n";
+ s << "{\n";
+ s << " background-position: 100% -150px;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs A:link, DIV.tabs A:visited,\n";
+ s << "DIV.tabs A:active, DIV.tabs A:hover\n";
+ s << "{\n";
+ s << " color: #1A419D;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs SPAN\n";
+ s << "{\n";
+ s << " float : left;\n";
+ s << " display : block;\n";
+ s << " background : url(\"";
+
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ s << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+
+ s << "tab_l.gif\") no-repeat left top;\n";
+ s << " padding : 5px 9px;\n";
+ s << " white-space : nowrap;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs INPUT\n";
+ s << "{\n";
+ s << " float : right;\n";
+ s << " display : inline;\n";
+ s << " font-size : 1em;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs TD\n";
+ s << "{\n";
+ s << " font-size : x-small;\n";
+ s << " font-weight : bold;\n";
+ s << " text-decoration : none;\n";
+ s << "}\n";
+ s << "\n";
+ s << "\n";
+ s << "\n";
+ s << "/* Commented Backslash Hack hides rule from IE5-Mac \\*/\n";
+ s << "DIV.tabs SPAN {float : none;}\n";
+ s << "/* End IE5-Mac hack */\n";
+ s << "\n";
+ s << "DIV.tabs A:hover SPAN\n";
+ s << "{\n";
+ s << " background-position: 0% -150px;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs LI.current A\n";
+ s << "{\n";
+ s << " background-position: 100% -150px;\n";
+ s << " border-width : 0px;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.tabs LI.current SPAN\n";
+ s << "{\n";
+ s << " background-position: 0% -150px;\n";
+ s << " padding-bottom : 6px;\n";
+ s << "}\n";
+ s << "\n";
+ s << "DIV.navpath\n";
+ s << "{\n";
+ s << " background : none;\n";
+ s << " border : none;\n";
+ s << " border-bottom : 1px solid #84B0C7;\n";
+ s << "}\n";
+ }
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file tabs.css for writing\n");
+ }
}
//------------------------------------------------------------------------
@@ -539,11 +572,22 @@
g_header=fileToString(Config_getString("HTML_HEADER"));
//printf("g_header='%s'\n",g_header.data());
}
+ else
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ g_header = "<!-- BEGIN CMS EMBEDDED DOCUMENTATION, GENERATED BY DOXYGEN -->\n";
+ }
+
if (!Config_getString("HTML_FOOTER").isEmpty())
{
g_footer=fileToString(Config_getString("HTML_FOOTER"));
//printf("g_footer='%s'\n",g_footer.data());
}
+ else
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ g_footer = "<!-- END CMS EMBEDDED DOCUMENTATION, GENERATED BY DOXYGEN -->\n";
+ }
createSubDirs(d);
//if (Config_getBool("HTML_FANCY_TABS"))
@@ -610,8 +654,15 @@
QTextStream t(&file);
t << "<hr size=\"1\"><address style=\"text-align: right;\"><small>\n";
t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
- t << " <a href=\"http://www.doxygen.org/index.html\">"
- << "<img src=\"doxygen.png\" alt=\"doxygen\" "
+ t << " <a href=\"http://www.doxygen.org/index.html\">";
+ t << "<img src=\"";
+ // Places a custom prefix in front of doxygen logo
+ // for using addressing methods of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ t << "doxygen.png\" alt=\"doxygen\" "
<< "align=\"middle\" border=\"0\">"
<< "</a> $doxygenversion";
t << "</small></address>\n"
@@ -632,10 +683,14 @@
" var sectionDiv=document.getElementById('dynsection'+num);\n"
" if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\n"
" sectionDiv.style.display='block';\n"
- " button.src='" << relPath << "open.gif';\n"
+ " button.src='" <<
+ (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_IMAGEPREFIX"):"") <<
+ relPath << "open.gif';\n"
" }else{\n"
" sectionDiv.style.display='none';\n"
- " button.src='" << relPath << "closed.gif';\n"
+ " button.src='" <<
+ (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_IMAGEPREFIX"):"") <<
+ relPath << "closed.gif';\n"
" }\n"
"}\n"
"function initDynSections(){\n"
@@ -654,7 +709,9 @@
" header.style.cursor='pointer';\n"
" header.onclick=changeDisplayState;\n"
" header.id='dynheader'+sectionCounter;\n"
- " button.src='" << relPath << "closed.gif';\n"
+ " button.src='" <<
+ (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_IMAGEPREFIX"):"") <<
+ relPath << "closed.gif';\n"
" section.id='dynsection'+sectionCounter;\n"
" section.style.display='none';\n"
" section.style.marginLeft='14px';\n"
@@ -720,7 +777,14 @@
Config_getString("PROJECT_NAME")
);
t << " " << endl << "<a href=\"http://www.doxygen.org/index.html\">";
- t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" "
+ t << endl << "<img src=\"";
+ // Places a custom prefix in front of doxygen logo
+ // for using addressing methods of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ t << relPath << "doxygen.png\" alt=\"doxygen\" "
<< "align=\"middle\" border=\"0\">" << "</a> " << versionString << " ";
t << "</small></address>";
if (Debug::isFlagSet(Debug::Validate))
@@ -841,6 +905,7 @@
{
//printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f);
QCString *dest;
+
t << "<li>";
if (ref || f)
{
@@ -862,6 +927,14 @@
}
else
{
+ // Places a custom prefix in front of whatever we are
+ // linking to so we adhere to get request convetions of
+ // a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+
t << relPath;
}
if (f) t << f << Doxygen::htmlFileExtension << "\">";
@@ -890,7 +963,18 @@
{
t << "<li>";
if (path) docify(path);
- t << "<a class=\"el\" href=\"" << f << Doxygen::htmlFileExtension << "\">";
+
+ t << "<a class=\"el\" href=\"";
+
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+
+ t << f << Doxygen::htmlFileExtension << "\">";
docify(name);
t << "</a> ";
}
@@ -899,6 +983,7 @@
const char *anchor, const char *name)
{
QCString *dest;
+
if (ref)
{
t << "<a class=\"elRef\" ";
@@ -917,6 +1002,13 @@
}
else
{
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
t << relPath;
}
if (f) t << f << Doxygen::htmlFileExtension;
@@ -932,6 +1024,7 @@
{
QCString *dest;
//printf("writeCodeLink(ref=%s,f=%s,anchor=%s,name=%s,tooltip=%s)\n",ref,f,anchor,name,tooltip);
+
if (ref)
{
t << "<a class=\"codeRef\" ";
@@ -950,6 +1043,13 @@
}
else
{
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
t << relPath;
}
if (f) t << f << Doxygen::htmlFileExtension;
@@ -963,9 +1063,19 @@
}
void HtmlGenerator::startTextLink(const char *f,const char *anchor)
-{
+{
t << "<a href=\"";
- if (f) t << relPath << f << Doxygen::htmlFileExtension;
+ if (f)
+ {
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+ t << relPath << f << Doxygen::htmlFileExtension;
+ }
if (anchor) t << "#" << anchor;
t << "\">";
}
@@ -1124,8 +1234,12 @@
{
t << "</div>" << endl;
t << "<div class=\"dynsection\">" << endl;
- t << "\n<p><center><img src=\""
- << relPath << fileName << ".png\" usemap=\"#" << name << "_map\""
+ t << "\n<p><center><img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ t << relPath << fileName << ".png\" usemap=\"#" << name << "_map\""
<< " border=\"0\" alt=\"\"></center>" << endl
<< "<map name=\"" << name << "_map\">" << endl;
@@ -1499,7 +1613,9 @@
if (Config_getBool("GENERATE_LEGEND"))
{
t << "<center><font size=\"2\">[";
- startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension);
+ startHtmlLink((Config_getBool("HTML_CMS_EMBEDDING")?
+ Config_getString("HTML_CMS_PAGEPREFIX"):"")+
+ relPath+"graph_legend"+Doxygen::htmlFileExtension);
t << theTranslator->trLegend();
endHtmlLink();
t << "]</font></center>";
@@ -1712,10 +1828,20 @@
static void startQuickIndexItem(QTextStream &t,const char *l,
bool hl,bool /*compact*/,
const QCString &relPath)
-{
+{
t << " <li"; if (hl) t << " class=\"current\"";
t << "><a ";
- t << "href=\"" << relPath << l << "\">";
+ t << "href=\"";
+
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+
+ t << relPath << l << "\">";
t << "<span>";
}
@@ -1997,21 +2123,61 @@
if (Config_getBool("SEARCHENGINE"))
{
- QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
- if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
- t << " <li>\n";
- t << " <form action=\"" << relPath << "search.php\" method=\"get\">\n";
- t << " <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
- t << " <tr>\n";
- t << " <td><label> " << searchFor << " </label></td>\n";
- if (hli!=HLI_Search)
- {
- t << " <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
- t << " </tr>\n";
- t << " </table>\n";
- t << " </form>\n";
- t << " </li>\n";
- }
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
+ if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
+ t << " <li>\n";
+ t << " <form action=\"";
+ t << Config_getString("HTML_CMS_SEARCHPAGE") << "\" method=\"";
+ t << Config_getEnum("HTML_CMS_SEARCHMETHOD");
+ t << "\">\n";
+ t << " <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
+ t << " <tr>\n";
+ t << " <td><label> " << searchFor << " </label></td>\n";
+
+ QMap<QCString,QCString> l_params = getSearchParameters();
+ QMap<QCString,QCString>::Iterator l_iterator;
+ for( l_iterator = l_params.begin() ;
+ l_iterator != l_params.end() ;
+ l_iterator++ )
+ {
+ t << " <input type=\"hidden\"";
+ t << "name=\"" << l_iterator.key() << "\" ";
+ t << "value=\"" << l_iterator.data() << "\" ";
+ t << "/>\n";
+ }
+
+ if (hli!=HLI_Search)
+ {
+ t << " <td><input type=\"text\"";
+ t << "name=\"" << Config_getString("HTML_CMS_SEARCHFIELD") << "\" ";
+ t << "value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
+ t << " </tr>\n";
+ t << " </table>\n";
+ t << " </form>\n";
+ t << " </li>\n";
+ }
+ }
+ else
+ {
+ QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
+ if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
+ t << " <li>\n";
+ t << " <form action=\"";
+ t << relPath << "search.php\" method=\"get\">\n";
+ t << " <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
+ t << " <tr>\n";
+ t << " <td><label> " << searchFor << " </label></td>\n";
+ if (hli!=HLI_Search)
+ {
+ t << " <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
+ t << " </tr>\n";
+ t << " </table>\n";
+ t << " </form>\n";
+ t << " </li>\n";
+ }
+ }
}
if (hli!=HLI_Search) // on the search page the page will be ended by the
// page itself
@@ -2106,8 +2272,30 @@
else
{
t << " \n<div class=\"qindex\">\n";
- t << " <form class=\"search\" action=\"search.php\" "
- << "method=\"get\">\n";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ // TODO: This has not actually been tested
+ t << " <form class=\"search\" action=\"" << Config_getString("HTML_CMS_SEARCHPAGE")
+ << "\" method=\"" << Config_getEnum("HTML_CMS_SEARCHMETHOD") << "\">\n";
+
+ // Write Hidden Parameters Of Search Query
+ QMap<QCString,QCString> l_params = getSearchParameters();
+ QMap<QCString,QCString>::Iterator l_iterator;
+ for( l_iterator = l_params.begin() ;
+ l_iterator != l_params.end() ;
+ l_iterator++ )
+ {
+ t << " <input type=\"hidden\"";
+ t << "name=\"" << l_iterator.key() << "\" ";
+ t << "value=\"" << l_iterator.data() << "\" ";
+ t << "/>\n";
+ }
+ }
+ else
+ {
+ t << " <form class=\"search\" action=\"search.php\" "
+ << "method=\"get\">\n";
+ }
}
t << "\n<?php\n\n";
@@ -2139,7 +2327,9 @@
t << "function end_form($value)\n";
t << "{\n";
t << " echo \""
- << " <td><input type=\\\"text\\\" name=\\\"query\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"s\\\"/></td>\\n"
+ << " <td><input type=\\\"text\\\" name=\\\""
+ << (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_SEARCHFIELD"):"query")
+ << "\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"s\\\"/></td>\\n"
<< " </tr>\\n"
<< " </table>\\n"
<< " </form>\\n"
Index: P:/workspace/Doxygen2/src/htmldocvisitor.cpp
===================================================================
--- P:/workspace/Doxygen2/src/htmldocvisitor.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/htmldocvisitor.cpp (working copy)
@@ -133,6 +133,10 @@
if (m_hide) return;
m_t << "<a href=\"";
if (u->isEmail()) m_t << "mailto:";
+
+ // TODO: Should the page prefix be added here,
+ // these links are probably guaraunteed absolute
+ // addresses
m_t << u->url() << "\">";
filter(u->url());
m_t << "</a>";
@@ -379,7 +383,12 @@
m_t << "\"";
/// @todo cache image dimensions on formula generation and give height/width
/// for faster preloading and better rendering of the page
- m_t << " src=\"" << f->relPath() << f->name() << ".png\">";
+ m_t << " src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ m_t << f->relPath() << f->name() << ".png\">";
if (bDisplay)
m_t << endl << "<p>" << endl;
}
@@ -755,6 +764,9 @@
void HtmlDocVisitor::visitPre(DocHRef *href)
{
if (m_hide) return;
+
+ // NOTE: DocHRef refers only to <A> tags placed by the
+ // user in the html documentation.
m_t << "<a href=\"" << href->url() << "\""
<< htmlAttribsToString(href->attribs()) << ">";
}
@@ -790,7 +802,12 @@
baseName=baseName.right(baseName.length()-i-1);
}
m_t << "<div align=\"center\">" << endl;
- m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\""
+ m_t << "<img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ m_t << img->relPath() << img->name() << "\" alt=\""
<< baseName << "\"" << ">" << endl;
if (img->hasCaption())
{
@@ -880,8 +897,18 @@
{
refName+=Doxygen::htmlFileExtension;
}
- m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">";
+
+ m_t << "<li><a href=\"";
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+
+ m_t << refName << "#" << ref->anchor() << "\">";
}
void HtmlDocVisitor::visitPost(DocSecRefItem *)
@@ -1008,9 +1035,17 @@
if (m_hide) return;
bool anonymousEnum = x->file()=="@";
if (!anonymousEnum)
- {
- m_t << "<dl compact><dt><b><a class=\"el\" href=\""
- << x->relPath() << x->file() << Doxygen::htmlFileExtension
+ {
+ m_t << "<dl compact><dt><b><a class=\"el\" href=\"";
+
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+ m_t << x->relPath() << x->file() << Doxygen::htmlFileExtension
<< "#" << x->anchor() << "\">";
}
else
@@ -1126,7 +1161,7 @@
m_t << "\" ";
}
else // local link
- {
+ {
m_t << "<a class=\"el\" ";
}
m_t << "href=\"";
@@ -1136,6 +1171,13 @@
}
else
{
+ // Places a custom prefix in front of whatever we
+ // are linking to to adhere to the html get request
+ // conventions of a CMS
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
m_t << relPath;
}
if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
@@ -1176,7 +1218,12 @@
writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
QString mapName = baseName+".map";
QString mapFile = fileName+".map";
- m_t << "<img src=\"" << relPath << baseName << "."
+ m_t << "<img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ m_t << relPath << baseName << "."
<< Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
<< baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
QString imap = getDotImageMapFromFile(fileName,outDir,relPath.data(),context);
@@ -1196,7 +1243,12 @@
writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
QString mapName = baseName+".map";
QString mapFile = fileName+".map";
- m_t << "<img src=\"" << relPath << baseName << ".png\" alt=\""
+ m_t << "<img src=\"";
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+ }
+ m_t << relPath << baseName << ".png\" alt=\""
<< baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
QString imap = getMscImageMapFromFile(fileName,outDir,relPath.data(),context);
m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl;
Index: P:/workspace/Doxygen2/src/search.php
===================================================================
--- P:/workspace/Doxygen2/src/search.php (revision 629)
+++ P:/workspace/Doxygen2/src/search.php (working copy)
@@ -271,11 +271,12 @@
function main()
{
+ $l_dir = dirname(__FILE__);
if(strcmp('4.1.0', phpversion()) > 0)
{
die("Error: PHP version 4.1.0 or above required!");
}
- if (!($file=fopen("search.idx","rb")))
+ if (!($file=fopen("$l_dir/search.idx","rb")))
{
die("Error: Search index file could NOT be opened!");
}
Index: P:/workspace/Doxygen2/src/msc.cpp
===================================================================
--- P:/workspace/Doxygen2/src/msc.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/msc.cpp (working copy)
@@ -72,6 +72,12 @@
{
if ((dest=Doxygen::tagDestinationDict[df->ref()])) t << *dest << "/";
}
+ else
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ t << Config_getString("HTML_CMS_PAGEPREFIX");
+ }
+
if (!df->file().isEmpty()) t << relPath << df->file() << Doxygen::htmlFileExtension;
if (!df->anchor().isEmpty()) t << "#" << df->anchor();
}
Index: P:/workspace/Doxygen2/src/index.cpp
===================================================================
--- P:/workspace/Doxygen2/src/index.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/index.cpp (working copy)
@@ -231,7 +231,11 @@
ol.writeString("<a class=\"qindex\" ");
}
}
- ol.writeString("href=\"");
+ ol.writeString("href=\"");
+ if( Config_getBool("HTML_CMS_EMBEDDING") )
+ {
+ ol.writeString(Config_getString("HTML_CMS_PAGEPREFIX"));
+ }
ol.writeString(l);
ol.writeString("\">");
if (fancyTabs)
Index: P:/workspace/Doxygen2/src/groupdef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/groupdef.cpp (revision 629)
+++ P:/workspace/Doxygen2/src/groupdef.cpp (working copy)
@@ -844,7 +844,7 @@
void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
{
static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
+
ol.writeString(" <div class=\"navtab\">\n");
ol.writeString(" <table>\n");
Index: P:/workspace/Doxygen2/src/search_php.h
===================================================================
--- P:/workspace/Doxygen2/src/search_php.h (revision 629)
+++ P:/workspace/Doxygen2/src/search_php.h (working copy)
@@ -271,11 +271,12 @@
"\n"
"function main()\n"
"{\n"
+" $l_dir = dirname(__FILE__);\n"
" if(strcmp('4.1.0', phpversion()) > 0) \n"
" {\n"
" die(\"Error: PHP version 4.1.0 or above required!\");\n"
" }\n"
-" if (!($file=fopen(\"search.idx\",\"rb\"))) \n"
+" if (!($file=fopen(\"$l_dir/search.idx\",\"rb\"))) \n"
" {\n"
" die(\"Error: Search index file could NOT be opened!\");\n"
" }\n"
Index: P:/workspace/Doxygen2/Doxyfile_Embedded
===================================================================
--- P:/workspace/Doxygen2/Doxyfile_Embedded (revision 0)
+++ P:/workspace/Doxygen2/Doxyfile_Embedded (revision 0)
@@ -0,0 +1,15 @@
+# Doxyfile 1.5.4
+#
+@INCLUDE = Doxyfile
+HTML_OUTPUT = embedded_html
+GENERATE_LATEX = NO
+#---------------------------------------------------------------------------
+# CMS EMBEDDING OPTIONS
+#---------------------------------------------------------------------------
+HTML_CMS_EMBEDDING=YES
+HTML_CMS_PAGEPREFIX=embedded_docs.php?type=page&file=
+HTML_CMS_IMAGEPREFIX=embedded_docs.php?type=image&file=
+HTML_CMS_SEARCHPARAMS = type=search \
+ file=search.php
+HTML_CMS_SEARCHPAGE = embedded_docs.php
+HTML_CMS_SEARCHMETHOD = get
Index: P:/workspace/Doxygen2/doc/Doxyfile
===================================================================
--- P:/workspace/Doxygen2/doc/Doxyfile (revision 629)
+++ P:/workspace/Doxygen2/doc/Doxyfile (working copy)
@@ -36,7 +36,7 @@
autolink.doc output.doc custcmd.doc external.doc faq.doc trouble.doc history.doc features.doc \
doxygen_usage.doc doxytag_usage.doc \
doxywizard_usage.doc installdox_usage.doc \
- config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
+ config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc embedded_html.doc\
perlmod.doc perlmod_tree.doc arch.doc
FILE_PATTERNS = *.cpp *.h *.doc
EXAMPLE_PATH = ../examples
Index: P:/workspace/Doxygen2/doc/embedded_html.doc
===================================================================
--- P:/workspace/Doxygen2/doc/embedded_html.doc (revision 0)
+++ P:/workspace/Doxygen2/doc/embedded_html.doc (revision 0)
@@ -0,0 +1,257 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page embedding_html HTML Embedding
+
+\ref embedded_html_config_one HTML_CMS_EMBEDDING
+
+\ref embedded_html_config_two HTML_CMS_PAGEPREFIX
+
+\ref embedded_html_config_three HTML_CMS_IMAGEPREFIX
+
+\ref embedded_html_config_four HTML_CMS_SEARCHPARAMS
+
+\ref embedded_html_config_five HTML_CMS_SEARCHPAGE
+
+\ref embedded_html_config_six HTML_CMS_SEARCHMETHOD
+
+\ref embedded_html_config_seven HTML_CMS_SEARCHFIELD
+
+\ref embedded_html_stylesheets Notes On Stylesheets
+
+Doxygen has the ability to adapt to many of the different linking
+formats which might be used by content management systems(CMS),
+dynamic, or template based web pages. With the
+\c HTML_CMS_EMBEDDING configuration option it is possible to
+adapt the doxygen generated html output to a format which
+can be leveraged by a CMS.
+
+The process of integrating doxygen with an existing content
+management system is beyond the scope of this manual.
+However given a working knowledge of php and html
+it should be possible to take the concepts presented here
+and apply them to integrating doxygen into a dynamic
+web page.
+
+Doxygen has a set of configuration options which have been
+designed specifically for generating html documentation
+suitable for use in a CMS. There is a sample doxygen
+configuration file labeled \c Doxyfile_Embedded in the
+project's root folder. A copy of the relevant section
+has been included below to illustrate the concepts
+behind embedding doxygen into your webpage.
+
+\code
+#--------------------------------------------------
+# CMS Embedding Options
+#--------------------------------------------------
+HTML_CMS_EMBEDDING = YES # (1)
+HTML_CMS_PAGEPREFIX = embedded_docs.php?type=page&file= # (2)
+HTML_CMS_IMAGEPREFIX = embedded_docs.php?type=image&file= # (3)
+HTML_CMS_SEARCHPARAMS = type=search file=search.php # (4)
+HTML_CMS_SEARCHPAGE = embedded_docs.php # (5)
+HTML_CMS_SEARCHMETHOD = get # (6)
+HTML_CMS_SEARCHFIELD = query # (7)
+\endcode
+
+Let's now look at each relevant line in the configuration file
+and see exactly what these options specify.
+
+\section embedded_html_config_one Line (1) - HTML_CMS_EMBEDDING
+
+ This is the most important setting in embedding doxygen generated
+documentation into your CMS. It instructs doxygen to refer to all
+files with respect to a fixed root filesystem. When the feature
+is enabled all paths are considered to be relative to a root folder
+which does not change as the user navigates the documentation.
+
+Enabling this option also instructs doxygen to remove the html header
+and footers that are typically generated. The html files which are
+generated will consist only of the html elements which would normally
+be found inside the \c body tag of the original html elements.
+
+The configuration options \c HTML_HEADER and \c HTML_FOOTER can still
+be used if you wish to apply a header or footer to the html documention.
+The default header and footer have been removed because a CMS
+will typically generate the \c html, \c head, and \c body tags of the
+pages it provides, thus making those generated by doxygen redundant.
+
+\section embedded_html_config_two Line (2) - HTML_CMS_PAGEPREFIX
+
+ The \c HTML_CMS_PAGEPREFIX configuration option specifies a string
+which should be prefixed to all links generated by doxygen to other
+doxygen generated pages. The string provided in our example
+<tt>embedded_docs.php?type=page&file=</tt> specifies a link to the file
+\c embedded_docs.php with parameters \c type and \c file.
+
+You will find in the project root a file called \c embedded_docs.php
+which is a simple example written in php of embedding doxygen documentation
+into a dynamic web page.
+
+Each of the links in the documentation generated using the settings
+above will have the contents of \c HTML_CMS_PAGEPREFIX in front
+of it:
+
+\verbatim
+<a href="classes.html">Classes</a>
+\endverbatim
+
+will be changed to
+
+\verbatim
+<a href="embedded_docs.php?type=page&file=classes.html">Classes</a>
+\endverbatim
+
+The affect is that the file \c embedded_docs.php has control of
+how to retrieve \c classes.html and where to place it in a
+potentially more complex weblayout.
+
+\section embedded_html_config_three Line (3) - HTML_CMS_IMAGEPREFIX
+
+ The \c HTML_CMS_IMAGEPREFIX option works much like \c HTML_CMS_PAGEPREFIX,
+however it applies to the images referenced in the doxygen documentation
+as opposed to pages. Each image will be translated to be a path relative
+to some root location, and with the file and parameters specified
+in the \c HTML_CMS_IMAGEPREFIX option, thus:
+
+\verbatim
+<img src="doxygen.png" />
+\endverbatim
+
+will become
+
+\verbatim
+<img src="embedded_docs.php?type=image&file=doxygen.png" />
+\endverbatim
+
+\section embedded_html_config_four Line (4) - HTML_CMS_SEARCHPARAMS
+
+ The \c HTML_CMS_SEARCHPARAMS option applies only to webpages which
+want to employ search facilities using doxygen's \c SEARCHENGINE
+option. The search engine feature of doxygen embeds a form on
+each generated page containing a text box with which a user can
+perform a query on the documentation. The \c HTML_CMS_SEARCHPARAMS
+option makes it possible to add hidden fields to the search form,
+and thus it can be used to simplify identifying the search request
+sent by a web browser when being passed to a CMS.
+
+ In the example you can see that two key value pairs have been specified
+\c type=search and <tt>file=search.php</tt>. These two key value pairs are
+included in the resulting form as hidden form fields.
+
+\verbatim
+<input type="hidden" name="type" value="search" />
+<input type="hidden" name="file" value="search.php" />
+\endverbatim
+
+ Any number of key/value pairs may be specified, and just like all other
+lists in the doxygen configuration file, they are separated by whitespace.
+If you need to include spaces you may surround any of the key value pairs
+with quotes.
+
+\section embedded_html_config_five Line (5) - HTML_CMS_SEARCHPAGE
+
+ The \c HTML_CMS_SEARCHPAGE option indicates to the search engine
+which page to submit the search query to. This option controls
+the value of the \c action attribute of the SEARCH_ENGINE form.
+
+\section embedded_html_config_six Line (6) - HTML_CMS_SEARCHMETHOD
+
+ The \c HTML_CMS_SEARCHMETHOD option controls how the search engine
+form is submitted to the web server. This option controls the value
+of the \c method attribute of the form tag generated for the search
+engine. Legal values includes \c get and \c post which directly
+correspond with the meanings described in the HTML specification.
+
+\section embedded_html_config_seven Line (7) - HTML_CMS_SEARCHFIELD
+ The \c HTML_CMS_SEARCHFIELD option controls the name of the
+form field which contains the search query submitted by the user.
+
+The output resulting from all of the search engine parameters
+in our example configuration should generate a search form
+that looks similar to:
+
+\verbatim
+<form action="embedded_docs.php" method="get">
+ <input type="hidden" name="type" value="search" />
+ <input type="hidden" name="file" value="search.php" />
+ <input type="text" name="query" value ="what to search for" />
+</form>
+\endverbatim
+
+None of the search related configuration options have any affect
+unless the \c SEARCHENGINE option is also turned on. In many cases
+it may be necesarry to reimplement the functionality which
+is contained in the \c search.php file generated by doxygen
+to achieve the best results within your own CMS.
+
+\section embedded_html_stylesheets Notes On Stylesheets
+
+When generating your documentation doxygen by default will also
+generate two stylesheets \c doxygen.css and \c tabs.css. Each of
+these style sheets is then typically linked to by the generated
+html pages to properly format the doxygen documentation.
+A CMS designed for use with doxygen may or may-not want to reuse
+these pregenerated stylesheets, and by enabling \c HTML_CMS_EMBEDDING
+the generated documentation no longer directly refers to them.
+Doxygen however will still generate the stylesheets and will
+generate links to any images referenced using the same format
+as is done elsewhere in the documentation. Using these stylesheets
+A CMS has two options when servicing a request.
+
+The first option is to directly link to the stylesheets, and this implies
+that some relative address is used when linking to them. This will
+typically generate a link similar to:
+
+\verbatim
+<link rel="stylesheet" type="text/css" href="documentation/html/doxygen.css" />
+\endverbatim
+
+Using this method of linking stylesheets has a subtle issue when the
+\c HTML_CMS_IMAGEPREFIX option does not contain a fully
+qualified path. When a web browser interprets the above link and
+retrieves the \c css file the working directory from which relative
+paths are evaluated is the path of the location of the stylesheet. This
+will cause links, similar to those generated by the example configuration,
+to incorrectly attempt to retrieve the file
+\c documentation/html/embedded_docs.php when processing the
+images which referenced in the CSS file. A simple solution to
+this is to use a fully qualified address for the
+\c HTML_CMS_IMAGEPREFIX option.
+
+If this isn't the right solution, it is also possible to link to the stylesheets
+through an intermediate page which is responsible for evaluating
+the relative path to the documentation. Using this intermediate
+page, the CMS could link to the stylesheet using a link:
+
+\verbatim
+<link rel="stylesheet" type="text/css" href="getcss.php?file=doxygen.css" />
+\endverbatim
+
+where the \c getcss.php file is responsible for looking up the
+desired css file and sending it to a web client. A simple example
+might look as follows:
+
+\verbatim
+<?php
+ echo file_get_contents('documentation/html/' . $_GET['file']);
+?>
+\endverbatim
+
+The \c embedded_docs.php file contains another \c php example of
+retrieving the css file in this way.
+
+*/
Index: P:/workspace/Doxygen2/doc/config.doc
===================================================================
--- P:/workspace/Doxygen2/doc/config.doc (revision 629)
+++ P:/workspace/Doxygen2/doc/config.doc (working copy)
@@ -143,6 +143,13 @@
\refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
\refitem cfg_hide_undoc_relations HIDE_UNDOC_RELATIONS
\refitem cfg_html_align_members HTML_ALIGN_MEMBERS
+\refitem cfg_embedded_html HTML_CMS_EMBEDDING
+\refitem cfg_embedded_html_imageprefix HTML_CMS_IMAGEPREFIX
+\refitem cfg_embedded_html_pageprefix HTML_CMS_PAGEPREFIX
+\refitem cfg_embedded_html_searchfield HTML_CMS_SEARCHFIELD
+\refitem cfg_embedded_html_searchmethod HTML_CMS_SEARCHMETHOD
+\refitem cfg_embedded_html_searchpage HTML_CMS_SEARCHPAGE
+\refitem cfg_embedded_html_searchparams HTML_CMS_SEARCHPARAMS
\refitem cfg_html_dynamic_sections HTML_DYNAMIC_SECTIONS
\refitem cfg_html_footer HTML_FOOTER
\refitem cfg_html_header HTML_HEADER
@@ -2053,6 +2060,81 @@
instructions).
</dl>
+
+\section config_embedded_html Embedded HTML
+\anchor cfg_embedded_html
+<dl>
+
+<dt>\c HTML_CMS_EMBEDDING <dd>
+ \addindex HTML_CMS_EMBEDDING
+ The \c HTML_CMS_EMBEDDING option can be used to enable features which simplify
+ embedding the doxygen generated HTML documentation into a content management
+ system or other website that makes use of a template engine. Legal values are
+ \c YES and \c NO. If set to \c YES then the most immediate change is the removal
+ of the standard header and footer. All elements which would typically be found
+ outside of the body tag in the html output will be removed. It is still possible
+ to use the \c HTML_HEADER and \c HTML_FOOTER options to add a custom header
+ or footer however. The use of relative paths \c (CREATE_SUBDIRS) is also
+ immediately affected, and all paths will be generated relative to the root
+ folder of the documentation. \c '../../index.html' becomes \c 'index.html'.
+
+\anchor cfg_embedded_html_pageprefix
+<dt>\c HTML_CMS_PAGEPREFIX <dd>
+ \addindex HTML_CMS_PAGEPREFIX
+ The \c HTML_CMS_PAGEPREFIX option specifies a string to be placed in front of
+ all inter-documentation links in the generated HTML output. For the most reliable
+ results it is reccomended to use a fully qualified address (starting with http://)
+ however as described in the embedded html section of the manual this is not
+ strictly necesarry. This option has no affect on the generated documentation if
+ \c HTML_CMS_EMBEDDING is given the value \c NO.
+
+\anchor cfg_embedded_html_imageprefix
+<dt>\c HTML_CMS_IMAGEPREFIX <dd>
+ \addindex HTML_CMS_IMAGEPREFIX
+ The \c HTML_CMS_IMAGEPREFIX option specifies a string to be placed in front of
+ all images referenced by the documentation including logos, buttons and
+ diagrams. As with the \c HTML_CMS_PAGEPREFIX option it is reccomended that
+ a fully qualified web address (starting with http://) is used, however you may
+ wish to see the embedded html section of the manual for an alternative. This
+ option has no affect on the generated documentation if \c HTML_CMS_EMBEDDING is
+ given the value \c NO.
+
+\anchor cfg_embedded_html_searchparams
+<dt>\c HTML_CMS_SEARCHPARAMS <dd>
+ \addindex HTML_CMS_SEARCHPARAMS
+ The \c HTML_CMS_SEARCHPARAMS option is a list of key value pairs specified in the
+ format \c 'key=value'. Each key / value pair represents a hidden field to be included
+ in the form that is generated via the \c SEARCHENGINE option. If either the \c SEARCHENGINE
+ or \c HTML_CMS_EMBEDDING options is set to \c NO then this option will have no affect on
+ the resulting documentation.
+
+\anchor cfg_embedded_html_searchpage
+<dt>\c HTML_CMS_SEARCHPAGE <dd>
+ \addindex HTML_CMS_SEARCHPAGE
+ The \c HTML_CMS_SEARCHPAGE option specifies the target of the form generated via
+ the \c SEARCHENGINE option. If either the \c SEARCHENGINE or \c HTML_CMS_EMBEDDING
+ options is set to \c NO then this option will have no affect on the resulting
+ documentation.
+
+\anchor cfg_embedded_html_searchmethod
+<dt>\c HTML_CMS_SEARCHMETHOD <dd>
+ \addindex HTML_CMS_SEARCHMETHOD
+ The \c HTML_CMS_SEARCHMETHOD option controls the method in which the form generated
+ via the \c SEARCHENGINE option is sent to the webserver. By default the \c get
+ method is used. Legal values are \c get and \c post. If either the \c SEARCHENGINE
+ or \c HTML_CMS_EMBEDDING options is set to \c NO then this option will have no
+ affect on the resulting documentation.
+
+\anchor cfg_embedded_html_searchfield
+<dt>\c HTML_CMS_SEARCHFIELD <dd>
+ \addindex HTML_CMS_SEARCHFIELD
+ The \c HTML_CMS_SEARCHFIELD option controls the name of the form field which will
+ contain a search query. By default this value is \c query however any string legal
+ in the context of an html name attribute may be specified. If either the \c SEARCHENGINE
+ or \c HTML_CMS_EMBEDDING options is set to \c NO then this option will have no
+ affect on the resulting documentation.
+</dl>
+
<h2>Examples</h2>
Suppose you have a simple project consisting of two files: a source file
Index: P:/workspace/Doxygen2/doc/index.doc
===================================================================
--- P:/workspace/Doxygen2/doc/index.doc (revision 629)
+++ P:/workspace/Doxygen2/doc/index.doc (working copy)
@@ -79,6 +79,7 @@
<li>Section \ref external explains how to let doxygen create links to externally generated documentation.
<li>Section \ref faq gives answers to frequently asked questions.
<li>Section \ref trouble tells you what to do when you have problems.
+<li>Section \ref embedding_html a description of using doxygen's CMS embedding capabilities
</ul>
The second part forms a reference manual: