summaryrefslogtreecommitdiffstats
path: root/quanta/src/dtds.h
blob: 1e26f71289afff7e1c6ae69fff6d287a20d5ac5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
/***************************************************************************
                          dtds.h  -  description
                             -------------------
    begin                : 12.02.2004  (extract from quanta_init and others)

    copyright            : (C) 2000 by Dmitry Poplavsky & Alexander Yakovlev <[email protected],[email protected]>
                           (C) 2001-2003 by Andras Mantia <[email protected]>
                           (C) 2000, 2003 by Eric Laffoon <[email protected]>
                           (C) 2004 by Jens Herden <jhe at epost.de>
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; version 2 of the License.               *
 *                                                                         *
 ***************************************************************************/

#ifndef DTDS_H
#define DTDS_H

// application specific includes
#include "qtag.h"
#include "qobject.h"
#include "qfile.h"

//qt includes
#include <qdict.h>

//kde includes
#include <kdebug.h>


class QDomNode;
class QDomDocument;
class QTag;
class QString;
class QStringList;
class KConfig;
struct DTDStruct;


/** @short This class manages the DTD's for Quanta.
 *
 *  The constructor only loads the necessary information from the description.rc file.
 *  The rest is later loaded on demand of the find() function.
 */
class DTDs : public QObject
{
  Q_OBJECT

public:

  /**
   *  since this class is a singleton you must use this function to access it
   *  @return the class pointer
   */
  static DTDs* ref(QObject *parent = 0L)
  {
    static DTDs *m_ref;
    if (!m_ref) m_ref = new DTDs(parent);
    return m_ref;
  }


  ~DTDs();

  /**
   * searchs a dtd and loads it from disk if not present in memory
   *
   * @param dtdName name of the dtd, will be converted to lowercase inside
   * @return the found dtd structure
   */
  const DTDStruct * find (const QString &dtdName)
  {
//    kdDebug(24000) << "dtds::find " << dtdName << endl;
    DTDStruct *dtd = m_dict->find(dtdName.lower()) ;
    if (dtd && ! dtd->loaded ) readTagDir2(dtd);
    return dtd;
  }
  /**
   * @param nickName nickname of the DTD
   * @return the name (identifier) to the nickname. If the DTD is not found you get
   *         nickName back!
   */
  QString getDTDNameFromNickName(const QString& nickName);
  /**
   * @param name name of the DTD
   * @return the nickname to the name. If the DTD is not found you get
   *         name back!
   */
  QString getDTDNickNameFromName(const QString& name)
  {
    DTDStruct *dtd = m_dict->find(name);
    if ( dtd )
      return dtd->nickName;
    else
      return name;
  };

  /**
   * creates a list of all available nicknames
   *
   * @param topLevelOnly true = only the DTD's which can be the main DTD of a document
   *                     are included
   * @return all known nick names
   */
  QStringList nickNameList (bool topLevelOnly=false);

  /**
   * creates a list of all available names
   *
   * @param topLevelOnly true = only the DTD's which can be the main DTD of a document
   *                     are included
   * @return all known names
   */
  QStringList nameList (bool topLevelOnly=false);
  /**
   * creates a list with the path to the description.rc of all available DTEPs
   *
   * @param topLevelOnly true = only the DTD's which can be the main DTD of a document
   *                     are included
   * @return a list with the name and the path to the description.rc of all available DTEPs in form of
   *               DTEPName | path to description.rc
   */
  QStringList fileNameList (bool topLevelOnly=false);


  /** finds a dtd for a given url
   *
   * @param url look for this file
   * @return the first DTD for this mimetype or the "empty" DTD if not found
   */
  const DTDStruct * DTDforURL(const KURL &url);

  /**
   * Checks if a DTD can handle the file or not.
   * @param dtd the DTD to check against
   * @param url the url pointing to the file
   * @return true if it can handle
   */
  static bool canHandle(const DTDStruct *dtd, const KURL &url);

public slots:

  /** Load a DTD and convert to a DTEP */
  void slotLoadDTD();

  /** Loads a DTEP from a directory
   *  @param dirName The directory containing the DTEP
   *  @param askForAutoLoad if true and the user answer with yes to the autoload question
   *                the DTEP will be copied to the local resource directory and will be autoloaded on
   *                startup
  */
  void slotLoadDTEP(const QString& dirName, bool askForAutoLoad);

  /**
   * Loads (replaces) the entities for a DTEP.
   */
  void slotLoadEntities();

signals:
  /** used to hide the splash screen */
  void hideSplash();

  /** DTD has changed need reparse */
  void forceReparse();

  /** Enable/disbale the idle timer*/
  void enableIdleTimer(bool);

  void loadToolbarForDTD(const QString&);

private:

  /** The constructor is privat because we use singleton patter.
   *  If you need the class use DTDs::ref() for
   *  construction and reference
   */
  DTDs(QObject *parent);


  /** Reads the tag files and the description.rc from tagDir in order to
   *  build up the internal DTD and tag structures.
   *
   * @param dirName folder where dtd definition is located
   * @param loadAll true = all information and tags will be loaded now (@ref readTagDir2 will be called)
   * @return true = no error
   */
  bool readTagDir(const QString &dirName, bool loadAll=true);

  /**  Reads the tag files and the description.rc from tagDir in order to
    *  build up the internal DTD and tag structures.
    *
    * @param dtd the already preloaded dtd structure
    * @return true = no error
    */
  bool readTagDir2(DTDStruct *dtd);


  /**  helper for @ref readTagDir2
    *
    * @param dtd the already preloaded dtd structure
    */
  void resolveInherited (DTDStruct *dtd);

  /** Reads the tags from the tag files.
   *
   * @param fileName path of the tag file
   * @param parentDTD the DTD where the tags belog to
   * @param tagList the list where the tags are inserted
   * @return the number of read tags.
   */
  uint readTagFile(const QString& fileName, DTDStruct* parentDTD, QTagList *tagList);

  /** Parses the dom document and retrieve the tag attributes
  *
  * @param dom the DOM node containing the tag definition
  * @param tag the QTag object that will be initialized by using the information in dom
  * @param common will be true, if the tag is a just a list of common group attributes
  */
  void setAttributes(QDomNode *dom, QTag* tag, bool &common);
  /** removes dtd from dictonary and deletes all components
   *
   * @param dtd the dtd to delete
   */
  void removeDTD(DTDStruct *dtd);

  /** helper to read the tag files */
  QDomDocument *m_doc;

  /** dictonary with references to all DTD's in memory */
  QDict<DTDStruct> *m_dict;
};


#endif