7c006e | 2000-08-04 | Andreas Lange | | #!/usr/local/bin/pike
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
392f96 | 2002-01-16 | Martin Nilsson | |
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | mapping args = ([]);
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | array(string) files = ({});
|
7c006e | 2000-08-04 | Andreas Lange | |
mapping ids = ([]);
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | mapping(string:string|int) r_ids = ([]);
array(string|int) id_xml_order = ({});
|
056e05 | 2000-07-17 | Andreas Lange | | mapping(string:string) add = ([]);
|
7c006e | 2000-08-04 | Andreas Lange | |
|
056e05 | 2000-07-17 | Andreas Lange | | multiset(string) added = (<>);
|
7c006e | 2000-08-04 | Andreas Lange | |
|
056e05 | 2000-07-17 | Andreas Lange | | int high_int_id = 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | int make_id() {
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | while ( has_value(id_xml_order, ++high_int_id) );
return high_int_id;
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
string get_first_string(string in) {
|
056e05 | 2000-07-17 | Andreas Lange | | string ret = "";
int instr = 0;
for(int i = 0; i<sizeof(in); i++) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(in[i]=='\"')
if(!(i>0 && in[i-1]=='\\')) {
instr= instr? 0 : 1;
if(instr) i++;
}
if(instr) ret+=in[i..i];
else
if(in[i]==',') break;
}
return compile_string("constant q=#\""+ret+"\";")->q;
}
string quotemeta(string in) {
|
056e05 | 2000-07-17 | Andreas Lange | | string ret = "";
int instr = 0;
for(int i = 0; i<sizeof(in); i++) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | switch (in[i])
{
case '\"':
if(!(i>0 && in[i-1]=='\\')) {
instr = instr? 0 : 1;
if(instr && i>0)
|
056e05 | 2000-07-17 | Andreas Lange | | ret += ".*";
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
056e05 | 2000-07-17 | Andreas Lange | | ret += "\"";
|
57fb08 | 2000-07-09 | Martin Nilsson | | break;
case '\\':
if((i+1)<sizeof(in) && in[i+1]=='n') {
if(instr) {
|
056e05 | 2000-07-17 | Andreas Lange | | ret += "[\n|\\\\]n*";
|
57fb08 | 2000-07-09 | Martin Nilsson | | i++;
}
break;
}
|
056e05 | 2000-07-17 | Andreas Lange | | case '.': case '+': case '*':
case '^': case '(': case ')':
case '$': case '[': case ']':
case '|':
if(instr) ret += "\\";
|
57fb08 | 2000-07-09 | Martin Nilsson | |
default:
|
056e05 | 2000-07-17 | Andreas Lange | | if(instr) ret += in[i..i];
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
}
return ret;
}
|
e6a749 | 2000-07-14 | Andreas Lange | | function get_encoder(string encoding) {
if(!encoding || encoding=="")
return 0;
|
056e05 | 2000-07-17 | Andreas Lange | | switch( lower_case(encoding) )
|
e6a749 | 2000-07-14 | Andreas Lange | | {
case "utf-8": case "utf8":
return lambda(string s) {
return string_to_utf8(s);
};
case "utf-16": case "utf16":
case "unicode":
return lambda(string s) {
return string_to_unicode(s);
};
default:
object enc;
|
056e05 | 2000-07-17 | Andreas Lange | | if(catch( enc = Locale.Charset.encoder( encoding ) )) {
|
e6a749 | 2000-07-14 | Andreas Lange | | werror("\n* Error: Unknown encoding %O!\n", encoding);
exit(1);
}
return lambda(string s) {
return enc->clear()->feed(s)->drain();
};
}
}
|
57fb08 | 2000-07-09 | Martin Nilsson | | function get_decoder(string encoding) {
|
878f21 | 2000-07-10 | Andreas Lange | | if(!encoding || encoding=="")
return 0;
|
056e05 | 2000-07-17 | Andreas Lange | | switch( lower_case(encoding) )
|
57fb08 | 2000-07-09 | Martin Nilsson | | {
|
878f21 | 2000-07-10 | Andreas Lange | | case "iso-8859-1":
return 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | | case "utf-8": case "utf8":
return lambda(string s) {
return utf8_to_string(s);
};
case "utf-16": case "utf16":
case "unicode":
return lambda(string s) {
return unicode_to_string(s);
};
|
878f21 | 2000-07-10 | Andreas Lange | | default:
object dec;
|
056e05 | 2000-07-17 | Andreas Lange | | if(catch( dec = Locale.Charset.decoder( encoding ) )) {
|
e6a749 | 2000-07-14 | Andreas Lange | | werror("\n* Error: Unknown encoding %O!\n", encoding);
|
878f21 | 2000-07-10 | Andreas Lange | | exit(1);
}
return lambda(string s) {
return dec->clear()->feed(s)->drain();
};
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
}
|
ae2371 | 2000-08-11 | Andreas Lange | | array(mapping) languagefiles(string searchpath, void|string skiplang) {
|
7c006e | 2000-08-04 | Andreas Lange | |
string pattern = replace(searchpath, "%%", "%");
string dirbase = (pattern/"%L")[0];
|
ca612c | 2001-02-20 | Martin Nilsson | | if(dirbase=="") {
dirbase="./";
pattern = "./" + pattern;
}
else if(dirbase[-1]!='/') {
|
7c006e | 2000-08-04 | Andreas Lange | | array split = dirbase/"/";
dirbase = split[..sizeof(split)-2]*"/"+"/";
}
|
ca612c | 2001-02-20 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | string s_patt;
if(search(pattern, "/", sizeof(dirbase))==-1)
s_patt=pattern[sizeof(dirbase)..];
else
s_patt=pattern[sizeof(dirbase)..search(pattern, "/", sizeof(dirbase))-1];
s_patt = replace(s_patt, "%L", "%3s");
array dirlist = get_dir(dirbase);
if(!dirlist)
return ({});
array list = ({});
foreach(dirlist, string path) {
string lang;
if(!sscanf(path, s_patt, lang)) continue;
if(lang==skiplang) continue;
string file = replace(pattern, "%L", lang);
if(!file_stat(file)) continue;
|
ae2371 | 2000-08-11 | Andreas Lange | | list += ({ (["name":file, "lang":lang]) });
|
7c006e | 2000-08-04 | Andreas Lange | | }
return list;
}
|
ae2371 | 2000-08-11 | Andreas Lange | | mapping parse_xml_file(string filename, string language) {
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | |
|
ae2371 | 2000-08-11 | Andreas Lange | |
|
056e05 | 2000-07-17 | Andreas Lange | |
|
7c006e | 2000-08-04 | Andreas Lange | | added = (<>);
id_xml_order = ({});
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!filename || filename=="")
|
ae2371 | 2000-08-11 | Andreas Lange | | return ([]);
|
e6a749 | 2000-07-14 | Andreas Lange | | Stdio.File in=Stdio.FILE();
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!in->open(filename, "r"))
|
ae2371 | 2000-08-11 | Andreas Lange | | return ([]);
write("Reading %s%s",
language ? "["+language+"] " : "",
(filename/"/")[-1]);
|
e6a749 | 2000-07-14 | Andreas Lange | | string line = in->gets();
|
57fb08 | 2000-07-09 | Martin Nilsson | | string indata = in->read();
in->close();
|
e6a749 | 2000-07-14 | Andreas Lange | | if(!indata) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | write("\n");
|
ae2371 | 2000-08-11 | Andreas Lange | | return ([]);
|
e6a749 | 2000-07-14 | Andreas Lange | | }
|
ae2371 | 2000-08-11 | Andreas Lange | | string encoding;
|
e6a749 | 2000-07-14 | Andreas Lange | | if(!line)
line = indata;
|
ae2371 | 2000-08-11 | Andreas Lange | | sscanf(line, "%*sencoding=\"%s\"", encoding);
|
e6a749 | 2000-07-14 | Andreas Lange | | if(encoding && encoding!="") {
function decode = get_decoder(encoding);
if(decode && catch( indata = decode(indata) )) {
werror("\n* Error: unable to decode from %O in %O\n",
encoding, filename);
exit(1);
}
}
else if(line!=indata)
indata += line+"\n"+indata;
|
7c006e | 2000-08-04 | Andreas Lange | | write(" - parsing xml...");
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | |
mapping current = ([]);
Parser.HTML str_parser = Parser.HTML();
str_parser->case_insensitive_tag(1);
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | str_parser->
add_tag("changed",
lambda(object foo, mapping m) {
current->changetag = str_parser->current()+"\n";
return 0;
});
function t_container =
|
57fb08 | 2000-07-09 | Martin Nilsson | | lambda(object foo, mapping m, string c) {
|
7c006e | 2000-08-04 | Andreas Lange | | if((int)m->id) m->id = (int)m->id;
if(!current->id) {
if(!m->id || m->id=="") {
werror("\n* Warning: String %O has no id.", c||current->original);
return 0;
}
current->id = m->id;
}
if(m->id && (m->id != current->id)) {
werror("\n* Warning: Ignoring string %O. "
"Contained in id %O but marked with id %O.",
c, current->id, m->id);
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
}
|
7c006e | 2000-08-04 | Andreas Lange | | if(has_value(id_xml_order, current->id)) {
werror("\n* Error: Id %O used more than once.\n", current->id);
exit(1);
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
7c006e | 2000-08-04 | Andreas Lange | | id_xml_order += ({ current->id });
c = replace(c, ({"<",">","&"}), ({"<",">","&"}));
current->text = c;
current->textargs = m-({"id"});
return 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | | };
|
7c006e | 2000-08-04 | Andreas Lange | | str_parser->add_containers( ([ "t" : t_container,
"translate" : t_container ]) );
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | function o_container =
lambda(object foo, mapping m, string c) {
if(String.trim_whites(c)!="") {
c = replace(c, ({"<",">","&"}), ({"<",">","&"}));
current->original = c;
current->originalargs = m-({"id"});
}
return 0;
};
str_parser->add_containers( ([ "o" : o_container,
"original" : o_container ]) );
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | Parser.HTML xml_parser = Parser.HTML();
|
57fb08 | 2000-07-09 | Martin Nilsson | | xml_parser->case_insensitive_tag(1);
|
ae2371 | 2000-08-11 | Andreas Lange | | xml_parser->add_quote_tag("!--", lambda() {return 0;}, "--");
|
57fb08 | 2000-07-09 | Martin Nilsson | | xml_parser->
|
7c006e | 2000-08-04 | Andreas Lange | | add_container("str",
|
57fb08 | 2000-07-09 | Martin Nilsson | | lambda(object foo, mapping m, string c) {
|
7c006e | 2000-08-04 | Andreas Lange | | current = ([]);
if(m->id && m->id!="") {
if((int)m->id) m->id = (int)m->id;
current->id = m->id;
}
str_parser->feed( c )->finish();
if(current->id) {
ids[current->id] = current;
if(String.trim_whites(current->original)!="")
r_ids[current->original] = current->id;
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
7c006e | 2000-08-04 | Andreas Lange | | if(has_value(id_xml_order, current->id))
return "\7\7\7\7";
return "\b";
|
57fb08 | 2000-07-09 | Martin Nilsson | | });
|
7c006e | 2000-08-04 | Andreas Lange | | xml_parser->
add_tag("locale",
lambda(object foo, mapping m) {
array n = m->version/".";
if(n[0]!="1") {
werror("\n* Unknown locale version %O!\n", m->version);
exit(1);
}
return "\b";
});
|
57fb08 | 2000-07-09 | Martin Nilsson | | xml_parser->
add_container("project",
lambda(object foo, mapping m, string c) {
c = String.trim_whites(c);
if(args->project && args->project!=c) {
werror("\n* xml data is for project %O, not %O!\n",
|
056e05 | 2000-07-17 | Andreas Lange | | c, args->project);
|
57fb08 | 2000-07-09 | Martin Nilsson | | exit(1);
} else
|
056e05 | 2000-07-17 | Andreas Lange | | args->project = c;
|
57fb08 | 2000-07-09 | Martin Nilsson | | return "\b";
});
xml_parser->add_tag("added",
lambda(object foo, mapping m) {
|
056e05 | 2000-07-17 | Andreas Lange | | m_delete(add, m->id);
added[m->id] = 1;
|
57fb08 | 2000-07-09 | Martin Nilsson | | return "\b";
});
|
e6a749 | 2000-07-14 | Andreas Lange | | xml_parser->add_quote_tag("?xml", "\b", "?");
|
57fb08 | 2000-07-09 | Martin Nilsson | | xml_parser->add_containers( (["file" : "\b",
"dumped" : "\b",
"language" : "\b"]) );
xml_parser->feed(indata)->finish();
|
e6a749 | 2000-07-14 | Andreas Lange | |
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | string ret = "";
|
57fb08 | 2000-07-09 | Martin Nilsson | | object RE = Regexp("^[\b \t\n]+$");
foreach(xml_parser->read()/"\n", string line) {
if(!RE->match(line))
ret += line+"\n";
}
RE = Regexp("^(.*[^\n \t]\n)[ \n\t]*$");
|
7c006e | 2000-08-04 | Andreas Lange | | array hits = RE->split( ret );
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(hits) ret = hits[0];
|
7c006e | 2000-08-04 | Andreas Lange | | ret = replace(ret, "\n\n\n\n", "\n\n");
write("\n");
|
ae2371 | 2000-08-11 | Andreas Lange | | return ([ "encoding":encoding, "data":ret ]);
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
ae2371 | 2000-08-11 | Andreas Lange | | void write_xml_file(string filename, string language, string encoding,
string outdata, void|mapping old_ids)
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
ae2371 | 2000-08-11 | Andreas Lange | |
|
7c006e | 2000-08-04 | Andreas Lange | |
{
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!sizeof(id_xml_order))
return;
Stdio.File out=Stdio.File();
|
ae2371 | 2000-08-11 | Andreas Lange | | if(!out->open(filename, "cw")) {
werror("* Error: Could not open %s for writing\n", filename);
|
57fb08 | 2000-07-09 | Martin Nilsson | | exit(1);
}
|
ae2371 | 2000-08-11 | Andreas Lange | | write("Writing %s%s... (%d ids) ",
language ? "["+language+"] " : "",
(filename/"/")[-1], sizeof(id_xml_order));
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
e6a749 | 2000-07-14 | Andreas Lange | |
|
056e05 | 2000-07-17 | Andreas Lange | | string newfile = "";
|
7c006e | 2000-08-04 | Andreas Lange | | newfile += "<locale version=\"1.0\"/>\n";
|
e6a749 | 2000-07-14 | Andreas Lange | | newfile += "<project>"+args->project+"</project>\n";
|
ae2371 | 2000-08-11 | Andreas Lange | | newfile += "<language>" +
#ifdef constant(Standards.ISO639_2)
Standards.ISO639_2.get_language(language) ||
#endif
language + "</language>\n";
|
6dda65 | 2000-11-27 | Martin Nilsson | |
if(!args->notime)
newfile += "<dumped>"+time()+"</dumped>\n";
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
6dda65 | 2000-11-27 | Martin Nilsson | | foreach(sort(files), string inname)
|
e6a749 | 2000-07-14 | Andreas Lange | | newfile += "<file>"+inname+"</file>\n";
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
6dda65 | 2000-11-27 | Martin Nilsson | | foreach(sort(indices(added)+indices(add)), string blockname)
|
e6a749 | 2000-07-14 | Andreas Lange | | newfile += "<added id=\""+blockname+"\"/>\n";
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | string o_tag = "o";
string t_tag = "t";
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(args->verbose) {
|
7c006e | 2000-08-04 | Andreas Lange | | o_tag = "original";
t_tag = "translate";
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
7c006e | 2000-08-04 | Andreas Lange | |
|
ae2371 | 2000-08-11 | Andreas Lange | | mapping stats = ([]);
|
7c006e | 2000-08-04 | Andreas Lange | | function gen_tag =
lambda(mixed id) {
|
ae2371 | 2000-08-11 | Andreas Lange | | stats->written++;
|
7c006e | 2000-08-04 | Andreas Lange | | string diff = ((old_ids && old_ids[id] && old_ids[id]->changetag) ?
old_ids[id]->changetag : "");
|
ae2371 | 2000-08-11 | Andreas Lange | | if(old_ids) {
if(diff!="")
stats->changed++;
else if(!old_ids[id] || !old_ids[id]->text ||
String.trim_whites(old_ids[id]->text)=="" ) {
diff = "<new/>\n";
stats->new++;
}
|
7c006e | 2000-08-04 | Andreas Lange | | else if(old_ids[id] && old_ids[id]->original != ids[id]->original) {
diff = replace(old_ids[id]->original||"",
({"<",">","&"}), ({"<",">","&"}));
diff = "<changed from=\""+ diff +"\"/>\n";
|
ae2371 | 2000-08-11 | Andreas Lange | | stats->changed++;
|
7c006e | 2000-08-04 | Andreas Lange | | }
|
ae2371 | 2000-08-11 | Andreas Lange | | else
stats->ok++;
|
7c006e | 2000-08-04 | Andreas Lange | | }
string original =
replace(ids[id]->original, ({"<",">","&"}), ({"<",">","&"}));
string text =
replace( ( (old_ids && old_ids[id] && old_ids[id]->text) ?
old_ids[id]->text : ""),
({"<",">","&"}),({"<",">","&"}));
return sprintf("<str id=\"%s\">\n"
"%s<%s>%s</%[2]s>\n"
"<%s>%s</%[4]s>\n"
"</str>",
(string)id, diff, o_tag, original, t_tag, text);
};
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | int i = 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(outdata) {
|
7c006e | 2000-08-04 | Andreas Lange | | string marker = "\7\7\7\7";
string newstr;
|
056e05 | 2000-07-17 | Andreas Lange | | while( int n=search(outdata, marker) ) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(n<0) break;
if(i==sizeof(id_xml_order)) {
|
056e05 | 2000-07-17 | Andreas Lange | | outdata = replace(outdata, marker, "");
|
878f21 | 2000-07-10 | Andreas Lange | | continue;
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
7c006e | 2000-08-04 | Andreas Lange | | if(args->wipe && !ids[id_xml_order[i]]->origin)
newstr = "";
else
newstr = gen_tag(id_xml_order[i]);
outdata = (outdata[0..n-1] + newstr +
|
57fb08 | 2000-07-09 | Martin Nilsson | | outdata[n+sizeof(marker)..sizeof(outdata)-1]);
i++;
}
|
e6a749 | 2000-07-14 | Andreas Lange | | newfile += outdata;
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
7c006e | 2000-08-04 | Andreas Lange | | for(; i<sizeof(id_xml_order); i++) {
if(!(args->wipe && !ids[id_xml_order[i]]->origin))
newfile += "\n" + gen_tag(id_xml_order[i]) + "\n";
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
foreach(indices(add), string blockname)
|
e6a749 | 2000-07-14 | Andreas Lange | | newfile += "\n"+add[blockname];
|
ae2371 | 2000-08-11 | Andreas Lange | | if(!encoding || encoding=="") {
|
e6a749 | 2000-07-14 | Andreas Lange | | int width = String.width( newfile );
if(width==16)
|
ae2371 | 2000-08-11 | Andreas Lange | | encoding = "utf-8";
|
e6a749 | 2000-07-14 | Andreas Lange | | else if(width==32)
|
ae2371 | 2000-08-11 | Andreas Lange | | encoding = "utf-16";
|
e6a749 | 2000-07-14 | Andreas Lange | | else
|
ae2371 | 2000-08-11 | Andreas Lange | | encoding = "iso-8859-1";
}
function encode = get_encoder( encoding );
if(encode && catch( newfile = encode(newfile) )) {
werror("\n* Error: unable to encode file %O in %O\n",
filename, args->encoding);
exit(1);
|
e6a749 | 2000-07-14 | Andreas Lange | | }
|
ae2371 | 2000-08-11 | Andreas Lange | | newfile = "<?xml version=\"1.0\" encoding=\""+ encoding +"\"?>\n"+ newfile;
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
e6a749 | 2000-07-14 | Andreas Lange | | out->write( newfile );
|
57fb08 | 2000-07-09 | Martin Nilsson | | out->truncate( out->tell() );
out->close();
|
7c006e | 2000-08-04 | Andreas Lange | |
|
ae2371 | 2000-08-11 | Andreas Lange | |
if(args->wipe && stats->written!=sizeof(id_xml_order))
write("(wiped to %d) ", stats->written);
if(old_ids) {
if(stats->written==stats->ok)
write("all translated");
else {
array ret= ({});
if(stats->ok) ret += ({ sprintf("%d translated", stats->ok) });
if(stats->new) ret += ({ sprintf("%d new", stats->new) });
if(stats->changed) ret += ({ sprintf("%d changed", stats->changed) });
write(String.implode_nicely( ret ));
}
|
7c006e | 2000-08-04 | Andreas Lange | | }
write("\n");
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
056e05 | 2000-07-17 | Andreas Lange | |
|
57fb08 | 2000-07-09 | Martin Nilsson | | array(string) get_tokens(string in, mapping args, string filename) {
|
056e05 | 2000-07-17 | Andreas Lange | | string comments = "";
|
58c31c | 2001-09-27 | Martin Nilsson | | foreach( (in/"//")[1..], string line) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | sscanf(line, "%s\n", line);
|
056e05 | 2000-07-17 | Andreas Lange | | comments += line+"\n";
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
58c31c | 2001-09-27 | Martin Nilsson | |
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | array(string) tokens = ({});
|
57fb08 | 2000-07-09 | Martin Nilsson | | Parser.HTML()->
add_container("locale-token",
lambda(object foo, mapping m, string c) {
|
58c31c | 2001-09-27 | Martin Nilsson | | if(args->project && m->project!=args->project)
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
|
056e05 | 2000-07-17 | Andreas Lange | | c = String.trim_whites(c);
|
58c31c | 2001-09-27 | Martin Nilsson | | if(has_value(tokens, c)) {
werror("\n* Warning: Token %O already found.\n", c);
}
|
056e05 | 2000-07-17 | Andreas Lange | | tokens += ({c});
|
57fb08 | 2000-07-09 | Martin Nilsson | | if (m->project)
|
056e05 | 2000-07-17 | Andreas Lange | | args->project = m->project;
|
57fb08 | 2000-07-09 | Martin Nilsson | | else
|
056e05 | 2000-07-17 | Andreas Lange | | args->project = "";
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
})
|
7c006e | 2000-08-04 | Andreas Lange | | ->feed( comments )->finish();
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!sizeof(tokens)) {
if(args->project)
|
056e05 | 2000-07-17 | Andreas Lange | | werror("\n* Warning: No token for project %O in %s\n",
args->project, filename);
|
57fb08 | 2000-07-09 | Martin Nilsson | | else
|
056e05 | 2000-07-17 | Andreas Lange | | werror("\n* Warning: No token found in file %s\n", filename);
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
return tokens;
}
void update_pike_sourcefiles(array filelist) {
|
7c006e | 2000-08-04 | Andreas Lange | |
|
57fb08 | 2000-07-09 | Martin Nilsson | |
foreach(filelist, string filename) {
|
056e05 | 2000-07-17 | Andreas Lange | | Stdio.File file = Stdio.File();
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!file->open(filename, "r")) {
werror("* Error: Could not open sourcefile %s.\n", filename);
exit(1);
}
|
056e05 | 2000-07-17 | Andreas Lange | | write("Reading %s", filename);
string indata = file->read();
|
57fb08 | 2000-07-09 | Martin Nilsson | | file->close();
|
e6a749 | 2000-07-14 | Andreas Lange | |
|
57fb08 | 2000-07-09 | Martin Nilsson | | write(", parsing...");
|
056e05 | 2000-07-17 | Andreas Lange | | array tokens = get_tokens(indata, args, filename);
if(!sizeof(tokens))
continue;
|
e6a749 | 2000-07-14 | Andreas Lange | | mixed pdata = Parser.Pike.split(indata);
pdata = Parser.Pike.tokenize(pdata);
pdata = Parser.Pike.hide_whitespaces(pdata);
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | array id_pike_order = ({});
int no_of_ids = 0;
|
7c006e | 2000-08-04 | Andreas Lange | | string|int id;
string fstr, token;
|
e6a749 | 2000-07-14 | Andreas Lange | | for(int i=0; i<sizeof(pdata); i++) {
foreach(tokens, token)
if(token==pdata[i]) break;
if(token!=pdata[i]) continue;
if(pdata[++i]!="(") continue;
|
7c006e | 2000-08-04 | Andreas Lange | | id = (string)pdata[++i];
|
e6a749 | 2000-07-14 | Andreas Lange | | if(id=="\"\"")
|
056e05 | 2000-07-17 | Andreas Lange | | id = "";
|
7c006e | 2000-08-04 | Andreas Lange | | else if((int)id)
id = (int)id;
else
|
e6a749 | 2000-07-14 | Andreas Lange | | id = get_first_string(id);
|
056e05 | 2000-07-17 | Andreas Lange | | string instr = "";
|
e6a749 | 2000-07-14 | Andreas Lange | | i++;
|
056e05 | 2000-07-17 | Andreas Lange | | while( ++i<sizeof(pdata) && pdata[i]!=")" )
|
e6a749 | 2000-07-14 | Andreas Lange | | instr += (string)pdata[i];
|
7c006e | 2000-08-04 | Andreas Lange | | if(instr=="\"\"")
fstr = "";
else
|
e6a749 | 2000-07-14 | Andreas Lange | | fstr = get_first_string(instr);
|
7c006e | 2000-08-04 | Andreas Lange | | if(fstr=="" && id=="")
continue;
|
e6a749 | 2000-07-14 | Andreas Lange | |
|
056e05 | 2000-07-17 | Andreas Lange | | no_of_ids++;
|
7c006e | 2000-08-04 | Andreas Lange | | if(!id || id=="") {
|
e6a749 | 2000-07-14 | Andreas Lange | | if (r_ids[fstr])
id = r_ids[fstr];
|
57fb08 | 2000-07-09 | Martin Nilsson | | else
|
e6a749 | 2000-07-14 | Andreas Lange | | id = make_id();
id_pike_order += ({ ({id, token, quotemeta(instr)}) });
} else {
|
7c006e | 2000-08-04 | Andreas Lange | | if(!ids[id] || (ids[id] && !ids[id]->origin)) {
|
e6a749 | 2000-07-14 | Andreas Lange | |
m_delete(r_ids, ids[id]);
} else {
|
7c006e | 2000-08-04 | Andreas Lange | | if(ids[id] && ids[id]->original!=fstr) {
|
e6a749 | 2000-07-14 | Andreas Lange | | werror("\n* Error: inconsistant use of id.\n");
|
7c006e | 2000-08-04 | Andreas Lange | | werror(" In file:%{ %s%}\n", ids[id]->origin);
werror(" id %O -> string %O\n", id, ids[id]->original);
|
056e05 | 2000-07-17 | Andreas Lange | | werror(" In file: %s\n", filename);
werror(" id %O -> string %O\n", id, fstr);
|
e6a749 | 2000-07-14 | Andreas Lange | | exit(1);
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
}
|
7c006e | 2000-08-04 | Andreas Lange | | if(r_ids[fstr] && r_ids[fstr]!=id && ids[r_ids[fstr]]->origin)
|
e6a749 | 2000-07-14 | Andreas Lange | | werror("\n* Warning: %O has id %O in%{ %s%}, id %O in %s",
|
7c006e | 2000-08-04 | Andreas Lange | | fstr, r_ids[fstr], ids[r_ids[fstr]]->origin, id, filename);
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
7c006e | 2000-08-04 | Andreas Lange | | if(!has_value(id_xml_order, id))
|
e6a749 | 2000-07-14 | Andreas Lange | |
|
7c006e | 2000-08-04 | Andreas Lange | | id_xml_order += ({ id });
if(!ids[id])
ids[id] = ([]);
ids[id]->original = fstr;
ids[id]->origin += ({filename});
if(String.trim_whites(fstr)!="")
r_ids[fstr] = id;
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
e6a749 | 2000-07-14 | Andreas Lange | |
|
7c006e | 2000-08-04 | Andreas Lange | | write(" (%d localization%s)\n", no_of_ids, (no_of_ids==1?"":"s"));
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!sizeof(id_pike_order)) {
continue;
}
if(!args->nocopy)
|
056e05 | 2000-07-17 | Andreas Lange | | filename += ".new";
write("-> Writing %s (%d new)", filename, sizeof(id_pike_order));
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!file->open(filename, "cw")) {
werror("\n* Error: Could not open %s for writing\n", filename);
exit(1);
}
foreach(id_pike_order, array id) {
|
e6a749 | 2000-07-14 | Andreas Lange | | object(Regexp) RE;
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | RE = Regexp("^(.*" + id[1] + "\\([ \n\t]*)[\"0]*" +
"([ ,\n\t]*"+id[2]+"[ \t\n]*\\).*)$");
|
e6a749 | 2000-07-14 | Andreas Lange | | array hits = RE->split(indata);
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(hits)
|
7c006e | 2000-08-04 | Andreas Lange | | indata = hits[0] + (intp(id[0])?id[0]:"\""+id[0]+"\"") + hits[1];
else {
werror("\n* Warning: Failed to set id %O for string %O in %s",
id[0], ids[id[0]]->original, filename);
if(sizeof(ids[id[0]]->origin)<2)
id_xml_order -= ({ id[0] });
}
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
write("\n");
|
056e05 | 2000-07-17 | Andreas Lange | | file->write( indata );
|
57fb08 | 2000-07-09 | Martin Nilsson | | file->truncate( file->tell() );
file->close();
}
}
void update_xml_sourcefiles(array filelist) {
foreach(filelist, string filename) {
|
056e05 | 2000-07-17 | Andreas Lange | | Stdio.File file = Stdio.FILE();
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!file->open(filename, "r")) {
werror("* Error: Could not open sourcefile %s.\n", filename);
exit(1);
}
|
056e05 | 2000-07-17 | Andreas Lange | | write("Reading %s", filename);
|
e6a749 | 2000-07-14 | Andreas Lange | | string line = file->gets();
string data = file->read();
|
57fb08 | 2000-07-09 | Martin Nilsson | | file->close();
|
7c006e | 2000-08-04 | Andreas Lange | | if(!data && !line)
|
e6a749 | 2000-07-14 | Andreas Lange | | continue;
if(!line)
line = data;
string encoding;
sscanf(line, "%*sencoding=\"%s\"", encoding);
if(encoding && encoding!="") {
function decode = get_decoder(encoding);
if(decode && catch( data = decode(data) )) {
werror("\n* Error: unable to decode from %O in %O\n",
encoding, filename);
exit(1);
}
}
else if(line!=data)
data = line+"\n"+data;
|
57fb08 | 2000-07-09 | Martin Nilsson | |
write(", parsing...");
int new = 0;
|
056e05 | 2000-07-17 | Andreas Lange | | int ignoretag = 0;
int no_of_ids = 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | | Parser.HTML xml_parser = Parser.HTML();
xml_parser->case_insensitive_tag(1);
|
ae2371 | 2000-08-11 | Andreas Lange | | xml_parser->add_quote_tag("!--", lambda() {return 0;}, "--");
|
57fb08 | 2000-07-09 | Martin Nilsson | | xml_parser->
add_tag("trans-reg",
lambda(object foo, mapping m) {
if(!m->project || m->project=="") {
werror("\n * Error: Missing project in %s\n",
m->project, filename);
exit(1);
}
if(args->project && m->project!=args->project)
|
056e05 | 2000-07-17 | Andreas Lange | | ignoretag = 1;
|
57fb08 | 2000-07-09 | Martin Nilsson | | else
|
056e05 | 2000-07-17 | Andreas Lange | | ignoretag = 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!args->project)
args->project = m->project;
return 0;
});
xml_parser->
add_container("translate",
lambda(object foo, mapping m, string c) {
if(m->project && m->project!="") {
if(m->project!=args->project)
return 0;
|
7c006e | 2000-08-04 | Andreas Lange | |
|
ae2371 | 2000-08-11 | Andreas Lange | | } else
|
7c006e | 2000-08-04 | Andreas Lange | | if(ignoretag)
|
ae2371 | 2000-08-11 | Andreas Lange | | return 0;
|
7c006e | 2000-08-04 | Andreas Lange | | string|int id = m->id;
if((int)id) id = (int)id;
|
57fb08 | 2000-07-09 | Martin Nilsson | | string fstr = c;
int updated = 0;
|
056e05 | 2000-07-17 | Andreas Lange | | if (String.trim_whites(fstr)=="")
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
|
056e05 | 2000-07-17 | Andreas Lange | | no_of_ids++;
|
7c006e | 2000-08-04 | Andreas Lange | | if(!id || id=="") {
|
57fb08 | 2000-07-09 | Martin Nilsson | | if (r_ids[fstr])
id = r_ids[fstr];
else
id = make_id();
updated = ++new;
} else {
|
7c006e | 2000-08-04 | Andreas Lange | | if(!ids[id] || (ids[id] && !ids[id]->origin)) {
|
57fb08 | 2000-07-09 | Martin Nilsson | |
m_delete(r_ids, ids[id]);
} else {
|
7c006e | 2000-08-04 | Andreas Lange | | if(ids[id] && ids[id]->original!=fstr) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | werror("\n* Error: inconsistant use of id.\n");
|
7c006e | 2000-08-04 | Andreas Lange | | werror(" In file:%{ %s%}\n", ids[id]->origin);
werror(" id %O -> string %O\n",
id, ids[id]->original);
|
056e05 | 2000-07-17 | Andreas Lange | | werror(" In file: %s\n", filename);
werror(" id %O -> string %O\n", id, fstr);
|
57fb08 | 2000-07-09 | Martin Nilsson | | exit(1);
}
}
|
878f21 | 2000-07-10 | Andreas Lange | | if(r_ids[fstr] && r_ids[fstr]!=id &&
|
7c006e | 2000-08-04 | Andreas Lange | | ids[r_ids[fstr]]->origin)
|
878f21 | 2000-07-10 | Andreas Lange | | werror("\n* Warning: %O has id %O in%{ %s%}, "
"id %O in %s", fstr, r_ids[fstr],
|
7c006e | 2000-08-04 | Andreas Lange | | ids[r_ids[fstr]]->origin, id, filename);
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
|
056e05 | 2000-07-17 | Andreas Lange | | if(!has_value(id_xml_order, id))
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | | id_xml_order += ({ id });
if(!ids[id])
ids[id] = ([]);
ids[id]->original = fstr;
ids[id]->origin += ({filename});
if(String.trim_whites(fstr)!="")
r_ids[fstr] = id;
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(updated) {
string ret="<translate id=\""+id+"\"";
|
878f21 | 2000-07-10 | Andreas Lange | | foreach(indices(m)-({"id"}), string param)
ret+=" "+param+"=\""+m[param]+"\"";
return ({ ret+">"+c+"</translate>" });
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
return 0;
});
|
e6a749 | 2000-07-14 | Andreas Lange | | xml_parser->feed(data)->finish();
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | |
|
7c006e | 2000-08-04 | Andreas Lange | | write(" (%d localization%s)\n", no_of_ids, no_of_ids==1?"":"s");
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!new) {
continue;
}
|
e6a749 | 2000-07-14 | Andreas Lange | | data = xml_parser->read();
if(encoding && encoding!="") {
function encode = get_encoder(encoding);
if(encode && catch( data = encode(data) )) {
werror("\n* Error: unable to encode data in %O\n", encoding);
exit(1);
}
}
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!args->nocopy)
|
056e05 | 2000-07-17 | Andreas Lange | | filename += ".new";
write("-> Writing %s (%d new)", filename, new);
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!file->open(filename, "cw")) {
werror("\n* Error: Could not open %s for writing\n", filename);
exit(1);
}
|
e6a749 | 2000-07-14 | Andreas Lange | | file->write( data );
|
57fb08 | 2000-07-09 | Martin Nilsson | | file->truncate( file->tell() );
file->close();
|
e6a749 | 2000-07-14 | Andreas Lange | | write("\n");
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
}
string parse_config(string filename) {
if(!filename || filename=="")
return "";
|
e6a749 | 2000-07-14 | Andreas Lange | | Stdio.File in=Stdio.FILE();
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!in->open(filename, "r"))
return "";
|
e6a749 | 2000-07-14 | Andreas Lange | | string line = in->gets();
|
57fb08 | 2000-07-09 | Martin Nilsson | | string indata = in->read();
in->close();
|
e6a749 | 2000-07-14 | Andreas Lange | | if(!indata)
|
57fb08 | 2000-07-09 | Martin Nilsson | | return "";
|
e6a749 | 2000-07-14 | Andreas Lange | |
if(!line)
line = indata;
sscanf(line, "%*sencoding=\"%s\"", string encoding);
if(encoding && encoding!="") {
function decode = get_decoder(encoding);
if(decode && catch( indata = decode(indata) )) {
werror("\n* Error: unable to decode from %O in %O\n",
encoding, filename);
exit(1);
}
}
else if(line!=indata)
indata = line+"\n"+indata;
|
57fb08 | 2000-07-09 | Martin Nilsson | | string xml_name="";
Parser.HTML xml_parser = Parser.HTML();
xml_parser->case_insensitive_tag(1);
|
ae2371 | 2000-08-11 | Andreas Lange | | xml_parser->add_quote_tag("!--", lambda() {return 0;}, "--");
|
57fb08 | 2000-07-09 | Martin Nilsson | | xml_parser->
add_container("project",
lambda(object foo, mapping m, string c) {
if(!m->name || m->name=="") {
werror("\n* Projectname missing in %s!\n", filename);
exit(1);
}
if(args->project && args->project!="" &&
args->project!=m->name)
return "";
else
args->project = m->name;
write("Reading config for project %O in %s\n",
args->project, filename);
return c;
});
xml_parser->
add_container("out",
lambda(object foo, mapping m, string c) {
c = String.trim_whites(c);
if(c && c!="")
xml_name = c;
return 0;
});
xml_parser->
add_container("file",
lambda(object foo, mapping m, string c) {
c = String.trim_whites(c);
if(c && c!="")
files += ({ c });
return 0;
});
xml_parser->
add_container("encoding",
lambda(object foo, mapping m, string c) {
|
e6a749 | 2000-07-14 | Andreas Lange | | if(args->encoding=="")
args->encoding = 0;
|
57fb08 | 2000-07-09 | Martin Nilsson | | c = String.trim_whites(c);
|
e6a749 | 2000-07-14 | Andreas Lange | | if(c && c!="" && !args->encoding) {
|
57fb08 | 2000-07-09 | Martin Nilsson | | args->encoding = c;
|
e6a749 | 2000-07-14 | Andreas Lange | | get_encoder( c );
}
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
});
xml_parser->
|
ae2371 | 2000-08-11 | Andreas Lange | | add_container("xmlpath",
|
7c006e | 2000-08-04 | Andreas Lange | |
|
57fb08 | 2000-07-09 | Martin Nilsson | | lambda(object foo, mapping m, string c) {
|
ae2371 | 2000-08-11 | Andreas Lange | | if(!args->xmlpath) {
|
7c006e | 2000-08-04 | Andreas Lange | | c = String.trim_whites(c);
|
ae2371 | 2000-08-11 | Andreas Lange | | args->xmlpath = c;
|
7c006e | 2000-08-04 | Andreas Lange | | }
return 0;
});
xml_parser->
add_container("baselang",
lambda(object foo, mapping m, string c) {
if(!args->baselang) {
c = String.trim_whites(c);
args->baselang = c;
}
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
});
xml_parser->
add_container("add",
lambda(object foo, mapping m, string c) {
if(!m->id || m->id=="") {
werror("\n* Missing id in <add> in %s!\n", filename);
exit(1);
}
|
056e05 | 2000-07-17 | Andreas Lange | | add[m->id] = c;
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
});
xml_parser->add_tag("nocopy",
lambda(object foo, mapping m) {
|
056e05 | 2000-07-17 | Andreas Lange | | args->nocopy = 1;
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
});
xml_parser->add_tag("verbose",
lambda(object foo, mapping m) {
|
056e05 | 2000-07-17 | Andreas Lange | | args->verbose = 1;
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
});
xml_parser->add_tag("wipe",
lambda(object foo, mapping m) {
|
056e05 | 2000-07-17 | Andreas Lange | | args->wipe = 1;
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
});
xml_parser->feed(indata)->finish();
|
7c006e | 2000-08-04 | Andreas Lange | |
if(xml_name=="")
|
ae2371 | 2000-08-11 | Andreas Lange | | if(args->xmlpath && args->baselang)
xml_name = replace(args->xmlpath, "%L", args->baselang);
|
7c006e | 2000-08-04 | Andreas Lange | | else if( args->project)
xml_name = args->project+"_eng.xml";
|
57fb08 | 2000-07-09 | Martin Nilsson | | return xml_name;
}
int main(int argc, array(string) argv) {
argv=argv[1..sizeof(argv)-1];
for(int i=0; i<sizeof(argv); i++) {
if(argv[i][0]!='-') {
files += ({argv[i]});
continue;
}
|
056e05 | 2000-07-17 | Andreas Lange | | string key, val = "";
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(sscanf(argv[i], "--%s", key)) {
sscanf(key, "%s=%s", key, val);
|
056e05 | 2000-07-17 | Andreas Lange | | args[key] = val;
|
57fb08 | 2000-07-09 | Martin Nilsson | | continue;
}
|
056e05 | 2000-07-17 | Andreas Lange | | args[argv[i][1..]] = 1;
|
57fb08 | 2000-07-09 | Martin Nilsson | | }
string xml_name=args->out;
string configname = args->config;
if(!configname && args->project)
configname = args->project+".xml";
string filename = parse_config(configname);
|
7c006e | 2000-08-04 | Andreas Lange | | if(!xml_name || xml_name=="")
if(filename!="")
xml_name = filename;
|
ae2371 | 2000-08-11 | Andreas Lange | | else if(args->xmlpath && args->baselang)
xml_name = replace(args->xmlpath, "%L", args->baselang);
|
7c006e | 2000-08-04 | Andreas Lange | |
|
ae2371 | 2000-08-11 | Andreas Lange | | if( (!(xml_name && args->sync && args->xmlpath && args->baselang)) &&
|
7c006e | 2000-08-04 | Andreas Lange | | (!sizeof(files) || args->help) ) {
|
392f96 | 2002-01-16 | Martin Nilsson | | sscanf("$Revision: 1.12 $", "$"+"Revision: %s $", string v);
|
57fb08 | 2000-07-09 | Martin Nilsson | | werror("\n Locale Extractor Utility "+v+"\n\n");
werror(" Syntax: extract.pike [arguments] infile(s)\n\n");
werror(" Arguments: --project=name default: first found in infile\n");
werror(" --config=file default: [project].xml\n");
werror(" --out=file default: [project]_eng.xml\n");
werror(" --nocopy update infile instead of infile.new\n");
|
6dda65 | 2000-11-27 | Martin Nilsson | | werror(" --notime don't include dump time in xml files\n");
|
57fb08 | 2000-07-09 | Martin Nilsson | | werror(" --wipe remove unused ids from xml\n");
|
f01f74 | 2000-11-26 | Martin Nilsson | | werror(" --sync synchronize all locale projects\n");
|
57fb08 | 2000-07-09 | Martin Nilsson | | werror(" --encoding=enc default: ISO-8859-1\n");
werror(" --verbose more informative text in xml\n");
werror("\n");
return 1;
}
|
ae2371 | 2000-08-11 | Andreas Lange | | mapping xml_data;
xml_data = parse_xml_file(xml_name, args->baselang);
|
7c006e | 2000-08-04 | Andreas Lange | | write("\n");
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
056e05 | 2000-07-17 | Andreas Lange | | object R = Regexp("(\.pike|\.pmod)$");
|
7c006e | 2000-08-04 | Andreas Lange | | foreach(files, string filename)
if(R->match(filename))
update_pike_sourcefiles( ({ filename }) );
else
update_xml_sourcefiles( ({ filename }) );
|
f01f74 | 2000-11-26 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | |
|
57fb08 | 2000-07-09 | Martin Nilsson | | if(!xml_name)
if(args->project && args->project!="")
xml_name = args->project+"_eng.xml";
else {
xml_name = files[0];
sscanf(xml_name, "%s.pike", xml_name);
xml_name += "_eng.xml";
}
|
7c006e | 2000-08-04 | Andreas Lange | | write("\n");
|
ae2371 | 2000-08-11 | Andreas Lange | | write_xml_file( xml_name, args->baselang,
args->encoding || xml_data->encoding, xml_data->data);
|
57fb08 | 2000-07-09 | Martin Nilsson | |
|
7c006e | 2000-08-04 | Andreas Lange | |
if (args->sync) {
write("\n");
mapping base_ids = ids;
array base_order = id_xml_order;
|
ae2371 | 2000-08-11 | Andreas Lange | | foreach(languagefiles(args->xmlpath, args->baselang), mapping file) {
|
7c006e | 2000-08-04 | Andreas Lange | | ids = ([]);
|
ae2371 | 2000-08-11 | Andreas Lange | | string enc = parse_xml_file(file->name, file->lang)->encoding;
|
7c006e | 2000-08-04 | Andreas Lange | | id_xml_order = base_order;
mapping old_ids = ids;
ids = base_ids;
|
ae2371 | 2000-08-11 | Andreas Lange | | write_xml_file(file->name, file->lang,
args->encoding || enc, xml_data->data, old_ids);
|
7c006e | 2000-08-04 | Andreas Lange | | }
}
write("\n");
|
57fb08 | 2000-07-09 | Martin Nilsson | | return 0;
}
|