我得到了什么:
我得到了一个文本表示,我的程序转换为更易读的格式,特别是论坛,网站等。
为什么我需要这样的临时引擎
由于有许多不同的论坛和博客,每个论坛和博客的语法可能会有所不同。我不想对不同的语法进行硬编码,而是希望为每种语法生成一个类(最好是易于修改的xml文件),以使用所需的语法格式化我的输出。
我的想象
例如,我需要像
这样的东西class xyz {
private string start_bold = "[B]";
private string end_bold = "[/B]";
public string bold(string s) {
return start_bold + s + end_bold;
}
}
我怎样才能以最优雅的方式做到这一点?随意编辑这个问题,因为我不完全确定它是我需要的模板引擎。现在只是没有更好的说法。
感谢您的帮助。
其他一些信息: Andrew's回答是一个很好的提示,但我不明白我用这种方法可以得到几种不同的风格。目前我这么做很难:
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文档派生,即在不使用代码的情况下添加自定义样式。
答案 0 :(得分:1)
我会使用exension metods。然后你可以调用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());