00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "js_colorizer.h"
00023
#include "qeditor_part.h"
00024
#include "paragdata.h"
00025
00026
#include <qfont.h>
00027
#include <private/qrichtext_p.h>
00028
00029
#include <qdom.h>
00030
#include <qfile.h>
00031
00032
#include <kapplication.h>
00033
#include <kdebug.h>
00034
#include <kconfig.h>
00035
#include <kstandarddirs.h>
00036
00037
00038 static const char *
js_keywords[] = {
00039
"null",
00040
"true",
00041
"false",
00042
"abstract",
00043
"break",
00044
"case",
00045
"catch",
00046
"class",
00047
"const",
00048
"constructor",
00049
"default",
00050
"extends",
00051
"final",
00052
"finally",
00053
"for",
00054
"import",
00055
"instanceof",
00056
"is",
00057
"new",
00058
"var",
00059
"continue",
00060
"function",
00061
"return",
00062
"void",
00063
"delete",
00064
"if",
00065
"this",
00066
"do",
00067
"while",
00068
"else",
00069
"in",
00070
"package",
00071
"private",
00072
"public",
00073
"static",
00074
"switch",
00075
"throw",
00076
"try",
00077
"typeof",
00078
"with",
00079
"abstract",
00080
"boolean",
00081
"byte",
00082
"char",
00083
"debugger",
00084
"double",
00085
"enum",
00086
"export",
00087
"final",
00088
"float",
00089
"goto",
00090
"implements",
00091
"int",
00092
"interface",
00093
"long",
00094
"native",
00095
"private",
00096
"protected",
00097
"public",
00098
"short",
00099
"static",
00100
"super",
00101
"synchronized",
00102
"throws",
00103
"transient",
00104
"volatile",
00105 0
00106 };
00107
00108
00109
using namespace std;
00110
00111 JSColorizer::JSColorizer(
QEditor* editor )
00112 :
QSourceColorizer( editor )
00113 {
00114
loadDynamicKeywords();
00115
00116
00117
HLItemCollection* context0 =
new HLItemCollection( 0 );
00118 context0->
appendChild(
new WhiteSpacesHLItem( Normal, 0 ) );
00119 context0->
appendChild(
new StringHLItem(
"'", String, 1 ) );
00120 context0->
appendChild(
new StringHLItem(
"\"", String, 2 ) );
00121 context0->
appendChild(
new StringHLItem(
"/*", Comment, 3 ) );
00122 context0->
appendChild(
new StartsWithHLItem(
"//", Comment, 0 ) );
00123 context0->
appendChild(
new HexHLItem( Constant, 0 ) );
00124 context0->
appendChild(
new NumberHLItem( Constant, 0 ) );
00125 context0->
appendChild(
new KeywordsHLItem(
m_dynamicKeywords, BuiltInClass, Normal, 0,
false ) );
00126 context0->
appendChild(
new KeywordsHLItem(
js_keywords, Keyword, Normal, 0 ) );
00127
00128 HLItemCollection* context1 =
new HLItemCollection( String );
00129 context1->
appendChild(
new StringHLItem(
"\\\\", String, 1 ) );
00130 context1->
appendChild(
new StringHLItem(
"\\'", String, 1 ) );
00131 context1->
appendChild(
new StringHLItem(
"'", String, 0 ) );
00132
00133 HLItemCollection* context2 =
new HLItemCollection( String );
00134 context2->
appendChild(
new StringHLItem(
"\\\\", String, 2 ) );
00135 context2->
appendChild(
new StringHLItem(
"\\\"", String, 2 ) );
00136 context2->
appendChild(
new StringHLItem(
"\"", String, 0 ) );
00137
00138 HLItemCollection* context3 =
new HLItemCollection( Comment );
00139 context3->
appendChild(
new StringHLItem(
"*/", Comment, 0 ) );
00140
00141
00142 m_items.append( context0 );
00143 m_items.append( context1 );
00144 m_items.append( context2 );
00145 m_items.append( context3 );
00146 }
00147
00148 JSColorizer::~JSColorizer()
00149 {
00150 }
00151
00152 void JSColorizer::loadDynamicKeywords()
00153 {
00154
QString strFileNameTag(
"name" );
00155
QString strClassNameTag(
"name" );
00156
00157
m_dynamicKeywords.clear();
00158
00159
QString hlFileDir =
KGlobal::dirs()->
findResourceDir(
"data",
"qeditorpart/highlight/highlighting.xml" );
00160
00161 hlFileDir +=
"qeditorpart/highlight/";
00162
00163
00164
00165
if( hlFileDir.isNull() )
00166
return;
00167
00168
QDomDocument hlFile(
"hlfile" ), curDoc (
"classlist" );
00169
QFile hlRawFile( hlFileDir +
"highlighting.xml" );
00170
int keywordIndex = 0;
00171
if( !hlRawFile.open( IO_ReadOnly ) )
00172
return;
00173
if( !hlFile.setContent( &hlRawFile ) ) {
00174 hlRawFile.close();
00175
return;
00176 }
00177 hlRawFile.close();
00178
00179
QDomElement e = hlFile.documentElement();
00180
QDomNode n = e.firstChild();
00181
while( !n.isNull() ) {
00182 e = n.toElement();
00183
if( !e.isNull() ) {
00184
00185
00186
00187
QFile clsRawFile( hlFileDir + e.attribute( strFileNameTag ) );
00188
if( clsRawFile.open( IO_ReadOnly ) && curDoc.setContent( &clsRawFile ) ) {
00189
00190
QDomElement e = curDoc.documentElement();
00191
QDomNode n = e.firstChild();
00192
while( !n.isNull() ) {
00193 e = n.toElement();
00194
if( !e.isNull()) {
00195
00196
m_dynamicKeywords.insert( e.attribute( strClassNameTag ), keywordIndex++ );
00197 }
00198 n = n.nextSibling();
00199 }
00200
00201 }
00202 clsRawFile.close();
00203 }
00204 n = n.nextSibling();
00205 }
00206 }
00207
00208 int JSColorizer::computeLevel( QTextParagraph* parag,
int startLevel )
00209 {
00210
int level = startLevel;
00211
00212
ParagData* data = (
ParagData*) parag->extraData();
00213
if( !data ){
00214
return startLevel;
00215 }
00216
00217 data->
setBlockStart(
false );
00218
00219
QValueList<Symbol> symbols = data->
symbolList();
00220
QValueList<Symbol>::Iterator it = symbols.begin();
00221
while( it != symbols.end() ){
00222
Symbol sym = *it++;
00223
if( sym.
ch() ==
'{' ){
00224 ++level;
00225 }
else if( sym.
ch() ==
'}' ){
00226 --level;
00227 }
00228 }
00229
00230
if( level > startLevel ){
00231 data->
setBlockStart(
true );
00232 }
00233
00234
return level;
00235 }
00236