ONO::Lib::Content::Code

package ONO::Lib::Content::Code;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2000-2025 Jos KIRPS [ www.kirps.com | jos_AT_kirps_DOT_com ]
# and The Joopita Project [ www.joopita.org | contact_AT_joopita_DOT_com ]
#
# This file, as well as other parts of the ONO Software Project or related
# elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################

use strict;

use ONO::Lib::Basic;

###############################################################################
# display
###############################################################################

sub display {

my (
$self,
$code,
$class,
) = @_;

#: Display HTML or program code in a dedicated box, highlight specific elements.

my $CODE;

foreach my $line (split(/\n/,$code)) {

if ($line =~ m~[A-Za-z0-9]~ || $line =~ /(\{|\}|\(|\)|\.|\,)/) {

$line = ONO::Lib::Basic->remove_leading_spaces($line);
$line = " $line ";
$line =~ s~\<~<~g;
$line =~ s~\>~>~g;
$line =~ s~->~-\>~g;

$line =~ s~(# |#|)ignore_required_module~~gi;

# ENCODE SPECIAL STUFF

$line =~ s~\$BLK\{'(.*?)'\}~###_BLK_${1}_###~g;

# VARIOUS

$line =~ s~"(.*?)"~<span class="bold" style="color:#cc3333">"$1"</span>~g;
$line =~ s~'(.*?)'~<span class="bold" style="color:#cc3333">'$1'</span>~g;

# CODE

if ($line =~ /ONO:(.*?)(-|;)/) {
my $ext = $1;
$line =~ s~ONO:$ext-\>(.*?)(\;|\))~<span class="bold" style="color:#3333cc">ONO::$ext-\>$1</span>$2~;
$line =~ s~ONO:$ext(;|\))~<span class="bold" style="color:#3333cc">ONO::$ext</span>$1~;
}

$line =~ s~onojs_(.*?)\((.*?)\);~<span class="bold" style="color:#3333cc">onojs_$1\($2\);</span>~;

if ($line =~ /^#!/) {
$line = qq~<span class="bold" style="color:#666666">$line</span>~;
}

for (my $i = 0; $i < 3; $i++) {
$line =~ s~ (=|use|print|my|foreach) ~ <span class="bold" style="color:#339933">$1</span> ~;
}

my $whilecounter;
while ($whilecounter < 256 && $line =~ s~( |\(|\,)(\$|\@|\%)(.*?)( |\)|\,)~$1<span class="bold" style="color:#cc3333">$2$3</span>$4~) {
$whilecounter++;
}

$line =~ s~\)(\;|\))~<span class="bold" style="color:#3333cc">\)</span>$1~g;

# HTML

$line =~ s~\<\;(a|div|script|span|form)~<span class="bold" style="color:#339933">\<\;$1</span>~g;
$line =~ s~\<\;/(a|div|script|span|form)\>\;~<span class="bold" style="color:#339933">\<\;/$1\></span>~g;
$line =~ s~\>\>\;~\><span class="bold" style="color:#339933">\></span>~g;

$line =~ s~\>\>\;~\><span class="bold" style="color:#339933">\></span>~g;

$line =~ s~ (class|href)=\<~ <span class="bold" style="color:#339933">$1</span>=\<~g;

$line =~ s~\<\;\$(form)\>\;~<span class="bold"><span style="color:#339933">\<\;</span><span style="color:#cc3333">\$form</span><span style="color:#339933">\>\;</span></span>~g;

# DECODE SPECIAL STUFF

$line =~ s~###_BLK_(.*?)_###~<span class="bold" style="color:#cc3333">\$BLK\{</span>'$1'<span class="bold" style="color:#cc3333">\}</span>~g;

# PUT INTO DIV...

$CODE .= qq~<div>$line</div>~;

} else {

$CODE .= qq~<div class="p5"></div>~;

}

}

$CODE =~ s~<div class="p5"></div>$~~;

return qq~<div class="box_code p20 $class">$CODE</div>~;

}

###############################################################################
# end of script
###############################################################################

1;

__END__