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