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 #include <qpopupmenu.h>
00043
00044 class KateHlContext;
00045 class KateHlItem;
00046 class KateHlItemData;
00047 class KateHlData;
00048 class KateEmbeddedHlInfo;
00049 class KateHlIncludeRule;
00050 class KateSyntaxDocument;
00051 class KateTextLine;
00052 class KateSyntaxModeListItem;
00053 class KateSyntaxContextData;
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<uint> *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
00166 signed char commentRegion(int attr) const;
00167
00172 QString getCommentStart( int attrib=0 ) const;
00173
00178 QString getCommentEnd( int attrib=0 ) const;
00179
00184 QString getCommentSingleLineStart( int attrib=0 ) const;
00185
00186
00190 enum CSLPos { CSLPosColumn0=0,CSLPosAfterWhitespace=1};
00191
00196 CSLPos getCommentSingleLinePosition( int attrib=0 ) const;
00197
00201 int attribute( int context ) const;
00202
00207 QString hlKeyForAttrib( int attrib ) const;
00208
00209
00210 void clearAttributeArrays ();
00211
00212 QMemArray<KateAttribute> *attributes (uint schema);
00213
00214 inline bool noHighlighting () const { return noHl; };
00215
00216
00217 void dropDynamicContexts();
00218
00219 QString indentation () { return m_indentation; }
00220
00221 private:
00222
00223 void getKateHlItemDataList(uint schema, KateHlItemDataList &);
00224
00225 void init();
00226 void done();
00227 void makeContextList ();
00228 int makeDynamicContext(KateHlContext *model, const QStringList *args);
00229 void handleKateHlIncludeRules ();
00230 void handleKateHlIncludeRulesRecursive(KateHlIncludeRules::iterator it, KateHlIncludeRules *list);
00231 int addToContextList(const QString &ident, int ctx0);
00232 void addToKateHlItemDataList();
00233 void createKateHlItemData (KateHlItemDataList &list);
00234 void readGlobalKeywordConfig();
00235 void readWordWrapConfig();
00236 void readCommentConfig();
00237 void readIndentationConfig ();
00238 void readFoldingConfig ();
00239
00240
00241 void generateContextStack(int *ctxNum, int ctx, QMemArray<short> *ctxs, int *posPrevLine);
00242
00243 KateHlItem *createKateHlItem(KateSyntaxContextData *data, KateHlItemDataList &iDl, QStringList *RegionList, QStringList *ContextList);
00244 int lookupAttrName(const QString& name, KateHlItemDataList &iDl);
00245
00246 void createContextNameList(QStringList *ContextNameList, int ctx0);
00247 int getIdFromString(QStringList *ContextNameList, QString tmpLineEndContext, QString &unres);
00248
00249 KateHlItemDataList internalIDList;
00250
00251 QValueVector<KateHlContext*> m_contexts;
00252 inline KateHlContext *contextNum (uint n) { if (n < m_contexts.size()) return m_contexts[n]; return 0; }
00253
00254 QMap< QPair<KateHlContext *, QString>, short> dynamicCtxs;
00255
00256
00257 KateEmbeddedHlInfos embeddedHls;
00258 KateHlUnresolvedCtxRefs unresolvedContextReferences;
00259 QStringList RegionList;
00260 QStringList ContextNameList;
00261
00262 bool noHl;
00263 bool folding;
00264 bool casesensitive;
00265 QString weakDeliminator;
00266 QString deliminator;
00267
00268 QString iName;
00269 QString iNameTranslated;
00270 QString iSection;
00271 bool iHidden;
00272 QString iWildcards;
00273 QString iMimetypes;
00274 QString identifier;
00275 QString iVersion;
00276 QString iAuthor;
00277 QString iLicense;
00278 QString m_indentation;
00279 int m_priority;
00280 int refCount;
00281 int startctx, base_startctx;
00282
00283 QString errorsAndWarnings;
00284 QString buildIdentifier;
00285 QString buildPrefix;
00286 bool building;
00287 uint itemData0;
00288 uint buildContext0Offset;
00289 KateHlIncludeRules includeRules;
00290 bool m_foldingIndentationSensitive;
00291
00292 QIntDict< QMemArray<KateAttribute> > m_attributeArrays;
00293
00294
00307 class HighlightPropertyBag {
00308 public:
00309 QString singleLineCommentMarker;
00310 QString multiLineCommentStart;
00311 QString multiLineCommentEnd;
00312 QString multiLineRegion;
00313 CSLPos singleLineCommentPosition;
00314 QString deliminator;
00315 QString wordWrapDeliminator;
00316 };
00317
00322 QDict<HighlightPropertyBag> m_additionalData;
00323
00329 QMap<int, QString> m_hlIndex;
00330
00331
00332 QString extensionSource;
00333 QValueList<QRegExp> regexpExtensions;
00334 QStringList plainExtensions;
00335
00336 public:
00337 inline bool foldingIndentationSensitive () { return m_foldingIndentationSensitive; }
00338 inline bool allowsFolding(){return folding;}
00339 };
00340
00341 class KateHlManager : public QObject
00342 {
00343 Q_OBJECT
00344
00345 private:
00346 KateHlManager();
00347
00348 public:
00349 ~KateHlManager();
00350
00351 static KateHlManager *self();
00352
00353 inline KConfig *getKConfig() { return &m_config; };
00354
00355 KateHighlighting *getHl(int n);
00356 int nameFind(const QString &name);
00357
00358 int detectHighlighting (class KateDocument *doc);
00359
00360 int findHl(KateHighlighting *h) {return hlList.find(h);}
00361 QString identifierForName(const QString&);
00362
00363
00364 static uint defaultStyles();
00365 static QString defaultStyleName(int n, bool translateNames = false);
00366
00367 void getDefaults(uint schema, KateAttributeList &);
00368 void setDefaults(uint schema, KateAttributeList &);
00369
00370 int highlights();
00371 QString hlName(int n);
00372 QString hlNameTranslated (int n);
00373 QString hlSection(int n);
00374 bool hlHidden(int n);
00375
00376 void incDynamicCtxs() { ++dynamicCtxsCount; };
00377 uint countDynamicCtxs() { return dynamicCtxsCount; };
00378 void setForceNoDCReset(bool b) { forceNoDCReset = b; };
00379
00380
00381 bool resetDynamicCtxs();
00382
00383 signals:
00384 void changed();
00385
00386 private:
00387 int wildcardFind(const QString &fileName);
00388 int mimeFind(KateDocument *);
00389 int realWildcardFind(const QString &fileName);
00390
00391 private:
00392 friend class KateHighlighting;
00393
00394 QPtrList<KateHighlighting> hlList;
00395 QDict<KateHighlighting> hlDict;
00396
00397 static KateHlManager *s_self;
00398
00399 KConfig m_config;
00400 QStringList commonSuffixes;
00401
00402 KateSyntaxDocument *syntax;
00403
00404 uint dynamicCtxsCount;
00405 QTime lastCtxsReset;
00406 bool forceNoDCReset;
00407 };
00408
00409 class KateViewHighlightAction: public Kate::ActionMenu
00410 {
00411 Q_OBJECT
00412
00413 public:
00414 KateViewHighlightAction(const QString& text, QObject* parent = 0, const char* name = 0)
00415 : Kate::ActionMenu(text, parent, name) { init(); };
00416
00417 ~KateViewHighlightAction(){;};
00418
00419 void updateMenu (Kate::Document *doc);
00420
00421 private:
00422 void init();
00423
00424 QGuardedPtr<Kate::Document> m_doc;
00425 QStringList subMenusName;
00426 QStringList names;
00427 QPtrList<QPopupMenu> subMenus;
00428
00429 public slots:
00430 void slotAboutToShow();
00431
00432 private slots:
00433 void setHl (int mode);
00434 };
00435
00436 #endif
00437
00438