khanat-opennel-code/code/ryzom/tools/leveldesign/icon_search/icon_search.cpp

392 lines
9.4 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <nel/misc/types_nl.h>
#include <nel/misc/file.h>
#include <nel/misc/sstring.h>
#include <nel/misc/path.h>
#include <nel/misc/algo.h>
#include <nel/misc/config_file.h>
#include <nel/misc/bitmap.h>
#include <iostream>
using namespace NLMISC;
using namespace std;
CSString REP_SRC; //= "R:\\code\\ryzom\\src_v2\\client\\";
CSString REP_GUI; //= "R:\\code\\ryzom\\data\\gamedev\\interfaces_v3\\";
CSString REP_ITEM; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\Game_elem\\items\\";
CSString REP_MISSION; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\Game_elem\\mission\\";
CSString REP_SITEM; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\game_element\\sitem\\";
CSString REP_SBRICK; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\game_element\\sbrick\\";
CSString REP_DFN; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\DFN\\";
CSString REP_FACTION;// = "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\World\\factions\\";
typedef vector<string> StringVector;
StringVector listeIcones;
map<CSString, StringVector> citations;
bool addUsedIcons = true;
bool addFreeIcons = true;
// Fill listeIcones from source directories
void findIcons(CConfigFile::CVar *var)
{
nlassert(var != NULL);
// clear vector
listeIcones.clear();
vector<string> files;
// Scan each directory
for (uint i=0 ; i<var->size() ; i++)
{
// clear files list
files.clear();
// get files list
CPath::getPathContent(CPath::standardizePath(var->asString(i)), false, false, true, files);
// Convert each file
for (uint j=0 ; j<files.size() ; j++)
{
// get filename
string iconName = CFile::getFilename(files[j]);
// store icon's name
listeIcones.push_back(iconName);
citations[iconName].push_back(iconName);
}
}
}
string remap2Jpg(const string &s)
{
// change extension from TGA to JPG
string jpg(s);
string::size_type n = jpg.find(".tga");
nlassert(n != string::npos);
jpg.erase(n);
jpg += ".jpg";
return jpg;
}
void writeString(COFile &f, const string &s)
{
f.serialBuffer((uint8*)s.c_str(), (uint)s.size());
}
void writeHTMLline(COFile &f, const string &icon, const StringVector files, uint sizeLimit)
{
// discard if needed
if ((files.size() == 1 && !addFreeIcons) || (files.size() > 1 && !addUsedIcons))
return;
// begin line
writeString(f, "<tr>");
// write icon as jpg
writeString(f, "<th><img src=\"");
writeString(f, "images\\");
writeString(f, remap2Jpg(files[0]));
writeString(f, "\"></th>");
// fix limit based on configuration file
uint n;
if (sizeLimit == 0)
n = (uint)files.size();
else
n = sizeLimit > files.size() ? (uint)files.size() : sizeLimit;
// write each file using this icon
for (uint i=0 ; i<n ; i++)
writeString(f, "<td>" + files[i] + "</td>");
// end line
writeString(f, "</tr>\n");
}
void generateHTML(const string &name, uint sizeLimit)
{
COFile f;
nlassert(f.open(name, false, true));
// write header
writeString(f, "<html>\n<head>\n<title>Nevrax - Ryzom icons</title>\n</title>\n\n<body><table border=1>\n");
// write lines
for (map<CSString, StringVector>::iterator it = citations.begin(); it != citations.end(); ++it)
{
string str = it->second[0];
writeHTMLline(f, str, it->second, sizeLimit);
}
// write end
writeString(f, "</table></body>\n</html>");
f.close();
}
void tga2Jpg(const string &tga, const string &jpg)
{
// read TGA
CIFile fTga;
CBitmap im;
nlassert(fTga.open(tga));
nlassert(im.load(fTga));
fTga.close();
// write JPG
COFile fJpg;
nlassert(fJpg.open(jpg));
nlassert(im.writeJPG(fJpg));
fJpg.close();
}
void convertImages(CConfigFile::CVar *var)
{
nlassert(var != NULL);
// store current path
string curPath = CPath::standardizePath(CPath::getCurrentPath());
// Create 'images' directory in the root folder if not present
if (!CFile::isExists("images"))
CFile::createDirectory("images");
// Scan each directory
for (uint i=0 ; i<var->size() ; i++)
{
string path = CPath::standardizePath(var->asString(i));
vector<string> files;
CPath::getPathContent(path, false, false, true, files);
// Convert each file
for (uint j=0 ; j<files.size() ; j++)
{
// get filenames
string file = CFile::getFilename(files[j]);
string src = path + file;
string dst = remap2Jpg(curPath + "images/" + file);
cout << "Copying file (" << i+1 << "/" << var->size() << " - " << j+1 << " / " << files.size() << ") : " << file << " ... ";
// Convert the file
if (!CFile::isExists(dst))
{
tga2Jpg(src, dst);
cout << " OK\n";
}
else
{
cout << "skipped\n";
}
}
}
}
bool endsWith( const CSString& s, const CSString& substring )
{
return ( s.right( (uint)substring.size() ) == substring );
}
void ProcessDirectory( const CSString& dir, const StringVector& extensions )
{
CSString data;
int nbResults = 0;
int sixieme;
vector<string> files;
printf( "%s\n", dir.c_str() );
CPath::getPathContent ( dir.c_str(), true, false, true, files );
sixieme = (int)files.size() / 6;
printf( "%u files are processed", (uint) files.size() );
for (uint32 i=0; i<files.size(); ++i)
{
bool extOK = false;
uint numExt = 0;
while ( ( !extOK ) && ( numExt < extensions.size() ) )
{
extOK = endsWith( files[i], extensions[numExt] );
numExt++;
}
if ( extOK )
{
data.readFromFile( files[i] );
// Don't parse LOG
string::size_type n = data.find("<LOG>");
if (n != CSString::npos)
data.erase(n);
data = data.toLower();
for ( uint it=0; it<listeIcones.size(); it++ )
{
if ( data.contains( CSString(listeIcones[it]).toLower().c_str() ) )
{
string fileName = CFile::getFilename( files[i] );
citations[ listeIcones[it] ].push_back( fileName );
nbResults++;
}
}
}
if ( i%sixieme == 0 )
printf( "." );
}
printf( " %d results found\n\n", nbResults );
}
int main()
{
StringVector extensions;
new CApplicationContext();
CSString REP_SRC, REP_GUI, REP_LEVEL_DESIGN;
int searchSrcClient, searchGui, searchLevelDesign;
uint sizeLimit = 5;
CConfigFile cf;
CConfigFile::CVar *var;
cf.load("icon_search.cfg");
var = cf.getVarPtr("SearchClientSrc");
nlassert(var);
searchSrcClient = var->asInt();
var = cf.getVarPtr("ClientSrcPath");
nlassert(var);
REP_SRC = var->asString();
var = cf.getVarPtr("SearchGUI");
nlassert(var);
searchGui = var->asInt();
var = cf.getVarPtr("GUIPath");
nlassert(var);
REP_GUI = var->asString();
var = cf.getVarPtr("SearchLevelDesign");
nlassert(var);
searchLevelDesign = var->asInt();
var = cf.getVarPtr("LevelDesignPath");
nlassert(var);
REP_LEVEL_DESIGN = var->asString();
var = cf.getVarPtr("IconPath");
nlassert(var);
convertImages(var);
findIcons(var);
var = cf.getVarPtr("SizeLimit");
if (var)
sizeLimit = (uint)var->asInt();
var = cf.getVarPtr("AddUsedIcons");
if (var)
addUsedIcons = var->asBool();
var = cf.getVarPtr("AddFreeIcons");
if (var)
addFreeIcons = var->asBool();
REP_ITEM = REP_LEVEL_DESIGN + "leveldesign\\Game_elem\\items\\";
REP_MISSION = REP_LEVEL_DESIGN + "leveldesign\\Game_elem\\mission\\";
REP_SITEM = REP_LEVEL_DESIGN + "leveldesign\\game_element\\sitem\\";
REP_SBRICK = REP_LEVEL_DESIGN + "leveldesign\\game_element\\sbrick\\";
REP_DFN = REP_LEVEL_DESIGN + "leveldesign\\DFN\\";
REP_FACTION = REP_LEVEL_DESIGN + "leveldesign\\World\\factions\\";
var = cf.getVarPtr("Wildcard");
if (var)
for (uint i=0 ; i<var->size() ; i++)
for (uint it=0; it<listeIcones.size(); it++)
{
string wild = var->asString(i);
if (testWildCard(listeIcones[it], wild))
{
citations[listeIcones[it]].push_back("Matched with: " + wild);
}
}
printf( "\nProcessing Directories\n----------------------\n\n" );
// CLIENT SRC FILES
if ( searchSrcClient )
{
extensions.push_back( "cpp" );
extensions.push_back( "h" );
ProcessDirectory( REP_SRC, extensions );
}
// GUI FILES
if ( searchGui )
{
extensions.clear();
extensions.push_back( "xml" );
ProcessDirectory( REP_GUI, extensions );
}
if ( searchLevelDesign )
{
// ITEM FILES
extensions.clear();
extensions.push_back( "item" );
ProcessDirectory( REP_ITEM, extensions );
// MISSION FILES
extensions.clear();
extensions.push_back( "mission_icon" );
ProcessDirectory( REP_MISSION, extensions );
// SITEM FILES
extensions.clear();
extensions.push_back( "sitem" );
ProcessDirectory( REP_SITEM, extensions );
// SBRICK FILES
extensions.clear();
extensions.push_back( "sbrick" );
ProcessDirectory( REP_SBRICK, extensions );
// DFN FILES
extensions.clear();
extensions.push_back( "dfn" );
ProcessDirectory( REP_DFN, extensions );
// FACTION FILES
extensions.clear();
extensions.push_back( "faction" );
ProcessDirectory( REP_FACTION, extensions );
}
generateHTML("icons.html", sizeLimit);
}