2013-09-10 7 views
10

Voglio essere in grado di evidenziare (cioè avvolgere in un intervallo con un colore, o in un altro modo) tutto il testo che corrisponde a un'espressione regolare in CKEditor. Probabilmente aggiungerei un pulsante per farlo e un pulsante per rimuovere l'evidenziazione. Il mio caso d'uso specifico è quello di evidenziare tutte le variabili dei baffi nei miei modelli HTML (rendere molto facile vedere dove ci sono le variabili dei baffi).Come posso evidenziare elementi che corrispondono a un'espressione regolare in CKeditor?

Ho implementato una versione in cui sostituisco i baffi di regex con uno span e quindi il gruppo di cattura. Sembra che si rompa su alcuni modelli quando eseguo il test.

Per rimuovere l'evidenziazione, utilizzo editor.removeStyle, che non sembra funzionare in tutti i casi.

Ecco un esempio di quello che ho implementato:

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(); 
      } 
     }); 

Grazie!

+0

Ho praticamente lo stesso problema.Devo essere in grado di evidenziare qualcosa che corrisponde a una regex durante la digitazione in CKeditor. – Polygnome

+1

"Sembra che si rompa su alcuni modelli quando eseguo il test." - Come si rompe? Puoi anche includere un modello di esempio nella tua domanda in modo che il problema possa essere riprodotto? Allo stesso modo, "Uso editor.removeStyle, che non sembra funzionare in tutti i casi" - Puoi dare un esempio di dove non funziona? –

+0

gsastry e @Polygnome qual è la tua soluzione preferita ora e ne hai forse un esempio? Dato che ho una necessità simile di evidenziare all'inizio e alla fine i marcatori di segnaposto "{" e "}" rispettosamente. – melutovich

risposta

3

Il seguente approccio ha funzionato per me in passato per un compito simile:

  1. A piedi l'albero del DOM del documento CKEditor e combinare tutti text nodes in una singola stringa (chiamiamolo S). Utilizzare CKEDITOR.dom.walker per quello, this answer dovrebbe aiutare qui. Mentre si cammina l'albero, creare una raccolta di strutture di dati (chiamiamolo C) per memorizzare ciascun oggetto nodo di testo e la posizione in cui inizia il suo testo all'interno di S.

  2. Esegui il tuo regex contro S.

  3. Se la partita non viene trovata, fermarsi.

  4. Altrimenti, utilizzando C raccolta, individuare il nodo inizio testo (che chiameremo SN), e sfalsati all'interno di esso, corrispondente alla posizione di partenza carattere della stringa partita all'interno S.

  5. Utilizzando C raccolta, individuare il nodo fine testo (che chiameremo EN), e sfalsati all'interno di esso, corrispondente alla posizione di fine carattere della stringa partita all'interno S.

  6. Creare un oggetto CKEDITOR.dom.range e posizionarlo secondo SN come l'inizio e la fine EN come (startContainer/startOffset/endContainer/endOffset).

  7. Utilizzare CKEDITOR.dom.selection.selectRanges() per selezionare l'intervallo dal passaggio precedente.

+1

Questo sembra essere un buon modo per farlo. Vado a controllare che domani;) – Polygnome

+0

@Polygnome, funziona per i casi di frammentazione come ' bro ken' ('broken'), ma potrebbe essere necessario per tenere conto di altri tag come' bro ken '. Controlla il nome del tag quando si cammina l'albero e si aggiunge uno spazio (o un altro separatore) a 'S' per tutti i tag ma' '. – Noseratio

+0

@Noseratio Ho una simile necessità di evidenziare i marcatori di segnaposto all'inizio e alla fine "{" e "}" rispettosamente, è ancora questo il tuo approccio preferito? e hai qualche esempio di utilizzo? – melutovich

0

Mi chiedo perché non si utilizza un Regex "reverse" del comando 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); 
     } 
    }); 

Dovrebbe funzionare correttamente!

+0

Questo non risolve la frammentazione, come ' bro ken' per 'rotto'. – Noseratio

+0

Sì, ma per il suo caso d'uso dovrebbe funzionare. Capisci cosa intendo? –

+0

Non lo so, ma forse l'OP e @Polygnome lo vedono. – Noseratio

Problemi correlati