Doxygen
Loading...
Searching...
No Matches
sitemap.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 1997-2023 Dimitri van Heesch.
3 *
4 * Permission to use, copy, modify, and distribute this software and its
5 * documentation under the terms of the GNU General Public License is hereby
6 * granted. No representations are made about the suitability of this software
7 * for any purpose. It is provided "as is" without express or implied warranty.
8 * See the GNU General Public License for more details.
9 *
10 * Documents produced by Doxygen are derivative works derived from the
11 * input used in their production; they are not affected by this license.
12 */
13
14// own header
15#include "sitemap.h"
16
17// standard includes
18#include <algorithm>
19#include <fstream>
20#include <memory>
21#include <vector>
22
23// other includes
24#include "config.h"
25#include "containers.h"
26#include "debug.h"
27#include "doxygen.h"
28#include "groupdef.h"
29#include "language.h"
30#include "memberdef.h"
31#include "message.h"
32#include "portable.h"
33#include "textstream.h"
34#include "util.h"
35#include "version.h"
36
37//-------------------------------------------------------------------------------------------
38
40{
41 public:
42 std::ofstream docFile;
44};
45
46Sitemap::Sitemap() : p(std::make_unique<Private>()) {}
47Sitemap::~Sitemap() = default;
48
50{
51 DString fileName = Config_getString(HTML_OUTPUT) + "/" + sitemapFileName;
52
53 p->docFile = Portable::openOutputStream(fileName);
54 if (!p->docFile.is_open())
55 {
56 term("Could not open file {} for writing\n", fileName);
57 }
58 p->doc.setStream(&p->docFile);
59
60 p->doc << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
61 p->doc << "<urlset\n";
62 p->doc << " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n";
63 p->doc << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
64 p->doc << " xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\n";
65 p->doc << " http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">\n";
66}
67
69{
70 p->doc << "</urlset>\n";
71 p->doc.flush();
72 p->docFile.close();
73}
74
75void Sitemap::addIndexFile(const DString & fileName)
76{
77 DString fn = fileName;
78 DString sitemapUrl = Config_getString(SITEMAP_URL);
80 p->doc << " <url>\n";
81 p->doc << " <loc>" << convertToXML(sitemapUrl + fn) << "</loc>\n";
82 p->doc << " </url>\n";
83}
84
85//-------------------------------------------------------------------------------------------
86//
94
95Crawlmap::Crawlmap() : p(std::make_unique<Private>()) {}
96Crawlmap::~Crawlmap() = default;
97
99{
100 DString fileName = Config_getString(HTML_OUTPUT) + "/" + crawlFileName;
102 p->crawlFile = Portable::openOutputStream(fileName);
103 if (!p->crawlFile.is_open())
104 {
105 term("Could not open file {} for writing\n",fileName);
106 }
107 p->crawl.setStream(&p->crawlFile);
108 p->crawl << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
109 p->crawl << "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"" + theTranslator->trISOLang() + "\">\n";
110 p->crawl << "<head>\n";
111 p->crawl << "<title>Validator / crawler helper</title>\n";
112 p->crawl << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
113 p->crawl << "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=11\"/>\n";
114
115 p->crawl << "<meta name=\"generator\" content=\"Doxygen " + getDoxygenVersion() + "\"/>\n";
116 p->crawl << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n";
117 p->crawl << "</head>\n";
118 p->crawl << "<body>\n";
119}
120
122{
123 std::sort(p->crawlLinks.begin(),p->crawlLinks.end());
124 p->crawlLinks.erase(std::unique(p->crawlLinks.begin(),p->crawlLinks.end()),p->crawlLinks.end());
125 for (auto &s : p->crawlLinks)
126 {
127 p->crawl << "<a href=\"" << s << "\"/>\n";
128 }
129
130 p->crawl << "</body>\n";
131 p->crawl << "</html>\n";
132 p->crawl.flush();
133 p->crawlFile.close();
134}
135
136void Crawlmap::addIndexFile(const DString & fileName)
137{
138 DString fn = fileName;
140 p->crawlLinks.push_back(fn.str());
141}
142
143void Crawlmap::addContentsItem(bool, const DString &, const DString & ref,
144 const DString & file, const DString & anchor,
145 bool ,bool ,
146 const Definition *, const DString &)
147{
148 if (!file.empty() && ref.empty()) // made file optional param and
149 // don't place links in crawl file imported
150 // by tags
151 {
152 std::string link;
153 if (file[0]=='!' || file[0]=='^') // special markers for user defined URLs
154 {
155 link+=&file[1];
156 }
157 else
158 {
159 DString currFile = file;
161 DString currAnc = anchor;
162 link += currFile.data();
163 if (!currAnc.empty())
164 {
165 link += "#";
166 link += currAnc.str();
167 }
168 }
169 p->crawlLinks.push_back(link);
170 }
171}
172
173static DString makeFileName(const DString & withoutExtension)
174{
175 DString result=withoutExtension;
176 if (!result.empty())
177 {
178 if (result.at(0)=='!') // relative URL -> strip marker
179 {
180 result=result.mid(1);
181 }
182 else // add specified HTML extension
183 {
185 }
186 }
187 return result;
188}
189
190static DString makeRef(const DString & withoutExtension, const DString & anchor)
191{
192 if (withoutExtension.empty()) return DString();
193 DString result = makeFileName(withoutExtension);
194 if (anchor.empty()) return result;
195 return result+"#"+anchor;
196}
197
198void Crawlmap::addIndexItem(const Definition *context, const MemberDef *md,
199 const DString &sectionAnchor, const DString &title)
200{
201 if (context && md) // member
202 {
203 if (sectionAnchor.empty() && !md->hasDocumentation()) return;
204 DString cfname = md->getOutputFileBase();
205 DString anchor = !sectionAnchor.empty() ? sectionAnchor : md->anchor();
206 DString ref = makeRef(cfname, anchor);
207 p->crawlLinks.push_back(ref.str());
208 }
209 else if (context) // container
210 {
211 DString contRef = context->getOutputFileBase();
212 DString ref = makeRef(contRef,sectionAnchor);
213 p->crawlLinks.push_back(ref.str());
214 }
215}
TextStream crawl
Definition sitemap.cpp:91
StringVector crawlLinks
Definition sitemap.cpp:92
std::ofstream crawlFile
Definition sitemap.cpp:90
void initialize()
Definition sitemap.cpp:98
void addContentsItem(bool isDir, const DString &name, const DString &ref, const DString &file, const DString &anchor, bool separateIndex, bool addToNavIndex, const Definition *def, const DString &nameAsHtml)
Definition sitemap.cpp:143
static const DString crawlFileName
Definition sitemap.h:72
std::unique_ptr< Private > p
Definition sitemap.h:76
void addIndexItem(const Definition *context, const MemberDef *md, const DString &sectionAnchor, const DString &title)
Definition sitemap.cpp:198
void addIndexFile(const DString &name)
Definition sitemap.cpp:136
void finalize()
Definition sitemap.cpp:121
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
const std::string & str() const
Definition dstring.h:645
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:157
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual bool hasDocumentation() const =0
virtual DString anchor() const =0
virtual DString getOutputFileBase() const =0
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
TextStream doc
Definition sitemap.cpp:43
std::ofstream docFile
Definition sitemap.cpp:42
void addIndexFile(const DString &name)
Definition sitemap.cpp:75
std::unique_ptr< Private > p
Definition sitemap.h:48
static const DString sitemapFileName
Definition sitemap.h:44
void finalize()
Definition sitemap.cpp:68
Sitemap()
Definition sitemap.cpp:46
void initialize()
Definition sitemap.cpp:49
Text streaming class that buffers data.
Definition textstream.h:36
virtual DString trISOLang()=0
#define Config_getString(name)
Definition config.h:32
std::vector< std::string > StringVector
Definition containers.h:33
Translator * theTranslator
Definition language.cpp:76
#define term(fmt,...)
Definition message.h:137
std::ofstream openOutputStream(const DString &name, bool append=false)
Definition portable.cpp:681
Definition dstring.h:913
Portable versions of functions that are platform dependent.
static DString makeFileName(const DString &withoutExtension)
Definition sitemap.cpp:173
static DString makeRef(const DString &withoutExtension, const DString &anchor)
Definition sitemap.cpp:190
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3931
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3232
A bunch of utility functions.