limitusus’s diary

主に技術のことを書きます

Tween.exe.configからcrochetの設定ファイルを生成

id:showyouこんなことを言っていたので作ってみた。

PerlerなのでPerlでキモく実装。バグがあったらごめんなさい。

準備

XML::ParserはPerl標準モジュールではない(と思う)ので、以下の手順などでCPANから入れてください。

$ perl -MCPAN -e 'install XML::Parser'

使い方

$ perl tween2crochet.pl Tween.exe.config crochet.config

だけです。第一引数はTweenの設定ファイル(中身はXML)、第二引数はcrochetの設定ファイル(新規作成/存在する場合は上書き)です。

注意事項

  • ソースコード・入力ファイル(Tween.exe.config)の文字コードに注意してください。日本語を含む場合必ずUTF-8で保存する必要があります。
  • 出力も今のところUTF-8で出力しています。crochetの文字コードを確認しなかったので突発的にやったわけですが、違ったらOutputのところで使っているEncode::encode()の第一引数をsjisとかeuc-jpとかに変えればいいです。

ソースは追記に。

  • 修正履歴
    • jsonの仕様に合わせて最初と最後にそれぞれ'{','}'を追加(2008/10/14)

ソースコード tween2crochet.pl

#!/usr/bin/perl -w

use strict;
use warnings;
use utf8;
use Encode;
use FileHandle;
use XML::Parser;

# Check Arguments
if ($#ARGV != 1) {				# Require 2 arguments
  &usage();
  exit(1);
}
# Open files
my $fh_o = new FileHandle;
$fh_o->open("> $ARGV[1]");
&file_check($fh_o, $ARGV[1]);

# Parse input file
my $p = new XML::Parser(Style => 'Objects');
my $t = $p->parsefile($ARGV[0]);
undef $p;

my $c;							# context
# Configuration
foreach my $e (@$t) {
  $c = $e->{Kids} if (ref($e) =~ m/::configuration/);
}
# Configuration->TwitterSetting
foreach my $e (@$c) {
  $c = $e->{Kids} if (ref($e) =~ m/::TwitterSetting/);
}

# Configuration->TwitterSetting->listelement
# Configuration->TwitterSetting->selecteduser
my ($listelement, $selecteduser);
foreach my $e (@$c) {
  $listelement = $e->{Kids} if (ref($e) =~ m/::listelement/);
  $selecteduser = $e->{Kids} if (ref($e) =~ m/::selecteduser/);
}
undef $c;

# Make List of Tab Names
my @tabName = ();
my @ignore_tab_list = qw(Recent Reply Direct); # tab listed here will be ignored
foreach my $e (grep ref($_) =~ /::add/, @$listelement) {
  # push @tabName, $e->{name} where not name is in @ignore_tab_list.
  push @tabName, $e->{name} if !(grep $_ eq $e->{name}, @ignore_tab_list);
}

# DEBUG
# foreach my $tab (@tabName) {
#   print Encode::encode("utf8", $tab), $/;
# }

# Make List of Tab filtering rules
my @tabFilter = (); # Array of Hash
my @tabRuleEntry = (qw(tabname idfilter bodyfilter),
  qw(moveFrom searchboth regexenable urlsearch));
foreach my $e (grep ref($_) =~ /::add/, @$selecteduser) {
  my %h = ();
  map { $h{$_} = $e->{$_} } @tabRuleEntry;
  push @tabFilter, \%h;
}

# DEBUG
# foreach my $r (@tabFilter) {
#   foreach my $entry (@tabRuleEntry) {
# 	print $entry , " ", Encode::encode("utf8", $r->{$entry}), $/;
#   }
# }

print "Parse END", $/;

##### Output #####
# Tab Name
$fh_o->print(q|{|, $/, q|"tabName":|, $/);
$fh_o->print(' ' x 4 ,q|[|);
$fh_o->print(Encode::encode("utf8", join q|,|, grep {s/^/"/; s/$/"/} @tabName));
$fh_o->print(q|]|, $/, q|,|, $/);
# Tab Filter
$fh_o->print(q|"tabFilter":[|, $/);
$fh_o->print((join q|,| . $/, map {
  $_->{bodyfilter} =~ s/^ //;
  Encode::encode("utf8",
				 ' ' x 4
				 . qq|["$_->{tabname}","$_->{idfilter}",|
				 . qq|"$_->{bodyfilter}",|
				 . qq|$_->{moveFrom},$_->{searchboth},|
				 . qq|$_->{regexenable},$_->{urlsearch}]|
				);
} (@tabFilter)), $/);
$fh_o->print(q|]|, $/, q|}|, $/);
print "Convert END", $/;

########## Subroutines ##########

sub file_check ($$) {
  my ($fh_o, $out_filename) = @_;
  if (!defined $fh_o) {
	if (! -e $out_filename) {
	  print "File $out_filename not exists!\n";
	  exit(8);
	}
	if (! -w $out_filename) {
	  print "You don't have permission to access $out_filename\n";
	  exit(8);
	}
	print "IO Error in Reading File\n";
	exit(8);
  }
}

sub usage {
  print << "EOD";
Usage :
  $0 TWEEN_CONFIG(IN) CROCHET_CONFIG(OUT)
EOD
}

__END__

=head1 NAME

tween2crochet.pl - Converter setting file of Tween 'Tween.exe.config' to that of crochet

=head1 Usage

./tween2crochet.pl B<TWEEN_CONFIG(IN)> B<CROCHET_CONFIG(OUT)>

IN File must be encoded with UTF-8

OUT FILE will be encoded with UTF-8

=cut