-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtextfx2.d
More file actions
165 lines (135 loc) · 4.03 KB
/
textfx2.d
File metadata and controls
165 lines (135 loc) · 4.03 KB
1
module textfx2;import std.string;import std.algorithm;import std.array;import std.conv;import std.range;import std.regex;import scintilla;import nppplugin;import core.sys.windows.dll;import win32.windows;import plugininterface;import scintilla;import notepad_plus_msgs;import std.exception;import util;import nppplugin;class TextFx2 : NppPlugin { override void commandMenuInit() { functions = [ FuncItem("U&pper case", &upperCase, 0, false, null), FuncItem("&Lower case", &lowerCase, 0, false, null), FuncItem("---", null, 0, false, null), FuncItem("&Find matching brace", &findMatchingBrace, 0, false, new ShortcutKey(true, false, true, 'B')), FuncItem("&Delete matching brace", &deleteMatchingBrace, 0, false, new ShortcutKey(true, true, false, 'B')), FuncItem("----", null, 0, false, null), FuncItem("Delete &blank lines", &deleteBlankLines, 0, false, new ShortcutKey(true, false, true, 'D')), FuncItem("Delete surplus blan&k lines", &deleteSurplusBlankLines, 0, false, new ShortcutKey(true, true, false, 'D')), FuncItem("---", null, 0, false, null), FuncItem("&Sort case sensitive", &sortCaseSensitive, 0, false, null), FuncItem("S&ort case insensitive", &sortCaseInsensitive, 0, false, null), FuncItem("&Reverse lines", &reverseLines, 0, false, null), FuncItem("&Unique case sensitive", &uniqueCaseSensitive, 0, false, null), FuncItem("Uni&que case insensitive", &uniqueCaseInsensitive, 0, false, null), ]; }}TextFx2 plugin;static this() { plugin = new TextFx2();}extern(C) {void upperCase() { plugin.activeText = plugin.activeText.toUpper;}void lowerCase() { plugin.activeText = plugin.activeText.toLower;}void findMatchingBrace() { int caretPos = plugin.caretPos; int pos = plugin.sendMessage(SCI_BRACEMATCH, caretPos); if (pos == -1) { pos = plugin.sendMessage(SCI_BRACEMATCH, caretPos-1); caretPos--; } if (pos != -1) { if (pos > caretPos) { pos++; } else { caretPos++; } plugin.caretPos = caretPos; plugin.anchorPos = pos; }}void deleteMatchingBrace() { findMatchingBrace(); plugin.selectedText = "";}void deleteBlankLines() { auto a = ctRegex!(`(\n|(?:\r\n)|\r){2,}`, "g"); plugin.activeText = plugin.activeText.replace(a, "$1");}void deleteSurplusBlankLines() { auto a = ctRegex!(`(\n|(?:\r\n)|\r){3,}`, "g"); plugin.activeText = plugin.activeText.replace(a, "$1$1");}void sortCaseSensitive() { plugin.activeText = plugin.activeText.splitLines.sort.join("\n");}void sortCaseInsensitive() { plugin.activeText = plugin.activeText.splitLines.sort!((a,b)=>a.toUpper < b.toUpper).join("\n");}void reverseLines() { plugin.activeText = plugin.activeText.splitLines.retro.join("\n");}void uniqueCaseSensitive() { plugin.activeText = plugin.activeText.splitLines.uniq.join("\n");}void uniqueCaseInsensitive() { plugin.activeText = plugin.activeText.splitLines.uniq!((a,b)=>a.toUpper < b.toUpper).join("\n");}}extern(C){export void setInfo(NppData notepadPlusData) { plugin.nppData = notepadPlusData; plugin.commandMenuInit();}export const(wchar)* getName() { return "&TextFx2"w.toStringz;}export FuncItem* getFuncsArray(int* numfunctions) { *numfunctions = plugin.functions.length; return &plugin.functions[0];}export void beNotified(SCNotification*) { }export LRESULT messageProc(UINT Message, WPARAM wParam, LPARAM lParam) { return 0;}export BOOL isUnicode() { return true;}}__gshared HINSTANCE _instance;extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) { switch (ulReason) { case DLL_PROCESS_ATTACH: _instance = hInstance; dll_process_attach( cast(void*)hInstance, true ); break; case DLL_PROCESS_DETACH: dll_process_detach( cast(void*)hInstance, true ); break; case DLL_THREAD_ATTACH: dll_thread_attach( true, true ); break; case DLL_THREAD_DETACH: dll_thread_detach( true, true ); break; default: break; } return true;}