2009-10-29 4 views
1

Ce que je suis:Comment implémenter un tel moteur de template?

Je suis une représentation textuelle que mon programme convertit en un format beaucoup plus lisible, especcially pour les forums, les sites Web et ainsi de suite.

Pourquoi ai-je besoin d'un tel moteur templage

Comme il y a beaucoup de différents forums et blogs, la syntaxe de chacun peut être différent. Au lieu de coder en dur la syntaxe différente, je voudrais générer une classe pour chacune de ces syntaxes (préférablement extensible avec des fichiers xml faciles à modifier) ​​pour formater ma sortie avec la syntaxe désirée.

Ce que je n'imaginais

Par exemple, je besoin de quelque chose comme

class xyz { 
    private string start_bold = "[B]"; 
    private string end_bold = "[/B]"; 

    public string bold(string s) { 
     return start_bold + s + end_bold; 
    } 
} 

Comment puis-je faire la façon la plus élégante? N'hésitez pas à modifier cette question car je ne suis pas entièrement certain que ce soit un moteur de template dont j'ai besoin. Juste ne pas avoir un meilleur mot pour ça maintenant.

Merci pour toute aide.

Quelques informations supplémentaires: Andrew's réponse était un soupçon, mais je ne comprends pas comment je pourrais plusieurs styles différents avec cette méthode. À l'heure actuelle, je le fais à la dure:

string s = String.Format("Output of [B]{0}[b] with number [i]{1}[/i]", 
          Data.Type, 
          Data.Number); 

Pour cet exemple, je veux que la sortie soit conçu pour un forum. À l'avenir, je voudrais le faire comme ceci:

Layout l = new Layout("html"); 
string s = String.Format("Output of {0} with number {1}, 
          l.bold(Data.Type), 
          l.italic(Data.Number); 
//desired output if style "html" is chosen: 
"Output of <b>Name</b> with number <i>5</i>" 

//desired output if style "phpbb" is chosen: 
"Output of [b]Name[/b] with number [i]5[/i]" 

Je ne sais pas comment cela peut se faire de la manière la plus élégante. À propos du code XML: seules les conventions de style doivent être dérivées d'un document xml, c'est-à-dire l'ajout de styles personnalisés sans utiliser de code.

+0

pouvez-vous nous donner un exemple de données entrantes, et la sortie qui en résulte? Juste quelques lignes? Je ne te vois toujours pas de problème, désolé. . . Voudrais vraiment aider – andrewWinn

+0

cherchez-vous à trouver une position dans une chaîne et le rendre en gras? par exemple? Y a-t-il une sorte de consistance dans les données? qu'entendez-vous par "représentation textuelle"? Je pense que je commence à saisir vos problèmes. . désolé d'être si dense, c'est vendredi et 2 heures pour aller au week-end;) – andrewWinn

+0

C'est simplement quelques chaînes que je voudrais mettre en forme facilement avec plusieurs syntaxe différente. Selon le style que je choisis, je veux retourner une chaîne avec des balises "[b]" au lieu de "" ou "'' '". – Sven

Répondre

1

J'utiliserais des méthodes d'extension. Ensuite, vous pouvez appeler string.bold().

Je pense que ce serait la syntaxe:

class xyz { 
    private string start_bold = "[B]"; 
    private string end_bold = "[/B]"; 
    public static string bold(this string x) { 
     return start_bold + x + end_bold; 
    } 
} 

Voir: http://msdn.microsoft.com/en-us/library/bb383977.aspx Je laisse le code ci-dessous comme un exemple, mais je pense que ce que vous avez vraiment besoin est quelque chose le long des lignes d'un " système jeton »

Supposons que vous avez une chaîne en tant que tel:

string s = "I want {~b}this text to be bold{~~b} and {~i}this text to be italics{~~i}" 

document XML vous doit contenir ces noeuds (je pense, mon xml est un peu rouillé)

<site> 
    <html> 
    <style value="{~b}">[b]</style> 
    <style value="{~~b}">[/b]</style> 
    <style value="{~i}">[i]</style> 
    <style value="{~~i}">[/i]</style> 
    </html> 
    <phpBBCode> 

     ...... 


public class Layout { 
       //private string start_bold = "[B]"; 
       //private string end_bold = "[/B]"; 
       //private string start_italics = "[I]"; 
       //private string end_italics = "[/I]"; 

       private string _stringtoformat; 
       public string StringToFormat {set{ _stringtoformat = value;}};//syntax is wrong 

       private string _formattedString; 
       public string FormattedString {get return _formattedString;} 

       public Layout(string formattype, int siteid) 
       { 
        //get format type logic here 
        //if(formattype.ToLower() =="html") 
        //{ . . . do something . . . } 

        //call XML Doc for specific site, based upon formattype 


        if(!String.IsNullorEmpty(_stringtoformat))     
         { 
         //you will want to put another loop here to loop over all of the custom styles 
         foreach(node n in siteNode) 
          { 
          _stringtoformat.Replace(n.value, n.text); 
          } 
         } 
         //Sorry, can't write XML document parsing code off the top of my head 

        _formattedString = _stringtoformat; 
       }   
       public string bold(this string x) { 
        return start_bold + x + end_bold; 
       } 
       public string italics(this string x) { 
        return start_italics + x+ end_italics; 
       } 

      } 

MISE EN ŒUVRE

Layout l = new Layout("html", siteidorsomeuniqeidentifier); 
    l.html = stringtoformat; 
    output = l.formattedstring; 

Le code peut être mieux, mais il devrait vous donner un coup de pied dans la bonne direction:)

EDIT 2: basé sur plus d'info .....

Si vous voulez faire ceci:

Layout l = new Layout("html"); 
string s = String.Format("Output of {0} with number {1}, 
          l.bold(Data.Type), 
          l.italic(Data.Number); 

et vous cherchez à changer l.bold() et l.italic() en fonction de la marque de moteurs de blog spécifique vers le haut. . .

public class Layout { 
      private string start_bold = "[B]"; 
      private string end_bold = "[/B]"; 
      private string start_italics = "[I]"; 
      private string end_italics = "[/I]"; 

      public Layout(string formattype, int siteid) 
      { 
      //get format type logic here 
      //if(formattype.ToLower() =="html") 
      //{ . . . do something . . . } 

      //call XML Doc for specific site, based upon formattype 
      start_bold = Value.From.XML["bold_start"]; 
      end_bold = Value.From.XML["bold_end"]; 
      //Sorry, can't write XML document parsing code off the top of my head 
      }   
      public string bold(this string x) { 
       return start_bold + x + end_bold; 
      } 
      public string italics(this string x) { 
       return start_italics + x+ end_italics; 
      } 


     } 

Layout l = new Layout("html", siteid); 
string s = String.Format("Output of {0} with number {1}, 
          ValueToBeBoldAsAstring.bold(), 
          ValueToBeItalicAsAstring.italic()); 
+0

comment puis-je définir quel style utiliser? – Sven

+0

vous auriez des chaînes publiques serveral, vous concaténeriez les fragments de chaîne après avoir appelé .bold() ou .italics() ou .hyperlink() etc. http://stackoverflow.com/questions/487904/what-advantages-of- extension-methods-have-you-found est un bon pointeur dans la bonne direction. Cela suppose que vous êtes sur C# 3.0 ou 3.5? Je ne me souviens pas lequel. – andrewWinn

+0

@ AndrewWinn - c'est C# 3.0. La version du framework .NET est cependant 3.5. – RichardOD

Questions connexes