commandref_modular.pl 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #!/usr/bin/perl
  2. # $Id: commandref_modular.pl 15989 2018-01-25 15:30:37Z rudolfkoenig $
  3. use strict;
  4. use warnings;
  5. my $protVersion=1;
  6. my @lang = ("EN", "DE");
  7. my $modDir = "FHEM";
  8. my $now = time();
  9. for my $lang (@lang) {
  10. my $sfx = ($lang eq "EN" ? "" : "_$lang");
  11. my %modData;
  12. my $cmdref = "docs/commandref_frame$sfx.html";
  13. open(FH, $cmdref) || die("Cant open $cmdref: $!\n");
  14. my $type = "";
  15. my $fileVersion = 0;
  16. while(my $l = <FH>) {
  17. if($l =~ m/<!-- header:(.*) -->/) {
  18. $type = $1; next;
  19. }
  20. if($type && $l =~ m/<a href="#([^"]+).*<!--(.*)-->/) {
  21. $modData{$1}{type} = $type;
  22. $modData{$1}{"summary$sfx"} = $2;
  23. $modData{$1}{ts} = $now;
  24. } else {
  25. $type = "";
  26. }
  27. }
  28. close(FH);
  29. $cmdref = "docs/commandref${sfx}.html";
  30. if(open(FH, $cmdref)) {
  31. my $cmptime = (stat($cmdref))[9];
  32. my $type = "device";
  33. while(my $l = <FH>) {
  34. $type = $1 if($l =~ m,<!-- header:(.*) -->,);
  35. $fileVersion = $1 if($type && $l =~ m/<table.*protVersion='(.*)'>/);
  36. if($l =~ m,<td class='modname'><a href='#'>(.*)</a></td><td>(.*)</td>, &&
  37. !$modData{$1}{type}) { # commandref_frame has prio
  38. $modData{$1}{type} = $type;
  39. $modData{$1}{"summary$sfx"} = $2;
  40. $modData{$1}{ts} = $cmptime;
  41. }
  42. if($l =~ m,<div id='modLinks'[^>]*> ([^<]+)</div>,) {
  43. for my $ml (split(" ", $1)) {
  44. my @kv=split(/[:,]/,$ml);
  45. my $n = shift(@kv);
  46. for my $v (@kv) {
  47. $modData{$n}{modLinks}{$v} = 1;
  48. }
  49. }
  50. }
  51. }
  52. close(FH);
  53. }
  54. opendir(DH, $modDir) || die "Cant open $modDir: $!\n";
  55. while(my $fName = readdir DH) {
  56. next if($fName !~ m/^\d\d_(.*)\.pm$/);
  57. my $mName = $1;
  58. my $ts = (stat("$modDir/$fName"))[9];
  59. if($protVersion != $fileVersion ||
  60. !$modData{$mName} || !$modData{$mName}{ts} || $modData{$mName}{ts}<$ts) {
  61. #print "Checking $fName for $lang short description\n";
  62. $modData{$mName}{type}="device" if(!$modData{$mName}{type});
  63. delete($modData{$mName}{modLinks});
  64. open(FH, "$modDir/$fName") || die("Cant open $modDir/$fName: $!\n");
  65. while(my $l = <FH>) {
  66. $modData{$mName}{type}=$1 if($l =~ m/^=item\s+(helper|command|device)/);
  67. $modData{$mName}{$1} =$2 if($l =~ m/^=item\s+(summary[^ ]*)\s(.*)$/);
  68. $modData{$mName}{modLinks}{$1} = 1
  69. if($l =~ m/<a\s+name=['"]([^ '"]+)['"]>/);
  70. }
  71. close(FH);
  72. }
  73. }
  74. closedir(DH);
  75. $cmdref = "docs/commandref_frame${sfx}.html";
  76. open(IN, $cmdref) || die("Cant open $cmdref: $!\n");
  77. $cmdref = ">docs/commandref${sfx}.html";
  78. open(OUT, $cmdref) || die("Cant open $cmdref: $!\n");
  79. my $linkDumped = 0;
  80. while(my $l = <IN>) {
  81. print OUT $l;
  82. if($l =~ m,\s*<title>,) {
  83. print OUT << 'EOF'
  84. <script type="text/javascript" src="../pgm2/jquery.min.js"></script>
  85. <script type="text/javascript" src="../pgm2/fhemdoc_modular.js"></script>
  86. EOF
  87. }
  88. if($l =~ m,<!-- header:(.*) -->,) {
  89. my @mList = sort {uc($a) cmp uc($b)} keys %modData;
  90. if(!$linkDumped) {
  91. my $ml = "";
  92. for my $m (@mList) {
  93. next if(!$modData{$m}{modLinks});
  94. $ml .= " $m:".join(",", keys(%{$modData{$m}{modLinks}}));
  95. }
  96. print OUT "<div id='modLinks' style='display:none'>$ml</div>\n";
  97. $linkDumped = 1;
  98. }
  99. my $type = $1;
  100. while(my $l = <IN>) {
  101. last if($l !~ m/<a href="/);
  102. }
  103. print OUT "<table class='block summary class_$type' ".
  104. "protVersion='$protVersion'>\n";
  105. my $rc = "odd";
  106. for my $m (@mList) {
  107. next if(!$modData{$m}{type} || $modData{$m}{type} ne $type);
  108. my $d = $modData{$m}{"summary$sfx"};
  109. if(!$d) {
  110. my $osfx = ($lang eq "DE" ? "" : "_DE");
  111. $d = $modData{$m}{"summary$sfx"};
  112. if(!$d) {
  113. $d = "keine Kurzbeschreibung vorhanden" if($lang eq "DE");
  114. $d = "no short description available" if($lang eq "EN");
  115. }
  116. }
  117. print OUT "<tr class='$rc'><td class='modname'><a href='#'>$m</a></td>".
  118. "<td>$d</td><tr>\n";
  119. $rc = ($rc eq "odd" ? "even" : "odd");
  120. }
  121. print OUT "</table>\n";
  122. }
  123. }
  124. close(OUT);
  125. close(IN);
  126. }