2012-01-24 1 views
67

AvalonEdit의 SyntaxHighlighting Engine을 캐스케이드하고 싶습니다. 2 HighlightingDefinitions입니다. 첫 번째 구문은 주요 구문입니다. 두 번째는 복잡한 다중 선 - 전 처리기 - 마크 업 언어입니다. 이런 이유로 첫 번째 문법에 두 번째 문법을 포함시키는 것은 너무 복잡합니다. 더 쉬운 방법은 첫 번째 구문을 렌더링하고 나중에 두 번째 구문을 기반으로 영향을받는 선분을 변경하는 것입니다.AvalonEdit : Cascading HighlightingColorizers

그래서 HighlightingColorizer을 두 번째 언어로 인스턴스화하고 LineTransformers에 추가했습니다. 그러나 두 번째 언어는 전처리 지시어가있는 라인 파트뿐만 아니라 전체 문서를 색칠합니다. 비 전 처리기 코드는 검은 색입니다.

두 번째 줄 변환기의 방법을 디버깅 했으므로 강조 표시되지 않은 코드 (= 전 처리기 코드 없음)의 줄이 예상대로 색이 지정되지 않았습니다. 그러나 선의 색깔은 검은 색입니다.

그래서 HighlightingColorizer은 전체 문서의 이전 강조 표시를 모두 색칠하기 전에 다시 설정합니까?

다른 문제가있을 수 있습니까? 2 HighlightingColorizers을 올바르게 캐스케이드 할 수 있습니까?

+8

AvalonEdit 및 IIRC로 약간 작업했는데 다른 색상 표시기를 적용 할 때 모든 강조 표시가 재설정되었습니다. 이 문제를 해결하는 가장 좋은 방법은 AvalonEdit의 코드베이스를 사용하여 색 구성표를 해석하고 다시 적용하는 방법을 변경해야하는 첫 번째 실패 내에서 두 번째 문법을 포함 시키려고 다시 시도하는 것입니다.후자는 아마도 그것이 '리셋에 대한 언급'또는 이와 비슷한 것으로 생각하지 않기 때문에 아마 사소한 것일 것입니다. –

+7

@ Xeno가 바로 여기 있습니다. XML 정의 파일을 사용하지 않으려면 코드 기반을 편집해야합니다. 그러나, 왜 이렇게하고 싶지 않은지 확신 할 수 없습니다. 원하는만큼 오랫동안 사용할 수 있으며 작은 세부 사항을 색칠하는 데 사용할 수 있습니다. 필자는 내장 된 SQL을 사용하여 simalar를 수행하는 파일을 작성했습니다. 그것은 빠르고 잘 작동합니다 ... – MoonKnight

답변

6

HighlightingColorizerDocumentHighlighter에 대한 참조를 직접 저장하지 않고 대신 TextView.Services을 통해 저장합니다. 이는 동일한 색상 표를 여러 편집기에 연결하여 각 편집기가 자체 DocumentHighlighter이되도록 허용하기 위해 수행됩니다.

두 번째 colorizer를 연결하면 서비스 컨테이너에 저장된 IHighlighter을 덮어 씁니다. 두 가지 색상 표시기는 새로운 형광펜을 사용하여 끝납니다.

또한 'HtmlClipboard'의 '클립 보드로 복사'논리는 IHighlighter 서비스에 직접 액세스하며 색칠기를 사용하지 않습니다.

  1. 가 서비스로 추가 하이 라이터를 보관하지 마십시오 :

    이 문제를 해결하는 두 가지 방법이 본질적으로 없다 (Word로 복사 텍스트는 강조 구문, 배 마커와 같은 다른 변환을 보존). HighlightingColorizer 클래스의 자체 복사본을 만들고 textView.Services에 액세스하는 대신 해당 클래스의 필드를 사용하여이 작업을 수행 할 수 있습니다. 이것은 쉽게 변경할 수 있지만 텍스트를 클립 보드에 복사 할 때 추가 형광펜은 사용되지 않습니다.

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

+0

+1 정말 좋은 유익한 대답 – Wh1T3h4Ck5