hit counter for blogger

黑暗執行緒

 黑暗執行緒搬新家囉!! http://www.darkthread.net

10/25/2006

KB-將C#程式碼轉成HTML格式

常常在寫KB、MEMO之類的文件,少不了要附上程式碼讓人參考。在VS.NET/VS 2005的IDE中,關鍵字、註解等等都有特殊的色彩顯示,方便閱讀;而Copy到Word等微軟自家的RichText環境時,它會很貼心地保留顏色及格式設定。但再由Word再轉成HTML就有點小麻煩,一方面HTML Tag又臭又長(我曾寫了個小工具淨化Word轉出來的HTML原始碼),有時則會Layout大亂,還要不少手工調整。有沒有將Source Code直接轉成HTML的方便工具呢?

有的,同事小熊子介紹過一個CSharpFormat,只要提供純文字的Source Code,可以線上將C#、VB.NET、HTML、T-SQL等原始碼轉成HTML格式。前些日子,在TechEd上認識了小熊子的朋友--"雞"房老板,他的Blog上有篇文章介紹了VS 2005上必備的Add-In,爬了一下文,發現一個好東西,CopySourceAsHTML,可以直接在VS 2005中Copy As HTML,Paste時貼上的就是跟IDE中色彩一致的HTML了,更加方便!! 美中不足之處是它的中文處理有點瑕疵---每個中文字後方都多了一個Big5的十六進位數字(例如: 下圖的'be?),例如:
//以'a5HJS操'be?作'a7@DOM將'b1N結'b5?果'aaG傳'b6?回'a6^

追了一下Source Code,原來VS 2005在Copy時,有存入一份RTF格式,而它是透過解析RTF格式來保留文字的格式設定(聰明! 這樣只要VS 2005能開出來編輯的檔案格式,它都能原味重現)。只是中文的RTF表示法有點機車,會先用中的Unicode表示,後方再接上'a4?'a4?的Big5原碼,這點大概是作者沒想到的。找到原因,我鋸箭解了一下問題,修改了HtmlBlock.cs,將多餘的文字排掉:

   65         //2006-10-19 by Jeffrey

   66         //用來跳過中文中後方多餘的字元

   67         int skipCounter=0;

   68 

   69         public void AppendEncoded(char value)

   70         {  

   71             //對於外國文字,&#nnnnn;後方不一定會接

   72             if (skipCounter == 4 && value != '\'')

   73                 skipCounter = 0;

   74 

   75             if (skipCounter > 0) //&#nnnnn;後方後方的多餘字元,略過

   76             {

   77                 skipCounter--;

   78                 return;

   79             }

   80 

   81             if (value == ' ')

   82             {

   83                 AppendUnencoded(value);

   84             }

   85             else

   86             {

   87                 //2006-10-19 by Jeffrey

   88                 //中文會變成中的格式,後方則會因RTF Parsing問題出現

   89                 //在此用鋸箭法避開

   90                 string enc = Tools.HtmlEncode(value);

   91                 if (enc.StartsWith("&#")) skipCounter = 4;

   92                 AppendUnencoded(enc);

   93             }

   94         }

有需要修改版DLL的人可以到這裡下載。使用時請先用CopySourceAsHTML Installer安裝原來的Add-In,關閉VS 2005後,再將My Documents\Visual Studio 2005\Addins\下的CopySourceAsHtml.dll換成修改版就可以了!

0 Comments:

Post a Comment

<< Home