export type PropertiesJSON = {
hintchars?: string;
smoothscroll?: boolean;
complete?: string;
};
export type PropertyTypes = {
hintchars: string;
smoothscroll: string;
complete: string;
};
type PropertyName = "hintchars" | "smoothscroll" | "complete";
type PropertyDef = {
name: PropertyName;
description: string;
defaultValue: string | number | boolean;
type: "string" | "number" | "boolean";
};
const defs: PropertyDef[] = [
{
name: "hintchars",
description: "hint characters on follow mode",
defaultValue: "abcdefghijklmnopqrstuvwxyz",
type: "string",
},
{
name: "smoothscroll",
description: "smooth scroll",
defaultValue: false,
type: "boolean",
},
{
name: "complete",
description: "which are completed at the open page",
defaultValue: "sbh",
type: "string",
},
];
const defaultValues = {
hintchars: "abcdefghijklmnopqrstuvwxyz",
smoothscroll: false,
complete: "sbh",
};
export default class Properties {
public hintchars: string;
public smoothscroll: boolean;
public complete: string;
constructor({
hintchars,
smoothscroll,
complete,
}: {
hintchars?: string;
smoothscroll?: boolean;
complete?: string;
} = {}) {
this.hintchars = hintchars || defaultValues.hintchars;
this.smoothscroll = smoothscroll || defaultValues.smoothscroll;
this.complete = complete || defaultValues.complete;
}
static fromJSON(json: PropertiesJSON): Properties {
return new Properties(json);
}
static types(): PropertyTypes {
return {
hintchars: "string",
smoothscroll: "boolean",
complete: "string",
};
}
static def(name: string): PropertyDef | undefined {
return defs.find((p) => p.name === name);
}
static defs(): PropertyDef[] {
return defs;
}
toJSON(): PropertiesJSON {
return {
hintchars: this.hintchars,
smoothscroll: this.smoothscroll,
complete: this.complete,
};
}
}