source: dev/trunk/ab5.0/abdev/abdev/src/WindowComponents/CodeEditor/Syntax.cpp @ 681

Last change on this file since 681 was 681, checked in by dai_9181, 15 years ago

・TinyXMLをabdevプロジェクトで使えるようにした。
・コードハイライターを汎用的に実装しなおした。syntaxファイルを読み込む仕様とした。

File size: 3.4 KB
Line 
1#include "stdafx.h"
2
3using namespace ActiveBasic::IDE::WindowComponents::CodeEditor;
4
5void Language::Load( const TiXmlDocument &doc )
6{
7    const TiXmlElement* root = doc.FirstChild( "language" )->ToElement();
8
9    // 言語名を取得
10    this->name = root->FirstChild( "name" )->FirstChild()->Value();
11
12    // Syntaxタグを解析
13    const TiXmlElement* syntaxElement = root->FirstChild( "syntax" )->ToElement();
14    this->syntax.commentSingle = syntaxElement->FirstChild( "commentSingle" )->FirstChild()->Value();
15    this->syntax.commentMultiBegin = syntaxElement->FirstChild( "commentMulti" )->FirstChild( "begin" )->FirstChild()->Value();
16    this->syntax.commentMultiEnd = syntaxElement->FirstChild( "commentMulti" )->FirstChild( "end" )->FirstChild()->Value();
17    {
18        const TiXmlElement* element = syntaxElement->FirstChild( "quoteMarks" )->FirstChild( "item" )->ToElement();
19        while( element )
20        {
21            this->syntax.quoteMarks.push_back( element->FirstChild()->Value() );
22            element = element->NextSibling() ? element->NextSibling()->ToElement() : NULL;
23        }
24    }
25    {
26        const TiXmlElement* element = syntaxElement->FirstChild( "reservedSimpleKeywords" )->FirstChild( "item" )->ToElement();
27        while( element )
28        {
29            this->syntax.reservedSimpleKeywords.push_back( element->FirstChild()->Value() );
30            element = element->NextSibling() ? element->NextSibling()->ToElement() : NULL;
31        }
32    }
33    {
34        const TiXmlElement* element = syntaxElement->FirstChild( "reservedKeywordsWithQuickHelp" )->FirstChild( "item" )->ToElement();
35        while( element )
36        {
37            ReservedKeywordWithQuickHelp temp;
38            temp.keyword = element->FirstChild( "keyword" )->FirstChild()->Value();
39            temp.quickHelp = element->FirstChild( "quickHelp" )->FirstChild()->Value();
40            this->syntax.reservedKeywordsWithQuickHelp.push_back( temp );
41            element = element->NextSibling() ? element->NextSibling()->ToElement() : NULL;
42        }
43    }
44}
45
46bool Language::IsExistKeyword( const std::string &keyword ) const
47{
48    if( Jenga::Common::IsExistString( this->syntax.reservedSimpleKeywords, keyword )
49        || this->IsExistReservedKeywordWithQuickHelp( keyword ) )
50    {
51        return true;
52    }
53
54    return false;
55}
56
57bool Language::IsExistReservedKeywordWithQuickHelp( const std::string &keyword ) const
58{
59    BOOST_FOREACH( const ReservedKeywordWithQuickHelp &item, syntax.reservedKeywordsWithQuickHelp )
60    {
61        if( item.keyword == keyword )
62        {
63            return true;
64        }
65    }
66
67    return false;
68}
69
70const std::string &Language::GetReservedKeywordWithQuickHelp( const std::string &keyword ) const
71{
72    BOOST_FOREACH( const ReservedKeywordWithQuickHelp &item, syntax.reservedKeywordsWithQuickHelp )
73    {
74        if( item.keyword == keyword )
75        {
76            return item.quickHelp;
77        }
78    }
79
80    throw;
81}
82
83bool Language::IsQuoteMark( char c ) const
84{
85    BOOST_FOREACH( const std::string &quoteMark, syntax.quoteMarks )
86    {
87        if( quoteMark.size() == 1 && c == quoteMark[0] )
88        {
89            return true;
90        }
91    }
92    return false;
93}
94
95void Languages::Add( const std::string &xmlPath )
96{
97    Language language;
98    try
99    {
100        TiXmlDocument doc( xmlPath );
101        doc.LoadFile();
102
103        language.Load( doc );
104
105        (*this)[language.GetName()] = language;
106    }
107    catch( ... )
108    {
109    }
110}
111
112void Languages::LoadFiles( const std::string &dirPath )
113{
114    Jenga::Common::Strings results;
115    Jenga::Common::Directory dir( dirPath );
116    dir.SearchFiles( results, "*.xml" );
117    BOOST_FOREACH( const std::string &xmlPath, results )
118    {
119        this->Add( xmlPath );
120    }
121}
Note: See TracBrowser for help on using the repository browser.