<ctpp/> главная .:. скачать .:. документация .:. faq .:. разработчикам  
o Главная
    Скачать!
    Установка

o Помощь
    Что такое CTPP?
    Как работает CTPP?
    Онлайн-документация
    FAQ

o В действии
    Проекты
    Первые шаги
    Как сделать?..
    Разработчикам

o В разработке
    Тесты производительности
    Расписание
    Разработчики

    Благодарности




Урок 2: Выводим список новостей

Исходные файлы к этой статье можно найти в каталоге examples/newslist_cpp дистрибутива CTPP.
В предыдущей статье мы познакомились с основами API шаблонизатора CTPP2, написав программу "Hello, World!". Сейчас перед нами стоит несколько более сложная задача: создать ленту новостей.

Для этого нам понадобятся:
1. Новости в формате JSON
2. Шаблон, в который мы будем их выводить
3. Код, который свяжет виртуальную машину, работающую с шаблоном и парзер JSON. К счастью, шаблонизатор CTPP имеет встроенную поддержку формата JSON, поэтому все, что требуется - это правильно скомпоновать готовые классы.
Перед тем, как заняться написанием кода на С++, сверстаем шаблон и подготовим данные в JSON.

Новости (многоточиями заменен длинный текст):

{
"newslist" :
[
	{
		"date"  : 1169090455,
		"title" : "FreeBSD 6.3-RELEASE is now available",
		"body"  : "Please ......."
	},
	{
		"date"  : 1169019722,
		"title" : "New RSS Feeds",
		"body"  : "Six new ......."
	},
	{
		"date"  : 1169010455,
		"title" : "$199 Linux PC Now Available at Sears.com",
		"body"  : "Linspire, Inc ........",

		"publication"  : "http:// .......",
		"reporter"     : "SOURCE Linspire, Inc."
	},
	{
		"date"  : 1168840430,
		"title" : "Samba's Tridge clusters code and crowds",
		"body"  : "Andrew .......",

		"publication"  : "http:// .......",
		"reporter"     : "Dahna McConnachie",
		"reporter_url" : "http:// ......."
	}
]
}

Шаблон:

<html>
<head>
<title>News List</title>
<style type="text/css">
a {
  font-family: Verdana, Arial, Helvetica, sans-serif;
  color: black; font-size: 8pt; font-weight: bold;
}

span
{
  font-family: Verdana, Arial, Helvetica, sans-serif;
  color: black; font-size: 10pt; font-weight: normal;
}

span.date
{
  font-family: Verdana, Arial, Helvetica, sans-serif;
  color: #D00000; font-size: 10pt; font-weight: normal;
}
</style>
</head>
<body>
<TMPL_if newslist>
<div align="center" style="width=100%">
<table cellspacing="0" cellpadding="0" border="0" width="96%">
<TMPL_loop newslist>
    <tr><td>
        <span class="date"><b><i><TMPL_var DATE_FORMAT(date, "%d %b %Y %H:%M")>
        </i></b></span>
        <span><b><TMPL_var title></b><br><TMPL_var body><br>

        <TMPL_if publication>
            <a href="<TMPL_var publication>">Main URL</a><br>
        </TMPL_if>

        <TMPL_if reporter>
            <a href="<TMPL_var reporter_url>"><TMPL_var reporter></a><br>
        </TMPL_if>

        <br>
        </span>
    </td></tr>
</TMPL_loop>
</table>
</div>
</TMPL_if>
</body>
</html>

Код

Как обычно, подключаем файл заголовков CTPP2.hpp.


#include <CTPP2.hpp>


Код, представленный ниже, почти полностью повторяет тот, который мы писали в примере "Hello, World", за тем лишь исключением, что вместо "ручного" формирования структуры данных мы берем ее из файла newslist.json. Для "понимания" данных в формате JSON, в CTPP2 используются классы CTPP2JSONParser - для парзинга текста и CTPP2JSONFileParser - для обработки данных, находящихся в файле.


// 1. Создаем коллектор результатов. Вывод направляем в STDOUT
FileOutputCollector oOutputCollector(stdout);

// 2. Создаем фабрику объектов
SyscallFactory oSyscallFactory(100);
// .... и загружаем стандартную библиотеку
STDLibInitializer::InitLibrary(oSyscallFactory);

// 3. Загружаем файл с диска
VMFileLoader oLoader(argv[1]);
// Получаем образ программы 
const VMMemoryCore * pVMMemoryCore = oLoader.GetCore();

/*
 * 4. Заполняем данные, которые хотим вывести.
 *    И если в прошлый раз мы добавляли их вручную,
 *    то сейчас используем для этого JSON
 */
CDT oHash;
CTPP2JSONFileParser oJSONFileParser(oHash);
oJSONFileParser.Parse(argv[2]);

// 5. Создаем виртуальную машину
VM oVM(oSyscallFactory);

// 6. Инициализируем машину для запуска программы
oVM.Init(oOutputCollector, *pVMMemoryCore);

// 7. Запускаем программу
UINT_32 iIP = 0;
oVM.Run(*pVMMemoryCore, iIP, oHash);


Проверяем работу

1. Комипилируем шаблон


ctpp2c newslist.tmpl newslist.ct2


2. Комипилируем код


g++ -I /usr/local/include/ctpp2 -L /usr/local/lib -lctpp2 newslist.cpp -o newslist


3. Запускаем откомпилированный код


./newslist newslist.ct2 newslist.json > newslist.html


Результат работы - страница со списком новостей:

.

Мы также можем воспользоваться утилитой ctpp2vm, которая, фактически, делает всю описанную работу:


ctpp2vm newslist.ct2 newslist.json


Copyright © 2003 - 2008 CTPP Dev Team.