119 lines
2.4 KiB
TypeScript
119 lines
2.4 KiB
TypeScript
"use strict";
|
|
// License: MIT
|
|
|
|
import { none } from "./util";
|
|
import { storage } from "./browser";
|
|
|
|
const LIST = Symbol("saved-list");
|
|
|
|
function unique(e: string) {
|
|
if (typeof e !== "string" || this.has(e)) {
|
|
return false;
|
|
}
|
|
this.add(e);
|
|
return true;
|
|
}
|
|
|
|
export class RecentList {
|
|
public readonly pref: string;
|
|
|
|
public readonly defaults: string[];
|
|
|
|
public readonly limit: number;
|
|
|
|
private _inited: any;
|
|
|
|
private [LIST]: string[];
|
|
|
|
constructor(pref: string, defaults: string[] = []) {
|
|
if (!pref) {
|
|
throw Error("Invalid pref");
|
|
}
|
|
defaults = defaults || [];
|
|
if (!Array.isArray(defaults)) {
|
|
throw new Error("Invalid defaults");
|
|
}
|
|
this.pref = `savedlist-${pref}`;
|
|
this.defaults = Array.from(defaults);
|
|
this[LIST] = [];
|
|
this.limit = 15;
|
|
}
|
|
|
|
get values() {
|
|
return Array.from(this[LIST]);
|
|
}
|
|
|
|
get current() {
|
|
return this[LIST][0] || "";
|
|
}
|
|
|
|
async _init() {
|
|
const {[this.pref]: saved = []} = await storage.local.get(this.pref) || [];
|
|
this[LIST] = [...saved, ...this.defaults].
|
|
filter(unique, new Set()).
|
|
slice(0, this.limit);
|
|
}
|
|
|
|
init() {
|
|
if (!this._inited) {
|
|
this._inited = this._init();
|
|
this._inited.then(() => {
|
|
this.init = none;
|
|
});
|
|
}
|
|
return this._inited;
|
|
}
|
|
|
|
async reset() {
|
|
this[LIST] = Array.from(this.defaults);
|
|
await this.save();
|
|
}
|
|
|
|
async push(value: string) {
|
|
if (value === null || typeof value === "undefined") {
|
|
throw new Error("Invalid value");
|
|
}
|
|
const list = this[LIST];
|
|
const idx = list.indexOf(value);
|
|
if (idx === 0) {
|
|
return;
|
|
}
|
|
if (idx > 0) {
|
|
list.splice(idx, 1);
|
|
}
|
|
list.unshift(value);
|
|
while (list.length > 10) {
|
|
list.pop();
|
|
}
|
|
await this.save();
|
|
return;
|
|
}
|
|
|
|
async save() {
|
|
await storage.local.set({[this.pref]: this[LIST]});
|
|
}
|
|
|
|
*[Symbol.iterator]() {
|
|
yield *this[LIST];
|
|
}
|
|
}
|
|
|
|
export const MASK = new RecentList("mask", [
|
|
"*name*.*ext*",
|
|
"*num*_*name*.*ext*",
|
|
"*url*-*name*.*ext*",
|
|
"downthemall/*y*-*m*/*name*.*ext*",
|
|
"*name* (*text*).*ext*"
|
|
]);
|
|
MASK.init().catch(console.error);
|
|
|
|
export const FASTFILTER = new RecentList("fastfilter", [
|
|
"",
|
|
"/\\.mp3$/",
|
|
"/\\.(html|htm|rtf|doc|pdf)$/",
|
|
"http://www.website.com/subdir/*.*",
|
|
"http://www.website.com/subdir/pre*.???",
|
|
"*.z??, *.css, *.html"
|
|
]);
|
|
FASTFILTER.init().catch(console.error);
|