use
5.010001;
our
$AUTHORITY
=
'cpan:PERLANCAR'
;
our
$DATE
=
'2023-03-29'
;
our
$DIST
=
'App-FireDiamondUtils'
;
our
$VERSION
=
'0.003'
;
our
%SPEC
;
$SPEC
{
'explain_fire_diamond_text_notation'
} = {
v
=> 1.1,
summary
=>
'Explain fire diamond text notation in several ways'
,
args
=> {
notation
=> {
schema
=>
'str*'
,
req
=> 1,
pos
=> 0,
},
style
=> {
schema
=> [
'str*'
,
in
=>[
'table'
,
'verbose-table'
,
'highlighted-table'
,
'highlighted-verbose-table'
]],
default
=>
'highlighted-table'
,
},
},
examples
=> [
{
summary
=>
'Show fire diamond for sulfuric acid in highlighted table style'
,
argv
=> [
"H3/F0/R2/W+OX"
],
},
{
summary
=>
'Show fire diamond for sulfuric acid in table style'
,
argv
=> [
"H3/F0/R2/W+OX"
,
"--style"
,
"table"
],
},
],
};
sub
explain_fire_diamond_text_notation {
my
%args
=
@_
;
my
$notation
=
$args
{notation};
my
$style
=
$args
{style} // 1;
my
$parse_res
= Parse::FireDiamond::parse_fire_diamond_text_notation(
notation
=>
$notation
);
return
[400,
"Can't parse notation '$notation': $parse_res->[0] - $parse_res->[1]"
]
unless
$parse_res
->[0] == 200;
if
(
$style
=~ /table/) {
my
$verbose
=
$style
=~ /verbose/;
my
$highlighted
=
$style
=~ /highlighted/;
my
$t
= Text::ANSITable->new;
$t
->columns([
"Num/Sym"
,
"Meaning"
, (
$verbose
? (
"Explanation"
) : () )]);
my
$rownum
= 0;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"01b3f1"
});
$t
->add_row([
""
,
"HEALTH HAZARD"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$num
(
sort
{
$a
<=>
$b
}
keys
%Parse::FireDiamond::health_hazard_attrs
) {
if
(
$num
==
$parse_res
->[2]{health_hazard_number}) {
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"80d9f8"
})
if
$highlighted
;
}
else
{
next
unless
$highlighted
;
}
$t
->add_row([
$num
. (
$num
==
$parse_res
->[2]{health_hazard_number} ?
"*"
:
""
),
$Parse::FireDiamond::health_hazard_attrs
{
$num
}{meaning}, (
$verbose
? (
$Parse::FireDiamond::health_hazard_attrs
{
$num
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"ec1b2e"
});
$t
->add_row([
""
,
"FIRE HAZARD"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$num
(
sort
{
$a
<=>
$b
}
keys
%Parse::FireDiamond::fire_hazard_attrs
) {
if
(
$num
==
$parse_res
->[2]{fire_hazard_number}) {
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"f58d96"
})
if
$highlighted
;
}
else
{
next
unless
$highlighted
;
}
$t
->add_row([
$num
. (
$num
==
$parse_res
->[2]{fire_hazard_number} ?
"*"
:
""
),
$Parse::FireDiamond::fire_hazard_attrs
{
$num
}{meaning}, (
$verbose
? (
$Parse::FireDiamond::fire_hazard_attrs
{
$num
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"f2de01"
});
$t
->add_row([
""
,
"REACTIVITY"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$num
(
sort
{
$a
<=>
$b
}
keys
%Parse::FireDiamond::reactivity_attrs
) {
if
(
$num
==
$parse_res
->[2]{reactivity_number}) {
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"f8ee80"
})
if
$highlighted
;
}
else
{
next
unless
$highlighted
;
}
$t
->add_row([
$num
. (
$num
==
$parse_res
->[2]{reactivity_number} ?
"*"
:
""
),
$Parse::FireDiamond::reactivity_attrs
{
$num
}{meaning}, (
$verbose
? (
$Parse::FireDiamond::reactivity_attrs
{
$num
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"ffffff"
});
$t
->add_row([
""
,
"SPECIFIC HAZARDS"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$sym
(
sort
keys
%Parse::FireDiamond::specific_hazard_attrs
) {
if
(
grep
{
$_
->{symbol} eq
$sym
} @{
$parse_res
->[2]{specific_hazards} }) {
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"cccccc"
})
if
$highlighted
;
}
else
{
next
unless
$highlighted
;
}
$t
->add_row([
$sym
. ((
grep
{
$_
->{symbol} eq
$sym
} @{
$parse_res
->[2]{specific_hazards} }) ?
"*"
:
""
),
$Parse::FireDiamond::specific_hazard_attrs
{
$sym
}{meaning}, (
$verbose
? (
$Parse::FireDiamond::specific_hazard_attrs
{
$sym
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
binmode
(STDOUT,
":utf8"
);
print
$t
->draw;
}
[200];
}
$SPEC
{
'show_fire_diamond_legends'
} = {
v
=> 1.1,
summary
=>
'Show a table that explains the meaning of each number and symbol in the Fire Diamond notation'
,
args
=> {
detail
=> {
summary
=>
'Show the longer explanation instead of just the meaning'
,
schema
=>
'bool*'
,
cmdline_aliases
=> {
l
=>{}},
},
},
examples
=> [
{
summary
=>
'Show the short table'
,
argv
=>[],
},
{
summary
=>
'Show the long/verbose table'
,
argv
=>[
"-l"
],
},
],
};
sub
show_fire_diamond_legends {
my
%args
=
@_
;
my
$t
= Text::ANSITable->new;
$t
->columns([
"Num/Sym"
,
"Meaning"
, (
$args
{detail} ? (
"Explanation"
) : () )]);
my
$rownum
= 0;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"01b3f1"
});
$t
->add_row([
""
,
"HEALTH HAZARD"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$num
(
sort
{
$a
<=>
$b
}
keys
%Parse::FireDiamond::health_hazard_attrs
) {
$t
->add_row([
$num
,
$Parse::FireDiamond::health_hazard_attrs
{
$num
}{meaning}, (
$args
{detail} ? (
$Parse::FireDiamond::health_hazard_attrs
{
$num
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"ec1b2e"
});
$t
->add_row([
""
,
"FIRE HAZARD"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$num
(
sort
{
$a
<=>
$b
}
keys
%Parse::FireDiamond::fire_hazard_attrs
) {
$t
->add_row([
$num
,
$Parse::FireDiamond::fire_hazard_attrs
{
$num
}{meaning}, (
$args
{detail} ? (
$Parse::FireDiamond::fire_hazard_attrs
{
$num
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"f2de01"
});
$t
->add_row([
""
,
"REACTIVITY"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$num
(
sort
{
$a
<=>
$b
}
keys
%Parse::FireDiamond::reactivity_attrs
) {
$t
->add_row([
$num
,
$Parse::FireDiamond::reactivity_attrs
{
$num
}{meaning}, (
$args
{detail} ? (
$Parse::FireDiamond::reactivity_attrs
{
$num
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
$t
->set_row_style(
$rownum
, {
fgcolor
=>
"000000"
,
bgcolor
=>
"ffffff"
});
$t
->add_row([
""
,
"SPECIFIC HAZARDS"
,
""
, (
$args
{detail} ? () : () )]);
$rownum
++;
for
my
$sym
(
sort
keys
%Parse::FireDiamond::specific_hazard_attrs
) {
$t
->add_row([
$sym
,
$Parse::FireDiamond::specific_hazard_attrs
{
$sym
}{meaning}, (
$args
{detail} ? (
$Parse::FireDiamond::specific_hazard_attrs
{
$sym
}{explanation}) : () )]);
$rownum
++;
}
$t
->add_row_separator;
binmode
(STDOUT,
":utf8"
);
print
$t
->draw;
[200];
}
1;
Hide Show 176 lines of Pod