From e7891e9191583d7f3f63bd6b450181d75b2d2a4d Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Mon, 23 Aug 2010 12:46:52 -0500 Subject: [PATCH] add macro transform sub, convert upgrade to use it --- lib/WebGUI/Macro.pm | 128 ++++++++++++------ share/upgrades/7.9.12-8.0.0/removeAdminBar.pl | 30 ++-- 2 files changed, 106 insertions(+), 52 deletions(-) diff --git a/lib/WebGUI/Macro.pm b/lib/WebGUI/Macro.pm index 9d1e68a30..77f2a21a5 100644 --- a/lib/WebGUI/Macro.pm +++ b/lib/WebGUI/Macro.pm @@ -43,7 +43,7 @@ These functions are available from this package: =cut #------------------------------------------------------------------- -our $macro_re = qr{ +my $macro_re = qr{ ( # capture #1 - entire macro call \^ # start with carat ([-a-zA-Z0-9_@#/*]{1,64}) # capture #2 - macro name @@ -62,6 +62,35 @@ our $macro_re = qr{ ) }msx; +my $quote_re = qr{ + (?log->error("Macro has no process sub: $macropackage."); return; } - $parameters =~ s/^\(//; - $parameters =~ s/\)$//; - my @params; - while ($parameters =~ m{ - (?($session, @params); 1 } ) { # call process sub with parameters + unless ( eval { $output = $process->($session, @$params); 1 } ) { # call process sub with parameters $session->log->error("Unable to process macro '$macroname': $@"); return; } @@ -211,5 +208,60 @@ sub _processMacro { return $output; } +sub _processParameters { + my $parameters = shift; + + $parameters =~ s/^\(//; + $parameters =~ s/\)$//; + + my @params; + while ($parameters =~ m{$quote_re}msxg) { + # three matches, only one will exist per run + my $param = $+; + $param =~ s/\\(.)/$1/xmsg; # deal with backslash escapes + push @params, $param; + } + + return \@params; +} + +sub transform { + my $session = shift; + my $content = shift; + my $sub = shift; + + ${ $content } =~ s{$macro_re}{ + my $initialText = $1; + my $replaceText = _transformMacro($session, $sub, $initialText, $2, $3); + # _processMacro returns undef on failure, use original text + defined $replaceText ? $replaceText : $initialText; + }ge; +} + +sub _transformMacro { + my $session = shift; + my $sub = shift; + my $original = shift; + my $macro = shift; + my $paramString = shift; + + my $macroPackage = "WebGUI::Macro::" . $session->config->get("macros")->{$macro}; + my $params = _processParameters($paramString); + return $sub->({ + session => $session, + macro => $macro, + macroPackage => $macroPackage, + originalText => $original, + parameters => $params, + parameterString => $paramString, + }); +} + +sub quote { + my $text = shift; + $text =~ s/([\\'])/\\$1/g; + return "'$text'"; +} + 1; diff --git a/share/upgrades/7.9.12-8.0.0/removeAdminBar.pl b/share/upgrades/7.9.12-8.0.0/removeAdminBar.pl index 3c2b1c2e0..09a64dba8 100644 --- a/share/upgrades/7.9.12-8.0.0/removeAdminBar.pl +++ b/share/upgrades/7.9.12-8.0.0/removeAdminBar.pl @@ -1,15 +1,19 @@ - use WebGUI::Upgrade::Script; -report "\tRemoving Admin Bar... "; - -session->config->delete( 'macros/AdminBar' ); - -report "\tEditing templates to remove AdminBar macro calls..."; +start_step "Editing templates to remove AdminBar macro calls"; use WebGUI::Macro; use WebGUI::Asset::Template; +my $removeAdminBar = sub { + my $macro = shift; + if ($macro->{macroPackage} eq 'WebGUI::Macro::AdminBar') { + return ''; + } + else { + return; + } +}; my $iter = WebGUI::Asset::Template->getIsa( session ); ASSET: while (1) { my $template = eval { $iter->() }; @@ -20,17 +24,15 @@ ASSET: while (1) { last ASSET unless $template; my $content = $template->template; - while ( $content =~ m/$WebGUI::Macro::macro_re/g ) { - my $macroCall = $1; - my $macroName = $2; - if ( $macroName eq 'AdminBar' ) { - $content =~ s/\Q$macroCall//g; - } - } - + WebGUI::Macro::transform( session, \$content, $removeAdminBar ); $template->template( $content ); $template->write; } +done; + +start_step "Removing Admin Bar"; + +session->config->delete( 'macros/AdminBar' ); done;