2012-08-12 49 views
1

我的應用程序應該閱讀一個C#代碼樣品即不縮進,然後縮進代碼編程。我這樣做的方式可能不正確,但仍可能取得部分結果。應用該縮進在C#中沒有鋸齒的代碼

當找到{然後用該行的其餘部分相同的空間繼續被讀取,我可以設置空格。當再次找到另一個{時,請添加空格,併爲其餘行添加此新空間。爲此,我這樣做了:

private void btn_format_Click(object sender, EventArgs e) 
    { 
     string lineInfo = ""; 
     string fl = ""; 
     string ctab= char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32); 
     foreach (string line in txt_codepage.Lines) // text_codepage is a textbox with code 
     { 
      if (line.Contains("{")) 
      { 
       string l = line.Replace("{", ctab+"{"); 
       lineInfo = lineInfo + (l + "\n"); 
       fl = fl + ctab; 
       ctab = ctab + ctab; 
      } 
      else 
      { 
       lineInfo = lineInfo + (char.ConvertFromUtf32(32)+fl+ line + "\n"); 
      } 

我可以實現我想要的適當的縮進,直到這裏。現在,當我找到一個}我應該做的逆過程,但不幸的是這是不可能的字符串。我的意思相反的過程是這樣的:

  if (line.Contains("}")) 
      { 
       string l = line.Replace(ctab + "}", "}"); 
       lineInfo = lineInfo + (l + "\n"); 
       fl = fl - ctab; 
       ctab = ctab - ctab; 
      } 
      else 
      { 
       lineInfo = lineInfo - (char.ConvertFromUtf32(32) + fl + line + "\n"); 

      } 
     } 
     MessageBox.Show(lineInfo.ToString()); 

我知道代碼的上面部分是一個完整的大錯,但讓我知道如何去實現它在正確的方式

+0

Visual Studio內置了這種自動縮進功能。你有沒有檢查它是否暴露了API中的功能? – 2012-08-12 12:45:09

回答

0

從刪除所有空白使用String.Trim()行,然後添加你想要的選項卡。此外,您的代碼將更具可讀性,如果你能避免char.ConvertFromUtf32(32) - 爲什麼寫的,而不是「」或「「?

+0

'char.ConvertFromUtf32(32)'是用於打印一個空白空間。因爲我不想使用添加8個空格的\ t,所以我創建了一個3個空格的字符串變量。 – Cdeez 2012-08-13 04:10:35

+0

對,忘了我的ascii值,並沒有編譯器。 (更新的)問題依然存在。 – bmm6o 2012-08-13 16:24:38

1

你可以去看看codemaid,一個開源VS加在清潔代碼

2

如果你想解析字符串,你應該使用StringBuilder而不是字符串連接(級聯就是慢)。我寫了一些代碼,演示如何解析CS或其他代碼。這不是一個完整的例子,只是一個基本的概念。

如果您想了解更多關於解析器可以閱讀Compilers: Principles, Techniques, and Tools

public static string IndentCSharpCode(string code) 
{ 
    const string INDENT_STEP = " "; 

    if (string.IsNullOrWhiteSpace(code)) 
    { 
     return code; 
    } 

    var result = new StringBuilder(); 
    var indent = string.Empty; 
    var lineContent = false; 
    var stringDefinition = false; 

    for (var i = 0; i < code.Length; i++) 
    { 
     var ch = code[i]; 

     if (ch == '"' && !stringDefinition) 
     { 
      result.Append(ch); 
      stringDefinition = true; 
      continue; 
     } 

     if (ch == '"' && stringDefinition) 
     { 
      result.Append(ch); 
      stringDefinition = false; 
      continue; 
     } 

     if (stringDefinition) 
     { 
      result.Append(ch); 
      continue; 
     } 

     if (ch == '{' && !stringDefinition) 
     { 
      if (lineContent) 
      { 
       result.AppendLine(); 
      } 

      result.Append(indent).Append("{"); 

      if (lineContent) 
      { 
       result.AppendLine(); 
      } 

      indent += INDENT_STEP; 
      lineContent = false; 

      continue; 
     } 

     if (ch == '}' && !stringDefinition) 
     { 
      if (indent.Length != 0) 
      { 
       indent = indent.Substring(0, indent.Length - INDENT_STEP.Length); 
      } 

      if (lineContent) 
      { 
       result.AppendLine(); 
      } 

      result.Append(indent).Append("}"); 

      if (lineContent) 
      { 
       result.AppendLine(); 
      } 


      lineContent = false; 

      continue; 
     } 

     if (ch == '\r') 
     { 
      continue; 
     } 

     if ((ch == ' ' || ch == '\t') && !lineContent) 
     { 
      continue; 
     } 

     if (ch == '\n') 
     { 
      lineContent = false; 
      result.AppendLine(); 

      continue; 
     } 

     if (!lineContent) 
     { 
      result.Append(indent); 
      lineContent = true; 
     } 

     result.Append(ch); 
    } 

    return result.ToString(); 
} 
+0

謝謝,這是一個很好的。將嘗試修改我的代碼 – Cdeez 2012-08-13 04:12:14