[Megane] Add tiny library to translate utf8 characters to kvg code
This commit is contained in:
parent
4943f35d91
commit
3b5eb6f1a4
8 changed files with 145 additions and 0 deletions
13
CMake/gtl.cmake
Normal file
13
CMake/gtl.cmake
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
if(NOT TARGET gtl)
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
gtl
|
||||||
|
GIT_REPOSITORY https://code.3011.io/Mirrors/gtl
|
||||||
|
GIT_TAG v1.2.0
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(
|
||||||
|
gtl
|
||||||
|
)
|
||||||
|
endif()
|
13
CMake/mio.cmake
Normal file
13
CMake/mio.cmake
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
if(NOT TARGET mio)
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
mio
|
||||||
|
GIT_REPOSITORY https://code.3011.io/Mirrors/mio
|
||||||
|
GIT_TAG 8b6b7d878c89e81614d05edca7936de41ccdd2da
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(
|
||||||
|
mio
|
||||||
|
)
|
||||||
|
endif()
|
13
CMake/simdjson.cmake
Normal file
13
CMake/simdjson.cmake
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
if(NOT TARGET simdjson)
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
simdjson
|
||||||
|
GIT_REPOSITORY https://code.3011.io/Mirrors/simdjson
|
||||||
|
GIT_TAG v3.13.0
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(
|
||||||
|
simdjson
|
||||||
|
)
|
||||||
|
endif()
|
|
@ -1 +1,2 @@
|
||||||
add_subdirectory(Kanimaji)
|
add_subdirectory(Kanimaji)
|
||||||
|
add_subdirectory(Megane)
|
||||||
|
|
26
Libraries/Megane/CMakeLists.txt
Normal file
26
Libraries/Megane/CMakeLists.txt
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
include(${PROJECT_SOURCE_DIR}/CMake/gtl.cmake)
|
||||||
|
include(${PROJECT_SOURCE_DIR}/CMake/simdjson.cmake)
|
||||||
|
|
||||||
|
add_library(Megane STATIC)
|
||||||
|
|
||||||
|
target_compile_features(Megane
|
||||||
|
PUBLIC
|
||||||
|
cxx_std_23
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(Megane
|
||||||
|
PRIVATE
|
||||||
|
simdjson
|
||||||
|
PUBLIC
|
||||||
|
gtl
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(Megane
|
||||||
|
PUBLIC
|
||||||
|
"Include"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(Megane
|
||||||
|
PRIVATE
|
||||||
|
"Source/Megane.cpp"
|
||||||
|
)
|
29
Libraries/Megane/Include/Megane/Megane.hpp
Normal file
29
Libraries/Megane/Include/Megane/Megane.hpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef MEGANE_MEGANE_HPP
|
||||||
|
#define MEGANE_MEGANE_HPP
|
||||||
|
|
||||||
|
#include <gtl/phmap.hpp>
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Megane
|
||||||
|
{
|
||||||
|
class Error : public std::runtime_error
|
||||||
|
{
|
||||||
|
using std::runtime_error::runtime_error;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Megane
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Megane(const std::string& indexPath);
|
||||||
|
~Megane();
|
||||||
|
|
||||||
|
std::string GetCode(const std::string& character) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
gtl::flat_hash_map<std::string, std::string> mStorage;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MEGANE_MEGANE_HPP
|
49
Libraries/Megane/Source/Megane.cpp
Normal file
49
Libraries/Megane/Source/Megane.cpp
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#include "Megane/Megane.hpp"
|
||||||
|
|
||||||
|
#include <simdjson.h>
|
||||||
|
|
||||||
|
#include <print>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
namespace Megane
|
||||||
|
{
|
||||||
|
Megane::Megane(const std::string& indexPath)
|
||||||
|
{
|
||||||
|
auto res = simdjson::padded_string::load(indexPath);
|
||||||
|
if (res.error()) {
|
||||||
|
throw Error("Could not load the file");
|
||||||
|
}
|
||||||
|
simdjson::padded_string rawJson = std::move(res.value());
|
||||||
|
|
||||||
|
simdjson::ondemand::parser parser;
|
||||||
|
simdjson::ondemand::document document = parser.iterate(rawJson);
|
||||||
|
for (auto field : document.get_object()) {
|
||||||
|
std::string_view key = field.unescaped_key();
|
||||||
|
std::string_view value;
|
||||||
|
for (auto candidate : field.value()) {
|
||||||
|
if (value.length() == 0) {
|
||||||
|
value = candidate.value_unsafe().get_string();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::string_view candidateValue(candidate);
|
||||||
|
if (candidateValue.length() < value.length()) {
|
||||||
|
value = candidateValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mStorage[std::string(key)] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Megane::~Megane() = default;
|
||||||
|
|
||||||
|
std::string Megane::GetCode(const std::string& character) const
|
||||||
|
{
|
||||||
|
auto it = mStorage.find(character);
|
||||||
|
if (it == mStorage.end()) {
|
||||||
|
throw Error("Failed to find the provided character");
|
||||||
|
}
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ target_compile_features(KanimajiTool
|
||||||
target_link_libraries(KanimajiTool
|
target_link_libraries(KanimajiTool
|
||||||
PRIVATE
|
PRIVATE
|
||||||
Kanimaji
|
Kanimaji
|
||||||
|
Megane
|
||||||
)
|
)
|
||||||
|
|
||||||
target_sources(KanimajiTool
|
target_sources(KanimajiTool
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue