mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-30 21:50:47 +01:00
Copy JSON from SandBox to trunk
This commit is contained in:
182
JSON/include/Poco/JSON/Template.h
Normal file
182
JSON/include/Poco/JSON/Template.h
Normal file
@@ -0,0 +1,182 @@
|
||||
//
|
||||
// Template.h
|
||||
//
|
||||
// $Id$
|
||||
//
|
||||
// Library: JSON
|
||||
// Package: JSON
|
||||
// Module: Template
|
||||
//
|
||||
// Definition of the Template class.
|
||||
//
|
||||
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
#ifndef JSON_JSONTemplate_INCLUDED
|
||||
#define JSON_JSONTemplate_INCLUDED
|
||||
|
||||
|
||||
#include <sstream>
|
||||
#include <stack>
|
||||
|
||||
#include "Poco/JSON/JSON.h"
|
||||
#include "Poco/DynamicAny.h"
|
||||
#include "Poco/SharedPtr.h"
|
||||
#include "Poco/Path.h"
|
||||
#include "Poco/Timestamp.h"
|
||||
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
class MultiPart;
|
||||
|
||||
POCO_DECLARE_EXCEPTION(JSON_API, JSONTemplateException, Poco::Exception)
|
||||
|
||||
class JSON_API Template
|
||||
/// Template is a template engine which uses JSON as input
|
||||
/// for generating output. There are commands for
|
||||
/// looping over JSON arrays, include other templates,
|
||||
/// conditional output, ...
|
||||
///
|
||||
/// All text is send to the outputstream. A command is placed
|
||||
/// between <? and ?>.
|
||||
///
|
||||
/// These are the available commands:
|
||||
/// <? echo query ?>
|
||||
/// The result of the query is send to the output stream
|
||||
/// This command can also be written as <?= query ?>
|
||||
/// <? if query ?> <? else ?> <? endif ?>
|
||||
/// When the result of query is true, all the text between
|
||||
/// if and else (or endif when there is no else) is send to the
|
||||
/// output stream. When the result of query is false, all the text
|
||||
/// between else and endif is send to the output stream. An empty
|
||||
/// object, an empty array or a null value is considered as a false value.
|
||||
/// For numbers a zero is false. An empty String is also false.
|
||||
/// <? ifexist query ?> <? else ?> <? endif ?>
|
||||
/// This can be used to check the existance of the value.
|
||||
/// Use this for example when a zero value is ok (which returns false for <? if ?>.
|
||||
/// <? for variable query ?> <? endfor ?>
|
||||
/// The result of the query must be an array. For each element
|
||||
/// in the array the text between for and endfor is send to the
|
||||
/// output stream. The active element is stored in the variable.
|
||||
/// <? include "filename" ?>
|
||||
/// Includes a template. When the filename is relative it will try
|
||||
/// to resolve the filename against the active template. When this
|
||||
/// file doesn't exist, it can still be found when the JSONTemplateCache
|
||||
/// is used.
|
||||
///
|
||||
/// A query is passed to Poco::JSON::Query to get the value.
|
||||
{
|
||||
public:
|
||||
typedef SharedPtr<Template> Ptr;
|
||||
|
||||
|
||||
Template();
|
||||
/// Constructor
|
||||
|
||||
|
||||
Template(const Path& templatePath);
|
||||
/// Constructor. Creates a template from a file.
|
||||
|
||||
|
||||
virtual ~Template();
|
||||
/// Destructor
|
||||
|
||||
|
||||
void parse();
|
||||
/// Parse a template from a file
|
||||
|
||||
|
||||
void parse(const std::string& source);
|
||||
/// Parse a template from a String
|
||||
|
||||
|
||||
void parse(std::istream& in);
|
||||
/// Parse a template from a input stream
|
||||
|
||||
|
||||
Timestamp parseTime() const;
|
||||
/// Returns the time when the template was parsed
|
||||
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const;
|
||||
/// Renders the template and send the output to the stream
|
||||
|
||||
|
||||
private:
|
||||
|
||||
|
||||
std::string readText(std::istream& in);
|
||||
|
||||
|
||||
std::string readWord(std::istream& in);
|
||||
|
||||
|
||||
std::string readQuery(std::istream& in);
|
||||
|
||||
|
||||
std::string readTemplateCommand(std::istream& in);
|
||||
|
||||
|
||||
std::string readString(std::istream& in);
|
||||
|
||||
|
||||
void readWhiteSpace(std::istream& in);
|
||||
|
||||
|
||||
MultiPart* _parts;
|
||||
|
||||
|
||||
std::stack<MultiPart*> _partStack;
|
||||
|
||||
|
||||
MultiPart* _currentPart;
|
||||
|
||||
|
||||
Path _templatePath;
|
||||
|
||||
|
||||
Timestamp _parseTime;
|
||||
};
|
||||
|
||||
inline void Template::parse(const std::string& source)
|
||||
{
|
||||
std::istringstream is(source);
|
||||
parse(is);
|
||||
}
|
||||
|
||||
|
||||
inline Timestamp Template::parseTime() const
|
||||
{
|
||||
return _parseTime;
|
||||
}
|
||||
|
||||
}} // Namespace Poco::JSON
|
||||
|
||||
#endif // JSON_JSONTemplate_INCLUDED
|
||||
Reference in New Issue
Block a user