mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
Skylark: Renderer documentation
git-svn-id: svn://ultimatepp.org/upp/trunk@5261 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
9cf2cfae5d
commit
ec0eff7911
5 changed files with 469 additions and 304 deletions
|
|
@ -1,144 +1,147 @@
|
|||
void MakeLink(StringBuffer& out, const Vector<String>& part, const Vector<Value>& arg);
|
||||
|
||||
class Renderer {
|
||||
protected:
|
||||
VectorMap<String, Value> var;
|
||||
int lang;
|
||||
|
||||
Renderer& Link(const char *id, void (*view)(Http&), const Vector<Value>& arg);
|
||||
const One<Exe>& GetTemplate(const char *template_name);
|
||||
|
||||
public:
|
||||
Renderer& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; }
|
||||
Renderer& operator()(const ValueMap& map);
|
||||
Renderer& operator()(const char *id, void (*view)(Http&));
|
||||
Renderer& operator()(const char *id, void (*view)(Http&), const Value& arg1);
|
||||
Renderer& operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2);
|
||||
|
||||
Renderer& operator()(const Sql& sql);
|
||||
Renderer& operator()(Fields rec);
|
||||
Renderer& operator()(const SqlSelect& row_sel);
|
||||
Renderer& operator()(const char *id, const SqlSelect& sel);
|
||||
SqlUpdate Update(SqlId table);
|
||||
SqlInsert Insert(SqlId table);
|
||||
|
||||
Value operator[](const char *id) const { return var.Get(id, Null); }
|
||||
|
||||
String RenderString(const String& template_name);
|
||||
Value Render(const String& template_name) { return Raw(RenderString(template_name)); }
|
||||
|
||||
Renderer& Render(const char *id, const String& template_name);
|
||||
|
||||
Renderer() { lang = LNG_ENGLISH; }
|
||||
virtual ~Renderer();
|
||||
};
|
||||
|
||||
class Http : public Renderer {
|
||||
SkylarkApp& app;
|
||||
HttpHeader hdr;
|
||||
|
||||
String content;
|
||||
String viewid;
|
||||
|
||||
Vector<String> arg;
|
||||
String session_id;
|
||||
VectorMap<String, Value> session_var;
|
||||
bool session_dirty;
|
||||
|
||||
String redirect;
|
||||
int code;
|
||||
String code_text;
|
||||
String response;
|
||||
String content_type;
|
||||
String request_content_type;
|
||||
|
||||
VectorMap<String, String> cookies;
|
||||
|
||||
void ParseRequest(const char *s);
|
||||
void ReadMultiPart(const String& content);
|
||||
|
||||
String SessionFile(const String& sid);
|
||||
|
||||
void LoadSession();
|
||||
void SaveSession();
|
||||
|
||||
public:
|
||||
Http& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; }
|
||||
Http& operator()(const ValueMap& map) { Renderer::operator()(map); return *this; }
|
||||
Http& operator()(const char *id, void (*view)(Http&)) { Renderer::operator()(id, view); return *this; }
|
||||
Http& operator()(const char *id, void (*view)(Http&), const Value& arg1) { Renderer::operator()(id, view, arg1); return *this; }
|
||||
Http& operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2) { Renderer::operator()(id, view, arg1, arg2); return *this; }
|
||||
|
||||
Http& operator()(const Sql& sql) { Renderer::operator()(sql); return *this; }
|
||||
Http& operator()(Fields rec) { Renderer::operator()(rec); return *this; }
|
||||
Http& operator()(const SqlSelect& row_sel) { Renderer::operator()(row_sel); return *this; }
|
||||
Http& operator()(const char *id, const SqlSelect& sel) { Renderer::operator()(id, sel); return *this; }
|
||||
Http& Render(const char *id, const String& template_name) { Renderer::Render(id, template_name); return *this; }
|
||||
Value Render(const String& template_name) { return Renderer::Render(template_name); }
|
||||
|
||||
String GetHeader(const char *s) const { return hdr[s]; }
|
||||
int GetLength() const { return atoi(GetHeader("content-length")); }
|
||||
|
||||
String GetViewId() const { return viewid; }
|
||||
|
||||
Value operator[](const char *id) const { return Renderer::operator[](id); }
|
||||
int Int(const char *id) const;
|
||||
|
||||
String operator[](int i) const { return i >= 0 && i < arg.GetCount() ? arg[i] : String(); }
|
||||
int Int(int i) const;
|
||||
|
||||
int GetParamCount() const { return arg.GetCount(); }
|
||||
|
||||
Http& ContentType(const char *s) { content_type = s; return *this; }
|
||||
|
||||
Http& Content(const char *s, const Value& data);
|
||||
Http& operator<<(const Value& s);
|
||||
|
||||
Http& SetRawCookie(const char *id, const String& value,
|
||||
Time expires = Null, const char *path = NULL,
|
||||
const char *domain = NULL, bool secure = false, bool httponly = false);
|
||||
Http& SetCookie(const char *id, const String& value,
|
||||
Time expires = Null, const char *path = NULL,
|
||||
const char *domain = NULL, bool secure = false, bool httponly = false);
|
||||
|
||||
Http& ClearSession();
|
||||
Http& SessionSet(const char *id, const Value& value);
|
||||
|
||||
Http& NewIdentity() { SessionSet("__identity__", Null); return *this; }
|
||||
Http& NewSessionId();
|
||||
Http& SetLanguage(int lang);
|
||||
|
||||
Http& Response(int code_, const String& ctext) { code = code_; code_text = ctext; return *this; }
|
||||
|
||||
Http& RenderResult(const char *template_name);
|
||||
Http& Redirect(const char *url, int code_ = 302) { code = code_; redirect = url; return *this; }
|
||||
Http& Redirect(void (*view)(Http&), const Vector<Value>& arg);
|
||||
Http& Redirect(void (*view)(Http&));
|
||||
Http& Redirect(void (*view)(Http&), const Value& v1);
|
||||
Http& Redirect(void (*view)(Http&), const Value& v1, const Value& v2);
|
||||
|
||||
Http& Ux(const char *id, const String& text);
|
||||
Http& UxRender(const char *id, const char *template_name);
|
||||
Http& UxSet(const char *id, const String& value);
|
||||
Http& UxRun(const String& js_code);
|
||||
|
||||
String GetResponse() const { return response; }
|
||||
|
||||
void Dispatch(TcpSocket& socket);
|
||||
|
||||
const SkylarkApp& App() const { return app; }
|
||||
|
||||
Http(SkylarkApp& app);
|
||||
};
|
||||
|
||||
void RegisterHandler(void (*handler)(Http& http), const char *id, const char *path);
|
||||
|
||||
#define SKYLARK(name, path) void name(Http& http); INITBLOCK { UPP::RegisterHandler(name, #name, path); } void name(Http& http)
|
||||
|
||||
Vector<String> *GetUrlViewLinkParts(const String& id);
|
||||
|
||||
String MakeLink(void (*view)(Http&), const Vector<Value>& arg);
|
||||
|
||||
enum {
|
||||
SESSION_FORMAT_BINARY, SESSION_FORMAT_JSON, SESSION_FORMAT_XML
|
||||
};
|
||||
void MakeLink(StringBuffer& out, const Vector<String>& part, const Vector<Value>& arg);
|
||||
|
||||
class Renderer {
|
||||
protected:
|
||||
VectorMap<String, Value> var;
|
||||
int lang;
|
||||
|
||||
Renderer& Link(const char *id, void (*view)(Http&), const Vector<Value>& arg);
|
||||
const One<Exe>& GetTemplate(const char *template_name);
|
||||
|
||||
public:
|
||||
Renderer& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; }
|
||||
Renderer& operator()(const ValueMap& map);
|
||||
Renderer& operator()(const char *id, void (*handler)(Http&));
|
||||
Renderer& operator()(const char *id, void (*handler)(Http&), const Value& arg1);
|
||||
Renderer& operator()(const char *id, void (*handler)(Http&), const Value& arg1, const Value& arg2);
|
||||
|
||||
Renderer& operator()(const Sql& sql);
|
||||
Renderer& operator()(Fields rec);
|
||||
Renderer& operator()(const SqlSelect& row_sel);
|
||||
Renderer& operator()(const char *id, const SqlSelect& sel);
|
||||
|
||||
Renderer& SetLanguage(int lang);
|
||||
|
||||
SqlUpdate Update(SqlId table);
|
||||
SqlInsert Insert(SqlId table);
|
||||
|
||||
Value operator[](const char *id) const { return var.Get(id, Null); }
|
||||
|
||||
String RenderString(const String& template_name);
|
||||
Value Render(const String& template_name) { return Raw(RenderString(template_name)); }
|
||||
|
||||
Renderer& Render(const char *id, const String& template_name);
|
||||
|
||||
Renderer() { lang = LNG_ENGLISH; }
|
||||
virtual ~Renderer();
|
||||
};
|
||||
|
||||
class Http : public Renderer {
|
||||
SkylarkApp& app;
|
||||
HttpHeader hdr;
|
||||
|
||||
String content;
|
||||
String viewid;
|
||||
|
||||
Vector<String> arg;
|
||||
String session_id;
|
||||
VectorMap<String, Value> session_var;
|
||||
bool session_dirty;
|
||||
|
||||
String redirect;
|
||||
int code;
|
||||
String code_text;
|
||||
String response;
|
||||
String content_type;
|
||||
String request_content_type;
|
||||
|
||||
VectorMap<String, String> cookies;
|
||||
|
||||
void ParseRequest(const char *s);
|
||||
void ReadMultiPart(const String& content);
|
||||
|
||||
String SessionFile(const String& sid);
|
||||
|
||||
void LoadSession();
|
||||
void SaveSession();
|
||||
|
||||
public:
|
||||
Http& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; }
|
||||
Http& operator()(const ValueMap& map) { Renderer::operator()(map); return *this; }
|
||||
Http& operator()(const char *id, void (*view)(Http&)) { Renderer::operator()(id, view); return *this; }
|
||||
Http& operator()(const char *id, void (*view)(Http&), const Value& arg1) { Renderer::operator()(id, view, arg1); return *this; }
|
||||
Http& operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2) { Renderer::operator()(id, view, arg1, arg2); return *this; }
|
||||
|
||||
Http& operator()(const Sql& sql) { Renderer::operator()(sql); return *this; }
|
||||
Http& operator()(Fields rec) { Renderer::operator()(rec); return *this; }
|
||||
Http& operator()(const SqlSelect& row_sel) { Renderer::operator()(row_sel); return *this; }
|
||||
Http& operator()(const char *id, const SqlSelect& sel) { Renderer::operator()(id, sel); return *this; }
|
||||
Http& Render(const char *id, const String& template_name) { Renderer::Render(id, template_name); return *this; }
|
||||
Value Render(const String& template_name) { return Renderer::Render(template_name); }
|
||||
|
||||
String GetHeader(const char *s) const { return hdr[s]; }
|
||||
int GetLength() const { return atoi(GetHeader("content-length")); }
|
||||
|
||||
String GetViewId() const { return viewid; }
|
||||
|
||||
Value operator[](const char *id) const { return Renderer::operator[](id); }
|
||||
int Int(const char *id) const;
|
||||
|
||||
String operator[](int i) const { return i >= 0 && i < arg.GetCount() ? arg[i] : String(); }
|
||||
int Int(int i) const;
|
||||
|
||||
int GetParamCount() const { return arg.GetCount(); }
|
||||
|
||||
Http& ContentType(const char *s) { content_type = s; return *this; }
|
||||
|
||||
Http& Content(const char *s, const Value& data);
|
||||
Http& operator<<(const Value& s);
|
||||
|
||||
Http& SetRawCookie(const char *id, const String& value,
|
||||
Time expires = Null, const char *path = NULL,
|
||||
const char *domain = NULL, bool secure = false, bool httponly = false);
|
||||
Http& SetCookie(const char *id, const String& value,
|
||||
Time expires = Null, const char *path = NULL,
|
||||
const char *domain = NULL, bool secure = false, bool httponly = false);
|
||||
|
||||
Http& ClearSession();
|
||||
Http& SessionSet(const char *id, const Value& value);
|
||||
|
||||
Http& NewIdentity() { SessionSet("__identity__", Null); return *this; }
|
||||
Http& NewSessionId();
|
||||
Http& SetLanguage(int lang);
|
||||
|
||||
Http& Response(int code_, const String& ctext) { code = code_; code_text = ctext; return *this; }
|
||||
|
||||
Http& RenderResult(const char *template_name);
|
||||
Http& Redirect(const char *url, int code_ = 302) { code = code_; redirect = url; return *this; }
|
||||
Http& Redirect(void (*view)(Http&), const Vector<Value>& arg);
|
||||
Http& Redirect(void (*view)(Http&));
|
||||
Http& Redirect(void (*view)(Http&), const Value& v1);
|
||||
Http& Redirect(void (*view)(Http&), const Value& v1, const Value& v2);
|
||||
|
||||
Http& Ux(const char *id, const String& text);
|
||||
Http& UxRender(const char *id, const char *template_name);
|
||||
Http& UxSet(const char *id, const String& value);
|
||||
Http& UxRun(const String& js_code);
|
||||
|
||||
String GetResponse() const { return response; }
|
||||
|
||||
void Dispatch(TcpSocket& socket);
|
||||
|
||||
const SkylarkApp& App() const { return app; }
|
||||
|
||||
Http(SkylarkApp& app);
|
||||
};
|
||||
|
||||
void RegisterHandler(void (*handler)(Http& http), const char *id, const char *path);
|
||||
|
||||
#define SKYLARK(name, path) void name(Http& http); INITBLOCK { UPP::RegisterHandler(name, #name, path); } void name(Http& http)
|
||||
|
||||
Vector<String> *GetUrlViewLinkParts(const String& id);
|
||||
|
||||
String MakeLink(void (*view)(Http&), const Vector<Value>& arg);
|
||||
|
||||
enum {
|
||||
SESSION_FORMAT_BINARY, SESSION_FORMAT_JSON, SESSION_FORMAT_XML
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,81 +1,87 @@
|
|||
#include "Skylark.h"
|
||||
|
||||
#define LLOG(x) // DLOG(x)
|
||||
#define LTIMING(x) // RTIMING(x)
|
||||
|
||||
namespace Upp {
|
||||
|
||||
Renderer& Renderer::operator()(const ValueMap& map)
|
||||
{
|
||||
ValueArray v = map.GetValues();
|
||||
const Index<Value>& k = map.GetKeys();
|
||||
for(int i = 0; i < map.GetCount(); i++)
|
||||
var.Add(k[i], v[i]);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::Link(const char *id, void (*view)(Http&), const Vector<Value>& arg)
|
||||
{
|
||||
var.Add(id, Raw('\"' + MakeLink(view, arg) + '\"'));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, void (*view)(Http&))
|
||||
{
|
||||
return Link(id, view, Vector<Value>());
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1)
|
||||
{
|
||||
return Link(id, view, Vector<Value>() << arg1);
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2)
|
||||
{
|
||||
return Link(id, view, Vector<Value>() << arg1 << arg2);
|
||||
}
|
||||
|
||||
StaticMutex template_cache_lock;
|
||||
ArrayMap<String, One<Exe> > template_cache;
|
||||
|
||||
const One<Exe>& Renderer::GetTemplate(const char *template_name)
|
||||
{
|
||||
LTIMING("GetTemplate");
|
||||
StringBuffer s;
|
||||
{
|
||||
LTIMING("MakeSignature");
|
||||
for(int i = 0; i < var.GetCount(); i++)
|
||||
s << var.GetKey(i) << ';';
|
||||
s << ':' << template_name;
|
||||
}
|
||||
if(!SkylarkApp::Config().use_caching) // Templates get overwritten is not cached, MT hazard
|
||||
s << ';' << Thread::GetCurrentId();
|
||||
String sgn = s;
|
||||
LLOG("Trying to retrieve " << sgn << " from cache");
|
||||
Mutex::Lock __(template_cache_lock);
|
||||
int q = template_cache.Find(sgn);
|
||||
if(q >= 0 && SkylarkApp::Config().use_caching)
|
||||
return template_cache[q];
|
||||
LLOG("About to compile: " << sgn);
|
||||
LTIMING("Compile");
|
||||
One<Exe>& exe = q >= 0 ? template_cache[q] : template_cache.Add(sgn);
|
||||
exe = Compile(GetPreprocessedTemplate(template_name, lang), var.GetIndex());
|
||||
return exe;
|
||||
}
|
||||
|
||||
String Renderer::RenderString(const String& template_name)
|
||||
{
|
||||
return UPP::Render(GetTemplate(template_name), this, var.GetValues());
|
||||
}
|
||||
|
||||
Renderer& Renderer::Render(const char *id, const String& template_name)
|
||||
{
|
||||
var.Add(id, Render(template_name));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
}
|
||||
|
||||
#include "Skylark.h"
|
||||
|
||||
#define LLOG(x) // DLOG(x)
|
||||
#define LTIMING(x) // RTIMING(x)
|
||||
|
||||
namespace Upp {
|
||||
|
||||
Renderer& Renderer::operator()(const ValueMap& map)
|
||||
{
|
||||
ValueArray v = map.GetValues();
|
||||
const Index<Value>& k = map.GetKeys();
|
||||
for(int i = 0; i < map.GetCount(); i++)
|
||||
var.Add(k[i], v[i]);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::Link(const char *id, void (*view)(Http&), const Vector<Value>& arg)
|
||||
{
|
||||
var.Add(id, Raw('\"' + MakeLink(view, arg) + '\"'));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, void (*view)(Http&))
|
||||
{
|
||||
return Link(id, view, Vector<Value>());
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1)
|
||||
{
|
||||
return Link(id, view, Vector<Value>() << arg1);
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2)
|
||||
{
|
||||
return Link(id, view, Vector<Value>() << arg1 << arg2);
|
||||
}
|
||||
|
||||
Renderer& Renderer::SetLanguage(int lang_)
|
||||
{
|
||||
lang = lang_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
StaticMutex template_cache_lock;
|
||||
ArrayMap<String, One<Exe> > template_cache;
|
||||
|
||||
const One<Exe>& Renderer::GetTemplate(const char *template_name)
|
||||
{
|
||||
LTIMING("GetTemplate");
|
||||
StringBuffer s;
|
||||
{
|
||||
LTIMING("MakeSignature");
|
||||
for(int i = 0; i < var.GetCount(); i++)
|
||||
s << var.GetKey(i) << ';';
|
||||
s << ':' << template_name;
|
||||
}
|
||||
if(!SkylarkApp::Config().use_caching) // Templates get overwritten is not cached, MT hazard
|
||||
s << ';' << Thread::GetCurrentId();
|
||||
String sgn = s;
|
||||
LLOG("Trying to retrieve " << sgn << " from cache");
|
||||
Mutex::Lock __(template_cache_lock);
|
||||
int q = template_cache.Find(sgn);
|
||||
if(q >= 0 && SkylarkApp::Config().use_caching)
|
||||
return template_cache[q];
|
||||
LLOG("About to compile: " << sgn);
|
||||
LTIMING("Compile");
|
||||
One<Exe>& exe = q >= 0 ? template_cache[q] : template_cache.Add(sgn);
|
||||
exe = Compile(GetPreprocessedTemplate(template_name, lang), var.GetIndex());
|
||||
return exe;
|
||||
}
|
||||
|
||||
String Renderer::RenderString(const String& template_name)
|
||||
{
|
||||
return UPP::Render(GetTemplate(template_name), this, var.GetValues());
|
||||
}
|
||||
|
||||
Renderer& Renderer::Render(const char *id, const String& template_name)
|
||||
{
|
||||
var.Add(id, Render(template_name));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
}
|
||||
|
||||
};
|
||||
|
|
@ -168,7 +168,7 @@ Http& Http::NewSessionId()
|
|||
|
||||
Http& Http::SetLanguage(int lang_)
|
||||
{
|
||||
lang = lang_;
|
||||
Renderer::SetLanguage(lang);
|
||||
Upp::SetLanguage(lang_);
|
||||
SessionSet("__lang__", lang);
|
||||
SessionSet("language", ToLower(LNGAsText(lang)));
|
||||
|
|
|
|||
|
|
@ -1,80 +1,82 @@
|
|||
#include "Skylark.h"
|
||||
|
||||
namespace Upp {
|
||||
|
||||
struct sFieldsToRenderer : public FieldOperator {
|
||||
Renderer& http;
|
||||
|
||||
void Field(const char *name, Ref f) {
|
||||
http(name, f);
|
||||
}
|
||||
|
||||
sFieldsToRenderer(Renderer& http) : http(http) {}
|
||||
};
|
||||
|
||||
Renderer& Renderer::operator()(Fields rec)
|
||||
{
|
||||
sFieldsToRenderer x(*this);
|
||||
rec(x);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const Sql& sql)
|
||||
{
|
||||
int n = sql.GetColumns();
|
||||
for(int i = 0; i < n; i++)
|
||||
(*this)(sql.GetColumnInfo(i).name, sql[i]);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const SqlSelect& sel)
|
||||
{
|
||||
SqlR sql;
|
||||
sql * sel;
|
||||
if(!sql.Fetch())
|
||||
throw BadRequestExc();
|
||||
return operator()(sql);
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, const SqlSelect& sel)
|
||||
{
|
||||
ValueArray list;
|
||||
ValueMap vm;
|
||||
SqlR sql;
|
||||
sql * sel;
|
||||
while(sql.Fetch(vm))
|
||||
list.Add(vm);
|
||||
return operator()(id, list);
|
||||
}
|
||||
|
||||
SqlUpdate Renderer::Update(SqlId table)
|
||||
{
|
||||
Vector<String> col = GetSchColumns(~table);
|
||||
SqlUpdate u(table);
|
||||
for(int i = 0; i < col.GetCount(); i++) {
|
||||
String c = col[i];
|
||||
int q = var.Find(c);
|
||||
if(q < 0)
|
||||
q = var.Find(ToLower(c));
|
||||
if(q >= 0)
|
||||
u(c, var[q]);
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
SqlInsert Renderer::Insert(SqlId table)
|
||||
{
|
||||
Vector<String> col = GetSchColumns(~table);
|
||||
SqlInsert y(table);
|
||||
for(int i = 0; i < col.GetCount(); i++) {
|
||||
String c = col[i];
|
||||
int q = var.Find(c);
|
||||
if(q < 0)
|
||||
q = var.Find(ToLower(c));
|
||||
if(q >= 0)
|
||||
y(c, var[q]);
|
||||
}
|
||||
return y;
|
||||
}
|
||||
|
||||
#include "Skylark.h"
|
||||
|
||||
namespace Upp {
|
||||
|
||||
struct sFieldsToRenderer : public FieldOperator {
|
||||
Renderer& http;
|
||||
|
||||
void Field(const char *name, Ref f) {
|
||||
http(name, f);
|
||||
}
|
||||
|
||||
sFieldsToRenderer(Renderer& http) : http(http) {}
|
||||
};
|
||||
|
||||
Renderer& Renderer::operator()(Fields rec)
|
||||
{
|
||||
sFieldsToRenderer x(*this);
|
||||
rec(x);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const Sql& sql)
|
||||
{
|
||||
int n = sql.GetColumns();
|
||||
for(int i = 0; i < n; i++)
|
||||
(*this)(sql.GetColumnInfo(i).name, sql[i]);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const SqlSelect& sel)
|
||||
{
|
||||
SqlR sql;
|
||||
sql * sel;
|
||||
if(!sql.Fetch())
|
||||
throw BadRequestExc();
|
||||
return operator()(sql);
|
||||
}
|
||||
|
||||
Renderer& Renderer::operator()(const char *id, const SqlSelect& sel)
|
||||
{
|
||||
ValueArray list;
|
||||
ValueMap vm;
|
||||
SqlR sql;
|
||||
sql * sel;
|
||||
while(sql.Fetch(vm))
|
||||
list.Add(vm);
|
||||
return operator()(id, list);
|
||||
}
|
||||
|
||||
SqlUpdate Renderer::Update(SqlId table)
|
||||
{
|
||||
Vector<String> col = GetSchColumns(~table);
|
||||
SqlUpdate u(table);
|
||||
for(int i = 0; i < col.GetCount(); i++) {
|
||||
String c = col[i];
|
||||
int q = var.Find(c);
|
||||
if(q < 0)
|
||||
q = var.Find(ToLower(c));
|
||||
if(q >= 0)
|
||||
u(c, var[q]);
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
SqlInsert Renderer::Insert(SqlId table)
|
||||
{
|
||||
Vector<String> col = GetSchColumns(~table);
|
||||
SqlInsert y(table);
|
||||
for(int i = 0; i < col.GetCount(); i++) {
|
||||
String c = col[i];
|
||||
int q = var.Find(c);
|
||||
if(q < 0)
|
||||
q = var.Find(ToLower(c));
|
||||
if(q < 0)
|
||||
q = var.Find(ToUpper(c));
|
||||
if(q >= 0)
|
||||
y(c, var[q]);
|
||||
}
|
||||
return y;
|
||||
}
|
||||
|
||||
};
|
||||
154
uppsrc/Skylark/src.tpp/Renderer$en-us.tpp
Normal file
154
uppsrc/Skylark/src.tpp/Renderer$en-us.tpp
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
topic "Renderer";
|
||||
[2 $$0,0#00000000000000000000000000000000:Default]
|
||||
[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class]
|
||||
[l288;2 $$2,2#27521748481378242620020725143825:desc]
|
||||
[0 $$3,0#96390100711032703541132217272105:end]
|
||||
[H6;0 $$4,0#05600065144404261032431302351956:begin]
|
||||
[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item]
|
||||
[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement]
|
||||
[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param]
|
||||
[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam]
|
||||
[b42;2 $$9,9#13035079074754324216151401829390:normal]
|
||||
[b42;a42;2 $$10,10#45413000475342174754091244180557:text]
|
||||
[{_}
|
||||
[ {{10000@(113.42.0) [s0;%% [*@7;4 Renderer]]}}&]
|
||||
[s1;:Renderer`:`:class: [@(0.0.255)3 class][3 _][*3 Renderer]&]
|
||||
[s2;%% This class represents [/ shared variable space]. It is separated
|
||||
from Http class to be available in cases when association with
|
||||
current HTTP request is not desirable (e.g. subtemplate rendering).
|
||||
Renderer is used as base class of Http.&]
|
||||
[s2;%% (Note: the term [/ shared variable space] reflects the fact,
|
||||
that for single HTTP request all related values are stored into
|
||||
this single space: values set by handler, <form> or Ajax variables,
|
||||
session variables and cookies).&]
|
||||
[s3; &]
|
||||
[ {{10000F(128)G(128)@1 [s0;%% [* Public Method List]]}}&]
|
||||
[s3; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const char`*`,const Value`&`): [_^Renderer^ Renderer][@(0.0.255) `&
|
||||
]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], [@(0.0.255) const]_[_^Value^ V
|
||||
alue][@(0.0.255) `&]_[*@3 v])&]
|
||||
[s2;%% Adds variable id [%-*@3 id] with value [%-*@3 v] to shared variable
|
||||
space.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const ValueMap`&`): [_^Renderer^ Renderer][@(0.0.255) `&]_
|
||||
[* operator()]([@(0.0.255) const]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 map])&]
|
||||
[s2;%% Adds all key/value pairs of [%-*@3 map] as variables id / value
|
||||
to shared variable space.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const char`*`,void`(`*`)`(Http`&`)`): [_^Renderer^ Rende
|
||||
rer][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id],
|
||||
[@(0.0.255) void]_(`*[*@3 handler])(Http[@(0.0.255) `&]))&]
|
||||
[s2;%% Adds variable [%-*@3 id] to shared variable space; the value
|
||||
of variable will be actual URL to [%-*@3 handler] (with no URL
|
||||
parameters).&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const char`*`,void`(`*`)`(Http`&`)`,const Value`&`): [_^Renderer^ R
|
||||
enderer][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id],
|
||||
[@(0.0.255) void]_(`*[*@3 handler])(Http[@(0.0.255) `&]), [@(0.0.255) const]_Value[@(0.0.255) `&
|
||||
]_[*@3 arg1])&]
|
||||
[s2;%% Adds variable [%-*@3 id] to shared variable space; the value
|
||||
of variable will be actual URL to [%-*@3 handler], placing [%-*@3 arg1]
|
||||
to appropriate place (defined by handler URL pattern) as URL
|
||||
parameter.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const char`*`,void`(`*`)`(Http`&`)`,const Value`&`,const Value`&`): [_^Renderer^ R
|
||||
enderer][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id],
|
||||
[@(0.0.255) void]_(`*[*@3 handler])(Http[@(0.0.255) `&]), [@(0.0.255) const]_Value[@(0.0.255) `&
|
||||
]_[*@3 arg1], [@(0.0.255) const]_Value[@(0.0.255) `&]_[*@3 arg2])&]
|
||||
[s2;%% Adds variable [%-*@3 id] to shared variable space; the value
|
||||
of variable will be actual URL to [%-*@3 handler], placing [%-*@3 arg1]
|
||||
and [%-*@3 arg2] to appropriate place (defined by handler URL pattern)
|
||||
as URL parameter.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const Sql`&`): [_^Renderer^ Renderer][@(0.0.255) `&]_[* oper
|
||||
ator()]([@(0.0.255) const]_[_^Sql^ Sql][@(0.0.255) `&]_[*@3 sql])&]
|
||||
[s2;%% Method expects that Fetch was performed on [%-*@3 sql] and adds
|
||||
columns of the fetched row to shared variable space, Each column
|
||||
will be stored as a single variable with id equal to uppercased
|
||||
name of the column.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(Fields`): [_^Renderer^ Renderer][@(0.0.255) `&]_[* operator(
|
||||
)]([_^Fields^ Fields]_[*@3 rec])&]
|
||||
[s2;%% Method stores fields of [%-*@3 rec] as shared variable values,
|
||||
each variable with id defined by field name and value by field
|
||||
value. Note that Fields is usually created as mapping object
|
||||
of S`_`* database records.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const SqlSelect`&`): [_^Renderer^ Renderer][@(0.0.255) `&]_
|
||||
[* operator()]([@(0.0.255) const]_[_^SqlSelect^ SqlSelect][@(0.0.255) `&]_[*@3 row`_sel])&]
|
||||
[s2;%% Methods executes [%-*@3 row`_sel] with SQLR (read session),
|
||||
fetches single row and adds columns of the fetched row to shared
|
||||
variable space, Each column will be stored as a single variable
|
||||
with id equal to uppercased name of the column. If no column
|
||||
is fetched, BadRequestExc exception is raised, which eventually
|
||||
(if not handled sooner) results in 400/Bad request response from
|
||||
the web server.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`(`)`(const char`*`,const SqlSelect`&`): [_^Renderer^ Renderer
|
||||
][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id],
|
||||
[@(0.0.255) const]_[_^SqlSelect^ SqlSelect][@(0.0.255) `&]_[*@3 sel])&]
|
||||
[s2;%% Methods executes [%-*@3 sel] with SQLR (read session), fetches
|
||||
[*/ all] rows and creates an ValueArray of ValueMaps (with column`-name/column`-val
|
||||
ue pairs) and stores the result into [%-*@3 id] shared variable.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:SetLanguage`(int`): [_^Renderer^ Renderer][@(0.0.255) `&]_[* SetLanguage](
|
||||
[@(0.0.255) int]_[*@3 lang])&]
|
||||
[s2; [%% Sets the language to be used while rendering witz template.
|
||||
Basically, it affects the choice of the template file, language
|
||||
specific templates have priority.E.g. if language is set to ][%%* LNG`_(`'C`',`'S`'
|
||||
,`'C`',`'Z`')][%% and there exists file ][* index.cs`-cz.witz][%% ,
|
||||
it has priority over ][* index.witz]. The default value is LNG`_ENGLISH
|
||||
(en`-us).&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:Update`(SqlId`): [_^SqlUpdate^ SqlUpdate]_[* Update]([_^SqlId^ SqlId]_[*@3 t
|
||||
able])&]
|
||||
[s2;%% This method creates an update SQL statement for [%-*@3 table]
|
||||
based on current shared variables. It obtains a list of columns
|
||||
for the [%-*@3 table] and adds to SqlUpdate all columns found in
|
||||
as shared variables; for each column it first tries to find it
|
||||
case`-sensitive, then lower`-cased, then upper`-cased. Columns
|
||||
not found as shared variable are not added.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:Insert`(SqlId`): [_^SqlInsert^ SqlInsert]_[* Insert]([_^SqlId^ SqlId]_[*@3 t
|
||||
able])&]
|
||||
[s2;%% This method creates an insert SQL statement for [%-*@3 table]
|
||||
based on current shared variables. It obtains a list of columns
|
||||
for the [%-*@3 table] and adds to SqlUpdate all columns found in
|
||||
as shared variables; for each column it first tries to find it
|
||||
case`-sensitive, then lower`-cased, then upper`-cased. Columns
|
||||
not found as shared variable are not added.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:operator`[`]`(const char`*`)const: [_^Value^ Value]_[* operator`[`]]([@(0.0.255) c
|
||||
onst]_[@(0.0.255) char]_`*[*@3 id])_[@(0.0.255) const]&]
|
||||
[s2;%% Returns the value of shared variable [%-*@3 id].&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:RenderString`(const String`&`): [_^String^ String]_[* RenderString]([@(0.0.255) c
|
||||
onst]_[_^String^ String][@(0.0.255) `&]_[*@3 template`_name])&]
|
||||
[s2;%% Renders [%-*@3 template`_name] using current set of variables.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:Render`(const String`&`): [_^Value^ Value]_[* Render]([@(0.0.255) const]_[_^String^ S
|
||||
tring][@(0.0.255) `&]_[*@3 template`_name])&]
|
||||
[s2;%% Same as Raw(RenderString(template`_name)). The purpose is
|
||||
that Strings represented by RawHtmlText (a result of Raw) are
|
||||
not escaped when insterted into witz templates.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Renderer`:`:Render`(const char`*`,const String`&`): [_^Renderer^ Renderer][@(0.0.255) `&
|
||||
]_[* Render]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], [@(0.0.255) const]_[_^String^ S
|
||||
tring][@(0.0.255) `&]_[*@3 template`_name])&]
|
||||
[s2;%% [%-*@3 id] [%-*@3 template`_name] .&]
|
||||
[s0;%% ]]
|
||||
Loading…
Add table
Add a link
Reference in a new issue