From 2a60f8cf148054115ca82e30e75bb3aab2405239 Mon Sep 17 00:00:00 2001 From: jpawlowski Date: Mon, 1 Apr 2019 15:31:03 +0000 Subject: [PATCH] 98_Installer: use table headers and footers git-svn-id: https://svn.fhem.de/fhem/trunk@19083 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_Installer.pm | 532 ++++++++++++++++++++++++-------------- 1 file changed, 337 insertions(+), 195 deletions(-) diff --git a/fhem/FHEM/98_Installer.pm b/fhem/FHEM/98_Installer.pm index bc6c5592b..a75309e5d 100644 --- a/fhem/FHEM/98_Installer.pm +++ b/fhem/FHEM/98_Installer.pm @@ -956,14 +956,22 @@ sub CreatePrereqsList { my $header = ''; my $footer = ''; if ($html) { - $header = '
'; - $footer = '
'; + $header = ''; + $footer = ''; } - my $tOpen = ''; my $blockOpen = ''; my $tTitleOpen = ''; my $tTitleClose = ''; + my $tOpen = ''; + my $tCOpen = ''; + my $tCClose = ''; + my $tHOpen = ''; + my $tHClose = ''; + my $tBOpen = ''; + my $tBClose = ''; + my $tFOpen = ''; + my $tFClose = ''; my $trOpen = ''; my $trOpenEven = ''; my $trOpenOdd = ''; @@ -973,8 +981,8 @@ sub CreatePrereqsList { my $tdOpen = ''; my $tdOpen2 = ''; my $tdOpen3 = ''; - my $txtOpen = ''; - my $txtClose = ''; + my $strongOpen = ''; + my $strongClose = ''; my $tdClose = "\t\t\t"; my $thClose = "\t\t\t"; my $trClose = ''; @@ -985,28 +993,38 @@ sub CreatePrereqsList { my $colorClose = ''; if ($html) { - $blockOpen = '
'; + $blockOpen = '
'; $tTitleOpen = ''; $tTitleClose = ''; - $tOpen = ''; + $tOpen = '
'; + $tCOpen = ''; + $tHOpen = ''; + $tHClose = ''; + $tBOpen = ''; + $tBClose = ''; + $tFOpen = ''; + $tFClose = ''; $trOpen = ''; $trOpenEven = ''; $trOpenOdd = ''; - $thOpen = ''; $thClose = ''; $trClose = ''; $tClose = '
'; + $tCClose = '
'; - $thOpen2 = ''; - $thOpen3 = ''; - $tdOpen = ''; - $tdOpen2 = ''; - $tdOpen3 = ''; - $txtOpen = ''; - $txtClose = ''; + $thOpen = ''; + $thOpen2 = + ''; + $thOpen3 = + ''; + $tdOpen = ''; + $tdOpen2 = ''; + $tdOpen3 = ''; + $strongOpen = ''; + $strongClose = ''; $tdClose = '
'; $blockClose = '
'; - $colorRed = ''; - $colorGreen = ''; + $colorRed = ''; + $colorGreen = ''; $colorClose = ''; } @@ -1135,56 +1153,68 @@ sub CreatePrereqsList { $l .= $trClose; 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, - '' + : '' + ) + . $blockOpen + . $tOpen + . $tCOpen . $importance - . '">

' - . $importance . '

' - . $lb - . $descr - . $lb - . $lb; - push @ret, $tOpen . $trOpen; + . $tCClose; + + push @ret, $tHOpen . $trOpen; push @ret, $thOpen . 'Item' . $thClose; push @ret, $thOpen . 'Type' . $thClose; push @ret, $thOpen . 'Used by' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose . $tBOpen; } push @ret, $l; $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) { + push @ret, $tBClose; + if ( defined( $pkgStatus{Perl}{analyzed} ) ) { push @ret, - $lb - . $txtOpen . 'Hint:' - . $txtClose + $tFOpen + . $trOpen + . $tdOpen + . $strongOpen . 'Hint:' + . $strongClose . ' Some of the FHEM modules in use do not provide Perl prerequisites from its metadata.' . $lb; @@ -1197,8 +1227,12 @@ sub CreatePrereqsList { push @ret, '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, $lb . $space @@ -1233,6 +1267,9 @@ sub CreatePrereqsList { $found . ' total missing ' . ( $found > 1 ? 'prerequisites:' : 'prerequisite:' ); + + unshift @ret, $blockOpen . $blockClose; + unshift @ret, $tBOpen . $trOpen . $tdOpen; } else { my @hooray = ( @@ -1241,15 +1278,32 @@ sub CreatePrereqsList { ); my $x = 0 + int( rand( scalar @hooray + 1 - 0 ) ); unshift @ret, - ucfirst( $hooray[$x] ) + $tBOpen + . $trOpen + . $tdOpen + . $lb + . ucfirst( $hooray[$x] ) . '! All prerequisites are met.' - . ( $html ? ' 🥳' : '' ); + . ( $html ? ' 🥳' : '' ) + . $lb + . $lb + . $tdClose + . $trClose + . $tBClose; } + push @ret, $tClose . $blockClose; + unshift @ret, - '

' + $blockOpen + . $blockClose + . ( $html ? '' : '' ) + . $blockOpen + . $tTitleOpen . ( $mode eq 'live' ? 'Live ' : '' ) - . 'System Prerequisites Check

'; + . 'System Prerequisites Check' + . $tTitleClose + . $tOpen; return $header . join( "\n", @ret ) . $footer; } @@ -1267,20 +1321,39 @@ sub CreateSearchList ($$@) { my $html = 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} ) + ? '' + : ''; + my $header = ''; my $footer = ''; if ($html) { $header = -'
'; - $footer = '
'; + $footer = ''; } - my $tOpen = ''; my $blockOpen = ''; my $tTitleOpen = ''; my $tTitleClose = ''; + my $tOpen = ''; + my $tCOpen = ''; + my $tCClose = ''; + my $tHOpen = ''; + my $tHClose = ''; + my $tBOpen = ''; + my $tBClose = ''; + my $tFOpen = ''; + my $tFClose = ''; my $trOpen = ''; my $trOpenEven = ''; my $trOpenOdd = ''; @@ -1290,8 +1363,8 @@ sub CreateSearchList ($$@) { my $tdOpen = ''; my $tdOpen2 = ''; my $tdOpen3 = ''; - my $txtOpen = ''; - my $txtClose = ''; + my $strongOpen = ''; + my $strongClose = ''; my $tdClose = "\t\t\t"; my $thClose = "\t\t\t"; my $trClose = ''; @@ -1302,28 +1375,38 @@ sub CreateSearchList ($$@) { my $colorClose = ''; if ($html) { - $blockOpen = '
'; + $blockOpen = '
'; $tTitleOpen = ''; $tTitleClose = ''; - $tOpen = ''; + $tOpen = '
'; + $tCOpen = ''; + $tHOpen = ''; + $tHClose = ''; + $tBOpen = ''; + $tBClose = ''; + $tFOpen = ''; + $tFClose = ''; $trOpen = ''; $trOpenEven = ''; $trOpenOdd = ''; - $thOpen = ''; $thClose = ''; $trClose = ''; $tClose = '
'; + $tCClose = '
'; - $thOpen2 = ''; - $thOpen3 = ''; - $tdOpen = ''; - $tdOpen2 = ''; - $tdOpen3 = ''; - $txtOpen = ''; - $txtClose = ''; + $thOpen = ''; + $thOpen2 = + ''; + $thOpen3 = + ''; + $tdOpen = ''; + $tdOpen2 = ''; + $tdOpen3 = ''; + $strongOpen = ''; + $strongClose = ''; $tdClose = '
'; $blockClose = '
'; - $colorRed = ''; - $colorGreen = ''; + $colorRed = ''; + $colorGreen = ''; $colorClose = ''; } @@ -1336,11 +1419,18 @@ sub CreateSearchList ($$@) { ) ); - my $FW_CSRF = ( - defined( $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} ) - ? '&fwcsrf=' . $defs{ $hash->{CL}{SNAME} }{CSRFTOKEN} - : '' - ); + # Add search input + $header .= +'
' + . $FW_CSRF_input + . '' + . '' + . '' + . '
'; my $found = 0; @@ -1358,16 +1448,17 @@ sub CreateSearchList ($$@) { push @ret, ( $html ? '' : '' ) . $blockOpen - . $tTitleOpen - . 'Devices' - . $tTitleClose . $tOpen + . $tCOpen + . 'Devices' + . $tCClose + . $tHOpen . $trOpen; push @ret, $thOpen . 'Device Name' . $thClose; push @ret, $thOpen . 'Device Type' . $thClose; push @ret, $thOpen . 'Device State' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; } $found++; $foundDevices++; @@ -1420,15 +1511,16 @@ sub CreateSearchList ($$@) { push @ret, ( $html ? '' : '' ) . $blockOpen - . $tTitleOpen - . 'Modules' - . $tTitleClose . $tOpen + . $tCOpen + . 'Modules' + . $tCClose + . $tHOpen . $trOpen; push @ret, $thOpen . 'Module Name' . $thClose; push @ret, $thOpen . 'Abstract' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; } $found++; $foundModules++; @@ -1472,15 +1564,16 @@ sub CreateSearchList ($$@) { push @ret, ( $html ? '' : '' ) . $blockOpen - . $tTitleOpen - . 'Packages' - . $tTitleClose . $tOpen + . $tCOpen + . 'Packages' + . $tCClose + . $tHOpen . $trOpen; push @ret, $thOpen . 'Package Name' . $thClose; push @ret, $thOpen . 'Abstract' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; } $found++; $foundPackages++; @@ -1529,14 +1622,14 @@ sub CreateSearchList ($$@) { my $descr = FHEM::Meta::GetKeywordDesc( $keyword, $lang ); - push @ret, $blockOpen; + push @ret, $blockOpen . $tOpen; if ($html) { push @ret, - '# ' . $keyword - . $tTitleClose; + . $tCClose; } else { push @ret, '# ' . $keyword; @@ -1547,7 +1640,7 @@ sub CreateSearchList ($$@) { packages ); - push @ret, $tOpen . $trOpen; + push @ret, $tHOpen . $trOpen; push @ret, $thOpen . 'Name' . $thClose; @@ -1555,7 +1648,7 @@ sub CreateSearchList ($$@) { push @ret, $thOpen . 'Abstract' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; foreach my $mAttr (@mAttrs) { next @@ -1623,17 +1716,18 @@ sub CreateSearchList ($$@) { unless ($foundMaintainers) { push @ret, $blockOpen - . $tTitleOpen + . $tOpen + . $tCOpen . ( $html ? '' : '' ) . 'Authors & Maintainers' - . $tTitleClose - . $tOpen + . $tCClose + . $tHOpen . $trOpen; push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Modules' . $thClose; push @ret, $thOpen . 'Packages' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; } $found++; $foundMaintainers++; @@ -1715,16 +1809,17 @@ sub CreateSearchList ($$@) { unless ($foundPerl) { push @ret, $blockOpen - . $tTitleOpen + . $tOpen + . $tCOpen . ( $html ? '' : '' ) . 'Perl Packages' - . $tTitleClose - . $tOpen + . $tCClose + . $tHOpen . $trOpen; push @ret, $thOpen . 'Name' . $thClose; push @ret, $thOpen . 'Referenced from' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; } $found++; $foundPerl++; @@ -1868,15 +1963,20 @@ sub CreateSearchList ($$@) { $found . ' total search ' . ( $found > 1 ? 'results:' : 'result:' ); } 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; - $search =~ s/\\s\*/ /g; - unshift @ret, - $blockOpen . $blockClose . $txtOpen.'Search string: '.$txtClose . $search . $lb . $lb; - unshift @ret, $blockOpen . $blockClose @@ -1887,7 +1987,9 @@ sub CreateSearchList ($$@) { . $tTitleClose . $tOpen . $trOpen - . $tdOpen; + . $tdOpen + . $blockOpen + . $blockClose; return $header . join( "\n", @ret ) . $footer; } @@ -1943,16 +2045,24 @@ sub CreateMetadataList ($$$) { my $footer = ''; if ($html) { $header = -'
'; - $footer = '
'; + $footer = ''; } my $blockOpen = ''; my $tTitleOpen = ''; my $tTitleClose = ''; my $tOpen = ''; + my $tCOpen = ''; + my $tCClose = ''; + my $tHOpen = ''; + my $tHClose = ''; + my $tBOpen = ''; + my $tBClose = ''; + my $tFOpen = ''; + my $tFClose = ''; my $trOpen = ''; my $trOpenEven = ''; my $trOpenOdd = ''; @@ -1962,8 +2072,8 @@ sub CreateMetadataList ($$$) { my $tdOpen = ''; my $tdOpen2 = ''; my $tdOpen3 = ''; - my $txtOpen = ''; - my $txtClose = ''; + my $strongOpen = ''; + my $strongClose = ''; my $tdClose = "\t\t\t"; my $thClose = "\t\t\t"; my $trClose = ''; @@ -1974,28 +2084,38 @@ sub CreateMetadataList ($$$) { my $colorClose = ''; if ($html) { - $blockOpen = '
'; + $blockOpen = '
'; $tTitleOpen = ''; $tTitleClose = ''; - $tOpen = ''; + $tOpen = '
'; + $tCOpen = ''; + $tHOpen = ''; + $tHClose = ''; + $tBOpen = ''; + $tBClose = ''; + $tFOpen = ''; + $tFClose = ''; $trOpen = ''; $trOpenEven = ''; $trOpenOdd = ''; - $thOpen = ''; $thClose = ''; $trClose = ''; $tClose = '
'; + $tCClose = '
'; - $thOpen2 = ''; - $thOpen3 = ''; - $tdOpen = ''; - $tdOpen2 = ''; - $tdOpen3 = ''; - $txtOpen = ''; - $txtClose = ''; + $thOpen = ''; + $thOpen2 = + ''; + $thOpen3 = + ''; + $tdOpen = ''; + $tdOpen2 = ''; + $tdOpen3 = ''; + $strongOpen = ''; + $strongClose = ''; $tdClose = '
'; $blockClose = '
'; - $colorRed = ''; - $colorGreen = ''; + $colorRed = ''; + $colorGreen = ''; $colorClose = ''; } @@ -2683,17 +2803,19 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ } push @ret, - $trOpen + $tFOpen + . $trOpen . ( $html - ? '' + ? '' : '' ) . 'Based on data generated by ' . $lb . $modMeta->{generated_by} . $tdClose - . $trClose; + . $trClose + . $tFClose; push @ret, $tClose . $blockClose; @@ -2746,25 +2868,13 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ . $tTitleClose . $tOpen; - push @ret, - $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 . $trOpen; push @ret, $thOpen . 'Importance' . $thClose; push @ret, $thOpen . 'Dependent Modules' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose; } my $l = $linecount % 2 == 0 ? $trOpenEven : $trOpenOdd; @@ -2783,8 +2893,19 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ $linecount++; } } - - push @ret, $tClose . $lb if ( $linecount > 1 ); + push @ret, + $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 ( $modType eq 'module' @@ -2800,9 +2921,22 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ my $linecount = 1; - if ( defined( $modules{$modName}{LOADED} ) ) { + if ( defined( $modules{$modName}{LOADED} ) + && $modules{$modName}{LOADED} ) + { my @instances = devspec2array( 'TYPE=' . $modName ); 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 ) { next if ( defined( $defs{$instance}{TEMPORARY} ) ); @@ -2821,24 +2955,30 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ push @ret, $l; $linecount++; } + + push @ret, $tBClose; } else { push @ret, - $trOpenOdd + $tBOpen + . $trOpen . $tdOpen . 'The module was once loaded into memory, ' . 'but currently there is no device defined.' . $tdClose - . $trClose; + . $trClose + . $tBClose; } } else { push @ret, - $trOpenOdd + $tBOpen + . $trOpen . $tdOpen . 'The module is currently not in use.' . $tdClose - . $trClose; + . $trClose + . $tBClose; } push @ret, $tClose . $blockClose; @@ -2855,42 +2995,18 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ . $trOpen . $tdOpen; - push @ret, - $blockOpen - . $blockClose - . $blockOpen - . $tTitleOpen - . 'Perl Packages' - . $tTitleClose - . $tOpen; + push @ret, $blockOpen . $tOpen . $tCOpen . 'Perl Packages' . $tCClose; if ( defined( $modMeta->{prereqs} ) && 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( requires recommends suggests ); - push @ret, $trOpen; + push @ret, $tHOpen . $trOpen; push @ret, $thOpen . 'Name' . $thClose; @@ -2898,7 +3014,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ push @ret, $thOpen . 'Status' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose . $tBOpen; $linecount = 1; foreach my $mAttr (@mAttrs) { @@ -2938,7 +3054,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ $modMeta->{prereqs}{runtime}{x_inherited}{$prereq} } ) - . '" style="color:grey;">' + . '" style="color: grey;">' . $inherited . '' if ($html); @@ -2985,9 +3101,9 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ { $installed = $colorRed - . $txtOpen + . $strongOpen . uc($installed) - . $txtClose + . $strongClose . $colorClose; } } @@ -3007,23 +3123,45 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ $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} ) ) { push @ret, - $trOpenOdd + $tBOpen + . $trOpenOdd . $tdOpen . 'No known prerequisites.' . $tdClose - . $trClose; + . $trClose + . $tBClose; } else { push @ret, - $trOpenOdd + $tBOpen + . $trOpenOdd . $tdOpen . 'Module metadata do not contain any prerequisites.' . "\n" . 'For automatic source code analysis, please install Perl::PrereqScanner::NotQuiteLite first.' . $tdClose - . $trClose; + . $trClose + . $tBClose; } push @ret, $tClose . $blockClose; @@ -3031,7 +3169,12 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ && defined( $modMeta->{x_prereqs_nodejs}{runtime} ) ) { push @ret, - $blockOpen . $tTitleOpen . 'Node.js Packages' . $tTitleClose . $tOpen; + $blockOpen + . $tTitleClose + . $tOpen + . $tCOpen + . 'Node.js Packages' + . $tCClose; my @mAttrs = qw( requires @@ -3039,7 +3182,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ suggests ); - push @ret, $trOpen; + push @ret, $tHOpen . $trOpen; push @ret, $thOpen . 'Name' . $thClose; @@ -3047,7 +3190,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ push @ret, $thOpen . 'Status' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose . $tBOpen; $linecount = 1; 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} ) && defined( $modMeta->{x_prereqs_python}{runtime} ) ) { - push @ret, - $blockOpen . $tTitleOpen . 'Python Packages' . $tTitleClose . $tOpen; + push @ret, $blockOpen . $tOpen . $tCOpen . 'Python Packages' . $tCClose; my @mAttrs = qw( requires @@ -3143,7 +3285,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ suggests ); - push @ret, $trOpen; + push @ret, $tHOpen . $trOpen; push @ret, $thOpen . 'Name' . $thClose; @@ -3151,7 +3293,7 @@ m/^([^<>\n\r]+?)(?:\s+(\(last release only\)))?(?:\s+(?:<(.*)>))?$/ push @ret, $thOpen . 'Status' . $thClose; - push @ret, $trClose; + push @ret, $trClose . $tHClose . $tBOpen; $linecount = 1; 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; @@ -3872,10 +4014,10 @@ sub __aUniq { Installer
    - Installer - Module to update FHEM, install 3rd-party FHEM modules and manage system prerequisites
    + Installer - Module to update FHEM, install 3rd-party FHEM modules and manage system prerequisites


    - Define
    + Define
      define <name> Installer

      @@ -3885,7 +4027,7 @@ sub __aUniq {



- Get + Get
  • 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.
  • @@ -3901,7 +4043,7 @@ sub __aUniq {


- Attributes + Attributes
  • disable - disables the device
  • @@ -3939,7 +4081,7 @@ sub __aUniq { "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", "author": [ "Julian Pawlowski "