添付ファイルの情報



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

fileMakeHTMLTopic2_base1428.diff
格納ファイル名:attach/446576656C6F702F38_4D616B6548544D4C546F706963325F62617365313432382E64696666
ページ:Develop/8
格納ファイル名:attach/446576656C6F702F38_4D616B6548544D4C546F706963325F62617365313432382E64696666
MD5ハッシュ値:8d721f9e800140c2fc02604ce27723a6
サイズ:9.6KB (9798 bytes)
Content-type:application/octet-stream
登録日時:2008/08/24 18:57:17
アクセス数:236
MD5ハッシュ値:8d721f9e800140c2fc02604ce27723a6
fileMakeHTMLTopic2_base1428.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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
Index: CEditDoc.cpp
===================================================================
--- CEditDoc.cpp	(revision 1428)
+++ CEditDoc.cpp	(working copy)
@@ -2893,81 +2893,144 @@
 	@date 2003.05.20 zenryaku 新規作成
 	@date 2004.04.19 zenryaku 空要素を判定
 	@date 2004.04.20 Moca コメント処理と、不明な終了タグを無視する処理を追加
+	@date 2008.08.15 aroka 見出しと段落の深さ制御を追加
 */
 void CEditDoc::MakeTopicList_html(CFuncInfoArr* pcFuncInfoArr)
 {
-	const unsigned char*	pLine;
+	const unsigned char*	pLineBuf;	//	pLineBuf は行全体を指し、
+	const unsigned char*	pLine;		//	pLine は処理中の文字以降の部分を指します。
 	int						nLineLen;
 	int						nLineCount;
 	int						i;
 	int						j;
 	int						k;
-	BOOL					bEndTag;
-	BOOL					bCommentTag = FALSE;
+	bool					bEndTag;
+	bool					bCommentTag = false;
+	bool					bParaTag = false;	//	2008.08.15 aroka
 
 	/*	ネストの深さは、nMaxStackレベルまで、ひとつのヘッダは、最長32文字まで区別
 		(32文字まで同じだったら同じものとして扱います)
 	*/
-	const int nMaxStack = 32;	//	ネストの最深
-	int nDepth = 0;				//	いまのアイテムの深さを表す数値。
-	char pszStack[nMaxStack][32];
-	char szTitle[32];			//	一時領域
+	const int				nMaxStack = 32;	//	ネストの最深
+	int						nDepth = 0;				//	いまのアイテムの深さを表す数値。
+	char					pszStack[nMaxStack][32];
+	char					szTitle[32];			//	一時領域
+	char					szTag[32];				//	一時領域  小文字で保持して高速化しています。
+	int						nLabelType;				// default, inlined, ignore, empty, block, p, heading
+	/*	同じ見出し要素(hy)を次に上位レベルの見出し(hx)が現れるまで同じ深さにそろえます。
+		このため、見出しの深さを記憶しておきます。
+		下位レベルの見出しの深さは現れるまで不定で、前の章節での深さは影響しません。 2008.08.15 aroka
+	*/
+	int						nHeadDepth[6+1];		// [0]は 空けておく
+	for(k=0;k<=6;k++){
+		nHeadDepth[k] = -1;
+	}
 	for(nLineCount=0;nLineCount<m_cDocLineMgr.GetLineCount();nLineCount++)
 	{
-		pLine	=	(const unsigned char *)m_cDocLineMgr.GetLineStr(nLineCount,&nLineLen);
-		if(!pLine)
+		pLineBuf = (const unsigned char *)m_cDocLineMgr.GetLineStr(nLineCount,&nLineLen);
+		if( !pLineBuf )
 		{
 			break;
 		}
 		for(i=0;i<nLineLen-1;i++)
 		{
+			pLine = &pLineBuf[i];
 			// 2004.04.20 Moca コメントを処理する
 			if( bCommentTag )
 			{
-				if( i < nLineLen - 3 && 0 == memcmp( "-->", pLine + i , 3 ) )
+				if( i < nLineLen - 3 && 0 == memcmp( "-->", pLine, 3 ) )
 				{
-					bCommentTag = FALSE;
+					bCommentTag = false;
 					i += 2;
+					pLine += 2;
 				}
 				continue;
 			}
 			// 2004.04.20 Moca To Here
-			if(pLine[i]!='<' || nDepth>=nMaxStack)
+			if( *pLine!='<' || nDepth>=nMaxStack )
 			{
 				continue;
 			}
-			bEndTag	=	FALSE;
-			if(pLine[++i]=='/')
+			bEndTag = false;
+			pLine++;
+			if( *pLine=='/')
 			{
-				i++;
-				bEndTag	=	TRUE;
+				pLine++;
+				bEndTag = true;
 			}
 			for(j=0;i+j<nLineLen && j<sizeof(szTitle)-1;j++)
 			{
-				if((pLine[i+j]<'a' || pLine[i+j]>'z') &&
-					(pLine[i+j]<'A' || pLine[i+j]>'Z') &&
-					!(j!=0 && pLine[i+j]>='0' && pLine[i+j]<='9'))
+				if((pLine[j]<'a' || pLine[j]>'z') &&
+					(pLine[j]<'A' || pLine[j]>'Z') &&
+					!(j!=0 && pLine[j]>='0' && pLine[j]<='9'))
 				{
 					break;
 				}
-				szTitle[j]	=	pLine[i+j];
+				szTitle[j] = pLine[j];
 			}
 			if(j==0)
 			{
 				// 2004.04.20 Moca From Here コメントを処理する
-				if( i < nLineLen - 3 && 0 == memcmp( "!--", pLine + i, 3 ) )
+				if( i < nLineLen - 3 && 0 == memcmp( "!--", pLine, 3 ) )
 				{
-					bCommentTag = TRUE;
+					bCommentTag = true;
 					i += 3;
+					pLine += 3;
 				}
 				// 2004.04.20 Moca To Here
 				continue;
 			}
-			szTitle[j]	=	'\0';
-			if(bEndTag)
+			szTitle[j] = '\0';
+			/*	タグの種類ごとに処理を変える必要があるが、
+				都度比較するのはコストが高いので、最初に分類しておく。 2008.08.15 aroka
+				比較の回数が多いため、小文字に変換しておいてstrcmpを使う。
+			*/
+			strcpy( szTag, szTitle );
+			_tolower( szTag );
+			
+			nLabelType = 'de';//default
+			// 物理要素(見た目を変えるためのタグ)は構造解析しない。
+			if( !strcmp(szTag,"b") || !strcmp(szTag,"big") || !strcmp(szTag,"blink")
+			 || !strcmp(szTag,"font") || !strcmp(szTag,"i") || !strcmp(szTag,"marquee")
+			 || !strcmp(szTag,"nobr") || !strcmp(szTag,"s") || !strcmp(szTag,"small")
+			 || !strcmp(szTag,"strike") || !strcmp(szTag,"tt") || !strcmp(szTag,"u") )
 			{
+				nLabelType = 'in';//inlined
+			}
+			// 空要素(内容を持たないタグ)のうち構造に関係ないものは構造解析しない。
+			if( !strcmp(szTag,"br") || !strcmp(szTag,"base") || !strcmp(szTag,"basefont")
+			 || !strcmp(szTag,"frame") )
+			{
+				nLabelType = 'ig';//empty
+			}
+			// 空要素(内容を持たないタグ)のうち構造に関係するもの。
+			if( !strcmp(szTag,"area") || !strcmp(szTag,"hr") || !strcmp(szTag,"img")
+			 || !strcmp(szTag,"input") || !strcmp(szTag,"link") || !strcmp(szTag,"meta")
+			 || !strcmp(szTag,"param") )
+			{
+				nLabelType = 'em';//empty
+			}
+			if( !strcmp(szTag,"div") || !strcmp(szTag,"center")
+			 || !strcmp(szTag,"address") || !strcmp(szTag,"blockquote")
+			 || !strcmp(szTag,"noscript") || !strcmp(szTag,"noframes")
+			 || !strcmp(szTag,"ol") || !strcmp(szTag,"ul") || !strcmp(szTag,"dl")
+			 || !strcmp(szTag,"dir") || !strcmp(szTag,"menu")
+			 || !strcmp(szTag,"pre") || !strcmp(szTag,"table")
+			 || !strcmp(szTag,"form") || !strcmp(szTag,"fieldset") || !strcmp(szTag,"isindex") )
+			{
+				nLabelType = 'bl';//block
+			}
+			if( !strcmp(szTag,"p") )
+			{
+				nLabelType = 'pa';//paragraph
+			}
+			if( (szTag[0]=='h') && ('1'<=szTitle[1]&&szTitle[1]<='6') ){
+				nLabelType = 'hd';//heading
+			}
+
+			if( bEndTag ) // 終了タグ
+			{
 				int nDepthOrg = nDepth; // 2004.04.20 Moca 追加
-				// 終了タグ
 				while(nDepth>0)
 				{
 					nDepth--;
@@ -2983,13 +3046,36 @@
 					{
 						nDepth = nDepthOrg;
 					}
+				}else{
+					if( nLabelType=='hd' ){	//	見出しの終わり
+						nHeadDepth[szTitle[1]-'0'] = nDepth;
+						nDepth++;
+					}
+					if( nLabelType=='pa' ){
+						bParaTag = false;
+					}
 				}
-			}
-			else
-			{
-				if(_stricmp(szTitle,"br") && _stricmp(szTitle,"area") &&
-					_stricmp(szTitle,"base") && _stricmp(szTitle,"frame") && _stricmp(szTitle,"param"))
-				{
+			} else { // 開始タグ
+				if( nLabelType!='in' && nLabelType!='ig' ){
+					//	
+					if( nLabelType=='hd' ){
+						if( nHeadDepth[szTitle[1]-'0'] != -1 ) // 小見出し:既出
+						{
+							nDepth = nHeadDepth[szTitle[1]-'0'];
+							for(k=szTitle[1]-'0';k<=6;k++){
+								nHeadDepth[k] = -1;
+							}
+							nHeadDepth[szTitle[1]-'0'] = nDepth;
+							bParaTag = false;
+						}
+					}
+					if( nLabelType=='pa' ){
+						bParaTag = true;
+					}
+					if( nLabelType=='bl' ){
+						bParaTag = false;
+					}
+
 					int		nPosX;
 					int		nPosY;
 
@@ -3000,10 +3086,7 @@
 						&nPosY
 					);
 
-					if(_stricmp(szTitle,"hr") && _stricmp(szTitle,"meta") && _stricmp(szTitle,"link") &&
-						_stricmp(szTitle,"input") && _stricmp(szTitle,"img") && _stricmp(szTitle,"area") &&
-						_stricmp(szTitle,"base") && _stricmp(szTitle,"frame") && _stricmp(szTitle,"param"))
-					{
+					if( nLabelType!='em' ){
 						// 終了タグなしを除く全てのタグらしきものを判定
 						strcpy(pszStack[nDepth],szTitle);
 						k	=	j;
@@ -3011,12 +3094,12 @@
 						{
 							for(;i+j<nLineLen;j++)
 							{
-								if(pLine[i+j]=='/' && pLine[i+j+1]=='>')
+								if( pLine[j]=='/' && pLine[j+1]=='>' )
 								{
-									bEndTag	=	TRUE;
+									bEndTag = true;
 									break;
 								}
-								else if(pLine[i+j]=='>')
+								else if( pLine[j]=='>' )
 								{
 									break;
 								}
@@ -3026,27 +3109,30 @@
 								szTitle[k++]	=	' ';
 								for(j-=k-1;i+j+k<nLineLen && k<sizeof(szTitle)-1;k++)
 								{
-									if(pLine[i+j+k]=='<' || pLine[i+j+k]=='\r' || pLine[i+j+k]=='\n')
+									if( pLine[j+k]=='<' || pLine[j+k]=='\r' || pLine[j+k]=='\n' )
 									{
 										break;
 									}
-									szTitle[k]	=	pLine[i+j+k];
+									szTitle[k] = pLine[j+k];
 								}
 							j += k-1;
 							}
 						}
 						szTitle[k]	=	'\0';
-						pcFuncInfoArr->AppendData(nLineCount+1,nPosY+1,szTitle,0,(bEndTag ? nDepth : nDepth++));
+						pcFuncInfoArr->AppendData( nLineCount+1, nPosY+1, szTitle, 0, nDepth );
+						// pの中でブロック要素がきたら、自動的にpを閉じる。言い換えると深さを変えない。
+						// = p以外のときだけ深くする。 2008.08.15 aroka
+						if( !bParaTag ){ nDepth++; }
 					}
 					else
 					{
 						for(;i+j<nLineLen && j<sizeof(szTitle)-1;j++)
 						{
-							if(pLine[i+j]=='>')
+							if( pLine[j]=='>' )
 							{
 								break;
 							}
-							szTitle[j]	=	pLine[i+j];
+							szTitle[j] = pLine[j];
 						}
 						szTitle[j]	=	'\0';
 						pcFuncInfoArr->AppendData(nLineCount+1,nPosY+1,szTitle,0,nDepth);
@@ -3671,6 +3757,12 @@
 		ref
 	); /* レイアウト情報の変更 */
 
+	// 2008.07.26 nasukoji	「折り返さない」ならテキスト最大幅を算出、それ以外は変数をクリア
+	if( m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP )
+		m_cLayoutMgr.CalculateTextWidth();		// テキスト最大幅を算出する
+	else
+		m_cLayoutMgr.ClearLayoutLineWidth();	// 各行のレイアウト行長の記憶をクリアする
+
 	/* ビューに設定変更を反映させる */
 	for( i = 0; i < 4; ++i ){
 		m_cEditViewArr[i].OnChangeSetting();
@@ -3925,6 +4017,12 @@
 	m_nTextWrapMethodCur = GetDocumentAttribute().m_nTextWrapMethod;	// 折り返し方法
 	m_bTextWrapMethodCurTemp = false;									// 一時設定適用中を解除
 
+	// 2008.07.26 nasukoji	「折り返さない」ならテキスト最大幅を算出、それ以外は変数をクリア
+	if( m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP )
+		m_cLayoutMgr.CalculateTextWidth();		// テキスト最大幅を算出する
+	else
+		m_cLayoutMgr.ClearLayoutLineWidth();	// 各行のレイアウト行長の記憶をクリアする
+
 	/* 先頭へカーソルを移動 */
 	for( i = 0; i < 4; ++i ){
 		//	Apr. 1, 2001 genta




    


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