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