2010-05-12 17 views
1

J'ai fait un surligneur de syntaxe HTML en C# et cela fonctionne très bien, mais il y a un problème. Tout d'abord, il fonctionne assez vite parce que la syntaxe met en évidence ligne par ligne, mais quand je colle plus d'une ligne de code ou ouvre un fichier, je dois mettre en évidence le fichier entier qui peut prendre jusqu'à une minute code. J'ai essayé de mettre en évidence les lignes visibles dans la riche boîte de texte mais quand j'essaye de faire défiler, je ne peux pas mettre en surbrillance le nouveau texte visible. Voici mon code: (note: je dois utiliser regex pour que je puisse obtenir les choses dans entre < &> caractères)Comment puis-je optimiser ceci ou existe-t-il une meilleure façon de le faire? (HTML Syntax Highlighter)

Sélectionnez Fichier entier:

public void AllMarkup() 
    { 
     int selectionstart = richTextBox1.SelectionStart; 



     Regex rex = new Regex("<html>|</html>|<head.*?>|</head>|<body.*?>|</body>|<div.*?>|</div>|<span.*?>|</span>|<title.*?>|</title>|<style.*?>|</style>|<script.*?>|</script>|<link.*?/>|<meta.*?/>|<base.*?/>|<center.*?>|</center>|<a.*?>|</a>"); 
     foreach (Match m in rex.Matches(richTextBox1.Text)) 
     { 
      richTextBox1.Select(m.Index, m.Value.Length); 
      richTextBox1.SelectionColor = Color.Blue; 
      richTextBox1.Select(selectionstart, -1); 
      richTextBox1.SelectionColor = Color.Black; 
     } 

     richTextBox1.SelectionStart = selectionstart; 
    } 


    private void pasteToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      LockWindowUpdate(richTextBox1.Handle);//Stops text from flashing flashing 
      richTextBox1.Paste(); 
      AllMarkup(); 

     }finally { LockWindowUpdate(IntPtr.Zero); } 
    } 

Je veux savoir s'il y a une meilleure façon mettre en évidence ceci et le rendre plus rapide ou si quelqu'un peut m'aider à le mettre en évidence seulement le texte visible.

Aidez-nous s'il vous plaît. :) Merci, Tanner.

+3

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – RCIX

+0

Je suis d'accord avec RCIX, mais d'autres conseils. Plusieurs petites regex sont généralement plus rapides qu'une grande. Utiliser IndexOf est aussi beaucoup plus rapide que regex. Et enfin, parser avec un analyseur html et construire le texte RTF d'abord, puis le mettre dans le contrôle. –

Répondre

1

Je suis d'accord avec RCIX - vous aurez du mal à combiner l'ensemble avec l'analyse syntaxique Regex et HTML :)

Si vous allez pour une solution de haute qualité qui met en évidence la syntaxe toujours correctement, vous allez avoir besoin d'un analyseur complet. Vous pouvez en utiliser un déjà créé ou vous pouvez créer le vôtre à l'aide d'un outil tel que ANTLR.

Les créateurs d'ANTLR ont déjà créé une grammaire d'analyseur HTML. Vous pouvez le trouver here.

Si vous êtes à la recherche d'un, voici quelques pré-construit que j'ai trouvé:

  1. HTML Agility Pack
  2. Majestic 12 HTML Parser
  3. SGML Reader

Je suis sûr qu'il sont d'autres - c'est une exigence assez commune. En bref, si c'est un projet simple et jetable, j'aurais un analyseur complet. Sinon, vous pouvez continuer à essayer de le pirater avec Regex.