2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

98_Installer: use table headers and footers

git-svn-id: https://svn.fhem.de/fhem/trunk@19083 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2019-04-01 15:31:03 +00:00
parent 33ccbb35c8
commit 2a60f8cf14

View File

@ -956,14 +956,22 @@ sub CreatePrereqsList {
my $header = ''; my $header = '';
my $footer = ''; my $footer = '';
if ($html) { if ($html) {
$header = '<html><table><tr><td>'; $header = '<html>';
$footer = '</td></tr></table></html>'; $footer = '</html>';
} }
my $tOpen = '';
my $blockOpen = ''; my $blockOpen = '';
my $tTitleOpen = ''; my $tTitleOpen = '';
my $tTitleClose = ''; my $tTitleClose = '';
my $tOpen = '';
my $tCOpen = '';
my $tCClose = '';
my $tHOpen = '';
my $tHClose = '';
my $tBOpen = '';
my $tBClose = '';
my $tFOpen = '';
my $tFClose = '';
my $trOpen = ''; my $trOpen = '';
my $trOpenEven = ''; my $trOpenEven = '';
my $trOpenOdd = ''; my $trOpenOdd = '';
@ -973,8 +981,8 @@ sub CreatePrereqsList {
my $tdOpen = ''; my $tdOpen = '';
my $tdOpen2 = ''; my $tdOpen2 = '';
my $tdOpen3 = ''; my $tdOpen3 = '';
my $txtOpen = ''; my $strongOpen = '';
my $txtClose = ''; my $strongClose = '';
my $tdClose = "\t\t\t"; my $tdClose = "\t\t\t";
my $thClose = "\t\t\t"; my $thClose = "\t\t\t";
my $trClose = ''; my $trClose = '';
@ -985,28 +993,38 @@ sub CreatePrereqsList {
my $colorClose = ''; my $colorClose = '';
if ($html) { if ($html) {
$blockOpen = '<div class="makeTable wide readings">'; $blockOpen = '<div class="makeTable wide internals">';
$tTitleOpen = '<span class="mkTitle">'; $tTitleOpen = '<span class="mkTitle">';
$tTitleClose = '</span>'; $tTitleClose = '</span>';
$tOpen = '<table class="block wide">'; $tOpen = '<table class="block wide internals wrapcolumns">';
$tCOpen = '<caption style="text-align: left; font-size: larger;">';
$tCClose = '</caption>';
$tHOpen = '<thead>';
$tHClose = '</thead>';
$tBOpen = '<tbody>';
$tBClose = '</tbody>';
$tFOpen = '<tfoot style="font-size: smaller;">';
$tFClose = '</tfoot>';
$trOpen = '<tr class="column">'; $trOpen = '<tr class="column">';
$trOpenEven = '<tr class="column even">'; $trOpenEven = '<tr class="column even">';
$trOpenOdd = '<tr class="column odd">'; $trOpenOdd = '<tr class="column odd">';
$thOpen = '<th style="text-align:left">'; $thOpen = '<th style="text-align: left; vertical-align: top;">';
$thOpen2 = '<th style="text-align:left" colspan="2">'; $thOpen2 =
$thOpen3 = '<th style="text-align:left" colspan="3">'; '<th style="text-align: left; vertical-align: top;" colspan="2">';
$tdOpen = '<td>'; $thOpen3 =
$tdOpen2 = '<td colspan="2">'; '<th style="text-align: left; vertical-align: top;" colspan="3">';
$tdOpen3 = '<td colspan="3">'; $tdOpen = '<td style="vertical-align: top;">';
$txtOpen = '<b>'; $tdOpen2 = '<td style="vertical-align: top;" colspan="2">';
$txtClose = '</b>'; $tdOpen3 = '<td style="vertical-align: top;" colspan="3">';
$strongOpen = '<strong>';
$strongClose = '</strong>';
$tdClose = '</td>'; $tdClose = '</td>';
$thClose = '</th>'; $thClose = '</th>';
$trClose = '</tr>'; $trClose = '</tr>';
$tClose = '</table>'; $tClose = '</table>';
$blockClose = '</div>'; $blockClose = '</div>';
$colorRed = '<span style="color:red">'; $colorRed = '<span style="color: red">';
$colorGreen = '<span style="color:green">'; $colorGreen = '<span style="color: green">';
$colorClose = '</span>'; $colorClose = '</span>';
} }
@ -1135,56 +1153,68 @@ sub CreatePrereqsList {
$l .= $trClose; $l .= $trClose;
if ( $linecount == 1 ) { if ( $linecount == 1 ) {
my $descr =
'These dependencies '
. $txtOpen . 'must'
. $txtClose
. ' be installed for the listed FHEM modules to work:';
$descr =
'These dependencies are '
. $txtOpen
. 'strongly encouraged'
. $txtClose
. ' and should be installed for full functionality of the listed FHEM modules, except in resource constrained environments:'
if ( $importance eq 'Recommended' );
$descr =
'These dependencies are '
. $txtOpen
. 'optional'
. $txtClose
. ', but are suggested for enhanced operation of the listed FHEM modules:'
if ( $importance eq 'Suggested' );
push @ret, push @ret,
'<a name="prereqResult' $trOpen
. $tdOpen
. (
$html
? '<a name="prereqResult' . $importance . '"></a>'
: ''
)
. $blockOpen
. $tOpen
. $tCOpen
. $importance . $importance
. '"></a><h3>' . $tCClose;
. $importance . '</h3>'
. $lb push @ret, $tHOpen . $trOpen;
. $descr
. $lb
. $lb;
push @ret, $tOpen . $trOpen;
push @ret, $thOpen . 'Item' . $thClose; push @ret, $thOpen . 'Item' . $thClose;
push @ret, $thOpen . 'Type' . $thClose; push @ret, $thOpen . 'Type' . $thClose;
push @ret, $thOpen . 'Used by' . $thClose; push @ret, $thOpen . 'Used by' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose . $tBOpen;
} }
push @ret, $l; push @ret, $l;
$linecount++; $linecount++;
} }
push @ret, $tClose; push @ret, $tBClose;
my $descr =
'These dependencies '
. $strongOpen . 'must'
. $strongClose
. ' be installed for the listed FHEM modules to work.';
$descr =
'These dependencies are '
. $strongOpen
. 'strongly encouraged'
. $strongClose
. ' and should be installed for full functionality of the listed FHEM modules, except in resource constrained environments.'
if ( $importance eq 'Recommended' );
$descr =
'These dependencies are '
. $strongOpen
. 'optional'
. $strongClose
. ', but are suggested for enhanced operation of the listed FHEM modules.'
if ( $importance eq 'Suggested' );
push @ret, $tFOpen . $tdOpen3 . $descr . $tFClose;
push @ret, $tClose . $blockClose . $tdClose . $trClose;
} }
} }
if ($found) { if ($found) {
push @ret, $tBClose;
if ( defined( $pkgStatus{Perl}{analyzed} ) ) { if ( defined( $pkgStatus{Perl}{analyzed} ) ) {
push @ret, push @ret,
$lb $tFOpen
. $txtOpen . 'Hint:' . $trOpen
. $txtClose . $tdOpen
. $strongOpen . 'Hint:'
. $strongClose
. ' Some of the FHEM modules in use do not provide Perl prerequisites from its metadata.' . ' Some of the FHEM modules in use do not provide Perl prerequisites from its metadata.'
. $lb; . $lb;
@ -1197,8 +1227,12 @@ sub CreatePrereqsList {
push @ret, push @ret,
'This check may be incomplete until you install Perl::PrereqScanner::NotQuiteLite for automatic source code analysis.'; 'This check may be incomplete until you install Perl::PrereqScanner::NotQuiteLite for automatic source code analysis.';
} }
push @ret, $tdClose . $trClose . $tFClose;
} }
unshift @ret, $lb . $lb . $tdClose . $trClose;
unshift @ret, unshift @ret,
$lb $lb
. $space . $space
@ -1233,6 +1267,9 @@ sub CreatePrereqsList {
$found $found
. ' total missing ' . ' total missing '
. ( $found > 1 ? 'prerequisites:' : 'prerequisite:' ); . ( $found > 1 ? 'prerequisites:' : 'prerequisite:' );
unshift @ret, $blockOpen . $blockClose;
unshift @ret, $tBOpen . $trOpen . $tdOpen;
} }
else { else {
my @hooray = ( my @hooray = (
@ -1241,15 +1278,32 @@ sub CreatePrereqsList {
); );
my $x = 0 + int( rand( scalar @hooray + 1 - 0 ) ); my $x = 0 + int( rand( scalar @hooray + 1 - 0 ) );
unshift @ret, unshift @ret,
ucfirst( $hooray[$x] ) $tBOpen
. $trOpen
. $tdOpen
. $lb
. ucfirst( $hooray[$x] )
. '! All prerequisites are met.' . '! All prerequisites are met.'
. ( $html ? ' 🥳' : '' ); . ( $html ? ' 🥳' : '' )
. $lb
. $lb
. $tdClose
. $trClose
. $tBClose;
} }
push @ret, $tClose . $blockClose;
unshift @ret, unshift @ret,
'<a name="prereqResultTOP"></a><h2>' $blockOpen
. $blockClose
. ( $html ? '<a name="prereqResultTOP"></a>' : '' )
. $blockOpen
. $tTitleOpen
. ( $mode eq 'live' ? 'Live ' : '' ) . ( $mode eq 'live' ? 'Live ' : '' )
. 'System Prerequisites Check</h2>'; . 'System Prerequisites Check'
. $tTitleClose
. $tOpen;
return $header . join( "\n", @ret ) . $footer; return $header . join( "\n", @ret ) . $footer;
} }
@ -1267,20 +1321,39 @@ sub CreateSearchList ($$@) {
my $html = my $html =
defined( $hash->{CL} ) && $hash->{CL}{TYPE} eq "FHEMWEB" ? 1 : 0; defined( $hash->{CL} ) && $hash->{CL}{TYPE} eq "FHEMWEB" ? 1 : 0;
my $FW_CSRF = (
defined( $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} )
? '&fwcsrf=' . $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN}
: ''
);
my $FW_CSRF_input =
defined( $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} )
? '<input type="hidden" name="fwcsrf" value="'
. $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} . '">'
: '';
my $header = ''; my $header = '';
my $footer = ''; my $footer = '';
if ($html) { if ($html) {
$header = $header =
'<html><table><tr><td><div class="detLink installerBack" style="float:right"><a href="?detail=' '<html><div class="detLink installerBack" style="float:right"><a href="?detail='
. $hash->{NAME} . $hash->{NAME}
. '">&larr; back to FHEM Installer</a></div>'; . '">&larr; back to FHEM Installer</a></div>';
$footer = '</td></tr></table></html>'; $footer = '</html>';
} }
my $tOpen = '';
my $blockOpen = ''; my $blockOpen = '';
my $tTitleOpen = ''; my $tTitleOpen = '';
my $tTitleClose = ''; my $tTitleClose = '';
my $tOpen = '';
my $tCOpen = '';
my $tCClose = '';
my $tHOpen = '';
my $tHClose = '';
my $tBOpen = '';
my $tBClose = '';
my $tFOpen = '';
my $tFClose = '';
my $trOpen = ''; my $trOpen = '';
my $trOpenEven = ''; my $trOpenEven = '';
my $trOpenOdd = ''; my $trOpenOdd = '';
@ -1290,8 +1363,8 @@ sub CreateSearchList ($$@) {
my $tdOpen = ''; my $tdOpen = '';
my $tdOpen2 = ''; my $tdOpen2 = '';
my $tdOpen3 = ''; my $tdOpen3 = '';
my $txtOpen = ''; my $strongOpen = '';
my $txtClose = ''; my $strongClose = '';
my $tdClose = "\t\t\t"; my $tdClose = "\t\t\t";
my $thClose = "\t\t\t"; my $thClose = "\t\t\t";
my $trClose = ''; my $trClose = '';
@ -1302,28 +1375,38 @@ sub CreateSearchList ($$@) {
my $colorClose = ''; my $colorClose = '';
if ($html) { if ($html) {
$blockOpen = '<div class="makeTable wide readings">'; $blockOpen = '<div class="makeTable wide internals">';
$tTitleOpen = '<span class="mkTitle">'; $tTitleOpen = '<span class="mkTitle">';
$tTitleClose = '</span>'; $tTitleClose = '</span>';
$tOpen = '<table class="block wide">'; $tOpen = '<table class="block wide internals wrapcolumns">';
$tCOpen = '<caption style="text-align: left; font-size: larger;">';
$tCClose = '</caption>';
$tHOpen = '<thead>';
$tHClose = '</thead>';
$tBOpen = '<tbody>';
$tBClose = '</tbody>';
$tFOpen = '<tfoot style="font-size: smaller;">';
$tFClose = '</tfoot>';
$trOpen = '<tr class="column">'; $trOpen = '<tr class="column">';
$trOpenEven = '<tr class="column even">'; $trOpenEven = '<tr class="column even">';
$trOpenOdd = '<tr class="column odd">'; $trOpenOdd = '<tr class="column odd">';
$thOpen = '<th style="text-align:left">'; $thOpen = '<th style="text-align: left; vertical-align: top;">';
$thOpen2 = '<th style="text-align:left" colspan="2">'; $thOpen2 =
$thOpen3 = '<th style="text-align:left" colspan="3">'; '<th style="text-align: left; vertical-align: top;" colspan="2">';
$tdOpen = '<td>'; $thOpen3 =
$tdOpen2 = '<td colspan="2">'; '<th style="text-align: left; vertical-align: top;" colspan="3">';
$tdOpen3 = '<td colspan="3">'; $tdOpen = '<td style="vertical-align: top;">';
$txtOpen = '<b>'; $tdOpen2 = '<td style="vertical-align: top;" colspan="2">';
$txtClose = '</b>'; $tdOpen3 = '<td style="vertical-align: top;" colspan="3">';
$strongOpen = '<strong>';
$strongClose = '</strong>';
$tdClose = '</td>'; $tdClose = '</td>';
$thClose = '</td>'; $thClose = '</td>';
$trClose = '</tr>'; $trClose = '</tr>';
$tClose = '</table>'; $tClose = '</table>';
$blockClose = '</div>'; $blockClose = '</div>';
$colorRed = '<span style="color:red">'; $colorRed = '<span style="color: red">';
$colorGreen = '<span style="color:green">'; $colorGreen = '<span style="color: green">';
$colorClose = '</span>'; $colorClose = '</span>';
} }
@ -1336,11 +1419,18 @@ sub CreateSearchList ($$@) {
) )
); );
my $FW_CSRF = ( # Add search input
defined( $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} ) $header .=
? '&fwcsrf=' . $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} '<form id="fhemsearch" method="get" action="?" onsubmit="cmd.value = \'get '
: '' . $hash->{NAME}
); . ' search \'+ q.value">'
. $FW_CSRF_input
. '<input type="hidden" name="cmd" value="">'
. '<label for="q" style="margin-right: 0.5em;">Search:</label>'
. '<input type="text" name="q" id="q" value="'
. $search
. '" autocorrect="off" autocapitalize="off">'
. '</form>';
my $found = 0; my $found = 0;
@ -1358,16 +1448,17 @@ sub CreateSearchList ($$@) {
push @ret, push @ret,
( $html ? '<a name="searchResultDevices"></a>' : '' ) ( $html ? '<a name="searchResultDevices"></a>' : '' )
. $blockOpen . $blockOpen
. $tTitleOpen
. 'Devices'
. $tTitleClose
. $tOpen . $tOpen
. $tCOpen
. 'Devices'
. $tCClose
. $tHOpen
. $trOpen; . $trOpen;
push @ret, $thOpen . 'Device Name' . $thClose; push @ret, $thOpen . 'Device Name' . $thClose;
push @ret, $thOpen . 'Device Type' . $thClose; push @ret, $thOpen . 'Device Type' . $thClose;
push @ret, $thOpen . 'Device State' . $thClose; push @ret, $thOpen . 'Device State' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
} }
$found++; $found++;
$foundDevices++; $foundDevices++;
@ -1420,15 +1511,16 @@ sub CreateSearchList ($$@) {
push @ret, push @ret,
( $html ? '<a name="searchResultModules"></a>' : '' ) ( $html ? '<a name="searchResultModules"></a>' : '' )
. $blockOpen . $blockOpen
. $tTitleOpen
. 'Modules'
. $tTitleClose
. $tOpen . $tOpen
. $tCOpen
. 'Modules'
. $tCClose
. $tHOpen
. $trOpen; . $trOpen;
push @ret, $thOpen . 'Module Name' . $thClose; push @ret, $thOpen . 'Module Name' . $thClose;
push @ret, $thOpen . 'Abstract' . $thClose; push @ret, $thOpen . 'Abstract' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
} }
$found++; $found++;
$foundModules++; $foundModules++;
@ -1472,15 +1564,16 @@ sub CreateSearchList ($$@) {
push @ret, push @ret,
( $html ? '<a name="searchResultPackages"></a>' : '' ) ( $html ? '<a name="searchResultPackages"></a>' : '' )
. $blockOpen . $blockOpen
. $tTitleOpen
. 'Packages'
. $tTitleClose
. $tOpen . $tOpen
. $tCOpen
. 'Packages'
. $tCClose
. $tHOpen
. $trOpen; . $trOpen;
push @ret, $thOpen . 'Package Name' . $thClose; push @ret, $thOpen . 'Package Name' . $thClose;
push @ret, $thOpen . 'Abstract' . $thClose; push @ret, $thOpen . 'Abstract' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
} }
$found++; $found++;
$foundPackages++; $foundPackages++;
@ -1529,14 +1622,14 @@ sub CreateSearchList ($$@) {
my $descr = FHEM::Meta::GetKeywordDesc( $keyword, $lang ); my $descr = FHEM::Meta::GetKeywordDesc( $keyword, $lang );
push @ret, $blockOpen; push @ret, $blockOpen . $tOpen;
if ($html) { if ($html) {
push @ret, push @ret,
'<span class="mkTitle"' '<caption style="text-align: left; font-size: larger;"'
. ( $descr ne '' ? ' title="' . $descr . '"' : '' ) . '># ' . ( $descr ne '' ? ' title="' . $descr . '"' : '' ) . '># '
. $keyword . $keyword
. $tTitleClose; . $tCClose;
} }
else { else {
push @ret, '# ' . $keyword; push @ret, '# ' . $keyword;
@ -1547,7 +1640,7 @@ sub CreateSearchList ($$@) {
packages packages
); );
push @ret, $tOpen . $trOpen; push @ret, $tHOpen . $trOpen;
push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Name' . $thClose;
@ -1555,7 +1648,7 @@ sub CreateSearchList ($$@) {
push @ret, $thOpen . 'Abstract' . $thClose; push @ret, $thOpen . 'Abstract' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
foreach my $mAttr (@mAttrs) { foreach my $mAttr (@mAttrs) {
next next
@ -1623,17 +1716,18 @@ sub CreateSearchList ($$@) {
unless ($foundMaintainers) { unless ($foundMaintainers) {
push @ret, push @ret,
$blockOpen $blockOpen
. $tTitleOpen . $tOpen
. $tCOpen
. ( $html ? '<a name="searchResultMaintainers"></a>' : '' ) . ( $html ? '<a name="searchResultMaintainers"></a>' : '' )
. 'Authors & Maintainers' . 'Authors & Maintainers'
. $tTitleClose . $tCClose
. $tOpen . $tHOpen
. $trOpen; . $trOpen;
push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Name' . $thClose;
push @ret, $thOpen . 'Modules' . $thClose; push @ret, $thOpen . 'Modules' . $thClose;
push @ret, $thOpen . 'Packages' . $thClose; push @ret, $thOpen . 'Packages' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
} }
$found++; $found++;
$foundMaintainers++; $foundMaintainers++;
@ -1715,16 +1809,17 @@ sub CreateSearchList ($$@) {
unless ($foundPerl) { unless ($foundPerl) {
push @ret, push @ret,
$blockOpen $blockOpen
. $tTitleOpen . $tOpen
. $tCOpen
. ( $html ? '<a name="searchResultPerl"></a>' : '' ) . ( $html ? '<a name="searchResultPerl"></a>' : '' )
. 'Perl Packages' . 'Perl Packages'
. $tTitleClose . $tCClose
. $tOpen . $tHOpen
. $trOpen; . $trOpen;
push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Name' . $thClose;
push @ret, $thOpen . 'Referenced from' . $thClose; push @ret, $thOpen . 'Referenced from' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
} }
$found++; $found++;
$foundPerl++; $foundPerl++;
@ -1868,15 +1963,20 @@ sub CreateSearchList ($$@) {
$found . ' total search ' . ( $found > 1 ? 'results:' : 'result:' ); $found . ' total search ' . ( $found > 1 ? 'results:' : 'result:' );
} }
else { else {
unshift @ret, 'Nothing found'.$lb.$lb; unshift @ret,
$tOpen
. $trOpenOdd
. $tdOpen
. 'Nothing found'
. $tdClose
. $trClose
. $tClose
. $lb
. $lb;
} }
push @ret, $tdClose . $trClose . $tClose . $blockClose; push @ret, $tdClose . $trClose . $tClose . $blockClose;
$search =~ s/\\s\*/ /g;
unshift @ret,
$blockOpen . $blockClose . $txtOpen.'Search string: '.$txtClose . $search . $lb . $lb;
unshift @ret, unshift @ret,
$blockOpen $blockOpen
. $blockClose . $blockClose
@ -1887,7 +1987,9 @@ sub CreateSearchList ($$@) {
. $tTitleClose . $tTitleClose
. $tOpen . $tOpen
. $trOpen . $trOpen
. $tdOpen; . $tdOpen
. $blockOpen
. $blockClose;
return $header . join( "\n", @ret ) . $footer; return $header . join( "\n", @ret ) . $footer;
} }
@ -1943,16 +2045,24 @@ sub CreateMetadataList ($$$) {
my $footer = ''; my $footer = '';
if ($html) { if ($html) {
$header = $header =
'<html><table><tr><td><div class="detLink installerBack" style="float:right"><a href="?detail=' '<html><div class="detLink installerBack" style="float:right"><a href="?detail='
. $hash->{NAME} . $hash->{NAME}
. '">&larr; back to FHEM Installer</a></div>'; . '">&larr; back to FHEM Installer</a></div>';
$footer = '</td></tr></table></html>'; $footer = '</html>';
} }
my $blockOpen = ''; my $blockOpen = '';
my $tTitleOpen = ''; my $tTitleOpen = '';
my $tTitleClose = ''; my $tTitleClose = '';
my $tOpen = ''; my $tOpen = '';
my $tCOpen = '';
my $tCClose = '';
my $tHOpen = '';
my $tHClose = '';
my $tBOpen = '';
my $tBClose = '';
my $tFOpen = '';
my $tFClose = '';
my $trOpen = ''; my $trOpen = '';
my $trOpenEven = ''; my $trOpenEven = '';
my $trOpenOdd = ''; my $trOpenOdd = '';
@ -1962,8 +2072,8 @@ sub CreateMetadataList ($$$) {
my $tdOpen = ''; my $tdOpen = '';
my $tdOpen2 = ''; my $tdOpen2 = '';
my $tdOpen3 = ''; my $tdOpen3 = '';
my $txtOpen = ''; my $strongOpen = '';
my $txtClose = ''; my $strongClose = '';
my $tdClose = "\t\t\t"; my $tdClose = "\t\t\t";
my $thClose = "\t\t\t"; my $thClose = "\t\t\t";
my $trClose = ''; my $trClose = '';
@ -1974,28 +2084,38 @@ sub CreateMetadataList ($$$) {
my $colorClose = ''; my $colorClose = '';
if ($html) { if ($html) {
$blockOpen = '<div class="makeTable wide readings">'; $blockOpen = '<div class="makeTable wide internals">';
$tTitleOpen = '<span class="mkTitle">'; $tTitleOpen = '<span class="mkTitle">';
$tTitleClose = '</span>'; $tTitleClose = '</span>';
$tOpen = '<table class="block wide readings">'; $tOpen = '<table class="block wide internals wrapcolumns">';
$tCOpen = '<caption style="text-align: left; font-size: larger;">';
$tCClose = '</caption>';
$tHOpen = '<thead>';
$tHClose = '</thead>';
$tBOpen = '<tbody>';
$tBClose = '</tbody>';
$tFOpen = '<tfoot style="font-size: smaller;">';
$tFClose = '</tfoot>';
$trOpen = '<tr class="column">'; $trOpen = '<tr class="column">';
$trOpenEven = '<tr class="column even">'; $trOpenEven = '<tr class="column even">';
$trOpenOdd = '<tr class="column odd">'; $trOpenOdd = '<tr class="column odd">';
$thOpen = '<th style="text-align:left">'; $thOpen = '<th style="text-align: left; vertical-align: top;">';
$thOpen2 = '<th style="text-align:left" colspan="2">'; $thOpen2 =
$thOpen3 = '<th style="text-align:left" colspan="3">'; '<th style="text-align: left; vertical-align: top;" colspan="2">';
$tdOpen = '<td>'; $thOpen3 =
$tdOpen2 = '<td colspan="2">'; '<th style="text-align: left; vertical-align: top;" colspan="3">';
$tdOpen3 = '<td colspan="3">'; $tdOpen = '<td style="vertical-align: top;">';
$txtOpen = '<b>'; $tdOpen2 = '<td style="vertical-align: top;" colspan="2">';
$txtClose = '</b>'; $tdOpen3 = '<td style="vertical-align: top;" colspan="3">';
$strongOpen = '<strong>';
$strongClose = '</strong>';
$tdClose = '</td>'; $tdClose = '</td>';
$thClose = '</th>'; $thClose = '</th>';
$trClose = '</tr>'; $trClose = '</tr>';
$tClose = '</table>'; $tClose = '</table>';
$blockClose = '</div>'; $blockClose = '</div>';
$colorRed = '<span style="color:red">'; $colorRed = '<span style="color: red">';
$colorGreen = '<span style="color:green">'; $colorGreen = '<span style="color: green">';
$colorClose = '</span>'; $colorClose = '</span>';
} }
@ -2683,17 +2803,19 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
} }
push @ret, push @ret,
$trOpen $tFOpen
. $trOpen
. ( . (
$html $html
? '<td style="text-align:right; font-size:.7em;" colspan="2">' ? '<td style="text-align:right;" colspan="2">'
: '' : ''
) )
. 'Based on data generated by ' . 'Based on data generated by '
. $lb . $lb
. $modMeta->{generated_by} . $modMeta->{generated_by}
. $tdClose . $tdClose
. $trClose; . $trClose
. $tFClose;
push @ret, $tClose . $blockClose; push @ret, $tClose . $blockClose;
@ -2746,25 +2868,13 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
. $tTitleClose . $tTitleClose
. $tOpen; . $tOpen;
push @ret, push @ret, $tHOpen . $trOpen;
$trOpen
. $tdOpen2
. $txtOpen . 'Hint:'
. $txtClose
. $lb
. 'Dependents can only be shown here if they were loaded into the metadata cache before.'
. $lb
. $lb
. $tdClose
. $trClose;
push @ret, $trOpen;
push @ret, $thOpen . 'Importance' . $thClose; push @ret, $thOpen . 'Importance' . $thClose;
push @ret, $thOpen . 'Dependent Modules' . $thClose; push @ret, $thOpen . 'Dependent Modules' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose;
} }
my $l = $linecount % 2 == 0 ? $trOpenEven : $trOpenOdd; my $l = $linecount % 2 == 0 ? $trOpenEven : $trOpenOdd;
@ -2783,8 +2893,19 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
$linecount++; $linecount++;
} }
} }
push @ret,
push @ret, $tClose . $lb if ( $linecount > 1 ); $tFOpen
. $trOpen
. $tdOpen2
. $strongOpen . 'Hint:'
. $strongClose
. ' Dependents can only be shown here if they were loaded into the metadata cache before.'
. $tdClose
. $trClose
. $tFClose
. $tClose
. $blockClose
if ( $linecount > 1 );
if ( if (
$modType eq 'module' $modType eq 'module'
@ -2800,9 +2921,22 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
my $linecount = 1; my $linecount = 1;
if ( defined( $modules{$modName}{LOADED} ) ) { if ( defined( $modules{$modName}{LOADED} )
&& $modules{$modName}{LOADED} )
{
my @instances = devspec2array( 'TYPE=' . $modName ); my @instances = devspec2array( 'TYPE=' . $modName );
if ( @instances > 0 ) { if ( @instances > 0 ) {
push @ret,
$tHOpen
. $trOpen
. $thOpen . 'Name'
. $thClose
. $thOpen . 'State'
. $thClose
. $trClose
. $tHClose
. $tBOpen;
foreach my $instance ( sort { "\L$a" cmp "\L$b" } @instances ) { foreach my $instance ( sort { "\L$a" cmp "\L$b" } @instances ) {
next if ( defined( $defs{$instance}{TEMPORARY} ) ); next if ( defined( $defs{$instance}{TEMPORARY} ) );
@ -2821,24 +2955,30 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
push @ret, $l; push @ret, $l;
$linecount++; $linecount++;
} }
push @ret, $tBClose;
} }
else { else {
push @ret, push @ret,
$trOpenOdd $tBOpen
. $trOpen
. $tdOpen . $tdOpen
. 'The module was once loaded into memory, ' . 'The module was once loaded into memory, '
. 'but currently there is no device defined.' . 'but currently there is no device defined.'
. $tdClose . $tdClose
. $trClose; . $trClose
. $tBClose;
} }
} }
else { else {
push @ret, push @ret,
$trOpenOdd $tBOpen
. $trOpen
. $tdOpen . $tdOpen
. 'The module is currently not in use.' . 'The module is currently not in use.'
. $tdClose . $tdClose
. $trClose; . $trClose
. $tBClose;
} }
push @ret, $tClose . $blockClose; push @ret, $tClose . $blockClose;
@ -2855,42 +2995,18 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
. $trOpen . $trOpen
. $tdOpen; . $tdOpen;
push @ret, push @ret, $blockOpen . $tOpen . $tCOpen . 'Perl Packages' . $tCClose;
$blockOpen
. $blockClose
. $blockOpen
. $tTitleOpen
. 'Perl Packages'
. $tTitleClose
. $tOpen;
if ( defined( $modMeta->{prereqs} ) if ( defined( $modMeta->{prereqs} )
&& defined( $modMeta->{prereqs}{runtime} ) ) && defined( $modMeta->{prereqs}{runtime} ) )
{ {
push @ret,
$trOpen
. $tdOpen3
. $txtOpen . 'Hint:'
. $txtClose
. $lb
. 'This module does not provide Perl prerequisites from its metadata.'
. $lb
. 'The following result is based on automatic source code analysis '
. 'and can be incorrect.'
. $lb
. $lb
. $tdClose
. $trClose
if ( defined( $modMeta->{x_prereqs_src} )
&& $modMeta->{x_prereqs_src} ne 'META.json' );
@mAttrs = qw( @mAttrs = qw(
requires requires
recommends recommends
suggests suggests
); );
push @ret, $trOpen; push @ret, $tHOpen . $trOpen;
push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Name' . $thClose;
@ -2898,7 +3014,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
push @ret, $thOpen . 'Status' . $thClose; push @ret, $thOpen . 'Status' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose . $tBOpen;
$linecount = 1; $linecount = 1;
foreach my $mAttr (@mAttrs) { foreach my $mAttr (@mAttrs) {
@ -2938,7 +3054,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
$modMeta->{prereqs}{runtime}{x_inherited}{$prereq} $modMeta->{prereqs}{runtime}{x_inherited}{$prereq}
} }
) )
. '" style="color:grey;">' . '" style="color: grey;">'
. $inherited . $inherited
. '</span>' . '</span>'
if ($html); if ($html);
@ -2985,9 +3101,9 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
{ {
$installed = $installed =
$colorRed $colorRed
. $txtOpen . $strongOpen
. uc($installed) . uc($installed)
. $txtClose . $strongClose
. $colorClose; . $colorClose;
} }
} }
@ -3007,23 +3123,45 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
$linecount++; $linecount++;
} }
} }
push @ret, $tBClose;
push @ret,
$tFOpen
. $trOpenEven
. $tdOpen3
. $strongOpen . 'Hint:'
. $strongClose
. ' The module does not provide Perl prerequisites from its metadata.'
. $lb
. 'This result is based on automatic source code analysis '
. 'and can be incorrect.'
. $tdClose
. $trClose
. $tFClose
if ( defined( $modMeta->{x_prereqs_src} )
&& $modMeta->{x_prereqs_src} ne 'META.json' );
} }
elsif ( defined( $modMeta->{x_prereqs_src} ) ) { elsif ( defined( $modMeta->{x_prereqs_src} ) ) {
push @ret, push @ret,
$trOpenOdd $tBOpen
. $trOpenOdd
. $tdOpen . $tdOpen
. 'No known prerequisites.' . 'No known prerequisites.'
. $tdClose . $tdClose
. $trClose; . $trClose
. $tBClose;
} }
else { else {
push @ret, push @ret,
$trOpenOdd $tBOpen
. $trOpenOdd
. $tdOpen . $tdOpen
. 'Module metadata do not contain any prerequisites.' . "\n" . 'Module metadata do not contain any prerequisites.' . "\n"
. 'For automatic source code analysis, please install Perl::PrereqScanner::NotQuiteLite first.' . 'For automatic source code analysis, please install Perl::PrereqScanner::NotQuiteLite first.'
. $tdClose . $tdClose
. $trClose; . $trClose
. $tBClose;
} }
push @ret, $tClose . $blockClose; push @ret, $tClose . $blockClose;
@ -3031,7 +3169,12 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
&& defined( $modMeta->{x_prereqs_nodejs}{runtime} ) ) && defined( $modMeta->{x_prereqs_nodejs}{runtime} ) )
{ {
push @ret, push @ret,
$blockOpen . $tTitleOpen . 'Node.js Packages' . $tTitleClose . $tOpen; $blockOpen
. $tTitleClose
. $tOpen
. $tCOpen
. 'Node.js Packages'
. $tCClose;
my @mAttrs = qw( my @mAttrs = qw(
requires requires
@ -3039,7 +3182,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
suggests suggests
); );
push @ret, $trOpen; push @ret, $tHOpen . $trOpen;
push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Name' . $thClose;
@ -3047,7 +3190,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
push @ret, $thOpen . 'Status' . $thClose; push @ret, $thOpen . 'Status' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose . $tBOpen;
$linecount = 1; $linecount = 1;
foreach my $mAttr (@mAttrs) { foreach my $mAttr (@mAttrs) {
@ -3128,14 +3271,13 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
} }
} }
push @ret, $tClose . $blockClose; push @ret, $tBClose . $tClose . $blockClose;
} }
if ( defined( $modMeta->{x_prereqs_python} ) if ( defined( $modMeta->{x_prereqs_python} )
&& defined( $modMeta->{x_prereqs_python}{runtime} ) ) && defined( $modMeta->{x_prereqs_python}{runtime} ) )
{ {
push @ret, push @ret, $blockOpen . $tOpen . $tCOpen . 'Python Packages' . $tCClose;
$blockOpen . $tTitleOpen . 'Python Packages' . $tTitleClose . $tOpen;
my @mAttrs = qw( my @mAttrs = qw(
requires requires
@ -3143,7 +3285,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
suggests suggests
); );
push @ret, $trOpen; push @ret, $tHOpen . $trOpen;
push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Name' . $thClose;
@ -3151,7 +3293,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
push @ret, $thOpen . 'Status' . $thClose; push @ret, $thOpen . 'Status' . $thClose;
push @ret, $trClose; push @ret, $trClose . $tHClose . $tBOpen;
$linecount = 1; $linecount = 1;
foreach my $mAttr (@mAttrs) { foreach my $mAttr (@mAttrs) {
@ -3257,7 +3399,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/
} }
} }
push @ret, $tClose . $blockClose; push @ret, $tBClose . $tClose . $blockClose;
} }
push @ret, $tdClose . $trClose . $tClose . $blockClose; push @ret, $tdClose . $trClose . $tClose . $blockClose;
@ -3872,10 +4014,10 @@ sub __aUniq {
Installer Installer
</h3> </h3>
<ul> <ul>
<u><b>Installer - Module to update FHEM, install 3rd-party FHEM modules and manage system prerequisites</b></u><br> <u><strong>Installer - Module to update FHEM, install 3rd-party FHEM modules and manage system prerequisites</strong></u><br>
<br> <br>
<br> <br>
<a name="Installerdefine" id="Installerdefine"></a><b>Define</b><br> <a name="Installerdefine" id="Installerdefine"></a><strong>Define</strong><br>
<ul> <ul>
<code>define &lt;name&gt; Installer</code><br> <code>define &lt;name&gt; Installer</code><br>
<br> <br>
@ -3885,7 +4027,7 @@ sub __aUniq {
</ul><br> </ul><br>
</ul><br> </ul><br>
<br> <br>
<a name="Installerget" id="Installerget"></a><b>Get</b> <a name="Installerget" id="Installerget"></a><strong>Get</strong>
<ul> <ul>
<li>checkPrereqs - list all missing prerequisites. If no parameter was given, the running live system will be inspected. If the parameter is a FHEM cfg file, inspection will be based on devices from this file. If the parameter is a list of module names, those will be used for inspection. <li>checkPrereqs - list all missing prerequisites. If no parameter was given, the running live system will be inspected. If the parameter is a FHEM cfg file, inspection will be based on devices from this file. If the parameter is a list of module names, those will be used for inspection.
</li> </li>
@ -3901,7 +4043,7 @@ sub __aUniq {
</li> </li>
</ul><br> </ul><br>
<br> <br>
<a name="Installerattribut" id="Installerattribut"></a><b>Attributes</b> <a name="Installerattribut" id="Installerattribut"></a><strong>Attributes</strong>
<ul> <ul>
<li>disable - disables the device <li>disable - disables the device
</li> </li>
@ -3939,7 +4081,7 @@ sub __aUniq {
"abstract": "Modul zum Update von FHEM, zur Installation von Drittanbieter FHEM Modulen und der Verwaltung von Systemvoraussetzungen" "abstract": "Modul zum Update von FHEM, zur Installation von Drittanbieter FHEM Modulen und der Verwaltung von Systemvoraussetzungen"
} }
}, },
"version": "v0.3.7", "version": "v0.3.8",
"release_status": "testing", "release_status": "testing",
"author": [ "author": [
"Julian Pawlowski <julian.pawlowski@gmail.com>" "Julian Pawlowski <julian.pawlowski@gmail.com>"