boost :: format - попытка использовать HTML в качестве строки форматера - нужна помощь - PullRequest
0 голосов
/ 17 ноября 2009

Я пытаюсь использовать boost :: format, где моей строкой форматирования является HTML ниже. Я намереваюсь вставить 3x std :: strings в местах, указанных заполнителями% s.

Другими словами - я открываю ниже * .html файл для чтения, читаю его содержимое в одну строку std :: string и использую его в качестве средства форматирования. Далее я пытаюсь сделать следующее:

std::string output = (boost::format(formatter) % str1 % str2 % str3).str();

Где str1-3 - строки, содержащие текст, который я пытаюсь вставить - очевидно. Попытка форматирования вызывает исключение, говорящее о том, что строка формата неверна. Я пытался проанализировать его на лучшую часть последних 2 часов, но мне это не удалось, и мне нужна помощь.

Что не так с приведенным ниже HTML - почему он не может стать правильной строкой форматирования? Какие ограничения я должен знать?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>KP&D</title>
    <style type="text/css"> 
        html, body 
        {
            height: 100%;
            margin: 0;
            padding: 0;
        }
        img#bg 
        {
            position:fixed;
            top:0;
            left:0;
            width:100%;
            height:100%;
        }
        #content 
        {
            position:relative;
            z-index:1;
        }       
    </style>
</head>
<body>
<img src="Images/PageBackground.png" alt="background image" id="bg" />
<div id="content">
<br/>&nbsp;
<img src="Images/MyLogoReflected.png" alt="logo image"/>
<br />&nbsp;
<img src="Images/PDC_StatusPage.png" alt="remote status page image" />
<br />&nbsp;
<img src="Images/PDC_RemoteConfiguration.png" alt="remote config image" />
<br />&nbsp;
%s
<br />&nbsp;
<img src="Images/PDC_RemoteSubsystemStatus.png" alt="remote status image" />
<br />&nbsp;
%s
<br />&nbsp;
<img src="Images/PDC_RemoteConnectivityStatus.png" alt="remote status image" />
<br />&nbsp;
%s
<br />&nbsp;
</div>
</body>
</html>

Вот фрагмент кода, отвечающий за загрузку указанного файла:

#include <string>
#include <fstream>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>

int main()
{
    std::ifstream ifs("welcome.html"); // the html is in that file

    if(!ifs.good())
      return 1;

    std::string buffer = "";

    while(!ifs.eof())
    {
      char buf[256];
      ifs.getline(buf, 256);
      buffer += buf;
    }

    buffer = boost::trim_right_copy(buffer);

    const std::string str1 = "aaa";
    const std::string str2 = "bbb";
    const std::string str3 = "ccc";
    std::string Out = "";

    try{
    Out = (boost::format(buffer)
          % str1
          % str2
          % str3
          ).str();
   } catch(std::exception &e)
   { 
      err = e.what(); 
      return 1; 
   }

    return 0;
}

Ответы [ 2 ]

4 голосов
/ 17 ноября 2009

boost::format использует % для разделения спецификаций формата ; поэтому символы % в вашем CSS приводят в замешательство; он пытается оценить их как спецификации формата. Вам нужно будет заменить их на %%, чтобы получить на выходе буквальный % символ.

Если это не поможет, то я бы порекомендовал попробовать отредактировать ваш шаблон на более мелкие кусочки, пока вы не найдете как можно меньший кусочек, который демонстрирует проблему. Как только вы это сделаете, вы можете обнаружить проблему самостоятельно, но если нет, отредактируйте свое сообщение, включив в него меньший фрагмент кода, который все еще демонстрирует проблему (предпочтительно 1 или 2 строки длиной менее 80 символов в каждой), а также точную ошибку, которая ты получаешь от Boost. Аналогично, было бы полезно, если бы вы опубликовали фрагмент кода, который вы используете для чтения в файле, и вызвали boost::format; полная программа с несколькими строками кода для чтения шаблона и вывода вывода boost::format позволила бы нам увидеть, есть ли в вашем коде что-то, что может вызывать проблемы (и опять же, это может помочь вам изолировать проблема сама).

Код, который вы опубликовали (немного отредактировал, чтобы он действительно работал; вы пропустили объявления buffer и err), прекрасно работает с отправленным вами шаблоном, если все знаки % в CSS заменены на %%, как я первоначально предложил. Вот отредактированный код (включая вывод, чтобы убедиться, что он работает):

#include <string>
#include <fstream>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
#include <iostream>

int main()
{
    std::ifstream ifs("template.html"); // the html is in that file
    std::string buffer, err;

    if(!ifs.good())
      return 1;

    while(!ifs.eof())
    {
      char buf[256];
      ifs.getline(buf, 256);
      buffer += buf;
    }

    buffer = boost::trim_right_copy(buffer);

    const std::string str1 = "aaa";
    const std::string str2 = "bbb";
    const std::string str3 = "ccc";
    std::string Out = "";

    try{
    Out = (boost::format(buffer)
          % str1
          % str2
          % str3
          ).str();
   } catch(std::exception &e)
   { 
      err = e.what(); 
      std::cout << err << std::endl;
      return 1;
   }

    std::cout << Out;

    return 0;
}

А вот отредактированный шаблон:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>KP&D</title>
    <style type="text/css"> 
        html, body 
        {
            height: 100%%;
            margin: 0;
            padding: 0;
        }
        img#bg 
        {
            position:fixed;
            top:0;
            left:0;
            width:100%%;
            height:100%%;
        }
        #content 
        {
            position:relative;
            z-index:1;
        }       
    </style>
</head>
<body>
<img src="Images/PageBackground.png" alt="background image" id="bg" />
<div id="content">
<br/>&nbsp;
<img src="Images/MyLogoReflected.png" alt="logo image"/>
<br />&nbsp;
<img src="Images/PDC_StatusPage.png" alt="remote status page image" />
<br />&nbsp;
<img src="Images/PDC_RemoteConfiguration.png" alt="remote config image" />
<br />&nbsp;
%s
<br />&nbsp;
<img src="Images/PDC_RemoteSubsystemStatus.png" alt="remote status image" />
<br />&nbsp;
%s
<br />&nbsp;
<img src="Images/PDC_RemoteConnectivityStatus.png" alt="remote status image" />
<br />&nbsp;
%s
<br />&nbsp;
</div>
</body>
</html>
0 голосов
/ 18 ноября 2009

Мне удалось найти проблему.

после оптимизации чтения файла и исправления символов% он работал нормально. Большое спасибо всем вам.

Вот классный фрагмент, который я нашел о том, как читать весь файл в строку сразу:)

buffer = std::string((std::istreambuf_iterator<char>(ifs)),
                          std::istreambuf_iterator<char>());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...