Ruby ã® method_missing ç㪠tag_missing ã³ã¼ã«ããã¯ã MT ã«è¿½å ãã¦ã¿ã
Movable Type Advent Calendar 2013 ã®8æ¥ç®ã§ãã
Ruby ã® method_missing
ã ã£ãããPerl ã® AUTOLOAD
çãªãã®ããMT ã®ã¿ã°ãå©ç¨ããæã«ä½¿ããã¨ä¾¿å©ããªã¨æã£ã¦ãTagMissingãã©ã°ã¤ã³ãªããã®ãä½ã£ã¦ã¿ã¾ãããåå¨ããªãã¿ã°ãå©ç¨ãããã¨ããæã«ãtag_missing
ã¨ããã³ã¼ã«ããã¯ãå¼ã¶åç´ãªãã®ã§ãããã¤ãããã¯ã¯æªå¯¾å¿ã§ãã
ãã ããããå®ç¾ããæ¹æ³ã¯ãMT ã®å¦çãã¢ã³ãã¼ããããããããªãããã ã£ãã®ã¨ãä½ã£ã¦ã¿ããã®ã®ãã¤ã³ã¿ã¼ãã§ã¤ã¹ãå¾®å¦ãªæãããã¾ããããã£ãããªã®ã§å ¬éãã¾ãã
TagMissing ãã©ã°ã¤ã³
ã¿ã°ãåå¨ããªãæã®ã¨ã©ã¼å¦çã¯ãMT::Builder::build ãè¦ãéããä¸è¨ã®ãããã«ãã£ã¦ã
my $hdlr = $ctx->handler_for( $t->tag ); my ( $h, $type, $orig ) = $hdlr->values; my $conditional = defined $type && $type == 2; if ($h) { # ... çç¥ ... } else { if ( $t->tag !~ m/^_/ ) { # placeholder tag. just ignore return $build->error( MT->translate( "Unknown tag found: [_1]", $t->tag ) ); } }
MT::Template::Context::handler_for ã¡ã½ããã®çµææ¬¡ç¬¬ã§ãåå²ã®çµè·¯ãå¤ããæããªã®ã§ãMT::Template::Context::handler_for ã®ä¸ã«ã³ã¼ã«ããã¯ãä»è¾¼ãã®ã確å®ããªã¨æã£ãã®ã§ãTagMissing ãã©ã°ã¤ã³ã§ã¯ãhandler_for
ããããããæ¹éã«ãã¾ããã
ã¢ã³ãã¼ãããããæã¯ãæ¬ä½ã®ãã¼ã¸ã§ã³ã¢ããã®å½±é¿ããªãã¹ãåããªãããã«ããæ¹ãè¯ãã®ã§ãç¡é§ãå¤ãæãã§ãããhandler_for
ãã³ã¼ã«ããã¯åå¾ã§2åå¼ã³åºãå½¢ã«ãã¾ããã
package TagMissing::Patch; use strict; use warnings; sub init {} use MT::Template::Context; my $orig_handler_for = \&MT::Template::Context::handler_for; { no warnings 'redefine'; *MT::Template::Context::handler_for = sub { my $ctx = shift; my $tag = lc $_[0]; my $hdlr = $orig_handler_for->( $ctx, $tag ); my ( $h ) = $hdlr->values; MT->run_callbacks( 'tag_missing', $ctx, $tag ) unless $h; $orig_handler_for->( $ctx, $tag ) }; } 1;
ã¤ã³ã¿ã¼ãã§ã¤ã¹çã«ããªãå¾®å¦ãªæãã§ãããtag_missing ã³ã¼ã«ããã¯ã®ä¸ã§ã$ctx->{__handlers}{tag_name_foo}
ã« MT::Templage::Handler å½¢å¼ã§ãã³ãã©ã代å
¥ãããªã©ãã¦ãã¿ã°ã®åä½ãåçã«æå®ãããã¨ãã§ãã¾ãã
AutoUnless ãã©ã°ã¤ã³
ãããªæãã§ãtag_missing ã³ã¼ã«ããã¯ã使ã£ãã¿ã°ã®ãªãã¡ã¬ã³ã¹å®è£ ã¨ãã¦ãAutoUnless ãã©ã°ã¤ã³ã¨ããã®ãä½ã£ã¦ã¿ã¾ããã
mt:IfWebsite
ã¿ãããªãIf ã¨ããåèªã®å«ã¾ããã¿ã°ãããããããã¾ãããmt:UnlessWebsite
ã¿ãããªéã®æå³ãæã¤ã¿ã°ããã£ãããªãã£ããããã®ã§ãmt:*unless*
ããªããã°èªåçã«å®ç¾©ãããã©ã°ã¤ã³ã§ãã
tag_missing
ãå¼ã°ããæã«ãåçã«å®ç¾©ããæãã®å®è£
ã§ãtag_missing ã³ã¼ã«ããã¯ã®ãµã³ãã«ãã©ã°ã¤ã³ã«ããªã£ã¦ãã¾ãã
MT ã® t ãã£ã¬ã¯ããªã«ããã35-tags.t ã丸ã
ç§»ãã¦ãmt:*If*
ã mt:*Unless*
ã«æ¸ãæããä¸ã§ããã¹ãçµæãéã«ãããã¹ããæ¸ãã¦ã¿ã¾ããããä¸é¨ãé¤ãã¦ãã¾ãåãã¦ããããã§ãã
https://github.com/taiju/mt-plugin-AutoUnless/blob/master/plugins/AutoUnless/t/tags.t
åçã«ããã¤ãã®ã¿ã°ãå®ç¾©ãããããªæã«ã¯ãtag_missing ã³ã¼ã«ããã¯ã¯ä¾¿å©ã«ä½¿ãããã§ãã
ã¾ã¨ã
ããã¨ä¾¿å©ãªæ°ã¯ãããã§ããã©ãã¢ã¤ãã¢ãããã§ä½ã£ã¦ã¿ããã®ã®ãå®è£ ã¯æ£ç´å¾®å¦ãªæãã«ãªã£ã¦ãã¾ãã¾ããã
ä»å¹´ã¯ã³ã¼ããæ¸ããããèªãæéãå§åçã«å¤ãå¹´ã§ãããæ¥å¹´ã¯ãæ¸ãæéãå¢ãããããããªã¨æãã¾ãã