2013-08-04 95 views
0

我正試圖在C#應用程序中創建自己的Markdown版本來創建Word文檔。對於粗體/斜體/下劃線,我將分別使用**/`/_。我創建的東西,通過提取和匹配使用這樣的解析輸出粗體文字的**的組合:C# - 實現Markdown到Word(OpenXML)

RunProperties rPr2 = new RunProperties(); 
rPr2.Append(new Bold() { Val = new OnOffValue(true) }); 

Run run2 = new Run(); 
run2.Append(rPr2); 
run2.Append(new Text(extractedString)); 
p.Append(run2); 

我的問題是,當我來到結合三種不同的格式,我想我將不得不權衡所有不同的格式組合,並將它們分成單獨的運行。大膽的運行,粗體斜體運行,運行下劃線,粗體下劃線運行等等等等,我想我的程序能夠處理這樣的事情:

**_Lorem ipsum_** (creates bold & underlined run) 

`Lorem ipsum` dolor sit amet, **consectetur _adipiscing_ elit**. 
_Praesent `feugiat` velit_ sed tellus convallis, **non `rhoncus** tortor` auctor. 

基本上你可以扔在它的風格任意搭配,我希望它處理。然而,如果我以編程方式生成這些運行,我需要在將文本設置爲運行之前權衡一切,我是否應該爲每個樣式處理一個字符索引數組,並將它們合併到一個大樣式列表中(不確定我是多麼的精確會做到這一點)?

最後的問題是這樣的事情是否已經存在?如果是這樣,我一直無法找到它(單詞減號)。

回答

2

我認爲你必須通過格式將文本分成不同的部分,並將正確的格式添加到文檔中。像這裏http://msdn.microsoft.com/en-us/library/office/gg278312.aspx

所以

**非`rhoncus ** tortor`將成爲 - 「非」 的{bold} 「rhoncus」{粗體,斜體}, 「tortor」{}斜體

我認爲這比執行幾次運行更容易。你甚至不需要解析整個文檔。只要解析就行,並在格式化每次「更改」後寫入docx。

另一個想法 - 如果你正在創建的只是簡單的文本,而這正是你所需要的,那麼生成openXML本身可能更加簡單。您的數據非常結構化,應該很容易創建一個XML。

這裏有一個簡單的算法做什麼,我建議......

// These are the different formattings you have 
public enum Formatings 
    { 
     Bold, Italic, Underline, Undefined 
    } 

    // This will store the current format 
    private Dictionary<Formatings, bool> m_CurrentFormat; 

    // This will store which string translates into which format 
    private Dictionary<string, Formatings> m_FormatingEncoding; 


    public void Init() 
    { 
     m_CurrentFormat = new Dictionary<Formatings, bool>(); 
     foreach (Formatings format in Enum.GetValues(typeof(Formatings))) 
     { 
      m_CurrentFormat.Add(format, false); 
     } 

     m_FormatingEncoding = new Dictionary<string, Formatings> 
            {{"**", Formatings.Bold}, {"'", Formatings.Italic}, {"\\", Formatings.Underline}}; 
    } 

    public void ParseFormattedText(string p_text) 
    { 
     StringBuilder currentWordBuilder = new StringBuilder(); 
     int currentIndex = 0; 

     while (currentIndex < p_text.Length) 
     { 
      Formatings currentFormatSymbol; 
      int shift; 
      if (IsFormatSymbol(p_text, currentIndex, out currentFormatSymbol, out shift)) 
      { 
       // This is the current word you need to insert     
       string currentWord = currentWordBuilder.ToString(); 

       // This is the current formatting status --> m_CurrentFormat 
       // This is where you can insert your code and add the word you want to the .docx 

       currentWordBuilder = new StringBuilder(); 
       currentIndex += shift; 
       m_CurrentFormat[currentFormatSymbol] = !m_CurrentFormat[currentFormatSymbol]; 

      } 

      currentWordBuilder.Append(p_text[currentIndex]); 
      currentIndex++; 
     } 


    } 

    // Checks if the current position is the begining of a format symbol 
    // if true - p_currentFormatSymbol will be the discovered format delimiter 
    // and p_shift will denote it's length 
    private bool IsFormatSymbol(string p_text, int p_currentIndex, out Formatings p_currentFormatSymbol, out int p_shift) 
    { 
     // This is a trivial solution, you can do better if you need 
     string substring = p_text.Substring(p_currentIndex, 2); 
     foreach (var formatString in m_FormatingEncoding.Keys) 
     { 
      if (substring.StartsWith(formatString)) 
      { 
       p_shift = formatString.Length; 
       p_currentFormatSymbol = m_FormatingEncoding[formatString]; 
       return true; 
      } 
     } 

     p_shift = -1; 
     p_currentFormatSymbol = Formatings.Undefined; 
     return false; 
    } 
+0

我的問題基本上是你如何真正實現呢?將所有大膽的東西分開很容易,而且自己分割斜體也很容易。但是當考慮斜體/粗體/下劃線/粗體+斜體/粗體+下劃線/斜體+下劃線/斜體+粗體+下劃線的組合時,我該如何區分我的字符串? – danbroooks

+0

我已將簡單的代碼添加到我認爲您需要的內容中。看一看。 – Vadim

相關問題