Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 18 additions & 22 deletions resources/Succubus.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use strict";
/*
Copyright 2024 Qiong-Mengzi.
Copyright 2024-2026 Qiong-Mengzi.
This code is under Do What the Fuck You Want to Public License.

放一下乱七八糟的东西,反正没人看就对了
Expand Down Expand Up @@ -78,34 +78,30 @@ var Succubus;
}
Succubus.ClipboardCopyByClassT = ClipboardCopyByClassT;
function Searching(text, target, format) {
var t_text = JSON_DeepCopy(text);
var t_text_score = new Array(text.length);
var t_IndexTable = new Array(text.length);
const t_text = JSON_DeepCopy(text);
const t_text_score = new Array(text.length);
const t_IndexTable = new Array(text.length);
for (var i = 0; i < text.length; i++) {
t_text_score[i] = format(t_text[i], target);
t_IndexTable[i] = i;
}
// Sorting
// 之后想到什么算法再写罢...(如果谁会快速排序能否帮忙写一下w)
// I don't know how to quickly sort.
// If anyone knows, could you help me write it down? Thank you.
for (var j = 0; j < text.length - 1; j++) {
for (var i = 0; i < text.length - j - 1; i++) {
if (t_text_score[i] > t_text_score[i + 1]) {
// Swap scores
let sort_t_num = t_text_score[i];
t_text_score[i] = t_text_score[i + 1];
t_text_score[i + 1] = sort_t_num;
// Swap Index
let t_sort_index = t_IndexTable[i];
t_IndexTable[i] = t_IndexTable[i + 1];
t_IndexTable[i + 1] = t_sort_index;
}
}
}
return [t_IndexTable, t_text_score];
// 创建索引
const indices = Array.from({ length: t_text_score.length }, (_, i) => i);
// 根据t_text_score排序索引
indices.sort((a, b) => t_text_score[a] - t_text_score[b]);
// 用排序好的索引排序t_text_score和t_IndexTable
const sorted_t_IndexTable = indices.map(i => t_IndexTable[i]);
const sorted_t_text_score = indices.map(i => t_text_score[i]);
return [sorted_t_IndexTable, sorted_t_text_score];
}
Succubus.Searching = Searching;
/**
* TODO: 写文档说明这一大堆是什么东西
* @param text
* @param target
* @returns
*/
function BaseTextMatchCurse(text, target) {
let reg = RegExp('[' + target + ']+', 'ig');
let result = text.match(reg);
Expand Down
117 changes: 62 additions & 55 deletions resources/Succubus.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
/*
Copyright 2024 Qiong-Mengzi.
Copyright 2024-2026 Qiong-Mengzi.
This code is under Do What the Fuck You Want to Public License.

放一下乱七八糟的东西,反正没人看就对了
*/

namespace Succubus {
// 获取JSON数据
export async function FetchJSON(url: string) {
export async function FetchJSON(url: string): Promise<any> {
const response = await fetch(url)
if (!response.ok) {
throw new Error('[Succubus] FetchJSON: Failed to fetch resource. ' + String(response.status) + ' ' + response.statusText)
Expand All @@ -16,7 +16,7 @@ namespace Succubus {
}

// 获取文本数据
export async function FetchText(url: string) {
export async function FetchText(url: string): Promise<string> {
const response = await fetch(url)
if (!response.ok) {
throw new Error('[Succubus] FetchJSON: Failed to fetch resource. ' + String(response.status) + ' ' + response.statusText)
Expand All @@ -25,44 +25,54 @@ namespace Succubus {
}

// 复制文本到剪贴板
export function ClipboardCopyById(id: string, text: string, success_event_curse: CallableFunction = (function () { }), failed_event_curse: CallableFunction = (function () { console.log('Clipboard Write Failed.') })) {
var element = document.getElementById(id);
export function ClipboardCopyById(
id: string,
text: string,
success_event_curse: CallableFunction = (function (): void { }),
failed_event_curse: CallableFunction = (function (): void { console.log('Clipboard Write Failed.') })
): void {
var element: HTMLElement | null = document.getElementById(id);
if (element == null) {
throw new Error('[Succubus] ClipboardCopy: Cannot Find The Element.')
}
element.addEventListener('click', (function () {
element.addEventListener('click', (function (): void {
navigator.clipboard.writeText(text)
.then(
() => {
(): void => {
success_event_curse()
},
() => {
(): void => {
failed_event_curse()
}
)
}))
}

export function JSON_DeepCopy(obj: Array<any> | string | number) {
export function JSON_DeepCopy(obj: Array<any> | string | number): any {
return JSON.parse(JSON.stringify(obj))
}

// ありがとう,私の暗い世界の小さな太陽
// 复制文本到剪贴板
// 适用于有多个相同用途的复制按钮(所以上面那个函数到底有什么用啊)
export function ClipboardCopyByClassT(class_id: string, text: Array<string>, success_event_curse: CallableFunction = () => { }, failed_event_curse: CallableFunction = () => { console.log('Clipboard Write Failed.') }) {
var elements = document.getElementsByClassName(class_id);
for (var i = 0; i < elements.length; i++) {
var element = elements.item(i) as HTMLElement;
export function ClipboardCopyByClassT(
class_id: string,
text: Array<string>,
success_event_curse: CallableFunction = (): void => { },
failed_event_curse: CallableFunction = (): void => { console.log('Clipboard Write Failed.') }
): void {
var elements: HTMLCollectionOf<Element> = document.getElementsByClassName(class_id);
for (var i: number = 0; i < elements.length; i++) {
var element: HTMLElement = elements.item(i) as HTMLElement;
element.addEventListener('click', ((): any => {
let use_text = text[i]; // 捕获当前循环的文本值
let sc = success_event_curse
let fc = failed_event_curse
return () => {
let use_text: string = text[i]; // 捕获当前循环的文本值
let sc: CallableFunction = success_event_curse
let fc: CallableFunction = failed_event_curse
return (): void => {
navigator.clipboard.writeText(use_text)
.then(
() => sc(),
() => fc()
(): any => sc(),
(): any => fc()
);
}
})());
Expand All @@ -73,57 +83,54 @@ namespace Succubus {
interface SearchingFormat {
(text: string, target: string): number
}
export function Searching(text: Array<string>, target: string, format: SearchingFormat) {
var t_text: Array<string> = JSON_DeepCopy(text)
var t_text_score: Array<number> = new Array(text.length)
var t_IndexTable: Array<number> = new Array(text.length)
for (var i = 0; i < text.length; i++) {
export function Searching(text: Array<string>, target: string, format: SearchingFormat): number[][] {
const t_text: Array<string> = JSON_DeepCopy(text)
const t_text_score: Array<number> = new Array(text.length)
const t_IndexTable: Array<number> = new Array(text.length)
for (var i: number = 0; i < text.length; i++) {
t_text_score[i] = format(t_text[i], target)
t_IndexTable[i] = i
}
// Sorting
// 之后想到什么算法再写罢...(如果谁会快速排序能否帮忙写一下w)
// I don't know how to quickly sort.
// If anyone knows, could you help me write it down? Thank you.
for (var j = 0; j < text.length - 1; j++) {
for (var i = 0; i < text.length - j - 1; i++) {
if (t_text_score[i] > t_text_score[i + 1]) {
// Swap scores
let sort_t_num = t_text_score[i]
t_text_score[i] = t_text_score[i + 1]
t_text_score[i + 1] = sort_t_num
// Swap Index
let t_sort_index = t_IndexTable[i]
t_IndexTable[i] = t_IndexTable[i + 1]
t_IndexTable[i + 1] = t_sort_index
}
}
}
return [t_IndexTable, t_text_score]
// 创建索引
const indices: number[] = Array.from({ length: t_text_score.length }, (_, i) => i)
// 根据t_text_score排序索引
indices.sort((a, b) => t_text_score[a] - t_text_score[b])
// 用排序好的索引排序t_text_score和t_IndexTable
const sorted_t_IndexTable: number[] = indices.map(i => t_IndexTable[i])
const sorted_t_text_score: number[] = indices.map(i => t_text_score[i])
return [sorted_t_IndexTable, sorted_t_text_score]
}
export function BaseTextMatchCurse(text: string, target: string) {
let reg = RegExp('[' + target + ']+', 'ig')
let result = text.match(reg)

/**
* TODO: 写文档说明这一大堆是什么东西
* @param text
* @param target
* @returns
*/
export function BaseTextMatchCurse(text: string, target: string): number {
let reg: RegExp = RegExp('[' + target + ']+', 'ig')
let result: RegExpMatchArray | null = text.match(reg)
if (result == null)
return -1
let max_length = 0
let great_of_middle_length = 0
let match_num = result.length
let length_table = result.map(x => x.length)
for (let i = 0; i < length_table.length; i++) {
let lobj = length_table[i]
let max_length: number = 0
let great_of_middle_length: number = 0
let match_num: number = result.length
let length_table: number[] = result.map(x => x.length)
for (let i: number = 0; i < length_table.length; i++) {
let lobj: number = length_table[i]
if (lobj > max_length)
max_length = lobj
}
for (let i = 0; i < length_table.length; i++) {
let lobj = length_table[i]
for (let i: number = 0; i < length_table.length; i++) {
let lobj: number = length_table[i]
if (lobj > max_length / 2)
great_of_middle_length += 1
}
return (max_length * 0.9 + match_num * 0.7 / text.length + great_of_middle_length * 0.4 / text.length) / 2
}

export function IndexMap(obj: any[], index: number[]){
return index.map(x=>obj[x])
export function IndexMap(obj: any[], index: number[]): any[] {
return index.map(x => obj[x])
}
}