pit-rayの備忘録

知識のあうとぷっと

カラースキーム・テーマを他のテキストエディタ用に変換するツール【TeraPad, さくらエディタ対応】

今回は、テキストエディタの色設定を相互変換できるツールの紹介です。

C++学習の副産物として生まれたツールですので、対応エディタが非常に少ないですが、コメント等で対応希望のエディタ等がありましたら実装を検討します。

他にも対応OSやGUIの実装等の要望もありましたら実装いたします。
どうぞお気軽にお寄せください。

READMEは付属していません。

CUIアプリケーションですので、コマンドプロンプトやPowerShellなどで実行してください。

TxEditorCCTool

【対応OS】
Windows
※要望があれば、他OS用のアプリケーションも配布いたします。

【使い方】
〇/〇/tecc.exe 対象のファイル名 -fr 変換元エディタ -to 変換先エディタ -nm 出力ファイル名


〇/〇/tecc.exe
■ 最初の〇/〇/は、パスを示しています。
■ 絶対パスでも相対パスでも構いませんが、それぞれの環境にあった実行方法をご利用ください。
■ .exeは省略しても構いません。


対象のファイル名
■ これには、変換元となるファイル名を指定します(パスには対応していません)
■ ファイルはtecc.exeと同じ層のディレクトリに置いてください
■ 拡張子の有無は任意です


-fr 変換元エディタ -to 変換先エディタ
■以下の値を指定します

エディタ名
TeaPad TeraPad
さくらエディタ Sakura

※要望があれば他エディタも実装いたします


-nm 出力ファイル名
■ 省略可
■ デフォルトでは、読み込んだファイル名で出力されます(拡張子は異なる)
■ 拡張子の有無は任意です。

【実行例】
monokai.col(さくらエディタ)をmonokai2.tpc(TeraPad)として変換したい場合

C:/TxEditorCCTool/tecc.exe monokai.col -fr Sakura -to TeraPad -nm monokai2.tpc

【リンク】
TxEditorCCToolをダウンロードする

以上です。
コメントお待ちしております。

【C++】ifstreamでUTF-8のBOMをスキップする方法(boost property tree)

今回は、前回とは逆で、UTF-8 with BOMを読み込むときにBOMを取り外す方法をご紹介します。

例として、boostのproperty_treeでファイルを読み込む場合を考えます。
何故なら、property_treeではBOMに対応してないため、正常にデータを読み取ることができないからです。

まず、BOMとはなにか。
前回の記事を参照してください。
www.pit-ray.com


BOMはファイルの先頭に書き込まれたデータを指します。
つまり、BOM部分をうまく読まないようにすれば、BOMなしのUTF-8として扱うことができます。


ところで先頭には、
0xEF
0xBB
0xBF

というデータが書き込まれています。

ifstreamでは、先頭から順に読んでいきます。
read関数を用いた場合は、読んだ位置まで現在位置を進めます。

この性質を生かします。


また、boostのproperty_treeのread_xml関数を見てみると以下のように、basic_istreamを引数として持つことが分かります。

// In header: <boost/property_tree/xml_parser.hpp>

template<typename Ptree> 
  void read_xml(std::basic_istream< typename Ptree::key_type::value_type > & stream, 
                Ptree & pt, int flags = 0);

(boost公式ドキュメント:Function template read_xml - 1.65.1


ifstreamは現在位置を保持するので
読み取り開始位置がBOMを読み終えた位置にある、basic_istreamを用意すればよい
という方針が立ちました。

以下のようになります。

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

#include <fstream>

void utf8bom_to_utf8( std::ifstream& rhs )
{
    static unsigned char bom[] = { 0xEF, 0xBB, 0xBF } ;
    unsigned char buffer ;

    for( const auto& b : bom ) {
        rhs.read( reinterpret_cast<char*>( &buffer ), sizeof( buffer ) ) ;
        if( buffer == b ) {
            continue ;
        }
        else {
            rhs.seekg( 0 ) ; //bomなしの場合は、位置を先頭に戻す
            return ;
        }
    }
}

int main()
{
    std::ifstream ifs( "u8b.xml" ) ; //UTF-8 with BOMのファイル
    utf8bom_to_utf8( ifs ) ;
    boost::property_tree::ptree pt ;
    boost::property_tree::xml_parser::read_xml( ifs, pt ) ;

    //以下省略
}


プログラム自体は最適化しているわけではないので、もう少し良い設計があると思います。

参考になれば幸いです。
ご指摘等ありましたら、コメントかお問い合わせフォームにてお気軽にお寄せください。

では。