02975adcdce16cf07ae9c511c988168ad55214e8
[scilab.git] / scilab / modules / modules_manager / macros / tbx_generate_pofile.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
3 // Copyright (C) 2016 - Samuel GOUGEON
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 function ret = tbx_generate_pofile(tbx_name, tbx_path)
15     // tbx_generate_pofile(tbx_name, tbx_path)   // deprecated (6.0)
16     // tbx_generate_pofile(tbx_name)             // deprecated (6.0)
17     // tbx_generate_pofile(tbx_path)             // 6.0
18     // tbx_generate_pofile()                     // 6.0  path = pwd()
19
20     fname = "tbx_generate_pofile"
21     rhs = argn(2)
22
23     // CHECKING INPUT PARAMETERS
24     // -------------------------
25     if and(rhs <> [0 1 2]) then
26         msg = _("%s: Wrong number of input arguments: %d to %d expected.\n")
27         error(msprintf(msg, fname, 0, 1))
28     end
29
30     if rhs==2
31         msg = "%s: %s(name, path) is obsolete. Please use %s(path) instead.\n"
32         warning(msprintf(msg, fname, fname, fname))  // no translation
33
34     elseif rhs==0
35         tbx_path = pwd()
36     else
37         tbx_path = tbx_name
38         if type(tbx_path) <> 10 then
39             msg = _("%s: Argument #%d: Text(s) expected.\n")
40             error(msprintf(msg, fname, rhs))
41         end
42         tbx_path = tbx_path(1)
43         // May be
44         //  * either the former tbx_generate_pofile(tbx_name) (until 5.5.2)
45         //  * or the new        tbx_generate_pofile(tbx_path) (from 6.0.0)
46         if grep(tbx_path,["/" "\"])==[] && ~isdir(tbx_path) then // only name was provided
47             tbx_path = pwd()
48         end
49         if ~isdir(tbx_path) then
50             msg = _("%s: The directory ''%s'' doesn''t exist or is not read accessible.\n")
51             error(msprintf(msg, fname, tbx_path))
52         end
53     end
54
55     // Retrieving the toolbox name
56     // ---------------------------
57     tbx_name = tbx_get_name_from_path(tbx_path)
58
59     //
60     old = pwd();
61     cd(tbx_path);
62     if getos() == "Windows" then
63         XGETTEXT= WSCI + "\tools\gettext\xgettext";
64     else
65         XGETTEXT="xgettext";
66     end
67     XGETTEXT_OPTIONS=" --omit-header -k --keyword=dgettext:2 --keyword=xmlgettext:2 --keyword=_d:2 --language=python ";
68
69     EXTENSIONS=["c" "h" "cpp" "cxx" "hxx" "hpp" "java"];
70     EXTENSIONS_MACROS=["sci" "sce" "start" "quit"];
71     EXTENSIONS_XML=["xml" "xsl"];
72     TARGETDIR="locales";
73
74     mkdir(TARGETDIR);
75     srcFiles = getFilesList("src", EXTENSIONS);
76     srcFiles = [srcFiles ; getFilesList("sci_gateway", EXTENSIONS)];
77     srcFiles = [srcFiles ; getFilesList("macros", EXTENSIONS_MACROS)];
78     srcFiles = [srcFiles ; getFilesList("etc", EXTENSIONS_MACROS)];
79
80     //manage xml preferences files
81     xmlFiles = getFilesList("etc", EXTENSIONS_XML);
82
83     if size(xmlFiles, "*") > 0 then
84         xmlTmpFile = TMPDIR + "/tmpLoc.xml";
85         srcFiles = [srcFiles; xmlTmpFile];
86         xmlFake = mopen(xmlTmpFile, "w");
87         for i = 1:size(xmlFiles, "*")
88             content = mgetl(xmlFiles(i));
89             newLine = sedLoc(content, "/\""_d\(\s*(.*)\s*,\s*(.*)\s*\)\""/", "xmlgettext(""\1"", ""\2"")");// "_d(xxx,xxx)"
90             newLine = sedLoc(newLine, "/\""dgettext\(\s*(.*)\s*,\s*(.*)\s*\)\""/", "xmlgettext(""\1"", ""\2"")");
91             mputl(newLine, xmlFake);
92         end
93         mclose(xmlFake);
94     end
95
96     //parse all files
97     srcFiles = strcat(srcFiles, " ");
98     cmd = XGETTEXT + XGETTEXT_OPTIONS + " -d " + tbx_name + " " + srcFiles + " -p " + TARGETDIR + " -o " + "en_US.po.tmp";
99     host(cmd);
100
101     if exists("xmlTmpFile") then
102         deletefile(xmlTmpFile);
103     end
104
105     fi = fileinfo(TARGETDIR + "/en_US.po.tmp");
106     if fi == [] | fi(1) == 0 then
107         //nothing to extract
108         deletefile(TARGETDIR + "/en_US.po.tmp");
109         rmdir(TARGETDIR);
110         cd(old);
111         ret = [];
112         return;
113     end
114
115     //add header
116     header = ["msgid """"";
117     "msgstr """"";
118     """Content-Type: text/plain; charset=UTF-8\n""";
119     """Content-Transfer-Encoding: 8bit\n""";""];
120
121     poFile = mgetl(TARGETDIR + "/en_US.po.tmp");
122     poFile = [header ; poFile];
123     mputl(poFile, TARGETDIR + "/en_US.po");
124     deletefile(TARGETDIR + "/en_US.po.tmp");
125
126     cd(old);
127     ret = tbx_path + filesep() + TARGETDIR + filesep() + "en_US.po";
128 endfunction
129
130 function result = sedLoc(str, findExp, replaceExp)
131     result = str;
132     index = grep(result, findExp, "r");
133     while index <> []
134         idx = index(1);
135         [startPos, endPos, match, captured] = regexp(result(idx), findExp);
136
137         if captured <> [] then
138             //multiple matches on the same line
139             for i=1:size(captured, "r")
140                 replace = replaceExp;
141                 for j = 1:size(captured, "c")
142                     replace = strsubst(replace, "\" + string(j), captured(i,j));
143                 end
144
145                 if size(replace, "*") > 1 & (startPos <> 1 | endPos <> length(result(idx))) then
146                     //replace partial line by multiline expression
147                     replace(1) = part(result(idx), 1:startPos) + " " + replace(1);
148                     replace($) = replace($) + " " + part(result(idx), (endPos+1):length(result(idx)));
149
150                     result = [result(1:(idx-1)); replace; result((idx+1):$)];
151                 elseif size(replace, "*") > 1 then
152                     //replace entire line by multiline expression
153                     result = [result(1:(idx-1)); replace; result((idx+1):$)];
154                 else
155                     //replace partial line by 1-line expression
156                     result(idx) = strsubst(result(idx), match(i), replace);
157                 end
158             end
159         end
160
161         //update index with new "file"
162         index = grep(result, findExp, "r");
163     end
164 endfunction
165
166 function ret = getFilesList(folder, mask)
167     if ~isdir(folder) then
168         ret = [];
169         return;
170     end
171
172     old = pwd();
173     cd(folder)
174
175     ret = [];
176
177     files = ls();
178
179     for j = 1:size(files, "*")
180         if isdir(files(j)) then
181             ret = [ret ; getFilesList(files(j), mask)];
182         end
183     end
184
185     for i = 1:size(mask, "*")
186         srcFiles = findfiles(pwd(), "*." + mask(i));
187         if srcFiles <> [] then
188             ret = [ret ; pwd() + filesep() + srcFiles];
189         end
190     end
191
192     cd(old);
193 endfunction
194