winix/core/templates.cpp

543 lines
9.1 KiB
C++
Executable File

/*
* This file is a part of CMSLU -- Content Management System like Unix
* and is not publicly distributed
*
* Copyright (c) 2008, Tomasz Sowa
* All rights reserved.
*
*/
#include "templates.h"
namespace TemplatesFunctions
{
Pattern pat_index;
Pattern pat_item;
Pattern pat_dir;
Pattern pat_item_add_edit;
Pattern pat_item_del_confirm;
Pattern pat_err_404;
Pattern pat_err_internal;
Functions functions;
void language(Info & i)
{
// at the moment only Polish language
i.out << "pl";
}
void title(Info & i)
{
i.out << "";
}
void charset(Info & i)
{
i.out << "iso-8859-2";
}
void version_major(Info & i)
{
i.out << MAJOR_VER;
}
void version_minor(Info & i)
{
i.out << MINOR_VER;
}
void version_revision(Info & i)
{
i.out << REVISION_VER;
}
void content(Info & i)
{
Pattern * p;
switch( request.result )
{
case Request::add_item:
case Request::edit_item:
p = &pat_item_add_edit;
break;
case Request::show_dir:
p = &pat_dir;
break;
case Request::show_item:
p = &pat_item;
break;
case Request::del_item_confirm:
p = &pat_item_del_confirm;
break;
case Request::err_internal:
p = &pat_err_internal;
break;
case Request::err404:
default:
p = &pat_err_404;
}
Generator gen(i.out, *p, functions);
gen.Generate();
}
void base_url(Info & i)
{
i.out << data.base_url;
}
void current_url(Info & i)
{
if( request.env_request_uri )
i.out << request.env_request_uri;
else
base_url(i);
}
void user_logged(Info & i)
{
i.result = request.session->is_logged;
}
void user(Info & i)
{
i.out << request.session->user;
}
void item_id(Info & i)
{
i.out << request.item.id;
}
void item_subject(Info & i)
{
i.out << HtmlSpecial(request.item.subject);
}
void item_content(Info & i)
{
//i.out << HtmlSpecial(request.item.content);
i.out << request.item.content;
}
void item_url_subject(Info & i)
{
i.out << request.item.url_subject;
}
void item_dir(Info & i)
{
std::string path;
if( data.dir.MakePath(request.item.parent_id, path) )
{
i.out << path;
}
else
{
i.out << "problem with generating a path";
}
}
// ---------
void old_item_id(Info & i)
{
i.out << request.session->item.id;
}
void old_item_subject(Info & i)
{
i.out << HtmlSpecial(request.session->item.subject);
}
void old_item_content(Info & i)
{
//i.out << HtmlSpecial(request.session->item.content);
i.out << request.session->item.content;
}
void old_item_url_subject(Info & i)
{
i.out << request.session->item.url_subject;
}
void old_item_dir(Info & i)
{
std::string path;
if( data.dir.MakePath(request.session->item.parent_id, path) )
{
i.out << path;
}
else
{
i.out << "problem with generating a path";
}
}
// ----
void full_dir(Info & i)
{
std::vector<Item>::size_type a;
for(a=0 ; a<request.cur_dir_table.size() ; ++a)
{
i.out << request.cur_dir_table[a].url_subject << '/';
}
}
std::vector<Item>::size_type item_index, dir_index;
void dir_items(Info & i)
{
if( i.iter >= (int)request.dir_table.size() )
{
i.result = false;
}
else
{
i.result = true;
dir_index = i.iter;
}
}
void dir_subject2(Info & i)
{
if( dir_index < request.dir_table.size() )
{
if( request.dir_table[dir_index].subject.empty() )
i.out << "bez nazwy";
else
HtmlSpecial(i.out, request.dir_table[dir_index].subject);
}
}
void dir_url_subject2(Info & i)
{
if( dir_index < request.dir_table.size() )
{
HtmlSpecial(i.out, request.dir_table[dir_index].url_subject);
}
}
void items(Info & i) // zamienic na fitems !!
{
if( i.iter >= (int)request.item_table.size() )
{
i.result = false;
}
else
{
i.result = true;
item_index = i.iter;
}
}
void item_subject2(Info & i)
{
if( item_index < request.item_table.size() )
{
if( request.item_table[item_index].subject.empty() )
i.out << "bez nazwy";
else
HtmlSpecial(i.out, request.item_table[item_index].subject);
}
}
void item_url_subject2(Info & i)
{
if( item_index < request.item_table.size() )
HtmlSpecial(i.out, request.item_table[item_index].url_subject);
}
void item_content2(Info & i)
{
if( item_index < request.item_table.size() )
//HtmlSpecial(i.out, request.item_table[item_index].content);
i.out << request.item_table[item_index].content;
}
void item_id2(Info & i)
{
if( item_index < request.item_table.size() )
i.out << request.item_table[item_index].id;
}
void incorrect_dir(Info & i)
{
if( request.session->done_status == Error::incorrect_dir )
i.result = true;
else
i.result = false;
}
std::vector<Item>::size_type current_dir_index;
void fcurrent_dir(Info & i)
{
if( i.iter < (int)request.cur_dir_table.size() )
{
current_dir_index = i.iter;
i.result = true;
}
else
i.result = false;
}
void current_dir_part_name(Info & i)
{
if( current_dir_index < request.cur_dir_table.size() )
i.out << request.cur_dir_table[current_dir_index].subject;
}
void current_dir_part_url(Info & i)
{
std::vector<Item>::size_type a;
i.out << data.base_url;
for(a = 0 ; a <= current_dir_index && a < request.cur_dir_table.size() ; ++a)
{
i.out << request.cur_dir_table[a].url_subject << '/';
}
}
void edit_item(Info & i)
{
i.result = request.result == Request::edit_item;
}
void added_item(Info &i)
{
i.result = request.session->done == Done::added_item;
}
void edited_item(Info &i)
{
i.result = request.session->done == Done::edited_item;
}
void deleted_item(Info &i)
{
i.result = request.session->done == Done::deleted_item;
}
// zostawic tylko jedna funkcje done_with_errors (bedzie uzywana do roznych celow) !!
void deleted_item_errors(Info & i)
{
i.result = request.session->done_status != Error::ok;
}
void done_with_errors(Info & i)
{
i.result = request.session->done_status != Error::ok;
}
void done_status(Info & i)
{
i.out << static_cast<int>( request.session->done_status );
}
void fitems_in_dir(Info & i)
{
// i.out << "abc: " << variables["fitems_directory"];
}
void loggedout(Info & i)
{
i.result = request.session->done == Done::loggedout;
}
} // namespace TemplatesFunctions
void Templates::CreateFunctions()
{
using namespace TemplatesFunctions;
functions.Clear();
functions.Insert("language", language);
functions.Insert("title", title);
functions.Insert("charset", charset);
functions.Insert("content", content);
functions.Insert("version_major", version_major);
functions.Insert("version_minor", version_minor);
functions.Insert("version_revision", version_revision);
functions.Insert("base_url", base_url);
functions.Insert("current_url", current_url);
functions.Insert("user_logged", user_logged);
functions.Insert("user", user);
functions.Insert("item_id", item_id);
functions.Insert("item_subject", item_subject);
functions.Insert("item_content", item_content);
functions.Insert("item_url_subject", item_url_subject);
functions.Insert("item_dir", item_dir);
functions.Insert("old_item_id", old_item_id);
functions.Insert("old_item_subject", old_item_subject);
functions.Insert("old_item_content", old_item_content);
functions.Insert("old_item_url_subject", old_item_url_subject);
functions.Insert("old_item_dir", old_item_dir);
functions.Insert("dir_items", dir_items);
functions.Insert("items", items);
functions.Insert("item_subject2", item_subject2);
functions.Insert("dir_subject2", dir_subject2);
functions.Insert("full_dir", full_dir);
functions.Insert("dir_url_subject2", dir_url_subject2);
functions.Insert("item_url_subject2", item_url_subject2);
functions.Insert("item_content2", item_content2);
functions.Insert("item_id2", item_id2);
functions.Insert("edit_item", edit_item);
functions.Insert("incorrect_dir", incorrect_dir);
functions.Insert("fcurrent_dir", fcurrent_dir);
functions.Insert("current_dir_part_name", current_dir_part_name);
functions.Insert("current_dir_part_url", current_dir_part_url);
functions.Insert("added_item", added_item);
functions.Insert("edited_item", edited_item);
functions.Insert("deleted_item", deleted_item);
functions.Insert("loggedout", loggedout);
functions.Insert("deleted_item_errors", deleted_item_errors);
functions.Insert("done_with_errors", done_with_errors);
functions.Insert("done_status", done_status);
functions.Insert("fitems_in_dir", fitems_in_dir);
}
void Templates::Read()
{
using namespace TemplatesFunctions;
pat_index.Directory(data.templates);
pat_index.ParseFile(data.default_index);
pat_item.Directory(data.templates);
pat_item.ParseFile("item.html");
pat_dir.Directory(data.templates);
pat_dir.ParseFile("dir.html");
pat_item_add_edit.Directory(data.templates);
pat_item_add_edit.ParseFile("item_add_edit.html");
pat_err_404.Directory(data.templates);
pat_err_404.ParseFile("err_404.html");
pat_item_del_confirm.Directory(data.templates);
pat_item_del_confirm.ParseFile("item_del_confirm.html");
pat_err_internal.Directory(data.templates);
pat_err_internal.ParseFile("err_internal.html");
CreateFunctions();
}
void Templates::Generate()
{
using namespace TemplatesFunctions;
// clear some variables (indexes for example)
item_index = 0;
current_dir_index = 0;
Generator generator(request.page, pat_index, functions);
generator.Generate();
}