2012-01-24 22 views
67

Tôi muốn ghép Công cụ SyntaxHighlighting của AvalonEdit. Tôi có 2 HighlightingDefinitions. Đầu tiên là cú pháp chính. Cách thứ hai là một ngôn ngữ đánh dấu tiền xử lý phức tạp. Vì lý do này, quá phức tạp khi đặt ngữ pháp thứ hai trong ngữ pháp thứ nhất. Cách dễ dàng hơn là hiển thị cú pháp đầu tiên và thay đổi các phần dòng bị ảnh hưởng (dựa trên cú pháp thứ hai) sau đó.AvalonEdit: Cascading HighlightingColorizers

Vì vậy, tôi đã tạo một mới HighlightingColorizer bằng ngôn ngữ thứ hai và thêm nó vào LineTransformers. Nhưng ngôn ngữ thứ hai colorizes các tài liệu hoàn chỉnh và không chỉ các lineparts với các preprocessor-chỉ thị: không tiền xử lý-mã là màu đen.

Khi tôi sửa lỗi ColorizeLine-phương sai của biến thế dòng thứ hai, các dòng của mã không được đánh dấu (= không có mã tiền xử lý) chưa được tô màu, như mong đợi. Nhưng màu sắc của các đường màu đen.

Vì vậy, việc HighlightingColorizer đặt lại tất cả đánh dấu trước đó của toàn bộ tài liệu trước khi bắt đầu tô màu?

Hoặc vấn đề khác có thể là gì? Làm thế nào tôi có thể cascade 2 HighlightingColorizers?

+8

Tôi đã làm việc một chút với AvalonEdit- và IIRC nó sẽ đặt lại tất cả làm nổi bật khi bạn áp dụng một bộ chỉnh màu khác. Cách tốt nhất xung quanh việc này là cố gắng nhúng lại ngữ pháp thứ hai trong lần đầu tiên thất bại mà bạn sẽ phải gây rối với codebase của AvalonEdit để thay đổi cách diễn giải và áp dụng lại lược đồ màu.Sau này có lẽ sẽ không tầm thường như tôi không nghĩ rằng nó sẽ dễ dàng như một 'bình luận về việc thiết lập lại' hoặc một cái gì đó như thế. –

+7

@Xeno nằm ngay tại đây. Bạn chắc chắn sẽ phải chỉnh sửa cơ sở mã nếu bạn không muốn sử dụng các tệp định nghĩa XML. Tuy nhiên, tôi không chắc chắn lý do tại sao bạn không muốn làm điều này - họ có thể miễn là bạn muốn và có thể được sử dụng để tô màu các chi tiết nhỏ. Tôi vừa viết một tập tin để làm một điều simalar với SQL nhúng; nó rất nhanh và hoạt động tốt ... – MoonKnight

Trả lời

6

Vấn đề là HighlightingColorizer không trực tiếp lưu trữ một tham chiếu đến DocumentHighlighter, nhưng thay vào đó lưu trữ nó qua TextView.Services. Điều này được thực hiện để cho phép gắn cùng một bộ chỉnh màu cho nhiều trình chỉnh sửa, do đó mỗi trình chỉnh sửa sẽ có được DocumentHighlighter riêng của mình.

Khi bạn đính kèm bộ chỉnh màu thứ hai, nó sẽ ghi đè IHighlighter được lưu trữ trong vùng chứa dịch vụ; và cả hai công cụ tạo màu đều sử dụng công cụ đánh dấu mới.

Ngoài ra, lưu ý rằng logic 'sao chép vào clipboard' trong HtmlClipboard truy cập trực tiếp vào dịch vụ IHighlighter, nó không sử dụng bất kỳ trình chỉnh màu nào. (Sao chép văn bản sang Word giữ gìn cú pháp chỉ làm nổi bật, không có biến đổi khác như đánh dấu lần)

Có chủ yếu là hai cách tiếp cận để giải quyết vấn đề này:

  1. Không nên cất highlighter thêm như một dịch vụ. Bạn có thể làm điều này bằng cách tạo bản sao của riêng bạn của lớp HighlightingColorizer và sử dụng một trường trong lớp đó thay vì truy cập textView.Services. Đây là một thay đổi dễ dàng, nhưng các tô màu bổ sung sẽ không được sử dụng khi sao chép văn bản vào khay nhớ tạm.

  2. Tạo triển khai IHighlighter kết hợp các HighlightedLine s từ nhiều DocumentHighlighter s. Đây là cách tiếp cận mà chúng tôi đang sử dụng cho việc đánh dấu ngữ nghĩa C# trong SharpDevelop 5, nó hoạt động như một công cụ đánh dấu bổ sung mở rộng hiện có .xshd dựa trên C# làm nổi bật. Tuy nhiên, cách tiếp cận này phức tạp (việc hợp nhất HighlightedLine s là không nhỏ đối với các ràng buộc đặt hàng và lồng ghép trên các phần) và yêu cầu thay đổi API cho giao diện IHighlighter để xử lý thông báo OnHighlightStateChanged (AvalonEdit 4.x sử dụng một dẫn xuất lớp lồng nhau trong HighlightingColorizer để có quyền truy cập vào cuộc gọi lại này; AvalonEdit 5.0 sẽ sử dụng một sự kiện).

+0

+1 câu trả lời rất hay và mang tính thông tin – Wh1T3h4Ck5