Developer-Dashboard
view release on metacpan or search on metacpan
lib/Developer/Dashboard/PageDocument.pm view on Meta::CPAN
font-size: 0.9rem;
}
.runtime-error {
color: #b00020;
white-space: pre-wrap;
}
.dashboard-nav-items {
margin: 0 0 24px;
padding: 14px 18px;
border: 1px solid var(--line);
background: var(--panel, #f3eee2);
color: var(--text, var(--ink));
border-radius: 14px;
}
.dashboard-nav-items ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
gap: 10px 18px;
align-items: center;
}
.dashboard-nav-items li {
margin: 0;
padding: 0;
}
.dashboard-nav-items li + li {
margin-top: 0;
padding-top: 0;
border-top: 0;
}
.dashboard-nav-items a {
color: var(--text, var(--ink));
text-decoration-color: var(--accent, currentColor);
}
.dashboard-nav-items a:hover {
color: var(--accent, var(--text, var(--ink)));
}
</style>
</head>
<body>
$legacy_bootstrap
<main>
$chrome_html
$nav_html
@{[ $desc ne '' ? qq{<p>$desc</p>} : '' ]}
<section class="body">$body_html</section>
$runtime_bootstrap
$runtime_output
$runtime_errors
</main>
</body>
</html>
HTML
}
# _decode_structured_json($text)
# Safely decodes structured JSON from instruction sections.
# Input: text block string.
# Output: decoded Perl value or empty hash reference on failure.
sub _decode_structured_json {
my ($text) = @_;
$text = _trim($text);
return {} if $text eq '';
my $value = eval { json_decode($text) };
return defined $value ? $value : {};
}
# _decode_stash_section($text)
# Decodes older or modern STASH content into a hash reference.
# Input: stash section text string.
# Output: hash reference or empty hash reference on failure.
sub _decode_stash_section {
my ($text) = @_;
$text = _trim($text);
return {} if $text eq '';
if ( $text =~ /\A[\{\[]/ ) {
my $value = eval { json_decode($text) };
return $value if ref($value) eq 'HASH';
return {};
}
my $hash = eval "+{ $text }";
return ref($hash) eq 'HASH' ? $hash : {};
}
# _parse_legacy_sections($text)
# Parses older bookmark syntax separated by the older separator line.
# Input: full older bookmark text string.
# Output: hash of section name to arrayref of lines.
sub _parse_legacy_sections {
my ($text) = @_;
my %sections;
my $markdown_sep = qr{^\s*---\s*$}m;
my @parts = split /(?:\Q$LEGACY_SEP\E\s*\n?|$markdown_sep)/, $text;
for my $part (@parts) {
$part =~ s/\A[\r\n\s]+//;
$part =~ s/[\r\n\s]+\z//;
next if $part eq '';
next if $part !~ /^([A-Za-z][A-Za-z0-9.]*)\s*:\s*(.*)$/s;
my ( $name, $body ) = ( uc($1), $2 );
$body =~ s/\A\s+//;
next if !$name || !grep { $_ eq $name || ( $name =~ /^CODE\d+$/ && /^CODE\d+$/ ) } @LEGACY_KEYS;
$sections{$name} = [ split /\n/, $body, -1 ];
}
return %sections;
}
# _legacy_stash_text($value)
# Serializes a hash reference into a simple older STASH body.
# Input: stash hash reference.
# Output: Perl-like older stash text.
sub _legacy_stash_text {
my ($value) = @_;
return '' if ref($value) ne 'HASH' || !keys %$value;
my @pairs = map { sprintf "%s => %s", $_, _legacy_value( $value->{$_} ) } sort keys %$value;
return join ",\n", @pairs;
}
# _legacy_value($value)
# Serializes a Perl scalar, array, or hash into a older bookmark value string.
( run in 0.954 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )