Как мне реализовать такой шаблонизатор? - PullRequest
1 голос
/ 29 октября 2009

Что я получил:

Я получил текстовое представление, которое моя программа преобразует в гораздо более читаемый формат, особенно для форумов, веб-сайтов и так далее.

Зачем мне нужен такой шаблонный двигатель

Поскольку существует много разных форумов и блогов, синтаксис каждого из них может быть различным. Вместо жесткого кодирования другого синтаксиса я хотел бы создать один класс для каждого из этих синтаксисов (предпочтительно расширяемый с помощью легко изменяемых xml-файлов) для форматирования моего вывода с желаемым синтаксисом.

Что я себе представлял

Например, мне нужно что-то вроде

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

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

Как я могу сделать это самым элегантным способом? Не стесняйтесь редактировать этот вопрос, так как я не совсем уверен, что мне нужен шаблонный движок. Просто не получайте лучшего слова для этого сейчас.

Спасибо за любую помощь.

Некоторая дополнительная информация: Ответ Эндрю был большим намеком, но я не понимаю, как я мог использовать несколько разных стилей с помощью этого метода. В настоящее время я делаю это трудным путем:

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

В этом примере я хочу, чтобы выходные данные были разработаны для форума. В будущем я хотел бы сделать это так:

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]"

Я просто не знаю, как это можно сделать самым элегантным способом.

О XML: XML-документ должен выводить только соглашения о стилях, т. Е. Добавление пользовательских стилей без использования кода.

1 Ответ

1 голос
/ 29 октября 2009

Я бы использовал методы расширения. Тогда вы можете вызвать string.bold ().

Я думаю, что это будет синтаксис:

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

См .: http://msdn.microsoft.com/en-us/library/bb383977.aspx Я оставляю код ниже в качестве примера, но я думаю, что вам действительно нужно что-то вроде «системы токенов»

Скажем, у вас есть строка как таковая:

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

Ваш XML-документ должен содержать эти узлы (я думаю, мой xml немного ржавый)

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

            }

РЕАЛИЗАЦИЯ

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

Код может быть лучше, но он должен дать вам удар в правильном направлении:)

РЕДАКТИРОВАТЬ 2: на основе дополнительной информации .....

Если вы хотите сделать это:

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

и вы хотите изменить l.bold() и l.italic() в зависимости от конкретной разметки движков блога. , ,

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...