ZRColaWS: Add support for inverse translation

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2022-09-16 14:54:48 +02:00
parent a05e62f1d3
commit f74e9930c1
5 changed files with 126 additions and 20 deletions

View File

@ -57,6 +57,26 @@ public:
}
}
ADD_CORS(getLanguage)
ENDPOINT("GET", "/language", getLanguage)
{
try {
utf16toutf8 c;
auto result = oatpp::Vector<oatpp::Object<languageDto>>::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<translateInDto>, 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<ZRCola::mapping_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<translateInDto>, 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<ZRCola::mapping_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<oatpp::UInt32>::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)

View File

@ -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<UInt16>, transet);
DTO_FIELD(String, text);
DTO_FIELD(String, lang) = "slv";
};
class translateOutDto : public oatpp::DTO

View File

@ -20,6 +20,11 @@ textarea, input[type="text"]
<p><input type="submit" value="Submit"></p>
</form>
<form method="GET" name="language" action="http://localhost:8000/language">
<h1>language</h1>
<p><input type="submit" value="Submit"></p>
</form>
<script type="text/javascript">
function submitJSON() {
var form = document.translate;
@ -42,4 +47,27 @@ textarea, input[type="text"]
</p>
<p><input type="submit" value="Submit" onclick="submitJSON(); return false"><input type="reset" value="Reset"></p>
</form>
<script type="text/javascript">
function submitJSON() {
var form = document.translateInv;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE)
form["res"].value = xhr.responseText;
}
xhr.open("POST", "http://localhost:8000/translateInv", true);
xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
xhr.send(form["req"].value);
}
</script>
<form name="translateInv">
<h1>translateInv</h1>
<p>
<textarea rows="10" name="req" cols="40">{"transet":[0], "text":"T\uE608 \uE9E2\uF605 \u0165\u1D49\u24E2\u1E6D.", "lang": "slv"}</textarea>
>>
<textarea rows="10" name="res" cols="40"></textarea>
</p>
<p><input type="submit" value="Submit" onclick="submitJSON(); return false"><input type="reset" value="Reset"></p>
</form>
</body>

View File

@ -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()) {

View File

@ -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;