//---------------------------------------------------------------------- // BackgroundWorker browser preview //---------------------------------------------------------------------- private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string ResultText = (string)e.Argument; string MkResultText = ""; string BackgroundColorString; string EncodingName; //編集中のファイル名 //Editing file name string FileName = (_MarkDownTextFilePath == "" ? "" : Path.GetFileName(_MarkDownTextFilePath)); //DOCTYPE HtmlHeader htmlHeader = new HtmlHeader(); string DocType = htmlHeader.GetHtmlHeader(MarkDownSharpEditor.AppSettings.Instance.HtmlDocType); //マーキングの色づけ //Marker's color if (MarkDownSharpEditor.AppSettings.Instance.fHtmlHighLightColor == true) { Color ColorBackground = Color.FromArgb(MarkDownSharpEditor.AppSettings.Instance.HtmlHighLightColor); BackgroundColorString = ColorTranslator.ToHtml(ColorBackground); } else { BackgroundColorString = "none"; } //指定のエンコーディング //Codepage int CodePageNum = MarkDownSharpEditor.AppSettings.Instance.CodePageNumber; try { Encoding enc = Encoding.GetEncoding(CodePageNum); //ブラウザ表示に対応したエンコーディングか //Is the encoding supported browser? if (enc.IsBrowserDisplay == true) { EncodingName = enc.WebName; } else { EncodingName = "utf-8"; } } catch { //エンコーディングの取得に失敗した場合 //Default encoding if failing to get encoding EncodingName = "utf-8"; } //Header string header = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <link rel='stylesheet' href='{2}' type='text/css' /> <style type='text/css'> ._mk {{background-color:{3}}} </style> <title>{4}</title> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング ( encoding ) _SelectedCssFilePath, //適用中のCSSファイル ( Selected CSS file ) BackgroundColorString, //編集箇所の背景色 ( background color in Editing ) FileName); //タイトル(=ファイル名) ( title = file name ) //Footer string footer = "</body>\n</html>"; //----------------------------------- //Markdown parse ( default ) //Markdown mkdwn = new Markdown(); //----------------------------------- //----------------------------------- // MarkdownDeep // Create an instance of Markdown //----------------------------------- var mkdwn = new MarkdownDeep.Markdown(); // Set options mkdwn.ExtraMode = MarkDownSharpEditor.AppSettings.Instance.fMarkdownExtraMode; mkdwn.SafeMode = false; //----------------------------------- ResultText = mkdwn.Transform(ResultText); //表示するHTMLデータを作成 //Creat HTML data ResultText = header + ResultText + footer; //パースされた内容から編集行を探す //Search editing line in parsed data string OneLine; StringReader sr = new StringReader(ResultText); StringWriter sw = new StringWriter(); while ((OneLine = sr.ReadLine()) != null) { if (OneLine.IndexOf("<!-- edit -->") >= 0) { MkResultText += ("<div class='_mk'>" + OneLine + "</div>\n"); } else { MkResultText += (OneLine + "\n"); } } //エンコーディングしつつbyte値に変換する(richEditBoxは基本的にutf-8 = 65001) //Encode and convert it to 'byte' value ( richEditBox default encoding is utf-8 = 65001 ) byte[] bytesData = Encoding.GetEncoding(CodePageNum).GetBytes(MkResultText); //----------------------------------- // Write to temporay file if (_fNoTitle == false) { //テンポラリファイルパスを取得する //Get temporary file path if (_TemporaryHtmlFilePath == "") { _TemporaryHtmlFilePath = Get_TemporaryHtmlFilePath(_MarkDownTextFilePath); } //他のプロセスからのテンポラリファイルの参照と削除を許可して開く(でないと飛ぶ) //Open temporary file to allow references from other processes using (FileStream fs = new FileStream( _TemporaryHtmlFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read | FileShare.Delete)) { fs.Write(bytesData, 0, bytesData.Length); e.Result = _TemporaryHtmlFilePath; } } //----------------------------------- // Navigate and view in browser else { //Write data as it is, if the editing data is no title ResultText = Encoding.GetEncoding(CodePageNum).GetString(bytesData); e.Result = ResultText; } }
//---------------------------------------------------------------------- // HTML形式出力 ( Output to HTML file ) //---------------------------------------------------------------------- private bool OutputToHtmlFile(string FilePath, string SaveToFilePath, bool fToClipboard = false) { if (File.Exists(FilePath) == false) { return (false); } //出力内容 ( Output data ) string ResultText = ""; //HTMLタグ ( HTML Header tag ) string HeaderString = ""; string FooterString = ""; //文字コード ( Character encoding ) string EncodingName; Encoding encRead = Encoding.UTF8; Encoding encHtml = Encoding.UTF8; //----------------------------------- //編集中のファイルパス or 投げ込まれたファイルパス //Editing file path or Drag & Dropped files string FileName = Path.GetFileName(FilePath); //----------------------------------- //DOCTYPE HtmlHeader htmlHeader = new HtmlHeader(); string DocType = htmlHeader.GetHtmlHeader(MarkDownSharpEditor.AppSettings.Instance.HtmlDocType); //Web用の相対パス //Relative url string CssPath = RerativeFilePath(FilePath, _SelectedCssFilePath); //----------------------------------- //指定のエンコーディング //Codepage int CodePageNum = MarkDownSharpEditor.AppSettings.Instance.CodePageNumber; try { encHtml = Encoding.GetEncoding(CodePageNum); //ブラウザ表示に対応したエンコーディングか //Is the encoding supported browser? if (encHtml.IsBrowserDisplay == true) { EncodingName = encHtml.WebName; } else { EncodingName = "utf-8"; encHtml = Encoding.UTF8; } } catch { //エンコーディングの取得に失敗した場合はデフォルト //Default encoding if failing to get encoding EncodingName = "utf-8"; encHtml = Encoding.UTF8; } //HTMLのヘッダを挿入する //Insert HTML Header if (MarkDownSharpEditor.AppSettings.Instance.fHtmlOutputHeader == true) { //CSSファイルを埋め込む //Embeding CSS file contents if (MarkDownSharpEditor.AppSettings.Instance.HtmlCssFileOption == 0) { string CssContents = ""; if (File.Exists(_SelectedCssFilePath) == true) { using (StreamReader sr = new StreamReader(_SelectedCssFilePath, encHtml)) { CssContents = sr.ReadToEnd(); } } //ヘッダ ( Header ) HeaderString = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <title>{2}</title> <style> <!-- {3} --> </style> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング ( Encoding ) FileName, //タイトル(=ファイル名) ( Title = file name ) CssContents); //CSSの内容 ( Contents of CSS file ) } //metaタグ(外部リンキング)(Meta tag: external linking ) else { //ヘッダ ( Header ) HeaderString = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <link rel='stylesheet' href='{2}' type='text/css' /> <title>{3}</title> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング ( Encoding ) CssPath, //CSSファイル(相対パス)( Relative url ) FileName); //タイトル(=ファイル名) ( Title = file name ) } //フッタ ( Footer ) FooterString = "</body>\n</html>"; } else { HeaderString = ""; FooterString = ""; } //----------------------------------- //Markdown parse ( default ) //Markdown mkdwn = new Markdown(); //----------------------------------- //----------------------------------- // MarkdownDeep // Create an instance of Markdown //----------------------------------- var mkdwn = new MarkdownDeep.Markdown(); // Set options mkdwn.ExtraMode = MarkDownSharpEditor.AppSettings.Instance.fMarkdownExtraMode; mkdwn.SafeMode = false; //----------------------------------- //編集中のファイル(richEditBoxの内容) //Editing file path if (_MarkDownTextFilePath == FilePath) { ResultText = mkdwn.Transform(richTextBox1.Text); //エンコーディング変換(richEditBoxは基本的にutf-8) //Convert encoding ( richEditBox default encoding is utf-8 = 65001 ) ResultText = ConvertStringToEncoding(ResultText, Encoding.UTF8.CodePage, CodePageNum); } else { //テキストファイルを開いてその文字コードに従って読み込み //Detect encoding in the text file byte[] bs; using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { bs = new byte[fs.Length]; fs.Read(bs, 0, bs.Length); } //文字コードを取得する //Get charcter encoding encRead = GetCode(bs); //取得したバイト列を文字列に変換 //Convert byte values to character ResultText = encRead.GetString(bs); //UTF-8でないならいったん変換してパース //Convert it if encoding is not utf-8 if (encRead != Encoding.UTF8) { ResultText = ConvertStringToEncoding(ResultText, encRead.CodePage, CodePageNum); } ResultText = mkdwn.Transform(ResultText); } //ヘッダ+本文+フッタ //Header + Contents + Footer ResultText = HeaderString + ResultText + FooterString; //出力するHTMLファイルの文字コードに合わせる //Ajust encoding to output HTML file ResultText = ConvertStringToEncoding(ResultText, Encoding.UTF8.CodePage, CodePageNum); if (fToClipboard == true) { //クリップボードに書き込む //Set data to clipbord Clipboard.SetText(ResultText); } else { //ファイルに書き込む //Write file using (StreamWriter sw = new StreamWriter(SaveToFilePath, false, encHtml)) { sw.Write(ResultText); } } return (true); }
//---------------------------------------------------------------------- // TODO: HTML形式出力 //---------------------------------------------------------------------- private bool OutputToHtmlFile(string FilePath, string SaveToFilePath, bool fToClipboard = false) { if ( File.Exists(FilePath) == false ) { return (false); } //出力内容 string ResultText = ""; //HTMLタグ string HeaderString = ""; string FooterString = ""; //文字コード string EncodingName; Encoding encRead = Encoding.UTF8; Encoding encHtml = Encoding.UTF8; //----------------------------------- //編集中のファイルパス or 投げ込まれたファイルパス string FileName = Path.GetFileName(FilePath); //----------------------------------- //指定のDOCTYPE HtmlHeader htmlHeader = new HtmlHeader(); string DocType = htmlHeader.GetHtmlHeader(MarkDownSharpEditor.AppSettings.Instance.HtmlDocType); //Web用の相対パス string CssPath = RerativeFilePath(FilePath, SelectedCssFilePath); //----------------------------------- //指定のエンコーディング int CodePageNum = MarkDownSharpEditor.AppSettings.Instance.CodePageNumber; try { encHtml = Encoding.GetEncoding(CodePageNum); //ブラウザ表示に対応したエンコーディングか if (encHtml.IsBrowserDisplay == true) { EncodingName = encHtml.WebName; } else { EncodingName = "utf-8"; encHtml = Encoding.UTF8; } } catch { //エンコーディングの取得に失敗した場合はデフォルト EncodingName = "utf-8"; encHtml = Encoding.UTF8; } //HTMLのヘッダを挿入する if (MarkDownSharpEditor.AppSettings.Instance.fHtmlOutputHeader == true) { //CSSファイルを埋め込む if (MarkDownSharpEditor.AppSettings.Instance.HtmlCssFileOption == 0) { string CssContents = ""; if (File.Exists(SelectedCssFilePath) == true) { using (StreamReader sr = new StreamReader(SelectedCssFilePath, encHtml)) { CssContents = sr.ReadToEnd(); } } //ヘッダ HeaderString = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <title>{2}</title> <style> <!-- {3} --> </style> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング FileName, //タイトル(=ファイル名) CssContents); //CSSの内容 } //metaタグ(外部リンキング) else { //ヘッダ HeaderString = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <link rel='stylesheet' href='{2}' type='text/css' /> <title>{3}</title> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング CssPath, //CSSファイル(相対パス) FileName); //タイトル(=ファイル名) } //フッタ FooterString = "</body>\n</html>"; } else { HeaderString = ""; FooterString = ""; } //Markdownパース Markdown mkdwn = new Markdown(); //編集中のファイル(richEditBoxの内容) if (MarkDownTextFilePath == FilePath) { ResultText = mkdwn.Transform(richTextBox1.Text); //エンコーディング変換(richEditBoxは基本的にutf-8) ResultText = ConvertStringToEncoding(ResultText, Encoding.UTF8.CodePage, CodePageNum); } else { //テキストファイルを開いてその文字コードに従って読み込み byte[] bs; using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { bs = new byte[fs.Length]; fs.Read(bs, 0, bs.Length); } //文字コードを取得する encRead = GetCode(bs); //取得したバイト列を文字列に変換 ResultText = encRead.GetString(bs); //UTF-8でないならいったん変換してパース if (encRead != Encoding.UTF8) { ResultText = ConvertStringToEncoding(ResultText, encRead.CodePage, CodePageNum); } ResultText = mkdwn.Transform(ResultText); } //ヘッダ+本文+フッタ ResultText = HeaderString + ResultText + FooterString; //出力するHTMLファイルの文字コードに合わせる ResultText = ConvertStringToEncoding(ResultText, Encoding.UTF8.CodePage, CodePageNum); if (fToClipboard == true) { //クリップボードに書き込む Clipboard.SetText(ResultText); } else { //ファイルに書き込む using (StreamWriter sw = new StreamWriter(SaveToFilePath, false, encHtml)) { sw.Write(ResultText); } } return (true); }
//---------------------------------------------------------------------- // TODO: ブラウザプレビュー(編集中の内容を反映) //---------------------------------------------------------------------- private void PreviewToBrowser() { //更新抑制中のときはプレビューしない if (fConstraintChange == true) { return; } string BackgroundColorString; string EncodingName; //編集中のファイル名 string FileName = Path.GetFileName(MarkDownTextFilePath); //指定のDOCTYPE HtmlHeader htmlHeader = new HtmlHeader(); string DocType = htmlHeader.GetHtmlHeader(MarkDownSharpEditor.AppSettings.Instance.HtmlDocType); //マーキングの色づけ if (MarkDownSharpEditor.AppSettings.Instance.fHtmlHighLightColor == true) { Color ColorBackground = Color.FromArgb(MarkDownSharpEditor.AppSettings.Instance.HtmlHighLightColor); BackgroundColorString = ColorTranslator.ToHtml(ColorBackground); } else { BackgroundColorString = "none"; } //指定のエンコーディング int CodePageNum = MarkDownSharpEditor.AppSettings.Instance.CodePageNumber; try { Encoding enc = Encoding.GetEncoding(CodePageNum); //ブラウザ表示に対応したエンコーディングか if (enc.IsBrowserDisplay == true) { EncodingName = enc.WebName; } else { EncodingName = "utf-8"; } } catch { //エンコーディングの取得に失敗した場合 EncodingName = "utf-8"; } //ヘッダ string header = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <link rel='stylesheet' href='{2}' type='text/css' /> <style type='text/css'> ._mk {{background-color:{3}}} </style> <title>{4}</title> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング SelectedCssFilePath, //適用中のCSSファイル BackgroundColorString, //編集箇所の背景色 FileName); //タイトル(=ファイル名) //フッタ string footer = "</body>\n</html>"; //Markdownパース Markdown mkdwn = new Markdown(); string ResultText = mkdwn.Transform(richTextBox1.Text); //表示するHTMLデータを作成 ResultText = header + ResultText + footer; //エンコーディングしつつbyte値に変換する(richEditBoxは基本的にutf-8 = 65001) byte[] bytesData = Encoding.GetEncoding(CodePageNum).GetBytes(ResultText); if (fNoTitle == true) { //「無題」ファイルを編集中はナビゲートせずにそのまま書き込む ResultText = Encoding.GetEncoding(CodePageNum).GetString(bytesData); webBrowser1.Document.Write(ResultText); //ツールバーの「関連付けられたブラウザーを起動」を無効に toolStripButtonBrowserPreview.Enabled = false; } else { //テンポラリファイルパスを取得する if (TemporaryHtmlFilePath == "") { TemporaryHtmlFilePath = GetTemporaryHtmlFilePath(MarkDownTextFilePath); } //他のプロセスからのテンポラリファイルの参照と削除を許可して開く(でないと飛ぶ) using (FileStream fs = new FileStream( TemporaryHtmlFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read | FileShare.Delete)) { fs.Write(bytesData, 0, bytesData.Length); } //ナビゲート webBrowser1.Navigate(@"file://" + TemporaryHtmlFilePath); richTextBox1.Focus(); toolStripButtonBrowserPreview.Enabled = true; } }
//---------------------------------------------------------------------- // HACK: PreviewToBrowser [ ブラウザプレビュー ] // //---------------------------------------------------------------------- private void PreviewToBrowser() { //更新抑制中のときはプレビューしない if (fConstraintChange == true) { timer1.Enabled = false; return; } string ResultText = ""; string MkResultText = ""; string BackgroundColorString; string EncodingName; //編集中のファイル名 string FileName = Path.GetFileName(MarkDownTextFilePath); //指定のDOCTYPE HtmlHeader htmlHeader = new HtmlHeader(); string DocType = htmlHeader.GetHtmlHeader(MarkDownSharpEditor.AppSettings.Instance.HtmlDocType); //マーキングの色づけ if (MarkDownSharpEditor.AppSettings.Instance.fHtmlHighLightColor == true) { Color ColorBackground = Color.FromArgb(MarkDownSharpEditor.AppSettings.Instance.HtmlHighLightColor); BackgroundColorString = ColorTranslator.ToHtml(ColorBackground); } else { BackgroundColorString = "none"; } //指定のエンコーディング int CodePageNum = MarkDownSharpEditor.AppSettings.Instance.CodePageNumber; try { Encoding enc = Encoding.GetEncoding(CodePageNum); //ブラウザ表示に対応したエンコーディングか if (enc.IsBrowserDisplay == true) { EncodingName = enc.WebName; } else { EncodingName = "utf-8"; } } catch { //エンコーディングの取得に失敗した場合 EncodingName = "utf-8"; } //ヘッダ string header = string.Format( @"{0} <html> <head> <meta http-equiv='Content-Type' content='text/html; charset={1}' /> <link rel='stylesheet' href='{2}' type='text/css' /> <style type='text/css'> ._mk {{background-color:{3}}} </style> <title>{4}</title> </head> <body> ", DocType, //DOCTYPE EncodingName, //エンコーディング SelectedCssFilePath, //適用中のCSSファイル BackgroundColorString, //編集箇所の背景色 FileName); //タイトル(=ファイル名) //フッタ string footer = "</body>\n</html>"; int NextLineNum, ParagraphStart; //編集箇所にマーカーを挿入する if (richTextBox1.SelectionStart > 0) { NextLineNum = richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) + 1; ParagraphStart = richTextBox1.GetFirstCharIndexOfCurrentLine(); if (ParagraphStart == 0) { ParagraphStart = 1; } ResultText = richTextBox1.Text.Substring(0, ParagraphStart) + "<!-- edit -->" + richTextBox1.Text.Substring(ParagraphStart); } else { ResultText = richTextBox1.Text; } //Markdownパース Markdown mkdwn = new Markdown(); ResultText = mkdwn.Transform(ResultText); //表示するHTMLデータを作成 ResultText = header + ResultText + footer; //パースされた内容から編集行を探す string OneLine; StringReader sr = new StringReader(ResultText); StringWriter sw = new StringWriter(); while ((OneLine = sr.ReadLine()) != null) { if (OneLine.IndexOf("<!-- edit -->") >= 0) { MkResultText += ("<div class='_mk'>" + OneLine + "</div>\n"); } else { MkResultText += (OneLine+"\n"); } } //エンコーディングしつつbyte値に変換する(richEditBoxは基本的にutf-8 = 65001) byte[] bytesData = Encoding.GetEncoding(CodePageNum).GetBytes(MkResultText); //----------------------------------- //スクロールバーの位置を退避しておく HtmlDocument doc = webBrowser1.Document; Point scrollpos = new Point(0, 0); if (doc != null) { IHTMLDocument3 doc3 = (IHTMLDocument3)webBrowser1.Document.DomDocument; IHTMLElement2 elm = (IHTMLElement2)doc3.documentElement; scrollpos = new Point(elm.scrollLeft, elm.scrollTop); } //----------------------------------- if (fNoTitle == true) { //「無題」ファイルを編集中はナビゲートせずにそのまま書き込む ResultText = Encoding.GetEncoding(CodePageNum).GetString(bytesData); webBrowser1.DocumentText = MkResultText; //ツールバーの「関連付けられたブラウザーを起動」を無効に toolStripButtonBrowserPreview.Enabled = false; } else { //テンポラリファイルパスを取得する if (TemporaryHtmlFilePath == "") { TemporaryHtmlFilePath = GetTemporaryHtmlFilePath(MarkDownTextFilePath); } //他のプロセスからのテンポラリファイルの参照と削除を許可して開く(でないと飛ぶ) using (FileStream fs = new FileStream( TemporaryHtmlFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read | FileShare.Delete)) { fs.Write(bytesData, 0, bytesData.Length); } //ナビゲート webBrowser1.Navigate(@"file://" + TemporaryHtmlFilePath); richTextBox1.Focus(); toolStripButtonBrowserPreview.Enabled = true; } //----------------------------------- //スクロールバーの位置を復帰する if (doc != null) { while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } doc.Window.ScrollTo(scrollpos); } }