Bivio::UI::HTML::Widget::JavaScript
# Copyright (c) 1999-2010 bivio Software, Inc. All rights reserved.
# $Id$
package Bivio::UI::HTML::Widget::JavaScript;
use strict;
use Bivio::Base 'Bivio::UI::Widget';
my($_COMMON_CODE) = __PACKAGE__ . '.common_code';
my($_ID) = 0;
sub BASE_VAR_NAME {
return 'window.bivio';
}
sub escape_string {
my($self, $text) = @_;
# Converts a text string into something safely escaped.
# Returns its first argument.
$$text =~ s/\\/\\\\/g;
$$text =~ s/'/\\'/g;
$$text =~ s/\n/\\n/g;
$$text =~ s#/#\\/#g;
return $text;
}
sub has_been_rendered {
my(undef, $source, $module_tag) = @_;
# returns true if common code has been rendered.
return exists(($source->get_request->unsafe_get($_COMMON_CODE) || {})
->{$module_tag});
}
sub render {
my($self, $source, $buffer, $module_tag, $common_code,
# Render the JavaScript version tag if not already rendered.
# Renders the I<common_code> for I<module_tag> if not already
# rendered. Renders I<script> and I<no_script_html> if defined.
$script, $no_script_html) = @_;
my($req) = $source->get_request;
return _render_script_in_head($self, $req, $buffer)
unless defined($module_tag)
|| defined($common_code)
|| defined($script)
|| defined($no_script_html);
# Render common code (on parent request if embedded)
my($root_req) = $req->unsafe_get_current_root || $req;
my($defns) = $root_req->get_if_exists_else_put($_COMMON_CODE, {});
$defns->{$module_tag} ||= $common_code
if defined($module_tag) && defined($common_code);
# Render the code and script in a JavaScript section
if (defined($script)) {
$$buffer .= "<script type=\"text/javascript\">\n<!--\n";
$$buffer .= $script;
$$buffer .= "\n// -->\n</script>";
}
# Render noscript
$$buffer .= '<noscript>'.$no_script_html.'</noscript>'
if defined($no_script_html);
return;
}
sub strip {
my(undef, $code) = @_;
# Strips leading blanks and comments.
# Strip leading blanks and blank lines
$code =~ s/^\s+//sg;
$code =~ s/\n\s+/\n/g;
$code =~ s{^\s*//.*\n}{}mg;
return $code;
}
sub unique_html_id {
return 'b_js' . ++$_ID;
}
sub var_name {
my($self, $suffix) = @_;
return $self->BASE_VAR_NAME . ".$suffix";
}
sub _render_script_in_head {
my($self, $req, $buffer) = @_;
# render the common code in <script> tags
# intended to be called in the html <head> block
my($defns) = $req->unsafe_get($_COMMON_CODE);
return
unless defined($defns);
my($bvn) = $self->BASE_VAR_NAME;
$$buffer .= <<"EOF"
<script type=\"text/javascript\">
<!--
$bvn = $bvn || {};
EOF
. join('', values(%$defns))
. "
// -->
</script>";
return;
}
1;