source: branches/release-0.3.0-rc1/doc/app/manual/manual2html @ 225

Last change on this file since 225 was 225, checked in by Joachim Langenbach, 11 years ago
  • Property svn:executable set to *
File size: 11.3 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use Getopt::Std;
5our($opt_h, $opt_k);
6getopts('hk');
7
8# /usr/bin/plastex --split-level 2 manual
9# theme=plain - Seperating Look&Feel and Content completely
10
11
12my $cmdPDFLatex                 = "/usr/bin/pdflatex";
13my $cmdPlastex                  = "/usr/bin/plastex";
14my $cmdPlastexArgs      = "--theme=plain --split-level 2";
15
16my $dirLatex = "./latex";
17my $dirPDF = "./pdf";
18my $dirQtAssistant = "./qtassistant";
19my $dirHtml = "./html";
20my $dirTmp = "/tmp/manuals";
21
22# map keywords to titles (can be section, subsection, subsubsection)
23# keywords --> title string
24my %mapKeywords;
25$mapKeywords{'Edit Dialog'} = "Edit Stuff around Medias";
26$mapKeywords{'Setupwizard'} = "Configure MediaDB";
27$mapKeywords{'Add Medium'} = "Add other Mediums to current Medium";
28$mapKeywords{'Settings'} = "Configure MediaDB";
29$mapKeywords{'Plugins'} = "About Plugins";
30$mapKeywords{'External MimeTypes'} = "Handling of external MimeTypes";
31$mapKeywords{'Connect Media Search'} = "Plugins providing Searchproviders and Shops";
32$mapKeywords{'DBBackup'} = "Backup and restore the Database";
33
34if($opt_h){
35  # print Help!
36  showHelp();
37}
38else{
39  if($opt_k){
40                foreach my $key (sort(keys(%mapKeywords))){
41                        print $key ." --> ". $mapKeywords{$key} ."\n";
42                }
43                exit 1;
44        }
45}
46
47# check if all needed apps are there
48my $error = 0;
49if(! -e $cmdPDFLatex){
50        $error = 1;
51        print "Could not find PDFLatex at: ". $cmdPDFLatex ."\n";
52}
53if(! -e $cmdPlastex){
54        $error = 1;
55        print "Could not find plasTex at: ". $cmdPlastex ."\n";
56}
57if($error > 0){
58        exit 0;
59}
60
61print "Search source files at ". $dirLatex ."\n";
62opendir(DIRLATEX, $dirLatex) || die "Could not open directory ". $!;
63my @files;
64while(my $file = readdir(DIRLATEX)){
65        if($file =~ m/([\w\W]+)\.tex$/){
66                push(@files, $1);
67        }
68}
69close DIRLATEX;
70my $laenge = @files;
71if($laenge < 1){
72        exit 1;
73}
74print "  Found ". $laenge ." tex-files\n";
75
76if(! -d $dirTmp ){
77        print "Create ". $dirTmp ." - ";
78        system("mkdir -p ". $dirTmp);
79        if(! -d $dirTmp){
80                print "FAILED\n";
81                exit 1;
82        }
83        print "OK\n";
84}
85
86print "Creating PDF Manuals\n";
87foreach my $file (@files) {
88        print "  ". $file ." - ";
89        system($cmdPDFLatex ." -output-directory=". $dirTmp ." ". $dirLatex ."/". $file ." > /dev/null");
90        system("cp ". $dirTmp ."/". $file .".pdf ". $dirPDF ." > /dev/null 2>&1");
91        if(! -e $dirPDF ."/". $file .".pdf"){
92                print "FAILED\n";
93                exit 1;
94        }
95        print "OK\n";
96}
97
98print "Creating HTML Manuals\n";
99foreach my $file (@files) {
100        print "  ". $file ." - ";
101        my $outDir = $dirHtml ."/". $file;
102        if(! -d $outDir){
103                system("mkdir -p ". $outDir);
104                if(! -d $outDir){
105                        print "FAILED\n    Could not create dir ". $outDir ."\n";
106                        exit 1;
107                }
108        }
109        system($cmdPlastex ." ". $cmdPlastexArgs ." -d ". $dirTmp ." ". $dirLatex ."/". $file ." > /dev/null 2>&1");
110        system("cp ". $dirTmp ."/*.html ". $outDir ." > /dev/null 2>&1");
111        system("cp -a ". $dirTmp ."/images ". $outDir ." > /dev/null 2>&1");
112        system("cp -a ". $dirTmp ."/icons ". $outDir ." > /dev/null 2>&1");
113        system("cp -a ". $dirTmp ."/styles ". $outDir ." > /dev/null 2>&1");
114        if(! -e $outDir ."/index.html"){
115                print "FAILED\n";
116                exit 1;
117        }
118        print "OK\n";
119}
120
121print "Creating QtAssistant help collection project files (qhcp)\n";
122print "  Generate keyword mapping - ";
123my %mapKeywordSite = buildKeywordPageList($dirHtml, \@files);
124if(scalar(keys(%mapKeywords)) != scalar(keys(%mapKeywordSite))){
125        print "FAILED (In: ". scalar(keys(%mapKeywords)) ." Out:". scalar(keys(%mapKeywordSite)) .")\n";
126}
127else{
128        print "OK (Indexes: ". scalar(keys(%mapKeywordSite)) .")\n";
129}
130print "  Generate Qt help project (qhp)\n";
131foreach my $file (@files) {
132        print "    ". $file ."\n";
133       
134        print "      Generate table of contents - ";
135        my $toc = generateTOC($dirHtml ."/". $file ."/index.html");
136        if($toc eq ""){
137                print "FAILED\n";
138                exit 1;
139        }
140        print "OK\n";
141       
142        # we put it into the correspsonding html directory,
143        # to get it independent from path to html directory
144        my $outFile = $dirHtml ."/". $file ."/". $file .".qhp";
145        print "      Generate qhp file - ";
146        my $result = generateQhp($outFile, $toc, \%mapKeywordSite);
147        if($result ne ""){
148                print "FAILED (". $result .")\n";
149                exit 1;
150        }
151        print "OK\n";
152
153        print "      Generate qhcp file - ";
154        my @inFiles = (".". $outFile);
155        $outFile = $dirQtAssistant ."/". $file .".qhcp";
156        my $result = generateQhcp($outFile, \@inFiles,
157                "qthelp://de.pc-webservice-langenbach.mediadb/mediadb/index.html",
158                "about.txt",
159                "../../../../src/mediadb/icons/128x128/mediadb.png"
160        );
161        if($result ne ""){
162                print "FAILED (". $result .")\n";
163                exit 1;
164        }
165        print "OK\n";
166}
167
168
169exit 0;
170
171# print "Copying application icon into image folder\n";
172# system("cp ../../../src/mediadb/icons/128x128/mediadb.png ./". $fileLatex ."/icons/");
173#
174# print "Copying about.txt\n";
175# system("/bin/touch ./". $fileLatex ."/about.txt");
176
177sub generateTOC {
178        my $indexHtml = shift;
179        my $fileList = shift || 0;
180
181        # reading file content (strip out blanks and linebreaks
182        my $content;
183        open(INDEX,'<'.$indexHtml) || die "Can not open file $indexHtml: $!\n";
184        while(<INDEX>){
185                chomp($_);
186                $_ =~ s/^\s+|\s+$//g; 
187                $content .= $_;
188        }
189        close INDEX;
190
191        # find toc part
192        my $toc;
193        if($content =~ m/contents document-contents"><ul>([\w\W]+)<\/ul><\/div>/){
194                $toc = $1;
195        }
196        else{
197                print "Could not find toc-part from ". $indexHtml ."\n";
198                return "";
199        }
200        return parseTOCLayer($toc, 4, $fileList);
201}
202
203sub parseTOCLayer {
204  my $content = shift;
205  my $level = shift || 0;
206        my $fileList = shift || 0;
207  my $result = "";
208
209  # find list entry
210  my $start = 0;
211 
212  while(1){
213    my $regex = qr//;
214
215    $start = index($content, "<li>", $start);
216    if($start == -1){
217      return $result;
218    }
219
220    $start += length("<li>");
221    my $ende = index($content, "</li>", $start);
222    if($ende == -1){
223      return $result;
224    }
225
226    my $entry = substr($content, $start, $ende - $start);
227    if(index($entry, "<ul>") > -1){
228      # we have a submenu, so we must change the regex and the end of content
229      $regex .= qr/<ul>/;
230      $ende = index($content, "</ul></li>", $start);
231      if($ende == -1){
232                                return $result;
233      }
234      $ende += length("</ul>");
235      $entry = substr($content, $start, $ende - $start);
236    }
237
238    if($entry =~ m/<a href=\"([\w\W]+)\">([\w\W]+)<\/a>$regex/){
239                        my $url = $1;
240                        my $title = $2;
241                        chomp($url);
242                        chomp($title);
243                        if($fileList > 0){
244                                $result .= "|". $url;
245                        }
246                        else{
247                                for(my $i = 0; $i < $level; $i++){
248                                        $result .= "    ";
249                                }
250                                $result .= "<section title=\"". $title ."\" ref=\"./". $url ."\">";
251                        }
252
253      # check wether submenu exists
254      if($entry =~ m/<ul>([\w\W]+)<\/ul>/){
255                                if($fileList < 1){
256                                        $result .= "\n";
257                                }
258                                $result .= parseTOCLayer($1, $level + 1, $fileList);
259                                for(my $i = 0; $i < $level; $i++){
260                                        $result .= "    ";
261                                }
262                        }
263                        if($fileList < 1){
264                                $result .= "</section>\n";
265                        }
266    }
267  $start = $ende;
268  }
269
270  return $result;
271}
272
273sub generateQhp {
274        my $outFile = shift;
275        my $toc = shift;
276        my %indexes = %{(shift)};
277       
278        if($toc eq ""){
279                return "TOC should not be empty!";
280        }
281
282        open(OUTPUT, ">". $outFile) || return "Can not open file ". $outFile .": ". $!;
283        # printing header
284        print OUTPUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
285        print OUTPUT "<QtHelpProject version=\"1.0\">\n";
286        print OUTPUT "  <namespace>de.pc-webservice-langenbach.mediadb</namespace>\n";
287        print OUTPUT "  <virtualFolder>mediadb</virtualFolder>\n";
288        print OUTPUT "  <filterSection>\n";
289        print OUTPUT "          <toc>\n";
290        print OUTPUT "                  <section title=\"MediaDB\" ref=\"./index.html\">\n";
291        print OUTPUT $toc;
292        print OUTPUT "                  </section>\n";
293        print OUTPUT "          </toc>\n";
294        print OUTPUT "          <keywords>\n";
295        foreach my $key (keys(%indexes)){
296                print OUTPUT "                  <keyword name=\"". $key ."\" ref=\"". $indexes{$key} ."\"/>\n";
297        }
298        print OUTPUT "          </keywords>\n";
299        print OUTPUT "          <files>\n";
300        print OUTPUT "                  <file>./*.html</file>\n";
301        print OUTPUT "                  <file>./images/*.*</file>\n";
302#       print OUTPUT "                  <file>./icons/*.*</file>\n";
303#       print OUTPUT "                  <file>./styles/*.css</file>\n";
304        print OUTPUT "          </files>\n";
305        print OUTPUT "          </filterSection>\n";
306        print OUTPUT "</QtHelpProject>\n";
307        close OUTPUT;
308        return "";
309}
310
311sub generateQhcp {
312        my $outFile = shift;
313        my @inFiles = @{(shift)};
314        my $startPage = shift;
315        my $aboutFile = shift;
316        my $iconFile = shift;
317
318        my $laenge = @inFiles;
319        if($laenge < 1){
320                return "At least one qhp file is needed!";
321        }
322
323        open(OUTPUT, ">". $outFile) || return "Could not open ". $outFile;
324        print OUTPUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
325        print OUTPUT "<QHelpCollectionProject version=\"1.0\">\n";
326        print OUTPUT "  <assistant>\n";
327        print OUTPUT "          <title>MediaDB</title>\n";
328        print OUTPUT "          <applicationIcon>". $iconFile ."</applicationIcon>\n";
329        print OUTPUT "          <cacheDirectory>PC-Webservice-Langenbach/MediaDB</cacheDirectory>\n";
330        print OUTPUT "          <startPage>". $startPage ."</startPage>\n";
331        print OUTPUT "          <aboutMenuText>\n";
332        print OUTPUT "                  <text>About MediaDB</text>\n";
333        print OUTPUT "          </aboutMenuText>\n";
334        print OUTPUT "          <aboutDialog>\n";
335#       print OUTPUT "                  <file>". $aboutFile ."</file>\n";
336        print OUTPUT "                  <icon>". $iconFile ."</icon>\n";
337        print OUTPUT "          </aboutDialog>\n";
338        print OUTPUT "          <enableDocumentationManager>false</enableDocumentationManager>\n";
339        print OUTPUT "          <enableAddressBar>false</enableAddressBar>\n";
340        print OUTPUT "          <enableFilterFunctionality>false</enableFilterFunctionality>\n";
341        print OUTPUT "  </assistant>\n";
342        print OUTPUT "  <docFiles>\n";
343        print OUTPUT "          <generate>\n";
344        print OUTPUT "                  <file>\n";
345        foreach my $inFile (@inFiles){
346                if($inFile =~ m/([\w\d\s\-_]+)\.qhp$/){
347                        print OUTPUT "                          <input>". $inFile ."</input>\n";
348                        print OUTPUT "                          <output>". $1 .".qch</output>\n";
349                }
350        }
351        print OUTPUT "                  </file>\n";
352        print OUTPUT "          </generate>\n";
353        print OUTPUT "          <register>\n";
354        foreach my $inFile (@inFiles){
355                if($inFile =~ m/([\w\d\s\-_]+)\.qhp$/){
356                        print OUTPUT "                  <file>". $1 .".qch</file>\n";
357                }
358        }
359        print OUTPUT "          </register>\n";
360        print OUTPUT "  </docFiles>\n";
361        print OUTPUT "</QHelpCollectionProject>\n";
362        close OTUPUT;
363       
364        return "";
365}
366
367sub buildKeywordPageList {
368        my $dirHtml = shift;
369        my @inFiles = @{(shift)};
370        my %mapKeywordSite;
371
372        # chossing english version
373        my $inputFile = "";
374        foreach my $inFile (@inFiles){
375                        if($inFile =~ m/_en$/){
376                                $inputFile = $inFile;
377                                last;
378                        }
379                        if(index($inFile, "_") < 0){
380                                $inputFile = $inFile;
381                                last;
382                        }
383        }
384        $dirHtml .= "/". $inputFile;
385        my $indexHtml = $dirHtml ."/index.html";
386        if(! -e $indexHtml){
387                return %mapKeywordSite;
388        }
389
390        # getting a list with all referenced html-files
391        my $fileList = generateTOC($indexHtml,1);
392        if($fileList eq ""){
393                return %mapKeywordSite;
394        }
395        if($fileList =~ m/^\|/){
396                $fileList = substr($fileList, 1, length($fileList));
397        }
398        my @files = split(/\|/, $fileList);
399       
400        # compare, wether a file contains a needed title (h2 or h3)
401        foreach my $file (@files){
402                my $content;
403                open(INDEX,'<'. $dirHtml ."/". $file) || die "Can not open file ". $dirHtml ."/". $file .": $!\n";
404                while(<INDEX>){
405                        if($_ =~ m/<h[23]{1} id="[\w\W]+">([\w\W]+)<\/h[23]{1}>/){
406                                if($1 =~ m/([\d]{1,2}\.[\d]{1,2}\s)?([\w\W]+)/){
407                                        foreach my $key (keys(%mapKeywords)){
408                                                if($mapKeywords{$key} eq $2){
409                                                        $mapKeywordSite{$key} = "./". $file;
410                                                }
411                                        }
412                                }
413                        }
414                }
415                close INDEX;
416        }
417        return %mapKeywordSite;
418}
419
420sub showHelp {
421  print "manual2html [-h, -k]\n\n";
422  print "This script create pdf and html manual out of the latex files.\n";
423        print "It also creates some Qt Help files, which are needed to run QtAssistant.\n\n";
424  print "Usage:\n";
425  print "   -h:    Shows this help\n";
426  print "   -k:    Show all known keywords\n";
427        exit 1;
428}
Note: See TracBrowser for help on using the repository browser.