Commit ff11b7d9 authored by dimitri's avatar dimitri

Release-1.2.13

parent 414d7b3b
# Doxyfile 1.2.5-20010304 # Doxyfile 1.2.12-20011209
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# General configuration options # General configuration options
...@@ -8,21 +8,21 @@ PROJECT_NUMBER = ...@@ -8,21 +8,21 @@ PROJECT_NUMBER =
OUTPUT_DIRECTORY = doxygen_docs OUTPUT_DIRECTORY = doxygen_docs
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
EXTRACT_ALL = YES EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES EXTRACT_PRIVATE = NO
EXTRACT_STATIC = YES EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = NO
HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO HIDE_UNDOC_CLASSES = NO
BRIEF_MEMBER_DESC = YES BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES REPEAT_BRIEF = YES
ALWAYS_DETAILED_SEC = NO ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES FULL_PATH_NAMES = YES
STRIP_FROM_PATH = $(PWD)/ STRIP_FROM_PATH = $(PWD)/
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
CLASS_DIAGRAMS = NO
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES STRIP_CODE_COMMENTS = YES
CASE_SENSE_NAMES = NO CASE_SENSE_NAMES = NO
SHORT_NAMES = NO
HIDE_SCOPE_NAMES = NO HIDE_SCOPE_NAMES = NO
VERBATIM_HEADERS = YES VERBATIM_HEADERS = YES
SHOW_INCLUDE_FILES = YES SHOW_INCLUDE_FILES = YES
...@@ -32,11 +32,11 @@ INLINE_INFO = YES ...@@ -32,11 +32,11 @@ INLINE_INFO = YES
SORT_MEMBER_DOCS = YES SORT_MEMBER_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO DISTRIBUTE_GROUP_DOC = NO
TAB_SIZE = 8 TAB_SIZE = 8
ENABLED_SECTIONS =
GENERATE_TODOLIST = YES GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES GENERATE_BUGLIST = YES
ALIASES = ALIASES =
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30 MAX_INITIALIZER_LINES = 30
OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_FOR_C = NO
SHOW_USED_FILES = YES SHOW_USED_FILES = YES
...@@ -51,7 +51,7 @@ WARN_LOGFILE = ...@@ -51,7 +51,7 @@ WARN_LOGFILE =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the input files # configuration options related to the input files
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
INPUT = src INPUT = src
FILE_PATTERNS = *.h \ FILE_PATTERNS = *.h \
*.cpp *.cpp
RECURSIVE = NO RECURSIVE = NO
...@@ -75,10 +75,18 @@ EXCLUDE = src/code.cpp \ ...@@ -75,10 +75,18 @@ EXCLUDE = src/code.cpp \
EXCLUDE_PATTERNS = EXCLUDE_PATTERNS =
EXAMPLE_PATH = EXAMPLE_PATH =
EXAMPLE_PATTERNS = EXAMPLE_PATTERNS =
EXAMPLE_RECURSIVE = NO
IMAGE_PATH = IMAGE_PATH =
INPUT_FILTER = INPUT_FILTER =
FILTER_SOURCE_FILES = NO FILTER_SOURCE_FILES = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index # configuration options related to the alphabetical class index
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES ALPHABETICAL_INDEX = YES
...@@ -121,12 +129,22 @@ RTF_OUTPUT = ...@@ -121,12 +129,22 @@ RTF_OUTPUT =
COMPACT_RTF = NO COMPACT_RTF = NO
RTF_HYPERLINKS = NO RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE = RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the man page output # configuration options related to the man page output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_MAN = NO GENERATE_MAN = NO
MAN_OUTPUT = MAN_OUTPUT =
MAN_EXTENSION = .3 MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the preprocessor # Configuration options related to the preprocessor
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -138,6 +156,7 @@ INCLUDE_PATH = ...@@ -138,6 +156,7 @@ INCLUDE_PATH =
INCLUDE_FILE_PATTERNS = INCLUDE_FILE_PATTERNS =
PREDEFINED = PREDEFINED =
EXPAND_AS_DEFINED = EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration::addtions related to external references # Configuration::addtions related to external references
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -148,13 +167,17 @@ PERL_PATH = /usr/bin/perl ...@@ -148,13 +167,17 @@ PERL_PATH = /usr/bin/perl
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
HAVE_DOT = NO HAVE_DOT = NO
CLASS_GRAPH = YES CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES COLLABORATION_GRAPH = YES
TEMPLATE_RELATIONS = YES
HIDE_UNDOC_RELATIONS = YES
INCLUDE_GRAPH = YES INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = NO INCLUDED_BY_GRAPH = NO
GRAPHICAL_HIERARCHY = YES GRAPHICAL_HIERARCHY = YES
DOT_PATH = DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_WIDTH = 1024
MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_HEIGHT = 1024
GENERATE_LEGEND = YES GENERATE_LEGEND = YES
......
DOXYGEN Version 1.2.12-20011209 DOXYGEN Version 1.2.13
Please read the installation section of the manual for instructions. Please read the installation section of the manual for instructions.
-------- --------
Dimitri van Heesch (09 December 2001) Dimitri van Heesch (29 December 2001)
...@@ -8,14 +8,16 @@ clean: FORCE ...@@ -8,14 +8,16 @@ clean: FORCE
cd qtools ; $(MAKE) clean cd qtools ; $(MAKE) clean
cd src ; $(MAKE) clean cd src ; $(MAKE) clean
cd addon/doxywizard ; $(MAKE) clean cd addon/doxywizard ; $(MAKE) clean
cd addon/xmlparse ; $(MAKE) clean cd addon/doxmlparser/src ; $(MAKE) clean
cd addon/doxmlparser/test ; $(MAKE) clean
-rm -f bin/doxy* -rm -f bin/doxy*
-rm -f objects/*.o -rm -f objects/*.o
distclean: clean distclean: clean
cd src ; $(MAKE) distclean cd src ; $(MAKE) distclean
cd addon/doxywizard ; $(MAKE) distclean cd addon/doxywizard ; $(MAKE) distclean
cd addon/xmlparse ; $(MAKE) distclean cd addon/doxmlparser/src ; $(MAKE) distclean
cd addon/doxmlparser/test ; $(MAKE) distclean
-rm -f lib/lib* -rm -f lib/lib*
-rm -f bin/doxy* -rm -f bin/doxy*
-rm -f html -rm -f html
...@@ -48,6 +50,7 @@ install_docs: ...@@ -48,6 +50,7 @@ install_docs:
echo "DOXYGEN = $(INSTALL)" > $(DOCDIR)/doc/Makefile echo "DOXYGEN = $(INSTALL)" > $(DOCDIR)/doc/Makefile
echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile
echo "VERSION = $(VERSION)" >> $(DOCDIR)/doc/Makefile echo "VERSION = $(VERSION)" >> $(DOCDIR)/doc/Makefile
echo "PERL = $(PERL)" >> $(DOCDIR)/doc/Makefile
cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile
cd $(DOCDIR)/examples ; $(MAKE) cd $(DOCDIR)/examples ; $(MAKE)
cd $(DOCDIR)/doc ; $(MAKE) cd $(DOCDIR)/doc ; $(MAKE)
......
DOXYGEN Version 1.2.12_20011209 DOXYGEN Version 1.2.13
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (09 December 2001) Dimitri van Heesch (dimitri@stack.nl) (29 December 2001)
1.2.12-20011209 1.2.13
# Doxyfile 1.2.8-20010715 # Doxyfile 1.2.12-20011209
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# General configuration options # General configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
PROJECT_NAME = xmlparse PROJECT_NAME = doxmlparser
PROJECT_NUMBER = PROJECT_NUMBER =
OUTPUT_DIRECTORY = doc OUTPUT_DIRECTORY = doc
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
EXTRACT_ALL = YES EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO HIDE_UNDOC_CLASSES = NO
BRIEF_MEMBER_DESC = YES BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES REPEAT_BRIEF = YES
ALWAYS_DETAILED_SEC = NO ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO FULL_PATH_NAMES = NO
STRIP_FROM_PATH = STRIP_FROM_PATH =
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
CLASS_DIAGRAMS = YES
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES STRIP_CODE_COMMENTS = YES
CASE_SENSE_NAMES = YES CASE_SENSE_NAMES = YES
SHORT_NAMES = NO SHORT_NAMES = NO
...@@ -33,18 +32,18 @@ INLINE_INFO = YES ...@@ -33,18 +32,18 @@ INLINE_INFO = YES
SORT_MEMBER_DOCS = YES SORT_MEMBER_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO DISTRIBUTE_GROUP_DOC = NO
TAB_SIZE = 8 TAB_SIZE = 8
ENABLED_SECTIONS =
GENERATE_TODOLIST = YES GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES GENERATE_BUGLIST = YES
ALIASES = ALIASES =
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30 MAX_INITIALIZER_LINES = 30
OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_FOR_C = NO
SHOW_USED_FILES = YES SHOW_USED_FILES = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to warning and progress messages # configuration options related to warning and progress messages
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
QUIET = NO QUIET = YES
WARNINGS = YES WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES WARN_IF_UNDOCUMENTED = YES
WARN_FORMAT = WARN_FORMAT =
...@@ -52,17 +51,25 @@ WARN_LOGFILE = ...@@ -52,17 +51,25 @@ WARN_LOGFILE =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the input files # configuration options related to the input files
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
INPUT = . INPUT = include
FILE_PATTERNS = *.h *.cpp FILE_PATTERNS = *.h
RECURSIVE = NO RECURSIVE = NO
EXCLUDE = EXCLUDE =
EXCLUDE_PATTERNS = EXCLUDE_PATTERNS =
EXAMPLE_PATH = EXAMPLE_PATH =
EXAMPLE_PATTERNS = EXAMPLE_PATTERNS =
EXAMPLE_RECURSIVE = NO
IMAGE_PATH = IMAGE_PATH =
INPUT_FILTER = INPUT_FILTER =
FILTER_SOURCE_FILES = NO FILTER_SOURCE_FILES = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index # configuration options related to the alphabetical class index
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO ALPHABETICAL_INDEX = NO
...@@ -71,7 +78,7 @@ IGNORE_PREFIX = ...@@ -71,7 +78,7 @@ IGNORE_PREFIX =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the HTML output # configuration options related to the HTML output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_HTML = NO GENERATE_HTML = YES
HTML_OUTPUT = HTML_OUTPUT =
HTML_HEADER = HTML_HEADER =
HTML_FOOTER = HTML_FOOTER =
...@@ -118,6 +125,10 @@ MAN_LINKS = NO ...@@ -118,6 +125,10 @@ MAN_LINKS = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_XML = YES GENERATE_XML = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor # Configuration options related to the preprocessor
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES ENABLE_PREPROCESSING = YES
...@@ -128,6 +139,7 @@ INCLUDE_PATH = ...@@ -128,6 +139,7 @@ INCLUDE_PATH =
INCLUDE_FILE_PATTERNS = INCLUDE_FILE_PATTERNS =
PREDEFINED = PREDEFINED =
EXPAND_AS_DEFINED = EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration::addtions related to external references # Configuration::addtions related to external references
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -138,13 +150,17 @@ PERL_PATH = ...@@ -138,13 +150,17 @@ PERL_PATH =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
HAVE_DOT = YES HAVE_DOT = YES
CLASS_GRAPH = YES CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES COLLABORATION_GRAPH = YES
TEMPLATE_RELATIONS = YES
HIDE_UNDOC_RELATIONS = YES
INCLUDE_GRAPH = YES INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES INCLUDED_BY_GRAPH = YES
GRAPHICAL_HIERARCHY = YES GRAPHICAL_HIERARCHY = YES
DOT_PATH = DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1280 MAX_DOT_GRAPH_WIDTH = 1280
MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_HEIGHT = 1024
GENERATE_LEGEND = YES GENERATE_LEGEND = YES
......
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- NOTE: THIS DTD IS NOT UP TO DATE!!! DO NOT DEPEND ON IT -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- DTD describing the grammar used in doxygen's XML output -->
<!-- standard character entities -->
<!ENTITY lt "&#38;#60;">
<!ENTITY gt "&#62;">
<!ENTITY amp "&#38;#38;">
<!ENTITY apos "&#39;">
<!ENTITY quot "&#34;">
<!-- required attributes for compounds -->
<!ENTITY % compound-req.att
'id ID #REQUIRED
type (group|file|namespace|
class|struct|union|
interface|dispinterface|
valuetype|library) #REQUIRED'
>
<!-- required attributes for references -->
<!ENTITY % ref-req.att 'idref IDREF #REQUIRED'
>
<!-- required attributes for inheritance relations -->
<!ENTITY % inheritcompref-req.att
'%ref-req.att;
prot (public|protected|private) #REQUIRED
virt (non-virtual|virtual) #REQUIRED'
>
<!-- required attributes for member sections -->
<!ENTITY % sec-req.att 'type (user
|public-type
|public-func
|public-attrib
|public-slot
|public-static-func
|public-static-attrib
|protected-type
|protected-func
|protected-attrib
|protected-slot
|protected-static-func
|protected-static-attrib
|private-type
|private-func
|private-attrib
|private-slot
|private-static-func
|private-static-attrib
|signal
|friend
|related
|define|prototype|typedef|enum|func|var
|dcop-func
|property
) #REQUIRED
'
>
<!-- required attributes for members -->
<!ENTITY % mem-req.att 'id ID #REQUIRED'>
<!-- optional attributes for function -->
<!ENTITY % func-opt.att 'virt (virtual|pure-virtual) #IMPLIED'>
<!-- elements -->
<!ELEMENT doxygen (compounddef)*>
<!ELEMENT compounddef (compoundname,
basecompoundref*,
derivedcompoundref*,
sectiondef*,
briefdescription,
detaileddescription,
inheritancegraph?,
collaborationgraph?,
sourcecode?
)
>
<!ATTLIST compounddef %compound-req.att;>
<!ELEMENT compoundref (#PCDATA)>
<!ATTLIST compoundref %ref-req.att;>
<!ELEMENT memberref (#PCDATA)>
<!ATTLIST memberref %ref-req.att;>
<!ELEMENT basecompoundref EMPTY>
<!ATTLIST basecompoundref %inheritcompref-req.att;>
<!ELEMENT derivedcompoundref EMPTY>
<!ATTLIST derivedcompoundref %inheritcompref-req.att;>
<!ELEMENT sectionlist (sectiondef)+>
<!ELEMENT sectiondef (memberlist)>
<!ATTLIST sectiondef %sec-req.att;>
<!ELEMENT memberlist (functiondef|variabledef|typedef|definedef|enumdef)+>
<!ELEMENT functiondef (type?,name,paramlist)>
<!ATTLIST functiondef %mem-req.att; %func-opt.att;>
<!ELEMENT variabledef (type,name,array?,initializer?)>
<!ATTLIST variabledef %mem-req.att;>
<!ELEMENT typedef (type,name)>
<!ATTLIST typedef %mem-req.att;>
<!ELEMENT definedef (name,defparamlist?,initializer?)>
<!ATTLIST definedef %mem-req.att;>
<!ELEMENT enumdef (name,enumvaluelist)>
<!ATTLIST enumdef %mem-req.att;>
<!ELEMENT slotdef (type,name,paramlist)>
<!ATTLIST slotdef %mem-req.att;>
<!ELEMENT signaldef (type,name,paramlist)>
<!ATTLIST signaldef %mem-req.att;>
<!ELEMENT paramlist (param)*>
<!ELEMENT param (attributes?,type,declname?,defname?,array?,defval?)>
<!ELEMENT defparamlist (defarg)*>
<!ELEMENT defarg (#PCDATA)>
<!ELEMENT enumvaluelist (enumvalue)*>
<!ELEMENT enumvalue (name,initializer?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT compoundname (#PCDATA)>
<!ELEMENT declname (#PCDATA)>
<!ELEMENT defname (#PCDATA)>
<!ELEMENT type (#PCDATA|memberref|compoundref|compounddef)*>
<!ELEMENT defval (#PCDATA|memberref|compoundref)*>
<!ELEMENT initializer (#PCDATA|memberref|compoundref)*>
<!ELEMENT array (#PCDATA)>
<!ELEMENT attributes (#PCDATA)>
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H
#include <qstring.h>
class IMember;
class IDocIterator;
class ILinkedText
{
public:
enum Kind { Kind_Text, Kind_Ref };
virtual Kind kind() const = 0;
};
class ILT_Text : public ILinkedText
{
public:
virtual QString text() const = 0;
};
class ILT_Ref : public ILinkedText
{
public:
virtual QString id() const = 0;
virtual QString external() const = 0;
virtual QString text() const = 0;
};
class ILinkedTextIterator
{
public:
virtual ILinkedText *toFirst() = 0;
virtual ILinkedText *toLast() = 0;
virtual ILinkedText *toNext() = 0;
virtual ILinkedText *toPrev() = 0;
virtual ILinkedText *current() const = 0;
virtual void release() = 0;
};
class IParam
{
public:
virtual ILinkedTextIterator *type() const = 0;
virtual QString declarationName() const = 0;
virtual QString definitionName() const = 0;
virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0;
};
class IParamIterator
{
public:
virtual IParam *toFirst() = 0;
virtual IParam *toLast() = 0;
virtual IParam *toNext() = 0;
virtual IParam *toPrev() = 0;
virtual IParam *current() const = 0;
virtual void release() = 0;
};
class IMemberReference
{
public:
virtual IMember *member() const = 0;
virtual QString memberName() const = 0;
};
class IMemberReferenceIterator
{
public:
virtual IMemberReference *toFirst() = 0;
virtual IMemberReference *toLast() = 0;
virtual IMemberReference *toNext() = 0;
virtual IMemberReference *toPrev() = 0;
virtual IMemberReference *current() const = 0;
virtual void release() = 0;
};
class IEnumValue
{
public:
virtual QString name() const = 0;
virtual QString initializer() const = 0;
};
class IEnumValueIterator
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
};
class IDoc
{
public:
enum Kind
{
Para, // 0 -> IDocPara
Text, // 1 -> IDocText
MarkupModifier, // 2 -> IDocMarkupModifier
ItemizedList, // 3 -> IDocList
OrderedList, // 4 -> IDocList
ListItem, // 5 -> IDocListItem
ParameterList, // 6 -> IDocParameterList
Parameter, // 7 -> IDocParameter
SimpleSect, // 8 -> IDocSimpleSect
Title, // 9 -> IDocTitle
Ref, // 10 -> IDocRef
VariableList, // 11 -> IDocVariableList
VariableListEntry, // 12 -> IDocVariableListEntry
HRuler, // 13 -> IDocHRuler
LineBreak, // 14 -> IDocLineBreak
ULink, // 15 -> IDocULink
EMail, // 16 -> IDocEMail
Link, // 17 -> IDocLink
ProgramListing, // 18 -> IDocProgramListing
CodeLine, // 19 -> IDocCodeLine
Highlight, // 20 -> IDocHighlight
Anchor, // 21 -> IDocAnchor
Formula, // 22 -> IDocFormula
Image, // 23 -> IDocImage
DotFile, // 24 -> IDocDotFile
IndexEntry, // 25 -> IDocIndexEntry
Table, // 26 -> IDocTable
Row, // 27 -> IDocRow
Entry, // 28 -> IDocEntry
Section, // 29 -> IDocSection
Root // 30 -> IDocRoot
};
virtual Kind kind() const = 0;
};
class IDocMarkup : public IDoc
{
public:
enum Markup
{
Normal = 0x00,
Bold = 0x01,
Emphasis = 0x02,
ComputerOutput = 0x04,
Subscript = 0x08,
Superscript = 0x10,
SmallFont = 0x20,
Center = 0x40
};
};
class IDocPara : public IDoc
{
public:
virtual IDocIterator *contents() const = 0;
};
class IDocText : public IDocMarkup
{
public:
virtual QString text() const = 0;
virtual int markup() const = 0;
};
class IDocMarkupModifier : public IDoc
{
};
class IDocList : public IDoc
{
};
class IDocListItem : public IDoc
{
};
class IDocParameterList : public IDoc
{
};
class IDocParameter : public IDoc
{
};
class IDocSimpleSect : public IDoc
{
};
class IDocTitle : public IDoc
{
public:
virtual IDocIterator *title() const = 0;
};
class IDocRef : public IDoc
{
};
class IDocVariableList : public IDoc
{
};
class IDocVariableListEntry : public IDoc
{
};
class IDocHRuler : public IDoc
{
};
class IDocLineBreak : public IDoc
{
};
class IDocULink : public IDoc
{
};
class IDocEMail : public IDoc
{
};
class IDocLink : public IDoc
{
};
class IDocProgramListing : public IDoc
{
};
class IDocCodeLine : public IDoc
{
};
class IDocHighlight : public IDoc
{
};
class IDocAnchor : public IDoc
{
};
class IDocFormula : public IDoc
{
};
class IDocImage : public IDoc
{
};
class IDocDotFile : public IDoc
{
};
class IDocIndexEntry : public IDoc
{
};
class IDocTable : public IDoc
{
};
class IDocRow : public IDoc
{
};
class IDocEntry : public IDoc
{
};
class IDocSection : public IDoc
{
public:
virtual QString id() const = 0;
virtual int level() const = 0;
virtual IDocIterator *title() const = 0;
};
class IDocRoot : public IDoc
{
public:
virtual IDocIterator *contents() const = 0;
};
class IDocIterator
{
public:
virtual IDoc *toFirst() = 0;
virtual IDoc *toLast() = 0;
virtual IDoc *toNext() = 0;
virtual IDoc *toPrev() = 0;
virtual IDoc *current() const = 0;
virtual void release() = 0;
};
class IMember
{
public:
virtual QString kind() const = 0;
virtual QString id() const = 0;
virtual QString protection() const = 0;
virtual QString virtualness() const = 0;
virtual ILinkedTextIterator *type() const = 0;
virtual QString name() const = 0;
virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0;
virtual IParamIterator *params() const = 0;
virtual ILinkedTextIterator *initializer() const = 0;
virtual ILinkedTextIterator *exceptions() const = 0;
virtual IMemberReferenceIterator *references() const = 0;
virtual IMemberReferenceIterator *referencedBy() const = 0;
virtual int bodyStart() const = 0;
virtual int bodyEnd() const = 0;
virtual QString definitionFile() const = 0;
virtual int definitionLine() const = 0;
virtual IMemberReference *reimplements() const = 0;
virtual IMemberReferenceIterator *reimplementedBy() const = 0;
virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
};
class IMemberIterator
{
public:
virtual IMember *toFirst() = 0;
virtual IMember *toLast() = 0;
virtual IMember *toNext() = 0;
virtual IMember *toPrev() = 0;
virtual IMember *current() const = 0;
virtual void release() = 0;
};
class ISection
{
public:
virtual QString kind() const = 0;
virtual IMemberIterator *members() const = 0;
};
class ISectionIterator
{
public:
virtual ISection *toFirst() = 0;
virtual ISection *toLast() = 0;
virtual ISection *toNext() = 0;
virtual ISection *toPrev() = 0;
virtual ISection *current() const = 0;
virtual void release() = 0;
};
class ICompound
{
public:
virtual QString name() const = 0;
virtual QString id() const = 0;
virtual QString kind() const = 0;
virtual ISectionIterator *sections() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
};
class ICompoundIterator
{
public:
virtual ICompound *toFirst() = 0;
virtual ICompound *toLast() = 0;
virtual ICompound *toNext() = 0;
virtual ICompound *toPrev() = 0;
virtual ICompound *current() const = 0;
virtual void release() = 0;
};
/*! Root node of the object model. */
class IDoxygen
{
public:
/*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project.
*/
virtual ICompoundIterator *compounds() const = 0;
/*! Returns a compound given its unique \a id. If you have a
* compound id this function is much more efficient than iterating
* over the compound list. Returns 0 if the id is not valid.
*/
virtual ICompound *compoundById(const QString &id) const = 0;
/*! Returns a compound given its name (including the scope).
* Returns 0 if the name is not found in the project.
*/
virtual ICompound *compoundByName(const QString &name) const = 0;
/*! Returns an interface to a member given its id.
* @param id The member id.
*/
virtual IMember *memberById(const QString &id) const = 0;
/*! Returns a list of all members with a certain name.
* @param name The name of the member.
*/
virtual IMemberIterator *memberByName(const QString &name) const = 0;
/*! Releases the memory for the object hierarchy obtained by
* createdObjecModelFromXML(). First release all iterators before calling
* this function.
*/
virtual void release() = 0;
};
/*! Factory method that creates an object model given an XML file generated
* by doxygen.
* @param xmlFileName The name of the XML to parse.
* @returns An iterface to the object model.
*/
IDoxygen *createObjectModelFromXML(const char *xmlFileName);
#endif
all clean depend: Makefile.doxmlparser
$(MAKE) -f Makefile.doxmlparser $@
distclean: clean
$(RM) -rf Makefile.doxmlparser doxmlparser.pro Makefile obj
tmake:
$(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
Makefile.doxmlparser: doxmlparser.pro
$(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
install:
...@@ -202,6 +202,9 @@ template<class T> class BaseHandler : public IBaseHandler, ...@@ -202,6 +202,9 @@ template<class T> class BaseHandler : public IBaseHandler,
return TRUE; return TRUE;
} }
/*! called when a number of characters are received by the parser.
* \param ch the characters.
*/
virtual bool characters ( const QString & ch ) virtual bool characters ( const QString & ch )
{ {
if (m_delegateHandler) if (m_delegateHandler)
......
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#ifndef BASEITERATOR_H
#define BASEITERATOR_H
#include <qlist.h>
#include <doxmlintf.h>
template<class Intf,class ElemIntf,class ElemImpl> class BaseIterator :
public Intf, public QListIterator<ElemImpl>
{
public:
BaseIterator(const QList<ElemImpl> &list) : QListIterator<ElemImpl>(list) {}
virtual ~BaseIterator() {}
virtual ElemIntf *toFirst() { return QListIterator<ElemImpl>::toFirst(); }
virtual ElemIntf *toLast() { return QListIterator<ElemImpl>::toLast(); }
virtual ElemIntf *toNext() { return QListIterator<ElemImpl>::operator++(); }
virtual ElemIntf *toPrev() { return QListIterator<ElemImpl>::operator--(); }
virtual ElemIntf *current() const { return QListIterator<ElemImpl>::current(); }
virtual void release() { delete this; }
};
#endif
...@@ -18,15 +18,23 @@ ...@@ -18,15 +18,23 @@
#include <qstring.h> #include <qstring.h>
#include <qlist.h> #include <qlist.h>
#include <qxml.h> #include <qxml.h>
#include <doxmlintf.h>
#include "basehandler.h" #include "basehandler.h"
#include "baseiterator.h"
#include "sectionhandler.h" #include "sectionhandler.h"
#include "doxmlintf.h"
class MainHandler; class MainHandler;
class DocHandler; class DocHandler;
class ProgramListingHandler; class ProgramListingHandler;
class CompoundIterator : public BaseIterator<ICompoundIterator,ICompound,ICompound>
{
public:
CompoundIterator(const QList<ICompound> &list) :
BaseIterator<ICompoundIterator,ICompound,ICompound>(list) {}
};
class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler> class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
{ {
public: public:
...@@ -43,13 +51,19 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler> ...@@ -43,13 +51,19 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
CompoundHandler(IBaseHandler *parent); CompoundHandler(IBaseHandler *parent);
virtual ~CompoundHandler(); virtual ~CompoundHandler();
void initialize(MainHandler *m);
// ICompound // ICompound implementation
QString name() const { return m_name; } QString name() const { return m_name; }
QString id() const { return m_id; } QString id() const { return m_id; }
QString kind() const { return m_kind; } QString kind() const { return m_kind; }
QListIterator<ISection> getSectionIterator() const { return m_sections; } ISectionIterator *sections() const
void initialize(MainHandler *m); { return new SectionIterator(m_sections); }
virtual IDocRoot *briefDescription() const
{ return m_brief; }
virtual IDocRoot *detailedDescription() const
{ return m_detailed; }
private: private:
struct SuperClass struct SuperClass
......
...@@ -58,8 +58,8 @@ static TypeNameMapper g_typeMapper; ...@@ -58,8 +58,8 @@ static TypeNameMapper g_typeMapper;
// MarkupHandler // MarkupHandler
//---------------------------------------------------------------------- //----------------------------------------------------------------------
MarkupHandler::MarkupHandler(QList<DocNode> &children,QString &curString) MarkupHandler::MarkupHandler(QList<IDoc> &children,QString &curString)
: m_children(children), m_curString(curString), m_curMarkup(DocNode::Normal) : m_children(children), m_curString(curString), m_curMarkup(IDocMarkup::Normal)
{ {
addStartHandler("bold",this,&MarkupHandler::startBold); addStartHandler("bold",this,&MarkupHandler::startBold);
addEndHandler("bold",this,&MarkupHandler::endBold); addEndHandler("bold",this,&MarkupHandler::endBold);
...@@ -100,99 +100,99 @@ void MarkupHandler::addTextNode() ...@@ -100,99 +100,99 @@ void MarkupHandler::addTextNode()
void MarkupHandler::startBold(const QXmlAttributes & /*attrib*/) void MarkupHandler::startBold(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Bold,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::Bold,TRUE));
m_curMarkup |= DocNode::Bold; m_curMarkup |= IDocMarkup::Bold;
} }
void MarkupHandler::endBold() void MarkupHandler::endBold()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Bold,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::Bold,FALSE));
m_curMarkup &= ~DocNode::Bold; m_curMarkup &= ~IDocMarkup::Bold;
} }
void MarkupHandler::startEmphasis(const QXmlAttributes & /*attrib*/) void MarkupHandler::startEmphasis(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Emphasis,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::Emphasis,TRUE));
m_curMarkup |= DocNode::Emphasis; m_curMarkup |= IDocMarkup::Emphasis;
} }
void MarkupHandler::endEmphasis() void MarkupHandler::endEmphasis()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Emphasis,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::Emphasis,FALSE));
m_curMarkup &= ~DocNode::Emphasis; m_curMarkup &= ~IDocMarkup::Emphasis;
} }
void MarkupHandler::startComputerOutput(const QXmlAttributes & /*attrib*/) void MarkupHandler::startComputerOutput(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::ComputerOutput,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::ComputerOutput,TRUE));
m_curMarkup |= DocNode::ComputerOutput; m_curMarkup |= IDocMarkup::ComputerOutput;
} }
void MarkupHandler::endComputerOutput() void MarkupHandler::endComputerOutput()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::ComputerOutput,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::ComputerOutput,FALSE));
m_curMarkup &= ~DocNode::ComputerOutput; m_curMarkup &= ~IDocMarkup::ComputerOutput;
} }
void MarkupHandler::startCenter(const QXmlAttributes & /*attrib*/) void MarkupHandler::startCenter(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Center,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::Center,TRUE));
m_curMarkup |= DocNode::Center; m_curMarkup |= IDocMarkup::Center;
} }
void MarkupHandler::endCenter() void MarkupHandler::endCenter()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Center,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::Center,FALSE));
m_curMarkup &= ~DocNode::Center; m_curMarkup &= ~IDocMarkup::Center;
} }
void MarkupHandler::startSmallFont(const QXmlAttributes & /*attrib*/) void MarkupHandler::startSmallFont(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::SmallFont,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::SmallFont,TRUE));
m_curMarkup |= DocNode::SmallFont; m_curMarkup |= IDocMarkup::SmallFont;
} }
void MarkupHandler::endSmallFont() void MarkupHandler::endSmallFont()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::SmallFont,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::SmallFont,FALSE));
m_curMarkup &= ~DocNode::SmallFont; m_curMarkup &= ~IDocMarkup::SmallFont;
} }
void MarkupHandler::startSubscript(const QXmlAttributes & /*attrib*/) void MarkupHandler::startSubscript(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Subscript,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::Subscript,TRUE));
m_curMarkup |= DocNode::Subscript; m_curMarkup |= IDocMarkup::Subscript;
} }
void MarkupHandler::endSubscript() void MarkupHandler::endSubscript()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Subscript,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::Subscript,FALSE));
m_curMarkup &= ~DocNode::Subscript; m_curMarkup &= ~IDocMarkup::Subscript;
} }
void MarkupHandler::startSuperscript(const QXmlAttributes & /*attrib*/) void MarkupHandler::startSuperscript(const QXmlAttributes & /*attrib*/)
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Superscript,TRUE)); m_children.append(new MarkupModifierNode(IDocMarkup::Superscript,TRUE));
m_curMarkup |= DocNode::Superscript; m_curMarkup |= IDocMarkup::Superscript;
} }
void MarkupHandler::endSuperscript() void MarkupHandler::endSuperscript()
{ {
addTextNode(); addTextNode();
m_children.append(new MarkupModifierNode(DocNode::Superscript,FALSE)); m_children.append(new MarkupModifierNode(IDocMarkup::Superscript,FALSE));
m_curMarkup &= ~DocNode::Superscript; m_curMarkup &= ~IDocMarkup::Superscript;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
...@@ -200,7 +200,7 @@ void MarkupHandler::endSuperscript() ...@@ -200,7 +200,7 @@ void MarkupHandler::endSuperscript()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ListItemHandler::ListItemHandler(IBaseHandler *parent) ListItemHandler::ListItemHandler(IBaseHandler *parent)
: DocNode(ListItem), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
...@@ -236,8 +236,8 @@ void ListItemHandler::startParagraph(const QXmlAttributes& attrib) ...@@ -236,8 +236,8 @@ void ListItemHandler::startParagraph(const QXmlAttributes& attrib)
// ListHandler // ListHandler
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ListHandler::ListHandler(NodeKind k,IBaseHandler *parent) ListHandler::ListHandler(Kind k,IBaseHandler *parent)
: DocNode(k), m_parent(parent) : m_parent(parent), m_kind(k)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
const char *endListName=0; const char *endListName=0;
...@@ -277,7 +277,7 @@ void ListHandler::startListItem(const QXmlAttributes& attrib) ...@@ -277,7 +277,7 @@ void ListHandler::startListItem(const QXmlAttributes& attrib)
// ParameterHandler // ParameterHandler
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ParameterHandler::ParameterHandler(IBaseHandler *parent) : DocNode(Parameter), ParameterHandler::ParameterHandler(IBaseHandler *parent) :
m_parent(parent), m_description(0) m_parent(parent), m_description(0)
{ {
addEndHandler("parametername",this,&ParameterHandler::endParameterName); addEndHandler("parametername",this,&ParameterHandler::endParameterName);
...@@ -325,7 +325,7 @@ void ParameterHandler::startParagraph(const QXmlAttributes& attrib) ...@@ -325,7 +325,7 @@ void ParameterHandler::startParagraph(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ParameterListHandler::ParameterListHandler(IBaseHandler *parent) ParameterListHandler::ParameterListHandler(IBaseHandler *parent)
: DocNode(ParameterList), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("parameterlist",this,&ParameterListHandler::endParameterList); addEndHandler("parameterlist",this,&ParameterListHandler::endParameterList);
addStartHandler("parametername",this,&ParameterListHandler::startParameterName); addStartHandler("parametername",this,&ParameterListHandler::startParameterName);
...@@ -377,7 +377,7 @@ void ParameterListHandler::startParameterDescription(const QXmlAttributes& attri ...@@ -377,7 +377,7 @@ void ParameterListHandler::startParameterDescription(const QXmlAttributes& attri
//---------------------------------------------------------------------- //----------------------------------------------------------------------
LinkHandler::LinkHandler(IBaseHandler *parent) LinkHandler::LinkHandler(IBaseHandler *parent)
: DocNode(Link), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("link",this,&LinkHandler::endLink); addEndHandler("link",this,&LinkHandler::endLink);
} }
...@@ -407,7 +407,7 @@ void LinkHandler::endLink() ...@@ -407,7 +407,7 @@ void LinkHandler::endLink()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
EMailHandler::EMailHandler(IBaseHandler *parent) EMailHandler::EMailHandler(IBaseHandler *parent)
: DocNode(EMail), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("email",this,&EMailHandler::endEMail); addEndHandler("email",this,&EMailHandler::endEMail);
} }
...@@ -436,7 +436,7 @@ void EMailHandler::endEMail() ...@@ -436,7 +436,7 @@ void EMailHandler::endEMail()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ULinkHandler::ULinkHandler(IBaseHandler *parent) ULinkHandler::ULinkHandler(IBaseHandler *parent)
: DocNode(ULink), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("ulink",this,&ULinkHandler::endULink); addEndHandler("ulink",this,&ULinkHandler::endULink);
} }
...@@ -466,7 +466,7 @@ void ULinkHandler::endULink() ...@@ -466,7 +466,7 @@ void ULinkHandler::endULink()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
LineBreakHandler::LineBreakHandler(IBaseHandler *parent) LineBreakHandler::LineBreakHandler(IBaseHandler *parent)
: DocNode(LineBreak), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("linebreak",this,&LineBreakHandler::endLineBreak); addEndHandler("linebreak",this,&LineBreakHandler::endLineBreak);
} }
...@@ -492,7 +492,7 @@ void LineBreakHandler::endLineBreak() ...@@ -492,7 +492,7 @@ void LineBreakHandler::endLineBreak()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
HRulerHandler::HRulerHandler(IBaseHandler *parent) HRulerHandler::HRulerHandler(IBaseHandler *parent)
: DocNode(HRuler), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("hruler",this,&HRulerHandler::endHRuler); addEndHandler("hruler",this,&HRulerHandler::endHRuler);
} }
...@@ -518,7 +518,7 @@ void HRulerHandler::endHRuler() ...@@ -518,7 +518,7 @@ void HRulerHandler::endHRuler()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
RefHandler::RefHandler(IBaseHandler *parent) RefHandler::RefHandler(IBaseHandler *parent)
: DocNode(Ref), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("ref",this,&RefHandler::endRef); addEndHandler("ref",this,&RefHandler::endRef);
} }
...@@ -549,7 +549,7 @@ void RefHandler::endRef() ...@@ -549,7 +549,7 @@ void RefHandler::endRef()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
TitleHandler::TitleHandler(IBaseHandler *parent) TitleHandler::TitleHandler(IBaseHandler *parent)
: DocNode(Title), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
m_markupHandler = new MarkupHandler(m_children,m_curString); m_markupHandler = new MarkupHandler(m_children,m_curString);
...@@ -595,12 +595,17 @@ void TitleHandler::startRef(const QXmlAttributes& attrib) ...@@ -595,12 +595,17 @@ void TitleHandler::startRef(const QXmlAttributes& attrib)
m_children.append(ref); m_children.append(ref);
} }
IDocIterator *TitleHandler::title() const
{
return new TitleIterator(*this);
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// SimpleSectHandler // SimpleSectHandler
//---------------------------------------------------------------------- //----------------------------------------------------------------------
SimpleSectHandler::SimpleSectHandler(IBaseHandler *parent) SimpleSectHandler::SimpleSectHandler(IBaseHandler *parent)
: DocNode(Para), m_parent(parent), m_paragraph(0), m_title(0) : m_parent(parent), m_paragraph(0), m_title(0)
{ {
addStartHandler("title",this,&SimpleSectHandler::startTitle); addStartHandler("title",this,&SimpleSectHandler::startTitle);
addStartHandler("para",this,&SimpleSectHandler::startParagraph); addStartHandler("para",this,&SimpleSectHandler::startParagraph);
...@@ -643,7 +648,7 @@ void SimpleSectHandler::startParagraph(const QXmlAttributes& attrib) ...@@ -643,7 +648,7 @@ void SimpleSectHandler::startParagraph(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
VariableListEntryHandler::VariableListEntryHandler(IBaseHandler *parent) VariableListEntryHandler::VariableListEntryHandler(IBaseHandler *parent)
: DocNode(VariableListEntry), m_parent(parent), m_description(0) : m_parent(parent), m_description(0)
{ {
addStartHandler("term",this,&VariableListEntryHandler::startTerm); addStartHandler("term",this,&VariableListEntryHandler::startTerm);
addEndHandler("term",this,&VariableListEntryHandler::endTerm); addEndHandler("term",this,&VariableListEntryHandler::endTerm);
...@@ -706,7 +711,7 @@ void VariableListEntryHandler::startParagraph(const QXmlAttributes& attrib) ...@@ -706,7 +711,7 @@ void VariableListEntryHandler::startParagraph(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
VariableListHandler::VariableListHandler(IBaseHandler *parent) VariableListHandler::VariableListHandler(IBaseHandler *parent)
: DocNode(VariableList), m_parent(parent) : m_parent(parent)
{ {
m_entries.setAutoDelete(TRUE); m_entries.setAutoDelete(TRUE);
addStartHandler("varlistentry",this,&VariableListHandler::startVarListEntry); addStartHandler("varlistentry",this,&VariableListHandler::startVarListEntry);
...@@ -749,7 +754,7 @@ void VariableListHandler::startListItem(const QXmlAttributes& attrib) ...@@ -749,7 +754,7 @@ void VariableListHandler::startListItem(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
HighlightHandler::HighlightHandler(IBaseHandler *parent) HighlightHandler::HighlightHandler(IBaseHandler *parent)
: DocNode(Highlight), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("highlight",this,&HighlightHandler::endHighlight); addEndHandler("highlight",this,&HighlightHandler::endHighlight);
} }
...@@ -777,7 +782,7 @@ void HighlightHandler::endHighlight() ...@@ -777,7 +782,7 @@ void HighlightHandler::endHighlight()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
CodeLineHandler::CodeLineHandler(IBaseHandler *parent) CodeLineHandler::CodeLineHandler(IBaseHandler *parent)
: DocNode(CodeLine), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
addEndHandler("codeline",this,&CodeLineHandler::endCodeLine); addEndHandler("codeline",this,&CodeLineHandler::endCodeLine);
...@@ -837,7 +842,7 @@ void CodeLineHandler::addTextNode() ...@@ -837,7 +842,7 @@ void CodeLineHandler::addTextNode()
{ {
if (!m_curString.isEmpty()) if (!m_curString.isEmpty())
{ {
m_children.append(new TextNode(m_curString,DocNode::Normal)); m_children.append(new TextNode(m_curString,IDocMarkup::Normal));
printf("addTextNode() text=\"%s\"\n", printf("addTextNode() text=\"%s\"\n",
m_curString.data()); m_curString.data());
m_curString=""; m_curString="";
...@@ -849,7 +854,7 @@ void CodeLineHandler::addTextNode() ...@@ -849,7 +854,7 @@ void CodeLineHandler::addTextNode()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ProgramListingHandler::ProgramListingHandler(IBaseHandler *parent) ProgramListingHandler::ProgramListingHandler(IBaseHandler *parent)
: DocNode(ProgramListing), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
m_hasLineNumber=FALSE; m_hasLineNumber=FALSE;
...@@ -905,7 +910,7 @@ void ProgramListingHandler::startCodeLine(const QXmlAttributes& attrib) ...@@ -905,7 +910,7 @@ void ProgramListingHandler::startCodeLine(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
FormulaHandler::FormulaHandler(IBaseHandler *parent) FormulaHandler::FormulaHandler(IBaseHandler *parent)
: DocNode(Formula), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("formula",this,&FormulaHandler::endFormula); addEndHandler("formula",this,&FormulaHandler::endFormula);
} }
...@@ -933,7 +938,7 @@ void FormulaHandler::endFormula() ...@@ -933,7 +938,7 @@ void FormulaHandler::endFormula()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ImageHandler::ImageHandler(IBaseHandler *parent) ImageHandler::ImageHandler(IBaseHandler *parent)
: DocNode(Image), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("image",this,&ImageHandler::endImage); addEndHandler("image",this,&ImageHandler::endImage);
} }
...@@ -961,7 +966,7 @@ void ImageHandler::endImage() ...@@ -961,7 +966,7 @@ void ImageHandler::endImage()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
DotFileHandler::DotFileHandler(IBaseHandler *parent) DotFileHandler::DotFileHandler(IBaseHandler *parent)
: DocNode(DotFile), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("image",this,&DotFileHandler::endDotFile); addEndHandler("image",this,&DotFileHandler::endDotFile);
} }
...@@ -989,7 +994,7 @@ void DotFileHandler::endDotFile() ...@@ -989,7 +994,7 @@ void DotFileHandler::endDotFile()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
IndexEntryHandler::IndexEntryHandler(IBaseHandler *parent) IndexEntryHandler::IndexEntryHandler(IBaseHandler *parent)
: DocNode(IndexEntry), m_parent(parent) : m_parent(parent)
{ {
addEndHandler("indexentry",this,&IndexEntryHandler::endIndexEntry); addEndHandler("indexentry",this,&IndexEntryHandler::endIndexEntry);
addStartHandler("primaryie",this,&IndexEntryHandler::startPrimaryIE); addStartHandler("primaryie",this,&IndexEntryHandler::startPrimaryIE);
...@@ -1040,7 +1045,7 @@ void IndexEntryHandler::endSecondaryIE() ...@@ -1040,7 +1045,7 @@ void IndexEntryHandler::endSecondaryIE()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
EntryHandler::EntryHandler(IBaseHandler *parent) EntryHandler::EntryHandler(IBaseHandler *parent)
: DocNode(Entry), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
addEndHandler("entry",this,&EntryHandler::endEntry); addEndHandler("entry",this,&EntryHandler::endEntry);
...@@ -1073,7 +1078,7 @@ void EntryHandler::startParagraph(const QXmlAttributes& attrib) ...@@ -1073,7 +1078,7 @@ void EntryHandler::startParagraph(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
RowHandler::RowHandler(IBaseHandler *parent) RowHandler::RowHandler(IBaseHandler *parent)
: DocNode(Row), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
addEndHandler("row",this,&RowHandler::endRow); addEndHandler("row",this,&RowHandler::endRow);
...@@ -1106,7 +1111,7 @@ void RowHandler::startEntry(const QXmlAttributes& attrib) ...@@ -1106,7 +1111,7 @@ void RowHandler::startEntry(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
TableHandler::TableHandler(IBaseHandler *parent) TableHandler::TableHandler(IBaseHandler *parent)
: DocNode(Table), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
addEndHandler("table",this,&TableHandler::endTable); addEndHandler("table",this,&TableHandler::endTable);
...@@ -1141,7 +1146,7 @@ void TableHandler::startRow(const QXmlAttributes& attrib) ...@@ -1141,7 +1146,7 @@ void TableHandler::startRow(const QXmlAttributes& attrib)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
ParagraphHandler::ParagraphHandler(IBaseHandler *parent) ParagraphHandler::ParagraphHandler(IBaseHandler *parent)
: DocNode(Para), m_parent(parent) : m_parent(parent)
{ {
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
...@@ -1334,6 +1339,70 @@ void ParagraphHandler::addTextNode() ...@@ -1334,6 +1339,70 @@ void ParagraphHandler::addTextNode()
} }
} }
IDocIterator *ParagraphHandler::contents() const
{
return new ParagraphIterator(*this);
}
//----------------------------------------------------------------------
// DocSectionHandler
//----------------------------------------------------------------------
DocSectionHandler::DocSectionHandler(IBaseHandler *parent,int level)
: m_parent(parent), m_level(level)
{
m_children.setAutoDelete(TRUE);
m_markupHandler = new MarkupHandler(m_children,m_curString);
setFallBackHandler(m_markupHandler);
addStartHandler("ref",this,&DocSectionHandler::startRef);
QString sectionKey;
sectionKey.sprintf("sect%d",level);
addEndHandler(sectionKey,this,&DocSectionHandler::endDocSection);
}
DocSectionHandler::~DocSectionHandler()
{
delete m_markupHandler;
}
void DocSectionHandler::startDocSection(const QXmlAttributes& attrib)
{
m_parent->setDelegate(this);
printf("Start docsection\n");
m_id = attrib.value("id");
m_curString="";
}
void DocSectionHandler::endDocSection()
{
addTextNode();
m_parent->setDelegate(0);
printf("End docsection\n");
}
void DocSectionHandler::addTextNode()
{
if (!m_curString.isEmpty())
{
m_children.append(new TextNode(m_curString,m_markupHandler->markup()));
printf("addTextNode() text=\"%s\" markup=%x\n",
m_curString.data(),m_markupHandler->markup());
m_curString="";
}
}
void DocSectionHandler::startRef(const QXmlAttributes& attrib)
{
RefHandler *ref = new RefHandler(this);
ref->startRef(attrib);
m_children.append(ref);
}
IDocIterator *DocSectionHandler::title() const
{
return new DocSectionIterator(*this);
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// DocHandler // DocHandler
//---------------------------------------------------------------------- //----------------------------------------------------------------------
...@@ -1346,6 +1415,10 @@ DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -1346,6 +1415,10 @@ DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent)
addEndHandler("detaileddescription",this,&DocHandler::endDoc); addEndHandler("detaileddescription",this,&DocHandler::endDoc);
addStartHandler("para",this,&DocHandler::startParagraph); addStartHandler("para",this,&DocHandler::startParagraph);
addStartHandler("sect1",this,&DocHandler::startSect1);
addStartHandler("sect2",this,&DocHandler::startSect2);
addStartHandler("sect3",this,&DocHandler::startSect3);
addStartHandler("title",this,&DocHandler::startTitle);
} }
DocHandler::~DocHandler() DocHandler::~DocHandler()
...@@ -1371,3 +1444,36 @@ void DocHandler::startParagraph(const QXmlAttributes& attrib) ...@@ -1371,3 +1444,36 @@ void DocHandler::startParagraph(const QXmlAttributes& attrib)
m_children.append(parHandler); m_children.append(parHandler);
} }
void DocHandler::startSect1(const QXmlAttributes& attrib)
{
DocSectionHandler *secHandler = new DocSectionHandler(this,1);
secHandler->startDocSection(attrib);
m_children.append(secHandler);
}
void DocHandler::startSect2(const QXmlAttributes& attrib)
{
DocSectionHandler *secHandler = new DocSectionHandler(this,2);
secHandler->startDocSection(attrib);
m_children.append(secHandler);
}
void DocHandler::startSect3(const QXmlAttributes& attrib)
{
DocSectionHandler *secHandler = new DocSectionHandler(this,3);
secHandler->startDocSection(attrib);
m_children.append(secHandler);
}
void DocHandler::startTitle(const QXmlAttributes& attrib)
{
TitleHandler *titleHandler = new TitleHandler(this);
titleHandler->startTitle(attrib);
m_children.append(titleHandler);
}
IDocIterator *DocHandler::contents() const
{
return new DocIterator(*this);
}
...@@ -20,79 +20,29 @@ ...@@ -20,79 +20,29 @@
#include <qlist.h> #include <qlist.h>
#include <qxml.h> #include <qxml.h>
#include <doxmlintf.h>
#include "basehandler.h" #include "basehandler.h"
#include "baseiterator.h"
class ParagraphHandler; class ParagraphHandler;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! \brief Node of a structured documentation tree.
*
*/
class DocNode
{
public:
enum Markup
{
Normal = 0x00,
Bold = 0x01,
Emphasis = 0x02,
ComputerOutput = 0x04,
Subscript = 0x08,
Superscript = 0x10,
SmallFont = 0x20,
Center = 0x40
};
enum NodeKind
{
Para,
Text,
MarkupModifier,
ItemizedList,
OrderedList,
ListItem,
ParameterList,
Parameter,
SimpleSect,
Title,
Ref,
VariableList,
VariableListEntry,
HRuler,
LineBreak,
ULink,
EMail,
Link,
ProgramListing,
CodeLine,
Highlight,
Anchor,
Formula,
Image,
DotFile,
IndexEntry,
Table,
Row,
Entry
};
DocNode(NodeKind k) : m_kind(k) {}
virtual ~DocNode() {}
private:
NodeKind m_kind;
};
//-----------------------------------------------------------------------------
/*! \brief Node representing a piece of text. /*! \brief Node representing a piece of text.
* *
*/ */
class TextNode : public DocNode class TextNode : public IDocText
{ {
public: public:
TextNode(const QString &t,int markup) TextNode(const QString &t,int markup)
: DocNode(Text), m_text(t), m_markup(markup) {} : m_text(t), m_markup(markup) {}
virtual ~TextNode() {}
// IDocText
virtual Kind kind() const { return Text; }
virtual QString text() const { return m_text; }
virtual int markup() const { return m_markup; }
private: private:
QString m_text; QString m_text;
...@@ -104,12 +54,16 @@ class TextNode : public DocNode ...@@ -104,12 +54,16 @@ class TextNode : public DocNode
/*! \brief Node representing a change in the markup style. /*! \brief Node representing a change in the markup style.
* *
*/ */
class MarkupModifierNode : public DocNode class MarkupModifierNode : public IDocMarkupModifier
{ {
public: public:
MarkupModifierNode(int markup,bool enabled) MarkupModifierNode(int markup,bool enabled)
: DocNode(MarkupModifier), m_markup(markup), m_enabled(enabled) {} : m_markup(markup), m_enabled(enabled) {}
virtual ~MarkupModifierNode() {}
// IDocMarkupModifier
virtual Kind kind() const { return MarkupModifier; }
private: private:
int m_markup; int m_markup;
bool m_enabled; bool m_enabled;
...@@ -124,7 +78,7 @@ class MarkupModifierNode : public DocNode ...@@ -124,7 +78,7 @@ class MarkupModifierNode : public DocNode
class MarkupHandler : public BaseFallBackHandler<MarkupHandler> class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
{ {
public: public:
MarkupHandler(QList<DocNode> &children,QString &curString); MarkupHandler(QList<IDoc> &children,QString &curString);
virtual ~MarkupHandler(); virtual ~MarkupHandler();
int markup() const { return m_curMarkup; } int markup() const { return m_curMarkup; }
...@@ -147,7 +101,7 @@ class MarkupHandler : public BaseFallBackHandler<MarkupHandler> ...@@ -147,7 +101,7 @@ class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
private: private:
void addTextNode(); void addTextNode();
QList<DocNode> &m_children; QList<IDoc> &m_children;
QString &m_curString; QString &m_curString;
int m_curMarkup; int m_curMarkup;
}; };
...@@ -158,7 +112,7 @@ class MarkupHandler : public BaseFallBackHandler<MarkupHandler> ...@@ -158,7 +112,7 @@ class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
/*! \brief Node representing a list item. /*! \brief Node representing a list item.
* *
*/ */
class ListItemHandler : public DocNode, public BaseHandler<ListItemHandler> class ListItemHandler : public IDocListItem, public BaseHandler<ListItemHandler>
{ {
public: public:
ListItemHandler(IBaseHandler *parent); ListItemHandler(IBaseHandler *parent);
...@@ -167,9 +121,12 @@ class ListItemHandler : public DocNode, public BaseHandler<ListItemHandler> ...@@ -167,9 +121,12 @@ class ListItemHandler : public DocNode, public BaseHandler<ListItemHandler>
virtual void endListItem(); virtual void endListItem();
virtual void startParagraph(const QXmlAttributes& attrib); virtual void startParagraph(const QXmlAttributes& attrib);
// IDocItem
virtual Kind kind() const { return ListItem; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocNode> m_children; QList<IDoc> m_children;
}; };
...@@ -178,18 +135,22 @@ class ListItemHandler : public DocNode, public BaseHandler<ListItemHandler> ...@@ -178,18 +135,22 @@ class ListItemHandler : public DocNode, public BaseHandler<ListItemHandler>
/*! \brief Node representing list of items. /*! \brief Node representing list of items.
* *
*/ */
class ListHandler : public DocNode, public BaseHandler<ListHandler> class ListHandler : public IDocList, public BaseHandler<ListHandler>
{ {
public: public:
ListHandler(NodeKind k,IBaseHandler *parent); ListHandler(Kind k,IBaseHandler *parent);
virtual ~ListHandler(); virtual ~ListHandler();
virtual void startList(const QXmlAttributes& attrib); virtual void startList(const QXmlAttributes& attrib);
virtual void endList(); virtual void endList();
virtual void startListItem(const QXmlAttributes& attrib); virtual void startListItem(const QXmlAttributes& attrib);
// IDocList
virtual Kind kind() const { return m_kind; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocNode> m_children; QList<IDoc> m_children;
Kind m_kind;
}; };
...@@ -198,7 +159,7 @@ class ListHandler : public DocNode, public BaseHandler<ListHandler> ...@@ -198,7 +159,7 @@ class ListHandler : public DocNode, public BaseHandler<ListHandler>
/*! \brief Node representing a parameter. /*! \brief Node representing a parameter.
* *
*/ */
class ParameterHandler : public DocNode, class ParameterHandler : public IDocParameter,
public BaseHandler<ParameterHandler> public BaseHandler<ParameterHandler>
{ {
public: public:
...@@ -210,6 +171,9 @@ class ParameterHandler : public DocNode, ...@@ -210,6 +171,9 @@ class ParameterHandler : public DocNode,
virtual void endParameterDescription(); virtual void endParameterDescription();
virtual void startParagraph(const QXmlAttributes& attrib); virtual void startParagraph(const QXmlAttributes& attrib);
// IDocParameter
virtual Kind kind() const { return Parameter; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_name; QString m_name;
...@@ -222,7 +186,7 @@ class ParameterHandler : public DocNode, ...@@ -222,7 +186,7 @@ class ParameterHandler : public DocNode,
/* \brief Node representing a parameter list. /* \brief Node representing a parameter list.
* *
*/ */
class ParameterListHandler : public DocNode, class ParameterListHandler : public IDocParameter,
public BaseHandler<ParameterListHandler> public BaseHandler<ParameterListHandler>
{ {
public: public:
...@@ -234,6 +198,9 @@ class ParameterListHandler : public DocNode, ...@@ -234,6 +198,9 @@ class ParameterListHandler : public DocNode,
virtual void startParameterName(const QXmlAttributes& attrib); virtual void startParameterName(const QXmlAttributes& attrib);
virtual void startParameterDescription(const QXmlAttributes& attrib); virtual void startParameterDescription(const QXmlAttributes& attrib);
// IDocParameterList
virtual Kind kind() const { return ParameterList; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<ParameterHandler> m_parameters; QList<ParameterHandler> m_parameters;
...@@ -246,7 +213,7 @@ class ParameterListHandler : public DocNode, ...@@ -246,7 +213,7 @@ class ParameterListHandler : public DocNode,
/* \brief Node representing a horizontal ruler /* \brief Node representing a horizontal ruler
* *
*/ */
class LineBreakHandler : public DocNode, public BaseHandler<LineBreakHandler> class LineBreakHandler : public IDocLineBreak, public BaseHandler<LineBreakHandler>
{ {
public: public:
LineBreakHandler(IBaseHandler *parent); LineBreakHandler(IBaseHandler *parent);
...@@ -255,6 +222,9 @@ class LineBreakHandler : public DocNode, public BaseHandler<LineBreakHandler> ...@@ -255,6 +222,9 @@ class LineBreakHandler : public DocNode, public BaseHandler<LineBreakHandler>
void startLineBreak(const QXmlAttributes& attrib); void startLineBreak(const QXmlAttributes& attrib);
void endLineBreak(); void endLineBreak();
// IDocLineBreak
virtual Kind kind() const { return LineBreak; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
}; };
...@@ -264,7 +234,7 @@ class LineBreakHandler : public DocNode, public BaseHandler<LineBreakHandler> ...@@ -264,7 +234,7 @@ class LineBreakHandler : public DocNode, public BaseHandler<LineBreakHandler>
/* \brief Node representing a link to section /* \brief Node representing a link to section
* *
*/ */
class LinkHandler : public DocNode, public BaseHandler<LinkHandler> class LinkHandler : public IDocLink, public BaseHandler<LinkHandler>
{ {
public: public:
LinkHandler(IBaseHandler *parent); LinkHandler(IBaseHandler *parent);
...@@ -273,6 +243,9 @@ class LinkHandler : public DocNode, public BaseHandler<LinkHandler> ...@@ -273,6 +243,9 @@ class LinkHandler : public DocNode, public BaseHandler<LinkHandler>
void startLink(const QXmlAttributes& attrib); void startLink(const QXmlAttributes& attrib);
void endLink(); void endLink();
// IDocLink
virtual Kind kind() const { return Link; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_ref; QString m_ref;
...@@ -285,7 +258,7 @@ class LinkHandler : public DocNode, public BaseHandler<LinkHandler> ...@@ -285,7 +258,7 @@ class LinkHandler : public DocNode, public BaseHandler<LinkHandler>
/* \brief Node representing a link to an email address /* \brief Node representing a link to an email address
* *
*/ */
class EMailHandler : public DocNode, public BaseHandler<EMailHandler> class EMailHandler : public IDocEMail, public BaseHandler<EMailHandler>
{ {
public: public:
EMailHandler(IBaseHandler *parent); EMailHandler(IBaseHandler *parent);
...@@ -294,6 +267,9 @@ class EMailHandler : public DocNode, public BaseHandler<EMailHandler> ...@@ -294,6 +267,9 @@ class EMailHandler : public DocNode, public BaseHandler<EMailHandler>
void startEMail(const QXmlAttributes& attrib); void startEMail(const QXmlAttributes& attrib);
void endEMail(); void endEMail();
// IDocEMail
virtual Kind kind() const { return EMail; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_address; QString m_address;
...@@ -305,7 +281,7 @@ class EMailHandler : public DocNode, public BaseHandler<EMailHandler> ...@@ -305,7 +281,7 @@ class EMailHandler : public DocNode, public BaseHandler<EMailHandler>
/* \brief Node representing a link to an URL /* \brief Node representing a link to an URL
* *
*/ */
class ULinkHandler : public DocNode, public BaseHandler<ULinkHandler> class ULinkHandler : public IDocULink, public BaseHandler<ULinkHandler>
{ {
public: public:
ULinkHandler(IBaseHandler *parent); ULinkHandler(IBaseHandler *parent);
...@@ -314,6 +290,9 @@ class ULinkHandler : public DocNode, public BaseHandler<ULinkHandler> ...@@ -314,6 +290,9 @@ class ULinkHandler : public DocNode, public BaseHandler<ULinkHandler>
void startULink(const QXmlAttributes& attrib); void startULink(const QXmlAttributes& attrib);
void endULink(); void endULink();
// IDocULink
virtual Kind kind() const { return ULink; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_url; QString m_url;
...@@ -325,7 +304,7 @@ class ULinkHandler : public DocNode, public BaseHandler<ULinkHandler> ...@@ -325,7 +304,7 @@ class ULinkHandler : public DocNode, public BaseHandler<ULinkHandler>
/* \brief Node representing a horizontal ruler /* \brief Node representing a horizontal ruler
* *
*/ */
class HRulerHandler : public DocNode, public BaseHandler<HRulerHandler> class HRulerHandler : public IDocHRuler, public BaseHandler<HRulerHandler>
{ {
public: public:
HRulerHandler(IBaseHandler *parent); HRulerHandler(IBaseHandler *parent);
...@@ -334,6 +313,9 @@ class HRulerHandler : public DocNode, public BaseHandler<HRulerHandler> ...@@ -334,6 +313,9 @@ class HRulerHandler : public DocNode, public BaseHandler<HRulerHandler>
void startHRuler(const QXmlAttributes& attrib); void startHRuler(const QXmlAttributes& attrib);
void endHRuler(); void endHRuler();
// IDocHRuler
virtual Kind kind() const { return HRuler; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
}; };
...@@ -343,13 +325,17 @@ class HRulerHandler : public DocNode, public BaseHandler<HRulerHandler> ...@@ -343,13 +325,17 @@ class HRulerHandler : public DocNode, public BaseHandler<HRulerHandler>
/* \brief Node representing a reference to another item /* \brief Node representing a reference to another item
* *
*/ */
class RefHandler : public DocNode, public BaseHandler<RefHandler> class RefHandler : public IDocRef, public BaseHandler<RefHandler>
{ {
public: public:
RefHandler(IBaseHandler *parent); RefHandler(IBaseHandler *parent);
virtual ~RefHandler(); virtual ~RefHandler();
void startRef(const QXmlAttributes& attrib); void startRef(const QXmlAttributes& attrib);
void endRef(); void endRef();
// IDocRef
virtual Kind kind() const { return Ref; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_refId; QString m_refId;
...@@ -366,8 +352,9 @@ class RefHandler : public DocNode, public BaseHandler<RefHandler> ...@@ -366,8 +352,9 @@ class RefHandler : public DocNode, public BaseHandler<RefHandler>
// children handled by MarkupHandler: // children handled by MarkupHandler:
// bold, computeroutput, emphasis, center, // bold, computeroutput, emphasis, center,
// small, subscript, superscript. // small, subscript, superscript.
class TitleHandler : public DocNode, public BaseHandler<TitleHandler> class TitleHandler : public IDocTitle, public BaseHandler<TitleHandler>
{ {
friend class TitleIterator;
public: public:
TitleHandler(IBaseHandler *parent); TitleHandler(IBaseHandler *parent);
virtual ~TitleHandler(); virtual ~TitleHandler();
...@@ -375,19 +362,31 @@ class TitleHandler : public DocNode, public BaseHandler<TitleHandler> ...@@ -375,19 +362,31 @@ class TitleHandler : public DocNode, public BaseHandler<TitleHandler>
virtual void endTitle(); virtual void endTitle();
virtual void startRef(const QXmlAttributes& attrib); virtual void startRef(const QXmlAttributes& attrib);
void addTextNode(); void addTextNode();
// IDocTitle
virtual Kind kind() const { return Title; }
virtual IDocIterator *title() const;
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocNode> m_children; QList<IDoc> m_children;
MarkupHandler *m_markupHandler; MarkupHandler *m_markupHandler;
}; };
class TitleIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
public:
TitleIterator(const TitleHandler &handler) :
BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/* \brief Node representing a simple section with an unnumbered header. /* \brief Node representing a simple section with an unnumbered header.
* *
*/ */
// children: title, para // children: title, para
class SimpleSectHandler : public DocNode, class SimpleSectHandler : public IDocSimpleSect,
public BaseHandler<SimpleSectHandler> public BaseHandler<SimpleSectHandler>
{ {
public: public:
...@@ -406,6 +405,9 @@ class SimpleSectHandler : public DocNode, ...@@ -406,6 +405,9 @@ class SimpleSectHandler : public DocNode,
virtual void startTitle(const QXmlAttributes& attrib); virtual void startTitle(const QXmlAttributes& attrib);
virtual void startParagraph(const QXmlAttributes& attrib); virtual void startParagraph(const QXmlAttributes& attrib);
// IDocSimpleSect
virtual Kind kind() const { return SimpleSect; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
ParagraphHandler *m_paragraph; ParagraphHandler *m_paragraph;
...@@ -418,7 +420,7 @@ class SimpleSectHandler : public DocNode, ...@@ -418,7 +420,7 @@ class SimpleSectHandler : public DocNode,
/* \brief Node representing an named item of a VariableList. /* \brief Node representing an named item of a VariableList.
* *
*/ */
class VariableListEntryHandler : public DocNode, public BaseHandler<VariableListEntryHandler> class VariableListEntryHandler : public IDocVariableListEntry, public BaseHandler<VariableListEntryHandler>
{ {
public: public:
virtual void startVarListEntry(const QXmlAttributes& attrib); virtual void startVarListEntry(const QXmlAttributes& attrib);
...@@ -432,6 +434,9 @@ class VariableListEntryHandler : public DocNode, public BaseHandler<VariableList ...@@ -432,6 +434,9 @@ class VariableListEntryHandler : public DocNode, public BaseHandler<VariableList
VariableListEntryHandler(IBaseHandler *parent); VariableListEntryHandler(IBaseHandler *parent);
virtual ~VariableListEntryHandler(); virtual ~VariableListEntryHandler();
// IDocVariableListEntry
virtual Kind kind() const { return VariableListEntry; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_term; QString m_term;
...@@ -444,7 +449,7 @@ class VariableListEntryHandler : public DocNode, public BaseHandler<VariableList ...@@ -444,7 +449,7 @@ class VariableListEntryHandler : public DocNode, public BaseHandler<VariableList
* *
*/ */
// children: varlistentry, listitem // children: varlistentry, listitem
class VariableListHandler : public DocNode, public BaseHandler<VariableListHandler> class VariableListHandler : public IDocVariableList, public BaseHandler<VariableListHandler>
{ {
public: public:
virtual void startVariableList(const QXmlAttributes& attrib); virtual void startVariableList(const QXmlAttributes& attrib);
...@@ -455,6 +460,9 @@ class VariableListHandler : public DocNode, public BaseHandler<VariableListHandl ...@@ -455,6 +460,9 @@ class VariableListHandler : public DocNode, public BaseHandler<VariableListHandl
VariableListHandler(IBaseHandler *parent); VariableListHandler(IBaseHandler *parent);
virtual ~VariableListHandler(); virtual ~VariableListHandler();
// IDocVariableList
virtual Kind kind() const { return VariableList; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<VariableListEntryHandler> m_entries; QList<VariableListEntryHandler> m_entries;
...@@ -467,7 +475,7 @@ class VariableListHandler : public DocNode, public BaseHandler<VariableListHandl ...@@ -467,7 +475,7 @@ class VariableListHandler : public DocNode, public BaseHandler<VariableListHandl
* *
*/ */
// children: - // children: -
class HighlightHandler : public DocNode, public BaseHandler<HighlightHandler> class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandler>
{ {
public: public:
HighlightHandler(IBaseHandler *parent); HighlightHandler(IBaseHandler *parent);
...@@ -475,6 +483,9 @@ class HighlightHandler : public DocNode, public BaseHandler<HighlightHandler> ...@@ -475,6 +483,9 @@ class HighlightHandler : public DocNode, public BaseHandler<HighlightHandler>
void startHighlight(const QXmlAttributes& attrib); void startHighlight(const QXmlAttributes& attrib);
void endHighlight(); void endHighlight();
// IDocHighlight
virtual Kind kind() const { return Highlight; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_class; QString m_class;
...@@ -487,7 +498,7 @@ class HighlightHandler : public DocNode, public BaseHandler<HighlightHandler> ...@@ -487,7 +498,7 @@ class HighlightHandler : public DocNode, public BaseHandler<HighlightHandler>
* *
*/ */
// children: linenumber, highlight, anchor, ref // children: linenumber, highlight, anchor, ref
class CodeLineHandler : public DocNode, public BaseHandler<CodeLineHandler> class CodeLineHandler : public IDocCodeLine, public BaseHandler<CodeLineHandler>
{ {
public: public:
...@@ -501,13 +512,16 @@ class CodeLineHandler : public DocNode, public BaseHandler<CodeLineHandler> ...@@ -501,13 +512,16 @@ class CodeLineHandler : public DocNode, public BaseHandler<CodeLineHandler>
CodeLineHandler(IBaseHandler *parent); CodeLineHandler(IBaseHandler *parent);
virtual ~CodeLineHandler(); virtual ~CodeLineHandler();
// IDocCodeLine
virtual Kind kind() const { return CodeLine; }
private: private:
void addTextNode(); void addTextNode();
IBaseHandler *m_parent; IBaseHandler *m_parent;
int m_lineNumber; int m_lineNumber;
QString m_refId; QString m_refId;
QList<DocNode> m_children; QList<IDoc> m_children;
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -516,7 +530,7 @@ class CodeLineHandler : public DocNode, public BaseHandler<CodeLineHandler> ...@@ -516,7 +530,7 @@ class CodeLineHandler : public DocNode, public BaseHandler<CodeLineHandler>
* *
*/ */
// children: codeline, linenumber // children: codeline, linenumber
class ProgramListingHandler : public DocNode, public BaseHandler<ProgramListingHandler> class ProgramListingHandler : public IDocProgramListing, public BaseHandler<ProgramListingHandler>
{ {
public: public:
virtual void startProgramListing(const QXmlAttributes& attrib); virtual void startProgramListing(const QXmlAttributes& attrib);
...@@ -526,6 +540,10 @@ class ProgramListingHandler : public DocNode, public BaseHandler<ProgramListingH ...@@ -526,6 +540,10 @@ class ProgramListingHandler : public DocNode, public BaseHandler<ProgramListingH
ProgramListingHandler(IBaseHandler *parent); ProgramListingHandler(IBaseHandler *parent);
virtual ~ProgramListingHandler(); virtual ~ProgramListingHandler();
// IDocProgramListing
virtual Kind kind() const { return ProgramListing; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<CodeLineHandler> m_children; QList<CodeLineHandler> m_children;
...@@ -538,7 +556,7 @@ class ProgramListingHandler : public DocNode, public BaseHandler<ProgramListingH ...@@ -538,7 +556,7 @@ class ProgramListingHandler : public DocNode, public BaseHandler<ProgramListingH
* *
*/ */
// children: - // children: -
class FormulaHandler : public DocNode, public BaseHandler<FormulaHandler> class FormulaHandler : public IDocFormula, public BaseHandler<FormulaHandler>
{ {
public: public:
FormulaHandler(IBaseHandler *parent); FormulaHandler(IBaseHandler *parent);
...@@ -546,6 +564,9 @@ class FormulaHandler : public DocNode, public BaseHandler<FormulaHandler> ...@@ -546,6 +564,9 @@ class FormulaHandler : public DocNode, public BaseHandler<FormulaHandler>
void startFormula(const QXmlAttributes& attrib); void startFormula(const QXmlAttributes& attrib);
void endFormula(); void endFormula();
// IDocFormula
virtual Kind kind() const { return Formula; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_id; QString m_id;
...@@ -558,7 +579,7 @@ class FormulaHandler : public DocNode, public BaseHandler<FormulaHandler> ...@@ -558,7 +579,7 @@ class FormulaHandler : public DocNode, public BaseHandler<FormulaHandler>
* *
*/ */
// children: - // children: -
class ImageHandler : public DocNode, public BaseHandler<ImageHandler> class ImageHandler : public IDocImage, public BaseHandler<ImageHandler>
{ {
public: public:
ImageHandler(IBaseHandler *parent); ImageHandler(IBaseHandler *parent);
...@@ -566,6 +587,9 @@ class ImageHandler : public DocNode, public BaseHandler<ImageHandler> ...@@ -566,6 +587,9 @@ class ImageHandler : public DocNode, public BaseHandler<ImageHandler>
void startImage(const QXmlAttributes& attrib); void startImage(const QXmlAttributes& attrib);
void endImage(); void endImage();
// IDocImage
virtual Kind kind() const { return Image; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_name; QString m_name;
...@@ -578,7 +602,7 @@ class ImageHandler : public DocNode, public BaseHandler<ImageHandler> ...@@ -578,7 +602,7 @@ class ImageHandler : public DocNode, public BaseHandler<ImageHandler>
* *
*/ */
// children: - // children: -
class DotFileHandler : public DocNode, public BaseHandler<DotFileHandler> class DotFileHandler : public IDocDotFile, public BaseHandler<DotFileHandler>
{ {
public: public:
DotFileHandler(IBaseHandler *parent); DotFileHandler(IBaseHandler *parent);
...@@ -586,6 +610,9 @@ class DotFileHandler : public DocNode, public BaseHandler<DotFileHandler> ...@@ -586,6 +610,9 @@ class DotFileHandler : public DocNode, public BaseHandler<DotFileHandler>
void startDotFile(const QXmlAttributes& attrib); void startDotFile(const QXmlAttributes& attrib);
void endDotFile(); void endDotFile();
// IDocDotFile
virtual Kind kind() const { return DotFile; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_name; QString m_name;
...@@ -598,7 +625,7 @@ class DotFileHandler : public DocNode, public BaseHandler<DotFileHandler> ...@@ -598,7 +625,7 @@ class DotFileHandler : public DocNode, public BaseHandler<DotFileHandler>
* *
*/ */
// children: - // children: -
class IndexEntryHandler : public DocNode, public BaseHandler<IndexEntryHandler> class IndexEntryHandler : public IDocIndexEntry, public BaseHandler<IndexEntryHandler>
{ {
public: public:
IndexEntryHandler(IBaseHandler *parent); IndexEntryHandler(IBaseHandler *parent);
...@@ -610,6 +637,9 @@ class IndexEntryHandler : public DocNode, public BaseHandler<IndexEntryHandler> ...@@ -610,6 +637,9 @@ class IndexEntryHandler : public DocNode, public BaseHandler<IndexEntryHandler>
void startSecondaryIE(const QXmlAttributes& attrib); void startSecondaryIE(const QXmlAttributes& attrib);
void endSecondaryIE(); void endSecondaryIE();
// IDocIndexEntry
virtual Kind kind() const { return IndexEntry; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_primary; QString m_primary;
...@@ -622,7 +652,7 @@ class IndexEntryHandler : public DocNode, public BaseHandler<IndexEntryHandler> ...@@ -622,7 +652,7 @@ class IndexEntryHandler : public DocNode, public BaseHandler<IndexEntryHandler>
* *
*/ */
// children: para // children: para
class EntryHandler : public DocNode, public BaseHandler<EntryHandler> class EntryHandler : public IDocEntry, public BaseHandler<EntryHandler>
{ {
public: public:
EntryHandler(IBaseHandler *parent); EntryHandler(IBaseHandler *parent);
...@@ -631,9 +661,12 @@ class EntryHandler : public DocNode, public BaseHandler<EntryHandler> ...@@ -631,9 +661,12 @@ class EntryHandler : public DocNode, public BaseHandler<EntryHandler>
void endEntry(); void endEntry();
void startParagraph(const QXmlAttributes& attrib); void startParagraph(const QXmlAttributes& attrib);
// IDocEntry
virtual Kind kind() const { return Entry; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocNode> m_children; QList<IDoc> m_children;
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -642,7 +675,7 @@ class EntryHandler : public DocNode, public BaseHandler<EntryHandler> ...@@ -642,7 +675,7 @@ class EntryHandler : public DocNode, public BaseHandler<EntryHandler>
* *
*/ */
// children: entry // children: entry
class RowHandler : public DocNode, public BaseHandler<RowHandler> class RowHandler : public IDocRow, public BaseHandler<RowHandler>
{ {
public: public:
RowHandler(IBaseHandler *parent); RowHandler(IBaseHandler *parent);
...@@ -651,6 +684,9 @@ class RowHandler : public DocNode, public BaseHandler<RowHandler> ...@@ -651,6 +684,9 @@ class RowHandler : public DocNode, public BaseHandler<RowHandler>
void endRow(); void endRow();
void startEntry(const QXmlAttributes& attrib); void startEntry(const QXmlAttributes& attrib);
// IDocRow
virtual Kind kind() const { return Row; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<EntryHandler> m_children; QList<EntryHandler> m_children;
...@@ -662,7 +698,7 @@ class RowHandler : public DocNode, public BaseHandler<RowHandler> ...@@ -662,7 +698,7 @@ class RowHandler : public DocNode, public BaseHandler<RowHandler>
* *
*/ */
// children: row // children: row
class TableHandler : public DocNode, public BaseHandler<TableHandler> class TableHandler : public IDocTable, public BaseHandler<TableHandler>
{ {
public: public:
TableHandler(IBaseHandler *parent); TableHandler(IBaseHandler *parent);
...@@ -671,6 +707,9 @@ class TableHandler : public DocNode, public BaseHandler<TableHandler> ...@@ -671,6 +707,9 @@ class TableHandler : public DocNode, public BaseHandler<TableHandler>
void endTable(); void endTable();
void startRow(const QXmlAttributes& attrib); void startRow(const QXmlAttributes& attrib);
// IDocTable
virtual Kind kind() const { return Table; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<RowHandler> m_children; QList<RowHandler> m_children;
...@@ -691,8 +730,11 @@ class TableHandler : public DocNode, public BaseHandler<TableHandler> ...@@ -691,8 +730,11 @@ class TableHandler : public DocNode, public BaseHandler<TableHandler>
// bold, computeroutput, emphasis, center, // bold, computeroutput, emphasis, center,
// small, subscript, superscript. // small, subscript, superscript.
// //
class ParagraphHandler : public DocNode, public BaseHandler<ParagraphHandler> class ParagraphHandler : public IDocPara,
public BaseHandler<ParagraphHandler>
{ {
friend class ParagraphIterator;
public: public:
virtual void startParagraph(const QXmlAttributes& attrib); virtual void startParagraph(const QXmlAttributes& attrib);
virtual void endParagraph(); virtual void endParagraph();
...@@ -717,33 +759,101 @@ class ParagraphHandler : public DocNode, public BaseHandler<ParagraphHandler> ...@@ -717,33 +759,101 @@ class ParagraphHandler : public DocNode, public BaseHandler<ParagraphHandler>
ParagraphHandler(IBaseHandler *parent); ParagraphHandler(IBaseHandler *parent);
virtual ~ParagraphHandler(); virtual ~ParagraphHandler();
// IDocPara
virtual Kind kind() const { return Para; }
virtual IDocIterator *contents() const;
private: private:
void addTextNode(); void addTextNode();
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocNode> m_children; QList<IDoc> m_children;
MarkupHandler *m_markupHandler; MarkupHandler *m_markupHandler;
}; };
class ParagraphIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
public:
ParagraphIterator(const ParagraphHandler &handler) :
BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};
//-----------------------------------------------------------------------------
/*! \brief Node representing a section.
*
*/
// children: text, ref
// children handled by MarkupHandler:
// bold, computeroutput, emphasis, center,
// small, subscript, superscript.
class DocSectionHandler : public IDocSection, public BaseHandler<DocSectionHandler>
{
friend class DocSectionIterator;
public:
DocSectionHandler(IBaseHandler *parent,int level);
virtual ~DocSectionHandler();
virtual void startDocSection(const QXmlAttributes& attrib);
virtual void endDocSection();
virtual void startRef(const QXmlAttributes& attrib);
void addTextNode();
// IDocSection
virtual Kind kind() const { return Section; }
virtual QString id() const { return m_id; }
virtual int level() const { return m_level; }
virtual IDocIterator *title() const;
private:
IBaseHandler *m_parent;
QList<IDoc> m_children;
MarkupHandler *m_markupHandler;
QString m_id;
int m_level;
};
class DocSectionIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
public:
DocSectionIterator(const DocSectionHandler &handler) :
BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! \brief Node representing a documentation block. /*! \brief Node representing a documentation block.
* *
*/ */
// children: para // children: para, title, sect1, sect2, sect3
// TODO: title, sect1, sect2, sect3 class DocHandler : public IDocRoot, public BaseHandler<DocHandler>
class DocHandler : public BaseHandler<DocHandler>
{ {
friend class DocIterator;
public: public:
virtual void startDoc(const QXmlAttributes& attrib); virtual void startDoc(const QXmlAttributes& attrib);
virtual void endDoc(); virtual void endDoc();
virtual void startParagraph(const QXmlAttributes& attrib); virtual void startParagraph(const QXmlAttributes& attrib);
virtual void startSect1(const QXmlAttributes& attrib);
virtual void startSect2(const QXmlAttributes& attrib);
virtual void startSect3(const QXmlAttributes& attrib);
virtual void startTitle(const QXmlAttributes& attrib);
DocHandler(IBaseHandler *parent); DocHandler(IBaseHandler *parent);
virtual ~DocHandler(); virtual ~DocHandler();
// IDocRoot
virtual Kind kind() const { return Root; }
virtual IDocIterator *contents() const;
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocNode> m_children; QList<IDoc> m_children;
};
class DocIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
public:
DocIterator(const DocHandler &handler) :
BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
}; };
#endif #endif
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H
#include <qstring.h>
class IMember;
class IDocIterator;
class ILinkedText
{
public:
enum Kind { Kind_Text, Kind_Ref };
virtual Kind kind() const = 0;
};
class ILT_Text : public ILinkedText
{
public:
virtual QString text() const = 0;
};
class ILT_Ref : public ILinkedText
{
public:
virtual QString id() const = 0;
virtual QString external() const = 0;
virtual QString text() const = 0;
};
class ILinkedTextIterator
{
public:
virtual ILinkedText *toFirst() = 0;
virtual ILinkedText *toLast() = 0;
virtual ILinkedText *toNext() = 0;
virtual ILinkedText *toPrev() = 0;
virtual ILinkedText *current() const = 0;
virtual void release() = 0;
};
class IParam
{
public:
virtual ILinkedTextIterator *type() const = 0;
virtual QString declarationName() const = 0;
virtual QString definitionName() const = 0;
virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0;
};
class IParamIterator
{
public:
virtual IParam *toFirst() = 0;
virtual IParam *toLast() = 0;
virtual IParam *toNext() = 0;
virtual IParam *toPrev() = 0;
virtual IParam *current() const = 0;
virtual void release() = 0;
};
class IMemberReference
{
public:
virtual IMember *member() const = 0;
virtual QString memberName() const = 0;
};
class IMemberReferenceIterator
{
public:
virtual IMemberReference *toFirst() = 0;
virtual IMemberReference *toLast() = 0;
virtual IMemberReference *toNext() = 0;
virtual IMemberReference *toPrev() = 0;
virtual IMemberReference *current() const = 0;
virtual void release() = 0;
};
class IEnumValue
{
public:
virtual QString name() const = 0;
virtual QString initializer() const = 0;
};
class IEnumValueIterator
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
};
class IDoc
{
public:
enum Kind
{
Para, // 0 -> IDocPara
Text, // 1 -> IDocText
MarkupModifier, // 2 -> IDocMarkupModifier
ItemizedList, // 3 -> IDocList
OrderedList, // 4 -> IDocList
ListItem, // 5 -> IDocListItem
ParameterList, // 6 -> IDocParameterList
Parameter, // 7 -> IDocParameter
SimpleSect, // 8 -> IDocSimpleSect
Title, // 9 -> IDocTitle
Ref, // 10 -> IDocRef
VariableList, // 11 -> IDocVariableList
VariableListEntry, // 12 -> IDocVariableListEntry
HRuler, // 13 -> IDocHRuler
LineBreak, // 14 -> IDocLineBreak
ULink, // 15 -> IDocULink
EMail, // 16 -> IDocEMail
Link, // 17 -> IDocLink
ProgramListing, // 18 -> IDocProgramListing
CodeLine, // 19 -> IDocCodeLine
Highlight, // 20 -> IDocHighlight
Anchor, // 21 -> IDocAnchor
Formula, // 22 -> IDocFormula
Image, // 23 -> IDocImage
DotFile, // 24 -> IDocDotFile
IndexEntry, // 25 -> IDocIndexEntry
Table, // 26 -> IDocTable
Row, // 27 -> IDocRow
Entry, // 28 -> IDocEntry
Section, // 29 -> IDocSection
Root // 30 -> IDocRoot
};
virtual Kind kind() const = 0;
};
class IDocMarkup : public IDoc
{
public:
enum Markup
{
Normal = 0x00,
Bold = 0x01,
Emphasis = 0x02,
ComputerOutput = 0x04,
Subscript = 0x08,
Superscript = 0x10,
SmallFont = 0x20,
Center = 0x40
};
};
class IDocPara : public IDoc
{
public:
virtual IDocIterator *contents() const = 0;
};
class IDocText : public IDocMarkup
{
public:
virtual QString text() const = 0;
virtual int markup() const = 0;
};
class IDocMarkupModifier : public IDoc
{
};
class IDocList : public IDoc
{
};
class IDocListItem : public IDoc
{
};
class IDocParameterList : public IDoc
{
};
class IDocParameter : public IDoc
{
};
class IDocSimpleSect : public IDoc
{
};
class IDocTitle : public IDoc
{
public:
virtual IDocIterator *title() const = 0;
};
class IDocRef : public IDoc
{
};
class IDocVariableList : public IDoc
{
};
class IDocVariableListEntry : public IDoc
{
};
class IDocHRuler : public IDoc
{
};
class IDocLineBreak : public IDoc
{
};
class IDocULink : public IDoc
{
};
class IDocEMail : public IDoc
{
};
class IDocLink : public IDoc
{
};
class IDocProgramListing : public IDoc
{
};
class IDocCodeLine : public IDoc
{
};
class IDocHighlight : public IDoc
{
};
class IDocAnchor : public IDoc
{
};
class IDocFormula : public IDoc
{
};
class IDocImage : public IDoc
{
};
class IDocDotFile : public IDoc
{
};
class IDocIndexEntry : public IDoc
{
};
class IDocTable : public IDoc
{
};
class IDocRow : public IDoc
{
};
class IDocEntry : public IDoc
{
};
class IDocSection : public IDoc
{
public:
virtual QString id() const = 0;
virtual int level() const = 0;
virtual IDocIterator *title() const = 0;
};
class IDocRoot : public IDoc
{
public:
virtual IDocIterator *contents() const = 0;
};
class IDocIterator
{
public:
virtual IDoc *toFirst() = 0;
virtual IDoc *toLast() = 0;
virtual IDoc *toNext() = 0;
virtual IDoc *toPrev() = 0;
virtual IDoc *current() const = 0;
virtual void release() = 0;
};
class IMember
{
public:
virtual QString kind() const = 0;
virtual QString id() const = 0;
virtual QString protection() const = 0;
virtual QString virtualness() const = 0;
virtual ILinkedTextIterator *type() const = 0;
virtual QString name() const = 0;
virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0;
virtual IParamIterator *params() const = 0;
virtual ILinkedTextIterator *initializer() const = 0;
virtual ILinkedTextIterator *exceptions() const = 0;
virtual IMemberReferenceIterator *references() const = 0;
virtual IMemberReferenceIterator *referencedBy() const = 0;
virtual int bodyStart() const = 0;
virtual int bodyEnd() const = 0;
virtual QString definitionFile() const = 0;
virtual int definitionLine() const = 0;
virtual IMemberReference *reimplements() const = 0;
virtual IMemberReferenceIterator *reimplementedBy() const = 0;
virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
};
class IMemberIterator
{
public:
virtual IMember *toFirst() = 0;
virtual IMember *toLast() = 0;
virtual IMember *toNext() = 0;
virtual IMember *toPrev() = 0;
virtual IMember *current() const = 0;
virtual void release() = 0;
};
class ISection
{
public:
virtual QString kind() const = 0;
virtual IMemberIterator *members() const = 0;
};
class ISectionIterator
{
public:
virtual ISection *toFirst() = 0;
virtual ISection *toLast() = 0;
virtual ISection *toNext() = 0;
virtual ISection *toPrev() = 0;
virtual ISection *current() const = 0;
virtual void release() = 0;
};
class ICompound
{
public:
virtual QString name() const = 0;
virtual QString id() const = 0;
virtual QString kind() const = 0;
virtual ISectionIterator *sections() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
};
class ICompoundIterator
{
public:
virtual ICompound *toFirst() = 0;
virtual ICompound *toLast() = 0;
virtual ICompound *toNext() = 0;
virtual ICompound *toPrev() = 0;
virtual ICompound *current() const = 0;
virtual void release() = 0;
};
/*! Root node of the object model. */
class IDoxygen
{
public:
/*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project.
*/
virtual ICompoundIterator *compounds() const = 0;
/*! Returns a compound given its unique \a id. If you have a
* compound id this function is much more efficient than iterating
* over the compound list. Returns 0 if the id is not valid.
*/
virtual ICompound *compoundById(const QString &id) const = 0;
/*! Returns a compound given its name (including the scope).
* Returns 0 if the name is not found in the project.
*/
virtual ICompound *compoundByName(const QString &name) const = 0;
/*! Returns an interface to a member given its id.
* @param id The member id.
*/
virtual IMember *memberById(const QString &id) const = 0;
/*! Returns a list of all members with a certain name.
* @param name The name of the member.
*/
virtual IMemberIterator *memberByName(const QString &name) const = 0;
/*! Releases the memory for the object hierarchy obtained by
* createdObjecModelFromXML(). First release all iterators before calling
* this function.
*/
virtual void release() = 0;
};
/*! Factory method that creates an object model given an XML file generated
* by doxygen.
* @param xmlFileName The name of the XML to parse.
* @returns An iterface to the object model.
*/
IDoxygen *createObjectModelFromXML(const char *xmlFileName);
#endif
TEMPLATE = app.t TEMPLATE = lib.t
CONFIG = console warn_on $extraopt CONFIG = console staticlib warn_on $extraopts
HEADERS = basehandler.h mainhandler.h \ HEADERS = basehandler.h mainhandler.h \
compoundhandler.h sectionhandler.h \ compoundhandler.h sectionhandler.h \
memberhandler.h paramhandler.h \ memberhandler.h paramhandler.h \
dochandler.h dochandler.h linkedtexthandler.h
SOURCES = main.cpp mainhandler.cpp \ SOURCES = mainhandler.cpp \
compoundhandler.cpp sectionhandler.cpp \ compoundhandler.cpp sectionhandler.cpp \
memberhandler.cpp paramhandler.cpp \ memberhandler.cpp paramhandler.cpp \
dochandler.cpp dochandler.cpp linkedtexthandler.cpp
DEPENDPATH = ../../src unix:LIBS += -L../../../lib -lqtools
unix:LIBS += -L../../lib -ldoxycfg -lqtools
win32:INCLUDEPATH += . win32:INCLUDEPATH += .
win32-mingw:LIBS += -L../../lib -ldoxycfg -lqtools win32-mingw:LIBS += -L../../../lib -lqtools
win32-msvc:LIBS += qtools.lib doxycfg.lib shell32.lib win32-msvc:LIBS += qtools.lib shell32.lib
win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\lib win32-msvc:TMAKE_LFLAGS += /LIBPATH:....\\..\lib
win32-borland:LIBS += qtools.lib doxycfg.lib shell32.lib win32-borland:LIBS += qtools.lib doxycfg.lib shell32.lib
win32-borland:TMAKE_LFLAGS += -L..\..\lib win32-borland:TMAKE_LFLAGS += -L..\..\..\lib
win32:TMAKE_CXXFLAGS += -DQT_NODLL win32:TMAKE_CXXFLAGS += -DQT_NODLL
INCLUDEPATH += ../../qtools ../../src DESTDIR = ../lib
DESTDIR = OBJECTS_DIR = ../objects
TARGET = xmlparse TARGET = doxmlparser
unix:TARGETDEPS = ../../lib/libdoxycfg.a INCLUDEPATH += ../../../qtools ../include
win32:TARGETDEPS = ../../lib/doxycfg.lib
OBJECTS_DIR = obj
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#include "linkedtexthandler.h"
#include <doxmlintf.h>
class LT_Text : public ILT_Text
{
public:
LT_Text(const QString &text) : m_text(text) {}
virtual ~LT_Text() {}
// ILT_Text
virtual QString text() const { return m_text; }
virtual Kind kind() const { return Kind_Text; }
private:
QString m_text;
};
class LT_Ref : public ILT_Ref
{
public:
LT_Ref() {}
virtual ~LT_Ref() {}
void setRefId(const QString &refId) { m_refId=refId; }
void setText(const QString &text) { m_text=text; }
void setExtId(const QString &extId) { m_extId=extId; }
// ILT_Ref
virtual QString text() const { return m_text; }
virtual QString id() const { return m_refId; }
virtual QString external() const { return m_extId; }
virtual Kind kind() const { return Kind_Ref; }
private:
QString m_refId;
QString m_extId;
QString m_text;
};
LinkedTextHandler::LinkedTextHandler(IBaseHandler *parent,
QList<ILinkedText> &children
)
: m_parent(parent), m_children(children)
{
addStartHandler("ref",this,&LinkedTextHandler::startRef);
addEndHandler("ref",this,&LinkedTextHandler::endRef);
m_children.setAutoDelete(TRUE);
m_ref=0;
}
LinkedTextHandler::~LinkedTextHandler()
{
}
void LinkedTextHandler::start(const char *endTag)
{
addEndHandler(endTag,this,&LinkedTextHandler::end);
m_parent->setDelegate(this);
m_curString="";
}
void LinkedTextHandler::end()
{
if (!m_curString.isEmpty())
{
m_children.append(new LT_Text(m_curString));
printf("LinkedTextHandler: add text `%s'\n",m_curString.data());
m_curString="";
}
m_parent->setDelegate(0);
}
void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
{
if (!m_curString.isEmpty())
{
m_children.append(new LT_Text(m_curString));
printf("LinkedTextHandler: add text `%s'\n",m_curString.data());
m_curString="";
}
ASSERT(m_ref==0);
m_ref = new LT_Ref;
m_ref->setRefId(attrib.value("idref"));
m_ref->setExtId(attrib.value("external"));
}
void LinkedTextHandler::endRef()
{
m_ref->setText(m_curString);
m_children.append(m_ref);
printf("LinkedTextHandler: add ref `%s'\n",m_ref->text().data());
m_ref=0;
}
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#ifndef LINKEDTEXTHANDLER_H
#define LINKEDTEXTHANDLER_H
#include "baseiterator.h"
#include "basehandler.h"
class LT_Ref;
class LinkedTextIterator : public BaseIterator<ILinkedTextIterator,ILinkedText,ILinkedText>
{
public:
LinkedTextIterator(const QList<ILinkedText> &list) :
BaseIterator<ILinkedTextIterator,ILinkedText,ILinkedText>(list) {}
};
class LinkedTextHandler : public BaseHandler<LinkedTextHandler>
{
public:
LinkedTextHandler(IBaseHandler *parent,QList<ILinkedText> &children);
virtual ~LinkedTextHandler();
virtual void start(const char *endTag);
virtual void end();
virtual void startRef(const QXmlAttributes& attrib);
virtual void endRef();
private:
IBaseHandler *m_parent;
QList<ILinkedText> &m_children;
LT_Ref *m_ref;
};
#endif
...@@ -118,7 +118,9 @@ IDoxygen *createObjectModelFromXML(const char * xmlFileName) ...@@ -118,7 +118,9 @@ IDoxygen *createObjectModelFromXML(const char * xmlFileName)
reader.setContentHandler( handler ); reader.setContentHandler( handler );
reader.setErrorHandler( &errorHandler ); reader.setErrorHandler( &errorHandler );
reader.parse( source ); reader.parse( source );
printf("<---------- initialize ----------->\n");
handler->initialize(); handler->initialize();
printf("<-------- end initialize --------->\n");
return handler; return handler;
} }
...@@ -19,7 +19,8 @@ ...@@ -19,7 +19,8 @@
#include <qlist.h> #include <qlist.h>
#include "basehandler.h" #include "basehandler.h"
#include "compoundhandler.h" #include "compoundhandler.h"
#include "doxmlintf.h" #include <doxmlintf.h>
#include "memberhandler.h"
class MainHandler : public IDoxygen, public BaseHandler<MainHandler> class MainHandler : public IDoxygen, public BaseHandler<MainHandler>
{ {
...@@ -28,26 +29,29 @@ class MainHandler : public IDoxygen, public BaseHandler<MainHandler> ...@@ -28,26 +29,29 @@ class MainHandler : public IDoxygen, public BaseHandler<MainHandler>
MainHandler(); MainHandler();
virtual ~MainHandler(); virtual ~MainHandler();
QListIterator<ICompound> getCompoundIterator() const ICompoundIterator *compounds() const
{ {
return m_compounds; return new CompoundIterator(m_compounds);
} }
ICompound *getCompoundById(const QString &id) const ICompound *compoundById(const QString &id) const
{ {
return m_compoundDict[id]; return m_compoundDict[id];
} }
virtual ICompound *getCompoundByName(const QString &name) const virtual ICompound *compoundByName(const QString &name) const
{ {
return name.isEmpty() ? 0 : m_compoundNameDict[name]; return name.isEmpty() ? 0 : m_compoundNameDict[name];
} }
virtual IMember *getMemberById(const QString &id) const virtual IMember *memberById(const QString &id) const
{ {
return m_memberDict[id]; return m_memberDict[id];
} }
virtual QList<IMember> *getMemberByName(const QString &name) const virtual IMemberIterator *memberByName(const QString &name) const
{ {
return m_memberNameDict[name]; QList<IMember> *ml = m_memberNameDict[name];
if (ml==0) return 0;
return new MemberIterator(*ml);
} }
virtual void release() { delete this; }
void insertMemberById(const QString &id,IMember *h); void insertMemberById(const QString &id,IMember *h);
void insertMemberByName(const QString &name,IMember *h); void insertMemberByName(const QString &name,IMember *h);
......
...@@ -17,14 +17,74 @@ ...@@ -17,14 +17,74 @@
#include "sectionhandler.h" #include "sectionhandler.h"
#include "dochandler.h" #include "dochandler.h"
#include "mainhandler.h" #include "mainhandler.h"
#include "linkedtexthandler.h"
//------------------------------------------------------------------------------
void MemberReference::initialize(MainHandler *mh)
{
m_mainHandler = mh;
}
IMember *MemberReference::member() const
{
return m_mainHandler->memberById(m_memId);
}
//------------------------------------------------------------------------------
EnumValueHandler::EnumValueHandler(IBaseHandler *parent) : m_parent(parent)
{
addEndHandler("enumvalue",this,&EnumValueHandler::endEnumValue);
addStartHandler("name",this,&EnumValueHandler::startName);
addEndHandler("name",this,&EnumValueHandler::endName);
addStartHandler("initializer",this,&EnumValueHandler::startInitializer);
addEndHandler("initializer",this,&EnumValueHandler::endInitializer);
}
void EnumValueHandler::startEnumValue(const QXmlAttributes& /*attrib*/)
{
m_parent->setDelegate(this);
}
void EnumValueHandler::endEnumValue()
{
m_parent->setDelegate(0);
}
void EnumValueHandler::startName(const QXmlAttributes& /*attrib*/)
{
m_curString="";
}
void EnumValueHandler::endName()
{
m_name = m_curString;
}
void EnumValueHandler::startInitializer(const QXmlAttributes& /*attrib*/)
{
m_curString="";
}
void EnumValueHandler::endInitializer()
{
m_initializer = m_curString;
}
//------------------------------------------------------------------------------
MemberHandler::MemberHandler(IBaseHandler *parent) MemberHandler::MemberHandler(IBaseHandler *parent)
: m_parent(parent), m_brief(0), m_detailed(0) : m_parent(parent), m_brief(0), m_detailed(0)
{ {
addEndHandler("memberdef",this,&MemberHandler::endMember); addEndHandler("memberdef",this,&MemberHandler::endMember);
addStartHandler("type"); addStartHandler("type",this,&MemberHandler::startType);
addEndHandler("type",this,&MemberHandler::endType); addStartHandler("initializer",this,&MemberHandler::startInitializer);
addStartHandler("exception",this,&MemberHandler::startException);
addStartHandler("enumvalue",this,&MemberHandler::startEnumValue);
addStartHandler("name"); addStartHandler("name");
addEndHandler("name",this,&MemberHandler::endName); addEndHandler("name",this,&MemberHandler::endName);
...@@ -35,25 +95,38 @@ MemberHandler::MemberHandler(IBaseHandler *parent) ...@@ -35,25 +95,38 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
addStartHandler("detaileddescription",this,&MemberHandler::startDetailedDesc); addStartHandler("detaileddescription",this,&MemberHandler::startDetailedDesc);
addStartHandler("location",this,&MemberHandler::startLocation);
addEndHandler("location");
addStartHandler("references",this,&MemberHandler::startReferences); addStartHandler("references",this,&MemberHandler::startReferences);
addEndHandler("references",this,&MemberHandler::endReferences); addEndHandler("references",this,&MemberHandler::endReferences);
addStartHandler("referencedby",this,&MemberHandler::startReferencedBy); addStartHandler("referencedby",this,&MemberHandler::startReferencedBy);
addEndHandler("referencedby",this,&MemberHandler::endReferencedBy); addEndHandler("referencedby",this,&MemberHandler::endReferencedBy);
addStartHandler("reimplements",this,&MemberHandler::startReimplements);
addEndHandler("reimplements",this,&MemberHandler::endReimplements);
addStartHandler("reimplementedby",this,&MemberHandler::startReimplementedBy);
addEndHandler("reimplementedby",this,&MemberHandler::endReimplementedBy);
addStartHandler("location",this,&MemberHandler::startLocation);
addEndHandler("location");
m_params.setAutoDelete(TRUE); m_params.setAutoDelete(TRUE);
m_references.setAutoDelete(TRUE); m_references.setAutoDelete(TRUE);
m_referencedBy.setAutoDelete(TRUE); m_referencedBy.setAutoDelete(TRUE);
m_reimplements = 0;
m_reimplementedBy.setAutoDelete(TRUE);
m_enumValues.setAutoDelete(TRUE);
m_linkedTextHandler = 0;
m_defLine=0;
m_bodyStart=0;
m_bodyEnd=0;
} }
MemberHandler::~MemberHandler() MemberHandler::~MemberHandler()
{ {
delete m_brief; delete m_brief;
delete m_detailed; delete m_detailed;
delete m_linkedTextHandler;
} }
void MemberHandler::startMember(const QXmlAttributes& attrib) void MemberHandler::startMember(const QXmlAttributes& attrib)
...@@ -61,8 +134,10 @@ void MemberHandler::startMember(const QXmlAttributes& attrib) ...@@ -61,8 +134,10 @@ void MemberHandler::startMember(const QXmlAttributes& attrib)
m_parent->setDelegate(this); m_parent->setDelegate(this);
m_kind = attrib.value("kind"); m_kind = attrib.value("kind");
m_id = attrib.value("id"); m_id = attrib.value("id");
m_virtualness = attrib.value("virt");
m_protection = attrib.value("prot"); m_protection = attrib.value("prot");
m_virtualness = attrib.value("virtualness"); m_isConst = attrib.value("const")=="yes";
m_isVolatile = attrib.value("volatile")=="yes";
printf("member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n", printf("member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kind.data(),m_id.data(),m_protection.data(),m_virtualness.data()); m_kind.data(),m_id.data(),m_protection.data(),m_virtualness.data());
} }
...@@ -84,14 +159,19 @@ void MemberHandler::startDetailedDesc(const QXmlAttributes& attrib) ...@@ -84,14 +159,19 @@ void MemberHandler::startDetailedDesc(const QXmlAttributes& attrib)
void MemberHandler::startLocation(const QXmlAttributes& attrib) void MemberHandler::startLocation(const QXmlAttributes& attrib)
{ {
m_defFile = attrib.value("file"); m_defFile = attrib.value("file");
m_defLine = attrib.value("line").toInt(); QCString s;
s = attrib.value("line");
if (!s.isEmpty()) m_defLine=s.toInt();
s = attrib.value("bodystart");
if (!s.isEmpty()) m_bodyStart=s.toInt();
s = attrib.value("bodyend");
if (!s.isEmpty()) m_bodyEnd=s.toInt();
} }
void MemberHandler::startReferences(const QXmlAttributes& attrib) void MemberHandler::startReferences(const QXmlAttributes& attrib)
{ {
MemberReference *mr = new MemberReference; MemberReference *mr = new MemberReference;
mr->m_memId = attrib.value("id"); mr->m_memId = attrib.value("id");
mr->m_line = attrib.value("line").toInt();
m_references.append(mr); m_references.append(mr);
m_curString=""; m_curString="";
} }
...@@ -105,7 +185,6 @@ void MemberHandler::startReferencedBy(const QXmlAttributes& attrib) ...@@ -105,7 +185,6 @@ void MemberHandler::startReferencedBy(const QXmlAttributes& attrib)
{ {
MemberReference *mr = new MemberReference; MemberReference *mr = new MemberReference;
mr->m_memId = attrib.value("id"); mr->m_memId = attrib.value("id");
mr->m_line = attrib.value("line").toInt();
m_referencedBy.append(mr); m_referencedBy.append(mr);
m_curString=""; m_curString="";
} }
...@@ -115,15 +194,58 @@ void MemberHandler::endReferencedBy() ...@@ -115,15 +194,58 @@ void MemberHandler::endReferencedBy()
m_referencedBy.getLast()->m_name = m_curString; m_referencedBy.getLast()->m_name = m_curString;
} }
void MemberHandler::startReimplements(const QXmlAttributes& attrib)
{
m_reimplements = new MemberReference;
m_reimplements->m_memId = attrib.value("id");
m_curString="";
}
void MemberHandler::endReimplements()
{
m_reimplements->m_name = m_curString;
}
void MemberHandler::startReimplementedBy(const QXmlAttributes& attrib)
{
MemberReference *mr = new MemberReference;
mr->m_memId = attrib.value("id");
m_reimplementedBy.append(mr);
m_curString="";
}
void MemberHandler::endReimplementedBy()
{
m_reimplementedBy.getLast()->m_name = m_curString;
}
void MemberHandler::endMember() void MemberHandler::endMember()
{ {
m_parent->setDelegate(0); m_parent->setDelegate(0);
} }
void MemberHandler::endType() void MemberHandler::startType(const QXmlAttributes &)
{ {
m_type = m_curString.stripWhiteSpace(); printf("startType!\n");
printf("member type=`%s'\n",m_type.data()); delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_type);
m_linkedTextHandler->start("type");
}
void MemberHandler::startInitializer(const QXmlAttributes &)
{
printf("startInitializer!\n");
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
m_linkedTextHandler->start("initializer");
}
void MemberHandler::startException(const QXmlAttributes &)
{
printf("startException!\n");
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_exception);
m_linkedTextHandler->start("exception");
} }
void MemberHandler::endName() void MemberHandler::endName()
...@@ -139,22 +261,39 @@ void MemberHandler::startParam(const QXmlAttributes& attrib) ...@@ -139,22 +261,39 @@ void MemberHandler::startParam(const QXmlAttributes& attrib)
m_params.append(paramHandler); m_params.append(paramHandler);
} }
void MemberHandler::initialize(MainHandler *mh) void MemberHandler::startEnumValue(const QXmlAttributes& attrib)
{ {
QListIterator<MemberReference> mli(m_references); EnumValueHandler *evh = new EnumValueHandler(this);
MemberReference *mr; evh->startEnumValue(attrib);
for (;(mr=mli.current());++mli) m_enumValues.append(evh);
{
mr->initialize(mh);
}
} }
void MemberHandler::MemberReference::initialize(MainHandler *mh) void MemberHandler::initialize(MainHandler *mh)
{ {
m_mainHandler = mh; {
QListIterator<MemberReference> mli(m_references);
MemberReference *mr;
for (;(mr=mli.current());++mli)
{
mr->initialize(mh);
}
}
{
QListIterator<MemberReference> mli(m_referencedBy);
MemberReference *mr;
for (;(mr=mli.current());++mli)
{
mr->initialize(mh);
}
}
{
QListIterator<MemberReference> mli(m_reimplementedBy);
MemberReference *mr;
for (;(mr=mli.current());++mli)
{
mr->initialize(mh);
}
}
if (m_reimplements) m_reimplements->initialize(mh);
} }
IMember *MemberHandler::MemberReference::getMember() const
{
return m_mainHandler->getMemberById(m_memId);
}
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#ifndef _MEMBERHANDLER_H
#define _MEMBERHANDLER_H
#include <qstring.h>
#include <qlist.h>
#include <qxml.h>
#include <doxmlintf.h>
#include "basehandler.h"
#include "baseiterator.h"
#include "paramhandler.h"
#include "linkedtexthandler.h"
#include "dochandler.h"
class MainHandler;
struct MemberReference : public IMemberReference
{
virtual ~MemberReference() {}
virtual IMember *member() const;
virtual QString memberName() const { return m_name; }
void initialize(MainHandler *m);
QString m_memId;
QString m_name;
MainHandler *m_mainHandler;
};
class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>
{
public:
MemberReferenceIterator(const QList<MemberReference> &list) :
BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {}
};
class MemberIterator : public BaseIterator<IMemberIterator,IMember,IMember>
{
public:
MemberIterator(const QList<IMember> &list) :
BaseIterator<IMemberIterator,IMember,IMember>(list) {}
};
class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler>
{
public:
virtual void startName(const QXmlAttributes& attrib);
virtual void endName();
virtual void startInitializer(const QXmlAttributes& attrib);
virtual void endInitializer();
virtual void startEnumValue(const QXmlAttributes& attrib);
virtual void endEnumValue();
// IEnumValue
virtual QString name() const { return m_name; }
virtual QString initializer() const { return m_initializer; }
void setName(const QString &name) { m_name=name; }
void setInitializer(const QString &init) { m_initializer=init; }
virtual ~EnumValueHandler() {}
EnumValueHandler(IBaseHandler *parent);
private:
QString m_name;
QString m_initializer;
IBaseHandler *m_parent;
};
class EnumValueIterator : public BaseIterator<IEnumValueIterator,IEnumValue,EnumValueHandler>
{
public:
EnumValueIterator(const QList<EnumValueHandler> &list) :
BaseIterator<IEnumValueIterator,IEnumValue,EnumValueHandler>(list) {}
};
class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{
public:
virtual void startMember(const QXmlAttributes& attrib);
virtual void endMember();
virtual void startParam(const QXmlAttributes& attrib);
virtual void startType(const QXmlAttributes& attrib);
virtual void endName();
virtual void startBriefDesc(const QXmlAttributes& attrib);
virtual void startDetailedDesc(const QXmlAttributes& attrib);
virtual void startLocation(const QXmlAttributes& attrib);
virtual void startReferences(const QXmlAttributes& attrib);
virtual void endReferences();
virtual void startReferencedBy(const QXmlAttributes& attrib);
virtual void endReferencedBy();
virtual void startReimplements(const QXmlAttributes& attrib);
virtual void endReimplements();
virtual void startReimplementedBy(const QXmlAttributes& attrib);
virtual void endReimplementedBy();
virtual void startInitializer(const QXmlAttributes& attrib);
virtual void startException(const QXmlAttributes& attrib);
virtual void startEnumValue(const QXmlAttributes& attrib);
MemberHandler(IBaseHandler *parent);
virtual ~MemberHandler();
// IMember implementation
virtual QString kind() const
{ return m_kind; }
virtual QString id() const
{ return m_id; }
virtual QString protection() const
{ return m_protection; }
virtual QString virtualness() const
{ return m_virtualness; }
virtual QString name() const
{ return m_name; }
virtual bool isConst() const
{ return m_isConst; }
virtual bool isVolatile() const
{ return m_isVolatile; }
virtual ILinkedTextIterator *type() const
{ return new LinkedTextIterator(m_type); }
virtual IParamIterator *params() const
{ return new ParamIterator(m_params); }
virtual IMemberReferenceIterator *references() const
{ return new MemberReferenceIterator(m_references); }
virtual IMemberReferenceIterator *referencedBy() const
{ return new MemberReferenceIterator(m_referencedBy); }
virtual ILinkedTextIterator *initializer() const
{ return new LinkedTextIterator(m_initializer); }
virtual ILinkedTextIterator *exceptions() const
{ return new LinkedTextIterator(m_exception); }
virtual int bodyStart() const
{ return m_bodyStart; }
virtual int bodyEnd() const
{ return m_bodyEnd; }
virtual QString definitionFile() const
{ return m_defFile; }
virtual int definitionLine() const
{ return m_defLine; }
virtual IMemberReference *reimplements() const
{ return m_reimplements; }
virtual IMemberReferenceIterator *reimplementedBy() const
{ return new MemberReferenceIterator(m_reimplementedBy); }
virtual IEnumValueIterator *enumValues() const
{ return new EnumValueIterator(m_enumValues); }
virtual IDocRoot *briefDescription() const
{ return m_brief; }
virtual IDocRoot *detailedDescription() const
{ return m_detailed; }
void initialize(MainHandler *m);
private:
IBaseHandler *m_parent;
QString m_kind;
QString m_id;
QString m_protection;
QString m_virtualness;
QList<ILinkedText> m_type;
QList<ILinkedText> m_initializer;
QList<ILinkedText> m_exception;
QString m_name;
DocHandler *m_brief;
DocHandler *m_detailed;
QList<IParam> m_params;
QList<MemberReference> m_references;
QList<MemberReference> m_referencedBy;
MemberReference *m_reimplements;
QList<MemberReference> m_reimplementedBy;
QString m_defFile;
int m_defLine;
int m_bodyStart;
int m_bodyEnd;
bool m_isConst;
bool m_isVolatile;
LinkedTextHandler *m_linkedTextHandler;
QList<EnumValueHandler> m_enumValues;
};
#endif
...@@ -20,8 +20,7 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -20,8 +20,7 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
{ {
addEndHandler("param",this,&ParamHandler::endParam); addEndHandler("param",this,&ParamHandler::endParam);
addStartHandler("type"); addStartHandler("type",this,&ParamHandler::startType);
addEndHandler("type",this,&ParamHandler::endType);
addStartHandler("declname"); addStartHandler("declname");
addEndHandler("declname",this,&ParamHandler::endDeclName); addEndHandler("declname",this,&ParamHandler::endDeclName);
...@@ -35,8 +34,9 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -35,8 +34,9 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
addStartHandler("attrib"); addStartHandler("attrib");
addEndHandler("attrib",this,&ParamHandler::endAttrib); addEndHandler("attrib",this,&ParamHandler::endAttrib);
addStartHandler("defval"); addStartHandler("defval",this,&ParamHandler::startDefVal);
addEndHandler("defval",this,&ParamHandler::endDefVal);
m_linkedTextHandler = 0;
} }
ParamHandler::~ParamHandler() ParamHandler::~ParamHandler()
...@@ -54,10 +54,12 @@ void ParamHandler::endParam() ...@@ -54,10 +54,12 @@ void ParamHandler::endParam()
m_parent->setDelegate(0); m_parent->setDelegate(0);
} }
void ParamHandler::endType() void ParamHandler::startType(const QXmlAttributes& /*attrib*/)
{ {
m_type = m_curString.stripWhiteSpace(); delete m_linkedTextHandler;
printf("param type=`%s'\n",m_type.data()); m_linkedTextHandler = new LinkedTextHandler(this,m_type);
m_linkedTextHandler->start("type");
printf("param type\n");
} }
void ParamHandler::endDeclName() void ParamHandler::endDeclName()
...@@ -84,10 +86,12 @@ void ParamHandler::endArray() ...@@ -84,10 +86,12 @@ void ParamHandler::endArray()
printf("member array=`%s'\n",m_array.data()); printf("member array=`%s'\n",m_array.data());
} }
void ParamHandler::endDefVal() void ParamHandler::startDefVal(const QXmlAttributes& /*attrib*/)
{ {
m_defVal = m_curString.stripWhiteSpace(); delete m_linkedTextHandler;
printf("member defVal=`%s'\n",m_defVal.data()); m_linkedTextHandler = new LinkedTextHandler(this,m_defVal);
m_linkedTextHandler->start("type");
printf("member defVal\n");
} }
......
...@@ -19,41 +19,53 @@ ...@@ -19,41 +19,53 @@
#include <qstring.h> #include <qstring.h>
#include <qlist.h> #include <qlist.h>
#include <qxml.h> #include <qxml.h>
#include <doxmlintf.h>
#include "basehandler.h" #include "basehandler.h"
#include "doxmlintf.h" #include "baseiterator.h"
#include "linkedtexthandler.h"
class ParamIterator : public BaseIterator<IParamIterator,IParam,IParam>
{
public:
ParamIterator(const QList<IParam> &list) :
BaseIterator<IParamIterator,IParam,IParam>(list) {}
};
class ParamHandler : public IParam, public BaseHandler<ParamHandler> class ParamHandler : public IParam, public BaseHandler<ParamHandler>
{ {
public: public:
virtual void startParam(const QXmlAttributes& attrib); virtual void startParam(const QXmlAttributes& attrib);
virtual void endParam(); virtual void endParam();
virtual void endType(); virtual void startType(const QXmlAttributes& attrib);
virtual void endDeclName(); virtual void endDeclName();
virtual void endDefName(); virtual void endDefName();
virtual void endAttrib(); virtual void endAttrib();
virtual void endArray(); virtual void endArray();
virtual void endDefVal(); virtual void startDefVal(const QXmlAttributes& attrib);
ParamHandler(IBaseHandler *parent); ParamHandler(IBaseHandler *parent);
virtual ~ParamHandler(); virtual ~ParamHandler();
// IParam // IParam
virtual QString type() const { return m_type; } virtual ILinkedTextIterator *type() const
{ return new LinkedTextIterator(m_type); }
virtual QString declarationName() const { return m_declName; } virtual QString declarationName() const { return m_declName; }
virtual QString definitionName() const { return m_defName; } virtual QString definitionName() const { return m_defName; }
virtual QString attrib() const { return m_attrib; } virtual QString attrib() const { return m_attrib; }
virtual QString arraySpecifier() const { return m_array; } virtual QString arraySpecifier() const { return m_array; }
virtual QString defaultValue() const { return m_defVal; } virtual ILinkedTextIterator *defaultValue() const
{ return new LinkedTextIterator(m_defVal); }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_type; QList<ILinkedText> m_type;
QString m_declName; QString m_declName;
QString m_defName; QString m_defName;
QString m_attrib; QString m_attrib;
QString m_array; QString m_array;
QString m_defVal; QList<ILinkedText> m_defVal;
LinkedTextHandler *m_linkedTextHandler;
}; };
#endif #endif
...@@ -53,7 +53,7 @@ void SectionHandler::initialize(MainHandler *m) ...@@ -53,7 +53,7 @@ void SectionHandler::initialize(MainHandler *m)
MemberHandler *mh; MemberHandler *mh;
for (;(mh=(MemberHandler *)mli.current());++mli) for (;(mh=(MemberHandler *)mli.current());++mli)
{ {
m->insertMemberById(mh->name(),mh); m->insertMemberById(mh->id(),mh);
m->insertMemberByName(mh->name(),mh); m->insertMemberByName(mh->name(),mh);
} }
} }
......
...@@ -19,13 +19,23 @@ ...@@ -19,13 +19,23 @@
#include <qstring.h> #include <qstring.h>
#include <qlist.h> #include <qlist.h>
#include <qxml.h> #include <qxml.h>
#include <doxmlintf.h>
#include "basehandler.h" #include "basehandler.h"
#include "memberhandler.h" #include "memberhandler.h"
#include "doxmlintf.h"
class MainHandler; class MainHandler;
class SectionIterator :
public BaseIterator<ISectionIterator,ISection,ISection>
{
public:
SectionIterator(const QList<ISection> &list) :
BaseIterator<ISectionIterator,ISection,ISection>(list) {}
};
class SectionHandler : public ISection, public BaseHandler<SectionHandler> class SectionHandler : public ISection, public BaseHandler<SectionHandler>
{ {
public: public:
...@@ -38,7 +48,8 @@ class SectionHandler : public ISection, public BaseHandler<SectionHandler> ...@@ -38,7 +48,8 @@ class SectionHandler : public ISection, public BaseHandler<SectionHandler>
// ISection // ISection
virtual QString kind() const { return m_kind; } virtual QString kind() const { return m_kind; }
virtual QListIterator<IMember> getMemberIterator() const { return m_members; } virtual IMemberIterator *members() const
{ return new MemberIterator(m_members); }
void initialize(MainHandler *m); void initialize(MainHandler *m);
......
...@@ -11,6 +11,3 @@ Makefile.xmlparse: xmlparse.pro ...@@ -11,6 +11,3 @@ Makefile.xmlparse: xmlparse.pro
$(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
install: install:
$(INSTTOOL) -d $(INSTALL)/bin
$(INSTTOOL) -m 755 ../../bin/xmlparse $(INSTALL)/bin
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#include <stdio.h>
#include <doxmlintf.h>
QString linkedTextToString(ILinkedTextIterator *ti)
{
QString result;
ILinkedText *lt=0;
for (ti->toFirst();(lt=ti->current());ti->toNext())
{
switch (lt->kind())
{
case ILinkedText::Kind_Text:
result+=dynamic_cast<ILT_Text*>(lt)->text(); break;
case ILinkedText::Kind_Ref:
result+=dynamic_cast<ILT_Ref *>(lt)->text(); break;
}
}
return result;
}
void DumpDoc(IDoc *doc)
{
printf(" doc node kind=`%d'\n",doc->kind());
switch (doc->kind())
{
case IDoc::Para:
{
printf(" --- par --- \n");
IDocPara *par = dynamic_cast<IDocPara*>(doc);
ASSERT(par!=0);
IDocIterator *di = par->contents();
IDoc *pdoc;
for (di->toFirst();(pdoc=di->current());di->toNext())
{
DumpDoc(pdoc);
}
di->release();
printf(" --- end par --- \n");
}
break;
case IDoc::Text:
{
IDocText *txt = dynamic_cast<IDocText*>(doc);
ASSERT(txt!=0);
printf(" --- text `%s' markup=%d --- \n",txt->text().data(),txt->markup());
}
break;
case IDoc::Title:
{
printf(" --- title --- \n");
IDocTitle *t = dynamic_cast<IDocTitle*>(doc);
ASSERT(t!=0);
IDocIterator *di = t->title();
IDoc *pdoc;
for (di->toFirst();(pdoc=di->current());di->toNext())
{
DumpDoc(pdoc);
}
printf(" --- end title --- \n");
}
break;
case IDoc::Section:
{
IDocSection *sec = dynamic_cast<IDocSection*>(doc);
ASSERT(sec!=0);
printf(" --- section id=`%s' level=%d --- \n",
sec->id().data(),sec->level());
IDocIterator *di = sec->title();
IDoc *pdoc;
for (di->toFirst();(pdoc=di->current());di->toNext())
{
DumpDoc(pdoc);
}
printf(" --- end section --- \n");
}
break;
case IDoc::Root:
{
printf(" --- root --- \n");
IDocRoot *root = dynamic_cast<IDocRoot*>(doc);
ASSERT(root!=0);
IDocIterator *di = root->contents();
IDoc *pdoc;
for (di->toFirst();(pdoc=di->current());di->toNext())
{
DumpDoc(pdoc);
}
di->release();
printf(" --- end root --- \n");
}
break;
default:
break;
}
}
int main(int argc,char **argv)
{
if (argc!=2)
{
printf("Usage: %s file.xml\n",argv[0]);
exit(1);
}
IDoxygen *dox = createObjectModelFromXML(argv[1]);
ICompoundIterator *cli = dox->compounds();
ICompound *comp;
printf("--- compound list ---------\n");
for (cli->toFirst();(comp=cli->current());cli->toNext())
{
printf("Compound name=%s id=%s kind=%s\n",
comp->name().data(),comp->id().data(),comp->kind().data());
ISectionIterator *sli = comp->sections();
ISection *sec;
for (sli->toFirst();(sec=sli->current());sli->toNext())
{
printf(" Section kind=%s\n",sec->kind().data());
IMemberIterator *mli = sec->members();
IMember *mem;
for (mli->toFirst();(mem=mli->current());mli->toNext())
{
ILinkedTextIterator *lti = mem->type();
printf(" Member type=%s name=%s\n",
linkedTextToString(lti).data(),mem->name().data());
lti->release();
IParamIterator *pli = mem->params();
IParam *par;
for (pli->toFirst();(par=pli->current());pli->toNext())
{
lti = par->type();
QString parType = linkedTextToString(lti);
lti->release();
lti = par->defaultValue();
QString defVal = linkedTextToString(lti);
lti->release();
printf(" Param type=%s name=%s defvalue=%s\n",
parType.data(), par->definitionName().data(),defVal.data());
}
pli->release();
IMemberReferenceIterator *mri = mem->references();
IMemberReference *mr;
for (mri->toFirst();(mr=mri->current());mri->toNext())
{
IMember *memr = mr->member();
printf(" References %s at line %d\n",
mr->memberName().data(),memr->bodyStart());
}
mri->release();
mri = mem->referencedBy();
for (mri->toFirst();(mr=mri->current());mri->toNext())
{
IMember *memr = mr->member();
printf(" ReferencedBy %s at line %d\n",
mr->memberName().data(),memr->bodyStart());
}
mri->release();
IEnumValueIterator *evi = mem->enumValues();
IEnumValue *ev;
for (evi->toFirst();(ev=evi->current());evi->toNext())
{
printf(" Enum value `%s' init=`%s'\n",
ev->name().data(),ev->initializer().data());
}
evi->release();
IDoc *doc = mem->briefDescription();
if (doc)
{
printf("===== brief description ==== \n");
DumpDoc(doc);
}
doc = mem->detailedDescription();
if (doc)
{
printf("===== detailed description ==== \n");
DumpDoc(doc);
}
}
mli->release();
}
sli->release();
IDoc *doc = comp->briefDescription();
if (doc)
{
printf("===== brief description ==== \n");
DumpDoc(doc);
}
doc = comp->detailedDescription();
if (doc)
{
printf("===== detailed description ==== \n");
DumpDoc(doc);
}
}
cli->release();
printf("---------------------------\n");
dox->release();
return 0;
}
TEMPLATE = app.t
CONFIG = console warn_on $extraopts
HEADERS =
SOURCES = main.cpp
unix:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
win32:INCLUDEPATH += .
win32-mingw:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\lib;..\lib
win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
win32-borland:TMAKE_LFLAGS += -L..\..\..\lib -L..\lib
win32:TMAKE_CXXFLAGS += -DQT_NODLL
DESTDIR =
OBJECTS_DIR = ../objects
TARGET = xmlparse
INCLUDEPATH += ../../../qtools ../include
unix:TARGETDEPS = ../lib/libdoxmlparser.a
win32:TARGETDEPS = ..\lib\doxmlparser.lib
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H
#include <qlist.h>
#include <qstring.h>
class IMember;
class IParam
{
public:
virtual QString type() const = 0;
virtual QString declarationName() const = 0;
virtual QString definitionName() const = 0;
virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0;
virtual QString defaultValue() const = 0;
};
class IMemberReference
{
public:
virtual IMember *getMember() const = 0;
virtual QString getMemberName() const = 0;
virtual int getLineNumber() const = 0;
};
class IMember
{
public:
virtual QString kind() const = 0;
virtual QString id() const = 0;
virtual QString protection() const = 0;
virtual QString virtualness() const = 0;
virtual QString type() const = 0;
virtual QString name() const = 0;
virtual QListIterator<IParam> getParamIterator() const = 0;
};
class ISection
{
public:
virtual QString kind() const = 0;
virtual QListIterator<IMember> getMemberIterator() const = 0;
};
class ICompound
{
public:
virtual QString name() const = 0;
virtual QString id() const = 0;
virtual QString kind() const = 0;
virtual QListIterator<ISection> getSectionIterator() const = 0;
};
/*! Root node of the object model. */
class IDoxygen
{
public:
/*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project.
*/
virtual QListIterator<ICompound> getCompoundIterator() const = 0;
/*! Returns a compound given its unique \a id. If you have a
* compound id this function is much more efficient than iterating
* over the compound list. Returns 0 if the id is not valid.
*/
virtual ICompound *getCompoundById(const QString &id) const = 0;
/*! Returns a compound given its name (including the scope).
* Returns 0 if the name is not found in the project.
*/
virtual ICompound *getCompoundByName(const QString &name) const = 0;
virtual IMember *getMemberById(const QString &id) const = 0;
virtual QList<IMember> *getMemberByName(const QString &name) const = 0;
};
/*! Factory method that creates an object model given an XML file generated
* by doxygen.
* @param xmlFileName The name of the XML to parse.
* @returns An iterface to the object model.
*/
IDoxygen *createObjectModelFromXML(const char *xmlFileName);
#endif
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#include <stdio.h>
#include "doxmlintf.h"
int main(int argc,char **argv)
{
if (argc!=2)
{
printf("Usage: %s file.xml\n",argv[0]);
exit(1);
}
IDoxygen *dox = createObjectModelFromXML(argv[1]);
{
QListIterator<ICompound> cli(dox->getCompoundIterator());
ICompound *comp;
printf("--- compound list ---------\n");
for (cli.toFirst();(comp=cli.current());++cli)
{
printf("Compound name=%s id=%s kind=%s\n",
comp->name().data(),comp->id().data(),comp->kind().data());
QListIterator<ISection> sli(comp->getSectionIterator());
ISection *sec;
for (sli.toFirst();(sec=sli.current());++sli)
{
printf(" Section kind=%s\n",sec->kind().data());
QListIterator<IMember> mli(sec->getMemberIterator());
IMember *mem;
for (mli.toFirst();(mem=mli.current());++mli)
{
printf(" Member type=%s name=%s\n",mem->type().data(),mem->name().data());
QListIterator<IParam> pli(mem->getParamIterator());
IParam *par;
for (pli.toFirst();(par=pli.current());++pli)
{
printf(" Param type=%s name=%s defvalue=%s\n",
par->type().data(),par->definitionName().data(),par->defaultValue().data());
}
}
}
}
printf("---------------------------\n");
}
delete dox;
return 0;
}
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2001 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.
*
*/
#ifndef _MEMBERHANDLER_H
#define _MEMBERHANDLER_H
#include <qstring.h>
#include <qlist.h>
#include <qxml.h>
#include "basehandler.h"
#include "paramhandler.h"
#include "doxmlintf.h"
class DocHandler;
class MainHandler;
class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{
public:
virtual void startMember(const QXmlAttributes& attrib);
virtual void endMember();
virtual void startParam(const QXmlAttributes& attrib);
virtual void endType();
virtual void endName();
virtual void startBriefDesc(const QXmlAttributes& attrib);
virtual void startDetailedDesc(const QXmlAttributes& attrib);
virtual void startLocation(const QXmlAttributes& attrib);
virtual void startReferences(const QXmlAttributes& attrib);
virtual void endReferences();
virtual void startReferencedBy(const QXmlAttributes& attrib);
virtual void endReferencedBy();
MemberHandler(IBaseHandler *parent);
virtual ~MemberHandler();
// IMember
virtual QString kind() const { return m_kind; }
virtual QString id() const { return m_id; }
virtual QString protection() const { return m_protection; }
virtual QString virtualness() const { return m_virtualness; }
virtual QString type() const { return m_type; }
virtual QString name() const { return m_name; }
virtual QListIterator<IParam> getParamIterator() const { return m_params; }
void initialize(MainHandler *m);
private:
struct MemberReference : public IMemberReference
{
virtual ~MemberReference() {}
virtual IMember *getMember() const;
virtual QString getMemberName() const { return m_name; }
virtual int getLineNumber() const { return m_line; }
void initialize(MainHandler *m);
QString m_memId;
QString m_name;
int m_line;
MainHandler *m_mainHandler;
};
IBaseHandler *m_parent;
QString m_kind;
QString m_id;
QString m_protection;
QString m_virtualness;
QString m_type;
QString m_name;
DocHandler *m_brief;
DocHandler *m_detailed;
QList<IParam> m_params;
QList<MemberReference> m_references;
QList<MemberReference> m_referencedBy;
QString m_defFile;
int m_defLine;
};
#endif
...@@ -27,7 +27,7 @@ f_prefix=/usr ...@@ -27,7 +27,7 @@ f_prefix=/usr
f_insttool=NO f_insttool=NO
f_english=NO f_english=NO
f_wizard=NO f_wizard=NO
f_langs=nl,se,cz,fr,it,de,jp,es,fi,ru,hr,pl,pt,hu,kr,ro,si,cn,no,br,dk,sk,ua f_langs=nl,se,cz,fr,it,de,jp,es,fi,ru,hr,pl,pt,hu,kr,ro,si,cn,no,br,dk,sk,ua,gr
while test -n "$1"; do while test -n "$1"; do
case $1 in case $1 in
...@@ -409,7 +409,7 @@ TMAKE_CXXFLAGS += -DENGLISH_ONLY ...@@ -409,7 +409,7 @@ TMAKE_CXXFLAGS += -DENGLISH_ONLY
EOF EOF
fi fi
f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/xmlparse/Makefile.in" f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in"
for i in $f_inmakefiles ; do for i in $f_inmakefiles ; do
SRC=$i SRC=$i
...@@ -441,7 +441,7 @@ EOF ...@@ -441,7 +441,7 @@ EOF
echo " Created $DST from $SRC..." echo " Created $DST from $SRC..."
done done
f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in src/doxysearch.pro.in addon/doxywizard/doxywizard.pro.in addon/xmlparse/xmlparse.pro.in" f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in src/doxysearch.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in"
for i in $f_inprofiles ; do for i in $f_inprofiles ; do
SRC=$i SRC=$i
...@@ -467,7 +467,7 @@ echo -n " Generating src/lang_cfg.h..." ...@@ -467,7 +467,7 @@ echo -n " Generating src/lang_cfg.h..."
echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>); echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>);
chomp @l; chomp @l;
@allowed=(NL,SE,CZ,FR,IT,DE,JP,ES,FI,RU,HR,PL,PT,HU,KR,RO,SI,CN,NO,BR, @allowed=(NL,SE,CZ,FR,IT,DE,JP,ES,FI,RU,HR,PL,PT,HU,KR,RO,SI,CN,NO,BR,
DK,SK,UA); DK,SK,UA,GR);
foreach my $elem (@l){ foreach my $elem (@l){
$elem =~ tr/a-z/A-Z/; $elem =~ tr/a-z/A-Z/;
$r=0; $r=0;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# input used in their production; they are not affected by this license. # input used in their production; they are not affected by this license.
all: language FORCE all: language FORCE
@xcopy /s /q /i ..\examples ..\html\examples @xcopy /y /s /q /i ..\examples ..\html\examples
set DOXYGEN_DOCDIR=. & \ set DOXYGEN_DOCDIR=. & \
set VERSION=$(VERSION) & \ set VERSION=$(VERSION) & \
$(DOXYGEN)\bin\doxygen $(DOXYGEN)\bin\doxygen
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# input used in their production; they are not affected by this license. # input used in their production; they are not affected by this license.
all: language FORCE all: language FORCE
@xcopy /s /q /i ..\examples ..\html\examples @xcopy /y /s /q /i ..\examples ..\html\examples
set DOXYGEN_DOCDIR=. set DOXYGEN_DOCDIR=.
set VERSION=$(VERSION) set VERSION=$(VERSION)
$(DOXYGEN)\bin\doxygen $(DOXYGEN)\bin\doxygen
......
...@@ -98,6 +98,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -98,6 +98,7 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_ext_doc_paths EXT_DOC_PATHS <li> \refitem cfg_ext_doc_paths EXT_DOC_PATHS
<li> \refitem cfg_extra_packages EXTRA_PACKAGES <li> \refitem cfg_extra_packages EXTRA_PACKAGES
<li> \refitem cfg_extract_all EXTRACT_ALL <li> \refitem cfg_extract_all EXTRACT_ALL
<li> \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
<li> \refitem cfg_extract_private EXTRACT_PRIVATE <li> \refitem cfg_extract_private EXTRACT_PRIVATE
<li> \refitem cfg_extract_static EXTRACT_STATIC <li> \refitem cfg_extract_static EXTRACT_STATIC
<li> \refitem cfg_file_patterns FILE_PATTERNS <li> \refitem cfg_file_patterns FILE_PATTERNS
...@@ -132,6 +133,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -132,6 +133,7 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_include_path INCLUDE_PATH <li> \refitem cfg_include_path INCLUDE_PATH
<li> \refitem cfg_inherit_docs INHERIT_DOCS <li> \refitem cfg_inherit_docs INHERIT_DOCS
<li> \refitem cfg_inline_info INLINE_INFO <li> \refitem cfg_inline_info INLINE_INFO
<li> \refitem cfg_inline_inherited_memb INLINE_INHERITED_MEMB
<li> \refitem cfg_inline_sources INLINE_SOURCES <li> \refitem cfg_inline_sources INLINE_SOURCES
<li> \refitem cfg_input INPUT <li> \refitem cfg_input INPUT
<li> \refitem cfg_input_filter INPUT_FILTER <li> \refitem cfg_input_filter INPUT_FILTER
...@@ -228,8 +230,9 @@ followed by the descriptions of the tags grouped by category. ...@@ -228,8 +230,9 @@ followed by the descriptions of the tags grouped by category.
documentation generated by doxygen is written. Doxygen will use this documentation generated by doxygen is written. Doxygen will use this
information to generate all constant output in the proper language. information to generate all constant output in the proper language.
The default language is English, other supported languages are: The default language is English, other supported languages are:
Dutch, French, Italian, Czech, Swedish, German, Finnish, Hungarian, Japanese, Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
Korean, Spanish, Russian, Croatian, Polish and Portuguese. German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
\anchor cfg_extract_all \anchor cfg_extract_all
<dt>\c EXTRACT_ALL <dd> <dt>\c EXTRACT_ALL <dd>
...@@ -255,6 +258,14 @@ followed by the descriptions of the tags grouped by category. ...@@ -255,6 +258,14 @@ followed by the descriptions of the tags grouped by category.
If the \c EXTRACT_STATIC tag is set to \c YES all static members of a file If the \c EXTRACT_STATIC tag is set to \c YES all static members of a file
will be included in the documentation. will be included in the documentation.
\anchor cfg_extract_local_classes
<dt>\c EXTRACT_LOCAL_CLASSES <dd>
\addindex EXTRACT_LOCAL_CLASSES
If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES classes (and structs)
defined locally in source files will be included in the documentation.
If set to NO only classes defined in header files are included. Does not
have any effect for Java sources.
\anchor cfg_hide_undoc_members \anchor cfg_hide_undoc_members
<dt>\c HIDE_UNDOC_MEMBERS <dd> <dt>\c HIDE_UNDOC_MEMBERS <dd>
\addindex HIDE_UNDOC_MEMBERS \addindex HIDE_UNDOC_MEMBERS
...@@ -299,6 +310,14 @@ followed by the descriptions of the tags grouped by category. ...@@ -299,6 +310,14 @@ followed by the descriptions of the tags grouped by category.
doxygen will generate a detailed section even if there is only a brief doxygen will generate a detailed section even if there is only a brief
description. description.
\anchor cfg_inline_inherited_memb
<dt>\c INLINE_INHERITED_MEMB <dd>
\addindex INLINE_INHERITED_MEMB
If the \c INLINE_INHERITED_MEMB tag is set to \c YES, doxygen will show all inherited
members of a class in the documentation of that class as if those members were
ordinary class members. Constructors, destructors and assignment operators of
the base classes will not be shown.
\anchor cfg_full_path_names \anchor cfg_full_path_names
<dt>\c FULL_PATH_NAMES <dd> <dt>\c FULL_PATH_NAMES <dd>
\addindex FULL_PATH_NAMES \addindex FULL_PATH_NAMES
......
...@@ -210,6 +210,17 @@ generator -> gen ...@@ -210,6 +210,17 @@ generator -> gen
At the time I was looking into lex and yacc, where a lot of things start with At the time I was looking into lex and yacc, where a lot of things start with
"yy", so the "y" slipped in and made things pronouncable. "yy", so the "y" slipped in and made things pronouncable.
<li><b>What was the reason to develop doxygen?</b>
I once wrote a GUI widget based on the Qt library (it is still available at
http://qdbttabular.sourceforge.net/ and maintained by Sven Meyer).
Qt had nicely generated documentation (using an internal tool which
they didn't want to release) and I wrote similar docs by hand.
This was a nightmare to maintain, so I wanted a similar tool. I looked at
Doc++ but that just wasn't good enough (it didn't support signals and
slots and did have the Qt look and feel I have grown to like),
so I started to write my own tool...
</ol> </ol>
\htmlonly \htmlonly
......
...@@ -25,13 +25,13 @@ Doxygen has built-in support for multiple languages. This means ...@@ -25,13 +25,13 @@ Doxygen has built-in support for multiple languages. This means
that the text fragments that doxygen generates can be produced in that the text fragments that doxygen generates can be produced in
languages other than English (the default) at configuration time. languages other than English (the default) at configuration time.
Currently (version 1.2.12-20011125), 24 languages Currently (version 1.2.13), 25 languages
are supported (sorted alphabetically): are supported (sorted alphabetically):
Brazilian Portuguese, Chinese, Croatian, Czech, Danish, Brazilian Portuguese, Chinese, Croatian, Czech, Danish,
Dutch, English, Finnish, French, German, Dutch, English, Finnish, French, German,
Hungarian, Italian, Japanese, Korean, Norwegian, Greek, Hungarian, Italian, Japanese, Korean,
Polish, Portuguese, Romanian, Russian, Slovak, Norwegian, Polish, Portuguese, Romanian, Russian,
Slovene, Spanish, Swedish, and Ukrainian. Slovak, Slovene, Spanish, Swedish, and Ukrainian.
The table of information related to the supported languages follows. The table of information related to the supported languages follows.
It is sorted by language alphabetically. The <b>Status</b> column It is sorted by language alphabetically. The <b>Status</b> column
...@@ -96,7 +96,7 @@ when the translator was updated. ...@@ -96,7 +96,7 @@ when the translator was updated.
<TD>Finnish</TD> <TD>Finnish</TD>
<TD>Olli Korhonen</TD> <TD>Olli Korhonen</TD>
<TD>Olli.Korhonen@NOSPAM.ccc.fi</TD> <TD>Olli.Korhonen@NOSPAM.ccc.fi</TD>
<TD>1.0.0</TD> <TD>obsolete</TD>
</TR> </TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD>French</TD> <TD>French</TD>
...@@ -110,6 +110,12 @@ when the translator was updated. ...@@ -110,6 +110,12 @@ when the translator was updated.
<TD>jensseidel@NOSPAM.users.sf.net<br>Jens.Breitenstein@NOSPAM.tlc.de</TD> <TD>jensseidel@NOSPAM.users.sf.net<br>Jens.Breitenstein@NOSPAM.tlc.de</TD>
<TD>up-to-date</TD> <TD>up-to-date</TD>
</TR> </TR>
<TR BGCOLOR="#ffffff">
<TD>Greek</TD>
<TD>Harry Kalogirou</TD>
<TD>harkal@NOSPAM.rainbow.cs.unipi.gr</TD>
<TD>1.2.11</TD>
</TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD>Hungarian</TD> <TD>Hungarian</TD>
<TD>F&ouml;ldv&aacute;ri Gy&ouml;rgy</TD> <TD>F&ouml;ldv&aacute;ri Gy&ouml;rgy</TD>
...@@ -118,8 +124,8 @@ when the translator was updated. ...@@ -118,8 +124,8 @@ when the translator was updated.
</TR> </TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD>Italian</TD> <TD>Italian</TD>
<TD>Ahmed Aldo Faisal<br>Alessandro Falappa</TD> <TD>Alessandro Falappa<br>Ahmed Aldo Faisal</TD>
<TD>aaf23@NOSPAM.cam.ac.uk<br>a.falappa@NOSPAM.flashnet.it</TD> <TD>alessandro@NOSPAM.falappa.net<br>aaf23@NOSPAM.cam.ac.uk</TD>
<TD>up-to-date</TD> <TD>up-to-date</TD>
</TR> </TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
...@@ -186,7 +192,7 @@ when the translator was updated. ...@@ -186,7 +192,7 @@ when the translator was updated.
<TD>Swedish</TD> <TD>Swedish</TD>
<TD>XeT Erixon</TD> <TD>XeT Erixon</TD>
<TD>xet@NOSPAM.hem.passagen.se</TD> <TD>xet@NOSPAM.hem.passagen.se</TD>
<TD>1.0.0</TD> <TD>obsolete</TD>
</TR> </TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD>Ukrainian</TD> <TD>Ukrainian</TD>
...@@ -220,17 +226,19 @@ when the translator was updated. ...@@ -220,17 +226,19 @@ when the translator was updated.
\hline \hline
English & Dimitri van Heesch & {\tt dimitri@stack.nl} & up-to-date \\ English & Dimitri van Heesch & {\tt dimitri@stack.nl} & up-to-date \\
\hline \hline
Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} & 1.0.0 \\ Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} & obsolete \\
\hline \hline
French & Xavier Outhier & {\tt xouthier@yahoo.fr} & up-to-date \\ French & Xavier Outhier & {\tt xouthier@yahoo.fr} & up-to-date \\
\hline \hline
German & Jens Seidel & {\tt jensseidel@users.sf.net} & up-to-date \\ German & Jens Seidel & {\tt jensseidel@users.sf.net} & up-to-date \\
& Jens Breitenstein & {\tt Jens.Breitenstein@tlc.de} & \\ & Jens Breitenstein & {\tt Jens.Breitenstein@tlc.de} & \\
\hline \hline
Greek & Harry Kalogirou & {\tt harkal@rainbow.cs.unipi.gr} & 1.2.11 \\
\hline
Hungarian & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt foldvari@diatronltd.com} & 1.2.1 \\ Hungarian & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt foldvari@diatronltd.com} & 1.2.1 \\
\hline \hline
Italian & Ahmed Aldo Faisal & {\tt aaf23@cam.ac.uk} & up-to-date \\ Italian & Alessandro Falappa & {\tt alessandro@falappa.net} & up-to-date \\
& Alessandro Falappa & {\tt a.falappa@flashnet.it} & \\ & Ahmed Aldo Faisal & {\tt aaf23@cam.ac.uk} & \\
\hline \hline
Japanese & Kenji Nagamatsu & {\tt naga@joyful.club.ne.jp} & 1.2.5 \\ Japanese & Kenji Nagamatsu & {\tt naga@joyful.club.ne.jp} & 1.2.5 \\
\hline \hline
...@@ -252,7 +260,7 @@ when the translator was updated. ...@@ -252,7 +260,7 @@ when the translator was updated.
\hline \hline
Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} & 1.2.7 \\ Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} & 1.2.7 \\
\hline \hline
Swedish & XeT Erixon & {\tt xet@hem.passagen.se} & 1.0.0 \\ Swedish & XeT Erixon & {\tt xet@hem.passagen.se} & obsolete \\
\hline \hline
Ukrainian & Olexij Tkatchenko & {\tt olexij.tkatchenko@gmx.de} & 1.2.11 \\ Ukrainian & Olexij Tkatchenko & {\tt olexij.tkatchenko@gmx.de} & 1.2.11 \\
\hline \hline
...@@ -523,5 +531,22 @@ translator adapter base class. The reason is that the adapter ...@@ -523,5 +531,22 @@ translator adapter base class. The reason is that the adapter
classes implement also obsolete methods. Another reason is that classes implement also obsolete methods. Another reason is that
some of the methods could become obsolete from some newer adapter on. some of the methods could become obsolete from some newer adapter on.
<b>The really obsolete language translators</b> may lead to too much
complicated adapters. Because of that, doxygen developers may decide
to derive such translators from the \c TranslatorEnglish class, which
is by definition always up-to-date.
When doing so, all the missing methods will be replaced by the
English translation. This means that not-implemented methods will
always return the English result. Such translators are marked using
word \c obsolete. You should read it <b>really obsolete</b>. No
guess about the last update can be done.
Often, it is possible to construct better result from the obsolete
methods. Because of that, the translator adapter classes should be
used if possible. On the other hand, implementation of adapters for
really obsolete translators brings too much maintenance and
run-time overhead.
*/ */
...@@ -296,5 +296,22 @@ translator adapter base class. The reason is that the adapter ...@@ -296,5 +296,22 @@ translator adapter base class. The reason is that the adapter
classes implement also obsolete methods. Another reason is that classes implement also obsolete methods. Another reason is that
some of the methods could become obsolete from some newer adapter on. some of the methods could become obsolete from some newer adapter on.
<b>The really obsolete language translators</b> may lead to too much
complicated adapters. Because of that, doxygen developers may decide
to derive such translators from the \c TranslatorEnglish class, which
is by definition always up-to-date.
When doing so, all the missing methods will be replaced by the
English translation. This means that not-implemented methods will
always return the English result. Such translators are marked using
word \c obsolete. You should read it <b>really obsolete</b>. No
guess about the last update can be done.
Often, it is possible to construct better result from the obsolete
methods. Because of that, the translator adapter classes should be
used if possible. On the other hand, implementation of adapters for
really obsolete translators brings too much maintenance and
run-time overhead.
*/ */
...@@ -33,6 +33,9 @@ German ...@@ -33,6 +33,9 @@ German
Jens Seidel: jensseidel@users.sf.net Jens Seidel: jensseidel@users.sf.net
Jens Breitenstein: Jens.Breitenstein@tlc.de Jens Breitenstein: Jens.Breitenstein@tlc.de
Greek
Harry Kalogirou: harkal@rainbow.cs.unipi.gr
Hungarian Hungarian
F&ouml;ldv&aacute;ri Gy&ouml;rgy: foldvari@diatronltd.com F&ouml;ldv&aacute;ri Gy&ouml;rgy: foldvari@diatronltd.com
......
...@@ -87,6 +87,14 @@ ...@@ -87,6 +87,14 @@
# like "almost up-to-date" any more. The script was simplified # like "almost up-to-date" any more. The script was simplified
# to reflect the changes. # to reflect the changes.
# #
# 2001/11/26
# - Information about version of doxygen added to the top
# of the translator report (the ASCII file).
# - TranslatorEnglish can be used to solve really obsolete translators
# to make adapter classes simpler. Such translators are marked
# as "obsolete" in the status (i.e. no guessing when it was last updated).
# The translator report include the notice about that situation.
#
################################################################ ################################################################
use 5.005; use 5.005;
...@@ -527,7 +535,12 @@ xxxTABLE_FOOTxxx ...@@ -527,7 +535,12 @@ xxxTABLE_FOOTxxx
{$1.$2.$3}x; {$1.$2.$3}x;
} }
if ($i == 0) { $status = '?'; } if ($i == 0) {
$i = $status =~ s{^TranslatorEnglish$}
{obsolete}x;
}
if ($i == 0) { $status = 'strange'; }
##}}} ##}}}
...@@ -890,11 +903,15 @@ print STDERR "\n\n"; ...@@ -890,11 +903,15 @@ print STDERR "\n\n";
# Loop through the list of expected methods and collect # Loop through the list of expected methods and collect
# the missing (new) methods. Do this only when it derives # the missing (new) methods. Do this only when it derives
# from Translator or TranslatorAdapter classes (i.e. ignore # from Translator or TranslatorAdapter classes (i.e. ignore
# any unusual kind of TranslatorXxxx implementation). #{{{ # any unusual kind of TranslatorXxxx implementation).
# Accept also deriving from TranslatorEnglish, that can
# be done by doxygen developers to solve problems with
# some really outdated translators. #{{{
# #
my @missing_methods = (); my @missing_methods = ();
if ($base =~ m/^Translator(Adapter.*)?$/) { if ($base =~ m/^Translator(Adapter.*)?$/
|| $base =~ m/^TranslatorEnglish$/) {
foreach my $method (@expected) { foreach my $method (@expected) {
# Get the stripped version of the prototype. # Get the stripped version of the prototype.
...@@ -921,15 +938,34 @@ print STDERR "\n\n"; ...@@ -921,15 +938,34 @@ print STDERR "\n\n";
$output .= "\n\n\n"; $output .= "\n\n\n";
$output .= $class . " ($base)\n" . '-' x length($class) . "\n"; $output .= $class . " ($base)\n" . '-' x length($class) . "\n";
if ($base !~ m/^Translator(Adapter.*)?$/) { if ($base =~ m/^TranslatorEnglish$/) {
$output .= "\nThis is the unusual implementation of the " $output .= "\nThis translator is implemented via deriving "
. "translator. Its class is derived\n" . "from the English translator.\n"
. "This should be done only in the case when "
. "the language maintainer\n"
. "or the doxygen "
. "developers need to update some really old-dated "
. "translator.\n"
. "Otherwise, deriving from "
. "the translator adapter classes should be used\n"
. "for obsolete translators. "
. "If you still want some texts to be in English\n"
. "copy the sources of the English translator.\n\n"
. "The obsolete and missing method lists (below) "
. "reflect what have to be done\n"
. "to derive "
. "directly from the Translator class "
. "(i.e. to reach up-to-date status).\n";
}
elsif ($base !~ m/^Translator(Adapter.*)?$/) {
$output .= "\nThis is some unusual implementation of the "
. "translator class. It is derived\n"
. "from the $base base class. The usual translator" . "from the $base base class. The usual translator"
. "class derives\n" . "class derives\n"
. "or from the Translator class or from some " . "or from the Translator class or from some "
. "TranslatorAdapter_x_x_x classes.\n" . "TranslatorAdapter_x_x_x classes.\n"
. "Because of that, nothing can be guessed about " . "Because of that, nothing can be guessed about "
. "missing methods.\n"; . "missing or obsolete methods.\n";
} }
if (@missing_methods) { if (@missing_methods) {
...@@ -951,24 +987,34 @@ print STDERR "\n\n"; ...@@ -951,24 +987,34 @@ print STDERR "\n\n";
} }
# Generate the textual output file. # Generate the ASCII output file.
# #
my $fout = "$docdir/$ftranslatortxt"; my $fout = "$docdir/$ftranslatortxt";
# Open it first. # Open it first, and output the version information. #{{{
# #
open(FOUT, "> $fout") or die "\nError when open > $fout: $!"; open(FOUT, "> $fout") or die "\nError when open > $fout: $!";
print FOUT "(version $doxversion)\n\n";
##}}}
# List the supported languages. #{{{ # List the supported languages. #{{{
# #
my @all_translators = keys %cb; my @all_translators = keys %cb;
print FOUT "Doxygen supports the following (" . @all_translators print FOUT "Doxygen supports the following (" . @all_translators
. ") languages (sorted alphabetically):\n\n"; . ") languages (sorted alphabetically):\n\n";
foreach (sort grep { s/^Translator(\w+)\b.*$/$1/ } @all_translators) { my @languages = sort
print FOUT " $_\n"; grep { s/^Translator(\w+)\b.*$/$1/ }
} @all_translators;
my $languages = join(", ", @languages);
$languages =~ s{((\w+,\s){5})}{$1\n}g;
$languages =~ s{Brazilian}{Brazilian Portuguese};
$languages =~ s{(,\s+)(\w+)$}{$1and $2.}s;
print FOUT "$languages\n";
##}}} ##}}}
# If there are up-to-date translators, list them. #{{{ # If there are up-to-date translators, list them. #{{{
...@@ -1019,11 +1065,35 @@ print STDERR "\n\n"; ...@@ -1019,11 +1065,35 @@ print STDERR "\n\n";
} }
##}}} ##}}}
# If there are translators derived from TranslatorEnglish, list them
# and name them as obsolete. #{{{
#
@list = sort grep { $cb{$_} =~ m/^TranslatorEnglish$/ } keys %cb;
if (@list) {
print FOUT "\n" .'-' x 70 . "\n";
print FOUT "The following translator classes are implemented "
. "via deriving\n"
. "from the English translator. This should be done only "
. "in the case\n"
. "when the language maintainer or the doxygen "
. "developers need to update\n"
. "some really outdated translator. Otherwise, deriving "
. "from\n"
. "the translator adapter classes should be prefered "
. "for obsolete translators.\n"
. "See details below in the report.\n\n";
foreach (@list) { print FOUT " $_\t($cb{$_})\n"; }
}
##}}}
# If there are other translators, list them. #{{{ # If there are other translators, list them. #{{{
# #
@list = sort @list = sort
grep { $cb{$_} !~ m/^Translator$/ } grep { $cb{$_} !~ m/^Translator$/ }
grep { $cb{$_} !~ m/^TranslatorAdapter_/ } grep { $cb{$_} !~ m/^TranslatorAdapter_/ }
grep { $cb{$_} !~ m/^TranslatorEnglish$/ }
keys %cb; keys %cb;
if (@list) { if (@list) {
...@@ -1031,12 +1101,16 @@ print STDERR "\n\n"; ...@@ -1031,12 +1101,16 @@ print STDERR "\n\n";
print FOUT "The following translator classes are somehow different\n" print FOUT "The following translator classes are somehow different\n"
. "(sorted alphabetically). This means that they " . "(sorted alphabetically). This means that they "
. "do not derive from\n" . "do not derive from\n"
. "the Translator class, nor from some of the adapter classes.\n\n"; . "the Translator class, nor from some of the adapter "
. "classes,\n"
. "nor from the TranslatorEnglish. Nothing can be guessed "
. "about the methods.\n\n";
foreach (@list) { print FOUT " $_\t($cb{$_})\n"; } foreach (@list) { print FOUT " $_\t($cb{$_})\n"; }
} }
##}}} ##}}}
# List the methods that are expected to be implemented. #{{{ # List the methods that are expected to be implemented. #{{{
# #
print FOUT "\n\n" .'-' x 70 . "\n"; print FOUT "\n\n" .'-' x 70 . "\n";
...@@ -1059,7 +1133,7 @@ print STDERR "\n\n"; ...@@ -1059,7 +1133,7 @@ print STDERR "\n\n";
} }
##}}} ##}}}
# Close the output file # Close the ASCII output file
# #
close FOUT; close FOUT;
......
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>
<tagfile> <tagfile>
<compound kind="class"> <compound kind="class">
<name>Test</name> <name>Test</name>
......
Name: doxygen Name: doxygen
Version: 1.2.12_20011209 Version: 1.2.13
Summary: documentation system for C, C++ and IDL Summary: documentation system for C, C++ and IDL
Release: 4 Release: 4
Source: doxygen-%{version}.src.tar.gz Source: doxygen-%{version}.src.tar.gz
......
...@@ -87,23 +87,24 @@ ClassDef::ClassDef( ...@@ -87,23 +87,24 @@ ClassDef::ClassDef(
memberGroupSDict = new MemberGroupSDict; memberGroupSDict = new MemberGroupSDict;
memberGroupSDict->setAutoDelete(TRUE); memberGroupSDict->setAutoDelete(TRUE);
m_innerClasses = new ClassSDict(17); m_innerClasses = new ClassSDict(17);
//int i=name().findRev("::"); // TODO: broken if A<N::C> is the class name
//if (i==-1)
//{
// m_scopelessName=name();
//}
//else
//{
// m_scopelessName=name().right(name().length()-i-2);
//}
m_subGrouping=TRUE; m_subGrouping=TRUE;
//m_isTemplBaseClass=-1;
m_templateInstances = 0; m_templateInstances = 0;
m_templateMaster =0; m_templateMaster =0;
m_templBaseClassNames = 0; m_templBaseClassNames = 0;
m_artificial = FALSE; m_artificial = FALSE;
m_isAbstract = FALSE; m_isAbstract = FALSE;
m_isStatic = FALSE; m_isStatic = FALSE;
m_membersMerged = FALSE;
if (((QCString)defFileName).right(5)!=".java" &&
guessSection(defFileName)==Entry::SOURCE_SEC)
{
m_isLocal=TRUE;
}
else
{
m_isLocal=FALSE;
}
} }
// destroy the class definition // destroy the class definition
...@@ -181,7 +182,10 @@ void ClassDef::addMembersToMemberGroup() ...@@ -181,7 +182,10 @@ void ClassDef::addMembersToMemberGroup()
} }
// adds new member definition to the class // adds new member definition to the class
void ClassDef::insertMember(MemberDef *md) void ClassDef::internalInsertMember(MemberDef *md,
Protection prot,
bool addToAllList
)
{ {
//printf("adding %s::%s\n",name().data(),md->name().data()); //printf("adding %s::%s\n",name().data(),md->name().data());
if (!isReference()) if (!isReference())
...@@ -190,7 +194,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -190,7 +194,7 @@ void ClassDef::insertMember(MemberDef *md)
/* insert member in the declaration section */ /* insert member in the declaration section */
/********************************************/ /********************************************/
if (md->isRelated() && if (md->isRelated() &&
(Config_getBool("EXTRACT_PRIVATE") || md->protection()!=Private)) (Config_getBool("EXTRACT_PRIVATE") || prot!=Private))
{ {
related.append(md); related.append(md);
md->setSectionList(&related); md->setSectionList(&related);
...@@ -217,7 +221,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -217,7 +221,7 @@ void ClassDef::insertMember(MemberDef *md)
md->setSectionList(&properties); md->setSectionList(&properties);
break; break;
case MemberDef::Slot: // Qt specific case MemberDef::Slot: // Qt specific
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
proSlots.append(md); proSlots.append(md);
...@@ -238,7 +242,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -238,7 +242,7 @@ void ClassDef::insertMember(MemberDef *md)
{ {
if (md->isVariable()) if (md->isVariable())
{ {
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
proStaticAttribs.append(md); proStaticAttribs.append(md);
...@@ -256,7 +260,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -256,7 +260,7 @@ void ClassDef::insertMember(MemberDef *md)
} }
else // function else // function
{ {
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
proStaticMembers.append(md); proStaticMembers.append(md);
...@@ -277,7 +281,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -277,7 +281,7 @@ void ClassDef::insertMember(MemberDef *md)
{ {
if (md->isVariable()) if (md->isVariable())
{ {
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
proAttribs.append(md); proAttribs.append(md);
...@@ -295,7 +299,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -295,7 +299,7 @@ void ClassDef::insertMember(MemberDef *md)
} }
else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue()) else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue())
{ {
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
proTypes.append(md); proTypes.append(md);
...@@ -313,7 +317,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -313,7 +317,7 @@ void ClassDef::insertMember(MemberDef *md)
} }
else // member function else // member function
{ {
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
proMembers.append(md); proMembers.append(md);
...@@ -338,7 +342,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -338,7 +342,7 @@ void ClassDef::insertMember(MemberDef *md)
/* insert member in the detailed documentation section */ /* insert member in the detailed documentation section */
/*******************************************************/ /*******************************************************/
if ((md->isRelated() && if ((md->isRelated() &&
(Config_getBool("EXTRACT_PRIVATE") || md->protection()!=Private) (Config_getBool("EXTRACT_PRIVATE") || prot!=Private)
) || md->isFriend() ) || md->isFriend()
) )
{ {
...@@ -365,7 +369,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -365,7 +369,7 @@ void ClassDef::insertMember(MemberDef *md)
functionMembers.append(md); functionMembers.append(md);
break; break;
case MemberDef::Slot: case MemberDef::Slot:
switch (md->protection()) switch (prot)
{ {
case Protected: case Protected:
if (Config_getBool("SORT_MEMBER_DOCS")) if (Config_getBool("SORT_MEMBER_DOCS"))
...@@ -391,7 +395,7 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -391,7 +395,7 @@ void ClassDef::insertMember(MemberDef *md)
} }
break; break;
default: // any of the other members default: // any of the other members
if (md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE")) if (prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
{ {
switch (md->memberType()) switch (md->memberType())
{ {
...@@ -458,21 +462,28 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -458,21 +462,28 @@ void ClassDef::insertMember(MemberDef *md)
m_isAbstract=TRUE; m_isAbstract=TRUE;
} }
MemberInfo *mi = new MemberInfo((MemberDef *)md, if (addToAllList)
md->protection(),md->virtualness(),FALSE);
MemberNameInfo *mni=0;
if ((mni=m_allMemberNameInfoSDict->find(md->name())))
{
mni->append(mi);
}
else
{ {
mni = new MemberNameInfo(md->name()); MemberInfo *mi = new MemberInfo((MemberDef *)md,
mni->append(mi); prot,md->virtualness(),FALSE);
m_allMemberNameInfoSDict->inSort(mni->memberName(),mni); MemberNameInfo *mni=0;
if ((mni=m_allMemberNameInfoSDict->find(md->name())))
{
mni->append(mi);
}
else
{
mni = new MemberNameInfo(md->name());
mni->append(mi);
m_allMemberNameInfoSDict->append(mni->memberName(),mni);
}
} }
} }
void ClassDef::insertMember(MemberDef *md)
{
internalInsertMember(md,md->protection(),TRUE);
}
//void ClassDef::computeMemberGroups() //void ClassDef::computeMemberGroups()
//{ //{
...@@ -498,29 +509,30 @@ void ClassDef::insertMember(MemberDef *md) ...@@ -498,29 +509,30 @@ void ClassDef::insertMember(MemberDef *md)
// compute the anchors for all members // compute the anchors for all members
void ClassDef::computeAnchors() void ClassDef::computeAnchors()
{ {
setAnchors('a',&pubMembers); ClassDef *context = Config_getBool("INLINE_INHERITED_MEMB") ? this : 0;
setAnchors('b',&proMembers); setAnchors(context,'a',&pubMembers);
setAnchors('c',&priMembers); setAnchors(context,'b',&proMembers);
setAnchors('d',&pubStaticMembers); setAnchors(context,'c',&priMembers);
setAnchors('e',&proStaticMembers); setAnchors(context,'d',&pubStaticMembers);
setAnchors('f',&priStaticMembers); setAnchors(context,'e',&proStaticMembers);
setAnchors('g',&pubSlots); setAnchors(context,'f',&priStaticMembers);
setAnchors('h',&proSlots); setAnchors(context,'g',&pubSlots);
setAnchors('i',&priSlots); setAnchors(context,'h',&proSlots);
setAnchors('j',&signals); setAnchors(context,'i',&priSlots);
setAnchors('k',&related); setAnchors(context,'j',&signals);
setAnchors('l',&friends); setAnchors(context,'k',&related);
setAnchors('m',&pubAttribs); setAnchors(context,'l',&friends);
setAnchors('n',&proAttribs); setAnchors(context,'m',&pubAttribs);
setAnchors('o',&priAttribs); setAnchors(context,'n',&proAttribs);
setAnchors('p',&pubStaticAttribs); setAnchors(context,'o',&priAttribs);
setAnchors('q',&proStaticAttribs); setAnchors(context,'p',&pubStaticAttribs);
setAnchors('r',&priStaticAttribs); setAnchors(context,'q',&proStaticAttribs);
setAnchors('s',&pubTypes); setAnchors(context,'r',&priStaticAttribs);
setAnchors('t',&proTypes); setAnchors(context,'s',&pubTypes);
setAnchors('u',&priTypes); setAnchors(context,'t',&proTypes);
setAnchors('v',&dcopMethods); setAnchors(context,'u',&priTypes);
setAnchors('w',&properties); setAnchors(context,'v',&dcopMethods);
setAnchors(context,'w',&properties);
} }
void ClassDef::distributeMemberGroupDocumentation() void ClassDef::distributeMemberGroupDocumentation()
...@@ -967,7 +979,9 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -967,7 +979,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write link to list of all members (HTML only) // write link to list of all members (HTML only)
if (m_allMemberNameInfoSDict->count()>0 && if (m_allMemberNameInfoSDict->count()>0 &&
!Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) !Config_getBool("OPTIMIZE_OUTPUT_FOR_C")
/* && !Config_getBool("INLINE_INHERITED_MEMB") */
)
{ {
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(m_memListFileName,0); ol.startTextLink(m_memListFileName,0);
...@@ -1213,7 +1227,9 @@ void ClassDef::writeDocumentationForInnerClasses(OutputList &ol) ...@@ -1213,7 +1227,9 @@ void ClassDef::writeDocumentationForInnerClasses(OutputList &ol)
ClassDef *innerCd; ClassDef *innerCd;
for (cli.toFirst();(innerCd=cli.current());++cli) for (cli.toFirst();(innerCd=cli.current());++cli)
{ {
if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0) if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
(innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE"))
)
{ {
msg("Generating docs for nested compound %s...\n",innerCd->name().data()); msg("Generating docs for nested compound %s...\n",innerCd->name().data());
innerCd->writeDocumentation(ol); innerCd->writeDocumentation(ol);
...@@ -1568,6 +1584,7 @@ bool ClassDef::isLinkableInProject() const ...@@ -1568,6 +1584,7 @@ bool ClassDef::isLinkableInProject() const
!m_artificial && !m_artificial &&
name().find('@')==-1 && /* anonymous compound */ name().find('@')==-1 && /* anonymous compound */
(m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && /* private */ (m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && /* private */
(!m_isLocal || Config_getBool("EXTRACT_LOCAL_CLASSES")) && /* local */
hasDocumentation() && /* documented */ hasDocumentation() && /* documented */
!isReference() && /* not an external reference */ !isReference() && /* not an external reference */
(!m_isStatic || Config_getBool("EXTRACT_STATIC")); (!m_isStatic || Config_getBool("EXTRACT_STATIC"));
...@@ -1637,6 +1654,17 @@ bool ClassDef::isBaseClass(ClassDef *bcd) ...@@ -1637,6 +1654,17 @@ bool ClassDef::isBaseClass(ClassDef *bcd)
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static bool isStandardFunc(MemberDef *md)
{
ClassDef *cd=md->getClassDef();
if (cd->templateMaster()) cd=cd->templateMaster();
return md->name()=="operator=" || // assignment operator
md->name()==cd->localName() || // constructor
(md->name().find('~')!=-1 &&
md->name().find("operator")==-1); // destructor
}
/*! /*!
* recusively merges the `all members' lists of a class base * recusively merges the `all members' lists of a class base
* with that of this class. Must only be called for classes without * with that of this class. Must only be called for classes without
...@@ -1645,19 +1673,22 @@ bool ClassDef::isBaseClass(ClassDef *bcd) ...@@ -1645,19 +1673,22 @@ bool ClassDef::isBaseClass(ClassDef *bcd)
void ClassDef::mergeMembers() void ClassDef::mergeMembers()
{ {
if (m_membersMerged) return;
m_membersMerged=TRUE;
//printf(" mergeMembers for %s\n",name().data());
bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB" );
BaseClassListIterator bcli(*baseClasses()); BaseClassListIterator bcli(*baseClasses());
BaseClassDef *bcd; BaseClassDef *bcd;
for ( ; (bcd=bcli.current()) ; ++bcli ) for ( ; (bcd=bcli.current()) ; ++bcli )
{ {
ClassDef *bClass=bcd->classDef; ClassDef *bClass=bcd->classDef;
// merge the members in the base class of this inheritance branch first // merge the members in the base class of this inheritance branch first
bClass->mergeMembers(); bClass->mergeMembers();
MemberNameInfoSDict *srcMnd = bClass->memberNameInfoSDict(); MemberNameInfoSDict *srcMnd = bClass->m_allMemberNameInfoSDict;
MemberNameInfoSDict *dstMnd = memberNameInfoSDict(); MemberNameInfoSDict *dstMnd = m_allMemberNameInfoSDict;
//MemberNameInfoList *dstMnl = memberNameInfoList();
MemberNameInfoSDict::Iterator srcMnili(*srcMnd); MemberNameInfoSDict::Iterator srcMnili(*srcMnd);
MemberNameInfo *srcMni; MemberNameInfo *srcMni;
for ( ; (srcMni=srcMnili.current()) ; ++srcMnili) for ( ; (srcMni=srcMnili.current()) ; ++srcMnili)
...@@ -1687,24 +1718,26 @@ void ClassDef::mergeMembers() ...@@ -1687,24 +1718,26 @@ void ClassDef::mergeMembers()
if (srcMd!=dstMd) // different members if (srcMd!=dstMd) // different members
{ {
ClassDef *dstCd = dstMd->getClassDef(); ClassDef *dstCd = dstMd->getClassDef();
//printf("Is %s a base class of %s?\n",srcCd->name(),dstCd->name()); //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data());
if (srcCd==dstCd || dstCd->isBaseClass(srcCd)) if (srcCd==dstCd || dstCd->isBaseClass(srcCd))
// member is in the same or a base class // member is in the same or a base class
{ {
found=matchArguments(srcMd->argumentList(), found=matchArguments(srcMd->argumentList(),
dstMd->argumentList() dstMd->argumentList());
); //printf(" Yes, matching (%s<->%s): %d\n",
//ambigue = ambigue || !found; // argListToString(srcMd->argumentList()).data(),
// argListToString(dstMd->argumentList()).data(),
// found);
hidden = hidden || !found; hidden = hidden || !found;
} }
else // member is in a non base class => multiple inheritance else // member is in a non base class => multiple inheritance
// using the same base class. // using the same base class.
{ {
//printf("$$ Existing member %s %s add scope %s\n", //printf("$$ Existing member %s %s add scope %s\n",
// dstMi->ambiguityResolutionScope.data(), // dstMi->ambiguityResolutionScope.data(),
// dstMd->name().data(), // dstMd->name().data(),
// dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data()); // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2); QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2);
if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
dstMi->ambiguityResolutionScope.prepend(scope); dstMi->ambiguityResolutionScope.prepend(scope);
...@@ -1722,7 +1755,7 @@ void ClassDef::mergeMembers() ...@@ -1722,7 +1755,7 @@ void ClassDef::mergeMembers()
found=TRUE; found=TRUE;
} }
else // member can be reached via multiple paths in the else // member can be reached via multiple paths in the
// inheritance tree // inheritance tree
{ {
//printf("$$ Existing member %s %s add scope %s\n", //printf("$$ Existing member %s %s add scope %s\n",
// dstMi->ambiguityResolutionScope.data(), // dstMi->ambiguityResolutionScope.data(),
...@@ -1731,7 +1764,9 @@ void ClassDef::mergeMembers() ...@@ -1731,7 +1764,9 @@ void ClassDef::mergeMembers()
QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2); QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2);
if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
{
dstMi->ambiguityResolutionScope.prepend(scope); dstMi->ambiguityResolutionScope.prepend(scope);
}
ambigue=TRUE; ambigue=TRUE;
} }
} }
...@@ -1748,6 +1783,14 @@ void ClassDef::mergeMembers() ...@@ -1748,6 +1783,14 @@ void ClassDef::mergeMembers()
// this case is shown anyway. // this case is shown anyway.
if (!found && srcMd->protection()!=Private) if (!found && srcMd->protection()!=Private)
{ {
if (inlineInheritedMembers)
{
if (!isStandardFunc(srcMd))
{
//printf(" insertMember `%s'\n",srcMd->name().data());
internalInsertMember(srcMd,bcd->prot,FALSE);
}
}
Specifier virt=srcMi->virt; Specifier virt=srcMi->virt;
if (srcMi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; if (srcMi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
MemberInfo *newMi = new MemberInfo(srcMd,bcd->prot,virt,TRUE); MemberInfo *newMi = new MemberInfo(srcMd,bcd->prot,virt,TRUE);
...@@ -1761,8 +1804,10 @@ void ClassDef::mergeMembers() ...@@ -1761,8 +1804,10 @@ void ClassDef::mergeMembers()
QCString scope=bClass->name()+"::"; QCString scope=bClass->name()+"::";
if (scope!=srcMi->ambiguityResolutionScope.left(scope.length())) if (scope!=srcMi->ambiguityResolutionScope.left(scope.length()))
{
newMi->ambiguityResolutionScope= newMi->ambiguityResolutionScope=
scope+srcMi->ambiguityResolutionScope.copy(); scope+srcMi->ambiguityResolutionScope.copy();
}
} }
if (hidden) if (hidden)
{ {
...@@ -1777,7 +1822,6 @@ void ClassDef::mergeMembers() ...@@ -1777,7 +1822,6 @@ void ClassDef::mergeMembers()
newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+"::"; newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+"::";
} }
} }
//printf("Adding!\n");
dstMni->append(newMi); dstMni->append(newMi);
} }
} }
...@@ -1786,8 +1830,9 @@ void ClassDef::mergeMembers() ...@@ -1786,8 +1830,9 @@ void ClassDef::mergeMembers()
{ {
// create a deep copy of the list (only the MemberInfo's will be // create a deep copy of the list (only the MemberInfo's will be
// copied, not the actual MemberDef's) // copied, not the actual MemberDef's)
MemberNameInfo *newMni = new MemberNameInfo(srcMni->memberName()); MemberNameInfo *newMni = 0;
newMni = new MemberNameInfo(srcMni->memberName());
// copy the member(s) from the base to the sub class // copy the member(s) from the base to the sub class
MemberNameInfoIterator mnii(*srcMni); MemberNameInfoIterator mnii(*srcMni);
MemberInfo *mi; MemberInfo *mi;
...@@ -1805,12 +1850,20 @@ void ClassDef::mergeMembers() ...@@ -1805,12 +1850,20 @@ void ClassDef::mergeMembers()
//printf("%s::%s: prot=%d bcd->prot=%d result=%d\n", //printf("%s::%s: prot=%d bcd->prot=%d result=%d\n",
// name().data(),mi->memberDef->name().data(),mi->prot, // name().data(),mi->memberDef->name().data(),mi->prot,
// bcd->prot,prot); // bcd->prot,prot);
if (mi->prot!=Private) if (mi->prot!=Private)
{ {
Specifier virt=mi->virt; Specifier virt=mi->virt;
if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
if (inlineInheritedMembers)
{
if (!isStandardFunc(mi->memberDef))
{
//printf(" insertMember `%s'\n",mi->memberDef->name().data());
internalInsertMember(mi->memberDef,prot,FALSE);
}
}
//printf("Adding!\n"); //printf("Adding!\n");
MemberInfo *newMi=new MemberInfo(mi->memberDef,prot,virt,TRUE); MemberInfo *newMi=new MemberInfo(mi->memberDef,prot,virt,TRUE);
newMi->scopePath=bClass->name()+"::"+mi->scopePath; newMi->scopePath=bClass->name()+"::"+mi->scopePath;
...@@ -1819,13 +1872,13 @@ void ClassDef::mergeMembers() ...@@ -1819,13 +1872,13 @@ void ClassDef::mergeMembers()
newMni->append(newMi); newMni->append(newMi);
} }
} }
// add it to the dictionary // add it to the dictionary
//dstMnl->append(newMni);
dstMnd->append(newMni->memberName(),newMni); dstMnd->append(newMni->memberName(),newMni);
} }
} }
} }
//printf(" end mergeMembers\n");
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
......
...@@ -311,6 +311,8 @@ class ClassDef : public Definition ...@@ -311,6 +311,8 @@ class ClassDef : public Definition
/*! \} Interal API */ /*! \} Interal API */
private: private:
void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
/*! file name that forms the base for the output file containing the /*! file name that forms the base for the output file containing the
* class documentation. For compatibility with Qt (e.g. links via tag * class documentation. For compatibility with Qt (e.g. links via tag
* files) this name cannot be derived from the class name directly. * files) this name cannot be derived from the class name directly.
...@@ -408,6 +410,12 @@ class ClassDef : public Definition ...@@ -408,6 +410,12 @@ class ClassDef : public Definition
/*! Is the class part of an unnamed namespace? */ /*! Is the class part of an unnamed namespace? */
bool m_isStatic; bool m_isStatic;
/*! TRUE if classes members are merged with those of the base classes. */
bool m_membersMerged;
/*! TRUE if the class is defined in a source file rather than a header file. */
bool m_isLocal;
}; };
/*! \brief Class that contains information about a usage relation. /*! \brief Class that contains information about a usage relation.
......
...@@ -1107,14 +1107,12 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1107,14 +1107,12 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext); g_code->codify(yytext);
} }
<ClassName>{ID} { <ClassName>{ID} {
//g_ccd.name=yytext;
g_curClassName=yytext; g_curClassName=yytext;
addType(); addType();
generateClassOrGlobalLink(*g_code,yytext); generateClassOrGlobalLink(*g_code,yytext);
BEGIN( ClassVar ); BEGIN( ClassVar );
} }
<ClassVar>"=" { <ClassVar>"=" {
g_code->codify(yytext);
unput(*yytext); unput(*yytext);
BEGIN( Body ); BEGIN( Body );
} }
...@@ -1124,7 +1122,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1124,7 +1122,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_theVarContext.addVariable(g_type,g_name); g_theVarContext.addVariable(g_type,g_name);
generateClassOrGlobalLink(*g_code,yytext); generateClassOrGlobalLink(*g_code,yytext);
} }
<ClassName,ClassVar>[ \t\n]*":"[ \t\n]* { <ClassName,ClassVar>[ \t\n]*":"[ \t\n]* {
codifyLines(yytext); codifyLines(yytext);
g_curClassBases.clear(); g_curClassBases.clear();
BEGIN( Bases ); BEGIN( Bases );
......
...@@ -711,7 +711,7 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -711,7 +711,7 @@ static void substEnvVarsInStrList(QStrList &sl)
// search for a "word" // search for a "word"
for (i=0;i<l;i++) for (i=0;i<l;i++)
{ {
char c; char c=0;
// skip until start of new word // skip until start of new word
while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++; while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
p=i; // p marks the start index of the word p=i; // p marks the start index of the word
...@@ -868,6 +868,15 @@ void Config::check() ...@@ -868,6 +868,15 @@ void Config::check()
char *sfp = stripFromPath.first(); char *sfp = stripFromPath.first();
while (sfp) while (sfp)
{ {
register char *p = sfp;
if (p)
{
char c;
while ((c=*p++))
{
if (c=='\\') c='/';
}
}
QCString path = sfp; QCString path = sfp;
if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':'))
{ {
...@@ -1213,34 +1222,83 @@ void Config::create() ...@@ -1213,34 +1222,83 @@ void Config::create()
"information to generate all constant output in the proper language. \n" "information to generate all constant output in the proper language. \n"
"The default language is English, other supported languages are: \n" "The default language is English, other supported languages are: \n"
"Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, \n" "Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, \n"
"German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, \n" "German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, \n"
"Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.\n", "Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.\n",
"English" "English"
); );
#ifdef LANG_BR
ce->addValue("Brazilian"); ce->addValue("Brazilian");
#endif
#ifdef LANG_CN
ce->addValue("Chinese"); ce->addValue("Chinese");
#endif
#ifdef LANG_HR
ce->addValue("Croatian"); ce->addValue("Croatian");
#endif
#ifdef LANG_CZ
ce->addValue("Czech"); ce->addValue("Czech");
#endif
#ifdef LANG_DK
ce->addValue("Danish"); ce->addValue("Danish");
#endif
#ifdef LANG_NL
ce->addValue("Dutch"); ce->addValue("Dutch");
#endif
ce->addValue("English"); ce->addValue("English");
#ifdef LANG_FI
ce->addValue("Finnish"); ce->addValue("Finnish");
#endif
#ifdef LANG_FR
ce->addValue("French"); ce->addValue("French");
#endif
#ifdef LANG_DE
ce->addValue("German"); ce->addValue("German");
#endif
#ifdef LANG_GR
ce->addValue("Greek");
#endif
#ifdef LANG_HU
ce->addValue("Hungarian"); ce->addValue("Hungarian");
#endif
#ifdef LANG_IT
ce->addValue("Italian"); ce->addValue("Italian");
#endif
#ifdef LANG_JP
ce->addValue("Japanese"); ce->addValue("Japanese");
#endif
#ifdef LANG_KR
ce->addValue("Korean"); ce->addValue("Korean");
#endif
#ifdef LANG_NO
ce->addValue("Norwegian"); ce->addValue("Norwegian");
#endif
#ifdef LANG_PL
ce->addValue("Polish"); ce->addValue("Polish");
#endif
#ifdef LANG_PT
ce->addValue("Portuguese"); ce->addValue("Portuguese");
#endif
#ifdef LANG_RO
ce->addValue("Romanian"); ce->addValue("Romanian");
#endif
#ifdef LANG_RU
ce->addValue("Russian"); ce->addValue("Russian");
#endif
#ifdef LANG_SK
ce->addValue("Slovak"); ce->addValue("Slovak");
#endif
#ifdef LANG_SI
ce->addValue("Slovene"); ce->addValue("Slovene");
#endif
#ifdef LANG_ES
ce->addValue("Spanish"); ce->addValue("Spanish");
#endif
#ifdef LANG_SE
ce->addValue("Swedish"); ce->addValue("Swedish");
#endif
#ifdef LANG_UA
ce->addValue("Ukrainian"); ce->addValue("Ukrainian");
#endif
cb = addBool( cb = addBool(
"EXTRACT_ALL", "EXTRACT_ALL",
"If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n" "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n"
...@@ -1261,6 +1319,13 @@ void Config::create() ...@@ -1261,6 +1319,13 @@ void Config::create()
"will be included in the documentation. \n", "will be included in the documentation. \n",
FALSE FALSE
); );
cb = addBool(
"EXTRACT_LOCAL_CLASSES",
"If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n"
"defined locally in source files will be included in the documentation. \n"
"If set to NO only classes defined in header files are included. \n",
TRUE
);
cb = addBool( cb = addBool(
"HIDE_UNDOC_MEMBERS", "HIDE_UNDOC_MEMBERS",
"If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n" "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
...@@ -1301,6 +1366,14 @@ void Config::create() ...@@ -1301,6 +1366,14 @@ void Config::create()
"description. \n", "description. \n",
FALSE FALSE
); );
cb = addBool(
"INLINE_INHERITED_MEMB",
"If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited \n"
"members of a class in the documentation of that class as if those members were \n"
"ordinary class members. Constructors, destructors and assignment operators of \n"
"the base classes will not be shown. \n",
FALSE
);
cb = addBool( cb = addBool(
"FULL_PATH_NAMES", "FULL_PATH_NAMES",
"If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n" "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n"
......
...@@ -196,8 +196,8 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -196,8 +196,8 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
g_argRoundCount++; g_argRoundCount++;
*g_copyArgValue += *yytext; *g_copyArgValue += *yytext;
} }
<CopyArgRound,CopyArgRound2>")" { <CopyArgRound,CopyArgRound2>")"({B}*{ID})* {
*g_copyArgValue += *yytext; *g_copyArgValue += yytext;
if (g_argRoundCount>0) if (g_argRoundCount>0)
{ {
g_argRoundCount--; g_argRoundCount--;
...@@ -251,6 +251,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -251,6 +251,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
<ReadFuncArgType,ReadFuncArgDef>[,)>] { <ReadFuncArgType,ReadFuncArgDef>[,)>] {
g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName); g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
g_curArgDefValue=g_curArgDefValue.stripWhiteSpace(); g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
//printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
int l=g_curArgTypeName.length(); int l=g_curArgTypeName.length();
if (l>0) if (l>0)
{ {
......
...@@ -1002,21 +1002,25 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) ...@@ -1002,21 +1002,25 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
outDoc->docify(getenv(envvar)); outDoc->docify(getenv(envvar));
} }
<DocScan>{CMD}"htmlonly"/[^a-z_A-Z0-9] { <DocScan>{CMD}"htmlonly"/[^a-z_A-Z0-9] {
outDoc->startHtmlOnly();
outDoc->pushGeneratorState(); outDoc->pushGeneratorState();
outDoc->disableAllBut(OutputGenerator::Html); outDoc->disableAllBut(OutputGenerator::Html);
BEGIN(DocHtmlScan); BEGIN(DocHtmlScan);
} }
<DocHtmlScan>{CMD}"endhtmlonly"/[^a-z_A-Z0-9] { <DocHtmlScan>{CMD}"endhtmlonly"/[^a-z_A-Z0-9] {
outDoc->popGeneratorState(); outDoc->popGeneratorState();
outDoc->endHtmlOnly();
BEGIN(DocScan); BEGIN(DocScan);
} }
<DocScan>{CMD}"latexonly"/[^a-z_A-Z0-9] { <DocScan>{CMD}"latexonly"/[^a-z_A-Z0-9] {
outDoc->startLatexOnly();
outDoc->pushGeneratorState(); outDoc->pushGeneratorState();
outDoc->disableAllBut(OutputGenerator::Latex); outDoc->disableAllBut(OutputGenerator::Latex);
BEGIN(DocLatexScan); BEGIN(DocLatexScan);
} }
<DocLatexScan>{CMD}"endlatexonly"/[^a-z_A-Z0-9] { <DocLatexScan>{CMD}"endlatexonly"/[^a-z_A-Z0-9] {
outDoc->popGeneratorState(); outDoc->popGeneratorState();
outDoc->endLatexOnly();
BEGIN(DocScan); BEGIN(DocScan);
} }
<DocHtmlScan,DocLatexScan>"//"|"/*"|"*/" { <DocHtmlScan,DocLatexScan>"//"|"/*"|"*/" {
......
...@@ -555,215 +555,214 @@ static void buildClassList(Entry *root) ...@@ -555,215 +555,214 @@ static void buildClassList(Entry *root)
{ {
// this should not be called // this should not be called
warn(root->fileName,root->startLine, warn(root->fileName,root->startLine,
"Warning: invalid class name found!" "Warning: invalid class name found!"
); );
goto error;
} }
else Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data());
{
Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data());
fullName=stripAnonymousNamespaceScope(fullName); fullName=stripAnonymousNamespaceScope(fullName);
fullName=stripTemplateSpecifiersFromScope(fullName); fullName=stripTemplateSpecifiersFromScope(fullName);
Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data());
bool ambig; Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data());
ClassDef *cd;
//printf("findFileDef(%s)\n",root->fileName.data());
FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
if ((cd=getClass(fullName))) bool ambig;
{ ClassDef *cd;
Debug::print(Debug::Classes,0," Existing class!\n",fullName.data()); //printf("findFileDef(%s)\n",root->fileName.data());
//if (cd->templateArguments()==0) FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
//{
// //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); if ((cd=getClass(fullName)))
// cd->setTemplateArguments(tArgList); {
//} Debug::print(Debug::Classes,0," Existing class!\n",fullName.data());
if (!root->doc.isEmpty() || !root->brief.isEmpty() || //if (cd->templateArguments()==0)
(root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER")) //{
) // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data());
// block contains something that ends up in the docs // cd->setTemplateArguments(tArgList);
{ //}
if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) if (!root->doc.isEmpty() || !root->brief.isEmpty() ||
{ (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER"))
warn( )
root->fileName,root->startLine, // block contains something that ends up in the docs
"Warning: class %s already has a detailed description. " {
"Skipping the one found here.", if (!root->doc.isEmpty() && !cd->documentation().isEmpty())
fullName.data()
);
}
else if (!root->doc.isEmpty())
{
cd->setDocumentation(root->doc);
}
if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty())
{
warn(
root->fileName,root->startLine,
"Warning: class %s already has a brief description\n"
" skipping the one found here.",
fullName.data()
);
}
else if (!root->brief.isEmpty())
{
cd->setBriefDescription(root->brief);
}
if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1)
{
cd->setBodySegment(root->bodyLine,root->endBodyLine);
cd->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig));
}
cd->addSectionsToDefinition(root->anchors);
cd->setName(fullName); // change name to match docs
}
cd->setFileDef(fd);
if (cd->hasDocumentation())
{ {
addIncludeFile(cd,fd,root); warn(
root->fileName,root->startLine,
"Warning: class %s already has a detailed description. "
"Skipping the one found here.",
fullName.data()
);
} }
addNamespace(root,cd); else if (!root->doc.isEmpty())
if (fd && (root->section & Entry::COMPOUND_MASK))
{ {
//printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", cd->setDocumentation(root->doc);
// cd->name().data(),
// fd->name().data(),
// root->fileName.data()
// );
fd->insertClass(cd);
} }
addClassToGroups(root,cd); if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty())
cd->setRefItems(root->todoId,root->testId,root->bugId);
if (!root->subGrouping) cd->setSubGrouping(FALSE);
if (cd->templateArguments()==0)
{ {
// this happens if a template class declared with @class is found warn(
// before the actual definition. root->fileName,root->startLine,
ArgumentList *tArgList = "Warning: class %s already has a brief description\n"
getTemplateArgumentsFromName(fullName,root->tArgLists); " skipping the one found here.",
cd->setTemplateArguments(tArgList); fullName.data()
);
} }
} else if (!root->brief.isEmpty())
else // new class
{
ClassDef::CompoundType sec=ClassDef::Class;
switch(root->section)
{ {
case Entry::UNION_SEC: cd->setBriefDescription(root->brief);
case Entry::UNIONDOC_SEC:
sec=ClassDef::Union; break;
case Entry::STRUCT_SEC:
case Entry::STRUCTDOC_SEC:
sec=ClassDef::Struct; break;
case Entry::INTERFACE_SEC:
case Entry::INTERFACEDOC_SEC:
sec=ClassDef::Interface; break;
case Entry::EXCEPTION_SEC:
case Entry::EXCEPTIONDOC_SEC:
sec=ClassDef::Exception; break;
} }
Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1)
fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
QCString className;
QCString namespaceName;
extractNamespaceName(fullName,className,namespaceName);
//printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data());
QCString tagName;
QCString refFileName;
if (root->tagInfo)
{ {
tagName = root->tagInfo->tagName; cd->setBodySegment(root->bodyLine,root->endBodyLine);
refFileName = root->tagInfo->fileName; cd->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig));
} }
ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec, cd->addSectionsToDefinition(root->anchors);
tagName,refFileName); cd->setName(fullName); // change name to match docs
cd->setDocumentation(root->doc); // copy docs to definition }
cd->setBriefDescription(root->brief); cd->setFileDef(fd);
//printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data()); if (cd->hasDocumentation())
{
addIncludeFile(cd,fd,root);
}
addNamespace(root,cd);
if (fd && (root->section & Entry::COMPOUND_MASK))
{
//printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n",
// cd->name().data(),
// fd->name().data(),
// root->fileName.data()
// );
fd->insertClass(cd);
}
addClassToGroups(root,cd);
cd->setRefItems(root->todoId,root->testId,root->bugId);
if (!root->subGrouping) cd->setSubGrouping(FALSE);
if (cd->templateArguments()==0)
{
// this happens if a template class declared with @class is found
// before the actual definition.
ArgumentList *tArgList = ArgumentList *tArgList =
getTemplateArgumentsFromName(fullName,root->tArgLists); getTemplateArgumentsFromName(fullName,root->tArgLists);
//printf("class %s template args=%s\n",fullName.data(),
// tArgList ? tempArgListToString(tArgList).data() : "<none>");
cd->setTemplateArguments(tArgList); cd->setTemplateArguments(tArgList);
cd->setProtection(root->protection); }
cd->addSectionsToDefinition(root->anchors); }
cd->setIsStatic(root->stat); else // new class
{
// file definition containing the class cd ClassDef::CompoundType sec=ClassDef::Class;
cd->setBodySegment(root->bodyLine,root->endBodyLine); switch(root->section)
cd->setBodyDef(fd); {
if (!root->subGrouping) cd->setSubGrouping(FALSE); case Entry::UNION_SEC:
case Entry::UNIONDOC_SEC:
sec=ClassDef::Union; break;
case Entry::STRUCT_SEC:
case Entry::STRUCTDOC_SEC:
sec=ClassDef::Struct; break;
case Entry::INTERFACE_SEC:
case Entry::INTERFACEDOC_SEC:
sec=ClassDef::Interface; break;
case Entry::EXCEPTION_SEC:
case Entry::EXCEPTIONDOC_SEC:
sec=ClassDef::Exception; break;
}
Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
QCString className;
QCString namespaceName;
extractNamespaceName(fullName,className,namespaceName);
addClassToGroups(root,cd); //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data());
cd->setRefItems(root->todoId,root->testId,root->bugId);
// see if the class is found inside a namespace QCString tagName;
bool found=addNamespace(root,cd); QCString refFileName;
if (root->tagInfo)
{
tagName = root->tagInfo->tagName;
refFileName = root->tagInfo->fileName;
}
ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec,
tagName,refFileName);
cd->setDocumentation(root->doc); // copy docs to definition
cd->setBriefDescription(root->brief);
//printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
cd->setFileDef(fd);
if (cd->hasDocumentation())
{
addIncludeFile(cd,fd,root);
}
// namespace is part of the class name
if (!found && !namespaceName.isEmpty())
{
NamespaceDef *nd = getResolvedNamespace(namespaceName);
if (nd)
{
cd->setNamespace(nd);
nd->insertClass(cd);
found=TRUE;
}
}
// if the class is not in a namespace then we insert
// it in the file definition
if (!found && fd && (root->section & Entry::COMPOUND_MASK))
{
//printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n",
// cd->name().data(),
// fd->name().data(),
// root->fileName.data()
// );
fd->insertClass(cd);
}
// the empty string test is needed for extract all case
cd->setBriefDescription(root->brief);
cd->insertUsedFile(root->fileName);
// add class to the list ArgumentList *tArgList =
//printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); getTemplateArgumentsFromName(fullName,root->tArgLists);
Doxygen::classSDict.append(fullName,cd); //printf("class %s template args=%s\n",fullName.data(),
// tArgList ? tempArgListToString(tArgList).data() : "<none>");
cd->setTemplateArguments(tArgList);
cd->setProtection(root->protection);
cd->addSectionsToDefinition(root->anchors);
cd->setIsStatic(root->stat);
// also add class to the correct structural context // file definition containing the class cd
Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); cd->setBodySegment(root->bodyLine,root->endBodyLine);
if (d==0) cd->setBodyDef(fd);
{ if (!root->subGrouping) cd->setSubGrouping(FALSE);
//warn(root->fileName,root->startLine,
// "Warning: Internal inconsistency: scope for class %s not " addClassToGroups(root,cd);
// "found!\n",fullName.data() cd->setRefItems(root->todoId,root->testId,root->bugId);
// );
} // see if the class is found inside a namespace
else bool found=addNamespace(root,cd);
cd->setFileDef(fd);
if (cd->hasDocumentation())
{
addIncludeFile(cd,fd,root);
}
// namespace is part of the class name
if (!found && !namespaceName.isEmpty())
{
NamespaceDef *nd = getResolvedNamespace(namespaceName);
if (nd)
{ {
//printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data()); cd->setNamespace(nd);
d->addInnerCompound(cd); nd->insertClass(cd);
cd->setOuterScope(d); found=TRUE;
} }
} }
// if the class is not in a namespace then we insert
// it in the file definition
if (!found && fd && (root->section & Entry::COMPOUND_MASK))
{
//printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n",
// cd->name().data(),
// fd->name().data(),
// root->fileName.data()
// );
fd->insertClass(cd);
}
// the empty string test is needed for extract all case
cd->setBriefDescription(root->brief);
cd->insertUsedFile(root->fileName);
// add class to the list
//printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data());
Doxygen::classSDict.append(fullName,cd);
// also add class to the correct structural context
Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName);
if (d==0)
{
//warn(root->fileName,root->startLine,
// "Warning: Internal inconsistency: scope for class %s not "
// "found!\n",fullName.data()
// );
}
else
{
//printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data());
d->addInnerCompound(cd);
cd->setOuterScope(d);
}
} }
} }
error:
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
Entry *e; Entry *e;
for (;(e=eli.current());++eli) for (;(e=eli.current());++eli)
...@@ -1847,7 +1846,7 @@ static void buildFunctionList(Entry *root) ...@@ -1847,7 +1846,7 @@ static void buildFunctionList(Entry *root)
//printf("match!\n"); //printf("match!\n");
// see if we need to create a new member // see if we need to create a new member
found=(nd && rnd && nsName==rnsName) || // members are in the same namespace found=(nd && rnd && nsName==rnsName) || // members are in the same namespace
((fd!=0 && // no external reference and ((nd==0 && rnd==0 && fd!=0 && // no external reference and
fd->absFilePath()==root->fileName // prototype in the same file fd->absFilePath()==root->fileName // prototype in the same file
) )
); );
...@@ -2167,6 +2166,11 @@ static void transferFunctionDocumentation() ...@@ -2167,6 +2166,11 @@ static void transferFunctionDocumentation()
} }
mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers()); mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers()); mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
int todoId = QMAX(mdec->todoId(),mdef->todoId());
int testId = QMAX(mdec->testId(),mdef->testId());
int bugId = QMAX(mdec->bugId() ,mdef->bugId() );
mdec->setRefItems(todoId,testId,bugId);
} }
} }
} }
...@@ -4775,6 +4779,7 @@ static void buildCompleteMemberLists() ...@@ -4775,6 +4779,7 @@ static void buildCompleteMemberLists()
cd->subClasses()->count()==0 && // is a root of the hierarchy cd->subClasses()->count()==0 && // is a root of the hierarchy
cd->baseClasses()->count()>0) // and has at least one base class cd->baseClasses()->count()>0) // and has at least one base class
{ {
//printf("*** merging members for %s\n",cd->name().data());
cd->mergeMembers(); cd->mergeMembers();
} }
} }
...@@ -6954,8 +6959,8 @@ void parseInput() ...@@ -6954,8 +6959,8 @@ void parseInput()
msg("Determining which enums are documented\n"); msg("Determining which enums are documented\n");
findDocumentedEnumValues(); findDocumentedEnumValues();
msg("Computing member references...\n"); //msg("Computing member references...\n");
computeMemberReferences(); //computeMemberReferences();
msg("Computing member relations...\n"); msg("Computing member relations...\n");
computeMemberRelations(); computeMemberRelations();
...@@ -6975,6 +6980,9 @@ void parseInput() ...@@ -6975,6 +6980,9 @@ void parseInput()
msg("Building full member lists recursively...\n"); msg("Building full member lists recursively...\n");
buildCompleteMemberLists(); buildCompleteMemberLists();
msg("Computing member references...\n");
computeMemberReferences();
if (Config_getBool("INHERIT_DOCS")) if (Config_getBool("INHERIT_DOCS"))
{ {
msg("Inheriting documentation...\n"); msg("Inheriting documentation...\n");
......
...@@ -84,7 +84,7 @@ FileDef::~FileDef() ...@@ -84,7 +84,7 @@ FileDef::~FileDef()
/*! Compute the HTML anchor names for all members in the class */ /*! Compute the HTML anchor names for all members in the class */
void FileDef::computeAnchors() void FileDef::computeAnchors()
{ {
setAnchors('a',&allMemberList); setAnchors(0,'a',&allMemberList);
} }
void FileDef::distributeMemberGroupDocumentation() void FileDef::distributeMemberGroupDocumentation()
......
...@@ -343,7 +343,7 @@ int GroupDef::countMembers() const ...@@ -343,7 +343,7 @@ int GroupDef::countMembers() const
/*! Compute the HTML anchor names for all members in the class */ /*! Compute the HTML anchor names for all members in the class */
void GroupDef::computeAnchors() void GroupDef::computeAnchors()
{ {
setAnchors('a',allMemberList); setAnchors(0,'a',allMemberList);
} }
void GroupDef::writeDocumentation(OutputList &ol) void GroupDef::writeDocumentation(OutputList &ol)
......
...@@ -249,6 +249,11 @@ class HtmlGenerator : public OutputGenerator ...@@ -249,6 +249,11 @@ class HtmlGenerator : public OutputGenerator
void startFontClass(const char *s) { t << "<font class=\"" << s << "\">"; } void startFontClass(const char *s) { t << "<font class=\"" << s << "\">"; }
void endFontClass() { t << "</font>"; } void endFontClass() { t << "</font>"; }
void startHtmlOnly() {}
void endHtmlOnly() {}
void startLatexOnly() {}
void endLatexOnly() {}
private: private:
QCString lastTitle; QCString lastTitle;
QCString lastFile; QCString lastFile;
......
...@@ -21,3 +21,4 @@ ...@@ -21,3 +21,4 @@
#define LANG_DK #define LANG_DK
#define LANG_SK #define LANG_SK
#define LANG_UA #define LANG_UA
#define LANG_GR
...@@ -91,6 +91,12 @@ ...@@ -91,6 +91,12 @@
#ifdef LANG_UA #ifdef LANG_UA
#include "translator_ua.h" #include "translator_ua.h"
#endif #endif
#ifdef LANG_GR
#include "translator_gr.h"
#endif
//#ifdef LANG_JS
//#include "translator_js.h"
//#endif
#endif #endif
#define L_EQUAL(a) !stricmp(langName,a) #define L_EQUAL(a) !stricmp(langName,a)
...@@ -242,6 +248,16 @@ bool setTranslator(const char *langName) ...@@ -242,6 +248,16 @@ bool setTranslator(const char *langName)
theTranslator=new TranslatorUkrainian; theTranslator=new TranslatorUkrainian;
} }
#endif #endif
#ifdef LANG_GR
else if (L_EQUAL("greek"))
{
theTranslator=new TranslatorGreek;
}
#endif
// else if (L_EQUAL("japanese-sjis"))
// {
// theTranslator=new TranslatorJapaneseSjis;
// }
#endif #endif
else // use the default language (i.e. english) else // use the default language (i.e. english)
{ {
......
...@@ -272,8 +272,9 @@ static void writeDefaultHeaderPart1(QTextStream &t) ...@@ -272,8 +272,9 @@ static void writeDefaultHeaderPart1(QTextStream &t)
t << "\\makeindex\n" t << "\\makeindex\n"
"\\setcounter{tocdepth}{1}\n" "\\setcounter{tocdepth}{1}\n"
"\\setlength{\\footrulewidth}{0.4pt}\n" "\\setlength{\\footrulewidth}{0.4pt}\n"
"\\begin{document}\n" "\\begin{document}\n";
"\\begin{titlepage}\n" if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n";
t << "\\begin{titlepage}\n"
"\\vspace*{7cm}\n" "\\vspace*{7cm}\n"
"\\begin{center}\n" "\\begin{center}\n"
"{\\Large "; "{\\Large ";
...@@ -1380,13 +1381,15 @@ void LatexGenerator::latin2ToLatex(unsigned char c) ...@@ -1380,13 +1381,15 @@ void LatexGenerator::latin2ToLatex(unsigned char c)
//void LatexGenerator::docifyStatic(QTextStream &t,const char *str) //void LatexGenerator::docifyStatic(QTextStream &t,const char *str)
void LatexGenerator::docify(const char *str) void LatexGenerator::docify(const char *str)
{ {
static bool isCzech = theTranslator->idLanguage()=="czech"; static bool isCzech = theTranslator->idLanguage()=="czech";
static bool isJapanese = theTranslator->idLanguage()=="japanese"; static bool isJapanese = theTranslator->idLanguage()=="japanese";
static bool isKorean = theTranslator->idLanguage()=="korean"; static bool isJapaneseSjis = theTranslator->idLanguage()=="japanese-sjis";
static bool isRussian = theTranslator->idLanguage()=="russian"; static bool isKorean = theTranslator->idLanguage()=="korean";
static bool isUkrainian = theTranslator->idLanguage()=="ukrainian"; static bool isRussian = theTranslator->idLanguage()=="russian";
static bool isChinese = theTranslator->idLanguage()=="chinese"; static bool isUkrainian = theTranslator->idLanguage()=="ukrainian";
static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2"; static bool isChinese = theTranslator->idLanguage()=="chinese";
static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2";
static bool isGreek = theTranslator->idLanguage()=="greek";
if (str) if (str)
{ {
const unsigned char *p=(const unsigned char *)str; const unsigned char *p=(const unsigned char *)str;
...@@ -1452,7 +1455,7 @@ void LatexGenerator::docify(const char *str) ...@@ -1452,7 +1455,7 @@ void LatexGenerator::docify(const char *str)
default: default:
// Some languages uses wide characters // Some languages uses wide characters
if (isJapanese || isKorean || isChinese) if (isJapanese || isJapaneseSjis || isKorean || isChinese)
{ {
if (c>=128) if (c>=128)
{ {
...@@ -1494,6 +1497,17 @@ void LatexGenerator::docify(const char *str) ...@@ -1494,6 +1497,17 @@ void LatexGenerator::docify(const char *str)
t << (char)c; t << (char)c;
} }
} }
else if (isGreek)
{
if (c<128)
{
t << "\\textlatin{" << (char)c << "}";
}
else
{
t << (char)c;
}
}
else // language is other than Czech, Russian or Japanese else // language is other than Czech, Russian or Japanese
{ {
switch(c) switch(c)
......
...@@ -255,6 +255,11 @@ class LatexGenerator : public OutputGenerator ...@@ -255,6 +255,11 @@ class LatexGenerator : public OutputGenerator
void startFontClass(const char *) {} void startFontClass(const char *) {}
void endFontClass() {} void endFontClass() {}
void startHtmlOnly() {}
void endHtmlOnly() {}
void startLatexOnly() {}
void endLatexOnly() {}
private: private:
void latin2ToLatex(unsigned char); void latin2ToLatex(unsigned char);
......
...@@ -76,6 +76,7 @@ HEADERS = bufstr.h \ ...@@ -76,6 +76,7 @@ HEADERS = bufstr.h \
translator_es.h \ translator_es.h \
translator_fi.h \ translator_fi.h \
translator_fr.h \ translator_fr.h \
translator_gr.h \
translator_hr.h \ translator_hr.h \
translator_hu.h \ translator_hu.h \
translator_it.h \ translator_it.h \
......
...@@ -143,6 +143,7 @@ void ManGenerator::startFile(const char *,const char *manName, ...@@ -143,6 +143,7 @@ void ManGenerator::startFile(const char *,const char *manName,
void ManGenerator::endFile() void ManGenerator::endFile()
{ {
t << endl;
endPlainFile(); endPlainFile();
} }
......
...@@ -237,6 +237,11 @@ class ManGenerator : public OutputGenerator ...@@ -237,6 +237,11 @@ class ManGenerator : public OutputGenerator
void startFontClass(const char *) {} void startFontClass(const char *) {}
void endFontClass() {} void endFontClass() {}
void startHtmlOnly() {}
void endHtmlOnly() {}
void startLatexOnly() {}
void endLatexOnly() {}
private: private:
bool firstCol; bool firstCol;
bool paragraph; bool paragraph;
......
...@@ -129,6 +129,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, ...@@ -129,6 +129,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
} }
if ((vp=a->type.find(re))!=-1) // argument type is a function pointer if ((vp=a->type.find(re))!=-1) // argument type is a function pointer
{ {
//printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data());
QCString n=a->type.left(vp); QCString n=a->type.left(vp);
if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName); if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
linkifyText(TextGeneratorOLImpl(ol),scopeName,md->name(),n); linkifyText(TextGeneratorOLImpl(ol),scopeName,md->name(),n);
...@@ -367,10 +368,7 @@ void MemberDef::setReimplements(MemberDef *md) ...@@ -367,10 +368,7 @@ void MemberDef::setReimplements(MemberDef *md)
{ {
m_templateMaster->setReimplements(md); m_templateMaster->setReimplements(md);
} }
else redefines=md;
{
redefines=md;
}
} }
void MemberDef::insertReimplementedBy(MemberDef *md) void MemberDef::insertReimplementedBy(MemberDef *md)
...@@ -379,11 +377,8 @@ void MemberDef::insertReimplementedBy(MemberDef *md) ...@@ -379,11 +377,8 @@ void MemberDef::insertReimplementedBy(MemberDef *md)
{ {
m_templateMaster->insertReimplementedBy(md); m_templateMaster->insertReimplementedBy(md);
} }
else if (redefinedBy==0) redefinedBy = new MemberList;
{ redefinedBy->inSort(md);
if (redefinedBy==0) redefinedBy = new MemberList;
redefinedBy->inSort(md);
}
} }
void MemberDef::insertEnumField(MemberDef *md) void MemberDef::insertEnumField(MemberDef *md)
...@@ -491,6 +486,7 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() ...@@ -491,6 +486,7 @@ ClassDef *MemberDef::getClassDefOfAnonymousType()
if (ltype.left(7)=="friend ") ltype=ltype.right(ltype.length()-7); if (ltype.left(7)=="friend ") ltype=ltype.right(ltype.length()-7);
static QRegExp r("@[0-9]+"); static QRegExp r("@[0-9]+");
int l,i=r.match(ltype,0,&l); int l,i=r.match(ltype,0,&l);
//printf("ltype=`%s' i=%d\n",ltype.data(),i);
// search for the last anonymous scope in the member type // search for the last anonymous scope in the member type
ClassDef *annoClassDef=0; ClassDef *annoClassDef=0;
if (i!=-1) // found anonymous scope in type if (i!=-1) // found anonymous scope in type
...@@ -498,10 +494,9 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() ...@@ -498,10 +494,9 @@ ClassDef *MemberDef::getClassDefOfAnonymousType()
int il=i-1,ir=i+l; int il=i-1,ir=i+l;
// extract anonymous scope // extract anonymous scope
while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--; while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--;
if (il>0) il++; if (il>0) il++; else if (il<0) il=0;
while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++; while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++;
//QCString annName = ltype.mid(i,l);
QCString annName = ltype.mid(il,ir-il); QCString annName = ltype.mid(il,ir-il);
// if inside a class or namespace try to prepend the scope name // if inside a class or namespace try to prepend the scope name
...@@ -745,7 +740,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -745,7 +740,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
} }
// write name // write name
if (!name().isEmpty() && name().at(0)!='@') if (!name().isEmpty() && name().at(0)!='@') // hide annonymous stuff
{ {
//printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable()); //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable());
if (isLinkable()) if (isLinkable())
...@@ -764,7 +759,9 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -764,7 +759,9 @@ void MemberDef::writeDeclaration(OutputList &ol,
else else
{ {
//printf("writeLink %s->%d\n",name.data(),hasDocumentation()); //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
writeLink(ol,cd,nd,fd,gd); ClassDef *rcd = cd;
if (isReference() && classDef) rcd = classDef;
writeLink(ol,rcd,nd,fd,gd);
} }
} }
else if (isDocumentedFriendClass()) else if (isDocumentedFriendClass())
...@@ -903,7 +900,7 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup) const ...@@ -903,7 +900,7 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup) const
{ {
bool groupFilter = getGroupDef()==0 || inGroup; bool groupFilter = getGroupDef()==0 || inGroup;
bool visible = isDetailedSectionLinkable() && groupFilter; bool visible = isDetailedSectionLinkable() && groupFilter && !isReference();
//printf("MemberDef::isDetailedSectionVisible() %d\n",visible); //printf("MemberDef::isDetailedSectionVisible() %d\n",visible);
return visible; return visible;
} }
...@@ -1102,7 +1099,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1102,7 +1099,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
isFriend() || isRelated() || isExplicit() || isFriend() || isRelated() || isExplicit() ||
isMutable() || (isInline() && Config_getBool("INLINE_INFO")) || isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
isSignal() || isSlot() || isSignal() || isSlot() ||
isStatic() isStatic() || (classDef && classDef!=container)
) )
{ {
// write the member specifier list // write the member specifier list
...@@ -1126,6 +1123,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1126,6 +1123,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (isSignal()) sl.append("signal"); if (isSignal()) sl.append("signal");
if (isSlot()) sl.append("slot"); if (isSlot()) sl.append("slot");
} }
if (classDef && classDef!=container) sl.append("inherited");
const char *s=sl.first(); const char *s=sl.first();
while (s) while (s)
{ {
...@@ -1165,22 +1163,29 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1165,22 +1163,29 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
parseCode(ol,scopeName,init,FALSE,0); parseCode(ol,scopeName,init,FALSE,0);
ol.endCodeFragment(); ol.endCodeFragment();
} }
QCString brief = m_templateMaster ?
m_templateMaster->briefDescription() : briefDescription();
QCString detailed = m_templateMaster ?
m_templateMaster->documentation() : documentation();
ArgumentList *docArgList = m_templateMaster ?
m_templateMaster->argList : argList;
/* write brief description */ /* write brief description */
if (!briefDescription().isEmpty() && if (!brief.isEmpty() &&
(Config_getBool("REPEAT_BRIEF") (Config_getBool("REPEAT_BRIEF")
/* || (!Config_getBool("BRIEF_MEMBER_DESC") && documentation().isEmpty())*/ /* || (!Config_getBool("BRIEF_MEMBER_DESC") && documentation().isEmpty())*/
) /* || !annMemb */ ) /* || !annMemb */
) )
{ {
parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),briefDescription()); parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),brief);
ol.newParagraph(); ol.newParagraph();
} }
/* write detailed description */ /* write detailed description */
if (!documentation().isEmpty()) if (!detailed.isEmpty())
{ {
parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),documentation()+"\n"); parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),detailed+"\n");
ol.pushGeneratorState(); ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::RTF); ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph(); ol.newParagraph();
...@@ -1190,7 +1195,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1190,7 +1195,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
//printf("***** argList=%p name=%s docs=%s hasDocs=%d\n", //printf("***** argList=%p name=%s docs=%s hasDocs=%d\n",
// argList, // argList,
// argList?argList->hasDocumentation():-1); // argList?argList->hasDocumentation():-1);
if (argList && argList->hasDocumentation()) if (docArgList && docArgList->hasDocumentation())
{ {
//printf("***** argumentList is documented\n"); //printf("***** argumentList is documented\n");
ol.startParamList(BaseOutputDocInterface::Param); ol.startParamList(BaseOutputDocInterface::Param);
...@@ -1198,7 +1203,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1198,7 +1203,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.endDescTitle(); ol.endDescTitle();
ol.writeDescItem(); ol.writeDescItem();
ol.startDescTable(); ol.startDescTable();
ArgumentListIterator ali(*argList); ArgumentListIterator ali(*docArgList);
Argument *a; Argument *a;
for (ali.toFirst();(a=ali.current());++ali) for (ali.toFirst();(a=ali.current());++ali)
{ {
...@@ -1293,21 +1298,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1293,21 +1298,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ClassDef *bcd=0; ClassDef *bcd=0;
if (bmd && (bcd=bmd->getClassDef())) if (bmd && (bcd=bmd->getClassDef()))
{ {
#if 0
if (lvirt!=Normal) // search for virtual member of the deepest base class
{
MemberDef *lastBmd=bmd;
while (lastBmd)
{
ClassDef *lastBcd = lastBmd->getClassDef();
if (lastBmd->virtualness()!=Normal &&
lastBmd->isLinkable() &&
lastBcd->isLinkable()
) { bmd=lastBmd; bcd=lastBcd; }
lastBmd=lastBmd->reimplements();
}
}
#endif
// write class that contains a member that is reimplemented by this one // write class that contains a member that is reimplemented by this one
if (bcd->isLinkable()) if (bcd->isLinkable())
{ {
...@@ -1543,6 +1533,11 @@ QCString MemberDef::getScopeString() const ...@@ -1543,6 +1533,11 @@ QCString MemberDef::getScopeString() const
return result; return result;
} }
void MemberDef::setAnchor(const char *a)
{
anc=a;
}
QCString MemberDef::anchor() const QCString MemberDef::anchor() const
{ {
if (m_templateMaster) return m_templateMaster->anchor(); if (m_templateMaster) return m_templateMaster->anchor();
...@@ -1601,6 +1596,9 @@ MemberDef *MemberDef::createTemplateInstanceMember( ...@@ -1601,6 +1596,9 @@ MemberDef *MemberDef::createTemplateInstanceMember(
actArg->type = substituteTemplateArgumentsInString(actArg->type,formalArgs,actualArgs); actArg->type = substituteTemplateArgumentsInString(actArg->type,formalArgs,actualArgs);
actualArgList->append(actArg); actualArgList->append(actArg);
} }
actualArgList->constSpecifier = argList->constSpecifier;
actualArgList->volatileSpecifier = argList->volatileSpecifier;
actualArgList->pureSpecifier = argList->pureSpecifier;
} }
MemberDef *imd = new MemberDef( MemberDef *imd = new MemberDef(
...@@ -1613,7 +1611,11 @@ MemberDef *MemberDef::createTemplateInstanceMember( ...@@ -1613,7 +1611,11 @@ MemberDef *MemberDef::createTemplateInstanceMember(
); );
imd->argList = actualArgList; imd->argList = actualArgList;
imd->def = substituteTemplateArgumentsInString(def,formalArgs,actualArgs); imd->def = substituteTemplateArgumentsInString(def,formalArgs,actualArgs);
imd->setBodyDef(getBodyDef());
imd->setBodySegment(getStartBodyLine(),getEndBodyLine());
// TODO: init other member variables (if needed). // TODO: init other member variables (if needed).
// TODO: reimplemented info
return imd; return imd;
} }
...@@ -1663,6 +1665,7 @@ void MemberDef::addListReference(Definition *d) ...@@ -1663,6 +1665,7 @@ void MemberDef::addListReference(Definition *d)
memName.prepend(pd->name()+"::"); memName.prepend(pd->name()+"::");
} }
} }
//printf("*** addListReference %s todo=%d test=%d bug=%d\n",name().data(),todoId(),testId(),bugId());
addRefItem(todoId(),testId(),bugId(),memLabel, addRefItem(todoId(),testId(),bugId(),memLabel,
d->getOutputFileBase()+":"+anchor(),memName,argsString()); d->getOutputFileBase()+":"+anchor(),memName,argsString());
} }
......
...@@ -135,7 +135,7 @@ class MemberDef : public Definition ...@@ -135,7 +135,7 @@ class MemberDef : public Definition
void setMemberType(MemberType t) { mtype=t; } void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; } void setDefinition(const char *d) { def=d; }
void setFileDef(FileDef *fd) { fileDef=fd; } void setFileDef(FileDef *fd) { fileDef=fd; }
void setAnchor(const char *a) { anc=a; } void setAnchor(const char *a);
void setProtection(Protection p) { prot=p; } void setProtection(Protection p) { prot=p; }
void setMemberSpecifiers(int s) { memSpec=s; } void setMemberSpecifiers(int s) { memSpec=s; }
void mergeMemberSpecifiers(int s) { memSpec|=s; } void mergeMemberSpecifiers(int s) { memSpec|=s; }
......
...@@ -84,7 +84,7 @@ void MemberGroup::insertMember(MemberDef *md) ...@@ -84,7 +84,7 @@ void MemberGroup::insertMember(MemberDef *md)
void MemberGroup::setAnchors() void MemberGroup::setAnchors()
{ {
::setAnchors('z',memberList,grpId); ::setAnchors(0,'z',memberList,grpId);
} }
void MemberGroup::writeDeclarations(OutputList &ol, void MemberGroup::writeDeclarations(OutputList &ol,
......
...@@ -373,54 +373,8 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -373,54 +373,8 @@ void MemberList::writePlainDeclarations(OutputList &ol,
} }
case MemberDef::Friend: case MemberDef::Friend:
{ {
#if 0 if (first) ol.startMemberList(),first=FALSE;
//printf("Writing friend `%s'\n",md->name().data()); md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
QCString type=md->typeString();
//printf("Friend: type=%s name=%s\n",type.data(),md->name().data());
bool isFriendClass = type=="friend class";
if (!isFriendClass)
{
#endif
if (first) ol.startMemberList(),first=FALSE;
md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
#if 0
}
else // isFriendClass
// friend is undocumented as a member but it is a class,
// so generate a link to the class if that is documented.
{
ClassDef *cd=getClass(md->name());
if (md->hasDocumentation()) // friend is documented
{
if (first) ol.startMemberList(),first=FALSE;
ol.startMemberItem(0);
ol.docify("class ");
ol.insertMemberAlign();
ol.writeObjectLink(0,0,md->anchor(),md->name());
ol.endMemberItem(FALSE);
}
else if (cd && cd->isLinkable()) // class is documented
{
if (first) ol.startMemberList(),first=FALSE;
ol.startMemberItem(0);
ol.docify("class ");
ol.insertMemberAlign();
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
ol.endMemberItem(FALSE);
}
else if (!Config_getBool("HIDE_UNDOC_MEMBERS")) // no documentation
{
if (first) ol.startMemberList(),first=FALSE;
ol.startMemberItem(0);
ol.docify("class ");
ol.insertMemberAlign();
ol.startBold();
ol.docify(md->name());
ol.endBold();
ol.endMemberItem(FALSE);
}
}
#endif
break; break;
} }
case MemberDef::EnumValue: case MemberDef::EnumValue:
......
...@@ -167,7 +167,7 @@ void NamespaceDef::insertMember(MemberDef *md) ...@@ -167,7 +167,7 @@ void NamespaceDef::insertMember(MemberDef *md)
void NamespaceDef::computeAnchors() void NamespaceDef::computeAnchors()
{ {
setAnchors('a',&allMemberList); setAnchors(0,'a',&allMemberList);
} }
void NamespaceDef::writeDocumentation(OutputList &ol) void NamespaceDef::writeDocumentation(OutputList &ol)
......
...@@ -257,6 +257,11 @@ class BaseOutputDocInterface ...@@ -257,6 +257,11 @@ class BaseOutputDocInterface
virtual void startFontClass(const char *) = 0; virtual void startFontClass(const char *) = 0;
virtual void endFontClass() = 0; virtual void endFontClass() = 0;
virtual void startHtmlOnly() = 0;
virtual void endHtmlOnly() = 0;
virtual void startLatexOnly() = 0;
virtual void endLatexOnly() = 0;
/*! Writes an ASCII string to the output. This function should keep /*! Writes an ASCII string to the output. This function should keep
* spaces visible, should break lines at a newline and should convert * spaces visible, should break lines at a newline and should convert
* tabs to the right number of spaces. * tabs to the right number of spaces.
......
...@@ -434,6 +434,15 @@ class OutputList : public OutputDocInterface ...@@ -434,6 +434,15 @@ class OutputList : public OutputDocInterface
void endFontClass() void endFontClass()
{ forall(&OutputGenerator::endFontClass); } { forall(&OutputGenerator::endFontClass); }
void startHtmlOnly()
{ forall(&OutputGenerator::startHtmlOnly); }
void endHtmlOnly()
{ forall(&OutputGenerator::endHtmlOnly); }
void startLatexOnly()
{ forall(&OutputGenerator::startLatexOnly); }
void endLatexOnly()
{ forall(&OutputGenerator::endLatexOnly); }
#if 0 #if 0
void startPlainFile(const char *name) void startPlainFile(const char *name)
{ forall(&OutputGenerator::startPlainFile,name); } { forall(&OutputGenerator::startPlainFile,name); }
......
...@@ -240,6 +240,11 @@ class RTFGenerator : public OutputGenerator ...@@ -240,6 +240,11 @@ class RTFGenerator : public OutputGenerator
void startFontClass(const char *) {} void startFontClass(const char *) {}
void endFontClass() {} void endFontClass() {}
void startHtmlOnly() {}
void endHtmlOnly() {}
void startLatexOnly() {}
void endLatexOnly() {}
static bool preProcessFileInplace(const char *path,const char *name); static bool preProcessFileInplace(const char *path,const char *name);
private: private:
......
...@@ -920,6 +920,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -920,6 +920,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = current->name.simplifyWhiteSpace(); current->name = current->name.simplifyWhiteSpace();
BEGIN( FindMembers ) ; BEGIN( FindMembers ) ;
} }
<Operator>";" { // can occur when importing members
unput(';');
BEGIN( FindMembers ) ;
}
<Operator>[^(] { <Operator>[^(] {
lineCount(); lineCount();
current->name += *yytext ; current->name += *yytext ;
...@@ -1093,6 +1097,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1093,6 +1097,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN( ReadFuncArgType ) ; BEGIN( ReadFuncArgType ) ;
} }
} }
<EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
lineCount();
current->name+='>';
BEGIN(FindMembers);
}
<EndTemplate>">"{BN}*/"::" { <EndTemplate>">"{BN}*/"::" {
lineCount(); lineCount();
current->name+='>'; current->name+='>';
...@@ -2033,24 +2042,58 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -2033,24 +2042,58 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
} }
/* a special comment */ /* a special comment */
<ReadFuncArgType>("/*"[*!]|"//"[/!])("<"?) { <ReadFuncArgType>("/*"[*!]|"//"[/!])("<"?) {
fullArgString+=yytext; if (currentArgumentContext==DefineEnd)
lastCopyArgChar=0; {
if (yytext[1]=='/') // for defines we interpret a comment
BEGIN( CopyArgCommentLine ); // as documentation for the define
int i;for (i=yyleng-1;i>=0;i--)
{
unput(yytext[i]);
}
stringToArgumentList(fullArgString,current->argList);
BEGIN( currentArgumentContext );
}
else else
BEGIN( CopyArgComment ); {
// for functions we interpret a comment
// as documentation for the argument
fullArgString+=yytext;
lastCopyArgChar=0;
if (yytext[1]=='/')
BEGIN( CopyArgCommentLine );
else
BEGIN( CopyArgComment );
}
} }
/* `)' followed by a special comment */ /* `)' followed by a special comment */
<ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" { <ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" {
lineCount(); lineCount();
lastCopyArgChar=*yytext; if (currentArgumentContext==DefineEnd)
QCString text=&yytext[1]; {
text=text.stripWhiteSpace(); // for defines we interpret a comment
fullArgString+=text; // as documentation for the define
if (text.find("//")!=-1) int i;for (i=yyleng-1;i>0;i--)
BEGIN( CopyArgCommentLine ); {
unput(yytext[i]);
}
*copyArgString+=*yytext;
fullArgString+=*yytext;
stringToArgumentList(fullArgString,current->argList);
BEGIN( currentArgumentContext );
}
else else
BEGIN( CopyArgComment ); {
// for functions we interpret a comment
// as documentation for the last argument
lastCopyArgChar=*yytext;
QCString text=&yytext[1];
text=text.stripWhiteSpace();
fullArgString+=text;
if (text.find("//")!=-1)
BEGIN( CopyArgCommentLine );
else
BEGIN( CopyArgComment );
}
} }
<CopyArgComment>[^\n\*]+ { fullArgString+=yytext; } <CopyArgComment>[^\n\*]+ { fullArgString+=yytext; }
<CopyArgComment>"*/" { fullArgString+=yytext; <CopyArgComment>"*/" { fullArgString+=yytext;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "doxygen.h" #include "doxygen.h"
#include "util.h" #include "util.h"
#include "message.h" #include "message.h"
#include "defargs.h"
//#include "reflist.h" //#include "reflist.h"
/*! Container for member specific info that can be read from a tagfile */ /*! Container for member specific info that can be read from a tagfile */
...@@ -859,6 +860,11 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members) ...@@ -859,6 +860,11 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
me->type = tmi->type; me->type = tmi->type;
me->name = tmi->name; me->name = tmi->name;
me->args = tmi->arglist; me->args = tmi->arglist;
if (!me->args.isEmpty())
{
me->argList = new ArgumentList;
stringToArgumentList(me->args,me->argList);
}
me->protection = tmi->prot; me->protection = tmi->prot;
me->virt = tmi->virt; me->virt = tmi->virt;
me->stat = tmi->isStatic; me->stat = tmi->isStatic;
......
...@@ -267,252 +267,4 @@ class TranslatorAdapter_1_2_1 : public TranslatorAdapter_1_2_2 ...@@ -267,252 +267,4 @@ class TranslatorAdapter_1_2_1 : public TranslatorAdapter_1_2_2
{ return english.trDCOPMethods(); } { return english.trDCOPMethods(); }
}; };
/*! \brief Translator adapter class for release 1.2.0
*
* Translator adapter for dealing with translator changes since
* release 1.2.0
*/
class TranslatorAdapter_1_2_0 : public TranslatorAdapter_1_2_1
{
public:
virtual QCString updateNeededMessage()
{ return createUpdateNeededMessage(idLanguage(),"release 1.2.0"); }
virtual QCString trTest()
{ return english.trTest(); }
virtual QCString trTestList()
{ return english.trTestList(); }
};
/*! \brief Translator adapter class for release 1.1.5
*
* Translator adapter for dealing with translator changes since
* release 1.1.5
*/
class TranslatorAdapter_1_1_5 : public TranslatorAdapter_1_2_0
{
public:
virtual QCString updateNeededMessage()
{ return createUpdateNeededMessage(idLanguage(),"release 1.1.5"); }
virtual QCString trLegendTitle()
{ return english.trLegendTitle(); }
virtual QCString trLegendDocs()
{ return english.trLegendDocs(); }
virtual QCString trLegend()
{ return english.trLegend(); }
};
/*! \brief Translator adapter class for release 1.1.4
*
* Translator adapter for dealing with translator changes since
* release 1.1.4
*/
class TranslatorAdapter_1_1_4 : public TranslatorAdapter_1_1_5
{
public:
virtual QCString updateNeededMessage()
{ return createUpdateNeededMessage(idLanguage(),"release 1.1.4"); }
virtual QCString trReferencedBy()
{ return english.trReferencedBy(); }
virtual QCString trRemarks()
{ return english.trRemarks(); }
virtual QCString trAttention()
{ return english.trAttention(); }
virtual QCString trInclByDepGraph()
{ return english.trInclByDepGraph(); }
virtual QCString trSince()
{ return english.trSince(); }
};
/*! \brief Translator adapter class for release 1.1.3
*
* Translator adapter for dealing with translator changes since
* release 1.1.3
*/
class TranslatorAdapter_1_1_3 : public TranslatorAdapter_1_1_4
{
public:
virtual QCString updateNeededMessage()
{ return createUpdateNeededMessage(idLanguage(),"release 1.1.3"); }
virtual QCString trTodo()
{ return english.trTodo(); }
virtual QCString trTodoList()
{ return english.trTodoList(); }
};
/*! \brief Translator adapter class for release 1.1.0
*
* Translator adapter for dealing with translator changes since
* release 1.1.0
*/
class TranslatorAdapter_1_1_0 : public TranslatorAdapter_1_1_3
{
public:
virtual QCString updateNeededMessage()
{ return createUpdateNeededMessage(idLanguage(),"release 1.1.0"); }
virtual QCString trNote()
{ return english.trNote(); }
virtual QCString trPublicTypes()
{ return english.trPublicTypes(); }
virtual QCString trPublicAttribs()
{ return english.trPublicAttribs(); }
virtual QCString trStaticPublicAttribs()
{ return english.trStaticPublicAttribs(); }
virtual QCString trProtectedTypes()
{ return english.trProtectedTypes(); }
virtual QCString trProtectedAttribs()
{ return english.trProtectedAttribs(); }
virtual QCString trStaticProtectedAttribs()
{ return english.trStaticProtectedAttribs(); }
virtual QCString trPrivateTypes()
{ return english.trPrivateTypes(); }
virtual QCString trPrivateAttribs()
{ return english.trPrivateAttribs(); }
virtual QCString trStaticPrivateAttribs()
{ return english.trStaticPrivateAttribs(); }
virtual QCString trEnumerationValueDocumentation()
{ return english.trEnumerationValueDocumentation(); }
};
/*! \brief Translator adapter class for release 1.0.0
*
* Translator adapter for dealing with translator changes since
* release 1.0.0
*/
class TranslatorAdapter_1_0_0 : public TranslatorAdapter_1_1_0
{
virtual QCString updateNeededMessage()
{ return createUpdateNeededMessage(idLanguage(),"release 1.0.0"); }
virtual QCString trIncludingInheritedMembers()
{ return english.trIncludingInheritedMembers(); }
virtual QCString trFuncProtos()
{ return english.trFuncProtos(); }
virtual QCString trNamespaces()
{ return english.trNamespaces(); }
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ return english.trGeneratedFromFiles(compType, single); }
virtual QCString trAlphabeticalList()
{ return english.trAlphabeticalList(); }
virtual QCString trReturnValues()
{ return english.trReturnValues(); }
virtual QCString trMainPage()
{ return english.trMainPage(); }
virtual QCString trPageAbbreviation()
{ return english.trPageAbbreviation(); }
virtual QCString trSources()
{ return english.trSources(); }
virtual QCString trStaticProtectedMembers()
{ return english.trStaticProtectedMembers(); }
virtual QCString trDefinedAtLineInSourceFile()
{ return english.trDefinedAtLineInSourceFile(); }
virtual QCString trDefinedInSourceFile()
{ return english.trDefinedInSourceFile(); }
virtual QCString trDeprecated()
{ return english.trDeprecated(); }
virtual QCString trCollaborationDiagram(const char *clName)
{ return english.trCollaborationDiagram(clName); }
virtual QCString trInclDepGraph(const char *fName)
{ return english.trInclDepGraph(fName); }
virtual QCString trConstructorDocumentation()
{ return english.trConstructorDocumentation(); }
virtual QCString trGotoSourceCode()
{ return english.trGotoSourceCode(); }
virtual QCString trGotoDocumentation()
{ return english.trGotoDocumentation(); }
virtual QCString trPrecondition()
{ return english.trPrecondition(); }
virtual QCString trPostcondition()
{ return english.trPostcondition(); }
virtual QCString trInvariant()
{ return english.trInvariant(); }
virtual QCString trInitialValue()
{ return english.trInitialValue(); }
virtual QCString trCode()
{ return english.trCode(); }
virtual QCString trGraphicalHierarchy()
{ return english.trGraphicalHierarchy(); }
virtual QCString trGotoGraphicalHierarchy()
{ return english.trGotoGraphicalHierarchy(); }
virtual QCString trGotoTextualHierarchy()
{ return english.trGotoTextualHierarchy(); }
virtual QCString trPageIndex()
{ return english.trPageIndex(); }
virtual QCString trReimplementedForInternalReasons()
{ return english.trReimplementedForInternalReasons(); }
virtual QCString trClassHierarchyDescription()
{ return english.trClassHierarchyDescription(); }
virtual QCString trNoDescriptionAvailable()
{ return english.trNoDescriptionAvailable(); }
virtual QCString trEnumerationValues()
{ return english.trEnumerationValues(); }
virtual QCString trFunctionPrototypeDocumentation()
{ return english.trFunctionPrototypeDocumentation(); }
virtual QCString trEnumerationTypeDocumentation()
{ return english.trEnumerationTypeDocumentation(); }
virtual QCString trFunctionDocumentation()
{ return english.trFunctionDocumentation(); }
virtual QCString trRelatedFunctionDocumentation()
{ return english.trRelatedFunctionDocumentation(); }
};
#endif #endif
...@@ -27,58 +27,67 @@ Olli Korhonen <olli.korhonen@ccc.fi> ...@@ -27,58 +27,67 @@ Olli Korhonen <olli.korhonen@ccc.fi>
olla vakiintuneessa käytössä. olla vakiintuneessa käytössä.
* Tehtävää: * Tehtävää:
- Termien kokoaminen listaksi ja suomennosten järkevyyden tarkastelu. (lista on jo melko kattava) - Termien kokoaminen listaksi ja suomennosten järkevyyden tarkastelu. (lista on jo melko kattava)
Author = Tekijä Author = Tekijä
Class = Luokka Class = Luokka
Compound = Kooste ? Compound = Kooste ?
Data = Data Data = Data
Documentation = Dokumentaatio Documentation = Dokumentaatio
Defines = Määrittelyt ? Defines = Määrittelyt ?
Description = Selite Description = Selite
Detailed = Yksityiskohtainen Detailed = Yksityiskohtainen
diagram = kaavio diagram = kaavio
Enum = Enumeraatio ? Enum = Enumeraatio ?
Exceptions = Poikkeukset Exceptions = Poikkeukset
File = Tiedosto File = Tiedosto
Friends = Ystävät ? Friends = Ystävät ?
Functions = Funktiot Functions = Funktiot
Hierarchical = Hierarkinen Hierarchical = Hierarkinen
Index = Indeksi Index = Indeksi
Inherits = Perii Inherits = Perii
Member = Jäsen Member = Jäsen
Module = Moduli Module = Moduli
Namespace = Nimiavaruus ? Namespace = Nimiavaruus ?
Parameters = Parametrit Parameters = Parametrit
Private = Yksityinen Private = Yksityinen
Protected = Suojattu Protected = Suojattu
Prototypes = Prototyypit Prototypes = Prototyypit
Public = Julkinen Public = Julkinen
Reference Manual= Käsikirja Reference Manual= Käsikirja
Reimplemented = Uudelleen toteutettu Reimplemented = Uudelleen toteutettu
Related = Liittyvä Related = Liittyvä
Signals = Signaali Signals = Signaali
Slots = ? Slots = ?
Static = Staattinen Static = Staattinen
Struct = ? Struct = ?
Typedef = Tyyppimäärittely Typedef = Tyyppimäärittely
Union = ? Union = ?
Variables = Muuttujat Variables = Muuttujat
- Taivutusmuotojen virheettömyyden tarkastelu prepositioiden korvauskohdissa. - Taivutusmuotojen virheettömyyden tarkastelu prepositioiden korvauskohdissa.
- Sanasta sanaan käännöskohtien mielekkyyden tarkastelu valmiista dokumentista. - Sanasta sanaan käännöskohtien mielekkyyden tarkastelu valmiista dokumentista.
- umlaut vastineiden käyttö scandien kohdalla. - umlaut vastineiden käyttö scandien kohdalla.
positiiviset kommentit otetaan ilolla vastaan. positiiviset kommentit otetaan ilolla vastaan.
=================================================================================== ===================================================================================
*/ */
#ifndef TRANSLATOR_SF_H #ifndef TRANSLATOR_FI_H
#define TRANSLATOR_SF_H #define TRANSLATOR_FI_H
#include "translator_adapter.h" class TranslatorFinnish : public TranslatorEnglish
class TranslatorFinnish : public TranslatorAdapter_1_0_0
{ {
public: public:
/*! This method is used to generate a warning message to signal
* the user that the translation of his/her language of choice
* needs updating.
*/
virtual QCString updateNeededMessage()
{
return "Warning: The Finnish translator is really obsolete.\n"
"It was not updated since version 1.0.0. As a result,\n"
"some sentences may appear in English.\n\n";
}
QCString idLanguage() QCString idLanguage()
{ return "finnish"; } { return "finnish"; }
QCString latexBabelPackage() QCString latexBabelPackage()
...@@ -119,7 +128,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_0_0 ...@@ -119,7 +128,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_0_0
{ // here s is one of " Class", " Struct" or " Union" { // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file // single is true implies a single file
QCString result=(QCString)"Tämän "+s+ // "The documentation for this"+s+ QCString result=(QCString)"Tämän "+s+ // "The documentation for this"+s+
" dokumentaatio on generoitu ";// " was generated from the following file"; " dokumentaatio on generoitu ";// " was generated from the following file";
if (single) if (single)
result+="seuraavasta tiedostosta:"; result+="seuraavasta tiedostosta:";
else else
...@@ -379,7 +388,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_0_0 ...@@ -379,7 +388,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_0_0
QCString trGeneratedAt(const char *date,const char *projName) QCString trGeneratedAt(const char *date,const char *projName)
{ {
// funktio on hiukan vaikea kääntää prepositioihin sidotun rakenteen vuoksi. // funktio on hiukan vaikea kääntää prepositioihin sidotun rakenteen vuoksi.
QCString result=(QCString)"Generoitu "+date; // "Generated at " QCString result=(QCString)"Generoitu "+date; // "Generated at "
if (projName) result+=(QCString)" projektille "+projName; // " for " if (projName) result+=(QCString)" projektille "+projName; // " for "
result+=(QCString)" tekijä: "; // " by" result+=(QCString)" tekijä: "; // " by"
......
/******************************************************************************
*
*
*
* Copyright (C) 1997-2001 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.
*
*/
/*
* 15 Dec 2001 : Translation to greek by
* Harry Kalogirou <harkal@rainbow.cs.unipi.gr>
*/
#ifndef TRANSLATOR_GR_H
#define TRANSLATOR_GR_H
class TranslatorGreek : public TranslatorAdapter_1_2_11
{
public:
// --- Language control methods -------------------
/*! Used for identification of the language. The identification
* should not be translated. It should be replaced by the name
* of the language in English using lower-case characters only
* (e.g. "czech", "japanese", "russian", etc.). It should be equal to
* the identification used in language.cpp.
*/
virtual QCString idLanguage()
{ return "greek"; }
virtual QCString latexBabelPackage()
{
return "greek";
}
virtual QCString latexLanguageSupportCommand()
{
return "\\usepackage[greek,english]{babel}\n\\usepackage[iso-8859-7]{inputenc}\n";
}
/*! return the language charset. This will be used for the HTML output */
virtual QCString idLanguageCharset()
{
return "iso-8859-7";
}
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
{ return " "; }
/*! subscript for the related functions. */
virtual QCString trRelatedSubscript()
{ return "( .)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
virtual QCString trDetailedDescription()
{ return " "; }
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
{ return " Typedef"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
{ return " "; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
{ return " "; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
/*! this is the text of a link put after brief descriptions. */
virtual QCString trMore()
{ return "..."; }
/*! put in the class documentation */
virtual QCString trListOfAllMembers()
{ return " ."; }
/*! used as the title of the "list of all members" page of a class */
virtual QCString trMemberList()
{ return " "; }
/*! this is the first part of a sentence that is followed by a class name */
virtual QCString trThisIsTheListOfAllMembers()
{ return " "; }
/*! this is the remainder of the sentence after the class name */
virtual QCString trIncludingInheritedMembers()
{ return ", ."; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const char *s)
{ QCString result=" Doxygen";
if (s) result+=(QCString)" "+s;
result+=" .";
return result;
}
/*! put after an enum name in the list of all members */
virtual QCString trEnumName()
{ return " "; }
/*! put after an enum value in the list of all members */
virtual QCString trEnumValue()
{ return " "; }
/*! put after an undocumented member in the list of all members */
virtual QCString trDefinedIn()
{ return " "; }
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
{ return ""; }
/*! This is put above each page as a link to the class hierarchy */
virtual QCString trClassHierarchy()
{ return " "; }
/*! This is put above each page as a link to the list of annotated classes */
virtual QCString trCompoundList()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
/*! This is put above each page as a link to the list of documented files */
virtual QCString trFileList()
{ return " "; }
/*! This is put above each page as a link to the list of all verbatim headers */
virtual QCString trHeaderFiles()
{ return " "; }
/*! This is put above each page as a link to all members of compounds. */
virtual QCString trCompoundMembers()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
/*! This is put above each page as a link to all members of files. */
virtual QCString trFileMembers()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
/*! This is put above each page as a link to all related pages. */
virtual QCString trRelatedPages()
{ return " "; }
/*! This is put above each page as a link to all examples. */
virtual QCString trExamples()
{ return ""; }
/*! This is put above each page as a link to the search engine. */
virtual QCString trSearch()
{ return ""; }
/*! This is an introduction to the class hierarchy. */
virtual QCString trClassHierarchyDescription()
{ return " , "
" , :";
}
/*! This is an introduction to the list with all files. */
virtual QCString trFileListDescription(bool extractAll)
{
QCString result=" ";
if (!extractAll) result+=" ";
result+=" :";
return result;
}
/*! This is an introduction to the annotated compound list. */
virtual QCString trCompoundListDescription()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " :";
}
else
{
return " , , "
" :";
}
}
/*! This is an introduction to the page with all class members. */
virtual QCString trCompoundMembersDescription(bool extractAll)
{
QCString result=" ";
if (!extractAll)
{
result+=" ";
}
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
result+=" ";
}
else
{
result+="";
}
result+=" ";
if (extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
result+=" / :";
}
else
{
result+=" :";
}
}
else
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
result+=" / :";
}
else
{
result+=" :";
}
}
return result;
}
/*! This is an introduction to the page with all file members. */
virtual QCString trFileMembersDescription(bool extractAll)
{
QCString result=" ";
if (!extractAll) result+=" ";
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
result+=", , , , ";
}
else
{
result+=" ";
}
result+=" ";
if (extractAll)
result+=" :";
else
result+=" :";
return result;
}
/*! This is an introduction to the page with the list of all header files. */
virtual QCString trHeaderFilesDescription()
{ return " API:"; }
/*! This is an introduction to the page with the list of all examples */
virtual QCString trExamplesDescription()
{ return " :"; }
/*! This is an introduction to the page with the list of related pages */
virtual QCString trRelatedPagesDescription()
{ return " :"; }
/*! This is an introduction to the page with the list of class/file groups */
virtual QCString trModulesDescription()
{ return " :"; }
/*! This sentences is used in the annotated class/file lists if no brief
* description is given.
*/
virtual QCString trNoDescriptionAvailable()
{ return " "; }
// index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
virtual QCString trDocumentation()
{ return ""; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
virtual QCString trModuleIndex()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
*/
virtual QCString trCompoundIndex()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
/*! This is used in LaTeX as the title of the chapter with the
* list of all files.
*/
virtual QCString trFileIndex()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
virtual QCString trModuleDocumentation()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
*/
virtual QCString trClassDocumentation()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all files.
*/
virtual QCString trFileDocumentation()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
virtual QCString trExampleDocumentation()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
virtual QCString trPageDocumentation()
{ return " "; }
/*! This is used in LaTeX as the title of the document */
virtual QCString trReferenceManual()
{ return " "; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
virtual QCString trDefines()
{ return ""; }
/*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
virtual QCString trFuncProtos()
{ return " "; }
/*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
virtual QCString trTypedefs()
{ return " "; }
/*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
virtual QCString trEnumerations()
{ return ""; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
virtual QCString trFunctions()
{ return ""; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trVariables()
{ return ""; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trEnumerationValues()
{ return " "; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
virtual QCString trFunctionPrototypeDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
virtual QCString trTypedefDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
virtual QCString trEnumerationTypeDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
virtual QCString trFunctionDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
virtual QCString trVariableDocumentation()
{ return " "; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
*/
virtual QCString trCompounds()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return "";
}
}
/*! This is used in the standard footer of each page and indicates when
* the page was generated
*/
virtual QCString trGeneratedAt(const char *date,const char *projName)
{
QCString result=(QCString)" "+date;
if (projName) result+=(QCString)" "+projName;
result+=(QCString)" ";
return result;
}
/*! This is part of the sentence used in the standard footer of each page.
*/
virtual QCString trWrittenBy()
{
return " ";
}
/*! this text is put before a class diagram */
virtual QCString trClassDiagram(const char *clName)
{
return (QCString)" "+clName+":";
}
/*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
{ return " ."; }
/*! this text is generated when the \\reimp command is used. */
virtual QCString trReimplementedForInternalReasons()
{ return " , API ."; }
/*! this text is generated when the \\warning command is used. */
virtual QCString trWarning()
{ return ""; }
/*! this text is generated when the \\bug command is used. */
virtual QCString trBugsAndLimitations()
{ return " "; }
/*! this text is generated when the \\version command is used. */
virtual QCString trVersion()
{ return ""; }
/*! this text is generated when the \\date command is used. */
virtual QCString trDate()
{ return "/"; }
/*! this text is generated when the \\return command is used. */
virtual QCString trReturns()
{ return ""; }
/*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
{ return " "; }
/*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
{ return ""; }
/*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
{ return ""; }
/*! this text is used in the title page of a LaTeX document. */
virtual QCString trGeneratedBy()
{ return " "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990307
//////////////////////////////////////////////////////////////////////////
/*! used as the title of page containing all the index of all namespaces. */
virtual QCString trNamespaceList()
{ return " "; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll)
{
QCString result=" ";
if (!extractAll) result+=" ";
result+=" :";
return result;
}
/*! used in the class documentation as a header before the list of all
* friends of a class
*/
virtual QCString trFriends()
{ return ""; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
/*! used in the class documentation as a header before the list of all
* related classes
*/
virtual QCString trRelatedFunctionDocumentation()
{ return " "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
//////////////////////////////////////////////////////////////////////////
/*! used as the title of the HTML page of a class/struct/union */
virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType,
bool isTemplate)
{
QCString result=(QCString)clName+" ";
result+=" ";
switch(compType)
{
case ClassDef::Class: result+=" "; break;
case ClassDef::Struct: result+=" "; break;
case ClassDef::Union: result+=" "; break;
case ClassDef::Interface: result+=" "; break;
case ClassDef::Exception: result+=" "; break;
}
if (isTemplate) result+=" Template";
return result;
}
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
{
QCString result=fileName;
result+=" ";
return result;
}
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const char *namespaceName)
{
QCString result=namespaceName;
result+=" ";
return result;
}
virtual QCString trPublicMembers()
{ return " "; }
virtual QCString trPublicSlots()
{ return " Slots"; }
virtual QCString trSignals()
{ return ""; }
virtual QCString trStaticPublicMembers()
{ return " "; }
virtual QCString trProtectedMembers()
{ return " "; }
virtual QCString trProtectedSlots()
{ return " Slots"; }
virtual QCString trStaticProtectedMembers()
{ return " "; }
virtual QCString trPrivateMembers()
{ return " "; }
virtual QCString trPrivateSlots()
{ return " Slots"; }
virtual QCString trStaticPrivateMembers()
{ return " "; }
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
*/
virtual QCString trWriteList(int numEntries)
{
QCString result;
int i;
// the inherits list contain `numEntries' classes
for (i=0;i<numEntries;i++)
{
// use generateMarker to generate placeholders for the class links!
result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
if (i!=numEntries-1) // not the last entry, so we need a separator
{
if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
result+=", ";
}
}
return result;
}
/*! used in class documentation to produce a list of base classes,
* if class diagrams are disabled.
*/
virtual QCString trInheritsList(int numEntries)
{
return " "+trWriteList(numEntries)+".";
}
/*! used in class documentation to produce a list of super classes,
* if class diagrams are disabled.
*/
virtual QCString trInheritedByList(int numEntries)
{
return " "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
* members that are hidden by this one.
*/
virtual QCString trReimplementedFromList(int numEntries)
{
return " "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
* all member that overwrite the implementation of this member.
*/
virtual QCString trReimplementedInList(int numEntries)
{
return " "+trWriteList(numEntries)+".";
}
/*! This is put above each page as a link to all members of namespaces. */
virtual QCString trNamespaceMembers()
{ return " Namespace"; }
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
{
QCString result=" ";
if (!extractAll) result+=" ";
result+=" ";
if (extractAll)
result+=" :";
else
result+=" :";
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
{ return " "; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
{ return " "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
//////////////////////////////////////////////////////////////////////////
/*! This is used in the documentation before the list of all
* namespaces in a file.
*/
virtual QCString trNamespaces()
{ return " "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
//////////////////////////////////////////////////////////////////////////
/*! This is put at the bottom of a class documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
QCString result=(QCString)" ";
switch(compType)
{
case ClassDef::Class: result+=" "; break;
case ClassDef::Struct: result+=" "; break;
case ClassDef::Union: result+=" "; break;
case ClassDef::Interface: result+=" "; break;
case ClassDef::Exception: result+=" "; break;
}
result+=" ";
if (single) result+=" :"; else result+=" :";
return result;
}
/*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
{ return " "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
//////////////////////////////////////////////////////////////////////////
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
{ return " "; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
{ return " "; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
{ return "."; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991003
//////////////////////////////////////////////////////////////////////////
virtual QCString trSources()
{
return "";
}
virtual QCString trDefinedAtLineInSourceFile()
{
return " @0 @1.";
}
virtual QCString trDefinedInSourceFile()
{
return " @0.";
}
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991205
//////////////////////////////////////////////////////////////////////////
virtual QCString trDeprecated()
{
return "";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.0.0
//////////////////////////////////////////////////////////////////////////
/*! this text is put before a collaboration diagram */
virtual QCString trCollaborationDiagram(const char *clName)
{
return (QCString)" "+clName+":";
}
/*! this text is put before an include dependency graph */
virtual QCString trInclDepGraph(const char *fName)
{
return (QCString)" Include "+fName+":";
}
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
{
return " Constructor & Destructor";
}
/*! Used in the file documentation to point to the corresponding sources. */
virtual QCString trGotoSourceCode()
{
return " .";
}
/*! Used in the file sources to point to the corresponding documentation. */
virtual QCString trGotoDocumentation()
{
return " .";
}
/*! Text for the \\pre command */
virtual QCString trPrecondition()
{
return "";
}
/*! Text for the \\post command */
virtual QCString trPostcondition()
{
return "";
}
/*! Text for the \\invariant command */
virtual QCString trInvariant()
{
return "";
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
return " :";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
{
return "";
}
virtual QCString trGraphicalHierarchy()
{
return " ";
}
virtual QCString trGotoGraphicalHierarchy()
{
return " ";
}
virtual QCString trGotoTextualHierarchy()
{
return " ";
}
virtual QCString trPageIndex()
{
return " ";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.0
//////////////////////////////////////////////////////////////////////////
virtual QCString trNote()
{
return "";
}
virtual QCString trPublicTypes()
{
return " ";
}
virtual QCString trPublicAttribs()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return " ";
}
}
virtual QCString trStaticPublicAttribs()
{
return " ";
}
virtual QCString trProtectedTypes()
{
return " ";
}
virtual QCString trProtectedAttribs()
{
return " ";
}
virtual QCString trStaticProtectedAttribs()
{
return " ";
}
virtual QCString trPrivateTypes()
{
return " ";
}
virtual QCString trPrivateAttribs()
{
return " ";
}
virtual QCString trStaticPrivateAttribs()
{
return " ";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.3
//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a \\todo item */
virtual QCString trTodo()
{
return " ";
}
/*! Used as the header of the todo list */
virtual QCString trTodoList()
{
return " ";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.4
//////////////////////////////////////////////////////////////////////////
virtual QCString trReferencedBy()
{
return " ";
}
virtual QCString trRemarks()
{
return "";
}
virtual QCString trAttention()
{
return "";
}
virtual QCString trInclByDepGraph()
{
return " "
" :";
}
virtual QCString trSince()
{
return "";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.5
//////////////////////////////////////////////////////////////////////////
/*! title of the graph legend page */
virtual QCString trLegendTitle()
{
return " ";
}
/*! page explaining how the dot graph's should be interpreted
* The %A in the text below are to prevent link to classes called "A".
*/
virtual QCString trLegendDocs()
{
return
" "
" doxygen.<p>\n"
" :"
"\\code\n"
"/*! Invisible class because of truncation */\n"
"class Invisible { };\n\n"
"/*! Truncated class, inheritance relation is hidden */\n"
"class Truncated : public Invisible { };\n\n"
"/* Class not documented with doxygen comments */\n"
"class Undocumented { };\n\n"
"/*! Class that is inherited using public inheritance */\n"
"class PublicBase : public Truncated { };\n\n"
"/*! Class that is inherited using protected inheritance */\n"
"class ProtectedBase { };\n\n"
"/*! Class that is inherited using private inheritance */\n"
"class PrivateBase { };\n\n"
"/*! Class that is used by the Inherited class */\n"
"class Used { };\n\n"
"/*! Super class that inherits a number of other classes */\n"
"class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n"
" private PrivateBase,\n"
" public Undocumented\n"
"{\n"
" private:\n"
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
" \\c MAX_DOT_GRAPH_HEIGHT "
" 200 :"
"<p><center><img src=\"graph_legend.gif\"></center>\n"
"<p>\n"
" :\n"
"<ul>\n"
"<li> "
" .\n"
"<li> .\n"
"<li> .\n"
"<li> "
" . % "
" ."
"</ul>\n"
" :\n"
"<ul>\n"
"<li> "
" .\n"
"<li> .\n"
"<li> .\n"
"<li> "
" . () "
" . \n"
"</ul>\n";
}
/*! text for the link to the legend page */
virtual QCString trLegend()
{
return "";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.0
//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a test item */
virtual QCString trTest()
{
return "";
}
/*! Used as the header of the test list */
virtual QCString trTestList()
{
return " ";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.1
//////////////////////////////////////////////////////////////////////////
/*! Used as a section header for KDE-2 IDL methods */
virtual QCString trDCOPMethods()
{
return " DCOP";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.2
//////////////////////////////////////////////////////////////////////////
/*! Used as a section header for IDL properties */
virtual QCString trProperties()
{
return "";
}
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
{
return " ";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.4
//////////////////////////////////////////////////////////////////////////
/*! Used for Java interfaces in the summary section of Java packages */
virtual QCString trInterfaces()
{
return "";
}
/*! Used for Java classes in the summary section of Java packages */
virtual QCString trClasses()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return " ";
}
else
{
return "";
}
}
/*! Used as the title of a Java package */
virtual QCString trPackage(const char *name)
{
return (QCString)" "+name;
}
/*! Title of the package index page */
virtual QCString trPackageList()
{
return " ";
}
/*! The description of the package index page */
virtual QCString trPackageListDescription()
{
return " ( ):";
}
/*! The link name in the Quick links header for each page */
virtual QCString trPackages()
{
return "";
}
/*! Used as a chapter title for Latex & RTF output */
virtual QCString trPackageDocumentation()
{
return " ";
}
/*! Text shown before a multi-line define */
virtual QCString trDefineValue()
{
return ":";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.5
//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a \\bug item */
virtual QCString trBug()
{
return "";
}
/*! Used as the header of the bug list */
virtual QCString trBugList()
{
return " ";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.6
//////////////////////////////////////////////////////////////////////////
/*! Used as ansicpg for RTF file
*
* The following table shows the correlation of Charset name, Charset Value and
* <pre>
* Codepage number:
* Charset Name Charset Value(hex) Codepage number
* ------------------------------------------------------
* DEFAULT_CHARSET 1 (x01)
* SYMBOL_CHARSET 2 (x02)
* OEM_CHARSET 255 (xFF)
* ANSI_CHARSET 0 (x00) 1252
* RUSSIAN_CHARSET 204 (xCC) 1251
* EE_CHARSET 238 (xEE) 1250
* GREEK_CHARSET 161 (xA1) 1253
* TURKISH_CHARSET 162 (xA2) 1254
* BALTIC_CHARSET 186 (xBA) 1257
* HEBREW_CHARSET 177 (xB1) 1255
* ARABIC _CHARSET 178 (xB2) 1256
* SHIFTJIS_CHARSET 128 (x80) 932
* HANGEUL_CHARSET 129 (x81) 949
* GB2313_CHARSET 134 (x86) 936
* CHINESEBIG5_CHARSET 136 (x88) 950
* </pre>
*
*/
virtual QCString trRTFansicp()
{
return "1253";
}
/*! Used as ansicpg for RTF fcharset
* \see trRTFansicp() for a table of possible values.
*/
virtual QCString trRTFCharSet()
{
return "0";
}
/*! Used as header RTF general index */
virtual QCString trRTFGeneralIndex()
{
return "";
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trClass(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+="";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trFile(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trNamespace(bool first_capital, bool singular)
{
QCString result((first_capital ? "Namespace" : "namespace"));
if (!singular) result+="s";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trGroup(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trPage(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trMember(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trField(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trGlobal(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.7
//////////////////////////////////////////////////////////////////////////
/*! This text is generated when the \\author command is used and
* for the author section in man pages. */
virtual QCString trAuthor(bool first_capital, bool singular)
{
QCString result((first_capital ? "" : ""));
if (!singular) result+=""; else result+="";
return result;
}
};
#endif
...@@ -62,11 +62,20 @@ Problem! ...@@ -62,11 +62,20 @@ Problem!
#ifndef TRANSLATOR_SE_H #ifndef TRANSLATOR_SE_H
#define TRANSLATOR_SE_H #define TRANSLATOR_SE_H
#include "translator_adapter.h" class TranslatorSwedish : public TranslatorEnglish
class TranslatorSwedish : public TranslatorAdapter_1_0_0
{ {
public: public:
/*! This method is used to generate a warning message to signal
* the user that the translation of his/her language of choice
* needs updating.
*/
virtual QCString updateNeededMessage()
{
return "Warning: The Swedish translator is really obsolete.\n"
"It was not updated since version 1.0.0. As a result,\n"
"some sentences may appear in English.\n\n";
}
QCString idLanguage() QCString idLanguage()
{ return "swedish"; } { return "swedish"; }
QCString latexBabelPackage() QCString latexBabelPackage()
......
...@@ -869,7 +869,7 @@ QCString tempArgListToString(ArgumentList *al) ...@@ -869,7 +869,7 @@ QCString tempArgListToString(ArgumentList *al)
// compute the HTML anchors for a list of members // compute the HTML anchors for a list of members
void setAnchors(char id,MemberList *ml,int groupId) void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId)
{ {
int count=0; int count=0;
MemberListIterator mli(*ml); MemberListIterator mli(*ml);
...@@ -883,7 +883,8 @@ void setAnchors(char id,MemberList *ml,int groupId) ...@@ -883,7 +883,8 @@ void setAnchors(char id,MemberList *ml,int groupId)
anchor.sprintf("%c%d",id,count++); anchor.sprintf("%c%d",id,count++);
else else
anchor.sprintf("%c%d_%d",id,groupId,count++); anchor.sprintf("%c%d_%d",id,groupId,count++);
//printf("Member %s anchor %s\n",md->name(),anchor.data()); if (cd) anchor.prepend(escapeCharsInString(cd->name(),FALSE));
//printf("Member %s anchor %s\n",md->name().data(),anchor.data());
md->setAnchor(anchor); md->setAnchor(anchor);
} }
} }
...@@ -2878,6 +2879,44 @@ bool hasVisibleRoot(BaseClassList *bcl) ...@@ -2878,6 +2879,44 @@ bool hasVisibleRoot(BaseClassList *bcl)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
QCString escapeCharsInString(const char *name,bool allowDots)
{
QCString result;
char c;
const char *p=name;
while ((c=*p++)!=0)
{
switch(c)
{
case '_': result+="__"; break;
case '-': result+="-"; break;
case ':': result+="_1"; break;
case '/': result+="_2"; break;
case '<': result+="_3"; break;
case '>': result+="_4"; break;
case '*': result+="_5"; break;
case '&': result+="_6"; break;
case '|': result+="_7"; break;
case '.': if (allowDots) result+="."; else result+="_8"; break;
case '!': result+="_9"; break;
case ',': result+="_00"; break;
case ' ': result+="_01"; break;
default:
if (Config_getBool("CASE_SENSE_NAMES") || !isupper(c))
{
result+=c;
}
else
{
result+="_";
result+=tolower(c);
}
break;
}
}
return result;
}
/*! This function determines the file name on disk of an item /*! This function determines the file name on disk of an item
* given its name, which could be a class name with templete * given its name, which could be a class name with templete
* arguments, so special characters need to be escaped. * arguments, so special characters need to be escaped.
...@@ -2906,41 +2945,7 @@ QCString convertNameToFile(const char *name,bool allowDots) ...@@ -2906,41 +2945,7 @@ QCString convertNameToFile(const char *name,bool allowDots)
} }
else // long names else // long names
{ {
return escapeCharsInString(name,allowDots);
QCString result;
char c;
const char *p=name;
while ((c=*p++)!=0)
{
switch(c)
{
case '_': result+="__"; break;
case '-': result+="-"; break;
case ':': result+="_1"; break;
case '/': result+="_2"; break;
case '<': result+="_3"; break;
case '>': result+="_4"; break;
case '*': result+="_5"; break;
case '&': result+="_6"; break;
case '|': result+="_7"; break;
case '.': if (allowDots) result+="."; else result+="_8"; break;
case '!': result+="_9"; break;
case ',': result+="_00"; break;
case ' ': result+="_01"; break;
default:
if (Config_getBool("CASE_SENSE_NAMES") || !isupper(c))
{
result+=c;
}
else
{
result+="_";
result+=tolower(c);
}
break;
}
}
return result;
} }
} }
......
...@@ -73,7 +73,7 @@ class TextGeneratorOLImpl : public TextGeneratorIntf ...@@ -73,7 +73,7 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
extern void linkifyText(const TextGeneratorIntf &ol,const char *clName,const char *name, extern void linkifyText(const TextGeneratorIntf &ol,const char *clName,const char *name,
const char *text,bool autoBreak=FALSE,bool external=TRUE); const char *text,bool autoBreak=FALSE,bool external=TRUE);
extern void setAnchors(char id,MemberList *ml,int groupId=-1); extern void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId=-1);
extern QCString fileToString(const char *name,bool filter=FALSE); extern QCString fileToString(const char *name,bool filter=FALSE);
extern QCString dateToString(bool); extern QCString dateToString(bool);
extern bool getDefs(const QCString &scopeName, extern bool getDefs(const QCString &scopeName,
...@@ -172,6 +172,7 @@ void addRelatedPage(const char *name,const QCString &ptitle, ...@@ -172,6 +172,7 @@ void addRelatedPage(const char *name,const QCString &ptitle,
int todoId,int testId,int bugId,GroupDef *gd=0, int todoId,int testId,int bugId,GroupDef *gd=0,
TagInfo *tagInfo=0 TagInfo *tagInfo=0
); );
QCString escapeCharsInString(const char *name,bool allowDots);
#endif #endif
...@@ -37,7 +37,14 @@ ...@@ -37,7 +37,14 @@
#include <qfile.h> #include <qfile.h>
#include <qtextstream.h> #include <qtextstream.h>
#define XML_DB(x) // no debug info
#define XML_DB(x) do {} while(0)
// debug to stdout
//#define XML_DB(x) printf x
// debug inside output
//#define XML_DB(x) QCString __t;__t.sprintf x;m_t << __t
QCString sectionTypeToString(BaseOutputDocInterface::SectionTypes t) QCString sectionTypeToString(BaseOutputDocInterface::SectionTypes t)
{ {
...@@ -76,14 +83,15 @@ inline void writeXMLString(QTextStream &t,const char *s) ...@@ -76,14 +83,15 @@ inline void writeXMLString(QTextStream &t,const char *s)
void writeXMLLink(QTextStream &t,const char *extRef,const char *compoundId, void writeXMLLink(QTextStream &t,const char *extRef,const char *compoundId,
const char *anchorId,const char *text) const char *anchorId,const char *text)
{ {
t << "<ref idref=\"" << compoundId << "\""; t << "<ref idref=\"" << compoundId;
if (extRef) if (anchorId)
{ {
t << " external=\"" << extRef << "\""; t << "_1" << anchorId;
} }
if (anchorId) t << "\"";
if (extRef)
{ {
t << " anchor=\"" << anchorId << "\""; t << " external=\"" << extRef << "\"";
} }
t << ">"; t << ">";
writeXMLString(t,text); writeXMLString(t,text);
...@@ -166,7 +174,6 @@ template<class T> class ValStack ...@@ -166,7 +174,6 @@ template<class T> class ValStack
* Its methods are called when some XML text or markup * Its methods are called when some XML text or markup
* needs to be written. * needs to be written.
*/ */
// TODO: htmlonly, latexonly
class XMLGenerator : public OutputDocInterface class XMLGenerator : public OutputDocInterface
{ {
public: public:
...@@ -179,13 +186,13 @@ class XMLGenerator : public OutputDocInterface ...@@ -179,13 +186,13 @@ class XMLGenerator : public OutputDocInterface
{ {
m_inParStack.top() = TRUE; m_inParStack.top() = TRUE;
m_t << "<para>" << endl; m_t << "<para>" << endl;
XML_DB(("start par at level=%d\n",m_inParStack.count());) XML_DB(("start par at level=%d\n",m_inParStack.count()));
} }
else if (m_inParStack.isEmpty()) else if (m_inParStack.isEmpty())
{ {
m_inParStack.push(TRUE); m_inParStack.push(TRUE);
m_t << "<para>" << endl; m_t << "<para>" << endl;
XML_DB(("start par at level=%d\n",m_inParStack.count());) XML_DB(("start par at level=%d\n",m_inParStack.count()));
} }
} }
void endParMode() void endParMode()
...@@ -194,24 +201,24 @@ class XMLGenerator : public OutputDocInterface ...@@ -194,24 +201,24 @@ class XMLGenerator : public OutputDocInterface
{ {
m_inParStack.top() = FALSE; m_inParStack.top() = FALSE;
m_t << "</para>" << endl; m_t << "</para>" << endl;
XML_DB(("end par at level=%d\n",m_inParStack.count());) XML_DB(("end par at level=%d\n",m_inParStack.count()));
} }
} }
void startNestedPar() void startNestedPar()
{ {
m_inParStack.push(FALSE); m_inParStack.push(FALSE);
XML_DB(("enter par level=%d\n",m_inParStack.count());) XML_DB(("enter par level=%d\n",m_inParStack.count()));
} }
void endNestedPar() void endNestedPar()
{ {
XML_DB(("leave par level=%d\n",m_inParStack.count());) XML_DB(("leave par level=%d\n",m_inParStack.count()));
if (m_inParStack.pop()) if (m_inParStack.pop())
{ {
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
else else
{ {
XML_DB(("ILLEGAL par level!\n");) //XML_DB(("ILLEGAL par level!\n"));
} }
} }
...@@ -219,35 +226,37 @@ class XMLGenerator : public OutputDocInterface ...@@ -219,35 +226,37 @@ class XMLGenerator : public OutputDocInterface
void docify(const char *s) void docify(const char *s)
{ {
XML_DB(("(docify \"%s\")\n",s));
startParMode(); startParMode();
writeXMLString(m_t,s); writeXMLString(m_t,s);
} }
void writeChar(char c) void writeChar(char c)
{ {
startParMode();
char s[2];s[0]=c;s[1]=0; char s[2];s[0]=c;s[1]=0;
docify(s); docify(s);
} }
void writeString(const char *text) void writeString(const char *text)
{ {
startParMode();
//m_t << text; //m_t << text;
docify(text); docify(text);
} }
void startItemList() void startItemList()
{ {
XML_DB(("(startItemList)\n"));
startParMode(); startParMode();
m_t << "<itemizedlist>" << endl;; m_t << "<itemizedlist>" << endl;;
m_inListStack.push(TRUE); m_inListStack.push(TRUE);
} }
void startEnumList() void startEnumList()
{ {
XML_DB(("(startEnumList)\n"));
startParMode(); startParMode();
m_t << "<orderedlist>"; m_t << "<orderedlist>";
m_inListStack.push(TRUE); m_inListStack.push(TRUE);
} }
void writeListItem() void writeListItem()
{ {
XML_DB(("(writeListItem)\n"));
if (!m_inListStack.isEmpty() && m_inListStack.top()) // first element if (!m_inListStack.isEmpty() && m_inListStack.top()) // first element
{ {
m_inListStack.top()=FALSE; m_inListStack.top()=FALSE;
...@@ -263,6 +272,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -263,6 +272,7 @@ class XMLGenerator : public OutputDocInterface
} }
void endItemList() void endItemList()
{ {
XML_DB(("(endItemList)\n"));
if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element
{ {
endParMode(); endParMode();
...@@ -273,6 +283,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -273,6 +283,7 @@ class XMLGenerator : public OutputDocInterface
} }
void endEnumList() void endEnumList()
{ {
XML_DB(("(endEnumList)\n"));
if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element
{ {
endParMode(); endParMode();
...@@ -283,65 +294,81 @@ class XMLGenerator : public OutputDocInterface ...@@ -283,65 +294,81 @@ class XMLGenerator : public OutputDocInterface
} }
void newParagraph() void newParagraph()
{ {
XML_DB(("(newParagraph)\n"));
endParMode(); endParMode();
startParMode(); startParMode();
} }
void startBold() void startBold()
{ {
XML_DB(("(startBold)\n"));
startParMode(); startParMode();
m_t << "<bold>"; // non DocBook m_t << "<bold>"; // non DocBook
} }
void endBold() void endBold()
{ {
XML_DB(("(endBold)\n"));
m_t << "</bold>"; // non DocBook m_t << "</bold>"; // non DocBook
} }
void startTypewriter() void startTypewriter()
{ {
XML_DB(("(startTypewriter)\n"));
startParMode(); startParMode();
m_t << "<computeroutput>"; m_t << "<computeroutput>";
} }
void endTypewriter() void endTypewriter()
{ {
XML_DB(("(endTypewriter)\n"));
m_t << "</computeroutput>"; m_t << "</computeroutput>";
} }
void startEmphasis() void startEmphasis()
{ {
XML_DB(("(startEmphasis)\n"));
startParMode(); startParMode();
m_t << "<emphasis>"; m_t << "<emphasis>";
} }
void endEmphasis() void endEmphasis()
{ {
XML_DB(("(endEmphasis)\n"));
m_t << "</emphasis>"; m_t << "</emphasis>";
} }
void startCodeFragment() void startCodeFragment()
{ {
XML_DB(("(startCodeFragment)\n"));
startParMode();
m_t << "<programlisting>"; m_t << "<programlisting>";
} }
void endCodeFragment() void endCodeFragment()
{ {
XML_DB(("(endCodeFragment)\n"));
m_t << "</programlisting>"; m_t << "</programlisting>";
} }
void startPreFragment() void startPreFragment()
{ {
XML_DB(("(startPreFragment)\n"));
startParMode();
m_t << "<programlisting>"; m_t << "<programlisting>";
} }
void endPreFragment() void endPreFragment()
{ {
XML_DB(("(endPreFragment)\n"));
m_t << "</programlisting>"; m_t << "</programlisting>";
} }
void writeRuler() void writeRuler()
{ {
XML_DB(("(startParMode)\n"));
startParMode(); startParMode();
m_t << "<hruler/>"; m_t << "<hruler/>";
} }
void startDescription() void startDescription()
{ {
XML_DB(("(startDescription)\n"));
startParMode(); startParMode();
m_t << "<variablelist>"; m_t << "<variablelist>";
m_inListStack.push(TRUE); m_inListStack.push(TRUE);
} }
void endDescription() void endDescription()
{ {
XML_DB(("(endDescription)\n"));
if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element
{ {
endNestedPar(); endNestedPar();
...@@ -352,6 +379,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -352,6 +379,7 @@ class XMLGenerator : public OutputDocInterface
} }
void startDescItem() void startDescItem()
{ {
XML_DB(("(startDescItem)\n"));
if (!m_inListStack.isEmpty() && m_inListStack.top()) // first element if (!m_inListStack.isEmpty() && m_inListStack.top()) // first element
{ {
m_inListStack.top()=FALSE; m_inListStack.top()=FALSE;
...@@ -365,22 +393,28 @@ class XMLGenerator : public OutputDocInterface ...@@ -365,22 +393,28 @@ class XMLGenerator : public OutputDocInterface
} }
void endDescItem() void endDescItem()
{ {
XML_DB(("(endDescItem)\n"));
m_t << "</term></varlistentry><listitem>"; m_t << "</term></varlistentry><listitem>";
startNestedPar(); startNestedPar();
} }
void startDescList(SectionTypes st) void startDescList(SectionTypes st)
{ {
startParMode(); XML_DB(("(startDescList)\n"));
endParMode();
m_t << "<simplesect kind=\"" << sectionTypeToString(st); m_t << "<simplesect kind=\"" << sectionTypeToString(st);
m_t << "\"><title>"; m_t << "\"><title>";
startNestedPar();
m_inParStack.top() = TRUE;
} }
void endDescList() void endDescList()
{ {
XML_DB(("(endDescList)\n"));
endNestedPar(); endNestedPar();
m_t << "</simplesect>"; m_t << "</simplesect>";
} }
void startParamList(ParamListTypes t) void startParamList(ParamListTypes t)
{ {
XML_DB(("(startParamList)\n"));
startParMode(); startParMode();
QCString kind; QCString kind;
switch(t) switch(t)
...@@ -390,150 +424,209 @@ class XMLGenerator : public OutputDocInterface ...@@ -390,150 +424,209 @@ class XMLGenerator : public OutputDocInterface
case Exception: kind="exception"; break; case Exception: kind="exception"; break;
} }
m_t << "<parameterlist kind=\"" << kind << "\"><title>"; // non DocBook m_t << "<parameterlist kind=\"" << kind << "\"><title>"; // non DocBook
startNestedPar();
m_inParStack.top() = TRUE;
m_inParamList = TRUE; m_inParamList = TRUE;
} }
void endParamList() void endParamList()
{ {
XML_DB(("(endParamList)\n"));
m_inParamList = FALSE; m_inParamList = FALSE;
m_t << "</parameterlist>"; m_t << "</parameterlist>";
} }
void endDescTitle() void endDescTitle()
{ {
m_inParStack.top() = FALSE;
endNestedPar();
XML_DB(("(endDescTitle)\n"));
m_t << "</title>"; m_t << "</title>";
if (!m_inParamList) startNestedPar(); if (!m_inParamList) startNestedPar();
} }
void writeDescItem() { } void writeDescItem()
void startDescTable() { } {
void endDescTable() { } XML_DB(("(writeDescItem)\n"));
}
void startDescTable()
{
XML_DB(("(startDescTable)\n"));
}
void endDescTable()
{
XML_DB(("(endDescTable)\n"));
}
void startDescTableTitle() void startDescTableTitle()
{ {
XML_DB(("(startDescTableTitle)\n"));
m_t << "<parametername>"; // non docbook m_t << "<parametername>"; // non docbook
} }
void endDescTableTitle() void endDescTableTitle()
{ {
XML_DB(("(endDescTableTitle)\n"));
m_t << "</parametername>"; // non docbook m_t << "</parametername>"; // non docbook
} }
void startDescTableData() void startDescTableData()
{ {
XML_DB(("(startDescTableData)\n"));
m_t << "<parameterdescription>"; // non docbook m_t << "<parameterdescription>"; // non docbook
startNestedPar(); startNestedPar();
} }
void endDescTableData() void endDescTableData()
{ {
XML_DB(("(endDescTableData)\n"));
endNestedPar(); endNestedPar();
m_t << "</parameterdescription>"; // non docbook m_t << "</parameterdescription>"; // non docbook
} }
void lineBreak() void lineBreak()
{ {
XML_DB(("(lineBreak)\n"));
startParMode(); startParMode();
m_t << "<linebreak/>"; // non docbook m_t << "<linebreak/>"; // non docbook
} }
void writeNonBreakableSpace(int num) void writeNonBreakableSpace(int num)
{ {
XML_DB(("(writeNonBreakableSpace)\n"));
int i;for (i=0;i<num;i++) m_t << "&nbsp;"; int i;for (i=0;i<num;i++) m_t << "&nbsp;";
} }
void writeObjectLink(const char *ref,const char *file, void writeObjectLink(const char *ref,const char *file,
const char *anchor, const char *text) const char *anchor, const char *text)
{ {
XML_DB(("(writeObjectLink)\n"));
startParMode(); startParMode();
writeXMLLink(m_t,ref,file,anchor,text); writeXMLLink(m_t,ref,file,anchor,text);
} }
void writeCodeLink(const char *ref,const char *file, void writeCodeLink(const char *ref,const char *file,
const char *anchor,const char *text) const char *anchor,const char *text)
{ {
XML_DB(("(writeCodeLink)\n"));
writeXMLLink(m_t,ref,file,anchor,text); writeXMLLink(m_t,ref,file,anchor,text);
} }
void startHtmlLink(const char *url) void startHtmlLink(const char *url)
{ {
XML_DB(("(startHtmlLink)\n"));
startParMode(); startParMode();
m_t << "<ulink url=\"" << url << "\">"; m_t << "<ulink url=\"" << url << "\">";
} }
void endHtmlLink() void endHtmlLink()
{ {
XML_DB(("(endHtmlLink)\n"));
m_t << "</ulink>"; m_t << "</ulink>";
} }
void writeMailLink(const char *url) void writeMailLink(const char *url)
{ {
XML_DB(("(writeMailLink)\n"));
startParMode(); startParMode();
m_t << "<email>"; m_t << "<email>";
docify(url); docify(url);
m_t << "</email>"; m_t << "</email>";
} }
void startSection(const char *id,const char *,bool) void startSection(const char *id,const char *,bool subsection)
{ {
m_t << "<sect1 id=\"" << id << "\">"; XML_DB(("(startSection)\n"));
endParMode();
m_t << "<sect";
if (subsection) m_t << "2"; else m_t << "1";
m_t << " id=\"" << id << "\">";
startNestedPar();
m_inParStack.top() = TRUE;
} }
void endSection(const char *,bool) void endSection(const char *,bool subsection)
{ {
m_t << "</sect1>"; XML_DB(("(endSection)\n"));
m_t << "</sect";
if (subsection) m_t << "2"; else m_t << "1";
m_t << ">";
m_inParStack.top() = FALSE;
endNestedPar();
} }
void startSubsection() void startSubsection()
{ {
XML_DB(("(startSubsection)\n"));
endParMode();
m_t << "<sect2>"; m_t << "<sect2>";
startNestedPar();
m_inParStack.top() = TRUE;
} }
void endSubsection() void endSubsection()
{ {
XML_DB(("(endSubsection)\n"));
m_t << "</sect2>"; m_t << "</sect2>";
m_inParStack.top() = FALSE;
endNestedPar();
} }
void startSubsubsection() void startSubsubsection()
{ {
XML_DB(("(startSubsubsection)\n"));
endParMode();
m_t << "<sect3>"; m_t << "<sect3>";
startNestedPar();
m_inParStack.top() = TRUE;
} }
void endSubsubsection() void endSubsubsection()
{ {
XML_DB(("(endSubsubsection)\n"));
m_t << "</sect3>"; m_t << "</sect3>";
m_inParStack.top() = FALSE;
endNestedPar();
} }
void startCenter() void startCenter()
{ {
XML_DB(("(startCenter)\n"));
startParMode(); startParMode();
m_t << "<center>"; // non docbook m_t << "<center>"; // non docbook
} }
void endCenter() void endCenter()
{ {
XML_DB(("(endCenter)\n"));
m_t << "</center>"; // non docbook m_t << "</center>"; // non docbook
} }
void startSmall() void startSmall()
{ {
XML_DB(("(startSmall)\n"));
startParMode(); startParMode();
m_t << "<small>"; // non docbook m_t << "<small>"; // non docbook
} }
void endSmall() void endSmall()
{ {
XML_DB(("(endSmall)\n"));
m_t << "</small>"; // non docbook m_t << "</small>"; // non docbook
} }
void startSubscript() void startSubscript()
{ {
XML_DB(("(startSubscript)\n"));
startParMode(); startParMode();
m_t << "<subscript>"; m_t << "<subscript>";
} }
void endSubscript() void endSubscript()
{ {
XML_DB(("(endSubscript)\n"));
m_t << "</subscript>"; m_t << "</subscript>";
} }
void startSuperscript() void startSuperscript()
{ {
XML_DB(("(startSuperscript)\n"));
startParMode(); startParMode();
m_t << "<superscript>"; m_t << "<superscript>";
} }
void endSuperscript() void endSuperscript()
{ {
XML_DB(("(endSuperscript)\n"));
m_t << "</superscript>"; m_t << "</superscript>";
} }
void startTable(int cols) void startTable(int cols)
{ {
XML_DB(("startTable\n");) XML_DB(("startTable\n"));
startParMode(); startParMode();
m_t << "<table cols=\"" << cols << "\">\n"; m_t << "<table cols=\"" << cols << "\">\n";
} }
void endTable() void endTable()
{ {
XML_DB(("endTable\n");) XML_DB(("endTable\n"));
m_t << "</row>\n</table>"; m_t << "</row>\n</table>";
} }
void nextTableRow() void nextTableRow()
{ {
XML_DB(("nextTableRow\n");) XML_DB(("(nextTableRow)\n"));
m_t << "<row><entry>"; m_t << "<row><entry>";
// we need manually add a para here because cells are // we need manually add a para here because cells are
...@@ -543,12 +636,12 @@ class XMLGenerator : public OutputDocInterface ...@@ -543,12 +636,12 @@ class XMLGenerator : public OutputDocInterface
} }
void endTableRow() void endTableRow()
{ {
XML_DB(("endTableRow\n");) XML_DB(("(endTableRow)\n"));
m_t << "</row>" << endl; m_t << "</row>" << endl;
} }
void nextTableColumn() void nextTableColumn()
{ {
XML_DB(("nextTableColumn\n");) XML_DB(("(nextTableColumn)\n"));
m_t << "<entry>"; m_t << "<entry>";
// we need manually add a para here because cells are // we need manually add a para here because cells are
...@@ -558,7 +651,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -558,7 +651,7 @@ class XMLGenerator : public OutputDocInterface
} }
void endTableColumn() void endTableColumn()
{ {
XML_DB(("endTableColumn\n");) XML_DB(("(endTableColumn)\n"));
// we need manually add a para here because cells are // we need manually add a para here because cells are
// parsed before the table is generated, and thus // parsed before the table is generated, and thus
// are already parsed as if they are inside a paragraph. // are already parsed as if they are inside a paragraph.
...@@ -579,20 +672,28 @@ class XMLGenerator : public OutputDocInterface ...@@ -579,20 +672,28 @@ class XMLGenerator : public OutputDocInterface
void startTitle() void startTitle()
{ {
XML_DB(("(startTitle)\n"));
m_t << "<title>"; m_t << "<title>";
startNestedPar();
m_inParStack.top() = TRUE;
} }
void endTitle() void endTitle()
{ {
m_inParStack.top() = FALSE;
endNestedPar();
XML_DB(("(endTitle)\n"));
m_t << "</title>" << endl; m_t << "</title>" << endl;
} }
void writeAnchor(const char *id,const char *name) void writeAnchor(const char *id,const char *name)
{ {
XML_DB(("(writeAnchor)\n"));
startParMode(); startParMode();
m_t << "<anchor id=\"" << id << "_" << name << "\"/>"; m_t << "<anchor id=\"" << id << "_" << name << "\"/>";
} }
void writeSectionRef(const char *,const char *id, void writeSectionRef(const char *,const char *id,
const char *name,const char *text) const char *name,const char *text)
{ {
XML_DB(("(writeSectionRef)\n"));
startParMode(); startParMode();
m_t << "<link linkend=\"" << id << "_" << name << "\">"; m_t << "<link linkend=\"" << id << "_" << name << "\">";
docify(text); docify(text);
...@@ -604,6 +705,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -604,6 +705,7 @@ class XMLGenerator : public OutputDocInterface
} }
void addIndexItem(const char *primaryie,const char *secondaryie) void addIndexItem(const char *primaryie,const char *secondaryie)
{ {
XML_DB(("(addIndexItem)\n"));
startParMode(); startParMode();
m_t << "<indexentry><primaryie>"; m_t << "<indexentry><primaryie>";
docify(primaryie); docify(primaryie);
...@@ -613,6 +715,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -613,6 +715,7 @@ class XMLGenerator : public OutputDocInterface
} }
void writeFormula(const char *id,const char *text) void writeFormula(const char *id,const char *text)
{ {
XML_DB(("(writeFormula)\n"));
startParMode(); startParMode();
m_t << "<formula id=\"" << id << "\">"; // non Docbook m_t << "<formula id=\"" << id << "\">"; // non Docbook
docify(text); docify(text);
...@@ -620,6 +723,7 @@ class XMLGenerator : public OutputDocInterface ...@@ -620,6 +723,7 @@ class XMLGenerator : public OutputDocInterface
} }
void startImage(const char *name,const char *size,bool /*caption*/) void startImage(const char *name,const char *size,bool /*caption*/)
{ {
XML_DB(("(startImage)\n"));
startParMode(); startParMode();
m_t << "<image name=\"" << name << "\""; m_t << "<image name=\"" << name << "\"";
if (size) m_t << " size=\"" << size << "\""; if (size) m_t << " size=\"" << size << "\"";
...@@ -627,35 +731,43 @@ class XMLGenerator : public OutputDocInterface ...@@ -627,35 +731,43 @@ class XMLGenerator : public OutputDocInterface
} }
void endImage(bool) void endImage(bool)
{ {
XML_DB(("(endImage)\n"));
m_t << "</image>"; m_t << "</image>";
} }
void startDotFile(const char *name,bool /*caption*/) void startDotFile(const char *name,bool /*caption*/)
{ {
XML_DB(("(startDotFile)\n"));
startParMode(); startParMode();
m_t << "<dotfile name=\"" << name << "\">"; // non docbook m_t << "<dotfile name=\"" << name << "\">"; // non docbook
} }
void endDotFile(bool) void endDotFile(bool)
{ {
XML_DB(("(endDotFile)\n"));
m_t << "</dotfile>"; m_t << "</dotfile>";
} }
void startTextLink(const char *name,const char *anchor) void startTextLink(const char *name,const char *anchor)
{ {
XML_DB(("(startTextLink)\n"));
startParMode(); startParMode();
m_t << "<ulink url=\"" << name << "#" << anchor << "\">"; m_t << "<ulink url=\"" << name << "#" << anchor << "\">";
} }
void endTextLink() void endTextLink()
{ {
XML_DB(("(endTextLink)\n"));
m_t << "<ulink>"; m_t << "<ulink>";
} }
void startPageRef() void startPageRef()
{ {
XML_DB(("(startPageRef)\n"));
} }
void endPageRef(const char *,const char *) void endPageRef(const char *,const char *)
{ {
XML_DB(("(endPageRef)\n"));
} }
void writeLineNumber(const char *,const char *file, // TODO: support external references void writeLineNumber(const char *,const char *file, // TODO: support external references
const char *anchor,int l) const char *anchor,int l)
{ {
XML_DB(("(writeLineNumber)\n"));
m_t << "<linenumber"; m_t << "<linenumber";
m_t << " line=\"" << l << "\""; m_t << " line=\"" << l << "\"";
if (file) if (file)
...@@ -666,34 +778,61 @@ class XMLGenerator : public OutputDocInterface ...@@ -666,34 +778,61 @@ class XMLGenerator : public OutputDocInterface
} }
void startCodeLine() void startCodeLine()
{ {
XML_DB(("(startCodeLine)\n"));
startParMode(); startParMode();
m_t << "<codeline>"; // non DocBook m_t << "<codeline>"; // non DocBook
} }
void endCodeLine() void endCodeLine()
{ {
XML_DB(("(endCodeLine)\n"));
m_t << "</codeline>" << endl; // non DocBook m_t << "</codeline>" << endl; // non DocBook
} }
void startCodeAnchor(const char *id) void startCodeAnchor(const char *id)
{ {
XML_DB(("(startCodeAnchor)\n"));
startParMode(); startParMode();
m_t << "<anchor id=\"" << id << "\">"; m_t << "<anchor id=\"" << id << "\">";
} }
void endCodeAnchor() void endCodeAnchor()
{ {
XML_DB(("(endCodeAnchor)\n"));
m_t << "</anchor>"; m_t << "</anchor>";
} }
void startFontClass(const char *colorClass) void startFontClass(const char *colorClass)
{ {
XML_DB(("(startFontClass)\n"));
m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
} }
void endFontClass() void endFontClass()
{ {
XML_DB(("(endFontClass)\n"));
m_t << "</highlight>"; // non DocBook m_t << "</highlight>"; // non DocBook
} }
void codify(const char *text) void codify(const char *text)
{ {
XML_DB(("(codify \"%s\")\n",text));
docify(text); docify(text);
} }
void startHtmlOnly()
{
XML_DB(("(startHtmlOnly)\n"));
m_t << "<htmlonly>" << endl;
}
void endHtmlOnly()
{
XML_DB(("(endHtmlOnly)\n"));
m_t << "</htmlonly>" << endl;
}
void startLatexOnly()
{
XML_DB(("(startLatexOnly)\n"));
m_t << "<latexonly>" << endl;
}
void endLatexOnly()
{
XML_DB(("(endLatexOnly)\n"));
m_t << "</latexonly>" << endl;
}
// Generator specific functions // Generator specific functions
...@@ -782,15 +921,16 @@ static void writeXMLDocBlock(QTextStream &t, ...@@ -782,15 +921,16 @@ static void writeXMLDocBlock(QTextStream &t,
const QCString &name, const QCString &name,
const QCString &text) const QCString &text)
{ {
if (text.stripWhiteSpace().isEmpty()) return; QCString stext = text.stripWhiteSpace();
if (text.isEmpty()) return;
XMLGenerator *xmlGen = new XMLGenerator; XMLGenerator *xmlGen = new XMLGenerator;
xmlGen->startParMode(); //xmlGen->startParMode();
parseDoc(*xmlGen, parseDoc(*xmlGen,
fileName, // input definition file fileName, // input definition file
lineNr, // input definition line lineNr, // input definition line
scope, // scope (which should not be linked to) scope, // scope (which should not be linked to)
name, // member (which should not be linked to) name, // member (which should not be linked to)
text+"\n" // actual text stext+"\n" // actual text
); );
xmlGen->endParMode(); xmlGen->endParMode();
t << xmlGen->getContents(); t << xmlGen->getContents();
...@@ -812,7 +952,39 @@ void writeXMLCodeBlock(QTextStream &t,FileDef *fd) ...@@ -812,7 +952,39 @@ void writeXMLCodeBlock(QTextStream &t,FileDef *fd)
delete xmlGen; delete xmlGen;
} }
static void writeMemberReference(QTextStream &t,Definition *def,MemberDef *rmd,const char *tagName)
{
QCString scope = rmd->getScopeString();
QCString name = rmd->name();
if (!scope.isEmpty() && scope!=def->name())
{
name.prepend(scope+"::");
}
Definition *d = rmd->getOuterScope();
if (d==Doxygen::globalScope) d=rmd->getBodyDef();
if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
// link to definition in code
{
t << " <" << tagName << " id=\"";
t << rmd->getBodyDef()->getOutputFileBase()
<< "_1" // encoded `:' character (see util.cpp:convertNameToFile)
<< rmd->anchor()
<< "\">";
writeXMLString(t,name);
t << "</" << tagName << ">" << endl;
}
else if (rmd->isLinkable() && d && d->isLinkable())
// link to declaration in documentation (in absense of a definition)
{
t << " <" << tagName << " id=\"";
t << d->getOutputFileBase()
<< "_1" // encoded `:' character (see util.cpp:convertNameToFile)
<< rmd->anchor()
<< "\">";
writeXMLString(t,name);
t << "</" << tagName << ">" << endl;
}
}
static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def)
{ {
...@@ -894,7 +1066,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) ...@@ -894,7 +1066,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def)
md->memberType()!=MemberDef::Enumeration md->memberType()!=MemberDef::Enumeration
) )
{ {
QCString typeStr = replaceAnonymousScopes(md->typeString()); QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString());
t << " <type>"; t << " <type>";
linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),typeStr); linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),typeStr);
t << "</type>" << endl; t << "</type>" << endl;
...@@ -1035,7 +1207,13 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) ...@@ -1035,7 +1207,13 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def)
{ {
t << " <location file=\"" t << " <location file=\""
<< md->getDefFileName() << "\" line=\"" << md->getDefFileName() << "\" line=\""
<< md->getDefLine() << "\"/>" << endl; << md->getDefLine() << "\"";
if (md->getStartBodyLine()!=-1)
{
t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
<< md->getEndBodyLine() << "\"";
}
t << "/>" << endl;
} }
//printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers()); //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
...@@ -1045,24 +1223,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) ...@@ -1045,24 +1223,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def)
MemberDef *rmd; MemberDef *rmd;
for (mdi.toFirst();(rmd=mdi.current());++mdi) for (mdi.toFirst();(rmd=mdi.current());++mdi)
{ {
if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) writeMemberReference(t,def,rmd,"references");
{
t << " <references id=\"";
t << rmd->getBodyDef()->getOutputFileBase()
<< "_1" // encoded `:' character (see util.cpp:convertNameToFile)
<< rmd->anchor()
<< "\" line=\""
<< rmd->getStartBodyLine()
<< "\">";
QCString scope = rmd->getScopeString();
QCString name = rmd->name();
if (!scope.isEmpty() && scope!=def->name())
{
name.prepend(scope+"::");
}
writeXMLString(t,name);
t << "</references>" << endl;
}
} }
} }
if (md->getReferencedByMembers()) if (md->getReferencedByMembers())
...@@ -1071,24 +1232,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) ...@@ -1071,24 +1232,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def)
MemberDef *rmd; MemberDef *rmd;
for (mdi.toFirst();(rmd=mdi.current());++mdi) for (mdi.toFirst();(rmd=mdi.current());++mdi)
{ {
if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) writeMemberReference(t,def,rmd,"referencedby");
{
t << " <referencedby id=\"";
t << rmd->getBodyDef()->getOutputFileBase()
<< "_1" // encoded `:' character (see util.cpp:convertNameToFile)
<< rmd->anchor()
<< "\" line=\""
<< rmd->getStartBodyLine()
<< "\">";
QCString scope = rmd->getScopeString();
QCString name = rmd->name();
if (!scope.isEmpty() && scope!=def->name())
{
name.prepend(scope+"::");
}
writeXMLString(t,name);
t << "</referencedby>" << endl;
}
} }
} }
...@@ -1256,9 +1400,15 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &t) ...@@ -1256,9 +1400,15 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &t)
collaborationGraph.writeXML(t); collaborationGraph.writeXML(t);
t << " </collaborationgraph>" << endl; t << " </collaborationgraph>" << endl;
} }
t << " <location file=\"" t << " <location file=\""
<< cd->getDefFileName() << "\" line=\"" << cd->getDefFileName() << "\" line=\""
<< cd->getDefLine() << "\"/>" << endl; << cd->getDefLine() << "\"";
if (cd->getStartBodyLine()!=-1)
{
t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
<< cd->getEndBodyLine() << "\"";
}
t << "/>" << endl;
t << " </compounddef>" << endl; t << " </compounddef>" << endl;
} }
...@@ -1461,7 +1611,7 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &t) ...@@ -1461,7 +1611,7 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &t)
t << " <compounddef id=\"" t << " <compounddef id=\""
<< gd->getOutputFileBase() << "\" kind=\"group\">" << endl; << gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
t << " <name>" << convertToXML(gd->name()) << "</name>" << endl; t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl;
t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl; t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
FileList *fl = gd->getFiles(); FileList *fl = gd->getFiles();
...@@ -1540,8 +1690,8 @@ static void generateXMLForPage(PageInfo *pi,QTextStream &t) ...@@ -1540,8 +1690,8 @@ static void generateXMLForPage(PageInfo *pi,QTextStream &t)
t << " <compounddef id=\""; t << " <compounddef id=\"";
if (Config_getBool("CASE_SENSE_NAMES")) t << pi->name; else t << pi->name.lower(); if (Config_getBool("CASE_SENSE_NAMES")) t << pi->name; else t << pi->name.lower();
t << "\">" << endl; t << "\" kind=\"page\">" << endl;
t << " <name>" << pi->name << "</name>" << endl; t << " <compoundname>" << pi->name << "</compoundname>" << endl;
SectionInfo *si = Doxygen::sectionDict.find(pi->name); SectionInfo *si = Doxygen::sectionDict.find(pi->name);
if (si) if (si)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment