OSDN Git Service

f2350594b629a2dc95afad867b8295c88929ad4a
[fswiki/fswiki.git] / tools / wiki2html.pl
1 #!/usr/local/bin/perl
2 ############################################################
3 #
4 # Wiki¥Õ¥©¡¼¥Þ¥Ã¥È¤«¤éHTML¤òÀ¸À®¤¹¤ë¥¹¥¯¥ê¥×¥È
5 #
6 ############################################################
7 use lib "$ENV{'FSWIKI_HOME'}/lib";
8 use Wiki;
9 use Util;
10 use Jcode;
11 use Cwd;
12
13 #===========================================================
14 # °ú¿ô¤¬Â­¤ê¤Ê¤¤
15 #===========================================================
16 if($#ARGV==-1){
17         die "wiki2html.pl filename [-title=title] [-output=sjis|euc]\n";
18 }
19
20 #===========================================================
21 # ÊÑ¿ô¤Î½àÈ÷
22 #===========================================================
23 my $from    = "";
24 my $title   = "";
25 my $css     = "";
26 my $output  = "euc";
27 my $count   = 0;
28 my $current = cwd();
29 chdir($ENV{'FSWIKI_HOME'});
30
31 #===========================================================
32 # ¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Î²òÀÏ
33 #===========================================================
34 foreach(@ARGV){
35         if($count==0){
36                 $from = $_;
37         } else {
38                 my ($key,$value)=split(/=/,$_);
39                 if($key eq "-title"){
40                         $title = $value;
41                 } elsif($key eq "-css"){
42                         $css = $value;
43                 } elsif($key eq "-input"){
44                         $input = $value;
45                 } elsif($key eq "-output"){
46                         $output = $value;
47                 } elsif($key eq "-farm"){
48                         $farm = $value;
49                 } else {
50                         die $key." is Unknown Option.\n";
51                 }
52         }
53         $count++;
54
55 }
56
57 if($title eq ""){
58         $title = $from;
59         $title =~ s/.*\///;
60         $title =~ s/\.wiki//;
61         #$title =~ s/%([0-9a-f]{2})/pack("C",$1)/ige;
62 }
63
64 my $url = $from;
65 $url =~ s/\?.*$//;
66 my $wiki = Wiki::Wiki2HTML->new('setup.dat', CGI->new($url));
67
68 if($farm){
69         $farm =~ s|\/$||;
70         $farm=~/^\// or $farm = "/$farm";
71         $wiki->config('data_dir'   , $wiki->config('data_dir'  ).$farm);
72         $wiki->config('config_dir' , $wiki->config('config_dir').$farm);
73 }
74
75 #===========================================================
76 # Wiki¥½¡¼¥¹¤ò¼èÆÀ
77 #===========================================================
78 my $source = "";
79 if(index($from,"http://")==0 || index($from,"https://")==0){
80         # HTTP·Ðͳ¤Ç¥½¡¼¥¹¤ò¼èÆÀ
81         $source = &Util::get_response($wiki,$from);
82 } else {
83         # ¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ë¤«¤é¥½¡¼¥¹¤ò¼èÆÀ
84         chdir($current);
85         open(DATA,$from) or die "File Open Error :$from\n";
86         while(<DATA>){
87                 $source .= $_;
88         }
89         close(DATA);
90         chdir($ENV{'FSWIKI_HOME'});
91 }
92 &Jcode::convert(\$source,"euc");
93
94 #===========================================================
95 # HTMLÀ¸À®
96 #===========================================================
97 my $buf = "<html>\n".
98           "<head>\n".
99           "  <title>".Util::escapeHTML($title)."</title>\n";
100 if($output eq 'euc'){
101         $buf .= "  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n";
102 } else {
103         $buf .= "  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
104 }
105
106 if($css ne ""){
107         $buf .= "  <link rel=\"stylesheet\" type=\"text/css\" href=\"".$css."\">\n";
108 }
109 $buf .= "</head>\n".
110         "<body>\n".
111         "<h1>@{[Util::escapeHTML($title)]}</h1>\n".
112         $wiki->process_wiki($source).
113         "</body>\n".
114         "</html>\n";
115
116 &Jcode::convert(\$buf,$output);
117 print $buf;
118
119 package Wiki::Wiki2HTML;
120 use base qw(Wiki);
121
122 sub process_wiki {
123         my $self    = shift;
124         my $source  = shift;
125         my $mainflg = shift;
126         
127         if($self->{parse_times} >= 50){
128                 return $self->error("Wiki::process_wiki¤Î¸Æ¤Ó½Ð¤·²ó¿ô¤¬¾å¸Â¤ò±Û¤¨¤Þ¤·¤¿¡£");
129         }
130         
131         $self->{parse_times}++;
132         my $parser = Wiki::Wiki2HTMLParser->new($self,$mainflg);
133         $parser->parse($source);
134         $self->{parse_times}--;
135         
136         return $parser->{html};
137 }
138
139 package Wiki::Wiki2HTMLParser;
140 use base qw(Wiki::HTMLParser);
141
142 sub wiki_anchor {
143         my $self = shift;
144         my $page = shift;
145         my $name = shift;
146         
147         if(!defined($name) || $name eq ""){
148                 $name = $page;
149         }
150         if($self->{wiki}->page_exists($page)){
151                 my $link = "@{[Util::url_encode(Util::url_encode($page))]}.html";
152                 return qq|<a href="$link" class="wikipage">@{[Util::escapeHTML($name)]}</a>|;
153         } else {
154                 return qq|<span class="nopage">@{[Util::escapeHTML($name)]}</span><a href="#">?</a>|;
155         }
156 }
157
158 #===========================================================
159 # CGI.pm¤Î¥â¥Ã¥¯¥ª¥Ö¥¸¥§¥¯¥È
160 #===========================================================
161 package CGI;
162
163 sub new {
164         my $class = shift;
165         my $self  = {};
166         $self->{url} = shift;
167         return bless $self, $class;
168 }
169
170 sub url {
171         my $self = shift;
172         return $self;
173 }
174
175 sub get_session {
176         return undef;
177 }