* Bug #12548 fixed - Duplicated code in xmltoformat.
[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             if output_format == "javaHelp" then
515                 // We don't create the jar when building the online help
516                 // or the PDF
517                 buildDocv2("jar-only",modules_tree("master_document"), my_wanted_language);
518             end
519         end
520
521         check_move(buildDoc_file);
522
523         // Now we can add the help file to the list of all generated files
524         generated_files = [ generated_files ; final_help_file ];
525
526         // internal toolbox
527         // example: scicos
528         // Now, build toolboxes help (if any)
529
530         for k=1:size(dirs_c,"*");
531
532             this_tree  = contrib_tree(dirs_c(k));
533
534             mprintf(_("\nBuilding the manual file [%s] in %s.\n"),output_format,strsubst(dirs_c(k),SCI_long,"SCI"));
535
536             // Define and create the final output directory if does not exist
537             final_output_dir = pathconvert(dirs_c(k)+"/../../"+output_format_ext,%f,%f);
538
539             if ~isdir(final_output_dir) then
540                 mkdir(final_output_dir);
541             end
542
543             // To improve the final_output_dir path
544             final_output_dir = pathconvert(fullpath(final_output_dir),%f,%f);
545
546             if is_chm then
547                 final_output_dir = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
548             elseif is_html then
549                 final_output_dir = pathconvert(final_output_dir+"/"+directory_language_c(k),%f,%f);
550                 if ~isdir(final_output_dir) then
551                     mkdir(final_output_dir);
552                 end
553             end
554
555             // Define and create the path of buildDoc working directory
556             buildDoc_dir  = pathconvert(dirs_c(k) + "/scilab_" + directory_language_c(k) + "_help",%t,%f);
557             if ~isdir(buildDoc_dir) then
558                 mkdir(buildDoc_dir);
559             end
560
561             // Define the final location of the generated file
562             if is_chm then
563                 final_help_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
564             elseif is_html then
565                 final_help_file = pathconvert(final_output_dir+"/index.html",%f,%f);
566             else
567                 final_help_file = pathconvert(final_output_dir+"/scilab_" + directory_language_c(k) + "_help." + output_format_ext,%f,%f);
568             end
569
570
571             // Define the path of the generated file created by buildDoc
572             if is_chm then
573                 buildDoc_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
574             elseif is_html then
575                 buildDoc_file = pathconvert(buildDoc_dir + "index.html",%f,%f);
576             else
577                 buildDoc_file = pathconvert(buildDoc_dir + "scilab_" + directory_language_c(k) + "_help." + output_format_ext,%f,%f);
578             end
579
580             // Save the current directory
581             cur_dir = pwd();
582
583             // Change Scilab current directory so that Java Indexer works
584             if ~chdir(buildDoc_dir) then
585                 chdir(cur_dir);
586                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",buildDoc_dir));
587             end
588
589             // process the build
590             fileToExec = buildDocv2(output_format,this_tree("master_document"),directory_language_c(k),dirs_c(k));
591             if fileToExec ~= [] then
592                 exec(fileToExec, -1);
593                 buildDocv2("jar-only",this_tree("master_document"),directory_language_c(k),dirs_c(k));
594             end
595
596             check_move(buildDoc_file);
597
598             // Now we can add the help file to the list of all generated files
599             generated_files = [ generated_files ; final_help_file ];
600
601         end
602
603     else
604         // ------------------------------
605         // external (Toolboxes)
606         // ------------------------------
607
608
609         // Dirs are precised in the input arguments
610
611         nb_dir      = size(dirs,"*");
612         displaydone = 0;
613
614         for k=1:nb_dir
615
616             // Save the current directory
617             cur_dir = pwd();
618
619             this_tree  = contrib_tree(dirs(k));
620
621             if nb_dir > 1 then
622                 if displaydone == 0 then
623                     mprintf(_("\nBuilding the manual file [%s].\n"),output_format);
624                     displaydone = 1;
625                 end
626                 mprintf(_("\t%s\n"),strsubst(dirs(k),SCI_long,"SCI"));
627             else
628                 mprintf(_("\nBuilding the manual file [%s] in %s.\n"),output_format,strsubst(dirs(k),SCI_long,"SCI"));
629             end
630
631             // Define and create the final output directory if does not exist
632             final_output_dir = pathconvert(dirs(k)+"/../../"+output_format_ext,%f,%f);
633
634             if ~isdir(final_output_dir) then
635                 mkdir(final_output_dir);
636             end
637
638             // To improve the final_output_dir path
639
640             if ~chdir(final_output_dir) then
641                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",final_output_dir));
642             end
643
644             final_output_dir = pathconvert(pwd(),%f,%f);
645
646             if is_chm then
647                 // nothing to do
648             else
649                 if is_html then
650                     final_output_dir = pathconvert(final_output_dir+"/"+directory_language(k),%f,%f);
651                     if ~isdir(final_output_dir) then
652                         mkdir(final_output_dir);
653                     end
654                 end
655             end
656
657             // Define and create the path of buildDoc working directory
658             buildDoc_dir  = pathconvert(dirs(k) + "/scilab_" + directory_language(k) + "_help",%t,%f);
659             if ~isdir(buildDoc_dir) then
660                 mkdir(buildDoc_dir);
661             end
662
663             // Define the final location of the generated file
664             if is_chm then
665                 final_help_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
666             else
667                 if is_html then
668                     final_help_file = pathconvert(final_output_dir+"/index.html",%f,%f);
669                 else
670                     final_help_file = pathconvert(final_output_dir+"/scilab_" + directory_language(k) + "_help." + output_format_ext,%f,%f);
671                 end
672             end
673
674             // Define the path of the generated file created by buildDoc
675             if is_chm then
676                 buildDoc_file = pathconvert(buildDoc_dir + "htmlhelp.hhp",%f,%f);
677             elseif is_html then
678                 buildDoc_file = pathconvert(buildDoc_dir + "index.html",%f,%f);
679             else
680                 buildDoc_file = pathconvert(buildDoc_dir + "scilab_" + directory_language(k) + "_help." + output_format_ext,%f,%f);
681             end
682
683             // Change Scilab current directory so that Java Indexer works
684             if ~chdir(buildDoc_dir) then
685                 error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",buildDoc_dir));
686             end
687
688             // process the build
689             fileToExec = buildDocv2(output_format,this_tree("master_document"),directory_language(k),dirs(k));
690             if fileToExec ~= [] then
691                 exec(fileToExec, -1);
692                 buildDocv2("jar-only",this_tree("master_document"),directory_language(k),dirs(k));
693             end
694
695             check_move(buildDoc_file);
696
697             // Now we can add the help file to the list of all generated files
698             generated_files = [ generated_files ; final_help_file ];
699
700         end
701     end
702
703     // Restore the original environment
704     //--------------------------------------------------------------------------
705
706     chdir(current_directory);
707     %helps         = %helps_save;
708     %helps_modules = %helps_modules_save;
709     %HELPS         = saved_helps;
710
711 endfunction
712
713 // =============================================================================
714 // check and move the generated files
715 // =============================================================================
716 function check_move(buildDoc_file)
717
718     // Check if the help file has been generated
719     if fileinfo(buildDoc_file)==[] then
720         chdir(cur_dir);
721         error(msprintf(gettext("%s: %s has not been generated."),"xmltoformat",buildDoc_file));
722     end
723
724     // move the generated file(s)
725     if is_chm then
726
727     elseif is_html then
728         my_html_files = listfiles(buildDoc_dir);
729         for k=1:size(my_html_files,"*")
730             if ~copyfile(my_html_files(k),pathconvert(final_output_dir+"/"+my_html_files(k),%f,%f)) then
731                 chdir(cur_dir);
732                 error(msprintf(gettext("%s: %s file hasn''t been moved in the %s directory."),"xmltoformat",my_html_files(k),final_output_dir));
733             end
734             mdelete(my_html_files(k));
735         end
736     else
737         copyfile(buildDoc_file,final_help_file);
738         mdelete(buildDoc_file);
739     end
740
741     // Move into the initial directory
742     if ~chdir(cur_dir) then
743         error(msprintf(gettext("%s: Directory %s does not exist or read access denied."),"xmltoformat",cur_dir));
744     end
745
746 endfunction
747
748 // =============================================================================
749 // dirs_out = x2f_get_xml_path(dirs_in,my_wanted_language)
750 // =============================================================================
751
752 function dirs_out = x2f_get_xml_path(dirs_in,my_wanted_language)
753
754     dirs_out = [];
755
756     for k=1:size(dirs_in,"*")
757
758         if basename(dirs_in(k)) == "jar" then
759
760             help_basepath = part(dirs_in(k),1:length(dirs_in(k))-4) + filesep() + "help";
761
762             if isdir(help_basepath + filesep() +my_wanted_language) then
763                 dirs_out(k) = help_basepath + filesep() + my_wanted_language;
764             elseif isdir(help_basepath+filesep()+getdefaultlanguage()) then
765                 dirs_out(k) = help_basepath+filesep()+getdefaultlanguage();
766             else
767                 dirs_out(k) = "";
768             end
769
770         else
771             dirs_out(k) = dirs_in(k);
772         end
773
774     end
775
776 endfunction
777
778 // =============================================================================
779 // language_out = x2f_guess_lang(dir_in)
780 // =============================================================================
781
782 function language_out = x2f_guess_lang(dir_in)
783
784     language_out = getlanguage();
785
786     [my_start,my_end,my_match] = regexp(basename(dir_in),"/([a-z][a-z]_[A-Z][A-Z])$/");
787
788     if my_start <> [] then
789         language_out = part(my_match,1:5);
790     end
791
792 endfunction
793
794 // =============================================================================
795 // x2f_reset_help_mod_var(language)
796 // =============================================================================
797
798 function x2f_reset_help_mod_var(language)
799
800     global %helps_modules;
801
802     // Reset the variable in hand
803     %helps_modules = [];
804
805     modules_ordered_list = mgetl(SCI + "/modules/helptools/etc/MAIN_CHAPTERS");
806     // remove empty lines in MAIN_CHAPTERS
807     modules_ordered_list(modules_ordered_list == "") = [];
808
809     // get current modules used by scilab
810     current_modules_list = getmodules();
811
812     size_current_modules = size(current_modules_list, "*");
813     size_modules_ordered = size(modules_ordered_list, "*");
814
815     if size_current_modules > size_modules_ordered then
816         error(msprintf(gettext("%s: Please check %s, number of modules is invalid.\n"), "xmltoformat", SCI + "/modules/helptools/etc/MAIN_CHAPTERS"));
817     end
818
819     // Remove modules not present
820     k = 1;
821     cleaned_ordered_modules = [];
822     for i = 1:size_modules_ordered
823         for j = 1:size_current_modules
824             if (current_modules_list(j) == modules_ordered_list(i)) then
825                 cleaned_ordered_modules(k) = modules_ordered_list(i);
826                 k = k + 1;
827             end
828         end
829     end
830
831     // We force to add windows_tools module in help
832     // Bug 9790
833     if getos() <> "Windows" then
834         cleaned_ordered_modules(k) = "windows_tools";
835     end
836
837     size_cleaned_modules = size(cleaned_ordered_modules, "*");
838
839     // Loop on modules available ordered
840     for k = 1:size_cleaned_modules;
841         addchapter_path = SCI + "/modules/" + cleaned_ordered_modules(k) + "/help/" + language + "/addchapter.sce";
842         if isfile(addchapter_path) then
843             exec(addchapter_path, -1);
844         end
845     end
846
847 endfunction
848
849 // =============================================================================
850 // tree = x2f_dir_to_tree(directory,level)
851 //
852 // level :
853 //  0 : book
854 //  1 : part
855 //  2 : chapter
856 //  3 : sect1
857 //  4 : sect2
858 //  5 : sect3
859 //  6 : sect4
860 // ...
861 //
862 // Date : 24/04/2009
863 // =============================================================================
864
865 function tree = x2f_dir_to_tree(directory,level)
866
867     tree = struct();
868     rhs  = argn(2);
869
870     // Check number of input arguments
871     // =========================================================================
872
873     if rhs<>2 then
874         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_dir_to_tree",2));
875     end
876
877     // Check input argument type
878     // =========================================================================
879
880     if type(directory) <> 10 then
881         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"x2f_dir_to_tree",1));
882     end
883
884     if type(level) <> 1 then
885         error(msprintf(gettext("%s: Wrong type for input argument #%d: An integer expected.\n"),"x2f_dir_to_tree",2));
886     end
887
888     // Check input argument dimension
889     // =========================================================================
890
891     if size(directory,"*") <> 1 then
892         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"x2f_dir_to_tree",1));
893     end
894
895     if size(level,"*") <> 1 then
896         error(msprintf(gettext("%s: Wrong size for input argument #%d: An integer expected.\n"),"x2f_dir_to_tree",1));
897     end
898
899     // Check the directory existence
900     // =========================================================================
901
902     if ~isdir(directory) then
903         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing directory is expected.\n"),"x2f_dir_to_tree",1));
904     end
905
906     // ... and now, Action
907     // =========================================================================
908
909     // Normalize the directory path
910     directory    = pathconvert(directory);
911
912
913     // init the structure
914     tree          = struct();
915     tree("path")  = directory;
916     tree("level") = level;
917
918     // If a master.xml file exists, don't go past
919     if fileinfo(directory+"master.xml")<>[] then
920         tree("master.xml") = %T;
921         return;
922     else
923         tree("master.xml") = %F;
924     end
925
926     //
927     // Title management
928     //
929
930     // Parse the CHAPTER file to get the directory title if this file is present
931     if fileinfo(directory+"CHAPTER")<>[] then
932         tree = x2f_cat(tree,x2f_read_CHAPTER(directory+"CHAPTER"));
933     end
934
935     // Check if the addchapter.sce is present
936     if fileinfo(directory+"addchapter.sce")<>[] then
937         tree("title_addchapter") = basename(directory);
938     end
939
940     // Check if the last_successful_build is present
941     if fileinfo(directory+".last_successful_build")<>[] then
942         tree = x2f_cat(tree , x2f_read_lsb(directory+".last_successful_build"));
943     end
944
945     // Get the default title
946
947     if getos() == "Windows" then
948         tmpdirectory = strsubst(directory,"/\\$/","","r");
949     else
950         tmpdirectory = strsubst(directory,"/\/$/","","r");
951     end
952
953     tree("title_default") = basename(tmpdirectory);
954
955     //
956     // XML list management
957     //
958
959     // get the xml list
960     xmlfiles = x2f_get_xml_files(directory);
961
962     // Allocate the xml list
963     tree("xml_list")    = xmlfiles;
964     tree("xml_number")  = size(xmlfiles(:,1),"*");
965
966     //
967     // Sub Trees management
968     //
969
970     // get the directory list
971     directories = x2f_get_directories(directory);
972
973     for i=1:size(directories,"*")
974         this_dir_tree = x2f_dir_to_tree(directory+directories(i),tree("level") + 1);
975         if this_dir_tree("xml_number") > 0 then
976             tree("dir_"+getmd5(directories(i),"string")) = this_dir_tree;
977             tree("xml_number") = tree("xml_number") + this_dir_tree("xml_number");
978         end
979     end
980
981 endfunction
982
983 // =============================================================================
984 // xmlfiles = x2f_get_xml_files(directory)
985 // return an n X 3 matrix
986 //
987 // xmlfiles(:,1) : basename of each XML file
988 // xmlfiles(:,2) : full path of each XML file
989 // xmlfiles(:,3) : Last modification time of each XML file
990 //
991 // Date : 24/04/2009
992 // =============================================================================
993
994 function xmlfiles = x2f_get_xml_files(directory)
995
996     rhs = argn(2);
997
998     // Check number of input arguments
999     // =========================================================================
1000
1001     if rhs <> 1 then
1002         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_get_xml_files",1));
1003     end
1004
1005     // Check input argument type
1006     // =========================================================================
1007
1008     if type(directory) <> 10 then
1009         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"x2f_get_xml_files",1));
1010     end
1011
1012     // Check input argument dimension
1013     // =========================================================================
1014
1015     if size(directory,"*") <> 1 then
1016         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"x2f_get_xml_files",1));
1017     end
1018
1019     // Check the directory existence
1020     // =========================================================================
1021
1022     if ~isdir(directory) then
1023         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing directory is expected.\n"),"x2f_get_xml_files",1));
1024     end
1025
1026     // ... and now, Action
1027     // =========================================================================
1028
1029     directory = pathconvert(directory);
1030
1031     // remove duplicated names in current directory (example: case ".xml~")
1032     xmlfiles = unique(basename(findfiles(directory, "*.xml")));
1033
1034     xmlfiles = gsort(xmlfiles, "lr", "i");
1035     xmlfiles(grep(xmlfiles,"master_help")) = [];
1036     xmlfiles(grep(xmlfiles,"master"))      = [];
1037
1038     // Loop on all xml files to get their full path
1039     // =========================================================================
1040
1041     if xmlfiles <> [] then
1042         xmlpaths = directory + xmlfiles + ".xml";
1043     else
1044         xmlpaths = [];
1045     end
1046
1047     // Get XML modification time
1048     // =========================================================================
1049
1050     if xmlpaths<>[] then
1051         infos = fileinfo(xmlpaths);
1052         ft = format();
1053         format(20);
1054         lmt   = string(infos(:,7));
1055         format(ft(2),ft(1));
1056     else
1057         lmt   = [];
1058     end
1059
1060     // xmlfiles => md5sum
1061     // =========================================================================
1062
1063     if xmlfiles <> [] then
1064         xmlmd5 = "a" + getmd5(xmlpaths,"string");
1065     else
1066         xmlmd5 = [];
1067     end
1068
1069     // Build the final matrix
1070     // =========================================================================
1071     xmlfiles = [ xmlmd5 xmlpaths lmt xmlfiles];
1072
1073 endfunction
1074
1075 // =============================================================================
1076 // directories = x2f_get_directories(directory)
1077 //
1078 // Returns a colum vector that contain the list of subdirectories of <directory>
1079 //
1080 // Date : 24/04/2009
1081 // =============================================================================
1082
1083 function directories = x2f_get_directories(directory)
1084
1085     rhs  = argn(2);
1086
1087     // Check number of input arguments
1088     // =========================================================================
1089
1090     if rhs <> 1 then
1091         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_get_directories",1));
1092     end
1093
1094     // Check input argument type
1095     // =========================================================================
1096
1097     if type(directory) <> 10 then
1098         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"x2f_get_directories",1));
1099     end
1100
1101     // Check input argument dimension
1102     // =========================================================================
1103
1104     if size(directory,"*") <> 1 then
1105         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"x2f_get_directories",1));
1106     end
1107
1108     // Check the directory existence
1109     // =========================================================================
1110
1111     if ~isdir(directory) then
1112         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing directory is expected.\n"),"x2f_get_directories",1));
1113     end
1114
1115     // ... and now, Action
1116     // =========================================================================
1117
1118     // Normalize the directory path
1119     directory = pathconvert(directory);
1120
1121     items       = listfiles(directory);
1122     directories = [];
1123
1124     for i=1:size(items,"*")
1125         if isdir(directory+items(i)) then
1126             directories = [ directories ; items(i) ];
1127         end
1128     end
1129
1130     // Sort directories
1131     directories = gsort(basename(directories),"lr","i");
1132
1133     // Remove directories that start with a dot from the list
1134     directories(grep(directories,"/^\./","r")) = [];
1135
1136     // Remove blank strings from the list
1137     directories(find(directories == "")) = [];
1138
1139     // Remove all scilab_xx_XX_help directories from the list
1140     directories( grep(directories,"/^scilab_[a-z][a-z]_[A-Z][A-Z]_help$/","r") ) = []
1141
1142 endfunction
1143
1144 // =============================================================================
1145 // desc_out = x2f_read_CHAPTER(file_in)
1146 // Parse a CHAPTER file
1147 //
1148 // Date : 24/04/2009
1149 // =============================================================================
1150
1151 function desc_out = x2f_read_CHAPTER(file_in)
1152
1153     desc_out = struct();
1154
1155     rhs  = argn(2);
1156
1157     // Check number of input arguments
1158     // =========================================================================
1159
1160     if rhs <> 1 then
1161         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_read_CHAPTER",1));
1162     end
1163
1164     // Check input arguments value
1165     // =========================================================================
1166
1167     if regexp( file_in,"/CHAPTER$/") == [] then
1168         error(msprintf(gettext("%s: Wrong value for input argument #%d: A string that end with CHAPTER expected.\n"),"x2f_read_CHAPTER",1));
1169     end
1170
1171     // Check the input file existence
1172     // =========================================================================
1173
1174     if fileinfo( file_in ) == [] then
1175         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing file is expected.\n"),"x2f_read_CHAPTER",1));
1176     end
1177
1178     // ... and now, Action
1179     // =========================================================================
1180
1181     FILETOPARSE = mgetl(file_in);
1182
1183     current_field = "";
1184
1185     for i=1:size(FILETOPARSE,"*")
1186
1187         // Second case : Current field continuation
1188         if (regexp(FILETOPARSE(i),"/^\s/","o") == 1) & (current_field <> "") then
1189             current_value = part(FILETOPARSE(i),2:length(FILETOPARSE(i)));
1190             desc_out(current_field) = [ desc_out(current_field) ; current_value ];
1191             continue;
1192         end
1193
1194         // First case : new field
1195         if regexp(FILETOPARSE(i),"/^[a-zA-Z][a-zA-Z0-9_]*\s*=\s*/","o") == 1 then
1196             [current_field_start, current_field_end] = regexp(FILETOPARSE(i),"/\s*=\s*/","o")
1197             current_field           = part(FILETOPARSE(i),1:current_field_start-1);
1198             current_value           = part(FILETOPARSE(i),current_field_end+1:length(FILETOPARSE(i)));
1199             desc_out(current_field) = current_value;
1200             continue;
1201         end
1202
1203         // Third case : Blank line
1204         if length(stripblanks(FILETOPARSE(i))) == 0 then
1205             continue;
1206         end
1207
1208         // Else Error
1209         error(msprintf(gettext("%s: The CHAPTER file is not well formated at line %d\n"),"x2f_read_CHAPTER",i));
1210
1211     end
1212
1213 endfunction
1214
1215 // =============================================================================
1216 // desc_out = x2f_read_lsb(file_in)
1217 // Parse a last_successful_build file
1218 //
1219 // Date : 24/04/2009
1220 // =============================================================================
1221
1222 function desc_out = x2f_read_lsb(file_in)
1223
1224     desc_out = struct();
1225     rhs      = argn(2);
1226
1227     // Check number of input arguments
1228     // =========================================================================
1229
1230     if rhs <> 1 then
1231         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"x2f_read_lsb",1));
1232     end
1233
1234     // Check input arguments value
1235     // =========================================================================
1236
1237     if regexp( file_in,"/\.last_successful_build$/") == [] then
1238         error(msprintf(gettext("%s: Wrong value for input argument #%d: A string that end with .last_successful_build expected.\n"),"x2f_read_lsb",1));
1239     end
1240
1241     // Check the input file existence
1242     // =========================================================================
1243
1244     if fileinfo( file_in ) == [] then
1245         error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid existing file is expected.\n"),"x2f_read_lsb",1));
1246     end
1247
1248     // ... and now, Action
1249     // =========================================================================
1250
1251     FILETOPARSE = stripblanks(mgetl(file_in));
1252
1253     for i=1:size(FILETOPARSE,"*")
1254
1255         // First case : new field
1256         if regexp(FILETOPARSE(i),"/^[a-zA-Z][a-zA-Z0-9_]*\s=\s/","o") == 1 then
1257             current_field_length    = regexp(FILETOPARSE(i),"/\s=\s/","o")
1258             current_field           = part(FILETOPARSE(i),1:current_field_length-1);
1259             current_value           = part(FILETOPARSE(i),current_field_length+3:length(FILETOPARSE(i)));
1260
1261             if regexp(current_value,"/^[0-9]+$/") == [] then
1262                 error(msprintf(gettext("%s: The last_successful_build file is not well formated at line %d\n"),"x2f_read_lsb",i));
1263             end
1264
1265             desc_out(current_field) = strtod(current_value);
1266             continue;
1267         end
1268
1269         // Third case : Blank line
1270         if length(FILETOPARSE(i)) == 0 then
1271             continue;
1272         end
1273
1274         // Else Error
1275         error(msprintf(gettext("%s: The last_successful_build file is not well formated at line %d\n"),"x2f_read_lsb",i));
1276
1277     end
1278
1279 endfunction
1280
1281 // =============================================================================
1282 // desc_out = x2f_cat( desc_in_1 , desc_in_2)
1283 //
1284 // Concatenate two mlist
1285 //
1286 // Date : 27/04/2009
1287 // =============================================================================
1288
1289 function desc_out = x2f_cat(desc_in_1,desc_in_2)
1290
1291     rhs = argn(2);
1292
1293     // Check number of input arguments
1294     // =========================================================================
1295
1296     if rhs <> 2 then
1297         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_cat",2));
1298     end
1299
1300     // Check input arguments type
1301     // =========================================================================
1302
1303     if type(desc_in_1) <> 17 then
1304         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat",1));
1305     end
1306
1307     if type(desc_in_2) <> 17 then
1308         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat",2));
1309     end
1310
1311     // ... and now, Action
1312     // =========================================================================
1313
1314     fields_in_2      = getfield(1,desc_in_2);
1315     fields_in_2(1:2) = [];
1316
1317     if or(isfield(desc_in_1,fields_in_2)) then
1318         error(msprintf(gettext("%s: The 2 mlist must not have any field in common .\n"),"x2f_cat"));
1319     end
1320
1321     desc_out = desc_in_1;
1322
1323     for i=1:size(fields_in_2,"*")
1324         desc_out(fields_in_2(i)) = desc_in_2(fields_in_2(i));
1325     end
1326
1327 endfunction
1328
1329 // =============================================================================
1330 // master_document = x2f_tree_to_master( tree )
1331 //
1332 // Date : 27/04/2009
1333 // =============================================================================
1334
1335 function master_document = x2f_tree_to_master( tree )
1336
1337     rhs = argn(2);
1338
1339     // Check number of input arguments
1340     // =========================================================================
1341
1342     if rhs <> 1 then
1343         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_tree_to_master",1));
1344     end
1345
1346     // Check input arguments type
1347     // =========================================================================
1348
1349     if type(tree) <> 17 then
1350         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_tree_to_master",1));
1351     end
1352
1353     // if a master.xml exists in the directory, return this file
1354     // =========================================================================
1355
1356     if isfield(tree,"master.xml") & tree("master.xml")  then
1357         str = mgetl( tree("path") + "master.xml" );
1358         return;
1359     end
1360
1361     // Start output
1362     // =========================================================================
1363
1364     if isfield(tree,"language") then
1365         language = tree("language");
1366     else
1367         language = "en_US";
1368     end
1369
1370     master_document = ["<?xml version=""1.0"" encoding=""UTF-8""?>";..
1371     "<!DOCTYPE book [";
1372     "<!--Begin Entities-->"];
1373
1374     // Get the list of all xml files present in this tree
1375     tree_xmllist = x2f_cat_xmllist( tree , [] )
1376
1377     // Process the path if under windows
1378     if getos() == "Windows" then
1379         tree_xmllist(:,2) = "file:///"+ strsubst(getlongpathname(tree_xmllist(:,2)) ,"\","/");
1380     end
1381
1382     // Add entities
1383     master_document = [ master_document ; "<!ENTITY "+tree_xmllist(:,1)+" SYSTEM """+tree_xmllist(:,2)+""">" ]
1384
1385     // title management
1386
1387
1388     if isfield(tree,"book_title") & (tree("book_title") <> "") then
1389         // title defined in CHAPTER
1390         book_title = tree("book_title");
1391
1392
1393     elseif isfield(tree,"title_addchapter") & (tree("title_addchapter") <> "") then
1394         // title defined in addchapter.sce
1395         book_title = tree("title_addchapter");
1396
1397     else
1398         // title built with the directory name
1399         book_title = tree("title_default");
1400     end
1401
1402     book_title = strsubst(book_title,"&"  ,"&amp;");
1403     book_title = strsubst(book_title,"""" ,"&quot;");
1404     book_title = strsubst(book_title,">"  ,"&gt;");
1405     book_title = strsubst(book_title,"<"  ,"&lt;");
1406
1407     master_document    = [ master_document; ..
1408     "<!--End Entities-->"; ..
1409     "]>"; ..
1410     "<book version=""5.0-subset Scilab"" xml:lang="""+language+""""; ..
1411     "      xmlns=""http://docbook.org/ns/docbook"""; ..
1412     "      xmlns:xlink=""http://www.w3.org/1999/xlink"""; ..
1413     "      xmlns:xi=""http://www.w3.org/2001/XInclude"""; ..
1414     "      xmlns:svg=""http://www.w3.org/2000/svg"""; ..
1415     "      xmlns:mml=""http://www.w3.org/1998/Math/MathML"""; ..
1416     "      xmlns:html=""http://www.w3.org/1999/xhtml"""; ..
1417     "      xmlns:db=""http://docbook.org/ns/docbook"">"; ..
1418     "  <info xml:id=''"+x2f_title2id(book_title)+"_manual''>"; ..
1419     "    <title>"+book_title+"</title>"; ..
1420     "  </info>"; ..
1421     ""];
1422
1423     // title management
1424     // =========================================================================
1425
1426     // title management
1427     if isfield(tree,"title") & (tree("title") <> "") then
1428         // title defined in CHAPTER
1429         section_title = tree("title");
1430     elseif isfield(tree,"title_addchapter") & (tree("title_addchapter") <> "") then
1431         // title defined in addchapter.sce
1432         section_title = tree("title_addchapter");
1433     else
1434         // title built with the directory name
1435         section_title = tree("title_default");
1436     end
1437
1438     // xml_list management
1439     // =========================================================================
1440
1441     offset = 0;
1442
1443     if isfield(tree,"xml_list") then
1444         xmllist        = tree("xml_list");
1445         if xmllist <> [] then
1446             master_document = [ master_document ; "<part xml:id=''section_"+getmd5(strsubst(tree("path"),SCI,""),"string")+"''>" ];
1447             master_document = [ master_document ; "<title>"+section_title+"</title>" ];
1448             master_document = [ master_document ; "&"+xmllist(:,1)+";" ];
1449             offset          = 1;
1450         end
1451     end
1452
1453     // Loop on dir_
1454     // =========================================================================
1455
1456     my_subtrees = getfield(1,tree);
1457     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1458
1459     for i=1:size(my_subtrees,"*")
1460         master_document = [ master_document ; x2f_tree_to_section( tree(my_subtrees(i)) , offset ) ];
1461     end
1462
1463     // End of master document
1464     // =========================================================================
1465
1466     if offset == 1 then
1467         master_document = [ master_document ; "</part>" ];
1468     end
1469
1470     master_document = [ master_document; "</book>" ];
1471
1472 endfunction
1473
1474 // =============================================================================
1475 // master_section = x2f_tree_to_section( tree , offset )
1476 //
1477 // Date : 27/04/2009
1478 // =============================================================================
1479
1480 function master_section = x2f_tree_to_section( tree , offset )
1481
1482     rhs = argn(2);
1483
1484     // Check number of input arguments
1485     // =========================================================================
1486
1487     if rhs <> 2 then
1488         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_tree_to_section",2));
1489     end
1490
1491     // Check input arguments type
1492     // =========================================================================
1493
1494     if type(tree) <> 17 then
1495         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_tree_to_section",1));
1496     end
1497
1498     if type(offset) <> 1 then
1499         error(msprintf(gettext("%s: Wrong type for input argument #%d: An integer expected.\n"),"x2f_tree_to_section",2));
1500     end
1501
1502     // And now, action ...
1503     // =========================================================================
1504
1505     //
1506     // Section Type management
1507     //
1508
1509     // level :
1510     //  0 : book
1511     //  1 : part
1512     //  2 : chapter
1513     //  3 : sect1
1514     //  4 : sect2
1515     //  5 : sect3
1516     //  6 : sect4
1517
1518     section_types = [ ..
1519     "book"    ; ..
1520     "part"    ; ..
1521     "chapter" ; ..
1522     "section" ; ..
1523     "section"   ; ..
1524     "section"   ; ..
1525     "section"   ; ..
1526     "section"   ];
1527
1528     if isfield(tree,"level") & ((tree("level") + offset)>0) & ((tree("level") + offset)<8) then
1529         section_type = section_types( tree("level") + offset + 1 );
1530     else
1531         section_type = "reference";
1532     end
1533
1534     //
1535     // title management
1536     //
1537
1538     if isfield(tree,"title_addchapter") & (tree("title_addchapter") <> "") then
1539         // title defined in addchapter.sce
1540         section_title = tree("title_addchapter");
1541     elseif isfield(tree,"title") & (tree("title") <> "") then
1542         // title defined in CHAPTER
1543         section_title = tree("title");
1544     else
1545         // title built with the directory name
1546         section_title = tree("title_default");
1547     end
1548
1549     if (isfield(tree, "xml_id")) then
1550         xml_id = tree("xml_id");
1551     else
1552         xml_id = "section_"+getmd5(strsubst(tree("path"),SCI,""),"string");
1553     end
1554
1555     section_title  = strsubst(section_title,"&"  ,"&amp;");
1556     section_title  = strsubst(section_title,"""" ,"&quot;");
1557     section_title  = strsubst(section_title,">"  ,"&gt;");
1558     section_title  = strsubst(section_title,"<"  ,"&lt;");
1559
1560     master_section = [];
1561     master_section = [ master_section ; "<"+section_type+" xml:id=''" + xml_id + "''>" ];
1562     master_section = [ master_section ; "<title>"+section_title+"</title>" ];
1563
1564     // Loop on dir_
1565     // =========================================================================
1566
1567     my_subtrees = getfield(1,tree);
1568     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1569
1570     for i=1:size(my_subtrees,"*")
1571         master_section = [ master_section ; x2f_tree_to_section( tree(my_subtrees(i)) , offset ) ];
1572     end
1573
1574     // xml list
1575     // =========================================================================
1576
1577     if isfield(tree,"xml_list") then
1578         xmllist        = tree("xml_list");
1579         if xmllist <> [] then
1580             master_section = [ master_section ; "&"+xmllist(:,1)+";" ];
1581         end
1582     end
1583
1584     master_section = [ master_section ; "</"+section_type+">" ];
1585
1586 endfunction
1587
1588 // =============================================================================
1589 // tree_out = x2f_merge_trees( tree_in_1 , tree_in_2 )
1590 //
1591 // Date : 27/04/2009
1592 // =============================================================================
1593
1594 function tree_out = x2f_merge_trees( tree_in_1 , tree_in_2 )
1595
1596     // tree_in_1 : reference tree
1597     // tree_in_2 : tree to fill
1598
1599     rhs = argn(2);
1600
1601     // Check number of input arguments
1602     // =========================================================================
1603
1604     if rhs <> 2 then
1605         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_merge_trees",1));
1606     end
1607
1608     // Check input arguments type
1609     // =========================================================================
1610
1611     if type(tree_in_1) <> 17 then
1612         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_merge_trees",1));
1613     end
1614
1615     if type(tree_in_2) <> 17 then
1616         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_merge_trees",2));
1617     end
1618
1619     tree_out = tree_in_2;
1620
1621     // Loop on dir_
1622     // =========================================================================
1623
1624     my_subtrees = getfield(1,tree_in_1);
1625     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1626
1627     for i=1:size(my_subtrees,"*")
1628         // Check if the subtree exists in tree_in_2
1629         if ~isfield(tree_in_2,my_subtrees(i)) then
1630             // if not, copy the whole subtree in tree_in_2
1631             this_subtree             = tree_in_1(my_subtrees(i));
1632             tree_out(my_subtrees(i)) = tree_in_1(my_subtrees(i));
1633             tree_out("xml_number")   = tree_out("xml_number") + this_subtree("xml_number");
1634
1635         else
1636             // if yes, iterate with x2f_merge_trees
1637             this_subtree_before      = tree_in_2(my_subtrees(i))
1638             xml_number_before        = this_subtree_before("xml_number");
1639             this_subtree_after       = x2f_merge_trees( tree_in_1(my_subtrees(i)) , this_subtree_before );
1640             xml_number_after         = this_subtree_after("xml_number");
1641
1642             tree_out(my_subtrees(i)) = this_subtree_after;
1643             tree_out("xml_number")   = tree_out("xml_number") + xml_number_after - xml_number_before;
1644         end
1645     end
1646
1647     // XML list management
1648     // =========================================================================
1649
1650     if isfield(tree_in_1,"xml_list") then
1651         xmllist_1 = tree_in_1("xml_list");
1652     else
1653         xmllist_1 = [];
1654     end
1655
1656     if isfield(tree_in_2,"xml_list") then
1657         xmllist_2 = tree_in_2("xml_list");
1658     else
1659         xmllist_2 = [];
1660     end
1661
1662     xmllist_out = xmllist_2;
1663
1664     for i=1:size(xmllist_1(:,4),"*")
1665         if find(xmllist_2(:,4) == xmllist_1(i,4)) == [] then
1666             xmllist_out             = [ xmllist_out ; xmllist_1(i,:) ];
1667             tree_out("xml_number")  = tree_out("xml_number") + 1;
1668         end
1669     end
1670
1671     tree_out("xml_list") = xmllist_out;
1672
1673 endfunction
1674
1675 // =============================================================================
1676 // xmllist_out = x2f_cat_xmllist( tree , xmllist_in )
1677 //
1678 // Returns a n x 3 matrix that list all xmlfile in this tree and subtrees
1679 //
1680 // Date : 27/04/2009
1681 // =============================================================================
1682
1683 function xmllist_out = x2f_cat_xmllist( tree , xmllist_in )
1684
1685     rhs         = argn(2);
1686     xmllist_out = xmllist_in;
1687
1688     // Check number of input arguments
1689     // =========================================================================
1690
1691     if rhs <> 2 then
1692         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_cat_xmllist",2));
1693     end
1694
1695     // Check input arguments type
1696     // =========================================================================
1697
1698     if type(tree) <> 17 then
1699         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat_xmllist",1));
1700     end
1701
1702     if (xmllist_in<> []) & (type(xmllist_in) <> 10) then
1703         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"x2f_cat_xmllist",2));
1704     end
1705
1706     // This tree xml list to start
1707     // =========================================================================
1708
1709     if isfield(tree,"xml_list") then
1710         xmllist_out = [ xmllist_out ; tree("xml_list") ];
1711     end
1712
1713     // Loop on dir_
1714     // =========================================================================
1715
1716     my_subtrees = getfield(1,tree);
1717     my_subtrees(find(part(my_subtrees,1:4)<>"dir_")) = [];
1718
1719     for i=1:size(my_subtrees,"*")
1720         xmllist_out = x2f_cat_xmllist( tree(my_subtrees(i)) , xmllist_out );
1721     end
1722
1723 endfunction
1724
1725 // =============================================================================
1726 // section_id = x2f_title2id(title)
1727 //
1728 // Returns a normalized string from <title> string
1729 //
1730 // Date : 27/04/2009
1731 // =============================================================================
1732
1733 function section_id = x2f_title2id(title_in)
1734
1735     section_id = title_in;
1736
1737     section_id = strsubst(section_id , "&"  , "_" );
1738
1739     section_id = strsubst(section_id , "À"  , "A" );
1740     section_id = strsubst(section_id , "Á"  , "A" );
1741     section_id = strsubst(section_id , "Â"  , "A" );
1742     section_id = strsubst(section_id , "Ã"  , "A" );
1743     section_id = strsubst(section_id , "Ä"  , "A" );
1744     section_id = strsubst(section_id , "Å"  , "A" );
1745     section_id = strsubst(section_id , "Æ"  , "AE");
1746     section_id = strsubst(section_id , "Ç"  , "C" );
1747     section_id = strsubst(section_id , "È"  , "E" );
1748     section_id = strsubst(section_id , "É"  , "E" );
1749     section_id = strsubst(section_id , "Ê"  , "E" );
1750     section_id = strsubst(section_id , "Ë"  , "E" );
1751     section_id = strsubst(section_id , "Ì"  , "I" );
1752     section_id = strsubst(section_id , "Í"  , "I" );
1753     section_id = strsubst(section_id , "Î"  , "I" );
1754     section_id = strsubst(section_id , "Ï"  , "I" );
1755     section_id = strsubst(section_id , "Ð"  , "D" );
1756     section_id = strsubst(section_id , "Ñ"  , "N" );
1757     section_id = strsubst(section_id , "Ò"  , "O" );
1758     section_id = strsubst(section_id , "Ó"  , "O" );
1759     section_id = strsubst(section_id , "Ô"  , "O" );
1760     section_id = strsubst(section_id , "Õ"  , "O" );
1761     section_id = strsubst(section_id , "Ö"  , "O" );
1762     section_id = strsubst(section_id , "Ù"  , "U" );
1763     section_id = strsubst(section_id , "Ú"  , "U" );
1764     section_id = strsubst(section_id , "Û"  , "U" );
1765     section_id = strsubst(section_id , "Ü"  , "U" );
1766     section_id = strsubst(section_id , "Ý"  , "Y" );
1767     section_id = strsubst(section_id , "à"  , "a" );
1768     section_id = strsubst(section_id , "á"  , "a" );
1769     section_id = strsubst(section_id , "â"  , "a" );
1770     section_id = strsubst(section_id , "ã"  , "a" );
1771     section_id = strsubst(section_id , "ä"  , "a" );
1772     section_id = strsubst(section_id , "å"  , "a" );
1773     section_id = strsubst(section_id , "æ"  , "ae");
1774     section_id = strsubst(section_id , "ç"  , "c" );
1775     section_id = strsubst(section_id , "è"  , "e" );
1776     section_id = strsubst(section_id , "é"  , "e" );
1777     section_id = strsubst(section_id , "ê"  , "e" );
1778     section_id = strsubst(section_id , "ë"  , "e" );
1779     section_id = strsubst(section_id , "ì"  , "i" );
1780     section_id = strsubst(section_id , "í"  , "i" );
1781     section_id = strsubst(section_id , "î"  , "i" );
1782     section_id = strsubst(section_id , "ï"  , "i" );
1783     section_id = strsubst(section_id , "ñ"  , "n" );
1784     section_id = strsubst(section_id , "ò"  , "o" );
1785     section_id = strsubst(section_id , "ó"  , "o" );
1786     section_id = strsubst(section_id , "ô"  , "o" );
1787     section_id = strsubst(section_id , "õ"  , "o" );
1788     section_id = strsubst(section_id , "ö"  , "o" );
1789     section_id = strsubst(section_id , "ù"  , "u" );
1790     section_id = strsubst(section_id , "ú"  , "u" );
1791     section_id = strsubst(section_id , "û"  , "u" );
1792     section_id = strsubst(section_id , "ü"  , "u" );
1793     section_id = strsubst(section_id , "ý"  , "y" );
1794     section_id = strsubst(section_id , "ÿ"  , "y" );
1795
1796     section_id = strsubst(section_id , ":"  , ""  );
1797     section_id = strsubst(section_id , "\"  , "_" );
1798     section_id = strsubst(section_id , "/"  , "_" );
1799     section_id = strsubst(section_id , "''" , "_" );
1800     section_id = strsubst(section_id , "  " , " " );
1801     section_id = strsubst(section_id , " "  , "_" );
1802     section_id = strsubst(section_id , "["  , ""  );
1803     section_id = strsubst(section_id , "]"  , ""  );
1804
1805     section_id = convstr(section_id,"l");
1806
1807 endfunction
1808
1809 // =============================================================================
1810 // timestamp = x2f_get_most_recent( tree )
1811 //
1812 // Return the timestamp associated with the most recent XML file, ... and its
1813 // path if a second output argument is precised
1814 //
1815 // Date : 27/04/2009
1816 // =============================================================================
1817
1818 function [timestamp,path] = x2f_get_most_recent( tree )
1819
1820     rhs         = argn(2);
1821     timestamp   = 0;
1822     path        = "";
1823
1824     // Check number of input arguments
1825     // =========================================================================
1826
1827     if rhs <> 1 then
1828         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"x2f_get_most_recent",1));
1829     end
1830
1831     // Check input arguments type
1832     // =========================================================================
1833
1834     if type(tree) <> 17 then
1835         error(msprintf(gettext("%s: Wrong type for input argument #%d: matrix oriented typed list expected.\n"),"x2f_cat_xmllist",1));
1836     end
1837
1838     // Get the full XML list
1839     // =========================================================================
1840
1841     xmllist =  x2f_cat_xmllist(tree,[]);
1842
1843     [values,index] = gsort(strtod(xmllist(:,3)));
1844
1845     timestamp = xmllist( index(1) , 3 );
1846     path      = xmllist( index(1) , 2 );
1847
1848 endfunction