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