add lua extension

This commit is contained in:
Akash Mozumdar 2019-02-12 19:54:15 -05:00
parent f21db0925c
commit e494ebc077
11 changed files with 181 additions and 8 deletions

View File

@ -13,14 +13,13 @@ add_compile_options(
/D_UNICODE /D_UNICODE
) )
include_directories(include)
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set(CMAKE_FINAL_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/builds/${CMAKE_BUILD_TYPE}_x64) set(CMAKE_FINAL_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/builds/${CMAKE_BUILD_TYPE}_x64)
file(GLOB LIBS x64libs/*) set(LIBDIR x64libs)
else() else()
set(CMAKE_FINAL_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/builds/${CMAKE_BUILD_TYPE}_x86) set(CMAKE_FINAL_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/builds/${CMAKE_BUILD_TYPE}_x86)
file(GLOB LIBS x86libs/*) set(LIBDIR x86libs)
endif() endif()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_FINAL_OUTPUT_DIRECTORY}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_FINAL_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_FINAL_OUTPUT_DIRECTORY}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_FINAL_OUTPUT_DIRECTORY})
@ -28,8 +27,12 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_FINAL_OUTPUT_DIRECTORY})
set(CMAKE_CONFIGURATION_TYPES Debug Release) set(CMAKE_CONFIGURATION_TYPES Debug Release)
file(GLOB LIBS ${LIBDIR}/*)
file(COPY ${LIBS} DESTINATION ${CMAKE_FINAL_OUTPUT_DIRECTORY}) file(COPY ${LIBS} DESTINATION ${CMAKE_FINAL_OUTPUT_DIRECTORY})
include_directories(include)
link_directories(${LIBDIR})
add_library(text text.cpp) add_library(text text.cpp)
link_libraries(text) link_libraries(text)

View File

@ -11,11 +11,13 @@ $targets = @(
"Qt5Widgets.dll", "Qt5Widgets.dll",
"LoaderDll.dll", "LoaderDll.dll",
"LocaleEmulator.dll", "LocaleEmulator.dll",
"lua53.dll",
"Bing Translate.dll", "Bing Translate.dll",
"Copy to Clipboard.dll", "Copy to Clipboard.dll",
"Extra Newlines.dll", "Extra Newlines.dll",
"Extra Window.dll", "Extra Window.dll",
"Google Translate.dll", "Google Translate.dll",
"Lua.dll",
"Regex Filter.dll", "Regex Filter.dll",
"Remove Repetition.dll", "Remove Repetition.dll",
"Replacer.dll", "Replacer.dll",

View File

@ -9,6 +9,7 @@ add_library(Copy\ to\ Clipboard SHARED copyclipboard.cpp extensionimpl.cpp)
add_library(Extra\ Newlines SHARED extranewlines.cpp extensionimpl.cpp) add_library(Extra\ Newlines SHARED extranewlines.cpp extensionimpl.cpp)
add_library(Extra\ Window SHARED extrawindow.cpp extensionimpl.cpp) add_library(Extra\ Window SHARED extrawindow.cpp extensionimpl.cpp)
add_library(Google\ Translate SHARED googletranslate.cpp extensionimpl.cpp) add_library(Google\ Translate SHARED googletranslate.cpp extensionimpl.cpp)
add_library(Lua SHARED lua.cpp extensionimpl.cpp)
add_library(Regex\ Filter SHARED regexfilter.cpp extensionimpl.cpp) add_library(Regex\ Filter SHARED regexfilter.cpp extensionimpl.cpp)
add_library(Remove\ Repetition SHARED removerepeat.cpp extensionimpl.cpp) add_library(Remove\ Repetition SHARED removerepeat.cpp extensionimpl.cpp)
add_library(Replacer SHARED replacer.cpp extensionimpl.cpp) add_library(Replacer SHARED replacer.cpp extensionimpl.cpp)
@ -19,5 +20,6 @@ add_executable(Extension_Tests extensiontester.cpp)
target_link_libraries(Bing\ Translate winhttp Qt5::Widgets) target_link_libraries(Bing\ Translate winhttp Qt5::Widgets)
target_link_libraries(Extra\ Window Qt5::Widgets) target_link_libraries(Extra\ Window Qt5::Widgets)
target_link_libraries(Google\ Translate winhttp Qt5::Widgets) target_link_libraries(Google\ Translate winhttp Qt5::Widgets)
target_link_libraries(Lua lua53 Qt5::Widgets)
target_link_libraries(Regex\ Filter Qt5::Widgets) target_link_libraries(Regex\ Filter Qt5::Widgets)
target_link_libraries(Thread\ Linker Qt5::Widgets) target_link_libraries(Thread\ Linker Qt5::Widgets)

168
extensions/lua.cpp Normal file
View File

@ -0,0 +1,168 @@
#include "extension.h"
#include "util.h"
#include "text.h"
#include "defs.h"
#include <QMainWindow>
#include <QLayout>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QTimer>
extern "C"
{
enum LuaType
{
LUA_TNONE = -1,
LUA_TNIL = 0,
LUA_TBOOLEAN = 1,
LUA_TLIGHTUSERDATA = 2,
LUA_TNUMBER = 3,
LUA_TSTRING = 4,
LUA_TTABLE = 5,
LUA_TFUNCTION = 6,
LUA_TUSERDATA = 7,
LUA_TTHREAD = 8
};
enum LuaStatus
{
LUA_OK = 0,
LUA_YIELD = 1,
LUA_ERRRUN = 2,
LUA_ERRSYNTAX = 3,
LUA_ERRMEM = 4,
LUA_ERRGCMM = 5,
LUA_ERRERR = 6
};
struct lua_State;
__declspec(dllimport) lua_State* luaL_newstate();
__declspec(dllimport) void luaL_openlibs(lua_State*);
__declspec(dllimport) void lua_close(lua_State*);
__declspec(dllimport) LuaStatus luaL_loadstring(lua_State*, const char* str);
__declspec(dllimport) LuaStatus lua_pcallk(lua_State*, int nargs, int nresults, int msgh, void*, void*);
__declspec(dllimport) const char* lua_tolstring(lua_State*, int index, size_t* size);
__declspec(dllimport) const char* lua_pushstring(lua_State*, const char* str);
__declspec(dllimport) void lua_pushinteger(lua_State*, int64_t n);
__declspec(dllimport) void lua_createtable(lua_State*, int narr, int nrec);
__declspec(dllimport) void lua_settable(lua_State*, int index);
__declspec(dllimport) void lua_settop(lua_State*, int index);
__declspec(dllimport) LuaType lua_getglobal(lua_State*, const char* name);
}
bool luaL_dostring(lua_State* L, const char* str)
{
return luaL_loadstring(L, str) || lua_pcallk(L, 0, -1, 0, NULL, NULL);
}
bool logErrors = true;
std::mutex m;
std::string script;
int revCount = 0;
struct : QMainWindow
{
void launch()
{
auto centralWidget = new QWidget(this);
auto layout = new QVBoxLayout(centralWidget);
auto scriptEditor = new QPlainTextEdit(centralWidget);
auto loadButton = new QPushButton("Load Script", centralWidget);
layout->addWidget(scriptEditor);
layout->addWidget(loadButton);
connect(loadButton, &QPushButton::clicked, [=](bool)
{
std::lock_guard l(m);
++revCount;
script = scriptEditor->toPlainText().toUtf8();
});
resize(800, 600);
setCentralWidget(centralWidget);
setWindowTitle("Lua");
show();
}
}*window = nullptr;
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
QTimer::singleShot(0, []
{
std::lock_guard l(m);
(window = new std::remove_pointer_t<decltype(window)>)->launch();
});
}
break;
case DLL_PROCESS_DETACH:
{
if (lpReserved == NULL) // https://blogs.msdn.microsoft.com/oldnewthing/20120105-00/?p=8683
{
std::lock_guard l(m);
delete window;
window = nullptr;
}
}
break;
}
return TRUE;
}
bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo)
{
thread_local static std::unique_ptr<lua_State, Functor<lua_close>> L_(luaL_newstate());
thread_local static lua_State* L = L_.get();
thread_local static auto _ = (luaL_openlibs(L), luaL_dostring(L, "function ProcessSentence() end"));
thread_local static int revCount = 0;
if (::revCount > revCount)
{
std::lock_guard l(m);
revCount = ::revCount;
luaL_dostring(L, "ProcessSentence = nil");
if (luaL_dostring(L, script.c_str()) != LUA_OK)
{
sentence += NEWLINE + LUA_ERROR + StringToWideString(lua_tolstring(L, -1, nullptr));
lua_settop(L, 0);
return logErrors;
}
}
if (lua_getglobal(L, "ProcessSentence") != LUA_TFUNCTION)
{
sentence += NEWLINE + LUA_ERROR + L"ProcessSentence is not a function";
lua_settop(L, 0);
return logErrors;
}
lua_pushstring(L, WideStringToString(sentence).c_str());
lua_createtable(L, 0, 0);
for (auto info = sentenceInfo.infoArray; info->name != nullptr; ++info)
{
lua_pushstring(L, info->name);
lua_pushinteger(L, info->value);
lua_settable(L, 3);
}
if (lua_pcallk(L, 2, 1, 0, NULL, NULL) != LUA_OK)
{
sentence += NEWLINE + LUA_ERROR + StringToWideString(lua_tolstring(L, -1, nullptr));
lua_settop(L, 0);
return logErrors;
}
if (const char* newSentence = lua_tolstring(L, -1, nullptr))
{
sentence = StringToWideString(newSentence);
lua_settop(L, 0);
return true;
}
lua_settop(L, 0);
return false;
}

View File

@ -29,7 +29,7 @@ constexpr auto REPLACE_SAVE_FILE = u8"SavedReplacements.txt";
// Misc // Misc
constexpr auto DEFAULT_EXTENSIONS = u8"Remove Repetition>Copy to Clipboard>Google Translate>Extra Window>Extra Newlines"; constexpr auto DEFAULT_EXTENSIONS = u8"Remove Repetition>Lua>Copy to Clipboard>Bing Translate>Extra Window>Extra Newlines";
// Functions // Functions

View File

@ -55,7 +55,7 @@ extern const char* BG_COLOR;
extern const char* TEXT_COLOR; extern const char* TEXT_COLOR;
extern const char* FONT_SIZE; extern const char* FONT_SIZE;
extern const char* TOPMOST; extern const char* TOPMOST;
extern const char* ALWAYS_ON_TOP; extern const wchar_t* LUA_ERROR;
extern const char* REGEX_FILTER; extern const char* REGEX_FILTER;
extern const char* INVALID_REGEX; extern const char* INVALID_REGEX;
extern const char* CURRENT_FILTER; extern const char* CURRENT_FILTER;

View File

@ -84,7 +84,7 @@ const char* BG_COLOR = u8"Background Color";
const char* TEXT_COLOR = u8"Text Color"; const char* TEXT_COLOR = u8"Text Color";
const char* FONT_SIZE = u8"Font Size"; const char* FONT_SIZE = u8"Font Size";
const char* TOPMOST = u8"Always on Top"; const char* TOPMOST = u8"Always on Top";
const char* ALWAYS_ON_TOP = u8"Keep this window on top"; const wchar_t* LUA_ERROR = L"Lua error: ";
const char* REGEX_FILTER = u8"Regex Filter"; const char* REGEX_FILTER = u8"Regex Filter";
const char* INVALID_REGEX = u8"Invalid regex"; const char* INVALID_REGEX = u8"Invalid regex";
const char* CURRENT_FILTER = u8"Currently filtering: "; const char* CURRENT_FILTER = u8"Currently filtering: ";
@ -215,7 +215,6 @@ Clic y arrastra los bordes de la ventana para moverla, o en la esquina inferior
TEXT_COLOR = u8"Color de texto"; TEXT_COLOR = u8"Color de texto";
FONT_SIZE = u8"Tamaño de letra"; FONT_SIZE = u8"Tamaño de letra";
TOPMOST = u8"Siempre visible"; TOPMOST = u8"Siempre visible";
ALWAYS_ON_TOP = u8"Matener esta ventana encima";
REGEX_FILTER = u8"Filtro Regex"; REGEX_FILTER = u8"Filtro Regex";
INVALID_REGEX = u8"Regex inválido"; INVALID_REGEX = u8"Regex inválido";
CURRENT_FILTER = u8"Actualmente filtrando: "; CURRENT_FILTER = u8"Actualmente filtrando: ";
@ -300,7 +299,6 @@ S/Q/V: 代码页/UTF-16/UTF-8 字符串
TEXT_COLOR = u8"文本颜色"; TEXT_COLOR = u8"文本颜色";
FONT_SIZE = u8"字体大小"; FONT_SIZE = u8"字体大小";
TOPMOST = u8"总是位于最上层"; TOPMOST = u8"总是位于最上层";
ALWAYS_ON_TOP = u8"将本窗口在保持最上层";
REGEX_FILTER = u8"正则表达式过滤器"; REGEX_FILTER = u8"正则表达式过滤器";
INVALID_REGEX = u8"无效的正则表达式"; INVALID_REGEX = u8"无效的正则表达式";
CURRENT_FILTER = u8"当前过滤中: "; CURRENT_FILTER = u8"当前过滤中: ";

BIN
x64libs/lua53.dll Normal file

Binary file not shown.

BIN
x64libs/lua53.lib Normal file

Binary file not shown.

BIN
x86libs/lua53.dll Normal file

Binary file not shown.

BIN
x86libs/lua53.lib Normal file

Binary file not shown.