diff --git a/ZRColaWS/controller.hpp b/ZRColaWS/controller.hpp index 63fee63..e3a6a5a 100644 --- a/ZRColaWS/controller.hpp +++ b/ZRColaWS/controller.hpp @@ -57,6 +57,26 @@ public: } } + ADD_CORS(getLanguage) + ENDPOINT("GET", "/language", getLanguage) + { + try { + utf16toutf8 c; + auto result = oatpp::Vector>::createShared(); + for (size_t i = 0, n = lang_db.idxLang.size(); i < n; i++) { + const auto &lang = lang_db.idxLang[i]; + auto dto = languageDto::createShared(); + dto->lang = std::string(&lang.lang.data[0], strnlen(lang.lang.data, std::size(lang.lang.data))); + dto->name = c.convert(lang.name(), lang.name_len()); + result->push_back(dto); + } + return createDtoResponse(Status::CODE_200, result); + } catch (std::exception &ex) { + OATPP_LOGE("ZRColaWS", "%s: %s", typeid(ex).name(), ex.what()); + return ResponseFactory::createResponse(Status::CODE_500, ex.what()); + } + } + ADD_CORS(postTranslate) ENDPOINT("POST", "/translate", postTranslate, BODY_DTO(Object, input)) { @@ -65,13 +85,12 @@ public: std::u16string dst, dst2; if (input->text) dst = cIn.convert(*input->text); - size_t src_len = dst.length(); + size_t src_len = dst.size(); std::vector mapping; if (input->transet) { ZRCola::mapping_vector map; - auto ts = input->transet->cbegin(); const auto ts_end = input->transet->cend(); - for (; ts != ts_end; ++ts) { + for (auto ts = input->transet->cbegin(); ts != ts_end; ++ts) { switch (*ts) { case ZRCOLA_TRANSETID_DEFAULT: case ZRCOLA_TRANSETID_UNICODE: @@ -109,7 +128,58 @@ public: } } - // TODO: Add POST handler for inverse translation. + ADD_CORS(postTranslateInv) + ENDPOINT("POST", "/translateInv", postTranslateInv, BODY_DTO(Object, input)) + { + try { + utf8toutf16 cIn; + std::u16string dst, dst2; + ZRCola::langid_t lang; + if (input->text) + dst = cIn.convert(*input->text); + lang = input->lang->c_str(); + size_t src_len = dst.size(); + std::vector mapping; + if (input->transet) { + ZRCola::mapping_vector map; + const auto ts_begin = input->transet->cbegin(); + for (auto ts = input->transet->cend(); (ts--) != ts_begin; ) { + switch (*ts) { + case ZRCOLA_TRANSETID_DEFAULT: + case ZRCOLA_TRANSETID_UNICODE: + t_db.TranslateInv(*ts, dst.data(), dst.size(), &lc_db, lang, dst2, &map); + dst = std::move(dst2); + map.invert(); + mapping.push_back(std::move(map)); + break; + + default: + t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map); + dst = std::move(dst2); + map.invert(); + mapping.push_back(std::move(map)); + } + } + } + + utf16toutf8 cOut; + auto dto = translateOutDto::createShared(); + dto->text = cOut.convert(dst); + auto map = oatpp::Vector::createShared(); + auto m_end = mapping.crend(); + for (size_t i = 0; i < src_len; ++i) { + auto j = i; + for (auto m = mapping.crbegin(); m != m_end; ++m) + j = m->to_src(j); + map->push_back(j); + } + dto->map = map; + return createDtoResponse(Status::CODE_200, dto); + } catch (std::exception &ex) { + OATPP_LOGE("ZRColaWS", "%s: %s", typeid(ex).name(), ex.what()); + return ResponseFactory::createResponse(Status::CODE_500, ex.what()); + } + } }; #include OATPP_CODEGEN_END(ApiController) diff --git a/ZRColaWS/dto.hpp b/ZRColaWS/dto.hpp index 3116406..2ea64ec 100644 --- a/ZRColaWS/dto.hpp +++ b/ZRColaWS/dto.hpp @@ -28,11 +28,19 @@ class transetDto : public oatpp::DTO DTO_FIELD(String, dst); }; +class languageDto : public oatpp::DTO +{ + DTO_INIT(languageDto, DTO) + DTO_FIELD(String, lang); + DTO_FIELD(String, name); +}; + class translateInDto : public oatpp::DTO { DTO_INIT(translateInDto, DTO) DTO_FIELD(Vector, transet); DTO_FIELD(String, text); + DTO_FIELD(String, lang) = "slv"; }; class translateOutDto : public oatpp::DTO diff --git a/ZRColaWS/test.html b/ZRColaWS/test.html index 293fffa..fc3d03a 100644 --- a/ZRColaWS/test.html +++ b/ZRColaWS/test.html @@ -20,6 +20,11 @@ textarea, input[type="text"]

+
+

language

+

+
+ +
+

translateInv

+

+ + >> + +

+

+
diff --git a/ZRColaWS/zrcolaws.cpp b/ZRColaWS/zrcolaws.cpp index 39b5e52..e788f47 100644 --- a/ZRColaWS/zrcolaws.cpp +++ b/ZRColaWS/zrcolaws.cpp @@ -15,8 +15,8 @@ using namespace ZRCola; translation_db t_db; transet_db ts_db; // transeq_db tsq_db; -// langchar_db lc_db; -// language_db lang_db; +langchar_db lc_db; +language_db lang_db; // character_db chr_db; // chrcat_db cc_db; // chrtag_db ct_db; @@ -61,18 +61,18 @@ static void load_database() // OATPP_LOGE("ZRColaWS", "Error reading translation sequence data from " PREFIX "/share/zrcola/ZRCola.zrcdb."); // tsq_db.clear(); // } - // } else if (id == langchar_rec::id()) { - // dat >> langchar_rec(lc_db); - // if (!dat.good()) { - // OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb."); - // lc_db.clear(); - // } - // } else if (id == language_rec::id()) { - // dat >> language_rec(lang_db); - // if (!dat.good()) { - // OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb."); - // lang_db.clear(); - // } + } else if (id == langchar_rec::id()) { + dat >> langchar_rec(lc_db); + if (!dat.good()) { + OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb."); + lc_db.clear(); + } + } else if (id == language_rec::id()) { + dat >> language_rec(lang_db); + if (!dat.good()) { + OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb."); + lang_db.clear(); + } // } else if (id == character_rec::id()) { // dat >> character_rec(chr_db); // if (!dat.good()) { diff --git a/ZRColaWS/zrcolaws.hpp b/ZRColaWS/zrcolaws.hpp index 60df537..2f93571 100644 --- a/ZRColaWS/zrcolaws.hpp +++ b/ZRColaWS/zrcolaws.hpp @@ -15,8 +15,8 @@ extern ZRCola::translation_db t_db; extern ZRCola::transet_db ts_db; // extern ZRCola::transeq_db tsq_db; -// extern ZRCola::langchar_db lc_db; -// extern ZRCola::language_db lang_db; +extern ZRCola::langchar_db lc_db; +extern ZRCola::language_db lang_db; // extern ZRCola::character_db chr_db; // extern ZRCola::chrcat_db cc_db; // extern ZRCola::chrtag_db ct_db;