cleanup HTML output
This commit is contained in:
@@ -39,13 +39,20 @@ const CString STYLE_CSS = "Style.css";
|
|||||||
#define SHOW_PLAY_MODE(pm) THEME->GetMetric("ProfileHtml","ShowPlayMode"+PlayModeToString(pm))
|
#define SHOW_PLAY_MODE(pm) THEME->GetMetric("ProfileHtml","ShowPlayMode"+PlayModeToString(pm))
|
||||||
#define SHOW_RADAR_CATEGORY(rc) THEME->GetMetricB("ProfileHtml","ShowRadarCategory"+RadarCategoryToString(rc))
|
#define SHOW_RADAR_CATEGORY(rc) THEME->GetMetricB("ProfileHtml","ShowRadarCategory"+RadarCategoryToString(rc))
|
||||||
|
|
||||||
|
#define NEWLINE "\r\n"
|
||||||
|
|
||||||
|
void TranslatedWrite( RageFile &f, CString s )
|
||||||
|
{
|
||||||
|
s.Replace("\n",NEWLINE);
|
||||||
|
f.Write( s );
|
||||||
|
}
|
||||||
|
|
||||||
static int g_Level = 1;
|
static int g_Level = 1;
|
||||||
|
|
||||||
inline CString MakeUniqueId() { CString s="id"+ssprintf("%d%d%d",rand(),rand(),rand()); return s; }
|
inline CString MakeUniqueId() { CString s="id"+ssprintf("%d%d%d",rand(),rand(),rand()); return s; }
|
||||||
inline void PRINT_OPEN(RageFile &f,CString sName,bool bExpanded,CString sID){ g_Level++; ASSERT(g_Level>0 && g_Level<6); f.Write( ssprintf("<div class='section%d'>\n" "<h%d onClick='expandIt(%s); return false' CLASS='outline'>%s</h%d>\n" "<DIV ID='%s' CLASS='%s'>\n", g_Level, g_Level, sID.c_str(), sName.c_str(), g_Level, sID.c_str(), bExpanded?"visibletext":"hiddentext") ); }
|
inline void PRINT_OPEN(RageFile &f,CString sName,bool bExpanded,CString sID){ g_Level++; ASSERT(g_Level>0 && g_Level<6); TranslatedWrite(f,ssprintf("<div class='section%d'>\n" "<h%d onClick='expandIt(%s); return false' CLASS='outline'>%s</h%d>\n" "<DIV ID='%s' CLASS='%s'>\n", g_Level, g_Level, sID.c_str(), sName.c_str(), g_Level, sID.c_str(), bExpanded?"visibletext":"hiddentext") ); }
|
||||||
inline void PRINT_OPEN(RageFile &f,CString sName,bool bExpanded=false) { PRINT_OPEN(f,sName,bExpanded,MakeUniqueId()); }
|
inline void PRINT_OPEN(RageFile &f,CString sName,bool bExpanded=false) { PRINT_OPEN(f,sName,bExpanded,MakeUniqueId()); }
|
||||||
inline void PRINT_CLOSE(RageFile &f) { f.Write( "</div>\n" "</div>\n" ); g_Level--; ASSERT(g_Level>=0); }
|
inline void PRINT_CLOSE(RageFile &f) { TranslatedWrite(f, "</div>\n" "</div>\n" ); g_Level--; ASSERT(g_Level>=0); }
|
||||||
|
|
||||||
|
|
||||||
struct Table
|
struct Table
|
||||||
@@ -100,83 +107,83 @@ inline void PrintTable(RageFile &f,Table &table)
|
|||||||
|
|
||||||
int iMaxItemsPerCol = (vLines.size()+iNumCols-1) / iNumCols;
|
int iMaxItemsPerCol = (vLines.size()+iNumCols-1) / iNumCols;
|
||||||
iNumCols = (vLines.size()+iMaxItemsPerCol-1) / iMaxItemsPerCol; // round up
|
iNumCols = (vLines.size()+iMaxItemsPerCol-1) / iMaxItemsPerCol; // round up
|
||||||
f.Write(ssprintf("<table class='%s'><tr>\n",bPrintInstructions?"instructions":"group"));
|
TranslatedWrite(f,ssprintf("<table class='%s'><tr>\n",bPrintInstructions?"instructions":"group"));
|
||||||
if( iNumCols == 0 )
|
if( iNumCols == 0 )
|
||||||
{
|
{
|
||||||
f.Write("<td>empty</td>\n");
|
TranslatedWrite(f,"<td>empty</td>\n");
|
||||||
}
|
}
|
||||||
for( int col=0; col<iNumCols; col++ )
|
for( int col=0; col<iNumCols; col++ )
|
||||||
{
|
{
|
||||||
f.Write("<td>\n");
|
TranslatedWrite(f,"<td>\n");
|
||||||
|
|
||||||
int iStartItem = col*iMaxItemsPerCol;
|
int iStartItem = col*iMaxItemsPerCol;
|
||||||
|
|
||||||
f.Write("<table class='column'>\n");
|
TranslatedWrite(f,"<table class='column'>\n");
|
||||||
for( int i=iStartItem; i<iStartItem+iMaxItemsPerCol; i++ )
|
for( int i=iStartItem; i<iStartItem+iMaxItemsPerCol; i++ )
|
||||||
{
|
{
|
||||||
f.Write("<tr>");
|
TranslatedWrite(f,"<tr>");
|
||||||
|
|
||||||
const Table::Line& line = (i<(int)vLines.size()) ? vLines[i] : Table::Line();
|
const Table::Line& line = (i<(int)vLines.size()) ? vLines[i] : Table::Line();
|
||||||
if( bPrintRank )
|
if( bPrintRank )
|
||||||
{
|
{
|
||||||
f.Write("<td class='rank'>");
|
TranslatedWrite(f,"<td class='rank'>");
|
||||||
f.Write( line.sRank );
|
TranslatedWrite(f, line.sRank );
|
||||||
f.Write("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
f.Write("<td> </td>");
|
TranslatedWrite(f,"<td> </td>");
|
||||||
}
|
}
|
||||||
if( bPrintRank )
|
if( bPrintRank )
|
||||||
{
|
{
|
||||||
f.Write("<td>");
|
TranslatedWrite(f,"<td>");
|
||||||
f.Write("<p class='songtitle'>");
|
TranslatedWrite(f,"<p class='songtitle'>");
|
||||||
f.Write( line.sName );
|
TranslatedWrite(f, line.sName );
|
||||||
f.Write("</p>");
|
TranslatedWrite(f,"</p>");
|
||||||
if( !line.sSubName.empty() )
|
if( !line.sSubName.empty() )
|
||||||
{
|
{
|
||||||
f.Write("<p class='songsubtitle'>");
|
TranslatedWrite(f,"<p class='songsubtitle'>");
|
||||||
f.Write( line.sSubName );
|
TranslatedWrite(f, line.sSubName );
|
||||||
f.Write("</p>");
|
TranslatedWrite(f,"</p>");
|
||||||
}
|
}
|
||||||
f.Write("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
}
|
}
|
||||||
else if( line.sValue.empty() )
|
else if( line.sValue.empty() )
|
||||||
{
|
{
|
||||||
f.Write("<td>");
|
TranslatedWrite(f,"<td>");
|
||||||
f.Write( line.sName );
|
TranslatedWrite(f, line.sName );
|
||||||
f.Write("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
f.Write("<td class='name'>");
|
TranslatedWrite(f,"<td class='name'>");
|
||||||
f.Write( line.sName );
|
TranslatedWrite(f, line.sName );
|
||||||
f.Write("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !line.sSubSubName.empty() )
|
if( !line.sSubSubName.empty() )
|
||||||
{
|
{
|
||||||
f.Write("<td> </td>");
|
TranslatedWrite(f,"<td> </td>");
|
||||||
f.Write("<td>");
|
TranslatedWrite(f,"<td>");
|
||||||
f.Write("<p class='stepsdescription'>");
|
TranslatedWrite(f,"<p class='stepsdescription'>");
|
||||||
f.Write( line.sSubSubName );
|
TranslatedWrite(f, line.sSubSubName );
|
||||||
f.Write("</p>");
|
TranslatedWrite(f,"</p>");
|
||||||
f.Write("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !line.sValue.empty() )
|
if( !line.sValue.empty() )
|
||||||
{
|
{
|
||||||
f.Write("<td> </td>");
|
TranslatedWrite(f,"<td> </td>");
|
||||||
f.Write("<td class='value'>");
|
TranslatedWrite(f,"<td class='value'>");
|
||||||
f.Write( line.sValue );
|
TranslatedWrite(f, line.sValue );
|
||||||
f.Write("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
}
|
}
|
||||||
f.Write( "\n" );
|
TranslatedWrite(f, "\n" );
|
||||||
|
|
||||||
f.Write("</tr>");
|
TranslatedWrite(f,"</tr>\n");
|
||||||
}
|
}
|
||||||
f.Write("</table>\n");
|
TranslatedWrite(f,"</table>\n");
|
||||||
|
|
||||||
f.Write("</td>\n");
|
TranslatedWrite(f,"</td>\n");
|
||||||
}
|
}
|
||||||
f.Write("</tr></table>\n");
|
TranslatedWrite(f,"</tr>\n</table>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STRING_AS_LINK(s) CString("<a href='"+s+"'>"+s+"</a>")
|
#define STRING_AS_LINK(s) CString("<a href='"+s+"'>"+s+"</a>")
|
||||||
@@ -716,29 +723,29 @@ bool PrintGradeTableForStepsType( RageFile &f, const Profile *pProfile, StepsTyp
|
|||||||
|
|
||||||
PRINT_OPEN(f, GAMEMAN->NotesTypeToThemedString(st).c_str() );
|
PRINT_OPEN(f, GAMEMAN->NotesTypeToThemedString(st).c_str() );
|
||||||
{
|
{
|
||||||
f.PutLine( "<table class='difficulty'>\n" );
|
TranslatedWrite(f, "<table class='difficulty'>\n" );
|
||||||
|
|
||||||
// table header row
|
// table header row
|
||||||
f.Write( "<tr><td> </td>" );
|
TranslatedWrite(f, "<tr><td> </td>" );
|
||||||
FOREACH_Difficulty( dc )
|
FOREACH_Difficulty( dc )
|
||||||
{
|
{
|
||||||
if( dc == DIFFICULTY_EDIT )
|
if( dc == DIFFICULTY_EDIT )
|
||||||
continue; // skip
|
continue; // skip
|
||||||
f.PutLine( ssprintf("<td>%s</td>", Capitalize(DifficultyToThemedString(dc)).c_str()) );
|
TranslatedWrite(f, ssprintf("<td>%s</td>", Capitalize(DifficultyToThemedString(dc)).c_str()) );
|
||||||
}
|
}
|
||||||
f.PutLine( "</tr>" );
|
TranslatedWrite(f, "</tr>\n" );
|
||||||
|
|
||||||
// table body rows
|
// table body rows
|
||||||
for( i=0; i<vpSongs.size(); i++ )
|
for( i=0; i<vpSongs.size(); i++ )
|
||||||
{
|
{
|
||||||
Song* pSong = vpSongs[i];
|
Song* pSong = vpSongs[i];
|
||||||
|
|
||||||
f.PutLine( "<tr>" );
|
TranslatedWrite(f, "<tr>" );
|
||||||
|
|
||||||
f.Write( "<td>" );
|
TranslatedWrite(f, "<td>" );
|
||||||
f.Write( ssprintf("<p class='songtitle'>%s</p>", pSong->GetDisplayMainTitle().c_str()) );
|
TranslatedWrite(f, ssprintf("<p class='songtitle'>%s</p>", pSong->GetDisplayMainTitle().c_str()) );
|
||||||
f.Write( ssprintf("<p class='songsubtitle'>%s</p>", pSong->GetDisplaySubTitle().c_str()) );
|
TranslatedWrite(f, ssprintf("<p class='songsubtitle'>%s</p>", pSong->GetDisplaySubTitle().c_str()) );
|
||||||
f.Write( "</td>" );
|
TranslatedWrite(f, "</td>" );
|
||||||
|
|
||||||
FOREACH_Difficulty( dc )
|
FOREACH_Difficulty( dc )
|
||||||
{
|
{
|
||||||
@@ -748,24 +755,24 @@ bool PrintGradeTableForStepsType( RageFile &f, const Profile *pProfile, StepsTyp
|
|||||||
Steps* pSteps = pSong->GetStepsByDifficulty( st, dc, false );
|
Steps* pSteps = pSong->GetStepsByDifficulty( st, dc, false );
|
||||||
if( pSteps && !pSteps->IsAutogen() )
|
if( pSteps && !pSteps->IsAutogen() )
|
||||||
{
|
{
|
||||||
f.PutLine("<td>");
|
TranslatedWrite(f,"<td>");
|
||||||
f.PutLine( ssprintf("<font class='meter'>%d</font>",pSteps->GetMeter()) );
|
TranslatedWrite(f, ssprintf("<font class='meter'>%d</font>",pSteps->GetMeter()) );
|
||||||
HighScore hs = pProfile->GetStepsHighScoreList( pSong,pSteps ).GetTopScore();
|
HighScore hs = pProfile->GetStepsHighScoreList( pSong,pSteps ).GetTopScore();
|
||||||
Grade grade = hs.grade;
|
Grade grade = hs.grade;
|
||||||
if( grade != GRADE_NO_DATA )
|
if( grade != GRADE_NO_DATA )
|
||||||
f.PutLine( ssprintf("<font class='grade'>%s</font>",GradeToThemedString(grade).c_str()) );
|
TranslatedWrite(f, ssprintf("<font class='grade'>%s</font>",GradeToThemedString(grade).c_str()) );
|
||||||
f.PutLine("</td>");
|
TranslatedWrite(f,"</td>");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
f.PutLine( "<td> </td>" );
|
TranslatedWrite(f, "<td> </td>" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Write( "</tr>" );
|
TranslatedWrite(f, "</tr>\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
f.PutLine( "</table>\n" );
|
TranslatedWrite(f, "</table>\n" );
|
||||||
}
|
}
|
||||||
PRINT_CLOSE(f);
|
PRINT_CLOSE(f);
|
||||||
|
|
||||||
@@ -940,10 +947,10 @@ void PrintScreenshot( RageFile &f, const Profile::Screenshot &ss )
|
|||||||
CString sImgHtml = ssprintf("<a href='%s' target='_new'><img class='screenshot' src='%s' width='160' height='120'></a>", sImagePath.c_str(), sImagePath.c_str() );
|
CString sImgHtml = ssprintf("<a href='%s' target='_new'><img class='screenshot' src='%s' width='160' height='120'></a>", sImagePath.c_str(), sImagePath.c_str() );
|
||||||
|
|
||||||
|
|
||||||
f.Write("<table>\n");
|
TranslatedWrite(f,"<table>\n");
|
||||||
f.Write("<tr>\n");
|
TranslatedWrite(f,"<tr>\n");
|
||||||
f.Write("<td>"+sImgHtml+"</td>\n");
|
TranslatedWrite(f,"<td>"+sImgHtml+"</td>\n");
|
||||||
f.Write("<td>\n");
|
TranslatedWrite(f,"<td>\n");
|
||||||
|
|
||||||
BEGIN_TABLE(1);
|
BEGIN_TABLE(1);
|
||||||
|
|
||||||
@@ -954,9 +961,9 @@ void PrintScreenshot( RageFile &f, const Profile::Screenshot &ss )
|
|||||||
|
|
||||||
END_TABLE;
|
END_TABLE;
|
||||||
|
|
||||||
f.Write("</td>\n");
|
TranslatedWrite(f,"</td>\n");
|
||||||
|
|
||||||
f.Write("</table>\n");
|
TranslatedWrite(f,"</table>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintScreenshots( RageFile &f, const Profile *pProfile, CString sTitle, CString sProfileDir )
|
void PrintScreenshots( RageFile &f, const Profile *pProfile, CString sTitle, CString sProfileDir )
|
||||||
@@ -1005,17 +1012,17 @@ void PrintCaloriesBurned( RageFile &f, const Profile *pProfile, CString sTitle,
|
|||||||
{
|
{
|
||||||
PRINT_OPEN(f, sTitle );
|
PRINT_OPEN(f, sTitle );
|
||||||
{
|
{
|
||||||
f.Write("<table class='calories'>\n");
|
TranslatedWrite(f,"<table class='calories'>\n");
|
||||||
|
|
||||||
// header row
|
// header row
|
||||||
f.Write("<tr>");
|
TranslatedWrite(f,"<tr>");
|
||||||
f.Write("<td></td>");
|
TranslatedWrite(f,"<td></td>");
|
||||||
{
|
{
|
||||||
for( int i=0; i<DAYS_IN_WEEK; i++ )
|
for( int i=0; i<DAYS_IN_WEEK; i++ )
|
||||||
f.Write("<td>"+DayOfWeekToShortString(i)+"</td>");
|
TranslatedWrite(f,"<td>"+DayOfWeekToShortString(i)+"</td>");
|
||||||
}
|
}
|
||||||
f.Write("<td>Total</td>");
|
TranslatedWrite(f,"<td>Total</td>");
|
||||||
f.Write("</tr>");
|
TranslatedWrite(f,"</tr>\n");
|
||||||
|
|
||||||
// row for each week
|
// row for each week
|
||||||
tm when = GetLocalTime();
|
tm when = GetLocalTime();
|
||||||
@@ -1025,8 +1032,8 @@ void PrintCaloriesBurned( RageFile &f, const Profile *pProfile, CString sTitle,
|
|||||||
for( int i=0; i<NUM_LAST_WEEKS; i++ )
|
for( int i=0; i<NUM_LAST_WEEKS; i++ )
|
||||||
{
|
{
|
||||||
float fWeekCals = 0;
|
float fWeekCals = 0;
|
||||||
f.Write("<tr>");
|
TranslatedWrite(f,"<tr>");
|
||||||
f.Write("<td>"+LastWeekToString(i)+"</td>");
|
TranslatedWrite(f,"<td>"+LastWeekToString(i)+"</td>");
|
||||||
for( int i=0; i<DAYS_IN_WEEK; i++ )
|
for( int i=0; i<DAYS_IN_WEEK; i++ )
|
||||||
{
|
{
|
||||||
Profile::Day day = { when.tm_yday, when.tm_year+1900 };
|
Profile::Day day = { when.tm_yday, when.tm_year+1900 };
|
||||||
@@ -1035,15 +1042,15 @@ void PrintCaloriesBurned( RageFile &f, const Profile *pProfile, CString sTitle,
|
|||||||
CString sCalories;
|
CString sCalories;
|
||||||
if( fDayCals )
|
if( fDayCals )
|
||||||
sCalories = Commify( (int)fDayCals );
|
sCalories = Commify( (int)fDayCals );
|
||||||
f.Write("<td class='daycalories'><font class='daycalories'>"+sCalories+"</font></td>");
|
TranslatedWrite(f,"<td class='daycalories'><font class='daycalories'>"+sCalories+"</font></td>");
|
||||||
when = AddDays( when, +1 );
|
when = AddDays( when, +1 );
|
||||||
}
|
}
|
||||||
f.Write("<td class='weekcalories'><font class='weekcalories'>"+Commify((int)fWeekCals)+"</font></td>");
|
TranslatedWrite(f,"<td class='weekcalories'><font class='weekcalories'>"+Commify((int)fWeekCals)+"</font></td>");
|
||||||
f.Write("</tr>");
|
TranslatedWrite(f,"</tr>\n");
|
||||||
when = AddDays( when, -DAYS_IN_WEEK*2 );
|
when = AddDays( when, -DAYS_IN_WEEK*2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.Write("</table>\n");
|
TranslatedWrite(f,"</table>\n");
|
||||||
}
|
}
|
||||||
PRINT_CLOSE(f);
|
PRINT_CLOSE(f);
|
||||||
}
|
}
|
||||||
@@ -1124,7 +1131,7 @@ void SaveStatsWebPage(
|
|||||||
// Print HTML headers
|
// Print HTML headers
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
f.PutLine( ssprintf("\
|
TranslatedWrite(f, ssprintf("\
|
||||||
<html>\n\
|
<html>\n\
|
||||||
<head>\n\
|
<head>\n\
|
||||||
<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=UTF-8\">\n\
|
<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=UTF-8\">\n\
|
||||||
@@ -1187,8 +1194,8 @@ TITLE.c_str(), STYLE_CSS.c_str() ) );
|
|||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Write( ssprintf(
|
TranslatedWrite(f, ssprintf(
|
||||||
"<table border='0' cellpadding='0' cellspacing='0' width='100%%' cellspacing='5'><tr><td><h1>%s</h1></td><td>%s</td></tr></table>\n",
|
"<table border='0' cellpadding='0' cellspacing='0' width='100%%' cellspacing='5'><tr><td><h1>%s</h1></td><td>%s</td></tr>\n</table>\n",
|
||||||
TITLE.c_str(), sNameCell.c_str() ) );
|
TITLE.c_str(), sNameCell.c_str() ) );
|
||||||
|
|
||||||
switch( htmlType )
|
switch( htmlType )
|
||||||
@@ -1221,13 +1228,14 @@ TITLE.c_str(), STYLE_CSS.c_str() ) );
|
|||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
f.PutLine( ssprintf("<p class='footer'>%s</p>\n", FOOTER.c_str()) );
|
TranslatedWrite(f, ssprintf("<p class='footer'>%s</p>\n", FOOTER.c_str()) );
|
||||||
|
|
||||||
f.PutLine( "</body>\n" );
|
TranslatedWrite(f, "</body>\n" );
|
||||||
f.PutLine( "</html>\n" );
|
TranslatedWrite(f, "</html>\n" );
|
||||||
f.Close();
|
f.Close();
|
||||||
|
|
||||||
// don't sign Stats.html. It's redundant and very slow.
|
// Don't sign Stats.html. The html data is redundant to the xml data, and
|
||||||
|
// signing is slow.
|
||||||
//if( PREFSMAN->m_bSignProfileData )
|
//if( PREFSMAN->m_bSignProfileData )
|
||||||
// CryptManager::SignFileToFile(fn);
|
// CryptManager::SignFileToFile(fn);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user