Help generation: add the ability to generate an image from inlined Scilab code
[scilab.git] / scilab / modules / helptools / macros / xmltoformat.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008 INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
3 // Copyright (C) 2008-2010 DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
4 // Copyright (C) 2009 DIGITEO - Vincent COUVERT <vincent.couvert@scilab.org>
5 // Copyright (C) 2010 - 2011 DIGITEO - Allan CORNET
6 //
7 // This file must be used under the terms of the CeCILL.
8 // This source file is licensed as described in the file COPYING, which
9 // you should have received as part of this distribution.  The terms
10 // are also available at
11 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12
13 function generated_files = xmltoformat(output_format,dirs,titles,directory_language,default_language)
14
15     // =========================================================================
16     // + output_format : "javaHelp", "pdf", "chm", "ps"
17     //
18     // + dirs : A set of directories for which help files (jar, pdf, chm, ...) are
19     //        genereated
20     //
21     // + titles : associated title strings (optional or [])
22     //
23     // + directory_language : language in which the help is written
24     //
25     // + default_language : The directory we compiling is completed with help files
26     //                      from the default_language
27     //
28     // if dirs is not specified or [] then standard scilab man are assumed and
29     // titles are searched in %helps
30     // =========================================================================
31     
32     my_wanted_language  = getlanguage(); // This variable is only need when
33                                          // build all scilab help
34
35     global %helps;
36     global %helps_modules;
37
38     if %helps_modules == [] then
39        x2f_reset_help_mod_var(my_wanted_language);
40     end
41
42     %HELPS = [%helps_modules; %helps];
43
44     SCI_long = pathconvert(getlongpathname(SCI),%F,%F);
45
46     //--------------------------------------------------------------------------
47     // Save the current environment
48     //--------------------------------------------------------------------------
49
50     current_directory   = pwd();
51     saved_helps         = %HELPS;
52     %helps_save         = %helps;
53     %helps_modules_save = %helps_modules;
54
55     generated_files = [];
56
57     all_scilab_help     = %F;
58
59     [lhs,rhs] = argn(0);
60
61     // Too much parameters
62     // ---------------------------------------------------------------------
63
64     if rhs > 5 | rhs < 1 then
65         error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"xmltoformat",1,5));
66     end
67
68     // Transformation du %helps_modules jar => help/language
69
70     // Default case : construction de l'aide en ligne de Scilab
71     // ---------------------------------------------------------------------
72
73     if (  (rhs <= 1) ..
74         | ((rhs == 2) & (dirs == [])) ..
75         | ((rhs == 3) & (dirs == []) & (titles == [])) ..
76         | ((rhs == 4) & (dirs == []) & (titles == [])) ) then
77
78         all_scilab_help        = %T;
79
80         // "directory_language" input argument is defined !
81         if rhs == 4 then
82             my_wanted_language = directory_language;
83             x2f_reset_help_mod_var(my_wanted_language);
84             %HELPS = [%helps_modules; %helps];
85         end
86
87         dirs_to_build          = %HELPS;
88         dirs_to_build_m        = %helps_modules;
89         dirs_to_build_c        = %helps;
90
91         dirs                   = x2f_get_xml_path(dirs_to_build(:,1),my_wanted_language);
92         dirs_m                 = x2f_get_xml_path(dirs_to_build_m(:,1),my_wanted_language);
93         dirs_c                 = x2f_get_xml_path(dirs_to_build_c(:,1),my_wanted_language);
94
95         titles                 = dirs_to_build(:,2);
96         titles_m               = dirs_to_build_m(:,2);
97         titles_c               = dirs_to_build_c(:,2);
98
99         dirs(     find(dirs   == "")) = [];
100         dirs_m(   find(dirs_m == "")) = [];
101         dirs_c(   find(dirs_c == "")) = [];
102         titles(   find(dirs   == "")) = [];
103         titles_m( find(dirs_m == "")) = [];
104         titles_c( find(dirs_c == "")) = [];
105
106         directory_language     = [];
107         directory_language_m   = [];
108         directory_language_c   = [];
109
110         default_language       = [];
111         default_language_m     = [];
112         default_language_c     = [];
113
114         language_system        = []; // language_system is equal to %T when
115         language_system_m      = []; // a help directory needs to be completed
116         language_system_c      = []; // with the default language
117
118         if my_wanted_language == getdefaultlanguage() then
119             for k=1:size(dirs,'*')
120                 directory_language = [directory_language;my_wanted_language];
121                 language_system    = [language_system;%F];
122             end
123             for k=1:size(dirs_m,'*')
124                 directory_language_m = [directory_language_m;my_wanted_language];
125                 language_system_m    = [language_system_m;%F];
126             end
127             for k=1:size(dirs_c,'*')
128                 directory_language_c = [directory_language_c;my_wanted_language];
129                 language_system_c    = [language_system_c;%F];
130             end
131         else
132             for k=1:size(dirs,'*')
133                 directory_language = [directory_language;my_wanted_language];
134                 default_language   = [default_language;getdefaultlanguage()];
135                 language_system    = [language_system;%T]; // Enable the language system
136             end
137             for k=1:size(dirs_m,'*')
138                 directory_language_m = [directory_language_m;my_wanted_language];
139                 default_language_m   = [default_language_m;getdefaultlanguage()];
140                 language_system_m    = [language_system_m;%T]; // Enable the language system
141             end
142             for k=1:size(dirs_c,'*')
143                 directory_language_c = [directory_language_c;my_wanted_language];
144                 default_language_c   = [default_language_c;getdefaultlanguage()];
145                 language_system_c    = [language_system_c;%T]; // Enable the language system
146             end
147         end
148
149     // Only directories are precised
150     // ---------------------------------------------------------------------
151
152     elseif (rhs == 2) & (dirs <> []) then
153
154         language_system    = [];
155         titles             = [];
156         directory_language = [];
157         default_language   = [];
158
159         for k=1:size(dirs,'*')
160             directory_language = [directory_language ; x2f_guess_lang(dirs(k)) ]; // Language detection
161             default_language   = [default_language   ; getdefaultlanguage()]; // Default Language
162             titles             = [titles;gettext("Help chapter")+" "+string(k)];
163
164             if directory_language(k) == default_language(k) then
165                 language_system    = [language_system;%F]; // Enable the language system
166             else
167                 language_system    = [language_system;%T]; // Enable the language system
168             end
169         end
170
171     // Only directories and title are precised
172     // ---------------------------------------------------------------------
173
174     elseif rhs == 3 then
175
176         language_system    = [];
177         directory_language = [];
178         default_language   = [];
179
180         for k=1:size(dirs,'*')
181             directory_language = [directory_language ; x2f_guess_lang(dirs(k)) ]; // Language detection
182             default_language   = [default_language   ; getdefaultlanguage()]; // Default Language
183
184             if directory_language(k) == default_language(k) then
185                 language_system    = [language_system;%F]; // Enable the language system
186             else
187                 language_system    = [language_system;%T]; // Enable the language system
188             end
189         end
190
191     // Directories, title and languages are specified
192     // ---------------------------------------------------------------------
193
194     elseif rhs == 4 then
195
196         language_system   = [];
197         default_language  = [];
198
199         for k=1:size(dirs,'*')
200             default_language = [default_language   ; getdefaultlanguage()]; // Default Language
201
202             if directory_language(k) == default_language(k) then
203                 language_system    = [language_system;%F]; // Enable the language system
204             else
205                 language_system    = [language_system;%T]; // Enable the language system
206             end
207         end
208
209     // All is specified
210     // ---------------------------------------------------------------------
211
212     elseif rhs == 5 then
213
214         language_system   = [];
215
216         for k=1:size(dirs,'*')
217             if isdir(pathconvert(dirs(k)+"/../"+default_language(k),%f,%f)) then
218                 if directory_language(k) == default_language(k) then
219                     language_system    = [language_system;%F]; // Enable the language system
220                 else
221                     language_system    = [language_system;%T]; // Enable the language system
222                 end
223             end
224         end
225
226     end
227
228     // Convert paths into absolute paths
229     // ---------------------------------------------------------------------
230     function dir_modified = checkAndConvertDir(dirs_path)
231       dir_modified = [];
232       if (dirs_path <> []) then
233         if ~and(isdir(dirs_path)) then
234           notDirIdx = find(isdir(dirs_path) == %F);
235           error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat", dirs_path(notDirIdx(1))));
236         end
237         dir_modified = fullpath(dirs_path);
238       end
239     endfunction
240     
241     dirs = checkAndConvertDir(dirs);
242
243     if all_scilab_help then
244         dirs_m = checkAndConvertDir(dirs_m);
245         dirs_c = checkAndConvertDir(dirs_c);
246     end
247
248     // =========================================================================
249     // Build the trees
250     // =========================================================================
251
252     if all_scilab_help then
253
254         // ast_tree : "Modules" Tree
255
256         if directory_language_m(1) == "fr_FR" then
257             scilab_manual = "Aide Scilab"
258         elseif directory_language_m(1) == "pt_BR" then
259             scilab_manual = "Ajuda Scilab"
260         else
261             scilab_manual = "Scilab help"
262         end
263
264         modules_tree = struct();
265         modules_tree("level")      = 0; // It's a book
266         modules_tree("title")      = scilab_manual;
267         modules_tree("book_title") = scilab_manual;
268         modules_tree("language")   = directory_language_m(1);
269         modules_tree("path")       = SCI;
270         modules_tree("master.xml") = %F;
271         modules_tree("xml_number") = 0;
272         modules_tree("xml_list")   = [];
273
274         //
275         // Scilab Modules
276         //
277
278         for k=1:size(dirs_m,"*")
279
280             this_tree                     = x2f_dir_to_tree(dirs_m(k),1);
281             this_tree("title_addchapter") = titles_m(k);
282             this_tree("language")         = directory_language_m(k);
283
284             if  language_system_m(k) then
285                 default_language_path = pathconvert(part(dirs_m(k),1:length(dirs_m(k))-5)+default_language_m(k));
286                 if isdir(default_language_path) then
287                     this_tree_dl = x2f_dir_to_tree(default_language_path,1);
288                     this_tree    = x2f_merge_trees(this_tree_dl,this_tree);
289                 end
290             end
291
292             modules_tree("dir_"+getmd5(dirs_m(k),"string")) = this_tree;
293
294         end
295
296         //
297         // Scilab Toolboxes
298         //
299
300         contrib_tree = struct();
301
302         for k=1:size(dirs_c,"*")
303
304             this_tree                     = x2f_dir_to_tree(dirs_c(k),0);
305             this_tree("title_addchapter") = titles_c(k);
306             this_tree("language")         = directory_language_c(k);
307
308             if  language_system_c(k) then
309                 default_language_path = pathconvert(part(dirs_c(k),1:length(dirs_c(k))-5)+default_language_c(k));
310                 if isdir(default_language_path) then
311                     this_tree_dl = x2f_dir_to_tree(default_language_path,0);
312                     this_tree    = x2f_merge_trees(this_tree_dl,this_tree);
313                 end
314             end
315
316             contrib_tree(dirs_c(k)) = this_tree;
317         end
318
319     else
320
321         //
322         // Scilab Toolboxes
323         //
324
325         contrib_tree = struct();
326
327         for k=1:size(dirs,"*")
328
329             this_tree                     = x2f_dir_to_tree(dirs(k),0);
330             this_tree("title_addchapter") = titles(k);
331             this_tree("language")         = directory_language(k);
332
333             if  language_system(k) then
334                 default_language_path = pathconvert(part(dirs(k),1:length(dirs(k))-5)+default_language(k));
335                 if isdir(default_language_path) then
336                     this_tree_dl = x2f_dir_to_tree(default_language_path,0);
337                     this_tree    = x2f_merge_trees(this_tree_dl,this_tree);
338                 end
339             end
340
341             contrib_tree(dirs(k)) = this_tree;
342         end
343
344     end
345
346     // =========================================================================
347     // Build the master documents
348     // =========================================================================
349
350     if all_scilab_help then
351
352         //
353         // Scilab Modules
354         //
355
356         mprintf(_("\nBuilding the Scilab manual master document for %s.\n"),my_wanted_language);
357
358         master_doc = pathconvert(SCI+"/modules/helptools/master_"+my_wanted_language+"_help.xml",%F);
359         modules_tree("master_document") = master_doc;
360         master_str = x2f_tree_to_master(modules_tree);
361         mputl(master_str,master_doc);
362
363         //
364         // Scilab Toolboxes
365         //
366
367         nb_dir = size(dirs_c,"*");
368         displaydone = 0;
369
370         for k=1:nb_dir
371
372             if nb_dir > 1 then
373                 if displaydone == 0 then
374                     mprintf(_("\nBuilding master documents:\n"));
375                     displaydone = 1;
376                 end
377             else
378                 mprintf(_("\nBuilding the master document:\n"));
379             end
380
381             mprintf(_("\t%s\n"),strsubst(dirs_c(k),SCI_long,"SCI"));
382
383             this_tree  = contrib_tree(dirs_c(k));
384             master_doc = pathconvert(dirs_c(k)+"/master_help.xml",%F);
385             this_tree("master_document") = master_doc;
386             master_str = x2f_tree_to_master(this_tree);
387             mputl(master_str,master_doc);
388             contrib_tree(dirs_c(k)) = this_tree;
389
390         end
391
392     else
393
394         nb_dir = size(dirs,"*");
395         displaydone = 0;
396
397         for k=1:nb_dir
398
399             if nb_dir > 1 then
400                 if displaydone == 0 then
401                     mprintf(_("\nBuilding master documents:\n"));
402                     displaydone = 1;
403                 end
404             else
405                 mprintf(_("\nBuilding the master document:\n"));
406             end
407
408             mprintf(_("\t%s\n"),strsubst(dirs(k),SCI_long,"SCI"));
409
410             this_tree  = contrib_tree(dirs(k));
411
412             if isfield(this_tree,"master.xml") & this_tree("master.xml") then
413                 this_tree("master_document") = pathconvert(dirs(k)+"/master.xml",%F);
414                 contrib_tree(dirs(k)) = this_tree;
415                 continue;
416             end
417
418             master_doc = pathconvert(dirs(k)+"/master_help.xml",%F);
419             this_tree("master_document") = master_doc;
420             master_str = x2f_tree_to_master(this_tree);
421             mputl(master_str,master_doc);
422             contrib_tree(dirs(k)) = this_tree;
423
424         end
425
426     end
427
428     // =========================================================================
429     // Perform the help generation
430     // scilab help files generation
431     // 2 steps :
432     // -- scilab help
433     // -- scilab internal toolbox (example: scicos)
434     // =========================================================================
435
436     select output_format
437     case "javaHelp" then
438         output_format_ext = "jar";
439     case "web"
440         output_format_ext = "html";
441     else
442         output_format_ext = output_format;
443     end
444
445     is_html = (output_format == "html" | output_format == "web");
446     is_chm = (output_format == "chm");
447
448     if all_scilab_help then
449
450         mprintf(_("Building the scilab manual file ["+output_format+"]\n"));
451
452         // Define and create the final output directory if does not exist
453                 if output_format == "web" then
454                    final_output_dir = pathconvert(SCI+"/modules/helptools/web",%f,%f);
455                 else
456                    // Define and create the final output directory if does not exist
457            final_output_dir = pathconvert(SCI+"/modules/helptools/"+output_format_ext,%f,%f);
458                 end
459
460         if ~isdir(final_output_dir) then
461             mkdir(final_output_dir);
462         end
463
464         if is_chm then
465
466         elseif is_html then
467             final_output_dir = pathconvert(final_output_dir+"/"+my_wanted_language,%f,%f);
468             if ~isdir(final_output_dir) then
469                 mkdir(final_output_dir);
470             end
471         end
472
473         // Define and create the path of buildDoc working directory
474         buildDoc_dir  = pathconvert(SCI+"/modules/helptools/"+ output_format + "/scilab_" + my_wanted_language + "_help",%t,%f);
475
476         if ~isdir(pathconvert(SCI+"/modules/helptools/"+output_format,%f,%f)) then
477             mkdir(pathconvert(SCI+"/modules/helptools/"+output_format,%f,%f));
478         end
479
480         if ~isdir(buildDoc_dir) then
481             mkdir(buildDoc_dir);
482         end
483
484         // Define the final location of the generated file
485         if is_chm then
486             final_help_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
487         elseif is_html then
488             final_help_file = pathconvert(final_output_dir+"/index.html",%f,%f);
489        else
490             final_help_file = pathconvert(final_output_dir+"/scilab_" + my_wanted_language + "_help." + output_format_ext,%f,%f);
491         end
492
493         // Define the path of the generated file created by buildDoc
494         if is_chm then
495             buildDoc_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
496         elseif is_html then
497             buildDoc_file = pathconvert(buildDoc_dir + "index.html",%f,%f);
498         else
499             buildDoc_file = pathconvert(buildDoc_dir + "scilab_" + my_wanted_language + "_help." + output_format_ext,%f,%f);
500         end
501
502         // Save the current directory
503         cur_dir = pwd();
504
505         // Change Scilab current directory so that Java Indexer works
506         if ~chdir(buildDoc_dir) then
507             error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",buildDoc_dir));
508         end
509
510         // process the build
511         fileToExec = buildDocv2(output_format,modules_tree("master_document"), my_wanted_language);
512         if fileToExec ~= [] then
513             exec(fileToExec, -1);
514             buildDocv2("jar-only",modules_tree("master_document"), my_wanted_language);
515         end
516
517         // Check if the help file has been generated
518         if fileinfo(buildDoc_file)==[] then
519             chdir(cur_dir);
520             error(msprintf(gettext("%s: %s has not been generated."),"xmltoformat",buildDoc_file));
521         end
522
523         // move the generated file(s)
524         if is_chm then
525
526         elseif is_html then
527             my_html_files = listfiles(buildDoc_dir);
528             for k=1:size(my_html_files,'*')
529                 if ~copyfile(my_html_files(k),pathconvert(final_output_dir+"/"+my_html_files(k),%f,%f)) then
530                     chdir(cur_dir);
531                     error(msprintf(gettext("%s: %s file hasn''t been moved in the %s directory."),"xmltoformat",my_html_files(k),final_output_dir));
532                 end
533                 mdelete(my_html_files(k));
534             end
535         else
536             copyfile(buildDoc_file,final_help_file);
537             mdelete(buildDoc_file);
538         end
539
540         // Move into the initial directory
541         if ~chdir(cur_dir) then
542             error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",cur_dir));
543         end
544
545         // Now we can add the help file to the list of all generated files
546         generated_files = [ generated_files ; final_help_file ];
547
548         // internal toolbox
549         // example: scicos
550         // Now, build toolboxes help (if any)
551
552         for k=1:size(dirs_c,"*");
553
554             this_tree  = contrib_tree(dirs_c(k));
555
556             mprintf(_("\nBuilding the manual file [%s] in %s.\n"),output_format,strsubst(dirs_c(k),SCI_long,"SCI"));
557
558             // Define and create the final output directory if does not exist
559             final_output_dir = pathconvert(dirs_c(k)+"/../../"+output_format_ext,%f,%f);
560
561             if ~isdir(final_output_dir) then
562                 mkdir(final_output_dir);
563             end
564
565             // To improve the final_output_dir path
566             final_output_dir = pathconvert(fullpath(final_output_dir),%f,%f);
567
568             if is_chm then
569                 final_output_dir = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
570             elseif is_html then
571                 final_output_dir = pathconvert(final_output_dir+"/"+directory_language_c(k),%f,%f);
572                 if ~isdir(final_output_dir) then
573                     mkdir(final_output_dir);
574                 end
575             end
576
577             // Define and create the path of buildDoc working directory
578             buildDoc_dir  = pathconvert(dirs_c(k) + "/scilab_" + directory_language_c(k) + "_help",%t,%f);
579             if ~isdir(buildDoc_dir) then
580                 mkdir(buildDoc_dir);
581             end
582
583             // Define the final location of the generated file
584             if is_chm then
585                 final_help_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
586             elseif is_html then
587                 final_help_file = pathconvert(final_output_dir+"/index.html",%f,%f);
588             else
589                 final_help_file = pathconvert(final_output_dir+"/scilab_" + directory_language_c(k) + "_help." + output_format_ext,%f,%f);
590             end
591
592
593             // Define the path of the generated file created by buildDoc
594             if is_chm then
595                 buildDoc_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
596             elseif is_html then
597                 buildDoc_file = pathconvert(buildDoc_dir + "index.html",%f,%f);
598             else
599                 buildDoc_file = pathconvert(buildDoc_dir + "scilab_" + directory_language_c(k) + "_help." + output_format_ext,%f,%f);
600             end
601
602             // Save the current directory
603             cur_dir = pwd();
604
605             // Change Scilab current directory so that Java Indexer works
606             if ~chdir(buildDoc_dir) then
607                 chdir(cur_dir);
608                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",buildDoc_dir));
609             end
610
611             // process the build
612             fileToExec = buildDocv2(output_format,this_tree("master_document"),directory_language_c(k),dirs_c(k));
613             if fileToExec ~= [] then
614                 exec(fileToExec, -1);
615                 buildDocv2("jar-only",this_tree("master_document"),directory_language_c(k),dirs_c(k));
616             end
617
618             // Check if the help file has been generated
619             if fileinfo(buildDoc_file)==[] then
620                 chdir(cur_dir);
621                 error(msprintf(gettext("%s: %s has not been generated."),"xmltoformat",buildDoc_file));
622             end
623
624             // move the generated file(s)
625             if is_chm then
626
627             elseif is_html then
628                 my_html_files = listfiles(buildDoc_dir);
629                 for k=1:size(my_html_files,'*')
630                     if ~copyfile(my_html_files(k),pathconvert(final_output_dir+"/"+my_html_files(k),%f,%f)) then
631                         chdir(cur_dir);
632                         error(msprintf(gettext("%s: %s file hasn''t been moved in the %s directory."),"xmltoformat",my_html_files(k),final_output_dir));
633                     end
634                     mdelete(my_html_files(k));
635                 end
636             else
637                 copyfile(buildDoc_file,final_help_file);
638                 mdelete(buildDoc_file);
639             end
640
641             // Move into the initial directory
642             if ~chdir(cur_dir) then
643                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",oldDir));
644             end
645
646             // Now we can add the help file to the list of all generated files
647             generated_files = [ generated_files ; final_help_file ];
648
649         end
650
651     else
652     // ------------------------------
653     // external (Toolboxes)
654     // ------------------------------
655
656
657         // Dirs are precised in the input arguments
658
659         nb_dir      = size(dirs,"*");
660         displaydone = 0;
661
662         for k=1:nb_dir
663
664             // Save the current directory
665             cur_dir = pwd();
666
667             this_tree  = contrib_tree(dirs(k));
668
669             if nb_dir > 1 then
670                 if displaydone == 0 then
671                     mprintf(_("\nBuilding the manual file [%s].\n"),output_format);
672                     displaydone = 1;
673                 end
674                 mprintf(_("\t%s\n"),strsubst(dirs(k),SCI_long,"SCI"));
675             else
676                 mprintf(_("\nBuilding the manual file [%s] in %s.\n"),output_format,strsubst(dirs(k),SCI_long,"SCI"));
677             end
678
679             // Define and create the final output directory if does not exist
680             final_output_dir = pathconvert(dirs(k)+"/../../"+output_format_ext,%f,%f);
681
682             if ~isdir(final_output_dir) then
683                 mkdir(final_output_dir);
684             end
685
686             // To improve the final_output_dir path
687
688             if ~chdir(final_output_dir) then
689                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",final_output_dir));
690             end
691
692             final_output_dir = pathconvert(pwd(),%f,%f);
693
694             if is_chm then
695                 // nothing to do
696             else
697                 if is_html then
698                     final_output_dir = pathconvert(final_output_dir+"/"+directory_language(k),%f,%f);
699                     if ~isdir(final_output_dir) then
700                         mkdir(final_output_dir);
701                     end
702                 end
703             end
704
705             // Define and create the path of buildDoc working directory
706             buildDoc_dir  = pathconvert(dirs(k) + "/scilab_" + directory_language(k) + "_help",%t,%f);
707             if ~isdir(buildDoc_dir) then
708                 mkdir(buildDoc_dir);
709             end
710
711             // Define the final location of the generated file
712             if is_chm then
713                 final_help_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
714             else
715                 if is_html then
716                     final_help_file = pathconvert(final_output_dir+"/index.html",%f,%f);
717                 else
718                     final_help_file = pathconvert(final_output_dir+"/scilab_" + directory_language(k) + "_help." + output_format_ext,%f,%f);
719                 end
720             end
721
722             // Define the path of the generated file created by buildDoc
723             if is_chm then
724                 buildDoc_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
725             elseif is_html then
726                 buildDoc_file = pathconvert(buildDoc_dir + "index.html",%f,%f);
727             else
728                 buildDoc_file = pathconvert(buildDoc_dir + "scilab_" + directory_language(k) + "_help." + output_format_ext,%f,%f);
729             end
730
731             // Change Scilab current directory so that Java Indexer works
732             if ~chdir(buildDoc_dir) then
733                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",buildDoc_dir));
734             end
735
736             // process the build
737             fileToExec = buildDocv2(output_format,this_tree("master_document"),directory_language(k),dirs(k));
738             if fileToExec ~= [] then
739                 exec(fileToExec, -1);
740                 buildDocv2("jar-only",this_tree("master_document"),directory_language(k),dirs(k));
741             end
742
743              // Check if the help file has been generated
744             if fileinfo(buildDoc_file)==[] then
745                 chdir(cur_dir);
746                 error(msprintf(gettext("%s: %s has not been generated."),"xmltoformat",buildDoc_file));
747             end
748
749             // move the generated file(s)
750             if is_chm then
751             // nothing to do
752             elseif is_html then
753                 my_html_files = listfiles(buildDoc_dir);
754                 for k=1:size(my_html_files,'*')
755                     if ~copyfile(my_html_files(k),pathconvert(final_output_dir+"/"+my_html_files(k),%f,%f)) then
756                         chdir(cur_dir);
757                         error(msprintf(gettext("%s: %s file hasn''t been moved in the %s directory."),"xmltoformat",my_html_files(k),final_output_dir));
758                     end
759                     mdelete(my_html_files(k));
760                 end
761             else
762                 copyfile(buildDoc_file,final_help_file);
763                 mdelete(buildDoc_file);
764             end
765
766             // Move into the initial directory
767             if ~chdir(cur_dir) then
768                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",oldDir));
769             end
770
771             // Now we can add the help file to the list of all generated files
772             generated_files = [ generated_files ; final_help_file ];
773
774         end
775     end
776
777     // Restore the original environment
778     //--------------------------------------------------------------------------
779
780     chdir(current_directory);
781     %helps         = %helps_save;
782     %helps_modules = %helps_modules_save;
783     %HELPS         = saved_helps;
784
785 endfunction
786
787
788 // =============================================================================
789 // dirs_out = x2f_get_xml_path(dirs_in,my_wanted_language)
790 // =============================================================================
791
792 function dirs_out = x2f_get_xml_path(dirs_in,my_wanted_language)
793
794     dirs_out = [];
795
796     for k=1:size(dirs_in,"*")
797
798         if basename(dirs_in(k)) == "jar" then
799
800             help_basepath = part(dirs_in(k),1:length(dirs_in(k))-4) + filesep() + "help";
801
802             if isdir(help_basepath + filesep() +my_wanted_language) then
803                 dirs_out(k) = help_basepath + filesep() + my_wanted_language;
804             elseif isdir(help_basepath+filesep()+getdefaultlanguage()) then
805                 dirs_out(k) = help_basepath+filesep()+getdefaultlanguage();
806             else
807                 dirs_out(k) = "";
808             end
809
810         else
811             dirs_out(k) = dirs_in(k);
812         end
813
814     end
815
816 endfunction
817
818 // =============================================================================
819 // language_out = x2f_guess_lang(dir_in)
820 // =============================================================================
821
822 function language_out = x2f_guess_lang(dir_in)
823
824     language_out = getlanguage();
825
826     [my_start,my_end,my_match] = regexp(basename(dir_in),"/([a-z][a-z]_[A-Z][A-Z])$/");
827
828     if my_start <> [] then
829         language_out = part(my_match,1:5);
830     end
831
832 endfunction
833
834 // =============================================================================
835 // x2f_reset_help_mod_var(language)
836 // =============================================================================
837
838 function x2f_reset_help_mod_var(language)
839
840     global %helps_modules;
841
842     // Reset the variable in hand
843     %helps_modules = [];
844     
845     modules_ordered_list = mgetl(SCI + "/modules/helptools/etc/MAIN_CHAPTERS");
846     // remove empty lines in MAIN_CHAPTERS
847     modules_ordered_list(modules_ordered_list == "") = [];
848       
849     // get current modules used by scilab
850     current_modules_list = getmodules();
851       
852     size_current_modules = size(current_modules_list, "*");
853     size_modules_ordered = size(modules_ordered_list, "*");
854     
855     if size_current_modules > size_modules_ordered then
856       error(msprintf(gettext("%s: Please check %s, number of modules is invalid.\n"), "xmltoformat", SCI + "/modules/helptools/etc/MAIN_CHAPTERS"));
857     end
858     
859     // Remove modules not present
860     k = 1;
861     cleaned_ordered_modules = [];
862     for i = 1:size_modules_ordered
863       for j = 1:size_current_modules
864         if (current_modules_list(j) == modules_ordered_list(i)) then
865           cleaned_ordered_modules(k) = modules_ordered_list(i);
866           k = k + 1;
867         end
868       end
869     end
870
871     // We force to add windows_tools module in help
872     // Bug 9790
873     if getos() <> "Windows" then
874       cleaned_ordered_modules(k) = "windows_tools";
875     end
876     
877     size_cleaned_modules = size(cleaned_ordered_modules, "*");
878     
879     // Loop on modules available ordered
880     for k = 1:size_cleaned_modules;
881       addchapter_path = SCI + "/modules/" + cleaned_ordered_modules(k) + "/help/" + language + "/addchapter.sce";
882       if isfile(addchapter_path) then
883         exec(addchapter_path, -1);
884       end
885     end
886
887 endfunction
888
889 // =============================================================================
890 // tree = x2f_dir_to_tree(directory,level)
891 //
892 // level :
893 //  0 : book
894 //  1 : part
895 //  2 : chapter
896 //  3 : sect1
897 //  4 : sect2
898 //  5 : sect3
899 //  6 : sect4
900 // ...
901 //
902 // Date : 24/04/2009
903 // =============================================================================
904
905 function tree = x2f_dir_to_tree(directory,level)
906
907     tree = struct();
908     rhs  = argn(2);
909
910     // Check number of input arguments
911     // =========================================================================
912
913     if rhs<>2 then
914         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_dir_to_tree",2));
915     end
916
917     // Check input argument type
918     // =========================================================================
919
920     if type(directory) <> 10 then
921         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"x2f_dir_to_tree",1));
922     end
923
924     if type(level) <> 1 then
925         error(msprintf(gettext("%s: Wrong type for input argument #%d: An integer expected.\n"),"x2f_dir_to_tree",2));
926     end
927
928     // Check input argument dimension
929     // =========================================================================
930
931     if size(directory,"*") <> 1 then
932         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"x2f_dir_to_tree",1));
933     end
934
935     if size(level,"*") <> 1 then
936         error(msprintf(gettext("%s: Wrong size for input argument #%d: An integer expected.\n"),"x2f_dir_to_tree",1));
937     end
938
939     // Check the directory existence
940     // =========================================================================
941
942     if ~isdir(directory) then
943         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing directory is expected.\n"),"x2f_dir_to_tree",1));
944     end
945
946     // ... and now, Action
947     // =========================================================================
948
949     // Normalize the directory path
950     directory    = pathconvert(directory);
951
952
953     // init the structure
954     tree          = struct();
955     tree("path")  = directory;
956     tree("level") = level;
957
958     // If a master.xml file exists, don't go past
959     if fileinfo(directory+"master.xml")<>[] then
960         tree("master.xml") = %T;
961         return;
962     else
963         tree("master.xml") = %F;
964     end
965
966     //
967     // Title management
968     //
969
970     // Parse the CHAPTER file to get the directory title if this file is present
971     if fileinfo(directory+"CHAPTER")<>[] then
972         tree = x2f_cat(tree,x2f_read_CHAPTER(directory+"CHAPTER"));
973     end
974
975     // Check if the addchapter.sce is present
976     if fileinfo(directory+"addchapter.sce")<>[] then
977         tree("title_addchapter") = basename(directory);
978     end
979
980     // Check if the last_successful_build is present
981     if fileinfo(directory+".last_successful_build")<>[] then
982         tree = x2f_cat(tree , x2f_read_lsb(directory+".last_successful_build"));
983     end
984
985     // Get the default title
986
987     if getos() == 'Windows' then
988         tmpdirectory = strsubst(directory,"/\\$/","","r");
989     else
990         tmpdirectory = strsubst(directory,"/\/$/","","r");
991     end
992
993     tree("title_default") = basename(tmpdirectory);
994
995     //
996     // XML list management
997     //
998
999     // get the xml list
1000     xmlfiles = x2f_get_xml_files(directory);
1001
1002     // Allocate the xml list
1003     tree("xml_list")    = xmlfiles;
1004     tree("xml_number")  = size(xmlfiles(:,1),"*");
1005
1006     //
1007     // Sub Trees management
1008     //
1009
1010     // get the directory list
1011     directories = x2f_get_directories(directory);
1012
1013     for i=1:size(directories,"*")
1014         this_dir_tree = x2f_dir_to_tree(directory+directories(i),tree("level") + 1);
1015         if this_dir_tree("xml_number") > 0 then
1016             tree("dir_"+getmd5(directories(i),"string")) = this_dir_tree;
1017             tree("xml_number") = tree("xml_number") + this_dir_tree("xml_number");
1018         end
1019     end
1020
1021 endfunction
1022
1023 // =============================================================================
1024 // xmlfiles = x2f_get_xml_files(directory)
1025 // return an n X 3 matrix
1026 //
1027 // xmlfiles(:,1) : basename of each XML file
1028 // xmlfiles(:,2) : full path of each XML file
1029 // xmlfiles(:,3) : Last modification time of each XML file
1030 //
1031 // Date : 24/04/2009
1032 // =============================================================================
1033
1034 function xmlfiles = x2f_get_xml_files(directory)
1035
1036     rhs = argn(2);
1037
1038     // Check number of input arguments
1039     // =========================================================================
1040
1041     if rhs <> 1 then
1042         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_get_xml_files",1));
1043     end
1044
1045     // Check input argument type
1046     // =========================================================================
1047
1048     if type(directory) <> 10 then
1049         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"x2f_get_xml_files",1));
1050     end
1051
1052     // Check input argument dimension
1053     // =========================================================================
1054
1055     if size(directory,"*") <> 1 then
1056         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"x2f_get_xml_files",1));
1057     end
1058
1059     // Check the directory existence
1060     // =========================================================================
1061
1062     if ~isdir(directory) then
1063         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing directory is expected.\n"),"x2f_get_xml_files",1));
1064     end
1065
1066     // ... and now, Action
1067     // =========================================================================
1068
1069     directory = pathconvert(directory);
1070
1071     // remove duplicated names in current directory (example: case ".xml~")
1072     xmlfiles = unique(basename(findfiles(directory, "*.xml")));
1073     
1074     xmlfiles = gsort(xmlfiles, "lr", "i");
1075     xmlfiles(grep(xmlfiles,"master_help")) = [];
1076     xmlfiles(grep(xmlfiles,"master"))      = [];
1077
1078     // Loop on all xml files to get their full path
1079     // =========================================================================
1080
1081     if xmlfiles <> [] then
1082         xmlpaths = directory + xmlfiles + ".xml";
1083     else
1084         xmlpaths = [];
1085     end
1086
1087     // Get XML modification time
1088     // =========================================================================
1089
1090     if xmlpaths<>[] then
1091         infos = fileinfo(xmlpaths);
1092         ft = format();
1093         format(20);
1094         lmt   = string(infos(:,7));
1095         format(ft(2),ft(1));
1096     else
1097         lmt   = [];
1098     end
1099
1100     // xmlfiles => md5sum
1101     // =========================================================================
1102
1103     if xmlfiles <> [] then
1104         xmlmd5 = "a" + getmd5(xmlpaths,"string");
1105     else
1106         xmlmd5 = [];
1107     end
1108
1109     // Build the final matrix
1110     // =========================================================================
1111     xmlfiles = [ xmlmd5 xmlpaths lmt xmlfiles];
1112
1113 endfunction
1114
1115 // =============================================================================
1116 // directories = x2f_get_directories(directory)
1117 //
1118 // Returns a colum vector that contain the list of subdirectories of <directory>
1119 //
1120 // Date : 24/04/2009
1121 // =============================================================================
1122
1123 function directories = x2f_get_directories(directory)
1124
1125     rhs  = argn(2);
1126
1127     // Check number of input arguments
1128     // =========================================================================
1129
1130     if rhs <> 1 then
1131         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_get_directories",1));
1132     end
1133
1134     // Check input argument type
1135     // =========================================================================
1136
1137     if type(directory) <> 10 then
1138         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"x2f_get_directories",1));
1139     end
1140
1141     // Check input argument dimension
1142     // =========================================================================
1143
1144     if size(directory,"*") <> 1 then
1145         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"x2f_get_directories",1));
1146     end
1147
1148     // Check the directory existence
1149     // =========================================================================
1150
1151     if ~isdir(directory) then
1152         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing directory is expected.\n"),"x2f_get_directories",1));
1153     end
1154
1155     // ... and now, Action
1156     // =========================================================================
1157
1158     // Normalize the directory path
1159     directory = pathconvert(directory);
1160
1161     items       = listfiles(directory);
1162     directories = [];
1163
1164     for i=1:size(items,"*")
1165         if isdir(directory+items(i)) then
1166             directories = [ directories ; items(i) ];
1167         end
1168     end
1169
1170     // Sort directories
1171     directories = gsort(basename(directories),"lr","i");
1172
1173     // Remove directories that start with a dot from the list
1174     directories(grep(directories,"/^\./","r")) = [];
1175
1176     // Remove blank strings from the list
1177     directories(find(directories == '')) = [];
1178
1179     // Remove all scilab_xx_XX_help directories from the list
1180     directories( grep(directories,"/^scilab_[a-z][a-z]_[A-Z][A-Z]_help$/","r") ) = []
1181
1182 endfunction
1183
1184 // =============================================================================
1185 // desc_out = x2f_read_CHAPTER(file_in)
1186 // Parse a CHAPTER file
1187 //
1188 // Date : 24/04/2009
1189 // =============================================================================
1190
1191 function desc_out = x2f_read_CHAPTER(file_in)
1192
1193     desc_out = struct();
1194
1195     rhs  = argn(2);
1196
1197     // Check number of input arguments
1198     // =========================================================================
1199
1200     if rhs <> 1 then
1201         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_read_CHAPTER",1));
1202     end
1203
1204     // Check input arguments value
1205     // =========================================================================
1206
1207     if regexp( file_in,"/CHAPTER$/") == [] then
1208         error(msprintf(gettext("%s: Wrong value for input argument #%d: A string that end with CHAPTER expected.\n"),"x2f_read_CHAPTER",1));
1209     end
1210
1211     // Check the input file existence
1212     // =========================================================================
1213
1214     if fileinfo( file_in ) == [] then
1215         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing file is expected.\n"),"x2f_read_CHAPTER",1));
1216     end
1217
1218     // ... and now, Action
1219     // =========================================================================
1220
1221     FILETOPARSE = mgetl(file_in);
1222
1223     current_field = "";
1224
1225     for i=1:size(FILETOPARSE,"*")
1226
1227         // Second case : Current field continuation
1228         if (regexp(FILETOPARSE(i),"/^\s/","o") == 1) & (current_field <> "") then
1229             current_value = part(FILETOPARSE(i),2:length(FILETOPARSE(i)));
1230             desc_out(current_field) = [ desc_out(current_field) ; current_value ];
1231             continue;
1232         end
1233
1234         // First case : new field
1235         if regexp(FILETOPARSE(i),"/^[a-zA-Z][a-zA-Z0-9_]*\s=\s/","o") == 1 then
1236             current_field_length    = regexp(FILETOPARSE(i),"/\s=\s/","o")
1237             current_field           = part(FILETOPARSE(i),1:current_field_length-1);
1238             current_value           = part(FILETOPARSE(i),current_field_length+3:length(FILETOPARSE(i)));
1239             desc_out(current_field) = current_value;
1240             continue;
1241         end
1242
1243         // Third case : Blank line
1244         if length(FILETOPARSE(i)) == 0 then
1245             continue;
1246         end
1247
1248         // Else Error
1249         error(msprintf(gettext("%s: The CHAPTER file is not well formated at line %d\n"),"x2f_read_CHAPTER",i));
1250
1251     end
1252
1253 endfunction
1254
1255 // =============================================================================
1256 // desc_out = x2f_read_lsb(file_in)
1257 // Parse a last_successful_build file
1258 //
1259 // Date : 24/04/2009
1260 // =============================================================================
1261
1262 function desc_out = x2f_read_lsb(file_in)
1263
1264     desc_out = struct();
1265     rhs      = argn(2);
1266
1267     // Check number of input arguments
1268     // =========================================================================
1269
1270     if rhs <> 1 then
1271         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_read_lsb",1));
1272     end
1273
1274     // Check input arguments value
1275     // =========================================================================
1276
1277     if regexp( file_in,"/\.last_successful_build$/") == [] then
1278         error(msprintf(gettext("%s: Wrong value for input argument #%d: A string that end with .last_successful_build expected.\n"),"x2f_read_lsb",1));
1279     end
1280
1281     // Check the input file existence
1282     // =========================================================================
1283
1284     if fileinfo( file_in ) == [] then
1285         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing file is expected.\n"),"x2f_read_lsb",1));
1286     end
1287
1288     // ... and now, Action
1289     // =========================================================================
1290
1291     FILETOPARSE = stripblanks(mgetl(file_in));
1292
1293     for i=1:size(FILETOPARSE,"*")
1294
1295         // First case : new field
1296         if regexp(FILETOPARSE(i),"/^[a-zA-Z][a-zA-Z0-9_]*\s=\s/","o") == 1 then
1297             current_field_length    = regexp(FILETOPARSE(i),"/\s=\s/","o")
1298             current_field           = part(FILETOPARSE(i),1:current_field_length-1);
1299             current_value           = part(FILETOPARSE(i),current_field_length+3:length(FILETOPARSE(i)));
1300
1301             if regexp(current_value,"/^[0-9]+$/") == [] then
1302                 error(msprintf(gettext("%s: The last_successful_build file is not well formated at line %d\n"),"x2f_read_lsb",i));
1303             end
1304
1305             desc_out(current_field) = strtod(current_value);
1306             continue;
1307         end
1308
1309         // Third case : Blank line
1310         if length(FILETOPARSE(i)) == 0 then
1311             continue;
1312         end
1313
1314         // Else Error
1315         error(msprintf(gettext("%s: The last_successful_build file is not well formated at line %d\n"),"x2f_read_lsb",i));
1316
1317     end
1318
1319 endfunction
1320
1321 // =============================================================================
1322 // desc_out = x2f_cat( desc_in_1 , desc_in_2)
1323 //
1324 // Concatenate two mlist
1325 //
1326 // Date : 27/04/2009
1327 // =============================================================================
1328
1329 function desc_out = x2f_cat(desc_in_1,desc_in_2)
1330
1331     rhs = argn(2);
1332
1333     // Check number of input arguments
1334     // =========================================================================
1335
1336     if rhs <> 2 then
1337         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_cat",2));
1338     end
1339
1340     // Check input arguments type
1341     // =========================================================================
1342
1343     if type(desc_in_1) <> 17 then
1344         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat",1));
1345     end
1346
1347     if type(desc_in_2) <> 17 then
1348         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat",2));
1349     end
1350
1351     // ... and now, Action
1352     // =========================================================================
1353
1354     fields_in_2      = getfield(1,desc_in_2);
1355     fields_in_2(1:2) = [];
1356
1357     if or(isfield(desc_in_1,fields_in_2)) then
1358         error(msprintf(gettext("%s: The 2 mlist must not have any field in common .\n"),"x2f_cat"));
1359     end
1360
1361     desc_out = desc_in_1;
1362
1363     for i=1:size(fields_in_2,"*")
1364         desc_out(fields_in_2(i)) = desc_in_2(fields_in_2(i));
1365     end
1366
1367 endfunction
1368
1369 // =============================================================================
1370 // master_document = x2f_tree_to_master( tree )
1371 //
1372 // Date : 27/04/2009
1373 // =============================================================================
1374
1375 function master_document = x2f_tree_to_master( tree )
1376
1377     rhs = argn(2);
1378
1379     // Check number of input arguments
1380     // =========================================================================
1381
1382     if rhs <> 1 then
1383         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_tree_to_master",1));
1384     end
1385
1386     // Check input arguments type
1387     // =========================================================================
1388
1389     if type(tree) <> 17 then
1390         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_tree_to_master",1));
1391     end
1392
1393     // if a master.xml exists in the directory, return this file
1394     // =========================================================================
1395
1396     if isfield(tree,"master.xml") & tree("master.xml")  then
1397         str = mgetl( tree("path") + "master.xml" );
1398         return;
1399     end
1400
1401     // Start output
1402     // =========================================================================
1403
1404     if isfield(tree,"language") then
1405         language = tree("language");
1406     else
1407         language = "en_US";
1408     end
1409
1410     master_document = ["<?xml version=""1.0"" encoding=""UTF-8""?>";..
1411         "<!DOCTYPE book [";
1412         "<!--Begin Entities-->"];
1413
1414     // Get the list of all xml files present in this tree
1415     tree_xmllist = x2f_cat_xmllist( tree , [] )
1416
1417     // Process the path if under windows
1418     if getos() == 'Windows' then
1419         tree_xmllist(:,2) = "file:///"+ strsubst(getshortpathname(tree_xmllist(:,2)) ,"\","/");
1420     end
1421
1422     // Add entities
1423     master_document = [ master_document ; "<!ENTITY "+tree_xmllist(:,1)+" SYSTEM """+tree_xmllist(:,2)+""">" ]
1424
1425     // title management
1426
1427
1428     if isfield(tree,"book_title") & (tree("book_title") <> "") then
1429         // title defined in CHAPTER
1430         book_title = tree("book_title");
1431
1432
1433     elseif isfield(tree,"title_addchapter") & (tree("title_addchapter") <> "") then
1434         // title defined in addchapter.sce
1435         book_title = tree("title_addchapter");
1436
1437     else
1438         // title built with the directory name
1439         book_title = tree("title_default");
1440     end
1441
1442     book_title = strsubst(book_title,"&"  ,"&amp;");
1443     book_title = strsubst(book_title,"""" ,"&quot;");
1444     book_title = strsubst(book_title,">"  ,"&gt;");
1445     book_title = strsubst(book_title,"<"  ,"&lt;");
1446
1447     master_document    = [ master_document; ..
1448         "<!--End Entities-->"; ..
1449         "]>"; ..
1450         "<book version=""5.0-subset Scilab"" xml:lang="""+language+""""; ..
1451         "      xmlns=""http://docbook.org/ns/docbook"""; ..
1452         "      xmlns:xlink=""http://www.w3.org/1999/xlink"""; ..
1453         "      xmlns:xi=""http://www.w3.org/2001/XInclude"""; ..
1454         "      xmlns:svg=""http://www.w3.org/2000/svg"""; ..
1455         "      xmlns:mml=""http://www.w3.org/1998/Math/MathML"""; ..
1456         "      xmlns:html=""http://www.w3.org/1999/xhtml"""; ..
1457         "      xmlns:db=""http://docbook.org/ns/docbook"">"; ..
1458         "  <info xml:id=''"+x2f_title2id(book_title)+"_manual''>"; ..
1459         "    <title>"+book_title+"</title>"; ..
1460         "  </info>"; ..
1461         ""];
1462
1463     // title management
1464     // =========================================================================
1465
1466     // title management
1467     if isfield(tree,"title") & (tree("title") <> "") then
1468         // title defined in CHAPTER
1469         section_title = tree("title");
1470     elseif isfield(tree,"title_addchapter") & (tree("title_addchapter") <> "") then
1471         // title defined in addchapter.sce
1472         section_title = tree("title_addchapter");
1473     else
1474         // title built with the directory name
1475         section_title = tree("title_default");
1476     end
1477
1478     // xml_list management
1479     // =========================================================================
1480
1481     offset = 0;
1482
1483     if isfield(tree,"xml_list") then
1484         xmllist        = tree("xml_list");
1485         if xmllist <> [] then
1486             master_document = [ master_document ; "<part xml:id=''section_"+getmd5(strsubst(tree("path"),SCI,""),"string")+"''>" ];
1487             master_document = [ master_document ; "<title>"+section_title+"</title>" ];
1488             master_document = [ master_document ; "&"+xmllist(:,1)+";" ];
1489             offset          = 1;
1490         end
1491     end
1492
1493     // Loop on dir_
1494     // =========================================================================
1495
1496     my_subtrees = getfield(1,tree);
1497     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1498
1499     for i=1:size(my_subtrees,"*")
1500         master_document = [ master_document ; x2f_tree_to_section( tree(my_subtrees(i)) , offset ) ];
1501     end
1502
1503     // End of master document
1504     // =========================================================================
1505
1506     if offset == 1 then
1507         master_document = [ master_document ; "</part>" ];
1508     end
1509
1510     master_document = [ master_document; "</book>" ];
1511
1512 endfunction
1513
1514 // =============================================================================
1515 // master_section = x2f_tree_to_section( tree , offset )
1516 //
1517 // Date : 27/04/2009
1518 // =============================================================================
1519
1520 function master_section = x2f_tree_to_section( tree , offset )
1521
1522     rhs = argn(2);
1523
1524     // Check number of input arguments
1525     // =========================================================================
1526
1527     if rhs <> 2 then
1528         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_tree_to_section",2));
1529     end
1530
1531     // Check input arguments type
1532     // =========================================================================
1533
1534     if type(tree) <> 17 then
1535         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_tree_to_section",1));
1536     end
1537
1538     if type(offset) <> 1 then
1539         error(msprintf(gettext("%s: Wrong type for input argument #%d: An integer expected.\n"),"x2f_tree_to_section",2));
1540     end
1541
1542     // And now, action ...
1543     // =========================================================================
1544
1545     //
1546     // Section Type management
1547     //
1548
1549     // level :
1550     //  0 : book
1551     //  1 : part
1552     //  2 : chapter
1553     //  3 : sect1
1554     //  4 : sect2
1555     //  5 : sect3
1556     //  6 : sect4
1557
1558     section_types = [ ..
1559                 "book"    ; ..
1560                 "part"    ; ..
1561                 "chapter" ; ..
1562                 "section" ; ..
1563                 "section"   ; ..
1564                 "section"   ; ..
1565                 "section"   ; ..
1566                 "section"   ];
1567
1568     if isfield(tree,"level") & ((tree("level") + offset)>0) & ((tree("level") + offset)<8) then
1569         section_type = section_types( tree("level") + offset + 1 );
1570     else
1571         section_type = "reference";
1572     end
1573
1574     //
1575     // title management
1576     //
1577
1578     if isfield(tree,"title_addchapter") & (tree("title_addchapter") <> "") then
1579         // title defined in addchapter.sce
1580         section_title = tree("title_addchapter");
1581     elseif isfield(tree,"title") & (tree("title") <> "") then
1582         // title defined in CHAPTER
1583         section_title = tree("title");
1584     else
1585         // title built with the directory name
1586         section_title = tree("title_default");
1587     end
1588     
1589     if (isfield(tree, "xml_id")) then
1590         xml_id = tree("xml_id");
1591     else
1592         xml_id = "section_"+getmd5(strsubst(tree("path"),SCI,""),"string");
1593     end
1594     
1595     section_title  = strsubst(section_title,"&"  ,"&amp;");
1596     section_title  = strsubst(section_title,"""" ,"&quot;");
1597     section_title  = strsubst(section_title,">"  ,"&gt;");
1598     section_title  = strsubst(section_title,"<"  ,"&lt;");
1599
1600     master_section = [];
1601     master_section = [ master_section ; "<"+section_type+" xml:id=''" + xml_id + "''>" ];
1602     master_section = [ master_section ; "<title>"+section_title+"</title>" ];
1603
1604     // Loop on dir_
1605     // =========================================================================
1606
1607     my_subtrees = getfield(1,tree);
1608     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1609
1610     for i=1:size(my_subtrees,"*")
1611         master_section = [ master_section ; x2f_tree_to_section( tree(my_subtrees(i)) , offset ) ];
1612     end
1613
1614     // xml list
1615     // =========================================================================
1616
1617     if isfield(tree,"xml_list") then
1618         xmllist        = tree("xml_list");
1619         if xmllist <> [] then
1620             master_section = [ master_section ; "&"+xmllist(:,1)+";" ];
1621         end
1622     end
1623
1624     master_section = [ master_section ; "</"+section_type+">" ];
1625
1626 endfunction
1627
1628 // =============================================================================
1629 // tree_out = x2f_merge_trees( tree_in_1 , tree_in_2 )
1630 //
1631 // Date : 27/04/2009
1632 // =============================================================================
1633
1634 function tree_out = x2f_merge_trees( tree_in_1 , tree_in_2 )
1635
1636     // tree_in_1 : reference tree
1637     // tree_in_2 : tree to fill
1638
1639     rhs = argn(2);
1640
1641     // Check number of input arguments
1642     // =========================================================================
1643
1644     if rhs <> 2 then
1645         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_merge_trees",1));
1646     end
1647
1648     // Check input arguments type
1649     // =========================================================================
1650
1651     if type(tree_in_1) <> 17 then
1652         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_merge_trees",1));
1653     end
1654
1655     if type(tree_in_2) <> 17 then
1656         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_merge_trees",2));
1657     end
1658
1659     tree_out = tree_in_2;
1660
1661     // Loop on dir_
1662     // =========================================================================
1663
1664     my_subtrees = getfield(1,tree_in_1);
1665     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1666
1667     for i=1:size(my_subtrees,"*")
1668         // Check if the subtree exists in tree_in_2
1669         if ~isfield(tree_in_2,my_subtrees(i)) then
1670             // if not, copy the whole subtree in tree_in_2
1671             this_subtree             = tree_in_1(my_subtrees(i));
1672             tree_out(my_subtrees(i)) = tree_in_1(my_subtrees(i));
1673             tree_out("xml_number")   = tree_out("xml_number") + this_subtree("xml_number");
1674
1675         else
1676             // if yes, iterate with x2f_merge_trees
1677             this_subtree_before      = tree_in_2(my_subtrees(i))
1678             xml_number_before        = this_subtree_before("xml_number");
1679             this_subtree_after       = x2f_merge_trees( tree_in_1(my_subtrees(i)) , this_subtree_before );
1680             xml_number_after         = this_subtree_after("xml_number");
1681
1682             tree_out(my_subtrees(i)) = this_subtree_after;
1683             tree_out("xml_number")   = tree_out("xml_number") + xml_number_after - xml_number_before;
1684         end
1685     end
1686
1687     // XML list management
1688     // =========================================================================
1689
1690     if isfield(tree_in_1,"xml_list") then
1691         xmllist_1 = tree_in_1("xml_list");
1692     else
1693         xmllist_1 = [];
1694     end
1695
1696     if isfield(tree_in_2,"xml_list") then
1697         xmllist_2 = tree_in_2("xml_list");
1698     else
1699         xmllist_2 = [];
1700     end
1701
1702     xmllist_out = xmllist_2;
1703
1704     for i=1:size(xmllist_1(:,4),"*")
1705         if find(xmllist_2(:,4) == xmllist_1(i,4)) == [] then
1706             xmllist_out             = [ xmllist_out ; xmllist_1(i,:) ];
1707             tree_out("xml_number")  = tree_out("xml_number") + 1;
1708         end
1709     end
1710
1711     tree_out("xml_list") = xmllist_out;
1712
1713 endfunction
1714
1715 // =============================================================================
1716 // xmllist_out = x2f_cat_xmllist( tree , xmllist_in )
1717 //
1718 // Returns a n x 3 matrix that list all xmlfile in this tree and subtrees
1719 //
1720 // Date : 27/04/2009
1721 // =============================================================================
1722
1723 function xmllist_out = x2f_cat_xmllist( tree , xmllist_in )
1724
1725     rhs         = argn(2);
1726     xmllist_out = xmllist_in;
1727
1728     // Check number of input arguments
1729     // =========================================================================
1730
1731     if rhs <> 2 then
1732         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_cat_xmllist",2));
1733     end
1734
1735     // Check input arguments type
1736     // =========================================================================
1737
1738     if type(tree) <> 17 then
1739         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat_xmllist",1));
1740     end
1741
1742     if (xmllist_in<> []) & (type(xmllist_in) <> 10) then
1743         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"x2f_cat_xmllist",2));
1744     end
1745
1746     // This tree xml list to start
1747     // =========================================================================
1748
1749     if isfield(tree,"xml_list") then
1750         xmllist_out = [ xmllist_out ; tree("xml_list") ];
1751     end
1752
1753     // Loop on dir_
1754     // =========================================================================
1755
1756     my_subtrees = getfield(1,tree);
1757     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1758
1759     for i=1:size(my_subtrees,"*")
1760         xmllist_out = x2f_cat_xmllist( tree(my_subtrees(i)) , xmllist_out );
1761     end
1762
1763 endfunction
1764
1765 // =============================================================================
1766 // section_id = x2f_title2id(title)
1767 //
1768 // Returns a normalized string from <title> string
1769 //
1770 // Date : 27/04/2009
1771 // =============================================================================
1772
1773 function section_id = x2f_title2id(title_in)
1774
1775     section_id = title_in;
1776
1777     section_id = strsubst(section_id , "&"  , "_" );
1778
1779     section_id = strsubst(section_id , "À"  , "A" );
1780     section_id = strsubst(section_id , "Á"  , "A" );
1781     section_id = strsubst(section_id , "Â"  , "A" );
1782     section_id = strsubst(section_id , "Ã"  , "A" );
1783     section_id = strsubst(section_id , "Ä"  , "A" );
1784     section_id = strsubst(section_id , "Å"  , "A" );
1785     section_id = strsubst(section_id , "Æ"  , "AE");
1786     section_id = strsubst(section_id , "Ç"  , "C" );
1787     section_id = strsubst(section_id , "È"  , "E" );
1788     section_id = strsubst(section_id , "É"  , "E" );
1789     section_id = strsubst(section_id , "Ê"  , "E" );
1790     section_id = strsubst(section_id , "Ë"  , "E" );
1791     section_id = strsubst(section_id , "Ì"  , "I" );
1792     section_id = strsubst(section_id , "Í"  , "I" );
1793     section_id = strsubst(section_id , "Î"  , "I" );
1794     section_id = strsubst(section_id , "Ï"  , "I" );
1795     section_id = strsubst(section_id , "Ð"  , "D" );
1796     section_id = strsubst(section_id , "Ñ"  , "N" );
1797     section_id = strsubst(section_id , "Ò"  , "O" );
1798     section_id = strsubst(section_id , "Ó"  , "O" );
1799     section_id = strsubst(section_id , "Ô"  , "O" );
1800     section_id = strsubst(section_id , "Õ"  , "O" );
1801     section_id = strsubst(section_id , "Ö"  , "O" );
1802     section_id = strsubst(section_id , "Ù"  , "U" );
1803     section_id = strsubst(section_id , "Ú"  , "U" );
1804     section_id = strsubst(section_id , "Û"  , "U" );
1805     section_id = strsubst(section_id , "Ü"  , "U" );
1806     section_id = strsubst(section_id , "Ý"  , "Y" );
1807     section_id = strsubst(section_id , "à"  , "a" );
1808     section_id = strsubst(section_id , "á"  , "a" );
1809     section_id = strsubst(section_id , "â"  , "a" );
1810     section_id = strsubst(section_id , "ã"  , "a" );
1811     section_id = strsubst(section_id , "ä"  , "a" );
1812     section_id = strsubst(section_id , "å"  , "a" );
1813     section_id = strsubst(section_id , "æ"  , "ae");
1814     section_id = strsubst(section_id , "ç"  , "c" );
1815     section_id = strsubst(section_id , "è"  , "e" );
1816     section_id = strsubst(section_id , "é"  , "e" );
1817     section_id = strsubst(section_id , "ê"  , "e" );
1818     section_id = strsubst(section_id , "ë"  , "e" );
1819     section_id = strsubst(section_id , "ì"  , "i" );
1820     section_id = strsubst(section_id , "í"  , "i" );
1821     section_id = strsubst(section_id , "î"  , "i" );
1822     section_id = strsubst(section_id , "ï"  , "i" );
1823     section_id = strsubst(section_id , "ñ"  , "n" );
1824     section_id = strsubst(section_id , "ò"  , "o" );
1825     section_id = strsubst(section_id , "ó"  , "o" );
1826     section_id = strsubst(section_id , "ô"  , "o" );
1827     section_id = strsubst(section_id , "õ"  , "o" );
1828     section_id = strsubst(section_id , "ö"  , "o" );
1829     section_id = strsubst(section_id , "ù"  , "u" );
1830     section_id = strsubst(section_id , "ú"  , "u" );
1831     section_id = strsubst(section_id , "û"  , "u" );
1832     section_id = strsubst(section_id , "ü"  , "u" );
1833     section_id = strsubst(section_id , "ý"  , "y" );
1834     section_id = strsubst(section_id , "ÿ"  , "y" );
1835
1836     section_id = strsubst(section_id , ":"  , ""  );
1837     section_id = strsubst(section_id , "\"  , "_" );
1838     section_id = strsubst(section_id , "/"  , "_" );
1839     section_id = strsubst(section_id , "''" , "_" );
1840     section_id = strsubst(section_id , "  " , " " );
1841     section_id = strsubst(section_id , " "  , "_" );
1842     section_id = strsubst(section_id , "["  , ""  );
1843     section_id = strsubst(section_id , "]"  , ""  );
1844
1845     section_id = convstr(section_id,"l");
1846
1847 endfunction
1848
1849 // =============================================================================
1850 // timestamp = x2f_get_most_recent( tree )
1851 //
1852 // Return the timestamp associated with the most recent XML file, ... and its
1853 // path if a second output argument is precised
1854 //
1855 // Date : 27/04/2009
1856 // =============================================================================
1857
1858 function [timestamp,path] = x2f_get_most_recent( tree )
1859
1860     rhs         = argn(2);
1861     timestamp   = 0;
1862     path        = "";
1863
1864     // Check number of input arguments
1865     // =========================================================================
1866
1867     if rhs <> 1 then
1868         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_get_most_recent",1));
1869     end
1870
1871     // Check input arguments type
1872     // =========================================================================
1873
1874     if type(tree) <> 17 then
1875         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat_xmllist",1));
1876     end
1877
1878     // Get the full XML list
1879     // =========================================================================
1880
1881     xmllist =  x2f_cat_xmllist(tree,[]);
1882
1883     [values,index] = gsort(strtod(xmllist(:,3)));
1884
1885     timestamp = xmllist( index(1) , 3 );
1886     path      = xmllist( index(1) , 2 );
1887
1888 endfunction