21#include <unordered_set>
44 std::unordered_set<std::string>
scopes;
55 if (projectName.
empty()) projectName=
"root";
57 if (bundleId.
empty()) bundleId=
"org.doxygen.Project";
59 if (feedName.
empty()) feedName=
"FeedName";
61 if (feedURL.
empty()) feedURL=
"FeedUrl";
63 if (publisherId.
empty()) publisherId=
"PublisherId";
65 if (publisherName.
empty()) publisherName=
"PublisherName";
67 if (projectNumber.
empty()) projectNumber=
"ProjectNumber";
75 term(
"Could not open file {} for writing\n",mfName);
78 ts <<
"DOCSET_NAME=" << bundleId <<
".docset\n"
79 "DOCSET_CONTENTS=$(DOCSET_NAME)/Contents\n"
80 "DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
81 "DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
82 "DESTDIR=~/Library/Developer/Shared/Documentation/DocSets\n"
83 "XCODE_INSTALL=\"$(shell xcode-select -print-path)\"\n"
88 "\tmkdir -p $(DOCSET_DOCUMENTS)\n"
89 "\tcp Nodes.xml $(DOCSET_RESOURCES)\n"
90 "\tcp Tokens.xml $(DOCSET_RESOURCES)\n"
91 "\tcp Info.plist $(DOCSET_CONTENTS)\n"
92 "\ttar --exclude $(DOCSET_NAME) \\\n"
93 "\t --exclude Nodes.xml \\\n"
94 "\t --exclude Tokens.xml \\\n"
95 "\t --exclude Info.plist \\\n"
96 "\t --exclude Makefile -c -f - . \\\n"
97 "\t | (cd $(DOCSET_DOCUMENTS); tar xvf -)\n"
98 "\t$(XCODE_INSTALL)/usr/bin/docsetutil index $(DOCSET_NAME)\n"
99 "\trm -f $(DOCSET_DOCUMENTS)/Nodes.xml\n"
100 "\trm -f $(DOCSET_DOCUMENTS)/Info.plist\n"
101 "\trm -f $(DOCSET_DOCUMENTS)/Makefile\n"
102 "\trm -f $(DOCSET_RESOURCES)/Nodes.xml\n"
103 "\trm -f $(DOCSET_RESOURCES)/Tokens.xml\n"
106 "\trm -rf $(DOCSET_NAME)\n"
109 "\tmkdir -p $(DESTDIR)\n"
110 "\tcp -R $(DOCSET_NAME) $(DESTDIR)\n"
113 "\trm -rf $(DESTDIR)/$(DOCSET_NAME)\n"
124 term(
"Could not open file {} for writing\n",plName);
127 ts <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
128 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"\n"
129 "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
130 "<plist version=\"1.0\">\n"
132 " <key>CFBundleName</key>\n"
133 " <string>" << projectName <<
"</string>\n"
134 " <key>CFBundleIdentifier</key>\n"
135 " <string>" << bundleId <<
"</string>\n"
136 " <key>CFBundleVersion</key>\n"
137 " <string>" << projectNumber <<
"</string>\n"
138 " <key>DocSetFeedName</key>\n"
139 " <string>" << feedName <<
"</string>\n"
140 " <key>DocSetFeedUrl</key>\n"
141 " <string>" << feedURL <<
"</string>\n"
142 " <key>DocSetPublisherIdentifier</key>\n"
143 " <string>" << publisherId <<
"</string>\n"
144 " <key>DocSetPublisherName</key>\n"
145 " <string>" << publisherName <<
"</string>\n"
147 " <key>DashDocSetFamily</key>\n"
148 " <string>doxy</string>\n"
149 " <key>DocSetPlatformFamily</key>\n"
150 " <string>doxygen</string>\n"
158 if (!
p->ntf.is_open())
160 term(
"Could not open file {} for writing\n",notes);
162 p->nts.setStream(&
p->ntf);
165 p->nts <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
166 p->nts <<
"<DocSetNodes version=\"1.0\">\n";
167 p->nts <<
" <TOC>\n";
168 p->nts <<
" <Node>\n";
169 p->nts <<
" <Name>Root</Name>\n";
171 p->nts <<
" <Subnodes>\n";
172 p->indentStack.push(
true);
176 if (!
p->ttf.is_open())
178 term(
"Could not open file {} for writing\n",tokens);
180 p->tts.setStream(&
p->ttf);
181 p->tts <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
182 p->tts <<
"<Tokens version=\"1.0\">\n";
187 if (!
p->indentStack.top())
189 p->nts <<
p->indent() <<
" </Node>\n";
191 p->indentStack.pop();
192 p->nts <<
" </Subnodes>\n";
193 p->nts <<
" </Node>\n";
194 p->nts <<
" </TOC>\n";
195 p->nts <<
"</DocSetNodes>\n";
199 p->tts <<
"</Tokens>\n";
214 p->nts <<
p->indent() <<
"<Subnodes>\n";
215 p->indentStack.push(
true);
220 if (!
p->indentStack.top())
222 p->nts <<
p->indent() <<
" </Node>\n";
224 p->nts <<
p->indent() <<
"</Subnodes>\n";
225 p->indentStack.pop();
242 if (!
p->indentStack.top())
244 p->nts <<
p->indent() <<
" </Node>\n";
246 p->indentStack.top()=
false;
247 p->nts <<
p->indent() <<
" <Node>\n";
248 p->nts <<
p->indent() <<
" <Name>" <<
convertToXML(name) <<
"</Name>\n";
249 if (!file.
empty() && file[0]==
'^')
256 p->nts <<
p->indent() <<
" <Path>";
257 if (!file.
empty() && file[0]==
'!')
261 else if (!file.
empty())
267 p->nts <<
"</Path>\n";
270 p->nts <<
p->indent() <<
" <Anchor>" << anchor <<
"</Anchor>\n";
279 if (md==
nullptr && context==
nullptr)
return;
310 case SrcLangExt::Cpp:
311 case SrcLangExt::ObjC:
317 else if (cd==
nullptr && nd==
nullptr)
323 case SrcLangExt::IDL: lang=
"idl";
break;
324 case SrcLangExt::CSharp: lang=
"csharp";
break;
325 case SrcLangExt::PHP: lang=
"php";
break;
326 case SrcLangExt::D: lang=
"d";
break;
327 case SrcLangExt::Java: lang=
"java";
break;
328 case SrcLangExt::JS: lang=
"javascript";
break;
329 case SrcLangExt::Python: lang=
"python";
break;
330 case SrcLangExt::Fortran: lang=
"fortran";
break;
331 case SrcLangExt::VHDL: lang=
"vhdl";
break;
332 case SrcLangExt::XML: lang=
"xml";
break;
333 case SrcLangExt::SQL: lang=
"sql";
break;
334 case SrcLangExt::Markdown:lang=
"markdown";
break;
335 case SrcLangExt::Slice: lang=
"slice";
break;
336 case SrcLangExt::Lex: lang=
"lex";
break;
337 case SrcLangExt::Unknown: lang=
"unknown";
break;
344 case MemberType::Define:
346 case MemberType::Function:
365 case MemberType::Variable:
367 case MemberType::Typedef:
369 case MemberType::Enumeration:
371 case MemberType::EnumValue:
372 type=
"econst";
break;
375 case MemberType::Signal:
376 type=
"signal";
break;
377 case MemberType::Slot:
379 case MemberType::Friend:
381 case MemberType::DCOP:
383 case MemberType::Property:
389 case MemberType::Event:
391 case MemberType::Interface:
393 case MemberType::Service:
395 case MemberType::Sequence:
396 type=
"sequence";
break;
397 case MemberType::Dictionary:
398 type=
"dictionary";
break;
478 t <<
" <TokenIdentifier>\n";
484 t <<
" <APILanguage>" << lang <<
"</APILanguage>\n";
488 t <<
" <Type>" << type <<
"</Type>\n";
494 t <<
" </TokenIdentifier>\n";
497 t <<
" <Path>" << fn <<
"</Path>\n";
500 t <<
" <Anchor>" << anchor <<
"</Anchor>\n";
503 if (!tooltip.
empty())
505 t <<
" <Abstract>" <<
convertToXML(tooltip) <<
"</Abstract>\n";
509 t <<
" <DeclaredIn>" <<
convertToXML(decl) <<
"</DeclaredIn>\n";
A abstract class representing of a compound symbol.
virtual bool isTemplate() const =0
Returns true if this class is a template.
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
virtual const IncludeInfo * includeInfo() const =0
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString fill(char c, size_t len)
Fills a string with a predefined character.
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString left(size_t len) const
const std::string & str() const
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
The common base class of all entity definitions found in the sources.
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual bool isLinkable() const =0
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual DString briefDescriptionAsTooltip() const =0
virtual DString qualifiedName() const =0
virtual DString anchor() const =0
virtual DString getOutputFileBase() const =0
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)
void addIndexFile(const DString &name)
std::unique_ptr< Private > p
void addIndexItem(const Definition *context, const MemberDef *md, const DString §ionAnchor, const DString &title)
void writeToken(TextStream &t, const Definition *d, const DString &type, const DString &lang, const DString &scope=DString(), const DString &anchor=DString(), const DString &decl=DString())
static DString htmlFileExtension
A model of a file symbol.
Class representing the data associated with a #include statement.
A model of a class/file/namespace member symbol.
virtual bool isObjCMethod() const =0
virtual const ClassDef * getClassDef() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isStatic() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual DString getScopeString() const =0
virtual bool isObjCProperty() const =0
virtual MemberType memberType() const =0
An abstract interface of a namespace symbol.
Text streaming class that buffers data.
ClassDef * toClassDef(Definition *d)
#define Config_getString(name)
FileDef * toFileDef(Definition *d)
std::ofstream openOutputStream(const DString &name, bool append=false)
NamespaceDef * toNamespaceDef(Definition *d)
Portable versions of functions that are platform dependent.
std::unordered_set< std::string > scopes
std::stack< bool > indentStack
void addHtmlExtensionIfMissing(DString &fName)
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
A bunch of utility functions.