2013-09-10 29 views
10

Tôi muốn có thể làm nổi bật (tức là bọc trong một khoảng có màu hoặc cách khác) tất cả văn bản khớp với regex trong CKEditor. Tôi có thể thêm một nút để làm điều này, và một nút để loại bỏ làm nổi bật. Trường hợp sử dụng cụ thể của tôi là để làm nổi bật tất cả các biến ria mép trong các mẫu HTML của tôi (làm cho nó thực sự dễ dàng để xem nơi có các biến ria mép).Làm cách nào để đánh dấu các yếu tố khớp với regex trong CKeditor?

Tôi đã triển khai phiên bản mà tôi thay thế một ria phù hợp với regex bằng một khoảng và sau đó là nhóm chụp. Điều này dường như phá vỡ một số mẫu khi tôi kiểm tra.

Để xóa đánh dấu, tôi sử dụng editor.removeStyle, điều này dường như không hoạt động trong mọi trường hợp.

Dưới đây là một ví dụ về những gì tôi đã thực hiện:

editor.addCommand('highlightMustache', { 
      exec: function(editor) { 
       editor.focus(); 
       editor.document.$.execCommand('SelectAll', false, null); 
       var mustacheRegex = /{{\s?([^}]*)\s?}}/g; 
       var data = editor.getData().replace(mustacheRegex, '<span style="background-color: #FFFF00">{{ $1 }}</span>'); 
       editor.setData(data); 
      } 
     }); 

     // command to unhighlight mustache parameters 
     editor.addCommand('unhighlightMustache', { 
      exec: function(editor) { 
       editor.focus(); 
       editor.document.$.execCommand('SelectAll', false, null); 
       var style = new CKEDITOR.style({ element:'span', styles: { 'background-color': '#FFFF00' },type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1 }); 
       editor.removeStyle(style); 
       editor.getSelection().removeAllRanges(); 
      } 
     }); 

Cảm ơn!

+0

Tôi khá có vấn đề tương tự.Tôi cần để có thể làm nổi bật một cái gì đó phù hợp với một regex trong khi gõ trong CKeditor. – Polygnome

+1

"Điều này dường như phá vỡ một số mẫu khi tôi kiểm tra." - Làm thế nào nó phá vỡ? Ngoài ra, bạn có thể đưa mẫu mẫu vào câu hỏi của mình để sự cố có thể được sao chép không? Tương tự, "Tôi sử dụng editor.removeStyle, điều này dường như không hoạt động trong mọi trường hợp" - Bạn có thể đưa ra ví dụ về nơi nó không hoạt động không? –

+0

gsastry và @Polygnome giải pháp ưa thích của bạn ngay bây giờ và bạn có lẽ là một ví dụ về nó? Vì tôi có nhu cầu tương tự để đánh dấu các dấu vị trí đầu và cuối "{" và "}" một cách tôn trọng. – melutovich

Trả lời

3

Các phương pháp sau đây làm việc cho tôi trong quá khứ cho một nhiệm vụ tương tự:

  1. Walk cây DOM của tài liệu ckeditor và kết hợp tất cả text nodes thành một chuỗi duy nhất (chúng ta hãy gọi nó S). Sử dụng CKEDITOR.dom.walker cho điều đó, this answer sẽ trợ giúp tại đây. Trong khi đi bộ trên cây, hãy xây dựng một tập hợp các cấu trúc dữ liệu (hãy gọi nó là C) để lưu trữ từng đối tượng nút văn bản và vị trí của văn bản bắt đầu trong phạm vi S.

  2. Chạy regex của bạn theo số S.

  3. Nếu không tìm thấy kết quả phù hợp, hãy dừng lại.

  4. Nếu không, sử dụng C thu thập, xác định vị trí bắt đầu nút văn bản (chúng ta hãy gọi nó SN), và bù đắp bên trong nó, tương ứng với bắt đầu vị trí ký tự của chuỗi trận đấu bên S.

  5. Sử dụng C thu thập, xác định vị trí cuối nút văn bản (chúng ta hãy gọi nó EN), và bù đắp bên trong nó, tương ứng với cuối vị trí ký tự của chuỗi trận đấu bên S.

  6. Tạo một đối tượng CKEDITOR.dom.range và vị trí của nó sử dụng SN như bắt đầu và EN như cuối (startContainer/startOffset/endContainer/endOffset).

  7. Sử dụng CKEDITOR.dom.selection.selectRanges() để chọn phạm vi từ bước trước đó.

+1

Điều này có vẻ là một cách tốt để đi về nó. Tôi sẽ kiểm tra xem ra ngày mai;) – Polygnome

+0

@Polygnome, nó hoạt động đối với trường hợp phân mảnh như ' bro ken '(' broken'), nhưng bạn có thể cần phải giải thích cho các thẻ khác như ' bro ken '. Kiểm tra tên thẻ khi bạn đi bộ cây và thêm dấu cách (hoặc dấu phân tách khác) vào 'S' cho tất cả các thẻ nhưng' '. – Noseratio

+0

@Noseratio Tôi có nhu cầu tương tự để đánh dấu các dấu vị trí đầu và cuối "{" và "}" một cách tôn trọng, đây có phải là cách tiếp cận ưa thích của bạn không? và bạn có bất kỳ tập quán ví dụ nào không? – melutovich

0

Tôi tự hỏi tại sao bạn không sử dụng lệnh "đảo ngược" Regex của lệnh unhighlight?

editor.addCommand('highlightMustache', { 
     exec: function(editor) { 
      editor.focus(); 
      editor.document.$.execCommand('SelectAll', false, null); 
      var mustacheRegex = /{{\s?([^}]*)\s?}}/g; 
      var data = editor.getData().replace(mustacheRegex, '<span style="background-color: #FFFF00">{{ $1 }}</span>'); 
      editor.setData(data); 
     } 
    }); 

    // command to unhighlight mustache parameters 
    editor.addCommand('unhighlightMustache', { 
     exec: function(editor) { 
      editor.focus(); 
      editor.document.$.execCommand('SelectAll', false, null); 
      var mustacheRegex = /<span style="background-color: #FFFF00">{{\s?([^}]*)\s?}}<\/span>/g; 
      var data = editor.getData().replace(mustacheRegex, '{{ $1 }}'); 
      editor.setData(data); 
     } 
    }); 

Nó sẽ hoạt động tốt!

+0

Điều này không giải quyết sự phân mảnh, như ' bro ken 'cho' bị hỏng'. – Noseratio

+0

Có, nhưng đối với trường hợp sử dụng của riêng nó, nó sẽ hoạt động. Bạn có biêt tôi đang nghĩ gì? –

+0

Tôi không, nhưng có lẽ OP và @Polygnome thấy điều đó. – Noseratio

Các vấn đề liên quan