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)
|
ADD_CORS(postTranslate)
|
||||||
ENDPOINT("POST", "/translate", postTranslate, BODY_DTO(Object<translateInDto>, input))
|
ENDPOINT("POST", "/translate", postTranslate, BODY_DTO(Object<translateInDto>, input))
|
||||||
{
|
{
|
||||||
@ -65,13 +85,12 @@ public:
|
|||||||
std::u16string dst, dst2;
|
std::u16string dst, dst2;
|
||||||
if (input->text)
|
if (input->text)
|
||||||
dst = cIn.convert(*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;
|
std::vector<ZRCola::mapping_vector> mapping;
|
||||||
if (input->transet) {
|
if (input->transet) {
|
||||||
ZRCola::mapping_vector map;
|
ZRCola::mapping_vector map;
|
||||||
auto ts = input->transet->cbegin();
|
|
||||||
const auto ts_end = input->transet->cend();
|
const auto ts_end = input->transet->cend();
|
||||||
for (; ts != ts_end; ++ts) {
|
for (auto ts = input->transet->cbegin(); ts != ts_end; ++ts) {
|
||||||
switch (*ts) {
|
switch (*ts) {
|
||||||
case ZRCOLA_TRANSETID_DEFAULT:
|
case ZRCOLA_TRANSETID_DEFAULT:
|
||||||
case ZRCOLA_TRANSETID_UNICODE:
|
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)
|
#include OATPP_CODEGEN_END(ApiController)
|
||||||
|
@ -28,11 +28,19 @@ class transetDto : public oatpp::DTO
|
|||||||
DTO_FIELD(String, dst);
|
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
|
class translateInDto : public oatpp::DTO
|
||||||
{
|
{
|
||||||
DTO_INIT(translateInDto, DTO)
|
DTO_INIT(translateInDto, DTO)
|
||||||
DTO_FIELD(Vector<UInt16>, transet);
|
DTO_FIELD(Vector<UInt16>, transet);
|
||||||
DTO_FIELD(String, text);
|
DTO_FIELD(String, text);
|
||||||
|
DTO_FIELD(String, lang) = "slv";
|
||||||
};
|
};
|
||||||
|
|
||||||
class translateOutDto : public oatpp::DTO
|
class translateOutDto : public oatpp::DTO
|
||||||
|
@ -20,6 +20,11 @@ textarea, input[type="text"]
|
|||||||
<p><input type="submit" value="Submit"></p>
|
<p><input type="submit" value="Submit"></p>
|
||||||
</form>
|
</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">
|
<script type="text/javascript">
|
||||||
function submitJSON() {
|
function submitJSON() {
|
||||||
var form = document.translate;
|
var form = document.translate;
|
||||||
@ -42,4 +47,27 @@ textarea, input[type="text"]
|
|||||||
</p>
|
</p>
|
||||||
<p><input type="submit" value="Submit" onclick="submitJSON(); return false"><input type="reset" value="Reset"></p>
|
<p><input type="submit" value="Submit" onclick="submitJSON(); return false"><input type="reset" value="Reset"></p>
|
||||||
</form>
|
</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>
|
</body>
|
||||||
|
@ -15,8 +15,8 @@ using namespace ZRCola;
|
|||||||
translation_db t_db;
|
translation_db t_db;
|
||||||
transet_db ts_db;
|
transet_db ts_db;
|
||||||
// transeq_db tsq_db;
|
// transeq_db tsq_db;
|
||||||
// langchar_db lc_db;
|
langchar_db lc_db;
|
||||||
// language_db lang_db;
|
language_db lang_db;
|
||||||
// character_db chr_db;
|
// character_db chr_db;
|
||||||
// chrcat_db cc_db;
|
// chrcat_db cc_db;
|
||||||
// chrtag_db ct_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.");
|
// OATPP_LOGE("ZRColaWS", "Error reading translation sequence data from " PREFIX "/share/zrcola/ZRCola.zrcdb.");
|
||||||
// tsq_db.clear();
|
// tsq_db.clear();
|
||||||
// }
|
// }
|
||||||
// } else if (id == langchar_rec::id()) {
|
} else if (id == langchar_rec::id()) {
|
||||||
// dat >> langchar_rec(lc_db);
|
dat >> langchar_rec(lc_db);
|
||||||
// if (!dat.good()) {
|
if (!dat.good()) {
|
||||||
// OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb.");
|
OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb.");
|
||||||
// lc_db.clear();
|
lc_db.clear();
|
||||||
// }
|
}
|
||||||
// } else if (id == language_rec::id()) {
|
} else if (id == language_rec::id()) {
|
||||||
// dat >> language_rec(lang_db);
|
dat >> language_rec(lang_db);
|
||||||
// if (!dat.good()) {
|
if (!dat.good()) {
|
||||||
// OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb.");
|
OATPP_LOGE("ZRColaWS", "Error reading language character data from " PREFIX "/share/zrcola/ZRCola.zrcdb.");
|
||||||
// lang_db.clear();
|
lang_db.clear();
|
||||||
// }
|
}
|
||||||
// } else if (id == character_rec::id()) {
|
// } else if (id == character_rec::id()) {
|
||||||
// dat >> character_rec(chr_db);
|
// dat >> character_rec(chr_db);
|
||||||
// if (!dat.good()) {
|
// if (!dat.good()) {
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
extern ZRCola::translation_db t_db;
|
extern ZRCola::translation_db t_db;
|
||||||
extern ZRCola::transet_db ts_db;
|
extern ZRCola::transet_db ts_db;
|
||||||
// extern ZRCola::transeq_db tsq_db;
|
// extern ZRCola::transeq_db tsq_db;
|
||||||
// extern ZRCola::langchar_db lc_db;
|
extern ZRCola::langchar_db lc_db;
|
||||||
// extern ZRCola::language_db lang_db;
|
extern ZRCola::language_db lang_db;
|
||||||
// extern ZRCola::character_db chr_db;
|
// extern ZRCola::character_db chr_db;
|
||||||
// extern ZRCola::chrcat_db cc_db;
|
// extern ZRCola::chrcat_db cc_db;
|
||||||
// extern ZRCola::chrtag_db ct_db;
|
// extern ZRCola::chrtag_db ct_db;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user