00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __KATE_HIGHLIGHT_H__
00022 #define __KATE_HIGHLIGHT_H__
00023
00024 #include "katetextline.h"
00025 #include "kateattribute.h"
00026
00027 #include "../interfaces/document.h"
00028
00029 #include <kconfig.h>
00030
00031 #include <qptrlist.h>
00032 #include <qvaluelist.h>
00033 #include <qvaluevector.h>
00034 #include <qregexp.h>
00035 #include <qdict.h>
00036 #include <qintdict.h>
00037 #include <qmap.h>
00038 #include <qobject.h>
00039 #include <qstringlist.h>
00040 #include <qguardedptr.h>
00041 #include <qdatetime.h>
00042
00043 class KateHlContext;
00044 class KateHlItem;
00045 class KateHlItemData;
00046 class KateHlData;
00047 class KateEmbeddedHlInfo;
00048 class KateHlIncludeRule;
00049 class KateSyntaxDocument;
00050 class KateTextLine;
00051 class KateSyntaxModeListItem;
00052 class KateSyntaxContextData;
00053
00054 class QPopupMenu;
00055
00056
00057 typedef QPtrList<KateAttribute> KateAttributeList;
00058 typedef QValueList<KateHlIncludeRule*> KateHlIncludeRules;
00059 typedef QPtrList<KateHlItemData> KateHlItemDataList;
00060 typedef QPtrList<KateHlData> KateHlDataList;
00061 typedef QMap<QString,KateEmbeddedHlInfo> KateEmbeddedHlInfos;
00062 typedef QMap<int*,QString> KateHlUnresolvedCtxRefs;
00063 typedef QValueList<int> IntList;
00064
00065
00066 class KateHlItemData : public KateAttribute
00067 {
00068 public:
00069 KateHlItemData(const QString name, int defStyleNum);
00070
00071 enum ItemStyles {
00072 dsNormal,
00073 dsKeyword,
00074 dsDataType,
00075 dsDecVal,
00076 dsBaseN,
00077 dsFloat,
00078 dsChar,
00079 dsString,
00080 dsComment,
00081 dsOthers,
00082 dsAlert,
00083 dsFunction,
00084 dsRegionMarker,
00085 dsError };
00086
00087 public:
00088 const QString name;
00089 int defStyleNum;
00090 };
00091
00092 class KateHlData
00093 {
00094 public:
00095 KateHlData(const QString &wildcards, const QString &mimetypes,const QString &identifier, int priority);
00096
00097 public:
00098 QString wildcards;
00099 QString mimetypes;
00100 QString identifier;
00101 int priority;
00102 };
00103
00104 class KateHighlighting
00105 {
00106 public:
00107 KateHighlighting(const KateSyntaxModeListItem *def);
00108 ~KateHighlighting();
00109
00110 public:
00111 void doHighlight ( KateTextLine *prevLine,
00112 KateTextLine *textLine,
00113 QMemArray<uint> *foldingList,
00114 bool *ctxChanged );
00115
00116 void loadWildcards();
00117 QValueList<QRegExp>& getRegexpExtensions();
00118 QStringList& getPlainExtensions();
00119
00120 QString getMimetypes();
00121
00122
00123 KateHlData *getData();
00124 void setData(KateHlData *);
00125
00126 void setKateHlItemDataList(uint schema, KateHlItemDataList &);
00127
00128
00129
00130
00131 void getKateHlItemDataListCopy (uint schema, KateHlItemDataList &);
00132
00133 const QString &name() const {return iName;}
00134 const QString &nameTranslated() const {return iNameTranslated;}
00135 const QString §ion() const {return iSection;}
00136 bool hidden() const {return iHidden;}
00137 const QString &version() const {return iVersion;}
00138 const QString &author () const { return iAuthor; }
00139 const QString &license () const { return iLicense; }
00140 int priority();
00141 const QString &getIdentifier() const {return identifier;}
00142 void use();
00143 void release();
00144
00149 bool isInWord( QChar c, int attrib=0 ) const;
00150
00155 bool canBreakAt( QChar c, int attrib=0 ) const;
00156
00161 bool canComment( int startAttr, int endAttr ) const;
00162
00167 signed char commentRegion(int attr) const;
00168
00173 QString getCommentStart( int attrib=0 ) const;
00174
00179 QString getCommentEnd( int attrib=0 ) const;
00180
00185 QString getCommentSingleLineStart( int attrib=0 ) const;
00186
00190 int attribute( int context ) const;
00191
00192 void clearAttributeArrays ();
00193
00194 QMemArray<KateAttribute> *attributes (uint schema);
00195
00196 inline bool noHighlighting () const { return noHl; };
00197
00198
00199 void dropDynamicContexts();
00200
00201 QString indentation () { return m_indentation; }
00202
00203 private:
00204
00205 void getKateHlItemDataList(uint schema, KateHlItemDataList &);
00206
00207 void init();
00208 void done();
00209 void makeContextList ();
00210 int makeDynamicContext(KateHlContext *model, const QStringList *args);
00211 void handleKateHlIncludeRules ();
00212 void handleKateHlIncludeRulesRecursive(KateHlIncludeRules::iterator it, KateHlIncludeRules *list);
00213 int addToContextList(const QString &ident, int ctx0);
00214 void addToKateHlItemDataList();
00215 void createKateHlItemData (KateHlItemDataList &list);
00216 void readGlobalKeywordConfig();
00217 void readWordWrapConfig();
00218 void readCommentConfig();
00219 void readIndentationConfig ();
00220 void readFoldingConfig ();
00221
00222
00223 void generateContextStack(int *ctxNum, int ctx, QMemArray<short> *ctxs, int *posPrevLine);
00224
00225 KateHlItem *createKateHlItem(KateSyntaxContextData *data, KateHlItemDataList &iDl, QStringList *RegionList, QStringList *ContextList);
00226 int lookupAttrName(const QString& name, KateHlItemDataList &iDl);
00227
00228 void createContextNameList(QStringList *ContextNameList, int ctx0);
00229 int getIdFromString(QStringList *ContextNameList, QString tmpLineEndContext, QString &unres);
00230
00234 QString hlKeyForAttrib( int attrib ) const;
00235
00236 KateHlItemDataList internalIDList;
00237
00238 QValueVector<KateHlContext*> m_contexts;
00239 inline KateHlContext *contextNum (uint n) { if (n < m_contexts.size()) return m_contexts[n]; return 0; }
00240
00241 QMap< QPair<KateHlContext *, QString>, short> dynamicCtxs;
00242
00243
00244 KateEmbeddedHlInfos embeddedHls;
00245 KateHlUnresolvedCtxRefs unresolvedContextReferences;
00246 QStringList RegionList;
00247 QStringList ContextNameList;
00248
00249 bool noHl;
00250 bool folding;
00251 bool casesensitive;
00252 QString weakDeliminator;
00253 QString deliminator;
00254
00255 QString iName;
00256 QString iNameTranslated;
00257 QString iSection;
00258 bool iHidden;
00259 QString iWildcards;
00260 QString iMimetypes;
00261 QString identifier;
00262 QString iVersion;
00263 QString iAuthor;
00264 QString iLicense;
00265 QString m_indentation;
00266 int m_priority;
00267 int refCount;
00268 int startctx, base_startctx;
00269
00270 QString errorsAndWarnings;
00271 QString buildIdentifier;
00272 QString buildPrefix;
00273 bool building;
00274 uint itemData0;
00275 uint buildContext0Offset;
00276 KateHlIncludeRules includeRules;
00277 bool m_foldingIndentationSensitive;
00278
00279 QIntDict< QMemArray<KateAttribute> > m_attributeArrays;
00280
00293 class HighlightPropertyBag {
00294 public:
00295 QString singleLineCommentMarker;
00296 QString multiLineCommentStart;
00297 QString multiLineCommentEnd;
00298 QString multiLineRegion;
00299 QString deliminator;
00300 QString wordWrapDeliminator;
00301 };
00302
00307 QDict<HighlightPropertyBag> m_additionalData;
00308
00314 QMap<int, QString> m_hlIndex;
00315
00316
00317 QString extensionSource;
00318 QValueList<QRegExp> regexpExtensions;
00319 QStringList plainExtensions;
00320
00321 public:
00322 inline bool foldingIndentationSensitive () { return m_foldingIndentationSensitive; }
00323 inline bool allowsFolding(){return folding;}
00324 };
00325
00326 class KateHlManager : public QObject
00327 {
00328 Q_OBJECT
00329
00330 private:
00331 KateHlManager();
00332
00333 public:
00334 ~KateHlManager();
00335
00336 static KateHlManager *self();
00337
00338 inline KConfig *getKConfig() { return &m_config; };
00339
00340 KateHighlighting *getHl(int n);
00341 int nameFind(const QString &name);
00342
00343 int detectHighlighting (class KateDocument *doc);
00344
00345 int findHl(KateHighlighting *h) {return hlList.find(h);}
00346 QString identifierForName(const QString&);
00347
00348
00349 static uint defaultStyles();
00350 static QString defaultStyleName(int n, bool translateNames = false);
00351
00352 void getDefaults(uint schema, KateAttributeList &);
00353 void setDefaults(uint schema, KateAttributeList &);
00354
00355 int highlights();
00356 QString hlName(int n);
00357 QString hlNameTranslated (int n);
00358 QString hlSection(int n);
00359 bool hlHidden(int n);
00360
00361 void incDynamicCtxs() { ++dynamicCtxsCount; };
00362 uint countDynamicCtxs() { return dynamicCtxsCount; };
00363 void setForceNoDCReset(bool b) { forceNoDCReset = b; };
00364
00365
00366 bool resetDynamicCtxs();
00367
00368 signals:
00369 void changed();
00370
00371 private:
00372 int wildcardFind(const QString &fileName);
00373 int mimeFind(KateDocument *);
00374 int realWildcardFind(const QString &fileName);
00375
00376 private:
00377 friend class KateHighlighting;
00378
00379 QPtrList<KateHighlighting> hlList;
00380 QDict<KateHighlighting> hlDict;
00381
00382 static KateHlManager *s_self;
00383
00384 KConfig m_config;
00385 QStringList commonSuffixes;
00386
00387 KateSyntaxDocument *syntax;
00388
00389 uint dynamicCtxsCount;
00390 QTime lastCtxsReset;
00391 bool forceNoDCReset;
00392 };
00393
00394 class KateViewHighlightAction: public Kate::ActionMenu
00395 {
00396 Q_OBJECT
00397
00398 public:
00399 KateViewHighlightAction(const QString& text, QObject* parent = 0, const char* name = 0)
00400 : Kate::ActionMenu(text, parent, name) { init(); };
00401
00402 ~KateViewHighlightAction(){;};
00403
00404 void updateMenu (Kate::Document *doc);
00405
00406 private:
00407 void init();
00408
00409 QGuardedPtr<Kate::Document> m_doc;
00410 QStringList subMenusName;
00411 QStringList names;
00412 QPtrList<QPopupMenu> subMenus;
00413
00414 public slots:
00415 void slotAboutToShow();
00416
00417 private slots:
00418 void setHl (int mode);
00419 };
00420
00421 #endif
00422
00423