ProgramingTip

AvalonEdit : 계단식 HighlightingColorizers

bestdevel 2020. 11. 12. 19:25
반응형

AvalonEdit : 계단식 HighlightingColorizers


AvalonEdit의 SyntaxHighlighting Engine을 캐스케이드하고 싶습니다. 나는 2 HighlightingDefinitions. 첫 번째는 기본 구문입니다. 두 번째는 복잡한 다중 라인 전 처리기 마크 업 언어입니다. 다만 문법 첫 번째 문법에 두 번째 문법을 포함하는 것이 너무 복잡합니다. 더 쉬운 방법은 첫 번째 구문을 나중에 영향을 줄 부분 (두 번째 구문을 기반으로) 변경하는 것입니다.

그래서 HighlightingColorizer두 번째 언어로 새로운 것을 인스턴스화 하고 LineTransformers. 그러나 두 번째 언어는 전 처리기 지시문이있는 전체 문서를 채색합니다. 비 전 처리기 코드는 검은 색입니다.

ColorizeLine-th 라인 변환기 두 -method를 디버깅했을 때 강조-display되지 않은 코드 (= 전 처리기 코드 없음)의 라인은 예상대로 색상이 지정 되지 않았습니다 . 그러나 선의 색은 검은 색입니다.

모든 HighlightingColorizer색상 화를 시작하기 전에 전체 문서의 이전 강조 표시를 전에 거기에?

아니면 무엇이 문제일까요? 2를 HighlightingColorizers선택해야합니까?


문제는 HighlightingColorizer직접 저장하지 DocumentHighlighter않고 대신 참조를 저장하는 것 TextView.Services입니다. 이는 동일한 컬러 라이저를 여러 편집기에 연결하여 각 편집기가 고유 한 DocumentHighlighter.

두 번째 컬러 라이저를 부착 IHighlighter하면 서비스 컨테이너에 필요한 것을 사용합니다 . 두 colorizer 모두 새로운 형광펜을 사용하게됩니다.

또한 '클립 보드로 복사'로직 HtmlClipboardIHighlighter서비스 직접 액세스하며 컬러 라이저를 사용하지 않습니다. (텍스트를 Word로 복사하면 구문 강조 표시 만 유지되고 유지되고 축소 된 표현과 같은 다른 변환은.)

이 문제를 해결하는 데는 기본적으로 두 가지 접근 방식이 있습니다.

  1. 추가 형광펜을 서비스로 저장하지 않습니다. HighlightingColorizer클래스 의 자체 복사본을 만들고 .NET 프레임 워크 액세스하는 대신에 해당 클래스의 필드를 사용하여 이를 수행 할 수 있습니다 textView.Services. 추가 형광펜은 사용하지 않습니다.

  2. 여러 IHighlighter에서 HighlightedLine를 결합 하는 구현을 만듭니다 DocumentHighlighter. 이것은 SharpDevelop 5의 C # 의미 강조 표시에 사용하는 접근 방식으로, 기존 .xshd 기반 C # 강조 표시를 확장하는 추가 형광펜으로 작동합니다. 그러나이 접근 방식은 복잡하고 ( HighlightedLine병합 은 섹션의 순서 지정 및 중첩 제약보기 조건을 고려할 때 중요하지 않음) 알림 IHighlighter을 처리하기 위해 인터페이스에 , 대한 API 변경이 필요합니다 OnHighlightStateChanged(AvalonEdit 4.x의는에 중첩 된 파생 클래스를 사용합니다. HighlightingColorizer이 콜백에 액세스하려면 AvalonEdit 5.0에서 이벤트를 사용합니다.)

참고 URL : https://stackoverflow.com/questions/8992137/avalonedit-cascading-highlightingcolorizers

반응형