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 <qregexp.h>
00034 #include <qdict.h>
00035 #include <qintdict.h>
00036 #include <qmap.h>
00037 #include <qobject.h>
00038 #include <qstringlist.h>
00039 #include <qguardedptr.h>
00040 #include <qdatetime.h>
00041
00042 class KateHlContext;
00043 class KateHlItem;
00044 class KateHlItemData;
00045 class KateHlData;
00046 class KateEmbeddedHlInfo;
00047 class KateHlIncludeRule;
00048 class KateSyntaxDocument;
00049 class KateTextLine;
00050 class KateSyntaxModeListItem;
00051 class KateSyntaxContextData;
00052
00053 class QPopupMenu;
00054
00055
00056 typedef QPtrList<KateAttribute> KateAttributeList;
00057 typedef QValueList<KateHlIncludeRule*> KateHlIncludeRules;
00058 typedef QPtrList<KateHlItemData> KateHlItemDataList;
00059 typedef QPtrList<KateHlData> KateHlDataList;
00060 typedef QMap<QString,KateEmbeddedHlInfo> KateEmbeddedHlInfos;
00061 typedef QMap<int*,QString> KateHlUnresolvedCtxRefs;
00062 typedef QValueList<int> IntList;
00063
00064
00065 class KateHlItemData : public KateAttribute
00066 {
00067 public:
00068 KateHlItemData(const QString name, int defStyleNum);
00069
00070 enum ItemStyles {
00071 dsNormal,
00072 dsKeyword,
00073 dsDataType,
00074 dsDecVal,
00075 dsBaseN,
00076 dsFloat,
00077 dsChar,
00078 dsString,
00079 dsComment,
00080 dsOthers,
00081 dsAlert,
00082 dsFunction,
00083 dsRegionMarker,
00084 dsError };
00085
00086 public:
00087 const QString name;
00088 int defStyleNum;
00089 };
00090
00091 class KateHlData
00092 {
00093 public:
00094 KateHlData(const QString &wildcards, const QString &mimetypes,const QString &identifier, int priority);
00095
00096 public:
00097 QString wildcards;
00098 QString mimetypes;
00099 QString identifier;
00100 int priority;
00101 };
00102
00103 class KateHighlighting
00104 {
00105 public:
00106 KateHighlighting(const KateSyntaxModeListItem *def);
00107 ~KateHighlighting();
00108
00109 public:
00110 void doHighlight ( KateTextLine *prevLine,
00111 KateTextLine *textLine,
00112 QMemArray<signed char> *foldingList,
00113 bool *ctxChanged );
00114
00115 void loadWildcards();
00116 QValueList<QRegExp>& getRegexpExtensions();
00117 QStringList& getPlainExtensions();
00118
00119 QString getMimetypes();
00120
00121
00122 KateHlData *getData();
00123 void setData(KateHlData *);
00124
00125 void setKateHlItemDataList(uint schema, KateHlItemDataList &);
00126
00127
00128
00129
00130 void getKateHlItemDataListCopy (uint schema, KateHlItemDataList &);
00131
00132 const QString &name() const {return iName;}
00133 const QString &nameTranslated() const {return iNameTranslated;}
00134 const QString §ion() const {return iSection;}
00135 bool hidden() const {return iHidden;}
00136 const QString &version() const {return iVersion;}
00137 const QString &author () const { return iAuthor; }
00138 const QString &license () const { return iLicense; }
00139 int priority();
00140 const QString &getIdentifier() const {return identifier;}
00141 void use();
00142 void release();
00143
00148 bool isInWord( QChar c, int attrib=0 ) const;
00149
00154 bool canBreakAt( QChar c, int attrib=0 ) const;
00155
00160 bool canComment( int startAttr, int endAttr ) const;
00161
00165 enum commentData { Start, End, SingleLine };
00166
00171 QString getCommentString( int which, int attrib ) const;
00172
00177 QString getCommentStart( int attrib=0 ) const;
00178
00183 QString getCommentEnd( int attrib=0 ) const;
00184
00189 QString getCommentSingleLineStart( int attrib=0 ) const;
00190
00191 void clearAttributeArrays ();
00192
00193 QMemArray<KateAttribute> *attributes (uint schema);
00194
00195 inline bool noHighlighting () const { return noHl; };
00196
00197
00198 void dropDynamicContexts();
00199
00200 private:
00201
00202 void getKateHlItemDataList(uint schema, KateHlItemDataList &);
00203
00204 void init();
00205 void done();
00206 void makeContextList ();
00207 int makeDynamicContext(KateHlContext *model, const QStringList *args);
00208 void handleKateHlIncludeRules ();
00209 void handleKateHlIncludeRulesRecursive(KateHlIncludeRules::iterator it, KateHlIncludeRules *list);
00210 int addToContextList(const QString &ident, int ctx0);
00211 void addToKateHlItemDataList();
00212 void createKateHlItemData (KateHlItemDataList &list);
00213 QString readGlobalKeywordConfig();
00214 QString readWordWrapConfig();
00215 QStringList readCommentConfig();
00216 void readFoldingConfig ();
00217
00218
00219 void generateContextStack(int *ctxNum, int ctx, QMemArray<short> *ctxs, int *posPrevLine,bool lineContinue=false);
00220
00221 KateHlItem *createKateHlItem(struct KateSyntaxContextData *data, KateHlItemDataList &iDl, QStringList *RegionList, QStringList *ContextList);
00222 int lookupAttrName(const QString& name, KateHlItemDataList &iDl);
00223
00224 void createContextNameList(QStringList *ContextNameList, int ctx0);
00225 int getIdFromString(QStringList *ContextNameList, QString tmpLineEndContext, QString &unres);
00226
00230 int hlKeyForAttrib( int attrib ) const;
00231
00232 KateHlItemDataList internalIDList;
00233
00234 QIntDict<KateHlContext> contextList;
00235 inline KateHlContext *contextNum (uint n) { return contextList[n]; }
00236
00237 QMap< QPair<KateHlContext *, QString>, short> dynamicCtxs;
00238
00239
00240 KateEmbeddedHlInfos embeddedHls;
00241 KateHlUnresolvedCtxRefs unresolvedContextReferences;
00242 QStringList RegionList;
00243 QStringList ContextNameList;
00244
00245 bool noHl;
00246 bool folding;
00247 bool casesensitive;
00248 QString weakDeliminator;
00249 QString deliminator;
00250
00251 QString iName;
00252 QString iNameTranslated;
00253 QString iSection;
00254 bool iHidden;
00255 QString iWildcards;
00256 QString iMimetypes;
00257 QString identifier;
00258 QString iVersion;
00259 QString iAuthor;
00260 QString iLicense;
00261 int m_priority;
00262 int refCount;
00263 int startctx, base_startctx;
00264
00265 QString errorsAndWarnings;
00266 QString buildIdentifier;
00267 QString buildPrefix;
00268 bool building;
00269 uint itemData0;
00270 uint buildContext0Offset;
00271 KateHlIncludeRules includeRules;
00272 QValueList<int> contextsIncludingSomething;
00273 bool m_foldingIndentationSensitive;
00274
00275 QIntDict< QMemArray<KateAttribute> > m_attributeArrays;
00276
00284 QMap<int, QStringList> m_additionalData;
00285
00289 IntList m_hlIndex;
00290
00291 QString extensionSource;
00292 QValueList<QRegExp> regexpExtensions;
00293 QStringList plainExtensions;
00294
00295 public:
00296 inline bool foldingIndentationSensitive () { return m_foldingIndentationSensitive; }
00297 inline bool allowsFolding(){return folding;}
00298 };
00299
00300 class KateHlManager : public QObject
00301 {
00302 Q_OBJECT
00303
00304 private:
00305 KateHlManager();
00306
00307 public:
00308 ~KateHlManager();
00309
00310 static KateHlManager *self();
00311
00312 inline KConfig *getKConfig() { return &m_config; };
00313
00314 KateHighlighting *getHl(int n);
00315 int nameFind(const QString &name);
00316
00317 int detectHighlighting (class KateDocument *doc);
00318
00319 int findHl(KateHighlighting *h) {return hlList.find(h);}
00320 QString identifierForName(const QString&);
00321
00322
00323 static uint defaultStyles();
00324 static QString defaultStyleName(int n);
00325
00326 void getDefaults(uint schema, KateAttributeList &);
00327 void setDefaults(uint schema, KateAttributeList &);
00328
00329 int highlights();
00330 QString hlName(int n);
00331 QString hlNameTranslated (int n);
00332 QString hlSection(int n);
00333 bool hlHidden(int n);
00334
00335 void incDynamicCtxs() { ++dynamicCtxsCount; };
00336 uint countDynamicCtxs() { return dynamicCtxsCount; };
00337 void setForceNoDCReset(bool b) { forceNoDCReset = b; };
00338
00339
00340 bool resetDynamicCtxs();
00341
00342 signals:
00343 void changed();
00344
00345 private:
00346 int wildcardFind(const QString &fileName);
00347 int mimeFind(KateDocument *);
00348 int realWildcardFind(const QString &fileName);
00349
00350 private:
00351 friend class KateHighlighting;
00352
00353 QPtrList<KateHighlighting> hlList;
00354 QDict<KateHighlighting> hlDict;
00355
00356 static KateHlManager *s_self;
00357
00358 KConfig m_config;
00359 QStringList commonSuffixes;
00360
00361 KateSyntaxDocument *syntax;
00362
00363 uint dynamicCtxsCount;
00364 QTime lastCtxsReset;
00365 bool forceNoDCReset;
00366 };
00367
00368 class KateViewHighlightAction: public Kate::ActionMenu
00369 {
00370 Q_OBJECT
00371
00372 public:
00373 KateViewHighlightAction(const QString& text, QObject* parent = 0, const char* name = 0)
00374 : Kate::ActionMenu(text, parent, name) { init(); };
00375
00376 ~KateViewHighlightAction(){;};
00377
00378 void updateMenu (Kate::Document *doc);
00379
00380 private:
00381 void init();
00382
00383 QGuardedPtr<Kate::Document> m_doc;
00384 QStringList subMenusName;
00385 QStringList names;
00386 QPtrList<QPopupMenu> subMenus;
00387
00388 public slots:
00389 void slotAboutToShow();
00390
00391 private slots:
00392 void setHl (int mode);
00393 };
00394
00395 #endif
00396
00397