2 ###APPNAME: zim-import-cnweblog
3 ###APPAUTHOR: xiaoranzzz
4 ###APPDATE: 2008-09-05 00:40:06
6 ###APPDESC: import from cnweblog.com xml backup files
7 ###APPUSAGE: [input file]
15 #ENV variable MUST be defined somewhere,
16 #FOR perl to search modules from,
18 use lib
$ENV{XR_PERL_MODULE_DIR
};
19 use MyPlace
::Script
::Usage qw
/help_required help_even_empty/;
20 exit 0 if(help_required
($0,@ARGV));
21 #exit 0 if(help_even_empty($0,@ARGV));
22 use MyPlace
::HTML
::Convertor
;
26 my $text = join("",@
{text_from_string
(\
@_,undef,undef,undef,undef)}) if(@_);
27 $text =~ s/\n\n+$/\n/gm;
31 sub zim_entry_text
($) {
32 my %entry = (@_ && $_[0]) ?
%{$_[0]} : ();
34 push @result,"="x6
," ",$entry{Title
}," ","="x6
,"\n";
35 push @result,"Created ",$entry{DateAdded
},"\n";
36 push @result,"Updated ",$entry{DateUpdated
},"\n";
37 push @result,$entry{Text
},"\n";
38 if($entry{comments
} and @
{$entry{comments
}}) {
39 my $cmt = $entry{comments
};
40 push @result,"\n","="x2
," Comments: ","="x2
,"\n\n";
42 push @result,"* **",$_->{"Title"},"**\n";
43 push @result,$_->{"Text"},"\n";
44 push @result,"*"x2
,$_->{"Author"},'*'x2
,",",$_->{"DateUpdated"},"\n","\n";
50 my $xml = $ARGV[0] ? XMLin
($ARGV[0]) : XMLin
("/dev/stdin");
55 my $blog_content = $xml->{"blog_Content"};
57 foreach(@
{$blog_content}) {
58 if($_->{"PostType"} == "1") {
59 $blogs{$_->{"ID"}}=$_;
62 $comments{$_->{"ID"}}=$_;
67 foreach(values %comments) {
68 my $pid = $_->{"ParentID"};
69 if(exists $blogs{$pid}) {
70 push @
{$blogs{$pid}->{"comments"}},$_;
73 print STDERR
"For ",$_->{"Title"},"(",$_->{"PostType"},") parent_blog [$pid] not exists!\n";
77 my @blogs = sort {$a->{"DateUpdated"} cmp $b->{"DateUpdated"}} values %blogs;
80 if($_->{"DateUpdated"} =~ /^(\d+)-(\d+)-(\d+)T/) {
85 $_->{"Text"}=&html_text
($_->{"Text"});
86 $_->{"DateAdded"} =~ s/T/ /;
87 $_->{"DateUpdated"} =~ s/T/ /;
88 if($_->{"comments"}) {
89 @
{$_->{"comments"}} = sort {$a->{"DateUpdated"} cmp $b->{"DateUpdated"}} @
{$_->{"comments"}};
90 foreach(@
{$_->{"comments"}}) {
91 $_->{"Text"}=&html_text
($_->{"Text"});
92 $_->{"DateUpdated"} =~ s/T/ /;
100 print STDERR
"Creating directory $dir ...";
101 mkdir $dir or die("$!\n");
108 my $basename = get_filename
($_->{"Title"});
109 push @
{$top{$_->{"y"}}->{"Files"}},"* [[." . $_->{"m"} . ":" . $_->{"d"} . ":" . $basename . "|" . $_->{"Title"} . "]]" ;
110 push @
{$top{$_->{"y"}}->{$_->{"m"}}->{"Files"}},"* [[." . $_->{"d"} . ":" . $basename . "|" . $_->{"Title"} . "]]" ;
111 push @
{$top{$_->{"y"}}->{$_->{"m"}}->{$_->{"d"}}->{"Files"}},"* [[." . $basename . "|" . $_->{"Title"} . "]]" ;
113 my_mkdir
$_->{"y"} . "/" . $_ -> {"m"};
114 my_mkdir
$_->{"y"} . "/" . $_ -> {"m"} . "/" . $_->{"d"};
115 my $filename = $_->{"y"} . "/" . $_ -> {"m"} . "/" . $_->{"d"} . "/" . $basename . ".txt";
116 print STDERR
"Creating $filename ...";
117 open FO
,">",$filename;
118 print FO @
{zim_entry_text
($_)};
123 sub print_node
($$$) {
125 my $pdir = shift(@_);
126 my %n = %{shift(@_)};
130 push @keys,$_ unless($_ eq "Files");
133 @files = @
{$n{"Files"}};
136 print $out "\n\n","="x2
," Date: ","="x2
,"\n";
138 print $out "\n* [[.$_|$pdir/$_]]";
142 print $out "\n\n","="x2
," Files: ","="x2
,"\n";
150 open $rout,">","$pdir/$_.txt" or die("$!\n");
151 print $rout "="x6
," $pdir/$_ ","="x6
,"\n";
152 &print_node
($rout,"$pdir/$_",$n{$_});
157 foreach my $year (keys %top) {
159 open $out,">","$year.txt" or die("$!\n");
160 print $out '='x6
," ",$year," ",'='x6
,"\n";
161 &print_node
($out,$year,$top{$year});