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 daHTML_SyntaxHighlighter
che a sua volta deriva daJS_SyntaxHighlighter
eCSS_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.