git-svn-id: svn://db.shs.com.ru/pip@558 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2017-11-21 10:37:00 +00:00
parent fde7d7bc80
commit 11f5ebb23d
7 changed files with 140 additions and 26 deletions

View File

@@ -1,7 +1,6 @@
#include "generator.h"
#include "piresourcesstorage.h"
typedef PIPair<PIString, PIString> SSPair;
bool generate(PIFile & file, const PIVector<ParserSection> & files) {
if (!file.isOpened()) return false;
@@ -12,10 +11,11 @@ bool generate(PIFile & file, const PIVector<ParserSection> & files) {
PIString descname = "_pirc_" + fcname + "_desc_";
PIVector<PIResourcesStorage::__RCEntry> fv;
piForeachC (ParserSection & s, files) {
piForeachC (SSPair & p, s.files) {
piForeachC (ParserEntry & p, s.files) {
PIFile f;
if (!f.open(p.second, PIIODevice::ReadOnly)) continue;
fv << PIResourcesStorage::__RCEntry(s.name, p.first, p.second);
if (!f.open(p.path, PIIODevice::ReadOnly)) continue;
//piCout << "gen" << p.name << p.alias << p.path;
fv << PIResourcesStorage::__RCEntry(s.name, p.name, p.alias, p.path);
}
}
if (fv.isEmpty()) return false;

View File

@@ -7,9 +7,26 @@ PIVector<ParserSection> parse(const PIString & path) {
PIFile f;
if (!f.open(path, PIIODevice::ReadOnly))
return ret;
PIString ext = f.fileInfo().extension();
PIString ext = f.fileInfo().extension().toLowerCase();
//PIString fc = PIString::fromUTF8(f.readAll());
if (ext == "conf") return parseConf(f, PIDir(f.fileInfo().dir()).absolutePath() + "/");
PIString dir = PIDir(f.fileInfo().dir()).absolutePath() + "/";
//piCout << dir;
if (ext == "conf") return parseConf(f, dir);
if (ext == "qrc") return parseQRC(f, dir);
return ret;
}
ParserEntry makeEntry(PIString filename, const PIString & dir) {
ParserEntry ret;
//ret.alias = PIFile::fileInfo(filename).name();
ret.path = filename;
if (!PIDir(PIFile::fileInfo(filename).dir()).isAbsolute()) {
//piCout << "rel, add dir";
ret.path.insert(0, dir);
}
//piCout << line << path;
ret.name = filename;
return ret;
}
@@ -27,13 +44,76 @@ PIVector<ParserSection> parseConf(PIFile & file, const PIString & dir) {
ps.files.clear();
continue;
}
PIString path = line;
if (!PIDir(PIFile::fileInfo(line).dir()).isAbsolute()) {
//piCout << "rel, add dir";
path.insert(0, dir);
PIString alias;
int i = line.findLast("=");
if (i > 0) {
alias = line.takeMid(i + 1).trim();
line.cutRight(1).trim();
}
//piCout << line;
ps.files << PIPair<PIString, PIString>(line, path);
ParserEntry e = makeEntry(line, dir);
if (!alias.isEmpty())
e.alias = alias;
ps.files << e;
}
if (!ps.files.isEmpty()) ret << ps;
return ret;
}
PIVector<ParserSection> parseQRC(PIFile & file, const PIString & dir) {
PIVector<ParserSection> ret;
if (!file.isOpened()) return ret;
ParserSection ps;
bool is_files = false;
while (!file.isEnd()) {
PIString line = file.readLine().trim();
if (line.isEmpty()) continue;
if (line.startsWith("<qresource")) {
if (!ps.files.isEmpty()) ret << ps;
ps.name.clear();
ps.files.clear();
line.cutLeft(10);
if (line.endsWith(">")) line.cutRight(1);
line.trim();
if (line.endsWith("/")) {
is_files = false;
continue;
}
is_files = true;
if (line.startsWith("prefix")) {
int i = line.find("=");
if (i > 0) {
line.cutLeft(i + 1).trim();
if (line.startsWith("\"")) line.cutLeft(1);
if (line.endsWith("\"")) line.cutRight(1);
ps.name = line;
}
}
//piCout << "section \"" << ps.name << "\"";
continue;
}
if (line == "</qresource>") {
is_files = false;
continue;
}
if (!is_files) continue;
if (!line.startsWith("<file")) continue;
PIString alias = line.takeRange('<', '>', '\0');
alias.cutLeft(4).trim();
if (alias.startsWith("alias")) {
int i = alias.find("=");
if (i > 0) {
alias.cutLeft(i + 1).trim();
if (alias.startsWith("\"")) alias.cutLeft(1);
if (alias.endsWith("\"")) alias.cutRight(1);
}
}
if (line.endsWith("</file>")) line.cutRight(7).trim();
ParserEntry e = makeEntry(line, dir);
if (!alias.isEmpty())
e.alias = alias;
ps.files << e;
//piCout << "file =" << line << "alias =" << alias;
}
if (!ps.files.isEmpty()) ret << ps;
return ret;

View File

@@ -4,12 +4,24 @@
#include "pidir.h"
#include "pifile.h"
struct ParserEntry {
ParserEntry(const PIString & n = PIString(), const PIString & a = PIString(), const PIString & p = PIString()) {
name = n;
alias = a;
path = p;
}
PIString name;
PIString alias;
PIString path;
};
struct ParserSection {
PIString name;
PIVector<PIPair<PIString, PIString> > files; // name, path
PIVector<ParserEntry> files;
};
PIVector<ParserSection> parse(const PIString & path);
PIVector<ParserSection> parseConf(PIFile & file, const PIString & dir);
PIVector<ParserSection> parseQRC(PIFile & file, const PIString & dir);
#endif // PIRC_PARSER_H