Add IMAP webmail tag, admin/opensource subpage tiers, store/cart, htmleditor, uploads
New __imap*/__smtpsend/__eval Jet tags give templates real IMAP (list/message/flag/delete/move/search/folders/accounts) and SMTP-send capability, backing the new /email webmail client (email.jet/ email.menu, assets/images/email.js + newemail.js) and its mainpagetemplate.jet-based page shell. Most of this tag family's source was already being built into the live site (Tag.cpp already registered __imap/__imaplist/__imapmessage/__imapflag/__imapdelete/ __eval) but had never actually been committed; this also registers and commits the remaining five (__imapmove/__imapfolders/ __imapsearch/__smtpsend/__imapaccounts). admin.page/admin.menu gain a real subpage tier (admin-email, admin-newemail, admin-invoices, admin-products, admin-users) replacing several previously top-level pages, mirrored by a similar opensource.page subpage tier (opensource-overview/asm1802/barantmail/ jet/serverframework/synthmax) - old top-level pages retired via git rename (asm1802.page, jet.page, serverframework.page, admin_invoices.page); barantmail.page is dropped outright, folded into opensource-barantmail.subpage. New storefront (store.page, store-createstore.subpage, barantstore.page) and cart flow (cart.jet, updatecartqty.proc, removecartitem.proc, editproduct.page/selectproduct.proc/ update_product.proc for inventory maintenance against the barant database). New document upload/download manager (documents.jet, documents_api.jet, documents_upload.proc, documents_delete.proc, assets/images/documents.js + documents-page.js) with a persistent floating panel, and a rich-text page editor (htmleditor.jet/.page, createhtmleditor.proc, savehtmleditor.proc, assets/images/htmleditor.js + its icon/logo assets). SESSIONCTL.tag: login now redirects back to the originally-requested page instead of always landing on /account ($[start:0] vs $[start] variable-name mismatch). main.css/menu.bar/invoices.menu/jet_overview.section/login.menu: styling and navigation updates for the above; new site assets (fonts, images, audio) referenced by them. jetc/build-assets.sh, list_jet_files.sh, lowercase_jet.py, strip_fragments.py: small dev tooling used while building the above.
This commit is contained in:
1 parent
b0cadc3f08
commit
c1491b044b
115 files changed
+6174
-137
No files matched your search
+43
@@ -0,0 +1,43 @@
|
||||
#include "__eval.h"
|
||||
#include "Exception.h"
|
||||
|
||||
namespace jet {
|
||||
|
||||
// <eval> is not a jet-2.0 addition - it's a genuine jet-1.4 tag that was
|
||||
// simply never implemented in 2.0 at all (no class, no dispatch entry
|
||||
// anywhere). SESSIONCTL.tag's own <page> definition depends on it
|
||||
// throughout - capturing a tag's own invocation content into a named
|
||||
// variable (<eval name="_BODY"><container></eval>, often with
|
||||
// scope="parent" so a nested custom tag can write back into its
|
||||
// caller's scope: <eval name="AUTHOR" scope="parent">...), and also
|
||||
// using it bare (no name=) to render an <include>'d file's content
|
||||
// inline (<eval><include file="...page"></eval>). Without this tag,
|
||||
// all of that content was silently falling through as undefined-tag
|
||||
// literal text, which is why a real, unmodified SESSIONCTL.tag <page>
|
||||
// never produced its actual rendered body.
|
||||
//
|
||||
// <eval name="X" [scope="local|parent|global"]>content</eval> - same
|
||||
// capture semantics as <set name="X">content</set> (Tag::storeVariable
|
||||
// already implements exactly this: interpret the container, then store
|
||||
// the result - raw if the container itself specified eval="no", already
|
||||
// evaluated otherwise - into variable X at the requested scope,
|
||||
// defaulting to global like <set> does). Reused directly rather than
|
||||
// reimplemented, since it's the identical contract under a different
|
||||
// tag name.
|
||||
//
|
||||
// <eval>content</eval> (no name=) - content is interpreted and flows to
|
||||
// normal output, exactly like any ordinary container-having tag; no
|
||||
// special-casing needed since output/evaluate already default to true
|
||||
// on the base Tag class and the destructor's copyContainer(out,
|
||||
// parentOut) handles the rest once processContainer(container) below
|
||||
// has populated `out`.
|
||||
__eval::__eval(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
|
||||
if(keywordDefined("name")) {
|
||||
storeVariable(resolveKeyword("name"));
|
||||
output = false;
|
||||
} else if(hasContainer) {
|
||||
processContainer(container);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user