138 lines
5.7 KiB
C#
138 lines
5.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Threading;
|
|
using AxCopilot.SDK;
|
|
using AxCopilot.Services;
|
|
|
|
namespace AxCopilot.Handlers;
|
|
|
|
public class ClipboardPipeHandler : IActionHandler
|
|
{
|
|
private static readonly Dictionary<string, (string Desc, Func<string, string> Fn)> Filters = new Dictionary<string, (string, Func<string, string>)>(StringComparer.OrdinalIgnoreCase)
|
|
{
|
|
["upper"] = ("대문자 변환", (string s) => s.ToUpperInvariant()),
|
|
["lower"] = ("소문자 변환", (string s) => s.ToLowerInvariant()),
|
|
["trim"] = ("앞뒤 공백 제거", (string s) => s.Trim()),
|
|
["trimall"] = ("모든 공백 제거", (string s) => Regex.Replace(s, "\\s+", "", RegexOptions.None, TimeSpan.FromSeconds(1.0))),
|
|
["sort"] = ("줄 정렬 (오름차순)", (string s) => string.Join("\n", s.Split('\n').Order())),
|
|
["sortd"] = ("줄 정렬 (내림차순)", (string s) => string.Join("\n", s.Split('\n').OrderDescending())),
|
|
["unique"] = ("중복 줄 제거", (string s) => string.Join("\n", s.Split('\n').Distinct())),
|
|
["reverse"] = ("줄 순서 뒤집기", (string s) => string.Join("\n", s.Split('\n').Reverse())),
|
|
["number"] = ("줄번호 추가", (string s) => string.Join("\n", s.Split('\n').Select((string l, int i) => $"{i + 1}. {l}"))),
|
|
["quote"] = ("각 줄 따옴표 감싸기", (string s) => string.Join("\n", from l in s.Split('\n')
|
|
select "\"" + l + "\"")),
|
|
["b64e"] = ("Base64 인코딩", (string s) => Convert.ToBase64String(Encoding.UTF8.GetBytes(s))),
|
|
["b64d"] = ("Base64 디코딩", (string s) => Encoding.UTF8.GetString(Convert.FromBase64String(s.Trim()))),
|
|
["urle"] = ("URL 인코딩", (string s) => Uri.EscapeDataString(s)),
|
|
["urld"] = ("URL 디코딩", (string s) => Uri.UnescapeDataString(s)),
|
|
["md"] = ("마크다운 제거", (string s) => Regex.Replace(s, "[#*_`~\\[\\]()]", "", RegexOptions.None, TimeSpan.FromSeconds(1.0))),
|
|
["lines"] = ("빈 줄 제거", (string s) => string.Join("\n", from l in s.Split('\n')
|
|
where !string.IsNullOrWhiteSpace(l)
|
|
select l)),
|
|
["count"] = ("글자/단어/줄 수", (string s) => $"글자: {s.Length} 단어: {s.Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries).Length} 줄: {s.Split('\n').Length}"),
|
|
["csv"] = ("CSV → 탭 변환", (string s) => s.Replace(',', '\t')),
|
|
["tab"] = ("탭 → CSV 변환", (string s) => s.Replace('\t', ','))
|
|
};
|
|
|
|
public string? Prefix => "pipe";
|
|
|
|
public PluginMetadata Metadata => new PluginMetadata("ClipboardPipe", "클립보드 파이프라인 — pipe", "1.0", "AX");
|
|
|
|
public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
|
|
{
|
|
string text = query.Trim();
|
|
if (string.IsNullOrWhiteSpace(text))
|
|
{
|
|
List<LauncherItem> list = Filters.Select<KeyValuePair<string, (string, Func<string, string>)>, LauncherItem>((KeyValuePair<string, (string Desc, Func<string, string> Fn)> kv) => new LauncherItem(kv.Key, kv.Value.Desc, null, null, null, "\ue77f")).ToList();
|
|
list.Insert(0, new LauncherItem("클립보드 파이프라인", "필터를 > 로 연결: pipe upper > trim > b64e", null, null, null, "\ue946"));
|
|
return Task.FromResult((IEnumerable<LauncherItem>)list);
|
|
}
|
|
string[] array = (from s in text.Split('>')
|
|
select s.Trim() into s
|
|
where !string.IsNullOrEmpty(s)
|
|
select s).ToArray();
|
|
string[] array2 = array.Where((string s) => !Filters.ContainsKey(s)).ToArray();
|
|
if (array2.Length != 0)
|
|
{
|
|
return Task.FromResult(new LauncherItem[1]
|
|
{
|
|
new LauncherItem("알 수 없는 필터: " + string.Join(", ", array2), "사용 가능: " + string.Join(", ", Filters.Keys.Take(10)) + " ...", null, null, null, "\ue7ba")
|
|
}.AsEnumerable());
|
|
}
|
|
string text2 = null;
|
|
try
|
|
{
|
|
Application current = Application.Current;
|
|
if (current != null && ((DispatcherObject)current).Dispatcher.Invoke<bool>((Func<bool>)(() => Clipboard.ContainsText())))
|
|
{
|
|
text2 = ((DispatcherObject)Application.Current).Dispatcher.Invoke<string>((Func<string>)(() => Clipboard.GetText()));
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
if (string.IsNullOrEmpty(text2))
|
|
{
|
|
return Task.FromResult(new LauncherItem[1]
|
|
{
|
|
new LauncherItem("클립보드에 텍스트가 없습니다", "텍스트를 복사한 후 시도하세요", null, null, null, "\ue7ba")
|
|
}.AsEnumerable());
|
|
}
|
|
string text3 = text2;
|
|
List<string> list2 = new List<string>();
|
|
try
|
|
{
|
|
string[] array3 = array;
|
|
foreach (string key in array3)
|
|
{
|
|
text3 = Filters[key].Fn(text3);
|
|
list2.Add(Filters[key].Desc);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return Task.FromResult(new LauncherItem[1]
|
|
{
|
|
new LauncherItem("파이프라인 실행 오류: " + ex.Message, "입력 데이터를 확인하세요", null, null, null, "\uea39")
|
|
}.AsEnumerable());
|
|
}
|
|
string text4 = ((text3.Length > 100) ? (text3.Substring(0, 97) + "…") : text3);
|
|
text4 = text4.Replace("\r\n", "↵ ").Replace("\n", "↵ ");
|
|
return Task.FromResult(new LauncherItem[1]
|
|
{
|
|
new LauncherItem("[" + string.Join(" → ", array) + "] 결과 적용", text4 + " · Enter로 클립보드 복사", null, text3, null, "\ue77f")
|
|
}.AsEnumerable());
|
|
}
|
|
|
|
public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
|
|
{
|
|
object data = item.Data;
|
|
string text = data as string;
|
|
if (text != null)
|
|
{
|
|
try
|
|
{
|
|
Application current = Application.Current;
|
|
if (current != null)
|
|
{
|
|
((DispatcherObject)current).Dispatcher.Invoke((Action)delegate
|
|
{
|
|
Clipboard.SetText(text);
|
|
});
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
NotificationService.Notify("파이프라인 완료", "변환 결과가 클립보드에 복사되었습니다");
|
|
}
|
|
return Task.CompletedTask;
|
|
}
|
|
}
|