Changeset 26380 for lang/perl/MENTA
- Timestamp:
- 12/11/08 17:27:49 (4 years ago)
- Location:
- lang/perl/MENTA/trunk
- Files:
-
- 2 added
- 5 modified
-
app/controller/manual/index.mt (modified) (1 diff)
-
app/controller/manual/tutorial.mt (modified) (2 diffs)
-
config.pl (added)
-
lib/MENTA.pm (modified) (5 diffs)
-
lib/MENTA/Controller.pm (modified) (2 diffs)
-
lib/MENTA/Dispatch.pm (modified) (2 diffs)
-
lib/MENTA/ModPerl.pm (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/MENTA/trunk/app/controller/manual/index.mt
r25372 r26380 15 15 16 16 <h2 class="subtitle">開発者</h2> 17 <ol><?=r join "\n", map { '<li>' . escape_html($_) . '</li>' } split /[\r\n]+/, file_read( 'AUTHORS') ?></ol>17 <ol><?=r join "\n", map { '<li>' . escape_html($_) . '</li>' } split /[\r\n]+/, file_read(MENTA::base_dir() . 'AUTHORS') ?></ol> 18 18 19 19 ?= render('footer.mt') -
lang/perl/MENTA/trunk/app/controller/manual/tutorial.mt
r25373 r26380 30 30 ? my $hello = 'app/controller/demo/hello.mt' 31 31 <p>下記のようなファイルを、<?= $hello ?> におきます。</p> 32 <pre><code><?= file_read( $hello) ?></code></pre>32 <pre><code><?= file_read(MENTA::base_dir() . $hello) ?></code></pre> 33 33 <p><code>param("user")</code> と書くと、<code><?= uri_for('demo/hello', { user => 'kazuhooku' }) ?></code> の <code>kazuhooku</code> の部分がとりだせます。</p> 34 34 <p><a href="<?= uri_for('demo/hello', { user => 'kazuhooku' }) ?>">実際にうごくデモ</a></p> … … 36 36 <h3>カウンターをつけてみる</h3> 37 37 ? my $counter = 'app/controller/demo/counter.mt' 38 <pre><code><?= file_read( $counter) ?></code></pre>38 <pre><code><?= file_read(MENTA::base_dir() . $counter) ?></code></pre> 39 39 <p>このようにすると、カウンターを簡単に HTML の中にうめこめます。</p> 40 40 <p><code>counter_increment("test")</code> と書くと、<code>test</code> という名前のカウンターが 1 増えます。<code>counter_increment</code> の返却値として、1 増えた結果がかえってきますのでそのまま表示するだけでカウンターになります。</p> -
lang/perl/MENTA/trunk/lib/MENTA.pm
r26366 r26380 23 23 sub context { $context } 24 24 sub run_context { 25 my ($class, $config, $req, $ code) = @_;25 my ($class, $config, $req, $engine, $code) = @_; 26 26 local $context = MENTA::Context->new( 27 config => $config, 28 request => $req, 27 config => $config, 28 request => $req, 29 __engine => $engine, 29 30 ); 30 31 $code->(); … … 32 33 } 33 34 34 # Class::Trigger はロードに時間かかるので自前で実装してる 35 sub call_trigger { 36 my ($class, $triggername, @args) = @_; 37 my $c = context(); 38 for my $code (@{$c->{triggers}->{$triggername}}) { 39 $code->($c, @args); 40 } 41 } 42 43 sub add_trigger { 44 my ($class, $triggername, $code) = @_; 45 push @{context()->{triggers}->{$triggername}}, $code; 35 { 36 # Class::Trigger はロードに時間かかるので自前で実装してる 37 my $static_triggers; 38 sub call_trigger { 39 my ($class, $triggername, @args) = @_; 40 my $c = context(); 41 for my $code (@{$c->{triggers}->{$triggername}}, @{ $static_triggers->{triggers}->{$triggername} || [] }) { 42 $code->($c, @args); 43 } 44 } 45 46 sub add_trigger { 47 my ($class, $triggername, $code) = @_; 48 if (ref context()) { 49 push @{context()->{triggers}->{$triggername}}, $code; 50 } else { 51 push @{$static_triggers->{triggers}->{$triggername}}, $code; 52 } 53 } 46 54 } 47 55 48 56 # run as cgi 49 57 sub run_menta { 50 my $class = shift; 51 my $config = shift; 52 53 HTTP::Engine->new( 58 my ($class, $config) = @_; 59 $class->create_engine($config, 'MinimalCGI')->run; 60 } 61 62 sub create_engine { 63 my ($class, $config, $interface) = @_; 64 65 my $engine; 66 $engine = HTTP::Engine->new( 54 67 interface => { 55 module => 'MinimalCGI',68 module => $interface, 56 69 request_handler => sub { 57 70 my $req = shift; 71 local $MENTA::STASH; 58 72 CGI::ExceptionManager->run( 59 73 callback => sub { 60 74 MENTA->run_context( 61 $config, $req, sub { 75 $config, $req, $engine, sub { 76 MENTA->call_trigger('BEFORE_DISPATCH'); 62 77 MENTA::Dispatch->dispatch() 63 78 } … … 70 85 } 71 86 } 72 ) ->run;87 ); 73 88 } 74 89 … … 106 121 } 107 122 123 sub base_dir { 124 my $basedir = config->{menta}->{base_dir}; 125 return '' unless $basedir; 126 $basedir =~ s!([^/])$!$1/!; 127 return $basedir; 128 } 129 108 130 sub controller_dir { 109 config->{menta}->{controller_dir} || 'app/controller/' 131 config->{menta}->{controller_dir} ||= base_dir() . 'app/controller/'; 132 config->{menta}->{controller_dir}; 110 133 } 111 134 112 135 sub data_dir { 113 config->{menta}->{data_dir} || 'app/data/' 136 config->{menta}->{data_dir} ||= base_dir() . 'app/controller/'; 137 config->{menta}->{data_dir}; 114 138 } 115 139 … … 297 321 my $plugin = shift; 298 322 return if $plugin_loaded->{$plugin}; 299 my $path = "plugins/${plugin}.pl";323 my $path = MENTA::base_dir() . "plugins/${plugin}.pl"; 300 324 require $path; 301 325 $plugin_loaded->{$plugin}++; -
lang/perl/MENTA/trunk/lib/MENTA/Controller.pm
r26366 r26380 5 5 6 6 sub import { 7 my $controller_dir = MENTA::controller_dir(); 8 7 9 Filter::Util::Call::filter_add(sub { 8 10 my $status; … … 19 21 my $pkg = do { 20 22 local $_ = (caller(0))[1]; 21 s{^ app/controller/+|\.pl$}{}g;23 s{^$controller_dir/*|\.pl$}{}g; 22 24 s{/}{::}; 23 25 "MENTA::Controller::$_"; -
lang/perl/MENTA/trunk/lib/MENTA/Dispatch.pm
r26366 r26380 42 42 MENTA::finalize($out); 43 43 } else { 44 die "「${path}」というモードは存在しません。コントローラファイルもありません(${controller})。テンプレートファイルもありません(${controller_mt}) ";44 die "「${path}」というモードは存在しません。コントローラファイルもありません(${controller})。テンプレートファイルもありません(${controller_mt})。ベースディレクトリは @{[ MENTA::base_dir() ]} です。"; 45 45 } 46 } elsif ($path ne 'menta.cgi' && -f "app/$path"&& $path =~ /^static\//) {46 } elsif ($path ne 'menta.cgi' && -f (MENTA::base_dir() . "app/$path") && $path =~ /^static\//) { 47 47 show_static("app/$path"); 48 48 } elsif ($path =~ /^(?:crossdomain\.xml|favicon\.ico|robots\.txt)$/) { 49 49 print "status: 404\r\ncontent-type: text/plain\r\n\r\n"; 50 50 } else { 51 die "'${path}' を処理する方法がわかりません ";51 die "'${path}' を処理する方法がわかりません(@{[ MENTA::base_dir() . 'app/' . $path ]})"; 52 52 } 53 53 } … … 58 58 MENTA::Util::require_once('File/Spec.pm'); 59 59 MENTA::Util::require_once('CGI/Simple/Util.pm'); 60 $path = Cwd::realpath( $path);61 my $appdir = Cwd::realpath(File::Spec->catfile( Cwd::cwd(), 'app', 'static'));60 $path = Cwd::realpath(File::Spec->catfile(MENTA::base_dir(), $path)); 61 my $appdir = Cwd::realpath(File::Spec->catfile(MENTA::base_dir(), 'app', 'static')); 62 62 if (index($path, $appdir) != 0) { 63 63 die "どうやら攻撃されているようだ: $path";
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)