我想从c#中编写一些Html(html是一个例子,这可能是其他语言..)
例如:
string div = @"<div class=""className"">
<span>Mon text</span>
</div>";
将产生:
<div class="className">
<span>Mon text</span>
</div>
从Html的角度来看,这并不是很酷......
获得正确的HTML缩进的唯一方法是缩进C#代码,如下所示:
string div = @"<div class=""className"">
<span>Mon text</span>
</div>";
我们得到正确缩进的Html:
<div class="className">
<span>Mon text</span>
</div>
但像这样缩进C#确实打破了代码的可读性......
有没有办法对C#语言中的缩进进行操作?
如果没有,有人提示的好于:
string div = "<div class=\"className\">" + Environment.NewLine +
" <span>Mon text</span>" + Environment.NewLine +
"</div>";
并且优于
var sbDiv = new StringBuilder();
sbDiv.AppendLine("<div class=\"className\">");
sbDiv.AppendLine(" <span>Mon text</span>");
sbDiv.AppendLine("</div>");
非常感谢@Yotam的回答。
我写了一个小扩展来进行对齐&#34;动态&#34; :
/// <summary>
/// Align a multiline string from the indentation of its first line
/// </summary>
/// <remarks>The </remarks>
/// <param name="source">The string to align</param>
/// <returns></returns>
public static string AlignFromFirstLine(this string source)
{
if (String.IsNullOrEmpty(source)) {
return source;
}
if (!source.StartsWith(Environment.NewLine)) {
throw new FormatException("String must start with a NewLine character.");
}
int indentationSize = source.Skip(Environment.NewLine.Length)
.TakeWhile(Char.IsWhiteSpace)
.Count();
string indentationStr = new string(' ', indentationSize);
return source.TrimStart().Replace($"\n{indentationStr}", "\n");
}
然后我可以这样使用它:
private string GetHtml(string className)
{
return $@"
<div class=""{className}"">
<span>Texte</span>
</div>".AlignFromFirstLine();
}
返回正确的html:
<div class="myClassName">
<span>Texte</span>
</div>
一个限制是它只适用于空格缩进...
欢迎任何改进!
答案 0 :(得分:3)
您可以将字符串包装到下一行以获得所需的缩进:
string div =
@"
<div class=""className"">
<span>Mon text</span>
</div>"
.TrimStart(); // to remove the additional new-line at the beginning
另一个不错的解决方案(缺点:取决于缩进级别!)
string div = @"
<div class=""className"">
<span>Mon text</span>
</div>".TrimStart().Replace("\n ", "\n");
它只是删除了字符串中的缩进。确保Replace
的第一个字符串中的空格数与缩进的空格数相同。
答案 1 :(得分:2)
我更喜欢this solution,但是如何:
string div = "<div class='className'>\n"
+ " <span>Mon text</span>\n"
+ "</div>";
这摆脱了一些混乱:
"
替换字符串中的'
,这样您就不需要转义引号。 (Single quotes in HTML appear to be legal.)""
字符串文字而不是@""
。\n
代替Environment.NewLine
。请注意the string concatenation is performed during compilation, by the compiler。 (另请参阅之前从事C#编译工作的Eric Lippert关于此主题的this和this博客文章。)没有运行时性能损失。
答案 2 :(得分:0)
如果它是一个长字符串,那么您始终可以将字符串保存在文本文件中并将其读入您的变量,例如
string text = File.ReadAllText(@"c:\file.txt", Encoding.UTF8);
通过这种方式,您可以使用文本编辑器将其格式化,并且不会对代码外观产生负面影响。
如果您正在动态更改字符串的部分内容,那么StringBuilder
是您的最佳选择。 - 或者如果您决定从文本文件中读取字符串,则可以在字符串中包含{0}
个元素,然后使用string.format(text, "text1","text2", etc)
更改所需的部分。
答案 3 :(得分:0)
受 Kotlin 中的 DEFAULT_OPTION_VALUE
启发。
此代码:
trimIndent()
将产生一个字符串:
var x = @"
anything
you
want
".TrimIndent();
或
anything
you
want
实施:
"\nanything\n you\nwant\n"