トップ回答者
コードの色づけ

質問
-
Blog等のWebサイト上にC#やVB.NETのコードを掲載するにあたって、Visual Studioと同じように(ここ重要)色をつけたいと考えています。
C# Code FormatとかSyntaxHighlighterなんかが有名ですが、クラス名を色づけしてくれないのが大きな不満です。Windows Live WriterのアドインであるPaste from Visual Studioを使うと、クラス名まで色づけしてくれて、見た目にはバッチリなのですが、吐き出されるHTMLは<SPAN style="COLOR: rgb(43,145,175)"> ってな具合なのです。
できればそこは、<SPAN class="type"> とかにして欲しい。
しかし、何がクラス名なのかは正規表現では対応できない(と思う)ので、本格的なコードパーサを用意しないとだめだと思います。当然ですが、Visual Studioのエディタは、どこがクラス名でどこがキーワードなのかをちゃんと判別して色づけしてくれます。
大変な思いをしてC#のパーサを実装するよりは、Visual Studioが持っているパーサや色づけ機構を利用しない手はない、と思います。
CSharpCodeProvider.Parseがちゃんと機能してくれれば問題は簡単に解決するんですけどね…。Visual Studioは、アドイン形式で対応言語を増やすことができます。
ということは、C#やVB.NETも、アドインとして提供されているんだろうと思うのです(正確にはパッケージって言うんでしょうか。Visual Studio起動時のスプラッシュスクリーンや、バージョン情報ウィンドウに表示されているのは、インストールされているパッケージの一部ですよね)。
どこがキーワードでどこがクラス名で、それを何色で書くべきかは、このアドインが全部知っているはずです。で、このアドイン――言語サービスって言うんでしょうかね――を開発するには、Visual Studio SDKを使うと。そこまではわかっています。
やりたいのは新しい言語サービスの開発ではなく、既にインストールされているC#やVB.NETの言語サービスを呼び出して、ソースコードをパースさせ、同時に、どこを何色で書くのかを取得することです。
Visual Studioでソースコードが表示されているとき、あるメニューをクリックすると、現在編集中のソースコードに対応する言語サービスを取得し、そいつにコードをパースさせてHTML(またはXML)化するというVisual Studioアドインを作ることを目標としたいのですが、方法がまったくわかりません。未だ、「現在編集中のソースコードに対応する言語サービスの取得」すら出来ていません。
本家MSDNフォーラムには、機能拡張を専門に扱うフォーラムがあるので、そっちに質問できればいいのですが、いかんせん英語力が無いもので叶いません。
どなたかご存知でしたら、ご教示願えませんでしょうか。
回答
-
アエトス さんからの引用 Visual Studioでソースコードが表示されているとき、あるメニューをクリックすると、現在編集中のソースコードに対応する言語サービスを取得し、そいつにコードをパースさせてHTML(またはXML)化するというVisual Studioアドインを作ることを目標としたいのですが、方法がまったくわかりません。 むかし似たようなことをやっていたので,(そのときは C++ の構文木から C# コードに変換するというマクロを書いていたのですが),もしかしたらお力になれるかもしれないし,なれないかもしれません.
とりあえず,使えそうな部分としては VisualStudio オートメーションの CodeModel の仕組みでしょうか.私も試したわけじゃないので,うまく行くかどうかは分かりません.その点はご注意下さい.
余談ですが,C# や VisualBasic では,基本的にプロジェクト単位で一括コンパイルが行われます.1 つのクラス定義が複数のファイルに分散することもありますし,あるファイルは書きかけで文法エラーが起きているかもしれません.Visual Studio のエディタの色づけは,そういった状況でも機能する特殊なものなので,コンパイラを作るようなアプローチで作った普通のパーサを使ってもうまく行かないことがあるんじゃないかと思います.自前でパースするなら,少なくともコンパイル可能な状態のソースコードを,プロジェクトファイル単位でまとめて取り扱う必要があるかと思います.
アエトス さんからの引用 Windows Live WriterのアドインであるPaste from Visual Studioを使うと、クラス名まで色づけしてくれて、見た目にはバッチリなのですが、吐き出されるHTMLは<SPAN style="COLOR: rgb(43,145,175)"> ってな具合なのです。
できればそこは、<SPAN class="type"> とかにして欲しい。恐らくですが,Paste from Visual Studio は,RichText 形式のフォーマットを解析していて,ある部分文字列が何であったかの完全な再構成が不可能なのかもしれません.クリップボードを経由したデータの受け渡しでは,複数のフォーマットのネゴシエートが可能です.Visual Studio のエディタからコピーするときに,RichText 形式もサポートされていて,それを利用しているんじゃないかと予想しています.
RichText をサポートする,wordpad や MS-Word に貼り付けても,色は保存されていたと思いますよ.
すべての返信
-
アエトス さんからの引用 Visual Studioでソースコードが表示されているとき、あるメニューをクリックすると、現在編集中のソースコードに対応する言語サービスを取得し、そいつにコードをパースさせてHTML(またはXML)化するというVisual Studioアドインを作ることを目標としたいのですが、方法がまったくわかりません。 むかし似たようなことをやっていたので,(そのときは C++ の構文木から C# コードに変換するというマクロを書いていたのですが),もしかしたらお力になれるかもしれないし,なれないかもしれません.
とりあえず,使えそうな部分としては VisualStudio オートメーションの CodeModel の仕組みでしょうか.私も試したわけじゃないので,うまく行くかどうかは分かりません.その点はご注意下さい.
余談ですが,C# や VisualBasic では,基本的にプロジェクト単位で一括コンパイルが行われます.1 つのクラス定義が複数のファイルに分散することもありますし,あるファイルは書きかけで文法エラーが起きているかもしれません.Visual Studio のエディタの色づけは,そういった状況でも機能する特殊なものなので,コンパイラを作るようなアプローチで作った普通のパーサを使ってもうまく行かないことがあるんじゃないかと思います.自前でパースするなら,少なくともコンパイル可能な状態のソースコードを,プロジェクトファイル単位でまとめて取り扱う必要があるかと思います.
アエトス さんからの引用 Windows Live WriterのアドインであるPaste from Visual Studioを使うと、クラス名まで色づけしてくれて、見た目にはバッチリなのですが、吐き出されるHTMLは<SPAN style="COLOR: rgb(43,145,175)"> ってな具合なのです。
できればそこは、<SPAN class="type"> とかにして欲しい。恐らくですが,Paste from Visual Studio は,RichText 形式のフォーマットを解析していて,ある部分文字列が何であったかの完全な再構成が不可能なのかもしれません.クリップボードを経由したデータの受け渡しでは,複数のフォーマットのネゴシエートが可能です.Visual Studio のエディタからコピーするときに,RichText 形式もサポートされていて,それを利用しているんじゃないかと予想しています.
RichText をサポートする,wordpad や MS-Word に貼り付けても,色は保存されていたと思いますよ.
-
NyaRuRuさん、ありがとうございます。
NyaRuRu さんからの引用 とりあえず,使えそうな部分としては VisualStudio オートメーションの CodeModel の仕組みでしょうか.私も試したわけじゃないので,うまく行くかどうかは分かりません.その点はご注意下さい.
以前にもFileCodeModelは試したのですが、メソッドの中のコードまでは踏み込めないようでした。
NyaRuRu さんからの引用 余談ですが,C# や VisualBasic では,基本的にプロジェクト単位で一括コンパイルが行われます.1 つのクラス定義が複数のファイルに分散することもありますし,あるファイルは書きかけで文法エラーが起きているかもしれません.Visual Studio のエディタの色づけは,そういった状況でも機能する特殊なものなので,コンパイラを作るようなアプローチで作った普通のパーサを使ってもうまく行かないことがあるんじゃないかと思います.自前でパースするなら,少なくともコンパイル可能な状態のソースコードを,プロジェクトファイル単位でまとめて取り扱う必要があるかと思います.
なればこそ、Visual Studio が持っている言語サービスを利用しないことには、非現実的なことになってしまうと思います。
NyaRuRu さんからの引用 恐らくですが,Paste from Visual Studio は,RichText 形式のフォーマットを解析していて,ある部分文字列が何であったかの完全な再構成が不可能なのかもしれません.クリップボードを経由したデータの受け渡しでは,複数のフォーマットのネゴシエートが可能です.Visual Studio のエディタからコピーするときに,RichText 形式もサポートされていて,それを利用しているんじゃないかと予想しています.
はい。おそらく、そうであろうと思われます。
-
こんにちは。フォーラムオペレータの栗原麻里 です。
NyaRuRu さん、回答ありがとうございます。
アエトス さん、フォーラムのご利用ありがとうございます。
有用な情報だと思いましたので、NyaRuRu さんの回答へ回答済みチェックをつけさせていただきました。回答済みチェックが付くことにより、フォーラムをご利用していただいている皆様が、有用な情報を
見つけやすくなります。
ですので、回答された情報が有用だと思われましたら、ぜひ回答済みボタンを押してチェックを付けて
くださいね!アエトス さんはチェックを解除することもできますので、ご確認ください。
それでは、ぜひまたご活用ください!