ZRColaWS: Add support for inverse translation
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
a05e62f1d3
commit
f74e9930c1
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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()) {
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user