Урок 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 - для обработки данных, находящихся в файле.
FileOutputCollector oOutputCollector(stdout);
SyscallFactory oSyscallFactory(100);
STDLibInitializer::InitLibrary(oSyscallFactory);
VMFileLoader oLoader(argv[1]);
const VMMemoryCore * pVMMemoryCore = oLoader.GetCore();
CDT oHash;
CTPP2JSONFileParser oJSONFileParser(oHash);
oJSONFileParser.Parse(argv[2]);
VM oVM(oSyscallFactory);
oVM.Init(oOutputCollector, *pVMMemoryCore);
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
|