添付ファイルの情報



[添付ファイル一覧] [全ページの添付ファイル一覧]

filepython_outline_a01.diff
格納ファイル名:attach/4A756E6B2F707974686F6E5F6F75746C696E65_707974686F6E5F6F75746C696E655F6130312E64696666
ページ:Junk/python_outline
格納ファイル名:attach/4A756E6B2F707974686F6E5F6F75746C696E65_707974686F6E5F6F75746C696E655F6130312E64696666
MD5ハッシュ値:966a796714d075f8b73218c00af8fa9f
サイズ:7.2KB (7370 bytes)
Content-type:application/octet-stream
登録日時:2007/02/08 03:18:53
アクセス数:244
MD5ハッシュ値:966a796714d075f8b73218c00af8fa9f
filepython_outline_a01.diff
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
Index: sakura_core/CDlgFuncList.cpp
===================================================================
--- sakura_core/CDlgFuncList.cpp	(revision 1064)
+++ sakura_core/CDlgFuncList.cpp	(working copy)
@@ -237,6 +237,14 @@
 		SetTreeJava( m_hWnd, TRUE );
 		::SetWindowText( m_hWnd, "Java メソッドツリー" );
 	}else
+	//	2007.02.08 genta Python追加
+	if( OUTLINE_PYTHON == m_nListType ){ /* Python メソッドツリー */
+		m_nViewType = 1;
+		//	@Todo 厳密にはこれだとCOPYデータがTag jumpにならないので
+		//	よろしくない.SetTreeJavaを改造するか専用のものを作るべき
+		SetTree();
+		::SetWindowText( m_hWnd, "Python メソッドツリー" );
+	}else
 	if( OUTLINE_COBOL == m_nListType ){ /* COBOL アウトライン */
 		//	May 18, 2001 genta
 		//	Windowがいなくなると後で都合が悪いので、表示しないだけにしておく
Index: sakura_core/CEditDoc.h
===================================================================
--- sakura_core/CEditDoc.h	(revision 1064)
+++ sakura_core/CEditDoc.h	(working copy)
@@ -263,6 +263,7 @@
 	void			MakeTopicList_asm( CFuncInfoArr* );		/* アセンブラ アウトライン解析 */
 	void			MakeFuncList_Perl( CFuncInfoArr* );		/* Perl関数リスト作成 */	//	Sep. 8, 2000 genta
 	void			MakeFuncList_VisualBasic( CFuncInfoArr* );/* Visual Basic関数リスト作成 */ //June 23, 2001 N.Nakatani
+	void			MakeFuncList_python( CFuncInfoArr* pcFuncInfoArr ); /* Python アウトライン解析*/ // 2007.02.08 genta
 	void			MakeTopicList_wztxt(CFuncInfoArr*);		/* 階層付きテキスト アウトライン解析 */ // 2003.05.20 zenryaku
 	void			MakeTopicList_html(CFuncInfoArr*);		/* HTML アウトライン解析 */ // 2003.05.20 zenryaku
 	void			MakeTopicList_tex(CFuncInfoArr*);		/* TeX アウトライン解析 */ // 2003.07.20 naoh
Index: sakura_core/CEditDoc_FuncList1.cpp
===================================================================
--- sakura_core/CEditDoc_FuncList1.cpp	(revision 1064)
+++ sakura_core/CEditDoc_FuncList1.cpp	(working copy)
@@ -1040,3 +1040,159 @@
 	}
 	return;
 }
+
+/*!
+	関数に用いることができる文字かどうかの判定
+	
+	@date 2007.02.08 genta
+
+	@note 厳密には1文字目に数字を使うことは出来ないが,
+		それは実行してみれば明らかにわかることなので
+		そこまで厳密にチェックしない
+*/
+inline bool Python_IsWordChar( char c ){
+	return ( '_' == c ||
+			('a' <= c && c <= 'z' )||
+			('A' <= c && c <= 'Z' )||
+			('0' <= c && c <= '9' )
+		);
+}
+
+/*!	@brief python関数リスト作成
+
+	class, def で始まる行から名前を抜き出す.
+	
+	class CLASS_NAME( superclass ):
+	def FUNCTION_NAME( parameters ):
+
+	@date 2007.02.08 genta 新規作成
+
+	@note ここはzlib/libpng ライセンスでOK
+*/
+void CEditDoc::MakeFuncList_python( CFuncInfoArr* pcFuncInfoArr )
+{
+	int			nLineLen;
+	int			nLineCount;
+
+	const int MAX_DEPTH = 10;
+
+	int indent_level[ MAX_DEPTH ];
+	indent_level[0] = 0;	// do as python does.
+
+	int depth_index = 0;
+
+	for( nLineCount = 0; nLineCount <  m_cDocLineMgr.GetLineCount(); ++nLineCount ){
+		const char*	pLine;
+		int d;	//	indent depth
+		int nItemFuncId;	// topic type
+
+		pLine = m_cDocLineMgr.GetLineStr( nLineCount, &nLineLen );
+		
+		for( d = 0; d < nLineLen; ++d ){
+			//	calculate indent level
+			if( pLine[d] == ' ' ){
+				++d;
+			}
+			else if( pLine[d] == '\t' ){
+				d = ( d + 8 ) & 7;
+			}
+			else {
+				break;
+			}
+		}
+		if( pLine[d] == '\r' ||
+			pLine[d] == '\n' ||
+			pLine[d] == '\0' ||
+			pLine[d] == '#' ){
+			//	blank line or comment line are ignored
+			continue;
+		}
+		
+		//	adjust current depth level
+		int i;
+		for( i = depth_index; i >= 0; --i ){
+			if( d == indent_level[ i ] ){
+				depth_index = i;
+				break;
+			}
+			else if( d > indent_level[ i ] && i < MAX_DEPTH - 1 ){
+				depth_index = i + 1;
+				indent_level[ depth_index ] = d;
+				break;
+			}
+		}
+		
+		int w_start = d;
+		if( nLineLen - d > 4 && strncmp( pLine + d, "def", 3 ) == 0 ){
+			//	"def"
+			nItemFuncId = 1;
+			w_start = d + 3; // strlen( def )
+		}
+		else if( nLineLen - d > 6 && strncmp( pLine + d, "class", 3 ) == 0 ){
+			// class
+			nItemFuncId = 4;
+			w_start = d + 5; // strlen( class )
+		}
+		else {
+			//	non-significant
+			continue;
+		}
+		
+		//	2007.02.08 genta 手抜きコメント
+		//	厳密には,ここで継続行を入れることが可能だが,
+		//	そんなレアなケースは考慮しない
+		
+		//	skip whitespace
+		while( w_start < nLineLen && C_IsSpace( pLine[w_start] ))
+			++w_start;
+
+		int w_end;
+		for( w_end = w_start; w_end < nLineLen
+				&& Python_IsWordChar( pLine[w_end] ); ++w_end )
+			;
+		
+		//	2007.02.08 genta 手抜きコメント
+		//	厳密には,この後に括弧に囲まれた引数あるいは継承元クラスが
+		//	括弧に囲まれて入り,さらに:と続くが
+		//	継続行の可能性があるので,そこまでチェックしない
+		
+		//	ここまでで登録要件OKとみなす
+		
+		//	このあたりは暫定
+
+		char szWord[512];	// 適当に大きな数(pythonでは名前の長さの上限があるのか?)
+		int len = w_end -w_start;
+		
+		if( len > 0 ){
+			if( len > sizeof( szWord ) - 1){
+				len = sizeof( szWord ) - 1;
+			}
+			strncpy( szWord, pLine + w_start, len );
+			szWord[ len ] = '\0';
+		}
+		else {
+			strcpy( szWord, "名称未定" );
+			len = 8;
+		}
+		if( nItemFuncId == 4 && sizeof( szWord ) - len > 8 ){
+			// class
+			strcpy( szWord + len, " クラス" );
+		}
+		
+		/*
+		  カーソル位置変換
+		  物理位置(行頭からのバイト数、折り返し無し行位置)
+		  →
+		  レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
+		*/
+		int		nPosX;
+		int		nPosY;
+		m_cLayoutMgr.CaretPos_Phys2Log(
+			0,
+			nLineCount/*nFuncLine - 1*/,
+			&nPosX,
+			&nPosY
+		);
+		pcFuncInfoArr->AppendData( nLineCount + 1, nPosY + 1, szWord, nItemFuncId, depth_index );
+	}
+}
Index: sakura_core/CEditView_Command.cpp
===================================================================
--- sakura_core/CEditView_Command.cpp	(revision 1064)
+++ sakura_core/CEditView_Command.cpp	(working copy)
@@ -4630,6 +4630,7 @@
 	case OUTLINE_FILE:		m_pcEditDoc->MakeFuncList_RuleFile( &cFuncInfoArr );break;	//	2002.04.01 YAZAKI アウトライン解析にルールファイルを導入
 	case OUTLINE_TEXT:
 //	case OUTLINE_UNKNOWN:	//Jul. 08, 2001 JEPRO 使わないように変更
+	case OUTLINE_PYTHON:	m_pcEditDoc->MakeFuncList_python(&cFuncInfoArr);break;		// 2007.02.08 genta
 	default:
 		m_pcEditDoc->MakeTopicList_txt( &cFuncInfoArr );
 		break;
Index: sakura_core/CPropTypes.cpp
===================================================================
--- sakura_core/CPropTypes.cpp	(revision 1064)
+++ sakura_core/CPropTypes.cpp	(working copy)
@@ -45,6 +45,7 @@
 	{ OUTLINE_PERL,		"Perl" },			//Sep. 8, 2000 genta
 	{ OUTLINE_ASM,		"アセンブラ" },
 	{ OUTLINE_VB,		"Visual Basic" },	// 2001/06/23 N.Nakatani
+	{ OUTLINE_PYTHON,	"Python" },		//	2007.02.08 genta
 	{ OUTLINE_WZTXT,	"WZ階層付テキスト" },	// 2003.05.20 zenryaku, 2003.06.23 Moca 名称変更
 	{ OUTLINE_HTML,		"HTML" },			// 2003.05.20 zenryaku
 	{ OUTLINE_TEX,		"TeX" },			// 2003.07.20 naoh
Index: sakura_core/global.h
===================================================================
--- sakura_core/global.h	(revision 1064)
+++ sakura_core/global.h	(working copy)
@@ -239,6 +239,7 @@
 	OUTLINE_HTML,		// 2003.05.20 zenryaku HTMLアウトライン解析
 	OUTLINE_TEX,		// 2003.07.20 naoh TeXアウトライン解析
 	OUTLINE_FILE,		//	2002.04.01 YAZAKI ルールファイル用
+	OUTLINE_PYTHON,		//	2007.02.08 genta Pythonアウトライン解析
 	OUTLINE_CODEMAX,
 	OUTLINE_BOOKMARK,	//	2001.12.03 hor
 	OUTLINE_DEFAULT =-1,//	2001.12.03 hor




    


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS