📄 context.pm
字号:
return $ctx->{__stash}->{$key}; }}sub register_handler { $_[0]->{__handlers}{$_[1]} = $_[2] }sub handler_for { my $v = $_[0]->{__handlers}{$_[1]}; ref($v) eq 'ARRAY' ? @$v : $v}sub _hdlr_include { my($arg, $cond) = @_[1,2]; if (my $tmpl_name = $arg->{module}) { require MT::Template; my $tmpl = MT::Template->load({ name => $tmpl_name, blog_id => $_[0]->stash('blog_id') }) or return $_[0]->error(MT->translate( "Can't find included template module '[_1]'", $tmpl_name )); my $ret = $tmpl->build($_[0], $cond); return defined($ret) ? $ret : $_[0]->error($tmpl->errstr); } elsif (my $file = $arg->{file}) { my $blog = $_[0]->stash('blog'); my @paths = ($file, map File::Spec->catfile($_, $file), $blog->site_path, $blog->archive_path); my $path; for my $p (@paths) { $path = $p, last if -e $p && -r _; } return $_[0]->error(MT->translate( "Can't find included file '[_1]'", $file )) unless $path; local *FH; open FH, $path or return $_[0]->error(MT->translate( "Error opening included file '[_1]': [_2]", $path, $! )); my $c = ''; local $/; $c = <FH>; close FH; return $c; }}sub _hdlr_link { my($ctx, $arg, $cond) = @_; if (my $tmpl_name = $arg->{template}) { require MT::Template; my $tmpl = MT::Template->load({ name => $tmpl_name, type => 'index', blog_id => $_[0]->stash('blog_id') }) or return $ctx->error(MT->translate( "Can't find template '[_1]'", $tmpl_name )); my $site_url = $ctx->stash('blog')->site_url; $site_url .= '/' unless $site_url =~ m!/$!; return $site_url . $tmpl->outfile; } elsif (my $entry_id = $arg->{entry_id}) { require MT::Entry; my $entry = MT::Entry->load($entry_id) or return $ctx->error(MT->translate( "Can't find entry '[_1]'", $entry_id )); return $entry->permalink; }}sub _hdlr_mt_version { require MT; my $version = MT->VERSION;# $version =~ s/a/α/g;# $version =~ s/b/β/g; $version;}sub _hdlr_publish_charset { MT::ConfigMgr->instance->PublishCharset || 'iso-8859-1';}sub _hdlr_default_language { MT::ConfigMgr->instance->DefaultLanguage || 'en';}sub _hdlr_signon_url { MT::ConfigMgr->instance->get("SignOnURL");}sub _hdlr_if_nonempty { my ($ctx, $args, $cond) = @_; $args->{tag} =~ s/^MT//; my $handler = $ctx->handler_for($args->{tag}); if (defined($handler)) { my $value = $handler->($ctx, { %$args }); if (defined($value) && $value ne '') # want to include "0" here { _hdlr_pass_tokens($ctx, $args, $cond); } else { _hdlr_pass_tokens_else($ctx, undef, $cond); } } else { _hdlr_pass_tokens_else($ctx); }}sub _hdlr_if_nonzero { my ($ctx, $args, $cond) = @_; $args->{tag} =~ s/^MT//; my $handler = $ctx->handler_for($args->{tag}); if (defined($handler)) { my $value = $handler->($ctx, { %$args }); if (defined($value) && $value) { _hdlr_pass_tokens($ctx, $args, $cond); } else { _hdlr_pass_tokens_else($ctx, undef, $cond); } } else { _hdlr_pass_tokens_else($ctx); }}sub _hdlr_error_message { my $err = $_[0]->stash('error_message'); defined $err ? $err : '';}sub _hdlr_var { my($ctx, $args) = @_; my $tag = $ctx->stash('tag'); return $ctx->error(MT->translate( "You used a [_1] tag without any arguments.", "<MT$tag>" )) unless keys %$args && $args->{name}; if ($tag eq 'SetVar') { my $val = defined $args->{value} ? $args->{value} : ''; $ctx->{__stash}{vars}{$args->{name}} = $val; } else { return $ctx->{__stash}{vars}{$args->{name}}; } '';}sub _hdlr_cgi_path { my $path = MT::ConfigMgr->instance->CGIPath; $path .= '/' unless $path =~ m!/$!; $path;}sub _hdlr_cgi_server_path { my $path = MT::instance()->server_path() || ""; $path =~ s!/*$!!; $path;}sub _hdlr_cgi_relative_url { my $url = MT::ConfigMgr->instance->CGIPath; $url .= '/' unless $url =~ m!/$!; if ($url =~ m!^https?://[^/]+(/.*)$!) { return $1; } else { return $url; }}sub _hdlr_static_path { my $path = MT::ConfigMgr->instance->StaticWebPath; $path .= '/' unless $path =~ m!/$!; $path;}sub _hdlr_comment_script { MT::ConfigMgr->instance->CommentScript }sub _hdlr_trackback_script { MT::ConfigMgr->instance->TrackbackScript }sub _hdlr_search_script { MT::ConfigMgr->instance->SearchScript }sub _hdlr_xmlrpc_script { MT::ConfigMgr->instance->XMLRPCScript }sub _hdlr_blogs { my($ctx, $args, $cond) = @_; my $builder = $ctx->stash('builder'); my $tokens = $ctx->stash('tokens'); require MT::Blog; my $iter = MT::Blog->load_iter; my $res = ''; while (my $blog = $iter->()) { local $ctx->{__stash}{blog} = $blog; local $ctx->{__stash}{blog_id} = $blog->id; defined(my $out = $builder->build($ctx, $tokens, $cond)) or return $ctx->error($builder->errstr); $res .= $out; } $res;}sub _hdlr_blog_id { $_[0]->stash('blog')->id }sub _hdlr_blog_name { $_[0]->stash('blog')->name }sub _hdlr_blog_description { my $d = $_[0]->stash('blog')->description; defined $d ? $d : '';}sub _hdlr_blog_url { my $url = $_[0]->stash('blog')->site_url; $url .= '/' unless $url =~ m!/$!; $url;}sub _hdlr_blog_site_path { my $path = $_[0]->stash('blog')->site_path; $path .= '/' unless $path =~ m!/$!; $path;}sub _hdlr_blog_archive_url { $_[0]->stash('blog')->archive_url }sub _hdlr_blog_relative_url { my $host = $_[0]->stash('blog')->site_url; if ($host =~ m!^https?://[^/]+(/.*)$!) { return $1; } else { return ''; }}sub _hdlr_blog_timezone { my $so = $_[0]->stash('blog')->server_offset; my $no_colon = $_[1]->{no_colon}; my $partial_hour_offset = 60 * abs($so - int($so)); sprintf("%s%02d%s%02d", $so < 0 ? '-' : '+', abs($so), $no_colon ? '' : ':', $partial_hour_offset);}{ my %real_lang = (cz => 'cs', dk => 'da', jp => 'ja', si => 'sl');sub _hdlr_blog_language { my $lang_tag = $_[0]->stash('blog')->language || ''; $lang_tag = ($real_lang{$lang_tag} || $lang_tag); if ($_[1]->{'locale'}) { $lang_tag =~ s/^(..)([-_](..))?$/$1 . '_' . uc($3||$1)/e; } elsif ($_[1]->{"ietf"}) { # http://www.ietf.org/rfc/rfc3066.txt $lang_tag =~ s/_/-/; } $lang_tag;}}sub _hdlr_blog_host { my $host = $_[0]->stash('blog')->site_url; if ($host =~ m!^https?://([^/:]+)(:\d+)?/!) { return $_[1]->{exclude_port} ? $1 : $1 . ($2 || ''); } else { return ''; }}sub _hdlr_blog_entry_count { my $blog_id = $_[0]->stash('blog')->id; require MT::Entry; scalar MT::Entry->count({ blog_id => $blog_id, status => MT::Entry::RELEASE() });}sub _hdlr_blog_comment_count { my $blog_id = $_[0]->stash('blog')->id; require MT::Comment; scalar MT::Comment->count({ blog_id => $blog_id, visible => 1});}sub _hdlr_blog_cc_license_url { $_[0]->stash('blog')->cc_license_url;}sub _hdlr_blog_cc_license_image { my $cc = $_[0]->stash('blog')->cc_license or return; my ($code, $license, $image_url) = $cc =~ /(\S+) (\S+) (\S+)/; return $image_url if $image_url; "http://creativecommons.org/images/public/" . ($cc eq 'pd' ? 'norights' : 'somerights');}sub _hdlr_cc_license_rdf { my($ctx, $arg) = @_; my $blog = $ctx->stash('blog'); my $cc = $blog->cc_license or return; my $cc_url = $blog->cc_license_url; my $rdf = <<RDF;<!--<rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">RDF ## SGML comments cannot contain double hyphens, so we convert ## any double hyphens to single hyphens. my $strip_hyphen = sub { (my $s = $_[0]) =~ tr/\-//s; $s; }; if (my $entry = $ctx->stash('entry')) { $rdf .= <<RDF;<Work rdf:about="@{[ $entry->permalink ]}"><dc:title>@{[ encode_xml($strip_hyphen->($entry->title)) ]}</dc:title><dc:description>@{[ encode_xml($strip_hyphen->(_hdlr_entry_excerpt(@_))) ]}</dc:description><dc:creator>@{[ encode_xml($strip_hyphen->($entry->author ? $entry->author->name : '')) ]}</dc:creator><dc:date>@{[ _hdlr_date($_[0], { 'format' => "%Y-%m-%dT%H:%M:%S" }) . _hdlr_blog_timezone($_[0]) ]}</dc:date><license rdf:resource="$cc_url" /></Work>RDF } else { $rdf .= <<RDF;<Work rdf:about="@{[ $blog->site_url ]}"><dc:title>@{[ encode_xml($strip_hyphen->($blog->name)) ]}</dc:title><dc:description>@{[ encode_xml($strip_hyphen->($blog->description)) ]}</dc:description><license rdf:resource="$cc_url" /></Work>RDF } $rdf .= MT::Util::cc_rdf($cc) . "</rdf:RDF>\n-->\n"; $rdf;}sub _hdlr_blog_if_cc_license { $_[0]->stash('blog')->cc_license ? _hdlr_pass_tokens(@_) : '';}sub _hdlr_entries { my($ctx, $args, $cond) = @_; require MT::Entry; my @entries; my $blog_id = $ctx->stash('blog_id'); my($cat, $author, $saved_entry_stash); if ($args->{category}) { if (!ref $args->{category} && $args->{category} !~ /\s+(?:AND|OR)\s+/) { $cat = MT::Category->load({ label => $args->{category}, blog_id => $blog_id }) or return $ctx->error(MT->translate( "No such category '[_1]'", $args->{category})); } else { my @cat_objs; my $is_and; if (ref $args->{category}) { $is_and = (shift @{$args->{category}}) eq 'AND'; @cat_objs = @{$args->{category}}; } elsif (my $cat_name = $args->{category}) { $is_and = $cat_name =~ /AND/; require MT::Category; ## If this is a boolean lookup (like "Foo AND Bar"), we have to ## special-case the search. Then we stick the resulting list of ## entries into the stash so that it can be filtered using the ## mechanism below. return $ctx->error(MT->translate( "You can't use both AND and OR in the same expression ([_1]).", $cat_name )) if $cat_name =~ /\bAND\b/ && $cat_name =~ /\bOR\b/; my @cats = split /\s+(?:AND|OR)\s+/, $cat_name; require MT::Placement; @cat_objs = map { my $cat = MT::Category->load({ label => $_,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -