complete parsing

This commit is contained in:
2024-08-20 02:38:40 +03:00
parent 984102fd64
commit dfa98f758b
8 changed files with 146 additions and 44 deletions

View File

@@ -1,7 +1,22 @@
#include "module.h"
#include "../settings.h"
#include <fstream>
#include <iostream>
#include <nlohmann/json.hpp>
#include <regex>
#include <string>
#include <locale>
#include <codecvt>
std::string to_utf8(std::wstring wide_string) {
static std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
return utf8_conv.to_bytes(wide_string);
}
std::wstring from_utf8(std::string string) {
static std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
return utf8_conv.from_bytes(string);
}
Module::Module() {}
@@ -9,35 +24,46 @@ Module::Module(std::string path) {
std::ifstream settings_file(path);
nlohmann::json settings = nlohmann::json::parse(settings_file);
this->name = settings["name"];
this->goods_name_regex = settings["goods_name_regex"];
this->goods_price_regex = settings["goods_price_regex"];
this->goods_quantity_regex = settings["goods_quantity_regex"];
this->name = from_utf8(settings["name"]);
this->goods_name_regex = from_utf8(settings["goods_name_regex"]);
this->goods_price_regex = from_utf8(settings["goods_price_regex"]);
this->goods_quantity_regex = from_utf8(settings["goods_quantity_regex"]);
#ifdef DEBUG
std::wcout << "Name: " << this->name << std::endl;
std::wcout << "Goods name regex: " << this->goods_name_regex << std::endl;
std::wcout << "Goods price regex: " << this->goods_price_regex << std::endl;
std::wcout << "Goods quantity regex: " << this->goods_quantity_regex << std::endl;
#endif
}
std::smatch Module::parse_name(std::string str) {
std::regex r(this->goods_name_regex);
std::vector<std::string> Module::parse_name(std::wstring str) {
std::vector<std::string> result;
std::wregex r(this->goods_name_regex, std::regex::collate);
std::smatch m;
regex_search(str, m, r);
for (std::wsregex_iterator it {str.begin(), str.end(), r}, end {}; it != end; it ++) {
result.push_back(to_utf8(it->str()));
}
return m;
return result;
}
std::smatch Module::parse_price(std::string str) {
std::regex r(this->goods_price_regex);
std::vector<std::string> Module::parse_price(std::wstring str) {
std::vector<std::string> result;
std::wregex r(this->goods_price_regex, std::regex::collate);
std::smatch m;
regex_search(str, m, r);
for (std::wsregex_iterator it {str.begin(), str.end(), r}, end {}; it != end; it ++) {
result.push_back(to_utf8(it->str()));
}
return m;
return result;
}
std::smatch Module::parse_quantity(std::string str) {
std::regex r(this->goods_quantity_regex);
std::vector<std::string> Module::parse_quantity(std::wstring str) {
std::vector<std::string> result;
std::wregex r(this->goods_quantity_regex, std::regex::collate);
std::smatch m;
regex_search(str, m, r);
return m;
for (std::wsregex_iterator it {str.begin(), str.end(), r}, end {}; it != end; it ++) {
result.push_back(to_utf8(it->str()));
}
return result;
}
std::string Module::get_name() { return this->name; }
std::wstring Module::get_name() { return this->name; }

View File

@@ -3,23 +3,22 @@
#include <string>
#include <nlohmann/json.hpp>
#include <regex>
class Module {
std::string path;
std::string name;
std::string goods_name_regex;
std::string goods_price_regex;
std::string goods_quantity_regex;
std::wstring name;
std::wstring goods_name_regex;
std::wstring goods_price_regex;
std::wstring goods_quantity_regex;
public:
Module(std::string);
Module();
std::smatch parse_name(std::string);
std::smatch parse_price(std::string);
std::smatch parse_quantity(std::string);
std::vector<std::string> parse_name(std::wstring);
std::vector<std::string> parse_price(std::wstring);
std::vector<std::string> parse_quantity(std::wstring);
std::string get_name();
std::wstring get_name();
};
#endif // MODULE_H

View File

@@ -1,7 +1,8 @@
#include "parser.h"
#include <iostream>
#include "../settings.h"
#include <filesystem>
#include <iostream>
#include "../goods/goods.h"
Parser::Parser() {}
@@ -11,8 +12,10 @@ std::vector<std::string> Parser::search_modules() {
if (!modules_dir.exists()) {
std::filesystem::create_directories(path);
std::cout << "No modules directory found. Created one at " << path << std::endl;
std::cout << "Please, download modules to that directory from my git." << std::endl;
std::cout << "No modules directory found. Created one at " << path
<< std::endl;
std::cout << "Please, download modules to that directory from my git."
<< std::endl;
}
std::vector<std::string> modules_files;
@@ -24,6 +27,31 @@ std::vector<std::string> Parser::search_modules() {
return modules_files;
}
void Parser::set_module(std::string path) {
module = *(new Module(path));
void Parser::set_module(std::string path) { module = *(new Module(path)); }
std::vector<Goods> Parser::parse(std::wstring check_plaintext) {
std::vector<Goods> result;
std::vector<std::string> goods_names = module.parse_name(check_plaintext);
std::vector<std::string> goods_prices = module.parse_price(check_plaintext);
std::vector<std::string> goods_quantities =
module.parse_quantity(check_plaintext);
#ifdef DEBUG
std::cout << goods_names.size() << " " << goods_prices.size() << " " << goods_quantities.size() << std::endl;
#endif
if (goods_names.size() != goods_prices.size() ||
goods_names.size() != goods_quantities.size() ||
goods_prices.size() != goods_quantities.size()) {
std::cerr << "An error has occured. Check was matched incorrectly. Vector sizes are different" << std::endl;
return {};
}
short goods_amount = goods_names.size();
for (short i = 0; i < goods_amount; i++) {
Goods goods(goods_names[i], std::stof(goods_prices[i]), std::stof(goods_quantities[i]));
result.push_back(goods);
}
return result;
}

View File

@@ -5,6 +5,7 @@
#include "module.h"
#include <string>
#include <vector>
#include "../goods/goods.h"
class Parser {
@@ -15,6 +16,8 @@ public:
std::vector<std::string> search_modules();
void set_module(std::string);
std::vector<Goods> parse (std::wstring);
};
#endif // PARSER_H