Come organizzare un set di classi di evidenziazione della sintassi?

3

Sto creando un set di evidenziatori di sintassi per un'applicazione. Le lingue includono:

  • HTML (in particolare HTML5)
  • JavaScript
  • PHP
  • CSS (in particolare CSS3)

Il problema sta nel modo in cui le classi devono essere organizzate. Poiché questa è un'applicazione Qt, ogni lingua ha una sua classe che deriva da QSyntaxHighlighter . Ogni classe sovrascrive highlightBlock() che è responsabile della colorazione del blocco di testo fornito.

Il codice JavaScript può essere contenuto in .js file e anche in <script></script> tag. Allo stesso modo gli stili CSS possono essere contenuti in .css file e all'interno di <style></style> tag HTML. Per finire, il contenuto HTML può essere trovato in entrambi i file .html e .php .

Ogni lingua ha una propria estensione di file e quindi richiede una sua classe. Tuttavia, poiché alcune lingue possono essere incorporate l'una nell'altra, è necessario un modo per evitare la duplicazione del codice. In altre parole, non ha senso avere il codice di analisi JavaScript nella classe di evidenziazione HTML e la classe di evidenziazione di JavaScript.

Quale sarebbe un modo ideale per organizzare il codice? Ecco alcune opzioni che ti vengono in mente:

  • Estrai completamente il codice di analisi. Questa opzione comporterebbe la rimozione del codice di analisi per ogni lingua dalla classe di evidenziazione della sintassi per quella lingua. Quindi il codice di analisi potrebbe facilmente richiamare altri parser se necessario. Questa opzione sembra buona ma sarebbe molto complessa.
  • Utilizza l'ereditarietà. Questa opzione non sembra una buona idea, ma ho pensato che valesse la pena menzionarla comunque. In questo caso, avrei una classe PHP_SyntaxHighlighter che deriva da HTML_SyntaxHighlighter che a sua volta deriva da JS_SyntaxHighlighter e CSS_SyntaxHighlighter . L'idea è che le classi contenitore (come HTML) possano richiamare il metodo sottoposto a override nella classe base quando necessario. Questa opzione implica l'ereditarietà multipla e quindi non funzionerà con Qt, quindi non è un'opzione vera.
  • Crea istanze delle altre classi e invoca la funzione highlightBlock() . Questa opzione implica la costruzione di istanze di altre classi e quindi il richiamo della loro funzione di evidenziazione della sintassi per la lingua specificata. Questo è probabilmente piuttosto difficile da implementare e comporterebbe un sacco di hacking.

Quindi queste sono le opzioni che sto guardando. Accolgo suggerimenti, suggerimenti o suggerimenti per l'organizzazione di queste classi.

    
posta Nathan Osman 19.07.2011 - 04:07
fonte

1 risposta

1

Quindi, sembra che highlightBlock () sia il tuo punto di ingresso. Manterrei ogni classe derivante direttamente da QSyntaxHighlighter e sovrascrivendo highlightBlock () con il codice necessario. Quindi,

  1. l'evidenziatore HTML dovrebbe richiamare i evidenziatori CSS, JavaScript e PHP nei rispettivi tag di apertura e chiusura, mentre dovrebbe utilizzare le regole HTML all'esterno
  2. l'evidenziatore CSS dovrebbe richiamare l'evidenziatore di PHP nei suoi tag di apertura e chiusura, mentre dovrebbe usare le regole CSS all'esterno
  3. l'evidenziatore di JavaScript dovrebbe richiamare l'evidenziatore di PHP nei suoi tag di apertura e chiusura, mentre dovrebbe utilizzare le regole Javascript all'esterno
  4. l'evidenziatore di PHP può concentrarsi solo sulle proprie regole

Il problema con l'evidenziazione di lingue incorporabili come PHP è che la lingua di hosting può essere qualsiasi.

    
risposta data 19.07.2011 - 18:30
fonte

Leggi altre domande sui tag