Version alpha0

This commit is contained in:
Ashik K 2023-02-28 11:24:24 +01:00
commit 28d101b2be
5 changed files with 218 additions and 0 deletions

24
CMakeLists.txt Normal file
View File

@ -0,0 +1,24 @@
cmake_minimum_required(VERSION 3.14)
project(testCurlPP LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FindPkgConfig)
pkg_check_modules(CURLPP REQUIRED curlpp)
add_executable(fetch_from_ghost
fetch_from_ghost.cc
)
add_executable(parse_posts
parse_posts.cc
)
add_executable(parse_pages
parse_pages.cc
)
target_link_libraries(fetch_from_ghost
${CURLPP_LDFLAGS}
)

9
README Normal file
View File

@ -0,0 +1,9 @@
You need libcurlpp and rapidjson to build
To build, please do
mkdir build
cd build
cmake ..
make

61
fetch_from_ghost.cc Normal file
View File

@ -0,0 +1,61 @@
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
#include <curlpp/Exception.hpp>
#define DEBUG_LEVEL -1
int main(int argc, char *argv[])
{
if(argc != 3) {
std::cerr<< argv[0] << ": Usage: " << " apiurl contentkey" << std::endl;
return -1;
}
char url_posts[128], url_pages[128];
snprintf(url_posts, sizeof url_posts, "%s/ghost/api/content/posts/?key=%s&limit=all", argv[1], argv[2]);
snprintf(url_pages, sizeof url_pages, "%s/ghost/api/content/pages/?key=%s", argv[1], argv[2]);
if (DEBUG_LEVEL > 0) std::cout<<"urls to fetch are "<<std::endl<<url_posts<<std::endl<<url_pages<<std::endl;
try {
curlpp::Cleanup cleaner;
curlpp::Easy request1, request2;
// Setting the URL to retrive.
request1.setOpt(new curlpp::options::Url(url_posts));
if (DEBUG_LEVEL > 0) std::cout << request1 << std::endl;
std::ofstream outfile;
outfile.open ("posts.json");
outfile << curlpp::options::Url(url_posts) << std::endl;
outfile.close();
request2.setOpt(new curlpp::options::Url(url_pages));
if (DEBUG_LEVEL > 0) std::cout << request2 << std::endl;
outfile.open ("pages.json");
outfile << curlpp::options::Url(url_pages) << std::endl;
outfile.close();
return EXIT_SUCCESS;
}
catch ( curlpp::LogicError & e ) {
if (DEBUG_LEVEL > 0) std::cout << e.what() << std::endl;
}
catch ( curlpp::RuntimeError & e ) {
if (DEBUG_LEVEL > 0) std::cout << e.what() << std::endl;
}
return EXIT_FAILURE;
}

62
parse_pages.cc Normal file
View File

@ -0,0 +1,62 @@
#include <rapidjson/document.h>
#include <rapidjson/filereadstream.h>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <map>
int main()
{
// Open the file
FILE* fp = fopen("pages.json", "rb");
// Check if the file was opened successfully
if (!fp) {
std::cerr << "Error: unable to open file"
<< std::endl;
return -1;
}
// Read the file
char readBuffer[65536];
rapidjson::FileReadStream is(fp, readBuffer, sizeof(readBuffer));
// Parse the JSON document
rapidjson::Document doc;
doc.ParseStream(is);
// Check if the document is valid
if (doc.HasParseError()) {
std::cerr << "Error: failed to parse JSON document"
<< std::endl;
fclose(fp);
return 1;
}
// Close the file
fclose(fp);
if (doc.HasMember("pages")
&& doc["pages"].IsArray()) {
const rapidjson::Value& pages = doc["pages"];
system("mkdir content");
for (rapidjson::SizeType i = 0; i < pages.Size();
i++) {
if (pages[i].IsObject()) {
auto post = pages[i].GetObject();
std::string postid = post["id"].GetString();
std::cout<< postid <<": "<<post["title"].GetString() <<std::endl;
char filename[64];
snprintf(filename, sizeof filename, "content/page-%s.html", postid.c_str());
std::ofstream post_file;
post_file.open(filename);
post_file << "<html>";
post_file << post["html"].GetString();
post_file <<"</html>";
post_file.close();
}
}
return 0;
}
}

62
parse_posts.cc Normal file
View File

@ -0,0 +1,62 @@
#include <rapidjson/document.h>
#include <rapidjson/filereadstream.h>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <map>
int main()
{
// Open the file
FILE* fp = fopen("posts.json", "rb");
// Check if the file was opened successfully
if (!fp) {
std::cerr << "Error: unable to open file"
<< std::endl;
return -1;
}
// Read the file
char readBuffer[65536];
rapidjson::FileReadStream is(fp, readBuffer, sizeof(readBuffer));
// Parse the JSON document
rapidjson::Document doc;
doc.ParseStream(is);
// Check if the document is valid
if (doc.HasParseError()) {
std::cerr << "Error: failed to parse JSON document"
<< std::endl;
fclose(fp);
return 1;
}
// Close the file
fclose(fp);
if (doc.HasMember("posts")
&& doc["posts"].IsArray()) {
const rapidjson::Value& posts = doc["posts"];
system("mkdir content");
for (rapidjson::SizeType i = 0; i < posts.Size();
i++) {
if (posts[i].IsObject()) {
auto post = posts[i].GetObject();
std::string postid = post["id"].GetString();
std::cout<< postid <<": "<<post["title"].GetString() <<std::endl;
char filename[64];
snprintf(filename, sizeof filename, "content/%s.html", postid.c_str());
std::ofstream post_file;
post_file.open(filename);
post_file << "<html>";
post_file << post["html"].GetString();
post_file <<"</html>";
post_file.close();
}
}
return 0;
}
}