updated git and svn scripts
[xrzperl.git] / zim-import-cnweblog
blob55bf1c8b130987fe210c0b3decff7a45b759d62e
1 #!/usr/bin/perl -w
2 ###APPNAME: zim-import-cnweblog
3 ###APPAUTHOR: xiaoranzzz
4 ###APPDATE: 2008-09-05 00:40:06
5 ###APPVER: 0.1
6 ###APPDESC: import from cnweblog.com xml backup files
7 ###APPUSAGE: [input file]
8 ###APPOPTION:
9 use strict;
10 no warnings;
12 use XML::Simple;
13 use Data::Dumper;
15 #ENV variable MUST be defined somewhere,
16 #FOR perl to search modules from,
17 #OR nothing will work
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;
23 use MyPlace::Zim;
25 sub html_text {
26 my $text = join("",@{text_from_string(\@_,undef,undef,undef,undef)}) if(@_);
27 $text =~ s/\n\n+$/\n/gm;
28 return $text;
31 sub zim_entry_text($) {
32 my %entry = (@_ && $_[0]) ? %{$_[0]} : ();
33 my @result;
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";
41 foreach(@{$cmt}) {
42 push @result,"* **",$_->{"Title"},"**\n";
43 push @result,$_->{"Text"},"\n";
44 push @result,"*"x2,$_->{"Author"},'*'x2,",",$_->{"DateUpdated"},"\n","\n";
47 return \@result;
50 my $xml = $ARGV[0] ? XMLin($ARGV[0]) : XMLin("/dev/stdin");
52 my %blogs;
53 my %comments;
55 my $blog_content = $xml->{"blog_Content"};
56 if($blog_content) {
57 foreach(@{$blog_content}) {
58 if($_->{"PostType"} == "1") {
59 $blogs{$_->{"ID"}}=$_;
61 else {
62 $comments{$_->{"ID"}}=$_;
67 foreach(values %comments) {
68 my $pid = $_->{"ParentID"};
69 if(exists $blogs{$pid}) {
70 push @{$blogs{$pid}->{"comments"}},$_;
72 else {
73 print STDERR "For ",$_->{"Title"},"(",$_->{"PostType"},") parent_blog [$pid] not exists!\n";
77 my @blogs = sort {$a->{"DateUpdated"} cmp $b->{"DateUpdated"}} values %blogs;
79 foreach(@blogs) {
80 if($_->{"DateUpdated"} =~ /^(\d+)-(\d+)-(\d+)T/) {
81 $_->{"y"}=$1;
82 $_->{"m"}=$2;
83 $_->{"d"}=$3;
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/ /;
97 sub my_mkdir($) {
98 my $dir = shift;
99 unless(-d $dir) {
100 print STDERR "Creating directory $dir ...";
101 mkdir $dir or die("$!\n");
102 print STDERR "\n";
106 my %top;
107 foreach(@blogs) {
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"} . "]]" ;
112 my_mkdir $_->{"y"};
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($_)};
119 close FO;
120 print STDERR "\n";
123 sub print_node($$$) {
124 my $out = shift(@_);
125 my $pdir = shift(@_);
126 my %n = %{shift(@_)};
127 my @keys;
128 my @files;
129 foreach(keys %n) {
130 push @keys,$_ unless($_ eq "Files");
132 @keys = sort @keys;
133 @files = @{$n{"Files"}};
135 if(@keys) {
136 print $out "\n\n","="x2," Date: ","="x2,"\n";
137 foreach(@keys) {
138 print $out "\n* [[.$_|$pdir/$_]]";
141 if(@files) {
142 print $out "\n\n","="x2," Files: ","="x2,"\n";
143 foreach(@files) {
144 print $out "\n$_";
147 print $out "\n";
148 foreach(@keys) {
149 my $rout;
150 open $rout,">","$pdir/$_.txt" or die("$!\n");
151 print $rout "="x6," $pdir/$_ ","="x6,"\n";
152 &print_node($rout,"$pdir/$_",$n{$_});
153 close $rout;
157 foreach my $year (keys %top) {
158 my $out;
159 open $out,">","$year.txt" or die("$!\n");
160 print $out '='x6," ",$year," ",'='x6,"\n";
161 &print_node($out,$year,$top{$year});
162 close $out;