← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/local/src/github.com/foswiki/core/bin/view
  Run on Sun Dec 4 17:17:59 2011
Reported on Sun Dec 4 17:26:34 2011

Filename/usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugins/InterwikiPlugin.pm
StatementsExecuted 282 statements in 4.66ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111761µs60.9sFoswiki::Plugins::InterwikiPlugin::::initPluginFoswiki::Plugins::InterwikiPlugin::initPlugin
3811757µs757µsFoswiki::Plugins::InterwikiPlugin::::_mapFoswiki::Plugins::InterwikiPlugin::_map
3911544µs544µsFoswiki::Plugins::InterwikiPlugin::::CORE:substcontFoswiki::Plugins::InterwikiPlugin::CORE:substcont (opcode)
1351454µs454µsFoswiki::Plugins::InterwikiPlugin::::CORE:substFoswiki::Plugins::InterwikiPlugin::CORE:subst (opcode)
1131449µs449µsFoswiki::Plugins::InterwikiPlugin::::CORE:regcompFoswiki::Plugins::InterwikiPlugin::CORE:regcomp (opcode)
511202µs1.02msFoswiki::Plugins::InterwikiPlugin::::preRenderingHandlerFoswiki::Plugins::InterwikiPlugin::preRenderingHandler
11130µs36µsFoswiki::Plugins::InterwikiPlugin::::_trimWhitespaceFoswiki::Plugins::InterwikiPlugin::_trimWhitespace
11128µs40µsFoswiki::Plugins::InterwikiPlugin::::BEGIN@23Foswiki::Plugins::InterwikiPlugin::BEGIN@23
11117µs36µsFoswiki::Plugins::InterwikiPlugin::::BEGIN@24Foswiki::Plugins::InterwikiPlugin::BEGIN@24
1119µs9µsFoswiki::Plugins::InterwikiPlugin::::BEGIN@26Foswiki::Plugins::InterwikiPlugin::BEGIN@26
1119µs9µsFoswiki::Plugins::InterwikiPlugin::::BEGIN@40Foswiki::Plugins::InterwikiPlugin::BEGIN@40
1119µs9µsFoswiki::Plugins::InterwikiPlugin::::BEGIN@27Foswiki::Plugins::InterwikiPlugin::BEGIN@27
0000s0sFoswiki::Plugins::InterwikiPlugin::::_linkFoswiki::Plugins::InterwikiPlugin::_link
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# See bottom of file for license and copyright information
2
3=begin TML
4
5---+ package Foswiki::Plugins::InterwikiPlugin
6
7Recognises and processes special links to other sites defined
8using "inter-site syntax".
9
10The recognized syntax is:
11<pre>
12 InterSiteName:TopicName
13</pre>
14
15Sites must start with upper case and must be preceded by white
16space, '-', '*' or '(', or be part of the link expression
17in a [[link]] or [[link][text]] expression.
18
19=cut
20
21package Foswiki::Plugins::InterwikiPlugin;
22
23252µs252µs
# spent 40µs (28+12) within Foswiki::Plugins::InterwikiPlugin::BEGIN@23 which was called: # once (28µs+12µs) by Foswiki::Plugin::BEGIN@2.9 at line 23
use strict;
# spent 40µs making 1 call to Foswiki::Plugins::InterwikiPlugin::BEGIN@23 # spent 12µs making 1 call to strict::import
24244µs255µs
# spent 36µs (17+19) within Foswiki::Plugins::InterwikiPlugin::BEGIN@24 which was called: # once (17µs+19µs) by Foswiki::Plugin::BEGIN@2.9 at line 24
use warnings;
# spent 36µs making 1 call to Foswiki::Plugins::InterwikiPlugin::BEGIN@24 # spent 19µs making 1 call to warnings::import
25
26239µs19µs
# spent 9µs within Foswiki::Plugins::InterwikiPlugin::BEGIN@26 which was called: # once (9µs+0s) by Foswiki::Plugin::BEGIN@2.9 at line 26
use Foswiki::Func (); # The plugins API
# spent 9µs making 1 call to Foswiki::Plugins::InterwikiPlugin::BEGIN@26
272161µs19µs
# spent 9µs within Foswiki::Plugins::InterwikiPlugin::BEGIN@27 which was called: # once (9µs+0s) by Foswiki::Plugin::BEGIN@2.9 at line 27
use Foswiki::Plugins (); # For the API version
# spent 9µs making 1 call to Foswiki::Plugins::InterwikiPlugin::BEGIN@27
28
2912µsour $VERSION = '$Rev$';
3011µsour $RELEASE = '1.1.2';
3111µsour $NO_PREFS_IN_TOPIC = 1;
3211µsour $SHORTDESCRIPTION =
33'Link !ExternalSite:Page text to external sites based on aliases defined in a rules topic';
34
3511µsmy $interLinkFormat;
361800nsmy $sitePattern;
371900nsmy $pagePattern;
3811µsmy %interSiteTable;
39
40
# spent 9µs within Foswiki::Plugins::InterwikiPlugin::BEGIN@40 which was called: # once (9µs+0s) by Foswiki::Plugin::BEGIN@2.9 at line 47
BEGIN {
41
42 # 'Use locale' for internationalisation of Perl sorting and searching -
43110µs if ( $Foswiki::cfg{UseLocale} ) {
44 require locale;
45 import locale();
46 }
4711.16ms19µs}
# spent 9µs making 1 call to Foswiki::Plugins::InterwikiPlugin::BEGIN@40
48
49# Read preferences and get all InterWiki Site->URL mappings
50
# spent 60.9s (761µs+60.9) within Foswiki::Plugins::InterwikiPlugin::initPlugin which was called: # once (761µs+60.9s) by Foswiki::Plugin::__ANON__[/usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugin.pm:235] at line 228 of /usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugin.pm
sub initPlugin {
51551.30ms my ( $topic, $web, $user, $installWeb ) = @_;
52
53 # Regexes for the Site:page format InterWiki reference
54 my $man = $Foswiki::regex{mixedAlphaNum};
55 my $ua = $Foswiki::regex{upperAlpha};
56 %interSiteTable = ();
57 $sitePattern = "([$ua][$man]+)";
58 $pagePattern = "((?:'[^']*')|(?:\"[^\"]*\")|(?:[${man}\_\~\%\/][$man"
59 . '"\'\.\/\+\_\~\,\&\;\:\=\!\?\%\#\@\-\(\)]*?))';
60
61 # Get plugin preferences from InterwikiPlugin topic
621102µs $interLinkFormat =
# spent 102µs making 1 call to Foswiki::Func::getPreferencesValue
63 Foswiki::Func::getPreferencesValue('INTERWIKIPLUGIN_INTERLINKFORMAT')
64 || '<a class="interwikiLink" href="$url" title="$tooltip"><noautolink>$label</noautolink></a>';
65
661151µs my $rulesTopicPref =
# spent 151µs making 1 call to Foswiki::Func::getPreferencesValue
67 Foswiki::Func::getPreferencesValue('INTERWIKIPLUGIN_RULESTOPIC')
68 || 'InterWikis';
69 my @rulesTopics = split( ',', $rulesTopicPref );
70 foreach my $topic (@rulesTopics) {
71136µs $topic = _trimWhitespace($topic);
72
731100µs my ( $interWeb, $interTopic ) =
# spent 100µs making 1 call to Foswiki::Func::normalizeWebTopicName
74 Foswiki::Func::normalizeWebTopicName( $installWeb, $topic );
75
76160.8s if (
# spent 60.8s making 1 call to Foswiki::Func::checkAccessPermission
77 !Foswiki::Func::checkAccessPermission(
78 'VIEW', $user, undef, $interTopic, $interWeb
79 )
80 )
81 {
82 Foswiki::Func::writeWarning(
83"InterwikiPlugin: user '$user' did not have permission to read the rules topic at '$interWeb.$interTopic'"
84 );
85 return 1;
86 }
8715.75ms my $text =
# spent 5.75ms making 1 call to Foswiki::Func::readTopicText
88 Foswiki::Func::readTopicText( $interWeb, $interTopic, undef, 1 );
89
90 # '| alias | URL | ...' table and extract into 'alias', "URL" list
9138757µs $text =~
# spent 757µs making 38 calls to Foswiki::Plugins::InterwikiPlugin::_map, avg 20µs/call
9241627µss/^\|\s*$sitePattern\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|.*$/_map($1,$2,$3)/meg;
# spent 544µs making 39 calls to Foswiki::Plugins::InterwikiPlugin::CORE:substcont, avg 14µs/call # spent 45µs making 1 call to Foswiki::Plugins::InterwikiPlugin::CORE:regcomp # spent 38µs making 1 call to Foswiki::Plugins::InterwikiPlugin::CORE:subst
93 }
94
95 $sitePattern = "(" . join( "|", keys %interSiteTable ) . ")";
96 return 1;
97}
98
99
# spent 757µs within Foswiki::Plugins::InterwikiPlugin::_map which was called 38 times, avg 20µs/call: # 38 times (757µs+0s) by Foswiki::Plugins::InterwikiPlugin::initPlugin at line 91, avg 20µs/call
sub _map {
100190845µs my ( $site, $url, $tooltip ) = @_;
101 if ($site) {
102 $interSiteTable{$site}{url} = $url || '';
103 $interSiteTable{$site}{tooltip} = $tooltip || '';
104 }
105 return '';
106}
107
108
# spent 1.02ms (202µs+813µs) within Foswiki::Plugins::InterwikiPlugin::preRenderingHandler which was called 5 times, avg 203µs/call: # 5 times (202µs+813µs) by Foswiki::Plugin::invoke at line 287 of /usr/local/src/github.com/foswiki/core/lib/Foswiki/Plugin.pm, avg 203µs/call
sub preRenderingHandler {
109
110 # ref in [[ref]] or [[ref][
111 $_[0] =~
11215988µs10302µss/(\[\[)$sitePattern:$pagePattern(\]\]|\]\[[^\]]+\]\])/_link($1,$2,$3,$4)/ge;
# spent 243µs making 5 calls to Foswiki::Plugins::InterwikiPlugin::CORE:regcomp, avg 49µs/call # spent 59µs making 5 calls to Foswiki::Plugins::InterwikiPlugin::CORE:subst, avg 12µs/call
113
114 # ref in text
115 $_[0] =~
11610511µss/(^|[\s\-\*\=\_\(])$sitePattern:$pagePattern(?=[\s\.\,\;\:\!\?\)\*\=\_\|]*(\s|$))/_link($1,$2,$3)/ge;
# spent 351µs making 5 calls to Foswiki::Plugins::InterwikiPlugin::CORE:subst, avg 70µs/call # spent 160µs making 5 calls to Foswiki::Plugins::InterwikiPlugin::CORE:regcomp, avg 32µs/call
117
118 return;
119}
120
121sub _link {
122 my ( $prefix, $site, $page, $postfix ) = @_;
123
124 $prefix ||= '';
125 $site ||= '';
126 $page ||= '';
127 $postfix ||= '';
128
129 my $upage = $page;
130 if ( $page =~ /^['"](.*)["']$/ ) {
131 $page = $1;
132 $upage = Foswiki::urlEncode($1);
133 }
134
135 my $text = $prefix;
136 if ( defined( $interSiteTable{$site} ) ) {
137 my $tooltip = $interSiteTable{$site}{tooltip};
138 my $url = $interSiteTable{$site}{url};
139
140 #$url .= $page unless ( $url =~ /\$page/ );
141
142 if ( $url =~ /\$page/ ) {
143 $url =~ s/\$page/$upage/g;
144 }
145 else {
146 $url .= $upage;
147 }
148 my $label = '$site:$page';
149
150 if ($postfix) {
151
152 # [[...]] or [[...][...]] interwiki link
153 $text = '';
154 if ( $postfix =~ /^\]\[([^\]]+)/ ) {
155 $label = $1;
156 }
157 }
158
159 my $format = $interLinkFormat;
160 $format =~ s/\$url/$url/g;
161 $format =~ s/\$tooltip/$tooltip/g;
162 $format =~ s/\$label/$label/g;
163 $format =~ s/\$site/$site/g;
164 $format =~ s/\$page/$page/g;
165 $text .= $format;
166 }
167 else {
168 $text .= "$site\:$page$postfix";
169 }
170 return $text;
171}
172
173
# spent 36µs (30+7) within Foswiki::Plugins::InterwikiPlugin::_trimWhitespace which was called: # once (30µs+7µs) by Foswiki::Plugins::InterwikiPlugin::initPlugin at line 71
sub _trimWhitespace {
174439µs my $string = shift;
17514µs $string =~ s/^\s+//;
# spent 4µs making 1 call to Foswiki::Plugins::InterwikiPlugin::CORE:subst
17613µs $string =~ s/\s+$//;
# spent 3µs making 1 call to Foswiki::Plugins::InterwikiPlugin::CORE:subst
177 return $string;
178}
179
18018µs1;
181__END__
 
# spent 449µs within Foswiki::Plugins::InterwikiPlugin::CORE:regcomp which was called 11 times, avg 41µs/call: # 5 times (243µs+0s) by Foswiki::Plugins::InterwikiPlugin::preRenderingHandler at line 112, avg 49µs/call # 5 times (160µs+0s) by Foswiki::Plugins::InterwikiPlugin::preRenderingHandler at line 116, avg 32µs/call # once (45µs+0s) by Foswiki::Plugins::InterwikiPlugin::initPlugin at line 92
sub Foswiki::Plugins::InterwikiPlugin::CORE:regcomp; # opcode
# spent 454µs within Foswiki::Plugins::InterwikiPlugin::CORE:subst which was called 13 times, avg 35µs/call: # 5 times (351µs+0s) by Foswiki::Plugins::InterwikiPlugin::preRenderingHandler at line 116, avg 70µs/call # 5 times (59µs+0s) by Foswiki::Plugins::InterwikiPlugin::preRenderingHandler at line 112, avg 12µs/call # once (38µs+0s) by Foswiki::Plugins::InterwikiPlugin::initPlugin at line 92 # once (4µs+0s) by Foswiki::Plugins::InterwikiPlugin::_trimWhitespace at line 175 # once (3µs+0s) by Foswiki::Plugins::InterwikiPlugin::_trimWhitespace at line 176
sub Foswiki::Plugins::InterwikiPlugin::CORE:subst; # opcode
# spent 544µs within Foswiki::Plugins::InterwikiPlugin::CORE:substcont which was called 39 times, avg 14µs/call: # 39 times (544µs+0s) by Foswiki::Plugins::InterwikiPlugin::initPlugin at line 92, avg 14µs/call
sub Foswiki::Plugins::InterwikiPlugin::CORE:substcont; # opcode