태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


DuruEdit2011/12/28 17:25


잠깐! C,C++ 개발자 신가요? 아래 카테고리에 놀라운 것이 기다리고 있습니다.
http://krkim.net/category/kxLibrary 


업데이트서버가 원활치 못하여,삼족오가 날지 못합니다.
아직(12월 28일 오후 5:30경) 업데이트에 반영하지 못하였으니,

기간연장 하시려면 우선,아래 설치버전을 받아 수동으로 설치하시면 됩니다.

기간이 지나  기존버전이 실행이 안되시는 분도 아래 버전을 설치하시면 초기화가 됩니다.
감사합니다;-)

<<2011.12.28>> 버전 2.0.3 빌드 861
-----------------------------------------------------------------------
-무료 라이센스 사용기간 180일 연장(바빠서 기능업데이트는 없습니다)

 
원본파일명: 
DuruEdit-Setup_v2.0.3.861.exe
MD5 Checksum:
D:\Proj\App\DuruInstall\bin\Release>md5chk DuruEdit-Setup_v2.0.3.861.exe
135F0A20B339C037E4CA284C2E7D203C *DuruEdit-Setup_v2.0.3.861.exe 


 

 
저작자 표시
Posted by 두루물
DuruEdit2011/09/10 14:51


질문) DuruEdit 설치시 기존에 쓰던 설정내용을 보관하였다 설치후 복원하려 합니다.
        DuruEdit의 환경설정 파일은 어디에 있나요?

두루에디트의 대부분의 기본 환경설정은 레지스트리 HKEY_CURRENT_USER\SOFTWARE\DuruEdit에 존재합니다.

그밖에 FTP,프로젝트파일,FTPSite등은 사용자 홈디렉토리의 AppData\Roaming\DuruEdit 폴더에 존재합니다.(숨김속성이므로 AppData 폴더를 보려면 탐색기 메뉴에서 폴더옵션에서 숨김파일,시스템파일 보이기를 해야 합니다)

기존에 사용하셨던 설정내용을 보관하려면,레지스트리의 좌측트리에 나타난 DuruEdit 키폴더를 누르고 우측메뉴의 내보내기로 백업 저장한 후, DuruEdit를 설치후 가져오기를 하여 설정내용을 새버전에 적용할 수 있습니다.

단,버전에 따라 기존 환경설정 내용이 호환이 되지 않을수도 있습니다.
 
저작자 표시
Posted by 두루물
DuruEdit2011/08/22 03:42


<<2011.08.22>> 버전 2.0.3 빌드 860
-----------------------------------------------------------------------
-스크롤바(트랙바&Draw) 드래그시 밀림현상 Fix.
 

 
원본파일명: 
DuruEdit-Setup_v2.0.3.860.exe
MD5: C50B81313B01E2A6D0115ECD74A64E75 *DuruEdit-Setup_v2.0.3.860.exe


기존 사용자는 따로 설치하지 않아도 자동 업데이트 됩니다.
감사합니다. 
저작자 표시
Posted by 두루물
DuruEdit2011/06/20 23:53




저작자 표시
Posted by 두루물
DuruEdit2011/06/15 18:45



두루에디트 Tip,특정 문자를 기준으로 줄바꿈(개행) 하는 방법입니다.
여기서는, 문서 내용중 현재 문서 전체를 대상으로 "public" 이란 단어뒤를
줄바꿈(개행처) 처리 하는 것으로 예를 들겠습니다.


1) 먼저 변경하려는 문자열 단어를 선택블럭 한 후에 , Ctrl + R 를 눌러 빠른 바꾸기 창을 띄웁니다.
찾을 내용이 맞는지 확인 합니다.




2) 아래 그림처럼 찾기 옵션에서 정규식 체크박스를 선택합니다.
그러면 바꿀 내용 우측의 [..] 버튼이 활성화 됩니다.
버튼을 눌러 아래 그림처럼 줄바꿈 메뉴를 선택 하십니다. (직접 
 을 치셔도 됩니다)



3) 그러면 아래 그림 처럼 바꿀 내용에 줄바꿈을 뜻하는 특수 문자(\r\n )가 추가 됩니다.
아 그러나, 약간의 버그(?) 때문에 앞쪽에 붙여넣기가 되어 버리네요..
워낙 바빠서 알고도 눈뜨고 보기만 합니다..ㅡㅡ;;시간나면 꼭 수정하도록 하겠습니다.
바로 아래 연속된 그림 처럼,"public" 이라는 문자열 뒤쪽으로 줄바꿈 할것 이므로
"public" 을 Ctrl+C로 잘라내어 맨 앞쪽에 Ctrl+V 로
붙여넣습니다.



4) 찾는 위치를 확인한 후,(잘못되서 엉뚱한 파일 전체를 대상으로 하면 큰일이므로 ^^ )
모두 바꾸기를 누릅니다..



*정규식 사용 옵션은 특수문자를 대상으로 할때나 또는 정규표현식 검색을 주로 사용하는
정교한 검색에 사용하는 경우 이므로 평소의 일반적인 검색이나 바꾸기에는 필요하지 않습니다.
따라서 해당 검색이나 바꾸기가 끝난 후에
원래대로 체크해제 해주십시오.
(정규식이 아닌 일반검색의 작동에 영향을 줄수 있으므로)

며느리도 모르고, 친구도 모르게 알게 모르게 쓰는 텍스트 에디터!
두루에디트를 사용해주시는 모든분께 감사를 드립니다.
특히,질문하신 분께 진심으로 감사 드립니다. 댓글로 간단하게 답변드릴려다가,
너무 성의없는거 같아서 조금 시간내서 답변드려봤습니다..행복한 나날들 되시길..

저작자 표시
Posted by 두루물
DuruEdit2011/05/05 22:40


권장 사용환경: Windows 7(32,64비트)(기본 XP이상)
권장 폰트:     Bitstream Vera Sans Mono Font
               XP에서 폰트가 흐려지는 경우,
               디스플레이 속성에서 ClearType을 사용하세요
공식 다운로드: http://duruedit.com
버그개선 피드백: mailto://duruedit@gmail.com 또는 이곳에서 댓글..

*이번버전 특징: Eclipse 외에 서브 editor 로 ActionScript 가능하게 하였습니다.
지원언어 문법:
Flat File(Plain Text),C/C++,HTML/XML/CSS,PHP,JSP/JS/JAVA,ASP,SQL,PC/EC,C#,AS(ActionScript)


<<2011.05.05>> 버전 2.0.3 빌드 859
-----------------------------------------------------------------------
-대용량(수MB이상) 파일에서 스크롤바(트랙바&Draw) 오작동 Fix.
-파일로드시 시간이 걸릴경우 Loading 이미지 표시
-Flash ActionScript 구문분석 추가
-240일 사용기간 연장(경과시 홈페이지에서 최신버전 다운로드&설치)


*외부 2차 배포를 원할 경우,원본 파일명 (DuruEdit-Setup_v2.0.3.859.exe) 유지하시면 감사하겠습니다.^^*

감사합니다.
저작자 표시
Posted by 두루물
DuruEdit2011/04/28 12:12


권장 사용환경: Windows 7(32,64비트)(기본 XP이상)
권장 폰트:     Bitstream Vera Sans Mono Font
               XP에서 폰트가 흐려지는 경우,
               디스플레이 속성에서 ClearType을 사용하세요
공식 다운로드: http://duruedit.com
버그개선 피드백: mailto://duruedit@gmail.com

 


<<2011.04.28>> 버전 2.0.2 빌드 291
-----------------------------------------------------------------------
-UTF8(유니코드)문서에서 바꾸기시 이전 내용이 APPEND 되던 현상 수정.
-문서를 열고 작업이 아닌 UTF8 문서파일에서 직접 찾기/바꾸기시 영문기호만 되었으나 이제 한글지원.

저작자 표시
Posted by 두루물
DuruEdit2011/04/12 00:26


안녕하세요,두루에디트 개발자 '두루물' 입니다.
프로그램 사용 중 정규표현식(RegEx) 검색에 일부 검색결과에
오류를 자체 발견하여 버그패치 하였습니다.
(검색결과 강조표시 포함,문서 전체에 걸친 검색결과 길이의 오버플로우 강조표시 오류)
감사합니다.^^
 

<<2011.04.11>> 버전 2.0.2 빌드 282 패치내용
-----------------------------------------------------------------------
-검색결과 강조표시에 정규식 결과 정확성 향상
-검색창 다음찾기로 단계별 검색하는 도중에 검색어를 변경할 경우 처음의
 검색지점에 돌아와도 더이상 일치하지 않음이 뜨지않고 계속 반복되는 현상
-정규식 검색시 문서전체가 검색되는 현상을 검색어에 포함된 LF의 갯수 + 1
 만큼 라인단위로 검색하도록 하여 검색결과 선택블럭이 정확하도록 수정함.
-기존의 남은 사용기한 98일 180일로 풀업.


[수정된 화면]



원본 파일명: DuruEdit-Setup_v2.0.2.282.exe

다운로드:



 


저작자 표시
Posted by 두루물
DuruEdit2011/03/18 01:03



+핫키저장 버그 수정

설치원본 파일명: DuruEdit-Setup_v2.0.2.254.exe

저작자 표시
Posted by 두루물
DuruEdit2011/01/07 23:09


 DURUEDIT Official Release Page

1MB 도 안되는 깔끔하고 간단한 윈도우즈 무료 텍스트 편집기!
지만,그누구도 따라올수 없는 강력한 검색기능^^


늘,2011년 새해 기념으로,
수많은 텍스트 편집기가 있지만 새로운 국산 텍스트 편집기
두루에디트를 세계최초로 이곳에 공개합니다.
오래전 그동안 개인적으로 사용하기 위해 짬짬이 만들어 쓰는 것이고 무료 입니다.
외산 울트라 에디트 돈주고 외화낭비하며 사실 필요없습니다.
필요하신 분은 언제든지 받아 가시고 마음껏 사용해도 됩니다.
사용상 불편함 & 버그 & 개선점 피드백: durumul@gmail.com 메일 주시면 됩니다.
(요즘,당분간 바빠서 개인적으로 손 못댑니다^^)

제품 정보

두루인스톨러™가 설치하려는 제품 "두루에디트" 정보 및 소개
두루에디트 프로그램을 설치하기 전에 본 제품 정보 및 소개를 읽어보십시오.

[켐페인]"간도와 독도는 영원한 대한민국 영토이다"

두루에디트™ 를 설치하고 있는 이 설치 프로그램은 두루인스톨러™ 로 작성한 셋업 프로그램 입니다.
두루인스톨러™는 두루물(제작자 별칭)이 2004년 무렵 처음 자체 개발한 후 그동안 묵혀두었다가 최근에 수정작업을 한 후 릴리즈 예정인 인스톨 쉴드,NSIS 등과 버금가는 프로그램 설치 / 제거 관리 프로그램 입니다.
두루에디트™는 2010년 현재 비공개판 테스트 목적으로 지인에게만 배포되고 있습니다.현재 비 상업용 프로그램 이지만 인터넷 및 공공에게 제작자의 동의없이 무단 배포를 금합니다.
이 설치버전에는 두루업데이트도 포함되어 있습니다.

두루 에디트 주요 기능

★어디에서도 경험하지 못한 강력한 검색기능
(정규식포함/탐색기 파일찾기등/안전한 쓰레드,vc++ IDE의 검색기능 그대로 구현함)
(파일찾기,파일에서찾기,파일에서 모두 바꾸기등 탐색기 자체의 검색 기능보다 빠름)

★스마트한 인쇄 / 인쇄미리보기 기능 (울트라 에디트와 동일,단 한페이지 2장인쇄는 안됨,이것은 프린트 속성에서 가능)

★강력한 헥사 편집 기능

★문법 구문 색상 하이라이트 기능(C,C++/ SQL/ TXT / HTML /JAVA / ASP/ PHP등)
개별 색상 설정 가능( 기존의 상용 에디터 보다 강력한 색상 개별 지정 가능)

★간편찾기 기능 ( 인터넷 익스플로러의 강조표시 기능)
타 에디터에 없는 기능

★FTP 원격 파일 직접 편집가능 (울트라와 동일함)

[+]다운로드 :::::::


[두루에디트 프로젝트 기능으로 서버 개발중인 모습]


페이지의 버전은 오래된 버전으로,설치후에 그동안 업데이트 패치등을 별도로 모두 받아 오므로,업데이트에 드는 작업 시간이 걸립니다. 이 페이지의 버전으로 설치하지 마시고 카테고리의 최신글에 올라온 최신버전으로 설치를 권장합니다. 감사합니다.

저작자 표시
Posted by 두루물
DuruEdit2010/11/23 06:57


2010년 올해는 여기까지만 작업해야 겠다.. 힘들다... --;;

         두루에디트: 미공개 텍스트에디터
                          지원언어 구문색상:C/C++,PHP,SQL,C#,Java,ASP,Js,PC,EC,TXT....
                          특징: 강력한 검색기능(파일,폴더내 문서내,모든열린문서내 초고속 검색 및
                                  정규표현식 검색)
                          초경량(1MB미만) 사이즈

이번에 개선된 기능
==================

<<2010.11.23>> 버전 1.5.1 빌드 757 안정화 버전(stable version)
-----------------------------------------------------------------------
-치명적인 메모리 반환 불가로 인한 MemoryLeak 문제 FIX,100% 안정화
-리사이징시 우측 경계창 깜빡거리는 문제 일부 다시 보완
-탭바 스크롤된 상태에서 문서닫은후 툴팁의 파일경로 매칭오류 수정
-FTP 권한문제로 접속실패후 일부 서버응답 메세지 ?? 문자 깨짐 수정
-FTP 의 초기 원격 디렉토리에 최근 위치로 이동하는 자동 옵션 추가
-라이센스 관련 로컬머신 레지스트리 사용하는 부분 제거
-라이센스 관련 HDD 시리얼번호 읽는 루틴 없애 가상화 기반 안정화
-UAC 사용자 권한을 "관리자 권한"에서 "일반 사용자 권한"으로 하향조정
-업데이트 실행시 사용하지 않는 Idle 시간 1분 경과후에 팝업뜨도록 수정
-FTPSites.xml을 C:\Users\UserName\AppData\Roaming\DuruEdit 폴더로 이동
 (XP에서는 C:\Users\UserName\Application Data\DuruEdit)
-언인스톨시 AppData\Roaming\DuruEdit의 업데이트 누적 설치파일들 제거
-파일연결,탐색기메뉴등록,프로그램폴더저장등 일부 관리자권한 필요


나머지 스크린 샷

강력한 빠른찾기: 찾는위치는 현재문서,모든 열린문서,선택영역을 대상으로 한다.
강력한 빠른 바꾸기

강력한 파일에서 바꾸기: 정해진 폴더를 하위폴더 포함하여 문서내 텍스트를 REPLACE한다.


파일에서 찾기: 폴더에서 문자열을 검색하여 포함된 파일들 목록과 해당 줄을 보여준다.
파일형식 찾기: 폴더내 확장자를 가진 파일들을 찾는다.

정규표현식 검색:
헥사편집:
울트라에디터 보다 한수 위인 열모드 삽입 채우기와 선택열 보여주기

FTP 사이트 관리 및 접속:UTF8 목록 지원,Passive지원등등.기본 FTP 기능 모두 포함됨.(SFTP제외)


검색결과 강조표시:(노란색 부분)
환경설정:


인쇄 미리보기:

특수문자 및 기호:

아스키 테이블:
자매품 두루업데이트 내장:


깔끔한 뉴 메뉴 스타일 UI:


기타 등등..

*위의 스크린샷에 나타난 이 모든것,두루 에디트는 바로 KFC Library (kxLibrary1.0) 로 작성 됨.
저작자 표시
Posted by 두루물
DuruEdit2010/10/09 04:19



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
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
/* 
  $Id: DEParserHtml.cpp 25 2000-11-28 00:34:01Z krkim $ $Revision: 125 $
  $HeadURL: http://krkim-laptop/svn/DuruEdit/Src/DEEditDLL/DEParserHtml.cpp $
  HomePage: http://krkim.net
  Copyright(c) 1990-2010 krkim Allrights reserved.
 */

//HTML 파일안에는 script 영역(vb,java),html일반,asp 스크립트,php 스크립트 영역이 있다.
//클라이언트 스크립트:
//클라이언트 스크립트내 주석처리 태그 <!-- 와 --> 는 실제로 
//이사이를 주석처리 컬러링하면 안되고 <!--와 -->만 컬러링처리
//JAVASCRIPT,VBSCRIPT

//서버 스크립트:
//HTML 본문이나 CLIENTSCRIPT 본문에 올수 있음
//ASP,JSP,PHP등의 서버스크립트 구간

/*
<script language="javascript">  or <script type="text/javascript>
<!--  => 는 주석이 아니고 스크립트 지원안하는 브라우저를 위한 태그주석임,따라서 스크립트 영역내 <!--는 무시한다
// code here 
//--> 
</script> 
//자바스크립트내에서 PHP호출 한 경우
<script type="text/javascript"> 
var TabURL = '<?=$value?>'; 
</script> 

*/
#include "stdafx.h"
#include "html.h"

enum ENUM_HTMLCOOKIE{
	HTMLCOOKIE_NORMAL,				//HTML 본문(html 태그밖)
	HTMLCOOKIE_BRACKET,				//태그
	HTMLCOOKIE_COMMENT,				//<!-- -->
	HTMLCOOKIE_VALUE1,				//태그 속성이름
	HTMLCOOKIE_VALUE2,				//태그 속성값

	HTMLCOOKIE_CSS,					// <style

	/*
	  <script ~> 와 </script> 의 Java 클라이언트 스크립트 본문
	 */
	HTMLCOOKIE_JAVASCRIPT,			
	HTMLCOOKIE_VBSCRIPT,			
	HTMLCOOKIE_CLIENTSCRIPT_BRACKET,
	HTMLCOOKIE_CSS_BRACKET,
	/*
	  <% %> ,<? ?> 등 서버스크립트 본문
	  ASP with JavaScript and VBScript
     */
	HTMLCOOKIE_ASP,
	HTMLCOOKIE_ASPSTRING,			// "
	HTMLCOOKIE_ASPLINECOM,			// ' or rem
	HTMLCOOKIE_PHP,
	HTMLCOOKIE_PHPSTRING,			// ' or " :작은 따옴표single quotation marks 《 '》와 큰 따옴표double quotation marks《" "》 
	HTMLCOOKIE_PHPSINGLESTRING,		// ' or " :작은 따옴표single quotation marks 《 '》와 큰 따옴표double quotation marks《" "》 
	HTMLCOOKIE_PHPLINECOM,			// // or #
	HTMLCOOKIE_PHPBLOCKCOM,			// /* */

	HTMLCOOKIE_JSP,
	HTMLCOOKIE_JSPBLOCKCOM,			// <%-- --%>
	HTMLCOOKIE_URL,
};

enum ENUM_HTMLSTYLEINDEX{
	HTML_STYLE_NORMAL = STYLEINDEX_NORMAL,
	HTML_STYLE_URL    = STYLEINDEX_URL,
	HTML_STYLE_TAG    = STYLEINDEX_USER,
	HTML_STYLE_ATTR,
	HTML_STYLE_VALUE,
	HTML_STYLE_COMMENT,
	HTML_STYLE_OPERATOR,
	HTML_STYLE_FUNCNAME,
	HTML_STYLE_CS,		//Client Script
	HTML_STYLE_CSKEY,
	HTML_STYLE_CSSTRING,
	HTML_STYLE_CSCOMMENT,
	HTML_STYLE_CSOPERATOR,
	HTML_STYLE_CSFUNCNAME,
	HTML_STYLE_SS,		//Server Script
	HTML_STYLE_SSKEY,
	HTML_STYLE_SSSTRING,
	HTML_STYLE_SSCOMMENT,
	HTML_STYLE_SSFUNCTION,
	HTML_STYLE_SSOPERATOR,
	HTML_STYLE_SSFUNCNAME,
};

DEParserHtml::DEParserHtml()
{
	m_aTextStyle[STYLEINDEX_SEARCH]	= DETEXTSTYLE("검색결과",RGB(255,255,0),RGB(128,0,0));
	m_aTextStyle[HTML_STYLE_NORMAL]	= DETEXTSTYLE("보통",COLOR_DEFAULT,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_URL]	= DETEXTSTYLE("링크",RGB(0,0,255)		,COLOR_DEFAULT		,0,1,1);
	m_aTextStyle[HTML_STYLE_TAG]	= DETEXTSTYLE("HTML 일반"	,RGB(0,0,255),COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_ATTR]	= DETEXTSTYLE("HTML 속성"	,RGB(255,0,0),COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_VALUE]	= DETEXTSTYLE("HTML 속성값"	,RGB(0,128,0)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_COMMENT]	= DETEXTSTYLE("HTML 주석"	,RGB(128,128,128)	,COLOR_DEFAULT,0,0,1);
	m_aTextStyle[HTML_STYLE_OPERATOR]	= DETEXTSTYLE("연산자"			,RGB(256,64,96)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_FUNCNAME]	= DETEXTSTYLE("일반 함수이름"	,RGB(196,96,96)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_CS]		= DETEXTSTYLE("Client Script 코드"		,RGB(128,0,0)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_CSKEY]	= DETEXTSTYLE("Client Script 키워드"		,RGB(128,0,255)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_CSSTRING]	= DETEXTSTYLE("Client Script 문자열"		,RGB(225,0,225)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_CSCOMMENT]	= DETEXTSTYLE("Client Script 주석"		,RGB(0,128,0)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_CSOPERATOR]	= DETEXTSTYLE("Client Script 연산자"		,RGB(128,72,0)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_CSFUNCNAME]	= DETEXTSTYLE("Client Script 함수이름"	,RGB(142,0,128)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SS]		= DETEXTSTYLE("Server Script 코드"		,RGB(0,64,128)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SSKEY]	= DETEXTSTYLE("Server Script 키워드"		,RGB(0,0,255)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SSSTRING]	= DETEXTSTYLE("Server Script 문자열"		,RGB(225,0,225)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SSCOMMENT]	= DETEXTSTYLE("Server Script 주석"		,RGB(128,0,128)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SSFUNCTION]	= DETEXTSTYLE("Server Script 함수"		,RGB(255,0,0)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SSOPERATOR]	= DETEXTSTYLE("Server Script 연산자"		,RGB(24,64,96)		,COLOR_DEFAULT);
	m_aTextStyle[HTML_STYLE_SSFUNCNAME]	= DETEXTSTYLE("Server Script 함수이름"	,RGB(96,96,128)		,COLOR_DEFAULT);
}

[+]BOOL DEParserHtml::IsHTMLTag(LPCTSTR lpBuffer,int nLen)
[+]BOOL DEParserHtml::IsHTMLAttr(LPCTSTR lpBuffer,int nLen)
[+]BOOL DEParserHtml::IsJSPFunction(LPCTSTR lpBuffer,int nLen)
[+]BOOL DEParserHtml::IsJSPKeyword(LPCTSTR lpBuffer,int nLen)


[+]
BOOL
DEParserHtml::IsPhpKeyword(LPCTSTR lpBuffer,int nLen) [+]BOOL DEParserHtml::IsPhpFunction(LPCTSTR lpBuffer,int nLen) [+]BOOL DEParserHtml::IsAspKeyword(LPCTSTR lpBuffer,int nLen) [+]BOOL DEParserHtml::IsOperator(TCHAR ch) [-]DWORD DEParserHtml::ParseLine(DWORD dwCookie,DEPARAINFO *ParaInfo,LPCALLBACKPUSHTEXTBLOCK
lpfnCallbackPushTextBlock)
{
	int i;
	int iEnd;
	int QuitFlag = 0;

	BOOL bFirstChar = TRUE;
	BOOL bRedefineBlock = TRUE;
	BOOL bDecIndex = FALSE;
	int  iBegin = -1;
	BOOL bScriptTag = FALSE;
	int nCookie = LOBYTE(LOWORD(dwCookie));
	int nPrevID = HIBYTE(LOWORD(dwCookie));
	int nRootID = HIBYTE(HIWORD(dwCookie));
	int nCurrID = LOBYTE(HIWORD(dwCookie));

	//다음라인에 영향을 주는(이전라인에서 영향을 받아 계승하는) 블럭쿠키들
	//공백줄
	if(ParaInfo->nLen <= 0){//블럭주석 처리시는 체크
		if(nCookie == HTMLCOOKIE_PHPBLOCKCOM || nCookie == HTMLCOOKIE_JSPBLOCKCOM) // /* or <%-- --%>
			DEFINE_BLOCK(0,(nCurrID <= HTMLCOOKIE_VBSCRIPT) ? HTML_STYLE_CSCOMMENT : HTML_STYLE_SSCOMMENT);
		else if(nCookie == HTMLCOOKIE_COMMENT) // <!-- 블럭가능
			DEFINE_BLOCK(0,HTML_STYLE_COMMENT);
		else if(nCookie == HTMLCOOKIE_ASP || nCookie == HTMLCOOKIE_PHP)
			DEFINE_BLOCK(0,HTML_STYLE_SS);
		else if(nCookie == HTMLCOOKIE_JAVASCRIPT || nCookie == HTMLCOOKIE_VBSCRIPT)
			DEFINE_BLOCK(0,HTML_STYLE_CS);
		else if(nCookie == HTMLCOOKIE_PHPLINECOM || nCookie == HTMLCOOKIE_ASPLINECOM){	// // or #
			DEFINE_BLOCK(0,(nCurrID <= HTMLCOOKIE_VBSCRIPT) ? HTML_STYLE_CS : HTML_STYLE_SS);
			//nCookie = nCurrID;
		}
		else{ //asp는 ' 나 rem 한줄 주석밖에 없음
			DEFINE_BLOCK(0,HTML_STYLE_NORMAL);
			nCookie = HTMLCOOKIE_NORMAL;
		}
		return MAKELONG(MAKEWORD(nCookie,nPrevID),MAKEWORD(nCurrID,nRootID));
	}
	for (i = 0; i < ParaInfo->nLen ; i++){
		if(bRedefineBlock)//새 블록 시작시
		{
			int nPos = i;
			if(bDecIndex)
				nPos--;

			bRedefineBlock = FALSE;
			bDecIndex = FALSE;
			iBegin = i;
			switch(nCookie){
			case HTMLCOOKIE_VALUE1:
			case HTMLCOOKIE_VALUE2:
				DEFINE_BLOCK(nPos,HTML_STYLE_VALUE);
				break;
			case HTMLCOOKIE_VBSCRIPT:
			case HTMLCOOKIE_JAVASCRIPT:
				DEFINE_BLOCK(nPos,HTML_STYLE_CS);
				break;
			case HTMLCOOKIE_ASP:
			case HTMLCOOKIE_PHP:
				DEFINE_BLOCK(nPos,HTML_STYLE_SS);
				break;
			case HTMLCOOKIE_ASPSTRING:
			case HTMLCOOKIE_PHPSTRING:
			case HTMLCOOKIE_PHPSINGLESTRING:
				DEFINE_BLOCK(nPos,(nCurrID <= HTMLCOOKIE_VBSCRIPT) ? HTML_STYLE_CSSTRING : HTML_STYLE_SSSTRING);
				break;
			case HTMLCOOKIE_COMMENT:
				DEFINE_BLOCK(nPos,HTML_STYLE_COMMENT);
				break;
			case HTMLCOOKIE_PHPBLOCKCOM:
			case HTMLCOOKIE_JSPBLOCKCOM:
				DEFINE_BLOCK(nPos,(nCurrID <= HTMLCOOKIE_VBSCRIPT) ? HTML_STYLE_CSCOMMENT : HTML_STYLE_SSCOMMENT);
				break;
			case HTMLCOOKIE_PHPLINECOM:
			case HTMLCOOKIE_ASPLINECOM:
				DEFINE_BLOCK(nPos,(nCurrID <= HTMLCOOKIE_VBSCRIPT) ? HTML_STYLE_CS : HTML_STYLE_SS);
				nCookie = nCurrID;//CRLF로 분리된 파라단위로 들어오기 때문에 노멀처리한다.
				break;
			case HTMLCOOKIE_URL:
				if(nPrevID == HTMLCOOKIE_PHPBLOCKCOM)
					DEFINE_BLOCK_EX(nPos,HTML_STYLE_URL,textmask_nocolor);
				else
					DEFINE_BLOCK(nPos,HTML_STYLE_URL);
				break;
			case HTMLCOOKIE_BRACKET:
			case HTMLCOOKIE_CLIENTSCRIPT_BRACKET:
			case HTMLCOOKIE_CSS_BRACKET:
				DEFINE_BLOCK(nPos,HTML_STYLE_TAG);
				break;
			default:
				DEFINE_BLOCK(nPos,HTML_STYLE_NORMAL);
				break;
			}
		}

		if(i >= ParaInfo->nLen)
			break;
		//[2]해제루틴
		switch(nCookie){
		//str = "<a href=""/"">home</a>"
		case HTMLCOOKIE_ASPSTRING:
			if(ParaInfo->pBuff[i]=='\"'){// && (ParaInfo->pBuff[i+1] != '\"')) {
				bRedefineBlock = TRUE;
				nCookie = nCurrID;
			}
			continue;
		case HTMLCOOKIE_PHPSTRING:
		case HTMLCOOKIE_PHPSINGLESTRING:
			{
				TCHAR ch = '\"';
				if(nCookie == HTMLCOOKIE_PHPSINGLESTRING)
					ch = '\'';
				if(ParaInfo->pBuff[i]== ch && (i == 0 || i > 0 && ParaInfo->pBuff[i-1] != '\\')) {
					bRedefineBlock = TRUE;
					nCookie = nCurrID;
					continue;
				}
				if(CheckURL(ParaInfo->pBuff + i,6))
				{
					DEFINE_BLOCK_EX(i,HTML_STYLE_URL,textmask_nocolor);
					nPrevID = nCookie;
					nCookie = HTMLCOOKIE_URL;
					i += 6;
					continue;
				}
			}
			continue;
		case HTMLCOOKIE_URL:
			if(IsSpaceChar(ParaInfo->pBuff[i]) || ParaInfo->pBuff[i] == '\t' ||
				ParaInfo->pBuff[i] == '\"' || ParaInfo->pBuff[i] == ';' || ParaInfo->pBuff[i] == ')' || ParaInfo->pBuff[i] == '<'){
				bRedefineBlock = TRUE;
				nCookie = nPrevID;
				i--;
				continue;
			}
			if(ParaInfo->pBuff[i] == '/' && (ParaInfo->pBuff[i+1] == '/' || ParaInfo->pBuff[i+1] == '*')){
				bRedefineBlock = TRUE;
				nCookie = nCurrID;
				i--;
				continue;
			}
			continue;
		case HTMLCOOKIE_COMMENT:
			if (ParaInfo->pBuff[i]=='-' && ParaInfo->pBuff[i+1]=='-' && ParaInfo->pBuff[i+2]=='>') {
				i+=2;
				bRedefineBlock = TRUE;
				nCookie = nCurrID;
			}
			continue;
		case HTMLCOOKIE_PHPBLOCKCOM:
			if (ParaInfo->pBuff[i]=='*' && ParaInfo->pBuff[i+1]=='/') {
				i++;
				bRedefineBlock = TRUE;
				nCookie = nCurrID;
			}
			if(CheckURL(ParaInfo->pBuff + i,6))
			{
				DEFINE_BLOCK_EX(i,HTML_STYLE_URL,textmask_nocolor);
				nPrevID = nCookie;
				nCookie = HTMLCOOKIE_URL;
				i += 6;
				continue;
			}
			continue;
		case HTMLCOOKIE_JSPBLOCKCOM:
			if (ParaInfo->pBuff[i]=='-' && ParaInfo->pBuff[i+1]=='-' && ParaInfo->pBuff[i+2]=='%'
				 && ParaInfo->pBuff[i+3]=='>') {
				i+=3;
				bRedefineBlock = TRUE;
				nCookie = nCurrID;
			}
			continue;
		case HTMLCOOKIE_VALUE1:
			if (ParaInfo->pBuff[i]=='\\') {
				i++;
				continue;
			}
			if (ParaInfo->pBuff[i]=='\"') {
				bRedefineBlock = TRUE;
				nCookie = HTMLCOOKIE_BRACKET;
			}
			continue;
		case HTMLCOOKIE_VALUE2:
			if (ParaInfo->pBuff[i]=='\\') {
				i++;
				continue;
			}
			if (ParaInfo->pBuff[i]=='\'') {
				bRedefineBlock = TRUE;
				nCookie = HTMLCOOKIE_BRACKET;
			}
			continue;
		case HTMLCOOKIE_ASP:
			if (ParaInfo->pBuff[i]=='%' && ParaInfo->pBuff[i+1]=='>') {
				i++;
				bRedefineBlock = TRUE;
				//자바스크립트영역내에서도 호출될 수 있음
				nCookie = nRootID;//Normal or Script
				continue;
			}
			break;
		case HTMLCOOKIE_PHP:
			if (ParaInfo->pBuff[i]=='?' && ParaInfo->pBuff[i+1]=='>') {
				i++;
				bRedefineBlock = TRUE;
				nCookie = nRootID;//Normal or Script
				continue;
			}
			break;
		case HTMLCOOKIE_BRACKET:
		case HTMLCOOKIE_CLIENTSCRIPT_BRACKET:
		case HTMLCOOKIE_CSS_BRACKET:
			if(ParaInfo->pBuff[i]=='>') {
				DEFINE_BLOCK(i,HTML_STYLE_TAG);
				bRedefineBlock = TRUE;
				//내가속한 본문속성으로,자바스크립트 시작태그이면 HTMLCOOKIE_JAVASCRIPT 이고
				//일반 태그나 스크립트 끝 태그이면 HTMLCOOKIE_NORMAL 
				nCookie = nCurrID;
				continue;
			}
			break;
		case HTMLCOOKIE_CSS:
			if(ParaInfo->pBuff[i]=='<') {
				if(ParaInfo->pBuff[i+1]=='/' && !strnicmp(ParaInfo->pBuff+i+2,"style",5)){
					DEFINE_BLOCK(i,HTML_STYLE_TAG);
					bRedefineBlock = TRUE;
					nCookie = HTMLCOOKIE_BRACKET;
					nCurrID = HTMLCOOKIE_NORMAL;//각문서의 기본쿠키로 설정할것
					continue;
				}
			}
			break;
		case HTMLCOOKIE_JAVASCRIPT: //자바,vb스크립트 본문
		case HTMLCOOKIE_VBSCRIPT:
			if (ParaInfo->pBuff[i]=='-' && ParaInfo->pBuff[i+1]=='-' && ParaInfo->pBuff[i+2]=='>') {
				DEFINE_BLOCK(i,HTML_STYLE_COMMENT);
				i+=2;
				bRedefineBlock = TRUE;
				nCookie = nCurrID;
				continue;
			}
			if(ParaInfo->pBuff[i]=='<') {
				if(ParaInfo->pBuff[i+1]=='/' && !strnicmp(ParaInfo->pBuff+i+2,"script",6)){
					DEFINE_BLOCK(i,HTML_STYLE_TAG);
					bRedefineBlock = TRUE;
					nCookie = HTMLCOOKIE_BRACKET;
					nCurrID = HTMLCOOKIE_NORMAL;//각문서의 기본쿠키로 설정할것
					continue;
				}
			}
			break;
		}

		//[1]설정루틴
		switch(nCookie){
			case HTMLCOOKIE_NORMAL://among HTML Tag (HTML 일반)
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='!' && ParaInfo->pBuff[i+2]=='-' && ParaInfo->pBuff[i+3]=='-') {
					DEFINE_BLOCK(i,HTML_STYLE_COMMENT);
					i += 3;
					nCookie = HTMLCOOKIE_COMMENT;
					continue;
				}
				//ASP or JSP
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='%') {
					DEFINE_BLOCK(i,HTML_STYLE_SS);
					i += 1;
					nRootID = nCookie;
					nCurrID = nCookie = HTMLCOOKIE_ASP;
					//TODO:: ';'유무로 JSP 구분지어야 함.
					//이유는 ASP는 '가 한라인 주석으로 처리되고 JSP는 C,PHP와 같이
					//문자열로 취급하기 때문이다.
					continue;
				}
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='?') {
					DEFINE_BLOCK(i,HTML_STYLE_SS);
					i += 1;
					nRootID = nCookie;
					nCurrID = nCookie = HTMLCOOKIE_PHP;
					continue;
				}
				if (!strnicmp(ParaInfo->pBuff+i,"<style",6)) {
					DEFINE_BLOCK(i,HTML_STYLE_TAG);
					i +=5;
					bScriptTag = 1;
					nRootID = nCookie;
					nCurrID = HTMLCOOKIE_CSS;
					nCookie = HTMLCOOKIE_BRACKET;
					continue;
				}
				if (!strnicmp(ParaInfo->pBuff+i,"<script",7)) {
					DEFINE_BLOCK(i,HTML_STYLE_TAG);
					i +=6;
					bScriptTag = 1;
					nRootID = nCookie;
					nCurrID = HTMLCOOKIE_JAVASCRIPT;
					if(FindBuffer(ParaInfo->pBuff+i+7,TEXT("vbscript"),128) != -1){
						nCurrID = HTMLCOOKIE_VBSCRIPT;
					}
					nCookie = HTMLCOOKIE_CLIENTSCRIPT_BRACKET;
					continue;
				}
				if (ParaInfo->pBuff[i]=='<') {
					bScriptTag = 0;
					DEFINE_BLOCK(i,HTML_STYLE_TAG);
					nRootID = nCookie;
					nCurrID = nCookie;
					nCookie = HTMLCOOKIE_BRACKET;
					continue;
				}
				if(CheckURL(ParaInfo->pBuff + i,6))
				{
					DEFINE_BLOCK(i,HTML_STYLE_URL);
					nRootID = nCookie;
					nPrevID = nCurrID = nCookie;
					nCookie = HTMLCOOKIE_URL;
					i += 6;
					continue;
				}
				break;
			case HTMLCOOKIE_JAVASCRIPT:
			case HTMLCOOKIE_VBSCRIPT:
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='!' && ParaInfo->pBuff[i+2]=='-' && ParaInfo->pBuff[i+3]=='-') {
					DEFINE_BLOCK(i,HTML_STYLE_COMMENT);
					i += 3;
					bRedefineBlock = TRUE;
					continue;
				}
				//ASP or JSP
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='%') {
					DEFINE_BLOCK(i,HTML_STYLE_SS);
					i += 1;
					nRootID = nCookie;
					nCurrID = nCookie = HTMLCOOKIE_ASP;
					continue;
				}
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='?') {
					DEFINE_BLOCK(i,HTML_STYLE_SS);
					i += 1;
					nRootID = nCookie;
					nCurrID = nCookie = HTMLCOOKIE_PHP;
					continue;
				}
				if (ParaInfo->pBuff[i]=='\"') {
					DEFINE_BLOCK(i,HTML_STYLE_CSSTRING);
					nCurrID = nCookie;
					nCookie = HTMLCOOKIE_PHPSTRING;
					if(nCookie == HTMLCOOKIE_VBSCRIPT)
						nCookie = HTMLCOOKIE_ASPSTRING;
					
					continue;
				}
				if(CheckURL(ParaInfo->pBuff + i,6))
				{
					DEFINE_BLOCK(i,HTML_STYLE_URL);
					nRootID = nCookie;
					nPrevID = nCurrID = nCookie;
					nCookie = HTMLCOOKIE_URL;
					i += 6;
					continue;
				}
				if(nCookie == HTMLCOOKIE_VBSCRIPT){
					if (ParaInfo->pBuff[i]=='\'' ||
						(!strnicmp(ParaInfo->pBuff+i,"rem",3) && IsSpaceChar(ParaInfo->pBuff[i+3]))) {
						DEFINE_BLOCK(i,HTML_STYLE_CSCOMMENT);
						nCurrID = nCookie;
						nCookie = HTMLCOOKIE_ASPLINECOM;//CRLF로 분리된 파라단위로 들어오기 때문에 노멀처리한다.
						goto QuitParse;
					}
					break;
				}
				if (ParaInfo->pBuff[i]=='/' && ParaInfo->pBuff[i+1]=='*') {
					DEFINE_BLOCK(i,HTML_STYLE_CSCOMMENT);
					nCurrID = nCookie;
					nCookie = HTMLCOOKIE_PHPBLOCKCOM;
					i++;
					continue;
				}
				if ((ParaInfo->pBuff[i]=='/' && ParaInfo->pBuff[i+1]=='/')) {
					DEFINE_BLOCK(i,HTML_STYLE_CSCOMMENT);
					nCurrID = nCookie;
					nCookie = HTMLCOOKIE_PHPLINECOM;//CRLF로 분리된 파라단위로 들어오기 때문에 노멀처리한다.
					goto QuitParse;
				}
				break;
			case HTMLCOOKIE_ASP:
				if (ParaInfo->pBuff[i]=='<' && ParaInfo->pBuff[i+1]=='%' && ParaInfo->pBuff[i+2]=='-' 
					&& ParaInfo->pBuff[i+3]=='-') {
						DEFINE_BLOCK(i,HTML_STYLE_SSCOMMENT);
						nCurrID = nCookie;
						nCookie = HTMLCOOKIE_JSPBLOCKCOM;
						i += 3;
						continue;
				}
				if (ParaInfo->pBuff[i]=='\"') {
					DEFINE_BLOCK(i,HTML_STYLE_SSSTRING);
					nCurrID = nCookie;
					nCookie = HTMLCOOKIE_ASPSTRING;
					continue;
				}
				if (ParaInfo->pBuff[i]=='\'' || 
					(!strnicmp(ParaInfo->pBuff+i,"rem",3) && IsSpaceChar(ParaInfo->pBuff[i+3]))) {
					DEFINE_BLOCK(i,HTML_STYLE_SSCOMMENT);
					nCookie = HTMLCOOKIE_ASPLINECOM;//CRLF로 분리된 파라단위로 들어오기 때문에 노멀처리한다.
					goto QuitParse;
				}
				else if(CheckURL(ParaInfo->pBuff + i,6))
				{
					DEFINE_BLOCK(i,HTML_STYLE_URL);
					nPrevID = nCurrID = nCookie;
					nCookie = HTMLCOOKIE_URL;
					i += 6;
					continue;
				}
				if(IsOperator(ParaInfo->pBuff[i])){
					DEFINE_BLOCK(i,HTML_STYLE_SSOPERATOR);
					bRedefineBlock = TRUE;
					continue;
				}
				break;
			case HTMLCOOKIE_PHP:
				if (ParaInfo->pBuff[i]=='\"' || ParaInfo->pBuff[i]=='\'' ) {
					DEFINE_BLOCK(i,HTML_STYLE_SSSTRING);
					nCookie = HTMLCOOKIE_PHPSTRING;
					if(ParaInfo->pBuff[i]=='\'')
						nCookie = HTMLCOOKIE_PHPSINGLESTRING;
					continue;
				}
				if (ParaInfo->pBuff[i]=='/' && ParaInfo->pBuff[i+1]=='*') {
					DEFINE_BLOCK(i,HTML_STYLE_SSCOMMENT);
					nCookie = HTMLCOOKIE_PHPBLOCKCOM;
					i++;
					continue;
				}
				if ((ParaInfo->pBuff[i]=='/' && ParaInfo->pBuff[i+1]=='/') || (ParaInfo->pBuff[i]=='#')) {
					DEFINE_BLOCK(i,HTML_STYLE_SSCOMMENT);
					nCookie = HTMLCOOKIE_PHPLINECOM;//CRLF로 분리된 파라단위로 들어오기 때문에 노멀처리한다.
					goto QuitParse;
				}
				else if(CheckURL(ParaInfo->pBuff + i,6))
				{
					DEFINE_BLOCK(i,HTML_STYLE_URL);
					nPrevID = nCurrID = nCookie;
					nCookie = HTMLCOOKIE_URL;
					i += 6;
					continue;
				}
				if(IsOperator(ParaInfo->pBuff[i])){
					DEFINE_BLOCK(i,HTML_STYLE_SSOPERATOR);
					bRedefineBlock = TRUE;
					continue;
				}
				break;
			case HTMLCOOKIE_BRACKET:
			case HTMLCOOKIE_CLIENTSCRIPT_BRACKET:
			
				if (ParaInfo->pBuff[i]=='\"') {
					DEFINE_BLOCK(i,HTML_STYLE_VALUE);
					nCookie = HTMLCOOKIE_VALUE1;
					continue;
				}
				if (ParaInfo->pBuff[i]=='\'') {
					DEFINE_BLOCK(i,HTML_STYLE_VALUE);
					nCookie = HTMLCOOKIE_VALUE2;
					continue;
				}
				break;
		}
		if(bFirstChar)
		{
			if(!IsSpaceChar(ParaInfo->pBuff[i]))
				bFirstChar = FALSE;
		}

		if(!strchr(GetInfo(1),ParaInfo->pBuff[i])){//기호가 아닌 영문알파벳등이면
			if(iBegin == -1)
				iBegin = i;
		}
		else{//공백 및 기호들
ProcParse:
			if(iBegin >= 0){
				bDecIndex = TRUE;
				iEnd = (i == ParaInfo->nLen -1) ? i + 1 : i;
				if(iEnd == iBegin){
					switch(nCookie){
					case HTMLCOOKIE_CSS:
						if(IsOperator(ParaInfo->pBuff[iBegin])){
							DEFINE_BLOCK(iBegin,HTML_STYLE_OPERATOR);
							bDecIndex = FALSE;
						}
						break;
					case HTMLCOOKIE_JAVASCRIPT:
					case HTMLCOOKIE_VBSCRIPT:
						if(IsOperator(ParaInfo->pBuff[iBegin])){
							DEFINE_BLOCK(iBegin,HTML_STYLE_CSOPERATOR);
							bDecIndex = FALSE;
						}
						break;
					case HTMLCOOKIE_ASP:
					case HTMLCOOKIE_JSP:
					case HTMLCOOKIE_PHP:
						if(IsOperator(ParaInfo->pBuff[iBegin])){
							DEFINE_BLOCK(iBegin,HTML_STYLE_SSOPERATOR);
							bDecIndex = FALSE;
						}
						break;
					}
				}
				if(iEnd - iBegin >= 1){
					switch(nCookie){
						case HTMLCOOKIE_CSS:
							if (IsAttr(ParaInfo->pBuff + iBegin,iEnd - iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_ATTR);
							break;
						case HTMLCOOKIE_JAVASCRIPT:
						case HTMLCOOKIE_VBSCRIPT:
							if (IsAspKeyword(ParaInfo->pBuff+iBegin,iEnd-iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_CSKEY);
							else if (IsPhpKeyword(ParaInfo->pBuff + iBegin,iEnd - iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_CSKEY);
							else{//현재 i위치부터 공백,탭이나 _ 문자가 아닐때까지 탐색,함수명 뒤에 괄호사이에 func  () 낀 공백스킵
								int n = i;
								while(n < ParaInfo->nLen && ParaInfo->pBuff[n] && ( IsSpaceChar(ParaInfo->pBuff[n]) || ParaInfo->pBuff[n] == '_')) n++;
								if(ParaInfo->pBuff[n]  == '(')
									DEFINE_BLOCK(iBegin,HTML_STYLE_CSFUNCNAME);
							}
							break;
						case HTMLCOOKIE_ASP:
							if (IsAspKeyword(ParaInfo->pBuff+iBegin,iEnd-iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_SSKEY);
							else{//현재 i위치부터 공백,탭이나 _ 문자가 아닐때까지 탐색,함수명 뒤에 괄호사이에 func  () 낀 공백스킵
								int n = i;
								while(n < ParaInfo->nLen && ParaInfo->pBuff[n] && ( IsSpaceChar(ParaInfo->pBuff[n]) || ParaInfo->pBuff[n] == '_')) n++;
								if(ParaInfo->pBuff[n]  == '(')
									DEFINE_BLOCK(iBegin,HTML_STYLE_SSFUNCNAME);
							}
							break;
						case HTMLCOOKIE_PHP:
							if (IsPhpKeyword(ParaInfo->pBuff + iBegin,iEnd - iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_SSKEY);
							else if (IsPhpFunction(ParaInfo->pBuff+iBegin,iEnd - iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_SSFUNCTION);
							else{//현재 i위치부터 공백,탭이나 _ 문자가 아닐때까지 탐색,함수명 뒤에 괄호사이에 func  () 낀 공백스킵
								int n = i;
								while(n < ParaInfo->nLen && ParaInfo->pBuff[n] && ( IsSpaceChar(ParaInfo->pBuff[n]) || ParaInfo->pBuff[n] == '_')) n++;
								if(ParaInfo->pBuff[n]  == '(')
									DEFINE_BLOCK(iBegin,HTML_STYLE_SSFUNCNAME);
							}
							break;
						case HTMLCOOKIE_BRACKET:
							if((iBegin > 0 && ParaInfo->pBuff[iBegin-1] == '<') || (iBegin > 1 && ParaInfo->pBuff[iBegin-2]=='<' && ParaInfo->pBuff[iBegin-1]=='/')) {
								if (IsHTMLTag(ParaInfo->pBuff + iBegin,iEnd - iBegin)) {
									if (iBegin > 0 && ParaInfo->pBuff[iBegin-1] == '/' )
										iBegin--;
									DEFINE_BLOCK(iBegin,HTML_STYLE_TAG);
								}
							}
							else if (IsHTMLAttr(ParaInfo->pBuff + iBegin,iEnd - iBegin))
								DEFINE_BLOCK(iBegin,HTML_STYLE_ATTR);
							else{//태그내 스크립트 함수명: 현재 i위치부터 공백,탭이나 _ 문자가 아닐때까지 탐색,함수명 뒤에 괄호사이에 func  () 낀 공백스킵
								int n = i;
								while(n < ParaInfo->nLen && ParaInfo->pBuff[n] && ( IsSpaceChar(ParaInfo->pBuff[n]) || ParaInfo->pBuff[n] == '_')) n++;
								if(ParaInfo->pBuff[n]  == '(')
									DEFINE_BLOCK(iBegin,HTML_STYLE_FUNCNAME);
							}
					}
				}
				iBegin = i;
				switch(nCookie){
					case HTMLCOOKIE_CSS:
						if(IsOperator(ParaInfo->pBuff[iBegin])){
							DEFINE_BLOCK(iBegin,HTML_STYLE_OPERATOR);
							bDecIndex = FALSE;
						}
						break;
					case HTMLCOOKIE_JAVASCRIPT:
					case HTMLCOOKIE_VBSCRIPT:
						if(IsOperator(ParaInfo->pBuff[iBegin])){
							DEFINE_BLOCK(iBegin,HTML_STYLE_CSOPERATOR);
							bDecIndex = FALSE;
						}
						break;
					case HTMLCOOKIE_ASP:
					case HTMLCOOKIE_JSP:
					case HTMLCOOKIE_PHP:
						if(IsOperator(ParaInfo->pBuff[iBegin])){
							DEFINE_BLOCK(iBegin,HTML_STYLE_SSOPERATOR);
							bDecIndex = FALSE;
						}
						break;
				}
				bRedefineBlock = TRUE;
				iBegin = -1;
			}

			if(QuitFlag)
				goto QuitParse;
		}
	}
QuitParse:
	if(iBegin >= 0){
		QuitFlag = 1;
		goto ProcParse;
	}
	return MAKELONG(MAKEWORD(nCookie,nPrevID),MAKEWORD(nCurrID,nRootID));
}
소스 데이타 파일

<HTML>
<HEAD>
<TITLE>Baro Upload Test Form </TITLE>
<style type="text/css">
div,td { font-family: tahoma; font-size: 9pt }
input { border:1px solid; border-color:#CCCCCC }
textarea { border:1px solid; border-color:#CCCCCC }
</style>

<!--
// form의 file 필드의 버튼을 숨기는 스크립트..
// joyfileform.js 처럼 file 필드의 버튼을 숨겨줘야 제대로 동작하게 된다.
// joyfileform.js 를 로드 한뒤 body 태그에서 페이지의 로딩이 끝나면 
// file 필드의 버튼을 숨기는 함수를 호출 한다. 
// onload=activexFileForm(사용할 폼);  
-->
<script language="javascript" src="barotest.js"></script>
<script language="vbscript">
	dim aaa
	dim str = "<a href=""/"">home</a>"
function AttachFiles
	document.JoyUpLoad.AttachFiles
end function
</script>
<script language = "javascript">
http://zzangdol.lgnas.com:20000
<!--HIDE
var bUploadControl = true;
var bSubmit = false;

function AttachFiles()
{
<?
	/* PHP
	http://zzangdol.lgnas.com:20000
	*/
	//PHP 주석http://zzangdol.lgnas.com:20000
aaa = "http://zzangdol.lgnas.com:20000;"

set_time_limit(0);
$g_save_dir="../upload/";
?>

<%
	' ASP 주석
	<%--   JSP 주석  --%>
	dim aaa="aaa";
%>
	document.JoyUpLoad.AttachFiles(<? aaa(0);?>);
}

function AttachFilesForm(filefield)
{ 	
	if(document.JoyUpLoad.AttachFilesForm(filefield) == false){
		//alert("선택 실패");
	}
}
-->
function DeleteFiles()
{
	document.JoyUpLoad.DeleteFiles();
}

결과 화면



 

 

 

 
 
Posted by 두루물
DuruEdit2010/10/09 03:30



아래는 인터넷에 아직 공개하지 않은 두루에디트 메인화면 캡쳐 입니다.(공개예정중)
두루에디트는 KFC1.0(kxLibrary1.0) 으로 작성 되었습니다.
2010년 11월 현재 KFC 라이브러리는(버전1.0) 본 블로그에 세계최초로 공개되었습니다.

*추후 두루에디트(DuruEdit) 의 새소식 & 릴리즈 등은 http://krkim.net/category/DuruEdit 에서 확인 하실수 있습니다.

[이것은 Korea 위상을 드높이 널리 알리는 다물 프로젝트의 일환입니다]
Posted by 두루물
DuruEdit2010/07/16 12:39


사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
Posted by 두루물
DuruEdit2010/07/09 15:00


두루에디트?
두루에디트? 전세계를 통들어 너댓명만 제외하곤 도대체 듣보잡 두루에디트가 뭐냐하는 궁금증이 생길텐데 그건 당연할 수 밖에 없다.
왜냐하면 간혹 짬짬이 만드는 이 프로그램은, 너무나 허접한 나머지,
아래 화면과 같이 울트라 에디트,에디트 플러스 같은 텍스트 편집기 임은 분명한데 아직 인터넷과 같은 불특정 다수에게는 공개 하지 않았기 때문이다. 언젠가 완벽한 모양새를 갖춘다면 모를까...


어쨌든,FTP 프로토콜 RFC를 토대로 FTP 처리기를 구현하였지만, 아직 텍스트 모드 전송의 버그가 있다.
따라서,텍스트 모드 전송기능의 개선작업에 대해 알아 보도록 하고 어떻게 문제해결의 접근을 하는가 하는
방법을 제시하고자 한다.
우선,줄 끝을 알리는 End Of Line은 각 플랫폼 별로 상이하다.

유닉스.리눅스 계열: LF(0x0a) 최근 Mac OS X 이후 부터 여기에 가세.
Mac OS 9 이하 : CR(0x0d)
MS-Windows : CRLF(0x0d,0x0a)

원래의 CR의 의미는 파일이든,프린터든 Carrage Return 의 뜻으로 프린트로 치자면 프린트 헤더를 맨 좌측으로 이동하는 것이다.(Home키 같이 현재 줄의 선두로 이동하라는 의미)

원래의 LF는 Line Feed 로 프린트로 치자면 프린트 헤더를 다음 라인으로 수직으로 한칸(1줄) 내리는 것이다.
즉,CR만 하면 같은 줄의 맨 처음으로 이동하는 셈이되고 LF만 하면 다음 라인의 같은 칸으로 이동하는 셈이 된다.

따라서 정확한 의미는 CFLF가 합쳐져야 비로소 다음라인의 선두로 이동하는 것이지만 각 플랫폼마다 다르게 처리하고 있는 것이다.

뭐 어쨋든,FTP 클라이언트가 매번 서버가 무엇인지 FTP 명령 "SYST" 을 날려서(uname 같은 기능,,) 안먹히는 서버도 있기 때문에 이렇게 시스템 종류를 확인하고 구분할 수는 없는 노릇이다. 이 역할은 그 플랫폼에 설치되는 순전히 FTP 서버의 몫이 되어야 한다.

파일질라에 의하면 ASCII 모드는 클라이언트는 무조건 CRLF로 서버에 날리고 서버가 각 용도에 맞게,
짜르게 되어있다.
따라서,클라이언트는 Pair가 안맞는 CRLF를 검사하여 CRLF로 만들어 주어서 날린다.
2010.07 krkim

또한,파일질라는 다음의 파일 확장자를 디폴트 ASCII 처리로 하고 있다.
"am|asp|bat|c|cfm|cgi|conf|cpp|css|dhtml|diz|h|hpp|htm|html|in|inc|js|jsp|m4|mak|md5
|nfo|nsi|pas|patch|php|phtml|pl|po|py|qmail|sh|shtml|sql|svg|tcl|tpl|txt|vbs|xhtml|xml|xrc"

두루에디트 에서는 추가적으로 (DEFTP.DLL) 아래와 같이 더 많은 다양한 파일을 처리하도록 구현 하였다.

아래는 두루에디트 FTP 소스일부로 AUTO 모드 처리로직의 소스이다.
(참고로 본 블로그에서 오픈된 소스는 누구든지 복사,퍼가서 활용하는것을 허용합니다,단,본인의 저작물에 한함)

/* FtpDataCmd() mode codes */
enum DFFileMode
{
 PFMOD_AUTO = '0',
 PFMOD_ASCII = 'A',
 PFMOD_BINARY= 'I'
};

DFFileMode SysParse::CheckFileType(LPSTR filename)
{
 struct FILETYPELIST{
  DFFileMode filemode;
  char *extlist;
 };
 //"am|asp|bat|c|cfm|cgi|conf|cpp|css|dhtml|diz|h|hpp|htm|html|in|inc|js|jsp|m4|mak|md5|nfo|nsi|pas|patch|php|phtml|pl|po|py|qmail|sh|shtml|sql|svg|tcl|tpl|txt|vbs|xhtml|xml|xrc"
 static FILETYPELIST filetypes[] =
 {
  PFMOD_ASCII, "htm|html|txt|log|xml|php|php5|c|cc|cpp|h|hpp|pc|cxx|inc|cob|sql|java|js|jsp|asp|ec|pc|hp||",
  PFMOD_ASCII, "php|php3|php4|asa|asp|aspx|asax|html|htm|shtml|ihtml|phtml|ssi|pl|htc|vfo|conf|prn|cs||",
  PFMOD_ASCII, "tab|asc|csv|sh||",
  PFMOD_BINARY, "jpg|jpeg|gif|bmp|pcx|png|ttf|hwp|h30|exe|dll|ocx|swf|rtf|avi|mpg|mpeg|mqv|asf|wmv|mov||",
  PFMOD_BINARY, "zip|alz|gz|tar|tgz|z|rar|jar|ace|bz|bz2|wav|mp3|mid|wma|sit|doc||",
 };
 
 static FILETYPELIST none_ext =
 {
  PFMOD_ASCII, "makefile|readme|",
 };
 TCHAR ext[300];
 int idx = 0;
 
 CHAR *p = filename;
 if(!p || !*p)
  return PFMOD_BINARY;
 p = strrchr(filename,'.');
 if(!p || !*p){
  lstrcpyn(ext,filename,sizeof(ext));
  lstrcat(ext,"|");
  CharLower(ext);
  if(strstr(none_ext.extlist,ext))
   return none_ext.filemode;
  return PFMOD_BINARY;
 }
 p++;
 if(!p || !*p)
  return PFMOD_BINARY;
 lstrcpyn(ext,p,sizeof(ext));
 lstrcat(ext,"|");
 CharLower(ext);
 for(idx = 0; idx < sizeof(filetypes)/sizeof(filetypes[0]); idx++){
  p = filetypes[idx].extlist;
  if(strstr(p,ext))
   return filetypes[idx].filemode;
 }
 return PFMOD_BINARY;
}

아래는 파일질라 측에서 설명한 데이타 타입에 관한(RFC를 근거로) 처리를 하는 방침이다.

http://wiki.filezilla-project.org/Data_Type

Files can be transferred between an FTP client and server in different ways. The FTP specification (RFC 959) calls them "data type", but they are commonly referred to as "transfer mode", even though this is not correct.

The different data types are:

ASCII
binary (called "image" in the specification)
EBCDIC
local
But most of the time, however, only ASCII and binary types are used or even implemented.

ASCII type is used to transfer text files. The problem with text files is that different platforms have different kinds of line endings. Microsoft Windows for example uses a CR+LF pair (carriage return and line feed), while Unix(-like) systems, including Linux and MacOS X, only use LF and traditional MacOS systems (MacOS 9 or older) only use CR. The purpose of ASCII type is to ensure that line endings are properly changed to what is right on the platform. According to the FTP specification, ASCII files are always transferred using a CR+LF pair as line ending.

So in case the file is transferred from the client to the server, the client has to make sure CR+LF is used. Therefore it has to add nothing (on Microsoft Windows), add CR (on Unix) or add LF (on legacy MacOS) to each line ending. The server then adjusts the line ending again to what is used on the platform the server runs at. If it is Microsoft Windows, nothing has to be removed, while on Unix the superfluous CR is removed and on legacy MacOS the unneeded LF.

The same happens when a file is downloaded from the server to the client: the server makes sure the line endings are CR+LF when sending the file and the client then strips away whatever is not needed as line ending on its platform.

Because the file is changed if client and server are not running on the same kind of platform, this data type cannot be used for files with arbitrary characters, so called binary files, like images and videos. If it is used anyway, the binary files most likely are corrupted and won't work as expected anymore.

Compared to ASCII type, binary type is the easier one: the file is just transferred as-is, and no line ending translation is done.

So when you are not sure what to use, always go for binary type. Nowadays, nearly all (good) text editors can handle the three possible line endings, and other textual files like the ones of scripting languages such as Perl or PHP, as well as XML files (nearly) always work with any line ending as well.

[edit] Example
Client system: Windows (CRLF line endings)

Server system: Some Linux distribution (LF line endings)

If you upload a text file with 200 lines and a total size of 5768 bytes, it will have a size of 5568 bytes on the server.

Posted by 두루물


  • Total | 45,469
  • Today | 34
  • Yesterday | 173